shoorick: (Рыжий)
Только сейчас обнаружил интересную штуковину: если в убунте выполнять общесистемную установку перловых модулей командой
sudo cpan Имя::Модуля

то модуль встаёт куда надо — в моём случае это /usr/local/share/perl/5.18.2 (а мануалы ложатся в /usr/local/man/man3), но если сначала взять себе рутовую консоль командой
sudo bash

и из такой консоли запускать cpan — модули встанут в ~/perl5/lib/perl5, чего я не ожидал.

P. S. Про sudo apt-get install libимя-модуля-perl я в курсе.
shoorick: (Рыжий)
Про перловый веб-фреймворк Catalyst когда-то говорили, что он за собой тянет чуть ли не половину CPAN :-)

Решил я в дополнение к Каталисту и Моджо писать и на Дансере — так сложилось. На perldancer.org пишут:
Key features:
...
Few dependencies - Dancer depends on as few CPAN modules as possible making it easy to install.

Ставлю Dancer — и где эти самые few depencies? Утром модули ставил, сейчас — ставлю, а они всё не кончаются и не кончаются...

http://shoorick.ru/2015/01/23/dancer-depencies/
shoorick: (Рыжий)
Решил как-то написать робота, чтоб он следил, не появилась ли на OSM очередная порция пригодного к обрисовке спутникового снимка Bing высокого разрешения. Попутно выяснил, что можно легко вычислить номера кусочков снимка (и путь к файлу с картинкой), используемого в OSM — под это, что неудивительно, на CPAN есть модуль Geo::OSM::Tiles. Но на maps.bing.com нумерация другая: адрес тайла фрагмента задаётся не тремя числами, как в OSM (масштаб, смещение по горизонтали и вертикали), а одним длинным числом, где замечательным образом смешано всё. Впрочем, вооружившись отладчиком браузера, вполне можно понять принцип, по которому строится это число. Соответствующего модуля на CPAN я не нашёл — значит, надо реализовать самостоятельно.

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

Цифры )
shoorick: (Default)
Установка модуля Term::ReadLine::Gnu добавляет в перловый отладчик возможность редактировать введённую строку не только клавишей Backspace — становятся доступными и стрéлки, и привычные сочетания клавиш. Доступна и история ввода (листание — стрéлками, поиск — ^R).

Убунтоводы могут установить модуль командой sudo apt-get install libterm-readline-gnu-perl
shoorick: (Рыжий)
  1. Свежая новость: оказалось, что трёхпалая чайка — не моёвка, а мóевка.
  2. Mojowka теперь умеет показывать страницы посетителю на нужном ему языке. Язык может быть указан явно самим посетителем либо (если не указан) может выбираться автоматически, исходя из переданного заголовка Accept-Language. Пока доступны два языка — английский и русский.

    Сделано с использованием Mojolicious::Plugin::Textdomain, о котором я писал в декабре. К сожалению, Анатолий Лапицкий ([livejournal.com profile] nuclon) до сих пор не выложил свой модуль на CPAN.
  3. Увидев в моёвке экземпляр jQuery плюс мою яваскриптовую писанину, GitHub почему-то решил, что проект в целом яваскриптовый, а не перловый. Как переучить его обратно — пока не знаю.

Ого!

Mar. 27th, 2011 11:26 am
shoorick: (Default)
На тринадцатом году перлового программирования я заметил, что в документации на CPAN есть подсветка синтаксиса перлового кода. Или её не было раньше?
shoorick: (Default)
Каталистовое приложение жрёт достаточно много памяти

Конечно, это можно пытаться обойти, перезапуская дочерние процессы сервера после обработки определённого количества запросов, но это как-то не со совсем правильно: уже после пары десятков запросов каждый процесс съедает до 150 метров, а когда процессы жиди подольше и запускались через mod_perl, апачные процессы раздувались ещё сильнее.

С другой стороны, более правильным методом было бы устранение утечек, а не отстрел процессов. Для этого есть куча методов: например, на xpoint.ru лежит список модулей, помогающих обнаружить утечки памяти. Попробовал запустить сервер, используя Devel::LeakTrace::Fast — всё затормозилось: только запуск ждать пришлось минут десять, если не больше, а отрисовка страницы занимала от одной до трёх минут. В результате в STDERR вывалился здоровенный список дырявых мест, причём бóльшая их часть — не в нашем приложении, а во внешних модулях.

