Обновить
64K+

Go *

Компилируемый, многопоточный язык программирования

217,93
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

DBML Diagram для IntelliJ IDEA с офлайн превью и открытым исходным кодом

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели4.2K

Привет! На связи Boost for Java. Развиваем DBML Diagram — open source плагин для IntelliJ IDEA и других совместимых IDE на платформе IntelliJ. Он строит ER-диаграмму рядом с открытым .dbml-файлом: меняете описание таблиц и связей — превью обновляется прямо в редакторе. Построение диаграммы работает локально, без отправки схемы во внешний сервис.

В этой статье покажем возможности версии 0.1.0, пользу работы со схемами прямо в IntelliJ IDEA и устройство плагина. Отдельно расскажем о планах интеграции с dbdiagram.io для публикации локальных изменений в общую схему.

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

Плагин в JetBrains Marketplace · Исходный код на GitHub

Читать далее

Новости

DDNS для российских DNS-хостингов: почему не подошли готовые клиенты и что я написал взамен

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели3.4K

Я проверил популярные DDNS-клиенты и почти не нашёл в них поддержки российских DNS-хостингов. Поэтому запись для домашнего сервера обычно обновляют самописным скриптом на curl, а такой скрипт ломается молча. Я разобрал API нескольких хостингов и написал на Go свой DDNS-демон, который учитывает их особенности.

В статье рассказываю, почему совет перенести зону в Cloudflare подходит российской аудитории с оговорками и что умеют готовые клиенты. Затем разбираю подводные камни API REG.RU, Selectel и Yandex Cloud, о которые спотыкаются самописные скрипты. В конце показываю, как устроен dnspatch и как запустить его в Docker за пару минут.

Читать далее

Продовый REPL: Yaegi поверх composition root

Уровень сложностиСредний
Время на прочтение26 мин
Охват и читатели3.4K

Консоль для прода на Go: отдельный процесс с тем же composition root, read-only по умолчанию и REPL на Yaegi

Читать далее

ч2: Разбор. Как мы закрывали утечку через tun0 в AmneziaVPN

Уровень сложностиСложный
Время на прочтение26 мин
Охват и читатели16K

