четверг, 1 февраля 2018 г.

[prog.c++] Как я тут давеча выкрутился с тестированием...

В последние пару недель работаю с кодом, в котором активно используются циклические ссылки на динамически созданные объекты. В общих чертах там что-то вот такое:

namespace details {

class data_t : public std::enable_shared_from_this {
   struct handler_t : public std::enable_shared_from_this {
      std::shared_ptr<data_t> owner_;
      ...
   };
   std::vector<std::shared_ptr<handler_t>> handlers_;
   ...
};

/* namespace details */

templatetypename Message >
class definition_point_t {
   std::shared_ptr<details::data_t> data_;
   ...
};

Т.е. есть объект типа definition_point_t, который держит умный указатель на объект details::data_t. При этом внутри details::data_t есть контейнер умных указателей на объекты-хендлеры, каждый из хэндлеров так же содержит умный указатель на этот же details::data_t. Получается, что details::data_t не может быть уничтожен, пока у него список хендлеров не пуст. Да и сами хендлеры не могут быть уничтожены, пока есть details::data_t, который на них ссылается.

Это все означало, что ответственность за корректное уничтожение details::data_t лежит на тех типах, которые data_t используют. Это, в частности, тип definition_point_t. Соответственно, нужно было написать набор юнит-тестов, которые бы прогоняли различные сценарии использования data_t внутри definition_point_t, и проверяли, удаляется ли data_t в конце-концов или нет.

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

[life.cinema] Очередной кинообзор (2017/12 + 2018/01)

Возвращаюсь к публикации кратких кинообзоров. В этот раз сразу за два месяца, т.к. в конце прошлого года с кинообзором не сложилось. Итак:

2017.12

Первые четыре фильма в списке вполне себе ничего. Первый вообще отличный. А вот последние два -- отстой, особенно самый последний.

Скрюченный домишко (Crooked House, 2017). Отличная, выполненная в классическом стиле экранизация Агаты Кристи. Получил большое удовольствие от просмотра.

Счастливого дня смерти (Happy Death Day, 2017). Неплохая вариация на тему "Дня сурка". Хотя, как по мне, фильм рассчитан больше на тинейджерскую аудиторию.

Снеговик (The Snowman, 2017). Что очень понравилось, так это атмосфера. Действительно погружаешься в ту среду, в которой происходят события фильма. Но вот финал настолько ущербный, что напрочь перечеркивает все хорошие впечатления.

Между нами горы (The Mountain Between Us, 2017). Снято красиво. И актеры хорошие. Однако по ходу сюжета возникают вопросы, которые не дают нормально воспринимать происходящее (например, чем герои фильма кормили собаку пока выбирались из заснеженных гор?). Посему фильм не зацепил. А уж финал и вовсе оказался предсказуемым до невозможности.

Звёздные войны: Последние джедаи (Star Wars: Episode VIII - The Last Jedi, 2017). Красочно, конечно, все деньги на экране. Но если этот фильм и может кого-то зацепить, так разве что совсем маленьких детей.

Как Витька Чеснок вез Леху Штыря в дом инвалидов (2017). В двух словаях: Алексей Серебряков снялся в очередной чернушной социальной драме. Если кому-то такой жанр современного российского кино нравится, то смело можно смотреть. Мне, например, не понравилось. В том числе и из-за того, что авторы фильма не смогли поставить жирную точку в финале, оставив зрителя самостоятельно разбираться с якобы многозначительным многоточием.

2018.01

А вот тут все плохо. Смело могу рекомендовать только первый фильм из списка. Второй и третий -- разве что любителям жанра. На все остальное можно вообще не тратить время.

Приключения Паддингтона 2 (Paddington 2, 2017). Отличное кино для семейного просмотра.

Борг/Макинрой (Borg McEnroe, 2017). Любители спортивных драм могут посмотреть. Для остальных он может оказаться слишком неспешным и затянутым.

Ёлки новые (2017). Вообще не фанат этой эпопеи. Предыдущую часть вообще не смотрел. Эту довелось. Не шедевр, конечно. Но не раздражает и местами смешно, а иногда и симпатично.

Акты насилия (Acts of Violence, 2018). Такое ощущение, что несколько неплохих актеров собрались и замутили небольшую халтурку. Ну и результат соответствующий: халтура она и есть халтура.

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

Убийство в восточном экспрессе (Murder on the Orient Express, 2017). Сплошное издевательство над первоисточником. Кто читал оригинал, тому не смотреть. Кто не читал... Тоже не смотреть, лучше прочесть.

Короче (Downsizing, 2017). Снято прикольно. Некоторые сцены доставляют. Но в целом фильм не зацепил.

Открытая могила (Open Grave, 2013). Несмотря на наличие нескольких характерных актеров, получилось не пойми что. Можно не тратить свое время.

Субурбикон (Suburbicon, 2017). Посмотрел. Не проникся. Так что зачем смотрел не понятно. Потерянного времени жалко.

Безбашенные (Renegades, 2017). Все настолько прямолинейно, предсказуемо и скучно, что этот фильм может быть интересен разве что малолетним детям.

Ну и пару слов о Коловрате, но и не только

Попытался таки засмотреть новый российский фильм "Легенда о Коловрате". Хотя после обзора Клима Жукова у Гоблина было понятно, что ничего хорошего не выйдет. Но уж сильно много восторженных отзывов было у меня в FB-ной ленте во время премьеры. Захотелось составить свое собственное мнение.

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

В общем, говно редкое. И если это "символ возрождения российского кино", то мне очень жаль это самое российское кино... Если посмотреть на громкие российские премьеры в 2017-ом: Викинг, Притяжение, Легенда о Коловрате и Скиф, то как-то совсем печально. И это я еще "Движение вверх" не смотрел. Да и не собираюсь...

среда, 31 января 2018 г.

[prog.c++.flame] Простите, не могу удержаться от троллинга по поводу длинных имен... :)

