Архив Ноябрь 2009

is_ru

| Нет комментариев

Обожаю простые решения.

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

Решение:

    my $without_ru = $text;
    $without_ru =~ s{[а-я]}{}gi;
    next if length($without_ru) > 0.6 * length($text);

Презентации (pdf) с прошедшего сегодня первого казахстанского Perl-воркшопа:

Александр Пономарев

Андрей Шитов

Geo::ICAO

| Комментариев: 2

О чем можно написать на сайт про Perl, ожидая самолет на Perl-воркшоп? О модуле про авиацию :-)

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

Geo::ICAO группирует свои функции в несколько групп: регионы, страны и аэропорты и экспортирует их группами по запросу. Либо сразу все:

use Geo::ICAO qw(:all);

Часть функций просто возвращает списком все, что известно по теме, например, all_region_names и all_region_codes — списки названий и кодов регионов.

Другая часть отображает код на название и наоборот, например:

say region2code('Russia and former Soviet States');

say code2region('U');

Аналогично работают и функции all_country_names и all_country_codes (названия и коды стран) и пара country2code c code2country. В третьей группе — функции для работы с названиями и кодами аэропортов: all_airport_names, all_airport_codes, airport2code и code2airport:

say airport2code('Sheremetyevo International Airport');

say code2airport('UUEE');

В списочном контексте функция code2airport возвращает два значения (название аэропорта и его месторасположение):

my ($airport, $location) = code2airport('UUEE');

say "$airport, $location";

Этот вызов напечатает следующее:

Sheremetyevo International Airport, Moscow, Russia

При использовании модуля нужно помнить, что его последнее обновление было ровно два года назад, в ноябре 2007-го.

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

WhoYOUgle

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

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

sub format_number {
    my ($number) = @_;

    my $type = $number < 10000 ? 'no_ts' : '';

    $_num_format{$type} ||= new Number::Format
        -thousands_sep  => $type eq 'no_ts' ? '' : "\x{2009}",
        -decimal_point  => ',', 
        -neg_format     => "\x{2212}x", 
    );

    return $_num_format{$type}->format_number($number);
}

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

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

В минувшую субботу в Риге прошел первый балтийский Perl-воркшоп. Несмотря на небольшое число участников каждый второй был докладчиком :-)

Нам повезло и с погодой: по крайней мере вечерами и до, и после мероприятия было сухо и не холодно. Само мероприятие, наложенное на очаровательную Ригу, получилось весьма душевным. Два коллективных ужина — в Лидо и Pētergailis — превратились в приятную встречу старых (и новых) друзей :-)

На самом же воркшопе было несколько новых интересных докладов, которые привезли Карл Мэсак, Джонатан Вортингтон, Эрван Лемоньер, Антон Березин и Джеремайа Фостер.

Тем, кто пропустил Baltic Perl Workshop, он может только сниться.

Baltic Perl Workshop

Live demo

| Нет комментариев

Демонстрация работы кода во время выступления (live demo) — это высший пилотаж докладчика.

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

Однако, live demo — очень выигрышный элемент: любой доклад с ним становится интереснее. Обычно нет нужды просить зрителей повторять за собой, но смотреть, как выступающий нажимает кнопки всегда очень интересно :-)

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

Веселый пример — баянистое видео, где Патрик Мишо рассказывает про LOL CODE.

SOAP::WSDL

| 1 комментарий

Протокол SOAP — замечательная вещь. Но настолько запутанная, что все модули для работы с этим протоколом наследуют это свойство. Более того, разрабочики не всегда понимают назначение документа WSDL и запрашивают его при каждом обращении к методам удаленного объекта.

Когда-то я пробовал пользоваться модулем SOAP::Lite и мне не понравилось. Не помню, что именно, но наверное то, что пользоваться было неудобно.

Спустя несколько лет мне вновь потребовалось работать с SOAP из перла, и я решил попробовать второй модуль :-) Заработало почти сразу. С SOAP::Simple за пять минут ничего не вышло, а с SOAP::WSDL (для работы которого необходим SOAP::Lite того же автора, живущего в германской Дубне Эрлангене) все получилось замечательно.

Если все упростить, то работа по протоколу SOAP состоит из двух этапов: 1) чтение описания WSDL и 2) запрос необходимого метода. Мощь WSDL — того же порядка, что и SGML. Задумано настолько всеохватывающе, что понять всё и сразу невозможно.

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

Вот примерчик, который позволяет узнать номер моего телефона.

use v5.10;
use strict;
use SOAP::WSDL;
use Data::Dumper;

my $soap = SOAP::WSDL->new(
    wsdl => 'http://www.webservicex.net/whois.asmx?WSDL',
);

my $result = $soap->call(
    'GetWhoIS',
    {
        GetWhoIS => {
            HostName => 'shitov.ru'
        }
    }
);
say Dumper($result);

$ perl test.pl | grep phone

Краткий ликбез по SOAP доступен в «Школе W3C».

А авторский ликбез по SOAP::WSDL (хех, а слайды лежат у меня на диске отдельным видеофайлом) — на YAPC::TV.



P. S. После экспериментов выяснилось, что на этом сервере перестал работать XML::LibXSLT:

This version of XML::LibXSLT requires XML::LibXML 1.67 (ABI 1), which is incompatible with currently installed XML::LibXML 1.70 (ABI 2). Please upgrade XML::LibXSLT, XML::LibXML, or both! at /usr/local/lib/perl5/site_perl/5.10.0/i686-linux/XML/LibXML.pm line 49.

Проблема разрешилась переустановкой XML::LibXSLT.

Net::WolframAlpha

| Нет комментариев

Wolfram|Alpha — это такой интересный сервис, который умеет парсить текстовые запросы, выделять из них смысловые части из разных областей знания и показывать все, что про это известно. (Совсем не обязательно, кстати, формулировать запрос вопросом.)

У Wolfram|Alpha существует недавно открывшийся API, к которому (за деньги) можно делать программные запросы. Работа с API представляет собой обращение к соответствующему адресу с GET-параметрами и ответ в виде XML.

На сайте опубликованы и модули для работы с API на языках платформы .NET, Perl, Python, PHP и Ruby, а в планах — C++ и Java.

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

Ответ состоит из нескольких частей (контейнеров, так называемых pods), в каждой из которых данные представлены в одном из форматов, который считается приемлемым для обработанного запроса. Дополнительные секции предположений (assumptions) дают дополнительные ссылки, если выяснится, что запрос может быть понят иначе (пример из документации: pi — это и число π, и название фильма.

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

pi

Работа с модулем Net::WolframAlpha проста. Делаем запрос:

use Net::WolframAlpha;

my $wa = Net::WolframAlpha->new(appid => 'ABCDE');
my $query = $wa->query(
    'input' => 'pi',
    'scantimeout' => 3,
);

А затем методами, одноименными с XML-тегами разбираем ответ, который представляет собой объект класса Net::WolframAlpha::Query. Дамп ответа, полученного на запрос pi, — 85 килобайт текста :-) В этом же объекте хранятся и фрагменты полученного XML.

Ответ на запрос perl содержит четыре контейнера, правда с информацией, которая не относится к языку Perl. Впрочем, не обидно: другие языки программирования тоже отсутствуют :-)

Net::WolframAlpha поддерживает также две дополнительных возможности API — асинхронную обработку и проверку правильности запроса.

Разработчик модуля — Габриэль Вайнберг (Gabriel Weinberg) — говорит, что модуль обязательно появится на CPAN.

P. S. (Обновление на следующий день.) Модуль уже на спане: search.cpan.org/~yegg/Net-WolframAlpha-1.0/.

Pre-conference meeting

| Нет комментариев

Крупные Perl-мероприятия обычно предваряются так называемыми pre-conference-встречами накануне.

В частности, на YAPC::Europe многие участники приезжают за день-два до официального начала конференции, поэтому у них остается время и посмотреть город, и встретиться с коллегами.

Организация pre-confenrece-встреч — задача, про которую надо помнить организаторам. На больших конференциях на таких встречах иногда проходит и предварительная регистрация участников с раздачей беджиков. Время от времени встречи спонсируются.

На Baltic Perl я запланировал встречу накануне вечером в одном из рижских «Лидо».

Новый perl.org

| Нет комментариев
Josef Kutej

Британец Leo Lapworth сообщил о смене дизайна сайта perl.org.

В своем блоге он пишет:

«Это занимало вечера, а иногда и выходные в течение шести недель, но теперь я с гордостью сообщаю о том, что новый www.perl.org только что открыт.

