ВведениеПривет, Хабр! Сегодня рассмотрим тему gRPC и работы с ним в контексте языка программирования Go на примере простейшей реализации аутентификации. Полный пример вы можете найти в архивном репозитории github.gRPC является современным фреймворком, разработанным Google для связи между программными сервисами. RPC - это тип связи, который позволяет приложениям взаимодействовать друг с другом по сети. Он позволяет вызывать процедуры одного приложения из другого, что обеспечивает большую масштаб…
Очередная статья про то, как AI упрощает жизнь разработчикам, и параллельно отбирает у него куски работы, которые ещё недавно казались «только руками и с опытом». Долго можно было отмахиваться: «ну нет, это игрушка». Сейчас уже сложнее: случилось то, что отрицали. Описал задачу, получил рабочий код, осталось проверить на стенде и не накосячить в проде.Cursor использую постоянно, но история не про «AI всё сделал за меня» (хотя в целом сделал но не с первого раза). Задачи от бизнеса не было: три …
Представьте пользователя, который подписан на несколько сотен тегов. Каждый раз, когда он открывает приложение, персональная лента должна собраться за десятки миллисекунд. На первый взгляд задача решается обычным SQL-запросом с несколькими JOIN. Мы тоже начали именно с этого подхода.Но когда количество пользователей, подписок и публикаций выросло до миллионов, даже хорошо оптимизированные запросы перестали укладываться в требования по скорости. Тогда мы отказались от сборки ленты «на лету» и на…
Объясню структуры данных через очередь в поликлинике, а потом покажу, где эта аналогия ломается: почему связный список с «вставкой за O(1)» в прикладном Go обычно проигрывает обычному массиву.Спойлер: асимптотика здесь не ошибается. Ошибается вывод, который мы из неё делаем.Статья для тех, кто асимптотику знает, но не проверял её замером.ОчередьСидишь в очереди к врачу. Номерка нет, ты знаешь одно: за кем занимать.Это связный список. У элемента ссылка на следующего, и больше ничего:type patient…
MCP for Juggler on GOВступлениеИИ-агенты уже не просто отвечают на вопросы - они действуют. Они открывают страницы, читают разметку, кликают по кнопкам, заполняют формы и делают скриншоты. А самый быстрорастущий способ дать агенту руки - это Model Context Protocol (MCP), открытый стандарт, который превращает браузер в набор инструментов, вызываемых любым ИИ-клиентом.Браузерная половина задачи в Go уже была решена. Пакет go-https://github.com/yvv4git/go-juggler принёс стек автоматизации Camoufox…
Данная статья берет свое начало из статьи (Покрути это колесо).ВступлениеПосле первой удачной попытки покрутить колёсами, о которой писал в предыдущeй статье, я начал думать о том, какой я хочу видеть свою сборку: из чего собирать, чем управлять, как делиться. И на тему последнего у меня две мысли...План проектаОсновные требования к проектуВозможность собрать ровер из готовых модулей, которые можно найти на известных площадках. Требования в электронике на уровне соединения проводов, чтобы мог с…
Это вторая часть серии про горутины и рантайм Go. В ней три сюжета: стек, который переезжает по памяти как квартирант; вытеснение, которое прилетает сигналом операционной системы; и полный жизненный цикл горутины, который дословно объясняет каждую строку дампа паники. Первая часть рассказывала, почему потоки ОС дорогие и как Go дошел до схемы GMP: она не обязательна, но там завязка всей истории.План серии:Почему потоки ОС не масштабируются и как Go придумал GMPПереезжающий стек, сигнал SIGURG и…
У Box[int] два метода. reflect видит один.type Box[T any] struct{ v T } func (b Box[T]) Value() T { return b.v } func (b Box[T]) Map[U any](f func(T) U) Box[U] { return Box[U]{v: f(b.v)} } go: go1.27rc3 chain: value=42 reflect NumMethod: 1 method: Value func(main.Box[int]) int Метод с собственным тип-параметром, независимым от ресивера, — главное языковое изменение Go 1.27 (пока rc3, ноты в статусе draft, финал обещают в августе). Box[int] теперь превращается в Box[string] прямо в цепочке …
Тема хранения токенов — одна из самых больных в авторизации. Многие, не до конца понимая, как авторизация должна работать, кладут оба токена в cookie или — что ещё хуже — в localStorage. В этой статье мы соберём схему, в которой access‑token живёт в памяти приложения, refresh‑token — в HttpOnly‑cookie, а фронтенд сам восстанавливает сессию после перезагрузки страницы и незаметно обновляет протухший access.Бекенд — на Go, фронтенд — на Vue 3 (Vuex + vue‑router + axios), но концепция так же приме…