Архив Октябрь 2009

Хеш vs. список

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

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

В перле (пятой версии) ООП сделан на хешах и поэтому не дает никаких преимуществ по скорости обращения к отдельным элементам по сравнению с обычными хешами.

Иногда возникают задачи, в которых необходимо собирать большие списки некоторых объектов, но оптимизторская жаба заставляет применять списки и запоминать порядок элементов.

Вот пример. Нужно собрать результаты поиска по сайту. Каждый результат — это пара из ссылки и заголовка.

Очень удобно было бы (предположив, что $search_item — это объект типа SearchItem) написать

push @result, $search_item;

Чуть менее удобно, но не менее наглядно, создавать безымянные хеши:

push @result, {
    url => $url,
    title => $title, 
};

В реальности же приходится делать списки:

push @result, [
    $uri,
    $title
]
;

Теперь не обидно создавать большие списки таких безымянных массивов, не беспокоясь о неоптимальном расходе памяти на ключи.

Так получилось, что за пару лет я организовал мероприятий про Perl больше, чем кто-либо из перлового сообщества. Заодно охватил стран больше, чем это кому-либо удавалось.

А началось все просто. В мае 2007 года я прочитал в ЖЖ, что Олег Бунин зарегистрировал домен yapc.ru. Немного позже Толик Шарифулин написал о том, что в конце августа состоится европейская конференция YAPC::EU. Ну я и поехал.

Конференция меня сильно проперла. Там же, в Вене, я познакомился с Алексеем Капрановым: он написал в ЖЖ «Давай встретимся, я в кожаной жилетке».

В Вене я познакомился и с Жозе Кастро, у которого расспросил о том, как привезти YAPC в Москву. Он мило и подробно объяснил многие детали таких мероприятий и заодно, по дороге на пикник, познакомил с Филипом Брухатом (Book), одним из двух авторов платформы Act для создания сайтов мероприятий.

Потом, уже в Москве, Павел Яковлев, главный редактор IBM developerWorks, познакомил меня с другим Павлом — Павлом Фроловым. Он как раз готовился к мероприятию Линукс-центра на Инфокоме-2007 и любезно позволил мне занять свою площадку (да еще с 40 компьютерами) на выставке на целый день. А Рамблер проспонсировал накладные расходы. Так и получился «Perl Today» — первый российский Perl-воркшоп. О том, как страшно это было делать, я не расскажу :-)

Московское мероприятие удалось, хотелось еще. Все чесалось, хотелось сделать еще одно мероприятие, но не в Москве же его делать через пару месяцев. Так, а где? Какой город лучший город Земли? Киев! Йоу, I love Kiev! Киев хоть и не так далеко, но весь мой опыт к тому времени был только в одном экземпляре. 

Но тем интересней. Для начинающих организаторов мероприятий я замечу, что самое трудное и самое важное — это помещение, а остальное приложится. Я нашел подходящее по размеру и цене место — пресс-центр информационного агентства «Украинские новости». Оформить все отношения с агентством и посмотреть на помещение помог организатор монгерской группы Киев.pm Сергей Гулько (rimas). Получилась «Perl Mova» — первый украинский Perl-воркшоп.

Зуд продолжался, и хотелось еще большего. Слово за слово, обсудили с Джимом Брандтом название и решили, что если нам удастся собрать слушателей и докладчиков столько, что получится двухдневное мероприятие, то в названии вполне допустимо использовать ключевое слово YAPC. 

Денис Бесков-Доронин познакомил меня с Петром Фединым, аспирантом ГУ-ВШЭ и одновременно директором по развитию (как это сегодня написано на «Моем круге») клуба «Бизнес в стиле .RU», и мы получили замечательное помещение (о мечтах о котором я рассказывал еще Жозе). Благодаря очередной спонсорской поддержке Рамблера мы еще и напечатали футболок (которых мне, кстати, не досталось :-) Получилась двухдневная конференция YAPC::Russia «May Perl».

А тем временем я пытался общаться с ребятами на Дальнем Востоке о том, не хотят ли они тоже провести мероприятие. Через какое-то время все созрело и братья Илья и Роман Беликины и Дима Дзема из владивостокской веб-мастерской CSmile (которые, кстати, сделали интересный проект во время «Хакфеста» Рамблера) сообщили, что они нашли помещение и готовы на подвиг. Подвиг удался, во Владивосток приехал Джонатан Вортингтон, который потом три недели поездом возвращался обратно через всю страну (многие ли жители России могут этим похвастаться? :-) Так появился первый воркшоп далеко на востоке России, Far East Perl Workshop.

