igrishaev
560 subscribers
89 photos
3 videos
2 files
386 links
Ivan Grishaev on everything // grishaev.me
Download Telegram
Вопрос, связанный с сетью и бекендом.

Я пишу TCP-сервер для многих клиентов. Протокол обмена свой, поэтому не HTTP. Вопрос в том, как обслуживать входящие соедения? Скажем, подключилось восемь человек, на каждого свой сокет. Каждый что-то пишет и читает, и нужно всех обслуживать. Цикл примерно такой: прочитали сообщеньку, обработали, отправили сообщеньку. Как это лучше сделать с точки зрения параллельности или асинхронности?

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

Использовать фиксированный тред-пул? Тогда каждый раз, получив сокет, я бы создавал задачу на цикл чтения-записи и добавлял бы ее в пул. В результате пока не отключится один из восьми человек, другой будет ждать. В качестве пула можно использовать виртуальные треды.

Использовать асинхронный серверный сокет? Входящие соединения извлекаются в одном треде асинхронно. А что дальше? Раскидывать сокеты по тредам?

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

На StackOverflow нашелся в точности такой же вопрос: https://stackoverflow.com/questions/71898174/asynchronous-server-sockets-with-multithreading

Прочитал его с интересом. Насколько я понял, автор склонился к доводу "на каждое соедение по треду", а дальше пусть разбирается операционная система. Что думаете?

Один из комментатор пишет о том, как они маппят соедения на несколько IO-тредов с неблокирующим IO. Примеров нет, хотелось бы конкретики.

Что посоветуете? Прошу не предлагать Netty и прочие комбайны, потому сама по себе библиотека не даст понимания, как решать подобные задачи.

UPD: забыл про NIO-селекторы, см. статью: https://www.baeldung.com/java-nio-selector
Графомания бывает не только в русском, но и в английском языке. Хороший пример — страница проекта Disruptor.

Вижу большой заголовок "What is Disruptor?", но ни один параграф не отвечает на вопрос, что это такое.

Первый параграф о том, что в такой-то фирме борются за перформанс.

Второй параграф о том, что Disruptor — это результат исследований и тестов. Мы тестировали кеши процессора и ядра и сделали дружественный к железу фреймворк.

Третий параграф — это не специализированное решение, подойдет всем.

Четвертый параграф — он работает не так как вы привыкли, может быть непривычно.

Далее ссылки и документация, а еще нас залайкал известный чел.

Внимание, вопрос — что такое Disruptor?

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

Не надо так. Отвечайте на заголовок, который сами же написали.
Очень важная новость: в Microsoft Outlook появились реакции к емейлам. Работает так: вы написали письмо, отправили, а под ним появляются пальчики, сердечки и прочее. Пошарить скриншот не могу, поверьте на слово.

Интересно, как это работает? Особая апишка в протоколе Outlook? Или пустое письмо с заголовком? Или какой-то особый пейлоад? Или если в письме только эмодзи, оно показывается по-другому?

В любом случае, шлю лучи добра пользователям Аутлука.
Официальный сайт json.org удивляет. В масштабе 30% схемы становятся огромны и заливают весь экран. В масштабе 300% правый бар наезжает на основную часть, сжимает ее в мышиный хвост, отчего схемы тоже уменьшаются.

В результате схема в масштабе 30% процентов выглядит крупнее, чем в 300%. Разница, на минуточку, целый порядок. Такой вот забавный факт.

У этих выкрутасов есть объяснения: верстка, плавающие дивы, стили, пятое-десятое. Но можно сказать проще: это фронтенд.
У меня тут накладки: вышел из строя личный ноут. Ставить Телеграм и прочие штучки на рабочий ноут я не рискую, поэтому пару дней потратил вот на что: достал с антресолей стренький мак 2014 года. Мой первый мак, в котором, как в греческом корабле, давно заменены все детали. Но я считаю его тем самым маком.

Переустановил ось, накатил софт, и в процессе пришла в голову эта заметка.

На том маке, что сейчас в отключке, я работаю четыре года. Там настроено все: блокировщик рекламы и вырезалка плашек с куками; отключены все нотификации; много правил для фаервола Lulu, чтобы программы не лезли в интернет за обновлениями; Фаерфокс работает с полиси, чтобы не показывать модалки и все остальное.

