Поступил заказ на модификацию дизайна юкозовского сайта под минимализм: чёрный, белый, серый. Без картинок. Вроде бы ничего сложного, одна халява.
Но не тут-то было: при изменении части кода, отвечающего за вывод информации, новости и всё остальное начинали выводиться в непонятном порядке, не поддающемся форматированию. Пришлось вернуть стандартный кусок кода и задуматься, что бы сделать.
Решение было найдено наше, русское: заменить все картинки, использующиеся в фоне и обводке контента, на простые однопиксельные чёрные гифки. Заказчик доволен, деньги у меня. Но если клиенту приспичит сменить цвет фона… В общем, это будет уже не моя забота.
Как же достала эта святая вера в неизменность настроек по умолчанию!
Сделай диск С: размером в 3—5 ГБ, переназначь %TEMP% и %TMP% на раздел побольше, и… И фиг ты извлечёшь большой архив или поставишь новую игрушку. Почему? Правильно: потому что программы упорно продолжают использовать C:\Windows\Temp в качестве временного хранилища. И ладно бы там всякие поделки, но продукция компании NCsoft?
Я до сих пор не понимаю, что это было, но оно скрасило бессонную ночь и научило меня иначе относиться к игровым конструкторам.
Было дело, писал скрипт по закачке игровых ресурсов в оперативную память по списку. В числе прочего в коде присутствовал скрипт по чтению списка ресурсов из INI-файла. В стандартной библиотеке конструктора функция, читающая переменные в секциях инишника, была, и я решил использовать её, дабы не писать лишний код.
Алгоритм протестирован, выдаёт верные результаты. Остаётся скромный допилинг до практически готового скрипта. Добавляю функцию из стандартной библиотеки, запускаю программу в режиме отладки… Окно «Unexpected error occured» вместо правильных результатов. Проверяю циклы, исключаю возможность бесконечной рекурсии, тестирую заново — то же самое. Строчку кода, добавленную перед последним тестом, нафиг в комментарий:
Всё работает на ура. Думаю, вы уже догадались, в чём дело? Функция из стандартной библиотеки принимает в качестве параметра строку и работает с ней без проблем, а с функцией, передающей абсолютно идентичную строку в параметр, вылетает, выдавая неопознанную ошибку.
Спасибо вам, дорогие индусы-разработчики! Без вас было бы так скучно!
Работники железнодорожных депо в чём-то похожи на айтишников. И те, и те знают у себя каждый винтик; и тем, и тем нужно поддерживать в рабочем состоянии всё своё хозяйство; и те, и те должны как можно быстрее исправлять косяки; и те, и те в курилках рассказывают увлекательные истории.
* * *
Эффект присутствия, говорите? Было, знаем. Есть манёвровый тепловоз, который отказывался работать со всеми машинистами, кроме одного. Долго думали, но таки отыскали причину. Дело тут было вовсе не в присутствии, конечно, а в том, что машинист этот имел привычку работать стоя. При чём тут это, спросите? А всё просто: под сидением протёрлась проводка, и как только кто-то на него садился, получалось КЗ.
* * *
Баг на баг равно исправность, говорите? Тоже бывало. Стояли на запасных путях две секции от разных электровозов, списанные по причине полной неисправности: не работало абсолютно всё. Тут стоит сказать, что на таких электровозах секции равнозначны, то есть могут ездить по отдельности. Ну так вот, как-то взяли их и соединили. И что бы вы думали? Поехали! Правда, половина систем не работала, а те, что работали, ломались через раз, но важно, что они вообще сами стронулись с места.
* * *
Ещё такая история была. Поставили на мелкий ремонт электровоз. Починили и скинули его молодой бригаде. Через полчаса один из них прибегает в комнату отдыха и говорит, что техника ездит, но очень странно. К электровозу возвращается уже со старым машинистом. Тот сначала ищет классические неисправности, потом заново проверяет, что и как включено, потом пробует на ход. Всё правильно, всё отлично, только вот на чётных ходовых позициях шайтан-машина не едет совсем, а на нечётных едет с такой же скоростью, как на первой позиции. Теперь уже старый машинист бежит куда-то и возвращается с машинистом-инструктором, который эти электровозы как свои пять пальцев знает. Тот сразу пробует на ход и не верит своим глазам. На амперметрах значения, вполне соответствующие номерам позиции, вот только едет локомотив не по-человечески, хоть тресни.
Треснуть пришлось потом тех, кто электровоз чинил, и не раз. Когда поглазеть на чудо сбежалось всё свободное депо, один товарищ предложил интересную идею. Проверять её полезла другая бригада техников, которая по окончании, матерясь, поведала миру о том, что идея оказалась верна: секции были включены вразнобой. То есть предыдущие техники умудрились неведомым образом накосячить так, что одна секция ехала вперёд, а другая назад. А так как ходовые позиции переключаются по очереди на разных секциях, то и получалось, что на чётных позициях секции компенсировали тягу друг друга, а на нечётных головная перетягивала.
* * *
Напоследок — про «индусский код». Вы не поверите, но в электровозах и такое бывает. Когда локомотив возвращается с заводского капремонта, первые недели (порой даже месяцы) деповские техники лазают по всей машине и ищут разницу между электрической схемой и тем, что есть. Иногда находятся такие различия, что суровые мужики только качают головой и даже не пытаются понять, как оно работает. Единственное средство исправления — полная разборка всего электровоза и сборка по изначальной схеме.
Лет десять назад программеры из космической отрасли смотрели в сторону OpenGL для быстрого вывода на экран тридцати индикаторов-столбиков. Выслал им пример, как для этого юзать API винды. Тогда у них ничего не отказывало.
Сейчас же, видать, в Росавиакосмос пришло более «продвинутое» поколение. Больше не спрашивают — тренируются на запусках ракет.
Моделирую в CAE. Ansys — программа старая, проверенная. Настал момент, где нужно задать свойства материала через консоль. Набираю, ввожу — ошибка. Проверяю, набираю, ввожу — ошибка. Суть в том, что не заданы параметры материала в зависимости от изменения температуры. Курю мануалы, смотрю форумы по САПР — ничего нет. Из мануала вытаскиваю загогулину, вставляю её в код, ввожу, запускаю — ошибка.
Плюю на всё, подхожу к начальнику, объясняю ситуацию. Оказалось, в филиале сотрудники с подобным как-то разобрались. В предвкушении познания великих тайн программирования звоню и прошу выслать мне код рабочей программы.
Видели бы вы мои глаза, когда в письме с заголовком «Вставить в код для запуска» я увидел матрицу 100×100, состоящую из нулей!
Страдаю третьи сутки: не собирается динамическая библиотека. Не абы какая, а для сильно кривого линукса на очень дорогой и нестандартной железке. Половина кода в этой либе написана нами, другая часть присылается из-за бугра в виде объектных файлов. Секретность, ети её, у наших восточных друзей превыше всего — а вдруг мы про оператор if узнаем?
При линковке лезут конфликты. Несколько переменных одновременно определены в разных объектниках. Ладно, думаю, может, лишнее что прислали? Начинаю выкидывать объектные файлы по одному, потом по два и так далее. То не хватает чего-то для линковки, то перебор в виде означенных переменных. На третьи сутки занятий комбинаторикой не выдерживаю и через своё руководство обращаюсь к партнерам. Приходит ответ: «Установите в линкере флаг „Разрешить множественные определения“». То бишь прикажите машине игнорировать ошибку.
Дали мне на неделе PHP-скриптик на оптимизацию. Скриптик простенький, предназначенный для переноса информации из XML-файлов в SQL-базу, хотя и в промышленных масштабах. Только предоставленый вариант выжирал подчистую всю предоставленую ему оперативку и сдыхал, обработав пару десяков файлов из нестольких тысяч. И это должно было обслуживать сайт одного из главных государственных судов!
После полутора суток разбора скрипта решил переписать с нуля. Опитимизировать было нечего: количество запросов превышало необходимое в десять раз, база вообще не имела индексированных полей. А хуже всего то, что горе-прогеры банально не знали SQL UPDATE, и код был испещрён командами DELETE и INSERT.
Есть общеизвестная жёлто-красная программа. В ней есть самописная обработка, которая формирует некий документ, вынимая недостающие данные из разных баз. Делает это хорошо и правильно. Но!
Автор, наверное, приличный человек. Бывает, что возникает необходимость документ не только на печать пульнуть, но и в электронном виде получить. Экспорт имеется — как же без него? С гордым названием «Сохранить в файл». В Эксель, ага. Один символ — одна ячейка. И так несколько печатных страниц.