アーカイブ

Archive for the ‘Silverlight’ Category

あっあれ??バインド済み

今メンテナンスしているシステムでは、WebブラウザーにホストしたSilverlightからローカルコンピューターに対しソケット通信なんかをやっているわけです。必然的にクロスドメインになるので、常駐アプリでローカルポリシーサーバーを立ててあげます。

詳しくはMSDNのこちらを参照

あれ?ポリシーサーバーがバインドできない

    今までは問題無く動作していたんだけれど、ローカルのソケットサーバーで943番ポートをバインドしようとしたらこんな例外が出た。

System.Net.Sockets.SocketException (0x80004005): アクセス許可で禁じられた方法でソケットにアクセスしようとしました。
   場所 System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   場所 System.Net.Sockets.Socket.Bind(EndPoint localEP)

今まで実行できていたのになんでだろう?なにか別のサービスがポートを専有している?とおもい、おもむろにコマンドプロンプトでnetstatを実行

netstat –a –b

プロトコル  ローカル アドレス          外部アドレス        状態

… 略 …

TCP    0.0.0.0:943            XXXX:0            LISTENING    [XamlSpyService.exe]

… 略 …

あー、WPFで作ったアプリのXAMLを確認するのにXAML Spy入れた、確かに入れた。

こいつSilverlightのXAMLを確認するから、独自でポリシーサーバー持つのか。

XAMLを確認するなら

実行中アプリのXAMLを確認するだけなら、XAML SPYを使わなくてもSNOOPでもいいよね。デザインなんかはとても気に入っているのですが、、、さようならXaml Spy

カテゴリー:プログラミング, Silverlight タグ: ,

Silverlight5の信頼されたアプリケーションのブラウザー実行

メモ、どうも日本語資料がなかなか無いんだけれど、八巻さんの資料に載ってた。

