Разработка поискового робота на Erlang
Описано использование преимуществ функционального языка программирования Erlang для построения распределенных вычислений в веб-среде на примере разработки поискового робота. This paper describes the advantages of using a functional programming language Erlang for building a distributed computing in...
Saved in:
| Published in: | Управляющие системы и машины |
|---|---|
| Date: | 2013 |
| Main Authors: | , , |
| Format: | Article |
| Language: | Russian |
| Published: |
Міжнародний науково-навчальний центр інформаційних технологій і систем НАН та МОН України
2013
|
| Subjects: | |
| Online Access: | https://nasplib.isofts.kiev.ua/handle/123456789/83168 |
| Tags: |
Add Tag
No Tags, Be the first to tag this record!
|
| Journal Title: | Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| Cite this: | Разработка поискового робота на Erlang / И.А. Вавилин, А.Н. Глибовец, Н.Н. Глибовец // Управляющие системы и машины. — 2013. — № 3. — С. 68-74. — Бібліогр.: 16 назв. — рос. |
Institution
Digital Library of Periodicals of National Academy of Sciences of Ukraine| id |
nasplib_isofts_kiev_ua-123456789-83168 |
|---|---|
| record_format |
dspace |
| spelling |
Вавилин, И.А. Глибовец, А.Н. Глибовец, Н.Н. 2015-06-16T14:07:28Z 2015-06-16T14:07:28Z 2013 Разработка поискового робота на Erlang / И.А. Вавилин, А.Н. Глибовец, Н.Н. Глибовец // Управляющие системы и машины. — 2013. — № 3. — С. 68-74. — Бібліогр.: 16 назв. — рос. 0130-5395 https://nasplib.isofts.kiev.ua/handle/123456789/83168 004.4 Описано использование преимуществ функционального языка программирования Erlang для построения распределенных вычислений в веб-среде на примере разработки поискового робота. This paper describes the advantages of using a functional programming language Erlang for building a distributed computing in the Web environment on the example of a search engine robot. Описано використання переваг функціональної мови програмування Erlang для побудови розподілених обчислень у веб-середовищі на прикладі розробки пошукового робота. ru Міжнародний науково-навчальний центр інформаційних технологій і систем НАН та МОН України Управляющие системы и машины Программная инженерия и программные средства Разработка поискового робота на Erlang The Development of Search Robot in Erlang Розробка пошукового робота на Erlang Article published earlier |
| institution |
Digital Library of Periodicals of National Academy of Sciences of Ukraine |
| collection |
DSpace DC |
| title |
Разработка поискового робота на Erlang |
| spellingShingle |
Разработка поискового робота на Erlang Вавилин, И.А. Глибовец, А.Н. Глибовец, Н.Н. Программная инженерия и программные средства |
| title_short |
Разработка поискового робота на Erlang |
| title_full |
Разработка поискового робота на Erlang |
| title_fullStr |
Разработка поискового робота на Erlang |
| title_full_unstemmed |
Разработка поискового робота на Erlang |
| title_sort |
разработка поискового робота на erlang |
| author |
Вавилин, И.А. Глибовец, А.Н. Глибовец, Н.Н. |
| author_facet |
Вавилин, И.А. Глибовец, А.Н. Глибовец, Н.Н. |
| topic |
Программная инженерия и программные средства |
| topic_facet |
Программная инженерия и программные средства |
| publishDate |
2013 |
| language |
Russian |
| container_title |
Управляющие системы и машины |
| publisher |
Міжнародний науково-навчальний центр інформаційних технологій і систем НАН та МОН України |
| format |
Article |
| title_alt |
The Development of Search Robot in Erlang Розробка пошукового робота на Erlang |
| description |
Описано использование преимуществ функционального языка программирования Erlang для построения распределенных вычислений в веб-среде на примере разработки поискового робота.
This paper describes the advantages of using a functional programming language Erlang for building a distributed computing in the Web environment on the example of a search engine robot.
Описано використання переваг функціональної мови програмування Erlang для побудови розподілених обчислень у веб-середовищі на прикладі розробки пошукового робота.
|
| issn |
0130-5395 |
| url |
https://nasplib.isofts.kiev.ua/handle/123456789/83168 |
| citation_txt |
Разработка поискового робота на Erlang / И.А. Вавилин, А.Н. Глибовец, Н.Н. Глибовец // Управляющие системы и машины. — 2013. — № 3. — С. 68-74. — Бібліогр.: 16 назв. — рос. |
| work_keys_str_mv |
AT vavilinia razrabotkapoiskovogorobotanaerlang AT glibovecan razrabotkapoiskovogorobotanaerlang AT glibovecnn razrabotkapoiskovogorobotanaerlang AT vavilinia thedevelopmentofsearchrobotinerlang AT glibovecan thedevelopmentofsearchrobotinerlang AT glibovecnn thedevelopmentofsearchrobotinerlang AT vavilinia rozrobkapošukovogorobotanaerlang AT glibovecan rozrobkapošukovogorobotanaerlang AT glibovecnn rozrobkapošukovogorobotanaerlang |
| first_indexed |
2025-11-27T08:21:36Z |
| last_indexed |
2025-11-27T08:21:36Z |
| _version_ |
1850805633946746880 |
| fulltext |
68 УСиМ, 2013, № 3
Программная инженерия и программные средства
УДК 004.4
И.А. Вавилин, А.Н. Глибовец, Н.Н. Глибовец
Разработка поискового робота на Erlang
Описано использование преимуществ функционального языка программирования Erlang для построения распределенных вычисле-
ний в веб-среде на примере разработки поискового робота.
This paper describes the advantages of using a functional programming language Erlang for building a distributed computing in the
Web environment on the example of a search engine robot.
Описано використання переваг функціональної мови програмування Erlang для побудови розподілених обчислень у веб-
середовищі на прикладі розробки пошукового робота.
Введение. В современном мире распределен-
ные вычисления – актуальное направление раз-
вития компьютерных наук. Существует много
задач, требующих сложных или длительных вы-
числений [1]. Для работ такого масштаба не до-
статочно мощностей одного вычислительного
узла, даже если это современный суперкомпью-
тер. Поэтому вариантом решения этой пробле-
мы есть разбиение задачи на части и использо-
вание сети компьютеров. Для управления таки-
ми сетями создают специализированные про-
граммные комплексы. Большинство из них раз-
работаны на С++, поскольку это язык высоко-
го быстродействия, поддерживающий мощную
библиотеку для организации распределенных
вычислений – Message Passing Interface (MPI,
интерфейс передачи сообщений). Это хорошо
стандартизованный механизм построения парал-
лельных программ, основанный на модели обме-
на сообщениями. Известны и системы, реализо-
ванные на других объектно-ориентированных
языках Java и PHP [2]. В последнее десятиле-
тие появились функциональные языки програм-
мирования со специализированными средствами
разработки распределенных вычислительных
сред [3, 4].
В веб-среде проблема масштабных вычис-
лений также наблюдается. Количество информа-
ции в сети Интернет очень быстро растет и для
ее обработки и структурирования разрабаты-
ваются специальные программные системы,
называемые поисковыми роботами (web craw-
ler, spider) [5].
Наиболее известные поисковые системы име-
ют своих поисковых роботов. Большинство из
них разработаны на С++, Java и PHP [6]. Но
неизвестны разработки роботов с использова-
нием функциональных языков, хотя они имеют
определенные преимущества для решения этой
задачи. Поэтому цель этой работы – выявление
этих преимуществ на примере создания поис-
кового робота с использованием функциональ-
ного языка Erlang.
Erlang – функциональный язык программи-
рования с динамической типизацией, разрабо-
танный для создания распределенных вычис-
лительных систем [7]. Он имеет средства для
порождения параллельных процессов и их
коммуникации с помощью асинхронных со-
общений. Кросс-платформенность обеспечива-
ется путем компиляции программы в байт-код,
выполняемый на виртуальной машине.
Поисковый робот
Поисковый робот (ПР) – это программная
компонента, входящая в состав поисковой сис-
темы, предназначенная для обработки веб-
страниц и занесения информации о них в базу
данных поисковой системы [8]. Стандартные
функции ПР – анализ структуры сайта, сохра-
нение в базе данных информации о каждой
странице сайта и мониторинг его доступности.
Некоторые ПР имеют набор дополнительных
функций, среди которых можно выделить: со-
хранение локальной копии всех обработанных
страниц для обеспечения быстрого поиска ин-
УСиМ, 2013, № 3 69
формации в них, валидация HTML-кода, сбор
e-mail адресов для отправки спама [9].
Алгоритм работы ПР начинается с анализа
некоторого начального набора веб-адресов. На
каждой выбранной странице ищутся новые
ссылки, которые хранятся в очереди для даль-
нейшей обработки.
Обработка веб-адресов регулируется опреде-
ленным набором политик: выбора страниц для
загрузки, время повторной обработки веб-стра-
ницы для проверки изменений, которые могли
произойти после последней обработки, вежли-
вости (регулирует предотвращение перегрузки
обрабатываемых сайтов), политика параллели-
зации (регулирует механизм координации дей-
ствий для распределенных поисковых роботов).
Во избежание обработки одних и тех же стра-
ниц используется нормализация веб-адресов.
Это приведение ссылки к определенному ка-
ноническому виду. Для этого, в частности, сим-
волы приводятся к одному регистру, убирают-
ся номера портов по умолчанию, лишние точ-
ки и слеши. В разработанном ПР реализована
функция нормализации адресов, выполняющая
все основные операции без изменения семан-
тики адреса.
Архитектура поискового робота
Поисковый робот был разработан по прин-
ципу клиент-серверной архитектуры. Он состоит
из главного процесса, который получает зада-
ния извне и распределяет их между рабочими
процессами. Главный процесс периодически
проверяет наличие новых задач в базе данных.
Рабочие процессы могут быть запущены на лю-
бом, правильно настроенном компьютере, к ко-
торому есть доступ по сети. Рабочие процессы
также могут быть запущены на том же компь-
ютере, что и главный процесс. Тогда поиско-
вый робот перестает быть распределенным, но
сохраняет полную функциональность. Для хра-
нения информации используется NoSQL СУБД
MongoDB, которая тоже может работать в рас-
пределенном режиме. Она имеет высокую про-
изводительность, а ее документоориентирован-
ность подходит для сохранения результатов
работы поискового робота (рис. 1).
Рис. 1. Архитектура поискового работа
СУБД MongoDB
В качестве хранилища данных для поиско-
вого работа была выбрана СУБД MongoDB. Она
документо-ориентированна и относится к клас-
су NoSQL СУБД. Данные сохраняются в фор-
мате BSON (похожий на JSON) и не имеют оп-
ределенной схемы, т.е. документы в коллекции
могут иметь разную структуру.
Выделяют следующие свойства MongoDB
[13]: гибкий язык для формирования запросов
(можно написать собственные функции на Java-
script для обработки данных); полная поддерж-
ка индексов (любое поле может быть проин-
дексировано); поддержка master–slave репли-
кации (slave-узлы могут выбрать новый master-
узел, если текущий недоступен); горизонталь-
ная масштабируемость (с использованием шар-
динга); поддержка балансировки нагрузок ме-
жду шардами; данные можно агрегировать, ис-
пользуя подход MapReduce.
Структура базы данных crawler для разрабо-
танного поискового робота состоит из трех
коллекций. Для хранения веб-адресов, требую-
щих обработки, используется коллекция pen-
ding_urls. Документы в этой коллекции обыч-
но (поскольку СУБД не накладывает ограни-
чений) имеют структуру, приведенную в лис-
тинге 1. Кроме самой ссылки в них хранится
список рефералов и статус документа – в ожи-
дании или в обработке. Также может быть за-
полнено поле operation. В этом случае будет
проведена дополнительная обработка докумен-
та по типу операции.
70 УСиМ, 2013, № 3
"_id" : ObjectId,
"url" : string,
"referral_list" : array,
"status" : string,
"d_change" : date,
"operation" : array
Листинг 1. Структура документа в коллекции
pending_urls
Для хранения результатов обработки веб-
страниц используется коллекция processed_-
urls. Структура документов в этой коллекции
приведена в листинге 2.
"_id" : string,
"content-length" : string,
"content-type" : string,
"server" : string,
"http_returncode" : integer,
"referral_count" : integer,
"referral_list" : array,
"links_count" : integer,
"d_processed" : date,
"operation" : array
Листинг 2. Структура документа в коллекции
processed_urls
В документах коллекции processed_urls хра-
нится информация: тип
"_id" : ObjectId,
"url" : string,
"text" : string,
"positions" : array,
"d_search" : date
Листинг 3. Структура документа в коллекции
search_results
контента и его размер, веб-сервер, на котором
работает веб-страница, идентификатор ответа
веб-сервера, по которому можно определить
доступность страницы, рефералы и количество
ссылок, найденных на этой странице.
Для хранения результатов поиска использу-
ется коллекция search_results. Структура до-
кументов в этой коллекции приведена в лис-
тинге 3.
В документах коллекции search_results хра-
нится адрес веб-страницы, на которой прово-
дился поиск, текст поиска и позиции, на кото-
рых этот текст был найден.
Рабочий узел поискового робота
Рабочий узел реализован в виде модуля
web_crawler_slave. Этот модуль экспортирует
функции process для запуска процесса, который
обрабатывает веб-страницы и add_pending_url
для добавления новой ссылки в коллекцию
pending_urls и ее дальнейшей обработки.
Функция process имеет обязательный пара-
метр URL и необязательный – Referral_URL, т.е.
список рефералов. Она реализована по следу-
ющему алгоритму.
Функция получает на вход веб-страницу, ко-
торую требуется обработать. Подключается к
базе данных. Получает из базы дополнительные
данные о текущем задании. Изменяет его ста-
тус на processing. Выполняет нормализацию ад-
реса. Опрашивает веб-страницу по данному ад-
ресу, отделяет полученные заголовки и тело са-
мой страницы. При необходимости выполняет
дополнительную обработку веб-страницы, на-
пример, поиск информации. Находит новые
ссылки и записывает их в базу данных. Добав-
ляет информацию о текущей странице в коллек-
цию processed_urls. Удаляет веб-страницу кол-
лекции pending_urls и завершает работу.
Для взаимодействия Erlang с MongoDB ис-
пользуется библиотека mongodb-erlang, кото-
рая находится в свободном доступе на github
[14]. В ней реализованы все функции, необхо-
димые для работы с этой СУБД. В листинге 4
приведен код, выполняющий подключение к
базе данных и запрашивающий документы из
коллекции pending_urls с определенным url.
application:start (mongodb),
case mongo:connect (?MongoDBHost) of
{ok, MongoConn} –> {ok, Row_pending}=mongo:
do(safe, master, MongoConn, crawler, fun()–>mongo:
find_one (pending_urls,{url, URL})
end);
{error, Reason} exit(normal)
end.
Листинг 4. Подключение и запрос к MongoDB
Во избежание незапланированной повтор-
ной обработки страницы была реализована
функция нормализации адреса. Ее код приве-
ден в листинге 5. Функция использует вспомо-
гательные функции, приведенные в листинге 6.
normalize_url(URL)–>
URL_string=bitstring_to_list(URL),
{Scheme, UserInfo, Host, Port, Path, Query}=http_uri:
parse(URL_string),
УСиМ, 2013, № 3 71
list_to_binary(lists:append([atom_to_list(Scheme),
“://”,get_right_userinfo(UserInfo),string:to_lower
(Host),
get_right_port(Scheme,Port),get_right_path(Path),
Query])).
Листинг 5. Функция для нормализации веб-адресов
is_default_port(http,80) –> true;
is_default_port(https,443) –> true;
is_default_port(Scheme,Port)–>false.
get_right_port(Scheme,Port) –>
case is_default_port(Scheme, Port) of
'false' –> string:concat(":", Port);
'true' –> []
end.
get_right_userinfo([])–> [];
get_right_userinfo(UserInfo)–>string:concat(UserInfo,
"@").
path_to_upper(Path,[]) –> Path;
path_to_upper(Path,[Pos|Rest]) –>
lists:append([
lists:sublist(Path, element(1,lists:last(Pos))-1),
string:to_upper(lists:sublist(Path,
element(1,lists:last(Pos)), element(2,lists:last(Pos)))),
path_to_upper(lists:sublist(Path,
element(1,lists:last(Pos))
+element(2,lists:last(Pos)),length(Path)),Rest)
]).
get_right_path(Path) –>
{ok, Reg_replase }=re:compile("\\.\\./|\\./"),
New_path=re:replace(Path,Reg_replase ,"",[global,
{return,list}]),
{ok,Regexp}=re:compile("%[0-9abcdef][0-9abcdef]"),
case re:run(New_path,Regexp ,[global]) of
{match, Matches} –> path_to_upper
(New_path,Matches);
nomatch –> New_path
end.
Листинг 6. Вспомогательные функции для
нормализации веб-адресов
Процесс нормализации состоит из: приве-
дения адреса узла к нижнему регистру; отвер-
жения номера порта при использовании его по
умолчанию; приведения закодированных сим-
волов в адресе к верхнему регистру; удаления
лишних точек.
Для работы с веб-средой используется биб-
лиотека inets. В частности, для загрузки веб-
страницы используется функция request из мо-
дуля httpc, а для обработки ссылки – функция
parse из модуля http_uri. Пример кода для по-
лучения страницы приведен в листинге 7.
inets:start(),
case httpc:request(URL) of
{ok, {_Status, H, HTML}}→process_body(HTML);
{error, Reason} → exit(normal)
end.
Листинг 7. Загрузка веб страницы
extract_urls(_,[],_,_,_)-> [];
extract_urls(Body,[Pos|Positions],Conn,Referral_URL,
Operation)->
URL=normalize_url(binary_part(Body,element(1,
lists:last(Pos)),
element(2,lists:last(Pos)))),
add_pending_url(Conn,URL,Referral_URL,Operation),
extract_urls(Body,Positions,Conn,Referral_URL,Operation).
find_urls(Body,Referral_URL,Conn,Operation)->
{ok,Regexp}=re:compile("<a[^\>]+href=[\"\']([^\"\
']+)[\"\']"),
case re:run(Body,Regexp,[global]) of
{match, Matches} ->
extract_urls(Body,Matches,
Conn,Referral_URL,Operation),
length(Matches);
nomatch -> 0
end.
Листинг 8. Функции для получения веб-адресов со
страницы
После получения страницы в ней ищут но-
вые адреса.
Для поиска веб-адресов и их выделения на
странице реализованы функции find_urls и
extract_urls. Они приведены в листинге 8.
Ссылки, найденные на странице не сразу до-
бавляются в базу данных. Сначала они про-
ходят валидацию, чтобы определить, может ли
этот адрес быть обработанным. Затем прове-
ряется наличие этого адреса в коллекции
processed_urls. Если его там нет (он еще не об-
рабатывался), адрес добавляется к коллекции
pending_urls. Если этот адрес уже обрабатывал-
ся, согласно политике повторной обработки, оп-
ределяется его возраст, т.е. время, прошедшее с
момента его обработки. Если время превышает
60 с, адрес добавляется к pending_urls для по-
вторной обработки. В противном случае теку-
щий реферал этого адреса добавляется к доку-
менту в коллекции processed_urls. Код описан-
ной функции приведен в листинге 9.
72 УСиМ, 2013, № 3
add_pending_url(Conn,URL,Referral_URL,Operation)->
case http_uri:parse(binary_to_list(URL)) of
{error, no_scheme} ->
{Scheme, UserInfo, Host, Port, Path, Query}=
http_uri:parse(binary_to_list(Referral_URL)),
New_URL=lists:append([atom_to_list(Scheme),"://",
get_right_userinfo(UserInfo),Host,get_right_port(Sche-
me,Port),URL]),
add_pending_url(Conn,New_URL,Referral_URL,Operation);
{error, _} -> {ok};
{Scheme, UserInfo, Host, Port, Path, Query}->
{_, _, Referral_Host, _, _, _}=http_uri:parse(binary_to_
list(Referral_URL)),
if Host= =Referral_Host ->
Norm_URL=normalize_url(URL),
{ok,Row_processed}=mongo:do(safe, master, Conn,
?DB, fun() ->
mongo:find_one(?COLLECTION2,{'_id', Norm_URL,
operation,Operation}) end),
if tuple_size(Row_processed)>0 ->
Row_processed_list=list2tupleslist(tuple_to_list(element
(1,Row_processed))),
D_processed=atom_to_list(element(2,lists:keyfind(d_pro
cessed,1,
Row_processed_list))),
Age=calendar:datetime_to_gregorian_seconds(calendar:
local_time())-
stdate_to_sec(D_processed);
true -> Age=1000
end,
if Age<?REPROCESS_INTERVAL ->
add_referral_to_processed_url(Conn,
Norm_URL,Referral_URL,Operation);
true->
{ok,Row_pending}=mongo:do(safe, master, Conn,
?DB, fun() ->
mongo:find_one(?COLLECTION1,{url,
Norm_URL,status,pending,operation,Operation})
end),
if tuple_size(Row_pending)>0 ->
Row_pending_list=list2tupleslist(tuple_to_list(element
(1, Row_pending))),
mongo:do (safe, master, Conn, ?DB, fun() ->
mongo:repsert (?COLLECTION1, {url, Norm_URL
status,pending},
{url, Norm_URL,referral_list,lists: umerge(element(2,
lists:keyfind(referral_list,1,Row_pending_list)),
[Referral_URL]),
status,pending,d_change,stdate(),operation,Operation})
end);
true -> mongo:do (safe, master, Conn, ?DB, fun() ->
mongo:repsert (?COLLECTION1, {url, Norm_URL,
status,pending},
{url, Norm_URL,referral_list,[Referral_URL],status,
pending,d_change,stdate(),
operation,Operation}) end)
end, {ok} end; true -> {ok} end end.
Листинг 9. Функция добавления новой ссылки для
дальнейшей обработки
Главный блок поискового робота
Блок состоит из нескольких модулей.
Модуль web_crawler_app базируется на appli-
cation и состоит из функций start и stop. Он
контролирует правильный запуск и остановку
ПР. Код модуля приведен в листинге 10.
-module(web_crawler_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Type,_Args) –>
web_crawler_sup:start_link().
stop(_State) –>
ok.
Листинг 10. Модуль web_crawler_app
-module(web_crawler_sup).
-behaviour(supervisor).
-export([start_link/0]).
-export([init/1]).
start_link() –>
supervisor:start_link({globa,supervisor},
web_crawler_sup, []).
init(_Args) –>
pool:start(crawler_pool),
{ok, {{one_for_one, 1, 60},
[{web_crawler_master, {web_crawler_master,
start_link, []},
permanent, brutal_kill, worker,
[web_crawler_master]}]}}.
Листинг 11. Модуль web_crawler_sup
Модуль web_crawler_sup базируется на по-
ведении supervisor. Его основная задача – за-
пуск главного процесса поискового робота и
контроль за его работой, т.е. перезапуск в
случае отказа. Модуль состоит из функции
start_link, который запускает web_crawler_app,
и функции init, в которой прописано, как за-
пускать главный поток, и алгоритм его переза-
пуска. Коды модуля приведены в листинге 11.
Последний и главный модуль – web_craw-
ler_master. Он базируется на поведении gen_
server. Его главная задача – проверка нали-
чия веб-адресов, ожидающих обработки, и рас-
пределение задач на обработку между рабо-
чими узлами.
УСиМ, 2013, № 3 73
После инициализации модуля, включается
функция process_urls, уходящая в хвостовую
рекурсию и вызываемая. пока работа не будет
остановлена. Эта функция подключается к базе
данных, выбирает все ссылки из коллекции
pending_urls и вызывает функцию distribute_urls,
которая в свою очередь создает процессы для
их обработки на рабочих узлах. Код функций
приведен в листинге 12.
process_urls(MongoConn,Log,0) –>
exit(normal);
process_urls(MongoConn, Log, Times) –>
logger:write(Log,"Processing pending urls.
Times=pn",[Times]),
{ok,Result}=mongo:do(safe, master, MongoConn,
?DB, fun()
mongo:find(?COLLECTION1,{status,pending})end),
Rows=mongo:rest(Result),
logger:write(Log, "Found p urls. Starting distribu
tion.n",
[length(Rows)]),
distribute_urls(Rows),
if is_integer(Times) –> T=Times -1;
true –> T= Times
end,
process_urls(MongoConn,Log,T).
distribute_urls([])–> {ok};
distribute_urls([Row| Rows]) –>
pool:pspawn(web_crawler_slave,process,
[element(4, Row),element(6, Row)]),
distribute_urls(Rows).
Листинг 12. Функции process_urls и distribute_urls
Благодаря использованию поведения gen_-
server, модуль web_crawler_master может при-
нимать синхронные и асинхронные запросы. С
использованием асинхронного запроса реали-
зована внешняя функция add_url, определяю-
щая новый адрес для обработки ПР.
Также реализована функция для поиска оп-
ределенного текста на веб-страницах. Она ис-
пользует функцію add_url и добавляет новый
адрес в коллекцию pending_urls. Но в этом слу-
чае в поле operation отмечается, что это поиск
текста. Коды этих функций приведены в лис-
тинге 13.
Механизм работы в распределенном ре-
жиме. Наш ПР может работать в многопоточ-
ном режиме на одном компьютере, но тогда
add_url(URL) –>
gen_server:cast(web_crawler_master,{add_url,URL, {}}).
add_url(URL, Operation) –>
gen_server:cast(web_crawler_master, {add_url, URL,
Operation }).
search_text(URL,Text) –>
add_url(URL, {search,list_to_binary(Text)}).
handle_cast({add_url,URL,Operation},{MongoConn,Fd})–>
web_crawler_slave:add_pending_url(MongoConn,
list_to_binary(URL),
[],Operation),
{noreply,{MongoConn,Fd}}.
Листинг 13. Функции add_url и search_text
он должен был быть распределенным. Для это-
го были использованы модуль pool, входящий
в состав Erlang. Он позволяет объединять рабо-
чие узлы в пул, после чего главный узел будет
указывать пулу на создание нового процесса, а
на каком именно узле его создавать будет ре-
шать сам контроллер пула. Этим достигается
балансировка нагрузок, так как новый процесс
всегда создается на наименее загруженном уз-
ле, а также постоянно поддерживается актуаль-
ная информация об имеющихся в пуле узлах.
Следует отметить, что добавлять новые узлы
можно без остановки работы системы.
Для запуска пула необходимо выполнить сле-
дующие шаги [15]. Подготовить набор компью-
теров с одинаковой средой Erlang, один из ко-
торых будет главным. Послать на все компью-
теры программный код, который будет запус-
каться. На главном узле создать файл .Hosts.-
erlang, в котором прописать названия всех ра-
бочих узлов, по которым к ним можно присое-
диниться. Создать на всех узлах одинаковый
файл .Erlang.cookie, в котором должна быть
записана строка текста, общая для всех узлов,
чтобы компьютеры одного пула «видели» друг
друга. Настроить на главном узле беспароль-
ный доступ через ssh ко всем рабочим узлам.
Запустить на главном узле именуемую среду
Erlang. Это достигается командой erl-sname
<имя узла>.
Затем инициализируем пул командой pool:
start (<имя пула>), а процессы в нем создаются
командой pspawn (<имя модуля>, <имя функ-
ции>, <параметры функции>). Таким образом
74 УСиМ, 2013, № 3
была реализована работа с пулом в поисковом
роботе и он стал распределенным.
Заключение. Описано построение ПР со
следующими функциями: построение структу-
ры веб-ресурса, мониторинг доступности его
страниц и поиск теста. Он имеет клиент-
серверную архитектуру и работает с СУБД
MongoDB.
В качестве дальнейшего развития системы
было бы полезно осуществить удаленную за-
грузку кода. Чтобы запустить процесс на рабо-
чем узле, необходим код. В Erlang есть модуль
erl_boot_server, который при правильной на-
стройке позволяет загружать код из главного
узла в момент запуска среды на рабочем узле,
что устраняет необходимость постоянной под-
держки актуальной версии кода на всех узлах.
Для ускорения работы с базой данных мож-
но использовать репликацию на несколько узлов
[16]. В Erlang, с помощью конструкции replset,
можно балансировать запросы между разными
узлами, что ускорило бы операции чтения и
дало значительный прирост быстродействия на
большом количестве рабочих процессов.
1. Глибовец Н.Н., Гороховский С.С. Проектирование
инструментария сетевого программного продукта.
Современное состояние и перспективы развития
// Проблеми програмування. – 2010. – № 2–3. –
С. 102–107.
2. citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.
202. 692...
3. www.cs.kent.ac.uk/projects/ofa/.../tutorial.p...
4. https://wiki.cse.unsw.edu/cs4181/12s2/Presentation%20
Topicsr
5. Глибовець А.М., Шабінський А.С. Один підхід до по-
будови інтелектуальної пошукової системи // Наук.
зап. НаУКМА. Комп’ютерні науки. – 2010. –112. –
С. 26–30.
6. ilpubs.stanford.edu:8090/604/1/2003-44.pdf
7. www.erlang. org/.../erlang-book-part1.pdf
8. http://en.wikipedia.org/wiki/Web_crawler
9. Глибовец Н.Н., Глибовец А.Н., Шабинский А.С. При-
менение онтологий и методов текстового анализа
при создании интеллектуальных поисковых систем
// Проблемы управления и информатики. – 2011. –
№ 6. – С. 95–102.
10. Menczer F. ARACHNID: Adaptive Retrieval Agents
Choosing Heuristic Neighborhoods for Information
Discovery / D. Fisher, ed., Machine Learning: Proc. of
the 14th Int. Conf. (ICML97), 1997
11. http://en.wikipedia.org/wiki/Robots_Exclusion_Standard
12. http://en.wikipedia.org/wiki/Distributed_web_crawling
13. http://en.wikipedia.org/wiki/MongoDB
14. stackoverflow.com/.../mongodb-erlang-erla...
15. http://habrahabr.ru/post/114663/
16. http://express-js.ru/mongo-book/Glava-7-Proizvoditel-
nost-i-instrumentarij.html
Поступила 18.10.2012
Тел. для справок: +38 044 463-6985 (Киeв)
E-mail: glib@ukma.kiev.ua
© И.А. Вавилин, А.Н. Глибовец , Н.Н. Глибовец , 2013
Внимание !
Оформление подписки для желающих
опубликовать статьи в нашем журнале обязательно.
В розничную продажу журнал не поступает.
Подписной индекс 71008
<<
/ASCII85EncodePages false
/AllowTransparency false
/AutoPositionEPSFiles true
/AutoRotatePages /None
/Binding /Left
/CalGrayProfile (Dot Gain 20%)
/CalRGBProfile (sRGB IEC61966-2.1)
/CalCMYKProfile (U.S. Web Coated \050SWOP\051 v2)
/sRGBProfile (sRGB IEC61966-2.1)
/CannotEmbedFontPolicy /Error
/CompatibilityLevel 1.4
/CompressObjects /Tags
/CompressPages true
/ConvertImagesToIndexed true
/PassThroughJPEGImages true
/CreateJobTicket false
/DefaultRenderingIntent /Default
/DetectBlends true
/DetectCurves 0.0000
/ColorConversionStrategy /CMYK
/DoThumbnails false
/EmbedAllFonts true
/EmbedOpenType false
/ParseICCProfilesInComments true
/EmbedJobOptions true
/DSCReportingLevel 0
/EmitDSCWarnings false
/EndPage -1
/ImageMemory 1048576
/LockDistillerParams false
/MaxSubsetPct 100
/Optimize true
/OPM 1
/ParseDSCComments true
/ParseDSCCommentsForDocInfo true
/PreserveCopyPage true
/PreserveDICMYKValues true
/PreserveEPSInfo true
/PreserveFlatness true
/PreserveHalftoneInfo false
/PreserveOPIComments true
/PreserveOverprintSettings true
/StartPage 1
/SubsetFonts true
/TransferFunctionInfo /Apply
/UCRandBGInfo /Preserve
/UsePrologue false
/ColorSettingsFile ()
/AlwaysEmbed [ true
]
/NeverEmbed [ true
]
/AntiAliasColorImages false
/CropColorImages true
/ColorImageMinResolution 300
/ColorImageMinResolutionPolicy /OK
/DownsampleColorImages true
/ColorImageDownsampleType /Bicubic
/ColorImageResolution 300
/ColorImageDepth -1
/ColorImageMinDownsampleDepth 1
/ColorImageDownsampleThreshold 1.50000
/EncodeColorImages true
/ColorImageFilter /DCTEncode
/AutoFilterColorImages true
/ColorImageAutoFilterStrategy /JPEG
/ColorACSImageDict <<
/QFactor 0.15
/HSamples [1 1 1 1] /VSamples [1 1 1 1]
>>
/ColorImageDict <<
/QFactor 0.15
/HSamples [1 1 1 1] /VSamples [1 1 1 1]
>>
/JPEG2000ColorACSImageDict <<
/TileWidth 256
/TileHeight 256
/Quality 30
>>
/JPEG2000ColorImageDict <<
/TileWidth 256
/TileHeight 256
/Quality 30
>>
/AntiAliasGrayImages false
/CropGrayImages true
/GrayImageMinResolution 300
/GrayImageMinResolutionPolicy /OK
/DownsampleGrayImages true
/GrayImageDownsampleType /Bicubic
/GrayImageResolution 300
/GrayImageDepth -1
/GrayImageMinDownsampleDepth 2
/GrayImageDownsampleThreshold 1.50000
/EncodeGrayImages true
/GrayImageFilter /DCTEncode
/AutoFilterGrayImages true
/GrayImageAutoFilterStrategy /JPEG
/GrayACSImageDict <<
/QFactor 0.15
/HSamples [1 1 1 1] /VSamples [1 1 1 1]
>>
/GrayImageDict <<
/QFactor 0.15
/HSamples [1 1 1 1] /VSamples [1 1 1 1]
>>
/JPEG2000GrayACSImageDict <<
/TileWidth 256
/TileHeight 256
/Quality 30
>>
/JPEG2000GrayImageDict <<
/TileWidth 256
/TileHeight 256
/Quality 30
>>
/AntiAliasMonoImages false
/CropMonoImages true
/MonoImageMinResolution 1200
/MonoImageMinResolutionPolicy /OK
/DownsampleMonoImages true
/MonoImageDownsampleType /Bicubic
/MonoImageResolution 1200
/MonoImageDepth -1
/MonoImageDownsampleThreshold 1.50000
/EncodeMonoImages true
/MonoImageFilter /CCITTFaxEncode
/MonoImageDict <<
/K -1
>>
/AllowPSXObjects false
/CheckCompliance [
/None
]
/PDFX1aCheck false
/PDFX3Check false
/PDFXCompliantPDFOnly false
/PDFXNoTrimBoxError true
/PDFXTrimBoxToMediaBoxOffset [
0.00000
0.00000
0.00000
0.00000
]
/PDFXSetBleedBoxToMediaBox true
/PDFXBleedBoxToTrimBoxOffset [
0.00000
0.00000
0.00000
0.00000
]
/PDFXOutputIntentProfile ()
/PDFXOutputConditionIdentifier ()
/PDFXOutputCondition ()
/PDFXRegistryName ()
/PDFXTrapped /False
/CreateJDFFile false
/Description <<
/ARA <FEFF06270633062A062E062F0645002006470630064700200627064406250639062F0627062F0627062A002006440625064606340627062100200648062B062706260642002000410064006F00620065002000500044004600200645062A064806270641064206290020064406440637062806270639062900200641064A00200627064406450637062706280639002006300627062A0020062F0631062C0627062A002006270644062C0648062F0629002006270644063906270644064A0629061B0020064A06450643064600200641062A062D00200648062B0627062606420020005000440046002006270644064506460634062306290020062806270633062A062E062F062706450020004100630072006F0062006100740020064800410064006F006200650020005200650061006400650072002006250635062F0627063100200035002E0030002006480627064406250635062F062706310627062A0020062706440623062D062F062B002E0635062F0627063100200035002E0030002006480627064406250635062F062706310627062A0020062706440623062D062F062B002E>
/BGR <FEFF04180437043f043e043b043704320430043904420435002004420435043704380020043d0430044104420440043e0439043a0438002c00200437043000200434043000200441044a0437043404300432043004420435002000410064006f00620065002000500044004600200434043e043a0443043c0435043d04420438002c0020043c0430043a04410438043c0430043b043d043e0020043f044004380433043e04340435043d04380020043704300020043204380441043e043a043e043a0430044704350441044204320435043d0020043f04350447043004420020043704300020043f044004350434043f0435044704300442043d04300020043f043e04340433043e0442043e0432043a0430002e002000200421044a04370434043004340435043d043804420435002000500044004600200434043e043a0443043c0435043d044204380020043c043e0433043004420020043404300020044104350020043e0442043204300440044f0442002004410020004100630072006f00620061007400200438002000410064006f00620065002000520065006100640065007200200035002e00300020043800200441043b0435043404320430044904380020043204350440044104380438002e>
/CHS <FEFF4f7f75288fd94e9b8bbe5b9a521b5efa7684002000410064006f006200650020005000440046002065876863900275284e8e9ad88d2891cf76845370524d53705237300260a853ef4ee54f7f75280020004100630072006f0062006100740020548c002000410064006f00620065002000520065006100640065007200200035002e003000204ee553ca66f49ad87248672c676562535f00521b5efa768400200050004400460020658768633002>
/CHT <FEFF4f7f752890194e9b8a2d7f6e5efa7acb7684002000410064006f006200650020005000440046002065874ef69069752865bc9ad854c18cea76845370524d5370523786557406300260a853ef4ee54f7f75280020004100630072006f0062006100740020548c002000410064006f00620065002000520065006100640065007200200035002e003000204ee553ca66f49ad87248672c4f86958b555f5df25efa7acb76840020005000440046002065874ef63002>
/CZE <FEFF005400610074006f0020006e006100730074006100760065006e00ed00200070006f0075017e0069006a007400650020006b0020007600790074007600e101590065006e00ed00200064006f006b0075006d0065006e0074016f002000410064006f006200650020005000440046002c0020006b00740065007200e90020007300650020006e0065006a006c00e90070006500200068006f006400ed002000700072006f0020006b00760061006c00690074006e00ed0020007400690073006b00200061002000700072006500700072006500730073002e002000200056007900740076006f01590065006e00e900200064006f006b0075006d0065006e007400790020005000440046002000620075006400650020006d006f017e006e00e90020006f007400650076015900ed007400200076002000700072006f006700720061006d0065006300680020004100630072006f00620061007400200061002000410064006f00620065002000520065006100640065007200200035002e0030002000610020006e006f0076011b006a016100ed00630068002e>
/DAN <FEFF004200720075006700200069006e0064007300740069006c006c0069006e006700650072006e0065002000740069006c0020006100740020006f007000720065007400740065002000410064006f006200650020005000440046002d0064006f006b0075006d0065006e007400650072002c0020006400650072002000620065006400730074002000650067006e006500720020007300690067002000740069006c002000700072006500700072006500730073002d007500640073006b007200690076006e0069006e00670020006100660020006800f8006a0020006b00760061006c0069007400650074002e0020004400650020006f007000720065007400740065006400650020005000440046002d0064006f006b0075006d0065006e0074006500720020006b0061006e002000e50062006e00650073002000690020004100630072006f00620061007400200065006c006c006500720020004100630072006f006200610074002000520065006100640065007200200035002e00300020006f00670020006e0079006500720065002e>
/DEU <FEFF00560065007200770065006e00640065006e0020005300690065002000640069006500730065002000450069006e007300740065006c006c0075006e00670065006e0020007a0075006d002000450072007300740065006c006c0065006e00200076006f006e002000410064006f006200650020005000440046002d0044006f006b0075006d0065006e00740065006e002c00200076006f006e002000640065006e0065006e002000530069006500200068006f006300680077006500720074006900670065002000500072006500700072006500730073002d0044007200750063006b0065002000650072007a0065007500670065006e0020006d00f60063006800740065006e002e002000450072007300740065006c006c007400650020005000440046002d0044006f006b0075006d0065006e007400650020006b00f6006e006e0065006e0020006d006900740020004100630072006f00620061007400200075006e0064002000410064006f00620065002000520065006100640065007200200035002e00300020006f0064006500720020006800f600680065007200200067006500f600660066006e00650074002000770065007200640065006e002e>
/ESP <FEFF005500740069006c0069006300650020006500730074006100200063006f006e0066006900670075007200610063006900f3006e0020007000610072006100200063007200650061007200200064006f00630075006d0065006e0074006f00730020005000440046002000640065002000410064006f0062006500200061006400650063007500610064006f00730020007000610072006100200069006d0070007200650073006900f3006e0020007000720065002d0065006400690074006f007200690061006c00200064006500200061006c00740061002000630061006c0069006400610064002e002000530065002000700075006500640065006e00200061006200720069007200200064006f00630075006d0065006e0074006f00730020005000440046002000630072006500610064006f007300200063006f006e0020004100630072006f006200610074002c002000410064006f00620065002000520065006100640065007200200035002e003000200079002000760065007200730069006f006e0065007300200070006f00730074006500720069006f007200650073002e>
/ETI <FEFF004b00610073007500740061006700650020006e0065006900640020007300e4007400740065006900640020006b00760061006c006900740065006500740073006500200074007200fc006b006900650065006c007300650020007000720069006e00740069006d0069007300650020006a0061006f006b007300200073006f00620069006c0069006b0065002000410064006f006200650020005000440046002d0064006f006b0075006d0065006e00740069006400650020006c006f006f006d006900730065006b0073002e00200020004c006f006f0064007500640020005000440046002d0064006f006b0075006d0065006e00740065002000730061006100740065002000610076006100640061002000700072006f006700720061006d006d006900640065006700610020004100630072006f0062006100740020006e0069006e0067002000410064006f00620065002000520065006100640065007200200035002e00300020006a00610020007500750065006d006100740065002000760065007200730069006f006f006e00690064006500670061002e000d000a>
/FRA <FEFF005500740069006c006900730065007a00200063006500730020006f007000740069006f006e00730020006100660069006e00200064006500200063007200e900650072002000640065007300200064006f00630075006d0065006e00740073002000410064006f00620065002000500044004600200070006f0075007200200075006e00650020007100750061006c0069007400e90020006400270069006d007000720065007300730069006f006e00200070007200e9007000720065007300730065002e0020004c0065007300200064006f00630075006d0065006e00740073002000500044004600200063007200e900e90073002000700065007500760065006e0074002000ea0074007200650020006f007500760065007200740073002000640061006e00730020004100630072006f006200610074002c002000610069006e00730069002000710075002700410064006f00620065002000520065006100640065007200200035002e0030002000650074002000760065007200730069006f006e007300200075006c007400e90072006900650075007200650073002e>
/GRE <FEFF03a703c103b703c303b903bc03bf03c003bf03b903ae03c303c403b5002003b103c503c403ad03c2002003c403b903c2002003c103c503b803bc03af03c303b503b903c2002003b303b903b1002003bd03b1002003b403b703bc03b903bf03c503c103b303ae03c303b503c403b5002003ad03b303b303c103b103c603b1002000410064006f006200650020005000440046002003c003bf03c5002003b503af03bd03b103b9002003ba03b103c42019002003b503be03bf03c703ae03bd002003ba03b103c403ac03bb03bb03b703bb03b1002003b303b903b1002003c003c103bf002d03b503ba03c403c503c003c903c403b903ba03ad03c2002003b503c103b303b103c303af03b503c2002003c503c803b703bb03ae03c2002003c003bf03b903cc03c403b703c403b103c2002e0020002003a403b10020005000440046002003ad03b303b303c103b103c603b1002003c003bf03c5002003ad03c703b503c403b5002003b403b703bc03b903bf03c503c103b303ae03c303b503b9002003bc03c003bf03c103bf03cd03bd002003bd03b1002003b103bd03bf03b903c703c403bf03cd03bd002003bc03b5002003c403bf0020004100630072006f006200610074002c002003c403bf002000410064006f00620065002000520065006100640065007200200035002e0030002003ba03b103b9002003bc03b503c403b103b303b503bd03ad03c303c403b503c103b503c2002003b503ba03b403cc03c303b503b903c2002e>
/HEB <FEFF05D405E905EA05DE05E905D5002005D105D405D205D305E805D505EA002005D005DC05D4002005DB05D305D9002005DC05D905E605D505E8002005DE05E105DE05DB05D9002000410064006F006200650020005000440046002005D405DE05D505EA05D005DE05D905DD002005DC05D405D305E405E105EA002005E705D305DD002D05D305E405D505E1002005D005D905DB05D505EA05D905EA002E002005DE05E105DE05DB05D90020005000440046002005E905E005D505E605E805D5002005E005D905EA05E005D905DD002005DC05E405EA05D905D705D4002005D105D005DE05E605E205D505EA0020004100630072006F006200610074002005D5002D00410064006F00620065002000520065006100640065007200200035002E0030002005D505D205E805E105D005D505EA002005DE05EA05E705D305DE05D505EA002005D905D505EA05E8002E05D005DE05D905DD002005DC002D005000440046002F0058002D0033002C002005E205D905D905E005D5002005D105DE05D305E805D905DA002005DC05DE05E905EA05DE05E9002005E905DC0020004100630072006F006200610074002E002005DE05E105DE05DB05D90020005000440046002005E905E005D505E605E805D5002005E005D905EA05E005D905DD002005DC05E405EA05D905D705D4002005D105D005DE05E605E205D505EA0020004100630072006F006200610074002005D5002D00410064006F00620065002000520065006100640065007200200035002E0030002005D505D205E805E105D005D505EA002005DE05EA05E705D305DE05D505EA002005D905D505EA05E8002E>
/HRV (Za stvaranje Adobe PDF dokumenata najpogodnijih za visokokvalitetni ispis prije tiskanja koristite ove postavke. Stvoreni PDF dokumenti mogu se otvoriti Acrobat i Adobe Reader 5.0 i kasnijim verzijama.)
/HUN <FEFF004b0069007600e1006c00f30020006d0069006e0151007300e9006701710020006e0079006f006d00640061006900200065006c0151006b00e90073007a00ed007401510020006e0079006f006d00740061007400e100730068006f007a0020006c006500670069006e006b00e1006200620020006d0065006700660065006c0065006c0151002000410064006f00620065002000500044004600200064006f006b0075006d0065006e00740075006d006f006b0061007400200065007a0065006b006b0065006c0020006100200062006500e1006c006c00ed007400e10073006f006b006b0061006c0020006b00e90073007a00ed0074006800650074002e0020002000410020006c00e90074007200650068006f007a006f00740074002000500044004600200064006f006b0075006d0065006e00740075006d006f006b00200061007a0020004100630072006f006200610074002000e9007300200061007a002000410064006f00620065002000520065006100640065007200200035002e0030002c0020007600610067007900200061007a002000610074007400f3006c0020006b00e9007301510062006200690020007600650072007a006900f3006b006b0061006c0020006e00790069007400680061007400f3006b0020006d00650067002e>
/ITA <FEFF005500740069006c0069007a007a006100720065002000710075006500730074006500200069006d0070006f007300740061007a0069006f006e00690020007000650072002000630072006500610072006500200064006f00630075006d0065006e00740069002000410064006f00620065002000500044004600200070006900f900200061006400610074007400690020006100200075006e00610020007000720065007300740061006d0070006100200064006900200061006c007400610020007100750061006c0069007400e0002e0020004900200064006f00630075006d0065006e007400690020005000440046002000630072006500610074006900200070006f00730073006f006e006f0020006500730073006500720065002000610070006500720074006900200063006f006e0020004100630072006f00620061007400200065002000410064006f00620065002000520065006100640065007200200035002e003000200065002000760065007200730069006f006e006900200073007500630063006500730073006900760065002e>
/JPN <FEFF9ad854c18cea306a30d730ea30d730ec30b951fa529b7528002000410064006f0062006500200050004400460020658766f8306e4f5c6210306b4f7f75283057307e305930023053306e8a2d5b9a30674f5c62103055308c305f0020005000440046002030d530a130a430eb306f3001004100630072006f0062006100740020304a30883073002000410064006f00620065002000520065006100640065007200200035002e003000204ee5964d3067958b304f30533068304c3067304d307e305930023053306e8a2d5b9a306b306f30d530a930f330c8306e57cb30818fbc307f304c5fc59808306730593002>
/KOR <FEFFc7740020c124c815c7440020c0acc6a9d558c5ec0020ace0d488c9c80020c2dcd5d80020c778c1c4c5d00020ac00c7a50020c801d569d55c002000410064006f0062006500200050004400460020bb38c11cb97c0020c791c131d569b2c8b2e4002e0020c774b807ac8c0020c791c131b41c00200050004400460020bb38c11cb2940020004100630072006f0062006100740020bc0f002000410064006f00620065002000520065006100640065007200200035002e00300020c774c0c1c5d0c11c0020c5f40020c2180020c788c2b5b2c8b2e4002e>
/LTH <FEFF004e006100750064006f006b0069007400650020016100690075006f007300200070006100720061006d006500740072007500730020006e006f0072011700640061006d00690020006b0075007200740069002000410064006f00620065002000500044004600200064006f006b0075006d0065006e007400750073002c0020006b00750072006900650020006c0061006200690061007500730069006100690020007000720069007400610069006b007900740069002000610075006b01610074006f00730020006b006f006b007900620117007300200070006100720065006e006700740069006e00690061006d00200073007000610075007300640069006e0069006d00750069002e0020002000530075006b0075007200740069002000500044004600200064006f006b0075006d0065006e007400610069002000670061006c006900200062016b007400690020006100740069006400610072006f006d00690020004100630072006f006200610074002000690072002000410064006f00620065002000520065006100640065007200200035002e0030002000610072002000760117006c00650073006e0117006d00690073002000760065007200730069006a006f006d00690073002e>
/LVI <FEFF0049007a006d0061006e0074006f006a00690065007400200161006f00730020006900650073007400610074012b006a0075006d00750073002c0020006c0061006900200076006500690064006f00740075002000410064006f00620065002000500044004600200064006f006b0075006d0065006e007400750073002c0020006b006100730020006900720020012b00700061016100690020007000690065006d01130072006f00740069002000610075006700730074006100730020006b00760061006c0069007401010074006500730020007000690072006d007300690065007300700069006501610061006e006100730020006400720075006b00610069002e00200049007a0076006500690064006f006a006900650074002000500044004600200064006f006b0075006d0065006e007400750073002c0020006b006f002000760061007200200061007400760113007200740020006100720020004100630072006f00620061007400200075006e002000410064006f00620065002000520065006100640065007200200035002e0030002c0020006b0101002000610072012b00200074006f0020006a00610075006e0101006b0101006d002000760065007200730069006a0101006d002e>
/NLD (Gebruik deze instellingen om Adobe PDF-documenten te maken die zijn geoptimaliseerd voor prepress-afdrukken van hoge kwaliteit. De gemaakte PDF-documenten kunnen worden geopend met Acrobat en Adobe Reader 5.0 en hoger.)
/NOR <FEFF004200720075006b00200064006900730073006500200069006e006e007300740069006c006c0069006e00670065006e0065002000740069006c002000e50020006f0070007000720065007400740065002000410064006f006200650020005000440046002d0064006f006b0075006d0065006e00740065007200200073006f006d00200065007200200062006500730074002000650067006e0065007400200066006f00720020006600f80072007400720079006b006b0073007500740073006b00720069006600740020006100760020006800f800790020006b00760061006c0069007400650074002e0020005000440046002d0064006f006b0075006d0065006e00740065006e00650020006b0061006e002000e50070006e00650073002000690020004100630072006f00620061007400200065006c006c00650072002000410064006f00620065002000520065006100640065007200200035002e003000200065006c006c00650072002000730065006e006500720065002e>
/POL <FEFF0055007300740061007700690065006e0069006100200064006f002000740077006f0072007a0065006e0069006100200064006f006b0075006d0065006e007400f300770020005000440046002000700072007a0065007a006e00610063007a006f006e00790063006800200064006f002000770079006400720075006b00f30077002000770020007700790073006f006b00690065006a0020006a0061006b006f015b00630069002e002000200044006f006b0075006d0065006e0074007900200050004400460020006d006f017c006e00610020006f007400770069006500720061010700200077002000700072006f006700720061006d006900650020004100630072006f00620061007400200069002000410064006f00620065002000520065006100640065007200200035002e0030002000690020006e006f00770073007a0079006d002e>
/PTB <FEFF005500740069006c0069007a006500200065007300730061007300200063006f006e00660069006700750072006100e700f50065007300200064006500200066006f0072006d00610020006100200063007200690061007200200064006f00630075006d0065006e0074006f0073002000410064006f0062006500200050004400460020006d00610069007300200061006400650071007500610064006f00730020007000610072006100200070007200e9002d0069006d0070007200650073007300f50065007300200064006500200061006c007400610020007100750061006c00690064006100640065002e0020004f007300200064006f00630075006d0065006e0074006f00730020005000440046002000630072006900610064006f007300200070006f00640065006d0020007300650072002000610062006500720074006f007300200063006f006d0020006f0020004100630072006f006200610074002000650020006f002000410064006f00620065002000520065006100640065007200200035002e0030002000650020007600650072007300f50065007300200070006f00730074006500720069006f007200650073002e>
/RUM <FEFF005500740069006c0069007a00610163006900200061006300650073007400650020007300650074010300720069002000700065006e007400720075002000610020006300720065006100200064006f00630075006d0065006e00740065002000410064006f006200650020005000440046002000610064006500630076006100740065002000700065006e0074007200750020007400690070010300720069007200650061002000700072006500700072006500730073002000640065002000630061006c006900740061007400650020007300750070006500720069006f006100720103002e002000200044006f00630075006d0065006e00740065006c00650020005000440046002000630072006500610074006500200070006f00740020006600690020006400650073006300680069007300650020006300750020004100630072006f006200610074002c002000410064006f00620065002000520065006100640065007200200035002e00300020015f00690020007600650072007300690075006e0069006c006500200075006c0074006500720069006f006100720065002e>
/RUS <FEFF04180441043f043e043b044c04370443043904420435002004340430043d043d044b04350020043d0430044104420440043e0439043a043800200434043b044f00200441043e043704340430043d0438044f00200434043e043a0443043c0435043d0442043e0432002000410064006f006200650020005000440046002c0020043c0430043a04410438043c0430043b044c043d043e0020043f043e04340445043e0434044f04490438044500200434043b044f00200432044b0441043e043a043e043a0430044704350441044204320435043d043d043e0433043e00200434043e043f0435044704300442043d043e0433043e00200432044b0432043e04340430002e002000200421043e043704340430043d043d044b04350020005000440046002d0434043e043a0443043c0435043d0442044b0020043c043e0436043d043e0020043e0442043a0440044b043204300442044c002004410020043f043e043c043e0449044c044e0020004100630072006f00620061007400200438002000410064006f00620065002000520065006100640065007200200035002e00300020043800200431043e043b043504350020043f043e04370434043d043804450020043204350440044104380439002e>
/SKY <FEFF0054006900650074006f0020006e006100730074006100760065006e0069006100200070006f0075017e0069007400650020006e00610020007600790074007600e100720061006e0069006500200064006f006b0075006d0065006e0074006f0076002000410064006f006200650020005000440046002c0020006b0074006f007200e90020007300610020006e0061006a006c0065007001610069006500200068006f0064006900610020006e00610020006b00760061006c00690074006e00fa00200074006c0061010d00200061002000700072006500700072006500730073002e00200056007900740076006f00720065006e00e900200064006f006b0075006d0065006e007400790020005000440046002000620075006400650020006d006f017e006e00e90020006f00740076006f00720069016500200076002000700072006f006700720061006d006f006300680020004100630072006f00620061007400200061002000410064006f00620065002000520065006100640065007200200035002e0030002000610020006e006f0076016100ed00630068002e>
/SLV <FEFF005400650020006e006100730074006100760069007400760065002000750070006f0072006100620069007400650020007a00610020007500730074007600610072006a0061006e006a006500200064006f006b0075006d0065006e0074006f0076002000410064006f006200650020005000440046002c0020006b006900200073006f0020006e0061006a007000720069006d00650072006e0065006a016100690020007a00610020006b0061006b006f0076006f00730074006e006f0020007400690073006b0061006e006a00650020007300200070007200690070007200610076006f0020006e00610020007400690073006b002e00200020005500730074007600610072006a0065006e006500200064006f006b0075006d0065006e0074006500200050004400460020006a00650020006d006f0067006f010d00650020006f0064007000720065007400690020007a0020004100630072006f00620061007400200069006e002000410064006f00620065002000520065006100640065007200200035002e003000200069006e0020006e006f00760065006a01610069006d002e>
/SUO <FEFF004b00e40079007400e40020006e00e40069007400e4002000610073006500740075006b007300690061002c0020006b0075006e0020006c0075006f00740020006c00e400680069006e006e00e4002000760061006100740069007600610061006e0020007000610069006e006100740075006b00730065006e002000760061006c006d0069007300740065006c00750074007900f6006800f6006e00200073006f00700069007600690061002000410064006f0062006500200050004400460020002d0064006f006b0075006d0065006e007400740065006a0061002e0020004c0075006f0064007500740020005000440046002d0064006f006b0075006d0065006e00740069007400200076006f0069006400610061006e0020006100760061007400610020004100630072006f0062006100740069006c006c00610020006a0061002000410064006f00620065002000520065006100640065007200200035002e0030003a006c006c00610020006a006100200075007500640065006d006d0069006c006c0061002e>
/SVE <FEFF0041006e007600e4006e00640020006400650020006800e4007200200069006e0073007400e4006c006c006e0069006e006700610072006e00610020006f006d002000640075002000760069006c006c00200073006b006100700061002000410064006f006200650020005000440046002d0064006f006b0075006d0065006e007400200073006f006d002000e400720020006c00e4006d0070006c0069006700610020006600f60072002000700072006500700072006500730073002d007500740073006b00720069006600740020006d006500640020006800f600670020006b00760061006c0069007400650074002e002000200053006b006100700061006400650020005000440046002d0064006f006b0075006d0065006e00740020006b0061006e002000f600700070006e00610073002000690020004100630072006f0062006100740020006f00630068002000410064006f00620065002000520065006100640065007200200035002e00300020006f00630068002000730065006e006100720065002e>
/TUR <FEFF005900fc006b00730065006b0020006b0061006c006900740065006c0069002000f6006e002000790061007a006401310072006d00610020006200610073006b013100730131006e006100200065006e0020006900790069002000750079006100620069006c006500630065006b002000410064006f006200650020005000440046002000620065006c00670065006c0065007200690020006f006c0075015f007400750072006d0061006b0020006900e70069006e00200062007500200061007900610072006c0061007201310020006b0075006c006c0061006e0131006e002e00200020004f006c0075015f0074007500720075006c0061006e0020005000440046002000620065006c00670065006c0065007200690020004100630072006f006200610074002000760065002000410064006f00620065002000520065006100640065007200200035002e003000200076006500200073006f006e0072006100730131006e00640061006b00690020007300fc007200fc006d006c00650072006c00650020006100e70131006c006100620069006c00690072002e>
/UKR <FEFF04120438043a043e0440043804410442043e043204430439044204350020044604560020043f043004400430043c043504420440043800200434043b044f0020044104420432043e04400435043d043d044f00200434043e043a0443043c0435043d044204560432002000410064006f006200650020005000440046002c0020044f043a04560020043d04300439043a04400430044904350020043f045604340445043e0434044f0442044c00200434043b044f0020043204380441043e043a043e044f043a04560441043d043e0433043e0020043f0435044004350434043404400443043a043e0432043e0433043e0020043404400443043a0443002e00200020042104420432043e04400435043d045600200434043e043a0443043c0435043d0442043800200050004400460020043c043e0436043d04300020043204560434043a0440043804420438002004430020004100630072006f006200610074002004420430002000410064006f00620065002000520065006100640065007200200035002e0030002004300431043e0020043f04560437043d04560448043e04570020043204350440044104560457002e>
/ENU (Use these settings to create Adobe PDF documents best suited for high-quality prepress printing. Created PDF documents can be opened with Acrobat and Adobe Reader 5.0 and later.)
>>
/Namespace [
(Adobe)
(Common)
(1.0)
]
/OtherNamespaces [
<<
/AsReaderSpreads false
/CropImagesToFrames true
/ErrorControl /WarnAndContinue
/FlattenerIgnoreSpreadOverrides false
/IncludeGuidesGrids false
/IncludeNonPrinting false
/IncludeSlug false
/Namespace [
(Adobe)
(InDesign)
(4.0)
]
/OmitPlacedBitmaps false
/OmitPlacedEPS false
/OmitPlacedPDF false
/SimulateOverprint /Legacy
>>
<<
/AddBleedMarks false
/AddColorBars false
/AddCropMarks false
/AddPageInfo false
/AddRegMarks false
/ConvertColors /ConvertToCMYK
/DestinationProfileName ()
/DestinationProfileSelector /DocumentCMYK
/Downsample16BitImages true
/FlattenerPreset <<
/PresetSelector /MediumResolution
>>
/FormElements false
/GenerateStructure false
/IncludeBookmarks false
/IncludeHyperlinks false
/IncludeInteractive false
/IncludeLayers false
/IncludeProfiles false
/MultimediaHandling /UseObjectSettings
/Namespace [
(Adobe)
(CreativeSuite)
(2.0)
]
/PDFXOutputIntentProfileSelector /DocumentCMYK
/PreserveEditing true
/UntaggedCMYKHandling /LeaveUntagged
/UntaggedRGBHandling /UseDocumentProfile
/UseDocumentBleed false
>>
]
>> setdistillerparams
<<
/HWResolution [2400 2400]
/PageSize [612.000 792.000]
>> setpagedevice
|