понедельник, 12 апреля 2021 г.

[prog.c++] Наглядно на тему сложности освоения SObjectizer-а

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

Одной из самых серьезных проблем с продвижением SObjectizer-а в массы является недостаток публичных "историй успеха" на которые мы могли бы ссылаться. Из-за этого у нас всегда сложности с ответом на вопрос "Да кто вашим поделием вообще пользуется?"

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

О том, что SObjectizer где-то и как-то применяется мы узнаем, как правило, из двух источников:

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

И вот второй источник мало того, что дает нам информацию о том, что SObjectizer кто-то пробует, так еще и многое говорит о качестве и объеме справочной информации, которой мы снабдили SObjectizer. Поскольку по большей части это не вопросы из категории "у меня что-то не компилируется, почему?", а обращения за советом как быть в той или иной ситуации. Т.е. люди нашли SObjectizer, изучили его базовые принципы, попробовали что-то сделать, дошли до какой-то не самой тривиальной ситуации и только после этого решили спросить наше мнение.

Совсем свежий пример в Google-группе. Человек разобрался с SObjectizer-ом, сделал далеко не самый простой имитатор того, что ему нужно в его предметной области, и спросил совета по достаточно интересной и неоднозначной теме.

Так что SObjectizer -- это вовсе не "образцовое ненужно" (на смотря на то, что меня в этом настойчиво убеждают благожелатели в Интернетах). Этим инструментом интересуются, его пробуют, его используют.

То, что мы вынуждены приостановить работы над нашими OpenSource проектами (включая SObjectizer), не означает, что проект заброшен. Без поддержки, как можете видеть, пользователей не оставляем. Ну а как представится возможность, так и продолжим снабжать SObjectizer/so5extra и RESTinio новыми фичами.

четверг, 8 апреля 2021 г.

[prog.c++.bicycle] Отдельный тип для строковых литералов своими руками

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

class long_living_object {
  const char * value_;
public:
  long_living_object(const char * v) : value_{v} {}
  ...
};

long_living_object make_object_ok() {
  return { "Hello, World!" };
}

то у нас, в принципе, все нормально. В возвращаемом функцией make_object_ok объекте будет находиться валидный указатель.

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

long_living_object make_object_bug() {
  char greeting[] = "Hello, World!";
  return { greeting };
}

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

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

понедельник, 5 апреля 2021 г.

[life.music] Продолжение саги о выборе хороших, но недорогих наушников на Aliexpress. Отчет о побывавших у меня внутриканалках

Сегодня кратко пройдусь по моделям внутриканальных наушников, которые побывали у меня в руках. За исключением KZ ZSN Pro, с которых все началось и которые я благополучно продал еще в январе.

Прежде чем начать...

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

среда, 31 марта 2021 г.

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

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

Фильмы

Девушка, подающая надежды (Promising Young Woman, 2020). Посмотрел случайно. Зашло на удивление хорошо. Главная моя претензия к фильму в том, что с исполнительницей главной роли угадали хорошо, но совершенно не верилось, что ей по фильму 30 лет. Если бы по фильму ей было 35, то и смотрелось бы более естественно, и то, что она так долго все это хранила в себе, придавало бы происходящему больше драматизма.

Последний богатырь: Корень зла (2020). Как по мне, так чуть слабее первой части, но все равно понравился. Для современного российского кино так прям очень здорово.

Марионетка (Marionette, 2020). Не так уж и плохо. Можно посмотреть.

Душевная кухня (Soul Kitchen, 2009). Странный фильм. Не берусь даже сказать к какому жанру его можно отнести, но смотреть было интересно.

Гениальное ограбление (Way Down, 2021). Лет 15 назад мог бы и зайти. А сейчас воспринимается как-то ну очень уж наивно и штамповано как-то, без изюминки.

В чужой шкуре (Possessor, 2020). Купился на достаточно высокий рейтинг этого фильма на IVI и Kinopoisk. Оказалась редкая муть. Такое ощущение, что снимали его сексуально озабоченные укурки. Хорошо хоть, что это были озабоченные гетеросексуалы, а то ведь могло быть и гораздо хуже. В общем, не хотите терять времени -- не смотрите.

Сериал

Кардинал (Cardinal, четыре сезона). Понравился. Смотреть было интересно. Хотя это как бы и не детектив вовсе. Скорее просто истории про людей в криминальном антураже.

вторник, 30 марта 2021 г.

[life.music] Продолжение саги о выборе хороших, но недорогих наушников на Aliexpress. Мое отношение к "тёмным" наушникам

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

Светлые vs темные

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

четверг, 25 марта 2021 г.

[prog.c++] Мне кажется, что с SObjectizer-ом гораздо лучше видно где, когда и какие треды создаются внутри приложения

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

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

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

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

Тогда как изучая код, использующий голую многопоточность, приходится обращать внимание на то, где появляются экземпляры std::thread (или какие-нибудь самодельные обертки над POSIX Threads). Зачастую такие экземпляры являются членами какого-то класса. Типа service_manager или session_listener. И стартуют/останавливаются рабочие нити в каких-то методах этих самых service_manager/session_listener/им-подобных-классов. Что не так-то и просто обнаружить. А обнаружив потом еще и держать в памяти: "О, вот этот объект запустил рабочую нить, а затем этот объект переходит в подчинение вот этому, а нить останавливается тогда, когда..."

В общем, привыкаешь к хорошему (это я про SObjectizer), расслабляешься, теряешь нюх на неприятности... :(

вторник, 23 марта 2021 г.

[life.music] Продолжение саги о выборе хороших, но недорогих наушников на Aliexpress. Пару слов о самом выборе

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

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

Какие-то аспекты (вроде съемного кабеля) наверняка будут лишь дополнительным фактором.

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

Поскольку вся эта серия посвящена закупке наушников на Aliexpress, то и картинки для иллюстраций я без зазрения совести утащил именно оттуда.