Архив Февраль 2010

Что для вас @var?

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

Как вы называете в повседневном обиходе переменную с именем @var? Массивом или списком?

Проголосуйте

Perl на РИТ++

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

РИТ++Открыт сайт конференции РИТ++ (Российские интернет-технологии) 2010 года. Конференция пройдет в Москве 12–14 апреля.

В этом году на РИТ++ отдельным потоком пройдет «вложенное» мероприятие — конференция MayPerl (да-да, в апреле).

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

  • Perl в крупных организациях;
  • Perl 6;
  • Perl в сравнении с другими языками программирования.

Регистрация, оплата и личный кабинет находятся на общем сайте конференции РИТ++. Присоединяйтесь (=заставьте своего работодателя вложиться в Perl)!

Презентация А. Ш. блиц-доклада на «Перлбурге» про спан.

Lingua::RU::Inflect

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

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

Александр Сапожников после блица Анатолия Шарифулина выложил на CPAN свой первый модуль Lingua::RU::Inflect, предназначенный для склонения русских имен.

Тест-драйв (с массой бойлерплейтов перед основным кодом :-):

use v5.10;
use utf8;
use open qw(:std :utf8);
use strict;
use Lingua::RU::Inflect qw(:all);

say inflect_given_name(GENITIVE, 'Андрей');

say join ' ', inflect_given_name(GENITIVE, 'Андрей', 'Борисыч');

Программа печатает

Андрея
Андрея Борисыча

Нелитературное Борисыч просклонялось правильно :-) Такой вот лингвоспан.

На седьмом голландском Perl-воркшопе, который пройдет в Арнхеме 5 марта, подобралась завораживающая коллекция докладов о разных версиях Perl (перечислены в порядке возрастания версии :-)

Презентация Анатолия Шарифулина на «Перлбурге».

Perl 5.10 в 2010-м

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

Моя презентация на «Перлбурге».

Презентация в пяти частях, основное содержание — о том, как и зачем используют возможности 5.10 в новых модулях на CPAN и мои примеры вариантов применения, которые я показывал на onperl.ru.


View more presentations from andy.sh.

Perlgolf на Perlburg

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

Екатеринбургские организаторы воркшопа Perlburg опубликовали задание для конкурса Perlgolf.

Дана строка, состоящая из маленьких английских букв. Найти её на прямоугольном поле из символов, разделенных пробелами. При этом если символы являются соседними в строке, то они должны быть соседними и на поле (по вертикали, горизонтали или диагонали). На стандартный вход подается файл, в первой строке которого указана размерность поля и искомая строка, далее идет сама таблица из символов, разделенная пробелами. В ответе нужно выдать набор чисел-координат символов на поле — «номер строки» и «номер столбца», разделенные пробелами (Нумерация идет с нуля), указанные в порядке следования букв в строке. Данные корректны. В случае отсутствия строки ничего не выдавать.

Например, файл input.txt содержит:

5 5 qwerty
q f e g a
b w r p n
k d t n d
c y c v n
h u k s a
	
$ perl solve.pl < input.txt
0 0 1 1 0 2 1 2 2 2 3 1

На спане есть некоторое число модулей, которые используют новые возможности версии Perl 5.10.

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

use 5.010000;
use 5.01001;
use 5.0100;
use 5.010;
use 5.010_000;
use 5.10.0;
use v5.10.0;
use v5.10;
use feature ':5.10';

О том, что еще творится на спане, я расскажу на Перлбурге :-)

use everywhere

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

Те, кто активно пользуются версией Perl 5.10, каждый раз пишут в начале файла инструкцию use v5.10 (в разных вариантах) или use Modern::Perl.

Брок Вилкокс создал (еще в августе 2009-го) модуль-прагму everywhere, и в документации прямо пишет о том, что сделал это для того, чтобы не писать надоедливые use 5.010.

Если вставить инструкцию everywhere до подключения других модулей, то ее аргумент автоматически превращается в соответсвующий вызов use внутри подключенных файлов.

