
Слайды из презентации PHP.
Как пользоваться архивом CPAN, пример tied filehandle и статья про mod_perl.
Объяснения на немецком - как установить perl не имея прав rootа.
Четыре дня назад я решил задачу удаления вложенных tagов в лоб - путем подсчета открывающих и закрывающих tagов. На самом деле, все решается гораздо элегантнее с помощью одного regexа, который начинает удалять вложенные пары tagов изнутри, используя для этого lookahead:
#!/usr/bin/perl -w
use strict; # никогда не забывайте эту строку
sub rmtags2 ($$$)
{
my $txt = shift; # текст, который надо очистить
my $otg = shift; # regex для открывающего tag-а
my $ctg = shift; # regex для закрывающего tag-а
1 while $txt =~ s/$otg((?:(?!$otg).)+?)$ctg/$1/is;
return $txt;
}
my $TXT = 'a<FONT FACE="Arial">b<FONT FACE="Times New Roman">c' .
'</FONT>d</FONT>e<FONT FACE="Courier">f</FONT>g<FONT' .
' FACE="Arial" SIZE=1>h</FONT>ijklmnopqrstuvwxyz';
print rmtags2 ($TXT, '<FONT\s+FACE="[^"]+">', '<\/FONT>');
Выпущен Service Pack 6 для Windows NT 4.0.
Скрипт, проверяющий соответствие адреса e-mail стандарту RFC 822.
Серия из семи подробных курсов: введение в Perl и CGI.pm, использование cookies и templates, библиотека LWP, взаимодействие с базами данных Access и MySQL.

Небольшое введение в DBI.
Как разнообразить шрифты в Java-appletе.
Хорошее обозрение Pythonа на немецком.
На прошлой неделе я наконец-то сдал свой последний экзамен. Чтобы стать Dipl.-Ing. Elektrotechnik мне осталось написать программу на C++, использующую OpenGL и Qt для визуализирования FEM. Параллельно к Qt команды можно будет вводить через консоль с помощью readline и Pythonа.