Некоторое время назад довелось столкнуться на Хабре вот с таким мнением:

Мне не хотелось бы, чтобы появление простого синтаксиса вложенных пространств имён привело к росту их числа. По моему опыту программисты часто злоупотребляют: пишут длинный многоуровневый namespace (30-40 символов) там, где конфликтов имён быть не может, и в итоге просто неудобно пользоваться.
Заголовки потом выглядят отвратительно.
При этом я ничего не имею против namespace boost::detail, но даже boost::algorithm::any_of мне уже не нравится.

Вспомнил про это мнение, когда при написании Doxygen-овской документации к новой версии so_5_extra увидел в сгенерированном HTML-е вот такое полное название одного из классов:

so_5::extra::async_op::time_limited::details::msg_independent_part_of_definition_point_t<Operation_Data>

Пространства имен в C++ рулят и бибикают! ;)

понедельник, 29 января 2018 г.

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

Мы обновили свою легковесную библиотеку для встраивания HTTP/WebSocket сервера в C++ приложение до версии 0.4.1. В этой версии мы поправили несколько недочетов и, самое главное для тех, кто любит Boost: мы сделали возможным использовать RESTinio совместно с Boost.Asio и Boost.Regex. Для этого, правда, нужен Boost-1.66 (ну что поделать, только в этой версии Boost-а Boost.Asio догнала standalone-версии Asio).

Так же мы работаем над тем, чтобы сделать RESTinio доступным через vcpkg и Conan. Но тут была засада с тем, что CMake вплоть до версии 3.10 не может распознать и подхватить Boost-1.66 под Windows. Как только CMake научится это делать, так мы сразу и... Ну, может быть не так сразу, но и... ;)

Работа над версией 0.4.2 уже началась. У нас есть некоторые свои планы. Но, если кто-то что-то хочет увидеть в RESTinio, то дайте знать. Может мы это сделаем даже в рамках следующего релиза.

Попутно мы слегка модифицировали свой сайт. Надеемся, что так будет удобнее для посетителей.

PS. Пока события развиваются так, что где-то к середине февраля мы закончим свои основные текущие работы. И, по сути, можно будет объявлять "свободная касса" :) Так что если кому-то нужны рабочие руки хороших C++ разработчиков, то мы можем предложить свои услуги.