суббота, 4 января 2025 г.

[life.books] Кратко о книге "Ковчег 47 Либра"

Когда-то давно, году в 2005-ом или 2006-ом прочитал отличный научно-фантастический роман "Стая" Франка Шетцинга. Сильно тогда впечатлился. Ощущения были как будто в детстве читаешь произведения Жюля Верна, где фантастические события базируются на научной основе.

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

Однако, несколько месяцев назад почему-то захотелось перечитать "Стаю". Ни с того, ни с сего.

Нашел, перечитал. Впечатление, конечно же, не такое яркое, но все равно получил удовольствие.

Внезапно возникло желание прочесть еще что-нибудь из фантастики. Но что именно?

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

А тут как-то случайно через ролики на YouTube узнал о существовании Бориса Евгеньевича Штерна. И о том, что он пишет научную фантастику. Решил попробовать что-то из его произведений прочитать. Наугад попал в "Ковчег 47 Либра". И не смог остановиться.

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

Мне отлично зашло. Настолько, что захотелось оставить зарубку в склерознике.

четверг, 2 января 2025 г.

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

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

Фильмы

Веном: Последний танец (Venom: The Last Dance, 2024). Третья часть мне понравилась больше, чем вторая. Хотя есть ощущение, что фильм полностью держится на юморе + еще немного на хорошей графике. Тем не менее, как аттракцион, который позволяет отвлечься от повседневных забот, фильм отличный.

Блуждающая тень (The Shadow Strays, 2024). Отличное кино для любителей жанра "кровавое мочилово". Хотя, имхо, до уровня первого "Рейда" чутка не дотянули, но очень старались.

День Шакала (The Day of the Jackal, 1973). Посмотрел его после одноименного сериала 2024-го года. Общего не так уж много, так что можно смотреть практически как самостоятельное произведение. Полагаю, что для своего времени было отличное кино, но сейчас это совсем уж ретро.

Задержанная (Detained, 2024). Средней паршивости кино. Производит впечатление телеспектакля, а не художественного фильма. Можно глянуть, если больше вообще уже нечего смотреть.

Безмолвное братство (The Order, 2024). Наглядный пример того, как потенциально интересную историю превратить в унылое говно.

Ручная кладь (Carry-On, 2024). Откровенная халтура. Причем и как по сюжету, так и по исполнению.

Сериалы

День шакала (The Day of the Jackal, первый сезон, 2024). К происходившему на экране есть несколько серьезных вопросов, но в целом понравился. Возможно, это лучший сериал из увиденных в 2024-ом году.

Чужак (The Outsider, 2020). О просмотре не жалею, но и не впечатлил. Сделано добротно. Но, имхо, можно было бы на пару серий и подсократить.

Горький 53 (первый сезон, 2024). Есть ощущение, что съемки этого сериала организовали чтобы пристроить большое количество известных еще 10-15 лет назад хороших актеров. Видеть их приятно, они стараются и мастерства у каждого на десятерых, но общее впечатление от сериала средненькое. Слишком много вопросов к сюжету, а развязка оставляет вопрос "И это все?" Может быть создатели планируют продолжение?

Боевой ангел (Machine, первый сезон, 2024). Все очень простенько, наивно, прямолинейно и предсказуемо. Но в этом есть свое очарование. Так что лично мне вполне зашел как раз потому, что можно не вдумываться в происходящее. Еще бы экшОна с мордобоем бы побольше, зашел бы еще лучше :)

Вне категории

