пятница, 17 марта 2017 г.

[prog.c++] Библиотека timertt обновилась до версии 1.1.2

Вышла обновленная версия библиотеки timertt для работы с таймерами в C++ -- 1.1.2. В этой версии добавлена одна малюсенькая, но очень важная деталь: теперь в классах таймерных нитей и таймерных менеджеров есть публичное имя thread_safety. С его помощью стало гораздо проще писать шаблонный код, который может работать с разными типами таймерных нитей/менеджеров. Например:

// Класс для управления таймерами в прикладной программе.
// Может работать с разными типами таймерных нитей или менеджеров.
templatetypename TIMER_CONTROLLER >
class timer_client {
   TIMER_CONTROLLER & controller_;

public :
   // Определяем тип идентификатора с учетом того, какой thread_safety
   // используется у менеджера таймеров.
   using timer_holder = timertt::timer_holder_object< typename TIMER_CONTROLLER::thread_safety >;

   // Создать новый таймер, при срабатывании которого нужно что-то выполнить.
   templatetypename DURATION, typename ACT >
   auto schedule_action( DURATION timeout, ACT && action ) {
      timer_holder id = controller_.allocate();
      controller_.activate( id, timeout, [act = std::move(action)] {
            act();
         } );
      return id;
   }

   // Отменить действие, которое было запланировано.
   void cancel_action( timer_holder id ) {
      controller_.deactivate( id );
   }
   ...
};

using mtsafe_wheel_manager = timertt::timer_wheel_manager< timertt::thread_safety::safe >;

timer_client< mtsafe_wheel_manager > client1(...);
auto id1 = client1.schedule_action( 250ms, []{ ... } );
...
client1.cancel_action( id1 );

using mtunsafe_wheel_manager = timertt::timer_wheel_manager< timertt::thread_safety::unsafe >;

timer_client< mtunsafe_wheel_manager > client2(...);
auto id2 = client2.schedule_action( 500ms, []{ ... } );
...
client2.cancel_action( id2 );

Без этого маленького дополнения класс timer_client пришлось бы делать зависящим от двух параметров шаблонов: от самого таймерного механизма и от признака thread_safety. Начиная с версии 1.1.2 достаточно всего одного шаблонного параметра.

Если вдруг кто-то не в курсе, что такое timertt, то в нескольких словах это:

Header-only библиотека без внешних зависимостей, базирующаяся на возможностях стандартной библиотеки C++11. Реализует таймеры на основе тайм-аутов, т.е. таймеры, которые должны сработать через сколько-то миллисекунд (секунд, минут и т.д.) после момента активации таймера. wallclock-таймеры не поддерживаются.

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

Библиотека поддерживает три таймерных механизма: timer_wheel, timer_heap и timer_list, у каждого из которых есть свои преимущества и недостатки. Может поддерживаться большое количество таймеров (десятки и сотни миллионов) и обеспечивается высокая скорость обработки таймеров (до нескольких миллионов в секунду).

Кросс-платформенная, проверялась посредством MSVS2013, 2015, 2017 (Windows), GCC 4.9-6.3 (Windows, Linux), Clang 3.5-3.9 (Linux, FreeBSD).

Распространяется под 3-х секционной BSD-лицензией, может свободно использоваться как в открытых, так и в закрытых коммерческих проектах.

Мы сделали timertt где-то 2.5 года назад, с тех пор она верой и правдой служит нам в SObjectizer-е. Последние правки вносились почти два года назад, когда вышла версия 1.1.1. За все время каких-то проблем с timertt не замечено.

Библиотека разрабатывалась для замены ACE в проекте SObjectizer, поэтому все, что связано с timertt, находится на SourceForge:

  • архивы с исходными текстами доступны в секции Files. Архив timertt-1.1.2-headeronly.7z содержит только основной заголовочный файл со всей функциональностью timertt. Архив timertt-1.1.2-full.7z содержит так же тесты, примеры и сгенерированный посредством Doxygen API Reference Manual;
  • основная документация для проекта собрана в Wiki;
  • исходники лежат в Subversion-репозитории на SourceForge. Релизные версии в tags/timertt, находящиеся в разработке версии в branches/timertt.

среда, 15 марта 2017 г.

[prog.flame] На тему тяжести выбора хороших имен идентификаторов

Как известно, одной из фундаментальнейших проблем в программировании является выбор хороших имен для индентификаторов в программе. Только что признать свое поражение в попытках решить эту проблему в одном частном случае и сделать сделать пространство имен с именем simple_mtsafe_st_env_infrastructure_details и класс с именем simple_mtsafe_st_env_infrastructure_t. Расшифровывается основная часть этого странный набор символов как simple multi-thread safe single-threaded environment infrastructure (т.е. простая реализация однопоточной инфраструктуры для окружения, в которой обеспечивается защита от многопоточного доступа).

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

