bash.im ithappens.me zadolba.li

Индийский код

8262

На полпути выделялка сломалась

Найдено в коммерческом коде. Пишет бывший московский студент. Ну что, не только индусы получают деньги за объём программного кода.

if (isSelected) {
component.setBackground(Color.BLUE);
} else if (!isSelected) {
component.setBackground(Color.WHITE);
} else {
throw new IllegalStateException(
"Table row should be either selected, or not"
);
}

8203

+20% мозгов

Разбирался с одной невероятно тормозящей программой. Нашёл источник проблем — жирную библиотеку непонятного назначения. Морально подготовился к встрече с индусским кодом и долгим раскопкам. Открываю. Первый комментарий:

//TODO:
//include brains.h
//include hands.h
//exclude indian.h

Код пестрил комментариями, местами индусятина была исправлена. Неизвестный мне разработчик явно копался в коде как минимум неделю! Разобраться по комментариям было намного легче, и уже через день всё было доделано, программа летала, а к первому комменту добавились две строчки:

//DONE!
//thank you, unknown developer!

8161

Под шелест выпадающих ячеек

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

Задача именно в такой постановке решалась уже не раз, потому и сейчас делаем так же. Вариантов решения два: либо просто нарисовать таблицу и по щелчку мышкой на ячейке отрисовывать поверх ячейки выпадающий список, а после выбора в нём значения записывать новые данные в таблицу и убирать список, либо воспользоваться готовым компонентом, который делает то же самое, но сам управляет существованием выпадающего списка и хранимыми данными. Первый способ быстрее и грубее, второй изящнее и правильнее в плане разделения логики, данных и интерфейса, но немного дольше в кодировании — минут 40 против 20 у первого варианта.

Ответственный за модуль программист затихает за своим компьютером часа на четыре, после чего демонстрирует плод своего труда. Поскольку лично он ни одним из этих двух вариантов раньше не пользовался, то решил задачу по-своему. Он просто поставил на панель полторы сотни выпадающих списков в виде таблицы.Естественно, панель тормозит при перерисовке, при скроллировании приходится вручную управлять тем, какие списки видны, а какие — нет, а уж код, собирающий введённые пользователем значения для дальнейшей обработки, не поддаётся описанию. Посадили переделывать, выдав кусок старого проекта.

8150

Маленькое чёрное платье.gif

Поступил заказ на модификацию дизайна юкозовского сайта под минимализм: чёрный, белый, серый. Без картинок. Вроде бы ничего сложного, одна халява.

Но не тут-то было: при изменении части кода, отвечающего за вывод информации, новости и всё остальное начинали выводиться в непонятном порядке, не поддающемся форматированию. Пришлось вернуть стандартный кусок кода и задуматься, что бы сделать.

Решение было найдено наше, русское: заменить все картинки, использующиеся в фоне и обводке контента, на простые однопиксельные чёрные гифки. Заказчик доволен, деньги у меня. Но если клиенту приспичит сменить цвет фона… В общем, это будет уже не моя забота.

8124

Никакого волюнтаризма

Как же достала эта святая вера в неизменность настроек по умолчанию!

Сделай диск С: размером в 3—5 ГБ, переназначь %TEMP% и %TMP% на раздел побольше, и… И фиг ты извлечёшь большой архив или поставишь новую игрушку. Почему? Правильно: потому что программы упорно продолжают использовать C:\Windows\Temp в качестве временного хранилища. И ладно бы там всякие поделки, но продукция компании NCsoft?

Задолбался. Сделал С: размером 15 ГБ.

7968

Ни дня без развлечений

Я до сих пор не понимаю, что это было, но оно скрасило бессонную ночь и научило меня иначе относиться к игровым конструкторам.

Было дело, писал скрипт по закачке игровых ресурсов в оперативную память по списку. В числе прочего в коде присутствовал скрипт по чтению списка ресурсов из INI-файла. В стандартной библиотеке конструктора функция, читающая переменные в секциях инишника, была, и я решил использовать её, дабы не писать лишний код.

Алгоритм протестирован, выдаёт верные результаты. Остаётся скромный допилинг до практически готового скрипта. Добавляю функцию из стандартной библиотеки, запускаю программу в режиме отладки… Окно «Unexpected error occured» вместо правильных результатов. Проверяю циклы, исключаю возможность бесконечной рекурсии, тестирую заново — то же самое.
Строчку кода, добавленную перед последним тестом, нафиг в комментарий:

// output = ini_read_string('res', string(global.resource_files[argument0]), '');

Та-дам! Алгоритм работает. Синтаксис верный, типы параметров совпадают — что неладно? Убираю комментарий, заменяю функцию, передающую в параметр строку, простой строкой вида:

output = ini_read_string('res', 'untitled.jpg', '');