Владивосток стал переломным моментом. Теперь к проекту стали активно подключаться люди на местах.

Андрей Протасовицкий и Юрий Пац, создавшие Минск.pm (сайт появился год спустя), и Лена Заболоцкая, работающая тогда в минском отделении «Агавы», невероятным образом нашли помещение в Минске, и мы сделали первый белорусский Perl-воркшоп «BY Perl».

Следом пришел Анатолий Шарифулин, который сделал другое чудо — нашел спонсора и организовал помещение в Ростове-на-Дону, и получился приятный воркшоп «South Perl».

А несколькими месяцами ранее я случайно инициировал Perl-воркшоп в Хорватии. Там на конференции DORS/CLUC я познакомился с Марианом Мариновым, организатором опенсорсных мероприятий в Болгарии. Осенью он приехал в Москву на HighLoad++, и там я поделился с ним своим желанием организовать Perl-мероприятие в Болгарии. Он загорелся, и мы получили первый болгарский Perl-воркшоп «BG Perl».

Прошел год после первого украинского воркшопа, и мы сделали второй — «Perl Mova — 2». Помещение на этот раз было бесплатным и одним из самых лучших, которые мы видели: G-клуб (теперь уже GL-клуб) выделил в наше распоряжение свой зал с бильярдом, поп-корном и тренажерами.

Когда начало казаться, что история зацикливается, пришел Алекс Капранов и сказал, что пора делать мероприятие в Узбекистане. Что, где? А там, он говорит, проходит Национальный форум программистов Узбекистана и Национальная выставка программных продуктов «Best Soft Uzbekistan — 2009», они дают нам помещение и зрителей. Едем в Узбекистан и вдвоем проводим этом мероприятие. Два докладчика, тридцать зрителей, днем рассказываем про Perl на первом узбекистанском воркшопе «Perl Tashkent», вечером забираемся на телебашню смотреть на Ташкент.

Через неделю в очередной раз нам помогает «Бизнес в стиле .RU», и мы проводим вторую двухдневную конференцию YAPC::Russia «May Perl — 2» в Москве. DeepText к этому времени пригласил в Москву Брайана ди Фоя.

Ребята из Минска, пережив волну пессимизма, во второй раз сделали мощный рывок и подготовили все, чтобы провести второй белорусский воркшоп «BY Perl Too». В этом году это было самое веселое мероприятие :-)

До конца года мы проведем еще три мероприятия, два из которых будут в ноябре (в Риге и в Кустанае), третье — в декабре (ссылка позже).


Ларри Уолл, Андрей Шитов, Глория Уолл

P. S. Сами вы мемуары.

А ведь в перле всегда была возможность простой реализации перегрузки функций. Об этом как-то не было смысла задумываться три-четыре года назад, но теперь, когда у нас есть прототип Perl 6, можно и поностальжировать :-)

Сегодня я достал из архивов код, написанный на одном дыхании несколько лет назад (и до сих пор воспользованный). Там есть функция, которая определяет словарную форму слова по ее номеру (то есть просто находит по ID запись в таблице). Сегодня мне потребовалось то же самое, но с возможностью поискать сразу несколько записей.

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

Ничего сверъестественного:

sub spell {
   my @id = @_;
   my $ids = join ',', grep {/^\d+$/} @id;
   . . .
   return @id < 2 && @base > 0 ? $base[0] : @base;
}

Искуственно выглядит лишь проверка при возврате значения.

А вот была бы С++(Perl 6-)-подобная перегрузка, было бы проще. Ждем-с.

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

  • Джеремай Фостер (Швеция). Modern Perl
  • Алексей Капранов (Россия). Going async
  • Эрван Лемоньер (Швеция). ‎Writing unix daemons with Working::Daemon‎

Дальше начинается самое интересное:

  • Эрван Лемоньер (Швеция). ‎Decoupling sql code from perl code using named queries‎
  • Антон Березин (Дания). ‎Decoupling sql code from perl code using perl code :-)

Карл Мэсак, Джонатан Вортингтон и Андрей Костенко тоже обещают приехать не с пустыми ноутбуками.‎

Еще не поздно зарегистрироваться, купить билет и в Ригу!

Предварительное видео с белорусского воркшопа.

Наим Шафиев. Padre—Free PERL IDE. 20 минут.

Предварительное видео с белорусского воркшопа.

Алексей Капранов. planetperl.ru. 47 минут.

Соль минор

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

Я хотел написать про одно, а напишу про другое.

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

Например, модуль GD::Chord::Piano рисует такие простые картинки:

chord.png