Silverlight 5でぶり返すWPF不要論(http://www.slideshare.net/Yamaki/silverlight-5wpf)16ページあたり

というか、MSDNに日本語の記述がない。。。消え行く技術には厳しいのか。

#この記事書くまで、このサイトのカテゴリに「メモ」がなかったことに気づいた。。。

カテゴリー:メモ, Silverlight タグ:

Mango Sdk BetaでMVVM Lighttoolkitを使おう

Mango Sdk Betaがでてからしばらく立ちますが、WPF/Silverlight/Windows Phoneに対応したMVVMのツールキットであるMVVM LighttoolkitもMangoに対するパッチが公開されています。

バイナリーのインストール

パッチといってもバイナリーの置き換えになるようですが、安定版の MVVM Light Toolkit V3とプレビュー版の MVVM Light Toolkit V4ともにリリースされています。それぞれ次のリンクからダウンロード出来きます。

ただ、V3とV4はアセンブリが同じ名前なので、もし同居させたいならデフォルトとは違うフォルダーにインストール擦る必要がありますが、その場合、後述のテンプレートの参照先がおかしくなってしまうので、気をつけましょう。

MVVMの通常のインストールと同じように、ダウンロード後にC:\Program Filesに解答してあげましょう。MVVM LightTool V3のインストール方法はこちら。→ MVVM Light Toolkitをインストールしてみる。

V3を利用する場合は、NuGetで次のコマンドを実行すれば、インストールの作業をしなくても利用できます。

Install-Package MvvmLight

 

プロジェクトテンプレートのインストール

プロジェクトテンプレートには、通常のVisual Studio用のテンプレートと、Windows Phone用のVisual Studio Express用の2つがあります。

Visual Studio用は、Visual Studioのオプション→Tools→Options→Project and Solutionsにある、User Project Locationで確認できます。

image

デフォルトでは、ここが指定されています。

%UserProfile%\Documents\Visual Studio 2010\Projects

テンプレートをインストールすると、MvvmLight (WP7.1) がテンプレートに追加されます。

image

カテゴリー:Silverlight タグ: ,

MIX11 ではSilverlight 5 Betaが発表される予定

Silverlight Fire Starter でScottGuが Silverlight 5の告知 ( 日本語訳 ) をしてから5ヶ月、来週から始まるMIX 11でSilverlight 5 Betaの紹介とともに、実際のダウンロードが開始されると予想されます。

米MS、「Silverlight 5」ベータ版を来週発表~HTML5と両面展開の戦略

とりあえず各種リンクでも。

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032483735&Culture=ja-JP MIXのニュースブログ(Watch the MIX Keynotes Live, Apr 12 & 13)を見ると、キーノートに関しては今年もSilverlightでストリーミングするとのことなので、Silverlightのインストールはお忘れなく。おそらくココ数回の流れから、ScottGuから発表があるんでしょおうね。多分当日はライブで見ようと思っています。

MIX11のKeyノートは、日本時間4/12 25時からです。

カテゴリー:Silverlight

CodeZine: Silverlightによるデスクトップアプリケーション

2011年4月5日 1件のコメント

今回から3回に分けてブラウザー外実行です。

Silverlightによるデスクトップアプリケーション
Silverlight 4で作る新しいRIAアプリケーション(8)
http://codezine.jp/article/detail/5770

#wordpress のクイック投稿って機能を使ってみた。

カテゴリー:雑記, Silverlight タグ:

VB.NETにMVVM LightToolkitのテンプレートを追加しよう

MVVM LightToolkitのVB用テンプレートがないと聞いたので、とりあえずViewModelのテンプレートを作ってみました。

Visual Studioのテンプレートを作るのは簡単です。

  1. もともとになるプロジェクトやファイルを作って、
  2. 置き換えようのパラメーターをソースに適用して、
  3. ウィザードからテンプレート化して、
  4. UserTemplateフォルダーに置く
  5. だけ。

ということで、やってみます。

1.テンプレートのもととなるプロジェクトを作る。

まずは、テンプレートのもととなるプロジェクトを作ります。

本来のMVVM LightToolkitのプロジェクトテンプレートから作られるプロジェクトは、アセンブリの参照以外にも、MVVM LocatorやMVVM Viewなどが最初からプロジェクトに追加されていますが、今回は単にMVVM LightToolkitのアセンブリが追加され、ViewModelが一つ追加されたものを作ります。

MVVM LightToolkitに必要なアセンブリは、次の3つです。

  • GalaSoft.MvvmLight.Extras.SL4.dll
  • GalaSoft.MvvmLight.SL4.dll
  • System.Windows.Interactivity.dll
  • Select the file to reference

テンプレートにする、ViewModelクラスを作成します。ViewModelBaseクラスを継承する以外は、特に記述するものもないのですが、C#のテンプレートにならってこんなクラスを追加してみました。C#ではクラスファイルには名前空間を含めますが、VBではアプリケーションレベルでは既定の名前空間を使うのが習わし?になっているので名前空間は定義していません。

Option Explicit On
Option Strict On
Option Infer On

Imports GalaSoft.MvvmLight

Public Class Class1
    Inherits ViewModelBase

    Public Sub New()
        'if (IsInDesignMode)
        '    ' Code runs in Blend --> create design time data.
        'Else
        '    ' Code runs "for real": Connect to service, etc...
        'End If
    End Sub

    'Public Overrides Sub Cleanup()
    '    ' Clean own resources if needed
    '    'MyBase.Cleanup()
    'End Sub
End Class

とりあえず、この状態でビルドが通ることを確認したら、テンプレートのもととなるプロジェクトの作成は終了です。

2.換えようのパラメーターをソースに適用する。

テンプレート化するアイテムは、アイテムの追加ダイアログで指定したファイル名をクラス名につけたいので、次のように修正します。

Option Explicit On
Option Strict On
Option Infer On

Imports GalaSoft.MvvmLight

Public Class $safeitemname$
    Inherits ViewModelBase

    Public Sub New()
        'if (IsInDesignMode)
        '    ' Code runs in Blend --> create design time data.
        'Else
        '    ' Code runs "for real": Connect to service, etc...
        'End If
    End Sub

    'Public Overrides Sub Cleanup()
    '    ' Clean own resources if needed
    '    'MyBase.Cleanup()
    'End Sub
End Class

クラス名をClass1から、定義済みテンプレート名である、$safeitemname$に変更しています。このほかのテンプレート名は、MSDNを参照してください。また、カスタムテンプレートを定義することもできます。

3.ウィザードでテンプレート化する。

テンプレートウィザードを開始するには、Visual Studioのファイル⇒テンプレートのエクスポートを実行します。

image

今回は、アイテムテンプレートを追加するので、ラジオボタンで項目テンプレートを選択します。

テンプレートのエクスポート ウィザード

アイテムテンプレートに含むファイルを指定します。今回は先ほど修正したMVVMViewModel.vbを選択します。

テンプレートのエクスポート ウィザード (2)

このファイルが参照するアセンブリを選択します。ここでは上記の3アセンブリを参照します。

テンプレートのエクスポート ウィザード (4)

テンプレートの情報を定義してテンプレートの作成は完了です。

テンプレートのエクスポート ウィザード (5)

4.UserTemplateフォルダーに置く

テンプレートを自動的にVisual Studioにインポートを選択すると、今回作成された項目テンプレートが、下記の場所に作成され、Visual Studioに自動登録されます。

%UserProfile%\Documents\Visual Studio 2010\My Exported Templates

 

テンプレートを適用する。

アイテムの追加ダイアログに作成したテンプレートが表示されます。

新しい項目の追加 - SilverlightApplication2

プロジェクトのテンプレートを作る。

プロジェクトテンプレートの作り方は、基本的に項目テンプレートと同じです。

テンプレートのウィザードの最初で、プロジェクトテンプレートを選択するだけです。

テンプレートの構成

Visual Studioのテンプレートファイルは単なるZipファイルです。解凍するとテンプレートの構成を書いたvstemplateファイルと、テンプレートに含まれるファイルやアイコンが解凍されます。

image

このvstemplateファイルはを修正することで、アイテム追加時のカスタム動作を追加することができます。

詳細はこちら⇒プロジェクトと項目テンプレートのカスタマイズ

カテゴリー:Silverlight タグ: ,

Silverlightでamazonの書籍検索を使ってみよう

2010年12月24日 4件のコメント

書籍管理用のSilverlightアプリがほしいなーと思っています。画像や書籍の情報なんかを手軽に利用したいとなるとやっぱりAmazonかな、ということで、とりあえずAmazon Web Service API(Amazon AWS)をSilverlightで使ってみようと思います。

1.Amazon AWSのアクセスポリシー

Silverlightではそのアプリケーションがホストされたドメイン以外のサイトに対して通信を行う場合、クロスドメインの制限がかかるため、通信先のホストのルートディレクトリにあるclientaccesspolicy.xmlか、crossdomain.xml でそのサイトに対するアクセスが許可されている必要があります。Silverlightで他のドメインに通信をする場合は、まずはじめにこの部分を確認する必要があります。

くわしくは、CodeZineのこの記事を参照してくださいw。
Silverlightとサーバーサービスの連携

嬉しいことに、日本のamazon のWebサービスがホストされているhttp://ecs.amazonaws.jp/のcrossdomain.xmlを見ると、嬉しいことに次のように全サイトからのアクセスを許可してくれています。

Amazon Web Service の crossdomain.xml (http://ecs.amazonaws.jp/crossdomain.xml

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
   <allow-access-from domain="*" /> 
</cross-domain-policy> 

2.Amazon AWS Access Keyの取得と確認

Amazon AWSを利用するためには、Amazon AWSのサイトで、自分のAccess key IDとSecret Access keyを確認する必要があります。Amazon AWSのAccess KeyはこのAmason AWSのポータルサイトで確認できるので、自分のAmazonアカウントでログインして確認して下さい。Access key Idが公開鍵で、Secret Access keyが秘密鍵になります。この2つのキーをもとにAWSを使うための署名を作成します。Secret Access keyは外部に漏れないように厳重に管理しましょう。

Amazon AWSのポータルサイト⇒http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=access-key

Amazon AWSに登録していない人や、Amazonのアカウントを持っていない人やはこのあたりのサイトを参考にAmazon AWSのアカウントを取得してください。

Access Key IDの取得

3.書籍検索クエリの作成

Amazon AWSでは書籍の検索に限らず、Amazonで取り扱っている商品の検索や購入をProduct Advertising APIを使うことで行うことができます。今回はとりあえずSilverlightアプリケーションで書籍の検索を行ってみましょう。

書籍の検索は、次のクエリを利用します。(実際は1行です。)

http://ecs.amazonaws.jp/onca/xml?

AWSAccessKeyId=xxx&

Keywords=Silverlight&

Operation=ItemSearch&

ResponseGroup=Small&

SearchIndex=Books&

Service=AWSECommerceService&

Timestamp=2010-12-23T15%3A54%3A24Z&

Version=2009-03-31&

Signature=xxxxx"

リクエストの詳細はこのあたりで確認できます。クエリの詳細はこのあたりを確認して下さい。

⇒  Ajax Tower.jp 商品検索(ItemSearch)

また、Amazon AWSへのリクエスト2009年に改正され、リクエスト中にタイムスタンプや利用者のハッシュした署名を含める必要があります。署名の作成方法は下記のサイトで確認できます。

⇒ Ajax Tower.jp 認証(Timestamp及びSignature)

署名を作成するのは大変ですが、.NETで署名を作成するライブラリが、Amazonのデベロッパーフォーラムで公開されていますので、通常のパッケージに含まれるSignedRequestHelperクラスを使うのがいいでしょう。

Product Advertising API Signed Requests Sample Code – C# REST/QUERY

利用方法はこんな感じです。

var helper = new SignedRequestHelper(MY_AWS_ACCESS_KEY_ID, MY_AWS_SECRET_KEY, DESTINATION);
var param = new Dictionary<string, String>();
param["Service"] = "AWSECommerceService";
param["Version"] = "2009-03-31";
param["Operation"] = "ItemSearch";
param["Keywords"] = bookName.Text;
param["SearchIndex"] = "Books";
param["ResponseGroup"] = "Small";

var requestUrl = helper.Sign(param);
var request = new WebClient();
request.DownloadStringCompleted += (_s, _e) =>
{
    if (_e.Error != null)
    {
        MessageBox.Show(_e.Error.ToString());
        return;
    }
    MessageBox.Show(e.Result);

};
request.DownloadStringAsync(new Uri(requestUrl));
}

MY_AWS_ACCESS_KEY_IDとMY_AWS_SECRET_KEYには2で確認したキーを指定します。DESTINATIONには日本のAWSを利用するのでJPを指定します。

4.SignedRequestHelperの変更

困ったことに、SignedRequestHelperは.NET Frameworkを対象に書かれているため、Silverlightでは利用できないクラスを使っています。具体的には、SortedDictionaryクラスがそれです。特に、AWSのクエリはハッシュの作成のために、クエリの順番が特に重要なためです。しかし落胆することはありません、問題はキーの順番が保証されてさえいればいいのです。嬉しいことにSilverlightにはLINQがあります。とりあえず順序保証がされないDictonaryにパラメータを放りこんで、ハッシュを作成する時に並び替えてあげればいいのです。

/*
 * Consttuct the canonical query string from the sorted parameter map.
 */
private string ConstructCanonicalQueryString(IDictionary<string, string> sortedParamMap)
{
    StringBuilder builder = new StringBuilder();

    if (sortedParamMap.Count == 0)
    {
        builder.Append("");
        return builder.ToString();
    }

    // Dictionaryは順序保証されていないので、OrderByしてあげる
	// foreach (KeyValuePair<string, string> kvp in sortedParamMap)
    foreach (KeyValuePair<string, string> kvp in sortedParamMap.OrderBy(item => item.Key))
    {
        builder.Append(this.PercentEncodeRfc3986(kvp.Key));
        builder.Append("=");
        builder.Append(this.PercentEncodeRfc3986(kvp.Value));
        builder.Append("&");
    }
    string canonicalString = builder.ToString();
    canonicalString = canonicalString.Substring(0, canonicalString.Length - 1);
    return canonicalString;
}

4.XMLをパースする。

リクエストに対するレスポンスはこんなXMLです。

image

XMLのパースといえば、やっぱりここでも LINQ です。 DataGridに表示するためには、匿名型ではダメなので、検索結果というクラスを作って、パース結果をそのクラスに流し込んでいます。

    // Grid表示
    var xml = XElement.Parse(_e.Result);
    XNamespace ns = "http://webservices.amazon.com/AWSECommerceService/2009-03-31";
    var result = from item in xml.Descendants(ns + "Item")
                 select new 検索結果
                 {
                     Asin = item.Element(ns + "ASIN").Value,
                     Url = item.Element(ns + "DetailPageURL").Value,
                     Author = item.Element(ns + "ItemAttributes").Element(ns + "Author").Value,
                     Title = item.Element(ns + "ItemAttributes").Element(ns + "Title").Value,
                 };
    bookList.ItemsSource = result.ToList();

5.動かしてみる。

image

うごいた。後は受け取ったURLに含まれる情報からAmazonのサイトをWebブラウザーコントロールに表示市たいんですが、それはCodeZineの連載を見てください。多分2月ぐらいの回を乞うご期待です。

6.おまけ

とりあえずサンプルプロジェクトはここにおいておきます。

http://cid-b17f5fcd8095628b.office.live.com/self.aspx/%E5%85%AC%E9%96%8B/WebApplication2.zip

 

#追記

通りすがりさんのコメントを参考に、ConstructCanonicalQueryStringメソッドでのソート時に、大文字小文字を区別してソートするようにしました。(2010/12/30)

カテゴリー:Silverlight タグ: