RDF/A

Материал для самостоятельного изучения:

Итак если вкратце, то RDF/A — принцип (языком это назвать сложно), по которому RDF-данные можно вставлять в другие XML документы. В основном под "другими XML документами" в этом контексте понимают XHTML и SVG.

По замыслам консорциума SVG должен в дальнейшем заменить Macromedia Flash. В принципе, — это возможно. Его основное преимущество перед Flash — абсолютно открытый стандарт языка, который основан на XML. Т.е. написанием плагинов и даже редакторов SVG может заниматься любой разработчик. Посмотрим что из этого выйдет. Пока в рунете совсем немного ресурсов, которые применяют технологию SVG. Для примера можно посмотреть Школы консорциума W3C НГУ, установив перед этим Adobe SVG Viewer.

Что такое RDF? Необходимо различать RDF-concept и RDF/XML Syntax. Первое — это сама концепция представления информации, второе — реализация концепции в виде XML-языка. Этот язык и называется RDF/XML.

Так вот для того, чтобы понять как встраивать RDF в XHTML, SVG и др. документы прежде всего необходимо понять концепцию RDF. А понять ее можно очень быстро. Потому что в ней вообще нет ничего сложного:
Любую информация можно представить в виде множества неупорядоченных троек

S1 P1 O1
S2 P2 O2
S3 P3 O3
 ...

где S — некоторый субъект, P — некоторый предикат, О — некоторый объект. Более привычная математическая запись будет выглядеть примерно так:

P1(S1,O1)
P2(S2,O2)
P3(S3,O3)
 ...

А что такого замечательного в таком представлении информации? Ответ: такая запись позволяет описать граф. Где предикаты — ребра графа, а объекты и субъекты — его вершины.

Но это все понятно, и было давным-давно. RDF предлагает пойти немного дальше: любой субъект, предикат и объект — совершенно равноправны и называются ресурсами. Т.е. в нашем графе ребро может стать вершиной, вершина — ребром и вообще границы между ними размываются. Вот простой пример:

Миша прибирает комнату. Приборка помогает отвлечься.

Запишем эти предложения с помощью некоторого абстрактного синтаксиса RDF:

приборка(Миша, комната)
помогает(приборка, отвлекаться)

Забегу немного вперед, и скажу, что язык RDF был разработан более 5 лет назад, но не привлек к себе ожидаемого внимания. Сейчас же ситуация кардинально изменилась, потому что после нескольких лет разработок наконец появилась хорошая версия языка запросов к RDF документам — SPARQL. Например, если послать примерно такой запрос
PREFIX  : <http://somesite.org/>
SELECT  $name
WHERE   {$name :приборка :комната}
к документу из предыдущего примера, то его результатом будет таблица:

$name
Миша

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

приборка, Миша, комната, помогает, отвлекаться — всё это в терминах RDF — либо ресурсы, либо простые типы, например: приборка("Миша", комната). приборка и комната — ресурсы, а "Миша" — строка.
Встает вопрос — где описывать сами термины, что представляет из себя приборка, что такое комната. Специально для этих целей и был разработан язык описания онтологий OWL.

Язык OWL позволяет построить объектно ориентированное представление знаний о предметной области. В нем возможно множественное наследование, задание свойств класса. Причем свойства сами по себе могут быть экземплярами классов (в SW экземпляры классов принято называть индивидами). При чем и классы и индивиды являются ресурсами.

RDF/A задумывался для того, чтобы вставлять метаинформацию прямо в код XHTML.

Допустим, в сети существует блог Ани Смит:

<html>
    <head><title>Jo's Blog</title></head>
    <body>
...
    <p>
        8 мая в 10 утра я толкала речь на конференции
		XTech касательно некоторых заморочек web.
    </p>
...
    <p class="contactinfo">
        Меня зовут Аня Смит. Я — супер web-дизайнер
        из "<a href="http://superdiz.org">СупёДиз</a>".
        Вы можете связаться со мной
        <a href="mailto:anya@superdiz.org">через e-mail</a>.
    </p>
...
    </body>
</html>

