понедельник, апреля 28, 2008

Покажи мне свою history и я скажу кто ты есть...

Увидел на одном зарубежном блоге как собрать статистику по history коммандной строки в *nix, увеличил кол-во выводимых позиций до 50 и получил следующую картину:

history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head -n 50

134 vim
123 svn
108 make
91 ssh
48 dig
34 mc
33 perl
29 rpm
24 yum
24 wget
23 ps
23 ls
22 ./uri_test.pl
21 startx
21 service
18 mysql
15 shutdown
12 touch
12 man
11 kill


Всё что меньше 10 я отрезал - там вобщем много всего и неинтересно. В моём случае стата конечно не очень репрезентативна. dig - это временное явление, так как я настраивал dns кэш просто. Ну и make это не потому что я что-то руками собираю или на c/c++ мастерю - а в основном из-за сборки/инсталла perl-овых модулей (ну малая доля вызовов make пришлась на небольшой с++ проект). Но вобщем и целом видно чем человек занимается.

пятница, апреля 11, 2008

Оригинальный аргумент в пользу того что PHP зло

Недавно нашёл доказательство мразостности PHP - люди посчитали количество goto в сорцах разных языков тут: http://blog.ptpm.ru/index.php/2008/03/24/mrazotnyjj-pkhp/. :)

Perl получился менее мразостным чем PHP (что и так очевидно) и чем Python.

На самом деле я хотел попиарить тут проект http://defun.ru/ который что-то типа аггрегатора новостей /статей про функциональные языки и не только. Вобщем на данный момент есть что почитать интересного.

P.S. Просьба к части про мразостность языков отнестись с долей юмора.

среда, апреля 02, 2008

Неправильный POST через LWP

Писал я тут небольшое приложение и написал к нему тест на perl - с помощью LWP посылал POST запрос ну и соответственно проверял реакцию. Реакция оказалась неправильной, но при этом если я руками через firefox слал то же самое то всё замечательно работало. Побайтно сравнив посылаемое в обоих случаях - обнаружил что perl не эскейпит символ "!", т.е. посылает как есть, а firefox как %21. Полез искать почему так - нашёл что в итоге вызывается query_form (в URI::_query) который соответственно вызывает метод query такой:

sub query
{
my $self = shift;
$$self =~ m,^([^?\#]*)(?:\?([^\#]*))?(.*)$,s or die;

if (@_) {
my $q = shift;
$$self = $1;
if (defined $q) {
$q =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
$$self .= "?$q";
}
$$self .= $3;
}
$2;
}


Т.е. эскейпится всё кроме символов в $URI::uric. Полез смотреть что там прописано:

$reserved = q(;/?:@&=+$,[]);
$mark = q(-_.!~*'()); #'; emacs
$unreserved = "A-Za-z0-9\Q$mark\E";
$uric = quotemeta($reserved) . $unreserved . "%";


Т.к. "!" в $mark то он тоже не преобразуется. Полез смотреть стандарты в rfc1866 сказано следующее:
The form field names and values are escaped: space
characters are replaced by `+', and then reserved characters
are escaped as per [URL]; that is, non-alphanumeric
characters are replaced by `%HH', a percent sign and two
hexadecimal digits representing the ASCII code of the
character. Line breaks, as in multi-line text field values,
are represented as CR LF pairs, i.e. `%0D%0A'.


Тут конечно можно задуматся входит "!" в alphanumeric или нет, но rfc2396 рассеивает все сомнения:
alpha = lowalpha | upalpha

lowalpha = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" |
"j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" |
"s" | "t" | "u" | "v" | "w" | "x" | "y" | "z"

upalpha = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
"J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
"S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
"8" | "9"

alphanum = alpha | digit


Т.е. firefox прав, а lwp нет. В принципе lwp вообще непонятно зачем form_query в POST вызывает - оно не для этого. Ну ладно - это всё лирика...

Поправить дело можно относительно легко - исправить $URI::uric на то что нужно перед POST, а потом обратно. Заменить можно например так: $URI::uric = quotemeta("=&+")."A-Za-z0-9"; . Но возможно(скорей всего) я тут что-то не учёл - просто для моего теста это сработало, а всесторонне исследовать - времени нет.

Всё-таки LWP написан очень плохо - в который раз убеждаюсь. Зачитать про другой баг LWP.