Приложение, которое вы исключили из VPN на Android, может привязать сокет к tun0, пройти через ваш туннель и узнать адрес сервера. Летом мы взялись закрыть это в AmneziaVPN (issue #2457). Сама проверка в AmneziaWG уместилась в одну строчку цикла, который читает пакеты из tun:

if uidfilter.Supported && !device.tun.uidGate.AllowOutboundPacket(elem.packet, device) { continue }

Вокруг неё набралось полтысячи строк Go и столько же тестов, мост через JNI и три раунда ревью. В статье — почему ядро пропускает такие пакеты, почему «владелец неизвестен» у нас значит отказ, как одно приложение могло остановить весь туннель и какую ошибку мы нашли уже после ревью в собственном мосту. На телефоне с фильтром до сервера доходит 0 попыток обхода из 6, без него все 6. Но улучшать ещё есть что, и разбор мы пишем для двух целей: чтобы другим клиентам было проще закрыть ту же дыру и чтобы собрать критику. Если увидите у нас слабое место, напишите.

Читать далее

Зачем я добавил Go-сервис туда, где его не просили

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели5.9K

Недавно мне дали тестовое задание на проектирование интеграции между 1С и Yandex 360. На первый взгляд задача выглядела достаточно прямолинейно: 1С формирует письмо, дальше его нужно передать в почтовую систему, отправить и получить информацию о результате. Но в исходном ТЗ не было отдельного сервиса на Go. Я добавил его сам.

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

Читать далее

xk6-sip: проверка качества звука в нагрузочных и автоматизированных функциональных тестах VoIP/SIP

Уровень сложностиПростой
Время на прочтение13 мин
Охват и читатели7.6K

Разберём, как в xk6-sip, расширении нагрузочного инструмента k6 для тестирования VoIP/SIP-звонков, устроена проверка качества звука: запись звонка, оценка того, что услышал абонент, по эталону, и как это работает в функциональных тестах и под нагрузкой.

200 OK означает, что АТС соединила звонок, но не означает, что люди слышат друг друга. Исчерпанные порты медиасервера, ошибки NAT, перепутанные медиапотоки, транскодинг на пределе CPU дают звонок с успешной сигнализацией и тишиной, чужим голосом или хрипом в трубке. SIPp и большинство нагрузочных инструментов для телефонии проверяют сигнализацию, а RTP в лучшем случае считают пакетами. Для контакт-центра такой звонок — потерянный клиент, а в отчёте нагрузочного теста он зелёный.

В функциональных тестах телефонии эту проблему обычно решают эталонами: записывают, что должен услышать абонент в каждом кейсе, и сравнивают с записью звонка в CI. Подход рабочий, но эталон на каждый кейс нужно поддерживать, а под нагрузкой его не запустишь. В xk6-sip то же сравнение живёт прямо в скрипте k6 и работает на тысячах звонков.

В статье:

Читать далее

Разбор популярного тестового задания с упором на системный дизайн

Время на прочтение17 мин
Охват и читатели6.8K

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

Читать далее

Guardrails для ИИ-агента на Go: от инструкций к автоматическим проверкам

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели5.3K

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

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

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

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

В статье разберу, какие требования к Go-коду можно закрепить линтерами и тестами: от обработки ошибок до зависимостей между пакетами. Покажу, как убедиться, что проверка обнаруживает нужное нарушение, и что всё равно останется для ревью.

Статья рассчитана на Go-разработчиков, знакомых с тестами, контекстами, каналами и CI. Исходники, конфигурации и команды воспроизведения лежат в репозитории с примерами. Весь вывод команд получен на Go 1.27.1 и golangci-lint 2.13.2. Версии зафиксированы, чтобы у вас получился тот же вывод, что в статье.

Читать далее

Почему fallback между LLM может сломать семантику ответа

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели6.3K

В обычном backend fallback обычно означает: тот же контракт, другой исполнитель. С LLM всё сложнее — резервная модель может вернуть валидный JSON, но изменить смысл результата. Разбираю, почему retry и fallback нужно разделять, как учитывать деградацию качества и когда честная ошибка лучше «успешного» ответа другой модели.

Читать далее

Все (я надеюсь) способы работать с транзакциями в go

Уровень сложностиПростой
Время на прочтение11 мин
Охват и читатели8K

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

db.BeginTx

От «быстрого JSON» к потоковой обработке данных: смена парадигмы в оценке производительности протоколов

Уровень сложностиСложный
Время на прочтение7 мин
Охват и читатели9.6K

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

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

Читать далее

Умная теплица на Raspberry Pi 4. Или сказ про то как проект вырос в полноценный контроллер умного дома. Часть 2

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели11K

В первой части я рассказывал о системе автоматизации теплицы на Raspberry Pi 4. Она собирала показания датчиков и управляла оборудованием. Постепенно захотелось применить её и за пределами теплицы: дома, в мастерской или серверной. Задачи там знакомые — следить за температурой, включать устройства по условию и получать уведомления.

Для этого понадобились новые способы подключения устройств, удалённый доступ и обновления с сохранением настроек. В проекте появились Zigbee-датчики, поддержка Rock Pi, облачный кабинет и уведомления в MAX. Теперь это Geek Automation System — контроллер умного дома, для которого теплица остаётся одним из вариантов применения.

В этой статье покажу, что изменилось, как устроена связь с облаком и зачем на самой плате работает отдельная служба - provision agent

Кто за что отвечает

В системе три основных участника: подключённые устройства, контроллер и облачный сервис.

Устройства — это датчики, розетки и реле. Одни передают показания, другие выполняют команды.

Контроллер — Raspberry Pi или Rock Pi — получает показания и выполняет правила. Например, включает вентиляцию, когда температура поднимается выше заданного порога. На нём хранятся настройки и история измерений, а управлять им можно через страницу в браузере.

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

В облачном кабинете к аккаунту привязывается контроллер целиком. Его датчиками и остальным оборудованием управляет программа на плате.

Читать далее

Доверить сервер ИИ-агенту и не пожалеть: как спать спокойно без SSH

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели11K

Мы всё быстрее движемся к самовосстанавливающейся инфраструктуре. Но когда инцидент всё-таки случается, у инженеров может уйти много времени на сбор информации о состоянии серверов. При SLA 99,99% на простой остаётся около 4 минут в месяц, каждая минута на счету, и не автоматизировать эту часть разбора инцидента — непозволительная роскошь. Технически это можно сделать и сейчас: дать ИИ-агенту SSH и sudo.

Я решил пойти другим путём и собрал Linux MCP daemon (mcpd): сервер, изначально рассчитанный на ИИ-агентов. Вместо обёрток над стандартными утилитами он сам читает состояние системы из ядра и отдаёт его агенту через инструменты — сейчас их 38, и список растёт. Когда нужен root, агент может его запросить, но получит только там, где вы разрешили, и в заданных границах. Отдельным интересным решением получилась утилита linuxctl в стиле kubectl. Под катом устройство, установка, подключение ИИ-агента и права, которые только выглядят безопасными.

Читать далее

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

Какие наши продукты задевает эта CVE? Я продолжил заброшенный Minefield и нашёл, что он читал SBOM задом наперёд

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.9K

Выходит новость о критической уязвимости, и первый вопрос: какие из наших продуктов её тянут и что чинить первым? С 11 сентября 2026 года Cyber Resilience Act требует сообщать об активно эксплуатируемых уязвимостях в течение 24 часов, так что вопрос получил срок.

Под него хорошо подходил Minefield — граф SBOM на roaring bitmaps от BitBom, заархивированный в 2025 году. Я продолжил его под именем Sapper, добавил отчёт с приоритетами по CISA KEV и EPSS и по дороге нашёл, что граф строился задом наперёд, а псевдоверсии Go превращали любую версию в уязвимую. Рассказываю, как это нашлось и как проверить, что исправление действительно исправление.

Читать дальше

xk6-sip: SIP-телефония как код

Уровень сложностиПростой
Время на прочтение17 мин
Охват и читатели11K

На дворе 2026 год. Веб-сервисы тестируют облачные оркестраторы: тысячи виртуальных пользователей поднимаются из пайплайна, метрики падают в Prometheus, деградации ловит алерт до того, как их заметит клиент. А в телефонии, которая до сих пор держит колл-центры, банки, скорую помощь и диспетчерские, релиз АТС часто проверяют так же, как двадцать лет назад: тестировщик берёт два телефона и звонит сам себе. Нагрузку дают SIPp со сценариями в XML, где каждая сторона звонка — отдельный процесс, а проверка медиа — ещё один непростой кусок сценария.

xk6-sip — моя попытка закрыть этот разрыв. Это расширение k6/x/sip для Grafana k6, в котором звонок описывается кодом на JavaScript: абоненты регистрируются, звонят друг другу через тестируемую АТС, отвечают, переводят, ставят на удержание, передают DTMF и проверяют, что слышат друг друга. Один и тот же скрипт работает как функциональный тест из одного звонка и как нагрузочный тест на тысячи одновременных разговоров.

По сути это инфраструктурный сдвиг: SIP-коммуникации начинают описываться так же, как Infrastructure as Code. Сценарий лежит в Git, проходит ревью, запускается из CI и оставляет после себя метрики.

Расширение подано в официальный реестр расширений k6 Grafana Labs и проходит там ревью. Код открыт под Apache-2.0: github.com/Dmitry-Fedotov-Dev/xk6-sip.

Я работал 4 года в телефонии и прошёл путь от стажёра-ручника QA в команде ядра до Performance Engineer продукта. Идея описывать тест действиями абонентов вдохновлена внутренним инструментом, который я написал во время работы в телекоме. Всё остальное — код, нагрузка, медиа, метрики, SIP-стек — написано в xk6-sip заново.

Читать далее

MLow — голосовой кодек звонков WhatsApp *

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели7.4K

Когда вы звоните в WhatsApp, Messenger или Instagram*, ваш голос, скорее всего, сжимает не Opus, а MLow — собственный низкобитрейтный кодек Meta*, созданный для плохих сетей и слабых смартфонов. Компания рассказала о нём в инженерном блоге, но ни спецификации, ни исходников, ни описания формата кадра нет.

Эта статья о том, как мы восстановили кодек по его поведению и написали совместимую реализацию на Go без cgo и сторонних зависимостей. Сначала мы дважды ошиблись в том, что это вообще за кодек. Ещё были «электронные пищалки» в эфире, и под конец пришлось честно признать, что чужой код лучше нашего.

Читать далее

Ограничение скорости скачивания пользователей в Xray-core

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели8.8K

Кто тут любит коммерческие прокси-сервисы? Я не вижу ваши руки? Да, я тоже не особый фанат. Но приходится признавать, что как только домашний Xray с вручную вписанными в JSON ключами выходит за пределы узкого круга непосредственных родственников, приходится разбираться в том же спектре проблем: гео-блоки со стороны сервисов, маршрутизация, слив и слишком обширное использование подписки, из-за чего пользователи начинают мешать друг-другу, а машины блокируются по превышению квоты. Знакомая ситуация? Жду вас под катом.

Читать далее

Из ClickOps в код: как я оживил Terraformer и научил его говорить с провайдерами напрямую

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели5.1K

Почти у каждой команды есть «накликанная» инфраструктура. Кто-то когда-то создал VPC в консоли, кто-то вручную настроил бакет, DNS-зоны живут отдельно, а в Terraform описана только половина. Чтобы взять это под управление, нужно две вещи: найти всё, что существует, и написать для каждого объекта конфиг, который совпадает с реальностью.

Для этого был Terraformer от Waze SRE: 14,5 тысячи звёзд на GitHub, около 800 тысяч скачиваний релизов, 44 провайдера, от AWS и Google Cloud до Datadog, Cloudflare и Yandex Cloud. Одна команда, и у вас папка с .tf-файлами. 16 марта 2026 года репозиторий перевели в архив.

Полноценной замены не появилось. Есть форк chenrui333/terraformer, который продолжает выпускать релизы, но он сохранил прежний подход: HCL плюс tfstate. Встроенные import-блоки генерируют конфиг, но ID каждого ресурса нужно найти самому. В Terraform 1.14 появилась команда query для поиска ресурсов, но она есть только в Terraform и работает только с провайдерами, которые это поддерживают. В OpenTofu поиска нет вовсе: запрос висит со статусом «решение не принято».

Я взялся продолжить проект. Получился Unclick (GitHub, Apache-2.0). В статье расскажу, почему Terraformer перестал работать с современными провайдерами, как устроен протокол плагинов Terraform изнутри и как сделать так, чтобы сгенерированный конфиг проходил plan без ручной правки.

Как это устроено

Как перестать искать ошибки в YAML глазами: пишем валидатор для Go

Время на прочтение6 мин
Охват и читатели8.1K

Пользователи EasyP присылали нам в чат YAML-конфиги, а мы глазами искали в них лишний пробел, неправильную вложенность или опечатку в ключе. В какой-то момент мне это надоело, и я написал go-yamlvalidator. В статье рассказываю, как из простой проверки YAML выросла библиотека со своими схемами, custom validators и полноценной поддержкой JSON Schema.

Читать далее

vet молчит, -race молчит: горутины, которые переживают CI

Уровень сложностиСложный
Время на прочтение7 мин
Охват и читатели6.4K

В прошлой статье я писал, что компилятор — первый ревьюер кода, который написал агент. У этой идеи есть слепое пятно, и я в него наступил: конкурентность. Компилятор проверяет типы, go vet проверяет десяток известных шаблонов, -race ловит гонки данных. А горутина, которая никогда не завершится, — это не ошибка типов и не гонка. Код, который не слышит отмену, — тоже.

Читать далее
1
23 ...