Пятница, 27-е января

ZAG.RU: Техническое задание в формате Perl 6 Pod

Ранее я уже рассказывал о полезных свойствах такого документа как техническое задание [1]. В этот раз я расскажу о том, как я пишу подобные документы.

Я пробовал когда-то создавать проектную документацию по ГОСТу [2], но данный подход оказался «несовместим» с реальной жизнью. В итоге я пришел к менее формальному решению и использую последние годы следующую структуру этого документа:

 Заголовок: Техническое задание на разработку
 Изменения
 Основные положения
 Release Notes
 Терминология и Соглашения
 Что необходимо сделать
 Идеи и дополнения

где,

Изменения

Список значимых изменений в документе. Каждая запись начинается с даты и версии документа. Изменения отсортированы в порядке устаревания.

    =CHANGES
    Jan 22th 2012(v0.3)[zag]   Изменения в алгоритме работы crawler (+ определение качества фильма). 
    Jan  6th 2012(v0.2)[zag]   Основные функциональные блоки.
    Dec 24th 2011(v0.1)[zag]   Начальная версия
Основные положения

Здесь описывается идея и общий результат. Данный раздел начинается с фразы: «Требуется разработать ...».

  =head1 Основные положения
   Требуется разработать систему размежения рекламных обявлений 
   на виджетах со следующими возможностями:
  =item Создание и редактирование рекламных компаний
  =item Отображение рекламы на виджетах
  =item Сбор статистической информации (показы, переходы)

Описание целей сопровождаются снимками прототипов (или набросками от руки).

Release Notes

Список задач, которые станут частью выпускаемых версий. Задачи формулируются в виде строк, которые будут затем перенесены в Release Notes к каждой версии.

Например:

 =head1 Release Notes
 * Отображение рекламы на виджетах 
 * Рабочее место менеджера рекламных компаний ( управление рекламными компаниями 
   и просмотр статистики)
 * Регистрация отображения рекламных сообщений и переходов по ссылкам
Терминология и соглашения

Здесь полезно дать определение базовым терминам.

Если в ТЗ вводится новая терминология, то в таких случаях желательно разместить более подробную информацию, например копии экранов, возможно указать часть бизнес логики, где та или иная сущность используется.

 =head1 Терминология и соглашения
 Термины, котороые появляются в контексте «Системы рекламных сообщений»:
 =defn Медиаплан
 реклмное объявление, которое ...
 =defn Карточка медиаплана
 форма отображения свойств медиаплана, содержащая ...
Что необходимо сделать ?

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

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

 =head1 Что необходимо сделать ?
 =head2 Общая структура
 Рассмотрим общую структуру, на которой выделим составные части и связи между ними:
     РИСУНОК ОБЩЕЙ СТРУКТУРЫ
 , где (1) - web интерфейс (рабочее место менеджера рекламных компаний)
 =head3 Рабочее место менеджера рекламных компаний
Идеи и дополнения

Во время обсуждений в данном разделе собираются в основном идеи, высказанные вне совместных встреч участников проекта.

Обычное содержимое этого раздела следующее:

  =head1 Идеи и дополнения
  ___________________________________________________
  ___________________________________________________
  ___________________________________________________
  ___________________________________________________
  ___________________________________________________

За основу такой структуры ТЗ, я взял документ из какого-то зарубежного блога, посвященного тематике разработки Web проектов. Возможно подойдет определение «функциональная спецификация», но как бы то ни было, наличие этого документа облегчает жизнь всем.

NOTES

1. Как POD помог мне. http://zag.ru/a4C81

2. Техническое задание согласно ГОСТу. http://it-gost.ru/content/view/101/51/

Четверг, 26-е января

Сообщество ru_perl в LiveJournal: ru_perl @ 2012-01-26T13:03:00

https://github.com/jamhed/Dancer-OO

Как известно, Dancer не поддерживает наследование. Тем не менее это легко сделать.
Для этого используются два вспомогательных класса Dancer::OO::Object, от которого
должны все наследоваться, и Dancer::OO::Dancer, который переопределяет Dancer DSL.

Идея в том, что объявления обработчиков маршрутов типа get, post и другие, откладываются -- записываются в переменную _handler соответствующего пакета, а функции объявляются через
wrap, который передает в анонимную функцию некоторые полезные переменные -- ($self, $context, $params), где $self -- имя класса, $context -- Dancer::session, params -- Dancer::params.

Perl на hashcode.ru: Perl и настройка скриптов cgi

Рыскал в интернете, как настроить скрипт cgi. Нашел только то, что нужно изменять CHMOD. Но где и как, найти не удалось... вот я учусь в школе, где есть терминальный класс с компами. У нас есть страница на сайте школы, где мы можем тестировать свои скрипты. Эта операция с настройками делается на сервере? Это первый вопрос. И если нет, то как это сделать в терминальном классе?

Меркантильный гуру: .

Что показывает time:

real 0m0.029s user 0m0.024s sys 0m0.000s

http://shootnix.com/perl-oop

Простите, seriously?

Среда, 25-е января

shootnix's posterous: Скорость компиляции Perl + OOP (Несколько методов). Тупые тесты

Никто не делал, наверное, полноценное тестирование производительности всех или почти всех методов и подходов, реализующих объекты в перле. Никто не делал, и я не буду. 

Вместо этого я понаделал тупые тесты при помощи команды time perl myscript.pl. Просто для того, чтобы кое-что прояснить для себя.

1. Чистый перл, атрибуты в массиве 

Массивы в перле быстрые. Пробуем такой код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package ArrayClass;

use v5.10;
use strict;
use warnings;

use Data::Dumper;

sub new {
    my ($class, @self) = @_;
    
    return bless \@self, $class;
}

sub name {
    my ($self, $name) = @_;
    
    if ($name) {
        $self->[0] = $name;
    }
    
    return $self->[0];
}

sub age {
    my ($self, $age) = @_;
    
    if ($age) {
        $self->[1] = $age;
    }
    
    return $self->[1];
}

1;

Для проверки код почти всегда один и тот же:

1
2
3
4
5
6
7
8
9
10
my $person = ArrayClass->new('Bill', 21);

say $person->name;
say $person->age;

$person->name('Bob');
$person->age(23);

