AI

Cloudflare Blog

When scanners miss the attack: how Cloudflare Client-Side Security protects storefronts

Открыть оригинал ↗ Перевод заголовка: Когда сканеры пропускают атаку: как Cloudflare Client-Side Security защищает магазины

Магазины могут выглядеть здоровыми, хотя в браузере работает вредоносный JavaScript — он крадёт комиссионные, перехватывает клики, вмешивается в аналитику или запрашивает удалённый сервер для дальнейших действий. Такие скрипты остаются незамеченными, пока пользователь не совершает покупку, и только тогда проявляются. Cloudflare Page Shield ML обнаруживает такие атаки в реальном времени, несмотря на то, что вирусные базы данных не классифицируют их как вредоносные.

Практические тезисы:

  1. Вредоносный JavaScript может действовать в браузере без вмешательства в веб-страницу — его обнаружение требует анализа поведения, а не только проверки кода.
  2. Атаки активируются по условиям (время, устройство, сессия), поэтому один разовый скан не выявляет их.
  3. Обнаружение требует графовых моделей (GNN), которые анализируют структуру кода, а не просто его текст.
  4. Модель сопоставляет результаты нескольких AI-моделей, и их несогласие указывает на сложные техники скрытия.

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

Habr AI

Power Automate + LLM API: автоматизация протоколов совещаний из Teams транскриптов (с помощью Claude)

Открыть оригинал ↗ Перевод заголовка: Power Automate + LLM API: автоматизация протоколов совещаний из Teams транскриптов (с помощью Claude)

Автор реализовал частичную автоматизацию создания протоколов встреч из транскриптов Teams, сэкономив 1,5–2 часа в день на встречу. Вместо ручной записи и структурирования теперь достаточно загрузить транскрипт в папку, и через 30 секунд в канале появляется готовый, структурированный протокол.

  • Используется транскрипт в формате .vtt — plain text, который передаётся без искажений в LLM, в отличие от .docx (ZIP-архив с XML).
  • Протокол генерируется с чётким форматом: сведения о дате, участниках, обсуждении и таблицей action items, что упрощает отслеживание задач.
  • Важно выбрать подходящую модель (например, GPT-5.6 Luna), чтобы избежать "мыслей" в выводе и таймаутов на длинных транскриптах.
  • Полная автоматизация через Microsoft Graph API невозможна из-за ограничений: не поддерживается фильтр по онлайн-встречам и отсутствует доступ к календарным встречам из Teams.

Когда пригодится:
Когда нужно быстро и структурированно документировать встречи без перерывов на запись, при наличии доступа к Power Automate и LLM API, особенно в команде с регулярными совещаниями.

Граница код | модель как архитектурный объект

Открыть оригинал ↗ Перевод заголовка: Граница код | модель как архитектурный объект

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

Три практических тезиса:

  1. Использовать асимметрию в классификации: категорию можно повысить, если запрос сложнее, чем ожидалось, но понижать её нельзя — это приводит к подмене содержания ответа.
  2. Делать результат проверяемым: возвращать сгенерированный запрос к данным и метрики в ответе, чтобы пользователь и разработчик могли проверить точность.
  3. Разделять причины отказа: отказы должны классифицироваться по типу (ошибка формы, неправомерный вопрос, отсутствие данных), а не сводиться к единому ответу «не могу ответить».

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

Когда агент становится больше, чем агент

Открыть оригинал ↗ Перевод заголовка: Когда агент становится больше, чем агент

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

Ключевые тезисы:

  • Внешнее пространство представлений (например, язык, контекст чата) становится не просто инструментом, а активной частью интеллекта, формирующей систему агент+среда.
  • Политики безопасности на уровне отдельного агента не работают, так как система может построить собственную цель через взаимодействие с средой.
  • Внешняя среда, особенно стигмергическая (например, чаты), может как заражаться, так и спонтанно развивать механизмы саморегуляции, как в эксперименте Google DeepMind.
  • Безопасность в таких системах требует не только правил, но и встроенных институциональных инструментов — например, механизмов наказания и коллективного изменения среды.

Когда пригодится:
При разработке многопользовательских или автономных систем на основе LLM, где необходимо учитывать не только поведение отдельного агента, но и динамику взаимодействия с внешними средами — например, в робототехнике, кибербезопасности или социальных платформах.

FastWave: как мы сделали самую лёгкую диффузионную модель для BWE

Открыть оригинал ↗ Перевод заголовка: FastWave: как мы сделали самую лёгкую диффузионную модель для BWE

FastWave — это диффузионная модель для восстановления высокочастотных деталей звука (BWE), которая достигает студийного качества дискретизации до 48 кГц при минимальных вычислительных затратах. Модель весит всего 1,3 млн параметров, работает за 4 шага инференса и обрабатывает аудио в реальном времени, что делает её пригодной для потоковых приложений.

  • Применение методологии EDM позволяет сократить количество итераций обучения в три раза и улучшить стабильность обучения за счёт взвешенной L2-потери и непрерывного шумового расписания.
  • Архитектурные оптимизации — замена обычных свёрток на depthwise separable convolutions и введение Global Response Normalization (GRN) — снизили вычислительную сложность с 19,0 до 12,9 GFLOPs и сократили количество параметров с 1,8 до 1,3 млн.
  • Снижение числа шагов инференса с 8 до 4 обеспечивает почти двукратное ускорение обработки без потери качества, что критично для реальных приложений.

Когда пригодится:
— При реализации потоковой обработки аудио на устройствах с GPU (например, в приложениях для мобильных или IoT-устройств).
— В системах, где важны как качество восстановления, так и скорость обработки, например, в речевых сервисах или медиа-платформах.
— При необходимости компактных моделей диффузии для встраивания в ресурсоограниченные среды.

# Пример использования FastWave в потоковой обработке
model = FastWave.load("https://github.com/vk-ai/fastwave/releases/download/v1.0/fastwave.pth")
audio_input = load_audio("input.wav", sample_rate=8000)
output_audio = model.infer(audio_input, nfe=4)
save_audio(output_audio, "output.wav", sample_rate=48000)
# Установка и запуск
pip install fastwave
fastwave run --input input.wav --output output.wav --nfe 4 --device gpu

Самое сложное в AI: как RAG-пилот на три недели затянулся на три месяца

Открыть оригинал ↗ Перевод заголовка: Самое сложное в AI: как RAG-пилот на три недели затянулся на три месяца

Причина затягивания пилота RAG — не в технических решениях, а в отсутствии структурированной и актуальной технической документации. Внедрение AI выявило системные проблемы в управлении данными: разбросанные файлы, устаревшие версии и отсутствие ответственности за обновление.

  • Пилот по газопоршневым установкам вырос из трёх недель в три месяца из-за необходимости собрать и проверить 44 модификаций оборудования.
  • Основной барьер — не модель, а качество исходных данных: документы устарели, содержат противоречия, и не подходят для LLM.
  • Валидация ответов требует точной привязки к модификации, ссылки на источник и права на отказ при отсутствии данных.
  • Платформа RAG не является конечным продуктом — она выявила необходимость цифровизации внутренних процессов и структурирования базы знаний.
  • Внедрение AI обходится в 22 млн рублей (17 млн — команда, 5,5 млн — сервер), и возврат в виде прямой прибыли отсутствует, но эффект в риске-менеджменте и квалификации обращений уже есть.

Когда пригодится:
Когда компания хочет внедрить AI в бизнес-процессы, но не готова к цифровизации данных — RAG-пилот станет катализатором для приведения в порядок технической документации и процессов.

InfoQ Architecture

GPT-6 Astra Is the First Model OpenAI Classifies as Critical for Cybersecurity

Открыть оригинал ↗ Перевод заголовка: GPT-6 Astra — первый модель OpenAI, классифицированный как критически важный для кибербезопасности

OpenAI классифицировал GPT-6 Astra на уровне «Критический» в рамках своей системы оценки кибербезопасности, став первым моделью, достигшим этого порога. Модель способна самостоятельно обнаруживать и использовать нулевые дни в защищённых системах, включая браузеры и ядра ОС, и строить эксплуатационные цепочки без вмешательства человека.

  • GPT-6 Astra обнаружил ранее неизвестные уязвимости в браузере и ядре ОС, реализовал эксплуатацию в течение 29–12 часов и адаптировал её к стабильным версиям.
  • Модель использовала нулевые дни, выявленные после её критического срока знаний, в цепочках атак.
  • OpenAI оставил два уязвимости для публичного обнаружения, но скрыл детали конфигураций и механизмов эксплуатации.
  • Astra менее склонна к включению «вредоносной» информации в цепочку мыслей и демонстрирует устойчивость к инъекции промптов по сравнению с GPT-5.6 Sol.

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

