OLAP.ru   Rambler's Top100
Вы находитесь на страницах старой версии сайта. Перейдите на новую версию OLAP.ru
  
Поиск по сайту
Новости
Основы OLAP
Продукты
Business Objects/ Crystal Decisions
Каталог
OLAP в жизни
Тенденции
Download
Яndex
 
 
 
TopList
 

Хранилища данных и семантические разрывы

Д.В. Косов,
ведущий специалист производственного центра Datagy компании "Диасофт"

Пилот: – Прибор?
Штурман: – 30!
– Что тридцать?
– А что прибор?

Теория информации, несмотря на очевидные успехи в области технических приложений, является одной из самых неоднозначных дисциплин в концептуальной (семантической) области. Другими словами, мы уже почти понимаем, как «правильно» передать информацию от источника к получателю, осталось понять, что же все-таки считать информацией… В этой ситуации о смысле таких понятий, как данные, информация и знания можно говорить лишь на интуитивном уровне.

В частности, интуитивно понятно, что не всякие данные несут в себе информацию или, по крайней мере, однозначную информацию. Известный статистикам афоризм о «нормальной» средней температуре по больнице – тому подтверждение. Несмотря на то, что средняя температура по больнице – это данные, информацией она может являться, пожалуй, в очень редких случаях.

Вопрос со знаниями – еще сложнее. Относительно знаний понятно одно: они формируются, как обобщения эмпирического опыта (иначе говоря, информации). Более того, следует сказать, что впечатляющие успехи квантовой механики, привели не только к разработке атомной бомбы, но заложили основы «нового рационализма», который с большим опозданием входит в нашу жизнь только сейчас. Основываясь на классических принципах, заложенных в глубокой древности, новый рационализм совершенно иначе трактует многие известные понятия, вводит дополнительные принципы, которые коренным образом изменяют наше отношение к знаниям и, соответственно, к информации.

Таким образом, писать о семантической стороне теории информации в то время, когда еще не существует единой, устоявшейся терминологии, трудно. Еще труднее найти обоснование конкретным технологическим решениям на основе «сырой» теории. Анализ опыта создания и сопровождения хранилищ данных говорит о том, что именно в этой области ИТ индустрии наиболее резко ощущаются трудности порожденные отсутствием устоявшейся семантической теории информации. Наш практический опыт подтверждает сказанное.

При проектировании, реализации и эксплуатации хранилищ данных, решается задача создания и поддержания предметно-ориентированного, интегрированного и зависимого от времени набора данных. Вопрос выявления и преодоления семантических разрывов, возникающих в потоках данных формирующих подобный набор, является одним из основных при проектировании хранилищ данных.
В данной статье на простых моделях мы рассмотрим механизмы возникновения семантических разрывов в хранилищах данных, их классификацию и сформулируем трудности, с которыми сталкиваются разработчики хранилища данных.

Семантический разрыв

Технология хранилищ данных является одной из самых современных и предназначена для решения вполне определенного круга задач: сбора и консолидации данных из разрозненных и несогласованных источников в согласованный предметно-ориентированный, интегрированный и зависимый от времени набор данных. Полученный набор данных необходим для поддержки анализа и принятия решений пользователями в условиях большого быстрорастущего объема информации.
В качестве типовой архитектуры хранилища данных можно представить следующую схему (рис. 1)

Рисунок 1

Нетрудно заметить, что подавляющее большинство процессов протекающих в хранилище данных, это процессы перегрузки данных из одной базы данных (БД) в другую. Очевидно, что при современном уровне развития информационных технологий, простое перемещение данных из одной БД в другую не представляет затруднений. Однако если мы просто переместим данные из всех источников данных в одну БД, то получим всего лишь «свалку», несогласованный набор данных, никому кроме разработчиков непонятных чисел и символов. Для того, чтобы создать нечто доступное для анализа конечным пользователем, необходимо согласовать данные, поступающие из БД источников хранилища данных. Иначе говоря, решить основную задачу построения хранилища данных: создать тот самый согласованный, предметно-ориентированный, интегрированный, зависимый от времени набор данных.

Для того, чтобы сделать это, необходимо разобраться, почему же полученная нами «свалка» непригодна для анализа.

Анализ – это прием научного мышления, в основе которого лежит изучение составных частей и элементов изучаемой системы.

В нашем случае, очевидно, что изучаемая система – это весь бизнес или некоторая его логически обособленная часть, представляющая интерес. Выделив в такой системе составные части, изучив их состояние, развитие и связи между ними, можно получить представление о состоянии и развитии системы в целом. Данные необходимые для такого анализа должны представлять максимально полный набор измеряемых показателей, отражающих состояние всех составных частей системы в любой момент времени. Именно такие показатели собираются в хранилище данных. Источниками данных, содержащих измеряемые показатели доступные для хранилища данных являются OLTP-системы (транзакционные системы).

Выясним, что же такое измеряемые показатели. А это не что иное, как некие понятия, для которых очень точно определены имя, концепт и денотат.

Понятие – это элементарная единица мыслительной деятельности, обладающая известной целостностью и устойчивостью и взятая в отвлечении от словесного выражения этой деятельности.

Поскольку мы мыслим понятиями, то, столкнувшись с каким либо множеством объектов, мы разбиваем заинтересовавшее нас множество объектов на классы «эквивалентных» в каком-либо отношении элементов (т. е. игнорируя все различия между элементами одного такого класса, не интересующие нас в данный момент). Таким образом, получается новое множество, элементы которого сходны по определенному нами отношению эквивалентности. Элементы этого нового множества можно считать едиными, нерасчленяемыми объектами, полученными в результате «склеивания» всех неразличимых в фиксированных нами отношениях эквивалентности исходных объектов в один. Эти «комки» отождествленных между собой образов исходных объектов и есть то, что, мы называем понятие. Как видите, они получены в результате мысленной замены класса близких между собой представлений одним «родовым» понятием.

Понятию, для обеспечения обмена мыслями, присваивается имя (знак):

Имя понятия (знак) – это те самые слова, которые мы употребляем в языковых конструкциях для передачи понятия. Языковый знак – это любая единица языка (морфема, слово, словосочетание, предложение), служащая для обозначения предметов, явлений действительности или понятий.

У понятия есть некий концепт:

Концепт (Смысл, Содержание) – смысл, который это понятие выражает. Перечень признаков (свойств), на основании которых произвели «склеивание».

И оно обладает неким денотатом или обозначает:

Денотат (Значение, Объём понятия) – это, та самая совокупность, «склеиваемых» в это понятие элементов, о которой сказано выше. Или, иначе говоря, предмет или явление, обозначаемое языком в конкретном речевом произведении.

Нетрудно заметить, что чем обширнее набор признаков, тем уже класс объектов, удовлетворяющих этим признакам, и наоборот, чем уже содержание понятия, тем шире его объём. Очевидно, что, работая с данными, Вы желаете получать как можно более точный анализ и максимально полное представление о состоянии своего бизнеса: оперируя понятиями, подобными таким как, «карточка клиента», или «филиал», Вы тем лучше можете проанализировать состояние объекта, чем больше собираете параметров для анализа его состояния. Иными словами, чем больше содержание (набор признаков) понятия, тем более «обширный» концепт Вы рассматриваете. При этом меньшее число объектов обозначается этим понятием и охватывается меньший объем (денотат). Иначе говоря, чем больше показателей (параметров) объекта регистрируем, тем более точно описан конкретный объект.

Для полноты картины, выясним, что такое набор данных. Пример такого стандартного для информационных систем набора данных приведен на рис. 2.

Рисунок 2

Набор данных информационной системы – это совокупность структурированных данных, представленная в виде таблицы. Иными словами, это некоторая знаковая система, совокупность условных знаков и правил их взаимосвязи.

То есть, имена понятий и языковые знаки образуют более сложные языковые конструкции – знаковые системы, языки. Замечу кстати, что только что мы ввели в рамках статьи еще одно понятие – «набор данных». А конкретный набор, приведенный на рис. 3, еще одно понятие – «Остаток по счету № 40702ХХХХХХХХХХХХХХХ на дату 12.12.2003». Это понятие связано, очевидно, с понятиями «Остаток», «Номер счета 40702ХХХХХХХХХХХХХХХ» и «Дата 12.12.2003», кроме того последние так же связаны с другими понятиями и т.д.

