Обновить

Бэкенд

Сначала показывать
Порог рейтинга

Дайджест: новости за сентябрь и октябрь 2026

Рассказываем, какие изменения произошли на платформах Cloud.ru за последние два месяца, и чем это может быть полезно.

🧠 AI Factory
Evolution Distributed Train — обновили образы Jupyter Server: новый интерфейс, две темы оформления, совместная работа с GPU. В регионе SR005 добавили временное хранилище.

Playground — теперь есть возможность запуска ML и ИИ-приложений с GPU без развертывания инфраструктуры. Готовые образы, init-скрипты, подключение S3/NFS, автовыключение по нагрузке.

Мониторинг — появились метрики DCGM: энергопотребление, активность графических движков, температура GPU, активность памяти.

☁️ Cloud.ru Evolution
Evolution Workflow Studio — представили облачный инструмент для выпуска приложений разработчиками и ИИ-агентами. Автоматизирует сборку и развертывание в управляемых процессах.

Evolution Repo — добавили новую фичу RepoWiki для автоматического анализа кода и формирования документации. Хорошо работает даже с обширной кодовой базой, поддерживает инкрементные обновления: при изменении кода документация обновляется, а не переписывается заново.

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

Evolution Managed DocumentDB — вывели на стадию публичного тестирования управляемую документную NoSQL-базу с репликацией и шардированием. Пока можно подключить и пользоваться бесплатно. Дает возможность заниматься разработкой, а не администрированием кластера, ручным масштабированием и настройкой бэкапов.

Evolution Artifact Registry — новая версия API, выпустили кеширующие реестры в коммерческий доступ: теперь можно пользоваться сервисом как складом быстрого доступа для программных пакетов из зарубежных репозиториев. Это очень удобно для команд: один скачал — все пользуются, сборки не падают. Уже доступны Docker-образы, Helm-чарты, deb-пакеты, RPM-пакеты, PyPI-пакеты, NPM-реестры пока на стадии публичного тестирования.

Evolution Managed Kubernetes — добавили поддержку Agent Sandbox 1.0.1/1.0.4 и аннотации для Magic Router.

Evolution Compute — cloud-init для всех образов, дашборд производительности дисков.

📈 Evolution Data Platform
Evolution Managed Airflow — добавили выбор источника DAG-файлов: Object Storage или Git. Упрощает интеграцию с пайплайнами, обновление инстансов через личный кабинет без простоя.

Evolution Managed BI — появилась роль bi.viewer для управления доступом в Superset. Безопасный просмотр дашбордов для аналитиков.

Evolution Managed Flink — теперь есть роль flink.viewer для контроля доступа к задачам потоковой обработки.

Evolution Managed Trino — интегрировали консоль WebSQL 0.4.0 для SQL-запросов в браузере. Теперь быстрая аналитика возможна без установки клиентов.

Evolution Managed ClickHouse — подключили мультизональность для отказоустойчивости и выделенный режим хостов.

🏢 Cloud.ru Advanced
Advanced Relational Database Service — теперь поддерживается PostgreSQL 18.

Advanced Cloud Container Engine — добавили поддержку Kubernetes 1.36, Full-Port Forwarding, резервные копии кластера.

🖥 Облако VMware
VMware Cloud Director — сделали MCP Server и выложили код на GitHub, чтобы можно было управлять виртуальными машинами текстом. Подробно про это писали здесь.

Резервное копирование ВМ — теперь можно хранить в Object Storage.

В личном кабинете появилась функция контроля затрат через Гига-помощник. Он покажет баланс, статус автосписания, остаток грантов. 

Маркетплейс
Добавили: MySQL, Elasticsearch, MongoDB, PostgreSQL. Запуск в несколько кликов.

📽️ Вебинары и обучение
Делимся записями прошедших встреч:

💼 Свежие кейсы ждут вас на следующей неделе.

До связи и хороших выходных! ✌️

Теги:
+2
Комментарии0

Достучаться до Композитора - Мой опыт борьбы с CVE-2026-109618 и CVE-2026-109619.

Посвященные знали заранее, а обычные админы и проггеры узнали вчера - все версии php критично уязвимы. Атаке может быть подвержен любой сервер, принимающий файлы по сети через "multipart/form-data". При этом не имеет значения, пользуетесь ли вы функционалом или нет в своих формах, при удачной атаке на сервере можно выполнить любой внедренный код.

