SWE notes
394 subscribers
12 photos
255 links
Канал про разработку ПО и все что с этим связано.

В нем я делюсь как авторскими материалами из своего блога https://www.swe-notes.ru так и полезными ссылки на другие ресурсы

По вопросам сотрудничества обращаться @kuznetsovin
Download Telegram
Для пользователей Mac, которые не любят работать с консолью, но хотят понимать какие дескрипторы, порты и т.д. использует их приложение (что можно получить с помощью lsof) есть интересное приложение sloth

#mac #utils #lsof
Хороший курс по введению в базы данных (Intro to database systems), довольно подробный, но на английской языке

#db #sql
Async Rust: What is a runtime?

Короткая обзорная статья которое даёт верхне-уровневое понимание о том что такое асинхронный runtime в rust и как он работает

#rust #async #runtime
Forwarded from Блог*
#prog #rust #rustasync #suckassstory

Ask not what the compiler can do for you

TL;DR: из-за того, что async_trait боксит футуры и стирает типы, в асинхронном коде, использующем этот крейт, можно организовать безусловную рекурсию, и ни компилятор, ни clippy этого не отловят.
Memory Allocation

Хорошая объемная статья про работу аллокаторов памяти.

#internals #sysprog
Forwarded from Alexander Tolstoy
Команда разработчиков Picodata рада сообщить о выпуске новой версии нашего основного программного продукта — Picodata 23.06.0.

Что нового:

• Во всем кластере теперь используется единая схема данных со спейсами двух видов: глобальные спейсы реплицируются на весь кластер через Raft, а шардированные, как и раньше в Tarantool — внутри репликасета.
• Для записи в глобальные спейсы предлагается новый механизм Compare and Swap. Он совмещает в одном интерфейсе модификацию данных с проверкой предиката, тем самым позволяя получить уровень изоляции транзакций serializable.
• Эти и другие функции представлены в публичном Lua API. Справка по нему также доступна в интерактивной консоли pico.help(). А с терминологией можно ближе познакомиться в новом разделе документации — Глоссарии
• Реализована команда picodata connect для подключения к интерактивной консоли.

Полный список улучшений см. в документе CHANGELOG данного релиза.

Для того чтобы попробовать Picodata в деле, загрузите версию для вашей ОС с нашего сайта
https://picodata.io/download
Готовые пакеты предоставляются для RHEL/CentOS 7-8, Ubuntu 20.04, 22.04 и Alt Linux p10.
Инструкции по установке, запуску и настройке кластера доступны на сайте документации Picodata по адресу
https://docs.picodata.io/picodata
Вопросы и пожелания направляйте в наш Telegram-канал @picodataru
Всем привет! Мы выпустили версию 2.0.0 нашего SDK для разработки модулей для Tarantool на Rust.

Новая версия — 2.0.0, так как мы используем SemVer а этот релиз вносит некоторое количество изменений не совместимых с прошлыми версиями. Среди таких изменений следующее:

- Функция transaction::start_transaction удалена в пользу transaction::transaction,
которая имеет более гибкую сигнатуру.
- fiber::clock теперь возвращает новый тип tarantool::time::Instant, который
полностью заменяет std::time::Instant при чём операции над ним по умолчанию
округляют значение вместо паники.
- Методы трейта tlua::LuaRead теперь возвращают ошибку типа WrongType, которая
содержит информацию об ожидаемых и полученных типах значений.
- Ошибка Error::Decode, которая возвращается из Tuple::decode теперь сдержит
информацию об ожидаемом типе данных и полученном содержимом msgpack значения.

Остальные "breaking" изменения большинства пользователей не должны коснуться, но
о них можно почитать в CHANGELOG.md.

Так же в этом релизе добавлены следующие фичи:

- Макро аттрибут #[tarantool::test] и фукнция test::test_cases (доступны с
опцией --features=test), которые можно использовать для написания
тестового фреймворка, например как это делается в
https://git.picodata.io/picodata/picodata/tarantool-test.
- Функция proc::all_procs, которая вернёт массив с описаниями хранимок,
описанных при помощи #[tarantool::proc]. Это можно использовать для
автоматизации объявления хранимых процедур.
- tarantool::network::client альтернативная async реализация IPROTO клиента
основанная на нашем экспериментальном async рантайме.
- fiber::defer теперь будет работать более эффективно на новых версиях
тарантула (начиная с 2.11).

Про остальные изменения и баг-фиксы можно почитать в CHANGELOG.md.
Forwarded from Yaroslav Dynnikov
Команда разработчиков Picodata рада сообщить о выпуске новой версии нашего основного программного продукта — Picodata 23.12.0.

Ключевые нововведения:

* Распределенный SQL доступен в интерактивной консоли и поддерживает работу с глобальными и шардированными таблицами
* Реализована авторизация запросов, основанная на списках управления доступом (ACL)
* Реализован журнал аудита безопасности
* Реализовано аварийное переключение лидеров репликасетов
* Добавлен веб-интерфейс Picodata

Полный список нововведений доступен в документе CHANGELOG.

Для установки Picodata 23.12.0, следуйте инструкциям https://picodata.io/download

Инструкции и руководства можно найти на портале документации https://docs.picodata.io/

Вопросы и пожелания направляйте в наш Telegram-чат @picodataru
Всем привет! Мы выпустили версию 4.0.0 нашего SDK для разработки модулей для Tarantool на Rust.

В этом релизе кроме прочих добавлены следующие фичи:

- Методы fiber::Builder::{start_non_joinable, defer_non_joinable} для создания файберов, окончания работы которых не нужно дожидаться. Эти функции возвращают id нового файбера, по которому с этим файбером дальше можно работать при помощи новых функций fiber::{cancel, wakeup, exists, csw_of, name_of, set_name_of, name_raw}. Id текущего файбера можно получить при помощи новой fiber::id. Старая версия файберного API Fiber при этом помечена как deprecated, так как её использование, помимо прочего, может привести к undefined behaviour или падежам.

- Методы для ожидания конкретного момента в будущем Cond::wait_deadline и r#async::timeout::{deadline, IntoTimeout::deadline}.

- Метод Proc::is_public, позволяющий определить помечена ли модификатором pub хранимая процедура определённая при помощи #[tarantool::proc]. Этот показатель так же можно изменить при помощи нового атрибута-параметра (public = [true|false]).

- Методы KeyDef::{extract_key, extract_key_raw} для извлечения ключей из кортежей (tuple). Эти методы стоит использовать вместо старого Index::extract_key, а объект KeyDef можно получить при помощи цепочки Index::meta -> index::Metadata::to_key_def. Также добавлен метод KeyDef::validate_tuple для валидации кортежей.

- Функции transaction::{is_in_transaction, begin, commit, rollback} для низкоуровневой работы с транзакциям, для ситуаций когда старая transaction::transcation не подходит.

Так же новая версия вносит несколько небольших изменений не совместимых с прошлыми версиями, которые, надеемся, не затронут большую часть пользователей. Просим прощения за доставленные неудобства! В частности:

- Удален метод TcpStream::close_token
- Метод Index::extract_key помечен как unsafe
- Добавлены новые варианты в enum Error
- Удалены реализации трейтов из сторонних библиотек clap и num_traits.

Про остальные изменениях и исправления ошибок как обычно можно почитать в CHANGELOG.md.
Forwarded from Segment@tion fault
Сегодня буду ругать каналы, и не только в Rust.

Каналы - они хорошо, когда вы пишете какое-нибудь приложение, которое что-то куда-то складывает. Запустил канальчик, с одной стороны вебсокет принимает, с другой в базу пишется. Забился канал - вебсокет подождет: "эй, на той стороне - обождите! в очередь, сукины дети"

Каналы - они плохо, когда их начинают совать в системы реального времени. Почему? Потому что в системе реального времени нам наплевать, в каком состоянии она была секунду назад, нам важно знать что происходит сейчас. Какая нам разница, сколько показывал датчик температуры, если мы его не складываем в базу? Никакой. Нам надо прямо сейчас - или у нас потепление, или похолодание, и принять меры.

Поэтому в системах реального времени все задачи решаются через shared context. Один воркер значит кидает в регистр значение датчика, а другой берет. Значение всегда свежее, никаких очередей, а что там раньше было - да кому какое дело.

Но это не значит, что в системах реального времени не бывает задач, для которых нужны каналы. А вдруг мы, допустим, пишем лог? Уже желательно канал. А вдруг у нас классический пример робота - vending machine. Нам совершенно наплевать, какие кнопки по выбору товара нажимал юзер, нам нужна последняя. При этом нам (а особенно юзеру) не наплевать, сколько и каких он закинул монет в приемник.

Такую задачу уже либо классически решаем через shared context, только упражняемся с математикой и задрачиваем jitter, чтоб не пропустить монетку. Либо скрещиваем ежа с ужом, там канал - тут контекст, а потом пытаемся во всем этом разобраться.

Хотя всё можно было бы решать через каналы. Можно, но нельзя. Потому что какой-то надмозг когда-то придумал что в каналах сендеры - существа совершенно бесправные и должны, сукины дети, стоять в очереди. Или отвалить. Еще хорошо если им дадут посмотреть большая ли она, а может и не дадут.

std::sync::mpsc я даже не рассматриваю, там не каналы а порнография для детей старшего дошкольного и младшего школьного возраста. Возьмем crossbeam. Или async_channel. Или любой другой популярный, уважаемый крейт.

Ни в одном нет для отправителя force send. Нет возможности очистить канал, если получатель затупил. Нет возможности пушнуть в полный канал, чтобы последнее значение оттуда вывалилось.

Чтобы сделать такую элементарную операцию, нам нужно идти через жопу - иметь под рукой клон receiver'а и вычистить его самостоятельно. Других вариантов у нас не имеется.
Forwarded from Picodata News
Как Picodata меняет рынок in-memory data grid.

Константин Осипов, сооснователь компании "Пикодата", рассказывает о базах данных и особенностях Picodata как IMDG-решении.

Запись со встречи Database Internals Meetup #1 20.02.2024

https://youtu.be/_UNok-uXql4?si=S9ZYgAzO-nM5n9RE
Speed of Rust vs. C
Интересная статья про сравнения скорости работы ПО на Rust и C открыл для себя несколько интересных особенностей о которых не знал раньше
#internals #rust #c
Forwarded from Segment@tion fault
Про создание вектора. Я, как ни странно, люблю <_>::default(). Поясню почему.

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

Во-вторых, для ковер-конструкций вида Arc<Mutex<Option<T>>> и так далее, Default::default() создает _всю_ цепочку без необходимости руками расписывать каждый элемент. А <_>::default() - можно считать её короткая форма. Семантически немного отличная, но результат аналогичен.

p.s. Option<Vec<T>> не делайте, это как правило бессмысленно. на всякий случай поясню сам, до прихода моих любимых критиков.
CUPID—for joyful coding

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

#solid #codestyle