bash.im ithappens.me zadolba.li
7903

Широковещательно

Однажды я писал программу, которая несколько раз печатала на выбранном принтере один и тот же файл. Тест вроде бы прошёл удачно, и я отправился кодить дальше.

Вдруг мне понадобилось сходить в другой отдел. Проходя мимо одного кабинета, я увидел, как принтер настойчиво выплёвывает листы. Так было в одном, другом, третьем кабинете подряд. Моя программа настойчиво обошла все принтеры в локальной сети, а так как ограничения я не поставил, то на каждом принтере скопилось порядка тридцати заданий. Больше всего не повезло принтеру у кладовщицы, не умудрённой знаниями о технике. Когда принтер начал печатать сам, она испугалась. Жалко человека. Хорошо, что удалось отмазаться, сославшись на технический сбой.

Всегда ставьте ограничение в цикле и будьте внимательны.

9273

Не очень ноль

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

Моделировать пришлось связанные колебания маятников. Первый вариант программы я наскоро набросал на Delphi — для университетской конференции этого хватило. А затем была подготовка к такому же мероприятию, но уже между университетами. Поскольку времени хватало, я взялся переписать программу на FASM, заодно сохранив совместимость программы с Windows 95/98. Через несколько месяцев получилась вполне приличная 3D-модель с управлением параметрами системы, скоростью и направлением течения времени, возможностью подключать модели других физических процессов и прочими вкусняшками.

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

А полгода спустя ранним утром я, как обычно, шёл на первую пару. Мысли огромным роем носились в голове, сменяя одна другую. И вдруг я понял, в чём заключалась моя ошибка. Дождаться вечера, чтобы проверить догадку, было нелегко.

Поскольку в основном программа работала с вещественными числами, регистров общего назначения хватало с запасом. Чтобы подсократить размер экзешника, в самом начале программы я обнулял регистр EBX и использовал его везде, где это возможно, вместо константы 0. Всё тот же STDCALL этого не запрещает: вызываемые функции значение этого регистра сохраняют, так что оказалось действительно удобно. Есть только одна проблема: внутри себя функции WinAPI этот регистр активно используют, а соглашение вызова не обязывает их восстанавливать его значение перед вызовом callback-функций.

Моя ошибка оказалась в том, что в оконной процедуре (а с точки зрения User32.dll она как раз и есть callback) я забыл прописать явное обнуление EBX. На тех компьютерах, где программа работала корректно, мне просто везло: значение регистра оставалось нулевым. На остальных же системах там оказывалось ненулевое значение, которое успешно использовалось вместо всех нулей во многих процедурах программы. Одна строчка кода, два байта в экзешнике — полгода спустя они обрели своё место в коде, но было уже поздно.

Обнуляйте переменные и регистры — и будет вам счастье!

4656

Потею с голодухи

10 ноября 2010, 16:45

1995 года. В ФРГ обанкротилась крупная компьютерная фирма, и всякие штуки из её запасов можно было купить задёшево. Купил и я Свой Первый Компьютер. Какой там «пентюх» — Cyrix, последнее слово фирмы IBM! Ажно 128 метров памяти и любимый Виндоус-95, самая первая версия. Притащил, взгромоздил на стол, подключил — работает. Офигеть! Сразу стал ставить игрушки какие-то... Бах — BSoD. Что за нафиг?

Больше года длилась та история. Компьютер вис минут через десять после начала работы. Что я только ни делал, что ни читал, с кем ни консультировался, в какие только бубны ни стучал... Фирмы-то нету, предъявлять претензии некому. Через год я знал архитектуру винды и с лёгкостью правил системные файлы. Поставил дополнительный вентилятор: вычитал, что в силу несовершенства архитектуры Сайрексы потребляют море энергии, поэтому греются сильно.

Через год мне надоело заниматься виртуальным сексом, и я купил нормальный «пентюх-166». Стал ставить — мама родная! Напряжения питания ядра Сайрекса было установлено пентиумовское, то есть на 0,3 вольта ниже, чем было нужно. Процессор, не получая достаточного напряжения, пытался компенсировать недостающую мощность через повышенное потребление тока и грелся так, что никакие вентиляторы не помогали.

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

