Новый модуль — WWW::Ruler

Сегодня разместил на CPAN свой второй open source модуль — WWW::Ruler. Не буду описывать то, как с ним работать. Напишу лишь краткое его представление.

WWW::Ruler помогает легко формировать рулетку стиля Google (её функционирование) , а также помогает программисту получить нужные смещения для обрезания массива данных. То есть, мы указываем модулю размер всего массива, что мы имеем (например сколько всего товаров в категории), количество элементов на одной странице (категория разбита на страницы), желаемое количество кнопок «рулетки» и номер текущей страницы, для которой надо показать релетку. Модуль формирует массив элементов рулетки и вычисляет start & end позиции в массиве, которые можно использовать для вырезания данных из массива. Массив рулетки проходится обычным for оператором и отталкиваясь от значений, легко рисуются кнопки [<], [>], […] и [1], [2] и т.п..

Где взять:

CPANhttp://search.cpan.org/dist/WWW-Ruler/

GitHub репозитарий — https://github.com/Perlover/WWW-Ruler.git

CHI::Cascade — небольшое введение

Много месяцев у меня ушло на разработку этого модуля — CHI::Cascade. Теперь решил рассказать о нём здесь, в блоге, и о его концепции, чтобы те, кто испытывает в нём потребность, но ещё не знают о его существовании, подумали об его использовании. Итак, кэширование на основе зависимостей.

Концепция make

Вообщем, если вы программер, вам навярняка известна такая полезная утилита, как make. Вкратце — make получает файл с описаниями зависимостей и их командами, и выполняет только те команды shell, которые вычислены «для выполнения» на основе этих зависимостей. Это очень классная концепция, которую можно использовать как в программировании, так и для автоматизации работы в Unix. То есть, эта концепция зависимостей сводит к минимуму исполнение каких либо кодов/команд/скриптов для получения результата. Вообще, идеология «дерева» замечательная вещь, а если к этому приделать зависимости — что от чего зависит и как — то вообще это сила. Если что то мы изменили где-то в дереве, то перестраиваются те узлы, которые как либо зависимы, а остальное не трогается.

Концепция — кэш (cache)

Теперь о второй полезной вещи — кэше. Читать далее CHI::Cascade — небольшое введение

Cygwin — очень полезная штука под Windows!

Недавно открыл для себя такую классную вещь, как Cygwin!

Если вкратце — то это почти полноценный набор всех утилит, что есть под Unix, но под Windows системой. Лично для меня полезными оказались такие утилиты, как: bash & rsync. Первый позволяет использовать всю мощь shell команд, но под Windows, второй — с легкостью делать синхронизацию и резервирование.

Ранее для синхронизации я использовал Good Sync, но сейчас решил отказаться от него Читать далее Cygwin — очень полезная штука под Windows!

Цитаты о языке Perl

«Perl — это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.»

Keith Bostic. Программист, создатель Sleepycat, конрибьютор BSD.

«PHP — это малое зло, созданное некомпетентными любителями, а Perl — это громадное и хитроумное зло, созданное опытными и извращёнными профессионалами.»

Jon Ribbens. Программист.

Цитаты предоставлены любителем языка Lua (для которого цитаты ещё не придуманы кем либо). Может быть хотите стать первыми?

Perl — создание дистрибутива

Как приятно, когда кому то надо то, о чём ты пишешь. Вот решил исправить ситуацию и продолжить цикл своих статеек по perl. На этот раз про создание дистрибутива perl проекта.

Итак, с чего же начать создание Perl дистрибутива своего проекта?

Для начала, давайте рассмотрим общие принципы построение дистрибутива на Perl. Читать далее Perl — создание дистрибутива

Perl: DBI & MySQL — авто реконнект (reconnect)

Если вы программист на Perl и работаете с MySQL, то вот вам совет, как обеспечить коннект к серверу, и в тоже время, обеспечить себе легкую жизнь. Ведь если истечёт таймаут при работе с сервером, $dbh (database handle) будет не актуальным и выдаст ошибку. Особенно это актуально тогда, когда ваша программа работает с MySQL, и в то же время выполняет другие длительные операции, время которых может превысить таймаут-значение (connect timeout) MySQL. В такой ситуации ваш handle будет не актуальным.

Решение есть. Но в то же время есть ещё одна тонкость. DBB::mysql драйвер имеет опцию автореконнекта (mysql_auto_reconnect) и будет следить за актальностью handle и при случае переконнектится. Но вот что делать с коммандами, которые иногда надо выполнить сразу после коннекта, например SET NAMES ‘utf8’;SET CHARACTER SET ‘utf8’ ? И тут есть решение! Хотя найти его не всегда легко в интернет 🙂

Вообщем, вот код для коннекта из под Perl к MySQL так, чтобы всё работало пучком:

$dbh = DBI->connect( "dbi:mysql:database=database_name;mysql_client_found_rows=1;mysql_enable_utf8=1;mysql_socket=/socket_of_mysql", 'user', 'password',
    {
	RaiseError		=> 1,
	AutoCommit		=> 1,
	mysql_multi_statements	=> 1,
	mysql_init_command	=> q{SET NAMES 'utf8';SET CHARACTER SET 'utf8'}
    } ) or die "Cannot connect";
$dbh->{mysql_auto_reconnect} = 1;

Код проверен мною и тщательно протестирован

Музеи бывают разные…

Вот пришла мне сегодня такая мысль: программирование — это тоже искусство, код бывает написан так, что грамотный программист может долго восхищаться тем, как он написан и потом черпать от туда идеи для вдохновления. Например, если говорить о perl — мне очень нравится, как пишет код Tatsuhiko Miyagawa, и что самое интересное — он много очень написал. Например, много полезных приёмов можно подчерпнуть даже в таком хорошем и полезном инструменте для парсинга html & xml, как Web::Scraper — простой то туда пример для программеров перла 😉

Дак вот, я о том, что раз программирование — это искусство, то почему бы, подумал я, не открыть где нибудь музей, где вместо картин были бы исходные коды. Потом моя мысль пошла дальше — мол код интереснее смотреть на экране компа, тем более в цифровом виде — чтобы легче было копипасты делать, проверить если что и т.п.. Значит, музей должен быть в интернете! И вот, подумал я, наверное, я один до этого додумался 😉 Погуглил — как бы не так… Опередили меня ровно на год! По крайней мере в русском сегменте сети.

Итак, встречайте музей программного кода! 🙂

Термин «Lexical scope» в Perl

Довольно часто в документации к Perl встречается такой термин, как Lexical Scope. Однако лично я пока не нашел точного определения этому термину в man-ах perl-а. Порывшись в интернете, нашел все таки точное определение этому термину.

В терминах Perl, lexical scope определяется либо границами файла-исходника (если было за пределами первого блока в файле), либо блоком, в котором определен ({…}), либо внутри «eval». Поскольку блоки могут быть вложенными, то и lexical scope может быть вложенным. Это очень важно понимать, так как некоторые директивы имеют именно этот lexical scope (my, our, package)

perl, utf8 и encode & decode термины

Полезно будет знать Perl программерам. Дело в том, что часто в документациях к perl (perldoc utf8) и модулям (например JSON) употреблаются такие термины, которые лично меня часто путали своим смыслом, а именно: encode to UTF-8, decode to UTF-8. Что подумает нормальный программер, услышав слово encode to? То, что что-то кодируется во что-то, а именно «encode to UTF-8» -> «кодирование в UTF-8». Я знаю, что perl хранит внутри себя строки UTF-8 со специальным флагом — если он установлен — строка UTF-8, если нет — бинарная. Поэтому, когда в доке я читал encode to UTF-8, я все время путался — думал, что говорят про установку этого флага. Оказалось, все в точности наоборот.

Правильно так: когда пишут encode to UTF-8, это значит, что внутри перла строка с UTF-8 данными остается как есть, но флаг UTF-8 убирается, и perl начинает вести себя со строкой так, как будто там бинарные (octet) байтовые данные (то есть посути, строка внутри перла перестает быть UTF8, хотя слово «encode» несет в себе другой смысл). И наоборот — decode to UTF-8 -> UTF8 флаг ставится (то есть для perl-а строка становится UTF8).

P.S. В Perl есть такая функция — encode (модуль Encode). Смысл ее в том, чтобы перевести строку из внутреннего содержания на perl (которое всегда UTF-8 внутри, т.е. Unicode символы) в байтовую последовательность, которая бы отражала ту кодировку, которую ей указали (то есть раз байтовая — значит всегда utf8 флаг в результате отсутсвует). Если мы делаем $result = encode(‘utf-8’, $string), то результат как раз будет в том, что флаг utf8 будет просто снят для $result и в реальности никакого переводирования не будет (то есть побайтово внутри perl-а $string & $result будут содержать одни и те же байты, только $string еще будет иметь взведенный utf8 флаг). И это как раз вписывается в те понятия, которые я описал ранее. Для decode и байтового UTF8 всё обратно — флаг utf8 просто ставится в $result.

Вот такая абракодабра… Будьте внимательны!

Немного о супер направлениях в Web на Perl

Немогу не поделиться своими выводами об изучении нескольких новых технологий в Perl и в Web программировании. Немного предистории.

Я сам программирую динамические веб сайты (CGI) только на Perl. Никогда не использовал PHP. Это не только потому, что я фанат Perl, но и дань эффективности — под Perl много модулей, много возможностей, и при грамотном подходе сайты на Perl будут работать быстрее PHP — ведь Perl код после компиляции хранится в памяти в виде байт кода (типа «Пи кода» кода в Pascal). А если знаешь Perl, то и разработка может идти гораздо быстрее. Читать далее Немного о супер направлениях в Web на Perl