ESPNWho's on the CFP bubble? Did Week 8 burst the Big 12's two-bid dreams?Bollywood HungamaAli Abbas Zafar wraps up shooting for Ahaan Panday-Sharvari starrer Beparwah; says returning to YRF feels like “coming back home”Daily MaverickWINNING: Anna Trapido is Food Writer of the YearThe Jerusalem PostIsraeli Hollywood star Gal Gadot votes in 26th Israeli Knesset electionsPunchFRSC sends 19,560 number plates to FCT after delay complaintsUN NewsKenya: 20 Ebola contacts released from quarantineInquirerEstrada’s camp refutes Bonoan’s P7-B insertion claim anewThe Straits TimesDinner will never be Over at competitive eater Zermatt Neo’s new restaurantCapital FMFormer Kiambu governor Waititu, co-accused plead for leniency in sentencingZDF heuteEntdecken Sie das ZDF-NachrichtenstudioGhaflaRuto Breaks Ground on KSh70 Billion Cement Plant in KituiBBC NewsUK and EU officials to discuss freedom of movement
The Daily Newsstand · Free, Always
Tuesday, October 27, 2026

Как я 2,5 года никому не нужный софт вайбкодил

Translate

По моим прошлым статьям «Искусство цифрового мазохизма: как я потратил сотни часов на обложки для сериалов, которые даже не смотрю» и «Как я сделал ремастер «Том и Джерри» в 4K за два года» многим стало очевидно, что я умею находить себе самые нерациональные и специфичные занятия на пару месяцев, а то и лет.

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

Первые потуги в программировании

Началось всё в середине 2024 года, когда я проводил небольшой ремастеринг мультсериала «Чип и Дейл» и упёрся в субтитры — чтобы взять и прикрутить их к моему видео, требовалось как-то сдвинуть их временные метки, а ни один софт из десятка протестированных не поддерживал нормально необходимые мне массовые правки субтитров с DVD-дисков.

Недолго думая, я решил испытать кодерский потенциал передового на тот момент ChatGPT 3.5 — мы с ним провели очень простой реверс-инжиниринг и в итоге создали VobSub Index File Fast Editor. В тот момент я понял, что ИИ можно использовать в моём ремесле, даже если я не понимаю ни капли того кода, что он пишет.

Начало BlinkTable (Improve-ImgSLI)

Первая версия программы

Первая версия программы

Долгое время для статей мне нужно было сравнивать картинки с разделением посередине, и использовал я сайт imgsli.com (ныне почивший), но этого не всегда хватало: для самой наглядной демонстрации нужно было вырезать маленькие фрагменты и увеличивать их в несколько раз с указанием позиции. А это около 3–5 минут работы в Фотошопе на одно сравнение, и за пару месяцев я дико устал этим заниматься, а с выходом Claude 3.5 Sonnet всё же решился создать свой инструмент. Заголовки о новом ИИ были потрясающими:

Буквально в тот же день, как он стал доступен, я поставил ему новую задачку:

Меня в целом результат убедил — картинки сравнивает, линия разделения есть, двойная лупа есть. Но это как-то далеко от того, что я вам показал на превью статьи. Так что же меня сподвигло развивать проект?

Версия v1.0 (23.10.2024)

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

Статистика за 2 года

Статистика за 2 года

1. Эпоха копипасты из браузерных чатов и примитивного ИИ

Первым делом решил, что «ну неудобно это: перетащил курсором область увеличения, и сами лупы уехали за ней, и нужно на клавиши их возвращать. Надо сделать „заморозку луп“», а это, напомню, 2024 год. Нейросети ведут себя порой глупее джуна, который 2 месяца проучился на веб-разработчика.

Зарисовка:

  • Я: Кнопку нужно сделать так: нажал, и увеличительные лупы остановились, пока не отожмёшь.

  • Gemini 1.5 Pro: Готово. Когда нажата кнопка — увеличительные лупы стоят на месте!

Итог: нажимаешь заморозку, передвигаешь кольцо — картинка меняется и никуда не уезжает… Отжимаешь, чтобы всё же начать перемещать их с новой позиции, и бах — они телепортировались на то же расстояние, на которое сместилось кольцо. В одно действие вся польза от кнопки испарилась =_=

В общем, поистязав себя борьбой с «правками обратной связи» ещё часов этак 2–3, я пришёл к промпт-инжинирингу уровня общения с ребёнком.

Полный оригинальный промпт

Есть завод, который парит над чёрной дырой. К нему падают сверху стройматериалы — в начало сборочного конвейера. Если заводу нужны эти стройматериалы, то он выдвигает конвейер, и стройматериалы уже не бесследно пропадают в чёрную дыру, а попадают на его конвейер… Если же он задвигает конвейер обратно, то стройматериалы исчезают навсегда. То есть если случится ситуация «ой, а нам не хватило» и он выдвинет его обратно, а новых поставок нет, то он никоим образом не сможет достать стройматериалы обратно из чёрной дыры…

Версия v2.6.3 (12.04.2025)

И вот так у меня всё продвигалось первые полгода, плюс уже в первый месяц я упёрся в ужасные лимиты окон — 8–16 тыс. токенов в чате (да и сейчас не сильно лучше), так что передовые ChatGPT и Claude быстро отпали как разумные варианты: проект уже выходил солидно больше них — 20–30 тыс.

И тут я встретил Google AI Studio с Gemini 1.5 Pro на борту — окно в миллион токенов в веб-чате, и это не просто «очень много» для чата: даже по API это в 5+ раз больше, чем у любых аналогов 2024 года. Но был нюанс — интерфейс почему-то отказывался принимать Python-скрипты как легитимный ввод, и для обхода этого ограничения я придумал трюк — скрипт, который собирает все файлы проекта в один большой текстовый файл с разметкой и удаляет все комментарии в коде.

Версия v3.1.9 (17.04.2025)

Результаты на конец этапа:

  1. Перешёл от жёсткой привязки к одному размеру окна (600 пикс. по высоте) к произвольному + узнал, чем отличаются абсолютные координаты от относительных.

  2. Улучшена лупа — теперь её можно замораживать.

  3. Добавил перенос файлов в окно курсором; список изображений; подписи к изображениям; окно справки и настроек; мультиязычность (английский, русский и китайский).

  4. Опубликовал аппу во Flatpak для Linux-пользователей.

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

2. Эпоха Codex и Cursor

2.1. Украденный у китайца дизайн и «Что такое гонка состояний?»

Но вот эпоха кончилась, и началась новая — Codex и Cursor. Здесь уже всё заиграло новыми красками: не я сижу и по 5–7 часов гоняю циклы проверки кода, а сам ИИ! По совету всё того же знакомого несколько огромных файлов объединённой логики пошли резаться на меньшие… Правда, без особого смысла — связанность от этого не уменьшалась, я просто понтовался перед ним, что у меня больше файлов в дереве.
Тем временем с публикацией аппы ко мне пришёл народ Линукса ставить звёзды в репозиторий, и даже кто-то выпустил короткий мини-обзор на LinuxLinks.

И я прям сильно удивился, а затем у моей проги появился первый форк (ответвление) от какого-то китайца. Я, недолго думая, скачал его и обомлел: вот, сравните мой дизайн и ЕГО

Китайца

Китайца

Мой

Мой

Ключевая вещь в том, что автор форка вместо дефолтного скина Qt использовал крутой, в стиле Windows 11, — PyQt-Fluent-Widgets. Китайца я упомянул в контрибуторах.

Конечно, я отправил свой ChatGPT срочно копировать ко мне понравившиеся части форка.

Версия v4.8.9 (05.06.2025)

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

Было

Было

Стало

Стало

Версия v5.8.24 (10.07.2025)

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

Версия v6.2.1 (16.08.2025)

Но недолго шли великие изменения — я захотел внедрить много мелких, но полезных:

  • Настройки шрифта — теперь можно поставить абсолютно любой, а не только встроенный.

  • Диалог настроек вновь стал ещё полезнее, а иконки и прочий интерфейс я перекрасил.

  • Чтобы повысить производительность, добавился кэш «монитора» картинки, то есть вместо 8K-изображения разрешение уменьшается до разрешения дисплея.

А затем я совершил роковую ошибку — захотел добавить сохранение позиции и размера окна при перезапуске. Сделали раз — не сработало; два — не сработало; три…

И вот на третий день мы с ИИ всё перерыли, и итог: «гонка состояний».

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

Иллюстрация механизма

Иллюстрация механизма

Пришлось всё переделывать в течение недели на паттерн MVP по совету нейросети.

Иллюстрация паттерна MVP

Иллюстрация паттерна MVP

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

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

Итоговый вид программы на время обновления

Итоговый вид программы на время обновления

Версия v7.9.0 (27.10.2025)

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

