[bash.im] [IT Happens] [zadolba.li]

IT Happens

Клиент и саппорт. Разработчик и заказчик. Программист и программа. Вести с фронтов.
818079• • •1110987• • •321

#733: Watch your six

3 апреля 2009, 20:30

рейтинг: 1685

В университете в качестве курсовой работы по программированию мы небольшой группой писали игрушку — двумерную платформер-стрелялку.

Все было здорово, пока мы не стали учить героя пользоваться ружьём. Планировался хитрый расчёт траектории пули, но привязать её начало к кончику дула никак не получалось. На время мы убрали объект героя и сделали так, что пуля начинает свой полет с земли, а ее прорисовка начинается лишь от положения дула. Реализовали — всё замечательно, «невидимка» перемещается по экрану, а вылетающие из пустоты пули исправно поражают врагов.

Принялись за объект героя, написали ему систему поражений и прикрутили обратно. Тут началось странное — при попытке атаковать первого же врага главный герой погибал.

В чём дело? Условия смерти героя мы описали верно, разве что кровь ещё не нарисовали. В игре используется всего один объект «пуля». Бились над проблемой долго и безрезультатно.

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

Проблему решили, написав новый объект «пуля_героя», для которой сам герой был неуязвим. Товарищи, никогда не забывайте про кровь — по крайней мере на время разработки!

 

#723: Я — легенда

31 марта 2009, 20:30

рейтинг: 2851

Писал я давным-давно программу — дело касалось прикручивания отладчика ActiveX-скриптов к пользовательским программам.

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

Буквально через день занесла меня нелёгкая на старое место работы. Водят меня мои бывшие коллеги, представляют новичкам: дескать, этот товарищ у нас работал лет пять назад, дебаггер для скриптов писал. Тут я и выдаю: «Серёга, там в таком-то файле на строке N при обработке ошибки утечка памяти — это фигня, но для порядка надо поправить и дописать „delete“».

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

 

#709: Кто кого обманет

28 марта 2009, 09:00

рейтинг: 1629

Задача: протестировать оптимизирующий компилятор С++ (gcc, естественно) для встраиваемого PowerPC-процессора.

Тестовый стенд: отладочная плата, на ней проц, основной способ взаимодействия с которым - интерфейс RS-232. Чтобы не заморачиваться с передачей данных по COM-порту, я решил смухлевать — сделал все тестовые данные константными.

Скомпилировал программу с несколькими уровнями оптимизации, открыл ассемблерный исходник в отладчике и стал сравнивать результаты оптимизации. Вот что получилось.

Уровень оптимизации 0. Код толстый и красивый, все вычисления выполняются самым прямолинейным, тупым и очевидным способом. Предсказуемо...

Уровень оптимизации 1. Код стал компактнее, откровенно тупые действия вырезаны, но некоторая рыхлость всё ещё есть. Не впечатляет.

Уровень оптимизации 2. Объекты пропали. Память больше не задействована, вместо нее работают 32 регистра процессора. Так держать!

Уровень оптимизации 3. Загрузка вычисленного значения в регистр как константы. Всё. Объём кода - 8 байт, или две инструкции (две, потому что загрузка константы на этой архитектуре идёт по полуслову).

Домухлевался. Один-ноль в пользу компилятора!

 

#696: Действительно простые числа

25 марта 2009, 09:00

рейтинг: 2655

Учился я тогда в восьмом классе, однако ещё в шесть лет родители купили мне «букашку» (БК-0010-01) со встроенным Бейсиком, на котором по тоненькой брошюрке я учился ваять простенькие программы.

На контрольной по ИВТ дали задание вывести на экран простые числа от 1 до 100 через запятую. Предполагалось, что надо задать массив, а потом в цикле выкидывать из него составные числа. На выполнение задания давалось два часа.

Через 10 минут подзываю преподавателя, показываю вывод программы, получаю пять и у всех на глазах с гордостью покидаю класс. Листинг выглядел следующим образом:

10 CLS
20 PRINT "2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97"
30 END

 

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

12 марта 2009, 09:00

рейтинг: 1651

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

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

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

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

 

#649: Наплодили тут сущностей

5 марта 2009, 20:30

рейтинг: 975

#639 напомнило.

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