В блоге Ани Смит можно найти полным полно метаданных:
Указано событие, которое началось 8 мая в 10 утра. Его краткое описание: "толкала речь на конференции XTech касательно некоторых заморочек web". Так же имеется контактная информация: Аня работает в организации СупёДиз. Её должность — супер web-дизайнер. С ней можно связаться посредством e-mail: "anya@superdiz.org"

И вот в один прекрасный день Аня повысила свой скилл в SW и решила немного переделать свой блог.
Т.к. событие, указанное в блоге является календарным Аня решила юзать iCal. Прежде всего, для этого, она добавила в тег html атрибут xmlns:cal

<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#">

Теперь она может юзать все пространство имен iCal посредством префикса cal.
После этого Аня определила новое событие:

<p role="cal:Vevent">
   ...
</p>

Затем, она определила краткое содержание события:

8 мая в 10 утра я <meta property="cal:summary">толкала речь
на конференции XTech касательно некоторых заморочек web</meta>.

Время начала события — тоже метаданные. Но в тексте написано "8 мая в 10 утра", и просто запихнуть эту строку уже не получится, для даты и времени необходимо использовать определенный формат:

<meta property="cal:dtstart" content="20060508T1000-0500">8 мая в 10 утра</meta>

Всё, все метаданные, которые только могли выделить из события — выделили. Теперь будем разбираться с контактной информацией. Аня решила для этого использовать vCard RDF. Т.к. она собиралась юзать vCard только для определения контактной информации, то и префикс решила сделать contact:

<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#"
      xmlns:contact="http://www.w3.org/2001/vcard-rdf/3.0#">

А вот сейчас внимательно следите за тем, что сделает Анька:

    <p class="contactinfo" about="http://superdiz.org/staff/anya">
        Меня зовут Аня Смит. Я — супер web-дизайнер
        из "<a href="http://superdiz.org">СупёДиз</a>".
        Вы можете связаться со мной
        <a href="mailto:anya@superdiz.org">через e-mail</a>.
    </p>

У тега <p> появился атрибут about (его активно использует RDF/XML). Всё просто: этим атрибутом мы определили, что субъектом (внутри контейнера <p>) будет являться ресурс "http://superdiz.org/staff/anya". Да, если вы заметили, то, например, запись "cal:dtstart" означает "http://www.w3.org/2002/12/cal/ical#dtstart", а "cal:summary" — это "http://www.w3.org/2002/12/cal/ical#summary".
Абсолютно все ресурсы в SW представляются в виде URI (уникальных идентификаторов ресурсов). Всем знакомый и всеми любимый URL — частный случай URI.

Теперь вставим вместе с Аней метаинформацию о ней:

    <p class="contactinfo" about="http://superdiz.org/staff/anya">
        Меня зовут <meta property="contact:fn">Аня Смит</meta>.
	    Я — <meta property="contact:title">супер web-дизайнер</meta>
        из "<a rel="contact:org" href="http://superdiz.org">СупёДиз</a>".
        Вы можете связаться со мной
        <a rel="contact:email" href="mailto:anya@superdiz.org">через e-mail</a>.
    </p>

Обратите внимание: раньше мы использовали тег <meta>,
его атрибут property задавал предикат, а объектом при этом считалось:

Теперь появился атрибут rel, а вместо meta используется тег a. Дело в том, что значение цели якоря (в общем, для своих — значение атрибута href в тегах a и подобных ему) — может стать объектом. Для таких случаев было решено использовать атрибут rel.

При этом значение атрибута rel — это предикат, а значение атрибута href — объект. (Естественно, — если оба эти атрибута указаны в одном теге).

Следует заметить, что вообще то в предыдущих примерах вместа тега <meta> можно было с уверенностью применять и какой-нибудь другой, например <span>, <strong> или <h1>, это не принципиально, главное — наличие атрибута property.

Ладно, с Аней надо закончить, чтобы все было всем понятно построим на основе получившегося XHTML кода

<html xmlns:cal="http://www.w3.org/2002/12/cal/ical#"
      xmlns:contact="http://www.w3.org/2001/vcard-rdf/3.0#">

    <p role="cal:Vevent">
        <meta property="cal:dtstart" content="20060508T1000-0500">
        8 мая в 10 утра</meta>
        я <meta property="cal:summary">толкала речь
        на конференции XTech касательно некоторых заморочек web</meta>.
    </p>
	
    <p class="contactinfo" about="http://superdiz.org/staff/anya">
        Меня зовут <meta property="contact:fn">Аня Смит</meta>.
        Я — <meta property="contact:title">супер web-дизайнер</meta>
        из "<a rel="contact:org" href="http://superdiz.org">СупёДиз</a>".
        Вы можете связаться со мной
        <a rel="contact:email" href="mailto:anya@superdiz.org">через e-mail</a>.
    </p>
	
</html>

его RDF представление:

А вот тут нас ожидает небольшая досада. Дело в том, что пример с Аней Смит взят с сайта W3C. И оказывается, что в своем документе RDF/A Primer они использовали атрибут role всего один раз, только в этом примере. Причем в RDF/A Syntax про него вообще ничего не сказано, и наверное ничего сказано уже не будет. Забавно и то, что в другой версии RDF/A Primer этот атрибут тоже негде не светится. В общем — все прелести W3C working draft налицо :-), поэтому верхнюю часть примера транслировать в RDF я отказываюсь по идеологическим соображениям. А вот нижнюю (абзац с контактной информацией) — охотно:

<http://superdiz.org/staff/anya> contact:fn "Аня Смит"^^XMLLiteral.
<http://superdiz.org/staff/anya> contact:title "СупёДиз"^^XMLLiteral.
<http://superdiz.org/staff/anya> contact:org <http://superdiz.org>.
<http://superdiz.org/staff/anya> contact:email <mailto:anya@superdiz.org>.

 или в более компактной форме:
(обратите внимание на то, как используются символы ; и .)

<http://superdiz.org/staff/anya> contact:fn "Аня Смит"^^XMLLiteral;
                                 contact:title "СупёДиз"^^XMLLiteral;
                                 contact:org <http://superdiz.org>;
                                 contact:email <mailto:anya@superdiz.org>.

Такой тип записи нам знаком:
<http://superdiz.org/staff/anya> — субъект
contact:fn — предикат
"Аня Смит" — объект, значение типа XMLLiteral;

и так аналогично — все другие три строки.

Кстати, привыкайте именно к такой записи. Это — один из "официальных" типов записи RDF данных (N-TRIPLES).

Все, с Аней разобрались. Идем дальше.

Пример W3C:

<span about="/user/markb/photo/23456" property="dc:title">
    Sunset in Nice
</span>

Эквивалентно RDF-записи

</user/markb/photo/23456> dc:title "Sunset in Nice"^^XMLLiteral.

Т.е. показан пример того, как одном теге можно определить и субъект и предикат, а в содержимом тега — объект.

Можно писать и вот так:

<a about="/user/markb/photo/23456" rel="dc:creator" href="/user/markb">Mark Birbeck</a>

Эквивалентно RDF-записи

</user/markb/photo/23456> dc:creator </user/markb>.

Уже знаем, как использовать rel и property.
В RDF/A есть еще один подобный атрибут — rev. Но действует он наоборот, т.е. объект становится субъектом, а субъект объектом.
В общем, легче на примере объяснить:

<link about="mailto:misha@mail.ru"
      rev="foaf:knows" href="mailto:any@mail.ru" />

в виде RDF:

<mailto:any@mail.ru> foaf:knows <mailto:misha@mail.ru>.

Что означает — Аня знает Мишу. Несмотря на то, что href стоит на Аню.

Если связь двухсторонняя, то необходимо использовать оба атрибута: и rel (кстати, от анг. relation) и rev (от анг. reverse). Пример:

<link about="mailto:misha@mail.ru"
      rel="foaf:knows" rev="foaf:knows" href="mailto:any@mail.ru" />

в виде RDF:

<mailto:any@mail.ru> foaf:knows <mailto:misha@mail.ru>.
<mailto:misha@mail.ru> foaf:knows <mailto:any@mail.ru>.

Необходимо разобраться еще с одним атрибутом — id.
Этот атрибут может быть некоторым знаком из HTML. В RDF/A (а также в RDF/XML) он сохраняет свои свойства.

Что мы знаем о атрибуте id. Его значение должно быть уникально для документа, т.е. в одном документе не может быть указано два элемента с одинаковым id. А любой документ имеет уникальный адрес в сети — его URL.

