Код и Капуста
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
Контейнеры

#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
Заработок на опенсорсе

#fun

Мечта любого разработчика - писать код без в опенсорс в свое удовольствие и полуать за это деньги.

Кажется, у автора статьи это почти получилось. Разработчик утилиты mise рассказывается сколько он зарабатывает на опенсорсе и сколько он хотел бы зарабатывать

Кстати, реклама в документации приносит ему 100 баксов в месяц

https://kodikapusta.ru/news/1003-zarabotok-na-opensorse

Поддержать проект на boosty: https://boosty.to/kodikapusta
2
Швейцарский стол

#golang

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

Но все соль в группровке. Вместо одного ключа в ячейке мы храним сразу по 8 штук, и для каждой группы добавляем специальные контрольные байты (младшие 7 битов хэша). Это позволяет за одну операцию сравнивать с хэшем все восемь элементов через битовые трюки с uint64, а это очень быстро.

На практике хоть обычный подход и шустрее на малых объемах, swiss table раскрывается при высокой заполненности: если забить ее под завязку, она тормозит в разы меньше обычной

https://kodikapusta.ru/news/991-shveitsarskii-stol

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥2
Парсим JSON на Rust

#rust

Автор решил запилить парсер JSON на Rust с нуля, чтобы на практике прочувствовать структуры, енумы и сопоставление с образцом.

Начал с теории: struct для группировки данных, enum для вариантов вроде объекта, массива или строки, а match - чтобы все это красиво разбирать. Потом написал токенизатор, который жрет строку символов и выдаёт токены: фигурные скобки, двоеточия, строки с эскейп-последовательностями, числа и ключевые слова. А дальше - парсер, который рекурсивно обходит эти токены и собирает их в тип JsonValue - енум с вариантами Object, Array, Str, Number, Bool и Null.

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

Автора вообще много прикольных статей

https://kodikapusta.ru/news/997-parsim-json-na-rust

Поддержать проект на boosty: https://boosty.to/kodikapusta
👍1
Game Boy на F#

#fun

Я удивлен, что F# все еще живи на нем даже пишут прикольные штуки.

Вот, например, автор запилил эмулятор Game Boy. Это как писать стихи на латыни

Мне, кстати, понравился синтаксис и сам код

https://kodikapusta.ru/news/1004-game-boy-na-f

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥1
Домашний HAL

#golang #ai

Автор считает, что пора собирать себе домашнего HAL’а на новых локальных моделях вроде Gemma4 или Qwen 3.6. Сейчас даже на обычной видеокарте можно запустить нормального мультимодального ассистента, который и жестикулирует, и лицо распознает, и умный дом крутит, и болтает без всяких облачных подписок - жрет только твое электричество.

Автор использует современные локальные модели, связку speech-to-text (Whisper/Moonshine) и text-to-speech (Kokoro), систему жестов и мимики, управляемую через вызовы инструментов LLM. Проект интегрируется с Home Assistant, поиском SearXNG, векторной базой Qdrant для памяти и распознаванием лиц.

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

https://kodikapusta.ru/news/992-domashnii-hal

Поддержать проект на boosty: https://boosty.to/kodikapusta
🎉1
Я опубликовал для вас уже 1001 интересную ссылку 💻
🔥8🎉8🤩2👍1
Свой Redis на Rust

#rust

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

Книга построена на основе задания CodeCrafters под названием Build Your Own Redis. Вы начнете с изучения работы с TCP и настройки сервера, постепенно перейдете к более сложным задачам: обработке нескольких подключений клиентов и реализации основных команд Redis.

Сейчас в книге описаны базовые темы плюс два расширенных раздела: "Репликация" и "Транзакции"

Для обучения самое то

https://kodikapusta.ru/news/998-svoi-redis-na-rust

Поддержать проект на boosty: https://boosty.to/kodikapusta
🔥3
Сделали идеально ненужное

#fun

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

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

Главный вывод: лучше сделать что-то "очевидно плохое", но получить опыт и радость творчества, чем бесконечно обдумывать идеальный результат. Автор призывает вернуться к подходу "просто сделать", игнорировать лишние функции (даже если их подсказывает ИИ) и помнить, что рост скорости разработки часто компенсируется ростом ненужных усложнений

https://kodikapusta.ru/news/1005-sdelali-ideal-no-nenuzhnoe

Поддержать проект на boosty: https://boosty.to/kodikapusta
👍3
FastCGI все еще достоин

#golang

FastCGI - протокол, которому уже 30 лет, но он по-прежнему может показать свою силу

Автор предлагает использовать FastCGI для реверс прокси вместо HTTP. И в этом действительно есть смысл. Две основные причины - безопастность и неопределенность в передаче некторых данных запроса, например реального IP клиента

Самая серьезная проблема заключается в том, что HTTP-сообщения не имеют четкой структуры: само сообщение описывает, где оно заканчивается, и для этого существует множество способов, каждый из которых имеет свои особенности. Реализации могут по-разному определять, где заканчивается одно сообщение и начинается следующее. Это основа для атак с десинхронизацией HTTP, также известных как «подмена запросов», когда обратный прокси-сервер и бэкенд по-разному определяют границы между HTTP-сообщениями, что приводит к всевозможным кошмарным проблемам с безопасностью, таким как уязвимость в Discord

Есть олды котоые помнять что такое FastCGI?

https://kodikapusta.ru/news/993-fastcgi-vse-eshche-dostoin

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

#rust

ESP32 шагают по планете и отдирабт популярность у Arduino

device-envoy-esp - это экспериментальная Rust-библиотека, кторая делает программирование микроконтроллеров ESP32 значительно более увлекательным за счет использования асинхронного фреймворка Embassy и абстракций устройств, которые инкапсулируют владение аппаратными ресурсами и фоновую координацию в удобные, переиспользуемые компоненты с высокоуровневым(сравнительно) API

Мигаем диодами на Rust

https://kodikapusta.ru/news/999-device-envoy-esp

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