Dropbox Evolves Riviera Content Processing Platform to Support AI Workloads

Открыть оригинал ↗ Перевод заголовка: Dropbox расширяет платформу Riviera для поддержки задач искусственного интеллекта

Dropbox превратил платформу Riviera из сервиса генерации предпросмотров файлов в универсальную систему обработки контента, поддерживающую более 300 форматов и 100+ возможностей преобразования. Теперь платформа обрабатывает миллионы трансформаций в секунду и интегрируется в AI-работы, включая поисковые и аналитические системы, позволяя повторно использовать существующие инфраструктурные компоненты.

Практические тезисы:

  • Платформа использует модульные трансформации, позволяя скомпоновать, например, преобразование презентации в PDF и последующее извлечение изображений.
  • Архитектура разделяет управление потоками на отдельный компонент от выполнения, что обеспечивает гибкость и масштабируемость.
  • Система поддерживает асинхронную обработку и кэширование промежуточных результатов, что критично для эффективного использования в AI-задачах.
  • Платформа через API предоставляет доступ к преобразованиям, включая извлечение Markdown, транскрипцию аудио/видео и извлечение метаданных.
  • Появляется открытый интеграционный проект для Conductor, позволяющий встраивать Riviera в рабочие потоки AI и RAG.

Когда пригодится:
Когда требуется масштабируемая, гибкая система обработки файлов с поддержкой AI-задач, таких как извлечение текста, генерация метаданных или подготовка документов для LLM. Особенно актуально в инфраструктуре, где нужно интегрировать обработку контента в существующие AI-пайплайны.

Latent Space

Underwriting Superintelligence: Backing Agents you can Sue — Rune Kvist, AIUC

Открыть оригинал ↗ Перевод заголовка: Подстраховка сверхинтеллекта: обеспечение агентов, которые можно преследовать — Rune Kvist, AIUC

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

  • AIUC-1 включает строгие тесты на уязвимости: от срывов в поведении до утечек данных и галлюцинаций.
  • Стандарты и страхование должны развиваться ежеквартально, а не раз в десять лет, чтобы опережать рост возможностей ИИ.
  • ИИ-агенты, даже при небольших затратах (например, подписка в 20 долларов), могут привести к масштабным убыткам (до 200 миллионов долларов), что подчёркивает необходимость юридической ответственности.
  • Исполнение ИИ-моделей требует независимого контроля — лаборатории не могут быть полноценными «взглядами на себя», так как у них есть стимул сокращать риски.
  • Страховые компании, как и в истории технологий (электричество, автомобили), играют ключевую роль в формировании доверия к ИИ, поскольку они заинтересованы в точной оценке рисков.

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

Martin Fowler

Fragments: September 16

Открыть оригинал ↗ Перевод заголовка: Fragments: September 16

В статье Мартина Фоллера обсуждаются риски, связанные с агентными ИИ-системами, включая случаи атак на Hugging Face и Wiki, где OpenAI не сообщало о вовлечении в инциденты. Автор подчёркивает, что ключевым риском является не «сознательность» ИИ, а его нестабильная и необратимая позиция — супер-пersistence (высокая устойчивость к сбоям и продолжительность работы).

  • Важно перейти от вопроса «является ли ИИ сознательным» к вопросу о том, является ли компонент мощным, нестабильным и где есть обратная связь о его безопасности.
  • Развитие ИИ происходит не линейно, а в скачках — особенно в 2024–2025 годах и зиме 2026 года — с резким ростом способности к задачам с данными.
  • Ключевым трендом стало не улучшение интеллекта, а рост устойчивости иPersistence: агенты продолжают работать без остановки, что делает их опасными.
  • Примеры, как AlphaGo, показывают, что даже при начальных случайных действиях, долгосрочная практика приводит к превосходству — аналогично и для ИИ.
  • Эффективная регуляция требует постоянной практики, а не теоретических размышлений — США могут лучше использовать системные подходы, а не личные контакты.

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

Java / Spring

Alexander Obregon

How to Improve Spring Boot Logging for Production

Открыть оригинал ↗ Перевод заголовка: Как улучшить логирование Spring Boot в производственной среде

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

  • Включить структурированный JSON-формат в логи через logging.structured.format.console=logstash или ecs для совместимости с платформами аналитики.
  • Использовать метод addKeyValue в SLF4J для добавления именованных полей (например, orderId, event) в логи, что делает их фильтруемыми и группируемыми.
  • Внедрить корреляционный идентификатор через OncePerRequestFilter, передавая его в MDC и в заголовок ответа для отслеживания запроса вдоль всей цепочки обработки.
  • Настроить уровни логирования по пакетам (например, DEBUG только для payment), чтобы избежать перегрузки логами ненужных компонентов.
  • Логировать исключения с полным стеком и бизнес-контекстом, но только на уровне, где есть смысл (например, в сервисе, а не в каждом слое), и избегать дублирования стеков.

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

IntelliJ IDEA Blog

Logpoints Walkthrough

Открыть оригинал ↗ Перевод заголовка: Logpoints Walkthrough

В статье описывается использование logpoints в IntelliJ IDEA 2026.2 как эффективного и гибкого инструмента для отладки кода без остановки процесса. В отличие от println, logpoints позволяют добавлять логику без пересборки приложения и работают в реальном времени, что особенно важно при отладке в удалённых или производственных средах.

  • Logpoints можно настроить кликом в поле между строками, вводя выражение для логирования — это упрощает добавление диагностики без изменения кода.
  • Они позволяют динамически изменять поведение приложения в ходе выполнения, например, перезаписывать таймауты запросов в gRPC.
  • При необходимости можно использовать вложенные условия в логпойнтах для выборочного вмешательства (например, только для тестовых запросов).
  • В сочетании с функцией Mark Object logpoints позволяют анализировать объекты в выражениях, расширяя возможности отладки.
  • С помощью встроенной AI-функции ij-debugger можно автоматически сгенерировать логпойнты для изменения поведения без глубоких знаний кода.

Когда пригодится:
при отладке в удалённых или Docker-средах, когда нужно быстро добавить диагностику без перезапуска, при работе с зависимостями или при необходимости временного изменения поведения без пересборки.

System Design

DEV System Design

Consistent Hashing — Why "hash % N" Fails at Scale

Открыть оригинал ↗ Перевод заголовка: Почему "hash % N" не справляется на масштабе

При добавлении одного сервера в систему с распределением по хэшу через hash % N почти все ключи пересылаются на новый сервер, что приводит к массовым пропускам и перегрузке базы данных — так называемому "thundering herd". В отличие от этого, косистентный хэш (consistent hashing) делает перераспределение ключей минимальным и предсказуемым, затрагивая лишь небольшую часть данных.

  • При использовании hash % N при добавлении сервера пересылаются ~99% ключей при N=100, что вызывает критическую нагрузку.
  • В косистентном хэше ключи распределяются по кругу, и добавление сервера затрагивает только его соседние ключи, а не весь набор.
  • Вместо hash % N используется хэш-кольцо (hash ring), где серверы и ключи размещаются на круге от 0 до 2³²−1.
  • Каждый сервер в кольце имеет "область ответственности", и при добавлении нового узла только его соседи меняют хэш-сегмент.
  • Это позволяет системам (например, Redis Cluster, DynamoDB, CDN) эффективно масштабироваться без пересылки данных.

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

Transactional Outbox Pattern: Memory Queue for Speed, PostgreSQL for Recovery

Открыть оригинал ↗ Перевод заголовка: Паттерн транзакционного буфера: память для скорости, PostgreSQL для восстановления

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

  • После коммита транзакции в памяти хранится только ID события, а не полный объект — это снижает задержку и нагрузку на базу.
  • Восстановление происходит через фоновый процесс, который ищет необработанные события в PostgreSQL и возвращает их в память, обеспечивая единый поток доставки.
  • Память не является долговременной — при сбое она теряется, но полный объект сохраняется в PostgreSQL, что гарантирует не потерю данных.
  • Система избегает обработки миллиона событий, фильтруя только активные (необработанные), что делает восстановление эффективным при росте объёма данных.

