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

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

Впечателения о Ruby

С этим языком я мимолетно сталкивался и раньше — например, Puppet и его модули были написаны на Ruby; язык шаблонов Liquid, который используется в Jekyll, имеет схожий с ним синтакс; недавно локально запускал Discourse, который на рельсах написан.

У меня было о нем впечатление, что это просто такой “японский питон”, который выстрелил после Ruby On Rails, а сейчас уже движется тупо по инерции, ведь для чего-то нового рельсы вряд ли будет наверху списка.

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

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

Язык… своеобразный. Самые отталкивающие моменты:

  1. необходимость закрывающих end (да и в целом лишние церемонии);
  2. очень непонятные ошибки (уровня “ты где-то end забыл” на последней строке, с нулем гипотез где);
  3. много лишнего/вещей о которых надо помнить: unless, когда есть if и not, странности синтаксиса (вроде того, что в хэш-таблицах по умолчанию будут символы, а не строки; странные правила для return или разрешение вещей типа sum sum(3, 4), 5). Добило меня, что если написать переменную с заглавной буквы, то это будет константа с глобальной видимостью (а по умолчанию в контексте функции ничего извне не видно).

Есть и хорошие идеи (например, ? на конце у методов, возвращающих bool и ! у методов, меняющих содержимое коллекции на месте), но в целом я не ощутил, что у языка есть какие-то киллер-фичи.

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

Однопальцевый зум

В большинстве приложений карт (я проверил Google Maps, Яндекс и Organic Maps) есть еще один вариант для масштабирования, кроме привычного двухпальцевого метода и двойного нажатия — двойное нажатие + оттягивание вверх/вниз. Есть даже исследование на сумасшедшей выборке из 12 человек, что этот метод на 47% эффективнее, когда вы держите телефон одной рукой.

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

Cosmopolitan

Несколько лет этот проект валялся у меня в списке “посмотреть”. Звучит как какая-то магия: компилятор C, который производит один исполняемый файл, который можно запустить на любой платформе без интерпретера, мам, пап и кредитов. Попробовал его, когда делал счетчиковую машину, но почти сразу же бросил это дело. Увы, реальность полна разочарований: что-то дополнительное все равно придется ставить/настраивать, это аж в ридми написано. При этом техническая реализация довольно интересная.

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

Witr: why is this running

Попробовал witr — порадовала автономность и спектр вариантов установки (просто deb-пакет — это прекрасно). С заявленной задачей, можно сказать, справляется, но вау-эффект не произвел. Для открытых портов lsof | grep TCP как будто проще, а источники процессов ведут почти всегда в systemd, при этом пути к связанному конфигу нет. Киллер-фичей бы для меня стало определение стандартных системных процессов, но это слабо соответствует заявленной цели утилиты.

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

Cache control и "умный" Cloudflare

Если ваш сервер не посылает заголовки, связанные с кэшированием, то по умолчанию, браузеры ориентируются на заголовок Last-Modified. Если и эту дату не ставить (или всегда оставлять там текущее время), то ничего закэшировано не будет. Не могу сказать, что когда-то сильно парился по этому поводу как бэкэндер — обычно всякие API должны отвечать самыми свежими данными, а этим вопросом занимались фронты/девопсы/SRE (если занимались, конечно). Да и у многих фреймворков и проксей вполне адекватные настройки по умолчанию (например, всякие эндпоинты, которые статику отдают, нормально и заголовки кэширования из коробки дают).

И вот на прошлой неделе я как пользователь-админ делаю всякую мелочевку в нашем древнем MPA-монолите приложении с SSR, а страничка не обновляется. Возвращается результат из кэша. Самое страшное — даже в приватном режиме возвращается та же страница, где я “залогинен” и видны админские функции. Это Cloudflare решил любезно закэшировать страницу, и пофиг что ее нельзя кэшировать — ведь там есть .jar в URL! Абсолютно пофиг, что содержимое — это HTML страничка.

Решение вроде как очевидное — посылать правильный заголовок Cache-Control и Cloudflare настроить. Но с заголовками и нашим приложением возникла небольшая проблемка: если содержимое страницы отличается для разных пользователей, то надо эти кэши как-то разделять. Для этого есть Vary, но браузеры не заставишь посылать дополнительный заголовок, а Vary: Cookie — это антипаттерн. Другая проблема — CSRF-токены в HTML. В итоге сильно вкладываться в исправление проблемы не было ни желания, ни ресурсов, тупо отключили кэш, а в критическом месте оставили Vary: Cookie, потому что от этого, несмотря на проблемы, выиграет большинство пользователей. Но осадочек от Cloudflare остался. И ощущение, как будто “классический” web тут уступает современным фреймворкам: почти везде рекомендуют в подобных сценариях отдавать статический HTML, чтобы он кэшировался, а наполнять его на стороне клиента.

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

Чистосердечное признание

Теперь, в новом (старом), 2026 году, когда канал набрал сумасшедшее количество подписчиков (аж 100!), пора признаться.

Все посты в этом канале были написаны нейросетью. Не верите?

  1. Первое длинное тире было использовано аж в десятом посте — в январе 2020, между прочим! А примерно с апреля 2020 года оно используется почти все время. Почти тогда же у канала появился сайт — совпадение? Нет! Это чтобы нейронку дообучать на истории постов.
  2. Подписи с авторcтвом пропали! Последний пост с подписью был тоже в апреле 2020, все сходится! Там даже что-то про человеков говорят. Админ не может с чистой совестью поставить свое авторство под нейрослопом!
  3. Многословие и словоблудие: вы только посмотрите, сколько текстов-потоков сознания. Почти везде присутствуют резкие переходы между темами, “логические зигзаги” и абстрактные умозаключения “капитана очевидности”, характерные для нейротекстов.
  4. Списки очень часто появляются. Вот, например: 1, 2. Что характерно, оба поста — краткий пересказ существующего материала, что является популярным вариантом использования нейросетей. Да даже и в этом посте есть список!
  5. Когда в канале стало 50 подписчиков, то были включены комментарии. А недавно началась активная монетизация — аж два поста (этот и этот) получили по одной звезде! Явно видно стратегию продвижения. Помните, что если контент бесплатный, то продукт — это вы!
  6. Не обязательно верить на слово — можем проверить последний пост самостоятельно с помощью инструмента Copyleaks AI Detector — 100% результат:

Делайте выводы. Пора отписываться.

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

Счетчиковая машина

На курсе по алгоритмам в основном использовали RAM-машину в качестве алгоритмической модели. У нее есть много вариаций с меньшим числом операций, и одна из них — счетчиковая машина, где один из вариантов имеет всего две операции: инкремент и декремент с условным переходом (хотя можно и до одной ужать, Тьюринг-полнота почти везде).

Мне хотелось накодить что-нибудь простенькое и я сделяль.

Если нечем заняться на каникулах, поиграйтесь и попробуйте найти самую короткую программу, которая в нулевом счетчике выставит 2026 (ура, Новый Год), а остальные оставит пустыми, с минимальным использованием дополнительных счетчиков. Это хорошая разминка для ума и особенно для тренировки отлова ошибок типа off-by-one. Можно написать скрипт, который напишет программу за вас. Можно заставить это делать ИИ-агента. ChatGPT, например, в думающем режиме мне доказал, что оптимальное решение — это 2026 инкрементов. А вот Gemini с первого раза бахнул программу на 29 инструкций и 7 счетчиков, что было круче моего рабочего варианта на 34 инструкции. Усердно попыхтев, к счастью, нашел вариант за 26 инструкций и 6 счетчиков (память надо сейчас беречь). Фух, пока еще не совсем отупел.

Код писал на чистом Си, узнал про ungetc и что scanf тупой.

Разумеется, больше всего времени отняло все что угодно, кроме основной логики. Поддержка WASM в браузере сильно разочаровала. Вроде простая задача, запустить нативный код в браузере, еще 5 лет назад такое делал с растом, должно же быть уже все элементарно, да? *падме.jpg*

Спрашивал ChatGPT, попробовал wasmer и bjorn3 — тупо не работают и даже ошибки не выводят, Emscripten показался слишком старым (эй, ну браузере-то надо модно и молодежно!), а jco нужна была промежуточная траспиляция. ChatGPT еще и выдавал какую-то хрень в примерах кода.

В итоге сам нашел хоть что-то рабочее — uWASI. Через гугл, прости господи. Сам прочитал Readme, потому что у гпт лапки и он не смог сгенерировать рабочий код, сам написал как надо. Был баг, что stdin читался по кругу — вставил костыль.

Вот такие пироги. С наступающим!

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

Не стоит торопиться с обновлением зависимостей

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

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

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

LLM-описания проектов

Я вот как раз в пятницу глянул парочку описаний проектов, сгенеренных LLM: DeepWiki и CodeWiki. Идея неплохая: быстро погрузить нового разработчика в контекст, чтобы информация всегда была актуальна. Казалось бы, задача, для которой LLM отлично подходят: обработай кучу данных, сделай выжимку, презентуй красиво, разжуй.

Реальность, разумеется, полна разочарований. Да, там есть некоторые факты, переписанная существующая документация, выжимки-описания кусков кода, но фокус, последовательность и полнота изложения вообще не в кассу. Про архитектуру полезной информации нет, какого-то внятного высокоуровневого описания тоже нет, затронутые аспекты/темы — ну очень выборочные, много написано про неважные моменты, а некоторые очень важные вообще не упомянуты. Более того, есть некоторые предложения, которые могут привести к совсем неправильным выводам.

Но если цель — произвести вау-эффект для несведующих или сделать документацию по проекту за 1 день — то да, прокатит :/

Я еще попробовал спросить у встроенного чата пару вопросов по участкам кода, которые недавно трогал и, ожидаемо, получил “правдоподобные” ответы, которые не давали нужной информации, а частично были вообще неправильные.

У коллег остались схожие впечатления.

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