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

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

9282

VxV

В выходные катался на велике. Погода хорошая, идти домой не хочется. Упал на лавочке под домом, зашёл в аську, слушаю музыку. Лепота. Чтобы было ещё веселее, прошу через аську брата подвинуть роутер к окну. Проверив браузером, что роутер добивает, я возвращаюсь в Jimm и промахиваюсь: вместо «Переподключить» попадаю на «Заблокировать».

Сижу я с сенсорной Нокией 5800 и смотрю на шикарную надпись: «Нажмите # для разблокировки». Где же я тебе решёточку возьму? Разве что пальцы скрещу.

9273

Не очень ноль

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

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

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

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

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

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

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

9266

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

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

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

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

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

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

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

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

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

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

9233

Шапки в серверном шкафу

Есть у нас один сервак, давно отправленный на пенсию. Не сказать, что он слабый, но заменить его всё-таки пришлось: не справлялся с нагрузкой. Используем мы его для проверки всякого непонятного дерьма, стебёмся над ним, экспериментируем и прочие пытки устраиваем. В целях экономии сил мы его никогда не выключаем (сделать пару кликов — тоже истраченные калории, между прочим!), при этом используем от силы раз в пару месяцев. Сидит себе в углу, никому не мешает, лишь робко гудит кулерами и подаёт признаки жизни светодиодом питания. К слову, у сервера полный доступ ко всем сетям фирмы, включая и внешнюю. Ну что может пойти не так с сервером, который никто не трогает?

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

Чтобы как-то убивать время, мы подсели на Team Fortress 2. После недели беспробудной игры мы нашли отличный игровой сервер: пинг был на удивление низкий. Настроен был грамотно, игралось там весело, люди были хорошие. Всё было понятно, кроме пинга в 1 мс.

Через пару дней игры одногу из наших ребят угораздило случайно кликнуть на вкладку «Локальные сервера» в игровом браузере. У всех полезли глаза на лоб. В этой вкладке значился один-единственный сервер: наш любимый. Как? Откуда? Просмотр свойств сервера и обнаружение там айпишника нашего старого доброго друга заставило нас ущипнуть друг друга. Да-да, наш любимый игровой сервер хостился в полутора метрах от нас.

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

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

9231

Стирать сотрётся палец

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

При более подробном просмотре кода оказалось, что я просто не там поставил скобочку. На мобильник ушло порядка 600 SMS. После удаления первой полусотни я понял, что так дело не пойдёт. Пришлось звонить оператору и объяснять техсаппорту, что, где, с каких серверов и каким образом почистить очередь.

9191

Роботы не терпят измен

В основе Google Android лежит Linux — это знают все. Это значит, что и мороки с ним бывает порой столько же. Вот и сейчас перелопатил кучу мануалов из-за своей невнимательности.

Переименовал папку с бэкапами системы, чтобы по ошибке потом вместо одного не восстановить другое. Потом думаю: а верну-ка я пока на свой Galaxy Ace эту альфа-версию CyanogenMod 9 (Android 4.0.4), поковыряюсь в новой «мороженке» от Гугла!

Не тут-то было: перезагрузив телефон, войдя в Recovery и сделав вайп данных на всякий пожарный, я обнаружил, что при попытке восстановить образ мне поступает жалоба на несоответствие хэшей MD5. У меня аж мороз по коже: неужели похерился? Ладно, вернём хотя бы старую инфу, а то после вайпа ставить все программы заново неохота. Выбираю бэкап CyanogenMod 7 (Android 2.3.7) — и у него та же ошибка. Тут мозг зашевелился и выдал мысль: если хэши не совпадают, значит, в файле, что лежит с архивами, зашифрованы пути. Ну и хорошо — по-быстрому гуглю онлайн-генератор хэшей, ввожу путь до бэкапа в обычном формате (/sdcard/…/data.ext4.tar), копирую в nandroid. Считаю md5 от полученных значений, сохраняю, пробую. С замиранием сердца смотрю, как телефон, проверяя хэш, долго сверяет его. «Съел! Сейчас пойдёт!» — уж было обрадовался я, но телефон огорчил меня, выплюнув ту же ошибку.

Ладно, если нельзя справиться с хэшем, значит, нужно искать другой путь восстановить информацию, ведь трафик тратить и заново настраивать телефон в два часа ночи очень неохота. Ведь можно создать зип-файл в виде обновления системы и залить его как это самое обновление. Только зип-то Андроиду не простой нужен, а подписанный, с сертификатами и manifest.mf — привет, Java!

Гуглю мануал по созданию такого архива. Пишу скрипт установки, создаю сертификат и ключ, запаковываю в архив и подписываю. Устанавливаю — и робот версии 2.3.7 шлёт меня лесом за то, что скрипт написан языком, который со времён версии 1.5 уже не использует. Ищу мануал, как переписать под 1.5+, нахожу, переписываю, перезапаковываю, переподписываю, снова пробую. «Еrror in update.zip (status 6)». Что теперь-то не так? Гуглю — либо что-то недописано в скрипте, либо кодировку такую Андроид не ест. Ага, ANSI-то не ест. Перепроверяю — вплоть до буквы всё верно, а не работает. Что, простите? Цитирую: «Note: you should add one extra line at the end of the file». Да, без лишней пустой строки скрипт не хочет запускаться.

