пятница, 14 апреля 2023 г.

[life] История с ежедневным прослушиванием "Плейлист Дня" на Яндекс.Музыке завершилась самым унылым образом

Сама история описана здесь. Ну а завершилась она настолько уныло и буднечно, что даже и не хочется ничего говорить. Яндекс просто перестал отображать счетчик дней в Web-версии. И все :(

Добрался я где-то до 936. Было это на прошлой неделе. А на этой неделе попробовал глянуть на очередное значение и ничего уже не увидел.

В общем, на 1000 так и не удалось посмотреть.

среда, 12 апреля 2023 г.

[prog.c++] На RSDN засветили одну из задачек с собеседования в Тинькофф

Вот в этой теме: Как удаляется vptr?

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

Если мне не изменяет мой склероз, то нужно было рассказать что напечатает этот пример, почему и что в нем следовало бы поправить.

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

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

Без этого понимания сложно будет объяснить какой именно из print-ов будет вызван и почему.

Добавлю, что меня собеседовал один человек и вопросов о том "утечет ли vptr" или "что будет с виртуальным указателем" (чтобы не подразумевалось на RSDN под этим термином) не было. И интервьюер, и само собеседование мне лично показались более чем адекватными. Так что негатив, который в обсуждении на RSDN был высказан, я не понимаю и не разделяю.

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

понедельник, 10 апреля 2023 г.

[prog.c++] В склерозник: ссылки на статьи об Undefined Behavior в C++ и C

Ради интереса немного освежил тему UB в C++ (и C заодно) и решил зафиксировать в блоге несколько ссылок, которые показались интересными/полезными. Дабы было проще затем найти.

Если хочется плотно погрузиться в данную тему, то вот этого, думаю, будет достаточно с лихвой: Ружье достаточной огневой мощи, чтобы на нем повеситься. Путеводитель C++ программиста по неопределенному поведению.

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

Falsehoods programmers believe about undefined behavior. Статья специально для тех, кто думает, что раз у меня сейчас все работает, то все нормально ;)

What Every C Programmer Should Know About Undefined Behavior #1/3 с продолжениями: часть два, часть три. Как по мне, так обязательно к прочтению.

Why undefined behavior may call a never-called function. Разбор нашумевшего несколько лет назад примера, когда clang очень уж хитро поступил с вызовом функции по нулевому указателю.

Undefined behavior can result in time travel (among other things, but time travel is the funkiest). Рассказ о том, до чего может дойти компилятор в эксплуатации UB.

Security flaws caused by compiler optimizations. Несколько простых примеров того, как оптимизатор может выбросить куски кода, важные с точки зрения безопасности/секретности.

Towards Optimization-Safe Systems: Analyzing the Impact of Undefined Behavior. PDF-ка от исследователей от MIT (краткое резюме о результатах этого исследования на русском можно прочитать на opennet.ru).

Если кто-то из читатей знает статьи/посты на тему UB, которые заслуживают включения в данный список, то делитесь ссылками в комментариях.

пятница, 7 апреля 2023 г.

[prog.flame] Нет, с любителями PascalCase (да и camelCase) нам не по пути!

Никто, ну вот вообще никто, не убедит меня, что:

TransformObtainedVideoFrameForFurtherProcessing

читается лучше, чем:

transform_obtained_video_frame_for_further_processing

Опять же никто не сможет привести хоть сколько нибудь убедительные аргументы, доказывающие, что:

transform_obtained_video_frame_for_further_processing

это плохое, негодное и слишком длинное имя.

Никто, слышите?! Даже и не пытайтесь.

PS. Полагаю, что +50% к ЗП может изменить точку зрения на прямо противоположную.

PPS. Тяпница же на дворе ;)

среда, 5 апреля 2023 г.

[prog.c++] Очередное небольшое обновление для RESTinio

Благодаря одному из пользователей RESTinio получил обновление, исправляющее проблему с обработкой запросов с сжатым посредством zlib телом. Новая версия 0.6.18 уже доступна через Conan и vcpkg, так что есть смысл обновиться.

У меня лично работа над этим обновлением вызвала довольно сильные эмоции.

Был рад получить еще одно подтверждение тому, что RESTinio все еще используется (и, как я понял, используется активно и в нагруженных проектах). Даже не смотря на то, что дальнейшую разработку мы уже пару лет как поставили на паузу. Тем не менее, проект поддерживается, мы реагируем на открытые issue и сделанные PR.

Однако, время от времени кто-то говорит, что RESTinio, мол, не выглядит живым. Что неприятно, т.к. не соответствует действительности: проект никто не бросал и, уж тем более, не хоронил.

Посему отрадно узнавать, что RESTinio продолжает использоваться. Мелочь, а приятно ;)

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

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

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

вторник, 4 апреля 2023 г.

[prog.c++] Две отличные статьи про неочевидные моменты C++

