Mojo and Mojolicious Handbook

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

Документация и статьи о Mojo

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

XChat Perl scriptingl

Не так часто встретишь скрипт на Перле для XChat. Популяризация всяких правильных языков для унылых адекватов делает свое дело. Так или иначе, жизнь продолжается. Как-то я столкнулся с необходимостью сделать себе нечто маленькое, но функциональное. Конечно, захотел это написать на любимом языке. Проблемой стало не столько написание крошечного скриптика на десяток строчек, сколько вообще понимание правил написания их изучение внутренних функций клиента. Имеется документация на языке магов не нашего ордена. Их письмена тяжелы для моего понимания, а русских текстов на тот момент не было. Приходилось воспринимать то, что есть, ну и искать другие скрипты, ко которым можно разобраться в функциях. На самом деле, там все довольно просто. Будем разглядывать на практике.

Имеется клевое радио-рекорд, которое аяксом подгружает текстовый файл на своем сайте. В файле находится название композиции и прочая чушь, если там в данный момент реклама, а не музыка. Фактически, нам надо принять информацию из интернета на блюдечке и красиво ее выводить. Для начала, самое-то. Вот код в красивой обертке. Он же просто тут. Лень париться со всякими подсветками и прочим.

#!/usr/bin/perl;
# Буковки!
# use warnings;
# Закомментировал прагму, когда начал использовать скрипт.
use utf8;
# Это чтобы не мучиться с кракозябрами.
use LWP::Simple;
# А этот волшебный и простой класс поможет нам без проблем выдирать из интернета данные.
Xchat::register (»RadioRecord script», «0.1.0″);
# Самое интересное начинается! В любом скрипте для XChat должна присутствовать эта штука.
#Она регистрирует в самом клиенте наш скрипт. Все будет по правилам и красиво.

Xchat::hook_command( ‘rr’, ‘get_rr’ );
# Ставим хук на выполнение команды. В нашем случае, при написании команды «/rr», управление передается функции «get rr»

