понедельник, 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 уже так не получиться

понедельник, 14 июня 2010 г.

Фотоотчет(63 фото): YAPC-2010 День докладов

63 фотографии с Perl Mova + YAPC-2010 проходившей в Киеве.
ПЕРЕЙТИ В ФОТОАЛЬБОМ>>

ЗЫ: В picasa web-albums тоже можно оставлять комментарии ;)

суббота, 5 июня 2010 г.

Вы не любите котов? Так Вы просто не умеете их готовить.

Многие сейчас переходят с Subversion на Git. Многие считают, что merge в Subversion практически невозможно использовать... и так далее.

Эта статья для тех, кто еще пользуется Subversion, но только планирует перейти на Git.

После прочтения статьи просто взвесьте  все за и против, которые Вы получите при переходе на Git.

Я ни в коей мере не наезжаю на Git, но для меня существует ряд проблем при переходе на новую систему контроля версий:
  1. Перенести весь код с svn-репозитария в git-репозитарий с сохранением всей истории изменений.
  2. Обучить всех сотрудников работе с новой системой контроля версий.
  3. Найти адекватные инструменты для работы с Git под Windows, MacOS, Linux. Например, я использую модуль Subclipse для Eclipse и достойной замены пока не вижу. 
  4. Принять новую схему работы с системой контроля версий. На каждый баг/таск создавать ветку...
  5. Изменить скрипты деплоинга и обновления проекта.
 Все, что требуется от Вас, это оценить стоит ли оно того.

 Готовить Subversion  мы будем в два этапа ( я буду больше рассказывать "как", чем "зачем" ):
  1. Работа со своими ветками
  2. Управление релизами
Сразу замечу, что все что здесь описано, требует Subversion >= 1.6.x :
  1. Умный мердж появился только в subversion 1.5 (До этого, я соглашусь, мерджинг был неадекватный)
  2. Сокращенные пути через "^" появились в subversion 1.6
Допустим у нас есть репозитарий по адресу  http://svn.myrepo.com/
И вся основная разработка ведется в http://svn.myrepo.com/trunk. (Trunk - это ствол (в переводи с англ.))
Все дополнительные ветки будут создаваться в http://svn.myrepo.com/branches/