Компилер-пассы и тегированные локаторы: делаем плагинную архитектуру на DI

Привет, Хабр!
Иногда в Symfony встают задачи сделать систему плагинов, чтобы можно было подключать новые модули функциональности, не переписывая основную логику. В этой статье я расскажу, как можно создать плагинную архитектуру с помощью контейнера зависимостей Symfony.
Изучаем Python: модуль Pytest для начинающих с домашним заданием

Если вы пишете код дольше пары недель, вам наверняка знакомо это чувство. Ваш проект, который вчера работал идеально, сегодня после пары «незначительных» правок ведет себя непредсказуемо. Вы чините одно — ломается другое. Каждое изменение превращается в ручную проверку всего приложения, а рефакторинг вызывает тихий ужас. Код становится похож на хрупкий карточный домик, где тронешь одну карту — и всё рухнет.
Это не ваша вина. Это естественный этап роста любого проекта. И чтобы перейти от «кода, который страшно трогать» к «надежной и стабильной системе», профессиональные разработчики используют один мощный инструмент — автоматизированное тестирование.
Компактный runtime-DI для Java: JSR-330, Class-File API и миграция за 2 дня

Когда начинал разработку системы многомерного анализа данных временных рядов Dimension-UI, для внедрения зависимостей в исходном коде решил использовать Dagger 2. Практический опыт показал, что для приложений с большим количеством динамически создаваемых объектов инверсия зависимостей, реализованная в Dagger 2, не подходит.
Да, создание графа зависимостей в compile-time — это, во-первых, очень быстро, и, во-вторых, удобно: получаешь сообщения об ошибках конфигурации уже при компиляции.
Но накладные расходы на сопровождение всего этого хозяйства – прямо скажем, это боль.
Чтобы реализовать scope-зависимости, приходится писать и поддерживать много инфраструктурного кода внутри объектов, куда мы внедряем зависимости. В Dagger 2 такая реализация, во-первых, «загрязняет» код, а во-вторых, серьезно осложняет тестирование. Изолировать методы удобным способом не получается: в тестах нужно писать очень много кода, чтобы прокинуть необходимый контекст и корректно мокировать внешние зависимости. Я туда просто не полез — покрывал unit- и UI-тестами только базовую функциональность, где были Singleton-зависимости.
Даже с одними Singleton’ами приходится поднимать отдельную тестовую инфраструктуру для запуска приложения в тестовом режиме. Это не просто неудобно — это очень затратно по времени. Если сравнить усилия, которые надо потратить на реализацию тестирования подобного функционала в Spring и Dagger… Сравнение будет не в пользу Dagger. В целом я начал думать о переходе на runtime-генерацию графа зависимостей.
Борьба с дубликатами файлов в Laravel

Храните десятки копий одного файла?
Dedupler — Laravel-пакет, который автоматически предотвращает дубликаты через SHA-1 хеширование. Экономит место, ускоряет бэкапы, предоставляет REST API, одобрен Laravel News.
Рассказываю про возможности, производительность и миграцию legacy-проектов.
Мониторинг жёстких дисков

Приключилась у меня беда, посыпался один жёсткий диск. Думал его полечить с помощью "Виктории". Но увы, сейчас всё изменилось и диски стали умными.
Раньше можно было пометить плохие секторы, что бы операционная система туда ни чего не писала. Диск работал дальше, только становился меньше объёмом.
Сейчас оказалось что даже если создать таблицу плохих секторов, она будет проигнорирована и сброшена. Теперь в дисках стоит плата, которая сама пытается восстановить диск, помечает сектор как плохой и использует сектора из резерва. Размер резерва скрывают.
Что бы диск попытался использовать резервы в плохой сектор должно быть что-то записано. Терять мне нечего, перезаписываю диск нулями. Перехожу в линукс и выполняю команду:
Data Quality в масштабе Big Data: как мы построили систему контроля качества данных в Hadoop