2555

Прохладная история

18 марта 2010, 09:00

Вынужден подтвердить примером, что в некоторых случаях метод «ноут в морозилку» вполне легитимен.

Жил-был я тогда в Соединённых Штатах известно чего. В тот момент в продаже появились замечательные гаджеты Nokia N800 — коллега приобрёл и хвастался. Удержаться было невозможно. При условии отсутствия поблизости Почты России и наличия eBay я, разумеется, купил именно через него — по дешёвке, прямиком у желтолицых братьев.

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

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

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

До сих пор я с уважением отношусь к холодильнику как к незаменимому инструменту в арсенале компьютерщика.

5731

Округление трапеции

Несколько лет назад пришёл ко мне начальник отдела материально-технического снабжения с таким вопросом:

— Подскажи, как переделать плоскую мышку в круглую?

В моих глазах читалось немое изумление.

— А-а! Вот, смотри!

Из кармана начальник достал мышь и два отрезанных хвоста с зачищенными проводами и следами припоя и изоленты: один — COM, второй — PS/2.

— Что-то не получается у меня переделать. И цвет проводочков соблюдаю, а она не работает, зараза такая!

1078

Оргтехника против праздника

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

Распихав шары по полкам, я собирался уйти, однако в это время одному сотруднику срочно понадобилось сделать копию. Когда первый лист проходил через внутренности машины, раздался неожиданный хлопок. Естественно, мужик от копира в ужасе отпрыгнул, а я застыл на месте в непонятках: внутри копира так грохотать явно нечему, но кто знает? Вторая попытка — два резких хлопка! Я уже серьёзно собрался вскрывать адскую машину и отыскивать место высоковольтного пробоя, когда увидел на ближайшей к копиру полке резиновые ошмётки. Детальный осмотр обнаружил ещё два лопнувших шарика — в тесной комнате они грохотали довольно громко, но в чём же причина?

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

1956

Антиархитекторы

17 января 2010, 12:45

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

Что делать? Внедрять надо, иначе будут санкции, но тогда свою программу придётся пустить под нож — прощайте, мечты о подмосковной даче и тёплом кабинете!

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

И вот вирус написан. Не обнаруживаемый ни одним известным антивирусом, различными анализаторами и прочими подобными приложениями, он немедленно заразил все доступные компьютеры. Функция очень простая: вражеская программа работать не должна! Она и не работала, постоянно вываливая ошибки: то данные некорректны, то операция недопустима, то файл неверного формата. А как вы хотели, когда посреди выполнения кусок кода или данных вдруг исчезает из памяти?..

Впрочем, начальник неожиданно «спалился» на недостачах и был сослан ещё дальше, а на внедрение программы махнули рукой. Я же получил бесценный практический опыт анализа ОС на уязвимости и твёрдую уверенность: причина всех вирусных эпидемий в кривости архитектуры винды. Пока она остаётся прежней, вирусы неизбежны. С тех пор прошло более 10 лет...

8106

The missing link

23 декабря 2011, 10:00

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

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

1430

Индийская гигиена

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

Структура программы была такова: имелось несколько форм, каждая с меню. По выбору пункта меню пользователь переходил на новую форму или возвращался на предыдущую. Прототип формы имел четыре основных метода: конструктор/деструктор и колбеки входа/выхода. Когда пользователь уходил «вглубь», формы не удалялись, а складывались в линейный стек, поскольку по задумке юзеру всё равно придётся через них возвращаться. Удаление форм и их ресурсов происходило при возврате назад по удалению из стека.

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

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

— Возвращаем как было, а по событию выхода просто очищаем меню.
— Да тут во всём проекте именно так! Меню по-любому очистится, когда форма из стека уйдет.
— Не знаю, как разработчики этой программы, но лично я подтираюсь после того, как сходил в туалет, а не перед тем, как сходить куда-либо ещё.

Это окончательно развеяло сомнения о вариантах фикса и означало многодневную переделку всех форм по проекту. В итоге заказчик сказал отдельное спасибо нашей команде за проделанную оптимизацию.