Гонки по городу вживую
Вводишь название города — и едешь по его настоящим улицам, собранным на лету из OpenStreetMap и тайлов рельефа. С трафиком, погодой и сменой дня и ночи, без единого запроса к серверу.
- TypeScript
- Three.js
- OpenStreetMap
Привет, меня зовут Костя Рядов. Я разработчик, и SDLC — это моя жизнь: от инструментов для JVM, которыми я занимался годами, до ИИ-агентов, которые делаю сейчас.
Микросервисы появились не ради разных языков, а ради масштабирования организаций. Polyglot Architecture стала следствием, а не причиной.
Вводишь название города — и едешь по его настоящим улицам, собранным на лету из OpenStreetMap и тайлов рельефа. С трафиком, погодой и сменой дня и ночи, без единого запроса к серверу.
Считает, во что на самом деле обходится селф-хостинг Kimi, GLM, DeepSeek, Qwen или MiniMax: от числа ускорителей и схемы параллелизма до стоек, питания, людей и цены за миллион токенов. Каждая отвергнутая конфигурация объясняется с точностью до размера промаха.
Фракталы на GPU в WebGL с палитрами хохломской и гжельской росписи. Масштаб, панорама, поворот и глубина итераций — всё считает видеокарта.
Генеративные скетчи, которые работают прямо в браузере: рекурсивные фракталы на p5.js на восьми глубинах, контрольный лист из четырнадцати рукописных SVG-спиралей и индикатор загрузки по одному пути.
Превращает ссылку на YouTube или локальный файл в структурированный ODT, DOCX или PDF: речь распознаётся, слайды вырезаются из кадра, а связный текст собирает языковая модель.
Лабиринт от первого лица на Java 21 и JavaFX 3D. Каждый уровень — свежесгенерированный лабиринт; дошёл до анимированного выхода, следующий стал больше.
Учебник для тех, кто продаёт, покупает и оценивает ИИ-проекты, не будучи ИИ-инженером. Написан, чтобы развести четыре слова, о которые спотыкается почти любой разговор об ИИ-стратегии: ассистент, RAG, text2SQL, агент.
Конечный автомат на LangGraph ищет публичные профили, останавливается и спрашивает, кто из кандидатов нужен, и собирает карточку со ссылками на источники. Только открытые данные.
MCP-сервер на Java, через который ассистент управляет сервером приложений Payara по STDIO: статус доменов, развёрнутые приложения, конфигурация каждого из них.
Ассистент для регулируемой среды: отвечает по документации, внутренним вики, базам данных и логам компонентов — с аудит-логом, анонимизацией персональных данных и проверкой на инъекции в промпт.
Диалог устроен как поток LangGraph: данные собираются из нескольких источников параллельно, контекст сохраняется между репликами. Запросы и ответы проходят через защитный слой — персональные данные распознаются и обезличиваются до того, как попадут в модель, а промпты проверяются на попытки инъекции. Доступ аутентифицирован, частота запросов ограничена по пользователю, каждый обмен пишется в аудит-лог. То, на что ассистент не может ответить уверенно, эскалируется, а не додумывается.
Следит за работающими JVM-приложениями на предмет публично известных уязвимостей и подсказывает команде, что с ними делать.
Java-агент, подключённый к работающему процессу, сообщает, что JVM загрузила на самом деле, а не что заявлено в сборочном файле. Сервис сверяет этот инвентарь с открытыми базами уязвимостей и уведомляет команду-владельца, ранжируя находки по важности и прилагая варианты устранения. Узлы заводит администратор, состояние видно через JMX и интерфейс сервиса. К каждой находке приложено основание: видно, какой именно загруженный артефакт дал совпадение, ещё до решения что-то менять. Смысл — в зазоре, который он закрывает: манифест зависимостей и живой процесс расходятся, а эксплуатируется только второй.
Приложение на Flask для полного остеопатического осмотра по пяти моделям ВОЗ, с интерфейсом на восьми языках. Языковая модель собирает из находок клиническое резюме, рабочий диагноз и приоритизированный план лечения.
Разговоры с людьми из ИТ о том, чем они на самом деле занимаются: архитекторы, аналитики, SRE, тестировщики, дизайнеры, основатели. Три сезона, 45 выпусков, здесь — указатель по темам; есть аудио и видео.
Под это сочетание ничего не подходит.
Более ранний подход к той же задаче, что и агент поиска людей: FastAPI, DuckDuckGo, цикл подтверждения кандидата и отчёт от языковой модели — граф выписан процедурно, без LangGraph.
Обходит сайт в пределах одного домена и выгружает найденное одним PDF, DOCX или ODT. Нарочно лёгкий: без headless-браузера, читаемый текст вытаскивается простыми эвристиками.
Десктопный редактор прозы на Flutter, где рукопись разложена на книгу, части, главы и сцены. Помощь приходит от того провайдера, на который его направишь: локальная Ollama или OpenAI, Gemini, Perplexity, OpenRouter.
Превращает PDF в аудиокнигу: языковая модель приводит извлечённый текст в пригодный для прослушивания вид, а видеокарта озвучивает результат.
Локально расшифровывает аудио и видео с разделением по говорящим и справляется с записями, где русский и английский чередуются посреди фразы. Ничего не уходит с машины.
Берёт расшифровку с разметкой по говорящим, переводит её, размечает SSML и синтезирует новый MP3 — тот же эпизод на другом языке, с отдельным голосом на каждого участника.
Поиск по документам с по-настоящему изолированными рабочими пространствами, построенный на PostgreSQL и pgvector вместо отдельного векторного хранилища.
Минимальный референсный сервер для Vanna v2: FastAPI, встроенный чат и один и тот же диалог через SSE, поллинг или WebSocket, поверх четырёх провайдеров моделей.
Ассистент-интервьюер, который проводит компанию из финансового сектора через discovery по внедрению ИИ. Нарочно маленький стек на AWS: одна Lambda, Bedrock, DynamoDB.
MCP-сервер, который собирает сигналы о том, какие технологии набирают вес — Reddit, Google Trends, GitHub Trending, Stack Overflow — и сводит их в отчёты в HTML, PDF или Excel.
Потребитель того же сервера трендов: бот на aiogram запускает анализ по расписанию и публикует результат в канал.
Батники, которые поднимают vLLM на Windows без обычного полудня возни, с отдельным запускателем на каждую модель.
CLI без единой зависимости, показывающий, сколько раз артиста шазамили, с разбивкой по трекам. Такого API у Shazam нет — утилита обходит каталог iTunes и снимает счётчики с публичных страниц песен.
Мультиагентный аналитический ассистент, отвечающий на бизнес-вопросы, собирая данные из баз, документов и REST-сервисов сразу. Планировщик выбирает маршрут, специализированные агенты добывают данные, критик проверяет ответ перед выдачей.
Оркестратор нарочно не хранит состояние: на каждом шаге он загружает и сохраняет его снаружи, поэтому диалог можно продолжить или передать другому воркеру. Инструменты обнаруживаются, а не прописываются заранее, и у каждого своё ограничение по частоте. Вопрос раскладывается на подвопросы, которые считаются параллельно там, где не зависят друг от друга, — за счёт этого ответ по нескольким источникам укладывается в приемлемое время. Агент-критик появился потому, что в аналитике опасен не сбой, а уверенно названное неверное число. Если критик не может подтвердить цифру найденными данными, ассистент прямо об этом говорит, а не сглаживает.
Вопросы на естественном языке превращаются в SQL к PostgreSQL — из CLI, веб-интерфейса или Slack. Обучающий конвейер поглощает схему, разобранные примеры и текстовую документацию.
Обучающие данные здесь — полноценный артефакт, а не промпт: определения схемы, пары «вопрос-запрос» и документация загружаются в локальное векторное хранилище и версионируются вместе с кодом. Провайдер модели заменяем — это важно, когда до базы нельзя допускать облачную модель. Сгенерированный SQL показывается до выполнения, а доступ только на чтение не даёт неудачной генерации превратиться в инцидент. Три интерфейса работают через один сервис, поэтому запрос из Slack и тот же запрос из веба идут одинаковым путём. Полезным на практике оказалась не столько генерация, сколько цикл дообучения: каждый исправленный запрос возвращается в хранилище, и тот же вопрос перестаёт быть ошибочным.
Более ранний мультиагентный ассистент на AG2: работа разложена между менеджером, агентом баз данных, агентом документации, агентом кеширования и агентом безопасности, который проверяет и запросы, и ответы.
Запросы классифицируются и уходят к профильному агенту, а не обрабатываются одним универсальным; агент баз данных сам переспрашивает после неудачного запроса, а не выносит ошибку наверх. Агент кеширования сопоставляет новые вопросы с прежними по близости — это срезает и стоимость, и задержку на тех вопросах, которые люди действительно повторяют. Агент безопасности стоит с обеих сторон обмена, проверяя и то, что уходит в модель, и то, что возвращается: ответственность собрана в одном компоненте, а не размазана по остальным. Такое явное разделение ролей сделало каждую из них тестируемой отдельно — это и перешло в следующую версию. Ограничение было оборотной стороной того же решения: маршрутизация жила внутри разговоров агентов, и когда она ошибалась, смотреть было не на что.
Тот же конвертер PDF в аудиокнигу, но телеграм-ботом на много пользователей сразу: очередь на Celery и Redis, живой прогресс с оценкой времени, токены доступа и история по каждому.
Конвертация книги занимает минуты даже на видеокарте, поэтому интересна не она, а всё вокруг. Очередь должна пережить перезапуск, не потеряв задачу, которую человек ждёт уже десять минут, а прогресс — что-то говорить ждущему, а не прыгать от нуля к готово. Доступ устроен на токенах с ограниченным сроком по каждому пользователю: одна видеокарта не обслужит неограниченную аудиторию, и ограничение должно быть политикой, а не тихо растущей очередью. Админская часть показывает состояние воркеров и текущий затор — по ней и понятно, дело в файле или в машине. Сама конвертация — тот же конвейер, что и в однопользовательской утилите; почти весь код здесь — эксплуатационная оболочка вокруг него.
Голосовой ассистент, который заходит в Zoom обычным участником, слушает, не назвали ли его по имени, и отвечает по обсуждаемой книге — голосом и в чат, с цитатой того места, на которое опирается.
Книга заранее разбивается на отрывки и индексируется для полнотекстового поиска, поэтому ответ ссылается на конкретное место, а не пересказывает целое. Речь распознаётся локально, ответ произносится системным голосом, а в саму встречу ассистент заходит через веб-клиент Zoom под управлением браузерной автоматизации — на стороне встречи ничего ставить не нужно. Распознавание идёт непрерывно, но вмешивается ассистент только услышав своё имя: книжный клуб — это разговор людей, и ассистент, отвечающий без спроса, его портит. Настоящее ограничение — задержка: ответ, пришедший когда обсуждение ушло дальше, хуже, чем отсутствие ответа, поэтому поиск локальный, а индекс собран заранее. Цитата источника оказалась важнее самого ответа — она позволяет группе спорить с книгой, а не с ассистентом.
Навык для кодинг-агентов: берёт таблицу участников семинара и дополняет её тем, что публично известно о компаниях, где они работают, возвращая проверенный отчёт, где у каждого утверждения указан источник.
Работа разбита на независимые единицы, чтобы агент мог раздать их параллельно и проверить каждый результат отдельно. У каждого свидетельства указан источник, а источники размечены по степени открытости — потребитель отчёта может отбросить тот уровень, на который не хочет опираться. На выходе не свободный текст, а документ, проверенный по схеме: именно это позволяет подать его на вход чему-то ещё, а не заставлять человека читать и перенабирать. То, что источники не подтверждают, остаётся пустым, а не додумывается: пустая ячейка — это информация, выдуманная — это риск. Сделано не приложением, а навыком для агента: набор инструкций и схем, который кодинг-агент исполняет там, где он уже запущен.
По идентификатору CVE выясняет, какие именно классы Java уязвимы: читает бюллетень, связанные коммиты и все доступные ссылки и возвращает полные имена классов с указанием источников.
Запись CVE называет библиотеку и диапазон версий, но почти никогда — конкретные классы, а именно это нужно, чтобы понять, задет ли твой код. Агент тянет данные из баз бюллетеней и хостингов исходников, сопоставляет описания с именами классов и отдаёт структурированный результат, а не прозу. Если к записи привязан коммит с исправлением, изменённые в нём классы — самый надёжный доступный сигнал, поэтому изменения коммита читаются прежде текстового описания. Работает и без ключей к поисковым API, переключаясь на более простой путь получения данных. У каждого названного класса указана ссылка, из которой он взят: список имён классов без источника — не то, по чему стоит действовать.
Второе поколение той же идеи, переписанное на LangGraph: тот же вопрос об уязвимых классах Java, но через явный граф, со сменными провайдерами моделей и поисковыми бэкендами.
Переписывание агента в явный граф сделало видимыми повторные попытки и запасные пути, прежде размазанные по потоку управления. Он обрабатывает репозитории и коммиты, на которые ссылается запись CVE, вытаскивает что может из нерепозиторных ссылок и отдаёт JSON. Провайдер модели и поисковый бэкенд заменяемы — за счёт этого один и тот же граф работает и с облачной моделью, и с локальной, без правок логики. При отказе узла он спускается к более слабому источнику, а не прерывается: частичный ответ с указанными источниками лучше, чем никакого. Вместе с предшественником и сервисом уязвимостей JVM это третий подход к одной и той же задаче, каждый раз дальше от ручной работы.
Матрица сборок контейнеров Tomcat на Azul Zulu: три поколения Tomcat и JDK на пяти базовых дистрибутивах, всё генерируется из одного конфигурационного файла.
Разобранный пример системы модулей Java в двух частях: сначала зависимые модули, затем модуль, который нарочно тянет компоненты с известными уязвимостями, упакованный через jlink.
Приложение для Android на Expo. Его политика конфиденциальности и условия использования до сих пор лежат в этом репозитории и раздаются с него.
Само приложение закрыто, но два его артефакта остаются публичными и должны оставаться доступными: политика конфиденциальности и условия использования, на которые ссылаются снаружи. Из-за них эти два файла исключены из любой уборки — и из-за них же эта запись вообще существует, а не выброшена. Expo был выбран, чтобы получить одну кодовую базу под Android без нативного тулчейна: на тот момент размен верный, и именно поэтому проект вышел. Осталась от него наименее интересная часть работы — и единственная, которая обязана продолжать работать. Он в списке потому, что портфолио, тихо опускающее то, что закончилось, честным не является.
Год практики по машинному обучению, который с первого дня ведётся открыто: от векторизации в NumPy до обучения на видеокарте. Репозиторий и есть портфолио.
Пронумерованный проход по работе с языковыми моделями, где один и тот же материал разобран на Python, Java и Node — чтобы читатель шёл на своём языке.
Артефакт первого эпизода живого кодинга: погодная утилита без сторонних зависимостей, с вшитыми историческими средними и живым источником по флагу.
Артефакт второго эпизода: поиск курса валют, собранный как React-фронтенд поверх сервиса на TypeScript, за один присест.
Двуязычное учебное приложение по пяти остеопатическим моделям: каждая объясняется, затем проверяется тестом, следующая не открывается до восьмидесяти процентов, а режим повторения возвращает ошибки, пока они не кончатся.