sub get_rr {
#ой, что это?!
my $content = get(»http://radiorecord.ru/script/record.txt»);
# Открываем тот-самый текстовый файл, в котором название музяки!
if ($content =~ m%В эфире: <strong>(.+)</strong> — (.+)%) {
# Здесь с помощью регулярки выдергиваем нужные буквы из строки в файле.
$chan = Xchat::get_info(’channel’);
# Еще одна интересная функция: получить название канала, на котором находимся.

Xchat::command(»msg $chan Сейчас на рекорде: $1 — $2″);
# Тут все довольно очевидно: выполнить команду. В нашем случае, послать сообщение на канал с названием музыки. В переменных имя исполнителя и, собственно, название.

}
else {
print qq/$content/;
# Если там не называние песни, а что-то другое, то просто выбросить на экран, а не на канал.
}
}

Так, на случай, если отвалится. Искренне надеюсь, что комментарии понятны. На всякий случай, отдельно пропишу:

Xchat::register (»Название скрипта», «Версия); -регистрация сценария в клиенте.

Xchat::hook_command( ‘IRC-команда’, ‘Функция’ ); — ставим хук на команду и обрабатываем.

Xchat::get_info(’channel’); — получение информации. В нашем случае, текущий канал.

Xchat::command(»IRC команда″); — Выполнение команды.

Xchat::hook_print(‘Channel Message’, «check»); — Нужная и полезная штука. Хук на сообщения на канале.

Xchat::hook_print(‘Channel Message’, «check»);

sub check {
my $pubstring = $_[0][1]; # Собственно, сама строка!
my $nick = Xchat::strip_code($_[0][0]); # А вот еще одна нужная функция. Выдергиваем ник написавшего.

}

Конечно, текст можно сравнивать, определять команды и прочее. Фактически, можно клиент превратить в полноценного бота, только к нему добавится еще и вся мощность языка Perl. Сделать всякие крутые штуки с БД, блекджеком и шлюхами, однако, стоит помнить, что чем сложнее система, тем она уязвимее. С другими командами я вас не познакомлю, т.к. не было необходимости и я в них не разбирался. ((:

Удачного онанизма программирования!

Net::IRC

Сразу уточню, что статья для начинающих. Тех, кто освоил синтаксис и познал основы языка, но кому не хватает опыта. Все-таки, решение текущих задач — лучший способ учиться!

Быть новичком в Perl довольно нелегко. Особенно сейчас, когда сообщество программистов на этом эпично-прекрасном языке только-только возвращается из небытия: пишутся статьи, выкладывается код, функционирует т.н. Планета. Ломать рамки, формирующие границы мышления тяжело, а еще тяжелее было, когда не с кем посоветоваться. После прочтения книг и ознакомления с простыми методами программирования, новичку требуется опыт. Сколько книг и статей не читай, а чтобы знать язык и уметь программировать, надо писать код: заниматься и жить этим. Это одна из моих первых маленьких работ. Совместно с товарищем, мы захотели повесить на канал бота для викторины. Модуль викторины нашелся довольно быстро, хотя сам по себе он «кривоват» и заразил своей кривизной все остальное. Он был поправлен для того, чтобы работать с русским текстом. Модуль Net::IRC считается довольно старым. Ему на смену уже давно пришли многие другие пакеты. Одним из них является событийный AnyEvent::IRC, однако, для обучения и и работы простейшего бота на достаточно на данный момент Net::IRC.

#!/usr/bin/perl  # какие-то непонятные буквы (irony)
use warnings; # тоже объяснено в учебниках про предупреждения
use Net::IRC # используем класс
$irc = new Net::IRC; # собственно объект

Первый метод, который нам будет нужен, это метод newconn.

$conn = $irc->newconn(
Nick    => ‘HackBot’, # Ник в сети
Server  => ‘irc.r3al.ru’, # Сервер, к которому подключаемся
Port    =>  6667, # Порт сервера
Ircname => ‘I am bot, baby! (:’, # Имя
Timeout =>  5 # Важная вещь — таймаут. Время ожидания ответа.
);

Нетрудно догадаться, что с помощью него задаются важные для соединения бота с сервером данные. В принципе, уже можно подключаться с помощью метода start(), однако, нам же нужно, чтобы бот хотя бы зашел на канал и, желательно, выполнял какие-либо функции. Когда бот соединяется с сервером, то получает от него сообщение «376», которое означает, что соединение установлено. После этого можно заходить на каналы и т.д. Чтобы бот отреагировал на это сообщение, мы воспользуемся методом add_handler().

$conn->add_handler(‘376’, \&on_connect); # вызов функции on_connect(), при успешном подключении.

Сама функция уже может выполнять нужные нам функции. Например, заход на канал:

sub on_connect {
my $self = shift;

$self->join(‘#perl’); # заходим на канал #perl

$self->privmsg(‘#r3al’, «Всем привет! (:»); # Пишем сообщение на канал!

}

Обычно, боты реагируют на сообщения на канале, выполняя какие-то функции. Чтобы бот «читал» новые сообщения пользователей, используем тот же метод  add_handler(), только уже с параметром public.

$conn->add_handler(‘public’, \&on_public); # Вызываем функцию on_public(), если в чате появилось новое сообщение.

Ну а функция может хитро выделять команды, которые и нужно обрабатывать. Таким образом можно немного снизить нагрузку.

sub on_public {
my ($conn, $event) = @_;
my $text = $event->{args}[0]; # То, что сказано на канале кем-то.
if ($text =~ /^\!(.+)/) { # Простая регулярка, которая отличает команды, а не текст. (Командами обычно являются слова после знака «!», стоящего в самом начале текста.)
on_public_command($conn, $1, $event->{nick}); # Ну а дальше можно обрабатывать.
}

На самом деле, можно делать еще проще. Да и бот необязательно должен выполнять какие-то команды. Как говорится, то можно сделать несколькими способами. (;

Новичку стоит научиться читать чужой код, т.к. документации на модули мало и, зачастую, она на английском.Примеры и готовый аналогичный код покажет вам логику работы модуля, либо просто укажет путь. Конечно, в наше время от этого мало практической пользы, однако, это неплохой способ начать работать с языком Perl, выполняя практические работы, а не решая какие-то задачки. В качестве более сложного примера подойдет наш старенький кривой бот викторины, который с горем пополам выполнял одноименную функцию. Так же, любителям IRC я рекомендую канал #ru.pm, который находится в сети MAGnet.

Сервер: irc.perl.org

Порт: 6667

Канал: #ru.pm

Опытные программисты часто отвечали на мои вопосы. Помогали разобраться в некоторых проблемах. Сама сеть англоязычная, а на канале общение на русском (Кодировка UTF-8). УДАЧИ!

О нарциссизме

Родительское воспитание нас портит. С детства они хотят, чтобы дети были кем-угодно, но только не самими собой. Некоторые строят планы на жизнь своего ребенка. Они хотят, чтобы дети как бы продолжили их жизнь, решили ИХ нерешенные проблемы, реализовали их мечту. Отсюда погоня за деньгами и так называемым почетом, которые так легко потерять и так тяжело приобрести.
Ребенок растет. Его сознание становится все сильнее. А вместе с расширением влияния сознания и отходом бессознательного как-бы на второй план ему навязывают убеждения, ложные ценности, идеи, которые отнимают силы и сбивают его со СВОЕГО пути. Так он вырастает, живет несчастным, не достигает ничего, а если и достигает, то не получает удовлетворения. У этого человека появляются дети, которым он дает такое же свое воспитание… Таких миллиарды.