Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

API телеграма и баны

Чтобы публиковать посты в канал, я почти сразу написал скриптик, чтобы решить проблемы с markdown (например, до сих пор в телеге markdown не поддерживает ссылки). Скрипт использовал Telethon, который подключается с использованием моего аккаунта.

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

Ладно, давайте попробуем сделать все “правильно”: создаем бота, добавляем его в админы канала, используем python-telegram-bot… и обнаруживаем, что в API ботов нет возможности делать отложенные сообщения -_-.

У Telethon есть аналоги — Pyrogram и MadelineProto. На беглый взгляд при их использовании будет та же проблема с банами. Один раз попал в черный список — и привет:)

Я дошел даже до того, чтобы посмотреть на альтернативные клиенты для веба — A и K. В одном та же проблема с разметкой, а вот второй вроде смог распарсить ссылку, но блоки с кодом поломал: было смещение на 1 символ. Код открыт — отлично, можно сделать PR с исправлением и делать отложки вручную! Вот только в исходниках ноль тестов на парсинг разметки… Ладно, видимо не вариант.

Попробовал пару “советов” по Telethon — перебор диалогов, sleep понаставить, какие-то хаки с system_version — не помогло. В итоге решил-таки попробовать pyrogram (терять особо нечего) — и все заработало :/ Парсит markdown он хуже (у него вообще своя версия), но хотя бы работает.

Вообще когда телега стартовала, казалось, что это глоток свежего воздуха и очень переспективная платформа. А сейчас смотришь — баги не фиксятся годами, вроде богатое API, но что-то просто сделать не можешь, да еще и баны на ровном месте…

СсылкаКомментировать

Отличие конкурентности от параллелизма

Доклад от создателя Go. Несмотря на то, что докладу уже больше 11 лет, он достаточно простой и фундаментальный, чтобы не потерять актуальности.

Основное отличие — это иметь дело с несколькими вещами против делать несколько вещей. Разобран хороший и забавный пример, как одну и ту же задачу (сжигание старых стандартов в печи) можно сделать по-разному. Кроме этого, разобраны базовые структуры для композиции в Go, но их аналоги есть в других языках, например в Котлине. В конце чуть-чуть напрягло, что в примере с балансировщиком нагрузки была использована “сырая” куча, а не очередь с приоритетом.

Отдельный кек — если вы находитесь на странице Concurrency и перейдете на русский перевод, то попадете… на страницу Параллелизм. Справедливости ради, там есть раздел про различие.

СсылкаКомментировать

Отладка GitHub Actions

Полезный инструмент, чтобы отлаживать GitHub Actions. Скачивает пол-интернета, но работает довольно шустро.

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

act -j action_job

или чего-то вроде

act issue -s GITHUB_TOKEN=... -j action_job -e event.json

Еще можно отлаживать action, которое в процессе разработки (правда надо убедиться, что оно есть в каком-то коммите и “загрузить” его):

...
  steps
  - uses: actions/checkout@v4
  - uses: ./my-action
СсылкаКомментировать

Премии

Исследование более чем 30-летней давности про влияние премий на производительность труда и мотивацию сотрудников. Понятно, что многое могло поменяться, но все равно многое вроде применимо и сегодня.

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

  • Если премия привязана к KPI, то будет типичная проблема любого KPI;
  • Премии поощряют хорошо работать в рамках текущей системы, но не улучшать ее;
  • Почти все сотрудники считают себя хорошими работниками (но все премию не получат);
  • Если выполнены условия для премии, то почти нет мотивации делать что-то сверх этого;
  • Некоторые виды премий могут привести к внутренней конкуренции, которая обычно контр-продуктивна;
  • Сложные работы делаются командой, а премии обычно выдают индивидуально — нестыковочка;
  • Премии вроде как должны повышать производительность труда, но исследования показывают, что проблемы обычно в системе, а не в конкретных людях;
  • Премии в основном сфокусированы на краткосрочных вещах.

В целом тяжело построить что-то объективное, не основанное на KPI/метриках, поощряющее командную работу и при этом воспринимаемое как справедливое.

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

Имхо, еще можно посмотреть на все это с точки зрения учебы и оценок (обесценивание оценок, учеба на оценку, а не на знания и т.д.).

СсылкаКомментировать

Mermaid

Недавно попробовал Mermaid-диаграммы. В целом ощущения похожи на markdown — прикольно делать что-то простое; хорошо, что это простой текст, который легко хранить в гите; генерируется SVG, в котором можно выделять текст.