В один момент я всего этого лишился. Ощущения ужасные.

Начнем с того, что каждая программа после запуска хочет показывать нотификации. Неважно какая, неважно зачем. Даже терминал! Уведомления нельзя отключить всем приложениям сразу и позже настроить исключения. Нужно прокликать "нет" для каждой приложеньки.

Про то, что каждое приложение лезет в сеть за обновлениями и показывает модалку, я писал много раз. Приходиться ставить Lulu и затыкать софт.

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

Сюда же Телеграм: если в системе английский язык, предлагает перевести русские каналы. Если русский, то стоит кому-то скопипастить английскую Википедию, как сразу выпадашка с переводом.

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

Кроме кук всплывают: выбор города, подписка на емейл-рассылку, телеграм-канал, вход через гугл-аккаунт. Все это нужно прокликивать или вырезать.

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

В общем, посмотрел я на современный веб и обалдел. Не представляю, как пользуются им обычные люди без блокировщиков, вырезалки кук и фаервола. Куда ни зайди, на тебя кричат уведомлениями и плашками: сделай то, зайди сюда, обновись, купи премиум, подпишись, установи, оцени товар. И не только веб, но и настольные приложения и даже операционка.

Вырезаю все это по-новой и думаю: что будет через десять лет?
В корпоративной почте пришло сообщение. Я с ним солидарен и поэтому перескажу здесь.

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

Особенно это касается наклеек. Иные ребята клеят на крышку с десяток стикеров и возвращают в таком виде. Под ними остаются пятна, которые уже никогда не сойдут. К письму было приложено несколько фоток. Скажу честно, при их виде у меня заныло сердце.

Картину можно описать так: ебаный стыд. Нашлись люди, которые налепили, казалось бы, логотипы всех конференций и технологий. Node.js, Кубер-Докер, какая-то конфа по Джаве... живого места не оставили. А когда наклейки убрали, ноут выглядит как шкура далматинца -- вся в пятнах. Их уже не оттереть, это навсегда.

Что творилось в голове у этого человека, я не знаю. Даже когда ноут свой, я с сомнением смотрю на обилие наклеек. Блин, ты что, редко видишь свой Кубернетис? Наверняка же он у тебя с экрана не сходит, так еще и на ноут лепить? А клеить на чужой ноут -- это за гранью добра и зла. Я даже подумать не мог, что об этом нужно писать в рассылке -- но оказывается, очень даже нужно. Есть те, кто этого не понимают.

Пожалуйста, не делайте так. Берегите чужую технику.
Похвастаюсь, что ли, обновкой — прикупил новый макбук! Хоть старый и откачали, решил воспользоваться поводом: давненько хотел обновить железку.

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

Новый мак интересен тем, что он кастомный: у него экран с нанотекстурой. Дело в том, что мне нравятся матовые экраны. Дело вкуса, и я за это не топлю, просто нравится. Кто-то гонится за герцовкой, кто-то за матрицей, а мне нужен матовый экран.

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

Конечно, везде написано "антибликовое покрытие", но это ерунда — оно бликует и отражает.

Эпл так сильно любит пользователей, что не оставляет им выбора. На всех маках стабильно был глянец, но лет пять назад ситуация поменялась. Эплы выпустили огромный 6К-монитор за пять косарей; за лишний косарь можно было сделать поверхность матовой за счет нанотекстуры (а за еще один косарь — купить ногу-подставку).

Что это за нанотекстура такая? Прежде чем ответить, вспомним, как устроен матовый экран. Это обычный глянцевый экран, на который наклеена шершавая пленка. Из-за неровности она рассеивает свет, и получается матовый эффект. Пленка немного скрадывает яркость и угол обзора; ее можно отодрать и получить обычный глянцевый экран.

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

Я как-то видел 6К-монитор с нанотекстурой в московском ЦУМе. Продавец даже позволил подключить к нему макбук! Но ничего особого я не заметил: обычный матовый экран. За что платить такие деньги?

Я думал, что эксперименты Эпла с текстурой на этом закончатся, но нет. Постепенно ее добавили в другие устройства, например iMac (дополнительной опцией). И вот недавно выкатили в айпадах и макбуках. Устройства с текстурой относятся к категории "кастомных": их собирают не массово, а на заказ, из-за чего вы не найдете их в розничной продаже. У "кастомок" свои заморочки, о которых я напишу ниже, а пока что вернется к экрану.

Итак, матовый экран — это сказка. Он ничего не отражает, он мягкий, щадит глаза. Светишь на него фонариком — почти все рассеивается. Если сфотографировать экран, вы увидите его содержимое, а не селфи с телефоном. Не заметил, чтобы яркость, угол или рендер шрифтов как-то страдали. Все отлично читается.

Видел картинки шрифтов, сделанные микроскопом с разных экранов. На матовом четкость букв чуть меньше, да, но обычному глазу это незаметно.

Экран с текстурой нежный, легче пачкается. К нему прилагается особая тряпка, и она очень хорошо счищает грязь. Другие тряпки Эпл не одобряет.

Архитектура ARM — это, конечно, полная победа Эпла. После Интела ощущение такое, что спали невидимые гири — настолько все быстро. Ноут больше не закипает при запуске Докера. Программы выскакивают почти мгновенно. Батарея живет ощутимо дольше, раза в два точно.

У меня уже была машина на M1, и даже она после Интела казалась прорывом. А чипы M3-M4 просто творят чудеса. Самое важное: подсознательно чувствуется, что это не ARM в разы быстрее, а Интел что-то делал не так. Иначе откуда такой буст в производительности?

С софтом ситуация не такая радостная. Насколько я понял, всех толковых разрабов забрали в айфон, и десктоп пилят по остаточному принципу. Накопил десятки скринов со всякими нелепостями.

Если вы все еще на Интеле, горячо советую перейти на чипы M1-M4. Это буквально вложить деньги в себя, в свою продуктивность.
Теперь о том, что такое "кастомки". Есть стандартные конфигурации макбуков, которые массово клепают на заводах Китая и Индии. Именно их вы видите в магазинах. А есть частные конфигурации, доступные на сайте Эпла. Такие модели собирают в США, и это сказывается на доставке: долго и дорого. Кастомки ввозят в соотношении 1 к 10 относительно стандартных конфигураций, потому что на них меньше покупателей. Вероятность того, что у продавца найдется именно та кастомка, которую хочется вам, низкая.

Немного о грустном. Не все так хорошо, кое-где я просчитался, а именно в клавиатуре. Есть два широких стандарта клавиш: европейский и США. У Европы следующие особенности:

- кнопка Enter вертикальная
- обратный слэш слева от него
- тильда и обратный тик слева от левого шифта

У раскладки США все не так:

- Enter горизонтальный
- обратный слэш сверху
- тильда и обратный тик слева от единицы

Много лет я сидел на европейском стандарте: как на самом ноуте, так и на внешней клавиатуре. А поскольку кастомки собирают в США, то положение клавиш у них тоже по стандарту США. И насколько я знаю, на это нельзя повлиять. Заказал кастомку — получи раскладку США. В конфигураторе можно выбрать дополнительный язык клавиш, но это всего лишь гравировка. Макет клавиатуры не поменяется.

Получаются боль и слезы. В сотый раз нажимаю Enter и попадаю в обратный слэш. Жму тильду -- а там растянутый шифт. Только сейчас понял, насколько важна тильда: она часто встречается в кложурных макросах. Она нужна в маркдауне, а маркдаун нынче везде: в Телеграме, в Слаке, в Гитхабе и так далее.

Ясно, что когда-нибудь переучусь, но подгорает порой знатно.

Вот что я хотел рассказать вам про маки и Эплы. И постараюсь писать почаще.
Считаю, что операторам, отличным от +, -, * и /, нужно давать трехсимвольные имена, а не лепить закорючки. Например:

pow -- возведение в степень;
div -- целая часть деления;
mod -- остаток деления
xor -- исключающее побитовое OR,
log, ln -- десятичный и натуральный логорифмы.

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

А, вот: ну-ка, не заглядывая в Гугл, скажите, что значит палка-минус?


c = a |- b


Счастливой отладки (с)!

Пользуясь случаем, напомню про один скобочный язык, где сделали правильно:


(or a b)
(not a)
(and a b)
(mod 10 3)
(quot 10 3)
(bit-and 10 20)
(bit-xor 10 2)