Всё работает на ура. Думаю, вы уже догадались, в чём дело? Функция из стандартной библиотеки принимает в качестве параметра строку и работает с ней без проблем, а с функцией, передающей абсолютно идентичную строку в параметр, вылетает, выдавая неопознанную ошибку.

Спасибо вам, дорогие индусы-разработчики! Без вас было бы так скучно!

7778

Айтишники лома и кувалды

Работники железнодорожных депо в чём-то похожи на айтишников. И те, и те знают у себя каждый винтик; и тем, и тем нужно поддерживать в рабочем состоянии всё своё хозяйство; и те, и те должны как можно быстрее исправлять косяки; и те, и те в курилках рассказывают увлекательные истории.

* * *

Эффект присутствия, говорите? Было, знаем. Есть манёвровый тепловоз, который отказывался работать со всеми машинистами, кроме одного. Долго думали, но таки отыскали причину. Дело тут было вовсе не в присутствии, конечно, а в том, что машинист этот имел привычку работать стоя. При чём тут это, спросите? А всё просто: под сидением протёрлась проводка, и как только кто-то на него садился, получалось КЗ.

* * *

Баг на баг равно исправность, говорите? Тоже бывало. Стояли на запасных путях две секции от разных электровозов, списанные по причине полной неисправности: не работало абсолютно всё. Тут стоит сказать, что на таких электровозах секции равнозначны, то есть могут ездить по отдельности. Ну так вот, как-то взяли их и соединили. И что бы вы думали? Поехали! Правда, половина систем не работала, а те, что работали, ломались через раз, но важно, что они вообще сами стронулись с места.

* * *

Ещё такая история была. Поставили на мелкий ремонт электровоз. Починили и скинули его молодой бригаде. Через полчаса один из них прибегает в комнату отдыха и говорит, что техника ездит, но очень странно. К электровозу возвращается уже со старым машинистом. Тот сначала ищет классические неисправности, потом заново проверяет, что и как включено, потом пробует на ход. Всё правильно, всё отлично, только вот на чётных ходовых позициях шайтан-машина не едет совсем, а на нечётных едет с такой же скоростью, как на первой позиции. Теперь уже старый машинист бежит куда-то и возвращается с машинистом-инструктором, который эти электровозы как свои пять пальцев знает. Тот сразу пробует на ход и не верит своим глазам. На амперметрах значения, вполне соответствующие номерам позиции, вот только едет локомотив не по-человечески, хоть тресни.

Треснуть пришлось потом тех, кто электровоз чинил, и не раз. Когда поглазеть на чудо сбежалось всё свободное депо, один товарищ предложил интересную идею. Проверять её полезла другая бригада техников, которая по окончании, матерясь, поведала миру о том, что идея оказалась верна: секции были включены вразнобой. То есть предыдущие техники умудрились неведомым образом накосячить так, что одна секция ехала вперёд, а другая назад. А так как ходовые позиции переключаются по очереди на разных секциях, то и получалось, что на чётных позициях секции компенсировали тягу друг друга, а на нечётных головная перетягивала.

* * *

Напоследок — про «индусский код». Вы не поверите, но в электровозах и такое бывает. Когда локомотив возвращается с заводского капремонта, первые недели (порой даже месяцы) деповские техники лазают по всей машине и ищут разницу между электрической схемой и тем, что есть. Иногда находятся такие различия, что суровые мужики только качают головой и даже не пытаются понять, как оно работает. Единственное средство исправления — полная разборка всего электровоза и сборка по изначальной схеме.

Вот вам и айтишники лома и кувалды.

7769

Тренируйтесь на кошках

Лет десять назад программеры из космической отрасли смотрели в сторону OpenGL для быстрого вывода на экран тридцати индикаторов-столбиков. Выслал им пример, как для этого юзать API винды. Тогда у них ничего не отказывало.

Сейчас же, видать, в Росавиакосмос пришло более «продвинутое» поколение. Больше не спрашивают — тренируются на запусках ракет.

7484

Индийский код в особо крупных размерах

Моделирую в CAE. Ansys — программа старая, проверенная. Настал момент, где нужно задать свойства материала через консоль. Набираю, ввожу — ошибка. Проверяю, набираю, ввожу — ошибка. Суть в том, что не заданы параметры материала в зависимости от изменения температуры. Курю мануалы, смотрю форумы по САПР — ничего нет. Из мануала вытаскиваю загогулину, вставляю её в код, ввожу, запускаю — ошибка.

Плюю на всё, подхожу к начальнику, объясняю ситуацию. Оказалось, в филиале сотрудники с подобным как-то разобрались. В предвкушении познания великих тайн программирования звоню и прошу выслать мне код рабочей программы.

Видели бы вы мои глаза, когда в письме с заголовком «Вставить в код для запуска» я увидел матрицу 100×100, состоящую из нулей!