|
|
|||||||||||||||||||||||||||||
|
Анализ данных социальных медиа и структурированных данных с помощью IBM InfoSphere BigInsightsИсточник: IBM
Вы наверняка слышали о т.н. "больших данных" (Big Data) и о их влиянии на бизнес-анализ. Возможно, вас интересует, какой информационный капитал ваша организация смогла бы получить в результате регистрации, обработки и применения больших данных, собранных с веб-сайтов, с электронных датчиков или из журналов программного обеспечения - в дополнение к традиционным данными, уже имеющимся в вашей организации. Безусловно, сегодня не ощущается нехватки продуктов с открытым исходным кодом и продуктов сторонних поставщиков, помогающих организациям успешно справляться с различными трудностями при реализации своих проектов в области больших данных. Однако большинство этих продуктов ориентировано на программистов, на администраторов и на технических специалистов, т. е. на лиц с соответствующими навыками. Так что же делать, если необходимо сделать большие данные доступными для бизнес-аналитиков, для руководителей по направлениям бизнеса и для других специалистов, не являющихся программистами? Рекомендуем обратиться к инструменту BigSheets. Это инструмент в стиле электронной таблицы, поставляемый вместе с продуктом InfoSphere BigInsights. Он позволяет "непрограммистам" итеративно исследовать, обрабатывать и визуализировать данные, хранящиеся в распределенной файловой системе. Типовые приложения, предоставляемые продуктом BigInsights, помогают собирать и импортировать данные из различных источников. В этой статье описывается инструмент BigSheets и два типовых приложения, дополняющие этот инструмент. BigInsights - это программная платформа, помогающая организациям выявлять и анализировать бизнес-сведения, скрытые в больших объемах весьма разнообразных данных - которые часто игнорируются или отбрасываются, поскольку их обработка с помощью традиционных средств является слишком непрактичной или сложной. Для того, чтобы оказать организациям эффективное содействие в извлечении пользы из таких данных, в редакцию Enterprise Edition продукта BigInsights включено несколько решений с открытым исходным кодом, в т. ч. Apache Hadoop, и несколько разработанных корпораций IBM технологий, в т. ч. BigSheets. Проект Hadoop и связанные с ним проекты служат эффективной программной инфраструктурой (фреймворком) для приложений с интенсивным использованием данных, которые пользуются распределенными вычислительными средами для достижения высокой масштабируемости. Технологии IBM обогащают эту инфраструктуру с открытым исходным кодом посредством таких элементов, как аналитическое программное обеспечение, интеграция с корпоративными программными продуктами, расширения платформы и инструменты. Ссылки на дополнительную информацию о продукте BigInsights приведены в разделе Ресурсы. BigSheets - это основанный на браузере аналитический инструмент, первоначально разработанный группой IBM Emerging Technologies. В настоящее время инструмент BigSheets входит в состав продукта BigInsights, что позволяет бизнес-пользователям и непрограммистам исследовать и анализировать данные в распределенных файловых системах. BigSheets представляет пользователям подобный электронной таблице интерфейс, благодаря чему они могут моделировать, фильтровать, сочетать, исследовать и визуализировать данные, собранные из различных источников. Веб-консоль продукта BigInsights содержит вкладку для доступа к инструменту BigSheets. Ссылки на дополнительную информацию об этой веб-консоли приведены в разделе Ресурсы. На рисунке 1 показан пример коллекции данных в инструменте BigSheets. Хотя эта коллекция выглядит как типичная электронная таблица, она содержит данные из блогов, размещенных на публичных веб-сайтах, и аналитики даже могут нажимать на включенные в эту коллекцию ссылки с целью посещения веб-сайтов, которые опубликовали соответствующий исходный контент. Рисунок 1. Типовая коллекция BigSheets, основанная на данных из социальных медиа (со ссылками на исходный контент)После формирования коллекции BigSheets аналитик может фильтровать или преобразовать ее данные нужным для себя образом. На заднем плане инструмент BigSheets транслирует пользовательские команды, выраженные с помощью графического интерфейса, в скрипты на языке Pig, применяемые к подмножеству первичных данных. Это позволяет аналитику эффективно исследовать различные преобразования итеративным образом. После достижения удовлетворительного результата пользователь может сохранить коллекцию и запустить ее на исполнение, вследствие чего инструмент BigSheets инициирует такие операции, как применение MapReduce-заданий ко всему набору данных, запись результатов в распределенную файловую систему и демонстрация контента новой коллекции. Аналитики могут просматривать данные постранично или обрабатывать весь набор данных нужным для себя образом. Инструмент BigSheets дополнен несколькими готовыми к применению типовыми приложениями, которые бизнес-пользователи могут запускать из веб-консоли BigInsights с целью сбора данных с веб-сайтов, из систем управления реляционными базами данных, из дистанционных файловых систем и из других источников. В описанной ниже работе мы будем использовать два таких приложения. Однако необходимо понимать, что программисты и администраторы могут использовать и другие технологии BigInsights для сбора, обработки и подготовки данных к последующему анализу в инструменте BigSheets. К числу таких технологий относятся Jaql, Flume, Pig, Hive, MapReduce и другие. Перед началом работы рассмотрим учебный сценарий применения. Этот сценарий предусматривает анализ данных социальных медиа о системе IBM Watson и последующее объединение этих данных с полученными посредством имитационного моделирования внутренними данными о мероприятиях IBM по расширению медиаохвата, извлеченными из реляционных баз данных. Цель состоит в исследовании наблюдаемости, охвата и слухов относительно известного бренда (услуги, проекта и т. д.), что является распространенной потребностью во многих организациях. В этой статье мы не будем рассматривать весь набор имеющихся аналитических возможностей, поскольку наша цель состоит в демонстрации того, как ключевые аспекты инструмента BigSheets помогают аналитикам быстро приступить к работе с большими данными. Тем не менее, наша работа поможет читателю понять, что можно сделать ценой лишь небольших усилий - а возможно и вызовет удивление относительно популярности системы IBM Watson. IBM Watson - это исследовательский проект по применению сложных аналитических механизмов для получения ответов на вопросы, представленные на естественном языке. Программное обеспечение Watson "консультируется" с данными, собранными из различных источников, и использует платформу Hadoop для эффективной обработки этих данных с помощью объединенных в кластер серверов IBM Power 750. В 2011 г. система IBM Watson заняла первое место на телевизионной викторине, победив двух ведущих соперников из числа людей. Обратитесь в раздел Ресурсы для получения дополнительной информации о системе IBM Watson и о телевикторине Jeopardy! Прежде, чем приступить к использованию инструмента BigSheets, необходимо иметь соответствующие данные для анализа. Сначала мы сосредоточимся на сборе данных из социальных медиа. Сбор данных из социальных медиа Вне всякого сомнения, сбор и обработка данных, извлеченных из разнообразных социальных веб-сайтов, может оказаться трудным делом, поскольку разные веб-сайты содержат разную информацию и используют разные структуры данных. Кроме того, идентификация и обследование обширного диапазона отдельных веб-сайтов может оказаться весьма длительным мероприятием. Мы использовали типовое приложение BoardReader, предоставленное продуктом BigInsights, для инициирования поиска по блогам, по новостным потокам, по электронным доскам объявлений и по видео-сайтам. На рисунке 2 показаны входные параметры, введенные нами в приложение BigInsights BoardReader, которое мы запустили со страницы Applications веб-консоли BigInsights. Ссылки на необходимые сведения о веб-консоли и о ее каталоге типовых приложений содержатся в разделе Ресурсы. Рисунок 2. Вызов приложения BoardReader из веб-консоли инструмента BigInsightsКратко рассмотрим входные параметры, показанные на рисунке 2. Параметр Results Path специфицирует каталог в распределенной файловой системе Hadoop (HDFS), предназначенный для вывода результатов работы приложения. Последующие параметры показывают, что мы ограничили максимум совпадений в возвращаемых результатах числом 25000, а период поиска интервалом с 1 января 2011 г. по 31 марта 2012 г.Параметр Properties File ссылается на хранилище полномочий BigInsights, в которое мы поместили свой лицензионный ключ BoardReader (каждый заказчик должен обратиться в компанию BoardReader для получения действительного лицензионного ключа). И, наконец, "IBM Watson" - это предмет нашего поиска. После выполнения приложения распределенная файловая система содержит четыре новых файла в выходном каталоге, как показано в нижней части рисунка 3. Рисунок 3. Результаты работы приложения, сохраненные в инструменте BigInsightsС целью упрощения материал мы будем использовать в этой статье только новостные данные и данные блогов. Если желаете следовать нашему учебному сценарию, выполните приложение BoardReader с указанными нами параметрами или загрузите учебные данные. Обратите внимание, что материалы для загрузки содержат лишь подмножество информации, которую приложение BoardReader собирает из новостных потоков и блогов. В частности, мы удалили из учебных файлов полнотекстовый контент/HTML-контент постов и новостных сообщений, а так же некоторые метаданные. Такие данные не являются необходимыми для рассматриваемых в этой статье аналитических задач, а мы хотели сохранить контроль над размерами каждого файла. Каждый файл, возвращенный приложением BoardReader, представлен в формате JSON. Небольшую часть этих данных можно отобразить в виде текста на странице Files веб-консоли BigInsights, однако результаты будут трудны для прочтения. Через мгновение вы увидите, как преобразовать эти данные в "листы" (sheet) или в "коллекции" (collection) данных BigSheets, исследование которых осуществлять гораздо легче. Необходимо отметить, что каждый файл содержит несколько иную структуру JSON - это необходимо учитывать при моделировании коллекции, которая объединяет наборы данных из блогов и из новостей. В проектах в области "больших данных" широкое распространение получила подготовка или преобразование структур данных с целью упрощения последующего анализа. Сбор данных из реляционной системы управления базами данных После исследования определенных аспектов этих данных из социальных медиа мы объединяем их с данными, извлеченными из СУБД. Многие проекты в области больших данных предусматривают анализ новых источников информации (таких как данные социальных медиа) в контексте существующей корпоративной информации, включая данные, хранящиеся в реляционных СУБД. BigInsights обеспечивает подключение к различным реляционным СУБД и хранилищам данных, включая Netezza, DB2®, Informix®, Oracle, Teradata и др. Для нашего учебного сценария мы заполнили таблицу DB2 имитированными данными о мероприятиях IBM по расширению медиаохвата. Соединение этих реляционных данных с информацией, извлеченной из социальных веб-сайтов, могло предоставить нам определенные индикаторы для оценки эффективности и охвата различных усилий по повышению известности. Хотя инструмент BigInsights обеспечивает динамический доступ к реляционным СУБД посредством запросов через интерфейс командной строки, мы воспользовались типовым приложением Data Import веб-консоли BigInsights для извлечения интересующих нас данных. На рисунке 4 показаны входные параметры, которые мы предоставили этому приложению. Файл свойств mykeys в хранилище учетных данных BigInsights содержит необходимые входные параметры JDBC для установления соединения с базой данных, в т. ч. JDBC URL (напр., jdbc:db2://myserver.ibm.com:50000/sample), класс JDBC-драйвера (напр., com.ibm.db2.jcc.DB2Driver), а также идентификатор/пароль пользователя. Остальные входные параметры: простой SQL-оператор SELECT для извлечения интересующих нас данных из целевой базы данных, выходной формат (CSV-файл) и каталог для вывода результатов работы BigInsights. Рисунок 4. Вызов приложения Data Import из веб-консоли инструмента BigInsightsОбратите внимание, что до исполнения этого приложения мы загрузили соответствующие файлы драйвера СУБД в требуемый каталог BigInsights в распределенной файловой системе (/biginsights/oozie/sharedLibraries/dbDrivers). Поскольку в качестве системы-источника использовалась СУБД DB2 Express-C, мы загрузили файлы db2jcc4.jar и db2jcc_license_cu.jar. Если вы хотите воспроизвести наш учебный сценарий с задействованием СУБД, загрузите бесплатный экземпляр DB2 Express-C (соответствующая ссылка приведена в разделе Ресурсы),создайте и заполните учебную таблицу, а затем исполните приложение BigInsights Data Import, как описано в этой статье. В качестве альтернативного варианта, вы можете загрузить CSV-файл, извлеченный из DB2, а затем включить этот файл непосредственно в продукт BigInsights. Шаг 2. Создание коллекции BigSheets Чтобы приступить к анализу своих данных с помощью BigSheets, вам необходимо создать коллекции - структуры в стиле электронных таблиц - которые будут моделировать нужные файлы в вашей распределенной файловой системе. В нашем сценарии эти файлы включают JSON-данные блогов, собранные приложением IBM BoardReader, новостные JSON-данные, собранные приложением BoardReader IBM, и CSV-данные, извлеченные из DB2 приложением IBM Data Import. Рассмотрим базовую процедуру пошагового создания одной такой коллекции.
Рисунок 5. Создание коллекции с соответствующим механизмом чтения (reader) С помощь вышеописанной процедуры создайте для файла blogs-data.txt отдельную коллекцию и присвойте ей имя Watson_blogs. И, наконец, создайте третью коллекцию для CSV-файла с данными из СУБД и в качестве механизма чтения укажите для нее BigSheets Comma-Separated Values (CSV) Data. Присвойте этой коллекции имя Media_Contacts. Следует отметить, что коллекцию можно создать на основе контента всего каталога, а не только на основе единственного файла. Для этого с помощью навигатора файловой системы укажите целевой каталог, нажмите на кнопку Sheets в правой панели и выберите соответствующий механизм чтения для применения ко всем файлам в этом каталоге. Тем не менее, описываемый в этой статье сценарий использует три раздельных коллекций, как было указано выше. Довольно часто перед исследованием различных аспектов самих данных аналитики желают настроить формат, контент и структуру своих коллекций. Инструмент BigSheets предоставляет несколько макросов и функций для поддержки подобной подготовки данных. В этом разделе мы исследуем две таких опции: устранение ненужных данных посредством удаления столбцов и консолидация данных из двух коллекций посредством операции union. Приложение BigInsights BoardReader возвращает данные новостей и блогов, которые заполняют различные столбцы в каждой коллекции BigSheets. Для аналитической работы, которую мы рассматриваем в этой статье, нам нужно лишь подмножество этих столбцов, поэтому важным начальным этапом является создание новых коллекций, которые содержат лишь необходимые нам столбцы.
Рисунок 6. Удаление столбцов из коллекции Поскольку наша конечная цель состоит в консолидации данных из блогов и новостей в одну коллекцию для последующего анализа, примените аналогичный подход для создания новой коллекции для данных из блогов, которая будет содержать только следующие столбцы: Country, FeedInfo, Language, Published, SubjectHtml, Tags, Type, Url. Присвойте новой коллекции блогов имя Watson_blogs_revised. Объединение двух коллекций в одну с помощью операции union Теперь объедините недавно отредактированные коллекции (Watson_news_revised и Watson_blogs_revised) в одну коллекцию, на основе которой будет исследоваться охват системы IBM Watson. Для этого воспользуйтесь оператором инструмента BigSheets под названием union. Обратите внимание, что этот оператор требует, чтобы все листы имели одинаковую структуру. После выполнения инструкций из предшествующего раздела вы обладаете двумя такими коллекциями для объединения, каждая из которых имеет столбцы Country, FeedInfo, Language, Published, SubjectHtml, Tags, Type, Url (именно в таком порядке). Для объединения коллекций выполните следующие действия.
Затем проанализируйте данные в этой новой коллекции. Шаг 4. Исследование коллекции с целью рассмотрения глобального охвата IBM Watson Одна из областей, которую мы хотели бы исследовать - глобальный интерес к системе IBM Watson и ее охват в медийной среде. Сначала у вас может возникнуть искушение отсортировать коллекцию Watson_news_blogs по значениям столбца Country (страны). Однако, проинспектировав данные, вы заметите, что многие строки содержат пустые позиции для этого столбца. Это типичная ситуация для данных, собранных с социальных веб-сайтов и из других источников. Во многих случаях нужные данные отсутствуют, что вынуждает аналитиков прибегать к другим средствам для получения сведений об интересующих их областях. Для большинства постов в блогах и новостей указывается исходный язык, поэтому будем мы сортировать свои записи по языкам и по типам. Это поможет нам исследовать глобальный охват системы IBM Watson в постах блогов и в новостях:
Графическое представление результатов Вы можете просматривать свою коллекцию постранично для исследования охвата тематики IBM Watson на различных языках, однако самый простой способ для визуализации международного интереса к этой тематике - представить результаты в графическом виде. Это обеспечит "широкий обзор", что, в свою очередь, будет способствовать последующим исследовательским и аналитическим мероприятиям. Инструмент BigSheets поддерживает различные типы диаграмм, в т. ч. гистограммы, секторные диаграммы, облака тегов и т. д. Мы будем пользоваться простой секторной диаграммой.
Как и следовало ожидать, результирующая секторная диаграмма демонстрирует, что почти 79% собранных нами данных из новостей и блогов было опубликовано на английском языке. Однако сможете ли вы догадаться, как следующий по популярности язык для тематики IBM Watson? Секторная диаграмма на рисунке 12 позывает, что это русский язык. Перемещая курсор мыши над любой частью секторной диаграммы, показанной в инструменте BigSheets, вы сможете определить его опорное значение (в данном случае, это значение столбца Language). Рисунок 12. Оценка глобального интереса к тематике IBM Watson по разным языкам, основанная на доступных данных из новостей и из блоговПри перемещении курсора по пятому и шестому по величине секторам диаграммы на рисунке 12 (2,6% и 1,95%, соответственно), вы обнаружите, что они соответствуют различным диалектам китайского языка. Этот факт иллюстрирует другую распространенную ситуацию, связанную со сбором данных из различных источников, таких как социальные веб-сайты - значения данных, которые вы хотели бы рассматривать как идентичные, часто представляются несколько по-иному. Рассмотрим использование инструмента BigSheets для изменения этих значений таким образом, чтобы все вариации китайского языка были заменены единственным значением "Chinese" (китайский язык).
Углубление анализа: Фильтрация результатов и извлечение данных из URL-адреса Просмотренные вами данные способны породить множество разнообразных вопросов, которые нуждаются в дальнейшем исследовании. Это весьма характерно для анализа больших данных, который по своей природе часто является итеративным и исследовательским. Теперь мы несколько углубим наш анализ охвата тематики IBM Watson в англоязычных новостях и в постах блогов, чтобы точнее оценить охват в Великобритании. В соответствии с вводным характером нашей статьи мы применяем простой подход к исследованию этой темы. В частности, мы создаем из коллекции Watson_sorted новую коллекцию, хранящую англоязычные записи, у которых доменное имя в URL-адресе заканчивается на ".uk" или у которых параметр Country имеет значение "GB" (Великобритания). С этой целью нам придется использовать оператор BigSheets Filter, а так же макрос для извлечения данных хоста из полной URL-строки.
Сортировка результатов в столбце URLHOST или вывод диаграммы позволит вам быстро установить, какие британские веб-сайты в результирующей коллекции чаще всего затрагивают тематику IBM Watson. Например, на рисунке 17 показано облако тегов, которое мы создали для первой десятки таких веб-сайтов. Как и в случае любого другого облака тегов BigSheets, более крупный шрифт указывает на более высокую частоту употребления значения данных, а прокрутка по значениям данных отображает количество их употреблений в соответствующей коллекции. Рисунок 17. Десятка ведущих веб-сайтов Великобритании по охвату тематики IBM WatsonШаг 5. Дальнейшие исследования, сочетающие данные социальных медиа и структурированные данные Перед завершением этого введения в инструмент BigSheets исследуем несколько других интересных областей, затрагивающих наш учебный набор данных.
И, наконец, мы рассмотрим, как экспортировать контент коллекции в распространенный формат данных, который может с легкость использоваться сторонними приложениями. Выявление широты охвата и двенадцати ведущих веб-сайтов Один из аспектов оценки эффективности кампании по расширению медиаохвата - измерение широты охвата. В этом примере вы будете использовать инструмент BigSheets для выявления отдельных новостей и веб-сайтов для блогов, которые упоминают тематику IBM Watson.
Теперь, когда вы знаете, что многие веб-сайты содержат по несколько постов, вы можете выявить 12 ведущих веб-сайтов (содержащих большую часть постов по тематике IBM Watson), а затем визуализировать полученные результаты в виде гистограммы. Это несложно сделать, а результаты могут оказаться удивительными.
Проинспектируйте URL-адреса двух ведущих веб-сайтов. Вы увидите, что они представляют собой вариации адреса bizjournals.com. Это позволяет вам вернуться к коллекции и преобразовать или очистить эти данные. Как указывалось выше, во многих случаях анализ больших данных требует итеративных опереций по исследованию, обработке и очистке данных. И, наконец, после выявления12 ведущих веб-сайтов вас может заинтересовать такой аспект, как количество постов на каждом из этих сайтов. Реализуем простой способ получения такой информации.
Корреляция внутренних мероприятий по расширению медиаохвата с внешним охватом Вплоть до настоящего момента наша работа с инструментом BigSheets затрагивала только данные, собранные с внешних веб-сайтов. Однако многие проекты в области больших нуждаются в объединение внешних данных с внутренними корпоративными данными, такими как данные в реляционных СУБД. В этом разделе вы будете использовать инструмент BigSheets для объединения двух коллекций: одна из которых предназначена для моделирования данных социальных медиа, а другая - для моделирования реляционных данных. Объединив эти две коллекции, вы сможете исследовать, как корпоративные мероприятия по расширению медиаохвата коррелируют с охватом со стороны веб-сайтов других организаций. Обратите внимание, что учебные реляционные данные, которые мы предоставляем с этой статьей в виде CSV-файла, содержат имитируемую информацию о медийных контактах корпорации IBM. Для объединения коллекций и последующей визуализации результатов выполните следующие действия.
В некоторых случаях результаты вашего анализа с помощью инструмента BigSheets могут оказаться полезными для других приложений или для коллег, не обладающих полномочиями для непосредственной работы с BigInsights. К счастью, вы можете с легкостью экспортировать одну или несколько своих коллекций в распространенные форматы данных. Просто откройте целевую коллекцию, задействуйте функцию Export As (слева от кнопки Run) и выберите формат JSON, CSV, ATOM, RSS или HTML в качестве целевого формата. Результаты будут показаны в вашем браузере, а вы сможете сохранить выходные результаты в своей локальной файловой системе. Краткий экскурс за пределы базового уровня Итак, вы получили определенное представление о возможностях инструмента BigSheets. Вы увидели, как встроенные макросы, функции и операторы позволяют исследовать, преобразовывать и анализировать различные формы больших данных без написания кода на языке Java™ или на языке подготовки скриптов. Мы стремились упростить свой сценарий, чтобы вы смогли быстрее освоить базовые возможности BigSheets, однако эта технология - а также дополнительные технологии продукта BigInsights - предлагают гораздо больше, чем мы способны охватить во вводной статье. Например, многие проекты по анализу социальных медиа должны углубляться в контент постов, чтобы оценивать мнения, категоризировать контент, устранять ошибочные результаты и т. д. Такие проекты требуют извлечения контекста из текстовых данных. Эта возможность предлагается другим компонентом BigInsights, который будет предметом рассмотрения в будущей статье. К счастью, подобные возможности по анализу текста могут сочетаться с инструментом BigSheets с помощью специальных подключаемых модулей. Кроме того, некоторые аналитические задачи могут потребовать применения языка запросов, позволяющего с легкостью выражать различные условия, обрабатывать и преобразовывать вложенные структуры данных, применять сложные условные логические конструкции и т.д. И, действительно, продукт BigInsights поддерживает Jaql - язык запросов на базе JSON, который программисты часто используют для чтения данных и для их подготовки к последующему анализу в BigSheets. Язык Jaql будет рассматриваться в будущей статье. В статье было показано, как инструмент BigInsights позволяет бизнес-аналитикам работать с "большими данными" без написания программного кода или скриптов. В частности, статья рассмотрела два типовых приложения для сбора данных из социальных медиа и из реляционных СУБД, а также объяснила, как аналитики смогут моделировать, обрабатывать, анализировать, сочетать и визуализировать эти данные с помощью BigSheets - инструмента в стиле электронной таблицы, ориентированного на бизнес-аналитиков. С целью упрощения излагаемого материала в этой статье рассматривалось лишь подмножество операторов и функций BigSheets, наиболее релевантное нашему учебному сценарию по исследованию медиаохвата исследовательского проекта IBM Watson, который применяет сложные аналитические механизмы для получения ответа на вопросы, представленные на естественном языке. Если вы готовы приступить к проекту в области больших данных, обратитесь в раздел Ресурсы для получения ссылок на загрузки программного обеспечения, на онлайновые образовательные курсы и на другие материалы, связанные с BigInsights. Выражаем особую благодарность Стефену Додду (Stephen Dodd), вице-президенту компании Effyis Inc., который санкционировал предоставление образца выходных данных приложения BoardReader для загрузки вместе с этой статьей. Кроме того, выражаем благодарность сотрудникам IBM Диане Пупонс-Викхем (Diana Pupons-Wickham) и Гэри Робинсону (Gary Robinson) за рецензирование этой статьи.
Ссылки по теме
|
|