Лекция: Интерфейсы взаимодействия веб-приложений с СУБД

Интерфейс ODBC. Интерфейс программирования приложений для доступа к данным ADO. Модель доступа приложений к источникам данных ADO.NET.

 

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

До начал 90-х годов существовало несколько разных поставщиков баз данных, каждый из которых имел собственный интерфейс. Если приложению было необходимо обмениваться данными с несколькими источниками данных, для взаимодействия с каждой из баз данных было необходимо написать отдельный код. С целью решения этой проблемы Майкрософт и ряд других компаний создали стандартный интерфейс для получения и отправки данных источникам данных различных типов. Этот интерфейс получил название open database connectivity (ODBC).

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

По-сути, интерфейс ODBC является обычным процедурным API. ODBC поддерживается большим количеством операционных систем.

Имеются также ODBC-драйверы и для нереляционных данных, таких как электронные таблицы, текст и XML файлы.

Типичный сценарий работы веб-приложения с источником данных выглядит следующим образом:

  1. Установление соединение и подключение к источнику данных.
  2. Выполнение запросов, необходимых для выборки, вставки или изменения наборов данных источника.
  3. Отключение от источника данных.

Компанией Майкрософт был предложен интерфейс программирования приложений для доступа к данным, разработанный и основанный на технологии компонентов ActiveX - ADO (ActiveX Data Objects), который позволяет представлять данные из разнообразных источников (реляционных баз данных, текстовых файлов и т. д.) в объектно-ориентированном виде. Компоненты ADO нашли применятся при разработке приложений на таких языках как VBScript в ASP и Visual Basic.

В рамках Microsoft .NET основной моделью доступа приложений к источникам данных является ADO.NET. Она не является развитием ADO и представляет собой совершенно самостоятельную технологию.Компоненты ADO.NET входят в поставку .NET Framework.

ADO.NET включает в себя две основные части:

  • Dataprovider- набор классов для доступа к источникам данных. Каждый из источников данных имеет свой собственный набор объектов, однако все они имеют общее множество классов: Connection, Command, Parameter, DataAdapter, DataReader.
  • DataSets объекты - группа классов, описывающих простые реляционные базы данных, размещаемы в памяти. Содержит иерархию таких классов как: DataTable, DataView, DataColumn, DataRow, DataRowView, DataRelation, Constraint.

Объект DataSet заполняется данными из БД с помощью объекта DataAdapter, у которого заданы свойства Connection и Command. DataSet может сохранять свое содержимое также в XML (опционально вместе с XSD схемой) или получать данные из XML.

ADO.NET поддерживает работу с отсоединенными наборами данных, что крайне важно при использовании масштабируемых веб-приложений. Такая возможность реализуется с помощью класса DataSet совместно с классом DataAdapter.

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

19. Лекция: Введение в XML
 

HTML: достоинства и недостатки. XML: достоинства и недостатки. Технологии, использующие XML. Синтаксические правила построения XML-документа. Структура XML-документа.

В 1986 году, задолго до того, как идея создания сети Веб была воплощена в жизнь, универсальный стандартизированный язык разметки SGML (Standardized Generalized Markup Language) был утвержден в качестве международного стандарта (ISO 8879) определения языков разметки, хотя SGML существовал еще с конца шестидесятых. Он использовался для того, чтобы описывать языки разметки, предоставляя при этом автору возможность давать формальные определения каждому элементу и атрибуту языка.

Язык HTML первоначально был всего лишь одним из SGML-приложений. Он описывал правила, по которым должна быть подготовлена информация для World Wide Web. Таким образом, язык HTML - это набор предписаний SGML, сформулированных в виде определения типа документа (DTD), объясняющих, что именно обозначают тэги и элементы. Схема DTD для языка HTML хранится в веб-браузере.

К недостаткам языка HTML можно отнести следующие:

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

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

Группа экспертов по языку SGML, возглавляемая Джоном Боузэком (Jon Bosak) из компании Sun Microsystems, приступила к работе по созданию подмножества языка SGML, которое могло бы быть принято Web-сообществом. Решено было удалить многие несущественные возможности SGML. Перестроенный таким образом язык назвали XML. Упрощенный вариант оказался значительно более доступным, чем оригинал, его спецификации занимали всего 26 страниц по сравнению с более чем 500 страницами спецификаций SGML.

Рассмотрим более детально структуру и особенности этого языка.

XML (eXtensibleMarkupLanguage) - рекомендованный W3C язык разметки. XML - текстовый формат, предназначенный для хранения структурированных данных, для обмена информацией между программами, а также для создания на его основе специализированных языков разметки. XML является упрощенным подмножеством языка SGML.

ЯзыкXML имеет следующие достоинства:

  • Это человеко-ориентированный формат документа, он понятен как человеку, так и компьютеру.
  • Поддерживает Юникод.
  • В формате XML могут быть описаны основные структуры данных - такие как записи, списки и деревья.
  • Это самодокументируемый формат, который описывает структуру и имена полей также как и значения полей.
  • Имеет строго определенный синтаксис и требования к анализу, что позволяет ему оставаться простым, эффективным и непротиворечивым.
  • Широко используется для хранения и обработки документов;
  • Это формат, основанный на международных стандартах;
  • Иерархическая структура XML подходит для описания практически любых типов документов;
  • Представляет собой простой текст, свободный от лицензирования и каких-либо ограничений;
  • Не зависит от платформы;
  • Является подмножеством SGML, для которого накоплен большой опыт работы и созданы специализированные приложения;

К известным недостаткам языка можно отнести следующие:

  • Синтаксис XML избыточен.
    • Размер XML документа существенно больше бинарного представления тех же данных (порядка 10 раз).
    • Размер XML документа существенно больше, чем документа в альтернативных текстовых форматах передачи данных (например JSON, YAML) и особенно в форматах данных, оптимизированных для конкретного случая использования.
    • Избыточность XML может повлиять на эффективность приложения. Возрастает стоимость хранения, обработки и передачи данных.
    • Для большого количества задач не нужна вся мощь синтаксиса XML, и можно использовать значительно более простые и производительные решения.
  • Пространства имен XML сложно использовать и их сложно реализовывать в XML парсерах.
  • XML не содержит встроенной в язык поддержки типов данных. В нем нет понятий "целых чисел", "строк", "дат", "булевых значений" и т. д.
  • Иерархическая модель данных, предлагаемая XML, ограничена по сравнению с реляционной моделью и объектно-ориентированными графами.

Вообще говоря, XML можно рассматривать не только как новый язык разметки, но и как основу для целого семейства технологий:

XML Технические рекомендации об использовании XML
DTD Определение типа документа (схема)
XDR Формат XML Reduced (схема Microsoft)
XSD Определение схемы XML (схемы W3C)
Пространство имен Метод определения имен элементов и атрибутов
XPath Язык путей XML
XLink Язык ссылок XML
XPointer Язык указателей XML
DOM API для объектной модели документа
SAX Простой API для XML
XSL Расширяемый язык таблиц стилей
XSL-FO Объекты форматирования XSL
XSLT Язык преобразований XSL
XInclude Синтаксис XML Include
XBase Синтаксис XML Base URI

По-сути, XML служит метаязыком для описания структуры других языков. Взаимосвязь между SGML, XML, HTML и некоторыми другими языками показана на следующей диаграмме:

 

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

Документ XML считается правильно построенным, если он соответствует всем синтаксическим правилам XML.

Проверка действительности документа предполагает выполнение следующих действий:

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

Рассмотрим теперь основные синтаксические правила построения XML документов.

  • XML документ содержит один и только один корневой элемент, содержащий все остальные элементы
  • Дочерние элементы, содержащиеся в корневом элементе, должны быть правильно вложены.
  • Имена элементов подчиняются правилам:
  • Имя начинается с буквы, знака подчеркивания или двоеточия.
  • После первого символа в имени могут быть буквы, цифры, знаки переноса, подчеркивания, точка или двоеточие.
  • Имена не могут начинаться с буквосочетания XML.