Что делать — непонятно. Для начала, думаю, надо посмотреть и разобраться, что же мы сами-то написали.
shoorick: (Default)
Решил, что функции подбора предлогов не место в Lingua::RU::Inflect и вынес её в отдельный модуль Lingua::RU::Preposition. В исходном модуле пока что объявил её DEPRECATED, потом, через пару версий, выкину совсем. Заодно будет повод обновить Lingua::RU::Inflect, разработка которого замерла в середине марта прошлого года.

Оба модуля, помимо CPAN, размещены на гитхабе: https://github.com/shoorick/lingua-ru-inflect и https://github.com/shoorick/lingua-ru-preposition — судя по опыту написания mojowka, social coding — полезная штука, ускоряющая развитие.
shoorick: (Default)
Пытаюсь водрузить каталист на сервер под FreeBSD — там какая-то фигня с деревом портов (хотя порты свежеобновлённые): почему-то одни порты не то, что не ставятся, а даже не загружаются (ни через make, ни через portupgrade) — пишут distinfo is out of date, or ... spelled incorrectly, хотя вручную всё прекрасно скачивается; другие же — и вовсе куда-то пропали и вместо установки перломодуля из портов приходится ставить его командой cpan, что в данном случае не совсем правильно.

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

Думаю, что следующий крупный перловый сайт будет никак не на каталисте — может быть, на Mojolicious — там хотя бы не надо половину CPAN вытягивать.
shoorick: (Default)
Анатолий Лапицкий ([livejournal.com profile] nuclon) написал Mojolicious::Plugin::Textdomain — плагин к Mojolicious для использования в нём геттекста. Я тоже начал писать, но он успел быстрее :-)

Вроде, работает.

На CPAN пока нет, но, надеюсь, скоро появится.

upd/20:48: Слепил пример использования: по запросам /язык/чё-то выдаёт страницы на нужном языке, если язык незнакомый — пытается определить по Accept-Languages, какой язык подходит посетителю и, если есть подходящий, выдаёт страницу на подходящем языке, а если нет подходящего — на английском.
shoorick: (Default)
Снова задумался о применении геттекста в Mojolicious — существующий метод, когда вместо написания отдельных геттекстовых po--файлов прямо в перловый код засовывается что-то такое:
our %Lexicon = ( 
    'Add'    => 'Добавить',
    'Remove' => 'Удалить'
);
никоим образом не может считаться достойным. Порывшись по CPAN, добрёл по ссылкам до Locale::Maketext::TPJ13, где авторы ругают геттекст, приводя корявые якобы геттекстовые примеры обслуживания множественных чисел, надеясь оправдать этим существование собственного других модулей, которые не лучше.

Написал на annocpan коммент, хотя сомневаюсь, что авторы получит его и пойдёт читать мануал по Locale::TextDomain. Похоже, процитированная в Locale::Maketext::TPJ13 статья вышла очень давно (first appeared in The Perl Journal #13 and is copyright 1999) и авторы о ней забыли.
shoorick: (Default)
Lingua::RU::Inflect 0.02:
  • Документация на cpan.org показывается в правильной кодировке. Правда, всё равно pod2html ругается, что не знает слова =encoding, а в man-страницах кириллица пропадает вовсе.
  • Добавлена документация на русском языке.
  • Добавлена функция choose_prepositions_by_next_word для выбора предлога с беглой гласной по следующему за ним словом, а также куча коротких имён для вызова этой функции с разными предлогами: izo, ob, so и т. п.
  • Добавлены новые тесты. Выявленные при добавлении баги пофиксены.
shoorick: (Default)
Продолжаю баловаться двумя языками — перлом и русским:
#!/usr/bin/perl -wl -CS

use strict;
use utf8;

$,=' ';

sub choose_preposition_about_by_next_word {
    return
        /^[аиоуыэ]/i
        ? 'об'
        : 'о';
}

sub choose_preposition_with_by_next_word {
    return
        /^с[^аеёиоуыэюя]/i
        ? 'со'
        : 'с';
}

map {
    print choose_preposition_about_by_next_word, $_;
} qw(
    арбузе баране Елене ёлке игле йоде огне паре ухе юге яблоке
);

map {
    print choose_preposition_with_by_next_word, $_;
} qw(
    огнём садом светом слоном спичками ссылкой
    Стёпой стаканом сухарём сэром топором
);
Наверное, добавлю эти функции в Lingua::RU::Inflect — и можно будет сегодня-завтра выложить версию 0.02.
shoorick: (Default)
Иногда и просто более внимательное изучение окружающей действительности способно снизить число бессмысленных телодвижений. Вот, скажем, Дмитрий Котеров пишет в своей набле 37 о подготовке модуля к публикации на CPAN, но зачем-то описывает там совершенно ненужный процесс упаковки дистрибутива. Зачем? Есть make dist — он берёт нужные файлы и пакует их в правильно названный архив.
shoorick: (Default)
Пытаюсь воткнуть свежезарелизенное в один из наших проектов. С одной стороны, конечно, надо придерживаться правила «Не сломалось — не чини», но, с другой, если модуль выложен на CPAN и, следовательно, уже не сильно связан с исходным проектом — нет смысла держать дубль. Пока натыкаюсь на ошибки:
Malformed UTF-8 character (unexpected continuation byte 0x80, with no preceding start byte) in pattern match (m//) at /usr/local/lib/perl5/site_perl/5.8.9/Lingua/RU/Inflect.pm line 254.
[error] Caught exception in engine "Wide character in memGzip at /usr/local/lib/perl5/site_perl/5.8.9/Catalyst/Plugin/Compress/Gzip.pm line 36"
Попробовал добавить в проблемный участок вызовы функций encode и decode:
my @name = Lingua::RU::Inflect::inflect_given_name(
    GENITIVE,
    decode('utf8', $student->user_id->lname),
    decode('utf8', $student->user_id->fname),
    decode('utf8', $student->user_id->sname),
);

push @name, shift @name; # ФИО → ИОФ
$c->stash->{'student_genitive'} = encode('utf8', join(' ', @name));
Вроде, заработало, но выглядит паршиво.

Надо бы perlunicode перечитать...
shoorick: (Default)
На перлбурге обслуждали мы с Анатолием [livejournal.com profile] sharifulinым его блиц-доклад про CPAN.
— А что хочешь выложить?
— Да есть у меня модуль для склонения русских имён.
— Так он, поди, у всех есть! :-) Каждый его пишет.
— Пишет, может, и каждый, да не каждый выкладывает.

Мне известен лишь один модуль, который склоняет имена — Lingua::RU::Sklon, но он мне не нравится:

  1. Кодировка модуля — вражеская CP1251 вместо правильной UTF-8.
  2. Идентификаторы образованы от сокр. рус. слов. VIN вместо ACCUSATIVE — неудобно.
  3. За три года модуль так и не ушёл дальше версии 0.01
Поэтому я выложил свой модуль. Теперь в скриптах можно написать так:
#!/usr/bin/perl -wl -CO

use utf8;
use Lingua::RU::Inflect ':all';

my @name = qw/Чайковский Пётр Ильич/;
my @inflected;
$, = ' ';

for ( NOMINATIVE .. PREPOSITIONAL ) {
    @inflected = inflect_given_name( $_, @name );
    push @inflected, shift @inflected;
    print @inflected;
}
Результат:
$ ./test-tchaikovsky.pl
Пётр Ильич Чайковский
Петра Ильича Чайковского
Петру Ильичу Чайковскому
Петра Ильича Чайковского
Петром Ильичом Чайковским
Петре Ильиче Чайковском
Работоспособность протестирована пока что в Mandriva Linux 2010.0, FreeBSD 6.2 и 7.2.

Ближайшие планы:

  1. Разобраться с кириллицей в документации (CPAN считает, что она написана в ISO8859-1, а не в UTF-8);
  2. Написать README, а не оставлять то, что сгенерировано автоматически;
  3. Сделать порт для FreeBSD.
  4. Найти (или организовать) список рассылки / IRC-канал / Jabber-конференцию / форум / вписать желаемое для обсуждения багов;
  5. Ускорить домашнюю связку trac+svn (где сейчас и живёт Lingua::RU::Inflect) либо перенести проект на какой-либо внешний более шустрый хостинг.
Дальние:
  1. Научить модуль склонять любые существительные и прилагательные — в конце концов, имена и фамилии склоняются аналогично: уже сейчас inflect_given_name( DATIVE, qw/Синий чайник/ ) возвращает qw/Синему чайнику/.
  2. Сделать блиц-доклад? :-)
P. S. Да, я знаю, что слово «склонение» переводится как «declension».

shoorick: (Default)
Посмотрев запись доклада Анатолия [livejournal.com profile] sharifulinа про CPAN, решил всё-таки зарегистрироваться там как автор: в конце концов, за 12 лет перлописательства наверное, должно хоть что-то накопиться, что можно выложить.

