понедельник, 25 мая 2009 г.

Я - фанат Google

Да, я активно пользуюсь всеми сервисами Google. Можно сказать, что в Google мне нравится все. Хочу там работать. Google - возьми меня к себе на работу, хоть внештатником. Жду не дождусь Chrome во всех своих дистрибутивах. Судя по всему, и меня заметили, так как выросли размеры рекламы на моем скромном ресурсе, а в реальный почтовый ящичек пришло даже целое рекламное письмо. Но я не отчаиваюсь, и жду, что в один прекрасный день Google заметит меня и сделает предложение, от которого невозможно отказаться.

P.S. У блоггеров почему-то принято в начале каждого поста ни о чем раз в 6 месяцев писать про свою страшную занятость, про то, что впредь они будут писать и писать, и т.п. и т.д. Люди просто думают, что на них свет клином сошелся, какая разница, пишете, не пишете, если приходится себя заставлять, наверно не надо. По мне, так иногда хочется писать, иногда нет. И все. Поэтому никакого расписания постов нет, может быть как сегодня, а может - и раз в год/другой :)

Серые мыши, сидите потише

Милиция в последнее время радует нас заголовками:
- майор устроил бойню в супермаркете
- милиционер отрезал голову за 60 рублей
- милиционер сбил насмерть беременную женщину и скрылся с места проишествия
- пьяные милиционеры пытали и пытались утопить мужчину "потому что лысый"
- омоновец, угрожая оружием, угнал машину на мкад

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

GnuCash - лечим получение котировок валют.

С недавних пор (где-то с 12 мая) мой любимый gnucash перестал получать котировки валют. Как всегда программный отказ удачно совпал с сильными колебаниями на валютном рынке, но мои активы вполне себе спокойно поживали, что меня удивило, но с некоторым запозданием.

Все это конечно ужасно, но поправимо. Меня всегда удивляли люди, которые ругали опенсурс за ошибки. Увидел ошибку - докажи, что сам чего-то стоишь: поправь ее. Ну или баг-репорт отправь.

Итак, как вылечить gnucash? Ответ как всегда в модуле Finance::Quote. Надо его немного поправить.

Ищем, куда спрятался Quote.pm в нашей локальной инсталяции (мы же не будем править то, что ставим дистрибутивом):

kilork@phoenix ~ $ find ~/perl -name Quote.pm
/home/kilork/perl/lib64/perl5/site_perl/5.8.8/Finance/Quote.pm


Правим его. Тут особых подробностей не напишу, кроме того, что освоил debug perl под emacs (M+x perldb). Сами авторы дают резервный вариант для получения котировок валют, но почему-то, чтобы им воспользоваться, приходится попрограммировать. Я для вас поставлю свой вариант исправления, который работает у меня. В upstream пока погожу слать, подожду версии 1.17 Finance::Quote. Ну а если вдруг кому пригодится, то смотрите, как я поправил.

Ищем оригинал (каюсь, не сделал бэкапа, поэтому сравниваем с тем, что идет в дистрибутиве):

phoenix kilork # equery f Finance-Quote | grep Quote.pm
/usr/lib64/perl5/vendor_perl/5.8.8/Finance/Quote.pm


Сравниваем:

kilork@phoenix ~ $ diff -u {/usr/lib64/perl5/vendor,/home/kilork/perl/lib64/perl5/site}_perl/5.8.8/Finance/Quote.pm

--- /usr/lib64/perl5/vendor_perl/5.8.8/Finance/Quote.pm 2009-05-23 23:26:49.000000000 +0400
+++ /home/kilork/perl/lib64/perl5/site_perl/5.8.8/Finance/Quote.pm 2009-05-25 00:56:28.000000000 +0400
@@ -42,9 +42,9 @@
$VERSION $TIMEOUT %MODULES %METHODS $AUTOLOAD
$YAHOO_CURRENCY_URL $USE_EXPERIMENTAL_UA/;

-$YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/currency/convert?amt=1&submit=Convert&";
+#$YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/currency/convert?amt=1&submit=Convert&";
# If the above URL ever fails, try rewriting this module to use the URL below.
-# $YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/q?s=USDCAD%3DX";
+$YAHOO_CURRENCY_URL = "http://uk.finance.yahoo.com/q?s=";# USDCAD%3DX";

@ISA = qw/Exporter/;
@EXPORT = ();
@@ -241,16 +241,11 @@

my $ua = $this->user_agent;

- my $data = $ua->request(GET "${YAHOO_CURRENCY_URL}from=$from&to=$to")->content;
- my $te = HTML::TableExtract->new( headers => ['Symbol', 'Bid', 'Ask'] );
- $te->parse(decode_utf8($data)); # The web page returns utf8 content which gives
- # a warning when parsing $data in HTML::Parser
-
- # Make sure there's a table to parse.
- return undef unless ($te->tables);
-
- my $row = ($te->rows())[0];
- my ($exchange_rate) = $$row[1];
+ my $data = $ua->request(GET "${YAHOO_CURRENCY_URL}$from${to}%3DX")->content;
+ if($data !~ /Bid:.+>(\d+.\d+)<.+Ask:/g) {
+ return undef;
+ }
+ my $exchange_rate = $1;
$exchange_rate =~ s/,// ; # solve a bug when conversion rate
# involves thousands. yahoo inserts
# a comma when thousands occur


Данное решение считаю костылем, жду 1.17 с исправлением досадной ошибочки, или 1.16.1. Надеюсь, костыль не будет передаваться из рук в руки, и пригодится только мне :)