четверг, 21 октября 2010 г.

Тестирование в Perl: Завершение теста при первой ошибке

Для меня стала открытием вот эта функция - Test::Most::bail_on_fail :)

Вкратце объясню зачем оно нужно.
В обычном режиме прогоняется все тесты, а затем выводится отчет. И потом приходится искать в логах нужное место для выяснения причин ошибок.

Если вы добавите в начало теста вызов Test::Most::bail_on_fail, то при первой же неудаче тест остановится. Теперь нас интересуют лишь последние сообщения в лог файле ;)

пятница, 24 сентября 2010 г.

Современный Perl и современный Perl-программист.

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

За последние 10 лет произошло колоссальное развитие Perl . Это развитие похоже на то, как развивается Java. Сам язык программирование Java - практически не меняется, но развивается инфраструктура. Сегодня знание Java - это знание фреймворков, а не знание синтаксиса языка.

Аналогичная ситуация происходит с Perl. Я не спорю, что 5.6 и 5.12 существенно отличаются, но эти отличия скорее эволюционные, которые не меняют подхода к написанию программ. Инфраструктурное развитие языка - это и есть основная составляющая того колоссального развития Perl. Инфраструктура - это фреймворки, а фреймворки - это каркас архитектуры приложения, который задает подход. Таким образом развитие фреймворков меняет подходы к написанию приложений.

Знание CPAN - это сегодняшнее требование к профессиональному Perl-программисту. Знание CPAN - это не умения устанавливать модули, это умение применить подходящий инструмент для решения задачи.

Вот небольшой список инструментов современного Perl-программиста:

  • Moose || Mouse
  • Catalyst || Mojolicious || Dancer || Jifty || CGI::Application
  • DBIx::Class || Rose::DB::Object || ORLite
  • AnyEvent || POE || IO::Lambda
  • HTML::Template || Template::Toolkit || HTML::CTPP2
  • DateTime && Devel::NYTProf && TryCatch
Если в этом списке для Вас есть незнакомые названия, советую исправить эту проблему. После этого Вы будете вооружены и в случае чего будете знать каким инструментом можно решить проблему.

Желательно, как минимум, знать про существование таких вещей. А про возможности модулей, которые идут в поставке с Perl вы просто обязаны знать!

Вы должны знать про новые стандартные модули/прагмы (очень приятные и душевные модули ;)) :
  • Params::Check
  • Term::UI
  • Object::Accessor
  • Time::Piece
  • Time::Seconds
  • File::Fetch
  • parent
  • autodie
И не забывать про те, которые уже давно поставляются вместе с Perl: strict, warnings, lib, constant, Carp, Data::Dumper, Storable, Exporter, Encode, FindBin, Hash::Util, Scalar::Util, List::Util, File::Path,File::Copy, File::Basename, Memoize, Locale::Maketext, Sys::Hostname, Time::HiRes, CGI::Fast. Это те, которые часто приходится использовать мне (кроме Locale::Maketext, но я не мог его пропустить), а весь список "perldoc perlmodlib".
Если в это списке есть незнакомые названия, то Вы просто обязаны ввести perldoc Имя::Модуля.

PS: Хотите быть конкурентным на рынке программирования, тогда не отставайте от современного Perl ;).

четверг, 16 сентября 2010 г.

История одного коммита

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

Код изогнулся, как большой кусок оргстекла, поблескивая константами и переменными... он выдержал, он всегда выдерживал. Хотя такое случалось все чаще и чаще, но никто не обращал на это должного внимания, многим даже нравилось данное зрелище : "Так чудесно переливается в свете мониторов", - думали они. Все было точь-в-точь, как всегда и в этот раз, но что-то пошло не так... Монолитная твердая гладь заволновалась и по ней вдруг побежали волны. Казалось, еще чуть-чуть и все пойдет трещинами, расколется, разлетится на мелкие крупицы, закричат вдруг процедуры и функции и будут хвататься за острый край мироздания, моля о помощи своих друзей, напарников, но те, непонимая чего от них хотят, просто будут пялится и "укать" как слабоумные. Это был очередной Васин комит....


Через момент уже все вернулось на круги своя, только местами код, который должен быть прозрачным, как родниковая вода, помутнел, и если вглядеться, то можно было разобрать нечеткие очертания какого-то существа с большим количеством ног... или не ног. Но, как обычно, никто не обратил на это внимания ... Затем уже все привыкли и к мутностям кода. "Главное, что работает", - звучала всеми любимая фраза то здесь, то там...

среда, 8 сентября 2010 г.

GPL говорит, что я обязан открывать исходники моего сайта?

Лицензия GPL позволяет нам использовать и модифицировать код в своих целях. Мы имеем право модифицировать код и не делиться им ни с кем если мы не распространяем( не имеет значение платно или бесплатно) програмных продукт на основе этого кода.

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

Теперь относительно веб-приложений. Допустим мы создали написали фейсбук и использовали для этого модуль CGI.pm. Спрашивается должны ли мыть предоставить исходники пользователям нашим сервиса.
Вроде бы как и не должны поскольку мы не распространяем приложение, но ...

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

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

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


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