Тут меня посещает мысль, что, возможно, эта последовательность (хоть она и не слишком типичная, да и не короткая) может встретиться в коде несколько раз. Проверяю - точно! Всего нашел 11 таких последовательностей. Удивлению моему небыло предела, пока я не включил отображение хекс-кодов "буквами" - 10 раз из 11 эта последовательность была частью слова "Button1", и только один раз - исполняемым кодом.

 

#627: Тупой платит дважды

28 февраля 2009, 09:00

рейтинг: 763

Писал сервис для проверки состояния заказов на корпоротивном сайте.

Какое-то время всё нормально работало, а потом руководству вздумалось перетащить сервис на другую хостинг-площадку, причём сделать это с помощью очень крутой сторонней фирмы "не в зуб ногой", чтобы там всё было "ещё круче". Заодно поставили им задачу - чтобы ссылка была в виде status.php, а не status.php?name=...&code=...&office=...

Разумеется, ошибки переноса файлов пришлось исправлять мне. Как и ошибки при выполнении дополнительной задачи - клиенты были бы слегка недовольны, зайди они на страничку "от крутой фирмы" и увидь там: "Здравствуйте, Джинсы SWEATHOSE AJC: артикул №....".

Заменил $name в конце программы на $itemname, стало нормально. Начальнику про "крутую фирму" ничего не сказал - хочет он за неумелый и весьма медлительный плагиат с меня же платить мою зарплату за полгода - его право.

 

#593: Зависание с песней

14 февраля 2009, 09:00

рейтинг: 645

Когда мобильные игры достигли запредельной жирности, "сверху" появилось требование: игра должна работать из-под браузера. То есть загружаешь её через WAP, на вопрос "Запустить?" отвечаешь: "Да", и она должна запускаться и не зависать. Впоследствии опомнились: браузер отъедает столько памяти, что игра получится кастрированной! Но делать что-то надо...

Программисты придумали вот что. Появляется заставка: "Если игра зависла, выйдите из браузера и закройте ненужные программы". Затем выделяется большой блок памяти. И только если память удачно выделилась, возвращаем её и загружаем собственно игру: графику, звуки и всё остальное. А если нет - игра зависает на этой самой заставке.

 

#573: Нет, пойдешь ты!

5 февраля 2009, 09:00

рейтинг: 2747

Лет с десяток назад или даже больше, в общаге, куда я частенько хаживал в гости, студенты как-то заспорили, кому сегодня выносить мусор. Один утверждал, мол, ну и что, что моя очередь, я в прошлый раз выносил вот за этого редиску, так что пусть сегодня он за меня выносит. На что тот другой отвечал, что сегодня ему совсем лениво, он лучше потом, и вообще, относительно сроков возвращения долга не договаривались. В общем (оба - будущие программисты) решили написать программку-генератор.

Первый писал её на Паскале, второй проверял. Запустили. Программка (под DOS ещё в те времена) писала быстро-быстро фамилии обоих попеременно, пока не будет нажата any key. Мусор идёт выносить тот, чья фамилия окажется последней. Any key жал я, как незаинтересованное лицо.
Ясное дело, что мусор пошёл выносить тот, что проверял, а не тот, кто писал.

Когда он вернулся, второй ему продемонстрировал за правой границей экрана с позиции эдак 100-й некий читерский код, пропускающий проверку any key для понятно какого случая. Второй посуровел, но ведь сам же проверял, так что винить некого. Поэтому сказал, что в следующий раз он сам будет программку писать.

На "следующий раз" он её писал на С. Второй её как только не проверял, только что не дизассемблировал. И пошёл выносить мусор. Когда вернулся, понял, что не диссамблировал напрасно: этот ему отомстил редактированием <conio.h>, пересборкой библиотек и восстановлением <conio.h>

 
818079• • •1110987• • •321
 
текст или номер истории
реклама
обратная связь
Хотите разместить рекламу?
Информация для рекламодателей.

Вопросы, предложения, что-то не так на сайте? Пишите в саппорт!
на сайте
Утверждено: 9147
Сегодня: 0
В рассмотрении: 2236
тэги
лучшие последних семи дней
5: #9209 (1384) - Дворники от IT
6: #9205 (1339) - На своей шкуре
7: #9220 (1264) - А чего достиг ты?
статистика
Рейтинг@Mail.ru