Вторник, 15 апреля

Ловушки Perl: Задачи-страшилки про Perl: Дихотомия (численные методы)

На практикуме по численным методам студент реализовал решение нелинейных уравнений методом деления отрезка пополам.

    # Ищет нули функции методом деления отрезка пополам.
#
# Параметры: 
#  * ссылка на функцию, чей ноль ищем;
#  * концы отрезка, на котором ищем ноль (знак функции на концах отрезка должен быть разным, это проверяется);
#  * epsilon (точность по x) -- деление отрезка продолжается до тех пор, 
#    пока длина отрезка не станет меньше этого значения. 
#    Необязательный параметр, по умолчанию 1e-2.
#
# Пример:
# sub f2 {return $_[0]**2 - 10;}
# my $x = dichotomy(\&f2, 0, 100, 1e-4);
sub dichotomy
{
    my ($f, $x1, $x2, $epsilon) = @_;

my ($y1, $y2) = ($f->($x1), $f->($x2)); if ($y1 == 0 ) { return $x1; } elsif ( $y2 == 0 ){ return $y1; } elsif ( $y1 > 0 && $y2 < 0 ){ ($x1, $x2) = ($x2, $x1); } elsif ( $y1 < 0 && $y2 > 0 ){ # ok } else { die "incorrect interval: f($x1) = $y1, f($x2) = $y2\n"; } $epsilon ||= 0,01;

while ( abs($x1 - $x2) >= $epsilon ){ my $xnew = ($x1+$x2)/2; if ( $f->($xnew) > 0 ){ $x2 = $xnew; } else { $x1 = $xnew; } }

return ($x1+$x2)/2; }

Поиск корней работал, и неплохо. Но не всегда. Иногда ужасно тормозил. С чего бы?

Среда, 9 апреля

Хабрахабр: Метки / perl: [Из песочницы] Мониторинг RabbitMQ в  Zabbix и скрытые возможности Zabbix key


Вступление


    Столкнувшись с задачей замониторить большое кол-во метрик в RabbitMQ кластере, появилось желание создать универсальный парсер для JSON данных. Задача усложнялась тем, что появляются и пропадают метрики динамически во время работы кластера, плюс к этому разработчики постоянно хотят собрать/посчитать что-то новое. К сожалению, в Zabbix нет возможности собирать данные в таком виде из коробки. Но есть такая удобная фича как zabbix_trapper, позволяющая делать гибкую кастомизацию. В статье пойдет речь о не сосвем стандартном способе использовании айтемов zabbix_trapper. Мне не хотелось каждый раз, когда разработчики попросят добавить новых метрик, изменять скрипт, который собирает данные и засылает в заббикс. Отсюда появилась идея использовать собственно сам zabbix key как инструкцию по сбору новой метрики. Суть в следующем, мы используем zabbix key как команду, с заранее заданным синтакисом. То есть zabbix key в этом случае будет служить инструкцией, подобной ключам типа zabbix_agent.
Читать дальше →

Воскресенье, 6 апреля

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

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

    use Scalar::Util qw(looks_like_number);

# было {"1":"c","3":["1","b",3],"d":"5"} # стало {"1":"c","3":[1,"b",3],"d":5} # ключи хешей не трогаем -- в json они всегда строки # можно пользоваться так: print to_json(numerify($data)); sub numerify { my $data = shift;

if (ref $data eq ""){ if ( looks_like_number($data) ){ $data += 0; } } elsif ( ref $data eq 'ARRAY' ){ numerify($_) for @$data; } elsif ( ref $data eq 'HASH' ) { numerify($_) for values %$data; }

return $data; }

Но что-то тут не заладилось…

Четверг, 3 апреля

Shoor/нал: Perl Debugger Cheatsheet

Чтоб не вспоминать кажыдй раз команды перлового отладчика, сделал шпаргалку — скопировал на лист размера A4 текст, выводимый отладчиком по команде h, и добавил верблюда:

Perl Debugger Cheatsheet

Большой файл доступен в форматах PDF и PNG (300 dpi).

Среда, 2 апреля

Блог программиста — Perl, Ruby, C#: Опыт настройки рабочего окружения для VPS

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

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

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

Пятница, 28 марта

Сообщество ru_perl в LiveJournal: Работа с переменными...

Вот пользую Перл-Тк и есть место, где я динамически создаю объекты.
Что-то типа такого:
while ($a<$b)
{
...
$c->Button(...., sub{ comm1; comm2; my_sub($a);comm3 });
...
}

Проблема в том, что когда код выполняется, то в my_sub передается не значение переменной $a на момент выполнения, а то что нужно выполнить sub{ comm1; comm2; my_sub($a);comm3 } когда кнопку нажму. Т.е. по своей сути ссылка на подпрограмму.
Соответственно $a будет равен $b всегда.

