Templates normally delegate all useful work to someone else; their job is obfuscation
Архив рубрики: Программирование
thread-safe lock-free shared_ptr — приключение на полгода
Есть такой смешной вопрос «Is shared_ptr thread-safe?». Обычно либо человек сразу понимает о чем речь, либо ответа понять сходу невозможно.
Проблема достаточно простая — shared_ptr нельзя модифицировать и читать из нескольких потоков одновременно. Контрольный блок дает thread-safe гарантии, тогда как сам shared_ptr — нет. Копирование shared_ptr состоит из трех операций:
— Скопировать указатель на объект
— Скопировать указатель на контрольный блок
— В контрольном блоке атомарно поднять refcount
Если во время чтения shared_ptr какие-то из этих полей будут обновлены, то мы можем поднять refcount не у того объекта, либо попытаться получить доступ к уничтоженному контрольному блоку. То что нельзя уничтожать объект shared_ptr во время его копирования достаточно очевидно, но то что его нельзя обновлять (за исключением манипуляций на refcount) — уже не так очевидно.
Баги в продакшене
Bitflip — наша реальность, а также про уже софтовые баги от мира С++. Очень крутой доклад, чужие баги всегда показывают что, где, когда и как было неправильно спроектировано. Это несет максимальное количество ценной информации.
Kademlia
Внезапно, протоколу почти 20 лет. Используется внутри торрентов (DHT), I2P, tox: https://en.wikipedia.org/wiki/Kademlia
https://habr.com/ru/post/325528/
switch без единого if
Лет 7 назад я придумал как можно проверять значение int за O(1). Тогда я подумал что можно просто разделить программу на одинаковые по размеру блоки и прыгнуть на соответствующий. Мне не было известно об устройстве switch, да и ассемблер я не знал.
Уже спустя пару лет я понял, что современный switch как раз этим и занимается, но только вчера я проверил, что теория сошлась с практикой.
Виной всему послужил доклад с cppcon:
Посмотрев на switch со слайдов, я вспомнил про свою старую идею и полез на godbolt проверять.
Читать далее
Deprecating volatile
По непонятным причинам я был уверен, что static volatile int является атомарным счетчиком. Вроде бы достаточно логично — оптимизация запрещена, чтение и запись должны быть сразу в оперативную память, работать все должно быстро. Как оказалось нет.
Одно из выступлений с cppcon, где один из разработчиков clang доступно объясняет, что вообще никто не знает что делает volatile:
Пришлось разобраться и проверить.
Почему мне перестал нравиться Qt
Когда-то давным давно я полюбил Qt. Он был простой, с качественной документацией, наличием своей среды разработки. В нем были свои контейнеры QHash, QMap, QVector и после них, глядя на std, становилось сильно плохо.
Все изменилось в 2013-ом году, когда компиляторы gcc и clang начали полноценно поддерживать C++11. Этот факт прошел мимо меня, что и неудивительно. Все важные события нужно отслеживать самому.
Для понимания всей картины рекомендую посмотреть доклад от разработчика Qt: https://youtu.be/uZ68dX1-sVc?t=29m20s
Читать далее
Пущинская новогодняя олимпиада 2018
Месяц назад мы провели очередную Пущинскую новогоднюю олимпиаду.
В этот раз мы были особо амбициозны, и ровно по этой причине мы получили кучу проблем. Задачи писало аж пять человек — я с Арсением, Леша Соловьев, Данила Сорокин и Татьяна Ивановна. Кроме того, Женя Баулин тусовался в нашем google doc, где он помогал исправлять грамматические и логические ошибки.
Сам google doc с задачами был создан более чем за 2 месяца до олимпиады, но задач в нем не было. Обычно мы с Арсением начинали с пары задач, потом кое-как состыковывались друг с другом, получали сюжет, определяли необходимую сложность и количество задач.
Не в этот раз.
Сборка BSA-Analytics под Windows 10
Недавно выдалось свободное время, начал разбираться с частью проблем в
- 2 года назад все стабильно работало
- Под линуксом все и сейчас стабильно работает
- Под виртуалкой и под линуксом все работает
- Под чужой Windows 7 все работает
- Версия полугодовалой давности везде работает
- Никаких изменений за последние полгода, которые могли бы сказаться, не было. Тем не менее, все сломалось
- На рабочем компе Windows 8.1, которая затеяла массивное обновление самой себя некоторое время назад
Как перекодировать всю коллекцию музыки одной командой
Дано:
1) Весь Король и Шут, скачанный с рутрекера в формате *.m4a, с кодеком alac (apple lossless codec)
2) Skoda Octavia III, которая читает m4a, но не переносит проприетарные кодеки (как и я)
Нужно раздобыть всю коллекцию уже в читаемом машиной формате. Традиционно, все решается одной командой. Главное верить, и тогда эта команда заработает. Первый вариант — для кодирования без потерь, второй — для того чтобы машина таки начала играть музыку.
find . -iname "*.m4a" -execdir sh -c 'ffmpeg -i "$0" -acodec flac "$(basename "$0" .m4a)".flac' "{}" \; find . -iname "*.m4a" -execdir sh -c 'ffmpeg -i "$0" -acodec mp3 -b:a 320k "$(basename "$0" .m4a)".mp3' "{}" \;
И финализация только после проверки, что все прошло удачно:
find . -iname "*.m4a" -execdir rm "{}" \;