Архив Май 2010

Каждый год в Европе проводится перл-конференция YAPC::Europe. Место очередной конференции выбирает специальный комитет: он принимает заявки от всех желающих и объявляет о месте проведения конференции в следующем году в начале очередной.

В июне я подаю заявку на проведение конференции YAPC::Europe в 2011 году в Риге.

О других претендентах станет известно в начале июля. А результат будет оглашен 3 августа в Пизе.

Йоу!

Рига

На сайте perl6.ru опубликован русский перевод интервью с Дамианом Конвеем, которое на днях появилось на сайте O’Reilly GMT.

Первая часть, в основном, посвящена Perl 6, но все, что написано дальше, я рекомендую прочитать всем, кто пишет и не пишет на перле. Вот выдержка, которая мне особенно понравилась:

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

Разумеется, весь код на питоне внешне должен выглядеть одинаково, но это лишь смещает внутреннюю сложность кода в какое-то другое измерение. Обычно это проявляется где-то в другом месте, в непоследовательном именовании переменных или методов, или в использовании трудных для понимания структур данных, или в странных API библиотек, или в пересечении функционального или процедурного стилей в том, как питон понимает объектное ориентирование.

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

perl6.ru/interviews/damian-conway-on-perl-and-its-future

Продолжается регистрация на конференцию Perl Mova + YAPC::Russia, которая состоится в Киеве 12—14 июня.

На сегодня список докладов выглядит так:

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

Самое время зарегистрироваться и подать заявку на блиц-доклад и присоединиться к теплоходной прогулке по Днепру!

В операторе when — будь он внутри «родного» блока given или внутри цикла for — обычно происходит смартматчинг переменной $_ с указанным выражением. В документации perlsyn перечислены искючения, однако есть и не слишком очевидное поведение, о котором нужно знать.

Вначале о том, что явно указано как исключения. Блок when(EXPR) не выполняет смартматчинг $_ ~~ EXPR, а является просто булевым выражением, если EXPR — одно из следущего:

  • Вызов функции или метода.
  • Регулярное выражение (тут надо помнить, что операторы =~ и ~~ ведут себя по-разному).
  • Сравнение (как с переменной по умолчанию, так и с любой друой) или явный смартматчинг.
  • Отрицание (!, not или xor).
  • Файловый тест.
  • Операторы .. и ....

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

when(0b1110_0000 == ($_ & 0b1111_0000))

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

when($_ & 0b1111_0000)

сравнивает переменную $_ со значением, полученным после битовой операции $_ & 0b1111_0000, и для проверки установленных битов нужно выполнять явное сравнение, которое входит в один из пунктов перечисленных выше исключений.

На днях прочитал 42 статьи о том, как пользоваться юникодом в современном C++ и заодно придумал еще один практический пример, где может быть полезна state-переменная, появившаяся в Perl 5.10, — при разборе последовательности байтов UTF-8.

Вот простая функция parse_utf8, которая принимает очередной байт и формирует в переданном по ссылке массиве @$buf последовательность кодов символов. Важно, что функция при каждом вызове принимает байт, но выходной буфер изменяется только после того, как принята вся последовательность, соответствующая юникодному символу, то есть на каждый второй, третий или четвертый раз, если очередной символ требует для записи в UTF-8 несколько байтов.

В этом примере суть довольно точно описывается словом state: переменные хранят состояние разбора между вызовами функции.

use v5.12;

(5.12 удобно использовать потому, что инструкция use v5.12 автоматически подключает и use strict. Но все должно работать и с 5.10.)

sub parse_utf8 {
    my ($byte, $buf) = @_;
   
    state $bytes = 0;
    state $value = 0;
    my $mask = 0;
   
    given($byte) {
        when(!($_ & 0x80)) {
            ($bytes, $value, $mask) = (0, $byte, 0);
        }
        when(0b1111_0000 == ($_ & 0b1111_1000)) {
            ($bytes, $value, $mask) = (3, 0, 0b0000_0111);
        }
        when(0b1110_0000 == ($_ & 0b1111_0000)) {
            ($bytes, $value, $mask) = (2, 0, 0b0000_1111);
        }
        when(0b1100_0000 == ($_ & 0b1110_0000)) {
            ($bytes, $value, $mask) = (1, 0, 0b0001_1111);
        }
        when(0b1000_0000 == ($_ & 0b1100_0000)) {            
            $bytes--;
            $mask = 0b0011_1111;           
        }
        default {
            $mask = 0;
            $value = ord('?');         
        }
    }
   
    $value += ($byte & $mask) << ($bytes * 6) if $mask;
   
    push @$buf, $value unless $bytes;
}

Когда обнаруживается начало многобайтовой последовательности, в state-переменной сохраняется число оставшихся байтов, а в $value начинает накапливаться результат. Каждый последующий байт (старшие биты которого — единица и нуль) на единицу уменьшает значение $bytes.

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

Здесь есть даже примитивная обработка ошибок (хотя она находит ошибку лишь в первом байте многобайтовой последовательности).

Теперь проверяем:

my @buf;
parse_utf8($_, \@buf) for (
    0x34, # 4
    0x32, # 2
    0xd1, 0x9e, # ў
    0xc2, 0xa2, # ¢
    0xe3, 0x89, 0xbf, # ㉿
    0xe2, 0x82, 0xac, # €
    0xf0, 0xa4, 0xad, 0xa2, # 𤭢
);
say "&#$_;" for @buf;

Вызов say печатает HTML-сущности опознанных символов (да, строка "&#$_;" может вызвать улыбку):

&#52;
&#50;
&#1118;
&#162;
&#12927;
&#8364;
&#150370;
Именно такой результат и ожидался: 4 2 ў ¢ ㉿ € 𤭢.

В следующий раз обратим внимание на бинарные операции внутри when.

Lingua::Identify

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

На спане есть модуль Lingua::Identify, который предназначен для определения языка, на котором написан текст.

Я опробовал его с данными из базы сайта sayperl.org, сравнивая результат с тем, что определил переводчик Гугла.

use v5.12;

use SayPerl::Datasource;
use Lingua::Identify qw(:language_identification);

my ($total, $equal);
for (@{dbh->selectall_arrayref("
    select title, description, language
    from item where language
    in ('bg', 'da', 'de', 'en', 'es', 'fi', 'fr',
    'hr', 'hu', 'id', 'it', 'la', 'nl', 'pl', 'pt',
    'ro', 'ru', 'sl', 'sq', 'sv', 'tr')")}) {
    $total++;
   
    my $text = "$$_[0] $$_[1]";
    $text =~ s{<.*?>}{ }gs;
    my $detected = langof($text);
    my $googled = $$_[2];
   
    if ($detected ne $googled) {
        say "$detected $googled $$_[0]";
        $equal++;
    }
}
say "$equal/$total";

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

Результат — из 5063 записей язык не совпал в 1590 случаях. Прям увы. Русские записи не определились в подавляющем большинстве случаев: 1401 из 1492 (может надо было где-то включить юникод?).

В тестах к модулю лежат всего четыре файла с текстами: de, en, pt и pt_big. В немецком — ни одного умляута, а португальские — в однобайтовой Latin-1. Перекодировка Encode::from_to из UTF-8 в CP1251 вдвое уменьшила число ошибок в русских текстах, но это уже шаманство.

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

Perl Survey

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

Здравствуйте! Вас приветствует Perl Survey. Пожалуйста, дослушайте это сообщение и не вешайте трубку, это не отнимет у вас много времени.

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

Адрес опроса: survey.perlfoundation.org.

Частичные результаты планируется получить и обнародвать в начале июня на немецком Perl-воркшопе в Шорндорфе.

В качестве бонуса — интервью с Карлом Мэсаком про Perl 6.

Сегодня на DevConf::Perl рассказал про то, как авторы модулей CPAN используют новые возможности, доступные в Perl 5.10, и о том, что нового появилось в 5.12. Кстати, как раз сегодня появился релиз Perl 5.12.1.

Идея собрать примеры использования со спана появилась спонтанно перед поездкой на Perlburg в начале этого года (хотя вначале я хотел всего лишь обновить свои прошлогодние «Фичи Perl 5.10 на практике», показав новые примеры своего кода).

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

Наконец можно объявить подробности того, как будут распределены дни на совместном мероприятии в Киеве:

На третий день — в России он выходной — запланирована теплоходная прогулка по Днепру. Начало в 10 утра, возврат к Речному вокзалу в 18 часов (можно успеть на ночной поезд до Москвы).

Регистрируйтесь, приглашайте другей, берите с собой знакомых!

Про Moose

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

Из ментальных записок системного администратора.

Так, а что это записи в Твиттере давно не обновлялись? Ага, в кроне скрипт не закомментирован. Запускаю вручную.

Хопа! Обновился до 5.12, а Class::MOP не поставил. (Кстати, всегда считал, что P — это programming, а недавно узнал, что это protocol.)

# cpan Class::MOP

...won't install without force.

Хоп, это модный модерновый модуль-то не ставится на автомате? А, там Devel::GlobalDestruction не прошел тесты и все разрушил. Ну так и название — Глобальное Разрушение.

# cpan
cpan> look Devel::GlobalDestruction
# perl Makefile.PL

Поставили. Встал и Class::MOP. Запускаю. Хоп!

...get_meta_method_name not found.

Чо? Я должен пройти курс мета-программирования? Да мне надо всего лишь фигачить посты в Твиттер, там и буков-то не хватит для таких названий гета-мета-хуета-эйяфьятлайокудль. Кстати, Твиттер был бы другим, если бы его придумали исландцы.

Ну ладно, обновлю и Лосика.

# cpan Moose

О, сам установился. Ну все, победа, первомай.

Опа, а надо было же запустить скрипт из крона (за всем этим модернизмом и забыл).

Can't locate Variable/Magic.pm in @INС

Ну ё, опять просят магию. Что там, поставим.

Тут где-то была хорошая цитата про Муз в рассылке.

use Perl^WMoose^WMozg or die;

Музмаздай, что ли.

Страницы

  • img

Об архиве

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

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

Июнь 2010 — следующий архив.

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