dil: (Default)
2012-12-19 11:15 am

Pathologically Eclectic Rubbish Lister: 25 лет

Говорят, perl’у исполнилось 25 лет..

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
2012-03-16 03:26 pm

О приоритетах

Из любимого юмористического сообщества ru_php я сегодня узнал, что в PHP логические операторы “and” и “or” имеют гораздо более низкий приоритет, чем “&&” и “||”.

Каково же было моё удивление, когда я обнаружил, что и в перле дело обстоит точно так же. То есть, 1 and 1 || 0 and 0 — это вовсе не то же самое, что 1 and 1 or  0 and 0.

Я, правда, or применял исключительно в конструкциях “foo() or die()”, поэтому на эти грабли ни разу не наступил. Но это ж надо было ТАКОЕ придумать..

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
2012-03-03 03:29 pm

GPG и perl. Каверзная задачка

Возникла у меня тут необходимость запускать gpg в пакетном режиме, без взаимодействия с пользователем. Точнее, пользователь должен один раз ввести пароль от ключа, и больше не вмешиваться.

Нашел модуль GnuPG, но оказалось, что он полагается на shared memory, а в нынешнем gpg2 эта фича не поддерживается. Теперь надо а gpg все дополнительные данные скармливать через файловые дескрипторы. Пробую запустить из комнадной строки:

/usr/bin/gpg --decrypt --batch --passphrase-fd 3 encrypted.file 3<password.file

Работает. Ну ладно, будем запускать  то же самое из перла, только без файла, а напрямую скармливая пароль через пайп.

В целом вроде бы тоже работает, gpg запускается, зашифрованный файл находит, даже показывает, каким ключом он зашифрован, но… расшифровать не может, поскольку не видит пароля:

can't connect to `/home/dil/.gnupg/S.gpg-agent': No such file or directory
gpg: encrypted with 2048-bit RSA key, ID 673056FF, created 2012-02-17
"юзер <почтовый адрес>"
gpg: public key decryption failed: Bad passphrase
gpg: decryption failed: No secret key

Пробую напечатать пароль  непосредственно в перле из дочернего процесса, прочитав его из пайпа. Нормально читается и печатается. А gpg из того же пайпа этот пароль в упор не видит.

Вопрос для продвинутых программистов и сисадминов: где засада?

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

Исходник на перле под катом.

Read the rest of this entry » )

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
2011-04-07 06:13 pm
Entry tags:

Грабли XMLные

Перенесли тут как-то перловый скриптик на другую  машину. А он возьми да и сломайся. И пошёл я смотреть, отчего это. Ругался он при попытке распарсить XML-файл (да-да, тем самым XML::XPath->new(), про который был предыдущий пост) но ругался довольно странно:

error in processing external entity reference at line 2, column 58, byte 80:
<?xml version="1.0"?>
<!DOCTYPE DataAlertService SYSTEM "DataAlertService.dtd">
=======================================================^

Потратив всего каких-то полдня, я понял, что ругается он вовсе не на указанное место, и даже не на сам этот XML. А на DTD. Потратив ещё полдня, я понял, что на этой машине XML-парсер тупо не понимает parameter entities в DTD.
Это макросы типа <!ENTITY % id 'id CDATA #REQUIRED'>, которые потом можно в том же DTD использовать: <!ATTLIST Official %id; ...

Вот на прежней древней солярке понимал, на моей десктопной убунте понимает, а на этой грёбанной CentOS (5.5, последний релиз, все дела) – не понимает. И после этого мне ещё будут рассказывать о прелестях этих ваших редхатов..

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
2010-05-28 09:45 pm

Страшной ненависти к быдлокодерам пост

А сегодня ночью один скриптик перловый, запускаемый из крона, не отработал. Бывает. Ну я его перезапустил. А он чего-то думает долго. Минут через десять мне надоело ждать и я посмотрел в код.  А там ТАКОЕ… что прям хоть целиком в [info]code_wtf отправляй.

Read the rest of this entry » )

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
2009-08-12 12:09 pm

Грабельки очередные

На сей раз в перловом Sendmail::Milter.
auto_getconn некорректно извлекает из sendmail.cf название сокета. Из

Xantispam, S=local:/var/run/antispam.sock,F=T,T=C:1s;S:10s;R:10s;E:30s

вместо

local:/var/run/antispam.sock

извлекается

local:/var/run/antispam.sock,F=T.

Патамушта аффтар ниасилил non-greedy matching. Модуль последний раз менялся аж в 2001 году. За 8 лет бага никто не заметил..

Никому нельзя доверять, всё надо писать самому :(

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
2009-05-23 07:43 pm

Масонская книга

А что, этот вот масон – хорошая штука? Стоит тратить время на изучение, или с тех пор прогрессивное человечество придумало что-нибудь принципиально лучшее в области фреймворков для веба на перле?

Оригинал этой записи. Комментировать можно тут или там.

Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме

dil: (Default)
2008-12-26 08:49 pm

красивые грабли, с ручкой, украшенной лепниной (C) dma

Задача: прочитанные их файла байтики разобрать на отдельные биты. На перле.
Пишем простенькую тестовую программу:
#!/usr/bin/perl -w

my $foo = "\x47";

for(my $i=7;$i>=0;$i--){
print vec($foo, $i, 1)." ";
}
print "\n";


Получаем ожидаемое 0 1 0 0 0 1 1 1.

Поскольку байтиков ожидается больше одного, усложняем пример. Разбираем буфер на отдельные байты в массив:
my @a = unpack("C*", $foo);

проверяем, что получилось:
printf("0x%x\n", $a[0]);
(даёт 0x47, как и ожидалось)

и повторяем процедуру извлечения битов:
for(my $i=7;$i>=0;$i--){
print vec($a[0], $i, 1)." ";
}
print "\n";

и.. получаем другой результат: 0 0 1 1 0 1 1 1

Долго бьёмся головой об стену в тщетных попытках понять, почему три бита из восьми инвертировались.

хинт к отгадке для особо любопытных )
Спасибо [livejournal.com profile] dma, а то бы я голову разбил.
dil: (Default)
2008-10-06 04:29 pm

Пятиминутка ненависти

эти крутые программисты на перле написали для парсинга логов скрипт аж на 15 килобайт. с командной строкой, выбором файлов по дате в имени, с POD-документацией, use warnings; use strict; use 5.6.0 (хотя непонятно, нафига) и прочими рюшечками.

Но. Проверка на обнаруженность искомых паттернов в очередной строке лога выглядит так:
if (!$1 || !$2 || !$3)
  {
  log_msg <<END;
Malformed regular expression "$regexp": did not get expected matches for time-
stamp, name and elapse-time.
END
  }

Уроды.
dil: (Default)
2008-07-17 04:42 pm

пятиминутка ненависти

сегодня - к тупым недопрограммистам

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

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

а про flock этим уродам в колледже не рассказали.

оттуда же:
     if ($username eq "")
         { exit;  }

     if ($username eq "")
       { 
        ...
       }
     else
     {
       ...


ненавижу.
dil: (Default)
2008-06-26 11:25 am
Entry tags:

Про PHP

(очень задумчиво) а что, в PHP'шном SQL API ещё не реализовали placeholders и binding?

Типа, как это в перловом DBD сделано: при вызове prepare() в SQLном операторе пишутся вопросики, а реальные значения передаются при вызове execute().
dil: (Default)
2008-04-22 05:41 pm
Entry tags:

Товарищи специалисты по перловому SOAP::Lite!

Покажите, пожалуйста, пальцем, где у меня ошибка в ДНК. Или не у меня, а в SOAP::Lite.
А то я уже голову сломал.

Дано: простейший тестовый скрипт о пяти строчках.
#!/usr/bin/perl -w
use SOAP::Lite +trace => "debug";
my $service = SOAP::Lite
-> service('http://...');
$service->envprefix('SOAP-ENV');

my $r = $service->Version();


Во всех инструкциях написано, что вызов метода, даже неудачный, должен вернуть ссылку на SOAP::SOM, после чего можно по ней получать всякие fault, result и paramsout.

Авотфиг. Вызов проходит, я в дампе вижу, что сервер понял запрос и вернул корректный XML. А в $r возвращается скалярная единица.

Аналогичная фигня с попыткой передать в вызываемый метод ссылки на SOAP::Data, как показано в документации. Оно говорит String value expected instead of SOAP::Data reference.

А $service->call('Version') говорит, что "A service address has not been specified either by using SOAP::Lite->proxy() or a service description)", хотя в вышеуказанном явном вызове $service->Version() адрес прокси замечательно обнаруживается.

Сдаётся мне, что я не замечаю каких-то больших граблей, но каких?

P.S. libsoap-lite-perl 0.69-1 в убунте, если что.
dil: (Default)
2007-03-07 01:07 pm

И не просто ужас..

Если вы немножечко знаете, что такое перл и как его использовать, то ужас-ужас-ужас вот тут )
Это написал не ученик первого класса школы для умственно отсталых программистов. Это альтернативно одарённые авторы cacti. Взято из свежего дистрибутива.
dil: (Default)
2007-03-02 02:14 pm

Удивительный язык perl

офигенно понятный.
Вот попробуйте, не глядя в комменты и документацию, определить, чтО делает эта конструкция
push(@foo,[@bar]);
Способа написать это понятнее я не нашел.
dil: (Default)
2005-11-25 12:37 pm

А чем нынче модно на перле с XML работать?

Задача: зачитать XML (лучше, если при этом будут допускаться небольшие ошибки в виде тегов, закрытых в неправильном порядке. или так не бывает?)
кое-что поудалять, для некоторых поддеревьев выколупать значения и выдать их наружу. В базу.
Всё, ничего более сложного не требуется.

Upd: xml - не самоцель, это промежуточный способ хранения данных, выколупанных из pdf. Если есть возможность работать непосредственно с pdf, то она тоже подойдёт.