вторник, 1 января 2030 г.

О блоге

Более двадцати лет я занимался разработкой ПО, в основном как программист и тим-лид, а в 2012-2014гг как руководитель департамента разработки и внедрения ПО в компании Интервэйл (подробнее на LinkedIn). В настоящее время занимаюсь развитием компании по разработке ПО stiffstream, в которой являюсь одним из соучредителей. Поэтому в моем блоге много заметок о работе, в частности о программировании и компьютерах, а так же об управлении.

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

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

[life.photo] Характерный портрет: вы и ваш мир моими глазами. Безвозмездно :)

Вы художник? Бармен или музыкант? Или, может быть, коллекционер? Плотник или столяр? Кузнец или слесарь? Владеете маленьким магазинчиком или управляете большим производством? Реставрируете старинные часы или просто починяете примус? Всю жизнь занимаетесь своим любимым делом и хотели бы иметь фото на память?

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

суббота, 16 января 2021 г.

[soft.business] Ищу финансирование для развития RESTinio/SObjectizer/so5extra

Наша совсем маленькая компания stiffstream на протяжении нескольких лет делает такие OpenSource инструменты для С++ как:

  • RESTinio: встраиваемый HTTP/WebSocket сервер, ориентированный на эффективную асинхронную обработку входящих HTTP-запросов;
  • SObjectizer/so5extra: реализация Actor Model, Publish-Subscribe и Communicating Sequential Processes, существенно упрощающая разработку сложных многопоточных приложений.

Прибыли эти разработки не приносят, мы вели их за свои деньги.

К сожалению, кризис 2020-го ударил и по нам. Наши собственные финансовые ресурсы для развития RESTinio и SObjectizer/so5extra практически исчерпаны.

Поэтому мы приостанавливаем работы над этими проектами на неопределенный срок.

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

Либо же найдем финансирование, которое позволит сохранить устоявшийся темп развития RESTinio и SObjectizer.

В связи с этим обращаюсь к компаниям, которые уже используют наши OpenSource проекты или еще только планируют это сделать, с предложением о заключении договора на техподдержку и развитие RESTinio/SObjectizer/so5extra.

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

  • регулярно выпускать новые версии RESTinio/SObjectizer/so5extra;
  • реагировать на обнаруживаемые дефекты;
  • предоставлять консультации вашим разработчикам;
  • периодически публиковать статьи/презентации о возможностях и способах применения RESTinio/SObjectizer/so5extra.

Стоимость техподдержки составляет 200USD (~500BYN, ~15000RUB) в квартал.

Благодаря договору на техподдержку:

  • вы минимизируете риск того, что используемые вами OpenSource проекты останутся без развития и сопровождения;
  • при выпуске новых версий мы будем учитывать ваши потребности, включая нужную вам функциональность, имеющиеся у вас платформы, компиляторы и версии стандарта С++.

При необходимости, вы можете заключить с нами договор на реализацию требуемой конкретно вам функциональности в наших проектах RESTinio и/или SObjectizer/so5extra.

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

По такому договору мы обязуемся в течении 2021-го года указывать название вашей компании на GitHub страницах наших проектов, на сайте своей компании, во всех новых статьях и презентациях, посвященных нашим открытым разработкам.

Стоимость рекламных услуг составляет 150USD (~375BYN, ~11250RUB) ежеквартально.


Для продолжения работ над OpenSource проектами нам нужно, минимум, 8.5K USD на 2021-й год. Эти деньги закроют наши текущие операционные расходы (т.е. аренда офиса и сопутствующие платежи, минимальные ЗП для двух штатных сотрудников).

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


Если кто-то может помочь в поиске финансирования, то давайте пообщаемся: info на stiffstream тчк com. Или eao197 на gmail тчк com. Или Telegram/WhatsUp/Viber на +375-29-536-32-25.

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

Да и просто лайк/шер/алишер в соцсетях уже будет большим подспорьем.

суббота, 9 января 2021 г.

[work.opensource.c++] arataga: что это вообще и зачем мы публикуем это в OpenSource?

arataga -- это работающий прототип socks5+http/1.1 прокси сервера, который мы в прошлом году разрабатывали для одного из наших клиентов. К сожалению, этот прототип остался невостребованным. Ну а чтобы не пропадать добру и самопиара ради, мы решили открыть его исходники.

Как все развивалось

Дело было так: с 2019-го года мы работали с заказчиком, который эксплуатировал у себя некий старый прокси-сервер. Весьма старый, написанный с применением модели thread-per-connection, да еще и оставшийся без сопровождения. Собственно, мы как раз и занимались его доработкой под нужды заказчика.

Где-то к концу весны 2020-го стало понятно, что больше ничего хорошего из этого прокси-сервера не выжать. Что нужно его заменять на что-то новое, написанное с нуля или же переделанное готовое (типа nginx или envoy после обработки напильником).

Изначально в этот проект влезать не хотелось вообще, т.к. объем работ предполагался большим, сроки короткими, поэтому наших ресурсов могло тупо не хватить. Но мы согласились помочь в написании ТЗ для будущих исполнителей и уже в процессе подготовки ТЗ сложилось ощущение, что здесь можно будет применить и SObjectizer, и RESTinio, и что при должном разбиении на итерации можно будет справиться и своими скромными силами. Посему ввязались в разработку нового прокси-сервера под требования заказчика.

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

Что стало неприятным сюрпризом, тем более, что до этого никаких проблем с заказчиком не было. И даже по ходу работ над arataga мы взаимодействовали по другим вопросам и он оплачивал нам сделанные ранее работы.

Наши обязательства перед клиентом закончились. У нас на руках остался arataga и с этим нужно было что-то делать. Например, выбросить и забыть. Или же открыть.

Зачем нужно было делать arataga?

У заказчика были следующие и, как мне представляется, местами весьма специфические условия:

[prog.c++] Пару слов про позиционирование RESTinio и основные хотелки для RESTinio на 2021-й

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

ИМХО, уже пришла пора более точно определиться с позиционированием RESTinio в экосистеме C++. Это раньше RESTinio был молодой и мало кому известной разработкой. Сейчас же ситуация меняется, мы уже не молоды ;)

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

Мне представляется, что RESTinio уникален тем, что под одной крышей здесь собрано:

  • простота использования RESTinio для каких-то очевидных и понятных действий. Так, чтобы получить запрос и пройтись по списку HTTP-полей, не нужно выписывать вручную процедуры чтения данных из сокета;
  • гибкая настройка RESTinio под условия пользователя. Захотел пользователь применять Boost.Log для логирования? Нет проблем, RESTinio позволяет написать адаптер и RESTinio будет логировать свои действия с помощью этого адаптера. Или, например, захотел пользователь запускать вместе с RESTinio на io_context еще и какие-то свои сетевые операции... Опять же, нет проблем;
  • набор инструментов, которые позволяют применять RESTinio для каких-то нетривиальных сценариев. Например, средства работы с HTTP-заголовками используются в arataga даже для исходящих HTTP-запросов.

Что делает RESTinio хорошим выбором для ситуаций, когда разработчику нужно что-то сильно повыше уровнем, чем Boost.Beast, но при этом хочется иметь гораздо больший контроль за происходящим, чем в oat++ или cpp-httplib.

Отличный пример такой задачи, на мой взгляд, -- это прокси-сервер типа arataga. На Boost.Beast его делать будет слишком хлопотно. А oat++/cpp-httplib вряд ли дадут доступ к своим потрохам.

Именно в этом направлении, думаю, и стоит развивать RESTinio дальше.

Т.е., RESTinio должен быть выше уровнем, чем Boost.Beast, но ниже, чем oat++ и cpp-httplib. Но при этом средствами RESTinio продвинутый разработчик с небольшими усилиями должен уметь создать для себя что-то похожее на oat++/cpp-httplib, но заточенное под специфические требования конкретной прикладной задачи.

Или же, в более лаконичной форме:

RESTinio должен стать конструктором из продвинутых инструментов, отлично подогнанных друг к другу.

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


Теперь попробую обозначить несколько приоритетов в предполагаемом развитии RESTinio в 2021-ом году.

Во-первых, это замена http_parser на что-то другое. Конечно же, хочется иметь собственную реализацию, которая бы a) сделала RESTinio полностью header-only библиотекой, и b) поддерживала бы различные тонкие моменты в HTTP-протоколе (вроде chunk extensions). Если это не получится, то рассмотреть и внедрить какую-то готовую альтернативную реализацию (llhttp, picohttpparser, что-то еще).

