この文書は, Zi Bin, Cheah氏による,Yusef: the Unite Server Frameworkの邦訳です.

This article is licensed under a Creative Commons Attribution, Non Commercial - Share Alike 2.5 license

Yusef: Unite アプリフレームワーク

By Zi Bin, Cheah 14 Oct, 2009

Published in: , , , ,

Content contributions by Mathieu Henri, Hans S. Tømmerholt and Gautam Chandna.

はじめに

Opera Unite アプリ開発を Yusef フレームワークではじめてみませんか? 簡単なサンプルもついていますから,読み終えた後,Yusef の長所を利用できるようになっているでしょう.

もし, Opera Unite developer primer を読んでいなければ,Yusef を学ぶ前に読んでおいたほうがいいでしょう.

この文書の構成は以下のようになっています.

基本概念

Unite アプリフレームワーク Yusef は Opera Unite に必要ないくつかの機能をまとめあげるためのものとして開発が始まり,最初は Opera の Web アプリチームが Unite アプリの開発補助ライブラリとして作りました.次第にUnite アプリ開発のさまざまな領域に対応するように発展しました.

Yusef はたとえば UI のテンプレートや,フォームがポストした内容の検証,アクセスコントロールなどで開発者を補助します.Opera Unite でのモジュール化から発展してた Yusef であなたの作業も楽になるでしょう.

Opera Unite アプリのページと Yusef との関係

図 1: Yusef と Opera Unite アプリのページとの関係

Yusef はサーバーの一種と言えるでしょう.そしてあなたの書く Script はサーバサイド JavaScript とみなすことができます.つまり Opera Unite アプリとは Yusef とあなたのスクリプトが処理して出力した HTML ページであるとも言えます.

Yusef コア

Yusef コアは Opera Unite アプリの屋台骨であり,ファイルのマウントポイントでもあり,アプリのパスとなるセクションのリスナーであり,ワンタイムパスワードを用いてフォームを検証し,プラグインを追加したりフックを用いた既存機能の拡張をしたりする機構を提供します.

Yusef コアは主に3つの部分からなります.SectionAction は Unite アプリの各ページでユーザが起こしたイベントを処理します.Plugin はアクセス制御などの拡張機能を提供します.

Section, Action, Plugin

図 2: Yusef コアの主要 3 部分.

Section(セクション)

Section はリクエストされたURIの最上位のパスです.つまり, http://device.user.opeaunite.com/application/sectionsection の部分です.開発者はリクエストのパスに対応するセクションリスナーを追加することが出来ますし,アプリの最上位 ( _index ) でのリスナーも追加できます.たとえば, showFileList をサブパスとして含んだ URL にユーザがアクセスしたとき,セクションリスナーは showFileList イベントを処理することが出来ます.

Yusef の関数 addSectionListener は HTTP リクエストを受け取り処理する関数を登録し,リクエストされたページに対する Yusef の挙動を決めていきます. イベントはパス(セクション;Section)に結び付いていて,たとえば http://device.user.operaunite.com/application/sectionevent1/ にアクセスされたときのリスナーを定義するには addSectionListener('sectionevent1', function(), args); とします.

Yusef コアには static と呼ばれるセクションがあり,アプリの public_html フォルダ内の,アイコンや画像ファイル,スタイルシート,スクリプトファイルといった静的なリソースへの要求を処理をします.

Action(アクション)

Unite のアクションはフォームからポストされた内容を処理します.開発者はアクションリスナーを登録して,フォームから送られたデータを処理させることが出来ます. registerUniteActionListener 関数は POST リクエストを受け取り処理する関数を登録します.それぞれの POST リクエストは個別の関数に対応します.

