Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу).
Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). Внимание! Прочитайте, пожалуйста, текст в правой колонке (внизу). 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 | Генеральный спонсор: Хостинг «Джино» | Контакт Вернуться к оглавлению