Мой вольный перевод на русский язык официальной статьи Оперы о механизме Yusef. …
Примечание переводчика: Это вольный перевод, поскольку я не профессионал в этом. К тому же, местами, я старался коротко пояснять текст. Я целенаправленно стремился избежать засилия иностранных слов, по возможности перефразируя и заменяя всё (вообще всё) на русские аналоги – на самой грани (и слегка "за гранью") разумных пределов, т.к. иностранных слов в русском языке уже полно и так. Всё-же, поскольку английский язык уже чрезмерно заполонил отрасль разработок ПО (фактически став официальным языком отрасли), для некоторых слов и терминов мне пришлось делать исключения или упомянать их в скобках. Особые исключения сделаны для слов "скрипт" ("сценарий на языке высокого уровня") и "плагин" ("специализированная программная вставка"). В паре мест мне пришлось попросту исправлять английский исходный текст с тем, чтобы он соответствовал действительности. (например, что на самом деле делает метод addSectionListener) Поскольку разработчики Opera перенесли документацию по Opera.Unite на GitHub, я постарался заменить URL-адреса из статьи на новые, более актуальные. Если я в чём-то ошибся при переводе и трактовке – очень прошу сообщить мне об этом в комментариях к статье! Повторюсь, что я сознательно подбираю русский перевод для всего подряд, стремясь сохранить родной язык и помочь его носителям быстрее ознакомиться с описываемым материалом. Всё-же, для нормальной работы в отрасли разработки компьютерного программного обеспечения изучение английского языка необходимо и неизбежно. :doh:
Из-за чрезмерной "вольности" перевода (а некоторым он может показаться даже хулиганским или назойливым) я не стал его загружать в специальный раздел на официальном сайте. Если-кто-то захочет воспользоваться моим переводом, чтобы создать официальный русский строгий перевод – я не против, потому что распространение прогрессивной информации важнее амбиций. Всё-же было-бы здорово увидеть мой псевдоним в числе соавторов официального перевода! 😉
Оригинал статьи на английском языке: Yusef: the Unite Server Framework
Yusef: Серверный Механизм Unite
Содействие в разработке Мэтью Генри, Ганс С. Томмерхольт и Гаутам Чандна.
Обновлено 3 февраля 2010 года. (Перевод: Xobrt, 30 декабря 2011 года)
Введение
Эта статья поможет вам начать работу с Yusef – рабочей структурой сервера Opera Unite. (Далее для благозвучия и упрощения – Юзеф. Прим. пер.) После прочтения данной статьи вы сможете начать орудовать силой Юзефа. Представлен простой пример, чтобы было легче приступить к делу.
Если вы ещё не читали учебник для начинающего разработчика Opera Unite, мы советуем вам сделать это прежде, чем начинать изучать Юзеф.
Структура статьи такова:
- Основные понятия
- Ядро Юзефа
– Раздел (Section)
– Действие (Action)
– Плагин (Plugin)
- Пример
- Итог
- Справочные материалы
Основные понятия
Механизм (рабочая структура, фреймворк) Сервера Unite (The Unite Server Framework) – или Yusef (Юзеф) – начал разрабатываться в качестве способа управления различными конструктивными потребностями приложений Opera.Unite. Первоначально он был создан командой Оперы, занимавшейся веб-приложениями. Программисты сделали его для облегчения разработки Opera.Unite-приложений. Вскоре Юзеф развился в большой механизм, покрывающий многие аспекты создания приложений.
Юзеф помогает разработчику заботиться о таких вещах, как предоставление шаблона пользовательского интерфейса (UI), проверка форм, присланных методом POST и контроль доступа (среди многих других). Он вырос из необходимости составлять из модулей работу в Opera.Unite и он здесь для того, чтобы облегчать ваш труд.
Рисунок 1: Юзеф и страница приложения Opera.Unite.
(i) Думайте о Юзефе, как о служебном демоне, который работает на заднем плане, а о своём скрипте, как о серверном JavaScript. Затем отбросьте страницу HTML и это будет приложение Opera.Unite.
Ядро Юзефа
Ядро Юзеф предоставляет основу приложения Opera.Unite и взаимодействует с точками монтирования, совместным использованием статических файлов, обработчиками разделов (корня или подпутей приложения), действиями форм (проверкой с помощью криптографического средства – безопасных одноразовых случайных чисел, используемых для установления подлинности) и возможностями для некоторых уловок, позволяющих расширять эти основные функции и добавлять плагины (встраиваемые вспомогательные программы).
В Ядре Юзефа есть три главных части. Первые две – Раздел и Действия – это способы, которыми Юзеф получает события, вызываемые пользователями на странице приложения Opera.Unite. Третья часть – Плагины, которые вводят дополнительные функции, такие как надзор за доступом.Рисунок 2: три основы Ядра Юзефа.
Раздел
Разделы являются высшим подпутём в котором производится запрос.
(т.е. h ttp://устройство.пользователь.opeaunite.com/приложение/раздел)
Разработчики могут добавлять метод обработчика раздела (слушателя секции, section listener) чтобы отзываться на запросы, сделанные в данном главнейшем подпути, или на высшем уровне службы – _index. Например, обработчик раздела может слушать URL подпути и запускать событие под названием showFileList , когда пользователи просматривает страницу с подпутём showFileList –
h ttp://устройство.пользователь.opeaunite.com/приложение/showFileList
Потом событие может выполнить такое действие, как показ списка файлов.
addSectionListener (добавитьРазделуОбработчика) – это метод Юзефа, который назначает функции для прослушиваемых HTTP-запросов. Это позволяет Юзефу слушать и выполнять действия при загрузке страницы. Событие связано с путём (частью URL-адреса, разделом). Например адрес
h ttp://устройство.пользователь.opeaunite.com/приложение/sectionevent1/
(раздел назван "событие_раздела1") может быть привязан к обработчику так
addSectionListener('sectionevent1', function(),args);
перевод на русский (недействительный код, только для ознакомления!)
добавитьРазделуОбработчика('событие_раздела1', функция(),аргументы);
Ядро Юзеф само создает раздел под названием static ("неподвижный"), обслуживающий всё содержимое, расположенное в папке приложения, под названием public_html. Этот раздел используется для обслуживания неизменных ресурсов, таких как значки, таблицы стилей, скрипты и графика приложения.
Действие
Действия Unite – это способ, которым Юзеф взаимодействует с POST-формой. Программисты могут зарегистрировать обработчика действия (слушателя действия, "action listener") для обработки данных, присланных формой. Функция registerUniteActionListener ("зарегистрировать обработчик действий Unite") берёт запросы POST и передаёт каждый из них в определённую функцию. Каждое Действие ("action") с уникальным названием соответствует уникальной функции.
Например, форма может предоставить данные корню приложения – h ttp://устройство.пользователь.домен/приложение/
<input type="hidden" name="unite-action" value="<action name>">
<input type="hidden" name="unite-nonce" value="<session.nonce>">
перевод на русский (недействительный код, только для ознакомления!)
<ввод тип="скрытый" название="unite-действие" значение="<название действия>">
<ввод тип="скрытый" название="unite-случай" значение="<сессия.случай>">
Форма POST должна включать в себя эти два аргумента, необходимые Юсефу для проверки и отправки всего запроса вашему назначенному обработчику действия (actionListener). Криптографический случай используется для установления подлинности пользователя.
Плагин
Юзеф предоставляет несколько плагинов, среди которых – плагины ACL (Access Control Library – Библиотека контроля доступа) и UI (User Interface – пользовательский интерфейс). Разработчики, желающие расширить функциональность Юзефа могут либо создать новый плагин, либо расширить открытый метод какого-либо из плагинов Юзефа.
Мы внимательнее расмотрим плагины в следующих статьях.
Пример
Прежде чем мы углубимся в код, давайте ещё раз рассмотрим несколько идей. Юзеф – это "серверо-сторонний" механизм, грубо говоря, это обслуживающая сторона для скриптов. Написанный код будет обрабатываться в скрытом, фоновом режиме, "за кулисами" на "бэкэнде". Дверь ("точка входа") в приложение Opera Unite – это специальная страница index.html, используемая для вызова Юзефа и других серверных функций и библиотек. Этот index.html не используется для отображения страницы, но задействуется только для вызова скриптов. Вы можете думать о процессе в целом, как о демоне.
В этом примере, мы хотим запустить приложение Opera Unite с Юзефом в качестве основы. Скачайте пример Ядра Юзефа: http://devfiles.myopera.com/articles/790/helloYusef.ua (прим. пер. Чтобы сохранить, а не установить, нажмите на ссылке правой кнопкой мыши и в контекстном меню выберите пункт "сохранить по ссылке как…". Лучше сразу поменять расширение на ".zip". Не устанавливайте! Оно просто "здоровается".) Основная структура файлов такова:
- index.html
- config.xml
- libraries/yusef
- libraries/Markuper
- libraries/PSO
- serverScripts/helloYusef.js
- templates/helloYusef.html
- public_html/style.css
перевод на русский (недействительный код, только для ознакомления!)
- индекс.html
- файл настроек.xml
- библиотеки/yusef
- библиотеки/Markuper
- библиотеки/PSO
- серверныеСкрипты/приветЮзеф.js
- шаблоны/приветЮзеф.html
- всеобщие_html/файлТаблицыСтилей.css
config.xml
config.xml – это описатель в Opera Unite. То место, где мы сообщаем пользователям название приложения и коротко о том, что оно делает. Структура файла config.xml Opera Unite схожа с детальным описанием (спецификацией) описательного файла Оперных Штучек (т.наз. "виджетов"). Отличия описательных файлов Unite и Штучек описаны в "Учебнике для начинающего разработчика Opera Unite", ссылка на который приведена в начале этой статьи.
<?xml version="1.0" encoding="utf-8"?>
<widget network="public" version="1.0" id="Unite/helloYusef/" >
<widgetname>Hello Yusef</widgetname>
<description>An example application that uses Yusef, access control and Markuper.</description>
<feature name="http://xmlns.opera.com/webserver">
</feature>
<feature name="http://xmlns.opera.com/fileio">
</feature>
<icon width='64' height='64' >public_html/favicon.64x64.png</icon>
<icon width='48' height='48' >public_html/favicon.48x48.png</icon>
<icon width='32' height='32' >public_html/favicon.32x32.png</icon>
<icon width='16' height='16' >public_html/favicon.16x16.png</icon>
<author>
<name>Gautam Chandna, Opera Software ASA</name>
</author>
</widget>
перевод на русский (недействительный код, только для ознакомления!)
<?xml версия="1.0" кодировка="utf-8"?>
<штучка сеть="всеобщая" версия="1.0" идентификатор="Unite/приветЮзеф/" >
<название_штучки>Привет Юзеф</название_штучки>
<описание>Пример приложения, которое использует Юзеф, контроль доступа и Разметчик.</описание>
<свойство название="http://xmlns.opera.com/веб-сервер">
</свойство>
<свойство название="http://xmlns.opera.com/файловый_ввод_вывод">
</свойство>
<значок ширина='64' высота='64' >всеобщий_html/значокзакладок.64x64.png</значок>
<значок ширина='48' высота='48' >всеобщий_html/значокзакладок.48x48.png</значок>
<значок ширина='32' высота='32' >всеобщий_html/значокзакладок.32x32.png</значок>
<значок ширина='16' высота='16' >всеобщий_html/значокзакладок.16x16.png</значок>
<автор>
<имя>Гаутам Чандна, ОАО Программы Оперы</имя>
</автор>
</штучка>
Мы назовём наше приложение "Hello Yusef" ("Привет Юзеф"). Обязательно указать веб-сервер и файловый интерфейс ввода-вывода (File I/O), необходимые в нашем приложении Opera Unite.
(i) Включение файлового ввода-вывода в описателе приложения может показаться бессмысленным для приложений, которым не нужно работать с файлами. Тем не менее, файловый ввод-вывод требуется для доступа данных приложения к изолированной среде (т.наз. "песочнице").
index.html
index.html – это "точка входа" в приложение Opera.Unite. Помните, что этот index.html используется только для вызова библиотек и Юзефа, а не для отображения содержимого.
Существует два способа вызова библиотек, первый – сделать это выборочно, как показано ниже.
<script src="libraries/PSO/pso.js"></script>
<script src="libraries/Markuper/template.js"></script>
<script src="libraries/yusef/common.js"></script>
<script src="libraries/yusef/core.js"></script>
перевод на русский (недействительный код, только для ознакомления!)
<скрипт источник="библиотеки/PSO/pso.js"></скрипт>
<скрипт источник="библиотеки/Разметчик/пример.js"></скрипт>
<скрипт источник="библиотеки/Юзеф/обычные_функции.js"></скрипт>
<скрипт источник="библиотеки/Юзеф/ядро.js"></скрипт>
Файлы core.js и common.js – оба принадлежат Юзефу. На данный момент мы можем их спокойно игнорировать. Мы также указали Разметчик (Markuper) в качестве нашего пользовательского шаблона. (прим. пер. библиотека PSO добавлена для обработки вывода отладочных данных.)
Второй и предпочтительный способ – использовать загрузчик библиотек "libraryLoader", которым мы в можем загрузить все библиотеки одним махом и выбрать плагин Юзеф с помощью функции "Libraries.setTail" ("Библиотеки.подцепить").
<script src="libraries/libraryLoader/librariesLoader.js"></script>
<script>
Libraries.setTail( 'yusef.translation', 'yusef.ui', 'yusef.acl' );
Libraries.load();
</script>
перевод на русский (недействительный код, только для ознакомления!)
<скрипт источник="библиотеки/библиотекЗагрузчик/библиотекЗагрузчик.js"></скрипт>
<скрипт>
Библиотеки.подцепить( 'Юзеф.перевод', 'Юзеф.пользовательский_интерфейс', 'Юзеф.библиотека_контроля_доступа' );
Библиотеки.загрузка();
</скрипт>
ServerScripts/HelloYusef.js
Приложения Opera.Unite, в качестве основы использующие Юзефа, имеют волшебную папку под названием serverScripts. Из этой папки скрипты вызываются автоматически и в неё могут быть помещены все скрипты, связанные с серверной частью приложения.
Yusef.addSectionListener
(
'_index',
function( connection )
{
...
}
);
перевод на русский (недействительный код, только для ознакомления!)
Юзеф.добавитьРазделуОбработчика
(
'_index',
функция( соединение )
{
...
}
);
Внутри скрипта HelloYusef.js, вызываются функции Юзефа. Функции-члены Юзефа вызываются через синглтон ("одиночку") "Yusef" – класс/объект, который создается единожды, поэтому слово "Yusef" всегда присутствует в имени объекта. Например функция "добавитьРазделуОбработчика" ("AddSectionListener") вызывается при помощи команды "Yusef.addSectionListener".
Функция "добавитьРазделуОбработчика" ("addSectionListener") слушает подпути в URI. Например, при доступе к
device.user.operaunite.com/application/addfile
(устройство.пользователь.домен/приложение/добавить_файл)
выскакивает обработчик для addfile. Там-же у нас есть обработчик, слушающий _index, который вызывается при доступе к верхнему уровню URI приложения Opera Unite.
function( connection )
{
var tmpl = new Markuper( 'templates/helloYusef.html' );
var data = {
title : connection.request.path,
servicePath : opera.io.webserver.currentServicePath,
content : "Hello Yusef",
stylesheet : 'style.css'
}
tmpl.parse( data );
return tmpl.html();
}
перевод на русский (недействительный код, только для ознакомления!)
функция( соединение )
{
переменная tmpl = новый Разметчик( 'шаблоны/приветЮзеф.html' );
переменная данные = {
заголовок : соединение.запрос.путь,
путьСервиса : opera.вводВывод.вебсервер.текущийСервисныйПуть,
содержимое : "Привет Юзеф",
таблицаСтилей : 'стиль.css'
}
tmpl.разбор( данные );
вернуть tmpl.html();
}
Давайте посмотрим на вызываемую функцию. Библиотека шаблонов Разметчика (Markuper) вызывается с адресом шаблона в качестве аргумента. Объект обозначений данных переменных создаётся со значениями. Среди них – ServicePath (путь сервиса) назначенный с помощью объекта opera.io.webserver (автоматически подставляющего нужное значение). Для получения дополнительной информации об объекте opera.io.webserver, вы можете взглянуть на Opera Unite API.
Наконец, мы явно "парсим" (устоявшийся термин, означает "разбираем на составные согласно известной структуре") шаблон для того, чтобы связать данные (вставить содержимое в шаблон. Прим.пер.) перед возвратом шаблона.
(i) После этого, вы, возможно, захотите прочесть статью "Скорая разработка приложений с помощью библиотеки Opera Unite Yusef" чтобы узнать больше о функции getData(), позволяющей получить различные данные приложения.
templates/helloYusef.html
Это последний кусочек мозаики.
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link
rel="stylesheet"
type="text/css"
href="{{data.servicePath}}static/{{data.stylesheet}}">
</head>
<body>
<div>
{{data.content}}
</div>
</body>
</html>
перевод на русский (недействительный код, только для ознакомления!)
<!типДокумента html>
<html>
<голова>
<meta http-equiv="Содержимое-Тип" содержимое="текст/html; кодировка=utf-8"/>
<связка
отношение="таблицаСтиля"
тип="текст/css"
относительнаяСсылка="{{данные.сервисныйПуть}}статичные/{{данные.таблицаСтилей}}">
</голова>
<тело>
<раздел>
{{данные.содержимое}}
</раздел>
</тело>
</html>
Библиотека "Разметчик шаблона" (Markuper template) выводит страницу templates/helloYusef.html, являющуюся страницей представленной пользователям.
Для получения значения JavaScript, связанного с шаблоном, используется специальный синтаксис. Например
{{Data.servicePath}}
ссылается на переменную ServicePath ранее определённую в HelloYusef.js.Рисунок 3: Пример работы приложения Привет Юзеф.
Готово! Создано приложение Opera Unite с использованием механизма Юзеф! Вы можете скачать исходный код нашего примера helloYusef.
Итог
В этой статье мы представили Юзеф – серверный механизм Opera Unite. Существуют три части Юзефа: раздел (который слушает подпуть URL-адреса), действие (которое занимается POST-формами) и плагины.
Вы можете постепенно увеличивать сложность, добавляя новые плагины. Одним из таких интересных плагинов является плагин пользовательского интерфейса Юзефа (Yusef UI), связывающий воедино Opera Unite-UI шаблонизатор (движок работы с шаблонами) под названием Markuper ("Разметчик", ссылка на статью о нём).
Мы рассмотрим Юзеф плагины подробнее в следующей статье.
Справочные материалы
Возможно, вы захотите взглянуть на следующие статьи об Opera Unite или библиотеках.
Цзы Бин Чи (Zi Bin Cheah)
Веб-миссионер в команде отношений с разработчиками в ОАО Программы Оперы.