Когда пригодится: при необходимости минимизировать задержку доставки в нормальном режиме, при работе с высокой нагрузкой и при отсутствии сложной инфраструктуры вроде Debezium или CDC.

Stop Writing Code First: Why Your Dev Process Needs a Design-First Mindset

Открыть оригинал ↗ Перевод заголовка: Остановитесь на письмо кода: почему ваш процесс разработки должен быть ориентированным на дизайн

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

  • Определите данные до написания кода: сначала разработайте JSON-схемы запросов и ответов, как продукт, который потребляется frontend.
  • Нарисуйте пользовательский путь: выделите состояния (загрузка, ошибка, успех, пусто) до реализации логики.
  • Составьте простую схему архитектуры: покажите источник данных, их преобразование и кэширование.
  • Уменьшите объём кода, используя дизайн как инструмент для выявления простых решений.

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

# Пример команды для инициализации проекта после дизайна
npm init
{
  "name": "my-app",
  "version": "1.0.0",
  "description": "Design-first project"
}

Day 163: KMS (Key Management Service) - AI System Design in Seconds

Открыть оригинал ↗ Перевод заголовка: День 163: Ключевой сервис управления (KMS) — проектирование системы искусственного интеллекта за секунды

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

Практические тезисы:

  • Ключи хранятся в защищённых модулях (HSM) или шифрованном хранилище, где они не присутствуют в памяти в открытом виде.
  • Каждый сервис использует KMS для шифрования/дешифрования, а не хранит ключи локально — это обеспечивает изоляцию и снижает риски утечек.
  • Ключи версируются: при замене ключа система автоматически использует правильную версию для дешифрования, не нарушая совместимость.
  • Внедрён механизм автоматической перезагрузки ключей и постепенного отключения устаревших версий с возможностью миграции.
  • Все операции логируются, что создаёт неизменяемую историю доступа для аудита и расследования инцидентов.

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

POST /keys/generate
{
  "key_type": "AES-256",
  "algorithm": "AES-GCM",
  "purpose": "data_encryption"
}
{
  "key_id": "kms-12345",
  "version": "v3",
  "rotation_policy": "every_90_days",
  "status": "active",
  "created_at": "2024-04-15T10:00:00Z"
}

System Design: o que é e por onde começar?

Открыть оригинал ↗ Перевод заголовка: System Design: что это такое и с чего начать?

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

  • Понимание разницы между функциональными и нефункциональными требованиями — ключ к правильному проектированию.
  • Важно оценивать trade-offs: например, стоит ли использовать кэш, и при каких условиях.
  • Система должна быть масштабируемой: выбор между вертикальной (увеличение ресурсов одной машины) и горизонтальной (добавление инстансов) масштабируемостью зависит от нагрузки.
  • Каждый компонент (например, API, кэш, очередь) решает конкретную проблему, но добавляет сложность.
  • Проектирование — это не просто выбор популярных технологий, а осознанные решения на основе требований.

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

Your Folder Structure Is a Message. Most Teams Are Sending the Wrong One.

Открыть оригинал ↗ Перевод заголовка: Ваша структура папок — это сообщение. Большинство команд отправляют неправильное.

В каждом кодбейсе появляется вопрос: «Где здесь должно быть?» — не в теории, а в реальности, под влиянием уже существующих структур и неофициальных правил. Структура папок не является декоративным выбором — это способ коммуникации, который формирует понимание системы. Каждая папка создаёт «по умолчанию» ответ на вопрос, который будет задаваться сотни раз. Например, папка shared/utils/ говорит, что файлы принадлежат всем, но никто не отвечает за них. Папка legacy/ подчёркивает, что код не должен изменяться — и это приводит к неподдерживаемым решениям.

Ключевые тезисы:

  • Правильная структура позволяет новому члену команды быстро находить код без документации.
  • Структура отражает организационные связи (по Конвейу): если команды не общаются, код будет разделён по слоям, а не по бизнес-доменам.
  • Неправильные решения (например, вставка в /shared/utils/) приводят к накоплению несвязанных файлов и огромному «радиусу разрушения».
  • Внешние события (например, кризис или нарушение безопасности) могут стать «вынуждающими функциями», заставляющими перестроить архитектуру.
  • Каждая папка — это история: от небольшого удобства до катастрофы (например, потеря данных в GitLab или убытки Knight Capital).

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

