9274

Заразите всё обратно

Звонок от одного из пользователей:

— Алло, как закрыть антивирус, не сохраняя?

Долгое молчание на нашей стороне.

9273

Не очень ноль

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

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

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

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

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

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

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

9272

Путешествие ошибки вокруг планеты за восемь дней

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

Тут-то у меня легкое дежавю и случилось. Видел я подобную ошибку, когда пробовал накатывать софтину на базу 11.2. Разработчики переходили в это время с SVN на Git и умудрились зарелизить свою софтину два раза. Юмор ситуации был в том, что и там, и там версия указана одна и та же, а md5 отличается всего на два символа, но если не приглядываться, это незаметно. Тухлый релиз провисел часа два, а потом его заменили.

Но и это не главное. Главное в том, что софтина написана откровенно ногами, и что и куда она пихает, понять можно разве что под ЛСД, да и то не факт. Ошибка возникает, когда накатывают обновление. Чтобы аккуратно разрулить ситуацию, надо откатиться при помощи дистрибутива первой версии и только после этого обновляться. А откатиться нельзя, так как первая версия релиза в природе уже просто не существует. В общем, заморочено, но бывало и хлеще.

Отписался и с чистой совестью занялся другими делами. Через сутки приходит письмо из той же конторы, и я начинаю тихонько охреневать.

Китайцы сначала подумали, что у меня не все дома. За накурившегося сибирского шамана приняли, видимо. Но, что ценно, сначала проверили — да, всё сразу же сломалось, как я и сказал.

Тут-то и оказалось, что я не субсубподрядчик — всё значительно хуже. Оказалось, что в одной фирме города N. произошла беда, и они сразу же попросили помощи у фирмы, которая обеспечивала поддержку. Фирма была aвстрийская. Те сразу же перебросили таск в пул, и баг попал на Украину. Там что-то случилось, но в итоге задача улетела в Индию. Индусы уже давно сами код не писали, а подряжали китайцев, а у тех специалистом по данному вопросу был я.

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

Короче, всю глубину творящегося идиотизма я прочувствовал, когда заявился в головной офис, а там меня ждал — не админ, нет, а целый технический директор с переводчиком. Там я скромно упомянул, что русским языком владею свободно. Директор очень обрадовался: вот, дескать, сервис в Европах, со знанием языка специалистов присылают! После этого меня уведомили, что гостиницу для меня забронировали и даже оплатили. Мол, если быстро почините, и культурная программа будет.

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

9271

Отставить безобразие!

Установил я себе потестить USB Safely Remove. Поставил, попробовал, забыл — до тех пор, пока не пригодилась её функция «force stop» для остановки внешнего HDD. Всё бы ничего, но с этим HDD работал системный процесс. Каспер заметил, как что-то покушается на святое, и немедленно прекратил безобразие, причём радикально: после я даже не нашёл экзешника в каталоге программы. Интересно, эту программу хоть раз с антивирусами тестили или это мой личный вклад

9270

Светить всегда, светить везде

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

После до меня начинает доходить: «А освещение подъезда при чём?» Открываю щитовую. Лампа в подъезде запитана после моего счётчика, ноль общий на три квартиры. Ну, где мы не пропадали? Подъездный ноль на землю — всё заработало. Ясно, по нулю отключали.

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

Описывать всё мне и ночи не хватит. При наведении порядка было КЗ, выбило два стояка. Услышали ругань монтажников из конторы, предоставляющей ТВ и интернет, про «потухшее оборудование». Долго дружно искали общую щитовую, нашли, отвинтили гайку (что вы, какие ключи?), врубили автоматы. С горем пополам запиталось всё, все весёлые, все довольные (кроме монтажников — о них позже), но блин! Скажите мне, как можно навести такой хаос в четырёх фазах и четырёх нулях, если одну фазу просто не нашли, а вместо одного нуля использовали глухозаземлённую нейтраль?