Однако больше всего мне понравилось укомпакчивание интерфейса управления сравнением сверху — теперь это что-то вроде кнопок из Фотошопа или любого другого фоторедактора. Благодаря этому получилось сделать ещё больше кастомизации каждого элемента (перекрасить, изменить толщину) и компактно вместить новый функционал.

Раньше

Раньше

Сейчас

Сейчас

2.2. Бюрократизация, шейдеры и провал с миграцией на Rust

Версия v8.2.0 (05.04.2026)

Это обновление довольно сильно затянулось, аж на полгода — я решил всё перекопать, до чего дотянулись руки.

Сперва задумал вундервафлю — сделать функцию записи видео сравнения, но не простую, а чтобы снимало в оригинальном разрешении, хоть там картинка 4K, хоть 8K. И ещё чтобы его можно было обрезать прямо в моей аппе. Вполне резонно было бы ответить мне «а много ты хочешь», но Gemini поступил иначе — мне рассказал о новой технологии магов-программистов под названием Redux.

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

Наступило начало 2026 года, и на слуху поднялся Claude Code. На тот момент он был только в виде терминала, но я сразу принялся испытывать новую технологию. Там же я дотянулся до Claude Opus, и он оказался в разы умнее, просто мегамозг — он обнаружил... что всё рисует не ГПУ, а ЦПУ….....................

Мда, отрисовку мы оперативно перенесли на видеокарту. (не спрашиваете меня, почему я такой овощ в разработке)

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

Версия v9.0.0 (30.05.2026)

Прошёл ещё месяц, и тут же всплыла проблема от всех прошлых правок — система слишком сложная, то там, то тут ошибки, случайные падения… Уходило очень много времени на постоянные фиксы, и вот спустя год с начала работы я наконец добавил первые тесты, и жить стало немного проще.

Перейдём же к июню 2026 года — вспомним главную новость прошлого месяца: «Разработчик Bun за какие-то 11 дней перенёс свой большущий проект с экзотического Zig аж на Rust силами агентов Claude».

Я, конечно, моментально захотел себе так же, ведь буквально днём ранее напоролся на какую-то непобедимую ошибку, из-за которой всё в кадре мерцало. Без задней мысли отправил я своего Опуса этим заниматься. Через пару дней и одно полное выедание подписки на 20 $ ничего путного вообще не вышло: ИИ зачем-то объединил разные вкладки в одну, не мог правильно расположить кнопки и т. д.

Погуглил я новость в развёрнутом виде, и оказалось, что для такой переработки нужна какая-то там дисциплина, умение всё это настраивать, да и агентов там не 2, а 64, ну и, короче, вообще не по адресу обратились — я вот тесты додумался добавить спустя год.

Цитата от разработчика Bun

Цитата от разработчика Bun

Так что я вернулся к изначальной позиции — в пару строк исправил «непобедимый» баг, но вместе с тем решил: «Раз не удалось перейти на Rust, а бороться с OpenGL всё ещё надоедает, то от него надо избавиться».

Кстати, я не первый такого мнения:

Начал переписывать всё на новый универсальный API — QRhi. Поскольку задача на сей раз снова казалась машинарной, а значит, по моему недавнему опыту, с подвохом, я особых надежд не питал. Но Opus, походу, учился быть не ИИ-программистом, а ГПУ-компилятором, ведь снова осилил перенос шейдеров без каких бы то ни было трудностей.

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

2.3. Переосмысление проекта в платформу

Версия v10.0.1 (20.06.2026)

Учитывая накопленный фундамент, я решился на пятилетку за один месяц. Вот мне показалось, что одного варианта сравнения мало — тут ведь всего 2 картинки можно сравнить одновременно. Представляю вам «мультисравнение»:

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

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

По пути ещё раскопал старый подводный камень — переход на ГПУ-отрисовку хоть и ускорял её, но имел одно весомое ограничение.

Сейчас максимальное разрешение, которое может отобразить видеокарта, — это ~16–32K, и то не на всех API, а у меня бывают картинки и побольше. Чтобы это обойти, потребовалось создать систему примитивных LOD'ов: процессор нарезает большие картинки на куски поменьше в виде сетки на несколько уровней, а ГПУ их позиционирует так, чтобы не были заметны стыки на экране и переключения уровней при зуме.

Примерная иллюстрация

Примерная иллюстрация

Правда, почему-то процесс внедрения шёл невероятно долго, недели 2: сегодня исправил, что во время зума дырка появилась, а завтра новая ошибка — сетка не стыкуется и разъезжается.

Пример ошибки

Пример ошибки

