Russian AI Cup 2020: CodeCraft

В этом году узнал о соревновании меньше, чем за неделю до начала. Документация была сложной, графика и плеер боев — страшные и непонятные, но меня купило малое количество участников. У меня было всего несколько дней на написание стратегии, но при 600 участниках это было не важно. Традиционно, основал свою архитектуру на максимальном количестве костылей. Забрал 224 место в первом раунде. После него нашел десятки ключевых багов, но толку исправлять их не было, потому что появилась куча народа, которые не успели написать стратегию к первому раунду. В общем, футболку выиграл, цель выполнил.

Очень обидно, что mail.ru решили не поддерживать старые соревнования. Было бы прикольно сохранить бои / таблицу результатов. А так от воспоминаний осталась только старая запись в блоге: https://blog.vtyulb.ru/?p=1113
Я вот в своей олимпиаде слежу, чтобы все контесты за все время были рабочими: https://ejudge.vtyulb.ru/ejudge/

CTF от безопасников

К сожалению, у меня полностью отсутствует опыт решения CTF-контестов. Олимпиадного программирования — сколько угодно, а вот взламывать сайты мне было научиться негде. Первый раз поучаствовал во внутреннем соревновании яндекса, и решил только первую тестовую задачу. Сейчас уже почти все решения опубликованы, и тут я узнал, что в одной задаче, которую я не прочитал, нужно было взломать cryptsetup зашифрованный диск, имея на руках полный дамп памяти. Это было обидно, такое я мог бы сделать без проблем. Решил развлечься, и проверить на практике.

Спустя 3 инсталляции kali linux и несколько нерабочих (как обычно) инструкций, собрал что-то свое. Забавно, что на моем основном ноуте используется практически тот же режим шифрования, что и в дистрибутиве от безопасников. У меня xts-plain64/256, а у них xts-plain64/512. Интересно насколько реально провернуть такую атаку против ноутбука. Теоретически, наверное можно его охладить жидким азотом и переставить с него планку памяти, но вот смог ли кто-то такое в реальности сделать? Ну и еще интересно можно ли это сделать, если память просто распаяна будет.

Читать далее

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 — наша реальность, а также про уже софтовые баги от мира С++. Очень крутой доклад, чужие баги всегда показывают что, где, когда и как было неправильно спроектировано. Это несет максимальное количество ценной информации.

Читать далее

Замена кулеров на thinkpad p50

Сломался у меня значит правый кулер. Года полтора он умирал, умирал, и к новому году он так и не умер. Проблема в том что FullHd ноут у меня проигрывает не включая кулеры, а 720p60fps уже нет. А правый кулер трещит, и умирать отказывается. Днем вроде бы и не слышно, а вот ночью вполне слышно.

Для замены кулера надо было лезть очень глубоко, поэтому я тянул и тянул. Но в конце концов решил, что заодно поменяю верхний пластик на ноуте, который немного постарел (он же называется palmrest). Кулеры пришлось брать в комплекте за 3000р, palmrest обошелся в 1500р. 30 декабря я торжественно сел пересобирать свой ноут. Я ничего не боялся, а стоило бы. Но у меня же была полная инструкция: https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/thinkpad-p-series-laptops/thinkpad-p50/parts/pd101159.

Вот так выглядит новый palmrest за 1500

А вот так комплект кулеров за 3000

Читать далее

Мировой рекорд по спидрану uplink в категории ARC storyline

На прошлых выходных было отвратительное настроение, поэтому я решил поставить какой-нибудь мировой рекорд, чтобы его немного улучшить. Естественно, тратить по 100+ (1000+) часов в игре — это не очень, поэтому я выбрал uplink, где кто-то создал удачную для меня категорию, в которой до меня не было ранов. Теперь есть)) https://www.speedrun.com/uplink

Самое сложное было настроить линукс на снятие видео с рабочего стола. В процессе я понял, что спидранить в fullscreen режиме не получится. Пришлось уменьшать разрешение с FullHD до 1366×768, а сам uplink запускать в 1280×720 в оконном режиме. Также убрал vsync в kwin, и кое-как настроил таймер, чтобы мой speedrun выглядел как speedrun, а не как walkthrough. На прохождение ушло, как ни странно, больше 6 часов (по версии steam), потому что последнюю миссию мне удалось пройти всего лишь второй раз в жизни, она достаточно сложная.

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

switch без единого if

Лет 7 назад я придумал как можно проверять значение int за O(1). Тогда я подумал что можно просто разделить программу на одинаковые по размеру блоки и прыгнуть на соответствующий. Мне не было известно об устройстве switch, да и ассемблер я не знал.

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

Виной всему послужил доклад с cppcon:

Посмотрев на switch со слайдов, я вспомнил про свою старую идею и полез на godbolt проверять.
Читать далее

Deprecating volatile

По непонятным причинам я был уверен, что static volatile int является атомарным счетчиком. Вроде бы достаточно логично — оптимизация запрещена, чтение и запись должны быть сразу в оперативную память, работать все должно быстро. Как оказалось нет.

Одно из выступлений с cppcon, где один из разработчиков clang доступно объясняет, что вообще никто не знает что делает volatile:

Пришлось разобраться и проверить.

Читать далее