Тогда получается, что конструкция

url_документа#какой-то_id

указывает на какой-то конкретный элемент в конкретном документе.

А что у нас должно иметь уникальное имя? Правильно — ресурс. Т.е с помощью атрибута id можно определить какой-то ресурс. Не просто описать, а именно определить его (создать, если хотите). Описывать можно любой ресурс в сети, например, мы спокойно в своем документе, который имеет URI http://www.somesite.org/somedir можем описывать ресурсы определенные на http://www.nike.com/mynike (например, <http://www.nike.com/mynike#boots>)

Собственно говоря, — сама эта возможность и является одним из основных принципов Semantic Web. Причем для описания чужих ресурсов никакого разрешения у их создателей брать не нужно. Не надо забывать, что предикаты — тоже ресурсы, мы можем использовать их совершенно свободно, разницы вообще никакой нет. Как уже говорилось раньше, то, что мы привыкли использовать как предикат может стать объектом или субъектом и наоборот.

Но создать ресурс в документе http://www.somesite.org/somedir мы можем только с URI подобным <http://www.somesite.org/somedir#someid>

Причем в каком-нибудь другом документе созданный нами ресурс могут свободно использовать.

Небольшой ликбез по принципам SW закончился.

Вернемся к нашему атрибуту id. Посмотрим как его используют в RDF/XML:

<rdf:Description rdf:ID="someid">
	<dc:creator rdf:resource="http://www.example.org/staffid/85740"/>
</rdf:Description>

а если наш Индивид — экземпляр какого-то класса, то можно записать так:

<rdf:Description rdf:ID="someid">
	<rdf:type rdf:resource="http://www.example.com/terms#someClass"/>
	<dc:creator rdf:resource="http://www.example.org/staffid/85740"/>
</rdf:Description>

или объявить в начале пространство имен ex

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:ex="http://www.example.com/terms#">
	
и писать так:

<rdf:Description rdf:ID="someid">
	<rdf:type rdf:resource="ex:someClass"/>
	<dc:creator rdf:resource="http://www.example.org/staffid/85740"/>
</rdf:Description>

или так:

<ex:someClass rdf:ID="someid">
	<dc:creator rdf:resource="http://www.example.org/staffid/85740"/>
<ex:someClass>

Теперь посмотрим какие аналогии нам предлагает RDF/A. Тоже самое в XHTML с применением RDF/A можно было записать например так:

<span id="someid" about="#someid">
	<a rel="dc:creator" href="http://www.example.org/staffid/85740"/>
</span>

а если наш Индивид — экземпляр какого-то класса, то можно записать так:

<span id="someid" about="#someid">
    <link rel="rdf:type" href="http://www.example.com/terms#someClass" />
    <a rel="dc:creator" href="http://www.example.org/staffid/85740"/>
</span>

или объявить в начале пространство имен ex

<html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:ex="http://www.example.com/terms#">
	
и писать так:

<span id="someid" about="#someid">
    <link rel="rdf:type" href="[ex:someClass]" />
    <a rel="dc:creator" href="http://www.example.org/staffid/85740"/>
</span>

Обратите внимание на то, что в последнем примере использовались квадратные скобки ([]) при определении ресурса с помощью префикса пространства имен.
В RDF/A при использовании пространств имен необходимо окружать квадратными скобками содержимое атрибутов about и href.
Зачем так сделано:
  1. Ссылка должна быть кликабильна. А современный браузер должен понять, что цель якоря использует пространство имен (и его надо транслировать в URI) когда значение атрибута href окружено квадратными скобками;
  2. А для того чтобы в коде ресурс как объект и тот же ресурс как субъект выглядели одинаково, было решено использовать квадратные скобки и в атрибуте about (в аналогичных случаях).
Но с rel, rev, property квадратные скобки использовать не надо.

Вообще-то использование [] — из области XML. А я в нем пока не очень разбираюсь, поэтому если кто может конкретно сказать об использовании этих символов — прошу писать мне, опубликую.

Чтобы не осталось недоговоренностей, рассмотрим еще несколько случаев:

1. Часто можно встретить подобную запись:

<html>
    <head>
        <title>Jo Lambda's Home Page</title>
    </head>
    <body>
        <p>
            Hello. This is <span property="foaf:name">Jo Lambda</span>'s
            home page.
            <h2>Work</h2>
            If you want to contact me at work, you can
            either <a rel="foaf:mbox" href="mailto:jo.lambda@example.org">email
                me</a>, or call <span property="foaf:phone">+1 777 888 9999</span>.
        </p>
    </body>
</html>

что соответствует RDF:

<> foaf:name "Jo Lambda"^^rdf:XMLLiteral ;
   foaf:mbox <mailto:jo.lambda@example.org> ;
   foaf:phone "+1 777 888 9999"^^rdf:XMLLiteral .

Субъектом здесь является <>, т.е. сам документ. В сети ресурс <> — это URL самого документа. При желании можно использовать xml:base:

<html xml:base="http://mysite.org/">
...

что будет соответствовать

<http://mysite.org/> foaf:name "Jo Lambda"^^rdf:XMLLiteral ;
                     foaf:mbox <mailto:jo.lambda@example.org> ;
                     foaf:phone "+1 777 888 9999"^^rdf:XMLLiteral .

В документе RDF/A Syntax приводится пример, когда атрибут xml:base используется в теге <p>. Но я считаю, что логичнее использовать его только в теге html (причем указывать в виде базы действительно какой-то свой ресурс), во всех остальных тегах использовать атрибут about и пространства имен, определенные в теге html.

Интересный вопрос возникает у меня в связи с возможностями xml:base.
Получается, что возможно написать так:
<p xml:base="http://nike.org/news">
<span id="boots" about="#boots">
    <a rel="dc:creator" href="http://www.mishundic.ru"/>
</span>
</p>
Что означает, что я определил ресурс <http://nike.org/news#boots>. Не описал, а именно создал (!).
Очевидно, что когда страницы генерирует CGI-скрипт появляется необходимость использовать что-то подобное xml:base, однако надо еще основательно продумать вопросы безопасности.
SW, freedom, alternative, — это конечно все хорошо, но если бы я владел http://nike.org/, мне бы не хотелось, чтобы любой мог создать ресурс <http://nike.org/news#boots>. Описывайте, используйте — сколько хотите, это даже популярность nike прибавит. Но создавать ресурсы (через id) мне все-таки хотелось бы самому.

Об этом W3C и нам следует подумать. А может они там в Силиконовой Долине уже подумали и все решили, да только я пока не знаю. Кто что-нибудь узнает или придумает — кидайте мне на мыло.

2. Момент второй. Типы (datatype).

Рассмотрим два примера XHTML кода, который использует RDF/A:

<span property="dc:creator" content="Анна Смит">Анька</span>

и

<span property="dc:creator">Анна Смит</span>

на первый взгляд, эти два тега транслируются в одинаковое RDF представление, но разница есть:

В первом случае — строка типа plain literal:
<> dc:creator "Анна Смит" .

В втором случае — строка типа XMLLiteral:
<> dc:creator "Анна Смит"^^rdf:XMLLiteral .

В чем разница между ними:

Используя content

<head about="">
    Автор: <span property="dc:creator">Альберт Энштейн</span><br />
    <meta property="dc:title"
	  content="E = mc<sup>2</sup>: The Most Urgent Problem of Our Time" />
</head>

и получаем plain literal

<> dc:title
  "E = mc&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;:
   The Most Urgent Problem of Our Time" .

Используя само содержимое тега:

<head about="">
    Author: <span property="dc:creator">Albert Einstein</span>
    <h2 property="dc:title">
      E = mc<sup>2</sup>: The Most Urgent Problem of Our Time
    </h2>
</head>

получаем то, что ожидали

<> dc:title
  "E = mc<sup>2</sup>: The Most Urgent Problem of Our Time"^^rdf:XMLLiteral .

RDF для plain literal позволяет устанавливать язык, например у нас есть текст и его заглавие на английском и русском языке:

<http://example.org/node> <ex:description> "Some title"@en;
                          <ex:description> "Некоторое описание"@ru .

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


<meta about="http://example.org/node" property="ex:description"
      xml:lang="en" content="Some title" />
