понедельник, 4 декабря 2017 г.

[prog] А какие в Сети есть ресурсы, посвященные разработке middleware?

Поймал себя на том, что мониторинг русскоязычных профильных ресурсов, вроде Habrhabr, LOR, RSDN, opennet ведет к весьма низкому проценту полезного сухого остатка. Потому, что изрядная доля тамошних материалов касается прикладных задач. Яркий пример -- вот эта статья, которую я просмотрел из-за наличия тега Go (ну интересно, как и где используется Go).

Как по мне, так ниша прикладных задач для C++ (да и для Rust-а, полагаю), закрылась давным-давно. Может уже лет двадцать назад. Хотя я вообще придерживаюсь мнения, что для прикладных задач C++ вообще никогда не предназначался. Сейчас для применения C++ есть несколько ниш, в которых C++ может быть вполне разумным выбором. Ниши эти специфические, хотя и не такие уж маленькие.

Одна из таких ниш -- это разработка разнообразного middleware. Ну, например, это могут быть СУБД. Могут быть MQ-шные брокеры. Могут быть какие-то шлюзы, вроде SMTP-шлюзов. И т.д.

В связи с этим у меня вопрос к читателям: есть ли какие-то ресурсы, на которых вопросы разработки middleware представлены в концентрированном виде?

Ну вот, есть, скажем, ресурс highscalability.com. Интересный дайджест-ресурс для материалов из области высоконагруженных систем. Хотелось бы найти что-то похожее, но для направления middleware. Может кто-то что-то подскажет?

пятница, 1 декабря 2017 г.

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

Совершенно незаметно пролетел ноябрь и пришло время публиковать очередной список отсмотренных фильмов. В начале списка идут те фильмы, которые понравились больше, затем те, что понравились меньше.

Тор: Рагнарек (Thor: Ragnarok, 2017). Безусловно, главный фильм месяца. Смешной. Отличный видеоряд и бодренькое, местами, музыкальное сопровождение. Но вот там, где плотность шуток снижалась, мне было скучновато. А так отличное кино, чтобы отключить мозги и получить удовольствие.

Удача Логана (Logan Lucky, 2017). Отличное кино, но по-началу неспешное и нудное. Это нужно перетерпеть, развязка, как по мне, все оправдывает.

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

Погром (Mayhem, 2017). Я любитель такого рода фильмов, главный смысл которых -- это "мочи их всех!". Поэтому и данную картину посмотрел с удовольствием. Но, если бы в него вложили чуть-чуть побольше денег, то получилось бы еще круче и убойнее.

Механика теней (La mécanique de l'ombre, 2016). Европейцы снимают кино не так, как американцы. Иногда получаешь удовольствие просто от того, что кино выглядит и воспринимается совсем не так, как голливудская продукция. Здесь именно такой случай. Вроде бы не динамично, вроде бы нет захватывающей истории, а смотреть все равно интересно. И герою сопереживаешь.

Жизнь впереди (2017). Смотреть было интересно. Но когда фильм закончился, то возник вопрос: "И это все?" Как по мне, так авторы только-только раскрыли своих персонажей, познакомили с ними зрителей, подготовили к неминуемой кульминации... Которой как раз и не случилось.

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

Смерть на Аляске (Sweet Virginia, 2017). Так себе. Все время ждешь, что вот-вот что-то такое произойдет, что оправдает потраченное время. А оно не происходит и не происходит. Хотя к актерам, например, претензий нет. Это скорее сама история такая, не цепляющая.

Наемник/Американций убийца (American Assassin, 2017). Первая половина или даже первые 2/3 фильма вполне себе OK. Но вот то, что происходит в финале, особенно с ядрёной бомбой... Это какой-то сплошной facepalm.jpg.

Геошторм (Geostorm, 2017). Жалкое поделие из категории "Что это, блин, было?" Наверное, фильм рассчитан на категорию детей младшего школьного возраста. Но даже и в этом случае спецэффекты хотелось бы более качественные, не оставляющие впечатление мультика.

среда, 29 ноября 2017 г.

[prog.c++] Смотрим в сторону SObjectizer-5.6 (самое первое приближение)

Прошло уже более трех лет с момента релиза версии 5.5.0. Все эти три года SObjectizer развивался в рамках ветки 5.5 с особым акцентом на совместимость между версиями. Может быть не всегда у нас получалось сохранять 100% совместимость и где-то что-то могло поломаться. Но, в подавляющем большинстве случаев, насколько мне известно, переход на новые версии SO-5.5.* происходил без каких-либо сложностей и необходимости что-то исправлять в коде.

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

Имхо, три года развития в рамках ветки 5.5 -- это вполне достаточный срок для того, чтобы задуматься о том, чтобы заняться версией 5.6, в которой уже не будет 100% обратной совместимости с SObjectizer-5.5. И переход на которую будет требовать модификации исходников, а может быть, местами, и перепроектирования. Посему под катом изложено несколько текущих мыслей на тему версии 5.6. Кому интересно -- милости прошу. Чем больше будет фидбэка, тем лучше.

[business] Какие способы продвижения себя работают, а какие нет?

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

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

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

Поясню откуда возник такой интерес. Наша компания занимается не только разработкой Open-Source продуктов, но и оказанием еще нескольких видов услуг. До сих пор это направление мы вообще никак не рекламировали и не акцентировали на нем внимание. Видимо, это было неправильно. Нужно устранить эту недоработку ;) Но, т.к. к своей работе мы подходим основательно, стараясь предварительно освоить материал, то хочется изучить опыт старших и более опытных в продажах товарищей.

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


Ну и да, если кому-то лень зайти на наш сайт в раздел Услуги, то кратко и по существу: мы разрабатываем софт и под заказ. Дорого (по крайней мере, по меркам РФ), долго, качественно. Хотя первые два пункта могут обсуждаться, а вот делать некачественно -- вот это вряд ли.

понедельник, 27 ноября 2017 г.

[prog] Ссылки, которые помогли мне в борьбе с CMake

Вроде как удалось забороть CMake и получить то, что хотелось. Зафиксирую в склерознике несколько ссылок, которые помогли лично мне. Может быть они помогут еще кому-нибудь.

Сразу скажу, что это ссылки на уже более-менее продвинутый материал. Если у вас нет опыта работы с CMake вообще, то нужно начать с чего-нибудь совсем простого. Благо тривиальных примеров работы с CMake в Сети очень много. Такое ощущение, что любой чайник, которому удалось самостоятельно собрать с помощью CMake простой HelloWorld из одного cpp-файла, считает своим долгом написать развернутую статью о том, как пользоваться CMake. В подавляющем большинстве все эти статьи ни о чем и на 90% повторяют друг друга. Из толковых вводных материалов я бы отметил вот этот репозиторий с примерами.

Если же говорить о более продвинутых материалов, то:

Две презентации от Daniel Pfeifer: "CMake - Introduction and best practices" и "Effective CMake". Для тех, кто пытается жить с современным CMake, эти презентации, как говорится, must have and must read.

Очень мне помог краткий тутуриал по использованию CMake от проекта KDE. Вроде как там ничего секретного не раскрывается. Но именно там мне стало понятно, как делаются какие-то вещи.

В качестве примеров CMake-файлов помогли исходники проектов Cinder и AWS SDK C++.

Ну и куда же без официальной документации по самому CMake. Для меня основным мануалом стал раздел cmake-packages (ну и ссылки оттуда на другие документы). Не скажу, что описано толково и понятно. Но вкурить, в конце-концов, удалось.

Надеюсь, эти ссылки помогут в освоении современного CMake.


За минувшую неделю я уже достаточно набросил на CMake. Но, даже после того, как мне удалось его более-менее забороть, я все равно думаю, что если CMake -- это лучшее, что C++-сообщество смогло для себя сделать, и если CMake -- это и есть то "светлое" будущее, которое ждет мир C++, то C++ вместе с его миром и "светлым будущим" под ручку с CMake нужно закапывать. Быстро и безжалостно.

пятница, 24 ноября 2017 г.

[prog.c++] Альфа-версия обновленной поддержки CMake в SObjectizer

Задышала первая версия обновленных CMake-скриптов для SObjectizer-5.5.20. Взять и попробовать можно вот из этого архива. Взять и попробовать очень желательно, ибо сами мы не местные CMake в своей работе не используем. Поэтому на своих повседневных задачах проверить правильность сделанных CMake-скриптов не можем. А вот тем, кто использует SObjectizer именно через CMake наши изменения могут помочь. Или навредить :)

Итак, что было сделано? Было сделано так, чтобы SObjectizer можно было через CMake собрать, затем выполнить make install, затем задействовать у себя в проекте посредством find_package.

Попробую пояснить на пальцах. Для Unix-подобных систем, т.к. там проще.

Скачиваем архив с SObjectizer-ом, распаковываем его: unzip so-5.5.20-alpha2-201711251230.zip и заходим в образовавшийся каталог so-5.5.20-alpha2-201711251230. Там выполняем следующие действия:

mkdir cmake_build
cd cmake_build
cmake ../dev
cmake --build . --config Release
cmake --build . --config Release --target install

Будет скомпилирован только SObjectizer в виде статической и динамической библиотек. После этого он будет установлен в стандартных для вашего Unix-а путях (например, в /usr/local/include, /usr/local/lib).

