使ってみよう! Live Framework

第4回.NET Kit(1)

.NET Kit

今回からは実際にコードを書いてLive Frameworkの世界に入っていきます。Live Frameworkは特定のプログラミング言語やOSに依存してせんが、今回から数回に渡っては、.NET Framework用のライブラリを使用して開発を行います。ライブラリを使用すると、Liveサービスへのアクセスが抽象化され、HTTPとXML(またはJSON)を使用するよりも、簡単にLiveサービスを利用することができます。

開発ではLive Framework SDK内の.NET Kitを使用します。ダウンロードして使用してください。Live Framework CTPの利用についての各種登録作業は前回紹介していますので、併せて参照してください。ただし前回の記事からSDK等のアップデートがありました。SDKは新しくDownload Centerからダウンロードおよびインストールしてください。Live Framework Clientも新しくダウンロードする必要があります(今回の内容に必須ではありません⁠⁠。

プロジェクトの作成

本連載ではVisual Studio 2008を使用します。言語はVB.NETを使用したものを紹介します。無償のVisual Basic 2008 Express Editionでも作成可能です。

まずはWindows用のプロジェクトを作成します。今回作成するプロジェクトの種類はWPF、Windowsフォーム、コンソールアプリケーションのどれでも構いません。

プロジェクトを作成したらLive Frameworkのライブラリの参照を追加します。ソリューションエクスプローラのプロジェクト名を右クリックし、参照の追加を選択してください。参照するアセンブリは以下のファイルです図1⁠。ファイルはLive Framework SDKのインストールフォルダ(%ProgramFiles%\Microsoft SDKs\Live Framework\v0.91\API Toolkits\.Net Library)にあります。

図1 参照の追加
図1 参照の追加

Meshへ接続

さっそくMeshサービスへアクセスしてみましょう。アクセスはLiveサービスへのアクセスを仲介しデータの同期・共有処理を担うコンポーネント、Live Operating Environment(LOE)へ行います。

LiveOperatingEnvironmentクラスをインスタンス化してConnectメソッドを呼びます。コードは次のようになります。

' Imports Microsoft.LiveFX.Client
' Imports System.Net
Dim loe = New LiveOperatingEnvironment
loe.Connect(New NetworkCredential("userid", "password"), New LiveItemAccessOptions(True))

クラウド上のLOEへの接続には認証が必要です。useridとpasswordにはWindows Live IDアカウント(メールアドレス)とパスワードを設定します。IDとパスワードからNetworkCredentialオブジェクトを作成しConnectメソッドの引数に渡しています。2番目の引数、LiveItemAccessOptionsオブジェクトはリソースへアクセスする際に必要になったとき自動でリソースをロードするかなどのオプション設定です。ここではコードの通りに記述してください。

上記の場合、クライアント上のLOE(http://localhost:2048/)が利用できればクライアントへまず接続します。接続できなければ、クラウド上のLOE(http://user-ctp.windows.net/)にアクセスします。

クラウド上のLOEへ接続する場合は時間を多少要します。そのため非同期で処理するメソッドも用意されています(ConnectAsyncメソッド⁠⁠。また、CookieまたはWindows Liveの認証トークンを使用しても接続が可能です。以下にあまり意味はないかもしれませんがNetworkCredentialオブジェクトから認証トークンを作成しLOEへ接続する例を示します。この場合LOEのURLを指定できます。認証トークンはLive ID Client SDKなどを使用して取得できます。

Dim serviceUrl = "https://user-ctp.windows.net"
Dim token = New NetworkCredential("userid", "password", serviceUrl).GetWindowsLiveAuthenticationToken()
Dim accessOptions = New LiveItemAccessOptions(True)
Dim loe = New LiveOperatingEnvironment
loe.Connect(token, AuthenticationTokenType.UserToken, New Uri(serviceUrl), accessOptions)

リソースモデル

ここで今回登場するLive Frameworkのリソースモデルについて紹介します。図2はLive Frameworkのリソースモデルの一部分を示したものです。Live Frameworkで扱うさまざまなリソースは、単体の要素とそのコレクション、そしてリソース同士の関係から成り立っています。

図2 リソースモデル
図2 リソースモデル

Data Entry

Data Entryは写真や文書などひとつのデータを表す要素です。Live Meshサービスでは主にData Entryはファイルということになりますが、Live Frameworkを利用したアプリケーションでは自由にData Entryの内容を定義できます。Data Entry自体はそれ自身の名前などテキスト情報のみを持ち、画像などのバイナリデータはMedia ResourceとしてData Entryからのリンクとして関連付いています。

Data Feed

Data Entryのコレクションを指し示すのがData Feedです。コレクション内のData Entryの種類は特に決まりはなく、作成するアプリケーションの用途にあわせて自由にData Entryのコレクションをデザインします。

Mesh Object

アプリケーション定義したデータのコンテナとなるのがMesh Objectと呼ばれている要素です。このMesh ObjectがMesh上で同期・共有する対象の単位となります。Mesh ObjectはData Feedのコレクションを含んでいます。Live MeshサービスではLive MeshフォルダがこのMesh Objectにあたります。アプリケーションでデータを同期したい場合はこのMesh Objectを作成しMeshへ追加することになります。

これら3個のリソースを含むすべてのリソースは、単体の要素はResourceクラス、コレクションはResourceCollectionクラスを継承し、リソースとしての基本情報を持っています[1]⁠。

Mesh Objectの上の階層にはMeshサービスを表しMesh Objectのコレクションを持つMeshがあり、その上がルート要素のLOEとなっています。

Mesh Objectの参照

それでは、Mesh Objectを参照してみましょう。アクセスできるLive Meshサービスは、CTPのDeveloper Sandboxにあるデータです。何もデータを追加していない場合は参照しても情報がありませんので、Live Desktopから適当にフォルダやファイル、アプリケーションを追加しておきましょう図3⁠。

図3 Developer SandboxのLive Desktop
図3 Developer SandboxのLive Desktop

コードはLiveOperatingEnvironmentオブジェクトのConnectメソッドを実行した後のものです。Mesh内にあるMesh Objectの名前を表示します。

' Imports Microsoft.LiveFX.Client
' Imports Microsoft.LiveFX.ResourceModel
For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
    Console.WriteLine(mo.Resource.Title)
Next

実行結果は、筆者の場合、以下のようになりました。フォルダ名やアプリケーション名が取得できていることがわかります。

Crowd Vote
Mesh Lists
Corkboard
Sample folder

ここでコードに注目してください。MeshObjectを取得するのにloe.Mesh.MeshObjectsではなくloe.Mesh.MeshObjects.Entriesとなっています。MeshObjectsはコレクションを表すリソースの型で、実際のMesh ObjectはEntriesプロパティから参照し取得します。また、リソースの名前はResource.Titleプロパティを参照します。

同様に、Mesh Objectの各Data Feedの名前、Data Feedの各Data Entryの名前を取得してみましょう。コードは次のようになります。

For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
    Console.WriteLine(mo.Resource.Title)

    For Each df As DataFeed In mo.DataFeeds.Entries
        Console.WriteLine(vbTab & df.Resource.Title)

        For Each de As DataEntry In df.DataEntries.Entries
            Console.WriteLine(vbTab & vbTab & de.Resource.Title)
        Next
    Next
Next

実行結果は以下のようになりました。皆さんの環境でもアクセスしたMesh内の情報が取得できたでしょうか。

Crowd Vote
        feed1
                DataEntryResource
        schema1
Mesh Lists
        feed1
                DataEntryResource
        schema1
                DataEntryResource
                DataEntryResource
Corkboard
        feed1
                Note 1
                Note 2
Sample folder
        LiveMeshFiles
                photo.png
                Sub Folder
                foo.png

ちなみに、この結果にあるSample folderはLive Meshフォルダのものです。その中にあるSub FolderはLive Meshフォルダ内のフォルダです。このSub FolderはData Entryとして存在していることがわかります。

LOEへ接続時に「New LiveItemAccessOptions(False)」としてオプションを指定した場合は、各リソースを明示的にロードしてからアクセスする必要があります。

loe.Mesh.MeshObjects.Load() ' ← 追加
For Each mo As MeshObject In loe.Mesh.MeshObjects.Entries
    Console.WriteLine(mo.Resource.Title)

    mo.DataFeeds.Load() ' ← 追加
    For Each df As DataFeed In mo.DataFeeds.Entries
        Console.WriteLine(vbTab & df.Resource.Title)

        df.DataEntries.Load() ' ← 追加
        For Each de As DataEntry In df.DataEntries.Entries
            Console.WriteLine(vbTab & vbTab & de.Resource.Title)
        Next
    Next
Next

Mesh Objectの追加

次はMesh ObjectをMeshへ追加してみましょう。ここではLive Meshフォルダとファイルを追加します。少し変更を加えるだけでアプリケーション独自のデータとしてMesh Objectを追加するようにもできます。

Live Meshフォルダの作成

Live Meshフォルダ、つまりMesh Objectの作成は次の通りです。

' Mesh Object の作成
Dim folder = New MeshObject
folder.Resource.Title = "新しいフォルダ"
folder.Resource.Type = "LiveMeshFolder"

' Mesh Object の追加
loe.Mesh.MeshObjects.Add(folder)

ここで、新しいResource.Typeというものが出てきました。これはリソースの種類を文字列で指定します。設定する内容は自由です。Live Frameworkを利用するアプリケーションが独自に付けて構いません。ただし、ほかのアプリケーションとの衝突をさけるため、GUIDや企業名などを含めた名前空間の命名規則等を利用するとよいでしょう。Live MeshサービスのLive Meshフォルダには「LiveMeshFolder」という文字列が使用されていますので、これを指定します。

作成したMesh ObjectはMeshObjects.Addメソッドを使用してMeshへ追加しています。

これだけではまだLive Meshフォルダとしては認識されません。Mesh Object内に特定のData Feedを追加する必要があります。Mesh Objectに続いてData Feedを追加しましょう。コードは以下の通りです。

' Data Feed の作成
Dim fileSystem = New DataFeed
fileSystem.Resource.Title = "LiveMeshFiles"
fileSystem.Resource.Type = "LiveMeshFiles"
fileSystem.Resource.HandlerType = "FileSystem"

' DataFeed の追加
folder.DataFeeds.Add(fileSystem)

Live Meshフォルダとして認識されるためには、Resource.Typeに「LiveMeshFiles」を指定します。Resource.Titleはユーザーからは通常見ることができません。適当な名前で構いませんが、実際のLive MeshサービスではTypeと同じ値にしているようです。

また新しく登場したResource.HandlerTypeは、Live Meshフォルダを作成する以外ではあまり必要ないかもしれません。同期時の手助けになる情報としてLive Meshフォルダを作成する場合「FileSystem」を指定する必要があります。

最後に、先に作成したMesh ObjectのData Feedコレクションに新しく作成したData Feedを追加します。

以上までを実行するとLive Meshフォルダが作成されます。Live Desktopを確認してみましょう。新しいフォルダが作成されたでしょうか図4⁠。

図4 Live Meshフォルダの作成
図4 Live Meshフォルダの作成

ファイルの追加

作成したフォルダにファイル、つまりData Entryを追加してみましょう。コードは次のようになります。コード内に直接記述されたパスにphoto.pngというPNG画像があるものとします。

Dim fs = New System.IO.FileStream("C:\Users\UserName\Pictures\photo.png", IO.FileMode.Open)
fileSystem.DataEntries.Add(fs, "photo.png", "image/png")

ファイルなどのストリームデータを追加する場合、DataFeedのDataEntries.Addメソッドが利用できますので今回はこれを使います。Streamオブジェクトとファイル名(Resource.Title⁠⁠、MIMEタイプを指定するとData Feed内にData Entryが作成されます。

実行後Live Desktop内のフォルダを確認してみましょう。画像ファイアルが追加されたでしょうか図5

図5 ファイルの作成
図5 ファイルの作成

先に作成したMesh Object参照のコードを再度実行することでもData Entryが追加されていることがわかります。


今回はここまでです。次回もMesh Objectsの操作などの基本事項を紹介し、その後に簡単なアプリケーションを作成してみたいと思います。

おすすめ記事

記事・ニュース一覧