На работе (Foxtons) мне и некоторым дизайнерам в моей команде выделили время, иначе все затянулось бы еще дольше».

Изменения внешнего вида коснулись и сайтов dbi.perl.org и learn.perl.org.

 

Самое время заглянуть в архив и посмотреть на то, как выглядел сайт раньше.

1996 

1996.png1999 

1999.png2000 

2000.png2004 

2004.png2009

2009.png

Josef Kutej

Основатель группы Братислава.pm Йозеф Кутей на последней YAPC::Europe рассказывал о том, как устроен сайт их группы.

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

1. make mehappy   # make for fun and profit

2. a hook for you

3. scraping my self

4. less can be more

5. dôveruj ale preveruj

6. feed us back

7. XSLT hammer

8. one Apache child must be enough for everyone

9. 12MB XML -> 5k HTML pages     # the way of elephant

В арсенале — и XSLT, и TT, и Perl, и nginx, и makefile.

Еще раз про \K

| Нет комментариев

Метасимвол \K в регулярных выражениях Perl 5.10 не только полезен, но и, как выясняется на реальном проекте, меняет мысли разработчика :-)

Время от времени возникает задача выделить из текста одно или несколько предложений, чтобы сформировать сниппет записи. Неправильный подход — обрезать строку на заданном числе символов и поставить многоточие (Фейсбук в транслящиях вообще обрезает строку по байтам, и от русских букв иногда отрезается половинка юникодной последовательности). Чуть более приятный результат (но подход настолько же неправилен) дает отсечение по границе слова (как делает Яндекс в поисках по блогам).

Обрезать же текст на границе предложения (ну или по крайней мере, после точки) одним регулярным выражением без \K не очень удобно (приходится задумываться о том, чтобы угодить коротким предложениям).

С метасимволом \K это проще:

$snippet =~ s{^.{150}[^\.]+\.\K.*$}{};

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

Бумажные анкеты, которые раздают участникам на выходе или на входе, и просят заполнить их в обмен на футболку, — это каменный век. Особенно в эпоху вейвов :-) Более удобный вариант — электронные анкеты на сайте, особенно если их можно заполнять не за один присест, а в течение всего дня. Удобно это, разумеется, и для автоматической обработки полученных данных.

Участникам YAPC::Europe уже несколько лет высылаются персональные ссылки на анкеты, данные с которых затем агрегируются и публикуются на сайте yapc-surveys.org.

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

Участникам обычно интересно писать в блоги и микроблоги (как до, так и после события), а еще интереснее — писать гадости :-)

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

Этот же агрегатор, почти без изменений, работает в экспорте новостей bfm.ru в «Твиттер». Он же стоит в программах, обсчитывающих рейтинг записей в блогах. Каждый раз интересно наблюдать за собой, как глаза выхватывают из логов устаревший стиль кода (например, все фигурные скобки на новой строке), когда модуль попадает в репозиторий и в очередной раз приходит мне же по почте.

Возвращаясь к теме обратной связи, можно обратить внимание на недавнее нововведение в «Акте» — персонализированное расписание: участники отмечают интересные им выступления одним кликом, после чего получают готовую страницу перемещений по залам на конференции.

Будущее за обратной связью — в анализе данных, которые интересны самим пользователям, к анкетам никакого интереса нет.

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

  • Мероприятия для разработчиков в России
  • Что такое grassroots
  • Экономическая основа мероприятий
  • Далеко ли можно уехать на энтузиазме
  • Сила и недостатки командного подхода
  • Аутсорсинг организации и подготовки мероприятий
  • Организация мероприятий в другой стране
  • Международные мероприятия
  • Еще раз про входную плату

18 декабря (в пятницу) в Санкт-Петербурге пройдет четвертый российский Perl-воркшоп «Saint Perl».

Дата выбрана специально так, чтобы воркшоп пришелся на 22-летие перла. Участие в мероприятии бесплатное, регистрация участников и прием заявок на доклады (в том числе и блиц-доклады) уже открыты (и более того, уже есть те, кто зарегистрировался до официального объявления :-).

Интересные мысли о том, чем можно разнообразить воркшоп, принимаются по адресу mail@yapcrussia.org. Главный организатор воркшопа — Александр Котов, основатель SPb.pm.

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

Это шестое мероприятие, организованное на территории России, а с учетом соседних стран, — четырнадцатое. На остаток 2009 года запланированы еще два воркшопа — 21 ноября в Риге и 28 ноября в Кустанае. В самом начале следующего года в планах второй воркшоп в Софии и первый в Екатеринбурге.

Пространства имен в XML — это своего рода параллельное измерение. Есть вложенность тегов, есть атрибуты, а есть пространства имен, которые могут перенести фрагмент XML в другое пространство и даже сделать его таким образом невидимым для парсеров:

<date timestamp="200911032358">
    <invisible:service name="rating"/>
</date>

При работе с таким XML через XML::LibXML важно не забывать, что для того, чтобы добраться до узла с пространством имен, отличной от той, что используется во всем документе, требуется создать контекст, а затем уже с его помощью выбирать нужные узлы:

my $context = new XML::LibXML::XPathContext;
$context->registerNs('yablogs', 'urn:yandex-blogs');

my @codeNodes = $context->findnodes("yablogs:$nodeName/text()", $node);

Код использован в бою на сервисе рейтинга русских блогов.

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

Интересно смотреть на то, кто и на каких условиях выделил помещение, как организован зал, как рассылались письма, как организовано проживание, обеды и кофе-брейки, есть ли ведущий меропрития, который объявляет докладчиков, сидят ли в зале организаторы, чтобы показывать оставшееся время, что и как с микрофонами, аудио- и видеозаписью, как ведется регистрация, как сделаны беджи, на каком языке делаются доклады, если приехало много иностранцев, висят ли указатели в самом помещении и снаружи, далеко ли туалеты, висит ли на стене или на мониторе расписание, как устроена сцена (если она вообще есть), как докладчики отвечают на вопросы и как при этом ведут себя организаторы, есть ли в помещении интернет и электричество, много ли людей сидит в холле во время выступлений, какова часть выступлений, которые скучноваты, хлопают ли слушатели, сколько стоит участие, бесплатно ли оно для докладчиков, запланированы ли (и где) мероприятия до и после основного действия, — иными словами, просто приехать и послушать мне не удается :-)

  • Август 2007. YAPC::Europe 2007, Вена, Австрия.
    Настоящее европейское качество :-)
  • Декабрь 2007. Лондонский Perl-воркшоп, Великобритания.
    Одно из самых больших перловых сообществ. Помещение бесплатно предоставлено местным вузом.
  • Февраль 2008. Немецкий Perl-воркшоп, Эрланген, Германия.
    Помещение — вуз. Участие платное, даже для докладчиков.
  • Апрель 2008. Хорватский Perl-воркшоп, Загреб.
    Опять же, собрались в одной из аудиторий вуза. Самое странное впечатление — нас без вопросов пустили посмотреть на зал в 11 часов вечера.
  • Август 2008. YAPC::Europe 2008, Копенгаген, Дания.
    Дорогой город и гостиницы, но это неважно.
  • Ноябрь 2008. TwinCity Perl Workshop, Вена, Австрия и Братислава, Словакия.
    Опять же — очень спокойная обстановка. Первый этаж какого-то центра, вход в помещение прямо с улицы.
  • Февраль 2009. Бельгийский Perl-воркшоп, Лювен.
    Помещение в гостинице за кольцом центральной части города, прямо около железнодорожной станции.
  • Апрель 2009. Nordic Perl Workshop, Осло, Норвегия.
    Мероприятие, которое несмотря на то, что по определению охватывает только несколько стран, собрало много международных гостей.
  • Август 2009. YAPC::Europe 2009, Лиссабон, Португалия.
    После второго отвергнутого предложения о проведении YAPC::Europe в Киеве или Москве, ехать сюда было немного противно. Но атмосфера конференции все-таки развеяла это чувство.
  • Октябрь 2009. Встреча Bratislava.pm, Братислава, Словакия.
    Словаки довольно скромны (прям как москвичи :-), зато из-за трех гостей, которые не понимают по-словацки, провели всю встречу по-английски.

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

Страницы

  • img

Об архиве

Страница содержит архив записей за Ноябрь 2009, расположенных по убыванию.

Октябрь 2009 — предыдущий архив.

Декабрь 2009 — следующий архив.

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.