Новые релизы были выпущены вчера 21.10.26 для версий php8.2-8.5 и для них никаких сложностей обновления не присутствует. У нас из 6 сайтов только один был на 8.4, остальные 8.0, 8.1 и 7.4. То есть надо было сначала установить новую версию php, исправить несовместимые фрагменты кода и обновить php через рекомендованный репо до версий, устраняющий уязвимость. А здесь уже возникают сложности. И одна из них, самая неожиданная, заключалась в том, что composer, точнее его репозитарий и серверы с кодовой базой оказались недоступны с территории нашей страны.

Обычный composer update отваливался по таймауту. Иммитация запросов к репо через curl показывала, что блокировка идет на "нашей" стороне во время TLS рукопожатий. Спасибо тем, кто следит за нашей безопасностью. При попытке использовать прокси соединение прерывал уже сервер репозитория repo.packagist.org, которому что-то не нравилось. Обложили с двух сторон.

В режиме полного логирования curl -vvvv удалось понять, что доступ к repo.packagist.org идет через cdn и адреса постоянно меняются. Из 20 запросов один все таки проходил. Тогда я написал (при помощи клода в том числе) небольшой скрипт, который сканирует разные адреса репо и выдает по ним отчет.

#!/bin/bash
HOSTS="repo.packagist.org packagist.org api.github.com codeload.github.com github.com objects.githubusercontent.com"
DNS="8.8.8.8 1.1.1.1 9.9.9.9 77.88.8.8 208.67.222.222"

for h in $HOSTS; do
  ips=$(for d in $DNS; do dig +short +time=2 +tries=1 A "$h" @"$d" 2>/dev/null; done \
        | grep -E '^[0-9.]+$' | sort -u)
  [ -z "$ips" ] && ips=$(getent ahostsv4 "$h" | awk '{print $1}' | sort -u)
  echo "== $h"
  for ip in $ips; do
    r=$(curl -s -o /dev/null -w '%{http_code} %{time_total}s' \
        --connect-timeout 5 -m 10 --resolve "$h:443:$ip" "https://$h/")
    echo "  $ip  ${r:-FAIL}"
  done
done

Далее нужные ip добавил в hosts и композитор ответил!

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

Важные ссылки:

Теги:
+4
Комментарии0
Биржа заказов Инфостарта с 14 по 21 октября 2026 года
Биржа заказов Инфостарта с 14 по 21 октября 2026 года

На Бирже Инфостарта с 14 по 21 октября появились задачи по отчетности, настройке 1С и переносу данных:

На Бирже Инфостарта можно откликнуться на заказ или разместить свою задачу.

Теги:
+4
Комментарии0

Приглашаем на Ozon Tech Platform Meetup

30 октября встречаемся в Москве, в лофте Casa Picassa на короткие доклады и глубокие технологические дискуссии. 

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

Регистрируйтесь на странице события и присоединяйтесь

Темы выступлений:

  • Под капотом Ozon: как устроена технологическая платформа.
    Михаил Кабищев, руководитель департамента разработки PaaS, о задачах Платформы сегодня, о стандартах разработки, CI/CD, сетевой инфраструктуре, мониторинге и инфраструктурных сервисах.

  • Как мы оптимизировали более 4 000 сервисов на Go перед сезоном распродаж.
    Денис Крупецкий, руководитель группы разработки Go-платформы, о том, как мы освободили 7000+ CPU в масштабе более 4 000 микросервисов на Go.

  • Олимп: как устроен портал платформы данных в Ozon?
    Артемий Сероокий, руководитель платформы управления и визуализации данных, о том, как мы организовали взаимодействие с множеством сервисов и построили удобный интерфейс, который можно развивать независимо от изменений бэкенда.

Митап проведёт Марина Самойлова, руководитель направления платформы данных.

До встречи!

Теги:
0
Комментарии0

ИИ-поезд мчится дальше. И, кажется, мы начинаем иначе смотреть на сам процесс разработки.