XML документ имеет следующую структуру :

  • Первая строка XML документа называется объявлением XML. Это необязательная строка, указывающая версию стандарта XML (обычно это 1.0). Также здесь может быть указана кодировка символов и внешние зависимости.
  • Комментарий может быть размещен в любом месте дерева. XML комментарии размещаются внутри пары тегов <!-- и заканчиваются -->. Два знака дефис (--) не могут быть применены ни в какой части внутри комментария.
  • Остальная часть этого XML-документа состоит из вложенных элементов, некоторые из которых имеют атрибуты и содержимое.
  • Элемент обычно состоит из открывающего и закрывающего тегов, обрамляющих текст и другие элементы.
  • Открывающий тег состоит из имени элемента в угловых скобках;
  • Закрывающий тег состоит из того же имени в угловых скобках, но перед именем еще добавляется косая черта.
  • Содержимым элемента называется все, что расположено между открывающим и закрывающим тегами, включая текст и другие (вложенные) элементы.
  • Кроме содержания у элемента могут быть атрибуты - пары имя=значение, добавляемые внутрь открывающего тега после названия элемента.
  • Значения атрибутов всегда заключаются в кавычки (одинарные или двойные), одно и то же имя атрибута не может встречаться дважды в одном элементе.
  • Не рекомендуется использовать разные типы кавычек для значений атрибутов одного тега.
  • Для обозначения элемента без содержания, называемого пустым элементом, необходимо применять особую форму записи, состоящую из одного тега, в котором после имени элемента ставится косая черта "/".

К сожалению, описанные выше правила позволяют контролировать только формальную правильность XML документа, но не содержательную. Для решения второй задачи используются так называемые схемы.

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

Чаще всего для описания схемы используются следующие спецификации:

  • DTD (DocumentTypeDefinition) - язык определения типа документов.
  • XDR (XMLDataReduced) – диалект XML, разработанный Майкрософт.
  • XSD (язык определения схем XML) – рекомендована консорциумом W3C.

XML документ отличается от HTML документа также и тем, как он отображается в веб-браузере. Без использования CSS или XSL XML-документ отображается как простой текст в большинстве веб-браузеров. Некоторые веб-браузеры, такие как InternetExplorer, Mozilla и Firefoxотображают структуру документа в виде дерева, позволяя сворачивать и разворачивать узлы с помощью нажатий клавиши мыши.

Наиболее распространены три способа преобразования XML-документа в отображаемый пользователю вид:

  • Применение стилей CSS.
  • Применение преобразования XSLT.
  • Написание на каком-либо языке программирования обработчика XML-документа.

· 20. Лекция: Языки описания cхем XML

DTD схемы. Недостатки DTD схем. XDR схемы. Элементы и атрибуты XDR схем.

 

Идея создания собственных тэгов, имеющих специальное значение и помогающих описать содержание документа, сама по себе просто замечательна. Но если каждый пользователь может создавать свои собственные описания, каким образом их распознавать? С этой целью в спецификации XML для описания подобных "самодеятельных" тэгов используются схемы. Они необходимы для того, чтобы:

  • описать, что именно является разметкой;
  • описать точно, что означает разметка.