Схема на щитовой была, мягко говоря, неактуальной — 220 поймали два раза по очереди с отцом. Отключили свет мне за то, что как минимум за 60 кВт·ч в месяц я платил просто так, освещая подъезд. Так ещё и монтажники матерились: «Это всё сделал ты, и песец тебе, если у нас оборудование погорело!» А двухдневная гроза — это так, фигня, и 220 у ребят заходит прямо на порты.

Не умею заканчивать истории, посему — всё. И не дай Бог вам таких электриков.

9269

RGB: марсианские хроники

Тащу в гараж советский телевизор. Мимо идёт сосед, спрашивает:

— Он что, рабочий?

— А куда денется — советский!

— Какой же он советский? На нём флаг не советский.

И принялся искать в интернете с телефона, кому принадлежит стилизованный красно-зелено-синий «флаг», который наносили на все старые цветные телевизоры.

Оказалось, Марсу.

9268

Будет тебе десятка

После грозы навернулась туева хуча оборудования. Потребовалось перевести всё это аппаратное безобразие в программный вид на время.

В который раз зарекаюсь иметь дело с девайсами D-Link, но опять налетел на те же грабли. Шаманство не работает. Саппорт утверждает, что маки и виртуалка в порядке. Не верить им смысла нет. Иногда что-то пингуется, но данных как не было, так и нет. Замена свитчей ни приводит ни к чему. На буке пинг стабильный, данные есть, на серваке — нет.

Сетевая карта, падлюка, получила себе четырёхпарный кросс и работает на 100 Мбит/с. Всё остальное утверждает, что по факту всего 10, и ей столько не дадут. Она слышать ничего не хочет и утверждает, что все бредят.

Внаглую выкусываю из кабеля две пары. PROFIT!

9267

Клавиатурный крошкодетектор?

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

Неожиданно мак электронным гласом а-ля Гугл-переводчик изрёк:

— «Ненавижу, когда несерьёзно относятся к еде. Это неосновательные люди, и притом пошлые». Оскар Уайльд.

Я подавилась селёдкой. Кинулась смотреть, какие окна были открыты — ни флеш-роликов, ни цветастых страниц в браузере, ни подозрительных процессов.

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

9266

Не имей сто рублей

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

В отпуск я как раз и взяла с собой пилотную карточку. После снятия в одном из банкоматов на Рамбле 150 евро я получила эсемеску о списании 250 евро. «Украли всё, что нажито непосильным трудом!» — была моя первая мысль. Через минуту размышлений: «Не заблокировать ли карточку? Но как прожить неделю в отпуске на снятые 150 евро? Может, снять все деньги? А не спишется ли большая сумма поверх в технический овердрафт?»

Сработал фродоаналайзер и прислал сообщение о выполненной транзакции с корректной суммой. Значит, всё-таки не мошенничество, а какой-то косяк в нашей информационной системе.

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

Вышла на работу, стала искать ошибку. Скрипт, рассчитывающий сумму комиссии, возвращает 100. Но в настройках ИС валюта транзакции — рубли. Я решила, что комиссия должна составлять 100 рублей, и 100 евро — баг ИС, которая игнорирует валюту.

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

Собрала аналитиков. На мои вопли об ужасающей трабле один из них вспомнил, что в скрипт расчёта комиссии должны были добавить блок кода, который по префиксам валютных карт должне возвращать не 100, а 2,5. Упс… А скрипт-то на сопровождении наших программистов, а не вендорских!

Открываю код. Для Visa: если первые девять цифр равны определённым комбинациям из девяти цифр, то возвращаем 2,5. Для MasterCard: если первые девять цифр равны определённым комбинациям из восьми цифр, то тоже возвращаем 2,5. Видно, копипастнули неаккуратно.

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

9265

Блок поджига

Выхожу на дежурство третьего января. Звонок с одного из постов:

— Придите к нам и понюхайте. Мне кажется, у нас что-то горит.

— Запах идёт из системного блока?

— Я не знаю.

— С розетками всё нормально?

— Вроде да.

На посту никого нет. Изнутри системного блока прёт дым и видно пламя.

Думаю, было так. Пыль сначала нагрелась внутри блока питания, потом начала тлеть, потом занялась, а после загорелась и вся пыль, которая была в системном блоке.

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