Доверие к генерируемому коду растёт. И вместе с ним на первый план постепенно выходит намерение, а не сам код.
На этот пост меня натолкнула недавняя статья инженеров Anthropic. За четыре месяца количество изменений, вливаемых в основную ветку, выросло с 2 500 до 30 000 в день. Им даже пришлось переизобрести Git. Но особенно меня зацепила другая мысль: теперь на ревью они оценивают прежде всего смысл изменений, а не каждую строчку кода.

И я поймал себя на том же.

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

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

Конечно, это не отменяет тестирования, ревью и личной ответственности. Доверяй, но проверяй, как говорится. Хотя проверка ИИ-кода - это вообще отдельный мир, о котором мы ещё поговорим.

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

Теги:
0
Комментарии1

ИИ уже пишет код. А вы успеваете за изменениями в IT?

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

Как разобраться в новых технологиях, выбрать то, что действительно пригодится в работе, и не тратить время на бесконечные эксперименты?

Приглашаем на бесплатные уроки, которые пройдут с 19 по 22 октября. Разберём реальные задачи, инструменты и подходы вместе с практикующими экспертами — преподавателями курсов. Выбирайте свою тему и присоединяйтесь:

Искусственный интеллект и автоматизация

  • 19 октября, 19:00. «CIO в эпоху ИИ». Записаться

  • 19 октября, 20:00. «ИИ‑агенты в реальной разработке: что умеют делать вместо вас». Записаться

  • 20 октября, 20:00. «Tool Calling и MCP: интеграция ИИ‑агентов с корпоративными системами». Записаться

  • 21 октября, 20:00. «Как посчитать ценность ИИ: метрики и ROI, которые нужны менеджеру». Записаться

  • 22 октября, 20:00. «От промта к автоматизации: как встроить LLM в рабочий процесс». Записаться

  • 22 октября, 20:00. «ИИ или ИТ‑специалисты: как оценить реальную стоимость автоматизации». Записаться

Разработка и архитектура

  • 20 октября, 20:00. «Магия чисел в C++: как заставить компилятор считать за нас». Записаться

  • 21 октября, 20:00. «Apache Kafka: быстрый старт для разработчиков и инженеров». Записаться

  • 21 октября, 20:00. «Написание тестов для Андроид в эпоху ИИ». Записаться

  • 22 октября, 19:00. «Основы проектирования бизнес‑логики в микросервисной архитектуре». Записаться

  • 22 октября, 20:00. «Spring Boot под нагрузкой: почему сервис работает локально и падает в production». Записаться

Инфраструктура и информационная безопасность

  • 19 октября, 20:00. «ИБ‑законодательство: ключевые изменения лета‑осени 2026». Записаться

  • 20 октября, 19:00. «Балансировка HTTP и L4 сервисов в Angie». Записаться

  • 20 октября, 20:00. «OpenTelemetry в.NET: от чёрного ящика к наблюдаемой системе». Записаться

  • 21 октября, 20:00. «Пентест инфраструктуры: поиск слепых зон IDS/IPS». Записаться

  • 21 октября, 20:00. «Автоматизация цифровых рабочих мест». Записаться

Аналитика, SQL и работа с данными

  • 19 октября, 20:00. «Анализируем длинные и сложные запросы в SQL Server». Записаться

  • 20 октября, 20:00. «Топ-5 SQL инструментов, которые используют аналитики каждый день». Записаться

  • 20 октября, 20:00. «Метрики качества данных и стратегия внедрения». Записаться

  • 22 октября, 20:00. «Оптимизация запросов 1С». Записаться

Управление командами, проектами и продуктами

  • 19 октября, 20:00. «Как наладить процессы без вложений: никаких бюджетов, систем и выделенных команд». Записаться

  • 19 октября, 20:00. «Как понять, что вы уже выполняете роль COO — даже если должность называется иначе». Записаться

  • 20 октября, 19:00. «Стабильность команды и взаимозаменяемость людей». Записаться

  • 21 октября, 20:00. «Анатомия сопротивления: превращаем токсичных стейкхолдеров в союзников проекта». Записаться

  • 22 октября, 20:00. «Управление изменениями требований». Записаться

  • 22 октября, 20:00. «Любовь с первого касания: как CJM помогает строить отношения с клиентом». Записаться

Embedded‑разработка

  • 21 октября, 20:00. «Беспроводные STM32. Разрабатываем плату для микроконтроллеров с радиоинтерфейсом». Записаться