Зашёл на PAUSE, отправил запрос, получил подтверждение, что заявка принята. Жду создания пользователя... У них написано:
You will be notified by email about your registration. Please allow three weeks for proceeding, which should be the maximum during vacation time. Normally we hope to register you within a week.
С момента подачи заявки прошла уже не одна неделя, и даже не три — уже почти четыре. Думал, может быть, письмо потерялось и можно запросить новый пароль — нифига, юзер SHOORICK до сих пор не существует.

И чё? Дальше ждать?
shoorick: (Default)
Вчера сгоряча чуть было не написал программулину по рисованию дерева со структурой XML-файла. Даже, взяв напильник, слегка обточил какой-то старый скрипт разбора XML так, что он стал выдавать вместо текста вида
root
:  + first
:  :  + one
:  + second
+ three
исходный текст для GraphViz, из которого уже можно получать картинки.

Сегодня, погуглив на свежую голову, нашёл, что на CPAN, конечно же, есть нужный модуль. Теперь нарисовать дерево можно совсем просто:
#!/usr/bin/perl -w

use GraphViz::XML;
use File::Slurp;

my $data = read_file shift @ARGV;
my $graph = GraphViz::XML->new($data);
print $graph->as_png;
Получается такая картинка:
Структура XML-файла
Если нужен другой формат готовой картинки, то помимо PNG, модулем поддерживаются и другие форматы, как растровые (GIF, JPEG), так и векторные (PostScript, SVG) — для этого предназначены методы с вполне предсказуемыми именами as_gif, as_jpeg, as_ps, as_svg и т. п. А если не устраивает внешний вид графа, можно получить исходный dot-файл — для этого существуют методы as_canon и as_text: второй, в отличие от первого, выдаёт ещё и координаты вершин.

Можно ещё попробовать указать нужные свойства графа прямо в скрипте. Но это уже совсем другая история.
shoorick: (Default)
Захотелось странного — обновить каталист с 5.7 до 5.8: в новом обещали всякий much easer да much faster. Ну и обновил. А до кучи — и остальные перловые модули, что были в портах. В результате и зайцев не спас, и перед партизанами неудобно выяснилось (чё, спрашивается, сразу не посмотрел?), что в портах каталист старый — 5.71001 и после обновления всё загнулось: и свежие, ещё не закоммиченные версии разрабатываемого сайта, и более старые.

Причина крылась в том, что некоторые модули поменялись, а некоторые — вообще стали deprecated, например, Catalyst::Model::DBIC и http://search.cpan.org/perldoc?Catalyst::Plugin::Authentication::Store::DBIC. И в DBIx::Class что-то поломалось.

Решилось пляской с бубном перегенерацией модулей, описывающих структуру базы данных, командой
script/app_create.pl model Dbase DBIC::Schema Dbase create=static dbi:mysql:БД[:хост] логин пароль
При этом модули создались не там, где раньше, а на один уровень глубже — в каталоге Result.

Пробовал задавать create=dynamic, чтобы поменьше получалось — не выходит: сервер не запускается. Пришлось пока остановиться на этом методе. Почитал мануалы, попробовал погуглить — без особого успеха. Домой пришёл лишь в 22:45.

P. S. Видя такой бардак, решил до кучи и перл проапгрейдить до 5.8.9 — проапгрейдил, но наткнулся на очередные грабли: в портах почему-то нет Catalyst::Plugin::RequireSSL — пришлось ставить через perl -MCPAN -e shell.
shoorick: (Default)

Послушав мнение коллег, решил что для преобразований XML → (X)HTML лучше всего подойдёт XSLT. Но чем преобразовывать? Первый попавшийся учебник рассказывал об интерфейсах на разных языках, но перла среди них на было.

Однако, перловый программер про CPAN вспоминает быстро. Недолго думая, нашёл XML::XSLT, в мане на который есть пример, подлежащий весьма небольшой обработке напильником надфилем до работоспособного состояния:

#!/usr/bin/perl -w

use strict;
use XML::XSLT;

die qq{XML Transformer\nUsage:\n\t$0 xml-file xslt-file\n}
    if ($#ARGV < 1);

my $xslt = XML::XSLT->new($ARGV[1], warnings => 1);

$xslt->transform($ARGV[0]);
print $xslt->toString;

$xslt->dispose();
Ковыряюсь дальше...

upd/18:15: ковыряние показало непрограммерский путь:

$ xsltproc xslt-file xml-file

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Aug. 20th, 2025 07:52 am
Powered by Dreamwidth Studios