Обновить
328.15

Go *

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

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

Разбираем подводные камни, ошибки и лучшие практики при разработке Kubernetes-операторов. Часть 2

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

Привет, на связи Стас Иванкевич, техлид в команде разработки управляющего слоя Platform V DropApp в СберТехе. Мы все так же пилим наш космолет и готовы поделиться с вами новыми полезными рекомендациями и предостеречь от ошибок при разработке операторов.

В первой части мы уже начали обсуждать разработку K8s-операторов. Сегодня поговорим о поведении  Reconcile и конфликтах обновлений. Рассмотрим возможные ошибки и обсудим тонкости, которые помогут их избежать.

Поехали!

Читать далее

Новости

Разбираем net/http на практике. Часть 2.1: POST, файлы и in-memory хранилище

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

Предыдущая статья

Продолжаем создавать сервис анонимных «мертвых ящиков» DeadDrop на чистом Go.

Во второй части (первый подвыпуск) закладываем фундамент: учимся принимать POST-запросы, загружать файлы с проверкой MIME-типа и размера, создаём in-memory хранилище с потокобезопасным доступом через RWMutex. Пишем утилиты для генерации криптостойких ID и паролей. Разбираемся с интерфейсами и готовим архитектуру к дальнейшему развитию.

Без фреймворков, только net/http и стандартная библиотека.

Читать далее

Anthropic и Open AI поддержали мой open source проект Databasus в рамках поддержки OSS проектов

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

За прошедшие две недели я узнал, что сначала Anthropic, а потом Open AI запустили программы поддержки open source проектов: Claude for Open Source и Codex for Open Source. Я подал заявку в обе программы со своим open source проектом и мои заявки одобрили.

Какие были требования, что это даёт и как я буду применять новые инструменты — ниже.

Читать далее

Туннелирование трафика: простое решение на Go

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

Так сложилось, что периодами по несколько дней я нахожусь в двух разных локациях с двумя разными провайдерами. В одной, приходиться "пробивать окно" в штаты в стене на той стороне. Изначально, чтобы обойти ограничения со стороны google/gemini, необходимо выглядеть настоящим нью-йоркцем. Другим провайдером пользуюсь меньше и в основном не для работы, но ситуация с ним печальнее: как у всех, закручено всё, до чего смогли дотянуться. В том числе не могу достучаться до своего сервера по квн.

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

Читать далее

Черная магия unsafe в Go: практические примеры и ошибки использования. Часть 1

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

В стандартной библиотеке Go есть пакет с отпугивающим названием «unsafe». Но он может быть реально полезен! Сегодня поговорим о том, как использовать его надежно и эффективно.

Привет, Хабр! Я — Владимир Балун, основатель balun.courses и it-interview.io. Эта статья будет для удобства разделена на две части. Из них вы узнаете, как можно создавать срезы без дорогостоящей инициализации, научитесь избавляться от Bound Checks и конвертировать строки в срезы и обратно без лишних копирований и аллокаций памяти. 

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

Читать далее

Детекция рейсов карьерных самосвалов методом шаблонной векторизации: архитектура, алгоритмы и инженерный анализ

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

В горнодобывающей промышленности точный учёт рейсов карьерных самосвалов — ключевой фактор управления производительностью. Традиционные системы диспетчеризации (DISPATCH от Modular Mining, Wenco, российская «Карьер») опираются на GPS-зоны: система фиксирует въезд самосвала в зону экскаватора или пункта разгрузки и по факту пересечения геозон формирует рейс. Однако этот подход не улавливает аномалии внутри цикла — простои, заторы, сбои датчиков, затянувшиеся обеды — и не позволяет классифицировать тип рейса по его «форме».

Альтернативный подход реализован в системе «Симуляция и детекция рейсов» — серверно-клиентском приложении (Go + React + PostgreSQL), которое распознаёт рейсы в реальном времени путём шаблонной векторизации телеметрических данных скорости и веса. Вместо привязки к координатам система строит вектор из скользящего окна телеметрии и сравнивает его с заранее сохранёнными эталонными шаблонами через меру сходства (косинусное сходство или нормы L1/L2). Когда степень совпадения превышает порог — рейс считается обнаруженным.

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

Читать далее

Миграция с Polling на Debezium

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

Привет, Хабр! Меня зовут Ибрагим и я бэкенд-разработчик в команде, которая разрабатывает C2C-площадку в Wildberries — раздел, где пользователи могут продавать друг другу товары через объявления. За каждым объявлением и заказом стоит набор данных, который аналитики используют для отслеживания метрик платформы: жизненный цикл объявлений, конверсии, статусы заказов.

Чтобы эти данные попадали в ClickHouse к аналитикам, нам нужна была надёжная синхронизация из PostgreSQL. Долгое время она работала через polling-сервис — и какое-то время нас это устраивало. Но по мере роста платформы проблемы стали проявляться всё чаще: данные терялись, лаг репликации достигал нескольких минут, а нагрузка на базу росла вместе с объёмами.

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

Читать далее

Цифровая капсула времени на чистом Go: почему для вечности не нужны базы данных и фреймворки

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

А что, если современные технологии для большинства вещей избыточны? В проекте «ЭХО» я решил проверить это на практике, создав цифровую капсулу времени для потомков. Цель — позволить людям оставить память о себе (фото и мысли) в максимально простом и «вечном» формате.

Технически это эксперимент по созданию системы на 250 млн анкет без баз данных, фреймворков и лишних слоев — только чистый Go и минималистичный Linux. В этой статье я поделюсь опытом, как заставить обычный ПК работать с такой нагрузкой, используя лишь стандартную библиотеку и файловую систему.

Читать далее

Как защититься от удаления в S3 с помощью Object Lock / WORM

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

Хранение данных в S3 часто воспринимается как нечто простое: загрузили объект, при необходимости обновили или удалили. Но на практике это хранилище обычно используется в сценариях, в которых цена ошибки слишком высока. Вы же хотите случайно удалить или перезаписать бэкапы, логи, артефакты сборки или данные, подпадающие под регуляторные требования. Чтобы защититься от подобных ситуаций, в S3 есть механизм Object Lock.

Всем привет! Меня зовут Клюев Алексей, я старший разработчик S3-совместимого объектного хранилища в Selectel. В этой статье мы разберем, как работает Object Lock, какие способы блокировки объектов он поддерживает, чем отличаются режимы удержания и какие ограничения важно учитывать при работе с ними. В качестве примеров будем использовать язык Go и aws-sdk-go v2.

Читать далее

Решение задачи с собеседования используя технику Sliding Window на Go

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

Sliding Window — одна из самых популярных техник на собеседованиях. Разберём её пошагово на примере задачи Longest Substring Without Repeating Characters и реализуем решение на Go с объяснением каждого шага.

Читать далее

Sing-Box Launcher: как собрать VPN + WireGuard + split-tunneling без JSON-конфигов

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

Многие, наверное, хотели сделать конфигурацию чтобы и рабочие ресурсы через WireGuard, и российские сайты напрямую, и заблокированные — через VLESS, а доступные только из РФ сервисы — через RU-прокси. В статье покажу, как собрать такую схему без единой строчки JSON и почему Sing-Box Launcher постепенно превратился в GUI-оркестратор конфигураций sing-box.

Читать далее

Микросервисная трансформация в Купере. Часть II: Как выносить функциональность

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

Всем привет! С вами Федор Засечкин, и это моя вторая статья из цикла о том, как мы в Купере распиливали монолит. Если хотите максимально погрузиться в контекст, перед чтением этого текста загляните по ссылке:

Микросервисная трансформация в Купере — как это было. Часть I: Начинаем распил монолитов

А в продолжение темы я хочу поговорить о том, с чего начинается вынос функциональности в сервисы. Будут и вопросы чисто технического характера, и организационные — потому что в нашем случае вынос состоял в основном из проектов с кросс-командным взаимодействием и иннерсорсом. Поехали!

Читать далее

Пишем свой TCP-чат на Go: пошаговый гайд на пальцах

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

В этой статье мы напишем простой консольный чат, используя только стандартную библиотеку. Никаких фреймворков и лишних зависимостей — только чистый код и понимание того, как данные передаются по сети. Понимание сокетов — это фундамент для написания высоконагруженных сервисов, микросервисов и понимания того, как работает интернет «под капотом».

Цель — создание простого tcp сервера для обмена сообщениями.

Читать далее

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

Выделение памяти в Go

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

Эта статья посвящена языку программирования Go 1.24, работающему на Linux на архитектуре ARM. Она может не охватывать специфические для других операционных систем (ОС) или аппаратных архитектур детали.

Читать далее

Пусть ваш AI пишет тесты. Имба, о которой не знает ни один вайбкодер

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

Вы попросили ChatGPT добавить скидку 10% на заказы больше $100. Он выдал 40 строк кода. Скидка работает - проверили на заказе в $150, получили $135. Закоммитили.

