[Из песочницы] Несмешная первоапрельская шутка от разработчиков Magic Lantern

Magic Lantern (ML) — неофициальная прошивка для фотоаппаратов Canon, которая обеспечивает повышенную функциональность (например, dual-iso, стекинг по фокусу, raw-видео, тонкая настройка параметров съемки и многое другое). Прошивка устанавливается непосредственно на flash-карту, что позволяет безболезненно удалить ее или обновить простой заменой файлов.На хабре уже были публикации по данной прошивке, поэтому подробно расписывать преимущества и порядок установки я не буду. Расскажу, как попался на неявную и несмешную первоапрельскую шутку от разработчиков данной прошивки.

Все описанные действия производились с использованием камеры Canon 650D со стоковой (1.01) прошивкой.

28 марта. Началось все тогда, когда жажда исследования чего-то нового накопилась до критической массы и в сети была случайно обнаружена информация о возможности автоматической съемки фокус-стека на моем фотоаппарате. Но данные возможности требовали установки неофициальной прошивки Magic Lantern.

Быстрый поиск показал, что:

текущая прошивка фотоаппарата не поддерживает текущие сборки ML; для модели 650D нет стабильной сборки, есть только ночные билды; некоторые функции ML в 650D не работают/работают криво; авторы предупреждают, что можно закирпичить фотоаппарат неверными действиями по прошивке. После чего фотоаппарат был успешно перепрошит на последнюю официальную версию для Canon 650D 1.04. И строго по инструкции, со сбросом всех настроек и полным форматированием карты, был установлен последний ночной билд Magic Lantern (от 28 марта).Глаза немного округлились от количества настроек. Были тут же опробованы dual-iso, стекинг по фокусу и некоторые другие возможности. Первые впечатления были сугубо положительные, хотя полученные результаты оставляли желать лучшего. Суммарное время первого знакомство ограничилось 4-мя часами, в течении которых не было ни каких замечаний по работе самого софта.29 марта. Более детальное изучение прошивки показало, что можно еще снимать и raw-видео, а так же вышел новый билд ML. Новый билд был залит на карту (по неопытности был обновлен только каталог ML). Запись была опробована на фотоаппарате, но время поджимало и оценить качество на ПК в этот день не получилось. Наступил конец выходных.

1 апреля. С мыслями «я не буду экспериментировать сегодня» возвращаюсь с работы. Но любопытство сильнее меня.

Обновляю ML до последнего билда (тот же самый — от 29 марта, но теперь полным комплектом). Включаю. Начинаю настраивать… и ловлю BSOD на фотоаппарате.

Шок.

BSOD гласит, что произошла внутренняя ошибка номер 0×000000aa (в цифрах ошибки нет), много текста (дамп памяти готов, попробуйте сделать рестарт, проверьте настройки и т.п.) и «Your camera was breaked» (среди прочего).

Холодными пальцами делаю сброс через аккумулятор, как рекомендуют разработчик.Включаю фотоаппарат и спустя две секунды после загрузки получаю тот же BSOD. F@#$%!

Нервничаю. Удаляю ML. Все работает в штатном режиме.С мыслью, что во всем виноват кривой билд откатываюсь на версию от 28 марта (с которой просидел 4+ часа).

Запускаю. Все работает. Хорошо. Настраиваю фотик заново. Готовлюсь и погружению в изучение. BSOD! WTF?! Сброс. BSOD через минуту. Форматирую. Переустанавливаю. Запускаю. BSOD. Шок.

Я спокоен. Фотоаппарат без ML работает в штатном режиме. C ML — регулярный рандомный BSOD (даже в простое при включенном фотоаппарате).

Поиски по ошибке не дают результатов. Вообще никаких. Пусто. Как будто я один с этим столкнулся. Иду на официальный форум. Регистрируюсь. Описываю проблему. Жду.

Достаточно быстро получаю несколько ответов:

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

От 11 марта до 29 марта всего 10 билдов. Исходники доступны на bitbucked c полным (я надеюсь) changelog`ом билдов. Читаю логи изменений.

2015–03–12 — опции для дампа видео, мелкий тюнинг 2015–03–13 — рефакторинг, тюнинг, фиксы … много прочих изменений … 2015–03–23 — работы с DOF 2015–03–25 — 80cee7a | Alex — Looks like some people didn’t like my bad joke Так-так… Начинает что-то проясняться. Читаю changeset. В файле «src/tweaks.c» нахожу: struct tm now; LoadCalendarFromRTC (&now); joke_mode = (now.tm_mday == 1 && now.tm_mon == 3); + if (joke_mode) + { + msleep (1000); + joke_mode = display_idle (); + } и + if (joke_mode) + { + if (rand () % 1000 == 13 && ! RECORDING) + { + extern void bsod (); + bsod (); + } + } Что?! Режим шутки? Издеваетесь? Поясняю: первого апреля (now.tm_mday == 1 && now.tm_mon == 3 (третий месяц становится четвертым при отсчете от ноля)) после загрузки ML прошивка начинает ежесекундно генерировать случайное число. Если это число равно 13 и в настоящий момент не производится запись (спасибо хотя бы на этом) — получите, распишитесь, Ваш BSOD. И так как уровень моей удачи был критически низким, мне удавалось словить BSOD раз 5 сразу после загрузки прошивки.

Сомнительная шутка, сомнительного содержания.

2 апреля. До рандомных BSOD осталось 364 дня.

PS: Привет разработчику Alex, который испортил вечер первого апреля, настроение и нервы. Было не смешно.

© Habrahabr.ru