Интерфейс крайне прост и приятен:

use GD::Chord::Piano;
my $im = GD::Chord::Piano->new;
print $im->chord('Gm')->png;

Все, что требуется, — передать название аккорда методу chord. Этот пример скопирован из документации к модулю.

А вот другой модуль — Music::Image::Chord, который, судя по названию и описанию, должен делать нечто похожее.

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

Use of uninitialized value in division (/) at /usr/local/lib/perl5/site_perl/5.10.0/Music/Image/Chord.pm line 152.
Can't use an undefined value as a HASH reference at /usr/local/lib/perl5/site_perl/5.10.0/Music/Image/Chord.pm line 153.

Нет, можно конечно продолжить разбираться, но не хочется.

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

У разработчиков периодически возникают ситуации, когда они уверены в написанном коде и не проверяют его. Ну разве можно ошибиться, исправив один-два символа в регулярном выражении на боевом сервере? А вот можно :-) Сила опытного разработчика не в том, что он может писать код с закрытыми глазами, а в том, что он не стремается проверять себя.

В качестве офтопика можно вспомнить историю, расказанную создателем Бейсика Томасом Курцом о том, что какой-то аспирант написал компилятор PL/1 без отладки, впервые запустив его только после того, как код был полностью написан:

...he worked at Darthmouth in the computer center. He wrote a PL/1 compiler, and it's a big thing, and he checked it, and looked at it, and so on, but he never tested it, he never ran it until it was all done. You know, 20,000 or 30,000 lines of code, and the only test he did was to read it. Then he ran it and it worked the first time!

В той же книге рассказано и о том, что означат отладка для создателя C++ Бьярна Страуструпа:

— How do you debug? Do you have any suggestion for C++ developers?
— By introspection. I study the program for so long and poke at it more or less systematically for so long that I have sufficient understanding to provide an educated guess where the bug is.

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

({}) vs. ()

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

Сколько существует YAPC::TV, столько существует и небольшой вспомогательный скрипт, который автоматизирует работу по конвертированию видеофайлов в разные форматы.

В этой программе есть функция convert, которая принимает ссылку на хеш:

sub convert {
    my $param = shift;

И затем разыменовывает ее:

my $s = "-s $$param{s}" if $$param{s};

При этом каждый вызов convert содержит обилие скобок — одни для вызова функции, другие для создания анонимного хеша:

convert({
    type => 'mpg',
    s => '480x270',
    r => 25,
    b => '512kb',
    ar => 22050,
});

Конечно, можно было бы вторые скобки не ставить вообще, а в функции принимать готовый хеш:

sub convert {
    my %param = @_;

Но тут возникает вопрос о том, как этому научить начинающего программиста. Конструкции вида %hash = @array не так просто понять в начале изучения языка, как это кажется после нескольких лет использования перла.

Хотя различие между следующими двумя строками схватывается на ура:

$a = @a;
($a) = @a;

PHP на перле

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

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

На сегодняшнем сайте php.net в разделе Downloads лежат только дистрибутивы последних версий 5.2.11 и 5.3. На странице Releases есть более глубокий архив, но все равно не дальше третьей версии.

Есть еще отдельная музейная страница, на которой числится ссылка на первую версию. Но в дистрибутиве php-108.tar.gz оказываются только исходники на C. Все, что может привлечь внимание — занятное имя одного из файлов: phpl.c.

Теперь (почему бы было не начать с этого :-) идем в раздел истории, где выясняется следующее:

PHP succeeds an older product, named PHP/FI. PHP/FI was created by Rasmus Lerdorf in 1995, initially as a simple set of Perl scripts for tracking accesses to his online resume. He named this set of scripts 'Personal Home Page Tools'. As more functionality was required, Rasmus wrote a much larger C implementation...

Иными словами, зачаток все-таки был написан на перле, но в первый публичный релиз вошел код, написанный на C. И назывался он уже не Perlsonal Home Page Tools, а составным именем Personal Home Page / Forms Interpreter.

О релизе Расмус Лердорф сообщил в NNTP-группе comp.infosystems.www.authoring.cgi. В этом письме содержится только одно упоминание о перле:

You do not need access to Perl or Tcl or any other script interpreter

(Впрочем, в правилах самой группы числится рекомендация о том, что прежде, чем задать вопрос по CGI, надо заглянуть на страницу Perl FAQ.)

В общем, PHP действительно предшествовали какие-то Perl-скрипты, но публичная версия с самого начала была написана на C.

Обновил на сайте список файлов со своими докладами.

Теперь общее число опубликованных файлов (сами презентации на трех языках) достигло 50.

Предварительное видео с белорусского воркшопа.

Андрей Костенко. ‎DBIx::Class — базы данных в стиле Perl‎. 80 минут.

\K

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

В регулярных выражениях, доступных в Perl 5.10, появился метасимвол \K, который устанавливает точку «невозврата», до которой строка не должна измениться даже после замен.

Мой коллега порадовал еще раз, применив эту фичу в работе.

my $uri = $ENV{REQUEST_URI};
$uri =~ s{^.+?\K\?.*$}{};

Здесь в переменной $uri оказывается адрес без строки запроса, если она была.

Без использования метасимвола \K подобные замены приходилось делать явно, применяя захват и соответствующие переменные для подстановки:

$uri =~ s{^(.+?)\?.*$}{$1};

В документации замечено, что использование \K намного эффективнее (much more efficient), чем явная замена.

До Perl 5.10 аналогичная функциональность была возможна при подключенном модуле Regexp::Keep.

Братислава.pm сегодня проводит очедедную технико-социальную встречу группы.

Собралось десять человек, включая меня и гостя из Италии. Помещение (как оказалось, традиционно) предоставила компания, которая занимается разработкой CMS на перле Cyclone 3.

Я рассказал про свою игрушку — компилятор Perl 6 (обновленные слайды опубликую попозже), а Эммануэль Родригез — про другую игрушку, написанную на перле, — ну там, где тыкаешь по ячейкам, тебе показывают фотки и надо найти пару. 

А сейчас переместились на социальную часть :-) А тем временем Толик поехал в Минск.

Почти два года назад появился Perl 5.10. Спустя год я начал более или менее размашисто применять его фичи на практике. А сегодня увидел в коде у коллеги интересную конструкцию с оператором defined-or (//).

Есть известный перлизм с вызовом die или warn, пристыкованным к действию, которое может завершиться с ошибкой:

open my $file, $filename or die "File not found";

А вот интересный прием с //:

do_something() // return NOT_FOUND;

Честно говоря, такая конструкция чем-то напоминает неадекватные инструкции в тернарном операторе:

is_leap_year() ? ($n = 366) : ($n = 365);

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

В ближайшую субботу (17 октября) в Минске состоится второй белорусский Perl-воркшоп «BY Perl Too».

Предварительное расписание выступлений выглядит так:

  • Андрей Костенко. DBIx::Class-базы данных в стиле Perl.
  • Юрий Пац. Perl-AppEngine.
  • Алексей Капранов. planetperl.ru.
  • Алексей Капранов. 9 способов обработать HTTP-запрос.
  • Андрей Шитов. Создание компилятора Perl 6.
  • Александр Загацкий. ‎Perl6::Pod: Создание расширений для нового диалекта Pod‎.
  • Наим Шафиев. Padre—Free Perl IDE.
  • Андрей Протасовицкий. Booking.com & Perl—Success story.

Участие бесплатное, и еще есть возможность купить билет до Минска и присоединиться.

Сегодня на HighLoad++ Perl упоминался весьма часто. Отдельный респект Тиму Бансу за то, что он в один день без устали смог сделать три полноформатных доклада.

Вот ссылки на презентации и блиц-доклады.

Блиц-доклады:

Уж коли хочется писать use v5.10, то надо понимать, как это работает в новой версии :-)

Помимо use v5.10 допустимо писать и так:

use feature ':5.10';

Начиная с Perl 5.10.1 (и по крайней мере в пределах 5.10) в этом случае будут иметь значение только две первые части версии. Следующие два варианта полностью эквивалентны:

use feature ':5.10.1';
use feature ':5.10';

В отличие от Perl 5.10, где версия проверяется целиком, Perl 5.10.1 разрешает указывать и еще не существующую версию, например:

use feature ':5.10.3';

Perl 5.10 же в этом случае сообщает об ошибке:

Feature bundle "5.10.1" is not supported by Perl 5.10.0 at usefeature.pl line 1
BEGIN failed--compilation aborted at usefeature.pl line 1.

Разумеется, use feature не следует путать с use vX.Y.Z. В такой инструкции версия проверяется полностью и честно:

use v5.10.3;
say "test";

Perl v5.10.3 required--this is only v5.10.1, stopped at usefeature.pl line 1.
BEGIN failed--compilation aborted at usefeature.pl line 1.

В понедельник, 12 октября, на конференции HighLoad++ состоится сессия блиц-докладов, четверть которой посвящена перлу.

Владимир Перепелица. AnyEvent — Swiss army knife for realtime web
Обработка тысяч сетевых операций в секунду одним процессом на Perl? Легко!

Алексей Капранов. CGI, mod_perl и другие 7 способов обслуживать HTTP на Перле
На дворе 2009 год, однако до сих пор на слуху всего 3 способа обработки HTTP-запросов на Перле: CGI, mod_perl и FastCGI. Я расскажу про то, какие есть другие способы это делать, в частности затрону вопросы написания собственных веб-серверов без использования apache и немножко расскажу про японскую новинку под названием PSGI.

Андрей Шитов. Perl 6 на высоких нагрузках
Рассказ о том, как привлекая принцип неопределенности увеличить скорость работы программы на Perl 6 в 10 000 раз.

Отдельной строкой хочется упомянуть доклад Александра Шигина «Python и высокая нагрузка» и комментарий автора к нему: «Почему я разочаровался в python'е на нагруженных проектах» :-)

Modern::Perl или use v5.10

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

Хроматик собирается дополнить свой модуль Modern::Perl новыми возможностями: подключать по запросу autodie и — всегда — IO::Handle (зачем?).

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

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

use Modern::Perl as_of => '2009-06-23';

Собственно, я готовился к тому, что в один прекрасный день придется отказаться от use Modern::Perl в своих программах и вместо этого писать простое

use v5.10;

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

P. S. Лучше бы подключил utf8, чесслово.

28 ноября 2009 года состоится первый Perl-воркшоп в Казахстане.

Воркшоп пройдет в городе Костанай (Кустанай) на севере Казахстана. Участие в мероприятии бесплатное, для участия необходимо зарегистрироваться на сайте event.perl.kz.

Организаторы воркшопа — Perl.KZ и Moscow.pm.

perlevents.gif

Казахстанский воркшоп является тринадцатым Perl-мероприятием, организованным при поддержке Moscow.pm, Perl6.ru и DeepText с 2007 года на территории России, Украины, Белоруссии, Болгарии, Узбекистана, Латвии и Казахстана.

До конца года состоятся еще два воркшопа: второй белорусский (17 октября) и первый балтийский (21 ноября).

Время от времени в интернетах возникает вопрос о том, как спрятать исходники при передаче заказчику проекта на перле. Известно, что эта задача не имеет решения.

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

Задача возникает тогда, когда разным клиентам необходима только часть возможностей вашего приложение. Разбивать исходную программу на несколько независимых в таком случае, скорее всего, будет неоправдано.

Другой пример — требуется предоставить демонстрационную версию программы.

Простое решение, для которого даже не потребуется установки никаких дополнительных утилит, — воспользоваться препроцессором С. Компилятор gcc не в счет: он наверняка уже установлен в системе.

package My::Module;
. . .
#ifdef DEMO_MODE
say rand(10);
#else
say $this->real_method();
#endif
. . .

Еще один пример предложенного подхода — эмуляция встроенной функции say, если потребуется развернуть приложение, в котором из возможностей версии 5.10 используется только say, на сервере со старым перлом:

#ifndef SAY
sub say {
   print @_, "\n";
}
#endif

Все, что требуется для того, чтобы на основании таких заготовок получить код для передачи, — запустить препроцессор C:

$ gcc -DDEMO_MODE -E mymodule.pm.c > mymodule.pm

Я вот подумал, что обучать регулярным выражениям нужно сразу в режиме с модификатором x. Точнее, первые пару примеров по поиску совпадений с одной-двумя буквами или строками достаточно показать и без x, но всё более сложное — только в расширенном режиме.

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

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

А вот в современном учебнике для начинающих нужно давать «переходную» версию от Perl 5 к Perl 6, хотя бы на уровне расстановки пробелов. Да и вообще, более или менее сложное регулярное выражение много легче и приятнее, когда оно записано в расширенном режиме (даже без комментариев).

Доступный Perl (2)

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

(Продолжение серии «Я читаю Camel Book перед сном» :-)

Подраздел главы 1. Управляющие структуры
Условные операторы if и unless в перле примечательны тем, что могут быть как в префиксной, так и в постфиксной форме (не считая того факта, что уже само по себе наличие unless делает Perl отличным от других языков).

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

if ($bool) {say "OK"};

но

say "OK" if $bool;

В Perl 6 с этим полегче.

Если посмотреть более отвлеченно, то видно, что постфиксные формы — это возможность, существующая сама по себе: она не привязана жестко к каким-то операторам. Мне кажется, есть смысл описать постфиксную запись отдельно: так будет легче показать общее у if, unless, while, until, for и foreach.

Страницы

  • img

Об архиве

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

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

Ноябрь 2009 — следующий архив.

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