<meta about="http://example.org/node" property="ex:description"
      xml:lang="ru" content="Некоторое описание" />

или с указанием datatype="plaintext"

<span about="http://example.org/node" property="ex:description"
      xml:lang="en" datatype="plaintext">Some title</span>
<span about="http://example.org/node" property="ex:description"
      xml:lang="ru" datatype="plaintext">Некоторое описание</span>


На сайте W3C можно почитать про атрибут xml-lang и его возможных значениях.

В общем, xml:lang применяется только к plain literal.

Но встает вопрос, какие вообще типы мы можем применять, какие значения может принимать атрибут datatype?

datatype может иметь диапазон литералов RDF или простых типов, определенных в XML Schema datatypes.

Следующие типы данных рекомендуются для использования в OWL. Я думаю, что для RDF/A следует использовать аналогичные типы:

xsd:string
xsd:normalizedString
xsd:boolean
xsd:decimal
xsd:float
xsd:double
xsd:integer
xsd:nonNegativeInteger
xsd:positiveInteger
xsd:nonPositiveInteger
xsd:negativeInteger
xsd:long
xsd:int
xsd:short
xsd:byte
xsd:unsignedLong
xsd:unsignedInt
xsd:unsignedShort
xsd:unsignedByte
xsd:hexBinary
xsd:base64Binary
xsd:dateTime
xsd:time
xsd:date
xsd:gYearMonth
xsd:gYear
xsd:gMonthDay
xsd:gDay
xsd:gMonth
xsd:anyURI
xsd:token
xsd:language
xsd:NMTOKEN
xsd:Name
xsd:NCName

Т.е., например, можно использовать datatype так:

Ане <span about="mailto:any@mail.ru" property="ex:yearsold"
          datatype="xsd:decimal">17</span> лет.

3. И, наконец, момент третий: Использование OWL.

Про OWL читайте в переведенном руководстве по OWL.

Сперва наперво, следует ответить на вопросы:

— OWL позволяет создавать и описывать ресурсы (причем не только классы, но и индивиды), тогда получается, что RDF можно не использовать?

— Язык OWL все-таки создавался для описания классов, в нем можно (и иногда даже нужно создавать индивиды), но по замыслам W3C для создания и описания индивидов необходимо использовать RDF.

— Ну хорошо, тогда встает вопрос, как подключит онтологию OWL в XHTML документе и использовать её

— Вот так:

Просто подключаем онтологию как пространство имен, например так:

<html xmlns:some ="http://www.mysite.org/ontologies/someontology#">

Причем при запросе к http://www.mysite.org/ontologies/someontology
должен возвращаться OWL документ

Допустим, в нашей онтологии, на языке OWL, мы определили класс Person и свойства favoriteFood и favoriteCar.

Теперь в XHTML (при помощи RDF/A) мы можем создать экземпляр класса Person (индивид) и задать его свойство favoriteFood:

<div id="Anya" about="#Anya">
    <link rel="rdf:type" href="[some:Person]" />
    Аня любит <span property="ex:favoriteFood">персики</span>.
</div>

Довольно коряво, но вот Ваня на своем сайте может использовать ресурсы Аниного сайта и описать некоторые из них, например так:

<div about="http://anya.ru#Anya">
    Аня любит <span property="ex:favoriteCar">BMW</span>.
</div>

Смотрится уже понятней и логичней.

Заключение

— Предоставляет ли RDF/A возможность встраивать в XHTML RDF данные так же, как это можно сделать применяя RDF/XML?

— Нет. На сегодняшний момент RDF/A является менее выразительным средством по сравнения с RDF/XML.

Вопрос использования RDF/A остается открытым. Более того, — RDF/A возможно будет развиваться и дальше, по крайней мере, документ W3C RDF/A Syntax находится на стадии Editor's Draft, т.е. RDF/A (в отличие от RDF/XML) — не является пока рекомендацией W3C.

Материал для самостоятельного прочтения:

«RDF/XML Syntax Specification (Revised)». — спецификация синтаксиса RDF/XML.

«OWL, язык веб-онтологий. Руководство». — перевод руководства по OWL (выполнил Дмитрий Щербина).

Hosted by uCoz