Более того, каждый из трех элементов понятия входит в несколько различных систем связей с соответствующими элементами других понятий, то есть, образуя связи «многие-ко-многим». В совокупности такие связи, образуют понятийную систему, или систему понятий. Если попытаться представить отношения между выделенными нами элементами понятия в виде ER- диаграммы, то получится нечто вроде того, что представлено на рис. 3.

Рисунок 3

С другой стороны, очевидно, что любая знаковая система (язык) не способна полностью описать весь мир. Поэтому, создавая информационную систему для определенных задач, ее разработчики, опираются всего на одну неполную систему понятий, ту, которая, по их мнению, наилучшим образом подходит для решаемой задачи, создавая, таким образом, некий набор данных информационной системы.

Нетрудно заметить, что и имя понятия и его концепт, определяются достаточно произвольно в рамках различных систем понятий. В разных OLTP-системах, во-первых, одному и тому же денотату понятия, могут быть присвоены разные имена, во вторых, одни и те же имена могут быть присвоены понятиям с различными концептами и следовательно иметь пересекающиеся (а, в особо сложных случаях и непересекающиеся) денотаты, в третьих, понятия (и каждый из их элементов), могут иметь различные системы связей с другими понятиями, то есть имеют различные понятийные системы. Такая ситуация называется семантическим разрывом между системами.

Займемся теперь поиском и классификацией семантических разрывов.

Регистрация и Анализ (Модель двух точек)

Для этого построим модель. Введем в дополнение к ранее определенному понятию анализа, понятие регистрации.

Регистрация – это фиксация на любом носителе результата измерения некоторого показателя.

Соответственно, пространственно-временную точку, в которой производятся измерения и их регистрация, будем называть – точка регистрации, а пространственно-временную точку, в которой производится анализ – точка анализа.

Построим модель процесса передачи данных от точки регистрации в точку анализа.
Для создания такой модели примем некоторые упрощения, а именно, в точке регистрации находится регистратор, который производит замер всего одного показателя (показателем может быть, как давление или температура среды, так и остаток по кассе). Вообще говоря, регистратор – роль в самом общем смысле. Регистратором может быть как человек, так и прибор, прибор в свою очередь может быть как реально существующим, так и виртуальным, ниже мы покажем, что особой разницы, в рамках нашей модели, нет. Соответственно в точке анализа, находится аналитик (точно такая же роль, как и регистратор), который производит анализ. Регистратор и аналитик достаточно удалены друг от друга пространственно или во времени, чтобы, не иметь возможности взаимодействовать между собой помимо канала связи определенного нами. Например, регистратор, замеряет температуру в помещении на Манхеттене, а затем пересылает по телеграфу или факсу в Москву, либо регистратор замерил показатель, записал его на листке бумаги и ушел, затем приходит аналитик и изучает записанный показатель.

Далее, поскольку аналитик не знает, какой именно параметр измеряется, то не может ничего с ним сделать. Дополним модель, заставив регистратора к пересылаемой информации добавлять для каждого измеренного показателя его имя.

В нашей модели имеется, как вы уже заметили, еще и канал связи. Вообще-то говоря, канал связи в данной модели при более пристальном взгляде, весьма не прост. Но рассмотрение свойств канала выходит за рамки данной статьи. Под каналом связи, мы будем понимать любой способ передачи информации, посредством которого регистратор передает результаты проведенного им измерения, аналитику. Под понятие, канала связи, в нашем случае подпадают, как голос, так и локальная компьютерная сеть или Интернет. Единственное ограничение, которое накладываем мы на канал связи – его односторонность. Информация в нашей модели поступает исключительно от регистратора к аналитику и никогда наоборот. Модель на первый взгляд построена (см. рис. 4), назовем ее «Модель Двух Точек» (МДТ).

Рисунок 4

Достаточна ли она, для того, чтобы найти возникающие в хранилище данных семантические разрывы? Попробуем взглянуть с другой стороны, для этого очевидно, неплохо бы подробнее разобраться, что такое анализ.

Согласно БСЭ, выделяют несколько видов анализа, как приёма научного мышления:

Первым видом анализа является мысленное (а в эксперименте, и реальное) расчленение целого на части. Такой анализ выявляет строение (структуру) целого и предполагает не только фиксацию частей, из которых состоит целое, но и установление отношений между частями. Особое значение имеет случай, когда анализируемый предмет рассматривается как представитель некоторого класса предметов: здесь анализ служит установлению одинаковой (с точки зрения некоторых отношений) структуры предметов класса, это позволяет переносить знание, полученное при изучении одних предметов, на другие.

Вторым – является анализ общих свойств предметов и отношений между предметами, когда свойство или отношение расчленяется на составляющие свойства или отношения; одни из них подвергаются дальнейшему анализу, а от других отвлекаются; на следующем этапе анализу может подвергнуться то, от чего ранее отвлеклись, и т.д. В результате анализа общих свойств и отношений понятия о них сводятся к более, общим и простым понятиям.

Третьим видом анализа является также разделение классов (множеств) предметов на подклассы – непересекающиеся подмножества данного множества. Такого рода анализ называют классификацией.
Как видно, ни один из видов анализа неприменим к одному единственному измерению показателя. Поскольку, получив информацию из одной единственной точки измерения и, ничего не зная более, аналитик не может ничего расчленить, не может выявить общие свойства и связи и не может построить классификацию. Однако, ничто не мешает нам собрать из некоторого количества наших моделей, модель более высокого уровня, модель системы сбора информации.

Пусть регистраторов будет несколько, все вместе они регистрируют уже не один показатель, а столько, сколько их самих. Например, хотя бы координаты точки регистрации (местоположение и время). Теперь, аналитик по нескольким каналам связи получает информацию о том, где, когда, что именно было измерено и результат этого измерения. Получилась некоторая система сбора информации для анализа (см. рис. 5). Что теперь может сделать аналитик? Уже очень многое. Например, классифицировать поступающую информацию, по одинаковым координатам, времени или имени показателя. Может попробовать выявить общие свойства и связи между показателями. То есть, в различной степени применить все три вида анализа.

Рисунок 5

Построение модели завершено. Нетрудно заметить, что, несмотря на внешнюю простоту, модель описывает массу явлений, как в природе, так и в деятельности человека. Например, работу зрения, где регистраторами выступают рецепторы на сетчатке глаза, а аналитиком зрительный центр в мозге.

Модель двух точек в информационно-аналитических системах.

Информационно-аналитические системы (ИАС) предназначены, для сбора и анализа всевозможных показателей. Очевидно, что есть некое сходство с нашей моделью.

В любой ИАС, есть входящая информация, место, где информация хранится и некоторые средства для ее анализа. Налицо точки регистрации с регистраторами, канал связи и аналитик. Если подробнее, то в ИАС вводятся данные о каких-то объектах, скажем, операционист в банке, вводит данные о сделке с клиентом. При этом он передает в систему несколько показателей с их именами. Это регистратор в точке регистрации. Далее, система, получив эти показатели, распределяет их по соответствующим таблицам своей базы данных, то есть производит классификацию. Если быть точным, то подобную классификацию, естественно разработал человек, аналитик, участвовавший в создании системы, который сумел превратить процесс анализа в алгоритм, которому теперь и следует система, но это не меняет сути происходящего. Итак, наша модель с достаточной степенью соответствия описывает процесс ввода данных для любой информационно-аналитической системы на высшей степени абстракции.

Однако есть и вторая часть работы системы, а именно предоставление информации пользователю для дальнейшего анализа. Мы говорили о том, что вообще-то аналитик ничего не знает о точке регистрации и регистраторе, кроме того, что получает по каналу связи. Так вот, с учетом этого, для аналитика нет никакой разницы, где находится точка регистрации: в реальном мире или мире виртуальном! То есть, если считать, что БД системы, это некое пространство, в котором существуют свои координаты и протекают во времени свои процессы, то точка регистрации – это поле в таблице БД. Регистратор – это тот запрос, который пользователь применяет к БД, пересылаемые по каналу связи показатели с именами очевидны – результирующий набор данных, формируемый запросом и, наконец, аналитик – сам пользователь.

Если учесть, что многие системы, например хранилища данных, сами выступают в роли пользователя, по отношению к другим системам, то может выстраиваться множество цепочек и звездочек из любого количества звеньев, полностью описывающие продвижение информации от самого первого замера показателя к конечному пользователю. Применение модели правомочно.

Классификация семантических разрывов в хранилищах данных.

Итак, регистратор произвел измерение некоего показателя, следующим его действием является пересылка результата аналитику. Вспомним, что регистратор отправляет в нашей модели аналитику не только собственно результат измерения, но и имя показателя. Как мы выяснили ранее, показатель, ничто иное, как понятие. То есть регистратор в нашей модели пересылает экземпляр множества денотата, то, что он измеряет, и имя понятия – знак, которым он его обозначает. Раз так, то можно говорить о возможности семантического разрыва и его последствиях для анализа. Посмотрим, какого рода семантические разрывы возникают.

Для этого вновь обратимся к рисункам 2 и 3. На рисунке 3 изображены связи между элементами понятия. Достаточно легко понять, что разрыв может возникать там, где существуют связи многие ко многим между элементами понятия или понятиями в системе понятий. Отметим, что пересылке по каналу связи подвергаются имя понятия и некий объект – значение, входящий в множество денотата этого понятия. Концепт понятия не пересылается вовсе! Разработчиками любой информационной системы, подразумевается, что концепт понятия аналитику известен. Семантические разрывы, таким образом, неизбежны. Отмечу, что даже если бы мы попытались переслать концепт, то это не исправило бы ситуацию. Как уже отмечалось, языковой знак, в свою очередь, так же является объектом и для него существует понятие, концепт которого тоже надо описать, иначе будет неоднозначность в толковании концепта исходного понятия и т.д.

В отсутствие концепта, неоднозначность связи имени понятия и денотата очевидна. Отсюда возникает следующая ситуация. Регистратор, в силу своего образования, опыта и системы мышления, если это человек, или в силу образования, опыта и системы мышления своего создателя, если это некое устройство, выделяет денотат понятия, то есть то, что он измеряет. Исходя из тех же соображений, регистратор присваивает понятию имя-знак. С другой стороны, аналитик, в силу уже своего опыта и образования, определяет денотат показателя по-своему. Кроме того, определяя денотат показателя для анализа, он опирается на знак (имя), переданный регистратором. Если знак понятия, присвоенный регистратором, интерпретируется аналитиком иначе (имеет другой концепт), чем регистратором, то аналитик определяет денотат понятия иначе, чем регистратор. Это семантический разрыв. Приведем простейший пример с передачей данных из Манхеттена в Москву. Представьте, что регистратор имя понятия передает, записанным на английском языке, которого московский аналитик просто не знает.

Семантический разрыв налицо. Этот вариант разрыва естественно простейший, и известен с библейских времен вавилонских строителей, поэтому так его и назовем, «вавилонский» или разрыв в интерпретации имен понятий.

Далее, у нас есть цепочки, в каждом из звеньев которых скрывается «вавилонец». Но у нас встречаются и звездочки из таких звеньев! Пусть первый регистратор измеряет диаметр трубы, а второй, ну хотя бы, длину забора. А теперь внимание! Если один передает: «Размер – 30», а второй «Размер – 30», то, как Вы считаете, какие выводы сделает аналитик? Имена понятий одинаковые, а их концепты и следовательно, наполнение – денотат – разные. Семантический разрыв. Значит, могут быть и разрывы между параллельными потоками данных, поступающими к аналитику. Назовем такие разрывы «кросспотоковыми».

Вернемся к рисунку 2, и вспомним, что всякое понятие встроено в понятийную систему. У каждого из регистраторов своя знаковая система, то есть каждый из них может отправлять набор данных, сформированный в разных системах понятий. Наиболее простым примером будет использование различных единиц измерения и соотношений между их минорными и мажорными вариантами (метры и футы) – два регистратора измеряют длину забора и передают результаты измерения аналитику, первый в метрах, а второй в футах, либо регистратор измеряет длину забора в футах, а аналитик анализирует в метрах. Это «кроссязыковые» семантические разрывы. От вавилонских они отличаются тем, что возникают не на разнице в интерпретации имен понятий, а на разнице в интерпретации связей между понятиями.

Наконец, мы в свое время не стали рассматривать канал. Канал связи передает данные от регистратора к аналитику и может влиять на передаваемую информацию. А именно, отфильтровывать часть данных или вызвать задержку в их передаче. Поскольку каждое передаваемое аналитику понятие, на самом деле является еще и набором данных (знаковой системой), то задержка в передаче части системы или потеря таковой, приведут к семантическому разрыву. Теряются связи. Например, передается понятие «Остаток по счету № 40702ХХХХХХХХХХХХХХХ на дату 12.12.2003». Если ранее или одновременно с этим понятием к аналитику не поступило понятие «Номер счета 40702ХХХХХХХХХХХХХХХ», то имя понятия просто не может быть интерпретировано. Это «асинхронный» разрыв. В итоге складывается классификация семантических разрывов в хранилищах данных (см. рис. 6)

Рисунок 6

Посмотрим теперь на хранилище данных. Что будет, если мы опишем протекающие в нем процессы с помощью нашей модели?

Семантические разрывы в хранилищах данных.

Посмотрим, что модель двух точек даст нам для понимания трудностей возникающих при проектировании и эксплуатации хранилищ данных. Применим ее для декомпозиции архитектуры хранилища данных и его окружения. Для приведенной на рисунке 1 архитектуры хранилища данных, наша модель выстроится в схему представленную на рис. 7

Рисунок 7

В самом низу (на рис. 1) находятся OLTP системы и прочие источники данных. Чем по отношению к ним является запрос ETL? Регистратором, фиксирующим и пересылающим в хранилище данных некие поименованные показатели. Что же тогда такое хранилище данных? Аналитик, классифицирующий и выявляющий связи между поступающими показателями. Налицо модель двух точек.

Создатели источников проектировали данные системы согласно своим представлениям о потребностях пользователей и по своим собственным представлениям об архитектуре данных систем, таким образом, они создавали для своей системы собственную знаковую систему (язык). Поясню, в каждой из OLTP систем свои наборы имен таблиц и столбцов, собственные связи между объектами системы, это и есть внутренний язык системы, ее знаковая система. В свою очередь, хранилище данных решает свой собственный круг аналитических задач, поэтому его язык отличается от языка любой из OLTP систем используемых в качестве источников. Вот разрыв – «вавилонец». Далее, при поступлении данных в хранилище, они консолидируются, то есть из разных точек регистрации информация приходит в одну точку анализа, значит, есть и второй вид разрыва, «кросспотоковый». В каждой из систем источников используются для хранения данных свои единицы измерений и вообще свои связи между понятиями, отсюда «кроссязыковые» разрывы. Наконец, достаточно передать в хранилище данных сведения о проводке по вновь открытому счету раньше, чем сведения об открытии счета, чтобы получить «асинхронный» разрыв.

Идем дальше, на рисунке видно, что из хранилища данных информация поступает в витрины данных. Обычно, разумеется, витрины данных и хранилище данных проектируются одной командой, поэтому они «говорят на одном языке», однако в общем случае это может быть и не так. В этом случае ситуация полностью повторяется, мы имеем еще одно звено в цепочке наших моделей и еще один набор семантических разрывов.

Над витринами данных (рис. 7) мы видим средства OLAP, вы уже, несомненно, догадались, что и здесь история повторяется, снова наша модель и весь спектр семантических разрывов.

Наконец последнее звено в архитектуре хранилища данных, отчеты для анализа пользователем. Нетрудно догадаться, что и в этом случае все повторится. Это естественно. Ведь любой человек имеет собственную уникальную систему понятий, выработанную образованием и опытом, поскольку, последние уникальны для каждого пользователя, то и системы понятий уникальны. То есть, вновь наша модель и семантический разрыв.

Заключение

Семантический разрыв – это синоним непонимания информации, которая заключена в данных. Непонимание, в свою очередь, может быть полным, частичным, и … разным у разных пользователей или, например, у пользователей и «производителей» данных. Хранилище данных, содержит большие объемы разнородных данных и, обычно, большое количество «разнородных» потребителей. Для интенсификации общения специалистов, повышения эффективности анализа и сокращения сроков принятия решений, хранилище обязательно должно обладать средствами исключения семантических разрывов или минимизации времени на их преодоление. Такие системы принято называть подсистемами управления метаданными. Предлагаемая модель семантических разрывов может быть полезна в процессе анализа решений и проектирования подсистем управления метаданными.

Наличие продуманной теории могло бы значительно облегчить ответы на поставленные вопросы, но её, как уже было отмечено, пока нет. В любом случае, плохая теория лучше ее отсутствия.

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

Надеемся, что в этом смысле нам удалось решить стоящую перед статьей задачу.

 Обсудить на форуме   Написать вебмастеру 

© 2001 Interface Ltd