и так далее. Вот оно: нет операторов, только формы, а значит, достаточно дать первому элементу нормальное имя.
Интересное чтиво на выходные. Некие чюваки написали пейпер о новом методе поиска свободных ячеек в хеш-таблице (по-другому называется пробирование). Метод называется Bathroom model и является отсылкой к тому, как ищется пустая кабинка в общественном туалете. Не припомню, когда в последний раз искал кабинку по этой схеме, но спорить не буду. Прилагаются сравнение с тремя другими способами: случайным, по экспоненте и воронкой.

https://arxiv.org/html/2502.10977v1

В некоторых случаях Bathroom быстрее конкурентов, но. Код на гитхабе довольно скромный, и хотелось бы больше замеров. На мой взгляд, говорить о прорыве рано, но повозиться интересно.

Код и замеры авторов:

https://github.com/Qiantongwang/Hash_Table_Bathroom/blob/main/Bath_Hash_Table.py
Я как-то писал о проблеме, что каждый сайт показывает выпадашку с куками. В конце обещал рассказать о еврочиновниках, которые все это устроили. Эта заметка -- о них.

В широком смысле еврочиновник не отличается от российского или американского чиновника. Их главная черта -- реактивный стиль управления. "Реактивный" означает не "быстрый", а от слова "реакция". Сперва чиновник реагирует самым глупым образом, а потом (и если вообще) думает, нужно ли было реагировать.

Пример: если с крыши падает лед, поставим таблички "осторожно, падает лед". Если кто-то следит за пользователем при помощи кук, поставим плашку "этот сайт использует куки". В обоих случаях главное -- выполнить KPI, отчитаться и пойти дальше. О последствиях чиновник не думает, ему не до таких мелочей.

В результате 99 сайтов из 100 показывают плашки, что сайт исползует куки. Уже одно оформление говорит о полной неразберихе. На одном сайте это полоска внизу экрана, а на другом -- модалка во весь экран. Где-то одно предложение, где-то графомания, которая не вмещается по высоте. Кто-то блюрит контент, пока не нажмешь кнопку.

На фоне неразберихи появляются сервисы, которые берут часть проблем на себя. Например, Cookiehub внедряет виджет выбора кук. Их клиентов можно понять: проще платить двадцать евро в месяц, чем попасть по доносу конкурентов на 30 тысяч евро (реальный случай).

Грамотность чиновников, которые принимали закон, сводится к урокам информатики в школе. Учитель заставлял их открыть сайт в Интернет-Эксплорере, найти файлы куки, удалить их и убедиться, что сайт не узнает пользователя. Все мы делали это в школе, и наши европейские сверстники не исключение. Беда в том, что в 40 лет их компьютерная грамотность осталась на том же уровне. Отслеживать пользователя можно сотней способов, но у чиновника в голове одно: куки.

Когда смотришь, во что превратился интернет, разве не очевидно следующее? Если каждый сайт уведомляет о технологии X, это значит, она повсеместна и уведомлять о ней бессмысленно. Бесконечные плашки превращаются в шум, люди закрывают их инстиктивно. Блокировщики рекламы уже включают функцию удаления плашек. На одном конце провода эти плашки продуцируются, на другом -- удаляются. Жгутся такты процессора, выделяется тепло. Зачем? Какая цель?

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

Почему бы не подвергнуть закон пересмотру? Найти чиновников и спросить: что хорошего принесли уведомления о куках? Стало ли меньше трекинга и преступлений? Стал ли интернет безопасней? Было ли хоть раз так, что человек заходит на сайт и такой: опачки, здесь куки, пойду-ка я на другой сайт? Это просто смешно.

Поэтому я считаю, что любой закон должен приниматься только на определенный срок. Годен до, так сказать. Когда срок истек, чиновники собираются и решают -- продлить как есть или что-то поменять. Ключевой момент в том, что это будут уже другие чиновники. Кто-то из прежних перейдет в другие отделы, кто-то в бизнес, женщины -- в декрет. Придут новые ребята и, возможно, поправят бред, принятый по ошибке десять лет назад. Это даст шанс, что ошибка продлится только несколько лет, а не сотню-другую.

