Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Homepage Карта сайта Версия для печати

Джентльменский набор Web-разработчика   Ларри Уолл о Perl6   Наблы Система Orphus
 

7. Держите себя в руках,  или что делать, когда это не получается

[28 октября 2001 г.]

  Лучший способ избежать спора —
устранить оппонента.

Пословица «новых русских»

Недавно у нас возникла необходимость создать программы для управления UPS (блоком бесперебойного питания) соседней машины. А именно, перезагружать ее, как только она зависнет из-за аппаратных проблем.

Мы задались вопросом, как же определить сам факт зависания. Было принято решение изредка «пинговать» эту машину с соседнего Windows-компьютера: если она некоторое число раз не откликается, посылать на UPS команду выключения-включения. На чем писать, мы решили довольно быстро. Утилиты для работы с COM-портом UPS были написаны на Паскале, а все остальное — на Perl, точнее, ActivePerl для Windows.

Чем хорош Perl, так это тем, что для него есть библиотеки практически на все случаи жизни. Их можно найти на http://www.cpan.org. Там есть такой модуль, называется Net::Ping. Его-то я и установил, решив, что альтернативное решение — вызывать утилиту командной строки ping прямо из программы — слишком расточительно. Я вставил в программу код наподобие следующего:

my $p=Net::Ping->new();
$p->ping($host, 2);

Я запустил программы, и UPS тут же взбунтовался и начал включаться и выключаться с молниеносной скоростью! После получасовых разбирательств я с удивлением выяснил, что хваленый модуль Net::Ping попросту не работает. А именно, ping() всегда возвращает ложное значение. В чем же дело? Заглянув в исходники, полученные с CPAN, я с негодованием обнаружил там примерно такой код:

