Код и Капуста
Открыть в Telegram
Авторский канал с интересными ссылками про разработку на Go, Rust, Godot, Flutter, Android, iOS, Aurora. Все ссылки тут https://kodikapusta.ru/ Читать канал в max https://vk.cc/cVOWSP Для связи @akovardin Поддержать канал https://boosty.to/kodikapusta
Больше1 671
Подписчики
+324 часа
+47 дней
+4130 день
Архив постов
1 671
gocondense
#tools #golang
Форматтер Go-кода, который сворачивает многострочные конструкции в однострочные там, где они умещаются в лимит (по умолчанию 80 символов), сокращая вертикальный шум без потери читаемости. Трансформации учитывают длину строки, идемпотентны и сохраняют все комментарии: сворачиваются сигнатуры функций, списки аргументов, литералы слайсов/массивов/структур/карт, цепочки выражений и селекторов, убираются одиночные группы объявлений (import, const, var, type) из скобок, группируются соседние параметры одного типа, удаляются лишние скобки, пустые строки в начале/конце блоков и пустоты после оператора присваивания, коллапсируются пустые блоки и убираются избыточные типы в композитных литералах и len/нулевые границы в слайсах
Интегрируется с VS Code, GoLand, Vim и Neovim, может использоваться как CLI или как библиотека
https://kodikapusta.ru/tools/17-gocondense
Поддержать проект на boosty и читать в MAX
1 671
Джину уже 12 лет
#golang
Ману Мартинес-Алмейда рассказывает историю как он создавал Gin - одного из самых популярных веб-фреймворков для Go, который вырос из его несостоявшегося стартапа Fyve и разрабатывался по принципу "простое важнее легкого".
Вдохновившись выступлением Роба Пайка, он противопоставил Gin фреймворку Martini. Вместо рефлексии и магии - явный gin.Context, который нес все нужное для обработки запроса и появился за два года до стандартного context.Context, а вместо обхода списка регулярных выражений на каждый запрос - radix-дерево для маршрутизации с константным временем поиска, не зависящим от количества маршрутов.
Как быстро растут чужие фреймворки
https://kodikapusta.ru/news/1105-dzhinu-uzhe-12-let
Поддержать проект на boosty и читать в MAX
1 671
mo
#tools #golang
Markdown-просмотрщик на Go, который открывает .md-файлы в браузере с живым обновлением при сохранении. Сервер запускается на порту 6275 и сервит множество файлов, сгруппированных по вкладкам.
Инструмент с поддержкой GitHub-flavored Markdown, подсветкой синтаксиса через Shiki, Mermaid-диаграмм, KaTeX-математики, есть полнотекстовый поиск, темная/светлая тема, перетаскивания файлов из файлового менеджера и чтения из stdin
https://kodikapusta.ru/tools/16-mo
Поддержать проект на boosty и читать в MAX
1 671
zero-copy-оптимизации
#golang
Разбор zero-copy-оптимизаций в Go.
Когда вы передаете
*os.File напрямую в io.Copy(conn, f), рантайм распознает это через цепочку type-assertions и вызывает sendfile(2), передавая данные из кеша странички в сокет без копирования в юзерспейсе. Но вот когда вы оборачиваете *os.File в свой собственный io.Reader, то все становится не так радужно. В тестах использование *os.File дает прирост в ~54 мс CPU на гигабайт и ~3 000 сисколлов против 184 мс CPU и 131 000 сисколлов при оборачивании файла в любой пользовательский io.Reader. Единственная "бесплатная" обертка это io.LimitedReader, которую рантайм явно разворачивает.
Для проксирования сокет-в-сокет та же логика работает через splice(2), но любая промежуточная обертка ломает fast path, и диагностировать это проще всего через strace -c. Сотни тысяч пар read/write означают, что zero-copy не работает в вашем коде
https://kodikapusta.ru/news/1108-zero-copy-optimizatsii
Поддержать проект на boosty и читать в MAX1 671
Финтех заметки
#learn
Fintech Engineering Handbook - это практическое руководство по разработке надежных финансовых систем, построенное вокруг трех принципов:
- Не изобретать деньги. Никаких дубликатов и произвольных изменений баланса
- Не терять данные. Полная прослеживаемость через event sourcing, аудиторские следы и иммутабельность
- Никому не доверять. Проверка вебхуков, сверка данных из независимых источников, валидация на границах системы
Статья разбирает все ключевые аспекты: представление денег с правильной точностью и без плавающей запятой, двойную бухгалтерию как основу лоджера с разграничением value/booking/settlement time, резервирование средств для исключения гонок, идемпотентность для защиты от повторной обработки, полную возобновляемость операций после сбоев, надежное взаимодействие с внешним миром через аутбокс-паттерн и reconciliation, а также контроль доступа с разделением обязанностей (принцип двух пар глаз) и подходы к тестированию - от property-based до инъекции сбоев и проверки обратной совместимости событий.
Если вы хотит работать в финтехе, то маст рид
https://kodikapusta.ru/news/1104-fintech-hanbook
Поддержать проект на boosty и читать в MAX
1 671
gomax
#tools #golang
А это уже мое поделие. Уверен, вам понравится. Порт библиотеки PyMax с Python на Go с помощью LLM. С помощью либы можно делать все, что умеет делать официальный клиент Макс. А еще можно написать свой клиент с end-to-end шифрованием, например.
В какой-то степени оно работает. Используйте на свой страх и риск
https://kodikapusta.ru/tools/15-gomax
Поддержать проект на boosty и читать в MAX
1 671
Миллиард строк
#rust
Автор проходит One Billion Row Challenge на Rust - задачу по обработке файла с миллиардом строк метеоданных за минимальное время. В 10-часовом стриме он итеративно оптимизирует решение: от наивной версии через отказ от парсинга UTF-8 и мапинга файла в память к fixed-point-температурам, инлайнингу коротких ключей, branchless-парсингу, SIMD для поиска строк, хеш-таблицам вдохновленным Java-решениями и, наконец, многопоточности с конкурентной загрузкой данных
По сути, это практическое пособие по низкоуровневой оптимизации. Можно поучится профилированию через perf, чтению ассемблера, работе с CPU-кэшами и прокачать понимание того, что на самом деле происходит под капотом Rust-кода. Если у вас есть 10 часов свободного времени
https://kodikapusta.ru/news/1111-milliard-strok
Поддержать проект на boosty и читать в MAX
1 671
WAL-RUS
#golang #rust
ClickHouse Cloud переписали утилиту для бэкапов и WAL-архивирования Postgres с Go на Rust. В результате появился WAL-RUS - опенсорсный инструмент, у которого пиковое потребление виртуальной памяти более чем на 70% ниже, чем у WAL-G. Это достигнуто за счет прямого управления аллокациями, ограниченных воркер-пулов и потоковой архитектуры без избыточного буферирования.
При этом WAL-RUS полностью совместим с WAL-G на уровне конфигурации и формата архивов. Пропускная способность осталась сопоставимой с Go-версией, но выигрыш в потреблении памяти шикарный.
Где-то грустит один маленький гофер
https://kodikapusta.ru/news/1103-wal-rus
Поддержать проект на boosty и читать в MAX
1 671
leafwiki
#tools #golang
LeafWiki - это self-hosted вики, упакованная в один Go-бинарник без внешних зависимостей: SQLite для метаданных, Markdown-файлы на диске для контента (можно читать и бэкапить обычным cp -r) и React-фронтенд со встроенным редактором, живым превью, древовидной навигацией и ручной сортировкой страниц.
Проект нацелен на личные вики, инженерные заметки и runbook'и для небольших команд, которым не нужна тяжесть Wiki.js или Outline. Развернуть можно одной Docker-командой или через системный инсталлятор
https://kodikapusta.ru/tools/14-leafwiki
Поддержать проект на boosty и читать в MAX
1 671
Ты можешь написать симфонию?
#ai
Джей Акунцо использует знаменитый монолог Робина Уильямса из фильма "Умница Уилл Хантинг" как метафору противостояния человека и AI.
Уилл - это ChatGPT, который прочитал все книги, но никогда не жил, а Шон (Уильямс) - человек, который знает запах Сикстинской капеллы, боль потери и цену любви из собственного прожитого опыта. Да, AI владеет информацией, но не может "прочитать комнату" или пропустить слова через собственые "маленькие жизненные моменты". Тут в статье прикольная игра слов: little life moments - LLM.
Настоящая ценность творческой работы не в правильно расставленных фактах. Она в уникальном синтезе прожитого опыта, превращающем сценарий в искусство, как это сделал Робин Уильямс, сыграв роль так, как не смог бы ни один другой актер. В эпоху AI-контента соблазн уступить машине велик, но именно способность вложить себя в работу - то, что отличает живое от мертвого, и выбор за нами
https://kodikapusta.ru/news/1110-ty-mozhesh-napisat-simfoniiu
Поддержать проект на boosty и читать в MAX
1 671
Профилирование
#golang
Статья разбирает пять встроенных профилировщиков в Go (CPU, heap, block, mutex и goroutine), показывая, что все они собирают данные в единый pprof-формат, но отличаются способом записи. CPU-профайлер работает асинхронно через сигналы ОС и кольцевой буфер. Heap, block и mutex накапливают данные на месте в хеш-таблице бакетов прямо в рантайме. А goroutine-профайлер делает мгновенный снимок всех горутин только по запросу, кооперируясь с планировщиком для минимальных остановок мира
https://kodikapusta.ru/news/1101-profilirovanie
Поддержать проект на boosty и читать в MAX
1 671
6 связанных списков
#rust
"Learning Rust With Entirely Too Many Linked Lists" - это прикольный учебный материал, где автор учит основам и продвинутым концепциям Rust через реализацию шести разных связных списков - от плохого односвязного стека до production-unsafe двусторонней очереди, попутно разбирая указатели (Box, Rc, Arc, *const, *mut), владение, заимствование, обобщённые типы, итераторы, unsafe-код и stacked borrows.
При этом автор открыто признает, что ненавидит связные списки и считает их ужасной структурой данных для 99% случаев, где разумнее использовать Vec или VecDeque. Но именно из-за их неудобства в Rust они становятся идеальным учебным полигоном - заставляя столкнуться с borrow checker, временами жизни, мутабельностью и unsafe-кодом в контролируемой обстановке
https://kodikapusta.ru/news/1100-6-sviazannykh-spiskov
Поддержать проект на boosty и читать в MAX
1 671
2048 для Game Boy Advance на Zig
#zig
Автор написал игру 2048 для Game Boy Advance на Zig и объясняет, почему этот язык отлично подошел для embedded-разработки под консоль.
Байтоебство, но красивое
Главные плюсы: встроенная кросс-компиляция, система сборки, позволяющая в одном build.zig описать все шаги от линковки до кодогенерации спрайтов, и особенно packed structs с нестандартными целочисленными типами (например, u2), которые делают работу с аппаратными регистрами GBA читаемой и удобной. Ну и конечно отмечаются comptime-вычисления, автор использовал их как раз для сжатия спрайтов на этапе компиляции. Еще ему понравилась гибкая стандартная библиотека с кастомными аллокаторами
И недостатков рассказывает, что в zig ограниченная поддержка инлайн-ассемблера, невозможность указать ARM/Thumb-режим для отдельной функции, и проблемы с "weird memory" GBA, где нельзя писать в видеопамять 8-битными операциями
https://kodikapusta.ru/news/1099-2048-dlia-game-boy-advance-na-zig
Поддержать проект на boosty и читать в MAX
1 671
DOOM на Cobol
#fun
Так, так, сча будут шикарные новости
Ютубер с ником icitry написал полноценный шутер от первого лица на языке COBOL - архаичном, многословном языке из 1960-х, лишенном современных возможностей и графических функций. Красава, ну
Для обхода отсутствия инструментов для графики он гененрирует каждый кадр как простое изображение и отображает его через ffplay, управление реализовано через ввод одиночных символов в консоли, а векторную математику, необходимую для игровой механики, пришлось реализовывать самому.
Проект построен на базе движка DOOM и использует некоторую логику оттуда, вроде переменной высоты потолка, и в целом напоминает Wolfenstein 3D.
Игра работает и выглядит на удивление достойно. Чувак очень крут и у него очень много свободного времени
https://kodikapusta.ru/news/11095-doom-na-cobol
Поддержать проект на boosty и читать в MAX
1 671
cardinal
#rust
Cardinal - это самое шикарное приложение для поиска на Mac. Быстрое и точное приложение для поиска файлов, написанное на Rust с использованием Tauri для десктопного UI.
Поддерживает Everything-совместимый синтаксис запросов: AND/OR, фильтры по расширению и размеру, поиск по содержимому, sub-path матчинг, regex, поиск по finder-тегам, быстрый предпросмотр. И вызывается через Cmd+Shift+Space
https://kodikapusta.ru/tools/13-cardinal
Поддержать проект на boosty и читать в MAX
1 671
6 популярных кешей
#golang
Автор сравнивает шесть подходов к реализации потокобезопасного in-memory кеша в Go. От наивного map без блокировок до copy-on-write через atomic.Pointer и все это на своем на 20-ядерном i7-14700K под разными нагрузками - read-only, read-heavy, write-heavy.
В итоге приходит к выводу, что шардированая 256-сегментная мапа с отдельным мьютексом на сегмент это лучшее универсальное решение. Такой подход дает почти 8-кратное ускорения на 8 ядрах по сравнению с одним sync.Mutex.
И неожиданно sync.RWMutex контринтуитивно почти не помогает чтению при количестве ядер больше двух и проигрывает обычному мьютексу на запись из-за накладных расходов на счетчик читателей, один мьютекс с ростом ядер замедляется из-за ping-pong кеш-линии с блокировкой, а распределение Ципфа для ключей ускоряет чтение тк горячие ключи остаются в кеше процессора, но может замедлить шардированный кеш, когда горячие ключи попадают в один шард и создают коллизию
https://kodikapusta.ru/news/1098-6-populiarnykh-keshei
Поддержать проект на boosty и читать в MAX
1 671
DNS и Zig
Хотел сделать перевод статьи про DNS пакеты с примерами на C, но в итоге переписал все на #zig и докинул еще интересности
https://kodikapusta.ru/articles/29-dns-na-zig
1 671
pgsty/minio
#golang
pgsty/minio (также известен как Silo) - это поддерживаемый сообществом форк популярного S3-совместимого объектного хранилища MinIO, сопровождаемый проектом Pigsty.
Изменения относительно апстрима минимальны: восстановлена встроенная консоль управления, обновлены ссылки на документацию и пути Go-модулей на этот репозиторий
Даешь опесорс!
https://kodikapusta.ru/tools/12-pgsty-minio
Поддержать проект на boosty и читать в MAX
1 671
Глитчарт
#art #fun
Начнем понедельник с искусства. Кстати, я уже как-то писал про гличарт: https://kodikapusta.ru/news/937-glitchart. Но теперь про чуть более классический вариант
"The Art of PNG Glitch" - отличное исследование художественного "глитча" PNG-изображений от японского программиста и художника.
В статье автор разбирает, как пять фильтров PNG (None, Sub, Up, Average, Paeth) и их комбинации по-разному влияют на визуальный результат при повреждении данных на этапах фильтрации или сжатия, создавая узнаваемые эффекты - от лавинообразных полос до метеоритных хвостов и снежного шума. Еще рассматривает влияние прозрачности, чересстрочности (interlace) и намеренно некорректных фильтров.
Кроме теории, автор показывает Ruby-библиотеку PNGlitch для программного создания таких эффектов и каталог из 120 вариантов глитча.
Автор отмечает, что, несмотря на кажущуюся простоту формата PNG по сравнению с JPEG, разнообразие получаемых глитч-эффектов неожиданно богато
Всем срочно творить
https://kodikapusta.ru/news/1094-glitchart
Поддержать проект на boosty и читать в MAX
1 671
HelixDB
#rust
HelixDB - это графо-векторная OLTP-база данных на Rust, созданная для построения knowledge-графов и AI-памяти.
База поддерживает работу с графами, векторами, ключ-значениеями, документами и даже работу с реляционной моделью и все в одной платформе. Позволяет писать запросы через DSL на Rust, TypeScript, Go и Python.
В комплете есть CLI-утилита для быстрой инициализации проекта, а также управляемое облачное решение с ACID-транзакциями, векторным и полнотекстовым поиском и автоматическим масштабированием
Выглядит красиво
https://kodikapusta.ru/tools/11-helixdb
Поддержать проект на boosty и читать в MAX
