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

в 15:20, , рубрики: 1 апреля, 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 гласит, что произошла внутренняя ошибка номер 0x000000aa (в цифрах ошибки нет), много текста (дамп памяти готов, попробуйте сделать рестарт, проверьте настройки и т.п.) и «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, который испортил вечер первого апреля, настроение и нервы. Было не смешно.

Автор: dmr

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js