bash.im ithappens.me zadolba.li

Программы

666

Скучаете? Тогда мы идем к вам!

Когда несколько лет назад я возглавлял отдел тестирования, в производстве находился очень интересный модуль. Модуль позволял работать с графическими образами отсканированных файлов и сшивать их в PDF документы на основе предварительно нанесенных штрих-кодов.

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

Когда полезли в код ковырять - удивлению не было прeдела! Мало того, что разработчиком на момент запуска была добавлена непонятно зачем "закладка" вида:
for(i = 0; i < 100000000; i++);
так еще и в момент запуска, инициализировалось "пасхальное яйцо", которое наш товарищ наваял во время обеденного перерыва.

Дальше с его слов: "Ну а чего, если файлов много - скучно же сидеть и ждать! Пусть юзер в тетрис порубится!".
Он-то и сжирал основную часть ресурсов, иногда забывая отрисоваться на экране.

647

AI Интеллектович

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

Так вот, при сдаче процедурка где-то забарахлила и потрясенному преподавателю комп расстрелял все корабли хода за полтора - ну, повезло железяке, что попадала часто, бывает! - оставив каждому ровно по одной(!) целой клеточке! А затем, на секунду задумавшись, и, клянусь, злорадно ухмыляясь, бездушная вроде бы железяка одной длинной "очередью" садистки добила всех оставшихся на плаву.
Зачет мне поставили, не задумываясь.

641

Шаг влево, шаг вправо…

Дело было давно, когда я только учился программировать. Один баг запомнился особенно. Решил написать игру в шашки. Ну, сделал поле, расставил шашки, объяснил компу основные правила – куда ходить, как есть, как ходить нельзя и т.д. Мой ход, ход компа – и на цикл.

Стал тестировать – играть. Сначала, вроде, всё нормально: комп примитивно играет, но правильно. Вдруг замечаю, что шашек компа становится всё меньше (я столько не съедаю). Задумался… А, хрень какая-то, играем дальше. Через несколько ходов мои шашки стали тоже исчезать, причём в тылу, а на их месте стали появляться шашки компа! Ничего не понятно!. Несколько прогонов – то же самое.

Когда разобрался, выяснил: так как компу было прописано «ходить вперёд на соседнее свободное место» (по правилам шашек), то он просто уходил за край доски – там же препятствий нет! У меня прорисовывалось только поле шашек 8х8, а его шашки уходили на 0-й, 9-й, 10-й столбец массива. Потом коварно, из невидимости, у меня в тылу ел мои шашки по всем правилам «если рядом наискосок вражеская шашка, и за ней – пусто, то надо есть».
Исправил сей баг по-русски: чтобы не писать везде в коде ограничения по координатам, просто расширил массив (-2 to 11)х(-2 to 11) и все неотображаемые клетки вокруг игрового поля забил тройным рядом своих шашек. Теперь шашки компа за край не совались – занято!

639

Тотальное невезение

На первом курсе иститута нам с другом очень нравились инженерные калькуляторы. Было приятно, что не нужно таскать с собой таблицу Брадиса, считать факториал в уме… А среди прочих функций калькулятора есть возможность генерации случайных чисел в диапазоне от 0 до 1.

Довольно быстро родилась игра под громким названием «Random Toutnament», по аналогии с «Unreal Tournament», естественно. Правила были простыми: у кого сгенерится число большее, чем у соперника, тот и побеждает. Друг шутил тогда, мол, спорим, будет 50/50 побед/поражений? Как он ошибался… Вскоре родилась идея перевести эту игру в программу на Си, я довольно быстро написал ее и отдал другу на тестирование. Любит он ошибки в моем коде находить, поэтому я отдал сразу экзешник. Спустя 5 минут слышен стук в аську:

— Что ты написал? Все время выигрывает первый игрок!

Некоторое время ушло на проверку кода и осознание того, что ошибиться в общем-то было негде. Проверяю — все работает. Переставляю переключатель режима сборки на «Release» и снова отдаю экзешник. 5 минут…

— Все равно постоянно выигрывает первый, — констатирует друг.

Злюсь, проверяю — все отлично! Запаковываю код в архив и шлю. Брожу по комнате в поисках учебника по теории вероятностей.

10 минут… Гора восклицательных знаков в качестве сообщения, затем статус друга меняется на «Не в сети». На следующий день мы встретились в институте. На друга было страшно смотреть. Он все время ассоциировал себя со вторым игроком и все время проигрывал. Потом, отчаявшись, поставил на первого и опять проиграл. 20 проигрышей подряд.

По теории вероятностей такое может произойти с вероятностью… 0,5 в 21 степени. В следующий миллиард миллиардов лет другу будет постоянно везти.

638

По старинке

Работаю в конторе, которая поставляет тренажеры во всякие водные училища и колледжи. Поехал мой коллега в славный город N-ск обновлять тамошнему колледжу тренажер. Обновил, запустил - все работает, уехал. Тренажер, надо сказать, работает больше чем на десяти компах. А главный комп посылает им по сети сообщения. Много-много. Часто-часто. Специальная программка есть, которая этим занимается.

Ладно. Не успел сотрудник мой доехать обратно, звонят нам из N-ска. Не работает у них что-то. Кто-то ругается на COM-порт. Что-то где-то, видимо, недопрописано. Ладно, говорю, он завтра приедет, будет с вами общаться.
Приехал. Звонит. Общается полчаса, наверное. Рассказывает им, как смотреть, сколько процессорного времени кто съел и тому подобное. Все нормально. Все это время контора держит кулаки и ждет чей же косяк.

Через полчаса клиент заявляет: "Ну мы вот старую версию запускаем сейчас, она и то не работает...". Шок. Непонимание. Оказалось, есть у них там тетка. Инженер. Лет сорока. Программирование ведет. Пожаловались они ей на проблемы с портом. Она пришла и все исправила. Взяла спокойненько себе старенькую версию тренажера да и перетерла все на главном компьютере. А что... Раньше ведь работало... То, что протокол поменялся, ее не волновало. Бэкапом, кстати, тоже не озаботилась. Полетит, я чувствую, мой сотрудник обратно в город N-ск...

628

Это дубли у нас простые...

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

Приезжает чел с дистрибутивами и с лицензией, садится за тестовый сервер. Увидел, что мак на сетевухе не совпадает с маком в лицензии, ну и взял сменил (на сетевухе). С сервером закончили, взялись за клиент. И тут оказалось, что эти две машины не видят друг друга, хотя ещё вчера всё было замечтательно! Причём пинг идёт, но когда пытаемся достучаться до шар, пинг теряется, и восстанавливается только когда машина перестаёт стучаться до шары и рисует ошибку.

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

623

КПД 100%

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

Матрицы перемножались мгновенно!

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

615

Японский городовой!

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

По сути, большая часть этого софта не нужна, но как-то понадобилось порезать видео для презентации. Я успешно отмазался, мол, "моя не уметь" и все такое. Ну да нашли они человека, который согласился поработать с премьером, человек должен был прийти в субботу и просил, чтобы к тому моменту премьер уже стоял на машине. Задачу повесили на моего коллегу. Вот ему больше делать нечего в субботу, кроме как капаться со всем этим! Ну он по-быстрому поставил премьер, да свалил. Так получилось, что через час после этого на работу зашел я. И сразу же меня встречает "запряженный" с большими глазами и спрашивает, что за фигня происходит с премьером. Смотрю. Вместо текста везде квадратики. Наверное с кодировкой не то что-то. Сношу премьер, втыкаю диск, там в сетапе по английски написано: "Пожалуйста выберете язык". А по умолчанию... японский! Ну ладно, щелкаю на выбор языка... А там - японский или... японский! Вот тебе и первая помощь для школ в России...

612

Ничего чужого мне не надо!

В 95-98 годах работал я "компьютерщиком" в одной "экс-государственной конторе". И вот, в 96-м году выделили из "бюджета" n-ную сумму денег на обновление компьютерного парка. Съездил я в краевую столицу, закупился довольно неплохой техникой (по тем временам - пеньки 80-150 MhZ), поустанавливал Винду 95-ю (о лицензии тогда в провинции даже речи не было, конечно), Ворд, Эксель, для старых документов - Лексикон, Суперкалк, Антивирь - в общем по полной программе. У всех все работает, всем счастье.

Проходит некоторое время, вызывает меня зам. начальника одного из отделов и ставит перед фактом - компьютер не загружается... Смотрю - 2/3 ситемы полностью отсутствует - нет половины WINDOWS, практически отсутствует Program files. Проверяю систему всеми подручными антивирями - все чисто. Не зная, что и думать, ставлю по новой Винду, восстанавливаю программы, ярлыки - на рабочий стол, C&C, Дюка и Варкрафт - в укромное место - в общем, все как было. Через несколько дней - ситуация повторяется. Все документы, картинки, игрушки, доп.программы - все на месте. Нет половины Винды и половины программ. Потрошу систему полностью (вернее то, что от нее осталось), сканю всю сеть (закралось подозрение на очень жесткий вирус) - все чисто, нет даже намека на зловреда. В отчаянии переустанавливаю все по новой, и жду результат... На следующий день - не работает. Системы нет. Пытаюсь выяснить у зам. начальника, как это произошло, что нажимал, что выскакивало:
- Сегодня включил - не работает, - рассказывает он мне.
- А вчера что делал? - продолжаю допытываться я.
- Печатал..
- А еще?
- Сканировал..
- Ну а еще?!
- Ну... удалял.
- ЧТО?
- Ну, это (%WIN%%), и еще вот это (%PF%).
- ЗАЧЕМ???
- Ну это же не мое, зачем оно мне надо. Вот это (документы, программки, игрушки, еще что-то) - это все мое, а остальное я и удалил...
PS. Всем юзерам ставил Нортон, для удобства работы с ДОС программами - вот на нем и обжегся