Resource Script
今回からはResource Scriptについてです。Live Frameworkはリソース指向のプログラミングモデルを提供しており、
Live Frameworkのリソースモデル

使用する3つの利点
Resource Scriptは、
- 処理の抽象化
まず操作の集合による利点です。Live Frameworkを利用しLiveサービス上の各リソースへアクセスする際、
Live Operating EnvironmentとHTTPによる通信を行います。このとき行う操作単位は、 リソースの作成・ 読み取り・ 更新など基本的なものに限られています。例えばMeshサービス上にファイルをコピーする場合、 ファイルが既に存在しているかの確認 (読み取り)、 存在している場合は削除、 そしてファイルの作成というように複数の操作が必要です。Resource Scriptを用いると意味のある処理をひとつのリソースとして表現が可能です。 - パフォーマンス改善
上記のように通常は多くのHTTPアクセスがアプリケーションとLive Operating Environmentとの間で必要になります。Resource Scriptの処理内容はサーバーサイドでの実行が可能で、
このときアプリケーションとLive Operating Environment間のHTTPアクセスは1回に集約されます。このように複数のHTTPアクセスをまとめ、 アプリケーションの動作改善にも使用できます。 - アプリケーションの拡張
Resource Scriptは、
リソースが作成・ 更新・ 削除される前または後をトリガーとして実行することが可能です。これは既にあるアプリケーションのロジックの変更や拡張として使用できることを意味します。トリガーによる実行もResource Scriptの大きな特徴のひとつです。
文法
Resource Scriptは、
文法は、
- 制御構造
- リソース操作
- データフロー
そして、

コンパイルできる点もこれまで登場したLive Frameworkのリソースと大きく異なりますね。まずは、
Statementは、
リソース操作
最初にリソース操作についてです。本記事ではリソース操作という言葉を使用しましたが、
Web Operation StatementおよびSynchronization Statementsは、
以下にC#のコードを示します。Mesh Objectを作成するStatementオブジェクト
var statement = Statement.CreateResource<MeshObjectResource>(
"createMeshObjectStatement",
new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"),
new MeshObjectResource("My Mesh Object"));
引数など詳しい内容について今回は言及していません。実際に試してみたい方はVisual C#のコンソールアプリケーションプロジェクトを作成しコードを記述してみてください。Live Framework SDKの.NET Kitライブラリに加え、
CreateResourceStatement以外にも次のクラスなどが用意されています。
- CreateMediaResourceStatement
- ReadResourceStatement
- ReadMediaResourceStatement
- ReadResourceCollectionStatement
- UpdateResourceStatement
- DeleteResourceStatement
Create、
データ同期に関するStatementは、
制御構造
制御構造のStatementを使用すると順次や条件分岐などを表現可能です。制御構造用のStatementは、
- SequenceStatement
- InterleaveStatement
- ConditionalStatement
- LoopStatement
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は、
データフロー
最後はデータフローです。ここでのデータフローとは、
例えば、
フォルダ内にファイルを作るコードを示します。フォルダ内のファイルと表現しましたが、
// 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
)
);
上記コードは、
コンパイルと実行
コンパイル
Statement DOMはコンパイルによってResource Scriptに変換することができます。文法の説明で使用したC#のコードをコンパイルするには次のようになります。StatementクラスはCompileメソッドを持っています。
// コンパイル この場合 script の型は ResourceScript<SequenceStatement>
var script = sequence.Compile();
コンパイルによってひとつのリソースとすることができました。Resource Scriptは、
コンパイルによってできたResource Scriptは実行可能です。次は実行してみましょう。
サーバーサイド実行
Resource Scriptの実行はサーバーサイドでの実行とクライアントサイドでの実行に分類することができます。
サーバーサイドでの実行を図3に示します。

アプリケーションはLive Operating Environmentに対してResource Scriptを渡します。その内容はサーバー側で解釈され、
より具体的には、
サーバーサイド実行の特徴は、
コードでは次のように記述します。実行には認証情報を渡す必要があります。
script.RunAtServer(new NetworkCredential("[email protected]", "password", "https://user-ctp.windows.net/V0.1/Script"));
クライアントサイド実行
クライアントサイドでの実行も可能です。その内容を図4に示します。

クライアントサイドで実行した場合、
script.Run (new NetworkCredential("[email protected]", "password", "https://user-ctp.windows.net/V0.1/Script"));
図4に示すように、
また、
今回は以上です。少し駆け足でしたが、