Две небольшие, но отличные статьи на сайте devblogs.microsoft.com: "C++17 creates a practical use of the backward array index operator" и "The mystery of the crash that seems to be on a std::move operation". Они, хоть и на английском, но читаются легко. Да и самое главное там -- это примеры. Посему решил сохранить их в склерознике :)

Позволю себе процитировать оттуда пару-тройку фрагментов.

Из первой статьи:

Another practical use is to bypass any possible overloading of the [] operator, as noted in Chapter 14 of Imperfect C++:

#define ARRAYSIZE(a) (sizeof(a) / sizeof(0[a]))

By flipping the order in 0[a], this bypasses any possible a[] overloaded.

std::vector<int> v(5);
int size = ARRAYSIZE(v); // compiler error

However, it isn’t foolproof. You just need to create a more clever fool: If v is a pointer or an object convertible to a pointer, then that pointer will happily go inside the 0[...].

struct Funny
{
    operator int*() { return oops; }
    int oops[5];
    int extra;
};

Funny f;
int size1 = ARRAYSIZE(f); // oops: 6

int* p = f;
int size2 = ARRAYSIZE(p); // oops: 1

Из второй статьи.

Вот этот код на ARM-е ломается при компиляции в режиме C++14:

void polarity_test(std::shared_ptr<Test> test)
{
    test->harness->callAndReport([test2 = std::move(test)]() mutable
    {
        test2->reverse_polarity();
        ::resume_on_main_thread([test3 = std::move(test2)]()
        {
            test3->reverse_polarity();
        });
    });
}

Ломается потому, что вот здесь:

test->harness->callAndReport([test2 = std::move(test)]() mutable

значение test может быть перестать актуальным еще до того, как произойдет обращение к test->harness.

Но, начиная с C++17 это уже не проблема.

воскресенье, 2 апреля 2023 г.

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

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

Фильмы

О чем говорят мужчины. Простые удовольствия (2023). Посмотрел с большим удовольствием, хотя в начале как-то не очень заходило, но к концу фильма все раскочегарилось и зашло более чем норм.

Операция «Фортуна»: Искусство побеждать (Operation Fortune: Ruse de Guerre, 2022). Нормальное развлекательное кинцо. Мне показалось, что Гай Ричи сделал это с изрядной долей стеба над фильмами про супершпионов, но может это только показалось.

Тест (El Test, 2022). Глянуть можно, если больше нечего. Но это не комедия. Уж точно не комедия в привычном для меня смысле.

Марлоу (Marlowe, 2022). Очень красиво, но очень скучно.

Заговор в Каире (Walad Min Al Janna, 2022). Посмотреть было любопытно, но не скажу, что фильм впечатлил. Во-первых, не хватило понимания того, что и как происходит в мусульманском мире. Во-вторых, мне показалось, что не угадали с выбором актера на главную роль: слишком уж забитым и робким выглядел его персонаж, поэтому в то, что он делал в конце фильма, не верилось от слова совсем.

Вкус жизни (Smagen af sult, 2020). Сюжет, как по мне, так ничего выдающегося, как и сам фильм, собственно. Хотя, любителям жанра "мелодрамы" может и зайдет. Но вот работа оператора местами настолько шикарная, что у меня просто челюсть на пол падала от красоты и качества картинки.

На краю (The Ledge, 2022). Посмотреть можно только если есть желание каждые десять минут вопрошать "Да что за фигню нам здесь показывают".

Сериалы

Больница Никербокер (The Knick, сезоны 2014-2015). Отлично. Ну вот просто отлично. Посмотрел благодаря наводке Алексея Водовозова вот из этой лекции и не пожалел. Хотя во втором сезоне, как по мне, слишком уже много времени уделялось романтическим линиям (кто с кем что крутил-мутил), но сильно впечатления это не испортило.

Медленные лошади (Slow Horses, второй сезон, 2022). Если понравился первый сезон, то смело можно смотреть и второй. Мне первый сезон понравился, второй вроде бы тоже ничего так, в стиле первого. Но нашлась во втором сезоне пара моментов, которые лично мне несколько подпортили общее впечатление.

Темпл (Temple, первый сезон, 2019). Не то, чтобы разочаровался, но ожидал сильно большего. В принципе, можно и посмотреть, но меня хватило только на первый сезон, второй смотреть уже не захотелось.

Фарт (Luck, первый сезон, 2011). Содержание сильно так себе, развитие одной из сюжетных линий (криминальной) я так и не понял. Но зато попал под обаяние картинки показывающей скачки и жизнь вокруг скачек (в молодости с удовольствием читал детективы Дика Френсиса и кадры этого сериала как будто погружали меня в мир, описанный Диком Френсисом).

Одни из нас (The Last Of Us, первый сезон, 2023). Редкостная гадость. Повелся на высокий рейтинг и кучу хвалебных отзывов, как выяснилось, очень зря.