say $person->name;
say $person->age;

Что показывает time:

real  0m0.029s
user      0m0.024s
sys       0m0.000s

2. Чистый перл, атрибуты в хеше

Хеши в перле медленные, медленнее, чем массивы, поэтому, возможно, если делать акцессоры на хеше, то будет медленнее. Пробуем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package HashClass;

use strict;
use warnings;

use v5.10;

sub new {
    my ($class, %self) = @_;
    
    return bless \%self, $class;
}

sub name {
    my ($self, $name) = @_;
    
    if ($name) {
        $self->{name} = $name;
    }
    
    return $self->{name};
}

sub age {
    my ($self, $age) = @_;
    
    if ($age) {
        $self->{age} = $age;
    }
    
    return $self->{age};
}

1;

Время выполнения:

real       0m0.033s
user      0m0.020s
sys       0m0.008s

В общем, по ощущениям, разницы нет, хотя, судя по замерам, таки массивы быстрее. Вероятнее всего, разница может существенно проявиться при более сложной архитектуре классов, но это еще предстоит протестировать.

3. Используем Mojo::Base

Mojo::Base — удивительно легковесная штука с очень простым, незамутненным синтаксисом, реализующая базовые возможности объектов. Давно хотел протестить, насколько велика цена синтаксического сахара Mojo::Base:

1
2
3
4
5
6
7
8
9
package MojoClass;
    
use Mojo::Base -base;
use Data::Dumper;

has 'name';
has 'age';

1;

Код сократился, а время выполнения? Смотрим:

real       0m0.032s
user      0m0.024s
sys       0m0.000s

Вообще, в среднем, такой код получается сравним по скорости с предыдущим, или, если все же придираться, то чууууть-чуть медленнее. Но есть Mojo::Base::XS, который, возможно, решит такую проблему. Неожиданно приятно.

4. Используем Class::Struct

Class::Struct очень старый, но, тем не менее, очень известный модуль, к которому приложились довольно известные, именитые перл-программисты. Поэтому его было тоже интересно.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package StructClass;

use v5.10;
use strict;
use warnings;

use Data::Dumper;
use Class::Struct;

struct(
    name => '$',
    age => '$',
);

1;

В итоге:

real       0m0.050s
user      0m0.012s
sys       0m0.016s

В целом медленнее, причем заметно. 

5. Используем Moose

Moose в моем списке играет роль пугала, не более того. Всерьез я его рассматривать бы не стал: ни по синтаксису, ни по производительности он мне лично не подходит.

1
2
3
4
5
6
7
8
9
10
11
package MooseClass;

use Data::Dumper;
use Moose;

has 'name' => ( is => 'rw', isa => 'Str' );
has 'age' => ( is => 'rw', isa => 'Int' );

__PACKAGE__->meta->make_immutable;

1;

Шок:

real       0m0.419s
user      0m0.320s
sys       0m0.032s

В заключение еще раз повторю, что тесты тупые, о производительности тех или иных решений можно судить относительно. Mojo::Base интересен и, на мой взгляд, нуждается в более взрослых сравнительных тестах. Но это в будущем. 

Permalink | Leave a comment  »

Хабрахабр: Метки / perl: Perl / [Перевод] Благотворительный Фонд craigslist пожертвовал $100,000 языку программирования Perl

От меня: во-первых, я не знал, что craigslist работает на Perl (чем я увлечен на данный момент). Во-вторых, такое большое и важное пожертвование во благо всему и всех мотивировало меня «отдать должное» craigslist, распространив эту новость. Надеюсь, Вам всем будет интересно. P.S. Я не обладаю должным опытом переводчика. Я разработчик. Поэтому прошу быть чуть полегче с критикой перевода.

Фонд Perl с гордостью сообщает, что Благотворительный Фонд craigslist оказал поддержку Perl сообщества, сделав пожертвование в размере 100,000 долларов на поддержку Perl5, которые могут быть также использованы в общих целях Фонда Perl.

По словам генерального директора craigslist и бывшего Perl хакера Джима Бакмастера: «craigslist получил большую популярность, в то время как большинство его программного обеспечения разрабатываются на Perl уже более чем десять лет. Благотворительный Фонд craigslist с гордостью признает волшебство и щедрость всего сообщества Perl, и посему готов гарантировать дальнейшую поддержку Perl5, внеся вклад в будущее развитие Perl». Он также добавил: «Поначалу не было ясно, как и что можно лучше всего дать взамен Perl. К счастью, было несколько способов, как можно это сделать.»

Карен Поули, Президент Фонда Perl заявила: «Я чрезмерно благодарна Благотворительному Фонду craigslist за их невероятно щедрое пожертвование. Какой же фантастический способ для Perl Foundation начать 2012 год!»

Perl на hashcode.ru: Perl скрипт и загрузка страницы

Я хотел бы спросить как?как можно написать код веб странички на html чтобы одновременно с загрузкой страницы запускался скрипт?

Вторник, 24-е января

kiev.pm: The Perl Foundation получила $100,000 в фонд поддержки и развития Perl

Источник: http://news.perlfoundation.org/2012/01/craigslist-charitable-fund-don.ht...

Напомню, что в прошлом году TPF также получила 
€100,000 + $50,000 на развитие Perl от Booking.com и $10,000 от cPanel

Понедельник, 23-е января

On Perl — блог о языке программирования Perl и его сообществе: Perlburg-3

18 февраля в Екатеринбурге состоится третий Perl-воркшоп Perlburg.

Сайт мероприятия, прием докладов и запись участников открыты!

Приглашаем зайти на огонек: event.perlrussia.org/perlburg3. Регистрация и участие бесплатные.

kiev.pm: Результаты опроса

Господа!

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

Далее

On Perl — блог о языке программирования Perl и его сообществе: Даты и место YAPC::Europe 2012

Организаторы YAPC::Europe 2012 объявили о датах и месте проведения мероприятия.

Конференция пройдет с 20 по 22 августа (понедельник — среда) 2012 года в помещении Франкфуртского университета имени Гёте.

antonfin's blog: Обновил свой персональный сайт

Сегодня обновил свой персональный сайт, убрав все не нужное (как я считаю). Смотрите, оценивайте, пишите свои комментарии.