Не нашли подходящий урок или хотите заранее спланировать обучение? Загляните в календарь всех вебинаров.

Теги:
+1
Комментарии0

10 шпаргалок по типам данных в ClickHouse

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

Весь набор можно скачать по ссылке.

Что внутри:

  1. Целые числа. Int и UInt: диапазоны, переполнение, какой тип получится при сложении и вычитании.

  2. Дробные числа. Float и Decimal: почему 0.1 + 0.2 не равно 0.3 и в чём хранить деньги.

  3. Булевы значения. Bool: как хранится, как фильтровать и считать долю true.

  4. Строки. String и FixedString: байты против букв, функции с UTF8, поиск и конкатинация.

  5. LowCardinality. Когда словарное кодирование экономит место в десятки раз, а когда только мешает.

  6. Дата и время. Date, Date32, DateTime и DateTime64: точность, часовые пояса, разница между датами.

  7. Nullable. Как NULL ведёт себя в WHERE, count и сортировке и сколько он стоит.

  8. Массивы. Array: индексы с 1, поиск, groupArray и arrayJoin, лямбды.

  9. Кортежи. Tuple: элементы по номеру и по имени, сравнение, кортеж в колонке.

  10. Приведение типов. CAST, toInt32 и функции OrNull и OrZero.

Если нужно собрать шпаргалки по другим темам, пишите в комментариях.

Теги:
+2
Комментарии6

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

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

Лучший способ понять, как всё устроено.

💾 Ссылка: https://github.com/Bednyakov/build-your-own-x

Теги:
+5
Комментарии0

Всем привет! На досуге хочется поразрабатывать чё-нить, как хобби что ли. Идей просто ноль! Везде этот ЫЫ..политика и т.д. Надо отвлечься.
Не ради денег - ради программирования! Есть у кого смелые идеи?
Вот первое что в голову пришло - напиши, глядишь не только мне поможешь :)

Теги:
0
Комментарии5

Запись пред-ивента «Почему агенты не работают — и с чего начать» — уже на видео:

🔗 https://youtu.be/yYYH0P4gmXc

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

А где ломается у вас? Напишите в комментариях.

Эти места разбираем и лечим на курсе «AI-агенты, которые работают»: старт 21.10, занятие 1 из 7, среды 19:00–21:00 МСК.

Доступ — по подписке «Мастер»: https://boosty.to/polnyistek/purchase/3939761

Теги:
-1
Комментарии0

Бэкенд усложняется. Как за ним успевать?

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

Как расширять техническую экспертизу и увереннее справляться со сложными задачами?

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

Архитектура и взаимодействие сервисов

  • 20 октября, 19:00. «Балансировка HTTP и L4 сервисов в Angie (Angie)». Записаться

  • 21 октября, 20:00. «Apache Kafka: быстрый старт для разработчиков и инженеров». Записаться

  • 22 октября, 19:00. «Основы проектирования бизнес‑логики в микросервисной архитектуре». Записаться

  • 9 ноября, 20:00. «Монолит или микросервисы? Руководство для архитекторов, которые ценят свои нервы». Записаться

Базы данных и производительность

  • 19 октября, 20:00. «Анализируем длинные и сложные запросы в SQL Server». Записаться

  • 20 октября, 20:00. «OpenTelemetry в.NET: от чёрного ящика к наблюдаемой системе». Записаться

  • 22 октября, 20:00. «Spring Boot под нагрузкой: почему сервис работает локально и падает в production». Записаться

Java, Python и работа с API

  • 26 октября, 20:00. «Тестирование FastAPI: проверяем API с помощью pytest». Записаться

  • 28 октября, 20:00. «JDBC: как Java‑приложения взаимодействуют с базами данных». Записаться

  • 29 октября, 20:00. «Магические слова async/await». Записаться

  • 11 ноября, 20:00. «Обработка исключений в Java: как писать стабильный код». Записаться

Go и надёжность кода

  • 5 ноября, 20:00. «Тесты в Go без боли: ловим баги раньше пользователей». Записаться

  • 10 ноября, 20:00. «Использование каналов в Go на практике». Записаться