use everywhere q(feature ':5.10');
use MyModule;

MyModule->my_sub($$);

Соответственно, внутри MyModule.pm теперь возможно использовать фичи 5.10:

package MyModule;

sub my_sub {
    say $_[1];
}

1;

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

use everywhere 'MooseX::Declare';

При попытке написать

use everywhere 'v5.10';

или

use everywhere '5.10.1';

появляется предупреждение о том, что v-string in use/require non-portable. Это удается обойти, написав переносимую (хотя и менее понятную человеку) конструкцию

use everywhere '5.010';

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

use v5.10;
use everywhere 'v5.10';

Perl Mova + YAPC::Russia 2010

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

Perl Mova + Yapc::RussiaВ этом году два мероприятия — ежегодный украинский воркшоп Perl Mova и
российская конференция YAPC::Russia — объединяются в одно и пройдут в Киеве с 12 по 14 июня.

Суббота и воскресенье, 12 и 13 июня, — дни докладов. Помещение нам предоставляет GL-Club компании GlobalLogic. Помимо зрительного зала, экрана и проектора там есть кухня, душ с гидромассажем, бильярд и спортивные тренажеры.

В понедельник 14 июня (в России это выходной день) планируется прогулка на теплоходе вдоль Днепра.

Основная часть мероприятия бесплатная. Катание по реке — за дополнительную плату.

URL конференции — по выбору :-)

Регистрируйтесь участниками. Регистрируйтесь докладчиками. Регистрируйтесь блиц-докладчиками. JFDI.

Твиттер: twitter.com/yapcrussia.

for и when

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

То, что описано в этой заметке, вполне можно было бы записать в список каверзных задач на собеседовании.

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

use v5.10;

my @array = (1..20);
my $count = 0;
for(@array) {
    when(/[02468]$/) {$count++}
    say $_; # либо просто say;
}

say $count;

Вопрос: что будет напечатано на экране?

С последней строкой все понятно — она напечатает счетчик $count, и в нем содержится правильный ответ 10. Но вот say $_ внутри цикла напечатает лишь все нечетные числа от 1 по 19.

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

Продолжить цикл возможно стандартным образом, дописав continue:

for(@array) {
    when(/[02468]$/) {$count++; continue;}
    say $_;
}

В качестве дополнительного задания можно спросить, а что изменится, если в условии вместо регулярного выражения записать when($_ % 2).

А затем так: when(!($_ % 2)).

Опубликовано расписание выступлений на воркшопе Perlburg, который состоится в субботу, 20 февраля, в Екатеринбурге: event.perlrussia.org/perlburg/schedule.

Perl Mova + YAPC::Russia 2010

Киев, 12–14 июня 2010.

XSLT::Dependencies

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

Небольшая предыстория.

Верстка сайта Microsoft сделана на XSLT. Разумеется, многие XSLT-файлы зависимы от других, и при верстке довольно часто приходилось пересохранять неизмененный основной файл, хотя изменения делались где-то в другом файле, который подключался. А это напрягало.

Студийный parser долгое время тоже не умел обновлять кеш зависимых XSLT-шаблонов. Это тоже напрягало (хотя более напрягал, конечно, сам parser).

По мере возможности я стараюсь кешировать разобранные и скомпилированные XSLT-файлы. На спане есть модуль XSLT::Cache, который, однако, не отслеживает зависимости. Недостаток призван компенсировать модуль XSLT::Dependencies.

use XSLT::Dependencies;
my @dep_list = XSLT::Dependencies->new->explore('myfile.xslt');

В списке @dep_list оказывается перечень всех файлов, которые прямо или косвенно подключены к файлу myfile.xslt.

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

В todo числится обучить модуль читать XSLT не только напрямую из файла, но и из уже разобранного дерева XML::LibXSLT.

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

Perl @ FOSDEM

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

Габор Сабо опубликовал иллюстрированный рассказ о том, как он пропогандировал Perl на прошедшей недавно в Брюсселе конференции FOSDEM.

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