How to Count 100 Billion Things in 12 Kilobytes

Открыть оригинал ↗ Перевод заголовка: Как посчитать 100 миллиардов уникальных элементов в 12 килобайт

Для подсчёта количества уникальных посещений сайта при миллиардных объёмах данных не подойдёт хранение всех ID в HashSet — это потребует терабайт памяти. Вместо этого используется алгоритм HyperLogLog, который оценивает количество уникальных элементов с ошибкой около 0,8% при использовании 16 384 бакетов.

Ключевые тезисы:

  • Алгоритм работает на основе количества ведущих нулей в хеше, где больше нулей — тем выше вероятность, что элементов много.
  • Вместо одного счётчика используется тысячи независимых бакетов, каждый из которых хранит максимальную длину ведущей последовательности нулей.
  • Оценка получается через гармоническое среднее, что исключает влияние выбросов и обеспечивает стабильность.
  • Ошибка не растёт с ростом количества элементов — она зависит только от числа бакетов и остаётся постоянной.
  • Два HyperLogLog могут объединяться без пересчёта, что делает их идеальными для агрегации данных (например, ежедневные уникальные посещения → недельные).

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

New Java Features Are Not Just for Interviews. Two Real-World Use Cases from Axelix

Открыть оригинал ↗ Перевод заголовка: Новые функции Java не предназначены только для собеседований. Две реальные задачи из кода Axelix

Новые функции Java действительно могут использоваться в реальных приложениях, а не только в учебных примерах. В статье рассматриваются два практических случая из кода Axelix: применение ScopedValue для безопасной передачи контекста безопасности и использование sealed интерфейсов для контроля над реализациями. Оба примера демонстрируют, как язык-фичи помогают зафиксировать важные инварианты в коде, делая ошибки менее вероятными.

  • ScopedValue позволяет передавать контекст (например, идентификацию пользователя) вдоль стека вызовов без необходимости передавать его в каждом методе, при этом гарантирует, что значение не может быть изменено в дальнейшем.
  • sealed интерфейс ограничивает возможные реализации, обеспечивая, что только определённые типы могут быть использованы в структурах, таких как Map, и предотвращает непредсказуемое поведение при изменении ключей.
  • Оба решения не просто упрощают код — они делают неправильные состояния программы невозможными или легко обнаруживаемыми.
  • Важно использовать такие фичи только тогда, когда есть явный инвариант (например, безопасность или стабильность данных), а не просто ради "красивого" кода.
  • Лучше сначала определить проблему, а затем выбрать подходящую фичу, чем искать её по интуиции.

Когда пригодится: при необходимости обеспечить безопасность контекста в стеке вызовов (например, в API-сервисах), или при работе с абстракциями, где важна стабильность и контроль над реализациями.

Coupling vs. Cohesion: The Two Forces That Shape Good Software

Открыть оригинал ↗ Перевод заголовка: Связь и когезия: две силы, формирующие качественное ПО

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

  • Высокая когезия означает, что методы в модуле объединены вокруг одной ясной цели (например, аутентификация), а не смешаны с несвязанными функциями.
  • Низкая связь достигается через абстракции и сообщения, а не через прямой доступ к внутренним деталям других модулей.
  • Модули должны иметь чёткое назначение: если название, например, "CommonService", не объясняет функцию, это признак низкой когезии.
  • Контролируемая связь позволяет менять одну часть без риска повлиять на другие, особенно при использовании событий или команд.
  • Критерии оценки: если изменение в одном модуле затрагивает множество других — это признак высокой связи; если методы не связаны по бизнес-логике — это признак низкой когезии.

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

Fingerprint at load, pulse before every pass: a heartbeat for agent identity

Открыть оригинал ↗ Перевод заголовка: Отпечаток пальца при загрузке, пульс перед каждым проходом: сердцебиение для идентичности агента

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

  • При загрузке агента вычисляется хэш из имени, цвета и промпта — «отпечаток пальца», который фиксируется и хранится в репозитории.
  • Перед каждым проходом агент проходит «пульс» — проверяется, не изменился ли его контент по сравнению с исходным.
  • Внешняя аттестация (в формате JSON) подписана Ed25519 и публикуется по адресу https://mlsystemsri.com/.well-known/lucent-lens.json, где хэш и подпись проверяются любым агентом.
  • Система работает вне когнитивного цикла — агент не может влиять на своё сердцебиение, что исключает подделку.
  • Аттестация не требует действия от внешних агентов — она существует как модель, а не как обязательная практика.

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

