はじめに
前回に続きResource Scriptについてです。今回は、
今回紹介しているコードはC#を使用しています。実際にコードを実行するには、
また、
using Microsoft.LiveFX.Client;
using Microsoft.LiveFX.ResourceModel;
using Microsoft.LiveFX.ResourceModel.Scripting;
リソースの作成
手始めにStatementを使用してリソースを作成してみましょう。リソースの作成には、
// News アイテムリソースの生成
var news = new NewsItemResource("LiveMesh.AppMessagePost");
news.Contexts.Add(new NewsItemContext("Target", "text/plain", "メッセージテスト", null, null));
// CreateResourceStatement の生成
var s1 = Statement.CreateResource<NewsItemResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/News"), news, null);
CreateResourceメソッドの戻り値がCreateResourceStatementオブジェクトで、
- CreateResourceStatementのNameプロパティ
- CreateResourceStatementのCollectionUrlプロパティ
- CreateResourceStatementのRequestプロパティ
CollectionUrlに指定したコレクション
CreateResourceメソッドは、
var s1 = Statement.CreateResource<NewsItemResource>(new Uri("https://user-ctp.windows.net/V0.1/Mesh/News"), news);
CreateResourceStatementだけでは実行できないため、
// Sequence Statement の生成
var sequence = Statement.Sequence(s1);
// コンパイル
var script = sequence.Compile();
// 実行
var creds = new NetworkCredential("[email protected]", "password", "https://user-ctp.windows.net/V0.1/Script");
script.RunAtServer(creds);
実行後、

上記のResource Scriptによるリソース作成は、
var creds = new NetworkCredential(User.UserId, User.Password);
var loe = new LiveOperatingEnvironment();
var news = new NewsItem("LiveMesh.AppMessagePost");
news.Resource.Contexts.Add(new NewsItemContext("Target", "text/plain", "メッセージテスト", null, null));
loe.Mesh.News.Add(ref news);
データフロー
リソースの作成はひとつのStatementで処理を完結することが可能でしたが、
例えば、
Live Meshフォルダを作成する例を示します。Mesh Objectの作成は先ほどのNewsアイテムの作成と同等です。
// Live Mesh フォルダとなる Mesh Object の作成
var folder = new MeshObjectResource("アルバム");
folder.Type = "LiveMeshFolder";
var s1 = Statement.CreateResource<MeshObjectResource>("s1", new Uri("https://user-ctp.windows.net/V0.1/Mesh/MeshObjects"), folder);
プロパティの連結
続いてData Feedを作成します。Data Feedを作成する先は、
CreateResourceStatementクラスは、
以上からData Feedリソースを作成するコードは次のようなイメージになります。ただし、
// 間違った Data Feed 作成のStatement 記述
var s2 = Statement.CreateResource<DataFeedResource>("s2", s1.Response.DataFeedsLink, df);
このコードが処理される時点では、
Data Feedを作成する例では、
var s2 = Statement.CreateResource<DataFeedResource>("s2", null, df, Statement.Bind("CollectionUrl", "s1", "Response.DataFeedsLink"));
Statement.
ふたつのStatementを順次処理するとLive Meshフォルダが作成されます。
var sequence = Statement.Sequence(s1, s2);
var script = sequence.Compile();
var creds = new NetworkCredential("[email protected]", "password", "https://user-ctp.windows.net/V0.1/Script");
script.RunAtServer(creds);
式の連結
以上のStatementBindingはStatementのプロパティ同士を結び付ける例でした。これ以外にもプロパティへ値を代入する使用方法もあります。
リソース読み取りの例をみてみましょう。リソースの読み取りは、
var s3 = Statement.ReadResource<MeshObjectResource>("s3", Statement.Bind("EntryUrl", "s1", "Response.SelfLink"));
Statement s1の結果を読み取るStatementです。ReadResourceStatementクラスはEntryUrlプロパティに読み取るリソースのURLを指定する必要があります。StatementBindingを使用して、
次に、
var s4 = Statement.UpdateResource<MeshObjectResource>("s4",
Statement.Bind("Request", "s3", "Response"),
Statement.Bind("Request.Title", System.Linq.Expressions.Expression.Constant("アルバムその2")));
このコードではふたつのStatementBindingオブジェクトを指定しています
ひとつ目のStatementBindingは、
これまでに作成したStatement s1からs4を順次実行すると、
var sequence = Statement.Sequence(s1, s2, s3, s4);
var script = sequence.Compile();
script.RunAtServer(creds);
実行後、

