Код и Капуста
1.67K subscribers
3.15K photos
68 videos
3 files
3.45K links
Авторский канал с интересными ссылками про разработку на Go, Rust, Godot, Flutter, Android, iOS, Aurora. Все ссылки тут https://kodikapusta.ru/

Читать канал в max https://vk.cc/cVOWSP

Для связи @akovardin

Поддержать канал https://boosty.to/kodikapusta
Download Telegram
Stacking workflow

#kod #git

Так получается, что последнее время я работаю в командах, где принято испольщовать или GitFlow, или TBD. И они все немного ебловаты. Точнее, они сконцентрированы на том как релизить, а не как разработчикам разрабатывать.

Я уже давно присматриваюсь к stacking workflow - это как раз больше про то, как команде правильно доносить код до мастера. И, вы не поверите, но GitHub решили напилить и поддержать такой подход у себя. Видимо, надо внедрять

https://kodikapusta.ru/news/973-stacking-workflow

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Атомики

#golang

Автор рассказывает про атомарные операции в Go как более производительная альтернатива мьютексам для lock-free программирования.

В статье объясняется аппаратная основа атомарных операций - инструкции CPU уровня LOCK XADD. Автор показывает как работать с типизированным API, появившемся в Go 1.19, те самые atomic.Int64, atomic.Pointer[T] и тд, и предупреждает о ловушке atomic.Value, который фиксирует тип при первом сохранении.

На практических примерах показаны CAS-циклы для рейт лимитинга и атомарная замена конфигурации на лету без блокировок.

В целом, мьютексы стоит использовать при работе с несколькими взаимозависимыми переменными, а атомарные операции - для изолированных значений

https://kodikapusta.ru/news/974-atomiki

Поддержать проект на boosty: https://boosty.to/kodikapusta
👍31
Учимся на примере uv

#rust

Один из лучих способо учиться прогать - это разбирать хорошие программы с откртытыми исходниками.

В статье подробно разбирается внутреннее устройство uv - чрезвычайно быстрого менеджера пакетов для Python, написанного на Rust. Автор последовательно описывает архитектуру проекта, состоящую из 68 специализированных крейтов, и прослеживает выполнение основных команд.

Особое внимание уделяется двухпоточной архитектуре резолвера, где синхронный поток выполняет алгоритм PubGrub, а асинхронный, с Tokio под капотом, занимается параллельной загрузкой метаданных. Объясняются механизмы глобального кэша на основе content-addressed хэшей, жёсткие ссылки для мгновенной "установки" пакетов, универсальный lockfile, работающий на всех платформах, а еще оптимизации вроде пакетной предвыборки версий.

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

https://kodikapusta.ru/news/975-uchimsia-na-primere-uv

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Analogue Pocket

#fun

Я сегодня покажу вам одну крутую штуку - Analogue Pocket

Это такая портативная консоль, под которую можно колбасить свои ядра. Она совместима с библиотекой из более чем 2780 картриджей для Game Boy, Game Boy Color и Game Boy Advance. Можно сказать, что это Game Boy на максималках, под который еще и прогать можно на Verilog

Кажется, это будет моя следующая железка

https://kodikapusta.ru/news/984-https-analogue-pocket

Поддержать проект на boosty: https://boosty.to/kodikapusta
2
Нетполлер

#golang

Еще одна из цикла про устройство рантайма Go

В этой статье разбирается, как устроен сетевой поллер (netpoller) в Go - та самая магия, которая позволяет писать простой блокирующий код вроде conn.Read(), а под капотом использовать epoll, kqueue и IOCP без блокировки потоков ОС.

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

https://kodikapusta.ru/news/976-netpoller

Поддержать проект на boosty: https://boosty.to/kodikapusta
3
Как полюбить лайфтамы

#rust

Cтатья о том, как в Rust сделать zero-copy страницы для базы данных, чтобы не гонять туда-сюда данные и не грузить процессор лишними копированиями, особенно при высоких нагрузках.

Автор объясняет, что сначала они убрали копирование между диском и буферным пулом с помощью Direct IO (флаг O_DIRECT), а затем принялись за копирования внутри самого движка. Тут началось самое интересное - пришлось плотно работать с понятием lifetimes в Rust, чтобы создавать не копии страниц, а их заимствованные представления.

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

https://kodikapusta.ru/news/981-kak-poliubit-laiftamy

Поддержать проект на boosty: https://boosty.to/kodikapusta
1👍1
Устройство QR-кодов

#fun

В наши дни QR-коды повсюду: на меню в ресторанах, упаковке товаров, надгробиях и даже татуировках. Это разновидность двумерных штрихкодов, изобретённая в Японии в 1990-х годах и выпущенная без патентных ограничений, то есть любой человек может свободно их создавать и использовать.

Но как они работают? Каким образом хранят информацию? Почему они так надёжны?

https://kodikapusta.ru/news/987-ustroistvo-qr-kodov

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥32
Процент покрытия

#golang

Ребята из DoltHub решили наконец-то задуматься о покрытии кода тестами в своем проекте на Go, хотя до этого восемь лет жили без этого и норм.

В Go с версии 1.20 появилась возможность собирать данные о покрытии не только для юнит-тестов, но и для интеграционных - когда ты гоняешь уже собранный бинарник. Они быстро настроили инструменты, сгенерировали красивый HTML-отчет, увидели, что среднее покрытие по базе 49%, и… никому это не зашло. Команда просто забила, потому что база огромная, много мёртвого кода и специфичных ошибок, которые трудно покрыть, а главное - у них и так все работает и куча других проверок корректности. Так что эксперимент признали интересным, но автоматизировать использование отчетов не стали, чтобы не плодить ложные срабатывания, хотя и не исключают, что в будущем натравят на эту задачу ИИ-агентов

Тем не менее, в статье много практических советов по настройке отчетов покрытия и в целом интересно посмотреть на чужой опыт

https://kodikapusta.ru/news/977-protsent-pokrytiia

Поддержать проект на boosty: https://boosty.to/kodikapusta
3
Rust коаны

#rust

Отличный сайт с невероятной мудростью по Rust. Я обожаю thecodelesscode.com, а теперь еще в похожем стиле и коаны про Rust.

Кароч, набирайтесь мудрости

https://kodikapusta.ru/news/982-rust-koans

Поддержать проект на boosty: https://boosty.to/kodikapusta
1🔥1
Как работает shazam

#fun

Вы в кофейне. Звучит песня. Она вертится у вас на языке. Вы достаёте телефон, нажимаете на кнопку - и через несколько секунд приложение говорит вам, что это за песня.

Как телефон записывает всего несколько секунд музыки в шумном помещении и мгновенно сравнивает её с миллионами песен?

Первое, что приходит в голову: телефон распознает мелодию или разбирает слова. Но это не так. На самом деле все работает гораздо умнее

https://kodikapusta.ru/news/988-kak-rabotaet-shazam

Поддержать проект на boosty: https://boosty.to/kodikapusta
2👍2
Контейнеры

#golang

Статья толково объясняет, как работают контейнеры

Автор рассказывает, что Docker - это не магия, а просто удобная обертка над стандартными механизмами Linux: namespaces, чтобы процесс видел только свое "личное пространство" и cgroups, чтобы ограничить ресурсы типа памяти и CPU. Показывает на реальном коде на Go, как самому сварганить подобие контейнера и запустить изолированный bash со своим hostname и PID, который думает, что он главный процесс в системе. Проверяет, что изоляция реально работает, и обещает во второй части добавить ограничения по ресурсам и отрезать контейнер от файловой системы хоста.

Кстати, вторая часть уже у автора на сайте

https://kodikapusta.ru/news/978-konteinery

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Media is too big
VIEW IN TELEGRAM
Кусочек разработки клиента для gopher протокола под playdate

Playdate - супер кайфовая современная ретро-консоль с монохромным экранчиком. Кодить под нее на гошке - одно удовольствие
1🔥3🤩1
Сложно но без unsafe

#rust

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

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

А если заморочиться с хитрыми дженериками и трейтами вроде for<'a>, то можно сделать индексы, которые проверяются ещё на этапе компиляции. В итоге получается свой мини-сборщик мусора с трейсингом, который безопасен и позволяет хранить циклические структуры. Правда, выглядит код при этом так, будто ты перемудрил с архитектурой, но зато без unsafe

https://kodikapusta.ru/news/983-slozhno-no-bez-unsafe

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Glyph

#fun

Протокол Glyph предлагает способ для терминальных эмуляторов отображать насыщенную качественную графику и интерактивные элементы интерфейса путем передачи данных через стандартные escape-последовательности.

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

Уходит эпока кривых терминалов, получается?

https://kodikapusta.ru/news/989-glyph