Искренне не понимаю, почему в Европе не нашлось энтузиастов, которые положили бы этому конец? Я имею в виду группу экспертов: программистов, опенсорщиков, членов всяких комитетов. Они бы собрали материалы и факты, организовали бы встречу с чиновниками и популярно объяснили им, что они натворили. Добились бы частичной отмены и точных формулировок. Но ничего подобного не видно: все послушно лепят плашки на сайтах, словно овцы, которых ведут на убой. Всякие Греты Тунберг и другие отбитые личности собирают толпы, когда речь о борьбе с климатом и ковиде. А когда что-то важное, то тишина: это для нашей безопасности.
Верю, что плашки с куками не навсегда. Найдутся те, кто скажут: задолбало, мы этот закон не писали, мы его не уважаем, ставить плашку не будем (я уже нашелся). Этот бред нужно перетерпеть. Не исключено, что дальше будет хуже, но я смотрю в будущее с оптимизмом.
Не помню, чтобы кто-нибудь высказывал следующую мысль. Школьное образование должно быть исключительно аналоговым. Никаких электронных учебников, платформ, мессаджеров, онлайн-дневников и прочего. Странно, что это мало кто понимает.

Теперь длинно. Российское айти развивается довольно неплохо, и верный признак этого -- компании собирают деньги там, где раньше не могли, а именно в образовательном секторе. Исторически считалось, что школы бедные и с них нечего взять. Однако оплату повесили на родителей, и дело пошло. Напоминает фирмы, которые продают товары детям -- аудитории, у которой нет денег -- но за них платят родители.

В образовании айтишный элемент является чистым наркотиком. Это бесплатная первая доза, когда платформу внедряют якобы бескорыстно, а потом выясняется, что нужно купить тарифный план. Сайт платформы работает бесплатно только на десктопе. Мобильное приложение показывает только часть данных, а если хочешь все -- оформляй подписку.

Любая платформа предполагает, что у ребенка есть телефон, электронная почта и логин. Все эти данные сливаются партнерам в целях рекламы. Я не поленился и прочитал политику обработки ПД одной из платформ: там указаны восемь фирм, включая Яндекс.

Некоторые платформы делают вход через другие. Например, чтобы попасть в Я.Класс, нужно войти через электронный дневник, а вход в него работает через Госуслуги. Представили длину этой цепи? Сто редиректов, попапы, токены... Как это можно объяснить ребенку?

Гаджеты и платформы плохо влияют на учителей, они деградируют в профессиональном плане. Во время ковидной истерии все родители познали дно этой деградации. Ни один учитель не мог достойно организовать удаленное образование. Ни у кого нет материалов для распечатки, контрольных, типовых заданий. Учитель не может составить задание ученикам. Каждое домашнее задание -- это ссылка на какую-то говно-платформу, где нужно регистрироваться и подтверждать учетку телефоном, и которая работает только в Хроме на винде.

Учителя и школы оказались голыми. Нет никакой базы знаний: офлайн-лекций, методичек, контрольных работ, которые распечатал и готово. Я как отец трех детей (двое учатся в школе) просто охуевал с этого, простите. Когда училка опять кидает ссылку на образовательный портал, хотелось лупить ее линейкой со словами: ты учитель или кто? Сядь и составь задание для детей, это же час работы. Тебе же самой пригодится в дальнейшем. Какого хрена ты тащишь детей в очередной стартап?

Я вообще считаю, что учитель без личной базы лекций, заданий и методичек -- это не учитель. И на проверку большинство учителей оказались такими.

Мне повезло: я учился у преподавателей, которые готовили матералы сами. Конечно, они опирались на учебник, но изложение было авторское. Исписанный листочек в руках препода -- очень хороший признак. В университете прогульщики искупляли грехи тем, что набирали эти листочки и печатали методички, которые позже ходили по рукам.

Айти-компании, которые сегодня захватывают образование, прикрываются благими целями. Разумеется, все это ложь. Компании важна прибыль, а качество образования ее нисколько не интересует. Это слишком долгосрочная цель, за это время или фирмы не останется, или руководство уйдет в другое место. Об образовании должно думать правительство, но у него другие приоритеты. Вся надежда на родителей.