Однако как только что-то не работает, то начинаются трудности. Например, у меня в схеме процесса образовалось много пересекающихся линий (хотя при этом граф планарный) и нет какого-то нормального способа это исправить, только случайная перестановка строк, пока не получится что надо. Другая проблема, с которой столкнулся — очень маленькое изображение из-за ограничения по ширине, а какой-то нормальной раскладки или “построчного” переноса нет. Нет и возможности увеличения по клику (из коробки). Поковырявшись почти час с разными настройками ширины на уровне CSS, графа и глобальных настроек в итоге плюнул, сменил направление с горизонтального на вертикальное и получил приемлемый результат. Ко всему этому можно добавить довольно нерегулярный синтаксис.

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

graph TD
    *>*] --x  **[/"_____"\]
    ** --- ***{{.}} --- _{{_}} --- .{{*}} 
    ** --- ****{{.}} --- _ --- ..{{*}}
    ** --- ***{{.}} --- __{{_}} --- ...
    ** --- ****{{.}} --- __ --- .
%% *** --- ****
    *** --- ___{{_}} --- .
    **** --- ___ --- ..
    *** --- _{{_}} --- ...{{*}}
    *** --- __{{_}} --- ..
    *** --- ___{{_}}
    **** --- _ --- ....{{*}}
    **** --- __ --- ....
    **** --- ___ --- ....
    ___ --- ...
СсылкаКомментировать

cgi-bin

Есть что-то притягательное в том, чтобы иногда делать что-то “как в старину”.

Я повелся на шальную мысль и написал cgi-скрипт. Прямо на “проде”. По SSH, редактируя в nano. Без тестов, VCS и СМС. И теперь любое посещение специальной (публичной!) ссылки будет приводить к исполнению питоновского скрипта. С URL-параметрами, передаваемыми в переменные окружения без фильтрации и экранирования. С возвратом полной копии стандартного потока вывода пользователю. “Это безопасно. Дэвид, эксперт по безопасности”.

Больше всего времени я потратил на борьбу с правами доступа (и узнал, что бит исполнения в директории влияет на то, можно ли в нее по символической ссылке переходить). Но если отбросить это, то поменять консольный скрипт на “веб-сервер” — дело на пару минут.

Такая простота искушает. На настоящей работе такого конечно в жизни уже не сделаешь (да и никто и не даст). Сама возможность запускать скрипт на сервере по запросу от пользователя без кучи прослоек сейчас звучит диковато.

СсылкаКомментировать

GUI для Python-скриптов

Прикольная штука, которая за счет магии мета-программирования добавляет GUI для скрипта на основе его argparse структуры (увы, просто для sys.argv не работает). Область применения конечно весьма узка (потому что вряд ли ваша бабуля будет запускать питон-скрипты), но вдруг кому пригодится. Тянет wxpython, который ставится полгода.

СсылкаКомментировать

Отличия Prometheus от InfluxDB

Prometheus — де-факто стандарт для всяких куберов и микросервисов. До него я работал с TICK-стеком, в частности с InfluxDB.

Я особо не вдавался в различия этих двух систем — ну метрики и метрики, че там может быть такого? Но недавний опыт с запихиванием данных в Prometheus в нестандартном сценарии и их последующим запросом показал, что можно конечно плакаться и колоться, но кактус жрать дальше как-то не очень. В итоге обсудили с коллегой, что если мы в основном пушим данные, то InfluxDB лучше подходит для наших сценариев.

Фундаментальное отличие Prometheus от InfluxDB — это разные модели работы с данными: push vs pull. При этом у Prometheus есть Push Gateway (который работает хреново), а InfluxDB — telegraf (агент, который опрашивает и пушит), и он работал без особых проблем. Киллер-фича Prometheus — это то, что он хорошо клеиться с микросервисами, для InfluxDB нужно чуть больше церемоний. Но складывается впечатление, что InfluxDB универсальнее и покрывает большинство сценариев.

Хороший разбор на эту тему можно посмотреть тут.

СсылкаКомментировать

Простая scala

Занятный доклад от Одерски про усилия команды разработчиков языка, чтобы Scala стала проще.

Хотя я и до этого смотрел несколько докладов Одерски, в этом меня немного удивила практичность подходов: у меня было стереотипное представление об ученом в слоновой башне с жесткими принципами функциональной чистоты. Например, он рассказывает, как энтузиаст заменил императивную реализацию расстояния Левенштейна в компиляторе на чисто функциональную с иммутабельными структурами. Оказалось, что реализация неверная, да еще и хуже читается, поэтому оставили старую. Другой пример: большинство присутствующих в зале скалистов признало, что тупой матчер на Option лучше, чем .fold или .map(...).getOrElse(...).

В конце доклада есть еще блок о Caprese и эффектах. На примере функций высшего порядка Одерски объясняет, чем capabilities лучше проверяемых исключений.

СсылкаКомментировать