Добавляю, провожу все операции снова — и опять, но на сей раз жалоба на update-binary. Ищу, как бороться с этим, и натыкаюсь на совет по перезагрузке Recovery. Пробую — и снова попадаю на ошибку «status 6». По запарке вместо пункта Install нажимаю Backup и наблюдаю, как радостно бегут буковки и прогресс-бар по маленькому экрану смартфона. Отменить процесс нельзя, поэтому, дождавшись завершения, решаю попробовать снова. Вновь подключение карты памяти к компьютеру и внезапное озарение экрана окном о том, что карту не помешало бы проверить на ошибки. Даю «окошкам» добро, жду окончания процесса и отключаю карту, пробую снова, возлагая на это одну из последних надежд, так как два часа плясок с бубном, скриптами и сертификатами на одном месте измотали очень сильно.

В конце концов я плюнул и просто прошил снова, устанавливая всё как обычно. Хоть и потерял многое, но запомнил снова забытое ранее правило: «Работает — не трогай!»

9168

Кто украл мои годы?

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

Звонит знакомая знакомых и просит отредактировать немного фоток, где она с мужем на какой-то выставке. Договорились, слила она мне их на мыло. Работа закипела: малозаметная ретушь с сохранением текстуры кожи, цветокоррекция, кадрирование, удаление ненужных деталей… Дал жене на оценку (незамыленный взгляд и всё такое) — отлично, можно отправлять.

Отправил. Гордый собой, жду реакции. Перезванивает. Достаточно сухо благодарит, внезапно начинает рыдать и бросает трубку.

Жена позже выяснила, что эта знакомая, увидев отретушированные фото, поняла, что она может выглядеть значительно лучше, а сейчас — старуха старухой.

9163

Вы что курили?

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

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

При входе на фабрику бдительная охрана изъяла у нас все «носители информации» — штампованные диски с ПО. Наши флешки и КПК их совершенно не заинтересовали. Удалось договориться. чтобы диски с дистрибутивами разрешили пронести в сопровождении начальников охраны и отдела IT.

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

И вот когда система была отлажена, настало время презентовать. В небольшом актовом зале собрались финансовые руководители всех предприятий и прочие причастные люди. Мой коллега начал презентацию, демонстрируя различные этапы процесса работы. Но когда на экран были выведены списки мéшек табака для различных марок сигарет, главный технолог буквально побледнел и в стремительном порыве попытался закрыть своим телом проекционный экран. Коллега, почувствовав неладное, свернул окно, а технолог с негодованием прошипел, что это великая коммерческая тайна, которую даже у них мало кто знает. Я, похолодев, перебрал в памяти все папки с копиями базы системы на рабочем компе и решил удалить их от греха подальше. А ведь к нам эти мéшки попали благодаря простому импорту по ODBC из старой компанейской базы.

Преодолев момент неловкости, мы презентацию завершили и сдали систему «на руки» начальнику отдела бюджетирования холдинга. А потом к нему подошёл слегка опоздавший финансовый начальник того самого мясокомбината и в светской беседе похвастал свежекупленным учебником «Бюджетирование в Excel 2000», чем вызвал бурный хохот среди присутствующих.

9141

По-настоящему холодный душ

Пусконаладка завода по производству пива. Прибежало руководство: срочно обновить SCADA, переделать кое-что. Ну да ладно, дело лёгкое. Товарищ заливает обновления и…

И обливает гликолем +2 градуса целую бригаду монтажников, которые врезались в трубопровод. Оказывается, клапан охлаждения по умолчанию в SCADA был открыт. Хорошо, что это была не труба CIP, по которой иногда азотная кислота течёт.

Правильно говорят: проверяй умолчания!

9121

Всё правильно сделали

Сетевой администратор всё правильно сделал: управляемые свитчи, пропускающие трафик только после успешного получения адреса по DHCP.

Системный архитектор всё правильно сделал, установив в серверной два DHCP-сервера и затребовав ввод электропитания от двух подстанций и автомат включения резерва.

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

Но при работах на подстанции питание пропало на какие-то секунды. Автомат включения резерва переключился на другой ввод, но подсоединился ко второму вводу раньше, чем отключился от первого. Раньше фазы были в одинаковом порядке, так что ничего особенного не случалось. В этот раз они оказались в другом. Тем временем подключился обратно первый ввод. 380 вольт оказались закорочены. Оба 100-амперных автомата вводов выключились, и серверная (в том числе кондиционер) жила на источнике бесперебойного питания, о чём слала слёзные SMS администраторам. Но кто их читает среди ночи?

К утру заряд ИБП кончился, DHCP-серверы отключились. Затем истекло время аренды, и умные свитчи заблокировали все порты. Сеть была парализована полностью.