使ってみよう! Live Framework

第12回 Resource Script(1)

この記事を読むのに必要な時間:およそ 5 分

制御構造

制御構造のStatementを使用すると順次や条件分岐などを表現可能です。制御構造用のStatementは,クラスライブラリではCompoundStatementクラスを継承したクラスになります。現在のLive Frameworkでは,以下のクラスが用意されています。

  • SequenceStatement
  • InterleaveStatement
  • ConditionalStatement
  • LoopStatement

SequenceStatementは,順次を表すStatementです。次の例ではMesh Objectを順番にふたつ作成することを記述したStatementになります。Statement.Sequenceメソッドは,SequenceStatementを返します。

var sequence = Statement.Sequence
(
    Statement.CreateResource<MeshObjectResource>(
        "createMeshObjectStatement1",
        new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"),
        new MeshObjectResource("My Mesh Object1")),
    Statement.CreateResource<MeshObjectResource>(
        "createMeshObjectStatement2",
        new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"),
        new MeshObjectResource("My Mesh Object2"))
);

InterleaveStatementは,複数のStatementすべてが処理完了するまで待機するStatementです。ConditionalStatementは条件分岐,LoopStatementは繰り返しを表現できます。

データフロー

最後はデータフローです。ここでのデータフローとは,データの相互関係の記述についてです。StatementBindingというクラスを用いてStatementとStatementの関係を記述可能です。関係付けることによってStatementの実行結果を次のStatementで使用などの処理が可能になります。

例えば,フォルダを作成してその中にファイルを作成したい場合,どちらもCreateResourceStatementによりリソース作成のStatementを記述できますが,ファイルは作成したフォルダの中に配置しないといけません。このような関連情報をStatementに含める場合にStatementBindingを使用します。StatementBindingはStatementではなく,Statementへ指定できるパラメータのひとつになります。

フォルダ内にファイルを作るコードを示します。フォルダ内のファイルと表現しましたが,MeshサービスのLiveフォルダはMesh Objectリソースの一種です。Mesh ObjectはData Feedリソースのコレクションを持ち,ひとつのData Feedリソースの中にファイルとなるData Entryリソースを持っていますので,その点にも注意してコードを見てください。

// Live Mesh フォルダとなる Mesh Object の作成
var folder = new MeshObjectResource("アルバム");
folder.Type = "LiveMeshFolder";

// Mesh Object に追加する Data Feed の作成
var df = new DataFeedResource();
df.Type = "LiveMeshFiles";

// Live フォルダ作成とそのフォルダ内に Data Feed を作成する Statement
var s1 = Statement.CreateResource<MeshObjectResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"), folder);
var s2 = Statement.CreateResource<DataFeedResource>("s2", null, df, Statement.Bind("CollectionUrl", "s1", "Response.DataFeedsLink"));

// 上記 Statement で作成された Data Feed の中に ファイルを作成する Statement
// (ファイルは指定 URL から画像を取得して作成する)
var s3 = Statement.CreateMediaResource("s3", null, new Uri("http://example.jp/foo.jpg"), null, Statement.Bind("CollectionUrl", "s2", "Response.MediaResourcesLink"));
var s4 = Statement.CreateMediaResource("s4", null, new Uri("http://example.jp/bar.jpg"), null, Statement.Bind("CollectionUrl", "s2", "Response.MediaResourcesLink"));

// フォルダ作成,Data Feed 作成,ファイル作成を順次実行する Statement
// (ファイル作成は順不同 両ファイルが作成完了したら処理終了)
var sequence = Statement.Sequence
(
    s1,
    s2,
    Statement.Interleave
    (
     s3,
     s4
    )
);

上記コードは,結果的にLiveフォルダ内にふたつの画像を作成します。Data FeedのCreateStatementとCreateMediaResourceメソッドの引数にStatement.Bindメソッドの結果を指定しています。Statement.Bindの戻り値はStatementBindオブジェクトです。詳細な内容はさておき,文字列によりStatementを指定しているのがわかるかと思います。最後にこれらのStatementを組み合わせたSequenceStatementを作成しています。

コンパイルと実行

コンパイル

Statement DOMはコンパイルによってResource Scriptに変換することができます。文法の説明で使用したC#のコードをコンパイルするには次のようになります。StatementクラスはCompileメソッドを持っています。

// コンパイル この場合 script の型は ResourceScript<SequenceStatement>
var script = sequence.Compile();

コンパイルによってひとつのリソースとすることができました。Resource Scriptは,リソースモデル上ではMesh ObjectやData Feedと同様にリソースの一種です。ただし,クラスライブラリではResourceクラスを継承しておらず,同じように扱うことはできません。

コンパイルによってできたResource Scriptは実行可能です。次は実行してみましょう。

サーバーサイド実行

Resource Scriptの実行はサーバーサイドでの実行とクライアントサイドでの実行に分類することができます。

サーバーサイドでの実行を図3に示します。

図3 サーバーサイドでの実行

図3 サーバーサイドでの実行

アプリケーションはLive Operating Environmentに対してResource Scriptを渡します。その内容はサーバー側で解釈され,すべての処理を終えた後,結果が返ってきます。

より具体的には,Resource ScriptはXMLやJSON形式にシリアライズ化されています。これをHTTP POSTメソッドによりLOEへ渡します。レスポンスも同様にシリアラズされたものを受信しています。

サーバーサイド実行の特徴は,複数のStatementからなるScriptが1回のHTTP POSTメソッドアクセスで済むことです。

コードでは次のように記述します。実行には認証情報を渡す必要があります。

script.RunAtServer(new NetworkCredential("user@example.jp", "password", "https://user-ctp.windows.net/V0.1/Script"));

クライアントサイド実行

クライアントサイドでの実行も可能です。その内容を図4に示します。

図4 クライアントサイドでの実行

図4 クライアントサイドでの実行

クライアントサイドで実行した場合,RunAtServerメソッドの代わりにRunメソッドを使用します。

script.Run (new NetworkCredential("user@example.jp", "password", "https://user-ctp.windows.net/V0.1/Script"));

図4に示すように,クライアントサイドで実行するとResource Scriptの内容はアプリケーション側で解釈され最初の処理単位に分割し,Live Operating Environmentへ渡されます。この場合,サーバーサイド実行のようにLive Operating Environmentとの対話回数を減らすというアプリケーションの改善はできません。ただし,ある一連の処理をResource Scriptという単位に抽象化したコードの記述可能という利点はありますね。

また,少しサーバーサイド実行でふれたようにResource ScriptはXMLやJSON形式にシリアライズ可能です。これらのファイルを読み取りクライアントサイドで実行ということも可能です。シリアライズ化については次回紹介する予定です。


今回は以上です。少し駆け足でしたが,Resource Scriptの概要はつかめていただけたでしょうか。次回はより詳しい内容やより多くのサンプルコードを紹介する予定です。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp