マイクロアップの概念・用語、流儀・作法・掟
基本的に、マイクロアップを分散アプリケーションと考える。Web上に分散されたデータとコードからアプリケーションが構成されている。何をどう分散させるかが問題だ。実は普通のWebアプリケーションと変わらないし、変わるべきではない。
- データリソース、データオブジェクト、リソースストレージ、データソース; まー、だいたい同じこと
- リソース抽出器:URIに対応するデータリソースをリソースストレージ(データソース)から取り出す機能
- データリソース内容の表現形式はJSON
- 構造ビュー(structure view)=クリーンHTML
- クリーンHTML:装飾、デザインを含まない。純粋なセマンティック・マークアップされたHTML。
- 構造ビュー生成器:JSONデータからクリーンHTMLを生成する、ほぼテンプレートエンジンのこと
- サービスエンドポイント:今(マイクロアップ)のケースでは、リソース抽出器、構造ビュー生成器にアクセスするURLのこと。
- 最終ビュー(final view)=スタイルドビュー(styled view):ページ閲覧者が目にするビュー
- JSONベースRESTスタイルAPI:データ形式としてJSONを利用する
- HTMLベースRESTスタイルAPI:データ形式としてクリーンHTMLを利用する
- Microformats方式マークアップ:データリソースのJSON形式表現からクリーンHTMLを生成するときの流儀と作法。可逆性がキモ。
- 生成リクエスト:マイクロアップのロードと初期化のときに使うリクエスト。ビュー生成用に、JSONまたはHTMLを要求する。
- 対話リクエスト:マイクロアップが動作中に使うリクエスト。ほぼ非同期メソッドコール。
- サブミットリクエスト:ページまたはマイクロアップが、終了して次のページに遷移するときに使うリクエスト
- レスポンダ:マイクロアップからの対話リクエストに応えるサーバーサイドプログラム・モジュール。API実装プロバイダ。
- マイクロアップの表示エリア:div, iframe, 別ウィンドウなど。
- マイクロアップの寿命: 通常は、ページと同じか、ベージ寿命の一部分。長寿命マイクロアップはページをまたいで生きる。
- ポーリング:天気予報、株価、チャットなどに使う。
- ポーリングライブラリ:これはフィーチャとして必要だろう。
- 通信ライブラリ:WCCのTranceiver.jsに相当。maTranceiver.jsとかを作るか。maTranceiver-ajax-0.1.js などが具体例。
- フィーチャ確認コード:ビュー生成(ローダー)のJavaScriptコード内でフィーチャの存在は確認した方がいいかもしれない。
- 分散配備:マイクロアップの素材を適切な場所に配備すること。
- リロケーション:分散配備の配備レイアウトを変えること。
- リロケーション対策:リロケーションの影響を最小化する方策
- 通信方式:現状でサポートできるのは、ページ遷移、Ajax、ODJSの3種
- マイクロセッション:マイクロアップとサーバーサイドプログラム(レスポンダ)の間のセッション概念。まだ未定。
流儀・作法・掟:
- データリソース、コードリソースにはできるだけ細かくURLを割り当てる。
- 拡張子は、.json, .html, .cgi(コードリソース)を使う。他に意味的な拡張子を使ってもよい。
- データ表現は必ずJSONを使い、スキーマを書く。
- データであるJSONに対して、表示の骨格を与えるクリーンHTMLを設計する。
- クリーンHTMLはMicroformats方式でマークアップして、可逆変換(JSONへ戻し)ができるようにする。
- JSON -> HTML はテンプレートで定義する
- HTML -> JSON はCSSデータ抽出言語(別に記述)で定義する。
- CSSデザインに必要な要素、ID、クラスを追加してもよい。CSSセレクタ仕様を明確化。
- データオブジェクトに対する抽象メソッドを定義する。
- 抽象メソッドはメイヤーのクエリー・コマンド方式にする。
- 生成(コンストラクタ)と対話リクエスト(メソッド呼び出し)のプロトコルを設計する
- プロトコルと状態遷移の関係を明らかにする。
- 状態には、フロントパートの状態とバックパートの状態があるが、全状態(トータル状態)に注目する。
- 全状態のフロント・バック分解は恣意的かもしれない。
- そもそもフロント・バック境界が恣意的。
- 分散配備レイアウト、通信方式は具体個別的だから、できるだけ切り離し、影響を受けないようにする。
- マイクロアップのローディング方式はさらに具体個別的・物理的だから注意。
集中すべきことは:
- データの単位的実体(unit entity)であるオブジェクトをJSONスキーマで定義する
- データオブジェクトのコレクション編成方式を考える。
- コレクション編成は、リスト、バッグ、セット、マトリックス、ツリー、グラフなどと、それらの組み合わせ。
- コレクションもJSONスキーマで定義する。(できるはず!)
- データオブジェクト(通常はJSONオブジェクト)に対するメソッドを考える。
- コレクションに対するメソッドを考える(まずはCRUD)。
- 以上の設計要素をまとめて内部的抽象インターフェースを確定する。
- データオブジェクトとコレクションに対してMirocformtsマークアップ(テンプレート)を定義する。
- 「JSON⇔HTML」可逆性を保証するために、CSSデータ抽出仕様を定義する。
- CSSデータ抽出をもとにCSSセレクター仕様も書く。これがCSSデザイナとの合意事項になる。
- 内部抽象インターフェースをURLにマップする。
- URL群は外部インターフェース(公開API)となる。
- 内部抽象インターフェースと外部インターフェースの差はできるだけ小さくする。
- URLの拡張子は、.json, .html, .cgiとするが、.cgiをできるだけ使わないように心掛ける。
- ODJSを使う場合は拡張子を、.json.js, .html.js とする。単なるコードライブラリは、副拡張子を使わない。
URLと拡張子の掟:
- JSON(で表現した)データを .json とする。
- クリーンHTMLフラグメント(で表現した)データを .html とする。
- 同じベース名の .json と .html は等価でなくてはならない。
- コード実行を提供するプロセッサ・リソースは .cgi とする。
- プロセッサ実行結果がキャッシュ可能なら、.json, .html として提供する。
- コレクショリソースに対するPUT, POST, GETはディレクトリURLを使う。
- 動詞は _verbパラメータ。
- JSONP, HTMLPのコールバック名は _cbパラメータ。
- クエリ文字列の長さは _qsl パラメータ。壊れていると、BadRequestになるだろう。
- チェックサム(ダイジェスト)を入れたい場合は、_csパラメータ。
- APIキーを入れたい場合は、_apikパラメータ。これはPOSTでも使う。
- JSONPを提供するURLは、foo.json.js?_cb=mycb
- HTMLPを提供するURLは、foo.html.js?_cb=mycb
- foo.html.jsの_cbパラメータが省略された場合は、HTML body内での展開をするようにする。
- JSONデータ、またはHTMLデータを受け取ってビューの初期化をするJavaScriptメソッドの命名は、initViewとする。
- foo.json.js, foo.html.js, foo.json.js?_cb=hoge.initView, foo.html.js?_cb=hoge.initView の結果は等価とする。
- ただし、foo.html.js がinitViewを呼び出すわけではない。foo.json.js はデフォルトでグローバル関数 initViewを呼び出す。
- 同一ページ内で複数のマイクロアップを共存させるために、名前空間の規則を守らなくてはならない。
キモと問題点:
- 一番大事なのは、データ構造(基本データオブジェクトとコレクション階層)に対するスキーマを定義して、内部的抽象インターフェースを策定すること。スキーマ言語はあるが、インターフェース定義言語(IDL)がないのが問題。当面はJavaで代用か?
- 内部抽象インターフェース(スキーマ定義を含む)があれば、URL設計の指針が得られる。
- JSONスキーマがあれば、クリーンHTML(=構造ビュー)設計の指針が得られる。CSSデータ抽出定義で可逆性を保証できる。
- フロント・バック間通信のプロトコルとページ遷移に対する良い記述言語(図解法)がない。
- セッション、マイクロセッション、長寿命マイクロアップの概念が曖昧。
- ユーザーアカウントとマイクロアップの関係が曖昧
CSSデータ抽出:
- cssdx.element(selector) -- 要素そのもの(1個)
- cssdx.content(selector) -- 要素コンテントのデータ
- cssdc.attrVal(selector, attrName) -- 属性値のデータ
- cssdx.childElements(selector) -- 要素内容の子要素だけをリストにしたもの
- cssdx.as(expr, typeName) -- exprの値をtypeName型とみなしたもの
単純JSONパスと組み合わせて、対応を完全に記述する。