Поддержать проект на boosty: https://boosty.to/kodikapusta
👍21
Выбираем логер

#golang

На протяжении долгого времени в Go выбор библиотеки логирования был выбором между Logrus, zap, zerolog и несколькими другими, каждая из которых предлагала свой собственный интерфейс, идиомы и представления о том, как должно работать структурированное логирование.

Эта эпоха осталась в прошлом. Уже с версии Go 1.21, пакет log/slog предоставляет стандартный интерфейс, вокруг которого сформировалось единое мнение в экосистеме. Этот сдвиг упрощает выбор но не отменяетего полностью.

Это руководство учитывает современные реалии и освещает, какие библиотеки по-прежнему актуальны, какая у них производительность, чем они отличаются и когда одного лишь slog будет достаточно

https://kodikapusta.ru/news/979-vybiraem-logger

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Сокращатель ссылок

#rust

Небольшая, но практическая статья

Ребята запилили свой сервис для сокращения ссылок на Rust, потому что TinyURL стал жадным до денег, а у автора болтался свободный K3s-кластер.

Все устроено максимально просто: прилетает запрос - проверяем быстрый кэш в памяти, если нет - лезем в Postgres. А статистику по кликам не пишем сразу в базу, а копим в памяти и раз в несколько секунд отправляем пачкой. Никакого Redis, очередей и аналитики, просто бинарник на Rust, Postgres и два пода в кластере. Редирект обрабатывается одной крошечной функцией, где основная магия - что ничего лишнего на горячем пути не происходит. В общем, работает быстро, дешево и без лишних телодвижений.

Читаем, учимся писать свои сервисы

https://kodikapusta.ru/news/986-sokrashchatel-ssylok

Поддержать проект на boosty: https://boosty.to/kodikapusta
3👍2
Вишенки

#lang

Пятница и новый язык программирования.

Сегодня у меня для вас - Черри. Это язык программирования для создания Siri Shortcuts, который компилируется напрямую в Shortcut, который затем можно запускать на ваших устройствах Apple.

Зачем? Да хрен знает

https://kodikapusta.ru/news/953-vishenki

Поддержать проект на boosty: https://boosty.to/kodikapusta
1😁1
go tool task

#golang

Я очень люблю Taskfile и в своих петпроектах не пользуюсь Makefile. Это реально супер удобная замена уродского Makefile, но у старичка есть преймущество - make есть везде.

Но! Теперь для CI стало значительно удобнее использовать Taskfile через go tool task. В статье автор рассказывает как это работает

https://kodikapusta.ru/news/980-go-tool-task

Поддержать проект на boosty: https://boosty.to/kodikapusta
👍41
Rust заимствования в Haskell

#rust #haskell

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

Все это работает через специальный линейный монад BO, который позволяет временно делиться доступом на чтение, что-то там делать с данными, а потом возвращать всё обратно - как в ST, но чище и мощнее.

Авторы даже квиксорт на этом написали, который пашет параллельно без страха и упрека

https://kodikapusta.ru/news/985-rust-zaimstvovaniia-v-haskell

Поддержать проект на boosty: https://boosty.to/kodikapusta
1
Простое профилирование кучи

#golang

Статья от ребят из Coroot. Эти ребята знают толк в профилировании и вьювабилити.

Тут они рассказывают, как вместо подключения pprof к Go-сервисам, чтобы посмотреть, что там с памятью, начали использовать встроенные возможности рантайма. Go сам постоянно собирает профиль аллокаций, просто он либо отключен линкером, если никто не дергает runtime.MemProfile, либо данные есть, но доступа к ним извне нет.

Агент Coroot теперь просто лезет через /proc/<pid>/mem, читает внутреннюю переменную runtime.mbuckets прямо из памяти процесса - и если профилирование выключено, может даже включить его на лету одной записью в память.

Pprof хорош, но для его использования нужно менять приложение. В подходе Coroot ничего не нужно передеплоивать, переконфигурировать, никаких эндпоинтов

https://kodikapusta.ru/news/990-prostoe-profilirovanie-kuchi

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥1
Bevy и сеть

#rust #gamedev

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

В этот раз интересная статья про работу с сетью в играх на Rust. И еще про использование SpacetimeDB - базы, про которую я уже как-то писал. Эта база отлично пододит для игр и не только

Учим Rust через написание игр

https://kodikapusta.ru/news/996-bevy-i-set

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥31😢1