понедельник, 30 августа 2010 г.

CPANPLUS и Gentoo - Автоматически создаем ebuild-ы модулей из CPAN

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

1. Пакетный менеджер тянет по зависимостям уже установленный через cpan модуль.
2. Удаление через модулей через пакетный менеджер также не учитывает зависимости.

3. При обновлении Perl до новой версии невозможно обновить все модули через perl-cleaner.
4. ... и так далее



Решение очевидное - устанавливать все через пакетный менеджер. А если нет нужного пакета(в Gentoo - это еbuild-ы), то создавать самому.
Есть такая тулзень - "g-cpan", предназначенная для этих целей. Но у нее был ряд проблем( криво как-то работала с CPAN-репозитариями ). Возможно в новых версиях все уже исправлено.

Но сегодня мы говорим про другой инструмент, а именно про CPANPLUS. Многие уже наверное давно его оценили и пользуются командой "cpanp" вместо "cpan". 
Я же предлагаю пользоваться еще одной командой входящей в состав CPANPLUS - "cpan2dist"
Выполняем "cpan2dist --help" и смотрем для начала секцию "Examples". Как видим, мы может создавать не только ebuild-ы, но пакете в других форматах, включая deb.
Для установки Mojolicious выполняем:


cpan2dist --format=CPANPLUS::Dist::Gentoo \
--dist-opts overlay=/usr/local/portage \
--dist-opts distdir=/usr/portage/distfiles \
--dist-opts manifest=yes \
--dist-opts header="# Copyright 1999-2010 Gentoo Foundation" \
--dist-opts footer="# End" \
--ignore Data::Dumper
Mojolicious

Мы игнорируем Data::Dumper поскольку для него нет отдельного ebuild-а в системе, а он нужен по завимостям.

Пакет попадает в оверлей "/usr/local/portage". На него должна указывать переменная в файле /etc/make.conf
PORTDIR_OVERLAY="/usr/local/portage"

Теперь можем устанавливать пакет: emerge -av perl-gcpanp/Mojolicious. Возможно перед установкой придется размаскировать пакет.



Вот и все.


среда, 25 августа 2010 г.

Инкремент такой инкремент : инициализируй числовую перменную как строку и потеряй 20% скорости :)


Заголовок конечно провокационный, но бенчмарк показывает, что вариант с числовой инициализацией переменной на 20% быстрее(тестировал на 5.12).


#/usr/bin/perl -w
use v5.10;
use strict;
use warnings;

use Benchmark ':all';

cmpthese(
    -5, {
        integer_init => sub {
            my $i = 0;
            $i++ for ( 1 .. 10000 );

        },

        string_init => sub {
            my $i = '0';
            $i++ for ( 1 .. 10000 );
        },
    } );

#               Rate  string_init integer_init
#string_init  1769/s           --         -18%
#integer_init 2147/s          21%           --
    

Разгадка данной особенности довольно проста. При инициализации Perl сохраняет число, как строку. И результат инкремента сохраняет в строковом виде!!! Именно так :).

perl -MDevel::Peek -e 'my $i = "1"; print Dump $i;  $i++; print Dump $i;'
SV = PV(0x604bc8) at 0x62d318
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x61ec50 "1"\0
  CUR = 1
  LEN = 8

SV = PV(0x604bc8) at 0x62d318
  REFCNT = 1
  FLAGS = (PADMY,POK,pPOK)
  PV = 0x61ec50 "2"\0
  CUR = 1
  LEN = 8


С декрементом такого не будет. В принципе любая числовая операция (даже числовое сравнение, например $i < 100) заставит Perl хранить число как число,  а не как строку.

for (my $i='10'; $i < 20; $i++) {} # это будет работать нормально, поскольку есть числовое сравнение.

понедельник, 23 августа 2010 г.

Улучшаем документирование кода - текстовые диаграммы.

У меня стояла задача написать документацию к программной компоненте.
И я решил поместить описание структуры классов непосредственно прямо в POD документацию.
Для этого мне потребовался инструмент, который мог бы рисовать текстовую графику.

И такой инструмент был найден - Asciio, к тому же он сам написан на Perl.
Просто инсталлируем модуль с CPAN и получаем упрощенный аналог visio для текстовых диаграмм. Запускаем /usr/bin/asciio и наслаждаемся.

Основной интерфейс

Сохраненный текстовый файл


Вот еще один примерчик


четверг, 19 августа 2010 г.

Баян, но все же - песня про Perl. Perl, in a Nutshell ! :)

вторник, 3 августа 2010 г.

Еще один способ наговнокодить.

Пишите всегда отдельно cигил и имя переменной, а лучше вообще вставляйте после сигила перевод строки. Тогда Ваш код станет значительно нечитабельней :)

Например:
my $return = "HA-HA-HA";
print $




return;
print "We are here! )";
Спешите, в Perl 6 уже так не получиться