Чего вы не заметили: модель переписала функцию расчёта цены целиком. Не потому что нужно было. Просто так получилось - LLM не "редактирует" код, он генерирует новый текст на основе вашего промпта и контекста. В процессе он изменил порядок вычисления налога. Заказы меньше $100 теперь считают налог дважды. Товар за $10 стоит $10.80 вместо $10.50. Вы узнаете об этом через три недели, когда клиент напишет в поддержку.

Читать далее

Дженерики в Go: три года спустя

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

Когда в феврале 2022-го вышел Go 1.18 с дженериками, сообщество разделилось на два лагеря. Первые кричали «наконец-то!» и бросились переписывать всё подряд. Вторые — «не нужны были, не нужны и сейчас». Прошло три года. Пыль улеглась. И я хочу поговорить не о том, как написать func Max[T constraints.Ordered](a, b T) T — этому посвящены тысячи туториалов. Я хочу поговорить о том, что реально прижилось, какие паттерны оказались полезными, а где дженерики только мешают.

До 1.18 у нас было два пути: дублировать код под каждый тип или использовать interface{} (а теперь any) с приведением типов в рантайме. Оба такой вот компромисс.

Дженерики предложили писать код один раз так, чтобы он работал с разными типами, и при этом компилятор проверял корректность на этапе сборки.

Читать далее

Как дата саинтист имиджборду писал

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

На дворе конец 2023. Я только что уволился из Яндекса и скучаю по ячану, чуть меньше скучаю по этушке, вообще не скучаю по таскам, дедлайнам, ревью. Чтобы заполнить возникший информационный вакуум, пробую переключиться на реддит, hacker news, пикабу, вышивание крестиком, сканворды, пилатес — не то. Тогда мне в голову приходит гениальная идея: а почему бы не сделать свою имиджборду с авторизацией по корпоративной почте крупных российских компаний? Ячан для всех!

Первая мысль — взять готовый движок и допилить под себя, в открытом доступе уже есть: lynx, vichan, wakaba, kareha, fchannel. Потыкался — ничего не понятно. Как ленивый человек решаю, что надо писать своё.
На тот момент я:

Не понимал разницу между HTTP и HTTPS

Не знал, что такое handler, router, middleware

Считал, что DNS — это какой-то раздел электронной музыки

Думал, что куки и кэш — это одно и то же

Не без труда отличал header от body

Не мог пропатчить kde2 под freebsd

Короче говоря, я был именно тем человеком, который должен был писать проект с нуля. Цель понятна, надо выбрать инструменты. Я неплохо знал питон и c++... поэтому языком разработки выбрал Голанг. Мой опыт с Голангом на тот момент ограничивался прослушанным фоном на х2 ШАДовским курсом. Прослушал я его в автопоездке Москва — Челябинск. Не написал на Го ни одной строчки кода, но суммарно прослушал — именно «прослушал», ибо рассмотреть мелкий шрифт на экране телефона, будучи за рулём, решительно невозможно — около 30 часов материала. Написать свой движок имиджборды - хороший повод попрактиковаться.

Читать далее

Создаём микросервис обработки изображений на Go с gRPC

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

В этой статье мы рассмотрим создание микросервиса обработки изображений на golang с использованием технологии gRPC. Цель статьи - показать как может выглядеть такой сервис и что он может в себя включать.

Читать далее

Когда успешная миграция сломалась, а партиционирование превратилось в cross-cluster move

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

Привет! На связи вновь команда Геосервисов. Как вы помните, в прошлой статье я делился нашим опытом партиционирования и теми выводами, к которым мы пришли. Но на этом история не закончилась. Что же было дальше?

Партиционирование завершилось успешно. VACUUM сократился с 6+ часов до ~20 минут. Запросы ускорились. Мы думали, что всё позади. Через неделю после swap проверили реплику — и обнаружили, что она пуста.

Читать далее

Зачем тестовому фреймворку 17 функций?

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

Если посчитать публичный API Ginkgo, получается внушительный список. Describe, Context, When, It, Specify, By, BeforeEach, AfterEach, BeforeAll, AfterAll, JustBeforeEach, JustAfterEach, BeforeSuite, AfterSuite, SynchronizedBeforeSuite, SynchronizedAfterSuite, DeferCleanup. Семнадцать функций, и это без F- и P-вариантов для focus и pending.

GoConvey проще, но и у него набирается не меньше: Convey, So, ShouldEqual, SkipConvey, FocusConvey, Reset и собственный DSL для assertion-ов.

Какой минимальный API нужен scoped-фреймворку для тестирования?

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