Качество данных — это не просто вопрос наличия значений в столбцах таблиц. Это вопрос доверия к данным в целом. Мы можем создавать сложные системы отчётности, но если на каком-то этапе ETL в данных возникают пропуски, дубликаты или они не соответствуют ожиданиям, вся система теряет доверие потребителей. В результате приходится тратить много времени на поиск и устранение причин таких проблем.
Гуминовые вещества и биосфера
Гуминовые вещества есть почти повсюду в природе – это сырье будущего.
Эти вещества проявляют уникальные биологические свойства, не нанося никакого вреда природе. Гуминовые вещества (от лат. humus — земля) впервые были выделены в 1786 году немецким учёным Францем Ашаром из торфа. Водные гуминовые вещества были впервые выделены в 1806 году из родниковой воды Йёнсом Якобом Берцелиусом.
Природное органическое вещество – это стык живого и неживого. Гуминовые вещества (ГВ) – это продукт разложения всей живой органики, в который превращаются растения после отмирания при разложении растительных и животных остатков под действием микроорганизмов и абиотических факторов среды. Представляют собой макрокомпоненту органического вещества почвенных и водных экосистем, а также твёрдых горючих ископаемых. Авария на резервуаре № 5 ТЭЦ-3, принадлежащей Норильско-Таймырской энергетической компании (НТЭК) — дочернему предприятию «Норникеля», привела к утечке около 21 тысячи тонн дизельного топлива. Авария была вызвана сочетанием технологических, климатических и человеческого факторов. Основной причиной стала разгерметизация резервуара № 5 на ТЭЦ-3 вследствие проседания свайного основания, вызванного таянием вечной мерзлоты. Топливо попало в близлежащие реки Амбарная и Далдыкан, а также озеро Пясино, создав угрозу для экосистемы Северного Ледовитого океана. Разлив нефтепродуктов стал одним из крупнейших в Арктике за всю историю и привёл к значительному экологическому ущербу.
Как стримить большие ответы в Django через StreamingHttpResponse и async-генераторы

Привет, Хабр!
Сегодня рассмотрим решение одной непростой задачи, как в Django выдавать очень большие объёмы данных, например, выгрузку в CSV или потоковый JSON-формат NDJSON) так, чтобы сервер не ложился от нагрузки, а пользователи быстрее получали первые данные. Разберём, как использовать StreamingHttpResponse и генераторы (в том числе асинхронные) для стриминга больших ответов и поговорим нюансах.
«Плюсы» на термометре: греемся докладами про C++ и Linux на митапе о низкоуровневой разработке

Конец осени, первый снег и идеальный момент, чтобы заглянуть под капот системного софта. 22 ноября в Москве соберем системных инженеров, исследователей и разработчиков, чтобы обсудить, как устроены компиляторы, ядро Linux и драйверы. Митап разделен на два потока: С++ и C/Linux kernel. Регистрируйтесь и подключайтесь — офлайн или онлайн.
Российские СУБД в 2025: кто займет нишу Oracle в enterprise-сегменте

Привет, Хабр! Я Роман Севрук, менеджер по развитию решений СУБД в К2Тех. Мы своего рода детективы на технологическом рынке — выслеживаем и разбираем каждое новое решение в сегменте российских баз данных.
В этой статье рассмотрим новую подборку баз данных с разными технологическими подходами, которые формируют ландшафт локальной экосистемы российских СУБД. Объясним:
Rust без паник: дельная техника для системного программирования

Может ли Rust заменить C? Этот вопрос беспокоил меня много лет. Тем временем я успел написать upb — библиотеку C для работы с Protocol Buffers, и сейчас являюсь её техническим руководителем. Вполне понятно стремление обеспечить безопасность памяти в пределах всего программного стека — поэтому и возникла идея портировать upb на Rust.
Притом, что мне приятны базовые принципы Rust, я долгое время относился к этой идее скептически и сомневался, что, портировав upb на Rust, удастся сберечь её производительность и компактность кода, которые мы с коллегами так старались оптимизировать. На самом деле, исходно я собирался написать статью о том, почему именно применительно к upb языку Rust никогда не сравниться с C по производительности.
Но недавно я открыл для себя одну технику, которая заставила меня немного переосмыслить этот вопрос. Я назову её «Rust без паник». Притом, что этот метод определённо не нов, мне нигде не удалось найти подробного разбора, в котором бы рассказывалось, как именно этот метод используется и какие проблемы решает. Правда, интересная дискуссия по этому поводу велась в теме Enforcing no-std and no-panic during build, где есть ссылки на некоторые релевантные треды из почтовой рассылки, посвящённой разработке ядра Linux. Вот другой интересный тред: Negative view on Rust: panicking
Надеюсь, эта статья позволит заполнить данный пробел.
Алгоритмы генерации diff

