четверг, 25 октября 2018 г.

[prog.c++] Первая версия документации по новым фичам грядущего релиза SObjectizer-5.5.23 и so_5_extra-1.2.0

Появилась первая версия документации по новым возможностям новых версий SObjectizer и so_5_extra:

[so-5.5 In-depth - Enveloped Messages]
[so5extra 1.2 Proxy Mbox]
[so5extra 1.2 Revocable Messages]
[so5extra 1.2 Revocable Timers]
[so5extra 1.2 Just Envelope]
[so5extra 1.2 Sending of Envelopes]
[so5extra 1.2 Time-Limited Message Delivery]

Если кому-то интересно, то можно сходить и почитать о том, что можно будет использовать в новых версиях SObjectizer-а и so_5_extra.

Про низкое качество английского можно не говорить. С этим и так все понятно :(

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

Сам релиз ожидается в начале ноября. Хотелось бы к концу следующей недели. Но есть шансы не успеть, т.к. третьего ноября очередной C++ CoreHard, где я буду выступать с докладом "Actors vs CSP vs Tasks" (в роли К.О.) и подготовка к выступлению украдет какую-то часть времени. Поэтому более вероятен релиз уже после C++ CoreHard.

Первая бета-версия уже доступна для загрузки (so-5.5.23-beta1.zip и so_5_extra-1.2.0-beta1.zip), можно брать и пробовать. За время, прошедшее после фиксации первой бетой ничего нового в SO/so_5_extra не попало.

вторник, 23 октября 2018 г.

[prog.c++.wow] Неужели в C++ завезут pattern-matching?

Предложение уже сформировано: p1260p0: Pattern Matching.

Например, чтобы разобраться с содержимым объекта variant<int, float> можно написать вот так:

inspect (v) {
   <int> i: cout << "got int: " << i;
   <float> f: cout << "got float: " << f;
}

Желающих посмотреть больше примеров адресую в пропозал, там всего-то 16-ть страничек.

Если примут, да еще и в C++20, то это будет мегакруто.

Upd. Еще одно аналогичное предложение, которое, по слухам, имеет даже больше шансов: p1308r0: Pattern Matching.

пятница, 19 октября 2018 г.

[prog.c++] Стали доступны первые бета-версии SObjectizer-5.5.23 и so_5_extra-1.2.0

Сегодня были зафиксированы первые бета-версии наших проектов SObjectizer и so_5_extra. Загрузить их можно отсюда: so-5.5.23-beta1.zip и so_5_extra-1.2.0-beta1.zip (либо so_5_extra-1.2.0-beta1-full.zip).

Подробнее об нововведениях рассказывается в очередной статье на Хабре.

Со сроками официально релиза пока так: ориентировочно релиз состоится в первой декаде ноября. Если успеем раньше, выкатим раньше. Но там еще много работы, в том числе и по документированию, и по проверке сборки под Android с помощью Google-овского NDK и еще разных мелочей (и не мелочей). Так что первая декада ноября выглядит более реалистично.

В общем, если кому-то интересно, что в SObjectizer-е происходит, то смотрим, делимся впечатлениями и соображениями. Пока еще есть время и возможность повлиять на то, что попадет в SO-5.5.23 и so_5_extra-1.2.0.

четверг, 18 октября 2018 г.

[prog.c++] В склерозник: легковесная C++11 библиотека для работы с разделяемой памятью

На reddit-е увидел анонс header-only библиотеки mio, предоставляющей средства работы с memory-mapped-file IO. Решил зафиксировать ссылку на нее в склерозник, ибо несколько месяцев назад изучал, что из готового для этих целей есть в мире C++. И получалось, что самое толковое было только в Boost-е. Но Boost -- это достаточно тяжелая зависимость. А здесь легковесная кросс-платформенная библиотека без внешних зависимостей вообще. Под MIT-лицензией.

среда, 17 октября 2018 г.

[life.work] Старпёрское/стартаперское брюзжание на счет скорости течения времени

Забавно: когда ты начинаешь делать какую-то фичу, когда идет непредсказуемый и мучительный процесс выдумывания и проработки/переработки, то нормально, полноценно работать удается не больше 3-4 часов в день. Ну просто тяжело заставлять мозги напряженно скрипеть больше. Да и если заставить, то пользы все равно нет. Хорошие идеи возникают непредсказуемо и неожиданно, как правило, когда ты вообще отвлекся на что-то другое.

И вот на ранних стадиях работы над проектом рабочее время (именно рабочее, которое тратится на работу), тянется довольно долго.

Зато на поздних стадиях, когда уже основное сделано и идет доводка, рабочее время пролетает стремительно. Вот новый тест нужно сделать. Сделал. Вот нужно комментарий расширить и дополнить примерами. Расширил, дополнил. Увидел косячек в реализации. Исправил. Оба-на! А уже обед. После обеда не успел оглянуться, а уже из офиса пора уходить. Куда улетает время просто не замечаешь.

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

Причем чем старше становишься, тем больше скорость течения времени пугает.

А еще очень сильно меняет отношение ко времени разработка за собственный счет. Когда деньги достаются из собственного кармана, то между стоимостью фичи в одну неделю и в две недели легко обнаруживается серьезная разница :)