ИИ и интеграции

  • 19 октября, 20:00. «ИИ‑агенты в реальной разработке: что умеют делать вместо вас». Записаться

  • 20 октября, 20:00. «Tool Calling и MCP: интеграция ИИ‑агентов с корпоративными системами». Записаться

ЧТО ПОЧИТАТЬ ПО ТЕМЕ?

Пока ждёте открытые уроки, можно разобраться в тонкостях работы с HTTP/2, подготовиться к обновлению Java‑проектов и освежить знания C++. Собрали четыре технических материала с практическими примерами:

Теги:
+4
Комментарии1
Биржа заказов Инфостарта с 7 по 14 октября 2026 года
Биржа заказов Инфостарта с 7 по 14 октября 2026 года

На Бирже заказов Инфостарта за неделю с 7 по 14 октября появились новые задачи для разработчиков, консультантов и аналитиков 1С: от настройки обменов и обработки документов до доработки учета и интеграций с внешними системами:

На Бирже Инфостарта можно разместить задачу и выбрать специалиста или команду по откликам, рейтингам и кейсам. Комиссия — 0%, контакты и расчеты — напрямую с исполнителем. Безопасная сделка доступна по желанию.

Теги:
+6
Комментарии0

155 000 вакансий: полный анализ IT‑рынка России. Как описание вакансии влияет на зарплату

Как описание вакансии влияет на зарплату
Как описание вакансии влияет на зарплату

Каждая вакансия - это маленькое письмо от работодателя. В нём есть «дружная семья», «стрессоустойчивость», «опыт от 3 лет», ДМС, печеньки и иногда даже зарплата. Мы читаем такие письма каждый день, листаем, вздыхаем и жмём «Откликнуться». А что, если прочитать их все сразу, и тысячами…, сконвертировать стоимость каждой фразы в рубль? Сколько работодатель готов платить, если он пишет, что мы «дружная семья». Чего рынок ждёт от джуна. За что сегодня доплачивают, а что стало просто гигиеной. Где торговаться, а где бесполезно. И когда вообще лучше откликаться, чтобы тебя хотя бы заметили. Об этом у меня вышла большая статья.

Более 15 графиков, показывающих то куда двигается Российский IT-рынок и что при этом всём делать.

Так что если кто-то ещё не успел прочитать, очень рекомендую...

Теги:
+3
Комментарии0

Ближайшие события

10 ноября в Москве пройдёт Go Birthday Conf от RWB

Отметим день рождения Golang вместе с экспертами RWB, YADRO, Т-Банка, VK и Avito. Разберём кейсы из продакшена, поговорим о highload и будущем Go в эпоху AI

.
.

В программе:

➡️ Доклады:

  • 10 лет Go глазами практика: как менялся язык и что с ним сейчас;

  • SIMD без ассемблера: что изменилось и какой прирост производительности можно получить;

  • Архитектура доставки продуктовых метрик под высокой нагрузкой;

  • Геокодинг и построение маршрутов под нагрузкой.

➡️ Дискуссия «Go в эпоху AI» — обсудим, как меняется разработка, что остаётся инженеру и почему растёт роль инженерного мышления.

➡️ Воркшоп и архитектурные каты, где можно порешать задачи вместе с другими участниками.

Ждём Go-разработчиков, backend-инженеров, тимлидов и всех, кто работает с highload и архитектурой или хочет разобраться, как AI меняет разработку.

📍 Москва
Старт в 15:00

➡️ Программа и регистрация

Теги:
0
Комментарии0

От Copilot к Autopilot: как GitVerse строит первую агентную фабрику разработки

Классический CI/CD дает контроль, но тормозит инновации, а вайбкодинг дает скорость, но разрушает предсказуемость. GitVerse ищет третий путь и встраивает агентов внутрь конвейера, превращая дисциплину пайплайнов в трамплин для автономной разработки.

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

Спикер: Анатолий Шипов — управляющий директор, лидер продукта GitVerse.

Трек: Разработка

📅 Когда: 15 октября в 14:00–14:30 мск

👉 Зарегистрироваться

Теги:
0
Комментарии0

Вышел fx 40!

fx — интерактивный терминальный просмотрщик и процессор таких форматов как JSON.

В версии 40 теперь можно писать запросы прямо в интерфейсе и видеть, как результаты обновляются по мере ввода, а также использовать форматы XML, HTML, EDN и MAML на входе и команды в стиле vim.

