使ってみよう! Live Framework

第13回 Resource Script(2)

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

式の連結

以上のStatementBindingはStatementのプロパティ同士を結び付ける例でした。これ以外にもプロパティへ値を代入する使用方法もあります。

リソース読み取りの例をみてみましょう。リソースの読み取りは,Statement.ReadResource<TResource>メソッドを使用してReadResourceStatement<TResource>クラスを生成します。次の例はプロパティの連結と同じタイプのStatementBindingです。

var s3 = Statement.ReadResource<MeshObjectResource>("s3", Statement.Bind("EntryUrl", "s1", "Response.SelfLink"));

Statement s1の結果を読み取るStatementです。ReadResourceStatementクラスはEntryUrlプロパティに読み取るリソースのURLを指定する必要があります。StatementBindingを使用して,s1のResponse.SelfLinkプロパティの値を指定しています。

次に,読み取ったリソースのタイトルを変更してみましょう。Statement.UpdateResource<TResource>メソッドとUpdateResourceStatement<TResource>クラスを用います。

var s4 = Statement.UpdateResource<MeshObjectResource>("s4",
    Statement.Bind("Request", "s3", "Response"),
    Statement.Bind("Request.Title", System.Linq.Expressions.Expression.Constant("アルバムその2")));

このコードではふたつのStatementBindingオブジェクトを指定しています(CreateResourceメソッドなどリソース操作のStatementのメソッドに指定できるStatementBindingは可変の引数として定義されています⁠⁠。

ひとつ目のStatementBindingは,s4のRequestにs3.Responseを設定し,更新対象のリソースを指定しています。ふたつ目のStatementBindingが,更新対象のリソースのTitleプロパティに定数を指定しています。これがStatementBindingを使用したプロパティへの値の代入です。

これまでに作成したStatement s1からs4を順次実行すると,結果的に「アルバムその2」というLive Meshフォルダが作成されます。

var sequence = Statement.Sequence(s1, s2, s3, s4);
var script = sequence.Compile();
script.RunAtServer(creds);

実行後,Live Desktopで確認してみましょう図2⁠。

図2 作成されたLive Meshフォルダ

図2 作成されたLive Meshフォルダ

最後に基本操作となるリソース削除についてもふれておきます。Statement.DeleteResourceメソッドとDeleteResourceStatementクラスを使用します。どちらもこれまでと違いジェネリック型ではありません。

var s5 = Statement.DeleteResource("s5", Statement.Bind("EntryUrl", "s1", "Response.SelfLink"));

DeleteResourceStatementクラスのEntryUrlに削除するリソースのURLを指定します。上の例では,Statement s1で作成したリソースを削除してしまっているのでs1からs5を実行すると結果的に何も起きないScriptになります。

シリアライズ

前回Resource Scriptのサーバーサイドでの実行について,アプリケーションは(ライブラリによって)Resource ScriptをXMLやJSON形式にシリアライズ化して,Live Operating EnvironmentにHTTP POSTメソッドにより渡していると紹介しました。

このシリアライズ化した内容は簡単に確認することができます。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.txtがあるものとします。

<?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にアクセスする場合は,認証が必要です。HTTPのリクエストヘッダーにAuthorizationの値を設定しなくてはいけません。今回は簡易的に,この値はLive Framework SDK付属のツール,Live Framework Resource Browserを使い,実際のリクエストヘッダーから値をコピーすることにしましょう。

Live Framework SDKのToolsフォルダ以下(%programfiles%\Microsoft SDKs\Live Framework\v0.91\Tools\Live Framework Resource Browser)に,Resource Browserがあります。これを実行して,クラウドのLive Operating Environmentに接続します図3⁠。

図3 LOEへの接続

図3 LOEへの接続

図中のリンクをクリックするとWindows Live IDアカウントの入力が求められ,サインイン可能です。次にウィンドウ右上の「Show Headers」をクリックし,表示されたタブの「Request Headers」を確認します図4⁠。

図4 リクエストヘッダーの確認

図4 リクエストヘッダーの確認

ここで実際にLive Operating Environmentへ送信しているリクエストヘッダーを見ることができます。ここにある「Authorization:」以下の値をコピーして,PHPのコードの$auth変数の値に設定します。

以上でPHPのコードを実行すると,Live Meshフォルダが作成されます。実際に試してみましょう。

PHP等の言語でLive Framework SDKのライブラリを使用せずLiveサービスへのアクセスも可能ですが,単純なHTTPとのやりとりを記述する必要があり,たいへんな作業です。このようにResource Scriptを使用すれば,あらかじめC#を用いてリソース操作をシリアライズ化しておき,そのファイルを利用することで簡単にほかの言語からもLiveサービスへのアクセスが可能になります。


今回は以上です。いかがでしたでしょうか。次回はResource Scriptの特長のひとつでもあるトリガーによる処理についてです。

著者プロフィール

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

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

URL:http://katamari.jp