Для разработчиков ПО diff — привычный способ представления изменений: мы используем diff для сравнения различных версий одного файла (например, во время ревью кода или когда мы пытаемся понять историю файла), для визуализации разницы между непроходящим тестом и его ожиданиями или для автоматического применения изменений к файлам исходников.
В каждом моём профессиональном и личном проекте рано или поздно требовался diff для визуализации изменения или применения патча. Однако меня никогда не устраивала ни одна из свободно доступных библиотек diff. В профессиональной деятельности это никогда не вызвало особых проблем, но в личных проектах я копировал и модифицировал из проекта в проект собственную библиотеку. Однажды я рассказал об этом коллеге, и тот наставил меня на путь публикации моей библиотеки на Go (порта библиотеки на C++, которую я раньше копировал и модифицировал). И оказалось, что я сильно недооценивал то, насколько близка моя библиотека к возможности публикации!
Как бы то ни было, я опубликовал её и узнал много нового об алгоритмах diff. Библиотеку можно найти по адресу znkr.io/diff, а в этой статье я расскажу о своих открытиях. Я ещё не завершил освоение, поэтому планирую дополнять статью в процессе изучения.
Ближайшие события
Разворачиваем без боли Terraform в Яндекс облаке

Концепция “Инфраструктура как код” (IaC) стала неотъемлемой частью методологии DevOps. С помощью IaC мы можем без труда развернуть в облаке нужную инфраструктуру. При этом, мы можем развернуть абсолютно идентичные инфраструктуры как для среды разработки, так и для тестирования и для продуктивной среды.
На просторах сети можно встретить большое количество публикаций, посвященных использованию «иностранных» облаков, таких как Amazon, Google и Microsoft. Однако, в текущих условиях использование данных провайдеров практически невозможно. Между тем на российском рынке также есть много интересных игроков. В рамках данной статьи мы посмотрим использование Яндекс Облака. Но для начала давайте разберемся с тем как в принципе реализуется IaC.
Возвращаем неактивных клиентов из YClients по SMS с умной проверкой Number Lookup

Привет, Хабр! Сегодня покажем, как автоматизировать напоминания клиентам компании, переставшим пользоваться ее услугами. Пример: кейс сети салонов красоты.
Во все филиалы сети ежедневно записываются около ста человек. Реактивировать часть потерянных клиентов можно с помощью SMS-информирования о персональной скидке. Но делать это вручную неудобно и долго. Поэтому мы сделали автоматический сценарий: он раз в сутки проверяет базу YClients, находит неактивных клиентов, выбирает лучшее время для отправки сообщения через Умную проверку номера МТС Exolve и отправляет им SMS с предложением вернуться.
Requestum: CQRS-библиотека для .NET как альтернатива MediatR

Привет, Хабр! Хочу поделиться библиотекой Requestum, которую написал как открытую альтернативу MediatR.
Новый асинхронный I/O в Zig

Эндрю Келли, создатель и ведущий разработчик языка программирования Zig, недавно рассказал о будущем асинхронного I/O в Zig, его ключевых примитивах, механизмах отмены и тонкости разграничения асинхронности и параллелизма. Он пригласил заинтересованных разработчиков к активному тестированию и формированию будущего интерфейса ввода-вывода Zig.
Это предварительный обзор новых примитивов асинхронного ввода-вывода, которые будут доступны в грядущем Zig 0.16.0, релиз которого ожидается примерно через три-четыре месяца. Есть еще много чего обсудить, но пока это вводная часть к основному API синхронизации, который будет доступен для использования во всем коде Zig.
Для начала, давайте попробуем сохранить простоту и понять основы, а затем постепенно будем добавлять в код все больше асинхронных элементов.
Битрикс, PHP CS Fixer, Rector, PHPStan
В опенсорс-проектах часто можно увидеть использование инструментов для проверки кода: проверяется кодстайл, выполняется статический анализ. Эти инструменты широко распространены, но в проектах на Битриксе они встречаются редко. В этой статье я покажу, как начать использовать такие инструменты в своих проектах на Битриксе.
Green Tea: новый экспериментальный сборщик мусора в Go

Команда Go for Devs подготовила перевод статьи о новом экспериментальном сборщике мусора Green Tea, появившемся в Go 1.25. Он уже используется в Google и показывает снижение затрат CPU на GC до 40%. Разбираемся, почему это не просто оптимизация, а новый уровень эффективности.
По следам CPython. Часть 2. Предконфигурация

Привет, читатель! Меня зовут Александр Щербанюк, и я Python-разработчик. Это вторая статья цикла, который посвящен разбору внутреннего устройства CPython.
В рамках прошлой статьи была настроена IDE и разобраны первые несколько функций CPython и используемые в них структуры. Так, повествование дошло до функции pymain_init из Modules/main.c.
Эта же статья будет посвящена разбору части вышеобозначенной функции, а конкретнее — этапу предконфигурации CPython.
Итак, продолжим изучение внутренностей CPython.