В общем новая версия http://antonfin.kiev.ua

Кстати, а чьи персональные страницы Вам нравятся больше всего?

С ув. antonfin

Четверг, 19-е января

Moscow.pm 2.0: Первый офлайн Moscow.pm в 2012 году

Первая в этом году офлайновая встреча группы Moscow.pm состоится в четверг 19 января в кафе Mojo по адресу: Москва, Сверчков переулок д. 8 (м. Чистые пруды или Китай-город). Начало в 20:00.

Сообщество ru_perl в LiveJournal: ru_perl @ 2012-01-19T20:02:00

Здравствуйте уважаемое сообщество. Глупый вопрос, но все таки спрошу.

Кто нибудь интегрировал MojoX::Session в Mojolicious?


В классе app, наследуемом от Mojolicious ввел синглтон-аксессор к объекту MojoX::Session,


#Singleton Mojox::Session
my $session;

#MySql session table schema: #CREATE TABLE `session` ( # `sid` int(11) NOT NULL AUTO_INCREMENT, # `expires` int(11) NOT NULL, # `data` blob, # PRIMARY KEY (`sid`) #) ENGINE=InnoDB AUTO_INCREMENT=191 DEFAULT CHARSET=utf8 sub session{ unless(defined $session) { $session = MojoX::Session->new( store => MojoX::Session::Store::Dbi->new(dbh => My::DB->new->dbh), transport => MojoX::Session::Transport::Cookie->new, ip_match => 1, expires_delta => 3600, ); $session->expires(3600); } return $session; }



в методе app->startup прописал:

# This method will run once at server start
sub startup {
  my $self = shift;
  $self->secret(rand() . $$ . rand($$));     
  
  my $r = $self->routes;
  $r->route('/bla')->to(controller =>'site', action =>'bla');
  
  #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  #Инициализируем сессию и устанавливаем хттп транзакцию
  #Set server-storable session
  $self->hook(before_dispatch => sub {
          my $c = shift;
            
          my $s = $c->app->session;         
                  
          $s->tx($c->tx);

$s->create unless $s->load; $s->extend_expires; $s->flush; }); #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! }



В дальнейшем работа с сессиями отрабатывается нормально, за исключением того момента, что встроенный http-сервер работает асинхронно, и если в шаблоне содержаться ссылки на css-стили, скрипты и прочий (в основном статический) контент, то запросы на http://localhost/index и http://localhost/main.css приходят практически одновременно, и запрос к сессиям хранящимся в базе данных тоже приходит практически одновременно, и на одну загрузку страницы (которая разбивается на саму страницу, загрузку css и т.д.) создаются 2-3-N сессий. В итоге клиенту присваивается только одна, но лишние сессии остаются в БД, что немного смущает.

Отсюда собственно вопрос: можно ли как то подружить асинхронность хппт-сервера и уникальность сессий без каких либо жестоких блокировок, сильно тормозящих работу?

PS: более подробные исходники тут

Среда, 18-е января

Сообщество ru_perl в LiveJournal: Вакансии в Ростове-на-Дону и Казани

Здравствуй, сообщество.
Одно небольшое, но весьма айтишное кадровое агентство ищет для своих клиентов - большого конструктора сайтов - perl-разработчиков.
Помогите чем можете, товарищи?
Из требований - хотеть писать на перле (готовы рассматривать и без опыта, но со знанием php, python), шарить в mysql и jquery, json.
Ну и конечно иметь прямые руки и светлую голову.
Деньги готовы обсуждать, честное слово.
Да и с остальными плюшками все ок.

Если вдруг это вы - дайте знать на borisova@ichar.ru.

shootnix's posterous: Mojolicious::Plugin::AnyData-1.20

В новой версии добавлены некоторые полезные функции, например, при повторной загрузке таблицы, предыдущая версия удаляется из памяти. Это сделано для того, чтобы не вызывать падение системы и иметь некий предсказуемый положительный результат. 

Загрузка таблиц теперь происходит в любом месте программы, благодаря новому хелперу any_data, который доступен теперь для вызова методов load_data и func в любом месте кода, как экшенов, так и темплейтов (хе-хе), а не только во время запуска приложения, как раньше.

Исправлены некоторые мелкие баги, добавлена/улучшена документация.

На гитхабе: https://github.com/shootnix/Mojolicious-Plugin-AnyData

На CPAN'e: http://search.cpan.org/~shootnix/Mojolicious-Plugin-AnyData-1.20/lib/Mojolicious/Plugin/AnyData.pm

По-прежнему, принимаются замечания или предложения для дальнейшего развития плагина. Заранее всем спасибо. 

Permalink | Leave a comment  »

Вторник, 17-е января

flamey: Usage of Perl for websites fell below 1%

  • 4.1% всех Perl-сайтов недавно перешли на PHP recently, в то же время 2.7% с PHP на Perl
  • Perl использут 1.5% top 1,000 сайтов, и 1.8% the top 10,000 сайтов. т.е. с учётом того что использование Perl на "всех" сайтах упало ниже 1% популярные сайты его используют чаще чем непопулярные
  • 1.1% сайтов в домменной зоне .ru используют Perl, и только 0.6% в .ua
    Для сравнения: .jp - 3.3%, .uk - 2.2%, .de - 1.5%, .cn - 0.1%
  • 76% сайтов на Perl версии 5.8
    5.10 - 22.4%
    5.12 - 1.2%
    5.14 - 0.4%


Мини-портал Perl на Opennet: Релиз JSPL 1.07 - модуля связи сред JavaScript и Perl

Представлено обновление проекта JSPL, в рамках которого развивается связующий модуль между интерпретатором Perl и встраиваемой средой исполнения JavaScript от Mozilla (проект SpiderMonkey). Модуль обеспечивает взаимную интеграцию сред исполнения Perl и JavaScript, то есть позволяет обеспечить встраивание JavaScript-кода в программы написанные на Perl и предоставляет доступ к объектам среды исполнения JavaScript из Perl-программы. В комплекте с модулем поставляется гибридная JavaScript-оболочка jspl. Модуль для загрузки доступен из CPAN. Код проекта JSPL распространяется под лицензией Perl Artistic License.

Понедельник, 16-е января

Меркантильный гуру: .

Написал свой первый плагин для Dancer-а. И он работает :)

Теперь получится полностью интегрировать в DSL дансера код от биллинга/панелек, что сделает код намного красивее и уменьшит в некоторых местах количество строчек.

Однако, дансер все же уже стал too complex. И с одной стороны есть сообщество, которое развивает его, а с другой стороны - там есть call stack, нет встроенного dancerctl и есть разные другие мелочи, которые очевидно странные, неудобные и неправильные на мой взгляд. А вот времени, чтобы написать с нуля свой фреймворк с тем же функционалом - нет и в ближайшее время не будет. Хотя, кажется, уже даже есть знания и опыт для .

Воскресенье, 15-е января

Хабрахабр: Метки / perl: Информационная безопасность / Упаковщик для dsniff.db

Доброе время суток.

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

Сообщество ru_perl в LiveJournal: Как узнать куда уходит память?

Добрый день!
Переписал скрипт с ипользованием HTML::TreeBuilder, который в цикле обрабатывает N-ое количество файлов, до этого использовались регексы.... в итоге, сервер несколько раз подвисал, стал смотреть топом, примерно за минуту-две работы съедается около 10 Мб памяти.


Может и раньше было неоптимально написанно, но в глаза особо не бросалось, так как все успевало обработаться в полном объеме.
А может даже дело и не в TreeBuilder, не знаю....

Переменным вроде делаю undef'ы перед выходом из функций.
$tree->delete - есть.

Есть ли какая-то возможность в Perl узнать на что именно уходит память? Какие переменные, функции ее используют?


Начиная работу с 2.8% памяти, минут через 20 становится уже 20%.
Графы VIRT, RES, %MEM постоянно увеличиваются. Например, пока писал это сообщение, скрипт уже использует 2,4 Гб или 31%.


Заранее спасибо!

UPD РЕШЕНО

Суббота, 14-е января

Хабрахабр: Метки / perl: Информационная безопасность / История одного аудита

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

Подробнее о том, на что нужно обращать внимание при проектировании своих сайтов под катом.

Александр Симаков — Perl: www.100слов.рф — учите язык с помощью субтитров!

Пятница, 13-е января

koorchik's Perl blog: Валидация данных в Mojolicious

ZAG.RU: Грамматики для Perl 5 и JavaScript

В продолжение темы инструментов синтаксического анализа [1] опишу еще пару.

Прежде приведу ссылку на статью про основу построений грамматик в Perl 5 [2].

Парсер Marpa для Perl 5

Alexey Shrub (за что ему отдельное спасибо) подбросил ссылку на еще одну библиотеку для Perl 5 - Marpa [3]. Этому проекту около 4 лет и недавно вышла XS версия за номером 1.0 [4], что вроде как намекает на стабильность.

Вот пример грамматики, описывающей простой калькулятор:


my $grammar = Marpa::PP::Grammar->new(
    {   start   => 'Expression',
        actions => 'My_Actions',
        default_action => 'first_arg',
        rules   => [
            { lhs => 'Expression', rhs => [qw/Term/] },
            { lhs => 'Term', rhs => [qw/Factor/] },
            { lhs => 'Factor', rhs => [qw/Number/] },
            { lhs => 'Term', rhs => [qw/Term Add Term/], action => 'do_add' },
            {   lhs    => 'Factor',
                rhs    => [qw/Factor Multiply Factor/],
                action => 'do_multiply'
            },
        ],
    }
);

Непосредственно правила описываются в виде массива хэшей, в которых ключи lhs - имена правил, а ключи rhs описывают возможные комбинации значений. Marpa умеет вызывать обработчики правил для выполнения каких-либо действий (ключ action).

В правилах не используются регулярные выражения. Чтобы описать количество повторений используется ключ "min".

Например:

  # Эквивалент * в регулярных выражениях
  { lhs => 'sequence', rhs => ['item'], min => 0 } 

Возможные значения должны быть перечислены явно:

    $recce->read( 'Number', 42 );
    $recce->read( 'Multiply', );
    $recce->read( 'Number', 1 );
    $recce->read( 'Add', );
    $recce->read( 'Number', 7 );

Это и есть расплата за игнорирование регулярных выражений в угоду скорости :-). Советую посмотреть программу по разбору CSS [5]. Там, в начале, производится анализ и сбор возможных значений с помощью регулярных выражений (никуда тут не денешься).

Также возможно будет интерсна стратья об использовании библиотеки Marpa-HTML [6] для обработки HTML. И я не советую смотреть в исходный код самого парсера Marpa-HTML [7].

Грамматики для JavaScript

Наиболее развитым, на мой взгляд, является PEG.js [8]

Парсер грамматик работает по принципу Javacc (да и по синтаксису очень похож): сначала описываются грамматики, а затем генерируется парсер. Генератор кода запускается под Node.js.

Вот пример грамматики для обработки арифметического выражения 2*(3+4):

start
  = additive

additive = left:multiplicative "+" right:additive { return left + right; } / multiplicative

multiplicative = left:primary "*" right:multiplicative { return left * right; } / primary

primary = integer / "(" additive:additive ")" { return additive; }

integer "integer" = digits:[0-9]+ { return parseInt(digits.join(""), 10); }

Peg.js используется для обработки SQL-подобных запросов в http://ql.io/ [9].

NOTES

1. Грамматики в Java, Perl 6 и Perl 5. http://zag.ru/2011/318/a1/grammatiki-v-Java-Perl-6-i-Perl-5.html

2. О грамматиках в v5.10. http://www.effectiveperlprogramming.com/blog/1479

3. Библиотека для синтаксического анализа Marpa. http://www.jeffreykegler.com/marpa

4. Marpa::XS is now 1.000000. http://blogs.perl.org/users/jeffrey_kegler/2011/12/marpaxs-is-now-1000000.html

5. Sample CSS Parser using Marpa::XS. https://gist.github.com/1511584

6. How to Parse HTML. http://blogs.perl.org/users/jeffrey_kegler/2011/11/how-to-parse-html.html

7. Marpa-HTML.http://search.cpan.org/dist/Marpa-HTML/

8. Parser Generator for JavaScript.http://pegjs.majda.cz/

9. Анонс инструментария для разработки mashup-приложений. http://www.opennet.ru/opennews/art.shtml?num=32463

Perl на hashcode.ru: Удаление пробелов и переводов строк

Для того что б вырезать все пробелы и переводы строк, как с начала, так и с конца, + убирать двойные пробелы, написал регулярку:

$opis =~ s/^\s+|^(\r?\n)+|\s+$|(\r?\n)+$//g;
$opis =~ s/\s+/ /g;

Локально все работает, как только запускаю на сервере, работать не хочет.
Вернее оно удаляет вообще все переводы строк, даже те, что есть в середине текста. Почему?

Четверг, 12-е января

ZAG.RU: Plosurin: Perl реализация Closure Templates

Мой процесс избавления от Template::Toolkit [1] и вообще шаблонизаторов в какой-то момент замедлился. Причиной тому стали ситуации, когда перенос представления на сторону клиента грозил появлением новых проблем.

Вот пару типичных случаев:

  • статический текст из документации

    Иногда, бывает очень удобно (в первую очередь для пользователя!) в интерфейсе сайта привести выдержку из документации. Обычно это статический текст в несколько абзацев, но может быть и целая страница с несколькими главами. Подобного рода данные, в случае, когда представление полностью перенесено на сторону клиента, помещаются в JavaScript библиотеки и затем загружаются браузером клиента.

    Проблема здесь вполне очевидная: растет объем загружаемых данных. К тому же, не факт, что некоторые из них могут пригодится. Есть решения: это сжатие библиотек, использование отложенной загрузки требуемых частей (например, в GWT можно подгружать как код, так и ресурсы). Подобные рецепты приходится использовать, несмотря на привнесение некоторого усложнения разработки.

  • форматирование потока данных

    Зачастую, возникают задачи потоковой обработки данных. К примеру, нужно сформировать объемную страницу (это может быть XML, HTML или тот же JSON) из потока данных, извлекаемых из базы. В этом случае проще формировать результирующий текст по мере извлечения записей. К тому же, браузер или устройство может обладать ограниченными возможностями, чтобы собрать страницу. Например, не хватит памяти в игровой приставке или телевизоре :-).

В client-side разработке я использую GWT и Google Closure, где тоже есть шаблоны. Я имею в виду Closure Templates, которые транслируются в программный код JavaScript и Java.

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

Таким образом появилось желание реализовать Closure Templates [2] для Perl. Транслятор Closure Templates реализован на Java и в Google работает небольшая команда (буквально пара-тройка) разработчиков, которые не в состоянии регулярно поддерживать сторонние языки. Поэтому логично было реализовать эту систему целиком на Perl [3].

Plosurin - Perl реализация Closure Templates

Perl реализаций на сегодня две:

Perl 6 [4]
Благодаря шикарной встроенной поддержке синтаксического анализа я начал разработку с реализации на Perl 6. На данный момент есть вероятность, что изменения в предстоящем релизе Rakudo привнесут нестабильность для некоторых программ [5]. По этой причине реализация на Perl 6 отложена.
Perl 5 [6]
Данная реализация, конечно, еще далека от совершенства, но минимально необходимый функционал реализован. Plosurin понимает структуру файлов с шаблонами, грамматику шаблонов и умеет обрабатывать переменные в математических выражениях. К тому же есть режим, когда Plosurin превращается в web сервер и позволяет ускорить разработку шаблонов.

Наиболее важным для меня результатом является снижение «энтропии» в разработке, благодаря появлению единой системы шаблонов для серверной и клиентской части.

NOTES

1. Perl 5 модули, которые я использую реже и реже. zag.ru/b48j1

2. Closure Templates Documentation. http://code.google.com/intl/ru-RU/closure/templates/docs/overview.html

3. Сайт проекта Plosurin. plosur.in

4. Perl 6 реализация Closure Templates. http://github.com/zag/plosurin

5. ‘nom’ branch is now default, release status. rakudo.org/2011/09/09/nom-branch-default/

6. Perl 5 реализация Closure Templates. http://github.com/zag/p5-plosurin

Хабрахабр: Метки / perl: Железо / «Умный дом» собственными руками. Часть 5. Технологии Х10

image

В прошлой статье мы прикрутили к нашей системе «умный дом» небольшой веб-интерфейс. Самое время обратиться к той части дела, ради которой все это и затевается — управление нагрузкой. Под нагрузкой подразумевается любое электроустройство, которым есть смысл управлять.
За подробностями реализации прошу под кат.

Среда, 11-е января

Perl на hashcode.ru: Аналог функции js encodeURIComponent в perl

Подскажите, пожалуйста, функцию в perl, аналогичную такой функции js,
как encodeURIComponent. То есть в js мы пишем:

var t = encodeURIComponent(document.title);

А в perl надо бы написать:

$t = xyz($title);

Какая функция perl будет эта "xyz"?

В JS составляем ссылку так:
http://connect.mail.ru/share?url='+encodeURIComponent(location.href)+ '&title='+encodeURIComponent(document.title));

А в perl как?

Вторник, 10-е января

Сообщество ru_perl в LiveJournal: Perl + Unicode+ HTML::TreeBuilder - портится кодировка

Добрый день!

После обработки HTML::TreeBuilder'ом на некоторых даных текст стал возвращаться перекодированным из юникода в какие-то ироглифы и как с ними дальше работать не понятно...

Использую как: $tree->clone->findnodes_as_string('xpath')


Долго копался, пытаясь понять почему и в чём разница с информацией которая обробатывается нормально + ища информацию по проблеме в интернете..... и на каком-то зарубежном сайте нашел маленькое упоминание, что HTML::Parser, который работает в связке с TreeBuilder, если встречает какой-то подозрительный символ, принудительно начинает переводить весь текст в Latin1

После этого стал постепенно сокращать тексты в попытке определить на каком из символах происходит затык и обнаружил, что проблема начинает возникать, если в коде html встречается —.

Стоит их убрать - норма.
Вставляешь - снова загогулины, кроме этого Perl начинает ругаться об Wide character in print at


Ради эксперимиента попробовал принудительно вставлять   , « предположив, может дело в html entity - но с ними проблем нет.

Не могу понять в чем дело :((((
Подскажите, пожалуйста, чем не нравится &mdash и с какими еще символами могут возникнуть проблемы?

Спасибо!

UPD

Тест:




Результат:



UPD РЕШЕНО!

Понедельник, 9-е января

Сообщество ru_perl в LiveJournal: Проблема с template::toolkit и utf-8

Следующая проблема не даёт спать.

perl, v5.10.1 built for MSWin32-x86-multi-thread (acivestate)
template::toolkit 2.22

В скриптах везде указано use utf8, во всех скриптах и во всех темплейтах есть BOM-заголовок, все сохранены в utf.
Инициализация так сделана:
$tt = Template->new({
INCLUDE_PATH => $$cfg{tpl_path},
ENCODING => 'utf8',
}) || die "$tt::ERROR\n";

Проблема:
если в шаблоне есть не-ascii символ, к примеру, любая русская буква - тогда на выходе получается каша вида "Глупый вопрос" (при этом русские буквы, которые в шаблоне присутствовали, читаются).

Если в шаблоне только ascii, тогда всё работает нормально, включая русские строки, которые изымаются из базы и вставляются в шаблоны.
То есть, TT не хочет нормально работать с шаблонами, в которых изначально есть русские буквы. При этом строит страницы по этим шаблонам без проблем, даже если в значениях переменных оказываются русские буквы.
Ставил в вызовах process() опцию binmode => ':utf8' , не помогает.

Как-то это лечится?

Perl на hashcode.ru: Ресурсы по Python и Perl

Существуют сайты или книги с заданиями/упражнениями по языкам Python и Perl? Если знаете такие ресурсы, то дайте ссылки. Мне необходимо практиковаться по данным языкам. Спасибо!

XPoint.ru | Программирование::Perl::Основы: fork() и запись в файл несколькими процессами

После нескольких тестов сложилось впечатление, что процессы услужливо ждут пока первый, начавший сброс буфера закончит. При этом никаких явных блокировок не вызывалось.
На таком коде:

#!/usr/bin/perl
use strict;
use v5.10;

open OF, '>', 'test.txt';

foreach(1..100) { unless(fork()) { say OF 'some text string'; exit; } }

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

Никогда не сталкивался с такой задачей - необходимо форкаться и каждому процессу может понадобиться писать в лог. Необходимо ли перед записью вызывать flock(), или тут действует какая-то магия?
Можно ли пример, на котором можно наблюдать перепутывания вывода из разных процессов?

$ uname -a
Linux machine 2.6.32-28-generic #55-Ubuntu SMP Mon Jan 10 23:42:43 UTC 2011 x86_64 GNU/Linux

Воскресенье, 8-е января

Регулярные выражения на ya.ru: inequ regex

Приветствую всех!

Бродил я тут по инету и наткнулся на интересную вещь. Все тут присутствующие (многие, по крайней мере) знают про квайны (quines) - программы, которые выводят свой исходный код. В какой то мере это можно считать зачатками искусственной жизни - оно (примитивно конечно, но) может самовоиспроизводиться. Оказывается можно пойди дальше по этому пути - жизнь не только размножается, но и обладает органами чувств. То есть, оказывается есть еще малоизвестный класс программ - inequ, которые умеют распознавать свой собственный код. То есть если этой программе подать на вход свой собственный исходник, она подтвердит - "да, это так", если нет - скажет что "нет" (через exit code например). 

Но это все вступление. А вопрос будет такой - можно ли написать регулярное выражение которое совпадает с собой и только с собой (ну или как вариант - с минимальным количеством строк, кроме себя). Скажем, первый пришедший в голову вариант - a, естественно совпадает сам с собой, но также совпадает с "aa", "aaa", "apple" и т.д. - с бесконечным количеством строк в общем. В сети же нашел вариант с минимумом совпадений равным 549 миллиардам с хвостиком - что мягко говоря дофига...

Есть желающие поломать голову ?

(чур не гуглить :) )

Пятница, 6-е января

Хабрахабр: Метки / perl: Nginx / [Из песочницы] Генерация уникального идентификатора пользователя средствами Nginx

Приветствую Вас, хабрачитатели!

Расскажу об одной задачке, которая встала передо мной, и как я ее решил.

Сразу оговорюсь — часовой поиск в G и в Я удовлетворяющего результата не принес, но за следующий час было реализовано собственное решение.

Все это пока не более чем эксперимент — есть белые пятна как в идеи, так и в реализации, на данном этапе нужно понять жить или не жить.


Суть задачи сводилась к тому, что мне требовалось уникально идентифицировать посетителя в независимости от природы и вероисповедания компонентов системы (Web-проект). Причем сделать это максимально просто, быстро и без большого оверхеда по быстродействию.
Важно заметить, что авторизация пользователя по логину/паролю или еще как не производится.

В качестве веб-сервера и первичного балансировщика нагрузки у меня имеется Nginx.

В моей системе для php используетcя php-fpm через fastcgi, так же через fastcgi работает c++ сервер бизнес логики.

shootnix's posterous: Параметры функции в Perl, небольшая зарисовка

Если внутри функции использовать массив @_, то это повлияет на целостность данных вне функции:

1
2
3
4
5
6
7
my $a = 1;
sub change_a {
    $_[0]++;
}
change_a($a);

say $a; # 2

Если из массива вынимать данные и использовать их, то с внешними переменными все будет в порядке:

1
2
3
4
5
6
7
my $a = 1;
sub change_a {
    ${shift}++;
}
change_a($a);

say $a; # 1

Эту разницу нужно учитывать или даже использовать, кому как больше нравится.

Permalink | Leave a comment  »

Четверг, 5-е января

grey_olli: perl6

Мне тут было сказали, что perl6 не поддерживает сорцы perl5. Однако, зайдя на dev.perl.org я понял, что меня ввели в заблуждение:
In addition, Perl 6 will provide a "Perl 5 compatibility mode", allowing the compiler to directly execute any code that it recognizes as being written in Perl 5.
Так что таки Ларри отнюдь не альтернативно одаренный, как разрабы питона сделавшие две обратно-несовместимые версии языка. Просто разработка еще не закончена.

koorchik's Perl blog: Быстрая установка зависимостей Perl-приложения

Среда, 4-е января

Сообщество ru_perl в LiveJournal: 2 Junior Perl Developers в офис в Ростове-на-Дону

Компания Skoosh International Ltd. (http://www.skoosh.com) открывает local dev office в Ростове. В данный момент ищем двоих Junior Perl developers.

Keywords: Perl 5.12+, MySQL 5.x, Nginx 1.xx, Apache2/mod_perl2, RHEL5 (опыт любого другого линукса вполне сгодится), Bash, SVN, Redis, AnyEvent/Coro, JQuery, Sphinx search engine.

Полный 8-часовой рабочий день (из них 6 в интервале с 13 до 21 часа по Москве, остальные два - как пожелаете).

Базовый письменный английский для общения в мснжере/скайпе (буду проверять на интервью), разговорный не требуется.

Опыт работы с Perl в LAMP стэке - 1-2 года. Опыт администрирования приветствуется.

Возможны полностью оплачиваемые командировки в Brighton, UK.

1500 USD. Очень хорошие перспективы, поверьте :)

Офис сейчас подыскиваем, скорее всего будет на Северном.

Пишите на eugene{dot}toropov(at)gmail{dot}com

Начинаем работать в январе-феврале.

С новым годом! ;)

UPD: каждый разработчик получит в пользование новенький аймак.


UPD: закрыли обе, всем спасибо.

Вторник, 3-е января

Регулярные выражения на ya.ru: Премодерация

علي (Али) опубликовал новость

Поскольку спамеры на уговоры веником по попе не реагируют, клуб переключен в режим премодерации.


Администрация клуба обещает оперативно коммитить сообщения по теме клуба, но задержки всегда возможны — отнеситесь с пониманием, это небольшая плата за возможность развидеть проповедников и торговцев.


Удачи всем в новом году!

Суббота, 31-е декабря

kiev.pm: Итоги 2011 года

Господа!

В списке рассылки опубликованы итоги 2011 года для сообщества Kiev.pm

Далее

Меркантильный гуру: О хомячках и уязвимостях

Универсальный способ DoS-атаки, затрагивающий PHP, Java, Ruby, Python и различные web-платформы.

"Проблема не затрагивает язык Perl и ветку Ruby 1.9.x, [...]. В Perl проблема была устранена ещё в 2003 году, после публикации отчёта о возможности совершения подобной атаки."

А остальным хомячкам положить бизнес-критичные приложения, расчитанные на высокую нагрузку, лежащие в кластерах и витающие в облаках теперь может любой школьник с каким-то средним пониманием математики и начальным знанием Си или паскаля.

Пятница, 30-е декабря

http://juick.com/freefd/1693301

Проблеме подвержены все языки программирования и фреймворки, в которых не используется дополнительная рандомизация значений в функциях хэширования, например, уязвимы Java (Tomcat, Geronimо, Jetty, Glassfish), JRuby, PHP, Python, Rubinius, Ruby 1.8.7, V8 JavaScript Engine и ASP.NET. Проблема не затрагивает язык Perl и ветку Ruby 1.9.x, так как в этих языках уже используется внесение случайных изменений при формировании хэшей. В Perl проблема была устранена ещё в 2003 году, после публикации отчёта о возможности совершения подобной атаки.

via opennet.ru

Хабрахабр: Метки / perl: Perl / [PODCAST] Новогодний Yet Another Perl Podcast. Выпуск 12. Краткие итоги уходящего года

Радости

Прошло 5 конференций по perl:

  • Perlburg-2 Екатеринбург, 2 апреля 2011;
  • YAPC::Russia «May Perl + Perl Mova» Moscow, 13–15 May 2011;
  • YAPC::Europe Riga, 15–17 August 2011;
  • Black Perl Black Sea, 30 September – 2 October 2011;
  • Saint Perl — 3 Saint Petersburg, 18 December 2011

Среда, 28-е декабря

http://juick.com/freefd/1691216

"Let's face it. SOAP is painfull. It's a dumb idea, the only reason you should ever consider using SOAP is if someone holds a gun to your head or pay you a lot of money for it." via search.cpan.org

Вторник, 27-е декабря

Меркантильный гуру: .

Чем-то не тем занимаются разработчики Dancer-а последние месяцы. Что не релиз, то ломание обратной совместимости. Теперь какую-то фигню со view в шаблонах устроили, пришлось откатиться на летнюю 1.3072.

Я уже третий час медитирую над смыслом строчек

        if (-e $view_path) {
            $content = $engine->apply_renderer($view, $tokens);
        } else {
            Dancer::Logger::error("Supplied view ($view) was not found."); 
в контексте того, что если что не так, модуль шаблонизатора и сам способен вменяемую ошибку выплюнуть (и каждый это так и делает). Ну а вот так оно теперь просто неработает, причем в непонятно каких ситуациях.

Ну и вообще по коммитам чётко видно, что о том, что изменения могут что-то вообще затрагивать, там никто не думает. Печальная, весьма, тенденция.

Суббота, 24-е декабря

We load sixteen tons of software: Plusfeed.pl - my Google Plus RSS export tool and service was released


I'm not very social animal but I have a couple of accounts in social networks, including Google Plus account - https://plus.google.com/112714787808356482431/ (and yep, you can add me to your circle) and also I was wondering why Google do not provides RSS/Atom feeds there.
Googling reveals some tools for this purpose -
https://github.com/russellbeattie/plusfeed - using Python on GoogleAppengine.
https://github.com/tedkulp/gplusfeed - using Node.js on Heroku.
https://github.com/AntonTyutin/gp2rss - using Node.js
But there is no public service for G+ RSS translation AFAIK -
Russel's public Plusfeed http://plusfeed.appspot.com was closed because of changing prices on AppEngine,
Public instance of gplusfeed at http://gplusfeed.heroku.com also not working (at least for me).
So, I decided to write tool for this by myself and also provide simple and reliable piece of code for anyone
who want to translate G+ posts to RSS/Atom, at least until Google do not provide this natively.

So, please welcome http://plusfeed.sandbox.activestate.com !
Activestate Stackato was used as hosting, but you can provide your own service (at least for your own posts) if you have even simple Perl/CGI hosting using my code at https://github.com/deniszh/plusfeed.pl

In case of problems feel free to drop me an email to denis.zhdanov@google.com or post issue 

Plusfeed.pl - экспортируйте Google Plus в RSS/Atom !

Я не сильный любитель социальных сетей, но есть практически во всех - включая Google Plus - просто для поддержания связи с друзьями и знакомыми. Вот мой круг в Плюсах - https://plus.google.com/112714787808356482431/ - можете меня добавить. :)
Однако я с удивлением обнаружил что G+ не предоставляет Rss/Atom фидов для экспорта.
Гуглением было обнаружено следующее -

https://github.com/russellbeattie/plusfeed - использует Python на GoogleAppengine.
https://github.com/tedkulp/gplusfeed - использует Node.js на Heroku.
https://github.com/AntonTyutin/gp2rss - использует Node.js
Но насколько мне известно ни один из этих сервисов не дает публичного доступа - Plusfeed http://plusfeed.appspot.com был закрыт после изменения цен на Appengine,  http://gplusfeed.heroku.com у меня (может только у меня?) тоже завести не получилось.
Поэтому я решил написать такую штучку для себя, ну  для других жаждущих - по крайней мере, пока возможность экспорта постоп G+ не будет предоставляться "из коробки".

Итак, встречайте - http://plusfeed.sandbox.activestate.com !
Также можете использовать мой код  https://github.com/deniszh/plusfeed.pl чтобы сделать что то подобное, используя простой Perl/CGI хостинг или Activestate Stackato - все необходимое для этого уже есть в приложении.

Если есть вопросы - пишите, с удовольствием отвечу.

grey_olli: livejournal offline copy/migration tools

вот тут куча линков с пояснениями на русском:

http://aradan.livejournal.com/406718.html

Here is similar(even better) backup/migration toolset for livejournal review, english:
http://sherlock.insanejournal.com/8073.html

ну им мои комментарии:

по ссылкам выше можно найти и только под венду (заведомо обреченные на умирание решения, IMO), в том числе open source и кросплатформенные скрипты на питоне и перле (в венде нужно будет интерпретатор ставить, например activeperl) качающие как с комментами, так и без. Однако, что касается переноса не только постов, но и комментов к ним в другую блог-платформу - частные случаи можно поискать на github.com . Можно найти на freecode.com клиента который(AFAIR) еще и бэкапы умеет (на Objective C и только под MAC). Еще есть совершенно экзотический пример написанный на груви - закидывает XML контент (скачанный питоновским скриптом из жеже) в sql БД - желающие могут лезть искать на платформу кармадрочеров. ) Из perl'ового есть еще вот такой mirror: http://www.boutell.com/scripts/mirror-livejournal.html .

А еще LogJam вполне себе выкачивает в sqlite3 базу весь журнал вот в такую базу:
sqlite> .schema
CREATE TABLE entry (
itemid INTEGER PRIMARY KEY,
anum INTEGER,
subject STRING,
event STRING,
moodid INTEGER, mood STRING, music STRING, taglist STRING,
pickeyword STRING, preformatted INTEGER, backdated INTEGER,
comments INTEGER, year INTEGER, month INTEGER, day INTEGER,
timestamp INTEGER, security INTEGER
);
CREATE TABLE meta (
schemaver INTEGER
);
CREATE INDEX dateindex ON entry (year, month, day);
CREATE INDEX timeindex ON entry (timestamp);
sqlite>
при этом 'select count(*) from entry;' показало корректное количество постов 2323, но вот 'select count(*) from entry where comments is not null;' дало невменяемую цифру 47.


я правда пока еще не определился - запользовать готовое на perl или pyton или написать что-то своё на основе LJ::Simple, какого нибудь RPC модуля (предлагайте CPAN search keywords) и вот этого набора perl скриптов: http://imperium.lenin.ru/LJ/soft.html (если вдруг автор страницы увидит этот пост - пусть поправит линк на оригинальный скрипт - он мертвый на 24.12.2011, а часть email админов сайта баунсится). Собственно из того что мне на данный момент хотелось бы сделать помимо бэкапа - интерфейс для ретага журнала с заменой тегов и автопредложением имеющихся на основе некоторой логики (регекспы, например). Не знаю как будет со временем - пока вроде есть. Довольно давно я такое собирался написать, но вот сделать предварительный search for starting information только что руки дошли. А продолжилось моё старое намерение с обсуждения нюансов использования LJ::Simple и альтернатив ему вот тут: http://grey-olli.livejournal.com/600047.html

На предмет на что мигрировать на standalone с кроспостами в жеже - rserg порекомендовал
"Movable Type.V4 для одного блога, v5 для сайта с несколькими блогами." . Если есть что сказать по этому поводу - welcome. Ну а желающие просто грохнуть весь свой жеже от корки до корки могут пойти за исходником (на perl + LJ::Simple) к rserg в профиль. )

PS: к сожалению на то чтобы найти все эти источники (еще даже толком не попробовав) потребовалось приличное количество времени - поисковики google и yandex выдают кучу нерелевантного г., второй в особенности. :(

Четверг, 22-е декабря

grey_olli: LJ::Simple

Я правильно понял, что используя его на данный момент можно получить только все свои записи, но не комменты к ним?

Вторник, 20-е декабря

Meettya's posterous: Fat-free DI, or Kaiten::Container at dependency injection.

P_pieceofcakelogo1

Image CC by 6 ft high

My first article at English about my own new perl module Kaiten::Container.

Its very simple to understand and use implementation of DI (dependency injection) practice, contrary existing at CPAN another modules.

You know, maybe, IOCBread::BoardPeco::Container or IOC::Slinky::Container

They works, but its too complicated (to me) to use it in real project. The complexity of configurations kills any sense. I think its by huge and/or strange API.

I wish to have something easy and light. The simplicity are good.

So, this is near-to-life example to explain main idea, if you have any interest - take a look to docs.

https://github.com/Meettya/Kaiten-Container/blob/master/ex/simple_example.pl

Any questions, at English or Russian, welcomed.

Permalink | Leave a comment  »

Мета

Поиск

Участники

Список участников в формате OPML OPML

Добавить сайт

По-другому

Приборы