Автор Гілка: Сітьовий клієнт на Perl.  (Прочитано 4166 раз)

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Просто хочу поділитись невеликим досвідом програмування сітьового клієнта (Perl web-client).
Цей текст направлений просто щоб підстігнути вашу уяву і, якщо тут є Perl програмісти, вони можливо зацікавляться. Я сам поки-що доволі слабий в "object-oriented" (як по-українськи?) програмуванні.
Що використовується, документація:
http://cpan.uwinnipeg.ca/module/LWP  (LWP, libwww-Perl - набір модулів, заміняє безпосереднє програмування сокетів  простим набором функкцій клієнт/серверної взаємодіЇ).
http://cpan.uwinnipeg.ca/htdocs/libwww-perl/ (документація до libwww)
http://www.xav.com/perl/site/lib/lwpcook.html (майже готові скрипти)
http://www.oreilly.com/openbook/webclient/  (книжка видавництва O'Reilly саме про цю бібліотеку)
Встановлюємо LWP на нашу систему:

bash$ su
bash# man CPAN
bash# perl -MCPAN -e shell;
cpan> m LWP

видає нам приблизно наступне:

Module id = LWP
    DESCRIPTION  Libwww-perl
    CPAN_VERSION 5.803
    CPAN_FILE    G/GA/GAAS/libwww-perl-5.803.tar.gz
    MANPAGE      LWP - The World-Wide Web library for Perl
    INST_FILE    /usr/lib/perl5/site_perl/LWP.pm
Встановлюємо його:

cpan> install G/GA/GAAS/libwww-perl-5.803.tar.gz
cpan> m HTML::Parse
cpan> install install S/SB/SBURKE/HTML-Tree-3.18.tar.gz  (цей модуль використовується для перетворення HTML в  простий текст)
cpan>  m HTML::FormatText
cpan> install S/SB/SBURKE/HTML-Format-2.04.tar.gz (так само)
cpan> exit

bash# exit
Цей модуль має багато функій, які дозволяють нам створити такий-собі маленький оглядач(browser):
#!/usr/bin/perl
use LWP::Simple;

getprint($ARGV[0]);
назвемо цей файл dump_url.pl

chmod +x dump_url.pl
./dump_url.pl http://www.google.com

видасть нам код Гугль сторінки, якщо ми хочемо побачити тектову версію:
#!/usr/bin/perl
use LWP::Simple;
use HTML::Parse;

print parse_html(get $ARGV[0])->format;
назвавши це dump_url2text.pl і зробивши його виконуваним:

./dump_url2text.pl http://www.google.com/linux

LWP бібліотека має дуже багато дуже складних функцій, які дозволяють нам створювати маленькі програми-роботи (bots, crawlers, spiders), які можуть перевіряти посилання, індексувати ваш сайт, знаходити в інтернеті файли, за ключовими словами і т.д.
Що мене зацікавило, так це можливість заповнювати форми і відсилати  їх на переробку серверу.
Конкретний приклад.
Спочатку встановіть собі d1489 пакет, якщо у вас її ще нема. Цей маленький набір програмок (todos/fromdos, towin/fromwin, a2kfcnv) перекодовує файли і шрифти з Віндовс (cp866, cp1251) у Юнікс (koi8-r) і навпаки:
Її оппис, домашня сторінка і сам пакет:
http://www.usinglinux.org/russian/d1489.html
http://koi8.pp.ru/unix.html
http://koi8.pp.ru/dist/d1489-1.5.tgz
У мене вона скомпілювалась без проблем:
tar xvzf d1489-1.5.tgz
cd d1489-1.5
make install
which fromwin

Тепер назад до сітьового клієнта. Ознайомившись з  http://ukrmova.virtualave.net/cgi-bin/olenuapro.pl створюємо наступний файл:#!/usr/bin/perl
#
use LWP::UserAgent;
use HTML::Parse;

$ua = LWP::UserAgent->new;

my $req = HTTP::Request->new(POST => 'http://ukrmova.virtualave.net/cgi-bin/olenuapro.pl');
$req->header('Content-type' => 'text/html');
$req->content("Word=$ARGV[0]");  # заповнить це:  <input maxlength=40 name=Word size=17 tabindex=1 value="">

my $res = $ua->request($req);
print parse_html($res->as_string())->format;
Зберігаємо його як transl.pl

chmod +x transl.pl
./transl.pl complex | fromwin
./transl.pl complex | fromwin | grep "[а-ьА-Ь]"

translit.pl бере як аргумент одне слово і вивід передається fromwin команді для перекодування cp1251 у koi-r.
Цей скрипт можна удосконалювати, але ви зрозуміли головну ідею.
Складно?
Наостанок, якщо щось зрозумiли з мого белькотіння, користуйтесь цими речами дуже обережно.