European Perl events in 2010

P. S. Пропущена конференция в Киеве, которую мы планируем провести в июне.

Скоро Perlburg

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

Еще не поздно зарегистрироваться и приехать на пятый российский Perl-воркшоп «Perlburg», который пройдет в следующую субботу, 20 февраля, в Екатеринбурге.

Сегодня список выступлений выглядит так.

state (2)

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

Хотя вчера я и написал, что ключевое слово state в перле похоже на static в C++, документация утверждает, что это не вполне так. Описано, впрочем довольно размыто.

Что еще нужно знать про state, кроме того, что эта инструкция стала доступна только с версии Perl 5.10?

Во-первых, state можно эмулировать и в ранних версиях.

{
    my $counter;
    sub counter {
        return ++$counter;
    }
}

print counter(), "\n"; # 1
print counter(), "\n"; # 2

Переменная $counter, оказываясь в замыкании, с одной стороны, недоступна для внешнего кода, а с другой, сохраняет свое значение между вызовами функции counter().

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

use v5.10;

sub counter {
    state $counter;
    ++$counter;
    return \$counter;
}

my $c = counter();
say ++$$c;        # 2
say ${counter()}; # 3

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

use v5.10;

sub counter {
    state $counter = 10;
    return ++$counter;
}

say counter(); # 11
say counter(); # 12

Попытка же инициализации списка или хеша приводит к ошибке:

state @a = (1, 2, 3);
Initialization of state variables in list context currently forbidden

state @a //= (1, 2, 3);
Can't modify private array in defined or assignment (//=)

В документации (perlsub) явно указано, что такие присвоения в языке не определены.

Тем не менее, при необходимости обойти это ограничение довольно просто.

state @a;
@a = (1, 2, 3) unless defined @a;

state (1)

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

Из записок технического менеджера.

A

За последние несколько дней несколько раз рассказывал, что моя жена в свое время преподавала в университете C++ студентам-физикам. Сам-то я до сих пор испытываю нереализованное желание писать на этом замечательном языке — первом, в котором я досконально и по-взрослому разобрался.

В C++ есть модификатор static, который в применении к переменной означает, что ее значение не нужно забывать между вызовами функции.

Б

Мой коллега за последние несколько недель несколько раз коммитил код с модификатором state (правда, потом были и откаты этих правок). Сам-то я до сих пор ощущаю внутреннее желание найти еще сто тысяч применений новым фичам, появившимся в Perl 5.10, но чувствую, что досконально и по-взрослому это ощутят лишь через несколько лет.

В Perl 5.10 модификатор state делает то же самое, что и static в C++ — позволяет сохранять значение переменной между вызовами подпрограммы.

B

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

Сегодня как раз предоставился такой случай. Мне потребовалось выбрать случайную строку из большой базы данных. Разумеется, sort by rand() не подходит, а вот limit $N, 1 работает вполне быстро.

my $N = int rand $count;

Тут все понятно: чтобы узнать общее число записей $count, нужен еще один запрос (к тому же он с дополнительными ограничениями where). Вместо того, чтобы возиться с кешированием этой величины (memcached, BEGIN, etc.), достаточно поместить значение в статическую переменную, и вычислять ее, если она неопределена.

state $count;

unless ($count) {
    #
SQL-запрос select count(*)
}

my $offset = int rand $count;
#
SQL-запрос select ... limit $offset, 1

В файлик todo.txt заносится задача: использовать state совместно c defined-or (//).

Geo::Horizon

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

Сегодня можно было бы написать про Google Buzz, но Perl API к нему еще не создан :-)

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

Например, когда в центре Москвы (на широте около 55°) снесут все гостиницы и старые здания, человек ростом 180 см (вставшего на цыпочки, чтобы компенсировать расстояние от глаз до макушки) сможет видеть на расстоянии около пяти километров (что, в общем, сходится с тем, что говорили на уроках природоведения).

use v5.10;
use strict;
use Geo::Horizon;

