RTFM! статьи, советы, скрипты
::Заработок с помощью сайта ::JScript по-русски! ::Все русские мануалы::
МЕНЮ
О САЙТЕ
НОВОСТИ
СТАТЬИ
КНИГИ
АППЛЕТЫ
СВЯЗЬ

СЧЕТЧИКИ
Rambler's Top100
Рейтинг@Mail.ru
Яндекс цитирования

SSI. Что это такое?

Автор: А.Летуновский Сайт: http://www.comprice.ru/     Рейтинг: N/A из 7       <<НАЗАД
   
   
   Технология эта носит гордое название, как всегда, из трех букв - S.S.I. Насчет "как всегда" не подумайте ничего дурного, ведь в действительности так и есть, что ни возьми все по стандарту: css, cgi, www. Но давайте не будем строить предположения о причинах такого положения вещей, - скорее всего, просто так удобней. К тому же, основная общность всех этих названий состоит в том, что все они являются, по субъективно-объективному мнению многих, "наворотами" над почти полностью исчерпавшей себя и к настоящему моменту уже непригодной технологии HTML. Последнее предложение, отмечу еще раз, является мнением далеко не всех, но многих.
   
   В действительности, Интернет уже просто устал от невероятного количества подобных наворотов, которые появляются, считай, каждый месяц, и, как правило, либо упрощают сложные, но ставшие обычными вещи, либо просто имитируют действия друг друга с оглядкой на приорететы фирмы, их создавшей. Касается это, в основном, конкуренции между броузерами и, соответственно, интерпретаторами различных кодов, написанными под них. Если, к примеру, взять спецификацию HTML 4, так просто удивляешься, как далеко тот же Microsoft Internet Explorer от нее, так сказать, продвинулся вперед. Те же легендарные ActiveX и Vbscript для своего описания требуют уже не просто отдельных книг, а целых библиотек сугубо научной литературы.
   
   А вот представим себе, что фирма Microsoft прекратила выпуск своих броузеров (конечно, вероятность такого поворота событий, мягко говоря, невелика, но все же никто не застрахован от неожиданных приятных случайностей). И куда же, в таком случае девать всю эту огромную кипу никому не нужной бумаги?... Правильно... Но все же обидно, что такие замечательные вещи, разрабатываемые столь же замечательными людьми на протяжении не одного месяца, а может даже и года, уйдут в глубины истории из-за того, что несколько фирм не смогли друг с другом договориться об общепринятых стандартах.
   
   Как бы то ни было, технологии, которая будет рассмотрена в этой статье, все вышеописанное пока, по крайней мере, не грозит, так как работает она непосредственно на сервере, а не на стороне клиента, и поэтому, соответственно, какой у этого клиента броузер - никого не волнует. Все равно он получит то, что получит, а каким образом все это будет происходить - да какая ему разница.
   
   Как это выглядит?
   
   SSI расшифровывается как Server-Side Includes, что примерно переводится как "Включения на стороне сервера". Изначально разрабатывались они как дополнения к CGI-скриптам (программам, управляющим отображением документа с сервера, не загружаясь при этом к промотрщику на винчестер), однако в дальнейшем были преобразованы в очередную новую технологию, расширяющую возможности html. На самом деле, появления чего-то подобного ожидали уже довольно давно, однако предполагалось, что это нечто будет включено непосредственно в html и, соответственно, будет выглядеть наподобие таблиц стилей CSS либо станет дополнением к Javascript, но почти никто не думал, что все это будет являться совершенно отдельным образованием. Почему сделали именно так, как сделали, лично для меня загадка.
   
   Новая технология практически никак не интегрируется ни с чем старым, при этом, конечно, давая какие-то ранее неизвестные возможности, но, опять же, в определенных рамках, практически не дающих никакого простора для творчества. По сути дела, SSI - это не что иное как некоторые возможности языка Perl, изложенные таким образом, что применение их здесь требует гораздо меньших затрат от программиста на разработку и написание кода.
   
   Достаточно искушенный пользователь найдет множество аналогий SSI с другими элементами из темы компьютерного искусства. Одним может показаться, что это очередной вариант каких-то новых особых тэгов html, сама особенность которых заключается в том, что они не передаются на сторону клиента, а исполняются непосредственно на сервере. Другие найдут аналогии с неким командным языком, наподобие того, что интерпретируется command.com'ом в dos и windows, но предназначенного исключительно для контроля передачи информации через глобальную сеть. Третьим покажется, что включения SSI можно сравнить с директивами компилятору в каком-нибудь Pascal или C. На самом деле и тот, и другой, и третий варианты будут верны по-своему.
   
   По стилю написания SSI черезвычайно похож на макроязык, применяемый в C++. Здесь тоже есть свои директивы, свои переменные включения и т. д. Непосредственно элементы SSI - это команды, заставляющие серевер дописывать какие-то элементы в код, включаются в HTML-документ, хотя и работают только на сервере. Синтаксис подобных команд имеет следующий вид:
   
   <!--#element attribute=value attribute=value ... -->
   
   Очень часто значения атрибутов помещается в двойные кавычки, хотя это и не обязательно. Некоторые команды позволяют иметь только одну пару "атрибут-значение". Важно так же обратить внимание на то, что заключительная часть комментария (-->) должна всегда отделяться от директивы пробелом, иначе она будет воспринята как ее часть. Перед тем как загрузить содержимое документа куда-либо в броузер, сервер просматривает его содержимое, игнорируя обычные тэги и скрипты, при этом интерпретируя только SSI -директивы и выполняя действия ими предписываемые. При этом на сторону клиента грузится не сама директива, а тот html или Script-коды, которые эта директива требует автоматически при загрузке включить документ.
   
   Далее с помощью SSI можно не только, в зависимости от некоторых условий, выводить определенные части документа, не только формировать документ из заранее определенных кусочков, но и вставлять результат работы некоторого CGI-сценария или программы прямо в документ.
   
   Где это можно посмотреть?
   
   Как уже отмечалось ранее, директивы SSI невозможно просмотреть в стандартном броузере, они выглядят как HTML-коментарии и интерпретируются соответственно. Что бы заниматься подобными вещами у себя на компьютере, вам следует установить себе виртуальный сервер. Как можно догадаться из названия - это программа, которая имитирует сервер на простом домашнем компьютере. Выражается это, на самом деле, не только в том, что вы сможете потренироваться в написании документов с SSI-командами.
   
   С помощью подобной программы возможно сделать из своей персоналки действительно настоящий портал со своим контроллером входящего и исходящего трафиков и даже со своей личной службой DNS-адресации, то есть, например, можно сделать себе домен первого уровня в какой-то локальной сети, и все ее пользователи тогда смогут зайти на ваш сайт, просто набрав его имя в командной строке своего броузера, без всяких лишних точек и слэшев.
   
   Самым популярным виртуальным сервером на сегодняшний день является сервер Apache. Он достаточно свободно распространяется на многочисленных прилавках, торгующих дисками с программным обеспечением, - как вы понимаете, обязательно лицензионным. Лично я себе такую лицензионную версию купил за 60 рублей, уже не помню, где. Однако дело не в этом. В стандартном дистрибутиве Apache имеется модуль mod_include, который непосредственно занимается SSI. Начиная с версии 1.2 он имеет расширенное количество директив и называется - XSSI (eXtended SSI). По умолчанию, он включен в компиляцию.
   
   Установка и начало работы
   
   Установка производится автоматически, соответственно, никаких особых знаний для своего проведения не требует, однако, для того чтобы начать работу с SSI после установки, нужно включить механизм Server-Side Includes. Для этого нужно установить обработчик "server-parsed" для нужной страницы. Любой документ, у которого он установлен, будет сканироваться уже упоминавшимся модулем mod_include, если включена опция "Includes" в свойствах самой программы.
   
   Если вы предполагаете иметь на своем компьютере достаточно малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующие две строки:
   
   AddType text/html .shtml
   
   AddHandler server-parsed .shtml
   
   И далее устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в том же файле конфигурации указать:
   
   AddHandler server-parsed .html
   
   После выполнения описанных действий в дальнейшем любой файл с расширением SHTML будет автоматически распознаваться как имеющий SSI-директивы и интрпретироваться, соответственно, перед отображением в броузере.
   
   Виртуальный сервер - вещь интересная, полезная, а в некоторых случаях необходимая, однако ввиду того, что статья посвящена другому, а также справедливости ради, могу сказать, что для просмотра файлов с ограниченным количеством SSI-директив его устанавливать вовсе не обязательно. Подобное расширение HTML-технологий поддерживается в генераторе Macromedia Dreamweaver 3, однако поддерживается довольно убого, работая почти в половину возможностей. К тому же, чтобы просмотреть такой документ, нужно помимо того что устанавливать ему расширение .shtml либо .shtm, как и в случае с сервером Apache, изначально открывать его в самом DreamWeaver, после чего, пользуясь командой "Файл -> Предварительный просмотр" наслаждаться видом своего творения непосредственно в броузере. Подобный подход можно назвать удобным с большой натяжкой, поэтому во избежание лишних трудностей следует все же установить на персональный компьютер виртуальный сервер.
   
   Базовые директивы
   
   Как уже отмечалось, директивы SSI включаются в HTML-документ в виде комментариев (это не мешает вам использовать обычные комментарии). Каждая такая директива заставляет интерпретатор Apache выполнять определенное действие, будь то включение в документ стороннего html-кода, либо установка параметров самого документа. Также существуют команды альтернативного выбора, которые заставляют выполнять последующий после них ряд действий в случае, если какое-либо условие окажется истинным. Рассмотрим по-порядку определенные в Apache элементы SSI, отвечающие за определенную совокупность действий.
   
   Свойства документа
   
   Для переопределения некоторых свойств отображаемого документа в Apache существует параметр config, который контролирует различные аспекты сканирования. Его атрибутами могут быть:
   
   errmsg - устанавливает сообщение, выводящееся при возникновении ошибки; в большинстве случаев целесообразно установить в пустую строку;
   
   sizefmt - устанавливает формат, в котором будет выводиться размер файла. Формат соответствует передаваемому библиотечной функции strftime;
   
   timefmt - устанавливает формат, в котором будет выводиться дата.
   
   К примеру, если мы хотим, чтобы в случае ошибки загрузки или сканинга нашего документа выводилось нами определенное сообщение, то нужно в shtml-документ добавить следующую строку
   
   <!--#config errmsg="Привет чел...!" -->
   
   В этом случае на экране пользователя вместо скучного и опостылевшего сообщения типа "Не удается отобразить что-то там, что должно грузиться. Проверьте правильность адреса, и все такое" высветится описанное ранее приветствие, которое, несомненно, вызовет с его стороны необыкновенную симпатию к вашему ресурсу и заставит его вновь и вновь пытаться произвести загрузку.
   
   На самом деле, эта директива используется крайне редко, а чаще всего не используется вообще, так как не дает в руки разработчику в ообщем-то никаких реальных преимуществ. Соответственно, не каждый сервер содержит ее в своем наборе SSI-команд и поэтому нет никакой уверенности, что она будет работать именно на вашем хостинге. Что касается домашних компьютеров, помимо Apache, существует еще великое множество подобных ему виртуальных серверов. И эта команда поддерживается далеко не во всех. Поэтому в большинстве случаев рекомендуется вообще не использовать директиву config.
   
   Свойства файла
   
   В зарезервированном наборе свойств, которые можно применять к файлу, в ообщем-то, ничего необычного нет. Заметно только, что количество атрибутов явно не соответствует действительным свойствам любого такого файла. Связано это, вероятно, с тем, что технология новая и недоработанная - а соответственно, все нужное будет появляться постепенно в следующих ее версиях, если, конечно, все это будет существовать. Ну а пока для чтения свойств сканируемого файла мы имеем следующие команды.
   
   flastmod - выводит дату последней модификации файла в определенном с помощью timefmt формате. Атрибуты аналогичны атрибутам fsize.
   
   fsize - выводит размер файла в определенном с помощью sizefmt формате. Допустимые атрибуты:
   
   file - определяет путь к файлу относительно сканируемого документа; на самом деле, этот атрибут используется очень редко, так как путь к файлу нужно указывать в формате, определенном на платформе операционной системы Linux, а это связано с возможностью возникновения ряда ошибок при разработке документа пользователями, имеющими дело только с windows - например, такой путь не может содержать ../ и не может быть абсолютным путем. Во избежание всего только что описанного следует использовать параметр virtual, путь к которому можно указывать всеми известными разумными способами.
   
   virtual - определяет стандартный кодированный URL относительно сканируемого документа, или при наличии в начале слэша (/), - относительно корня документов узла.
   
   Динамические включения в документ
   
   Пожалуй, самая интересная и самая часто используемая возможность, которую предоставляют в руки программиста директивы SSI. По большому счету, именно благодаря команде динамических включений в документ и появилась вся эта технология в целом. Подобная возможность является, несомненно, главной относительно всех других, которые, в свою очередь, относительно нее служат лишь дополнениями к главному. Поддерживается во всех известных виртуальных серверах, а также в Macromedia DreamWeaver, начиная с третьей версии.
   
   include - включает текст другого документа или файла в сканируемый файл. К включаемому файлу применяются все установленные правила ограничения доступа. Если для каталога, из которого включается файл, установлена опция IncludesNOEXEC, и включение данного документа привело бы к запуску программы, то документ не включается, и выводится сообщение об ошибке. CGI сценарии вызываются, как обычно, с помощью URL, который может содержать кодированную строку запроса (query string). Положение файла указывается с помощью атрибутов:
   
   file - указывает путь относительно сканируемого документа; как уже отмечалось, такой путь не может содержать ../ и не может быть абсолютным путем; поэтому всегда предпочтительнее использовать атрибут virtual;
   
   virtual - содержит кодированный URL, относительный или абсолютный; URL не может содержать имя протокола или имя хоста и может содержать строку запроса.
   
   Работа с переменными
   
   Переменной в SSI считается любая стро'ка, а также любая внутренняя переменная окружения. Для работы с переменными предусмотрены следующие команды:
   
   echo - выводит значение ранее установленной переменной SSI. Допустимым атрибутом является var, в котором определяется сама переменная, значение которой будет выводиться. Переменная SSI - это какая-то строка, которая при подстановке в документ образует правильную структуру, будь то тэг или его атрибут, либо еще что-нибудь.
   
   set - устанавливает значение переменной. Ее атрибутами являются var, определяющий имя переменной, и value, определяющий ее значение.
   
   Здесь следует дать некоторые пояснения, зачем вообще нужны переменные в SSI. Нужны они лишь для того, чтобы автоматически подставлять какие-то строковые значения в тэги, тем самым их изменяя. Например, мы определили следующую переменную:
   
   <!--#set var="I_TITLE" value="z-freid.narod.ru Лучший сайт глобальной сети Интернет" -->
   
   которая обозначает какое-то значение заголовка документа. Использовать мы ее можем следующим образом:
   
   <title><!--#echo var="I_TITLE" --></title>
   
   При этом документ, в котором будет использована данная строка, получит именно такой заголовок. Следует отметить, что между тэгами <title></title>, помимо SSI-команды, вывести переменную I_TITLE, могло быть еще что угодно, вплоть до еще одной переменной. Здесь особых ограничений не существует. В этом случае мы получили бы просто заголовок, составленный из двух или более строк.
   
   Переменные включения
   
   В дополнение к стандартным переменным окружения CGI, модуль SSI делает доступными для директив и условий, а также для вызываемых через SSI-сценариев следующие переменные:
   
   DATE_GMT - текущее время по Гринвичу;
   
   DATE_LOCAL - текущее локальное (для сервера) время;
   
   DOCUMENT_NAME - имя файла (без каталогов) документа, запрошенного пользователем;
   
   DOCUMENT_URI - декодированный URL запрошенного пользователем документа;
   
   LAST_MODIFIED - дата последней модификации документа, запрошенного пользователем. То есть, во вложенном SSI эта переменная будет содержать имя "главного" документа, а не вложенного.
   
   printenv - выводит содержимое переменных окружения. Вызывается без параметров.
   
   Важно отличать переменные окружения от отдельных строк. Для этого в SSI принято их записывать со знаком доллара впереди, а простые строки должны быть обрамлены в кавычки, таким образом $ LAST_MODIFIED - это переменная окружения, а "LAST_MODIFIED" - это обыкновенная строка.
   
   Условные операторы
   
   Для динамического формирования внешнего вида загружаемых документов, в зависимости от действий пользователя либо просто от свойств самого документа, в SSI существуют условные операторы или контролирующие элементы, назначение которых заключается в выполнении каких-то действий в зависимости от условия, определенного разработчиком страницы. На сегодняшний день условные операторы являются единственным элементом программирования, используемым в SSI. Базовыми элементами контроля являются следующие директивы:
   
   <!--#if expr="test_condition" --> - проверяет условие test_condition, и в случае его верности выполняет все последующие операции, определенные SSI-директивами до строки <!--#endif -->. В обратном же случае все находящееся между этими двумя операторами игнорируется и программа сканирует документ далее, в том случае, если внутри игнорируемой области не определены какие-либо другие операторы выбора.
   
   <!--#elif expr="test_condition" --> - если вставляется в документ, то всегда должно следовать за <!--#if expr="test_condition" -->. Использование по отдельности, как можно догадаться из смысловой нагрузки, для данной директивы не предусмотрено. Начинает действовать в случае, если условие в первом до нее операторе if явилось ложным. Тогда данная команда проверяет свое условие test_condition, не обязательно совпадающее с условием вызывающей директивы, и в случае, если оно имеет значение "правда", вызывает какое-либо действие, описываемое директивой далее в документе до следующего элемента <!--#elif expr="test_condition" -->.
   
   <!--#else --> - если кто-то знаком с языком программирования Javascript или Java, то поймет, что этот оператор имеет примерно такой же смысл, как switсh(default()). Другими словами, он выполняется только тогда, когда все операторы <!--#elif expr="test_condition" -->, следующие до него, не дали желаемого результата. Пишется всегда на заключительной стадии оператора if прямо перед <!--#endif -->.
   
   <!--#endif --> - не проверяет никаких условий. Просто закрывает блок сравнений, открываемый оператором <!--#if expr="test_condition" -->. Служит, как можно понять, для предотвращения путаницы в документе в случае двух и более операторов if, однако наличие его обязательно в любом случае.
   
   При записи условных операторов в SSI полезно помнить следующий набор правил и свойств переменных.
   
   Элементы elif и else являются необязательными.
   
   Элемент endif заканчивает элемент if и является обязательным.
   
   test_condition может быть одним из следующих:
   
   string - истинно, если string не пуста;
   
   string1 = string2 - истинно, если первая строка соответствует второй.
   
   string1 != string2 - истинно, если первая строка не соответствует первой.
   
   string1 < string2 - истинно, если первая строка меньше второй.
   
   string1 <= string2 - истинно, если первая строка либо соответствует второй, либо меньше ее.
   
   string1 > string2 - истинно, если первая строка больше второй.
   
   string1 >= string2 - истинно, если первая строка либо соответствует второй, либо больше нее.
   
   Если string2 записывается в форме /string/ то тогда она интерпретируется как регулярное выражение. Их синтаксис аналогичен синтаксису регулярных выражений в Unix команде egrep;
   
   string - это практически любая строка, содержащая либо тэг целиком, либо его часть либо код какого-либо скрипта, в общем, любую часть документа. Так же это может быть любая переменная окружения, определенная в самом SSI либо в CGI-скрипте, совместно с которым используется документ.
   
   Так же, как в полноценном языке программирования, условные операторы в нашем случае содержат возможность применения к их переменным ряда логических операций. В этом случае мы имеем следующие возможности по изменению истинности выражений.
   
   ( test_condition ) - истинно, если test_condition истинно;
   
   ! test_condition - истинно, если test_condition ложно;
   
   test_condition1 && test_condition2 - истинно, если как test_condition1, так и test_condition2 истинны;
   
   test_condition1 || test_condition2 - истинно, если хотя бы test_condition1 или test_condition2 истинно.
   
   "=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!" имеет наивысший приоритет.
   
   Важно запомнить! Все, что не распознается, как переменная, считается строкой. Если строка имеет пробелы или символы табуляции, то ее надо заключать в кавычки.
   
   Подстановка переменных
   
   Переменной в SSI считается строка любого типа или зарезервированные переменные окружения. Так же, как и в языке Perl в SSI, переменные инициируются с помощью знака доллара($). Подстановка переменных производится внутри заключенных в кавычки строк в большинстве аргументов SSI-директив. В этих случаях знак доллара можно вставить, предварив его слэшем:
   
   <!--#if expr="$a = \$test" -->
   
   Для предотвращения двусмысленности можно заключать имя переменной в фигурные скобки:
   
   <!--#set var="Zed" value="${a}bc_${abc}" -->
   
   В результате такого присвоения, переменная Zed будет иметь значение "Xbc_Y", если переменная a равна X, а переменная abc равна Y.
   
   Используются подобные сложные структуры довольно редко, так как относятся больше к изощрениям с использованием зарезервированных возможностей, однако ради интереса и для большей ясности последние объявления следует немного пояснить.
   
   Представим, что у нас в каком-то стороннем файле - пусть он называется storon_X.shtml - существует следующий набор директив:
   
   <!--#set var="_title" value="Программы на языках высокого уровня" -->
   
   <!--#set var="__title" value="Обзоры новейших генераторов html-кода" -->
   
   Все их действие заключается в установке двум строковым переменным (_title и __title) определенных значений, которые потом предполагается использовать на месте заголовка какого-либо документа. Также предположим, что у нас есть еще один сторонний документ (назовем его storon_X2.shtml), который в своем заголовке должен иметь следующую строку текста: "Программы на языках высокого уровня Различные навороченные фишки Обзоры новейших генераторов html-кода". Тогда, чтобы сформировать переменную такого вида уже в самом текущем документе, нам понадобится объявление типа:
   
   <!--#set var="SuperTitle" value="${_title} Различные навороченные фишки ${__title}" -->
   
   Все это имеет смысл, если у нас есть еще один сторонний фаил (этот пусть называется просто XXX.shtml), который в своем заголовке содержит строку "Программы на языках высокого уровня Еще много чего крутого". Тогда в нем объявление соответствующей переменной будет выглядеть следующим образом:
   
   <!--#set var="SuperTitle" value="${_title} Еще много чего крутого " -->
   
   Таким образом, для формирования сразу двух заголовков различных файлов мы можем использовать один лишь storon_X.shtml. Конечно, для того чтобы все заработало, надо не забыть включить в них обоих следующую незамысловатую строку:
   
   <!--#include virtual="storon_X.shtml" -->
   
   Пример этот является абсолютно бесполезным, однако же при этом довольно наглядно поясняет некоторые теоретические сведения, изложенные в этой статье.
   
   Что дальше?
   
   На самом деле, значение SSI трудно переоценить. Хотя технология и является еще довольно недоработаным продуктом, но уже сегодня можно смело сказать, что она значительно облегчает жизнь многим людям, так или иначе имеющим отношение к вэб-дизайну. Вот предположим, что у нас есть серия документов, содержащих каждый по одной какой-либо картинке. Причем, в каждом картинка своя, со своими размерами и, соответственно, содержанием. Более того, документы отличаются друг от друга по своему заголовку и ключевым словам, по которым ищет их поисковая система. Представим также, что таких документов на нашем сервере больше, чем волос на голове у Ленни Кравитца.
   
   Как бы то ни было, согласимся, что писать для каждого из таких документов свой отдельный html-код, по меньшей мере, самонадеяно. Хотя, конечно, найдутся, как всегда, вполне вменяемые люди, которые закричат, что, мол, они такое делали, и не раз. Спорить с ними на эту тему бесполезно - лучше согласиться. Такие люди остро нуждаются в понимании, сочувствии, а может быть, даже длительном лечении. Как бы то ни было, для всего остального прогрессивного человечества будет гораздо легче использовать SSI.
   
   Советовать что-либо для самостоятельного изучения не буду, все пишут в общем-то одно и то же, за исключением разве что порядка слов в предложениях. Статья была призвана не столько описать достаточно еще молодую технологию, сколько ввести читателя в курс дела. И если кто-то заинтересовался, то сам найдет все, что ему нужно.
   
   В этой части мы рассмотрели основные теоретические сведения, касающиеся технологии серверных включений SSI, при этом почти не затронув аспекты практического применения полученных глобальных знаний. В следующей части мы постараемся на конкретных прмерах более пристально рассмотреть саму технологию и, главное, попытаемся указать шаблонные способы ее применения в самых распространенных случаях.
   
   


<<НАЗАД      ОЦЕНИТЬ СТАТЬЮ    ВЕРСИЯ ДЛЯ ПЕЧАТИ>>
Статья прочитана :  раз.




пейкюлю



 
 
 
 
 
pauk ©® 2000-2015. All rights reserved.
При перепечатке ссылка на сайт и указание обязательны.
Мнение администрации сайта не всегда совпадает с мнением автора.
Орфография и пунктуация - авторские.
Администрация не несет никакой ответственности за использование материалов.
.
Protected by Copyscape DMCA Takedown Notice Infringement Search Tool