четверг, 21 октября 2010 г.
Тестирование в Perl: Завершение теста при первой ошибке
Вкратце объясню зачем оно нужно.
В обычном режиме прогоняется все тесты, а затем выводится отчет. И потом приходится искать в логах нужное место для выяснения причин ошибок.
Если вы добавите в начало теста вызов Test::Most::bail_on_fail, то при первой же неудаче тест остановится. Теперь нас интересуют лишь последние сообщения в лог файле ;)
пятница, 24 сентября 2010 г.
Современный 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
Если в это списке есть незнакомые названия, то Вы просто обязаны ввести perldoc Имя::Модуля.
PS: Хотите быть конкурентным на рынке программирования, тогда не отставайте от современного Perl ;).
четверг, 16 сентября 2010 г.
История одного коммита
Код изогнулся, как большой кусок оргстекла, поблескивая константами и переменными... он выдержал, он всегда выдерживал. Хотя такое случалось все чаще и чаще, но никто не обращал на это должного внимания, многим даже нравилось данное зрелище : "Так чудесно переливается в свете мониторов", - думали они. Все было точь-в-точь, как всегда и в этот раз, но что-то пошло не так... Монолитная твердая гладь заволновалась и по ней вдруг побежали волны. Казалось, еще чуть-чуть и все пойдет трещинами, расколется, разлетится на мелкие крупицы, закричат вдруг процедуры и функции и будут хвататься за острый край мироздания, моля о помощи своих друзей, напарников, но те, непонимая чего от них хотят, просто будут пялится и "укать" как слабоумные. Это был очередной Васин комит....
Через момент уже все вернулось на круги своя, только местами код, который должен быть прозрачным, как родниковая вода, помутнел, и если вглядеться, то можно было разобрать нечеткие очертания какого-то существа с большим количеством ног... или не ног. Но, как обычно, никто не обратил на это внимания ... Затем уже все привыкли и к мутностям кода. "Главное, что работает", - звучала всеми любимая фраза то здесь, то там...
среда, 8 сентября 2010 г.
GPL говорит, что я обязан открывать исходники моего сайта?
Вроде как все логично и понятно. Например, если мы скачали исходник Apache и модифицировали его код, то мы можем без проблем продавать модифицированную версию с тем условием, что мы должны предоставить исходники нашей версии сохранив на код лицензию GPL.
Теперь относительно веб-приложений. Допустим мы создали написали фейсбук и использовали для этого модуль CGI.pm. Спрашивается должны ли мыть предоставить исходники пользователям нашим сервиса.
Вроде бы как и не должны поскольку мы не распространяем приложение, но ...
понедельник, 30 августа 2010 г.
CPANPLUS и Gentoo - Автоматически создаем ebuild-ы модулей из 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 выполняем:
Пакет попадает в оверлей "/usr/local/portage". На него должна указывать переменная в файле /etc/make.conf
PORTDIR_OVERLAY="/usr/local/portage"
Теперь можем устанавливать пакет: emerge -av perl-gcpanp/Mojolicious. Возможно перед установкой придется размаскировать пакет.
Вот и все.
среда, 25 августа 2010 г.
Инкремент такой инкремент : инициализируй числовую перменную как строку и потеряй 20% скорости :)
#/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% --
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



