Nix. Hacking your first package.

Intro Киллер-фича Nix это воспроизводимое развертывание окружения. Одной командой: $ nix develop После этого мы получаем ровно такой же шел в котором и разрабатывался пакет. Это очень сильно упрощает жизнь т.к. пропадает головная боль с затаскиванием зависимостей и настройкой инфраструктуры. Иногда глянешь исходники на гитхабе и вроде сразу понятно что

4 min read

More issues

Nix and Flakes

Nix Nix это странный пакетный менеджер и одноименный специализированный функциональный язык, используемый им в качестве DSL. Пакетный менеджер функциональный в математическом смысле, т.е. обладает таким свойствами как иммутабельность (одни и те же входные данные/зависимости дают один и тот же результат) и отсутствие побочных эффектов (изменения входных данных/зависимостей
4 min read

Boost ASIO coroutines. NATS client.

Теперь я добрался до практического применения разработанных ранее барьеров/секвенсоров (SequenceBarrier, SingleProducerSequencer, MultiProducerSequencer) для короутин. В этот раз будет реализован клиент для NATS. Концептуально эта система очередей довольно проста: клиенты могут отправлять события в очередь (топик), клиенты могут подписываться на получение событий из очереди (топика). Ключевая фишка - отсутствие необходимости
21 min read

Boost.ASIO coroutines. Cancellation.

В ASIO есть возможность отмены асинхронных операций и в частности отмена ожидания завершения короутин, запущенных через co_spawn. Типичный пример использования это ожидание события/данных с таймаутом: std::variant results = co_await ( async_read(socket, input_buffer, use_awaitable) || timer.async_wait(use_awaitable) ); if (result.index() == 0) { // Read complete
13 min read

Boost.ASIO coroutines. MultiProducerSequencer.

Следующий примитив синхронизации из cppcoro - MultiProducerSequencer. Он предназначен для координации нескольких продюсеров и одного или нескольких (с использовании группы барьеров) потребителей. Продюсеры и потребители могут работать в разных тредах, основное назначение этого секвенсора - реализация thread-safe очереди. Если продюсер только один, то стоит применять SingleProducerSequencer для избежания излишнего оверхеда.
13 min read

Boost.ASIO coroutines. Sequencer & multiple consumers.

Основное назначение этой заметки не столько реализация работы секвенсера с несколькими потребителями (это не самый частый вариант использования), сколько более подробное рассмотрение взаимодействия продюсера и потребителей. Она является небольшим прологом к секвенсеру (тут будет ссылка на MultiProducerSequencer) со множеством продюсеров. Начнем с кейса с одним продюсером и одним потребителем. Размер
5 min read

Boost.ASIO coroutines. SingleProducerSequencer.

Следующий примитив синхронизации из cppcoro. Он предназначен для координации  доступа к кольцевому буферу одного продюсера и одного подписчика. Продюсер и подписчик могут работать в разных тредах (собственно это основное назначение этого класса - реализация thread-safe очереди). Это часть паттерна Disruptor из Java-мира. Продюсер захватывает один или более слотов в буфере,
4 min read

Boost.ASIO coroutines. SequenceBarrier.

В этот раз буду реализовывать sequence barrier, аналогичный реализации в cppcoro.  Этот примитив синхронизации координирует работу одного издателя (producer) и одного или нескольких подписчиков (consumers) относительно монотонно-возрастающей (неубывающей) последовательности. В дальнейшем он будет применен в качестве курсора в кольцевого буфера. Intro Издатель периодически публикует новое значения последовательности, а подписчики ждут
13 min read

Ghost on NixOS

В этой заметке описана установка движка блога Ghost на NixOS. Существует более каноничный способ установки без Docker в виде пакета NixOS, но я сделал так, как понятней мне. MySQL Ghost задеприкейтил SQLite для боевого режима, поэтому используется MySQL (если точнее, то MariaDB). { services.mysql = { enable = true; package = pkgs.mariadb; settings
2 min read

Boost.ASIO coroutines. Event. Работа над ошибками.

В предыдущей статье был описан элемент синхронизации Event, аналогичный оному из cppcoro. Ошибка была в том, что весь механизм синхронизации был перенесен из cppcoro в другую среду без какой-либо валидации. Правильным бы на тот момент решением было бы использовать в атомарных операциях memory order по умолчанию (std::memory_order_seq_
18 min read

Subscribe to Заметочки

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe