Истории с тегом: программизмы

Всего историй: 900

649

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

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

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

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

627

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

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

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

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

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

593

Зависание с песней

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

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

573

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

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

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

Ясное дело, что мусор пошёл выносить тот, что проверял, а не тот, кто писал.

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

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

559

Долговременная память

В 2004-2005 годах мне довелось работать в одной софтовой компании, которая выпускала несколько продуктов на базе единого клиент-серверного движка. И в какой-то момент мы заметили, что у нас слишком велики требования к клиентской части (это было не веб-приложение, а отдельно инсталлируемое, тяжеловесное). Вроде бы ничего масштабного нету, но памяти уже и 512 метров мало, вот уже и гига едва хватает. Бедные клиенты вынуждены перезапускать приложение несколько раз в день, настраивать конфиги и жаловаться своему сисадмину.

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

Причина нашлась, как это часто бывает, слишком поздно и почти случайно. Исследуя документацию к библиотеке, которую мы использовали для работы с пересылаемыми XML-пакетами, я случайно нашёл метод reset. Стоило добавить в наш код вызов этого метода, как требования упали в 10 раз! Оказалось, что пока этот reset не вызван, клиент помнит все DOM-модели всех полученных с сервера пакетов...

557

Что-то ищем где-то не там

Очередной проект по доделке и переделке авторских недоделок в программе заказчика.

Угу.

Заявлена кроссплатформенность - используется Qt, есть клиенты для Windows и никсов. Клиентов беспокоит, как Гондурас странная особенность: под никсами программа уверенно работает отовсюду, кроме каталогов, расположенных в /home (например - на рабочем столе, что должно быть интуитивно понятно и привычно для пользователей Windows). Угу.

Авторы грешили на особенности сборки Qt, на примечания к документации QFileSystemWatcher "о зависимых от системы лимитах на количество одновременно наблюдаемых путей". Но почему-то программистов заказчика не обеспокоила такая особенность систем, под которые портировалась изначально виндозная программа, как чувствительность к регистру путей файловой системы. Аффтары нечувствительно приводили путь к lowercase, а потом проверяли существование каталогов типа Desktop или "Рабочий стол" для пользователей типа Vasya_Pupken.

А метод проверки QDir::exists(), спроектированный с учетом особенностей *nix, имел их всех в виду.

554

Инициализируй это

Был у нас в универе один вредный препод. Не любили его, так как предмет свой он преподавал просто отвратно. И вот однажды надо было сдать ему на зачет какую-то программу. Мой друг написал ее. Сдал. Со второго раза получил допуск к экзамену. Мне стало интересно. Запускаю - работает. Обрадованный беру код, смотрю. Спустя пару секунд падаю под стол от такой строчки:

for (int i=0; i

- Что это? - спрашиваю.

- Инициализация - отвечает мне друг.

Да, конечно, инициализация. Прогрев памяти перед работой...

Загадка - как препод пропустил все это? Наверное, код не открывал даже. Работает, и ладно.

542

Как ты это сделал, демон?!

Кажется, было это на 3 курсе, году в 2000.

Приношу я на сдачу лабу на делфях, препод берёт дискетку и говорит: "Сейчас я посмотрю у себя кабинете и вас позову". Ну ладно, стою в коридоре, жду.

Через две минуты это чудо вылетает из кабинета с бешеными глазами и вопрошает: "А как вы сделали, что у вас Edit по форме можно перетаскивать?!" Я, естественно, офигеваю и прохожу вслед за преподом в кабинет, пытаясь вспомнить, что это я там мог наваять, drag&drop что ли какой, да вроде не писал его...

В полной задумчивости подхожу к компу и вижу, что "гуру программирования" не запустил компиляцию в делфи и перетаскивает всяческие элементы по форме с крайне умным видом

503

А тем, кто не поймет, он откусит ногу

Разрабатываем одну большую корпоративную систему - огромная база данных, большие нагрузки на сервера ну и веб-интерфейс, куда ж без него. Интерфейс этот пишется с использованием одной библиотечки, которая в свою очередь вовсю использует AJAX. Библиотека open-source, но как-то раз преподнесла совершенно неожиданный сюрприз.

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

/**

* @return

* @see #getPage()

* @deprecated

*/

public int getPageIndex() {

return getPageIndex();

}

Вот оказывается как надо объявлять метод устаревшим, чтобы его впредь больше никогда не использовали!

500

Глобально, на века!

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

Есть на одной из форм поле "Дата рождения". Во время тестирования было выяснено, что значения туда могут быть введены уж очень фантастические (люди столько не живут), крайней датой, которую можно сохранить, было 1 января 1573 года, после крайней даты система вываливала страшный ексепшен.

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

В следующей версии приходит фикс. Иду проверять, ввожу какую-то, совсем уж мохнатую дату, на что получаю "user friendly" сообщение:

"The date should be between January 1, 1753 and December 31, 9999"

Это ж как масштабно мыслят эти парни - система, видимо должна работать не только с супер-долгожителями, но и с людьми, которые родятся только через несколько тысячелетий...