Вы стоите перед проблемой: после сохранения Word-документа в формате HTML избавиться от HTML-tagов вида <FONT FACE="Arial">...</FONT>, но при этом сохранить <FONT FACE="Arial" SIZE=1>...</FONT>. Ситуацию ухудшает то, что эти tagи могут быть вложенными. См. внизу мой вариант решения. Чтобы его было легче разобрать, поменяйте флаг -w на -d для запуска debuggerа и введите строку { p "\n\ttxt = $txt\n\ttag = $tag\n\tbeg = $beg\n\t\$1 = $1\n". Введите еще s и затем просто нажимайте клавишу ENTER для построчного выполнения:
#!/usr/bin/perl -w
use strict; # никогда не забывайте эту строку
# Строка для debugger-а (флаг -d и потом все время вводить s):
# { p "\n\ttxt = $txt\n\ttag = $tag\n\tbeg = $beg\n\t\$1 = $1\n"
sub rmtags ($$$) # рутина ожидает три аргумента:
{
my $txt = shift; # текст, который надо очистить
my $otg = shift; # regex для открывающего tag-а
my $ctg = shift; # regex для закрывающего tag-а
my ($pos, $tag, $beg);
while (scalar $txt =~ /($otg.*?$ctg)/isg) # см. "perldoc perlre"
{
$tag = $1; # кусок от 1го $otg до 1го $ctg
$beg = $`; # запомнить начало строки и
$pos = pos $txt; # где мы пока остановились
# ПЕРВАЯ ЧАСТЬ: если в куске $tag только один $otg, то:
if ($tag =~ s/($otg)/$1/igs == 1)
{
$tag =~ s/^$otg//is; # отрезать у $tag 1й $otg
$tag =~ s/$ctg$//is; # и самый последний $сtg
substr ($txt, 0, $pos) = $beg . $tag; # заменить
next; # кусок в $txt
}
# ВТОРАЯ ЧАСТЬ: если в куске $tag пока меньше $ctg, чем $otg, то:
while ($txt =~ /\G(.*?$ctg)/isg) # см. "perldoc perlre"
{
$tag .= $1; # добавлять по одному $ctg за цикл
$pos = pos $txt; # это значит мы сдвинулись дальше
if ($tag =~ s/($otg)/$1/igs == $tag =~ s/($ctg)/$1/igs)
{
$tag =~ s/^$otg//is; # ТО ЖЕ САМОЕ, ЧТО И ВЫШЕ
$tag =~ s/$ctg$//is;
substr ($txt, 0, $pos) = $beg . $tag;
last;
}
}
}
return $txt; # вернуть очищенный текст
}
my $TXT = 'a<FONT FACE="Arial">b<FONT FACE="Times New Roman">c' .
'</FONT>d</FONT>e<FONT FACE="Courier">f</FONT>g<FONT' .
' FACE="Arial" SIZE=1>h</FONT>ijklmnopqrstuvwxyz';
print rmtags ($TXT, '<FONT\s+FACE="[^"]+">', '<\/FONT>');
Идея в том, что рутина состоит из двух частей. Первая часть простая: в переменную $tag помещается кусок текста от первого попавшегося открывающего tagа $otg до первого закрывающего tagа $ctg. Если в этом куске нет других $otg (то есть нет других вложенных tagов), то $tag просто обрезается спереди и сзади. А если есть - то в цикле из второй части к $tag добавляются один за другим $ctgи, пока число $otg и $ctg в нем не уравняется.
Кто такие Perl mongers.
Презентация Perl/Tk для начинающих.
Получил от автора CGI.pm совет добавлять в начало русских скриптов $CGI::DEFAULT_DTD = '-//IETF//DTD HTML//RU';

После долгой паузы вышел стабильный kernel 2.2.13.
Статья про Sybase SQL Anywhere.
Интервью с программистами October GNOME (почти готова версия для FreeBSD).
Компетентные статьи про mod_perl, inodes, написание SCSI drivers, установку IP-masquerade и TCP-связь.
Я выпустил ранюю версию Lingua::RU::Charset. Если Вы хотите поддержать идею модуля на чистом Perlе (так его легче устанавливать на разных платформах или просто копировать необходимые рутины) для поддержки и определения всех русских кодировок, включая UTF-8 и Unicode (пригодится Java-программистам) и незавимого от locale (например для не-российских серверов), присылайте недостающие функции. Если никто не будет мне помогать, то я напишу только нужные мне рутины (для частотного определения кодировки) и на этом все закончится.
Предположим, Вы устраиваете конкурс красоты и хотели бы разрешить посылку фотографий в формате GIF или JPG на Ваш сервер (в каталог $DIR), при условии что размер картинок не превышает 128 килобайт. Кроме того имена принимаемых файлов должны отличаться от уже полученных. Проработайте этот небольшой скрипт - в нем много деталей, и я постарался его подробно прокомментировать:
#!/usr/bin/perl -T # используйте -T для CGI-скриптов
$SIG{ALRM} = sub { die "$0 timed out" }; # прекратить выполнение скрипта
alarm 900; # в любом случае через 15 минут
use strict; # никогда не забывайте эту строку
use Fcntl; # O_EXCL, O_CREAT и O_WRONLY
use CGI qw (:standard); # читайте "perldoc CGI"
use CGI::Carp qw (fatalsToBrowser); # вывод ошибок к browser-у
$CGI::POST_MAX = 131072; # максимальный ввод = 128 KB
$CGI::DEFAULT_DTD = '-//IETF//DTD HTML//RU'; # используется в start_html()
my $foto; # декларация переменной для strict
my $DIR = '/home/alex/pics'; # не забудьте "chmod 777 pics"
my $JS =<< 'JAVASCRIPT'; # JavaScript для проверки формы
function check (form)
{
if (form.elements['foto'].value.length < 4) // поле foto должно быть заполнено
{
alert ('A gde zhe foto?');
form.elements['foto'].select ();
form.elements['foto'].focus ();
return false; // false запретит browser-у
} // отправлять данные к серверу
return true; // все OK - можно отправлять
}
JAVASCRIPT
print header (-type => 'text/html; charset=koi8-r'),
start_html (-title => 'МИСС ИНТЕРНЕТ', # напечатать заголовок и $JS
-script => $JS);
# 1й запуск скрипта - поэтому
unless ($foto = param ('foto')) # напечатать multipart-форму
{
print start_multipart_form (-onsubmit => 'return check (this)'),
h1 ('Отправьте нам фото спутницы Вашей жизни! '),
filefield (-name => 'foto',
-size => 40), # поле для upload-а файлов
submit (-value => 'Go baby go!'), # и кнопка для отправки формы
end_form;
}
elsif (uploadInfo ($foto) -> {'Content-Type'} ne 'image/gif' and
uploadInfo ($foto) -> {'Content-Type'} ne 'image/jpeg')
{
print h1 ('Используйте пожалуйста формат GIF или JPG!');
}
elsif (-e "$DIR/$foto") # -e проверяет наличие файла
{
print h1 ('А такая у нас уже есть!');
}
else # все в порядке - создать файл
{
die "Не могу создать $DIR/$foto: $!"
unless sysopen FILE, "$DIR/$foto", O_EXCL | O_CREAT | O_WRONLY, 0444;
no strict; # здесь придется выключить проверку
print FILE while (<$foto>); # скопировать принятые данные в файл
close FILE;
print h1 ('Ха-ха, спасибо!');
}
print end_html; # напечатать </BODY></HTML>
Почему я использовал для создания нового файла функцию sysopen, а не просто
die "Не могу создать $DIR/$foto: $!" unless open FILE, ">$DIR/$foto";
Дело в том, что в короткий промежуток времени между проверкой -e и моментом создания файла процессор может переключиться на выполнение этого же самого скрипта, запущенного другим посетителем Вашего сайта. Если название его файла такое же, и после создания файла его скриптом процессор опять вернется к Вам, может произойти смешение данных на диске. Маловероятно - но зачем халтурить? Флаг O_EXCL предотвратит эту ситуацию.
Выпущен Unreal Tournament для Linuxа.

Как использовать regexы в JavaScriptе для проверки форм.
Первый выпуск интересного дайджеста переписки perl5-porters.
Выпущен ActivePerl 521 (исправлены проблемы CGI::Carp в комбинации с PerlEx, а также %SIG, %ENV, Win32::GetCwd() и закрытие socketов).
Хотите архив Pref News (два мегабайта) для личного пользования?
В последнее время у меня появилось много "друзей", которые присылают мне вопросы по Perlу через ICQ и e-mail. Не надо этого делать. Для вопросов есть русские группы fido7.ru.perl и fido7.ru.cgi.perl (вот архив: 1 и 2). Если у меня или у других будет желание - Вам ответят. Если на Ваш вопрос не отвечают - наймите специалиста.
![]()
Еще один архив с книгами O'Reilly.
Интервью с автором недавно изданной книги Mastering Algorithms with Perl.
Перечисление распространенных наговоров на Perl.

Статьи про оптимизацию regexов и автоматические разборку и заполнение форм с помощью HTTP::Request::Common (чтобы помучать сервер?)
Хитрая попытка обнаружения plug-inов, установленных в MSIE.

Костя написал два Perl-модуля для определения и конвертации русских кодировок.
Статья про борьбу со spamом средствами Perlа.
Критический взгляд на Corel Linux и статья про ActiveState.
Microsoft выпустил Asheron's Call beta (53 MB).
Юра прислал адрес еще одного архива с книгами по UNIX и Perl.

Короткое объяснение regexов на русском. А также перевод статьи Гвидо.
ActiveState выпустил PerlEx 1.1.6 - аналог mod_perlа для NT-серверов.
Еще одна статья в Forbes - на этот раз про Джона Ромеро, отколовшегося три года назад от Id Software и просадившего 15 миллионов.

Вторая глава из книги про Swing для Java 2.
Вопрос из TPJ: что произойдет, если из функции вернуть ссылку на декларированную в ней с помощью my частную переменную? Выберите пожалуйста ответ внизу:
Статья про шефа Id Software Джона Кармака, который обычно пашет с 16:00 до 6:00 утра.
Начало серии про DHTML, новый взгляд на CVS и статья про Jini.

Вопрос из TPJ: предположим, Ваш скрипт содержит две переменные: local $var и my $var. В чем тогда разница между ${var} и ${"var"}? Выберите пожалуйста ответ внизу:
Желающие дописать книгу Picking Up Perl получат 725$.
Еще одно интервью с автором Pythonа.
Вопрос из TPJ: какое значение возвращает функция read() в конце файла? Выберите пожалуйста правильный ответ внизу:

Интервью с создателем Pythonа.
Статья про zsh (см. также введение и manual).
Введение в программирование OpenGL под Windows.

Вышел октябрьский выпуск Perlmonth со следующими статьями: введение в Apache::ASP, работа с localtime, продолжение серии про mod_perl (1, 2 и 3), примеры OOP и серия про XML parsing (1 и 2).
Вопрос из TPJ: какое значение возвращается простым return; в конце функции? Выберите пожалуйста ответ внизу:
Предположим, Вы хотите напечатать сколько раз слово $word было найдено в каком-нибудь тексте. Вариант print "Слово $word найдено $found раз."; звучит не всегда по-русски. Последнее слово этой фразы надо бы склонять в зависимости от последней цифры: print "Слово $word найдено $found ", $found =~ /[234]$/ ? "раза." : "раз."; Однако и этот способ все еще не учитывает числа 12, 13, 14, 112, 113, 114 и так далее. Надо смотреть на предпоследнюю цифру тоже (при условии, что она есть - то есть $found состоит не из одной цифры): print "Слово $word найдено $found ", $found =~ /(?:[^1]|^)[234]$/ ? "раза." : "раз."; Короткая демонстрация:
#!/usr/bin/perl -w
$word = "Perl";
for $found (0..30)
{
print "Слово $word найдено $found ",
$found =~ /(?:[^1]|^)[234]$/ ? "раза.\n" : "раз.\n";
}

Две статьи про mod_perl: введение и кооперация с базами данных.
Примеры использования Perl-библиотеки libwww. А также инструкции по запуску Java-servletов под Linuxом.
Вопрос из TPJ: как напечатать очередную строку из файла, но при этом перевернуть ее задом наперед? Выберите пожалуйста правильный ответ внизу:
Как сделать guestbook на основе базы данных MySQL.
Выпущены Red Hat Linux 6.1 и русская версия MS Office 2000.
Уговорил коллегу заказать Javascript Cookbook, так как шеф уже не хочет подписывать мои книжные purchase declarations.
Первая и десятая (про regexы) главы из книги Elements of Programming with Perl.
Вопрос из TPJ: объясните разницу между /^Foo/s и /^Foo/ (выберите ответ внизу):
Темная сторона Perlа - модуль Mail::Bulkmail.

Попытался объяснить объекты в Perlе. В двух словах: объект - это та же ссылка (на {}, реже на [] или скаляр). Но с одним отличием: эта ссылка blessнута. Если Вы не очень хорошо разбираетесь в OOP, попробуйте прочесть мои разъяснения и потом главу из книги Advanced Perl Programming.
Статьи про HTML::Mason и индексирование собственного сайта с помощью meta tags (вот listing). А также про ClassLoader, XML и Tcl и история сервера Apache.
Вопрос из TPJ: что напечатает print length %hash если Вы поместите в этот только что созданный хеш 37 случайных пар (ключей/значений)? Выберите ответ внизу:
Полезное собрание отрывков из Python-скриптов.
Как использовать onMouseOver в новой Mozillе.
Доклад о Topazе - попытке переписать Perl на C++.
Небольшие статьи про awk, Perl (написана моим коллегой Гвидо), Tcl и m4 macros.
Вышли Netscape 4.7 (с новой жизненно-необходимой кнопкой Go to Shop) и D3D UT demo (55 мегабайт, вот снимки полной версии). Чтобы избавиться от лишних кнопок и окон, внесите в свой ~/.Xdefaults следующее и выполните перед перезапуском Communicatorа xrdb ~/.Xdefaults:
Netscape*useStdoutDialog: false Netscape*useStderrDialog: false Netscape*noAboutSplash: true Netscape*toolBar.search.isEnabled: false Netscape*toolBar.myshopping.isEnabled: false Netscape*toolBar.destinations.isEnabled: false Netscape*toolBar.viewSecurity.isEnabled: false
Прочитал Коржик Евгения Некрасова - смешно и грустно про советскую армию.

Еще один архив книг по Perlу - на сервере Димы Николаева.
Выпущен русско-украинский Black Cat Linux 6.02 (вот снимки).
В отличие от Windows-1251 в кодировке KOI8-r русские буквы стоят не по порядку (по историческим причинам - чтобы текст с обрезанным восьмым битом читался латинскими буквами). Мне надо было рассортировать по алфавиту названия русских газет и журналов и use locale; на том сервере не помогало - вот мой способ, может он Вам пригодится:
sub normkoi ($)
{
my $str = shift; # следующую строку я разбил на шесть частей
$str =~ tr/\xC0-\xFF/\xFD\xC1\xC3\xED\xC9\xCB\xE9\xC7\xEB\xD1\xD3
\xD5\xD7\xD9\xDB\xDD\xDF\xFF\xE1\xE3\xE5\xE7
\xCD\xC5\xF5\xF7\xCF\xF1\xFB\xF3\xEF\xF9\xFC
\xC0\xC2\xEC\xC8\xCA\xE8\xC6\xEA\xD0\xD2\xD4
\xD6\xD8\xDA\xDC\xDE\xFE\xE0\xE2\xE4\xE6\xCC
\xC4\xF4\xF6\xCE\xF0\xFA\xF2\xEE\xF8/;
return $str;
}
То есть просто попереставлять русские буквы в области \xC0-\xFF, так чтобы они встали по алфавиту - АаБбВвГг... (внимание: выражение $str =~ ... должно быть одной строкой). И потом что-нибудь вроде print sort {normkoi ($a) cmp normkoi ($b)} @gazeti;
Прочел Кровь Анатолия Азольского - он удивительно пишет.
Статья про сортировку (а не сортирование - спасибо Булат!) в C, про bitовые операции и введение в LibGGI.
Архив Антона Винокурова с книгами по программированию переехал на новое место.
Вадим Бельман рассказал о своих впечатлениях от третьей Perl-конференции [этот линк пока не работает], проведенной O'Reilly в конце августа в Монтерее и опубликовал снимки.

Статья про сортировку массивов в JavaScriptе.
Статья про запоминание LAN-адресов с помощью ACEDB и AcePerl.
Хорошие примеры того, как с помощью Expect.pm-модуля взаимодействовать с fdiskом. См. также статью на немецком про использование Expect.pm с telnetом.
Как увидеть HTTP headers. А также статьи про XHTML: 1 и 2 - похоже на HTML, но все tags должны быть закрытыми (<img src="image.gif" /> или <hr />) и пишутся прописью (<br>, а не <BR>), а цифры заключаются в кавычки (например <table border="0">).
Star Wars: New Hope в виде буквенного appletа.
Статья на немецком про шифрование в Perlе.
Прочел серию статей про RE Джеффри Фридла в старых выпусках TPJ. Например, если Вы попытаетесь запустить такой скрипт из двух строчек:
$str = '::1234::5678901234567890::::123456789::99:'; print 'does not match' unless $str =~ /^(\d+|::)*$/;
то хотя невооруженным глазом видно, что это RE (цифры или двойные двоеточия) не подходит (из-за последнего двоеточия), этот скрипт зависнет у Вас на пару десятков минут. Почему? Дело в backtracking, которое применяет NFA-нутро Perlа.
Сдал последний экзамен и занес профу бутылку Крымского. Теперь мне остался один зачет (через 3 недели). Начал искать оплачиваемое место в какой-нибудь фирме (в немецких институтах за дипломы не платят) для написания диплома в Кельне или Ахене.
Несколько статей про Roxen Challenger - сервер, написанный на Pike.
Снимки новых frontendов KBIND и KSendmail, а также грядущего KDE 2.0.
Небольшое описание /proc filesystem.
Microsoft выпустил DirectX 7.0, необходимый для D3D версии UT demo, намеченной на сегодня или завтра.

Статья про Solaris kernel, который в отличие от Linuxа хорошо работает с несколькими процессорами.
Введение в JNI (см. также учебник).
Статья про гипертекст Xanadu.
Вадим прислал адрес русской страницы о locale.
Автор Licq ответил на мой запрос, что русские буквы не показываются в новой версии 0.70 возможно из-за каких-то проблем с Qt, так что оставьте у себя пока версию 0.61.
Еще два архива с книгами O'Reilly: 1 и 2 (среди них Perl Cookbook и Advanced Perl Programming). [28.9.99 - эти линки больше не работают, попробуйте лучше здесь]
Статья про references в Perlе.
Что можно почитать про Python. А также небольшое введение в Python на русском языке.
Вышли Mandrake 6.1 (Helios) и FreeBSD 3.3.
Журнал Cooler Саши Чижова.

Статьи про mod_perl (вот listing) и REBOL - язык ботов и агентов.
Глава из книги про server-side JavaScript.
Adfu 0.17 - система для показа рекламных баннеров, написанная на Perl (скоро - на mod_perl). А также phpAds 1.1.0 и набор из четырех SSI-скриптов.
Три главы - про awk, Tcl/Tk и Transact-SQL.

Заметки Игоря Сысоева, например про модули для Apache, а также пара советов по Perl.
Статьи про FreeBSD и намеченный на середину сентября AIX 4.3.3.
Миша Евдокимов написал про Perl в русском издании PC World.
Рассказ о запланированной на весну игре Command & Conquer: Renegade, в которую смогут играть до 256 игроков одновременно.
Первая часть из серии про CORBA.
Статья про GGI и color depths.
Выпущен Licq 0.70 (вот снимки).
Интервью с программистом TF2.

Небольшая статья про грядущий Perl 5.6.
Отсканированный русский перевод Llama book.
Вышел Phrack 55, например со статьями про NT Rootkit и CGI.
Хотите Sparc-сервер и оплату половины расходов?
Сценарий к фильму The Matrix.
Получил по почте Mastering Algorithms with Perl. Там не только математика, но и интересные главы про работу со строками - fuzzy-поиск и др.
JamesTK прислал адреса трех компактов с книгами O'Reilly: UNIX, Networking и частично WWW. Если Вы спрашиваете себя, как скачать несколько HTML-файлов за один раз, попробуйте wget -r -L -nH http://athena.vvsu.ru:85/docs/unix/unix_ora/
Олег прислал адрес учебного пособия по CGI-программированию от Леши.
Снимки нового Caldera OpenLinux 2.3.
Джон Кармак обсуждает G4. И статья про слишком красивую Q3A.
Начиная с версии 1.20, GD.pm больше не генерирует GIF-картинки, только PNG.

Книга GTK+/Gnome Application Development.
Как использовать TTF-шрифты в Star Office.
Серии про LDAP: 1, 2 и про Postscript: 1, 2 и 3.
Трюки для Flash 4. А также курс: 1, 2, 3, 4 и 5.
Выпущены Zope 2.0.0 и Descent 1.40 для Linuxа.
Perl-модуль Жени и Леонида Нейштадт Lingua::DetectCharset. Функция Lingua::DetectCharset::Detect ($str) возвращает WIN, KOI8 или ENG в зависимости от кодировки $str.
Небольшие статьи про SMTP, про Java-программирование под Linuxом и про конфигурацию RAID.
Кин-дза-дза для Doom ][.

Первая глава из новой Perl Black Book.
Выпущен Flash 4 Plug-in для Linuxа. Его очень легко установить: просто скопируйте файлы ShockwaveFlash.class и libflashplayer.so в каталог ~/.netscape/plugins
Десятая глава про конфигурацию X Window System из третьего издания хорошего пособия для начинающих Running Linux. А также - куски из книг Windows 98 in a Nutshell и Managing Exchange Server.
| Архив | Pref News | alex@kawo2.rwth-aachen.de | ICQ | 3252017 | talk | alex@alex.kawo2.rwth-aachen.de |
|