AI
Cloudflare Blog
When scanners miss the attack: how Cloudflare Client-Side Security protects storefronts
Открыть оригинал ↗ Перевод заголовка: Когда сканеры пропускают атаку: как Cloudflare Client-Side Security защищает магазины
Магазины могут выглядеть здоровыми, хотя в браузере работает вредоносный JavaScript — он крадёт комиссионные, перехватывает клики, вмешивается в аналитику или запрашивает удалённый сервер для дальнейших действий. Такие скрипты остаются незамеченными, пока пользователь не совершает покупку, и только тогда проявляются. Cloudflare Page Shield ML обнаруживает такие атаки в реальном времени, несмотря на то, что вирусные базы данных не классифицируют их как вредоносные.
Практические тезисы:
- Вредоносный JavaScript может действовать в браузере без вмешательства в веб-страницу — его обнаружение требует анализа поведения, а не только проверки кода.
- Атаки активируются по условиям (время, устройство, сессия), поэтому один разовый скан не выявляет их.
- Обнаружение требует графовых моделей (GNN), которые анализируют структуру кода, а не просто его текст.
- Модель сопоставляет результаты нескольких 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-агентах устойчивость системы зависит не от количества правил в промпте, а от явной разграничения между тем, что делает код, и что делает модель. Ключевая идея — граница между кодом и моделью должна быть архитектурным объектом, а не скрытой деталью реализации.
Три практических тезиса:
- Использовать асимметрию в классификации: категорию можно повысить, если запрос сложнее, чем ожидалось, но понижать её нельзя — это приводит к подмене содержания ответа.
- Делать результат проверяемым: возвращать сгенерированный запрос к данным и метрики в ответе, чтобы пользователь и разработчик могли проверить точность.
- Разделять причины отказа: отказы должны классифицироваться по типу (ошибка формы, неправомерный вопрос, отсутствие данных), а не сводиться к единому ответу «не могу ответить».
Когда пригодится: при проектировании агентов, работающих с естественным языком, где важно обеспечить прозрачность, стабильность и возможность диагностики ошибок. Особенно актуально в системах с высокой нагрузкой на безопасность и точность ответов.
Когда агент становится больше, чем агент
Открыть оригинал ↗ Перевод заголовка: Когда агент становится больше, чем агент
Автор анализирует, как системы на основе 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) дополнительного пространства.
Тезисы:
- Операция XOR обладает свойствами самоканцеляции (a ^ a = 0) и идентичности (a ^ 0 = a), что позволяет объединить все элементы в один результат, отфильтровав пары.
- Для двух уникальных чисел сначала вычисляется XOR всех элементов, затем определяется бит, в котором они различаются, после чего массив разделяется на две группы и обрабатывается по отдельности.
- Оба решения работают за O(n) времени и O(1) пространства, не требуя хранения словарей или структур.
- Операция 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])². Максимальное значение силы среди всех возможных пар и является ответом.
Практические тезисы:
- Простое перебором всех пар индексов i < j, где i и j — индексы элементов массива.
- Для каждой пары вычисляется НОД с помощью алгоритма Евклида.
- Сила пары рассчитывается как произведение элементов, делённое на квадрат их НОД.
- Результаты накапливаются, и максимальное значение в итоге возвращается.
- Алгоритм работает за O(n² log M), что допустимо при n ≤ 2000 и M ≤ 10⁵.
Когда пригодится:
Когда требуется найти оптимальную пару элементов в массиве с учётом взаимосвязи между ними через НОД, например, в задачах по обработке числовых данных с зависимостями.