Классика: все онлайн-штучки на проверку оказываются эфемерны. Что-то лагает, тут недоступно, сессия истекла, зайдите через сервис Х, браузер не поддерживается, у вас блокировщик рекламы, введите логин, который ребенок придумал год назад... словом, привычное нам айтишное дерьмо. Я стерплю, не вопрос, но причем тут мои дети?

Образовательные платформы, электронные учебники, дневники, видео-курсы, что там еще... все это замечательно, но не имеет отношения к образованию. Кому-то нравится -- ради бога, пользуйтесь, платите. Но школа должна быть в стороне от этого. У ребенка должна быть книга, тетрадь, ручка и учитель -- вот все, что нужно для хорошего обучения.
Трудно поверить, но во многих странах до сих пор живодерский обычай переводить время на час и обратно. Даже находятся те, кто утверждает, что это полезно для экономики.

Напомню, что сто пятьдесят лет назад какой-то бюрократ посчитал, что если зажигать лампочку на час позже, это будет дешевле. О мелочах вроде сорванных встреч, опозданий и нарушений биоритмов никто не думал.

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

Согласен, что зимой нужно корректировать время, но делать это нужно по-другому.

Зимой человек устает больше и спит больше. Поднять и собрать детей в школу зимой -- целый подвиг. А весной или ранней осенью, когда солнце уже показалось, вставать легче. Отсюда вывод: нужно двигать не циферблат целиком, а распорядок госучреждений. Например, начинать занятия в школах, садах и госконторах не в 8 утра, а в 9 или хотя бы в 8:30. То есть давать людям лишние 30 минут на сон.

Это честно, потому что затрагивает только тех, кому это нужно. На офисных работниках, у которых служба начинается в 10, это никак не отразится. У них не поедет календарь, не придется опаздывать. У стариков не нарушится прием лекарств. Что может быть лучше?

Пока писал, вспомнил свою жизнь в Чите. Я тогда работал в Энергосбыте, где служба начиналась в 8 утра, и за опозданиями следили строго. Пара опозданий -- выговор, три и более -- лишают премии. Только одна женщина из соседнего отдела могла приходить к 9 утра, но такую привилегию нужно было выслуживать годами.

Так вот, Чита, зима, поднимаешься в 6:30. За окном ночь. Завтрак, подъем ребенка, сбор в садик. Едем на санках по морозу -30. Машины нет, да и не каждая машина заведется, постояв ночь при такой температуре. После сада нужно сесть на маршрутку, а они все полные. Кое-как добраться до работы, чтобы пересечь турникет за две минуты до 8 утра. Зайти в кабинет и полчаса отогреваться и отпиваться чаем. Зато успел, премии не лишат.

Блин, зачем так жить? Зачем рвать задницу ради 8 часов утра? Зачем переводить часы глобально? Почему нельзя подвинуть распорядок тех контор, которые начинают рано? То, что в мире сейчас -- это какой-то идиотизм от начала до конца.
Накину ссылку, которая очень мне помогла:

Postgres как поисковый движок
https://habr.com/ru/companies/sravni/articles/888534/

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

Статья полезна вот чем: до нее я не понимал, как объединять выборки с удалением дублей. Бывает, один и тот же документ оказывается в разных выборках, и нужно оставить ту, у которой больше ранг. Пытался сделать это при помощи UNION, но из-за ранга дубликаты не удалялись. Чистить их вторым проходом тяжело, усложняется план.

Так вот: автор предлагает объединение выборок при помощи full outer join и coalesce среди айдишек прошлых результатов. Звучит непонятно, но если разобраться, то получается как в примере ниже.

Для сравнения, вот первый запрос, который выбирает документы по условиям и сортирует по выражению с рангом:

