Код и Капуста
Kanalga Telegram’da o‘tish
Авторский канал с интересными ссылками про разработку на Go, Rust, Godot, Flutter, Android, iOS, Aurora. Все ссылки тут https://kodikapusta.ru/ Читать канал в max https://vk.cc/cVOWSP Для связи @akovardin Поддержать канал https://boosty.to/kodikapusta
Ko'proq ko'rsatish1 669
Obunachilar
+324 soatlar
+47 kunlar
+4130 kunlar
Postlar arxiv
1 669
mo
#tools #golang
Markdown-просмотрщик на Go, который открывает .md-файлы в браузере с живым обновлением при сохранении. Сервер запускается на порту 6275 и сервит множество файлов, сгруппированных по вкладкам.
Инструмент с поддержкой GitHub-flavored Markdown, подсветкой синтаксиса через Shiki, Mermaid-диаграмм, KaTeX-математики, есть полнотекстовый поиск, темная/светлая тема, перетаскивания файлов из файлового менеджера и чтения из stdin
https://kodikapusta.ru/tools/16-mo
Поддержать проект на boosty и читать в MAX
1 669
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 669
Финтех заметки
#learn
Fintech Engineering Handbook - это практическое руководство по разработке надежных финансовых систем, построенное вокруг трех принципов:
- Не изобретать деньги. Никаких дубликатов и произвольных изменений баланса
- Не терять данные. Полная прослеживаемость через event sourcing, аудиторские следы и иммутабельность
- Никому не доверять. Проверка вебхуков, сверка данных из независимых источников, валидация на границах системы
Статья разбирает все ключевые аспекты: представление денег с правильной точностью и без плавающей запятой, двойную бухгалтерию как основу лоджера с разграничением value/booking/settlement time, резервирование средств для исключения гонок, идемпотентность для защиты от повторной обработки, полную возобновляемость операций после сбоев, надежное взаимодействие с внешним миром через аутбокс-паттерн и reconciliation, а также контроль доступа с разделением обязанностей (принцип двух пар глаз) и подходы к тестированию - от property-based до инъекции сбоев и проверки обратной совместимости событий.
Если вы хотит работать в финтехе, то маст рид
https://kodikapusta.ru/news/1104-fintech-hanbook
Поддержать проект на boosty и читать в MAX
1 669
gomax
#tools #golang
А это уже мое поделие. Уверен, вам понравится. Порт библиотеки PyMax с Python на Go с помощью LLM. С помощью либы можно делать все, что умеет делать официальный клиент Макс. А еще можно написать свой клиент с end-to-end шифрованием, например.
В какой-то степени оно работает. Используйте на свой страх и риск
https://kodikapusta.ru/tools/15-gomax
Поддержать проект на boosty и читать в MAX
1 669
Миллиард строк
#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 669
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 669
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 669
Ты можешь написать симфонию?
#ai
Джей Акунцо использует знаменитый монолог Робина Уильямса из фильма "Умница Уилл Хантинг" как метафору противостояния человека и AI.
Уилл - это ChatGPT, который прочитал все книги, но никогда не жил, а Шон (Уильямс) - человек, который знает запах Сикстинской капеллы, боль потери и цену любви из собственного прожитого опыта. Да, AI владеет информацией, но не может "прочитать комнату" или пропустить слова через собственые "маленькие жизненные моменты". Тут в статье прикольная игра слов: little life moments - LLM.
Настоящая ценность творческой работы не в правильно расставленных фактах. Она в уникальном синтезе прожитого опыта, превращающем сценарий в искусство, как это сделал Робин Уильямс, сыграв роль так, как не смог бы ни один другой актер. В эпоху AI-контента соблазн уступить машине велик, но именно способность вложить себя в работу - то, что отличает живое от мертвого, и выбор за нами
https://kodikapusta.ru/news/1110-ty-mozhesh-napisat-simfoniiu
Поддержать проект на boosty и читать в MAX
1 669
Профилирование
#golang
Статья разбирает пять встроенных профилировщиков в Go (CPU, heap, block, mutex и goroutine), показывая, что все они собирают данные в единый pprof-формат, но отличаются способом записи. CPU-профайлер работает асинхронно через сигналы ОС и кольцевой буфер. Heap, block и mutex накапливают данные на месте в хеш-таблице бакетов прямо в рантайме. А goroutine-профайлер делает мгновенный снимок всех горутин только по запросу, кооперируясь с планировщиком для минимальных остановок мира
https://kodikapusta.ru/news/1101-profilirovanie
Поддержать проект на boosty и читать в MAX
1 669
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 669
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 669
DOOM на Cobol
#fun
Так, так, сча будут шикарные новости
Ютубер с ником icitry написал полноценный шутер от первого лица на языке COBOL - архаичном, многословном языке из 1960-х, лишенном современных возможностей и графических функций. Красава, ну
Для обхода отсутствия инструментов для графики он гененрирует каждый кадр как простое изображение и отображает его через ffplay, управление реализовано через ввод одиночных символов в консоли, а векторную математику, необходимую для игровой механики, пришлось реализовывать самому.
Проект построен на базе движка DOOM и использует некоторую логику оттуда, вроде переменной высоты потолка, и в целом напоминает Wolfenstein 3D.
Игра работает и выглядит на удивление достойно. Чувак очень крут и у него очень много свободного времени
https://kodikapusta.ru/news/11095-doom-na-cobol
Поддержать проект на boosty и читать в MAX
1 669
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 669
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 669
DNS и Zig
Хотел сделать перевод статьи про DNS пакеты с примерами на C, но в итоге переписал все на #zig и докинул еще интересности
https://kodikapusta.ru/articles/29-dns-na-zig
1 669
pgsty/minio
#golang
pgsty/minio (также известен как Silo) - это поддерживаемый сообществом форк популярного S3-совместимого объектного хранилища MinIO, сопровождаемый проектом Pigsty.
Изменения относительно апстрима минимальны: восстановлена встроенная консоль управления, обновлены ссылки на документацию и пути Go-модулей на этот репозиторий
Даешь опесорс!
https://kodikapusta.ru/tools/12-pgsty-minio
Поддержать проект на boosty и читать в MAX
1 669
Глитчарт
#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 669
HelixDB
#rust
HelixDB - это графо-векторная OLTP-база данных на Rust, созданная для построения knowledge-графов и AI-памяти.
База поддерживает работу с графами, векторами, ключ-значениеями, документами и даже работу с реляционной моделью и все в одной платформе. Позволяет писать запросы через DSL на Rust, TypeScript, Go и Python.
В комплете есть CLI-утилита для быстрой инициализации проекта, а также управляемое облачное решение с ACID-транзакциями, векторным и полнотекстовым поиском и автоматическим масштабированием
Выглядит красиво
https://kodikapusta.ru/tools/11-helixdb
Поддержать проект на boosty и читать в MAX
1 669
Асинхронный Rust в трех частях
#rust
Совсем не свежие но все еще очень актуальные и полезные статьи про устройство ассинхронности Rust в трех частях
Async/await, или "асинхронный ввод‑вывод" - это функция языка, которая позволяет программам выполнять несколько задач одновременно. Это в некотором виде альтернатива многопоточности, хотя программы на Rust часто используют и то и другое. Асинхронный ввод‑вывод особенно популярен в веб‑сервисах и сетевых приложениях, работающих с большим числом подключений одновременно.
"Большое число" обычно означает порядока десяти тысяч подключений, что иногда называют "C10K problem", то есть задачей обработки 10 000 клиентов или соединений. Использование большого количества "futures" или "задач" оказывается более эффективным, чем запуск множества потоков.
А еще, конечно же, стоит почитать https://rust-lang.github.io/async-book/ ну и посмотреть все ссылки в статье
https://kodikapusta.ru/news/1097-asinkhronnyi-rust-v-trekh-chastiakh
Поддержать проект на boosty и читать в MAX
1 669
driftwm
#rust
Driftwm - это экспериментальный Wayland-композитор на Rust, реализующий концепцию "бесконечного холста": окна живут в своем родном размере на безграничной 2D-плоскости, а дисплей это что-то типо камеры, которую можно перемещать, панорамировать и зумировать.
Управление заточено под трекпад с жестами, а при сближении краев окна автоматически "примагничиваются" друг к другу, собираясь в своеобразные группы
Когда запустил кучу агентов и следишь за всеми
https://kodikapusta.ru/tools/10-driftwm
Поддержать проект на boosty и читать в MAX