Если у вас CMake-3.8 или более новый, то для того, чтобы использовать SObjectizer в своем CMake проекте вы пишете что-то вроде:

cmake_minimum_required(VERSION 3.1)

project(hello_world)

find_package(so_5 5.5.20 REQUIRED)

add_executable(hello_world_static hello_world.cpp)
target_link_libraries(hello_world_static so_5::StaticLib)

Тут строится приложение hello_world_static, которое линкуется к статической версии SObjectizer-а.

Если нужно слинковаться с динамической библиотекой SObjectizer-а, тогда пишете что-то вроде:

cmake_minimum_required(VERSION 3.1)

project(hello_world)

find_package(so_5 5.5.20 REQUIRED)

add_executable(hello_world_shared hello_world.cpp)
target_link_libraries(hello_world_shared so_5::SharedLib)

Ну и компилируете это обычным образом.

Если же вы под Windows или не хотите гадить в своем уютненьком Unix-е в стандартные пути для размещения библиотек, то можно поступить, например, так (предполагаем, что ~ -- это ваш рабочий каталог, в рамках которого вы хотите оставаться, и в который вы уже скачали so-5.5.20-alpha2-201711251230.zip):


~$ unzip so-5.5.20-alpha2-201711251230.zip
~$ cd so-5.5.20-alpha2-201711251230
~/so-5.5.20-alpha2-201711251230$ mkdir cmake_build
~/so-5.5.20-alpha2-201711251230$ cd cmake_build
~/so-5.5.20-alpha2-201711251230/cmake_build$ cmake -DCMAKE_INSTALL_PREFIX=target -G "Visual Studio 12 2013" ../dev
~/so-5.5.20-alpha2-201711251230/cmake_build$ cmake --build . --config Release
~/so-5.5.20-alpha2-201711251230/cmake_build$ cmake --build . --config Release --target install
~/so-5.5.20-alpha2-201711251230/cmake_build$ cd ~/hello_world
~/hello_world$ mkdir cmake_build
~/hello_world/cmake_build$ cmake -DCMAKE_PREFIX_PATH=~/so-5.5.20-alpha2-201711251230/cmake_build/target -G "Visual Studio 12 2013" ..
~/hello_world/cmake_build$ cmake --build . --config Release

Для Unix-а, естественно, придется поменять значение в -G (либо вообще -G не указывать, т.к. под Unix-ами обычно имеется всего один тулсет).

Если у вас более старый CMake, чем CMake-3.8, то придется выполнить в своих CMakeLists.txt дополнительные действия: нужно указать, что вам требуется C++11. Например, это можно сделать в вашем главном CMakeLists.txt:

cmake_minimum_required(VERSION 3.1)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

project(hello_world)

find_package(so_5 5.5.20 REQUIRED)

add_executable(hello_world_shared hello_world.cpp)
target_link_libraries(hello_world_shared so_5::SharedLib)

Пример того, как можно подключать SObjectizer через find_package, можно увидеть в этом репозитории (см. dev/CMakeLists.txt).


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


~/your_project_root
  `- so_5/
  `- timertt/
  `- your_another_project/
  `- your_main_project/
  ...
  CMakeLists.txt

И вот в своем главном CMakeLists.txt вы имеете возможность сделать просто add_subdirectory(so_5) и все. Далее вы должны получить возможность использовать so_5::StaticLib и so_5::SharedLib в своих CMake-овских командах target_link_libraries.

Пример того, как можно подключать SObjectizer через add_subdirectory, можно увидеть в этом репозитории (см. dev/CMakeLists.txt).


В общем, еще раз просьба к тем, кто использует SObjectizer совместно с CMake: попробуйте новую версию. Любой фидбек нам будет полезен и поможет сделать поддержку CMake более удобной.

среда, 22 ноября 2017 г.

[prog.c++] Шаблоны против копипасты 7: вывод нужных типов из указателей на методы

В коде решения для Highload Cup-а Коли Гродзицкого обнаружился интересный способ использования C++ных шаблонов для того, чтобы избавится от копипасты. Насколько я понимаю, суть проблемы была в следующем:

Есть класс database_t, который нужно наполнить экземплярами структур user_t, location_t и visit_t. Структуры же эти вычитываются из JSON-файлов. Т.е. есть файлик вроде users_1.json, из которого нужно прочитать все JSON-объекты, преобразовать их в экземпляры user_t и запихнуть все эти экземпляры в database_t. Тоже самое нужно сделать с visits_1.json (структуры visit_t) и locations_1.json (структуры location_t).

Видимо, код всех этих операций был настолько однотипным, что за счет шаблонов его удалось свести вот к такому: