суббота, 24 декабря 2022 г.

[life.music] Мой текущий "аудиофильский" сетап

Мое увлечение "бюджетной аудиофилией" началось где-то два года назад. Именно в ноябре-декабре 2020-го начал заказывать разные китайские наушники на Aliexpress, потом перешел на закупку динамиков и комплектующих для самостоятельной сборки наушников-вкладышей, потом еще и перепробовал кучу USB-ЦАПов ("свистков").

Об этой все эпопее ранее рассказывалось в блоге: раз, два, три, четыре, пять, шесть, семь.

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

Итак, в последний месяц я слушают вот такую связку:

пятница, 23 декабря 2022 г.

[prog] Столкнулся с (не)ожиданным поведением WaitForMultipleObjects

Есть программулина, которая читает stdout/err нескольких дочерних процессов. Под Windows для этих целей используется WaitForMultipleObjects. Посредством этой функции определяется какой именно из N имеющихся хэндлов готов для чтения.

Обратил внимание на то, что когда дочерние процессы очень активно печатают в stdout, то программулина, в основном, читает выхлоп первого дочернего процесса, иногда читается и выхлоп второго, а вот до чтения выхлопов остальных процессов дело редко доходит.

Подумалось, что это происходит из-за того, что хэндлы передаются в WaitForMultipleObjects всегда в одном и том же порядке. Т.е. практически всегда формируется один и тот же вектор значений [h1, h2, h3, h4, ..., hN]. Поэтому, когда WaitForMultipleObjects начинает проверять готовность хэндлов, то сперва проверяется h1, затем h2, затем h3 и т.д.

Когда дочерние процессы пишут в stdout активно, то выясняется, что h1 практически всегда готов для чтения. А в тех редких случаях, когда мы успели вычитать все из h1, а новое туда еще не попало, готовым к чтению оказывается h2. Иногда дело доходит даже до h3. Но вот дальше практически никогда не продвигаемся.

Применил простой трюк: перед каждым вызовом WaitForMultipleObjects происходит сдвиг содержимого вектора хэндлов. Т.е. на первой итерации передается [h1, h2, h3, h4, ..., hN], на второй [h2, h3, h4, ..., hN, h1], на третьей [h3, h4, ..., hN, h1, h2], на четвертой [h4, ..., hN, h1, h2, h3] и т.д.

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

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

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

четверг, 22 декабря 2022 г.

[prog.c++.humour] В эфире рубрика "трудности перевода" :)

Оригинал: "This special type allows checking for temporary/lifetime object issues."

Перевод: "Этот специальный тип позволяет проверять наличие временных/постоянных проблем с объектами."

"Наличие временных/постоянных проблем с объектами" в контексте разговора про C++ -- это пять! В самую точку. Поскольку в C++ всегда есть какие-то проблемы с объектами, иногда временные, иногда постоянные.


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

среда, 21 декабря 2022 г.

[prog.interview] Подумалось тут давеча невеселое про программеские интервью...

Вчера довелось поизучать на cppreference документацию по функции std::rotate. Там в примере показывается, как посредством std::rotate и std::upper_bound реализуется сортировка вставками (insertion sort).

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

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

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

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

Умом-то понимаю.

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

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

Грустно это все. Но се ля ви.