375

Смерть звездочета

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

Люди!

Не оставляйте телескопы в одиночестве, у них очень ранимая психика.

374

А делать-то нам нечего!

Наверняка вы знаете, что часто причиной тормозов некоторых коммерческих программ являются закладки в коде типа:

for(i = 0; i < 100000000; i++);

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

Итак, нужно было сделать курсовую, иллюстрирующую, как несколько потоков разделяют общей ресурс – очередь. Одновременно потоки добавляют в очередь данные, а затем считывают из нее то, что добавили. Реализовал на C в Knoppix с использование pthread. Но веселье началось, когда я понял, судя по выводу проги, что потоки выполняются не одновременно, а поочередно.

Два дня и две ночи разбирался в чем дело. Поставил вывод промежуточных результатов после каждого добавления в очередь. Смотрю в логи – работают потоки одновременно, в очередь кидают как надо данные – все в порядке. К слову, семафоры у меня стояли правильно и никаких потерей указателя на очередь не было. Вырубаю ведение логов – потоки упрямо идут друг за дружкой.

После 5-часовой медитации и курения исходников до меня дошло – ведение логов и заставляло прогу работать правильно! При операциях ввода-вывода между добавлением данных в очередь теряется часть времени достаточная, чтобы хоть немного потоки поработали вместе.

После добавления аналога: for(i = 0; i < 100000000; i++) в поток, я заплакал над убитыми впустую выходными...

373

Монитор сохранению не подлежит!

Устроился как-то на работу администратором учетной системы.

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

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

- А второй?

- Зачем?

- Для монитора!

- (Смеясь) И что ты там будешь сохранять?

Так и не понял - то ли шутили, то ли нет. Нет, ведь в мониторе и в самом деле сохранять ничего не надо, ага...

372

Все сожрал вирус!

Когда я служил в части, у нас на объекте стоял компьютер. И было на нем много секретной информации. Возиться с засекречиванием/опечатыванием компьютера никому заниматься не хотелось, информация была нужна по ходу работы, а во время проверок его просто прятали. А проверки компьютеров военных на предмет содержания гос тайны - вещь довольно таки серьёзная.

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

371

Бригада вредителей

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

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

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

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

Внезапно я понимаю, что попал на бабки. Большие бабки. Присматриваюсь к кабелеводу электриков. Выдыхаю, понимаю, что на бабки попали все таки они - кабель пробит изначально ними.

Но потом оказалось, что и электриков пронесло.

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

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

Виновных так и не нашли.

А вы говорите - бухгалтерия, электрики...

370

Все, починил!

Утро, ресторан быстрого обслуживания, наш главный клиент. Я приехал обновлять ПО на кассах до новой версии.

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

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

- Да, мы уже в курсе - отвечаю я - все денежные ящики пока не работают, открываются только ключом!

- Да? Хм, странно, на моей старой кассе все работало!

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

Закрываю систему и захожу в неё заново - билд сменился, ящик не открывается.. Я успокоился и, с чувством выполненного долга, сообщаю кассиру:

- Все в порядке, я починил вашу кассу - (давно не видел такой кратковременной улыбки!) - теперь на ней ящик также не работает, как и на остальных!

369

Ничего не изменилось

У нас политика - мы не знаем пароли юзеров. Звонит как-то девушка:

Девушка: У меня почта не приходит в Thunderbird..

Я: Сейчас сменю тебе пароль и зайду на webmail посмотрю, что тебе там пришло.

Меняю пароль на 123, захожу на вебмыло, вижу что почты новой нет, отправляю от себя письмо юзеру, на webmail приходит без проблем.

Я: Принимай у себя почту в Thunderbird (забываю сказать, что нужно указать новый пароль).

Девушка: О, от тебя пришло письмо.

Я: Как это, пришло письмо?

Девушка: Ну, ты же мне отправил письмо, вот оно пришло, тема - "тест 1".

Я: Я тебе сменил пароль, ты не могла получить почту, не указав новый пароль: 123.

Девушка: Так у меня и был 123...

368

Пременной варадокс

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

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

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

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

367

Собрать по кирпичику

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

Бились над проблемой 3 дня, перелопатили кучу кода, даже нашли некоторые другие баги, которые не имели отношения к проблеме. В итоге наткнулся на кусок кода в том месте, где искать никто просто не додумался:

$res = $DB->getData($query); //считывает данные с ДБ и загоняет в пронумерованный массив

$data = new array();

foreach ($res as $key=>$value)

{

if (!$data[$key])

$data[$key] = $value;

};

Все это вместо простого $data = $res;

Что имел ввиду кодер, родивший это чудо, так и осталось загадкой.

366

Дядя Вася

В свое время делали региональную сеть. По принципу - каналы (медь) предоставляет одна госконтора, а мы оконцовываем. Запустили - все работает.

Через 3 дня вдруг один из участков начал сбоить. Причем, нестабильно. Данные проходят, но с потерями. Это один из худших видов ошибки. Две недели пытались выловить причину. Несколько раз меняли оконечное оборудование (а это поездка в 160 км). Клиент негодует. Использовали даже аппаратуру для проверки качества соединения, чтобы выявить всевозможные "наводки" на канал.

Сидим на оконечной точке. В очередной раз поставили новую аппаратуру, настроили циски, все перепроверили - ничего не происходит. Грустим.

Тут заходит в гости дядя Вася - местный телефонист. Пьяный в доску.

- Привет ребята. Чё такие грустные?

- Да вот, опять связь нестабильная, пакетики теряем.

- Да не грустите, я вам тут в качестве подарка улучшение сделал.

Нас прямо приподняло над стульчиками.

- Мил человек, а что ты сделал?

- Дык я вам на линию усилок впаял. Чтобы сигнал посильнее был. Так что с вас бутылка.

- А покажи-ка?

- Дык вот же я прямо на кроссе в разрыв и вставил. Усилитель ТЧ (тональной частоты).

Опа, а у нас-то оборудование цифровое!

- Дядь Вась, а какую полосу частот он усиливает?

- ....

- Дядь Вась, вот тебе магарыч. За то, что уберешь свой "усилок".

Конечно же, все заработало. Дядь Васин усилок срезал самый верх несущей частоты модема. И в результате порядка 10% пакетов терялось. Ни одному нашему спецу даже в буйных фантазиях не представлялось, что каким-то образом может вырезаться часть частоты.