最後に基本操作となるリソース削除についてもふれておきます。Statement.
var s5 = Statement.DeleteResource("s5", Statement.Bind("EntryUrl", "s1", "Response.SelfLink"));
DeleteResourceStatementクラスのEntryUrlに削除するリソースのURLを指定します。上の例では、
シリアライズ
前回、
このシリアライズ化した内容は簡単に確認することができます。ResourceScriptオブジェクトのSaveAsJSonまたはSaveAsPlainOldXmlメソッドを使用して各形式の内容を取得します。先ほどのまでのコードの例を用いると次のようになります。
var sequence = Statement.Sequence(s1, s2);
var script = sequence.Compile();
script.SaveAsJSon("script.txt"); // JSON 形式
script.SaveAsPlainOldXml("script.xml"); // XML 形式
実行するとふたつのファイルが保存されます。作成されたファイルのうちのひとつJSON形式は以下のような内容です。コードは見やすいよう整形しています。
{
__type: ResourceScriptOfSequence:http://user.windows.net (string)
,Source: {
__type: Sequence:http://user.windows.net (string)
,Children: [
{
__type: CreateResourceOfMeshObject:http://user.windows.net (string)
,Bindings: []
,Name: s1 (string)
,Request: {
__type: MeshObject:http://user.windows.net (string)
,Title: アルバム (string)
,Triggers: {}
,Type: LiveMeshFolder (string)
}
,ThrowOnError: true (boolean)
,CollectionUrl: https://user-ctp.windows.net/V0.1/Mesh/MeshObjects (string)
}
,{
__type: CreateResourceOfDataFeed:http://user.windows.net (string)
,Bindings: [
{
__type: PropertyBinding:http://user.windows.net (string)
,Target: s2 (string)
,TargetProperty: CollectionUrl (string)
,Source: s1 (string)
,SourceProperty: Response.DataFeedsLink (string)
}
]
,Name: s2 (string)
,Request: {
__type: DataFeed:http://user.windows.net (string)
,Title: DataFeedResource (string)
,Triggers: {}
,Type: LiveMeshFiles (string)
}
,ThrowOnError: true (boolean)
}
]
,Parameters: []
}
}
今回のコードには出てきていないパラメータも記述されていることがわかります。
このテキストをLive Operating EnvironmentにHTTP POSTメソッドで渡すとRunAtServerメソッドと同様のことが可能です。実際にC#以外の言語を使用して試してみましょう。
PHPによるHTTP POSTメソッドによりファイル内容を送信するコードを示します。コードと同じディレクトリにC#で出力したJSON形式のテキストファイルscript.
<?php
$auth = 'Resource Browser から Request Headers 内の Authorization の値をコピー';
$opts = array(
'http' => array(
'method' => 'POST',
'content' => @file_get_contents('script.txt'),
'header' =>
"acceptt: application/json\r\n" .
"content-type: application/json\r\n" .
"Authorization: " . $auth . "\r\n"));
@file_get_contents('https://user-ctp.windows.net/V0.1/Script',
false, @stream_context_create($opts));
?>
実行にあたりひとつ問題があります。クラウド上のLive Operating Environmentにアクセスする場合は、
Live Framework SDKのToolsフォルダ以下

図中のリンクをクリックするとWindows Live IDアカウントの入力が求められ、

ここで実際にLive Operating Environmentへ送信しているリクエストヘッダーを見ることができます。ここにある
以上でPHPのコードを実行すると、
PHP等の言語でLive Framework SDKのライブラリを使用せずLiveサービスへのアクセスも可能ですが、
今回は以上です。いかがでしたでしょうか。次回はResource Scriptの特長のひとつでもあるトリガーによる処理についてです。