Вчера один крайне умный товарищ подкинул мне простую идею: «Если есть чужая научная статья, а к ней есть исходники, то их надо тырить, а результаты проверять уже у себя. Вдруг они обошлись без подтасовок?». Из этого следовал не менее простой факт: зайти сюда, забрать исходники, подсунуть свою выборку, получить свои результаты.
Вера в победу
Проект был написан на Матлаб. Это не было бы проблемой, если бы у меня был этот самый Матлаб. Быстрый гуглеж показал, что он платный. Я все еще верил, что для студентов платного не бывает, поэтому спокойно зарегался у них на сайте, чтобы получить торжественное сообщение, что купленных продуктов у меня в аккаунте нет. Так я узнал, что он платный даже для меня. Взлом — не выход, посчитал я, согласовавшись со своей религией, и запросил месячный триал. Триал поставлялся весело. На меня была вылита куча вопросов. В частности, будет ли у меня постоянный доступ к интернету. Я неосторожно ответил да…
В итоге мне была дана прямая ссылка на 100 мегабайтный архив, в этот момент я с укоризной смотрел на дистрибутив Qt, который весит в несколько раз больше. Запуская программу из архива я понимал, что скомпрометировал свою убер-защищенную систему. Но что ни поделаешь — наука требует жертв! После ряда вопросов и проверки моей лицензии инсталлятор сообщил мне 2 нерадостные новости:
- У меня на диске не хватает около 5GB места
- Он хочет скачать еще парочку гигабайт непонятно чего
Что ж, подумал я, это не самая большая проблема в моей жизни. К сожалению, я был прав. После зачистки нескольких гигабайт архивов пакетов, а также вычищение мусора после одного случайного make install, место я получил. Загрузка заняла ожидаемо много времени — на канале в 4 мегабита особо не пошикуешь. Но после успешной инсталляции, я не смог запустить Матлаб. Он заставил меня ввести мой логин и пароль, после чего выбрать мой триал. После чего радостно сообщил об ошибке 1731. С учетом того, что по ссылке английский текст, я рискну вольно перевести на наш родной.
Мы любим DRM, а ты никто. Ты будешь пользоваться нашим продуктом так, как тебе скажем мы, и никак иначе. Знай свое место!
Иначе говоря, у меня возникли проблемы с лицензией. Я это понял не правильно, и просто откупился от них дав ему рута. В этот момент моя система яростным миганием курсора говорила мне все, что она обо мне думает, а я с ней полностью соглашался. Но усталось взяла свое, и я лег спать.
Геморрой всегда приходит из ниоткуда
Встав утром и по-быстрому разобравшись с зависимостью софта от какого-то матлабовского тулбокса, я узнал следующую вещь: матлаб работает только с gcc версий 4.7.x. У меня стояла 5.3.0… Проблема была достаточно простой… Нет. Проблема не была достаточно простой. Проблема была ужасной. Полгода назад у моего соседа по комнате была аналогичная хрень с матлабом. Тогда мне пришлось взять свой старый ноут и оставить на ночь компилиться старый gcc. Я не стал искать тот пакет, а решил собрать новый. Спустя полчаса компиляции пакета из AURa, я вспомнил простую фишку. Сейчас переполнится оперативка, кеш, а потом все развалится и придется начинать заново. Поэтому я начал заново заранее.
Спустя первый час компиляции, я получил первую ошибку. Какой-то модуль в упор не желал компилиться. Ничего, gcc — автомобиль сложный, наверняка он поедет без тормозов. Еще бы я знал как его собирается использовать Матлаб… Как вы уже догадались, модуль был выпилен, а компиляция продолжена.
Время шло, а компилятор выдавал все более новые ошибки. Я постепенно начал понимать, что их будет слишком много. И тогда я зашел к себе на ftp. Там я обнаружил тот самый пакет полугодовалой давности. Впрочем, он уже успел протухнуть достаточно сильно, чтобы его нельзя было реанимировать. Так я решил заставить Матлаб работать с новым gcc.
Ложные цели
Подробное описание ошибок вида «glibc abi v.xx not compatible», а также истории версий gcc натолкнула меня на очень опасную мысль: Матлаб совместим с компиляторами gcc 4.7 и ранее. Она оказалась не совсем верна… Тем временем я взял самый популярный пакет из линейки gcc — gcc44. Он не скомпилился. Я был сильно удивлен, но выбор был широк. gcc46 пошел в бой следующим. Спустя всего лишь час у меня на руках был абсолютно рабочий пакет. Пытаясь натравить Матлаб на старый gcc, я узнал следующее: Матлаб не любит, когда ему кто-то указывает как работать. Естественно, ему же виднее. Короче, настроить его не удалось. Удалось подменить куски оригинального gcc старым. Это Матлабу не понравилось. Но делать было нечего и неведомый mex успешно отработал. Попытался успешно отработать… Короче, там было столько ошибок, что правда вскрылась. Только gcc4.7. Не больше, и не меньше.
Старые знакомые
Я продолжал биться с gcc4.7. В ход пошла опция -j3, которая заставляет make работать в 3 потока. Под ноут пришлось подложить колоду карт — иначе он нагревался до 100 градусов и вываливался в троттлинг. Но с колодой он стабильно держал 80 в турбо бусте. Серверные процессоры со своими ограничениями в 60 с завистью смотрят на мой горячий i7.
В таком режиме скорость сборки пакета до первой ошибки опустилась примерно до получаса. Это было приемлемо, я получил возможность экспериментировать. В какой-то момент я получил ошибку, мол компилятор, скопилированный моим компилятором, при компиляции самого себя не совпадает сам с собой. Нехорошо. Что особо нехорошо, в интернете такой фигней никто не страдает, поэтому этой ошибки ни у кого нет. Единственный совет был в извинительной манере вида «Попробуйте сделать все заново». Как это ни странно, это был очень хороший совет. Так я и сделал. Так оно и сработало. Но пакет, естественно, от этого не собрался, я всего лишь получил возможность прочитать следующую ошибку.
Впрочем, я ее порешал. И пакет был собран. И я стал мейнтейнером его.
Преждевременная радость
Тем временем, я, пытаясь перевести Матлаб на новый компилятор, накосячил в конфигах. Традиционный метод решения подобных косяков — удалить конфиги. Так я и сделал. Так Матлаб перестал работать даже от имени рута. Все та же ошибка. Мы есть DRM, а ты никто.
Переустановка Матлаба позволила мне работать от имени обычного пользователя. Это было моральной победой. К сожалению, до проверки статьи на вшивость было еще сильно далеко. Подсунуть правильный gcc Матлабу по-прежнему было крайне тяжело. strace был бессилен из-за бессмысленного форка, а найти где же прописывается заветный путь к компилятору я не мог. Вскрытие арчевских пакетов Матлаба (которые у меня не работали из-за сетевой лицензии) показало, что каким образом у кого-то эти самые пакеты работают, абсолютно непонятно. Повторение шагов не позволяло перейти на старый компилятор. Тогда я еще раз провернул тот же трюк: подменил куски нового gcc старым.
Я получил ошибку нового типа: неизвестный параметр компиляции. Старый компилятор оказался слишком старым. Oh shi~~!! Откуда этот ненавистный Матлаб взял эти чертовы параметры. find, grep, sed, cat, bash — все было бессильно. Внутри этой проприетарщины засела ошибка, и я должен был её найти.
Я нашел странный пакет hardening-wrapper. у себя в системе. Именно из него Матлаб торжественно подбирал gcc. Именно его я не задумываясь удалил. Это помогло. Не то чтобы совсем, но я получил очередную ошибку…
Интрига
Я уже перестал во что либо верить. Очередная ошибка гласила, что во внутренней библиотеке Матлаба отсутствует какой-то символ. Это значило, что она безнадежно устарела относительно моего арча. Но меня все достало уже до такой степени, что я просто удалил ее. А вместо нее оставил свою, поновее, авось сгодится. Сгодилась!!!
Это был невероятный момент, когда я вводил очередную команду, смысл которой я понимал очень смутно, в консоль Матлаба, а в ответ мне не вывелось ничего. Это ничего было самым хорошим за этот день, потому что в нем не содержалось новой ошибки, это значило, что мне не надо ничего исправлять.
А через 15 секунд открылось окно с результатами.