Присяжный номер два (Juror #2, 2024). У меня просто нет цензурный слов: что бы так слить собственный фильм в унитаз Клинту Иствуду нужно было сильно постараться. Вот зачем нужно было историю главного героя раскрывать в самом начале? Это же убило всю интригу. Мне совершенно непонятно. Расскажи судьбу Джастина Кемпа в финале картины и получилось бы совсем другое кино, гораздо более интересное и с неожиданным поворотом в развязке.

вторник, 31 декабря 2024 г.

[work-n-life] Послесловие к уходящему году и поздравления с НГ

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

Кроме того, в предновогоднюю пору лента в LinkedIn-е стала напоминать выставку тщеславия: у каждого второго наполеоновские планы, а у каждого третьего достижений за минувший год больше, чем у самого Цезаря. ИМХО, нужен такой предновогодний пост, прочитав который люди вроде меня почувствовали бы себя нормальными, выдохнули с облегчением, мол, а ведь у меня все не так уж и плохо, а может даже и вполне себе хорошо. Так что если вам нужна подобного рода терапия, то вы попали по адресу 😉

В профессиональном плане уходящий 2024-ый год оказался ровным и ничем не выдающимся, сплошная рутина: получаешь новую задачу, вникаешь, куришь бамбук, экспериментируешь, делаешь, тестируешь, доводишь до ума, получаешь новую задачу, вникаешь, куришь бамбук... И так снова и снова. Разительное отличие от нервяка и неопределенности 2019-2021 гг.

Очень надеюсь, что так продолжится и в 2025-ом.

С другой стороны, 2024-ый оказался безрадостным для наших собственных открытых продуктов. Два небольших релиза для SObjectizer, всего одна статья на Хабре и ничего нового в RESTinio 🙁 При этом, далеко не факт, что в 2025-ом получится выкраивать больше времени на собственный OpenSource, постараемся, конечно же, но последние годы научили не загадывать далеко наперед.

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

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

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

Ну вот как-то так, 2024-ой год прошел тихо и спокойно, без потерь и достижений. Планы на будущий год простые: прожить его.

Своим же читателям пожелаю счастливого Нового Года. Пусть все будет хорошо! И пусть ваш 2025-й будет гораздо лучше, чем мой 2024-й 😜

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

[life.audiophilia.diy] Итоги уходящего года в сфере бюджетной аудиофилии

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


Итак, начнем с побывавших в моих руках ЦАПах.

Дешевый свисток на CX31993. Пару лет назад у меня уже была аналогичная модель, но тогда не зашла. А сейчас мне в руки попал девайс без 3.5mm джека и для подключения наушников к нему потребовался свисток с Type-C. И вот на этот раз звук меня порадовал. Да, все простенько и бюджетненько, если сравнивать с гораздо более дорогими источниками. Да, с нейтральными наушниками получается плоско и скучно. Но если взять что-то басовитое, то очень даже ничего. Плюс поддержка гарнитуры, плюс самое низкое энергопотребление из виденных мной. В общем, слушать музыку исключительно в фоновом режиме в хороших наушниках с собственным характером и не переживать за расход батареи -- самое то.

VE Megatron. Мои впечатления полностью совпадают с тем, что было рассказано в обзоре от Soundcheck39: отличное качество звука и огромная мощность за смешные по аудиофильским меркам деньги. Правда, в моем случае Megatron не работает от моего смартфона, видимо не хватает питания, которое телефон выдает по USB. Ну и у меня нет (пока?) настолько высокоомных наушников, для которых потребовалась бы вся мощь Megatron-а -- даже 300омные вкладыши с LCP-диафрагмой приходится слушать на минимальной громкости. Так что всю прелесть Megatron-а еще не оценил.

Hiby FC6. Просто лучшее, что побывало у меня в руках. Знаю, что есть и отрицательные отзывы, но мне нравится то, что слышу. Отдельный вопрос "а стоит ли он своих денег в сравнении с конкурентами?" Но у меня нет на него ответа, т.к. я на него собственных денег не тратил. И, наверное, за свои кровные не купил бы.

Главная проблема с FC6 в том, что в реальности он прожорливый -- по моим замерам 0.14A на 5V. Что сравнимо с Colorfly CDA M1, который выжирал более 10% аккумулятора за час. А это очень много для меня. Так что если много слушать FC6, то телефон приходится заряжать каждый день 🙁


Теперь пару слов о динамиках для вкладышей. В этом году попробовал три новые модели.

14.2mm от Huayunxin на 16 ом. Отличные по техничности динамики с шикарной серединой, отменной 3-х мерностью, но с проваленными самыми низкими частотами (по ощущениям, все что ниже 50Гц играет очень тихо). Как попробовал их, так и использовал на ежедневной основе месяца полтора. Пока не возникло ощущение, что звук детальный, приятный по тоналке, с отличными атаками... Но какой-то пресный. Взял после них более басовитые модели и понял в чем дело: самых-самых низких НЧ то и нет. Осознал это не сразу, но когда осознал, то это начало преследовать, поэтому редко их слушаю. Так что любителям хороших НЧ не советую. А вот ценителям светлой подачи вполне может зайти. Главная проблема -- это найти корпуса для динамиков такого диаметра, шеллы на 14.2mm редкая штука на Aliexpress, поэтому я в качестве доноров использовал какие-то совсем дешевые наушники за один или полтора доллара.

15.4mm динамики на 18 ом с "рупорной" (horn) композитной диафрагмой. Скажу так: бывают динамики для выслушивания деталек на ВЧ, а это динамики для выслушивания деталей на НЧ. Сильный упор на НЧ и СЧ, высокие отведены далеко назад, хотя с сохранением детальности, но эти самые детали на ВЧ нужно очень и очень тщательно выслушивать и даже разыскивать. Зато НЧ мощные, глубокие и ни капли не ватные. В общем, динамики для настоящих басхэдов и ВЧ-фобов. Стоят вменяемых денег, плюс идут сразу с MX500 корпусами.

14.2mm динамики на 32 ома с пометкой 6H. Внезапное и приятное открытие. Стоят недорого, а звучат раза в два-три дороже. По крайней мере я для себя отличия этих динамиков от более дорогих с LCP и DLC диафрагмами слышу, но не уверен, оправдывают ли эти отличия разницу в цене. По звучанию у них нет уклона ни в светлую, ни в темную сторону, хотя они чуть потемнее и пожирнее, чем DLC. Все так, как мне бы и хотелось. ИМХО, просто отличная модель за свои деньги, а особенно хороши будут для людей с небольшими ушами, которым вкладыши с 15.4-мм динамиками носить не удобно.

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


Пару слов о корпусах и кабелях.

У меня побывало штук пять или шесть разных типов корпусов для динамиков размером 15.4mm. Самыми удобными в итоге оказались вот эти металлические корпуса. Причем, как мне показалось, они делают звук более глубоким и басовитым по сравнению с деревянными и пластиковыми корпусами. На втором месте с большим отрывом от всего остального классические черные MX500.

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

И вот о кабелях: за год переделал/починил несколько пар наушников используя беспонтовые кабеля из магазина 3C-Accessories Store и пришел к выводу, что сменные кабеля от NiceHCK, OpenHeart или ivipQ, за $10 или $20, -- это хорошо, конечно же, но и простой кабель за $4 делает свое дело ничуть не хуже.

Ну и в повседневной жизни кабель с простым 3.5мм джеком оказывается гораздо практичнее, чем в 4.4мм балансным 🙁


А теперь о неожиданном состоянии, в котором оказался после того, как попользовался Hiby FC6 с месяц или около того.

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

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

Тогда как с Hiby FC6 практически все, что у меня есть в наличии, звучит круто.

Да, звучит по разному.

Если у динамиков нет НЧ, то FC6 не совершит магию и не возьмет НЧ ниоткуда. А если ВЧ задвинуты далеко назад, то вперед их FC6 не выдвинет.

Но все равно наушники звучат круто. По разному, но круто.

И в итоге я перестал понимать что лучше, а что хуже.

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

И вот теперь как-то с этим нужно жить. Раньше были поиски лучшего звука. Теперь же непонятно что искать, т.к. уже имеющееся уже звучит 🙂

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

Думаю, что единственное, что еще хочется попробовать -- это нормальный плеер с Android-ом. Что-то вроде Tempotec V6 или уровнем повыше. Чтобы можно было и файлы с SD-карты, и Yandex.Music, и из Telegram, и из VK. Как раз то, что дает смартфон, но чтобы качеством уровня FC6.

среда, 25 декабря 2024 г.

[prog.c++.sobjectizer] Улыбнуло. А как прореагировать иначе даже не знаю...

Найдено на просторах Интернета:

"Выглядит монстровито", да.

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

Кстати говоря, вчера в рабочей ветке при расширении одной из фич довелось задействовать совсем уж редкую штуку -- layer-ы, которые когда-то были нам нужны, но в последнее время нами практически не применялись. А тут раз, и потребовалась.
Внезапно (tm), ага 🤓

PS. Что радует, так это то, что люди знают про SObjectizer и делятся ссылками. На данный момент это самое лучшее подспорье для SObjectizer-а -- когда про него рассказывают и когда на него дают ссылки. Это именно то, что больше всего нам, как разработчикам, нужно. Большое спасибо за такие рассказы и за такие рекомендации.

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

[prog.c++] Возвращаясь к теме std::vector-а с назначаемой пользователем политикой роста

Вернусь к теме, поднятой пару месяцев назад: В std::vector не хватает вот какой штуки... Речь там шла о том, что хорошо было бы в std::vector иметь возможность управлять политикой роста объема вектора когда он полностью заполняется.

Часть комментариев к этой заметке (не только в блоггере, но и в других соцсетях) произвела на меня впечатление "ты и сам дурак, и хочешь странного, и вообще в std::vector все сделано зашибись, а если тебе чего-то не хватает, то сделай сам" (наверняка подразумевалось совсем другое, но я, как художник, которого каждый может обидеть, воспринял именно так, прошу понять и простить).

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

Итак, был сделан шаблон, который параметризуется несколькими параметрами: исходный тип вектора (например, std::vector или folly::fbvector), типом хранящихся в векторе значений, типом политики роста объема вектора, типом аллокатора (по дефолту std::allocator).

Этот шаблон наследуется от типа исходного вектора. Т.е. если сказали, что нужно за основу брать std::vector, то vector_with_custom_growth_policy будет наследоваться от std::vector. Поэтому большинство методов из исходного типа вектора доступны благодаря наследованию.

Но часть методов реализуется в самом vector_with_custom_growth_policy. Это такие методы как: emplace_back, push_back (две штуки), emplace, insert (две штуки, обе для одиночного элемента). При этом я даже не брался за insert, который получает подпоследовательность в виде [begin, end).

Получилось где-то порядка 180 строк с комментариями. При этом моя реализация предоставляет только базовую, а не строгую, гарантию безопасности исключений. Т.е. если во время insert-а выброшено исключение, то ничего не протечет, но не факт, что вектор вернется в предшествующее состояние. Вероятно, более сильную гарантию можно было бы прикрутить, если покурить бамбук подольше. Но нельзя же постоянно курить бамбук за счет работодателя 😉

Общие впечатления: изначально кажется, что все просто и понятно. Затем внезапно (тм) тратишь время и силы на то, чтобы поддержать вот такую вот простую конструкцию: v.insert(v.end(), v[0]);

Если кто-то не знал, то нормальная реализация std::vector-а должна это поддерживать. Т.е. когда в insert/push_back прилетает ссылка на объект, который уже лежит в векторе, то нужно проявлять осторожность, чтобы при реаллокации вектора не инвалидировать эту ссылку.

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

При этом сил на то, чтобы поддержать версию insert(pos, first, last) и версию insert(pos, initializer_list) уже не хватило 🙁

А из того, что было сделано, у меня сложилось впечатление, что прикручивать кастомную политику роста к std::vector снаружи такое себе занятие, т.к. внутри вектора при переаллокации содержимого можно делать все это проще и эффективнее.

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

PS. Показать реализацию не могу, т.к. делалось это все в рамках закрытого заказного проекта.

вторник, 17 декабря 2024 г.

[prog.thoughts] Программист: хороший, плохой, крутой. Что под этим вообще понимается?

Пост, можно сказать, в догонку к предыдущему. Решил порассуждать на вынесенную в заголовок тему, т.к. есть ощущение, что понятие "крутой программист" вряд ли как-то строго определено и каждый может понимать под этим что-то свое.

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

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

Соответственно, с плохим программистом все просто: это противоположность "хорошего программиста".

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

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

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

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

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


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

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


И еще одно важное дополнение: иногда для понимания красоты и качества кода требуется хорошие знания как самого языка программирования, так и предметной области. Грубо говоря, в C++ несколько десятков строк с хардкорными шаблонами могут успешно заменять сотни строк "Си с классами", но чтобы разобраться с этой парой десятков строк могут потребоваться знания и навыки, которые приобретаются годами. Так что степень "хорошести", "плохости" и "крутизны" может зависеть от профессионального уровня оценивающего.