say Geo::Horizon->new->distance(1.8, 55.7522); # 4794.73

При создании объекта типа Geo::Horizon возможно явно указать один из типов аппроксимации формы Земли, которые понимает модуль Geo::Ellipsoid, например:

my $gh = Geo::Horizon->new('WGS84');
say $gh->distance($height, $latitude);

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

say $gh->distance(318, 41.345278);              # 63677.53
say $gh->distance_great_circle(318, 41.345278); # 63675.51

Template::Semantic

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

Один из бешеных японцев™ — Наоки Томита — сегодня опубликовал на спане интересный модуль Tempalte::Semantic, один из немногих yet another-шаблонизаторов, на который стоит обратить внимание.

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

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

<html>
    <head>
        <title></title>
    </head>
</html>

А затем описываем правила а-ля CSS:

use v5.10;
use strict;
use Template::Semantic;

say Template::Semantic->process(
    'title.html',
    {
        'html title' => 'My Title',
    }
);

Эта программа напечатает HTML-код с подставленным заголовком:

<html>
    <head>
        <title>My Title</title>
    </head>
</html>

Fantastique!

Описания с CSS-селекторами или XPath-адресами допустимо создавать и более сложной структуры, в том числе с вложенными хешами и списками (последние позволяют размножать фрагменты HTML-шаблонов).

Примеры наглядно описаны в документации модуля, а кроме того собраны в отдельном файле Template::Semantice::Cookbook.

Why Perl?

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

На этой неделе в рассылке Moscow.pm я задал простой вопрос: как показать начинающим программистам сильные стороны Perl?

В итоге получилось большое обсуждение на листе, где в том числе вспомнили картинку про создание мира, кросспостинг (позже удаленный) на ru_perl с руганью в комментариях в частности о том, надо ли лукавить перед студентами, сгущая краски, пост на ru_perl о том, что студентам надо преподавать не Perl, а Java и XML и перепост перепоста с интересным обсуждением в комментариях о нишах языков.

Stay tuned, епта.

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

Вот пример. У нас есть сервис, отыскивающий по названию город в базе данных. Атомарная работа — поиск города — задача, вынесенная в отдельный воркер. При этом воркер умеет самостоятельно обрабатывать запрос, состоящий из нескольких слов:

my @words = $request =~ m{(\w+)}g;
for my $word (@words) {
    place_locality_search_word($word, $response);
}

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

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

На картинке — тестовый результат работы такого рекурсивного механизма для запроса со списком городов с ближайшими Perl-мероприятиями (софия екатеринбург амстердам москва киев vlorë).

P. S. Пока не стал коммитить такое решение :-)

Geo::Ellipsoid

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

Из записной книжки программиста.

Январь

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

Когда Яндекс открывал свои «Самолетики», они ввернули в заметке в их корпоративном блоге какое-то умное слово — ортодромии. Ну явно для того, чтобы поумничать. Кто же не знает, что ортодромия — это не про нашу Землю, это лишь кратчайший путь на поверхности сферы вращения. Мне-то нужно найти конкретный модуль по употребимому английскому названию и именно для Земли. Это название — great circle. Ищем.

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

Февраль

Стало скучно, что мы тут уже месяц считаем расстояние по ровненькому шару, а Украина до сих пор не выбрала президента. Что же там есть на спане еще? Йоу! Есть модуль Geo::Ellipsoid, и в нем с десяток разных формул, по которым описывают форму Земли. Хочу.

Так, что нужно? Интерфейс странноват, но понятен. Попробую на старом примере, посчитаю расстояние от Москвы до Киева. Как хорошо, что в папке /test у меня все это сохранилось, не надо заново искать координаты.

use v5.10;
use strict;
use Geo::Ellipsoid;

my @moscow = (55.7522, 37.6156);
my @kiev = (50.4333, 30.5167);

my $geo = new Geo::Ellipsoid(
    ellipsoid => 'WGS84',
    units => 'degrees',
    distance_units => 'kilometers'
);