И еще одно: когда ты работаешь над своим продуктом, то время -- это все. Буквально. Все остальное определяется тем, сколько времени ты себе позволил работать над продуктом, в какое время ты продукт выпустил (или не выпустил). В том числе и деньги определяются именно этим. Временем.

Upd. Чтобы избежать банальности "время-деньги". Фокус в том, что постепенно начинаешь "кожей чувствовать" обратную сторону этого выражения: когда у тебя нет времени, деньги могут и не помочь.

вторник, 16 октября 2018 г.

[prog.c++.sobjectizer] Сбылась мечта идиота: можно сделать отчеты о доставке сообщения до получателя.

Версии SO-5.5.23 и so_5_extra-1.2.0 уже начинают дышать полной грудью. В SO-5.5.23 был реализован новый механизм, который позволяет вкладывать сообщение в некий "конверт". Внутри SObjectizer-а доставка идет уже для всего конверта с вложенным в него сообщением. Сообщение из конверта достается либо когда сообщение доставлено до получателя. Либо когда сообщение по какой-то причине преобразуется из одного представления в другое (например, так происходит в случае использования limit_then_transform). Причем под "доставлено до получателя" означает не только то, что получатель извлек сообщение из очереди, но и то, что у получателя был найден обработчик для этого типа сообщения. Т.е. сообщение реально доставлено, а не просто взято из очереди.

На базе этого механизма в so_5_extra-1.2.0 добавлены средства для реализации как гарантированно отзывных таймеров, так и просто для реализации отзывных сообщений. Для отзывных сообщений, кстати говоря, сразу же придумываются сценарии, в которых их можно использовать. Так, что, наверное, эта штука может быть востребована.

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

Эти самые отчеты о доставке -- это идея фикс, которая витала в воздухе очень и очень давно. Внимание она привлекает потому, что когда агент A отсылает сообщение агенту B, то далеко не факт, что сообщение до агента B вообще дойдет. Например, сообщение может быть отвергнуто механизмом защиты агента от перегрузки (например, limit_then_drop). И временами хотелось бы знать, сообщение до B не дошло или все-таки дошло. Но вот узнать это не представлялось возможным.

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

суббота, 13 октября 2018 г.

[prog.c++] В склерозник: самодельный аналог std::apply для C++11

Когда-то давно по материалам из Интернета сделал собственный аналог функции std::apply из C++17, но для C++11. Для тех счастливчиков, которые никогда не сталкивались с std::apply или его аналогами скажу, что std::apply позволяет вызвать нужную вам функцию, передав в нее содержимое имеющегося у вас std::tuple. Т.е. фокус в том, чтобы распаковать содержимое std::tuple в набор аргументов вызываемой функции.

В C++11 для такого трюка не было вообще никаких готовых инструментов. В C++14 уже появился std::index_sequence, на базе которого основная магия и происходит. Ну а в C++17 уже есть std::apply. Но мне в свое время нужно было именно для C++11, поэтому и появилась реализация call_by_tuple. Появилась и так и валяется у меня на винте. Время от времени ее приходится искать. И, для того, чтобы искать было проще, решил ее код опубликовать в склерозникблоге.

Поиграться в он-лайн компиляторе с моим вариантом call_by_tuple можно на wandbox-е. Исходный текст этого же примера с реализацией call_by_tuple под катом.