Pull to refresh

Opera Unite для веб разработчиков

Reading time 4 min
Views 899
Как создать простой счетчик в качестве сервиса Opera Unite?
Это поможет понять как вообще писать веб приложения на Opera Unite (так же называемые «сервисы» или «плагины»).

image

15 строк JavaScript + 7 на XML.

Очевидно, сначала скачайте Opera Unite, установите (если уже Опера поставлена — по желанию произойдет апдейт).

Создайте любую папку, где нужно создать 2 файла:

1. Создайте config.xml:

<widget>
  <widgetname>Test</widgetname>
  <feature name="http://xmlns.opera.com/webserver">
    <param name="type" value="service"/>
    <param name="servicepath" value="test"/>
  </feature>
</widget>


2. Создайте index.html файл:

<script>
var counter = 0;
window.onload = function () {
    webserver = opera.io.webserver
    if (webserver)    {
        webserver.addEventListener('_index', start_page, false);
    }
}
function start_page( r ) {  // пробелы не обязательны, просто хабр это на (r) заменяет
    counter++;
    var o = r.connection.response;
    o.write('This page has been seen <b>'+counter+' times</b>!!');
    o.close();
}
</script>
<html><title>Мое приложение</title></html>


Это явно не самый полный пример. Можно его расширять, вынеся script в отдельный файл.

* Активируйте Opera Unite если он не активен (Опера спросит об этом на следущем шаге, так что можно пропустить)

4. Перетаскиваем config.xml в Opera. Она спросит — устанавливать ли? Подтверждаем.

Все готово. Видим картинку в начале поста.
(На англ. — как сделать простой блог в 60 строк JavaScript)

5. Если мы чего поменяем в index.html — будет показываться старая версия — решение для отладки: Правый клик на иконке Unite -> «Manage Services» (или F4), правый клик на «Test» -> «Stop service», затем то же, только «Start service». Исходники перезагрузятся. Счетчик сбросится (проблему persistence, я пока ищу как решать, скорее всего что-то с fileio библиотекой + JSON будет или REST базами данных).

6. Чтобы поделиться с кем-то своим творчеством копируем URL (F8 — Ctrl+C в Opera) и меняем это так:

unite:// -> http://

так что,

unite://my_compute.my_opera_login.operaunite.com/test/

становится

http://my_compute.my_opera_login.operaunite.com/test/

7. Исопользуем Markuper для HTML шаблонов

Стоит ли использовать Unite для разработки веба? У меня много разных мыслей на этот счет, но, перевести их нет времени. Если с английским порядок — читайте http://unitehowto.com/Why.

Если очень кратко:
  • Для PHP/MySQL программеров это будет не круто (это не оскорбление, а как факт, как например 3D моделерам — SketchUp — не круто, функций и гибкости маловато)
  • Нагрузка не будет являться проблемой для большинства, дальше — PHP/MySQL или см. ниже.
  • Вполне подойдет для прототипирования веб приложения или создания локальных приложений (например биллинг для моих клиентов).
  • Для не-специалистов по PHP/MySQL и другим серверным языкам — самое оно для создания сайтов — веб приложений.
  • Создавать приложения на Unite — оооочень просто. Есть много плюсов и мало минусов, но минус большой — нужно держать браузер открытым.
  • Cross-platform (win/lin/mac)
  • «Server»-side (быстрый) JavaScript!
  • В конце концов кто-нибудь сделает основанный на V8 production server под *nix/*BSD чтобы прямо туда публиковать отлаженные на локальной Опере приложения (примерно как Google App Engine). (Вполне может быть даже модуль для nginx)


Буду по мере нахождения решения этих проблем публиковать ответы на unitehowto.com.

Как сделать чтобы счетчик не сбрасывался



Проблему persistence решил (Opera, давайте маленьких примеров больше!)

1. Изменяем config.xml:

<widget>
<widgetname>Test</widgetname>
<feature name="http://xmlns.opera.com/fileio">
</feature>

<feature name="http://xmlns.opera.com/webserver">
<param name="type" value="service"/>
<param name="servicepath" value="test"/>
</code>
</widget>


Это мы подключаем разрешение Опере использовать файловую систему (там она хитрая в sandbox'ах вся). Теперь меняем скрипт:

var counter = 0; 

заменяем на

var dir = opera.io.filesystem.mountSystemDirectory('storage');
try {
	stream = dir.open(dir.resolve('/storage/newfile'), opera.io.filemode.READ);
	if (stream) {
		var counter = parseInt(stream.readLine());
		stream.close();
	};
} catch(err) { // message: FILE_NOT_FOUND_ERR
	var counter = 0;
};


Опера заявляет метод .exists(), но я его так и не нашел (почти все варианты перепробовал у чего его вызывать), а dir.open(...) сразу же дает исключение, если файла нет.

По поводу того как обращаться к файлам в другой песочнице (не в /storage/) — читайте доки fileio (english).

Этими строками мы подгружаем переменную из файла (/storage/newfile) — на самом деле этот файл будет хранится у пользователя где-то в /Documents and settings/..../Local settings/..../4393408934/ (и т.п.), т.е. — это — не абсолютный путь, а путь внутри песочницы.

По идее нам надо бы сохранять JSON представление объекта, тогда можно хранить сложные вложыенные структуры, а не просто Int.

В конце start_page добавляем сохранение:

	var stream = dir.open('/storage/newfile', opera.io.filemode.WRITE);
	stream.writeLine(counter);
	stream.close();


Это не лучший вариант — сохранять файл после каждого обращения, но window.onunload по-моему в Opera забыли сделать (window.onload сделали).

Полный исходник с сохранением: t9.zip

Отладка скриптов, подводные камни


Помните, что это alpha релиз Оперы, так что все сказанное — без обвинений:

Перезагрузка исходников: «Stop service» -> «Start service» -> (проверяем Error Console) -> F5. (Иногда еще и реинсталляция нужна.)

Можно пытаться найти намек на то, что произошло в Tools -> Advanced -> Error Console, но там тоже ошибки с бессмысленными названиями часто. [Update]Откройте URL opera:config#UserPrefs|Exceptions Have Stacktrace, поставьте галочку, не забудьте внизу нажать кнопку Save. Это делает ошибки в Error Console читаемыми.

Ошибки синтаксиса находятся проверкой Error Console сразу после каждого «Stop service» -> «Start service».

Если изменили config.xml — приходится изменять название директории где он лежит и заново инсталлировать скрипт (перетаскиванием), иначе опера старую версию из памяти берет.

Ни в коем случае не использовать alert() и window.onunload в скриптах (убил оперу, баг репорт отправил).

Ошибка «Resource not found» может обозначать как ошибку синтаксиса, так и что угодно.

В общем, пока-то что отладка — ужасы.

Но, в общем и целом — Опера — гиганты! Сделать веб, который по настоящему p2p теперь — это сила! А те проблемы, что здесь и по ссылке "/Why" описаны — думаю исправят.


Йои Хаджи,
вид с Хабра
Tags:
Hubs:
+60
Comments 32
Comments Comments 32

Articles