sub ping
{   my ($host)=@_;
    if($system eq "Windows") {
        my $s=`ping $host`;
        return $s=~m/\(0% loss/s;
    }
    ...
}
Мы можем теперь лишь зааплодировать разработчикам. Мало того, что они используют тот самый медленный способ, — вызывают новый процесс ping.exe, — они еще и неправильно проверяют выходные данные утилиты. В самом деле, вот что выдает ping на моей машине:
Обмен пакетами с localhost [127.0.0.1] по 32 байт:

Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128
Ответ от 127.0.0.1: число байт=32 время<10мс TTL=128

Статистика Ping для 127.0.0.1:
    Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
Приблизительное время передачи и приема:
    наименьшее = 0мс, наибольшее =  0мс, среднее =  0мс

Естественно, в русской версии Windows слова «loss» нет: его заменяет слово «потерь». Именно поэтому функция и возвращала ложное значение, даже если ping проходил успешно. А всего-то и требовалось — не указывать это проклятущее «loss», а просто оставить m/\(0%/s, что и было сделано в конечном счете.

Лирическое отступление 
Мораль сей статьи проста: хотя на CPAN имеются целые залежи модулей, установив один из них и обнаружив неправильную работу программы, не торопитесь грешить на свой код: возможно, ошибка в чужом модуле. Следующий очерк был взят с сайта http://www.ricn.ru и с очевидными орфографическими (и цензурными) исправлениями помещен здесь. Автор, к сожалению, мне неизвестен. Было бы очень приятно с ним познакомиться.

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

* * *

        Я сидел у стола и вдруг вспомнил, что нужно сделать очень важный звонок. Я нашел номер и набрал его. Мужчина приятно сказал:
        — Слушаю...
        На что я вежливо ответил:
        — Меня зовут Дмитрий и я хотел бы поговорить с Владимиром Ивановым.
        Внезапно трубку с грохотом повесили, даже не ответив! Я не мог поверить, что кто-то может быть настолько груб. Я постарался найти точный телефонный номер Владимира и выяснил, что последняя цифра была неправильной. После разговора с Владимиром я снова набрал неправильный номер телефона. Когда уже знакомый мужчина поднял трубку, я зверски закричал: «Ты ослиная ж*!», и повесил трубку. Возле этого номера я написал слова «ослиная ж*» и оставил этот листочек на самом видном месте на письменном столе.
        Теперь всякий раз, когда у меня было плохое настроение или же я просто заполнял налоговые декларации, я звонил своему «знакомому» и каждый раз кричал: «Ты ослиная ж*!» Это подбадривало меня каждый раз и сглаживало плохое настроение.
        Вскоре телефонная компания предложила услуги автоматического определения номера (АОН). Для меня это было настоящим крахом, потому что я больше не мог звонить Ж*. Но однажды у меня в голове возникла гениальная мысль. Я набрал номер Ж* и услышал его голос:
        — Слушаю...
        На это я ответил так:
        — Здравствуйте. Я сотрудник телефонной компании. Мне поручено узнать ваше мнение о качестве сервиса автоматического определения номера. Вы знакомы с этим сервисом?
        — Нет! — ответила Ж* и громко повесила трубку.
        Я быстро позвонил ему еще раз и крикнул:
        — Это потому, что ты ослиная ж*!
        Причиной этого пролога является желание показать вам, что если у вас плохое настроение, то не нужно расстраиваться. Вы можете с этим быстро покончить, просто набрав номер 123-45-67.

* * *

        Неуклюжая старушка возле супермаркета очень долго старалась выехать из своего парковочного места. Я уже перестал думать, что она вообще собирается это делать. Наконец, машина начала двигаться. Облегченно вздохнув, я отъехал немножко назад, чтобы дать ей побольше места для разворота. Здорово! Я думал, что она уже окончательно собирается уезжать. Вдруг откуда ни возьмись выезжает черный BMW и словно на крыльях влетает на мое место. Я начал сигналить и кричать: «Дружище, ты не можешь это просто так сделать! Это мое место! Я был первый!» Мужик вылез из своей BMW, абсолютно игнорируя меня. Он пошел в сторону супермаркета, делая вид, что не слышит меня. Я подумал, что он ослиная ж*, ведь в мире есть очень много ослиных ж*. Я заметил наклейку «Машина для продажи» на заднем стекле. Я записал номер телефона и нашел другое парковочное место. Несколько дней спустя я сидел в офисе возле письменного стола. Я только что позвонил Ж* по номеру 123-45-67 и крикнул: «Ты ослиная ж*!» (теперь это делать очень просто, поскольку я добавил номер Ж* в память телефона). Далее я вспомнил телефон мужика, что продавал свой черный BMW. Я набрал его номер, и голос ответил:
        — Слушаю.
        — Это вы продаете отличный черный BMW?
        — Да, это я.
        — Можете сказать, где я могу вас найти и осмотреть машину?
        — Да, я живу на Пушкинской 8, первый подъезд справа, квартира 7.
        — Отлично, как ваше имя?
        — Меня зовут Николай Малый. Можно просто Колян.
        — Хорошо, Колян. Когда я могу вас застать дома?
        — Вечером. Лучше после семи.
        — Слушай, Колян, хочешь я тебе кое-что скажу?
        — Да.
        — Колян, ты ослиная ж*!
        Я громко повесил трубку. Несколько дней спустя, около семи вечера, я набрал телефон Ж* 123-45-67. Приятный голос ответил:
        — Слушаю.
        Я закричал: «Ты ослиная ж*!», но не повесил трубку. Ж* спросила:
        — Эй, вы еще там?"
        — Конечно, ж*.
        — Послушайте, прекратите, пожалуйста, мне звонить.
        — Нет, — ответил я.
        — Как вас зовут, дорогой? — спросила Ж*.
        — Меня зовут Николай Малый. Можно просто Колян.
        — Где вы живете, Николай?
        — Я живу на Пушкинской 8, первый подъезд справа, квартира 7.
        — Я уже иду, — сказала Ж*, — тебе лучше начинать молиться, придурок!
        — Ага, очень испугался, ослиная ж*! — ответил я.
        Позже я набрал номер Коляна. Колян ответил:
        — Слушаю.
        — Колян, ты самая натуральная ослиная ж*!
        — Если бы я знал где ты, я б тебя...
        — Что ты, ослиная ж*?
        — Я б тебя убил!
        — Отлично, у тебя есть шанс. Я к тебе иду, ослиная ж*!
        Я повесил трубку и набрал номер милиции. Я сообщил, что на Пушкинской 8 я убью моего квартиросъемщика, как только он вернется домой. Другой звонок я сделал на канал новостей, сообщив, что на Пушкинской 8 очередные разборки мафии. Позже я сел в свою машину и поехал на Пушкинскую посмотреть, что там творится. Фантастика! Наблюдение за тем, как два придурка выбивали один из другого мозги в присутствии шести бронированных машин ОМОНа, милицейского вертолета и кучи репортеров, было одним из наиболее удивительных переживаний в моей жизни.

 
Рекламный блок
   

Важное объявление:
    автор категорически против копирования и распространения в Интернете всех статей «Куроводства» с возрастом, меньшим 6 месяцев. Печальный опыт «расползания» чрезвычайно устаревших ошибочных версий статьи про Apache действительно объясняет такое решение.

Орфография на «Куроводстве»:
    если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Выделенный текст будет немедленно отослан вебмастеру, а Вы даже ничего и не заметите — настолько быстро все произойдет.

На заметку:
    если вы уже вскипели насчет дизайна этой страницы, то присмотритесь повнимательнее к названию, почитайте FAQ, сходите по лебедевским местам, как это уже предлагалось выше. Можно ли считать пародию плагиатом? Надеюсь, что нет.

Параметры этой страницы
   
GZip

Ссылки от спонсоров
    остановка счетчика неодимовым магнитом


Дмитрий Котеров | 28 октября 2001 г. ©1999-2016 | Генеральный спонсор: Хостинг «Джино» | Контакт Вернуться к оглавлению