Как можно сделать, чтоб туда всегда подставлялось значение $a на момент выполнения кода $c->Button(...
Пока обхожусь тем, что делаю
if ($a==1) {$c->Button(...., sub{ comm1; comm2; my_sub(1);comm3 });}
...
Благо, что диапазон не большой...)))
Нутром понимаю, что не спортивно, а бьюсь уже пару суток и победить не могу...

Вторник, 25 марта

Ловушки Perl: Задачи-страшилки про Perl: Perl + Javascript = ?

Программист разрабатывал веб-сервис, и столкнулся с тяжелым выбором: в какой момент валидировать формы, отправляемые на сервер?

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

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

Программировать одну и ту же валидацию дважды (на js для браузера и на Perl для сервера) – досадная трата времени, да и две отдельные проверки обязательно разойдутся со временем.

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

Для проверки концепции (вызов js-функций из perl-кода) программист набросал Mojo-приложение

metro.pl:

    #!/usr/bin/env perl                                            
                                                               
use Mojolicious::Lite;                                         
use JavaScript::V8;                                            
use File::Slurp;                                               
                                                               
get '/' => sub {                                               
  my $self = shift;                                            
                                                               
  my $form = $self->req->params->to_hash;                      
                                                               
  my $result = metro_validate($form);                          
                                                               
  $self->render(text => $result);                              
};                                                             
                                                               
app->start;                                                    

sub metro_validate { my ($form) = @_; # текст js-программы my $js_text = read_file("metro_validation.js", binmode => ':utf8'); #контекст выполнения js my $cx = JavaScript::V8::Context->new(); # загружаем js-программу $cx->eval($js_text); # получаем ссылку на функцию валидации my $v = $cx->eval('metro_validate');

return $v->($form->{length}, $form->{width}, $form->{height}); }

И js-ную функцию проверки

metro_validation.js:

    function metro_validate(length, width, height){
    var sum = length + width + height;
    if (sum <= 150){
        return 'OK';
    } else {
        return 'Сумма измерений по длине, высоте и ширине не должна превышать 150 см!';
    }
}

  

И сделал тестовые запросы:

    > ./metro.pl get '/?length=1&height=1&width=1'
> ./metro.pl get '/?length=1&height=1&width=5'

  

Проверка определенно что-то проверяла, но определенно не то, что хотел программист. Что же случилось?

Четверг, 20 марта

Shoor/нал: Без лишних движений мышью

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

use File::Slurp
write_file 'big-structure.pl', Dumper $structure

P. S. А если вместо Data::Dumper использовать Data::Dumper::Perltidy, результат получается более симпатичным.

update/07.04.2014: Иногда, когда содержимое в UTF-8, лучше писать так:
write_file 'big.txt', {binmode => ':utf8'},  $unicode-data
Впрочем, к данным, выводимым через Data::Dumper[::Perltidy], это не относится: там символы, не попадающие в ASCII, представлены как \x{HHH}, где HHH — шестнадцатеричный код символа.

Сообщество ru_perl в LiveJournal: nytprof и минус

Затормозил.

Бымц мышой

Судя по третьему абзацу - тупое переполнение, что ли?

Понедельник, 17 марта

Ловушки Perl: Задачи-страшилки про Perl: Однострочник для make

У программиста в проекте был мейкфайл, в котором использовался perl-однострочник.

Makefile:

    # ...
templating: 
        perl -pe 's@/usr@$(PREFIX)@g if /$$prefix=/' templates/lib.pm.templ > $(DESTDIR)$(PERLLIBDIR)/Dh_Lib.pm
# ...

  

С этим однострочником в этом контексте есть по крайней мере одна серьезная проблема. А какие проблемы видите вы?

Пятница, 14 марта

Меркантильный гуру: CSV/TSV и Perl

В продолжение http://knutov.livejournal.com/2968813.html

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

Всегда, абсолютно всегда, с любым модулем возникают такие проблемы, что проще парсинг CSV/TSV написать самому.

Сейчас, например, пробую парсить TSV, полученный от Google Spreadsheets, модулем Data::Table и получаю Inconsistent column number at data entry.

Т.е. в общем да, надо признать что если когда-то давно все каждый раз вспоминали, что CPAN - огромное количество модулей на все случаи жизни, то сейчас первое, что вспоминается - ужасное качество всех модулей. Фактически, кроме очень базовых модулей, сейчас работать можно только с модулями очень конкретных авторов, которые активны в рассылках и параллельно держат копии модулей в Github. Да и там случаются ситуации, когда проблема получается при сценарии, который не использует автор модуля в своем проекте и тогда нужно тратить много времени на документирование бага и переписку.

Четверг, 13 марта

Меркантильный гуру: Про перл

http://slonik-v-domene.livejournal.com/144364.html - если вдруг кто не подписан.

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

Меркантильный гуру: Про воспитание

Если у вас хорошее воспитание и вы когда-то пытались что-то делать с Directi API во времена, когда там был только SOAP(*) и вам в это время вспоминались разные слова, которые джентельмен с хорошим воспитанием знать не должен...

...зацените Google API для таблиц. Мало того, что там есть v1, v2, v3, из которых два устарели, сейчас еще появились какие-то новые таблицы, которых в v3 апи не видно, и у которых ключ не совпадает с хешем в урле (и к которым вообще непонятно как доступ получать) (**)


(*) - про http api они тогда говорили что это все несерьезно и они его делать не будут.

(**) - старый урл
https://docs.google.com/spreadsheet/ccc?key=****
урл для новых таблиц
https://docs.google.com/spreadsheets/d/****/

и я буду счастлив, если кто-нибудь мне расскажет, как парсить эти новые таблицы (мне надо координаты ячейки и текст в ней, можно без форматирования), в контексте перла, когда Net::Google::Spreadsheets эти таблицы не видит (что логично - в RSS FEED в v3 апи их нет).



upd: да, в списке https://spreadsheets.google.com/feeds/spreadsheets/private/full?v=3.0 таблиц в новом формате нет

upd2: всё куда веселее: https://support.google.com/drive/answer/3543688

поддержки API Gdata нет вообще.

Убей в себе государство: О холиворах про умирание перла...

Исходный пост доступен здесь: https://www.facebook.com/photo.php?fbid=10151877346562504
Мои комментарии в ЖЖ ровно потому, что Фейсбук слишком убог для долговременных дискуссий.

Дальше будет многабукаф, и если кратко, то: 1) будущего у Perl как платформы для разработки нет, рынок давно все решил и 2) текущая востребованность разработчиков Perl обусловлена исключительно большой кодовой базой у игроков типа Mail.ru или Yandex. В относительно скором будущем они уйдут от использования Perl, уже сейчас со стороны Яндекса все подвижки видны невооруженным взглядом.

Объективные причины следующие:
- убогая кодовая база. 99.9% кода на CPAN не годится никуда кроме как на помойку. Это - объективный факт; любой серьезный разработчик увидя модуль Foo::Bar::Baz всегда интуитивно ищет Foo::Bar::Baz:Fast, а лучше - Foo::Bar::Baz::Fast::XS. Ровно потому, что изначальная версия настолько плоха, что пользоваться ею невозможно.

- отвратительное внутреннее API. Если вы ни разу не писали собственный модуль на PerlXS, значит, по-настоящему серьезным хайлоадом вы не занимались и неважно сколько у вас было rps. А если писали, то знаете про семь кругов ада perl guts (если что - обращайтесь, я - один из немногих, кто _действительно_ разбирается в API). API PerlXS чудовищно, это адское наследие 1980-х, и если сравнить его с Python C или Zend C API... право же, лучше не сравнивать.

- порочная практика "все уже сделано до нас". Это когда при попытке поставить один модуль, по зависямостям вытаскивается еще полсотни. Почему? Да прсто потому, что программистов ломает писать свои реализации алгоритмов, и проще отнаследоваться (о проблемах Perl OOP чуть позже) от уже готового модуля. Как результат - поломка одного модуля где-то в середине иерархии классов приводит к debugging hell. Отдельно следует упомянуть требования по зависимостям, когда проект ни с того ни с сего хочет поставить для работы 450+ модулей (я лично был свидетелем).

- TMTOWTDI, и при этом неполная совместимость First Way и Second Way. Именно поэтому в одном и том же проекте старше полутора-двух лет можно запросто встретить N и более модулей, решающих разными способами одну и ту же проблему.

- высокая сложность подготовки релиза и деплоймента, прямое следствие предыдущего пункта. Да, есть всякие pure-perl имплементации модулей и prelbrew, но это к настоящему хайлоад-продакшену не имеет никакого отношения. Для поддержки проекта очень важен момент предсказуемости вносимых изменений. И чем больше модулей и версий языка используется, тем больше вероятность отказа, а значит - выше цена тестирования продукта и подготовки релиза. Лично я вообще ни разу не видел ни одного большого проекта на Perl, который можно было бы поставить или обновить штатными средствами системы, например, посредством yum или apt.

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

- отсутствие единого стандарта и зоопарк версий Perl. Что хорошо в C/C++/Java/C#/Javascript - так это наличие стандарта. Вас ограничивают только системные требования, соблюдение которых не является сколь-нибудь трудоемкой задачей (например, у меня есть проект на 400+ тысяч строк кода, где системно-зависимого кода максисмум с несколько сот срок). У Perl же все совсем наоборот: вы можете взять v5.10, v.5.12, v5.18 и так далее, и каждый программист может указать у себя perl use v5.XX... и устроить вам великое счастье несовместимости. Не говоря уже о куче #ifdef во внутреннем API.

- адское, ничем не объяснимое потребление памяти. Одна и та же бизнес-логика на Perl, и на ненавистном кr00tым перловикам PHP, реализованная неплохими, в общем-то, программистами, требует примерно на порядок большего количества памяти. Почему? Да потому, что у Perl собственное представление об аллокации памяти; в Perl память легко _выделить_ и практически невозможно _освободить_, за подробностями - welcome в рассылки читать про perl allocator.

- отсутствие, собственно, ООП. Да, есть куча модулей Perl, реализующих те или иные подходы, но в самом языке самая сложная конструкиция - blessed hash, что недалеко ушло от первых наивных попыток из 1990-х.

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

Пятница, 7 марта

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

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

Понедельник, 3 марта

Ловушки Perl: Задачи-страшилки про Perl: Скачать все, параллельно

Программист решил усовершенствовать скрипт для скачивания веб-страниц из задачи “Скачать все”, и добавить в него параллельности с помощью модуля Parallel::ForkManager.

Итак, программист взял пример из документации, добавил логгирование, получилось примерно так:

    #!/usr/bin/perl

use strict; use warnings;

use Log::Log4perl; use LWP::Simple; use Parallel::ForkManager;

# links to download my @links = ( ["http://www.cpan.org/misc/images/cpan.png", "cpan-logo.png"], ["https://metacpan.org/static/images/logo.png", "metacpan-logo.png"], ["http://yandex.st/www/1.817/yaru/i/logo.png", "yandex-logo.png"], ["https://www.google.ru/images/srpr/logo11w.png", "google-logo.png"], ["https://mmedia2.ozone.ru/graphics/ozon/logo_220_87.png", "ozon-logo.png"], ["http://www.foo.bar/rulez.data","rulez_data.txt"], ["http://new.host/more_data.doc","more_data.doc"], # ... ); my $chunk_size = 2;

my $conf = qq( log4perl.rootLogger = DEBUG, SYSLOG log4perl.appender.SYSLOG = Log::Dispatch::Syslog log4perl.appender.SYSLOG.min_level = debug log4perl.appender.SYSLOG.ident = $0 [$$] log4perl.appender.SYSLOG.facility = daemon log4perl.appender.SYSLOG.layout = Log::Log4perl::Layout::SimpleLayout );

Log::Log4perl::init( \$conf ); my $logger = Log::Log4perl->get_logger();

# Max 30 processes for parallel download my $pm = Parallel::ForkManager->new(30);

while ( my @chunk = splice @links, 0, $chunk_size) { $pm->start and next;

$logger->info((scalar @chunk)." links to download");

for my $linkarray (@chunk){ my ($link,$fn) = @$linkarray; my $status = getstore($link,$fn); $logger->warn("Cannot get $fn from $link") if $status != RC_OK; }

$pm->finish; }

$pm->wait_all_children; $logger->info("done");

Скрипт работал, но странновато…

Понедельник, 24 февраля

Ловушки Perl: Задачи-страшилки про Perl: Бренд или не бренд?

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

Программист реализовал простую проверку “текст содержит слово из списка запрещенных”, изменения в коде получились совсем небольшими:

    --- SomeModule.pm  (revision 12345)
+++ SomeModule.pm  (working copy)
@@ -6,6 +6,43 @@
+{
+my $brand_name_regexp = qr/
+\b(?:
+    autocad |
+    benetton |
+    cisco |
+    dodge |
+    ericsson |
+    forbes |
+    gorenje |
+    hasselblad |
+    ikea |
+    jaguar |
+    kyocera |
+    lego |
+    manfrotto |
+    nokian |
+    oracle |
+    rolex |
+    salamander |
+    swarovski |
+    toshiba |
+    ubiquam |
+    volkswagen |
+    wallmart |
+    yamamoto |
+    zippo
+)\b
+/xi;
+
+sub contains_brand_name 
+{
+    return $_[0] =~ $brand_name_regexp;
+}
+}
 
@@ -53,8 +90,10 @@
     push @posts, { 
         text => $_,
+        contains_brand_name => contains_brand_name($_), 
         word_count => scalar split(/\W+/),
     };
 }
 

  

И что же, вы думаете, случилось дальше?

Суббота, 22 февраля

Сообщество ru_perl в LiveJournal: Mojolicious captcha

Доброго времени суток сообщество. Подскажите где можно найти плагин captcha для Mojolicious? Нашел один: github.com/konstantinov/Mojolicious-Plugin-Recaptcha, по моему через гугл работает, это не то что нужно, да и не нужна такая сложная и отвратительная капча. Хочется в своем приложении реализовать, без сторонней помощи. Ну или на худой конец, образчик как написать плагин самому и прикрутить к Mojolicious. Капчу писал однажды, использовал GD совместно c CGI::Session, но я так понимаю, сессии как-то уже в фреймворке присутствуют, неужто в исходники лезть? ((( Спасибо, заранее.

Вторник, 18 февраля

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

http://perltricks.com/article/68/2014/2/13/Cool-new-Perl-feature-postfix-dereferencing

Ну да, давайте потратим еще 10 лет и превратим перл в руби...

https://github.com/peczenyj/MooseX

...и руби в перл.

Понедельник, 17 февраля

Ловушки Perl: Задачи-страшилки про Perl: Истина--ложь, ноль--не ноль

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

    use feature qw/say/;

sub check_value { my $var = @_;

say defined $var ? "defined" : "undefined"; say $var ? "true" : "false"; say $var == 0 ? "zero" : "not a zero";

return; }

Результаты вызова этой функции с разными параметрами очень удивили программиста…

Среда, 12 февраля

Хабрахабр: Метки / perl: Проверяем доступность SIP провайдера


В это статье хочу поделиться одним интересным на мой взгляд способом проверки доступности sip провайдера, или другого устройства, особенно он актуален когда по какой-либо причине нельзя проверить сторону icmp запросами, и основывается на OPTIONS запросах протокола SIP. Кого заинтересовала данная тема прошу под кат. Читать дальше →

Вторник, 11 февраля

Pilat66 blog: Archive of Perl Maven

Источник: Archive of Perl Maven. — статьи об интересных особенностях Perl, на разных языках.

2013-12-21 Perl Arrays

2013-12-20 Цикл for в Perl

2013-10-25 Не открывайте файлы по-старому

2013-10-23 Открытие и чтение текстовых файлов

2013-10-22 Стандартный канал вывода, стандартный канал ошибок и перенаправление в командной строке

2013-10-22 Запуск внешних программ из Perl с помощью system

[...]

Воскресенье, 9 февраля

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

В базе данных проекта хранились разные интересные данные. Например:

    mysql> show create table movie_titles\G
*************************** 1. row ***************************
       Table: movie_titles
Create Table: CREATE TABLE `movie_titles` (
  `movie_hash` bigint(20) unsigned NOT NULL,
  `title` varchar(255) NOT NULL,
  `count` int(10) unsigned NOT NULL,
  `min_year` int(10) unsigned NOT NULL,
  `max_year` int(10) unsigned NOT NULL,
  `min_budget` int(10) unsigned NOT NULL,
  `max_budget` int(10) unsigned NOT NULL,
  `title_lang_id` varchar(2) NOT NULL DEFAULT '',
  PRIMARY KEY (`movie_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> select movie_hash, title from movie_titles order by rand() limit 10; +----------------------+-----------------------------------+ | movie_hash | title | +----------------------+-----------------------------------+ | 14466895222078503050 | Короткие встречи | | 15971437470478867358 | The Intouchables | | 12235011833542755999 | Карнавальная ночь | | 6981806602143484496 | Ben-Hur | | 5919830798737205613 | Зеркало | | 9358350811894903428 | Ikiru | | 15397825164883494235 | City Lights | | 1081902961608193125 | Я шагаю по Москве | | 6154127428560052859 | The Kid | | 16809407873175270375 | Безымянная звезда | +----------------------+-----------------------------------+ 10 rows in set (0.01 sec)

mysql> select movie_hash % 4, count(*) from movie_titles group by 1; +----------------+----------+ | movie_hash % 4 | count(*) | +----------------+----------+ | 0 | 1217109 | | 1 | 1217068 | | 2 | 1217333 | | 3 | 1216358 | +----------------+----------+ 4 rows in set (2.78 sec)

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

    #!/usr/bin/perl

use strict; use warnings;

use DBI; use Parallel::ForkManager; use Log::Log4perl qw(:easy); use utf8; use open ':std' => ':utf8';

Log::Log4perl->easy_init( { level => $INFO, file => ">>process.log", layout => "[%P] %c %d: %m%n", } );

INFO("START"); my $WORKERS = 4; my $pm = Parallel::ForkManager->new($WORKERS);

for my $num (0 .. $WORKERS - 1) { my $pid = $pm->start and next; process_part($num, $WORKERS); $pm->finish; } $pm->wait_all_children; INFO("FINISH"); exit(0);

sub process_part { my ($num, $total) = @_;

INFO("$num/$total - start");

my $dbh = get_dbh();

my $data_to_process = $dbh->selectall_arrayref( "select movie_hash, title from movie_titles where movie_hash % ? = ?", {}, $total, $num ); INFO("to process: ".scalar(@$data_to_process)); for my $record (@$data_to_process) { do_some_heavy_processing($record); } INFO("$num/$total - finish"); }

sub get_dbh { # ... return $dbh; }

sub do_some_heavy_processing { # ... }

И все бы хорошо, но в логах видно кое-что странное с распределением работы по воркерам. Что же случилось?

Чтобы не искать: imover-0.6



Перевел imover на стандартный перловый метод установки:

perl Makefile.PL
make
make test
make install

В стандартном методе используются тесты, так что заодно и тесты сделал. Тесты пока не полные, тестируется только распознавание данных Exif. Нужно еще сделать тесты для распознавания номера файла.

Ну, а раз уж есть тесты, то почему бы не прикрутить систему непрерывной интеграции? Погуглил и открыл для себя Travis CI. Тревис бесплатен для открытых проектов, размещенных на Гитхабе.

При настройке Тревиса пришлось поломать голову с установкой зависимостей. Почему-то при установке модуля Image::ExifTool через cpanm происходит что-то странное - модуль вроде бы успешно устанавливается, но затем, при запуске тестов, модуль почему-то не находится (пример). Полное ощущение, что это какой-то баг Тревиса. В итоге плюнул на cpanm и настроил установку модуля через apt-get.

Теперь на странице проекта на Гитхабе висит приятная глазу зеленая фигулька - :) 

Пятница, 7 февраля

Хабрахабр: Метки / perl: Журнал PragmaticPerl двенадцатый выпуск


Дорогие друзья!
Вышел очередной, двенадцатый номер, журнала о современном Perl.
pragmaticperl.com

Содержимое номера:
Читать дальше →

Мини-портал Perl на Opennet: Доступен Perl-модуль DBD::Pg 3.0.0

Анонсирован выход Perl-модуля DBD::Pg 3.0.0 c реализацией DBI-интерфейса для доступа к PostgreSQL. Требования к минимальным версиям повышены до Perl 5.8.1 и DBI 1.614.

Среда, 5 февраля

Хабрахабр: Метки / perl: Плагин perl-support для vim


Установка плагина


  mkdir ~/.vim
cd ~/.vim
curl http://www.vim.org/scripts/download_script.php?src_id=21048 -o perl-support.zip
unzip perl-support.zip
rm   perl-support.zip
echo "filetype plugin on" >> ~/.vimrc
yum install perl-Perl-Critic  perltidy



Создание нового файла



Далее

Понедельник, 3 февраля

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

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

Суббота, 1 февраля

Moscow.pm 2.0: Техническая офлайн-встреча № 30

6 февраля, первый раз в этом году, но уже не впервые, компания Mail.Ru Group откроеn двери сообществу Moscow.pm (группа московских Perl-программистов).

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

Место и время: 6 февраля с 19.30 до 22.00, переговорная №1 на 2 этаже офиса Mail.Ru Group.

В программе вас ждут доклады:

"Разработка и оптимизация программы на Perl под Raspberry Pi", Илья Чесноков, Разработчик компании «UK2 Group». Небольшой рассказ о том, как Илья программировал на Perl под Raspberry PI: как готовил среду для разработки, разрабатывал и оптимизировал программу для поиска релевантных рекламных объявлений.

"Array VS List", Павел Щербинин, Программист Mail.Ru Group. Quiz на знание особенностей этих структур.

"Круглый стол о вопросах тестирования", Юрий Никулин, Программист Mail.Ru Group. Вы еще не тестируете? Тогда мы идем к вам!!!

Трансляцию мероприятия вы сможете посмотреть на странице: http://corp.mail.ru/Moscow.pm

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

Хабрахабр: Метки / perl: Приглашаем на Moscow PM 06/02


6 февраля, первый раз в этом году, компания Mail.Ru Group откроет двери сообществу Moscow.pm (группа московских Perl-программистов).

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



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

Четверг, 16 января

Сообщество ru_perl в LiveJournal: Unpack chars from C structure

Доброго времени суток всем Перловодам и им сочувствующим.

Ниже приведена С структура psinfo которая находится соответственно в файле psinfo процесса на виртуальной файловой системе /proc/<PID>/...
Значить шаблон для распаковки оной:

unpack("iiiiiiiiiiIiiiiSSa8a8a8Z16Z80iiIIaa3iiiiii", $psinfo);

На сколько я понимаю, в возвращаемом списке, для pr_psargs ( Z80 ) будет указатель на начало массива символов в памяти ( не? ).
Кто-нибудь может помочь разобраться как средствами Perl распаковать в строку список аргументов pr_psargs?

/usr/include/sys/procfs.h:

#define PRARGSZ     80  /* number of chars of arguments */
typedef struct psinfo {
  int pr_flag;    /* process flags (DEPRECATED; do not use) */
  int pr_nlwp;    /* number of active lwps in the process */
  pid_t   pr_pid;     /* unique process id */
  pid_t   pr_ppid;    /* process id of parent */
  pid_t   pr_pgid;    /* pid of process group leader */
  pid_t   pr_sid;     /* session id */
  uid_t   pr_uid;     /* real user id */
  uid_t   pr_euid;    /* effective user id */
  gid_t   pr_gid;     /* real group id */
  gid_t   pr_egid;    /* effective group id */
  uintptr_t pr_addr;  /* address of process */
  size_t  pr_size;    /* size of process image in Kbytes */
  size_t  pr_rssize;  /* resident set size in Kbytes */
  size_t  pr_pad1;
  dev_t   pr_ttydev;  /* controlling tty device (or PRNODEV) */
          /* The following percent numbers are 16-bit binary */
          /* fractions [0 .. 1] with the binary point to the */
          /* right of the high-order bit (1.0 == 0x8000) */
  ushort_t pr_pctcpu; /* % of recent cpu time used by all lwps */
  ushort_t pr_pctmem; /* % of system memory used by process */
  timestruc_t pr_start;   /* process start time, from the epoch */
  timestruc_t pr_time;    /* usr+sys cpu time for this process */
  timestruc_t pr_ctime;   /* usr+sys cpu time for reaped children */
  char    pr_fname[PRFNSZ];   /* name of execed file */
  char    pr_psargs[PRARGSZ]; /* initial characters of arg list */
  int pr_wstat;   /* if zombie, the wait() status */
  int pr_argc;    /* initial argument count */
  uintptr_t pr_argv;  /* address of initial argument vector */
  uintptr_t pr_envp;  /* address of initial environment vector */
  char    pr_dmodel;  /* data model of the process */
  char    pr_pad2[3];
  taskid_t pr_taskid; /* task id */
  projid_t pr_projid; /* project id */
  int pr_nzomb;   /* number of zombie lwps in the process */
  poolid_t pr_poolid; /* pool id */
  zoneid_t pr_zoneid; /* zone id */
  id_t    pr_contract;    /* process contract */
  int pr_filler[1];   /* reserved for future use */
  lwpsinfo_t pr_lwp;  /* information for representative lwp */
} psinfo_t;


Спасибо.

Среда, 15 января

Сообщество ru_perl в LiveJournal: Блог на Mojolicious

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

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

Хабрахабр: Метки / perl: [Из песочницы] Как была взломана локальная версия сайта Intuit.Ru


image

Connection establishment…


Просматривая результаты (довольно таки неутешительные) очередного экзамена на INTUIT-e, я в сотый раз задался вопросом «Ну почему опять этот вопрос не верно?! Ведь на 100% был уверен в ответе…». Проявив толику малодушия, я решил поискать правильные ответы на тесты и был сильно удивлен их отсутствием в открытом доступе. Кое что безусловно было, но это в основном была замануха вида «10 случайных ответов бесплатно, а за остальное будьте добры перечислить нам денежку». Деньги там не большие, но платить за ответы не хотелось и я решил пойти другим путем.
Читать дальше →

Суббота, 11 января

Хабрахабр: Метки / perl: Замена ctags для Perl в mooedit


В редакторе mooedit есть плагин для вывода имён исходника. Использует он стандартный ctags, у которого с Perl работа, мягко говоря, не фонтан. Находит ctags только имена функций, а хотелось бы большего:



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

Четверг, 9 января

Валерий Студенников: Видео с декабрьской встречи moscow.pm

https://www.youtube.com/channel/UCXG2gjCfXDkvg9TfPmNXPIg/videos

Вторник, 7 января

Хабрахабр: Метки / perl: Web Фреймворк по-японски — Amon2




INTRO

В интервью японца Tokuhiro Matsuno прозвучала следующая фраза:
«Некоторыми приложениями нашей компании пользуются более миллиона человек. Все это работает на Amon2


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

Добро пожаловать под кат ...

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

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

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

Суббота, 4 января

Чтобы не искать: imover 0.4



Обновил imover - скрипт для сортировки фото и видеофайлов.

Изменения в версии 0.4:

- Убраны уведомления через Growl. Эта функция стала неактуальна после появления в МакОс встроенного механизма уведомлений (но уведомления через встроенный механизм в скрипте пока не готовы).

- Введены опции "-a", "-c" и "-d". Теперь по умолчанию скрипт только выводит список файлов, копирование и удаление инициируются соответствующими опциями.

- Немного изменен формат вывода, убран лишний шум.

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

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

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

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

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

Эх.

http://advent.perldancer.org/2013

Вот это отлично показывает текущее состояние проекта.

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

XPoint.ru | Программирование::Perl::Основы: Из массива по строкам в массив по столбцам

Добрый день!
Подскажите, пожалуйста, как проще всего реализовать такую задачу: есть файл со строками, в котором значения разделены табом. Нужно создать массивы, в котором значения будут "по столбцам" - массив с первыми значениями, со вторыми и т.д. Условно, количество значений в строке заранее неизвестно, но невелико (от 3 до 10-12). Пробовала разбивать строку на массив и переносить по значению из строки в столбец, но образуется цикл в цикле, который не выдает на выходе нужный массив и не выдает ошибок (use strict и -w я использую)

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

Laziness, Impatience and Hubris: Договор с Европой, - это колониальный договор. Украина одумайся!!!


XPoint.ru | Программирование::Perl::Регулярные выражения: Извлечение подстроки в переменную

Доброго времени суток.

Помогите, пожалуйста, с регулярными выражениями. С ними я сталкивался только для проверки является ли введеная строка в поле на форме почтовым ящиком, теперь нужно решить такую проблему.
имеется html файлик, в нем внутри тегов <head></head> прописаны мета теги.
Например:

<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

Нужно значения Content-Type, text/html, windows-1251 сохранить в переменные для дальнейшего использования с помощью регулярных выражений на Перле.
Т.е., чтобы, например, переменная $x была равна 'Content-Type", $y была равна 'text/html', f $z - 'windows-1251'

Как это сделать сам, увы не представляю. Сам работаю на php, а с перлом пришлось столкнуться в институте
Буду очень признателен ответившим.
Заранее спасибо!

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

Хабрахабр: Метки / perl: 18 декабря языку Perl исполнилось 26 лет


26 лет назад, в декабре 1987 года, Ларри Уолл выпустил первую версию языка в ничего не подозревавший мир. Ссылка на группу usenet comp.sources.unix , где впервые упоминается perl как замена awk и sed.
Кроме этого, можно сказать что perl дал сисадминам больше возможностей, чем shell, и более лёгкий способ достижения цели, чем C.
Потом, когда начали появляться интерактивные сайты, perl застолбил себе нишу на этом поприще. Тяжело было бы делать сайты на CGI при помощи shell скриптов или писать обработку запросов и работу с текстом на C.
Знаменитый девиз perl — «всегда есть несколько способов достичь чего-либо», поскольку perl хорошо демонстрирует, что для любых задач можно найти хорошие решения, если взглянуть на них под другим углом.
Читать дальше →

Среда, 18 декабря

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

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

    use XML::LibXML::XPathContext;
use XML::LibXML;

=head2 parse_wikipedia_categories_xml

Получает на вход скаляр -- xml, полученный из API Википедии

Пример: http://en.wikipedia.org/w/api.php?action=query&prop=categories&titles=XML&format=xml&cllimit=100

<?xml version="1.0"?> <api> <query> <pages> <page pageid="34138" ns="0" title="XML"> <categories> <cl ns="14" title="Category:All articles containing potentially dated statements" /> <cl ns="14" title="Category:Application layer protocols" /> <cl ns="14" title="Category:Articles containing potentially dated statements from 2009" /> ... </categories> </page> </pages> </query> </api>

Результат был бы [ 'Category:All articles containing potentially dated statements', 'Category:Application layer protocols', 'Category:Articles containing potentially dated statements from 2009', ... ]

=cut sub parse_wikipedia_categories_xml { my $xml = shift;

my $xml_doc = XML::LibXML->new()->parse_string($doc); my $xc = XML::LibXML::XPathContext->new($xml_doc); return [ map {$_->to_literal} @{$xc->find("/api/query/pages/page/categories/cl/@title")}]; }

Но что-то здесь не так… Что?

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

Pilat66 blog: Perl — распознавание форматов дат для DateTime

Разные парсеры дат для DateTime модуля.

DateTime::Format::Builder creates DateTime parsers. Many string formats of dates and times are simple and just require a basic regular expression to extract the relevant information. Builder provides a simple way to do this without writing reams of structural code.

DateTime::Format::Builder creates DateTime parsers. Many string formats of dates and [...]

Хабрахабр: Метки / perl: Тюнинг mooedit, работа над ошибками


В первой части добавлялась проверка синтаксиса и форматирование исходников на Perl в mooedit. Если с первым никаких проблем не возникло, то при форматировании пришлось отказаться от вывода ошибок в область уведомлений. Но с тех пор появилась новая версия в ветке unstable-1.1.9x. Ничего особо нестабильного в версии 1.1.97-devel не заметил, разве что заготовки для долгожданного code folding. Но во внутреннем API появилось как минимум одно приятное изменение.

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

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

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

Продолжаю развлекаться с пагинацией.

К клёвому пагинатору написал генератор номеров страниц. Обертка на Data::Pageset, с результатом под CTPP. Придумал как написать совсем универсальный генератор навигации для пагинации. Еще бы (как всегда) было на это время...

ps: а как, интересно, по-русски называется "пагинатор" ?

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

Хабрахабр: Метки / perl: [Из песочницы] Тюнинг mooedit


В работе использую EPIC и недавно начал пробовать Komodo IDE. Но в качестве лёгкого «повседневного» редактора в системе у меня установлен mooedit. Не всё в нём идеально, но некоторые вещи можно подкрутить, о чём и пойдёт речь.

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

Мета

Поиск

Участники

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

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

По-другому

Приборы