книги хакеры / журнал хакер / 063_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
||
|
|
|
C |
|
E |
|
|
|
|
|
|
|
C |
|
E |
|
|
|
||||||
|
|
X |
|
|
|
|
|
|
|
|
|
X |
|
|
|
|
|
|
||||||
|
- |
|
|
|
|
|
d |
|
|
|
- |
|
|
|
|
|
d |
|
||||||
|
F |
|
|
|
|
|
|
|
t |
|
|
|
F |
|
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
|
|
|
|
|
|
|
|
|
|
r |
||||
P |
|
|
|
|
|
NOW! |
o |
|
P |
|
|
|
|
|
NOW! |
o |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
BUY |
|
|
|
|
|
|
|
|
BUY |
|
|
||||||||
|
|
|
|
to |
|
|
|
|
|
|
|
|
|
|
|
to |
|
|
|
|
|
|
||
w Click |
|
|
|
|
|
|
m |
|
w Click |
|
|
|
|
|
|
m |
||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
|
|
||
|
w |
|
|
|
|
|
|
|
|
o |
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
g |
.c |
|
|
|
. |
|
|
|
|
g |
.c |
|
||||||
|
|
p |
|
|
|
|
|
|
|
|
|
|
p |
|
|
|
|
|
|
|
||||
|
|
|
df |
|
|
n |
e |
|
|
|
|
|
df |
|
|
n |
e |
|
||||||
|
|
|
|
-xcha |
|
|
|
|
Пожалуй, самой главной переменной в |
главную программу? Для этого существует мо- |
|
|
|
|
-x cha |
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
индексаторе является $threads, которая ука- |
дуль IPC::Shareable, который работает далеко |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
зывает количество тредов. С ее значением |
не под все платформы. Поэтому я решил |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
можно поиграться, но главное - не перебор- |
обойтись старым дедовским способом – пере- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
щить. Я выставил 5 независимых потоков, |
дать значение через временный файл. Для |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
думаю, этого будет вполне достаточно. |
этого и нужны процедуры getret() и putret(). |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
В самом начале идет вызов процедуры |
ПРОЦЕДУРА GETRET() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
getlist(), т.е. запрос информации об FTP-сер- |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
верах. Тут все очень просто – обычный кон- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
нект, select-запрос и возврат переменной. |
sub getret { |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
Далее уменьшаем количество потоков на |
## Откроем файл для чтения |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
единицу. Почему? Все просто – Perl ведет |
open(RET,"ret"); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
отсчет значений числовых переменных с 0, |
## Заблокируем его от других процессов |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
поэтому если мы имеем 5 потоков, то на са- |
flock(RET,2); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
мом деле их будет 6, что не совсем коррект- |
## Получим значение переменной |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
но. Затем инициализируем переменную $ret, |
$ret=<RET>; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
которая изначально будет равна удвоенному |
## Закроем файл |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
произведению тредов. Смысл этого вот в |
close(RET); |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
чем: во время рождения нового подпроцесса |
## И вернем $ret |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
будем уменьшать $ret. Как только значение |
return $ret; |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
переменной становится равным значению |
} |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
$threads – происходит временная блокиров- |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ка создания потомков. По мере отмирания |
Аналогично пишем putret(), в которой вы- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
тредов, увеличиваем $ret, что позволяет соз- |
полняется обратный процесс :). Правда, |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
дать еще один потомок. Иными словами, |
процедура ничего не возвращает. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
вспомогательная переменная нужна для под- |
КОНТРОЛЬ РОЖДАЕМОСТИ |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
держания постоянного числа нитей. |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
Как говорится, гладко было на бумаге, но |
Теперь вернемся к контролю числа потом- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
забыли про овраги. Дело в том, что главная |
ков. Как только получаем, что $ret становит- |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
программа и ее потомок не могут иметь общих |
ся меньше, чем $threads – впадаем в спячку |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
переменных. Точнее, главный процесс не име- |
(ждем 10 секунд и еще раз запрашиваем |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
ет доступа к переменным подпроцесса. Возни- |
$ret). В противном случае ничто не мешает |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
кает вопрос: как же передать значение $ret в |
родить законный подпроцесс. |
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
ПРОБЛЕМА С ЛОКАЛЬЮ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ак известно, все буржуйские проекты плохо дружат с рус- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ê ским языком. ActivePerl в частности. В случае русскоязычных |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
запросов подсветка ключевых фраз будет невозможной. Для |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
решения проблемы можно использовать модуль locale. Следу- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ющие три строки кода полностью решают проблему с языком: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use locale; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use POSIX qw (locale_h); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setlocale(LC_CTYPE, 'ru_RU.KOI8-R'); |
|
|
|
|
|
|
|
|
|
|
|
|
|


ХРАНИ ИНФОРМАЦИЮ ПО-УМНОМУ!
На нашем диске ты найдешь последнюю версию OpenLDAP, GDBM и BDB, подробные мануалы по этим системам, а также описание LDAP Api в PHP и еще кучу необходимой информации.
НЕМНОГО ИСТОРИИ
СЛЕНГ
УСТАНОВКА OPENLDAP
LDAP API Â PHP
На сегодняшний день существует несколько реализаций протокола LDAP от производителей софта, наиболее известные из которых: Active Derectory от Microsoft, Directory Service от Netscape и продукт Novell с одноименным названием.
Для полноценной установки OpenLDAP необходимо наличие в системе одного из следующих серверов баз данных: GDBM или BerkeleyDB. Обе БД поставляются открытыми кодами, и ты можешь скачать их из Сети либо взять с диска.
www.cs.ucsd.edu/groups/hpcl/apples/pubs/nec97.ps
www.openldap.org
ftp://ftp.rfc-editor.org/in-notes/rfc2255.txt
ftp://ftp.rfc-editor.org/in-notes/rfc2830.txt
halfos.street-tv.net/lib/php/function.ldap-search.php.htm
php4you.kiev.ua/docs/print/php4/ref.ldap.html
halfos.street-tv.net/lib/php/ref.ldap.php.html
ПРИМЕР СИСТЕМЫ LDAP-PHP
Как вести себя на допросе. Советы от знающего человека.
Докучаев Дмитрий aka Forb (forb@real.xakep.ru)
ПИШЕМ ПОИСКОВУЮ СИСТЕМУ
На нашем диске ты найдешь скрипты для поисковой системы и патченный модуль Recursive.pm.
КАК ЭТО РАБОТАЕТ?
РОЖДЕНИЕ ИНДЕКСАТОРА
WEB-ПОИСК – ЛИЦО СИСТЕМЫ
Скачать полную версию поисковика ты можешь по ссылке kamensk.net.ru/for b/1/x/search_system.tar.gz. Там ты найдешь фейс к системе, а также два главных скрипта.
В скрипте индексатора содержится отладочная информация. Убирать ее не рекомендую, так как вполне возможна ошибка при работе, которую ты легко можешь исправить с помощью дебага.
mindw0rk (mindw0rk@mail.ru)