воскресенье, 12 марта 2017 г.

[life.business] Впечатления от посещенного Startup-Forum-а

Вчера в Минске в EventSpace.by прошел Startup Forum, который мы посетили почти что полным составом своей небольшой компании. Впечатление своеобразные, попробую поделиться.

Прежде всего огромная благодарность организаторам: как всегда в EventSpace все было на отличном уровне.

Главное впечатление же от самого мероприятие таково: посетить нужно было обязательно. Но не столько ради того, чтобы научиться чему-то, сколько для того, чтобы в очередной раз вспомнить, что для успешного продвижения своего дела нужно быть предпринимателем, нужно думать как бизнесмен. Когда практически 95% времени ты связан с технологическим развитием своих продуктов об этом, к сожалению, забываешь. А тут был хороший повод вспомнить об этом.

Было два очень интересных выступления. Первое от Максима Каменкова, второе от Кирилла Волошина (того самого, одного из основателей tut.by). Выступление Кирилла Волошина, как мне показалось, было просто на голову выше всех остальных. Чувствуется просто колоссальный опыт выступления на публике, умение доносить свои мысли до слушателей, держать контакт с аудиторией и оперативно реагировать на реплики из зала.

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

Чего мне не хватило в выступлениях от опытных стартаперов, так это отдельного акцента на том, что для успеха нужна серьезная увлеченность своей идеей. Я бы даже сказал фанатичная увлеченность тем, что ты делаешь. Намеки на это звучали в ряде выступлений, но скорее под соусом того, что нельзя сдаваться, нужно находить в себе силы и желание продолжать. Однако, прямо не было сказано, что от основателя требуется готовность жить своим делом в режиме 24/7.

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

Мне представляется, что лет 30 назад (может раньше, может позже) на Западе пришло понимание, что для успешного выращивания стартапов нужно переходить к квадратно-гнездовому методу массовому их разведению. Полагаю, это было неизбежно. Вряд ли есть какие-то хорошие методы оценки перспективных новых начинаний для того, чтобы проводить хороший отсев жизнеспособных идей от нежизнеспособных. Чтобы из 100000 стартапов отобрать 100, из которых более-менее успешными окажутся 50. Проще и перспективнее дать возможность стартовать 50000 стартапов, из которых умрут 49000, оставшаяся 1000 выживет, а из этой тысячи штук сто окажутся очень успешными.

Однако, при таком массовом производстве неизбежно возникает некая индустрия раздачи денег стартапам. Формируются некоторые правила игры, некоторые алгоритмы поведения, по которым живут венчурные фонды и бизнес-ангелы для того, чтобы вкладывать деньги, получать прибыль и снижать свои риски.

При этом, однако, формируется и обратная сторона: т.е. оформляются правила игры и для стартаперов для того, чтобы с высокой долей вероятности попасть в списки тех, кто таки сумел выбить финансирование от инвесторов. И за последние лет 20 основной целью стартап-тусовки стало обучение стартаперов правилам этой самой игры. Поэтому, когды ты сам сталкиваешься с этим всем, то начинает казаться, что акценты расставляются не там. Людей учат тому, как получить инвестиции, как очаровать инвесторов, как сохранить репутацию, если стартам все-таки не взлетит.

Поэтому, если у вас есть бизнес-идея или вы понимаете, чем вы хотите заниматься (и четко отдаете себе отчет о том, почему вы хотите заниматься именно этим), то не нужно без крайней необходимости ввязываться в эту самую стартап-тусовку. Лучше сконцентрироваться на том, что вы делаете.

Другое дело, что вам могут потребоваться инвестиции. Например, вам нужно закупить оборудование для производства товаров, арендовать складские помещения, нанять персонал и т.д. Тут да, тут придется научиться правилам игры. Но сперва у вас должно возникнуть четкое понимание что и зачем вам нужно. Как правильно сказали на форуме -- деньги инвесторов -- это горючее, которое вы зальете в свою машину для того, чтобы ехать быстрее. Но "своя машина" -- это то, что должно появиться у вас еще до того, как вы пойдете просить деньги на горючее. Хотя бы в виде идеи, проработанной с достаточной степенью детализации (для чего и нужно жить своей идеей в режиме 24/7).

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

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

PS. Перед тем, как начать писать данную заметку, наткнулся на замечательную статейку в FB. Как по мне, так она просто из категории must read.