Итоговый вид программы на момент релиза 10-й версии:

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

Не буду долго томить — все эти переходы движка (то с ЦПУ на ГПУ, то с одного API на другой), добавление LOD'ов и прочие телодвижения привели меня к вопросу «а как это сейчас в целом работает?». И не зря — оказалось, что внутри-то накопилось около 20 временных копий картинки, каждая из которых считала себя оригиналом, и было чудом, что система вообще работает (дальше должно было быть скучное объяснение со схемами, но я его вырезал).
В общем, опять 100500+ часов ушло на исправления. И теперь казалось, что можно уже выдохнуть и публиковать релиз…

И что могло произойти дальше? DeepSeek, прямо во время финального «прихорашивания апдейта», сделал тест, который умел ФИЗИЧЕСКИ УДАЛЯТЬ ПАПКИ. Это, ну, просто фантастика. Невероятная задумка.

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

Вот в чём заключалась его задумка: в средах ИИ-программирования есть записи сессий со всеми командами, чтениями и сообщениями, а порой даже копиями файлов. И вот у меня осталась копия проекта за прошлый месяц. А DeepSeek сложил 2 + 2 без каких-либо подсказок и решил придумать скрипт, который проиграет поверх неё все изменения из двух сред — Claude и OpenCode.

Конечно, никакие логи на такое не рассчитаны — их максимальное предназначение в том, чтобы вы зашли и посмотрели свою историю чатов в удобном интерфейсе. Так что я в этот бред не верил. Но, потратив порядка 5–7 часов, он осилил: написал огромные скрипты, и правильно встали на место почти все изменения — 1289 (97,5%) отдельных, самых разнообразных действий, от чтения файлов до git-команд, удаления, создания и массовых правок файлов.

Отчёт от DeepSeek

Отчёт от DeepSeek

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

3. Новая эпоха оркестров OpenCode

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

КАЗАЛОСЬ БЫ, всё просто на словах — дал команду, а они там как-то сами бегают.

На самом деле: все в отчётах врут, могут одновременно менять одни и те же файлы, заниматься не своими обязанностями, никто не помнит, почему и как что работает, а когда оркестраторов ещё и несколько… Если не растягивать, потребовалось разработать целый отдельный сложный стенд и на протяжении 2 месяцев его допиливать.

3.1. Редизайн, новый ИИ-функционал и ребрендинг

Версия v11.0.0 (запланировано на 28.10.2026)

Начнём с малого — снова редизайн интерфейса сравнения 2 изображений. В прошлый раз, в версии 7.9.0, мы сделали небольшое удобство в панели инструментов:

Было

Было

Стало

Стало

Но совершенно забыли об оставшейся части экрана:

Я посчитал, и вот все эти области ограничивают по высоте основную сцену на ~49%*. Вдумайтесь — картинка могла бы быть вполовину больше!
*На минимальном размере окна

Естественно, я занялся размышлениями, как это всё по-умному спрятать, но идею мне частично подсказал Qwen 3.8. Вот его генерация на тему:

То есть главная задумка — сделать панели выдвижными, но поверх кадра, а не внутри него. Я же пошёл ещё дальше и додумал концепт до панелей Apple Glass, и вышло вот так:

Изменение небольшое, но приятное. Теперь же двинемся к главному — ИИ-функционалу.
На всё про всё ушло полмесяца с лишним американских горок, и, выстрадав очередные медные трубы, я завершил работу.

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

Также можно просматривать сами изображения.

3.2. Ребрендинг

Спустя несколько лет под старым именем «Improve-ImgSLI» мне пришлось его сменить по нескольким причинам:

  1. Программа уже не только о сравнении картинок бок о бок — название сильно вводит в заблуждение

  2. Мне может прилететь по шапке, если автор сайта imgsli.com когда-нибудь захочет это сделать

После 2 дней изучения вариантов и выдумывания всякого я пришёл к BlinkTable. Особого смысла тут не ищите — просто в этой сфере работы с картинками почти все словосочетания заняты, и из оставшегося это звучит и выглядит лучше всего.

Итоги

Для софта с абсолютно молчаливой аудиторией в пару тысяч человек, только из интереса, за пару лет сделан мини-медиакомбайн: своя библиотека интерфейса, промышленная система отображения изображений, встроенный видеоредактор, ИИ-галерея, сайт и MCP-сервер. Ну и 660 тыс. строк кода с учётом тестов.

Было интересно, но буду ли я его продолжать — вопрос открытый.

View the original on Хабр →

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.