たとえば,Unite アプリのルート ( http://device.user.operaunite.com/application/ ) に対してフォームからデータを送信するとします.


  <input type="hidden" name="unite-action" value="<action name>">
  <input type="hidden" name="unite-nonce" value="<session.nonce>">

送信するフォームに上記の2つのパラメータを含めることで,Yusef はリクエストを検証して登録した actionListener に処理を移します.ワンタイムパスワードは認証に使われます.

Plugin(プラグイン)

Yusef は ACL や UI のなどをプラグインとして提供しています.Yusef の機能を拡張したいときには,新しくプラグインを書いたり,既存の Yusef プラグインのパブリックな関数を拡張したりできます.

プラグインについては別の記事でもう少し詳しく説明する予定です.

サンプル

サンプルコードの説明に行く前に,整理しましょう.Yusef はサーバサイドのフレームワークであり,コードはバックエンドで処理されます.特別な index.html ページが Opera Unite アプリのエントリポイントとなり,Yusef や他のサーバサイドの機能を呼び出していきます.この index.html ページは表示されませんが,スクリプトを呼び出すために存在します.Unite アプリの一連の処理をデーモンと考えることが出来ます.

このサンプルでは,Yusef をフレームワークとして使った Opera Unite アプリを作ります. HelloYusef サンプルからサンプルアプリをダウンロードしてください.

ファイル構成としては以下のようになっています

  • index.html
  • config.xml
  • libraries/yusef
  • libraries/Markuper
  • libraries/PSO
  • serverScripts/helloYusef.js
  • templates/helloYusef.html
  • public_html/style.css

config.xml

config.xml は Opera Unite アプリケーションの構成を記述します.アプリの名前やアプリの説明などをユーザに説明します.Opera Unite の config.xml は Opera Widget の config.xml と同じです.


  <?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">
          <param name="type" value="service" />
          <param name="servicepath" value="hello_yusef" />
      </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>

サンプルアプリを "Hello Yusef" と呼ぶことにします."Hellow Yusef" には Webserver と FileI/O API が必要なのでそれを指定しておきます.

File I/O API が必要だということに違和感を覚えるかもしれませんが,アプリのサンドボックスのデータのアクセスにはAPI が必要です.

index.html

Opera Unte アプリのエントリポイントは index.html ファイルです.この index.html ファイルはライブラリや Yusef を呼び出すために使われ,画面には表示されません.


  <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>

core.js と common.js は Yusef のファイルで,template.js は UI テンプレートの Markuper のファイルです.

ServerScripts/HelloYusef.js

Yusef フレームワークを用いた Opera Unite アプリには特別なフォルダ serverScripts があり,このフォルダ内のスクリプトは自動的に実行されます.サーバサイドのスクリプトは全てこのフォルダーに入れることが出来ます.


  Yusef.addSectionListener
  (
      '_index',
      function( connection )
      {
        ...
              }
  );

HelloYusef.js の中を見ていきます.Yusef のメンバ関数は Yusef のシングルトンオブジェクト Yusef から呼び出されます.たとえば addSectionListener 関数は Yusef.addSectionListener として呼び出します.

addSectionListener で,URI のサブパスを処理します.たとえば, device.user.operaunite.com/application/addfile という URI にアクセスがあると, addfile が呼び出されることになります. サンプルのHelloYusef.js では Opera Unite アプリのトップレベルの URI にアクセスしたときに呼び出される '_index' を定義します.


  function( connection ) {
      var tmpl = new Markuper( 'templates/helloYusef.html' );
      var data = {
          title       : connection.request.uri,
          servicePath : opera.io.webserver.currentServicePath,
          content     : "Hello Yusef",
          stylesheet  : 'style.css'
      };
      tmpl.parse( data );
      return tmpl.html();
  }

さて,呼び出される関数の内部を見ていきましょう.テンプレートエンジンの Markuper が,テンプレートファイルを指定して呼び出され,object 型の変数 data が初期化されてます. servicePath に指定している opera.io.webserver については Opera Unite API を参照してください.

最後に,データを渡してテンプレートを処理し,HTML を返します.

templates/helloYusef.html

最後のファイルの説明に移りましょう.


  <!doctype html>
  <html>
      <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
          <title>{{data.title}}</title>
          <link
              rel="stylesheet"
              type="text/css"
              href="{{data.servicePath}}static/{{data.stylesheet}}">
        </head>
        <body>
            <div>
                {{data.content}}
            </div>
      </body>
  </html>

Markuper テンプレートライブラリは templates/helloYusef.html を処理して,ユーザに返します.

Markuper では特別な記法を用いてテンプレートに値を埋め込みます.たとえば {{data.servicePath}} は先ほど helloYuserf.js で定義した servicePath を参照します.

say hello to Yusef

Figure 3: Hello Yusef 出力例.

さて,これで,終わりです.Yusef フレームワークを使った Opera Unite アプリが出来ました,今回のサンプルは HelloYusef サンプルからダウンロードできます.

まとめ

この記事では,Opera Unite の サーバフレームワーク Yusef を紹介しました.Yusef は URL のサブパスを処理する Section,フォームから送られたデータを処理する Action,それと Plugin の3つから構成されています.

プラグインを追加すればより複雑なことが出来るようになります.プラグインには UI テンプレートエンジンの Markuper などがあります

Yusef プラグインについてはまた別の記事を書く予定です.

参考資料

より詳しく,Oprea Unite やそのライブラリに関して知るには以下の記事を読むとよいでしょう.