Наиболее известными языками описания схем являются следующие:

  • DTD (DocumentTypeDefinition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.
  • XDR (XMLDataReduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.
  • XML Schema или просто XSD (язык определения схем XML) – рекомендация консорциума W3C с 2001 года.

Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.

DTD схема

Схема DTD предоставляет шаблон разметки документа, в котором указываются наличие, порядок следования и расположениеэлементов и их атрибутов в документе XML.

В рамках DTD модель содержимого XML документа можно описать следующим образом:

 

Каждый элемент документа может иметь один из типов:

Содержание Синтаксис Комментарий
Данные <!ELEMENT имя (#PCDATA)> Содержит только текстовые данные
Другие элементы <!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> Содержит только дочерние элементы
Смешанное <!ELEMENT имя (#PCDATA, дочерний элемент)*> Содержит комбинацию текстовых данных и дочерних элементов
EMPTY <!ELEMENT имя EMPTY> Ничего не содержит
ANY <!ELEMENT имя ANY> Может содержать текстовые данные или дочерние элементы

Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:

<!ATTList

имя_элемента имя_атрибута1 (тип) значение_по_умолчанию

…………………………………………………………………………………...

имя_элемента имя_атрибутаN (тип) значение_по_умолчанию >

При этом атрибут в DTD может иметь один из трех типов:

  • Строка
  • Маркированные атрибут
  • Атрибута с перечислением

Кроме типа атрибута можно также задавать и его модальность:

Значение Описание
#REQUIRED Атрибут обязательно должен быть указан
#FIXED Значение атрибута не должно отличаться от указанного
#IMPLIED Необязательное значение

Рассмотрим в качестве примера описание атрибутов строкового типа для элемента, описывающего некоторое сообщение:

<!ATTLIST message

number CDATA #REQUIRED

date CDATA #REQUIRED

from CDATA #FIXED

status CDATA #IMPLIED>

Если этот элемент содержит атрибуты с перечислением, то их описание может выглядеть, например, следующим образом:

<!ATTLIST message

number ID #REQUIRED

from CDATA #REQUIRED

alert (low | normal | urgent) "normal">

Маркированных атрибуты элемента могут быть четырех типов:

Значение Описание
ID Уникальный идентификатор элемента (начинается с буквы, двоеточия или подчеркивания)
IDREF Ссылка на элемент, содержащий атрибуты ID
ENTITIES Ссылка на внешний элемент
NMTOKEN Содержит буквы, цифры, точки, знаки подчеркивания, переносы, двоеточия, но не пробелы

И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:

Символ Пример Описание
, (a, b, c) Последовательное использование элементов списка
| (a | b | c) Используется один из членов списка
  date Используется один и только один элемент
? subject? Необязательное использование (0 или 1 раз)
+ paragraph+ Используется один или несколько раз
* brother* Используется ноль или несколько раз

В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:

<!ELEMENT mailbox (message*)>

<!ELEMENT message (head, body)>

<!ATTLIST message uid CDATA #REQUIRED>

<!ELEMENT head ( from,to+, subject?, CC*, notify?) >

<!ELEMENT from (#PCDATA)>

<!ELEMENT to (#PCDATA)>

<!ELEMENT subject (#PCDATA)>

<!ELEMENT CC (#PCDATA)>

<!ELEMENT notify EMPTY>

<!ELEMENT body (#PCDATA)>

Исходный XML документ, удовлетворяющий данной схеме, может выглядеть, например, так:

<?xml version="1.0" ?>

<!DOCTYPE mailbox SYSTEM "mailbox.dtd">

<mailbox>

<message uid="1">

<head>

<from>user1@myhp.edu</from>

<to>user2@myhp.edu</to>

<subject>Re:</subject>

</head>

<body>

What's up!

</body>

</message>

<message uid="2">

<head>

<from>user3@myhp.edu</from>

<to>user2@myhp.edu</to>

<subject>Remind</subject>

<CC> user1@myhp.edu </CC>

<notify/>

</head>

<body>

Remind me about meeting.

</body>

</message>

</mailbox>

Обратите внимание на 2-ю строчку документа, в которой указывается внешняя ссылка на файл, содержащий DTD схему.

В принципе, DTD допускает два способа использования в XML документе.

  • Объявление внутренней схемы:

· <!DOCTYPE корневой_элемент [

· <!ELEMENT корневой_элемент (модель содержания)>

· ]>

  • Объявление внешней схемы:

· <!DOCTYPE корневой_элемент SYSTEM "name.DTD">

В заключение укажем на следующие недостатки DTD схем:

  • Не являются экземплярами XML. Требуется изучение совершенно другого языка.
  • Не предоставляют контроль за типами данных, за исключением самых простых текстовых данных.
  • Не являются экземплярами XML, поэтому их нельзя легко расширить или преобразовать к другим языкам разметки – HTML или DHTML.
  • Не обеспечивают поддержки пространств имен XML.

XDR схема

XML-Data – полное имя языка описания схем, предложенного Майкрософт, а XML-DataReduced– это "часть" полной рекомендации. Схема XDR - это экземпляр XML, т.е. соответствует всем синтаксическим правилам и стандартам XML.

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

Корневым элементом в схеме XDR всегда является элемент Schema:

<Schema

name="имя_схемы" xmlns="urn:schemas-microsoft-com:xml-data"

xmlns:dt="urn:schemas-microsoft-com:datatypes">

<-- Объявления других элементов -->

</Schema>

Элемент ElementType имеет синтаксис:

<ElementType

content="{empty | texOnly | eltOnly | mixed}">

dt:type "datatype"

model="{open | closed}"

name = "idref"

order="{one | seq | many}"

>

Элемент ElementType может иметь следующие атрибуты:

Имя атрибута Описание
name Имя элемента
content Содержание элемента. Допустимые значения: empty (пустой элемент), eltOnly (может быть только контейнером для других элементов), textOnly (только текстовые данные), mixed (смешанные данные).
dt:type Тип данных элемента
model Может принимать значения:
Open – разрешено использовать элементы, не определенные в схеме
Closed – запрещено использовать элементы, не определенные в схеме
order Порядок следования дочерних элементов в экземпляре XML. Допустимые значения:
one – предполагается наличие одного документа
many – любое количество элементов в любом порядке
seq – элементы указываются в строго заданном порядке.

В качестве дочерних элементов для ElementType можно использовать следующие:

Имя элемента Описание
element Объявляет дочерний элемент
description Обеспечивает описание элемента ElementType
datatype Обеспечивает тип данных элемента ElementType
group Определяет порядок следования элементов
AttributeType Определяет атрибут
attribute Определяет сведения о дочернем элементе AttributeType

Для объявления атрибутов используется синтаксис:

<AttributeType

default="default-value"

dt:type="primitive-type"

dt:values="enumerated-values"

name="idref"

required="{yes|no}"

>

В свою очередь элемент AttributeType может иметь атрибуты:

Значение Описание
default Значение по умолчанию
dt:type Один из следующих типов:
entity, entities, enumeration, id, idref, nmtoken, nmtokens, notation, string
dt:values Допустимые значения
name Имя атрибута
required Указывает на обязательное наличие атрибута в описании

Синтаксис для описания элемента attribute выглядит следующим образом:

<attribute

default="default-value"

type="attribute-type"

[required="{yes|no}"]

>

а его возможные значения могут быть такими:

Значение Комментарий
default Значение по умолчанию
type Имя элемента AttributeType, определенного в данной схеме. Должно соответствовать атрибуту name элемента AttributeType
required Указывает на обязательное наличие атрибута в описании

В отличие от DTD схем XDR поддерживает типы данных. Элемент Schema имеет следующий атрибут:

Xmlns:dt="urn=schemas-microsoft-com:datatypes"

С полным списком типов данных можно ознакомится на странице по адресу: http://msdn.microsoft.com/en-us/library/ms256121(VS.85).aspx

Индикаторы вхождения в схемах XDR имеют синтаксис:

<element

type="element-type"

[minOccur="{0|1}"]

[maxOccur="{1|*}"]

>

XDR схема позволяет определять группы содержания. Так, в элементе ElementType может содержаться элемент group, имеющий синтаксис:

<group order="(one|seq|many)" minOccur="(0|1)" maxOccur="(1|*)">

<element type="ElementType/">

<element type="ElementType/">

<element type="ElementType/">

<element type="ElementType/">

</group>

В заключение приведем пример XSD схемы, описывающей структуру XML документа, содержащего письма электронной почты:

<?xml version = "1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema">

 

<xsd:element name="m_box">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="message" minOccurs="0"

maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

 

<xsd:element name="message">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="head" minOccurs="1" maxOccurs="1"/>

<xsd:element ref="body" minOccurs="1" maxOccurs="1"/>

</xsd:sequence>

<xsd:attribute name="uid" use="required" type="xsd:string"/>

</xsd:complexType>

</xsd:element>

 

<xsd:element name="head">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="to" minOccurs="1" maxOccurs="unbounded"/>

<xsd:element ref="from" minOccurs="1" maxOccurs="1"/>

<xsd:element ref="date" minOccurs="1" maxOccurs="1"/>

<xsd:element ref="subject" minOccurs="1" maxOccurs="1"/>

<xsd:element ref="cc" minOccurs="0" maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

 

<xsd:element name="to" type="xsd:string"/>

<xsd:element name="from" type="xsd:string"/>

<xsd:element name="date" type="xsd:string"/>

<xsd:element name="subject" type="xsd:string"/>

<xsd:elememt name="cc" type="xsd:string"/>

 

</xsd:schema>

Для проверки действительности XML документа можно использовать специальные валидаторы, например W3C валидатор (http://validator.w3.org/).

Для проверки схем также существуют специальные валидаторы, например XMLSchema валидатор (http://www.w3.org/2001/03/webdata/xsv).

Согласно спецификации W3C XML программа должна прекратить обработку XML документа, как только будет обнаружена ошибка в этом документе.








Дата добавления: 2015-12-29; просмотров: 1631;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.144 сек.