Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

суббота, 11 июля 2015 г.

Про Perl, продолжение

Ну что, я дописал до того места, где оно уже рисует картиночки. Но работы там еще много. Несмотря на это я не утерпел выложить это на GitHub, пропиарить тут и еще немного написать всякого текста про это дело.

После некоторого анализа PieSpy и его описания я решил, что все-таки использовать его код совсем не зазорно, так как его автор(ы) использовали множество других работ в области отображения графов. И вообще, их методика в корне отличалась от того, что мне представлялось.

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




output

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

Про Perl

Я тут взялся писать маленький скрипт, который казался простым, ну, чтобы можно было пропарсить уже готовый лог IRC и построить на его основе картинку с диаграммой, на которой будет нарисован социальный граф. Есть штуковина, написанная на Java, которая делает аналогичное, но это отдельный бот, и это, пожалуй, неудобно. Поэтому захотелось что-то свое, что просто будет читать и парсить лог и будет написана на чем-то, что чаще встречается на VPS.
Выбрал Perl, потому что когда-то на нем писал чуть более сложные, чем HelloWorld приложения. Попытался написать, и вот уже часов 12 убил в сумме, а все никак не выходит каменный цветок. А все потому что изначально сделал ряд ошибок. Все-таки, любая достаточно сложная задача все-таки требует плана решения, как это ни странно, и если попытаться сразу написать код, это не всегда получается сделать быстро. Так что я уже раза три написал и стер основную часть кода, так как не сразу понял, к чему на самом деле сводилась часть задачи, которую решает скрипт. А еще я совсем забыл, как пишутся программы без объектно-ориентированного подхода. Слишком привык за те несколько лет, когда писал только на Java (ну, все-таки иногда я писал и на Perl тоже, но обычно на это уходила пара рабочих дней и это было редко). Так что лучше бы я сначала написал какой-то понятный план со структурами данных, которые нужны для этого скрипта, может быть, и быстрее получилось бы.
Теперь уже, чтобы ускорить возню с ним, приходится пользоваться исходниками PieSpy, но уже в части рисования готовой картинки. Но я так полагаю, что получив конечный результат, придется еще некоторое время поковыряться, собственно, в парсинге и составлении социального графа.
Есть ряд сложностей, которые, наверное, у PieSpy вообще не возникают. Например, бот сразу имеет список ников на IRC канале. Чтобы из лога его узнать, нужно его распарсить полностью, чтобы потом можно было искать упоминания этих ников в текстах сообщений (для чего его нужно распарсить уже второй раз). Следующей проблемой становится то, что ники могут меняться. Причем, хорошо еще, если они просто меняются на какой-то новый ник постоянно, можно просто сохранить историю и использовать список. Проблема появилась на этапе складывания информации о нике из списка его "псевдонимов", когда такая очевидная вещь, что меняться ник может и на какой-то из старых (зацикливая цепочку), от меня ускользнула.
Ну и еще одной неприятностью стало то, что на вспоминание ньюансов вроде хешей, ссылок на хеши и работу с ними ушло почти два или три подхода к кодингу. Зато теперь, вроде-бы, я и правда понимаю, что пишу. Но все-таки Perl в плане удобства программирования уступает даже Java, прежде всего отсутствием IDE для разработки, необходимостью постоянно вставлять разнообразные специальные последовательности символов, которые иногда визуально путаются ('}' и ')', например), кавычки, стрелочки, в общем, слишком много возни с клавиатурой выходит.
В процессе нашел забавный модуль, из которого даже сделали маленький ресурс - http://perlcritic.com/. Правда, я ожидал более жесткой матерной реакции на уровень "brutal". Еще бесит, что везде ссылаются на книжку Perl Best Practices, которую, в общем-то, нормальным людям положено купить, что некрасиво делать. Ну и где-то четверть придирок, по моему мнению, бывают неадекватны. Например, он будет постоянно требовать как можно скорее закрывать файлы, даже если между open и close оказывается только цикл для построчного чтения из него с достаточно длинным телом в 10-15 строк.
В общем, раньше я любил Perl для длинных скриптов, теперь стал любить меньше. Хотя лет 5 назад писал сугубо проприетарный набор скриптов для удобной работы с LDAP, вроде создания пользователей, групп и перемещения их туда и обратно по разным OU, и это довольно большой объем кода, строк эдак под 10К. Еще ради смеха писал блогодвижок на перле. В общем, опыт был. Только все это быстро забывается, и теперь уже, спустя годы, имея опыт работы с чем-то еще, смотришь на это уже не так, как раньше. Так что, наверное, полезно бывает и уйти от любимого инструмента на время и посмотреть на что-то другое. Отрезвляет.

пятница, 18 июня 2010 г.

Хайлайты через notify-send в irssi

Благодаря наличию в Irssi поддержки perl-скриптования, можно очень простым
способом, не используя никаких дополнительных модулей или еще чего либо
реализовать довольно-таки удобную функцию уведомления о приватных сообщениях и
хайлайтах через notify-osd, используя приведенный здесь скрипт. Конечно же, вы
можете использовать что угодно вместо notify-osd по вашему желанию, и тогда это
будет лишь небольшим примером того как можно облагородить такой, кажущийся
многим с первого взгляда убогим, IRC-клиент.

воскресенье, 12 июля 2009 г.

Squid: отчет по посещенным доменам

На случай если маленькая конторка просит высылать краткий анализ логов сквида на мыло...
$ squid-parser.pl 2009-07-12 < squid-access.log | mail blabla@company.com 

Собственно, скрипт, наваянный на скорую руку:

#!/usr/bin/perl -w

# aggregates squid logs

use strict;

use POSIX qw(strftime);
my $pattern = $ARGV[0];


my $line;
my @fields;

my $date;

my $ip;
my $bytes;
my $url;

my %ipstats;

my %urlstats;
my %ipurlstats;
while ($line=<STDIN>)

{
@fields = split ' ', $line;
$date=POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($fields[0]));

$ip=$fields[2];
$bytes=$fields[4];

$url=$fields[6];
$url=~s/.*:\/\/([^\/]*)\/.*/$1/;

if ($date =~ m/$pattern/)
{

$ipstats{$ip}+=$bytes;
$ipurlstats{$ip}{$url}+=$bytes;


}
}

my $urls;
my $mbytes;

while (($ip, $urls) = each (%ipurlstats))

{
print "-------------------------------------------------\n";
print "$ip:\n";

print "----------------------------------------------- \n";
foreach $url (sort {$urls->{$b} <=> $urls->{$a}} (keys %$urls))

{
print "$url: $urls->{$url} bytes \n";
}

$bytes = $ipstats{$ip};
$mbytes = sprintf "%8.3f", $bytes/1024/1024;

print "----------------------------------------------\n";
print "Total: $bytes b ($mbytes MB)\n";
print "----------------------------------------------\n\n";

}