понедельник, 25 апреля 2011 г.

среда, 13 апреля 2011 г.

YAML в perl'отворчестве

Задача: вы пишите большой perl-скрипт, который должен выполнять длительные/рутинные операции. Вы взрослый мальчик и не боитесь CPAN. Вы используете самые вкусные модули, которые помогают вам писать быстро и без изобретения велосипедов. Некоторые длительные операции порождают объекты (да, вы совсем взрослый мальчик), с которыми вы и работаете дальше.

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

Решение: Сериализация/десериализация объектов.

В частности, мне подошла реализация YAML из модуля (Хотя тут поговаривают, что JSON захватит мир...)

Достаточный минимум:

use YAML qw(DumpFile LoadFile);

DumpFile('object.yml', $obj);

my $obj = LoadFile('object.yml');

вторник, 12 апреля 2011 г.

Противная ошибка в Crypt::DES

Проблема: При использовании модуля Net::SSH::Perl при попытке выполнения некоторых команд в $ssh->cmd() можно получить следующюю ошибку:

input must be 8 bytes long at /usr/local/lib/perl/5.10.1/Crypt/DES.pm line 57.

Причина: модуль Net::SSH::Perl реализован на чистом Perl и все методы шифрования пользует свои, в том числе и Crypt::DES. А последний плохо дружит в UTF-8, поэтому и отгребает ошибку.

Фикс: добавить 'utf8::downgrade($data);' в проблемный DES.pm прямо перед строкой, на которую ссылается ошибка. Например, в мое случае я заменил

my ($self,$data) = @_;
return Crypt::DES::crypt($data, $data, $self->{'ks'}, 1);


на

my ($self,$data) = @_;
utf8::downgrade($data);
return Crypt::DES::crypt($data, $data, $self->{'ks'}, 1);


Решение нашел на perlmonks.org.

P.S. Та же беда с Cryprt::Blowfish. Фиксится так же.

P.P.S. Можно еще попробовать чиперы другие использовать. Я не пробовал.

воскресенье, 3 апреля 2011 г.

Удаление триггеров bucardo в Postgres

Для сервисных нужд я иногда использую bucardo. Утилита внятная. Четкая документация. Работает и не жужжит :)

У нее есть одна особенность - она не удаляет триггеры из базы, даже если мы убираем ее из обработки. Это было бы не страшно, если бы лишние триггеры не замедляли работу базы. Поэтому для удаления bucardo-триггеров была написана следующая функция:


Исполнение, как обычно:

select strip_bucardo_triggers();