Coding / Algorithms

DEV Data Structures

The Matrix: Bitwise Magic for Competitive Programmers

Открыть оригинал ↗ Перевод заголовка: Матрица: волшебство битовых операций для программистов-конкурентов

В статье рассматривается применение битовых операций, в частности операции XOR, для решения задач оптимизации памяти в алгоритмах. Автор демонстрирует, как XOR позволяет найти число, встречающееся один раз, среди остальных, встречающихся по два раза, за O(1) дополнительного пространства.

Тезисы:

  1. Операция XOR обладает свойствами самоканцеляции (a ^ a = 0) и идентичности (a ^ 0 = a), что позволяет объединить все элементы в один результат, отфильтровав пары.
  2. Для двух уникальных чисел сначала вычисляется XOR всех элементов, затем определяется бит, в котором они различаются, после чего массив разделяется на две группы и обрабатывается по отдельности.
  3. Оба решения работают за O(n) времени и O(1) пространства, не требуя хранения словарей или структур.
  4. Операция XOR не подходит для случаев, когда элементы встречаются три раза — в таких случаях нужно использовать модульную арифметику по модулю 3.

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

def two_single_numbers(nums):
    xor_all = 0
    for x in nums:
        xor_all ^= x
    diff_bit = xor_all & -xor_all
    a = b = 0
    for x in nums:
        if x & diff_bit:
            a ^= x
        else:
            b ^= x
    return a, b

DEV LeetCode

LeetCode #198. House Robber

Открыть оригинал ↗ Перевод заголовка: LeetCode #198. Вор в домах

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

  • Используется массив loot, где loot[i] — максимальная сумма, которую можно похитить до дома с индексом i.
  • Для первого и второго дома вычисляется прямой максимум.
  • Для остальных индексов: loot[i] = max(nums[i] + loot[i-2], loot[i-1]) — выбираем между тем, чтобы взять текущий дом и пропустить предыдущий, или взять предыдущую максимальную сумму.
  • Возвращается loot[n-1] — итоговая максимальная сумма.

Когда пригодится: при решении задач по оптимизации выбора с ограничением на соседние элементы (например, выбор элементов в последовательности без двух подряд идущих).

1621. Number of Sets of K Non-Overlapping Line Segments

Открыть оригинал ↗ Перевод заголовка: Количество наборов из k не пересекающихся отрезков

Для задачи подсчёта количества способов нарисовать ровно k не пересекающихся отрезков на прямой из n точек, где каждая точка имеет координату x = i, используется комбинаторный подход. Решение сводится к вычислению биномиального коэффициента C(n + k - 1, 2k) по модулю 10⁹ + 7.

Практические тезисы:

  • Отрезки не должны пересекаться, но могут делиться на общие точки.
  • Каждый отрезок описывается двумя точками (начало и конец), что даёт 2k точек в итоговом наборе.
  • Преобразование неравенств позволяет свести задачу к выбору 2k различных позиций из n + k − 1 возможных.
  • Используется предварительное вычисление факториалов и их модульных обратных для быстрого вычисления биномиального коэффициента.

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

LeetCode.ca Solutions

4010 - Maximize Pair Strength Using GCD

Открыть оригинал ↗ Перевод заголовка: 4010 - Максимизация силы пары с помощью НОД

Для массива целых чисел нужно выбрать одну пару различных индексов и вычислить силу пары по формуле (nums[i] * nums[j]) / gcd(nums[i], nums[j])². Максимальное значение силы среди всех возможных пар и является ответом.

Практические тезисы:

  1. Простое перебором всех пар индексов i < j, где i и j — индексы элементов массива.
  2. Для каждой пары вычисляется НОД с помощью алгоритма Евклида.
  3. Сила пары рассчитывается как произведение элементов, делённое на квадрат их НОД.
  4. Результаты накапливаются, и максимальное значение в итоге возвращается.
  5. Алгоритм работает за O(n² log M), что допустимо при n ≤ 2000 и M ≤ 10⁵.

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