GitHub

ChangeLog

Теги:
+2
Комментарии0

Что изменилось в task_struct между двумя ядрами? Написал diff для BTF

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

Особенно если интересует одна конкретная структура и хочется понять, поменялся ли её размер, сместилось ли поле или появилось что-то новое.

Решил написать для этого небольшую утилиту - btf-layout-diff

Что она делает?

Это CLI-инструмент на C++20, который читает raw-дампы bpftool и сравнивает layout именованных STRUCT и UNION

Смотрит на размер структуры, поля, их битовые смещения и размеры bitfield. При этом не учитывает BTF type_id: идентификаторы могут отличаться между дампами, даже если сама структура не изменилась.

Получить дамп можно так:

bpftool btf dump file /sys/kernel/btf/vmlinux format raw > kernel.raw

Снимаем его на двух Linux-хостах, переносим файлы на одну машину и запускаем:

./build/btf-layout-diff kernel-old.raw kernel-new.raw --type task_struct

Для примера в репозитории есть две тестовые фикстуры. В одной task_struct занимает 24 байта, в другой - 32. Заодно добавлено поле new_field.

Вывод получается таким:

~ STRUCT task_struct  size: 24 -> 32 bytes  + new_field at 192 bits

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

А как насчёт CO-RE?

Собственно, из-за CO-RE мне и стало интересно сравнивать BTF.

Когда BPF-программа работает на одном ядре, но возникают проблемы на другом, хочется посмотреть, какие типы и смещения отличаются. CO-RE как раз использует BTF для адаптации обращений к структурам, но это не значит, что любые изменения layout автоматически ломают программу.

И наоборот: одинаковый layout ещё не гарантирует, что программа успешно загрузится.

Поэтому btf-layout-diff не проверяет совместимость CO-RE. Он не анализирует релокации из ELF, не отслеживает рекурсивно типы полей и ничего не знает о решениях verifier.

Задача гораздо проще: показать разницу между описаниями структур, чтобы не искать её вручную.

Что проверил?

Я добавил тесты на изменение размеров структур, смещений полей и bitfield. Отдельно проверил случай, когда меняются только type_id: ложных отличий в отчёте быть не должно.

Есть проверки неполной записи структуры и неоднозначных имён.

Локально собирал проект на macOS. В GitHub Actions сборка и тесты проходят на Linux и macOS.

Запустить можно из репозитория: sairex53/btf-layout-diff.

Пока следующий шаг — сравнить BTF двух реальных ядер, взять BPF-программу, которая обращается к изменившейся структуре, и посмотреть, как с этим работают её CO-RE-релокации.

Сейчас инструмент решает только первую часть задачи. Но для неё мне и хотелось иметь отдельный diff, а не разбирать два больших вывода bpftool вручную.

Теги:
+1
Комментарии0

Пять уровней форматирования - и aiogram перестаёт отвечать

Наткнулся на issue #1925 в aiogram: после получения сообщения с rich_message бот перестал отвечать. Внутри JSON была цепочка форматирования:

spoiler → subscript → bold → italic → underline

На aiogram 3.31.0 вызов Update.model_validate(...) загружал одно ядро на 100% и блокировал event loop. Автор issue пишет, что бот простоял так около часа.

Захотелось разобраться, как несколько уровней форматирования вообще могли положить обработку обновлений.

Что происходило при валидации

За вложенный текст отвечает RichTextUnion - рекурсивный union из строк, списков и 26 моделей форматирования. У каждой модели есть поле text, которое снова может содержать RichTextUnion.

RichTextUnion = (    str    | list["RichTextUnion"]    | RichTextBold    | RichTextItalic    # ... ещё 24 модели
)

Поле type у моделей было, но для выбора ветки union оно не использовалось. Поэтому Pydantic пробовал разные варианты. При проверке неподходящей модели он мог снова перейти к вложенному text, а там - очередной union с теми же вариантами.

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

Что исправили

В PR #1934 добавили callable discriminator. Он выбирает ветку сразу: строку по "str", список по "list", модель - по её полю type.

Обычного Field(discriminator="type") здесь недостаточно: строки и списки поля type не имеют.

По замерам автора PR, валидация проблемного обновления сократилась с 5,4 секунды до 0,3 мс. Исправление влили 11 октября.