Во-вторых, добавление режима работы в котором RESTinio не будет загружать весь запрос в память перед вызовом обработчика, а будет отдавать читаемые от клиента данные кусками по мере их поступления. Это позволит a) эффективно обрабатывать запросы с большим объемом входящих данных, и b) использовать RESTinio для сценариев, в которых сейчас RESTinio не может применяться в принципе (например, для разработки прокси-сервисов).

В-третьих, добавление поддержки http/2. Пока RESTinio жестко завязана на работу со всего лишь один протокол. От этого нужно уходить, т.к. рано или поздно, http/2 и http/3 вытеснят http/1.1. И если в 2021-ом получится изменить RESTinio так, чтобы в нем поддерживалось сразу два протокола, то это откроет отличную возможность добавить со временем еще и http/3, а может и еще что-нибудь.

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

По поводу поддержки в RESTinio клиента я могу лишь повторить то, что уже говорил раньше: без внешнего финансирования мы поднять такую задачу не сможем. Так что если кто-то готов вложить в RESTinio, минимально, 3.5K USD, то давайте всерьез обсудим такую возможность.


Если кого-то интересует перечень встраиваемых HTTP-серверов для C++, то выглядит он приблизительно так (перечисление в случайном порядке): RESTinio, Boost.Beast, cpp-httplib, http_backend, Pistache, RestBed, served, C++ REST SDK, proxygen, Simple-Web-Server, drogon, oat++

суббота, 2 января 2021 г.

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

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

Фильмы

Смертельные иллюзии (2020). Если кому-то хорошо зашли обе части "Иллюзии обмана", то смело можно и этот фильм посмотреть. Снято, по крайней мере, красиво и зрелищно.

Отряд Фокстрот (Foxtrot Six, 2019). Неожиданно бодренький, хотя и дешевый, околофантастический боевик из Индонезии. До "Рейда", конечно же, не дотягивает, но если хочется отключить мозги и посмотреть бескомпромиссное и динамичное рубилово-мочилово, то достойный вариант на нынешнем безрыбье.

Честный вор (Honest Thief, 2020). Все средненько и предсказуемо. Вполне можно и посмотреть, когда ничего лучше нет. Жалко только, что местами спецэффекты были сделаны совсем уж убого и дешево.

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

Новые мутанты (The New Mutants, 2020). Любители серии про "Людей Икс" могут глянуть, конечно. Но лучше не стоит, ничего хорошего в фильме нет, как по мне. А уж зачем туда притянули лесбийские отношения...

Ритм-секция (The Rhythm Section, 2020). Редкая дрянь несмотря на неплохих актеров в главной роли и, местами, отличную работу оператора. Смело можно не смотреть.

Гренландия (Greenland, 2020). Муть полная. Да и на удивление убогие и дешманские спецэффекты для фильма-катастрофы такого масштаба.

Сериалы

Смог полностью отсмотреть два сериала:

Мандалорец (второй сезон). Достойное продолжение первого сезона. По декорациям в некоторых сериях казалось, что даже гораздо круче первого сезона. Тут явно тот случай, когда сериалом по мотивам "Звездных войн" занялись люди, искренне любящие "Звездные войны". Так что настоящим продолжением оригинальной трилогии, определенно, является этот сериал, а не три полнометражных говноаттракциона с Дэйзи Ридли в главной роли. Ну и плюс "Изгой один". Соответственно, любителям первых трех фильмов можно смело рекомендовать к просмотру.

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

И еще два досмотреть не смог, осилив по 3-4 первые серии:

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

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


Отдельно нужно сказать про Рокетмен (Rocketman, 2019). Я так и не понял, что это было. То ли гениальная находка в виде встраивания песен Элтона Джона в нить повествования, то ли это был здоровенный гвоздь в крышку гроба. Одно могу сказать точно: если бы не эти самые песни Элтона, которые, как по мне, близки к гениальности и уже вошли в историю, смотреть было бы вообще нечего.


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

А уж за кульминационную сцену с боем главных героев в окруженном ДОТе всех причастных следовало бы выгнать из профессии на мороз, ибо дурно пахнущий голливудскими штампами бред с последним выстрелом за мгновение до разрывов заброшенных в ДОТ гранат... Это было уже за гранью добра и зла.