« Змінено: 2005-02-12 06:10:14 від tech »

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Сітьовий клієнт на Perl.
« Відповідей #1 : 2005-01-23 15:18:59 »
Добавлю.
http://freewebs.com/nabis/enua.zip  - це той самий текстовий словник,  мені вдалося його скласти з допомогою вище наведеного клієнта. (zip / unzip програма щоб його розпакувати). Він доволі сирий і деякі слова відсутні, моя перша програма перегрузила словниковий сервер :o. Вдосконалюю її, ввожу перевірку на помилки, використання дзеркал і взагалі примушую її поводитись більш цивілізовано. Буду обновляти словничок по мірі можливостей. Якщо хтось хоче сам його доповнити, поправити - "feel free to do so".

Всім привіт.  
Віталій.

P.S. До-речі, форум видає "Internal Server Error", коли клікати на посилання, так-що треба копіювати адресу в інше вікно навігатора, або користуйтесь wget.
« Змінено: 2005-02-17 10:02:25 від tech »

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Сітьовий клієнт на Perl.
« Відповідей #2 : 2005-02-04 05:36:45 »
Обновив  словник http://freewebs.com/nabis/enua.zip  . Добавилось слів (28000), дуже рекомендую.
Очистив від дубльованих ліній:
# with help from thundergnat (news:perl.newbie) :)
#!/usr/bin/perl
use warnings;
use strict;

open (my $fileraw, '<', 'en_ua_raw.txt') or die "Can't open file for reading: $!";
open (my $tofile, '>', 'en_ua.txt') or die "Can't open file for writing: $!";

my %seen;

while (<$fileraw>){
    next if /^\n$/;
    print $tofile $_ unless $seen{$_};
    $seen{$_}++;
}
« Змінено: 2005-02-17 10:04:18 від tech »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Сітьовий клієнт на Perl.
« Відповідей #3 : 2005-02-08 13:55:15 »
Обновив  словник http://freewebs.com/nabis/en_ua.zip  . Добавилось слів (28000), дуже рекомендую.
А можна його привести у формат, придатний для використання з іншими словниками? Напр.

СЛОВО = опис в одну лінійку

або

СЛОВО<sp><sp>опис в одну лінійку

де <sp><sp> - це два пробіли.

Руками виправляти дуже довго. :-(

Цитата
Очистив від дубльованих ліній:
# with help from thundergnat (news:perl.newbie) :)
#!/usr/bin/perl
use warnings;
use strict;

open (my $fileraw, '<', 'en_ua_raw.txt') or die "Can't open file for reading: $!";
open (my $tofile, '>', 'en_ua.txt') or die "Can't open file for writing: $!";

my %seen;

while (<$fileraw>){
    next if /^\n$/;
    print $tofile $_ unless $seen{$_};
    $seen{$_}++;
}

"sort -u"?
[Fedora Linux]

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Сітьовий клієнт на Perl.
« Відповідей #4 : 2005-02-11 02:39:04 »
А можна його привести у формат, придатний для використання з іншими словниками? Напр.
СЛОВО = опис в одну лінійку
або
СЛОВО<sp><sp>опис в одну лінійку
де <sp><sp> - це два пробіли.
Руками виправляти дуже довго. :-(
"sort -u"?
Можна спробувати.
sort -u не працює, оскільки повтори часом були перемежовані:
Line 1
Line 2
Line 1   (Line1 i Line1 розділені)

Ще один серйозний "баг", це те що вищезгадана  fromwin розуміє тілки KOI8-R (російскі літери) українські
"ї" та "є" замінюються на "i" "e", дивно що взагалі працює. Не є good :(   Можливий є вихід -  передивитись win2koi8.h з мапою кодів літер:char *
win2koi8[] = {
   "Ъ",    "Г",    "\'",   "г",    "\"",   "...",  "+",    "+", /* 80-87 */
   "#",    "%",    "ЛЬ",   "<",    "НЬ",   "К",    "h",    "Ц", /* 88-8F */
   "h",    "`",    "\'",   "\"",   "\"", "\x95",   "-",    "-", /* 90-97 */
   "#",    "(TM)", "ль",   ">",    "нь",   "к",    "h",    "ц", /* 98-9F */
"\x9A",    "У",    "у",    "J",    "$",    "Г",    "|",    "$", /* A0-A7 */
"\xB3", "\xBF",    "Е",    "\"",   "^",    "-",    "(R)",  "I", /* A8-AF */
"\x9C",    "+",    "I",    "i",    "г",    "m",    "#", "\x9E", /* B0-B7 */
"\xA3",    "N",    "е",    "\"",   "j",    "S",    "s",    "i", /* B8-BF */
"\xE1", "\xE2", "\xF7", "\xE7", "\xE4", "\xE5", "\xF6", "\xFA", /* C0-C7 */
"\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", /* C8-CF */
"\xF2", "\xF3", "\xF4", "\xF5", "\xE6", "\xE8", "\xE3", "\xFE", /* D0-D7 */
"\xFB", "\xFD", "\xFF", "\xF9", "\xF8", "\xFC", "\xE0", "\xF1", /* D8-DF */
"\xC1", "\xC2", "\xD7", "\xC7", "\xC4", "\xC5", "\xD6", "\xDA", /* E0-E7 */
"\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", /* E8-EF */
"\xD2", "\xD3", "\xD4", "\xD5", "\xC6", "\xC8", "\xC3", "\xDE", /* F0-F7 */
"\xDB", "\xDD", "\xDF", "\xD9", "\xD8", "\xDC", "\xC0", "\xD1"  /* F8-FF */
};
Я можу поробувати покопирсатись в ній, але нічого наперед не обіцяю.
« Змінено: 2005-02-11 03:14:05 від tech »

Toshik

  • Гість
Re: Сітьовий клієнт на Perl.
« Відповідей #5 : 2005-02-11 10:39:52 »
Я сам поки-що доволі слабий в "object-oriented" (як по-українськи?) програмуванні.
Об'єктно-орієнтовне :)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Сітьовий клієнт на Perl.
« Відповідей #6 : 2005-02-11 15:21:34 »
Можна спробувати.
sort -u не працює, оскільки повтори часом були перемежовані:
Line 1
Line 2
Line 1   (Line1 i Line1 розділені)

Це uniq в цьому випадку не працюватиме, а sort -u - нормально.

Цитата
Ще один серйозний "баг", це те що вищезгадана  fromwin розуміє тілки KOI8-R (російскі літери) українські
"ї" та "є" замінюються на "i" "e", дивно що взагалі працює. Не є good :(
 Я можу поробувати покопирсатись в ній, але нічого наперед не обіцяю.

iconv не пробували? :-)

Ось вам скриптик, який конвертує файли з одного кодування в інше зі збереженням прав та (якщо можливо) власника файлу.

cp1251_2_koi8u :
#!/bin/sh
FROM=CP1251
TO=KOI8-U

if [ "foo$1" == "foo" ]
then
iconv -c -f "$FROM" -t "$TO"//TRANSLIT
else
  TMPFILE="`mktemp /tmp/w2l.XXXXXX`" || exit 1
  echo "Converting from $FROM to $TO:"
  for I in $@
  do
    echo "$I"
    "$0" <"$I" >"$TMPFILE" || exit 1
    chmod --reference="$I" "$TMPFILE"
    if [[  $UID==0 ]]
    then
      chown --reference="$I" "$TMPFILE"
    fi
    mv -f "$I" "$I~"
    mv -f "$TMPFILE" "$I"
  done
  echo "Done."
fi
[Fedora Linux]

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Сітьовий клієнт на Perl.
« Відповідей #7 : 2005-02-12 03:59:24 »
Дякую,  Володимире.  8)
Спишу все на відсутню сторінку посібника, man iconv мені видає лише третій розділ (man 3 iconv), де йдеться про iconv.h (Slackware 8.1/10). (Знаю, знаю - існує ще iconv --help ):)  Якби ви мені не нагадали про цю програмку, я би далі возився з fromwin ...

sort -u теж не підходить, так як він  дійсно "сортує" (порушує послідовність).
« Змінено: 2005-03-04 03:10:51 від tech »

Відсутній tech

  • Письменник
  • *****
  • дописів: 586
  • Карма: +1/-0
  • Гигик
Re: Сітьовий клієнт на Perl.
« Відповідей #8 : 2005-11-05 03:23:27 »
Відформатував словничок з допомогою groff. Тепер виглядає дещо краще:
rebuke            1.  n догана; докір : without rebuke - бездоганний 2.
            v робити догану; докоряти

rebut            v 1) спростовувати  (обвинувачення  тощо)  2)  давати
            відсіч

recalcitrant
            1. adj непокірний; упертий 2. n непокірна людина

recall            1.  v  1)  відкликати  (урядову особу) 2) виводити (з
            задумливості)   3)    скасовувати    4)    згадувати,
            нагадувати,  воскрешати  (в  пам'яті) 5) призивати (з
            запасу) 2.  n  1)  відкликання  (урядової  особи)  2)
            військ.   сигнал  до  повернення;  відбій  3)  виклик
            виконавця на біс
    

Якщо хтось ним користується, можете завантажити за адресою:
http://freewebs.com/nabis/enua.zip