← All posts tagged программирование

janPona

Короче, решил я запилить проксю для телеги.
Долго извращался с dante, запихнул его в контейнер, но потом понял, что это говно, и мне захотелось авторизации юзеров по таблице в mariadb. Ну вот такой вот я извращенец.

Именно socks прокси, не mtproto.

В итоге пишу щас его руками на Go.

janPona

Бля. Наболело. Сел фиксить казалось бы маленький бажок в приложении, и ничто не предвещало беды.
Баг был связан с тем, что вместо списка ещё не закончившихся событий пользователю показывались все события — и будущие и прошлые.

Ну казалось бы, что может быть проще — возьми и отфильтруй по endTime > now.
Но это был только вход в кроличью нору.

У каждого события есть начало и конец.
У системы есть свой часовой пояс (который можно произвольно менять), отличный от часового пояса юзера.
Ну отлично, где тут проблема? Нормальные люди хранят в таких случаях отдельно часовой пояс, отдельно абстрактное время. В виде строки, не важно.

Но нет же, наши дорогие заказчики изобрели свой формат времени. Я его назвал pseudoUTC, почему псевдо — читайте дальше.
Начало события они хранят так:

startDate = toPseudoUtc(SYS_TZ, beginningOfDay(SYS_TZ, absStartTime))
То есть мы сначала вычисляем начало дня в таймзоне системы, затем (НАБЕРИТЕ ВОЗДУХА!) переводим получившийся таймштамп в такой таймштамп, который будучи сформированным в UTC, давал бы строку абстрактного начала дня. "2018-09-28 00:00:00". Но храним не строку, а именно этот абсолютно фейковый, бесполезный и сбивающий с толка таймштамп!
Но это не всё, часы с минутами же отброшены, поэтому они хранят отдельно минуты с начала дня.
startMinutes = бла бла бла, вычисляем разницу в минутах

C endDate всё ещё интереснее. Они переводят тоже в такой тупорылый таймштамп, но только считают конец дня! То есть, условно таймштамп, который при рендеринге в строку в часовом поясе UTC дал бы "2018-09-28 23:59:59". Но (НАБЕРИТЕ ВОЗДУХА ЕЩЁ БОЛЬШЕ!!!) endMinutes они вычисляют... с НАЧАЛА ДНЯ!

Можно выдыхать.

Это пиздец, блядь.

Ну короче, проебался я полдня с их таймзонами и перевёл на клиенте обе псевдодаты в абсолютные таймштампы, которые можно тупо сравнивать с now(). Но еботни столько, что пиздец просто, нигде ж ни документации, нихуя.

А если бы хранили время в виде строки (или хотя бы хуй уже с ним, не хранили, но просто отдавали бы его клиенту в виде строки, всё равно ж оно абстрактное), то не было бы таких проблем.

janPona

В общем, прошёл собеседование на должность техлида в одну безумно крутую компанию.

Но когда понял, что там придётся ВПАХИВАТЬ, РАБОТАТЬ, а не просиживать штаны, прокрастинировать и заниматься левыми проектами на положении капризного гения-любимчика, то понял кое-что.

Я болен несколькими болезнями сразу, мне предстоит лечиться месяц или около того, и переходить в другой проект, чтобы тут же пойти на затяжной больничный — это непорядочно.

Уж лучше тут, пользуясь добротой моего аутстаффного начальства, вытворять что угодно, чем ощущать чувство вины перед незнакомыми мне людьми, за то, что я такой, какой я есть.