Tuesday, September 29, 2009

mysql: команда pager

Если в консольном клиенте mysql задать pager, результат будет отправляться не на экран, а на stdin указанной программе. Чем это может быть полезно?


  1. Просмотр, редактирование и сохранение результатов запроса. Можно использовать vim или less:
    mysql> pager vim -



  2. Проверить идентичность результатов можно используя утилиту md5 (md5sum):

    mysql> pager md5
    PAGER set to 'md5'
    mysql> SELECT CURDATE(), CURTIME();
    d24e22e4e2d33dfda9f01ba934b7676a



  3. Отменить пейджер можно командой nopager.

Wednesday, September 23, 2009

Zen of Python and Perl mantras

Знакомство с питоном как правило начинается с "The Zen of Python":
>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Кстати, исходный код модуля this содержит пример кодировки ROT13 ;)

У Perl-а тоже есть свои слоганы, причем автор самых известных — создатель языка:
There's more than one way to do it. — Larry Wall
Easy things should be easy, and hard things should be possible. — Larry Wall
Do what I mean.
The three principle virtues of a programmer are Laziness, Impatience, and Hubris.
If C is the Swiss Army Knife of programming languages, Perl is the Swiss Army Chainsaw.

Sunday, September 20, 2009

Парадокс?

Для того, чтобы действительно хорошо программировать на Perl, к примеру, недостаточно просто программировать на Perl.
Надо бы еще ознакомиться с СPython, etc. (чем больше, тем лучше).

Иными словами, важно быть разносторонним программистом. Зная о подходах к решению проблемы в других языках, можно их приспособить к нужному языку.

Perl: выбор случайных элементов из списка с учетом веса

Понадобилось написать функцию, выбирающую случайные элементы из списка с учетом веса (целое число). Привожу один из вариантов решения.

В perlfaq5 содержится простой до безобразия однострочник, который выбирает случайную строку в файле:
rand($.) < 1 && ($line = $_) while <>;

Этот алгоритм применим к задаче. Все что нам надо - это сделать выбор объектов с большим весом более вероятным:
sub pickAnObject {
my ($hObjects) = @_; # хэш, связывающий ID объекта и его вес
my ($total, $result);

while (my ($objectID, $weight) = each %$hObjects) {
rand($total += $weight) < $weight and $result = $objectID;
}
return $result;
}


Алгоритм хорошо подходит для случаев, когда число элементов невелико.

Thursday, September 10, 2009

bash prompt с человеческим лицом

Давненько я не твикал свой bash prompt. Вот недавно увидел прикольную фичу.
Часто в приглашении выводится значение, которое вернула последняя команда. Можно пойти дальше, и вместо числа выводить ":)" при успешном завершении и ":(" при неуспешном. (Более экспрессивный вариант: ^_^ и O_O). Для этого в PS1 можно вставить такую функцию:


function smiley () {
local status=$?
if [ $status -eq 0 ]; then
echo ':)'
else
echo ":( $status"
fi
}
Пример PS1 (вместо $COLOR* надо подставить последовательности для нужного цвета):


PS1="$COLOR1$(smiley) u@h $COLOR2w $ $JOBS_COLOR$(printJobs)$NO_COLOR"
Выглядит это примерно так:

:) doer@coyote /usr/home/doer $ (j:3)

Можно смайлики выводить разными цветами, наподобие этого:


PS1="`if [ $? = 0 ]; then echo [e[33m]^_^[e[0m]; else echo [e[31m]O_O[e[0m]; fi` u@h $COLOR2w $ $JOBS_COLOR$(printJobs)$NO_COLOR"

Улучшения/предложения приветствуются.

Tuesday, September 8, 2009

О языках программирования

Язык программирования, как инструмент,  должен подходить и соответствовать образу мышления программиста, использующего его. Только в этом случае он становится превосходным.

Исходя из этого я (когда-нибудь) остановлюсь на Python-е :-)

Saturday, September 5, 2009

Исключения (exceptions) в Перле

В Перле нет исключений, т.е. они не являются частью языка. Но, исключения можно успешно имитировать простой связкой eval + die.

eval { 
open my $fh, '>', $file or die "Could not open file! $!";
};
if( $@ ) { # catch and handle error }

Блоки eval { ... } могут быть вложенными. И, если вызывать die() без аргумента, то используется текст предыдущей ошибки с добавлением строки "t...propagated" (+ номер строки скриптa + "n"):

eval {
eval {
eval {
open my($fh), ">", "/etc/passwd" or die "$!"
};
if( $@ ) { die }
};
if ( $@ ) { die }
};
if( $@ ) { print "Error: $@" }

Error: Permission denied at -e line 3.
...propagated at -e line 4.
...propagated at -e line 6.

Строка - не всегда удобный способ передачи информации об ошибке. Аргументом die() может быть ссылка, а значит и объект. Если вызов происходит внутри блока eval, $@ будет содержать ссылку/объект, содержащий нужную информацию об ошибке. В этом случае правда придется перегружать оператор '"' (для объекта), чтобы необработанные ошибки выводились нормальной строкой.