Проверил отдельно от aiogram

Собрал небольшой стенд: 26 упрощённых рекурсивных моделей, два варианта union — обычный и с дискриминатором.

На Python 3.14.8 и Pydantic 2.12.5 для глубины 4 получил:

  • Обычный union - 195,061 мс

  • С дискриминатором - 0,004 мс

Разница почти в 49 тысяч раз. Для варианта с дискриминатором проверил и глубину 100: 0,073 мс. Медленный вариант ограничил глубиной 4 - дальше выполнение становилось слишком долгим.

Бенчмарк использует прогрев и медиану пяти запусков. Есть четыре теста на вложенность и выбор моделей; в CI они запускаются на Python 3.10–3.13.

git clone https://github.com/sairex53/aiogram-rich-text-validation-lab
cd aiogram-rich-text-validation-lab
python -m pip install -r requirements.txt
python -m unittest -v
python benchmark.py

Это не воспроизведение исходного update: стенд не импортирует aiogram и не использует JSON из issue. Я сравнивал именно поведение Pydantic на похожей структуре типов.

Похожую проблему с RichBlockUnion в aiogram уже исправляли в PR #1845. А рекурсивный RichTextUnion тогда остался без дискриминатора.

Теги:
0
Комментарии0

Оказывается у callback_data надо считать байты, а не символы

В Telegram ограничение для callback_data - 1–64 байта. В Python len() считает символы. Для ASCII разницы нет, но для emoji и других многобайтных символов она быстро становится заметной:

prefix = "🐍" * 10
len(prefix)                 # 10
len(prefix.encode("utf-8")) # 40

В aiogram-tool 1.2.3 я нашёл расчёт длины служебного идентификатора для LongCallbackData. Он вычитал len(prefix) из лимита 64, то есть при emoji оставлял себе лишнее место. Дальше библиотека генерировала ID, который уже вместе с префиксами не помещался в лимит aiogram.

Минимальное воспроизведение — класс с prefix="🐍" * 10. В регрессионном тесте _UniqueIDCallbackData.build(Data).pack() на исходном коде падает с ValueError: Resulted callback data is too long. То есть длинный payload библиотека умеет убирать в storage, но даже короткая ссылка на него может не поместиться, если пользовательский prefix не ASCII.

Исправление — считать UTF-8 байты для каждого поля, участвующего в расчёте:

separators_len = len(cls.__separator__.encode("utf-8")) * len(cls.model_fields)
unique_id_len = (    64    - len(UNIQUE_PREFIX.encode("utf-8"))    - len(callback_data.__prefix__.encode("utf-8"))    - separators_len
) // 2

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

На исходной версии новый тест падает на сборке служебного ID. После патча два теста файла test_unique_id.py проходят (2 passed). Тест, патч и инструкция по воспроизведению лежат в репозитории: тест, патч, инструкция. PR в upstream пока не открывал.

Проверял на Linux, Python 3.12, aiogram 3.29.1. Это unit-тесты упаковки и распаковки; реальный callback в Telegram не отправлял.

Теги:
+3
Комментарии0

Вышел gomponents 1.4.0 !

Gomponents - фреймворк, который позволяет описывать HTML-компоненты на чистом Go. Он генерирует HTML5 и позволяют легко создавать компоненты многократного использования. Благодаря этому вы можете сосредоточиться на разработке приложения, а не на изучении html.

Основная новика релиза - официальный навык (skill) для агента.

Пример работы с html в gomponents:

package main

import (
	. "maragu.dev/gomponents"
	. "maragu.dev/gomponents/components"
	. "maragu.dev/gomponents/html"
)

func Navbar(authenticated bool, currentPath string) Node {
	return Nav(
		NavbarLink("/", "Home", currentPath),
		NavbarLink("/about", "About", currentPath),
		If(authenticated, NavbarLink("/profile", "Profile", currentPath)),
	)
}

func NavbarLink(href, name, currentPath string) Node {
	return A(Href(href), Classes{"is-active": currentPath == href}, Text(name))
}

GitHub: https://github.com/maragudk/gomponents

ChangeLog: https://github.com/maragudk/gomponents/releases/tag/v1.4.0

Теги:
0
Комментарии0
1
23 ...