SELECT aggregate FROM some_aggregates
WHERE
NOT ((aggregate #>> ARRAY['state']) = ':deleted')
AND (((aggregate #>> ARRAY['attrs', 'code']) = 'hello')
OR (aggregate @@ '$.attrs."code-name" == "hello"')
OR ((aggregate #>> ARRAY['attrs', 'code']) ILIKE '%hello%')
OR ((aggregate #>> ARRAY['attrs', 'code-name']) ILIKE '%hello%'))

ORDER BY CASE
WHEN (aggregate #>> ARRAY['attrs', 'code']) = 'hello' THEN 0
WHEN aggregate @@ '$.attrs."code-name" == "hello"' THEN 1
WHEN (aggregate #>> ARRAY['attrs', 'code']) ILIKE '%hello%' THEN 2
WHEN (aggregate #>> ARRAY['attrs', 'code-name']) ILIKE '%hello%' THEN 3
ELSE 999
END ASC

LIMIT 51 OFFSET 0


На таблице с 1.5 миллионами записей метрики такие: execution=450ms, cost=90000, что довольно много.

А вот то же самое, но с подходом, который предлагает автор:

with sub1 as (
select
id,
0 as rank
from
some_aggregates
where
NOT ((aggregate #>> ARRAY['state']) = ':deleted')
and ((aggregate #>> ARRAY['attrs', 'code']) = 'hello')
limit 51
),

sub2 as (
select
id,
1 as rank
from
some_aggregates
where
NOT ((aggregate #>> ARRAY['state']) = ':deleted')
and (aggregate @@ '$.attrs."code-name" == "hello"')
limit 51
),

sub3 as (
select
id,
2 as rank
from
some_aggregates
where
NOT ((aggregate #>> ARRAY['state']) = ':deleted')
and ((aggregate #>> ARRAY['attrs', 'code']) ILIKE '%hello%')
limit 51
),

sub4 as (
select
id,
3 as rank
from
some_aggregates
where
NOT ((aggregate #>> ARRAY['state']) = ':deleted')
and ((aggregate #>> ARRAY['attrs', 'code-name']) ILIKE '%hello%')
limit 51
)

select
aggs.id,
aggs.aggregate #>> ARRAY['attrs', 'code'],
aggs.aggregate #>> ARRAY['attrs', 'code-name'],
sub1.rank,
sub2.rank,
sub3.rank,
sub4.rank,
aggs.aggregate
from
sub1

full outer join sub2 on coalesce(sub1.id) = sub2.id
full outer join sub3 on coalesce(sub1.id, sub2.id)
= sub3.id
full outer join sub4 on coalesce(sub1.id, sub2.id, sub3.id) = sub4.id

join some_aggregates aggs
on coalesce(sub1.id, sub2.id, sub3.id, sub4.id) = aggs.id

order by
sub1.rank, sub2.rank, sub3.rank, sub3.rank asc

limit 51

Хоть он и выглядит длинно, содержит CTE и джоины, но метрики такие: execution=7ms, cost=15000. Гораздо быстрее первого варианта.

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

Статья на Хабре -- перевод вот этого блога: https://anyblockers.com/posts/postgres-as-a-search-engine

В свою очередь, автор взял идею из блога Supabase: https://supabase.com/docs/guides/ai/hybrid-search

Тем, кто ковыряеся с Посгресом, будет очень полезно изучить ссылки.
Вот что меня удивляет. Когда логинишься в любой сервис, ввода пароля уже недостаточно. Обязательно спросят код с телефона или почты. В какой-то степени я с этим согласен, потому что телефон -- физическое устройство, им трудно завладеть, коды одноразовые, их сложнее перехватить.

Хорошо, но зачем тогда вообще пароль? Если мы не доверяем тому, кто ввел пароль, зачем он нужен? Вроде бы есть проверка, но она не точная как фильтр Блума.

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

Видимо, кто-то считает, что связка "пароль" + "код из смс" безопасней, чем оба по отдельности, но я в это не верю. Это примерно как вызвать хэш-фукцию десять раз вместо одного: доказано, что такой подход не приносит пользы.

Телефон уже давно умеет в биометрию и может авторизировать человека где угодно. Неужели лица и отпечатка пальца недостаточно, чтобы зайти в личный кабинет? С какой стати человек должен помнить пароли вроде "не менее 8 символов, не менее двух заглавных букв" и мусора вроде решеток и долларов? И так для двадцати разных сервисов?

Тем не менее, все бездумно лепят одну и ту же схему: пароль, которому никто не верит, и коды с телефона. Тут явно нужно что-то менять.

Самое смешное: сейчас вы повозмущаетесь в комментариях, а что потом? Пойдете пилить форму авторизации с паролем.
Замечаю еще один забавный паттерн. Звоню в разные фирмы, и как обычно, на входе голосовое меню. Чтобы узнать то, нажми 1, чтобы это, нажми 2 и так далее. Либо тыкаешь сразу 0, чтобы попасть на оператора, либо ждешь, пока меню отпустит и сработает фолбек.

Но когда скрипт переключает на оператора, включается ИИ-бот. "Я голосовой помощник Иннокентий, какой у вас вопрос?" Говоришь "дай оператора", и начинаются расспросы: а по какому вопросу тебе нужен оператор? В точности пенсионер-вахтер.

К чему я это пишу. Ребята, которые внедряют голосовых ботов: не кажется ли вам странным оставлять голосовое меню из нулевых годов? У вас же вроде ИИ, который знает и умеет все на свете, и который скоро всех заменит. Но прежде чем попасть на бота, я должен кликать в голосовом меню? Как-то не сходится. Зачем боту такой костыль?

То, что голосовые помощники тупы как пробки, нет смысла говорить. Выделяют ключевые слова и читают то, что уже есть на сайте. Например, спросишь: на какой премиальный курс я могу рассчитывать, если сумма обмена больше N тысяч евро? И он диктует текущий курс или расписание отделений.

Беда.
В детстве я увлекался Фоллаутом. Разумеется, двумя первыми играми с видом сверху. Месяцами бродил по пустыням, выполнял квесты, а то и вовсе вырезал город за городом. Тогда мне казалось это интересным.

Не хочу наговаривать на последующие части, но Фоллауты с видом от первого лица -- это не мое. Абсолютно не понимаю их. По мне это как Doom в виде карточной игры.

Так вот, с опозданием в 25 лет я выяснил забавный факт. Помните Пип-боя, маскота игры? Прикладываю картинку. Почему он вытянул руку, поднял палец и прищурился? Это не просто так, здесь умысел.

Дело вот в чем. Предположим, на горизонте образовался ядерный гриб. Как проверить, безопасно ли расстояние до него? Нужно вытянуть руку и навести большой палец на гриб. Если палец полностью закрывает его, значит расстояние безопасно, и можно идти по своим делам. Если же гриб вылезает, нужно что-то предпринять.

Оказалось, все это время Пип-бой вымерял пальцем ядерный гриб, а я не знал. Он че!
Встречаюсь с приятелем, и он рассказывает: водил жену в ресторан, и знаешь, какой официант нас обслуживал? Настоящий гей! Или знакомый врач говорит: представляешь, вчера на приеме был настоящий гомик! Разумеется, они используют более резкие термины, которых я не привожу, чтобы никого не обидеть.

В такие моменты я оживляюсь и спрашиваю: как ты определил, что это гей? Он оставил записку с предложением встретиться? Он погладил тебя за руку? Шлепнул по заднице? Облапал в гардеробе? Залез в штаны?

Все оказывается банально: этот "гей" был вычурно одет, пользовался косметикой, говорил с другой интонацией. И все? "Божечки, а разговоров-то было..." (с)

Объясняю: в городской среде сексуальная ориентация и внешность никак не связаны. Можно спать с мужчинами и носить обычную одежду. Можно носить ошейник и кожаные штаны, но не иметь связей в принципе.

В случае с официантом причин может быть много. Парадоксально, но факт: когда у человека совсем плохо с женщинами, он может притворяться геем, особенно если работает в женском коллективе. Это старый прием, потому что к геям девушки относятся по-другому.

Человеку может нравиться ролевая модель гея. Он изображает того, кто не вписывается в рамки. Ему нравится эпатировать публику, ловить взгляды. Провоцировать других и писать гневные посты в VK: а сегодня одно быдло сказало мне... Отсюда прилизанные лаком волосы, мушка на щеке, брошь размером с кулак.

Не вижу разницы с неформалами, готами и другими ребятами. Везде, если копнуть, сидит желание выделиться или уход от своих проблем.

Знаю гей-пару, которая давно живет вместе. Не студенты на съеме, а мужчины моего возраста, которые сделали свой выбор. Совершенно заурядные люди: обычная одежда, нормальная речь, манеры.

Отучайтесь делать выводы об ориентации по внешности. Иначе вы не лучше деревенского гопника, который выучил, в каком ухе должна быть серьга, в какую сторону приглаживать челку, и какой фасон джинсов "правильный". Мир как бы сложнее этих правил.