🔥 База по ИИ-агентам от научного сотрудника Сколтеха и НИУ ВШЭ
Знакомьтесь, Екатерина Трофимова. Кандидат компьютерных наук, ресерчер в Центре ИИ Сколтеха и лаборатории LAMBDA. Она объединяет глубокую академическую экспертизу и практику: знает, как ИИ-системы устроены «под капотом» и как встроить их в реальные проекты (в т.ч. для Т-банка).
Мы попросили Екатерину собрать список мастхев материалов для тех, кто хочет проектировать агентов в проде. Сохраняйте список.
🛠 Стек и фреймворки:
DSPy — алгоритмическая оптимизация промптов (вместо ручного подбора слов).
Semantic Kernel и LangMem — инструменты для управления сессионной и долгосрочной памятью.
MCP (Model Context Protocol) — новый стандарт от Anthropic для подключения агентов к вашим БД и локальным файлам.
📖 Документация, которую нужно знать:
Anthropic Prompt Caching — как кэшировать контекст и радикально резать косты на API.
OpenAI Agents SDK / Cookbook — лучшие практики работы с памятью.
Augment — платформа для оптимизации работы ИИ-агентов и контроля токенов.
🔬 Хардкорные статьи и препринты (на выходные):
Lost in the Middle — почему LLM «слепнут» на длинных текстах и забывают середину контекста.
How Do Coding Agents Spend Your Money? — куда улетает бюджет при работе автономных кодинг-агентов.
MemGPT — архитектура операционной системы для LLM с иллюзией бесконечной памяти.
InjecAgent / AgentSentry — всё о безопасности и защите агентов от инъекций в промпты.
Екатерина Трофимова — один из ключевых экспертов нашего курса AgentOps. На своих лекциях она детально разбирает, как проектировать инструменты для агентов, как агент принимает решения о вызове инструментов и какие ограничения возникают в реальном проде
🎁 Акция в честь старта продаж!
Прямо сейчас при покупке Инженерного трека вы получаете полный доступ к материалам курса «Разработка ИИ-агентов» в подарок.
👉 Забрать 2 курса по цене 1 и начать обучение
Знакомьтесь, Екатерина Трофимова. Кандидат компьютерных наук, ресерчер в Центре ИИ Сколтеха и лаборатории LAMBDA. Она объединяет глубокую академическую экспертизу и практику: знает, как ИИ-системы устроены «под капотом» и как встроить их в реальные проекты (в т.ч. для Т-банка).
Мы попросили Екатерину собрать список мастхев материалов для тех, кто хочет проектировать агентов в проде. Сохраняйте список.
🛠 Стек и фреймворки:
DSPy — алгоритмическая оптимизация промптов (вместо ручного подбора слов).
Semantic Kernel и LangMem — инструменты для управления сессионной и долгосрочной памятью.
MCP (Model Context Protocol) — новый стандарт от Anthropic для подключения агентов к вашим БД и локальным файлам.
📖 Документация, которую нужно знать:
Anthropic Prompt Caching — как кэшировать контекст и радикально резать косты на API.
OpenAI Agents SDK / Cookbook — лучшие практики работы с памятью.
Augment — платформа для оптимизации работы ИИ-агентов и контроля токенов.
🔬 Хардкорные статьи и препринты (на выходные):
Lost in the Middle — почему LLM «слепнут» на длинных текстах и забывают середину контекста.
How Do Coding Agents Spend Your Money? — куда улетает бюджет при работе автономных кодинг-агентов.
MemGPT — архитектура операционной системы для LLM с иллюзией бесконечной памяти.
InjecAgent / AgentSentry — всё о безопасности и защите агентов от инъекций в промпты.
Екатерина Трофимова — один из ключевых экспертов нашего курса AgentOps. На своих лекциях она детально разбирает, как проектировать инструменты для агентов, как агент принимает решения о вызове инструментов и какие ограничения возникают в реальном проде
🎁 Акция в честь старта продаж!
Прямо сейчас при покупке Инженерного трека вы получаете полный доступ к материалам курса «Разработка ИИ-агентов» в подарок.
👉 Забрать 2 курса по цене 1 и начать обучение
🥱9❤1
Неделя спокойная, без громких новостей.
— Попросить ИИ улучшить резюме это не стратегия
— WiFi на ESP32 через TinyGo
— Gitea 1.26.0
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Анализатор
slicesdelete из пакета golang.org/x/tools/go/analysis/passes/modernize находит места в коде, где стоит slices.Delete применить вместо ручного append.Что было раньше
Удаление элементов из среза выглядело так:
s = append(s[:i], s[j:]...)
Работает, но неочевидно. Нужно держать в голове, что именно здесь происходит, и при быстром чтении легко пропустить.
Что предлагает анализатор:
s = slices.Delete(s, i, j)
Тот же результат, но намерение читается сразу: удалить элементы с индекса
i по j.Важный нюанс
slices.Delete не просто сокращает длину среза. Она зануляет элементы между новой и старой длиной. Это защита от утечки памяти: старый append-вариант оставлял ссылки на объекты в «хвосте» среза, и сборщик мусора не мог их освободить. Именно поэтому анализатор отключён по умолчанию.Когда включать
Если в коде нет намеренной зависимости от того, что элементы за
len остаются в памяти включайте анализатор и применяйте замену. Для большинства случаев это просто улучшение читаемости и безопасности.Включить анализатор можно через флаг при запуске:
go vet -modernize.slicesdelete ./...
или в конфигурации
golangci-lint, если используете его в проекте.📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
🛠 Инструментарий для работы с WebAssembly
Если вы работаете с WebAssembly и пишете на Go, раньше приходилось тянуть зависимости на C++ (
Что это
В основе лежит пакет
Установка:
Скомпилировать WAT в WASM можно одной командой:
Пример работы через API
Парсим WAT-модуль и анализируем инструкции:
Функции модуля хранятся в
Тестирование
Проект прошёл официальный тест-сьют WebAssembly — почти 200 тысяч строк WAT-файлов с описанием ожидаемого поведения. Бинарный вывод
➡️ Источник | Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
Если вы работаете с WebAssembly и пишете на Go, раньше приходилось тянуть зависимости на C++ (
wabt) или Rust (wasm-tools). Теперь есть нативная альтернатива.Что это
watgo это либа для работы с WebAssembly на чистом Go, без внешних зависимостей. Умеет парсить текстовый формат WebAssembly, валидировать его и компилировать в бинарный WASM и декодировать WASM обратно в структурное представление.В основе лежит пакет
wasmir — семантическое представление WASM-модуля, с которым удобно работать программно.Установка:
go install github.com/eliben/watgo/cmd/watgo@latest
Скомпилировать WAT в WASM можно одной командой:
watgo parse stack.wat -o stack.wasm
Пример работы через API
Парсим WAT-модуль и анализируем инструкции:
m, err := watgo.ParseWAT([]byte(wasmText))
if err != nil {
panic(err)
}
for _, fn := range m.Funcs {
for _, instr := range fn.Body {
switch instr.Kind {
case wasmir.InstrLocalGet:
// обработка
case wasmir.InstrI32Add:
// обработка
}
}
}
Функции модуля хранятся в
m.Funcs, каждая содержит плоский список инструкций fn.Body. Имена и типы при парсинге резолвятся в числовые индексы — так же, как это устроено в бинарном формате WASM.Тестирование
Проект прошёл официальный тест-сьют WebAssembly — почти 200 тысяч строк WAT-файлов с описанием ожидаемого поведения. Бинарный вывод
watgo прогоняется через Node.js и сверяется со спецификацией.📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
HeadHunter официально анонсировал 4-шаговый план по борьбе с фродом в резюме. Первые шаги уже сделаны в 2025-м — тестовые баны и привязка Госуслуг.
В 2026-м добавляется сверка с электронной трудовой книжкой. Несовпадение дат и аккаунт летит в бан без возможности восстановления.
📍 Навигация: Вакансии • Задачи • Собесы
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15👍11😁5🔥3🌚3
🗓️ Уже через пару часов стартует вебинар!
Тема:
Ждем вас сегодня в 19:00 по московскому времени. Не пропустите начало, будет много практики!
👉 Успей занять место
Тема:
Как эффективно управлять контекстным окном LLM в мультиагентных системах и не сливать бюджет на токены
Ждем вас сегодня в 19:00 по московскому времени. Не пропустите начало, будет много практики!
👉 Успей занять место
Coroot выпустили zero-config heap-профилирование для Go. Агент читает профили прямо из памяти работающего процесса через
/proc/<pid>/mem, не трогая сам процесс и не требуя от него ничего.Раньше, чтобы получить heap-профиль Go-сервиса, нужно было подключить
net/http/pprof, поднять эндпоинт, настроить скрейпинг. Если сервис чужой или деплой нежелателен, то вы просто не получали данных. Coroot решил эту проблему на уровне ноды.Механика такая: Go-рантайм уже собирает heap-профили внутри себя через
runtime.MemProfile(). Данные живут в глобальной переменной runtime.mbuckets. Coroot находит адрес этой переменной в символьной таблице бинаря, читает связный список бакетов и конвертирует всё в pprof-формат.Два нетривиальных момента, которые пришлось решить:
Stripped-бинари. Бинарь собран с
-ldflags="-s" и символьная таблица отсутствует и найти mbuckets невозможно. Такие процессы пропускаются.Линкер отключает профилирование. Если в бинаре нет импорта
runtime/pprof или net/http/pprof, линкер выставляет флаг disableMemoryProfiling и рантайм устанавливает MemProfileRate = 0. Profiling не работает вообще. Coroot умеет это обнаружить и записать дефолтное значение обратно через тот же /proc/<pid>/mem:--go-heap-profiler=disabled # выключено
--go-heap-profiler=enabled # по умолчанию, только пассивное чтение
--go-heap-profiler=force # записывает MemProfileRate если он равен нулю
Как это выглядит в деле
Команда показала два демо-сценария на сервисе
product-catalog.Первый: включили GC-давление. Каждый запрос прогонял маршаллинг/анмаршаллинг данных десятки раз и строил ненужные структуры суммарно на ~2 МБ. Латентность
api-gateway выросла с 0.16s до 3.76s. CPU-профиль показал gcBgMarkWorker — GC грузит CPU, но не понятно откуда. Heap-профиль сразу указал на main.inefficientEnrichProducts с JSON-энкодерами и аллокациями в цикле.Второй: включили утечку памяти. Каждый запрос добавлял данные в глобальный срез без удаления. Память росла быстро. RCA-движок Coroot сравнил heap-профиль во время инцидента с профилем до него и выдал дифф:
main.appendToProductCache отвечает за 99.6% новых аллокаций. Не «что-то растёт», а конкретная функция.Что добавилось в метрики
Поскольку агент уже считает дельты аллокаций по бакетам, два новых счётчика появились бесплатно:
container_go_alloc_bytes_total # байты аллоцированные за период
container_go_alloc_objects_total # объекты аллоцированные за период
Heap-профилирование теперь работает для любого Go-процесса на ноде без изменений в коде, без pprof-эндпоинтов, без рестарта. Особенно полезно SRE-командам, которые обслуживают сервисы, написанные другими.
Кроме профилирования без единой строчки, можно сделать себе агента, который будет писать остальные строчки кода. Свободные места можно посчитать на пальцах одной руки 👉 Регистрация здесь
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤3👍2👏1🥱1
20 мая 2026 года в 23:59 по восточному времени ветка Go закрывается на заморозку перед релизом 1.27.
Среди изменений, которые планируется включить в Go 1.27, уже известно несколько вещей.
Детектор утечек горутин
goroutineleak, который в Go 1.26 был экспериментальным, должен стать включённым по умолчанию. Флаг
GOEXPERIMENT=nogreenteagc для отката к старому сборщику мусора уберут — Green Tea GC теперь единственный вариант. Минимальная версия macOS поднимается до 13 Ventura.
Также планируется поддержка Unicode 17 и переработка
strconv.FormatFloat и strconv.ParseFloat.📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21❤3🔥3
Каждый Go-разработчик рано или поздно сталкивается с одним и тем же: открываешь файл, а там импорты в случайном порядке, часть из них давно не используется, а нужного пакета нет вовсе.
gofmt форматирует код, но до импортов ему дела нет.goimports это расширенная версия gofmt, которая наводит порядок в блоке import автоматически.Что он делает
goimports берёт на себя три вещи:1. Сортирует импорты по алфавиту.
2. Удаляет импорты, которые больше не используются.
3. Добавляет недостающие пакеты, если понимает, что они нужны.
Как установить и запустить
Установка:
go install golang.org/x/tools/cmd/goimports@latest
После установки запускаем на нужном файле:
goimports -w main.go
Флаг
-w записывает изменения прямо в файл. Без него инструмент просто выведет результат в консоль.Важный момент
goimports не всегда точно определяет, каких пакетов не хватает. Особенно когда одно имя соответствует нескольким пакетам, например errors из стандартной библиотеки и сторонние пакеты с тем же именем. Поэтому добавлять импорты вручную по-прежнему надёжнее. А вот удаление лишних и сортировку можно смело доверить инструменту.📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4
Вот сколько общаюсь с разработчиками, постоянно слышу убеждение, что есть какой-то правильный способ писать софт. Все ищут секретную архитектуру, вылизывают паттерны, чтобы хоба и тимлид заплакал от счастья от твоего идеального кода.
но, я собрал 4 привычки адептов «чистого кода», (которые обычно все практикуют)
• Бесконечный рефакторинг рабочего кода.
Кажется, что так ты делаешь продукт лучше. Итог: жестко падаешь в перфекционизм. Переписываешь функцию по три раза, а бизнес ждет релиз. Закрываешь вкладку и в голове абсолютная пустота, время потрачено, а новых фичей ноль.
• Упарывание в сложную архитектуру
Сеньоры на ютубе обещают золотые горы, если внедрить микросервисы куда угодно. Итог: получаешь красивый overengineering-проект для мамы и 0 запущенных продуктов в срок, пока конкуренты клепают MVP на коленке.
• Душные споры на ревью
Неплохо, но как итог: ты пишешь полотна текста и тратишь часы на поиск глупой придирки к стилю, потому что банально фокус сместился с реальной задачи на эго.
• Ручная микро-оптимизация
Классика для тех, кто любит алгоритмы из универа. Итог: убиваешь дни жизни и выжимаешь миллисекунды, хотя бизнесу нужен был просто грязный, но рабочий скрипт еще вчера.
Проблема в том, что ни один из этих путей не дает самого главного - скорости и проверки гипотез. Реальному рынку плевать на твой идеальный код за 3 дня. Бизнес предпочтет код от ИИ-агента за 5 минут, который уже завтра начнет приносить деньги.
Хочешь обкатанный на нас лично и 100х учениках метод, как перестать кодить руками и начать делегировать задачи автономным системам?
P. S. Если интересно еще что-нибудь почитать от меня, то заходите в «Азбуку Айтишника», там я рассказываю об айти-базе, также у меня там есть бесплатный гайд на 15 глав по ии-агентам
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5❤4🤔1
Стажер Go-разработчик — гибрид в Нижнем Новгороде
Разработчик Go (Ozon Банк) — от 365 000 ₽ на удалёнку по Москве
Middle+ / Senior Golang-разработчик (LLM/AI/Analytics) — до 420 000 ₽ и снова удалёнка по Москве
#GoWork
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🐹 Дружеское напоминание
Всегда вызывайте wg.Add() до запуска горутины, а не внутри неё:
Если добавить счётчик внутри горутины,
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
Всегда вызывайте wg.Add() до запуска горутины, а не внутри неё:
// Гонка
go func() {
wg.Add(1)
defer wg.Done()
}()
wg.Wait()
// Всё чисто
wg.Add(1)
go func() {
defer wg.Done()
}()
wg.Wait()
Если добавить счётчик внутри горутины,
wg.Wait() может отработать раньше, чем горутина успеет инкрементировать счётчик. Программа завершиться, а горутина так и не началась.📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🥱9❤3😁1😢1
🧑💻 Валидация данных в Go
Валидация — одна из тех вещей, где легко утонуть в шаблонном коде. Отдельные функции на каждый тип, разбросанные проверки по всему проекту, непонятно где и что смотреть при баге.
Идея
Определяем интерфейс
Вместо сырой
Пример с реальным типом
Допустим, у нас есть запрос на регистрацию периодической задачи:
Правила простые: имя обязательно, функция не может быть
Функция `Check` вместо прямого вызова `Validate`
Использование выглядит так:
Если передать неполный запрос, получим понятное сообщение:
Где размещать валидацию
В проектах с архитектурой controller/service/repository валидация живёт на уровне сервиса. Сервис проверяет всё, что к нему приходит — будь то HTTP-запрос, gRPC или stdin.
Удобно держать
Подход работает за счёт трёх вещей: единый интерфейс
➡️ Оригинал
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoDeep
Валидация — одна из тех вещей, где легко утонуть в шаблонном коде. Отдельные функции на каждый тип, разбросанные проверки по всему проекту, непонятно где и что смотреть при баге.
Идея
Определяем интерфейс
Validator. Любой тип, который его реализует, умеет сам себя проверять:type Validator interface {
Validate() map[string]string
}Вместо сырой
map[string]string удобнее завести отдельный тип Problems:type Problems map[string]string
func (p Problems) Add(field, msg string) {
p[field] = msg
}
func (p Problems) String() string {
if len(p) == 0 {
return ""
}
msgs := make([]string, 0, len(p))
for field, msg := range p {
msgs = append(msgs, fmt.Sprintf("%s: %s", field, msg))
}
return strings.Join(msgs, "; ")
}
Пример с реальным типом
Допустим, у нас есть запрос на регистрацию периодической задачи:
type TaskCreateRequest struct {
Name string
Run func(ctx context.Context) error
Interval time.Duration
Deadline time.Duration
}Правила простые: имя обязательно, функция не может быть
nil, интервал и дедлайн больше нуля, дедлайн меньше интервала. Реализуем Validate прямо на этом типе:func (r *TaskCreateRequest) Validate() validation.Problems {
problems := make(validation.Problems)
if r.Name == "" {
problems.Add("Name", "is required")
}
if r.Run == nil {
problems.Add("Run", "is required")
}
if r.Interval <= 0 {
problems.Add("Interval", "must be greater than 0")
}
if r.Deadline <= 0 {
problems.Add("Deadline", "must be greater than 0")
}
if r.Deadline >= r.Interval {
problems.Add("Deadline", "must be less than Interval")
}
return problems
}Функция `Check` вместо прямого вызова `Validate`
validation.Problems не реализует интерфейс error, поэтому вызывающий код не должен знать об этом типе. Для этого есть функция Check:func Check(v Validator) error {
if v == nil {
return errors.New("value is nil, cannot validate")
}
problems := v.Validate()
if len(problems) == 0 {
return nil
}
return fmt.Errorf("validation failed for %s: %s",
typeName(v),
problems.String(),
)
}Использование выглядит так:
func RegisterTask(req *TaskCreateRequest) error {
if err := validation.Check(req); err != nil {
return err
}
// ...
}Если передать неполный запрос, получим понятное сообщение:
validation failed for TaskCreateRequest: Deadline: must be greater than 0; Name: is required
Где размещать валидацию
В проектах с архитектурой controller/service/repository валидация живёт на уровне сервиса. Сервис проверяет всё, что к нему приходит — будь то HTTP-запрос, gRPC или stdin.
Удобно держать
Validate рядом с определением типа. Когда что-то идёт не так — плохие данные прошли до базы или хорошие данные были отклонены — сразу понятно, куда смотреть.Подход работает за счёт трёх вещей: единый интерфейс
Validator, тип Problems для читаемых ошибок и функция Check, которая возвращает стандартный error. Валидация остаётся рядом с типом, код не размазывается по проекту, и добавить новую проверку дело одной строки.📍 Навигация: Вакансии • Задачи • Собесы
#GoDeep
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤3🔥3
CORS это тема, где легко допустить ошибку в конфигурации и не заметить этого. Разрешить все origins через
*, забыть проверить preflight, или написать паттерн, который пропускает лишнее. Библиотека jub0bs/cors построена так, чтобы минимизировать такие сценарии.Что это такое
jub0bs/cors — мидлвара для стандартного net/http, которая реализует CORS-протокол строго по спецификации Fetch standard. Автор позиционирует её как более безопасную альтернативу популярной rs/cors: API спроектирован так, что небезопасные конфигурации просто не дают себя создать.Как это работает
Создаём мидлвару через
cors.NewMiddleware, передаём конфиг, оборачиваем нужный ServeMux:package main
import (
"io"
"log"
"net/http"
"github.com/jub0bs/cors"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /hello", handleHello) // CORS здесь не настроен
corsMw, err := cors.NewMiddleware(cors.Config{
Origins: []string{"https://example.com"},
Methods: []string{http.MethodGet, http.MethodPost},
RequestHeaders: []string{"Authorization"},
})
if err != nil {
log.Fatal(err) // плохая конфигурация — ошибка сразу, не в рантайме
}
corsMw.SetDebug(true) // включить debug-режим при разработке
api := http.NewServeMux()
api.HandleFunc("GET /users", handleUsersGet)
api.HandleFunc("POST /users", handleUsersPost)
mux.Handle("/api/", http.StripPrefix("/api", corsMw.Wrap(api)))
if err := http.ListenAndServe(":8080", mux); err != http.ErrServerClosed {
log.Fatal(err)
}
}
Маршрут
/hello не попадает под CORS — мы явно применяем мидлвару только к /api/. Это позволяет настраивать CORS точечно, а не на всё приложение сразу.Что выделяет библиотеку
Валидация конфига происходит при старте. Если что-то не так —
NewMiddleware возвращает ошибку сразу, не в момент обработки запроса. Никаких сюрпризов в продакшне.Есть debug-режим: при включённом
SetDebug(true) мидлвара добавляет в ответ заголовки с объяснением, почему preflight провалился. Это удобно при разработке и легко отключается в продакшне.Мидлвару можно перенастраивать на лету через метод
Reconfigure без перезапуска сервера. Это потокобезопасно.Ошибки конфигурации можно обрабатывать программно через пакет
cfgerrors — например, для формирования ответа в формате RFC 9457 (Problem Details).По бенчмаркам автора библиотека быстрее
rs/cors, хотя для большинства проектов это не принципиально.Чего библиотека не умеет
Она намеренно ограничена. Нельзя задать произвольный паттерн для origins — только конкретные значения из заранее определённого набора форматов. Нельзя логировать каждый запрос через мидлвару. Нельзя менять статус-код preflight-ответа (всегда 204). Автор объясняет эти ограничения соображениями безопасности и соответствия спецификации.
Строгий по умолчанию, с валидацией на старте, debug-режимом и возможностью перенастройки без рестарта.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥2
Многие думают, что это просто линтер или code style. Но причина куда глубже и она спрятана в самом сердце компилятора, на уровне, до которого добираются немногие.
// Так написать не получится — будет ошибка компиляции
func foo()
{
fmt.Println("hello")
}
Подсказка:
Ответ:
📍 Навигация: Вакансии • Задачи • Собесы
#ReadySetGo
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱5❤3👍2
🛠 CLI для PostgreSQL с автодополнением
Стандартный
Как подключиться
Несколько вариантов на выбор:
Установка:
Конфигурация
При первом запуске создаётся конфиг по пути
Стоит ли использовать вместо pgcli
В планах стриминг результатов для больших таблиц, экспорт в CSV, Excel и SQL, просмотр таблиц через браузер.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction
Стандартный
psql работает, но не помогает. Нет подсветки синтаксиса, нет автодополнения ключевых слов, нет нормальной истории команд. Когда пишешь запросы вручную по памяти, то это замедляет работу.pgxcli это интерактивный CLI для PostgreSQL, написанный на Go. Он добавляет подсветку SQL прямо в терминале, автодополняет ключевые слова и команды, сохраняет историю сессий и поддерживает стандартные команды PostgreSQL: \d, \l, \dt, \q.Как подключиться
Несколько вариантов на выбор:
# Позиционные аргументы
pgxcli mydb myuser
# Флаги
pgxcli --host localhost --port 5432 --user postgres --dbname postgres
# URI
pgxcli postgres://user:password@localhost:5432/dbname
# Интерактивная форма подключения
pgxcli -i
Установка:
go install github.com/balaji01-4d/pgxcli/cmd/pgxcli@latest
Конфигурация
При первом запуске создаётся конфиг по пути
~/.config/pgxcli/config.toml. Там можно настроить стиль промпта и цветовую схему.Стоит ли использовать вместо pgcli
pgxcli пока молодой проект, версия v0.1.0 вышла в конце апреля 2026 года. Преимущество одно — это единый бинарник без внешних зависимостей с быстрым стартом.В планах стриминг результатов для больших таблиц, экспорт в CSV, Excel и SQL, просмотр таблиц через браузер.
📍 Навигация: Вакансии • Задачи • Собесы
#GoToProduction
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8
🖇 Новый пакет для поддержки JIT-компиляторов и встроенных VM
В трекере Go появился proposal #78189. Он предлагает добавить стандартный пакет
В чём проблема
Go компилирует код заранее. Стек-анвайндер рантайма устроен так, что знает только о функциях, зарегистрированных в
Если на стеке оказывается счётчик команд из динамически сгенерированного кода — JIT-компилятора, WASM-рантайма или встроенной VM — рантайм падает с фатальной ошибкой:
Это затрагивает любую программу, которая встраивает JIT, например, база данных компилирует SQL в нативный код, хостит WASM, использует FFI с трамплинами или встраивает скриптовые VM вроде Lua.
Единственный обходной путь сегодня — не вызывать Go-функции из динамического кода вообще, либо использовать промежуточные C-фреймы через
Что предлагают
Новый пакет
Три режима анвайндинга:
Для кооперации со шедулером — функция
Как это работает внутри
Реестр регионов построен на copy-on-write с атомарным свапом указателя. Анвайндер получает доступ к нему без блокировок. Патчи в
Горутина остаётся в состоянии
Статус
Proposal открыт в марте 2026 года. Реализация около 500 строк кода, 15 тестов, трамплины для всех 13 Linux-архитектур. Проверена в продакшне в движке базы данных MemCP.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoLive
В трекере Go появился proposal #78189. Он предлагает добавить стандартный пакет
runtime/jit, который позволит Go-рантайму корректно работать с динамически генерируемым кодом.В чём проблема
Go компилирует код заранее. Стек-анвайндер рантайма устроен так, что знает только о функциях, зарегистрированных в
moduledata на этапе линковки. Если на стеке оказывается счётчик команд из динамически сгенерированного кода — JIT-компилятора, WASM-рантайма или встроенной VM — рантайм падает с фатальной ошибкой:
runtime: unexpected return pc for somefunc called from 0x7f4a12340010
fatal error: unknown caller pc
Это затрагивает любую программу, которая встраивает JIT, например, база данных компилирует SQL в нативный код, хостит WASM, использует FFI с трамплинами или встраивает скриптовые VM вроде Lua.
Единственный обходной путь сегодня — не вызывать Go-функции из динамического кода вообще, либо использовать промежуточные C-фреймы через
cgo, что добавляет около 40 наносекунд накладных расходов и требует cgo-тулчейна.Что предлагают
Новый пакет
runtime/jit с минимальным API. Ключевые части:Region — структура, описывающая регион исполняемой памяти. Содержит колбэки для анвайндинга (Next), описания фреймов в трейсбеке (Describe) и сканирования корней GC (ScanStack).Три режима анвайндинга:
UnwindStop — трейсбек обрывается на JIT-фреймеUnwindSkip — рантайм пропускает пользовательские фреймы и продолжаетUnwindDeclare — пропускает и описывает фреймы в трейсбеке.handle := jit.Register(jit.Region{
Lo: uintptr(codeStart),
Hi: uintptr(codeEnd),
Unwind: jit.UnwindDeclare,
Next: myUnwindNext,
Describe: myDescribe,
ScanStack: myScanStack,
})
defer handle.Unregister()Для кооперации со шедулером — функция
Preempt(). JIT-код вызывает её в точках безопасности (заголовки циклов, входы в функции) и возвращает управление Go, если шедулер или GC запросили остановку.Как это работает внутри
Реестр регионов построен на copy-on-write с атомарным свапом указателя. Анвайндер получает доступ к нему без блокировок. Патчи в
traceback.go проверяют пользовательские регионы перед тем, как бросить ошибку на неизвестный счётчик команд. GC получает хук в markroot() для вызова ScanStack.Горутина остаётся в состоянии
_Grunning пока выполняется JIT-код — никакого переключения состояний, никакого освобождения. Это принципиальное отличие от cgocall, который обращается с чужим кодом как с чёрным ящиком.Статус
Proposal открыт в марте 2026 года. Реализация около 500 строк кода, 15 тестов, трамплины для всех 13 Linux-архитектур. Проверена в продакшне в движке базы данных MemCP.
📍 Навигация: Вакансии • Задачи • Собесы
#GoLive
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3