Тем не менее, отдельное спасибо создателям фильма хочется сказать за то, что наверное, это первый из военных фильмов последних лет (в паре с "28 панфиловцев"), в которых у чумазых и перепачканных грязью, копотью и кровью героев из окопов нет ослепительно белых зубов. Почему-то лично мне именно сверкающие белоснежные зубы у солдат, сидящих днями и ночами в окопах, сразу бросаются в глаза в современном кино про войну. Что многое говорит об уровне фильма, если уж даже на достоверность гримма не заморачиваются. В "Подольских курсантах" хотя бы этой фигни не было.

вторник, 29 декабря 2020 г.

[prog.c++] RESTinio-0.6.13: последний большой релиз в 2020-ом и, возможно, вообще последний в рамках ветки 0.6

Состоялся очередной релиз RESTinio: версия 0.6.13, в которой таки были реализованы идеи по выстраиванию обработчиков запросов в цепочки (по аналогии с ExpressJS-овскими middleware). Подробнее про новшества версии 0.6.13 я собираюсь рассказать в отдельной статье на Хабре. Кто не хочет ждать, тот может заглянуть в нашу документацию.

Скорее всего, этот релиз станет последним большим релизом в рамках ветки 0.6. И дальнейшее развитие RESTinio будет происходить уже в рамках новой ветки 0.7 без оглядки на совместимость с веткой 0.6. Это не значит, что мы все поломаем напрочь, но какие-то несовместимости обязательно будут и код под RESTinio-0.7 придется адаптировать.

В пользу того, чтобы перестать развивать ветку 0.6 и начать делать новую 0.7 говорит несколько факторов (порядок их перечисления случаен):

  • в RESTinio уже накопилось несколько моментов, которые требуют переделки (какие-то из них прямо в коде помечены как FIXME). А эта переделка невозможна без слома текущего API;
  • до сих пор в RESTinio поддерживался только http/1.1. Думаю, чтобы двигаться дальше нужно добавлять в RESTinio и http/2, и http/3. А на такую мультпротокольность RESTinio не был расчитан. Непонятно, можно ли уместить поддержку мультипротокольности в существующую архитектуру и API RESTinio. Поэтому проще заниматься этим вопросом без оглядки на совместимость с предыдущими версиями RESTinio;
  • поддержка цепочек обработчиков, которая появилась в 0.6.13, распространяется только на синхронные обработчики. А хочется иметь такую же и для цепочек асинхронных обработчиков. Но придумать как это сделать в рамках версии 0.6 у меня не получилось. Есть смутная идея, но она требует изменения API;
  • сейчас RESTinio сперва полностью загружает в память входящий запрос и лишь затем вызывает обработчик для него. Хочется добавить режим работы, в котором RESTinio сможет отдавать входящий запрос на обработку частями, без предварительного накопления всего содержимого запроса;
  • один из важнейших факторов: лежащая в качестве базы RESTinio внешняя библиотека http-parser осталась без сопровождения. Поэтому в RESTinio парсер HTTP нужно заменить на что-то. Либо на другую готовую стороннюю библиотеку, либо на свой собственный велосипед. Такая замена существенно изменит список зависимостей для RESTinio, а это уже точно ведет к переходу к следующему номеру в версии.

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

Сколько времени это займет и когда можно ждать 0.7.0 не могу сказать. Вряд ли раньше весны 2021-го.

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

Сразу хочу сказать по поводу поддержки клиента в RESTinio. Без внешнего финансирования мы не сможем поднять эту тему. Так что если кто-то использует RESTinio на работе и хотел бы с помощью RESTinio обслуживать не только входящие, но и исходяще соединения, то рассмотрите, пожалуйста, возможность заказать такую доработку RESTinio у нас. Цена вопроса, думаю, будет где-то в районе 3.5-6k USD.


Пользуясь случаем хочу поблагодарить всех, кто интересуется RESTinio. И особенно тех, кто рискнул и выбрал нашу разработку. Очень надеюсь, что вы не разочаровались.

Если кто-то хочет помочь в развитии RESTinio, то на данный момент одним из самых больших подспорьев для нас является распространение информации о RESTinio. Каждое упоминание RESTinio в Интернете (Facebook, LinkedIn, Reddit-е, HackerNews, Twitter, Slack, Telegram и т.д.) поддерживает нашу мотивацию и желание развивать RESTinio дальше.