Воскресенье, 27 июля

koorchik's Perl blog: Фотографии с Perl-хакатона в Киеве (2014)

Четверг, 24 июля

Блог программиста — Perl, Ruby, C#: Ведение логов в Catalyst с помощью Log::Dispatch

Log::Dispatch помогает задать — насколько подробно будет осуществляться логирование. Будут ли выводиться в лог только критические ошибки, или будут включены и отладочные сообщения, или уровень, начиная с не критичных предупреждений. Кроме того, с помощью Log::Dispatch удобно задавать объекты для вывода сообщений. Пример использования Log::Dispatch в Catalyst-приложении Как создать Catalyst-приложение с нуля >> app::Log.pm : package […]

perl | Misc: Качалка видео для Collegehumor

Если вы задаетесь вопросом, почему на блоге ничего нового нет? То всё просто - dx умотал в Сиэтл и вернулся оттуда только на днях, именно поэтому вы еще не видели новый PHP обфускатор, обновление PE Bliss и прочие классные вещи. По приезду dx отправился на свой любимый ресурс, Collegehumor, чтобы посмотреть какое-нибудь смешное видео и, […]

Вторник, 15 июля

Хабрахабр: Метки / perl: Как устроена система SMSDirect


image

Здравствуйте, хабражители!

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

We load sixteen tons of software: Sporadic Ops Github Digest #6 (July 14th 2014)

Hi All! 
I'm (again, still fighting with lazyness - and overcoming it) presenting our next digest:

1. cv - Linux tool to show progress for cp, rm, dd, ...
https://github.com/Xfennec/cv
One image is better than thousand words:

2.  powerline-shell - A beautiful and useful prompt for your shell
https://github.com/milkbikis/powerline-shell
Yes, it is nice shell from picture above:


3. awesome-perl - A curated list of awesome Perl frameworks and libraries.
https://github.com/mackee/awesome-perl

At last! Perl!!!!11111

4. awesone-awesome-awesome - A a curated list of curated lists of awesome lists.
https://github.com/t3chnoboy/awesome-awesome-awesome
Ha-ha-ha-ha! Made my day!

And of course, there's awesome-awesome-awesome-awesome list too - for now, containing only list above...

5. More stuff for Python learning:https://github.com/rasbt/python_reference - Useful functions, tutorials, and other Python-related thingshttps://github.com/s16h/py-must-watch - Must-watch videos about Python 

6.  The automated Pokémon speedrunning machine 
https://github.com/kylecoburn/PokeBot
An automated computer program that speedruns Pokémon, which you can run on own computer. I'm not big fan of Pokemon and speedruns, but fan of old consoles. :) Also nice piece of good Lua code with AI.

Понедельник, 14 июля

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

И снова меня мучает вопрос - на что бы перейти с CTPP?

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

Адски нехватает TMPL_macro, и кучи разных мелочей.

При этом сам CTPP сейчас стабилен от слова стабильность и глядя в комитты и открытые тикеты всё ясно.

(для тех, кто меня не знает или не читает, но увидит этот пост в рсс - не надо предлагать TT, ep и прочий треш, особенно если вы не понимаете, почему люди используют CTPP)

upd: и да, не надо предлагать Tenjin. Потому что, для начала, это такой монстр на который вообще непонятно как переходить (хотя там есть плагин для синтаксиса HTML::Template и его, наверное, можно было бы руками допилить), а для конца - судя по странице проекта - там не меньшая стабильность в лучших японских традициях

Пятница, 11 июля

Catalyst - MVC Perl Framework: Содержание

XPoint.ru | Программирование::Perl::Основы: Не равны одинаковые строки

Столкнулся со странной проблемой. Одинаковые строки не равны с точки зрения Perl.
Суть: получаю подпись от платежной формы - это md5_hex-строка в base64. Генерирую ее же в скрипте и просто сравниваю.
Визуально одинаковые строки не проходят проверку if($sign eq $signencoded){}
Почему

'Zjk5NTY0NDExMGI3NTgxNTZhNGYxYzI4YmEwOGZjNTk=' ne
'Zjk5NTY0NDExMGI3NTgxNTZhNGYxYzI4YmEwOGZjNTk='

?

Вторник, 8 июля

Хабрахабр: Метки / perl: Обзор Komodo Edit и Komodo IDE 8


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



Komodo Edit — это кросс-платформенный текстовый редактор, который построен на движке Mozilla, поддерживает большое количество языков. Проект является полностью открытым и распространяется под лицензией MPL (Mozilla Public License). Разработка проекта ведется на GitHub.
Как и у всех, есть авто-дополнение со справочной информацией, поддержка плагинов, макросы, сниппеты.
Главная фича, которая мне понравилась, это удаленное редактирование кода, подобно Sublime если прикрутить к нему плагины для работы по SFTP. В восьмой версии также появился визуальный скроллинг, аналогично тому, который есть в Sublime.

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

Понедельник, 7 июля

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

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

Вторник, 1 июля

Блог программиста — Perl, Ruby, C#: Как нарисовать диаграмму с помощью GD::Graph и perl

Заметки о создании диаграмм с помощью perl и GD::Graph. Примеры кода. Примеры создания диаграмм для фондового рынка. Все примеры протестированы в windows-среде. Я не ставила перед собой цели создать объемное руководство по GD::Graph, поэтому ниже в основном только примеры кода.   Линейные диаграммы Можно выбрать несколько вариантов отрисовки линейных диаграмм: просто линия на графике (модуль […]

Чтобы не искать: Блокировка запуска второго экземпляра программы на Perl

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

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

Варианты решения

Есть несколько методов такой проверки.

1) Проверка существования пид-файла

Скрипт запускается и проверяет наличие пид-файла. Если пид-файл уже существует - значит, другой экземпляр скрипта уже запущен и второй раз запускаться не следует. Если же пид-файла не существует, то скрипт создает пид-файл и начинает работать.

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

2) Проверка наличия пида в списке процессов

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

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

3) Блокировка пид-файла

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

Этот метод не имеет проблем, возникающих в предыдущих двух методах:

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

Таким образом, этот метод гарантированно обеспечивает блокировку запуска второго экземпляра программы.

Метод блокировки пид-файла

Рассмотрим подробно реализацию этого метода.

#!/usr/bin/perl

use Carp; use Fcntl qw(:DEFAULT :flock);

check_proc('/tmp/testscript.pid') and die "Скрипт уже запущен, запуск дубля отклонен!\n";

# Тут находится код, # который должен исполняться # в единственном экземпляре sleep 15;

# Проверка существования запущенного экземпляра sub check_proc { my ($file) = @_; my $result;

sysopen LOCK, $file, O_RDWR|O_CREAT or croak "Невозможно открыть файл $file: $!";

if ( flock LOCK, LOCK_EX|LOCK_NB ) { truncate LOCK, 0 or croak "Невозможно усечь файл $file: $!";

my $old_fh = select LOCK; $| = 1; select $old_fh;

print LOCK $$; } else { $result = <LOCK>;

if (defined $result) { chomp $result; } else { carp "Отсутствует PID в пид-файле $file"; $result = '0 but true'; } }

return $result; }


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

Обратите внимание, что в этой строке функции check_proc и die объединены через условный оператор and. Обычно подобные связки делаются через оператор or, но в нашем случае логика связки другая - мы как бы говорим скрипту: "Осознай бессмысленность своего существования и умри!".

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

Функция check_proc

Теперь разберем построчно саму функцию check_proc.

1) Функция sysopen открывает файл на чтение и запись.

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

Функция sysopen c флагами O_RDWR|O_CREAT открывают файл именно в неразрушающем режиме. Флаг O_RDWR означает открытие одновременно на чтение и запись, флаг O_CREAT создает файл, если его не существует на момент открытия. Флаги импортируются из модуля Fcntl (можно обойтись без Fcntl, если использовать численные значения флагов).

2) Функция flock блокирует файл.

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

Если функция flock обнаруживает, что кто-то другой уже заблокировал файл, то она будет ждать, пока блокировка не будет снята. Такое поведение не подходит для нашей проверки. Нам не нужно ждать освобождения файла, нам нужно, чтобы при обнаружении блокировки функция check_proc сразу вернула положительный результат. Для этого нужно использовать флаг LOCK_NB.

Дальнейшее поведение зависит от того, удалось ли получить блокировку (3) или не удалось (4).

3а) Функция truncate очищает файл.

Поскольку мы открыли файл в неразрушающем режиме, то старое содержимое файла осталось нетронутым. Это содержимое нам не нужно, и даже может мешать, поэтому файл нужно очистить.

3б) Комбинация функций select и переменной $| отключает буферизацию.

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

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

4а) Читаем пид из пид-файла

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

Подходящим значением в этом случае будет "истинный ноль". Это магическое значение (которых в перле много), которое в числовом контексте равно нулю, а в булевом равно истине. Вариантов записи истинного ноля несколько, я использую вариант "0 but true".

Заключение

Метод блокировки пид-файла является самым надежным способом обеспечения работы программы в единственном экземпляре.

Функцию check_proc и подключение модуля Fcntl можно вынести в отдельный модуль (например, c названием MacLeod.pm), в этом случае обеспечение работы программы в одном экземпляре будет делаться всего в две строчки:

use MacLeod;

check_proc('/tmp/testscript.pid') and die "Скрипт уже запущен, запуск дубля отклонен!\n";


Либо, проверку можно сделать немного более развернутой:

use MacLeod;

my $pid = check_proc('/tmp/testscript.pid');

if ($pid) { die "Скрипт с пидом $pid уже запущен, запуск дубля отклонен!\n"; } else { print "Поехали!\n"; }


В этом случае возвращаемый функцией check_proc пид запущенного процесса записывается в переменную $pid и его можно вывести в сообщении.

Понедельник, 30 июня

Сообщество ru_perl в LiveJournal: Автоматический перезапуск приложения при разработке на Perl Dancer

Дабы разбавить серьезные посты, а может кому пригодится.
Сочинил удобную фичу, которая при изменении файлов ( определенных, при изменении которых надо перезапустить приложение), рестартует автоматом это самое приложение app.pl.


#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use File::Modified;
use Proc::Background;
use DateTime;
my $proc1 = Proc::Background->new("perl E:/path/to/your/applications/bin/app.pl");
my $d = File::Modified->new(files=>['path/to/your/checked/file/config.yml','path/to/your/checked/file/yourapplication.pm']);

print "status=".$proc1->alive."\n";
while (1) {
  my (@changes) = $d->changed;

      if (@changes) {
      my $dt = DateTime->now;
      $dt->set_time_zone( 'Asia/Irkutsk' );
      print $dt;
print "$_ was changed\n" for @changes;
      print "stopping...\n";
      print "status=".$proc1->die."\n";
      print "starting...\n";
   $proc1 = Proc::Background->new("perl E:/path/to/your/applications/bin/app.pl");
      print "status=".$proc1->alive."\n";
      $d->update();
  };
sleep 1;
};

Хабрахабр: Метки / perl: Документация Mojolicious: Потерянные Главы


Это продолжение серии статей о веб-фреймворке для Perl — Mojolicious: первая часть.

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

Асинхронность: синхронизируем с помощью Mojo::IOLoop::Delay


Mojo::IOLoop::Delay предоставляет механизм, обеспечивающий для асинхронно выполняющихся callback-ов:

  • описание последовательно выполняющихся операций без «лапши» callback-ов
  • передачу результатов из callback-а(ов) текущего шага на следующий
  • общие данные для callback-ов, объединённых в одну задачу
  • синхронизацию групп callback-ов
  • перехват и обработку исключений в callback-ах

Используемые термины:

  • (асинхронная) операция — обычно это вызов асинхронной функции вроде  таймера или выкачивания url, которой необходимо передать callback
  • шаг — callback, который анализирует данные полученные с предыдущего  шага (если это не первый шаг), и запускает одну или несколько новых  операций, либо возвращает финальный результат (если это последний шаг)
  • задача — список шагов, которые должны выполняться последовательно  (т.е. следующий шаг вызывается только после того, как все операции  запущенные на предыдущем шаге завершаются)

Альтернатива Promises

Это альтернативный подход к проблеме, обычно решаемой с помощью Promise/Deferred или Future. Вот приблизительное сравнение со спецификацией Promises/A+Читать дальше →

Воскресенье, 29 июня

flamey: Tesla Model S REST API

flamey поделился ссылкой

Tesla Model S REST API

This is unofficial documentation of the Tesla Model S REST API used by the iOS and Android apps. It features functionality to monitor and control the Model S remotely.

/vehicles/{id}/command/honk_horn
-- Honk the horn once

Пятница, 27 июня

Хабрахабр: Метки / perl: Мониторинг Java приложений в Zabbix, кастомизируем JavaGateway для JMX LLD


Вступление


    В данной статье я расскажу, как можно немного кастомизировать Zabbix JavaGateway для наиболее удобного низко уровневого обнаружения JMX метрик. Здесь github.com/mfocuz/zabbix_plugins/tree/master/jmx_discovery можно взять патч на версию 2.0.11 и посмотреть примеры external скриптов. Но обо всем по порядку.

    С версии 2.0 в Zabbix появилась нативная поддержка мониторинга Java приложений через JMX. Но возможно не все знают, что кроме сбора метрик мы можем их также дискаверить в Zabbix из коробки. В документации этот момент либо пропустили, либо посчитали фичу несовсем готовой(хотя может я просто не нашел этого в доке?), но эта фича там есть, и, на мой взляд, она действительно не совсем готова. Хотя я не уверен что она вообще работает, до тестирования не дошло.
Читать дальше →

Четверг, 26 июня

flamey: Проект на Kickstarter-е с цклью привести WebGUI (perl) к простоте и красоте WordPress-а

Считаю очень важно чтобы появилось простая в установке и пользовании качественная CMS на Perl. Про WebGUI ничего не знаю, но надеюсь чувак знает что делает :)

Я скромно поучаствую.

https://www.kickstarter.com/projects/2083389021/create-perl-competition-to-the-php-content-managem

 

 

Вторник, 24 июня

Хабрахабр: Метки / perl: Документация Mojolicious: Потерянные Главы


Mojolicious — восхитительный современный веб-фреймворк для Perl. Из недостатков я могу назвать только два: политика в отношении обратной совместимости и документация.

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

Содержание


  1. Недостатки
  2. Роутинг: внутреннее устройство
  3. Роутинг: настройка
  4. Параметры HTTP-запроса
  5. Парсинг
  6. Tips & Tricks
    1. Поддержка неблокирующих приложений в режиме CGI
    2. Как работает Mojo::UserAgent при тестировании своего приложения
    3. ojo и Mojolicious::Lite
    4. Переменные окружения


Другие статьи в этой серии



Недостатки


В официальном FAQ написано: "… we will always deprecate a feature before removing or changing it in incompatible ways between major releases … as long as you are not using anything marked experimental, untested or undocumented, you can always count on backwards compatibility …". Для начала, вторая фраза противоречит первой. Далее, вот цитата из Guides::Contributing «Features may only be changed in a major release or after being deprecated for at least 3 months.». Честно говоря, 3 месяца это и так смешной срок когда речь идёт об обратной совместимости, но похоже что даже этот срок соблюдается не всегда (поддержку «X-Forwarded-HTTPS» сделали deprecated два месяца назад, а удалили месяц назад — да, это был «major release» поэтому формально правила не нарушены, но общее отношение к обратной совместимости вполне показательно). Как много разработчиков обновляет фреймворк чаще чем раз в 3 месяца, да ещё и при этом тщательно вычитывает Changes или логи своего приложения на предмет deprecated-предупреждений? При этом, в течении последнего года было deprecated примерно 20 функций/фич. На практике, конечно, всё не так плохо, как это звучит — что-то ломается не так уж часто (лично меня за последний год коснулась только замена $app->secret() на $app->secrets()). Но факт остаётся фактом — обратную совместимость ломают, ломают часто, причём без по-настоящему веских причин: например, в случае с secret() абсолютно ничего не мешало добавить в код
sub secret { shift->secrets([shift]) }

либо просто добавить поддержку дополнительных параметров в secret() вместо добавления новой функции secrets() реализовав нужную фичу вообще не ломая совместимость.

Что касается документации, то многие считают её отличной, даже одним из серьёзных достоинств Mojolicious, но никак не недостатком. Проблема с документацией в том, что она вся сосредоточена на примерах. Это реально круто, когда ты начинаешь изучать фреймворк. Это экономит кучу времени, когда тебе нужно сделать фичу и ты быстро гуглишь пример аналогичной фичи в официальных guides. Но как только ты выходишь за рамки стандартных задач и возникает необходимость понять, как что-то устроено идеологически или архитектурно, какие конкретно параметры может принимать эта функция и что конкретно она может возвращать в разных ситуациях — выясняется, что для многих модулей Mojolicious такая документация отсутствует в принципе. И не потому, что эта информация относится к «недокументированным возможностям» — почти всё это мельком упоминается здесь и там в разных примерах, а значит считается «документированным». Нередко есть несколько способов получить доступ к определённым данным (параметры запроса, тело ответа, etc.) но не описано чем они друг от друга отличаются и в каких ситуациях правильнее пользоваться какими способами. И последнее — алфавитный порядок функций в доке, серьёзно?! Нет, я понимаю, все люди разные и кому-то наверняка это удобно, но многим всё-таки на порядок проще воспринимать документацию в которой функции сгруппированы по задачам. (Хотя в коде, особенно при чтении его через браузер, где не так удобно пользоваться поиском как в Vim, алфавитный порядок функций неожиданно оказался довольно удобным — кроме new/DESTROY/AUTOLOAD — их всё-таки лучше размещать в начале.) В результате, чтобы разобраться приходится вычитывать код (некоторые предпочитают вместо этого смотреть тесты!), что не так просто — во-первых он не является эталоном читабельности: автор любит использовать фишки перла, которые позволяют писать код компактно (и нередко такой код быстрее работает), но читабельность это ухудшает; во-вторых активное использование и наследования и обмена событиями между объектами усложняет понимание того, что и как происходит внутри 104 классов, из которых состоит Mojolicious-5.

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

Пятница, 20 июня

flamey: World Cup in JSON

flamey поделился ссылкой

World Cup in JSON

  

use warnings;
use strict;
use JSON;
use LWP::Simple;

my $json = get( 'http://worldcup.sfg.io/matches' ) or die "Could not access Results!\n";
my $decoded = decode_json($json);

for my $match ( @{$decoded} ) {
  if ( $match->{status} eq "completed" ) {
    printf "%12s %d:%d %s\n", $match->{home_team}{country},$match->{home_team}{goals},$match->{away_team}{goals},$match->{away_team}{country};
  }
}

Пятница, 13 июня

Laziness, Impatience and Hubris: COW in perl-5.20

В perl-5.20 реализовали механизм копирования при записи (copy-on-write) для строк. Теперь при присвоении одному скаляру значения другого, копирования буфера строки сразу не происходит. Это значительно повышает производительность и снимает необходимость передачи аргументов функций по ссылке (если они не будут изменяться).

Сравним скорость вызова подпрограмм с различными комбинация передачи параметра и возвращения результата для предыдущей версии perl и для версии с COW:
> perlbrew use perl-5.18.2
> perl ref_and_val.pl
Rate val -> val val -> ref ref -> val ref -> ref
val -> val 68213/s -- -51% -51% -97%
val -> ref 138122/s 102% -- -1% -93%
ref -> val 139276/s 104% 1% -- -93%
ref -> ref 2000000/s 2832% 1348% 1336% --

> perlbrew use perl-5.20.0
> perl ref_and_val.pl
(warning: too few iterations for a reliable count)
(warning: too few iterations for a reliable count)
(warning: too few iterations for a reliable count)
Rate ref -> val val -> val ref -> ref val -> ref
ref -> val 2083333/s -- -17% -21% -29%
val -> val 2500000/s 20% -- -5% -15%
ref -> ref 2631579/s 26% 5% -- -11%
val -> ref 2941176/s 41% 18% 12% --
Результаты впечатляют, так как длина тестируемой строки 100000 символов!

А теперь возьмем реальное приложение. Оно сетевое, занимается "перекладыванием байтиков" с одного источника в 4 на основе srs32.
Ниже приведены количество запрос в секунду для 3 различных типов запросов в простом и pipeline режимах. Уточнение: сеть не является узким местом.
                 1     2     3
perl-5.14.4 7272 6134 3886
perl-5.18.2 7610 6439 4139
perl-5.20.0 7581 6459 4338

pipeline mode:
perl-5.14.4 21141 13869 5998
perl-5.18.2 21367 14025 6269
perl-5.20.0 21598 14367 6518
Как видим, в реальном приложении выигрыш от COW не заметен.

Вторник, 10 июня

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

В файле хранится статистика по частоте слов в некотором тексте:

    > head -n 20 file.in
      1 printed
      1 sole
      5 open
      4 separate
      1 almost
     10 some
      2 entire
      1 preferred
      1 theargument
      5 sysv
     47 foo
    116 to
      2 very
      1 archaic
     48 not
      8 returns
      1 crudely
     10 function
      1 conversion
      9 must

  

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

Получился вот такой однострочник:

    > cat file.in | perl -ape 'next if $F[0] < 10; $l = length($F[1]); next if ($l<3||$l>8);' > file.out

  

Но все пошло не так, как рассчитывал программист…

Пятница, 6 июня

Сообщество ru_perl в LiveJournal: Log::Log4perl и semget

Пример из CPAN, один в один:

use Log::Log4perl;

my $conf = qq ( log4perl.category = INFO, Syncer # File appender (unsynchronized) log4perl.appender.Logfile = Log::Log4perl::Appender::File log4perl.appender.Logfile.autoflush = 1 log4perl.appender.Logfile.filename = ./test.log log4perl.appender.Logfile.mode = truncate log4perl.appender.Logfile.layout = SimpleLayout # Synchronizing appender, using the file appender above log4perl.appender.Syncer = Log::Log4perl::Appender::Synchronized log4perl.appender.Syncer.appender = Logfile );

Log::Log4perl->init(\$conf);



Результат:
semget(1882483807) failed:  at /usr/share/perl5/Log/Log4perl/Util/Semaphore.pm line 64.

Ы?

Среда, 4 июня

Perl на ya.ru: Представлен Perl::Lint, статический анализатор кода для языка Perl

viking-coyote поделился ссылкой

Представлен Perl::Lint, статический анализатор кода для языка Perl

Мини-портал Perl на Opennet: Представлен Perl::Lint, статический анализатор кода для языка Perl

В рамках проекта Perl::Lint началась работа по созданию статического анализатора исходных текстов на языке Perl, позволяющего выполнять проверку корректности кода, без его выполнения. Основным отличием от уже существующих анализаторов, таких как Perl-Critic, является очень высокая скорость проверки кода, дающая возможность проверять код в режиме реального времени, что позволяет использовать Perl::Lint для информирования об ошибках по мере написания кода в редакторах и интегрированных средах разработки. Ускорение достигается за счёт применения для разбора кода модулей Compiler::Lexer и Compiler::Parser, вместо PPI. Работа ведётся по гранту организации Perl Foundation и завершена на 30%.

Среда, 28 мая

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

Вышел perl 5.20. У кого-то сверкнуло просветление в голове и теперь можно удобно получать переменные в функциях.

Теперь Function::Parameters не нужен (а я все ломаю голову как заставить Sublime нормально поддерживать его синтаксис). Хотя синтаксически оно все равно не идеально - теперь есть пересечение со старым способоом задания необходимых и опциональных переменных при вызове функции и один способ не полностью соответствует другому (в терминах перла - сигнатуры функций и прототипы). Вот это вот вообще прелестно: "To avoid ambiguity, when signatures are enabled the special syntax for prototypes is disabled.".

Постфиксное разыменование - тоже хорошая штука, но с таким синтаксисом код станет только страшнее.

Остальное не так критично, просто в мелочах сделали немного лучше. Пожалуй, подожду 5.20.1 и попробую в продакшене на это перейти (сейчас у нас везде 5.14).

Вторник, 27 мая

Мини-портал Perl на Opennet: Релиз интерпретатора языка программирования Perl 5.20

После года разработки представлена новая стабильная ветка языка программирования Perl - 5.20. При подготовке нового выпуска было изменено около 470 тыс. строк кода, изменения затронули 2900 файлов, в разработке приняли участие 124 разработчика.

Вторник, 20 мая

crux's blog: Протокол HTTP/2 и его реализация

Работа над новым протоколом для всемирной сети находится на завершающем этапе. HTTP/2 должен решить многие застарелые проблемы HTTP/1.1 и дать возможность Интернету развиваться дальше. Есть довольно хорошая статья «http2 explained» , посвященная новому протоколу HTTP/2, разъясняющая предпосылки его создания и наглядно демонстрирующая его возможности и принципы работы. Статья, тем не менее, не содержит какой-либо детальной технической спецификации протокола. Есть также отличная книга Ilya Grigorik «High-Performance Browser Networking» , веб-версия которой свободно доступна , и которая также содержит интересные детали о прародителе HTTP/2 - SPDY и самом HTTP/2 (правда уже немного устаревшие). После её прочтения я вдохновился создать реализацию HTTP/2-протокола и в процессе досконально изучить новый протокол. Эта статья - небольшой отчёт за последние два месяца убитого свободного времени.
Комментарии(0)

Пятница, 16 мая

Хабрахабр: Метки / perl: Право на свой код


Германская консервативная система ценностей определяла социальную роль женщины тремя «К»: Kinder, Küche, Kirche (дети, кухня, церковь). Как это ни странно, но атавизмы того времени живы и по сей день – многие профессии традиционно считаются чисто мужскими, и сломить эту идеологическую преграду удаётся не многим.

Далеко ходить не надо, соотношение женского пола к мужскому среди жителей Хабрахабра – меньше чем 1 к 10 (На момент написания поста — 101448 мужчин против 7772 женщин).

Большая часть ИТ-коллективов похожа на мужской монастырь. Девушки встречаются в рекламе, маркетинге, чуть реже в дизайне и графике, но совсем редко в «святая святых» – в программировании.

В большом коллективе Mail.Ru девушек тоже не так много, но они есть. И у одной из них – Екатерины Трефиловой lecharton– разработчика из Афиши Mail.Ru, мы решили взять небольшое интервью.

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

Четверг, 15 мая

Сообщество ru_perl в LiveJournal: Ищу работу

Удалённо, фуллтайм, с белой зарплатой и оформлением.

Вторник, 13 мая

Записки программиста — Perl: Ломаем капчу — сбор данных и их предварительный анализ

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

Понедельник, 12 мая

Записки программиста — Perl: Астрологи объявили неделю взлома капчи

У каждого из нас, само собой разумеется, есть богатейший опыт распознавания капч. Капчи бывают разные — всевозможные логические («кликните на синий кружочек», «на каких картинках изображены котята?» и так далее), звуковые, есть даже капчи, предлагающие выбрать самую красивую фотографию. Но самыми распространенными на сегодняшний день остаются капчи с искаженным изображением букв и/или цифр. На этой [...]

Среда, 7 мая

Сообщество ru_perl в LiveJournal: Загрузка модуля после запуска скрипта

Добрый день!
Задача следующая.
Запускается скриптy на перле, примерно так :
test_run.pl -test test1
test_run.pl -test test2
-------
test_run.pl -test testN
ну и так далее.
test1,test2,...,testN - тесты, написанные на перле и запускаемые из test_run.pl.
Хотелось бы,чтобы они (тесты) были реализованы в виде модулей и запускались без system call.

Вопрос. Как сделать так,чтобы в теле основной программы было бы написано что-то вроде
use $test;
И переменная test определялась бы соответствующим параметром командной строки после запуска test_run.pl?

Вторник, 6 мая

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

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

Понедельник, 5 мая

perlito: Есть ли русская литература по mod_perl?

07:57 05.05.2014
Есть ли русская литература по mod_perl?

Сегодня хотел начать изучение mod_perl.

Гуглил, гуглил а книг на русском не нашел, только пару постов в интернете про так CGI скрипты запускать в режиме mod_perl.

Да и на английском что то не густо, все книги старые, о mod_perl 1.0, относительно новая только офицальная документация на perl.apache.org, длинная такая вся на английском, но зато про mod_perl 2.0 есть.

 

В связи с этим у меня образовалось два вопроса 

1. стоит ли изучать mod_perl 1.0

2. нет ли в сети (ну или хоть печатная) на русском книга на эту тему?

 

За помошь благодарю.


read more at блог Perlito

perlito: Установка некоторых модулей

07:57 05.05.2014
Установка некоторых модулей


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


read more at блог Perlito

perlito: Есть ли русская литература по mod_perl?

07:57 05.05.2014
Есть ли русская литература по mod_perl?

Сегодня хотел начать изучение mod_perl.

Гуглил, гуглил а книг на русском не нашел, только пару постов в интернете про так CGI скрипты запускать в режиме mod_perl.

Да и на английском что то не густо, все книги старые, о mod_perl 1.0, относительно новая только офицальная документация на perl.apache.org, длинная такая вся на английском, но зато про mod_perl 2.0 есть.

 

В связи с этим у меня образовалось два вопроса 

1. стоит ли изучать mod_perl 1.0

2. нет ли в сети (ну или хоть печатная) на русском книга на эту тему?

 

За помошь благодарю.


read more at блог Perlito

perlito: Регулярки и cp1251

07:57 05.05.2014
Регулярки и cp1251


Сегодня к моему сожалению обанружыл что при использовании cp1251 модификатор /i не работает для русских букв. Иными словами если у вас есть строка в cp1521

$string = "Какая то строка";


то регулярка

/какая/i

 

ничего не найдет, хотя в utf-8  она бы отлично сработала. 

 


read more at блог Perlito

perlito: Глава 9. Сервер разработки и perlbal

07:57 05.05.2014
Глава 9. Сервер разработки и perlbal

Финальная опция разработки использование сервера разработки myapp_server.pl. Этот сервер в действительности никак не ограничен; вы можете выставить его в Интернет и ваше приложение будет нормально работать. Основная проблема та же что и при mod_perl; поставка HTML результата (или картинками и т. п.) клиенту, будет связывать память системы без необходимости. А также, поскольку сервер разработки может обрабатывать лишь одно соединение за раз, пользователи будут ждать на линии для использования вашего приложения, что неприемлемо, если вы не создаете что то подобное настольного веб приложения.

 


read more at блог Perlito

perlito: Регулярки и cp1251

07:57 05.05.2014
Регулярки и cp1251


Сегодня к моему сожалению обанружыл что при использовании cp1251 модификатор /i не работает для русских букв. Иными словами если у вас есть строка в cp1521

$string = "Какая то строка";


то регулярка

/какая/i

 

ничего не найдет, хотя в utf-8  она бы отлично сработала. 

 


read more at блог Perlito

perlito: Установка некоторых модулей

07:57 05.05.2014
Установка некоторых модулей


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


read more at блог Perlito

perlito: Есть ли русская литература по mod_perl?

07:57 05.05.2014
Есть ли русская литература по mod_perl?

Сегодня хотел начать изучение mod_perl.

Гуглил, гуглил а книг на русском не нашел, только пару постов в интернете про так CGI скрипты запускать в режиме mod_perl.

Да и на английском что то не густо, все книги старые, о mod_perl 1.0, относительно новая только офицальная документация на perl.apache.org, длинная такая вся на английском, но зато про mod_perl 2.0 есть.

 

В связи с этим у меня образовалось два вопроса 

1. стоит ли изучать mod_perl 1.0

2. нет ли в сети (ну или хоть печатная) на русском книга на эту тему?

 

За помошь благодарю.


read more at блог Perlito

perlito: Глава 9. Настройка веб сервера

07:57 05.05.2014
Глава 9. Настройка веб сервера

Как только у вас пудет работающее приложение на боевой машине, то вы готовы к указанию реального веб сервера на него. Какой сервер вы используете обычно определяетя тем что ваши другие приложения используют. Если у вас уже установлен Apache с mod_perl то используйте его. Если вы не обслуживаете много пользователей, то вам вероятно будет достаточно и сервера разработки поставляемого с Catalyst. Если вы устали от Apache то можете использовать lighttpd с FastCGI. Catalyst

пытается сделать работу mod_perl, FastCGI,

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


read more at блог Perlito

perlito: Установка некоторых модулей

07:57 05.05.2014
Установка некоторых модулей


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


read more at блог Perlito

perlito: Глава 9. Управление версий

07:57 05.05.2014
Глава 9. Управление версий

Базы данных

 

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

Class::Schema::Versioned который поможет с версиямы схем. Он доступен по адресу:

 

http://search.cpan.org/~ash/DBIx-Class-0.08013/lib/DBIx/Class/Schema/Versioned.pm.

 

 

Управление версий

 


read more at блог Perlito

perlito: Глава 9. Настройка веб сервера (продолжение)

07:57 05.05.2014
Глава 9. Настройка веб сервера (продолжение)

Вопросы производительности

 

К несчастью, описанная ранее установка mod_perl не идеальна. mod_perl загружает все ваше приложение в каждый процесс Apache. Это означает, что когда процесс Apache поставляет dial-up пользователю 200M видео (ну или 20K HTML, суть остается та же), то ваше приложение впустую использует потоковые байты, вместо обработки запросов. На сайтах с большим трафиком это приводит к тому что требуется чрезмерная производительность, поскольку процессы приложения связанны предоставлением данных (и вы не можете запустить больше процессов приложений поскольку у вас кончилась память).


read more at блог Perlito

perlito: Глава 9. Настройка веб сервера (продолжение)

07:57 05.05.2014
Глава 9. Настройка веб сервера (продолжение)

Статичный контент

 

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

Alias /myapp/static /.../myapp/root/static

 

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

 

mod_perl

 


read more at блог Perlito

perlito: Глава 9. Настройка веб сервера

07:57 05.05.2014
Глава 9. Настройка веб сервера

Как только у вас пудет работающее приложение на боевой машине, то вы готовы к указанию реального веб сервера на него. Какой сервер вы используете обычно определяетя тем что ваши другие приложения используют. Если у вас уже установлен Apache с mod_perl то используйте его. Если вы не обслуживаете много пользователей, то вам вероятно будет достаточно и сервера разработки поставляемого с Catalyst. Если вы устали от Apache то можете использовать lighttpd с FastCGI. Catalyst

пытается сделать работу mod_perl, FastCGI,

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


read more at блог Perlito

Четверг, 1 мая

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

В файле domains.txt хранится список доменных имен:

    > head domains.txt
www.ru
www.com
www.yandex.ru
yandex.ru
www.liruoko.ru
liruoko.ru
perltrap.com
google.com

  

Некоторые домены начинаются с www., некоторые – нет. Программисту понадобилось получить уникализированный список, причем имена с префиксом www и без него надо “склеить” (yandex.ru и www.yandex.ru посчитать один раз, как yandex.ru). Однако просто удалять www. в начале имени нельзя, так как есть домен www.ru и подобные, и программист решил воспользоваться заглядывающими вперед шаблонами.

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

    perl -lne 's!^www\.(?![^\.]+$)!!;print;' domains.txt |sort |uniq

  

Что с ним не так?

Суббота, 26 апреля

grey_olli: perl cpan question

perl -MCPAN -e shell

При первом запуске после конфигурации показывает набор переменных для добавления в ~/.bashrc чтобы пользоваться поставленным из CPAN, а не из системы.

Два вопроса:

1. Какой командой получить этот набор переменных ещё раз?
После 'o conf init' и указания сделать всё по умолчанию набор переменных не выдаётся.

2. Я правильно понимаю, что попытка указать установочной директорию системных perl модулей cpan инсталятору это худшее, что можно придумать? По моим представлениям так можно будет только сломать системный perl. Я прав?

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

Shoor/нал: Отображение закодированной кириллицы в отладчике

Перловый модуль  Data::Dumper, который умеет преобразовывать хитро завёрнутые структуры данных (хотя всякие умеет) в вид, хоть как-то пригодный для чтения, а также Data::Dumper::Perltidy, который делает этот вид ещё лучше, избавляя получившийся текст от безумного количества пробелов. Однако кириллица, добытая при преобразовании JSON-файла в перловый объект, выподится последовательностями видав последовательностями вида \x43e\x43f\x430.

Один из возможных путей обхода — расшифровывать: можно объявить функцию

sub unx 
    my @out;
    while ( local $_ = shift ) 
        s/\\x\([0-9a-z]+)\/chr hex $1/ge;
        push @out, $_;
    
    return @out;


и потом её вызывать:
print unx '\x421\x442\x430\x440\x448\x438\x439';

Можно, записав её в одну строку, применять её и в отладчике:
  DB‹1› sub unxmy@out;while(local$_=shift)s/\\x\([0-9a-z]+)\/chr hex $1/ge;push@out,$_return@out
  DB‹2› p unx '\x421\x442\x430\x440\x448\x438\x439

С другой стороны, объекту, объявленному в модуле JOSM, вроде, можно указать, как отображать не-ASCII данные:
my $json = JSON->new->ascii(0)->utf8;

Однако на преобразование JOSM в объект это не влияет.

Мета

Поиск

Участники

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

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

По-другому

Приборы