среда, 18 ноября 2009 г.

Быстрый поиск в pidgin.

В данный момент использую pidgin в качестве IM и частенько пользуюсь просмотром журналов. И обратил внимание, что поиск работает неприлично долго: от 3 до 10 секунд при размере журнала 500 кб. Не знаю с чем это может быть связано, но это натолкнуло меня на мысль: а не изобрести ли мне велосипед?
Встречаем..

Вдохновился вот этим постом, даже пытался переделать скрипт под себя, но с shell скриптом вообще не знаком, поэтому решил соорудить что-то свое на perl(с которым тоже конечно на "Вы", но что-то плохоработающее соорудить могу).



#!/usr/bin/perl
#тут у нас интерпретатор

#все серьёзно :)
use strict;
use warnings;

#подключаем поддержку utf-8
use utf8;
use encoding 'UTF-8';
use Encode qw(encode decode is_utf8);
use open ':utf8';

#тут можно указать свою любимую оперу или, скажем elinks
my $browser="firefox";
#импорт домашней директории из оболочки
chomp(my $home=`echo \$HOME`);

#ввод данных
print "Введите ICQ номер собеседника:\n";
chomp(my $icq_number=<STDIN>);

print "Введите значение для поиска:\n";
chomp (my $find_value=<STDIN>);

#удаление временной директории
`rm -r $home/temp_icq_hist/ >/dev/null`;
#создание пустой временнной директории
`mkdir $home/temp_icq_hist >/dev/null`;
#создание копии логов заданного номера
`cp -r $home/.purple/logs/icq/347298877/$icq_number \$HOME/temp_icq_hist/`;

#открываем дескриптор файла с результатами поиска
open RESULT, ">", "$home/temp_icq_hist/result.htm";

#пишем в него эту строку для правильного определения кодировки
print RESULT '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">';

#объявляем переменные
my (@file_strings,$i,$flag,$anchor_number);

#получаем список файлов с логами
opendir DIR, "$home/temp_icq_hist/$icq_number";
my @files=readdir DIR ;

#сортируем его в обратном порядке
@files=reverse sort @files;

#для каждого из файлов..
foreach (@files) {

#открываем дескриптор очередного файла логов
open FILE, "$home/temp_icq_hist/$icq_number/$_";
#читаем файл целиком в массив
@file_strings=<FILE>;

#открываем дескриптор для этого же файла на запись
open FILE, ">", "$home/temp_icq_hist/$icq_number/$_";

#обнуление счетчика якорей
$anchor_number=0;
#начинаем построчную обработку
for ($i=0;$i<scalar(@file_strings);$i++){

#если есть совпадение с искомым значением начаем писать
if ($file_strings[$i]=~/$find_value/i){

#в файл логов пишем строку с присоединенным якорем
print FILE "<a name=\"$anchor_number\"></a>$file_strings[$i]";

#в файл результатов пишем ссылку на якорь, предыдущую строку, текущую и следующую
print RESULT "<hr>
<a href=$icq_number/$_#$anchor_number>$_</a><br>
$file_strings[$i-1];
$`<span style=\"background: rgb(153, 255, 153)\">$&</span>$'
$file_strings[$i+1]";
#увеличиваем счетчик на единицу, чтобы избежать обработки двух строк
$i++;
#номер якоря
$anchor_number++;
}
#если совпадения нет, просто пишем строку в логи
else {
print FILE $file_strings[$i];
}
}}
#закрытие дескриптора результатов
close RESULT;

#открываем файл браузером
`$browser $home/temp_icq_hist/result.htm`


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


Продолжение...