my $dist = $geo->range(
    $moscow[0], $moscow[1], $kiev[0], $kiev[1]
);
say $dist;

В очередной раз напрягся, восстанавливая в памяти, что из longitude и latitude широта, а что — долгота, но вроде не перепутал и получил ответ, поохожий на правду. С GIS::Distance было 757 километров, с Geo::Ellipsoid — 759. (А оно должно было стать больше или меньше? Хотя какая разница, если все равно города на разной высоте относительно моря.)

Закоммичу, пожалуй.

Три минуты спустя

Коллега, прочитавший пришедший в почту дифф коммита, пишет: «Хм, а GIS:Distance::Formula::GeoEllipsoid?». Что это? Позырю. Блядь, я же забыл, что GIS::Distance может еще считать и по эллипсоиду. Читал же, когда его пробовал в прошлый раз. GIS::Distance это обертка, которая делегирует все расчеты другим модулям. Вместо того, чтобы приделывать новый модуль, можно было бы просто указать параметр ellipsoid => 'WGS84' к существующему. Незадача какая, сраный спан без аннотированных перекрестных ссылок.

30 января в Софии прошел второй болгарский Perl-воркшоп. Первое мероприятие было проведено ровно год назад, 31 января 2009 года.

На этот раз посетителей и докладов было поменьше, но сам воркшоп от этого ничуть не пострадал. (Хотя, надо вспомнить офлайн № 17 Moscow.pm, размывший понятия воркшопа и встречи pm-группы.)

Воркшоп помогали организовывать Бойчо Бойчев и Мариан Маринов, который регулярно проводит конференцию по открытому ПО OpenFest, приезжал в Москву рассказывать про Gluster, и возил Джонатана смотреть окрестности Софии.

Выступлений было три, но все они получились продолжительными :-) Мариан рассказал про AnyEvent, Петар Шангов — про Catalyst, я — про Gearman.

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

Интересная деталь: среди участников (по крайней мере, социальной части :-) были отец и сын. Два поколения, старший — Пламен и младший — Николай. Отец, к тому же, говорил по-русски и много рассказал про Софию, про скользкие желтые кирпичи на центральной — «Желтой» — площади, про бывший проспект Ленина и нынешний Царя-освободителя, а заодно про македонцев, ментлитет итальянцев, англицизмы и русизмы в болгарском языке.

На следующий год мы планируем провести третье мероприятие про Perl в Болгарии, но сделаем это вместе с одним из регулярных IT-мероприятий в Софии.

В минувшую суботу показал болгарам, что такое Gearman :-)

Интересно, что про Gearman я впервые услышал от человека, пришедшего на собеседование в РИА Новости. Мы даже попросили тогда записать это слово на бумажке. Потом мы с Толей Стояновским пробовали использовать его для распараллеливания задач по сборке веб-страницы, но в итоге остановились на том, что будем использовать его «родственника» — другой продукт того же автора, TheSchwartz, который хранит задачи в базе данных, — и не для веба, а для служебной задачи «слива» новостей на серверы партнеров.

В то время Gearman-сервер был полностью написан на перле. Сегодня существует реализация на C, которую, очевидно, и нужно применять, и более того, созданы клиенты на C, Python, Java, C#, PHP и даже MySQL и PostgreSQL.

Заставить стабильно работать приложение с использованием Gearman, несмотря на всю простоту идеи и интерфейса, — может потребовать большого терпения. Тем не менее, это стоит попробовать и использовать. На голландском Perl-воркшопе в начале марта я хочу показать продолжение презентации, в которой расскажу о том, как использовать Gearman для веба.

Распределение задач с помощью Gearman. Январь 2010.


P. S. Очень удобный способ делать презентации: сначала месяц мусолишь в блоге по крохам тему, а потом на утро перед выступлением собираешь все вместе :-)

Страницы

  • img

Об архиве

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

Январь 2010 — предыдущий архив.

Март 2010 — следующий архив.

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