ページ

2009年12月22日火曜日

[Silverlight] Silverlight 4 で AR

World# - Real Time 3D Augmented Reality with Silverlight より。
Silverlight 4 では webcam API がサポートされるってことで、当然のように AR している人がいましたw
完全にマネージド (C#) な NyARToolkitCS という ARToolkit を使っているそうです。
また、3D モデルのレンダリングに Balder というマネージドなゲームエンジンを使っているそうです。

上記は実際に Silverlight 4 で動かしてるところをスクリーンキャプチャしたものだそうです。
記事に 「スクリーンキャプチャソフトがリソースをえらく食ってる」 といったことが書かれてますので、カクついて見えるのはキャプチャムービーだからみたいです。
記事によると 50~60fps でスムーズに動いているとありますね。


2009年12月17日木曜日

[Silverlight] Wiki-OS と Userware API

Wiki-OS を作ってる Userware 社による Wiki-OS などの紹介ムービー。
英語ですが絵を見てるだけでもだいたいわかるんじゃないかと。

2:10 くらいから始まるプロダクト & デモでは以下のものが紹介されています。

  • Wiki-OS … そのまんま Wiki-OS ですね。
  • Wiki-OS Enterprise … どうやら Wiki-OS サーバを自分で立ち上げることができる模様。ムービーでは .xbap になってるので WPF 版ですが、これは WPF 版と Silverlight 版があるのかな?
  • Userware API … どうやら自分のアプリケーションに Wiki-OS の機能を組み込める模様。ムービーではイメージエディター (自分で作ったアプリ) のフィルターを Userware API 対応にしておき、「他に欲しいフィルターがあったら誰か作ってね」 なんてことをしています。(「Create New Filter...」 で Wiki-OS と同じ C# コードエディターが開きコードを書ける。もちろん既存のコードを編集することも可)
  • Userware for Office … Microsoft Office のアドインを Userware API なコンポーネントでできるようにするもの。

いやぁ、おもしろいなぁ。
特に Userware API なんてすごく興味深い。実用的に使えるのかどうかはまだ何とも言えない気がするけど、けど、なんかわかんないけど 「おもしろそう」 と感じるw
ちなみに、http://www.userware-solutions.com/ にあるように Wiki-OS Enterprise、Userware API、Userware for Office は有料な商品みたいです。

ところで、ムービーの 3:00 くらいのところ。
Wiki-OS アプリをブログに貼り付けてみるというデモですが、”貼り付けてみるテスト” なんて日本語が見えたので 「おぉ、日本語!」 って思ったんですが、「あれ?このブログ、見覚えが、、、」
うはっ、ここじゃんw


[Silverlight] Silverlight を使った Virtual DVD

Silverlight-powered Virtual DVD now available from Tesco より。
このタイトルを見たときはさっぱり意味がわかんなかったんですが、記事によると 「9月に Microsoft と Tesco が次世代のホームビデオ提供方法を Silverlight を使って行う予定とアナウンスした。”Virtual DVD” は物理的な DVD/Blu-ray を購入した Tesco の顧客がそのディスクとまったく同じものの Silverlight 版をダウンロードできるようにする仕組み」 ということだそうです。
記事には書いてないんですが、やっぱり Live Smooth Streaming を使ったものなのかな?
ただ、チャプター、マルチランゲージ、字幕もサポートされるとありますね。Live Smooth Streaming ってこういったこともできるようになってるのかな?

ところで、つい最近ほとんど同じようなニュースを見たような気が、、、
Amazon、DVDやBDを買うとその場でデジタル版を観られるDisc+ On Demandを開始
これか。


2009年12月11日金曜日

[Silverlight] Silverlight 4 の COM 呼び出しはアウトオブプロセスな COM サーバのみらしい

Silverlight 4 COM Support and 32/64 bit machines ? the C64 Emulator より。
以前に Commodore 64 エミュレータを Silverlight で作ってる 方の記事を紹介しましたが、その方のその後です。

ジョイスティックなんかをエミュレートするためにタッチ・インターフェースでできるようにしようとしたとのこと。
このために Windows API Code Pack を使って (おそらく C# で) DLL を作り、これを regasm で COM として登録。そして、Silverlight 4 の COM 呼び出しを使ってこの COM を呼び出すようにしたようです。
(Silverlight から直接 API を呼び出すことはできないため、COM 経由で呼ぶようにしたということですね)
で、パフォーマンスも問題ないしうまくいったと。

が、Silverlight の PM の一人である Ashish Shetty 氏にこのことを話したところ驚かれたようです。こういうシナリオはサポートされてない、と。
太字で強調されてますが、COM 呼び出しはローカルマシンにインストールされているアウトオブプロセスな COM サービスに使うことが前提になっていると。

PDC でこのデモを動かしてやろうとしたけどデモ機が Windows 7 64bit だったので動かなかった、なんてことも書いてありますね。
インプロセスな COM の場合、64bit アプリでは 64bit の COM、32bit アプリでは 32bit の COM しか呼び出すことができないからですね。
って、あれ?
Silverlight 4 の Out of Browser は 64bit OS だと 64bit なの?
いや、そもそも regasm で登録した COM って 32bit なの?64bit なの?(アセンブリは AnyCPU だとして)
気になったので検索してみた、、、
おぉ、

  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\RegAsm.exe

があるのか。
Framework の方で regasm する 32bit COM、Framework64 の方だと 64bit COM になるのね。知らんかった。

ちなみに、アウトプロセスな COM サーバーの場合は間にマーシャリングが入るため違うビット幅の COM サーバーも問題なく呼び出せます。

ちょっと話がそれましたが、インプロセスな COM に使うことを想定してないというのはちょっと意外。
Having fun with Silverlight 4 Beta and the Speech APIs
こちらの人なんて Speech API を呼び出して Out of Browser な Silverlight 4 アプリにしゃべらせたりしてるし。
# Sapi.SpVoice はインプロセスな COM でした。

おまけ
Silverlight 4 で dynamic 使うときは Microsoft.CSharp.dll を参照しないといけないのか。


2009年12月9日水曜日

[Silverlight] WriteableBitmapEx が CodePlex で公開

http://writeablebitmapex.codeplex.com/
WriteableBitmap に便利なメソッドを追加する WriteableBitmapEx が CodePlex にて公開されています。

Silverlight 3 では WriteableBitmap クラスを使ってイメージを描くことができるようになりました。
こいつには、UIElement を Render するという方法と、イメージのバイト配列にアクセスして各ピクセルの色をいじるという方法で絵を描けます。
けど、あるのはそれだけなので、線分ひとつ描くのにも、System.Windows.Shapes.Line を生成してそいつを Render するか、自分で DDA とかを使った DrawLine のようなメソッドを用意するかしないといけないんですよね。

というわけで、DrawLine などを一通り用意したのがこの WriteableBitmapEx です。
今のところ用意されているのは、

  • Clear
  • SetPixel
  • DrawLine
  • DrawPolyline
  • DrawTriangle
  • DrawQuad
  • DrawRectangle
  • DrawEllipse
  • DrawEllipseCentered
  • Blit
  • ToByteArray
  • FromByteArray

と言ったところです。
すべて拡張メソッドとして実装されてますのでかなり自然な感じで使うことができます。
ソースを見ればすぐにわかりますが、「内部で UIElement を作って、、、」 なんていう方法ではもちろん無く、DDA などのアルゴリズムを使ってピクセル単位で描画しています。
トップページ の “Performance!” のところに 「WriteableBitmapEx のメソッドは Silverlight の Shape よりずっと速い。たとえば、WriteableBitmapEx の DrawLine は System.Windows.Shapes.Line 要素を使うより 20~30倍速い。だから、もし多数の図形を描く必要があり、アンチエイリアスや Silverlight シェープのプロパティなどが必要ないのであれば WriteableBitmapEx のメソッドを使うのがいいだろう」 といったことが書いてあります。

なお、Downloads のところにあるのはバイナリだけでした。
Source Code の方からソースをダウンロードすればサンプルなども含まれています。
ドキュメントが見当たりませんが、まぁ、ソースを見ればすぐにわかるでしょう。


2009年12月7日月曜日

[Silverlight][.NET] Silverlight 4 と .NET Framework 4 の互換性

PDC の Scott Guthrie 氏のキーノートスピーチでも 「Silverlight 4 と .NET Framework 4 のアセンブリには互換性がある」 と言ったことがちらっと触れられてましたが、それの詳細が CLR Team Blog にありました。

Sharing Silverlight Assemblies with .NET Apps
Silverlight 4 用にコンパイルしたアセンブリと .NET Framework 4 用にコンパイルしたアセンブリには互換性があるようになっているそうです。
ただ、そうは言っても、たとえば .NET Framework 4 にしかないクラスを呼び出しているアセンブリを Silverlight 4 で動かすことは当然ながらできません。(もちろんその反対も)
この点については、Silverlight 4 の

  • Mscorlib
  • System
  • System.Core
  • System.ComponentModel.Composition
  • Microsoft.VisualBasic

のクラスを使っている限りは .NET Framework 4 でも問題なく動くようです。
.NET Framework 4 の方が機能が多いため、.NET Framework 4 のこれらのアセンブリのみを使用しているアセンブリが Silverlight 4 で動かせるとは限らないようですので注意。
なので、Silverlight 4 と .NET Framework 4 の両方で使えるようにしたい場合は Silverlight 4 のプロジェクトとして作った方がいいようです。

これと関連して、
Silverlight 3 & 4 Library Sharing with .NET 4.0 Library or WPF
これを見ると、どうやら Silverlight 4、.NET Framework 4 からは Silverlight 3 のアセンブリも参照できるみたい。

ただ、
On Silverlight 4 Beta / Silverlight 3 backward compatibility
によると、

  • Silverlight 4 ランタイム上で Silverlight 3 アプリが動くときは Quirks Mode になって Silverlight 3 互換になる。
  • Silverlight 4 アプリの中に Silverlight 3 アセンブリが含まれている場合は Quirks Mode にはならない。

ということになるそうです。(まぁ、そりゃ当然という感じですが)


2009年12月3日木曜日

[日本語入力] 思いどおりの日本語入力 - Google 日本語入力

思いどおりの日本語入力 - Google 日本語入力
なんかすごい。
開発メンバーがハンパ無さそう。

というわけでさっそく入れてみた。
64bit はまだ未対応ということなので Virtual PC 上の XP 32bit へ。
いろいろおもしろいし、常用したいと思うくらいな感じ。

と思ったら大きな問題あり。
私はかな入力なんですが、「っ」 を入力しようと Shift+「つ」 を押すと 「Z」 になってしまい、しかも、それ以降は勝手に半角英数になってしまう。
他にも 「ぃ」 も同様。(「ぁ」 は入力できるのでかな入力時の 『Shift+英字キー』 がおかしいのか?)
あと、「-」 が Shift キーを押しながらじゃないと入れられない。なんで?

後者の方はまだしも、前者の方は 「これじゃあ、まったく使えない」 というレベル。
これって Virtual PC 上だからとかあるのかな?
ちょっとでもかな入力で試してみればすぐわかりそうなもんだし。うーむ。

追記
上記の現象は 「メモ帳」(notepad.exe) で発生しました。
けど、IE のテキストボックスやワードパッドでは正常に 「っ」 が入力できるようです。「-」 も Shift キーを押さなくても入力できます。
いくつかのアプリで試してみたら、どうも正常に入力できるものとできないものとマチマチです。

で、その後、Virtual PC を再起動したりとかいろいろしてたら再現しなくなりました。(いつも正常に入力できる)
何かしらの条件によって発生するのかもしれませんが、とりあえずかな入力でも大丈夫そうです。
(あとは 64bit 対応版さえ出てくれれば)


2009年11月25日水曜日

[XAML][Silverlight] XAML Toolkit と XAML Localization

.NET Framework 4 向けの XAML Toolkit の CTP が公開されています。
http://code.msdn.microsoft.com/XAML/
これは PDC の 「XAML Futures in Microsoft .NET Framework, Microsoft Silverlight and Tools」 というセッションで紹介されたもののようで、XAML FxCop (XAML の静的解析) とか XamlDom (XAML の DOM に簡単アクセスするクラスたち。LINQ 構文も使える) とかが含まれているみたいです。

で、セッションのビデオをちょこっと見てみたんですが、XAML 自体も拡張されるんですね。
http://blogs.msdn.com/llobo/archive/tags/XAML+2009+features/default.aspx
にいろいろありました。
Generic の型引数を指定したり とか、インスタンス生成メソッドを指定したり引数を与えたり とか、おもしろいなぁ。
ただ、どうやら XAML 2009 は .NET Framework 4 向けで、Silverlight 4 では対応しないみたいです。

あと、XAML Localization に 「おおっ」 っときました。(ビデオの 44分くらいから)
まだ 「x:Uid 方式なんてどうかな?」 とどうしようか考えてるような段階みたいですが、これはがんばって欲しい。
ちなみに、Silverlight 3 だと
Silverlight and localizing string data
こんな感じです。Localization のための特別な仕組みがあるわけではなく、文字列リソースの resx を作って、そいつを XAML にリソースとして取り込んで、 Text="{Binding Source={StaticResource LocStrings}, Path=WelcomeMessage}" なんて感じでバインドするという、何とも泥臭い方法です。


2009年11月18日水曜日

[.NET] Reactive Extensions for .NET が DevLabs でリリース

Finally, the long wait is over. Rx is available on DevLabs! より。
Reactive Extensions for .NET が DevLabs にて公開されたそうです。
どうやら今まで Reactive Framework とか呼ばれていたものが Reactive Extensions for .NET となったようです。
リリースノートはこちら → Release Notes (Build 1.0.2052. 11/17/2009, First Release)
DevLabs から

  • .NET Framework 3.5 SP1 版
  • .NET Framework 4 Beta 2 版
  • Silverlight 3 版

がそれぞれダウンロードできます。

Reactive Extensions API in depth: intro
Channel 9 で動画による解説が始まるようですが、今の時点では intro しかないみたいです。

What's different about the 3 versions of Rx? Part 1: Silverlight 3
Channel 9 で .NET 3.5 版、.NET 4 版、Silverlight 3 版の違いを開設する動画が始まるようですが、今の時点では Silverlight 3 版とかないみたいです。
で、この Silverlight 3 版の内容は、「Observable.Start(...).Subscribe(...) は自動的に UI スレッドで動くよ」 といったことみたいです。


2009年11月13日金曜日

[Silverlight] out-of-browser と initParams

なるほどぉ、と思ったのでメモ

Silverlight out-of-browser and initParams より。
HTML 側から Silverlight アプリに初期値を渡したいときに使える initParams ですが、あれは HTML 上に書いてあるものですから out-of-browser にすると無くなっちゃうんですね。(そりゃそうですが)
そこで上記の記事では、Application.Current.IsRunningOutOfBrowser を参照して

  • out-of-browser でないときは、initParams を取得しそれの内容を IsolatedStorage に保存しておく。
  • out-of-browser なときは、IsolatedStorage から initParams を読み込む。

としています。

なるほど、out-of-browser としてインストールするためには一度はブラウザで実行しているはずだからそのときに IsolatedStorage に保存しておけるってわけですね。
ただ、別のインストール手段が出てくるかもしれませんし、IsolatedStorage のファイルが無くなってる可能性も無いとは言えないので、ファイルが無かったときの考慮もちょっとはしておいた方がいいとは思いますが。(記事内のコードではそういった対処は何もしていないので、ファイルが無いと例外が出て死んじゃうと思う)


2009年11月11日水曜日

[Silverlight] Silverlight がインストールされていないときに出る画像

Silverlight がインストールされていない環境で Silverlight を使ったページを見ると、

InstallSilverlight_108181.png

こんな画像が表示されます。
これは 「方法: HTML を使用して Web ページに Silverlight を追加する」 や 「方法 : JavaScript を使用して Web ページに Silverlight を追加する」 にあるように <img src=”http://go.microsoft.com/fwlink/?LinkId=108181” .../>  としたときに表示される画像です。
ちなみに、ブラウザの言語 (たぶん HTTP ヘッダの Accept-Language あたり) によって適した言語の画像が返ってくるようになってます。

たまたま見かけたんですが、

ExperienceSilverlight_161376.png

こんな画像を使ってる人もいました。
HTML を見てみると <img src=”http://go.microsoft.com/fwlink/?LinkId=161376” .../> とするとこの画像になるようです。(もちろん、こちらもブラウザの言語によって使われる言語が変わります)

これって他にもあるのかなぁ?


2009年11月9日月曜日

[Microsoft] Productivity Future Vision - Microsoft が思い描くちょっと未来のコンピューター

2009/11/05 に開催された Microsoft Developer Forum 2009 の Live Smooth Streaming による中継を見ていたときに、合間に流れていたビデオがいい感じだったのでどっかにないのかなぁと思っていたんですが、
http://www.officelabs.com/projects/productivityfuturevision/Pages/default.aspx
こちらにありました。
Silverlight のビューアーで見ることもできますし、WMV もあります。

というか、このビデオのタイトルが 「Productivity Future Vision」 だとわかれば、検索するとブログ記事だとか、YouTube だとか、Microsoft Showcase だとか、いろいろと見つかりますね。
つか、ReMIX とか TechED でも流れてたみたいなので結構前からあるのか。
私はそれらに参加してないので今回が初見でした。


[.NET] IDataObject を使ってドラッグ&ドロップとコピー&ペーストを実装

Creating something from nothing [Developer-friendly virtual file implementation for .NET!] より。
ネイティブコードでは IDataObject やら IDropSource やらといった COM インターフェースを使ってドラッグ&ドロップやコピー&ペーストを実装します。
WPF では System.Windows.DataObject が用意されていますが、これは存在するファイルしか扱えなかったり、DoDragDrop() メソッドが同期的だったりとネイティブコードでできることの一部の機能しか提供されていません。
この DataObject クラスは sealed なので拡張もできそうにありません。
System.Windows.IDataObject インターフェースは上記の DataObject クラスと同じメソッドしかないのでこれを使ってもどうにもなりそうにありません。

というわけで、System.Runtime.InteropServices.ComTypes.IDataObject インターフェースを実装するクラスを作ってフル機能のドラッグ&ドロップとコピー&ペーストを実装しよう、というのが上記の記事です。
こちらの IDataObject インターフェースは、まんま COM の IDataObject インターフェースです。(ネームスペースでわかるでしょうが)
こいつを実装しようとすると、FORMATETC だとか何だとかと 「ドラッグ&ドロップ程度のことが何でこんなにややこしいんだよ」 と思うくらい面倒だったりします。
記事中にあるリンクからサンプルプログラムをダウンロードできますが、ちょっと見てみたところ、IDataObject とそれに必要なものをだいたい一式実装しているようです。
もちろん、一つのクラスでドラッグ&ドロップとコピー&ペーストの両方に対応できるようになっています。(まぁ、もともとどちらも IDataObject を使うんですが)
Action<Stream> を渡しておいてドロップ時にファイルを生成したりといったこともできるようになっています。

ちなみに、サンプルプログラムは、左クリックでドラッグ&ドロップ、右クリックでクリップボードへのコピーになっています。

あと、
Creating something from nothing, asynchronously [Developer-friendly virtual file implementation for .NET improved!]
こちらの記事で、コンストラクタに Action を渡しておくとドラッグ&ドロップの開始時と終了時にその Action を呼び出してくれるという機能が追加されています。


2009年11月5日木曜日

[.NET] ASP Classic Compiler - VBScript を IL にコンパイルして実行するソースコード

中身はまだ見てないんですが、ちょっとおもしろそうだったので覚え書き。

http://www.codeplex.com/aspclassiccompiler

ASP (ASP.NET ではなく古いほうの ASP) で使われている VBScript を IL へとコンパイルして実行するソースコードだそうです。
VBScript のパーサは手作りで、IL の生成は Dynamic Language Runtime を使っているとあります。
ゴールには、実際に存在する主要な ASP ページを変更無しで ASP.NET 下で実行可能にする、とあるので単なるサンプルコードと言うよりはそれなりに本気なようです。
Silverlight でこのコンパイラを使うサンプルコードも含まれているそうです。

と、これを見ていてふと思い出したんですが、DLR には VBx という動的言語版 VisualBasic が乗っかるとかっていう話があったと思うんですが、あれってどうなったんでしょ?


2009年11月2日月曜日

[Microsoft] いろいろなチュートリアル動画(英語)

ちょっと覚え書き。

http://www.msdev.com/
microsoft.com ドメインじゃないけど Microsoft のサイトみたい。
”Search” でカテゴリを選ぶといろいろ見れる。
動画のものもあればドキュメントのものもある。

http://expression.microsoft.com/en-us/cc184875.aspx
Expression のチュートリアル動画など。


2009年10月22日木曜日

[VS2010][Silverlight] Visual Studio 2010 と Silverlight 3 SDK

Visual Studio 2010 and Silverlight 3 SDK より。
ええと、Silverlight 3 Tools for Visual Studio 2008 と Expression Blend 3 に含まれている Silverlight SDK は 3.0.40624。
今回の Visual Studio 2010 beta 2 に含まれている SDK は 3.0.40818。
で、3.0.40624 が入っているマシンに 3.0.40818 を入れることはできない。
もし、3.0.40624 が入ってるマシンに VS2010 を入れると Silverlight SDK のインストールに失敗する。けど、3.0.40624 を使って VS2010 で Silverlight の開発をすることはできる。

ということなので、Silverlight SDK をアンインストールしておいてから VS2010 を入れた方がいいみたいな感じです。
(あとから 3.0.40624 をアンインストールして 3.0.40818 を入れてもいいのかもしれませんが)

ちなみに 3.0.40818 の変更点は

  • .NET 3.5 との依存性を無くして .NET 4 しか入っていないときもビルドできるようにした。
  • xap 名に Unicode 以外の文字も使えるようにした。
  • リファクタリングとインテリセンスの向上。

とあります。


[Windows7] Windows 7 の 7

Windows 7 って何が 7 なの?ということで、

この CM だと Windows 1.0、Windows/286 2.x、3.0、98、XP、Vista、そして Windows 7 ってことらしいです。
あれ? 95 は? Me は? NT は? 2000 は?とかって無粋なことは聞かないようにw

まぁ、真面目な話、
@IT: 「Windows OSのバージョンを判別するには?【Vista対応】[2.0のみ、C#、VB]
にあるように API 的には Vista がバージョン 6 で、その次だから 7 なんですけどね。

Windows 7 とは直接関係ないみたいですが、こんなのもありました。
BBC NEWS: 「In Pictures: Windows into history
Windows 1.0、2.0、3.0、3.1、95、98、Me、XP、Vista、7 のスクリーンキャプチャが見れます。

2009/10/22 18:00 追記
安藤さんからコメントをもらって気付きました。
http://msdn.microsoft.com/ja-jp/windows/dd882526.aspx
なんかにあるように Windows 7 の内部バージョンは 6.1 です。
(RC を元に記述とあるけど RTM でも変わってないよね?)
内部バージョンが 6 である Vista の次の OS だから Windows 7 という名前になったのかもしれないけど、Windows 7 の内部バージョンは 6.1、ということみたいですからご注意を。


[C#] C# 4.0 の Indexed Properties

Indexed Properties in C# 4.0 より。
ええと、何やら C# 4.0 では

// before
excel.get_Range("A1").set_Value(Type.Missing, "ID");

// after
excel.Range["A1"].Value = "ID";

と書くことができるそうです。
Visual Studio 2010 beta 2 で対応しているとのこと。

ん?こんな機能あったっけ?
と思ったんですが、上記記事に 「C# 4.0 language specificationC# Future page にもまだ公開されてない。なぜなら、ごく最近デザインチェンジがあって実装されたから」 とかあります。

記事によると、Indexed Properties は、get_X()、set_X() を X[] として呼び出せるようにするシンタックスシュガーで、C# コンパイラが get_ もしくは set_ の呼び出しに置き換えるそうです。
また、パラメータはすべてオプショナルとのこと。そしてパラメータ無しの場合は [] 自体を省略できるし、[] を書いても合法だそうです。(省略できるってのはすごいな)

IDE のインテリセンスやパラメータヘルプなども対応済みとのこと。ただし、Quick Info はまだ get_ set_ 形式のものを表示するそうです。

うーん、まぁ、確かに get_ set_ はすっきり書けるようにはなりますが...
ところで、私は最初の例がそもそも理解できてません。
Value = “ID” は Value[] = “ID” と同じで、なので set_Value(“ID”) になるってのはわかります。
けど、何でそれが set_Value(Type.Missing, “ID”) と同じ意味になるんだろ?
C# 4.0 の Optional Arguments が使われてるとしても、あれは C++ と同じでパラメータの最後からしか省略できないはずですし。
Named Arguments が使われてるわけじゃないですし。
まさか型から引数の位置を推測するなんてことができるようになるわけじゃないですよね?
これって、単にサンプルの書き間違いで Type.Missing が余計だったってこと?
# Visual Studio 2010 beta 2 を入れてないので試せない orz


2009年10月21日水曜日

[Silverlight] Silverlight Toolkit October 2009 リリース

Visual Studio 2010 beta 2 のリリースにあわせて Silverlight Toolkit October 2009 がリリースされています。

変更点 の最初には VS2010 beta 2 をサポートとあるので、これが一番の変更点なのかな?
「VS2010 のすばらしいデザイン・タイム・エクスペリエンスを提供するためにすべてのコントロールがアップデートした」 そうです。
Silverlight (and WPF) Data Visualization classes unsealed [Silverlight Toolkit October 2009 release now available!]」 には VS2010 のデザイナがいいもんで Blend を使うのをやめちゃったデベロッパーもいる、なんてことが書いてありますねw

VS2010 対応以外にもチャートとドラッグ&ドロップ対応が大きいみたいです。
チャートのことはよくわからないので置いておいて、ドラッグ&ドロップについて。
Tim Heuer さんの 「Silverlight Toolkit adds DragDrop targets!」 にコード例なんかがあります。実際に動くサンプルは こちら
たとえば、ListBox だと、単に ListBoxDragDropTarget で囲んでやればドラッグ&ドロップできるようになるみたいですね。
今実装されているのは

  • ListBoxDragDropTarget
  • TreeViewDragDropTarget
  • DataGridDragDropTarget
  • DataPointSeriesDragDropTarget

とのこと。
(DataPointSeriesDragDropTarget って何かと思ったら、チャートをドラッグ&ドロップターゲットにするものみたいですね)


2009年10月20日火曜日

[Silverlight] Silverlight Streaming by Windows Live 終了のお知らせ

私は使ったことないんですが、http://silverlight.live.com/ の Silverlight Streaming by Windows Live が終了するそうです。
詳しいことは
Important News for Users of the Microsoft® Silverlight(TM) Streaming by Windows Live(TM) Beta October 2009
にあります。
どうやら Silverlight Streaming by Windows Live はそのうち終了で、2009年末にローンチ予定の Windows Azure ベースのものに移行するということみたいです。ただし、Silverlight Streaming を直接置き換えるわけじゃないし、Azure はコストも必要になるなどいろいろと違うとかなんとか。

あと、Silverlight Streaming by Windows Live にあるコンテンツは各自ダウンロードしておいてくれということでその手順が載っています。


[VS2010] Visual Studio 2010 beta 2 リリース / 正式版は 2010年3月22日

あいかわらず Visual Studio 2010 をさわったことないんですが...

Microsoft のプレスリリース: Visual Studio 2010 and .NET Framework 4 Deliver Beta 2 in Final Stretch to March 22 Launch
Visual Studio 2010 beta 2 が本日 10/19 にリリース。
正式版は 2010/03/22 にローンチだそうです。

■ beta 2 で変わったところ
Somasegar’s Weblog: Announcing Visual Studio 2010 and .NET FX 4 Beta 2 より。
いろいろと VS2010 の追加点が書かれているのでざっとあげてみると、

  • beta 2 には SharePoint 2010 用のツールが統合されてる。
  • Windows 7 アプリケーション開発をサポートするランタイムとツールも含まれている。
  • 新しい Windows Azure ツールテンプレートで Windows Azure アプリの開発を始めるのが簡単になる。
  • Silverlight 3 データバインディングのサポートが向上したのでコードを書くのに専念できるようになる。(プレスリリースの方にはドラッグ&ドロップでデータバインドできるようになる、とある)
  • VS2010 のすべてのバージョンに Team Foundation Server が含まれる。
  • ソースコントロールやバグトラッキング、自動ビルドなどを小さなチームでも使える。
  • TFS Basic はシンプルでスリム。サーバやクライアント PC にインストールできる。

とかなんとか。

■ VS2010 のラインナップ
VS2010 は

  • Express
  • Professional
  • Premium
  • Ultimate

というラインナップになる模様。
詳細は http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx#compare など。

■ Go Live ライセンス
“Going live” with Visual Studio 2010 Beta 2」 によると、beta 2 からは go live ラインセンスなんですね。

■ F#
F# Beta 2」 によると、VS2010 beta 2 に含まれている F# は beta 2 だそうです。
あと、VS2008 用の F# CTP もアップデートしたそうです。

■ ロゴマーク
↓のロゴマークですが、

visualcsharp_2.png.jpg

VS2010 Beta2, and two loops too」 によると 「メビウスの輪じゃないよ」 とのことです。
(どうでもいい情報かもしれませんがw)


2009年10月16日金曜日

[Windows7][WPF] キャプションバーの無いウインドウでエアロシェイク

Implementing Aero Shake in a WindoStyle None WPF Window より。
Windows 7 でキャプションバーをふるふるするとそれ以外のウインドウが最小化してくれるエアロシェイク、あれってキャプションバーが無い時どうすんの?という話。

記事では WPF で WindowStyle=”None” としてキャプションバーが無いウインドウを作っています。
で、単に MouseLeftButtonDown イベントで DragMove() メソッドを呼び出してやればいいそうです。
すっごい簡単。
けど、こんなの知らないとわかんないな(笑)
ちなみに、この場合、キャプションバーをドラッグしてるのとほとんど同じ動作をするようです。なので、エアロシェイクに対応するだけでなく、ウインドウを移動できるようにもなっちゃいます。

ちょっと試してみましたが、もちろん Window だけではなく、たとえば TextBlock の MouseLeftButtonDown イベントで DragMove() を呼び出してやっても同じように動きました。

# Windows.Form のときは WM_NCHITTEST で HTCAPTION を返してやるとかかな?


2009年10月14日水曜日

[WindowsCE][Silverlight] Windows Embedded CE 6.0 R3 の Silverlight for Windows Embedded って Silverlight なの?

前に書いた 「[WindowsCE][Silverlight] Windows Embedded CE 6.0 R3 が RTM。そしてこいつには Silverlight が入ってる」 で Windows Enbedded に Silverlight for Windows Embedded なるものが入っていると紹介しましたが...
その記事でも 「MonoTouch みたいにネイティブコードにコンパイルしてから動かすということは無いんじゃないかと思ってるんですがどうなんでしょ」 とか書いたんですが...

InfoQ: 「Windows Embedded CE向けSilverlightは本当のSilverlightではない

ネイティブコードにコンパイルどころか、初めからネイティブな C++ しかサポートされないそうです。
また、Silverlight for Windows Embedded は完全に新しい API セットだそうです。
えーと、これのどこが Silverlight ?

Silverlight for Embedded tutorial
こちらに Silverlight for Windows Embedded のコード作成例が紹介されています。
最初に簡単な XAML を Expression Blend 2 で作成。
Blend は C# と VB にしか対応していないのでソースコードを作成しちゃダメとのこと。イベントハンドラなんかが作成されないようにオプションの Visual Studio との統合をオフにしちゃえだそうです。
続いて Platform Builder で Win32 アプリケーションプロジェクトを作成して、プロジェクトにリソースを追加、リソースにカスタムリソースとしてさっき作った XAML ファイルをインポート、という手順で XAML ファイルをとりこんでいます。
あとはコードを書けば OK。
記事に載っているコード例を見ればわかりますが、IXRApplication やら IXRVisualHost やら IXRFrameworkElement やらといったバリバリの COM の世界です。イベントハンドラの戻り値も HRESULT だし。デリゲートもメンバ関数ポインタを渡して作るんですね。(デリゲートも COM なので、使い終わった後に Release() してやらないといけないのがなんとも)

うーん、確かにインターフェースは似せてあるようなので、COM バージョンの Silverlight だと言われればそんなような気もしますが...
けど、それって Silverlight なの?
少なくとも 「C# や VB で Silverlight アプリを作れます」 と言う人が C++ や COM の知識無しに Silverlight for Windows Embedded に手を出すと大変な目にあいそう。
CE 上のアプリをネイティブ C++ で書いていたような人にとっては 「COM ベースの UI フレームワークが増えただけ」 と言う感じなのかな?


2009年10月2日金曜日

[MSMVP] Microsoft MVP を受賞できませんでした

すでに Twitter でつぶやいてるし、だいたいの人はご存じだと思うんだけど、一応書いときます。
# ちなみに私の Twitter アカウント http://twitter.com/ShinichiAoyagi

2002年 10月から今まで続けて Microsoft MVP を受賞してきましたが、残念ながら今回は受賞できませんでした。
まぁ、ここ一年はオンライン・オフラインともにほとんどコミュニティ的な活動はありませんでしたからね。
自分でも 「今回は無理だろうなぁ」 と思ってたんですが、やっぱり無理でした。

とはいえ、私自身は今までと変わらずやっていくつもりですのでこれからもよろしくお願いします。


2009年9月30日水曜日

[Silverlight] Silverlight 3 FireStarter のビデオが公開されてた

2009/9/17 にレッドモンド (MSCC) で開催された Silverlight 3 FireStarter のビデオが公開されました。
http://www.msdnevents.com/firestarter/

当日のセッションスケジュール
Silverlight-3 FireStarter…

あと、セッションで使われた PPT がこちらにあります。
Silverlight-3 FireStarter Slides…


2009年9月24日木曜日

[WindowsCE][Silverlight] Windows Embedded CE 6.0 R3 が RTM。そしてこいつには Silverlight が入ってる

Microsoft Delivers Rich User Experiences and Windows 7 Connectivity With New Windows Embedded CE Release より。
2000/9/22 付けのプレスリリースですが、Windows Embedded CE 6.0 R3 が RTM したそうです。
そしてこいつには Silverlight for Windows Embedded が入ってるそうです。
というか、「革新的な Silverlight for Windows Embedded ユーザインターフェース (UI) フレームワークを通して Silverlight のリッチなアプリケーションエクスペリエンスを提供する」 なんてあるので UI 部分の中核を Silverlight が担っているかのような印象を受けます。(Windows Embedded のことをよく知らないので大ウソの可能性ありw)

この Silverlight for Windows Embedded というのは out-of-browser で Microsoft Silverlight テクノロジのネイティブコード実装だそうです。
Windows 自体も普通の Windows とはいろいろと違うでしょうし、初めから out-of-browser 前提だったりと、きっと Silverlight for Windows Embedded は普通の Silverlight とはいろいろと違うんでしょうね。
けど、どうやら開発環境は Visual Studio や Expression Blend ということみたいなので、マネージドコード自体は同じということになるのかな?
(MonoTouch みたいにネイティブコードにコンパイルしてから動かすということは無いんじゃないかと思ってるんですがどうなんでしょ)

ちなみに、この Windows Embedded がどんなところに使われるかですが、記事にはスマートフォンや Windows ベースの小型ノートブックなどが例にあげられています。
まぁ、私は 「Windows Embedded と Windows Mobile ってどう違うの?」 というレベルなのでイマイチよくわかってないんですが。


2009年9月18日金曜日

[Silverlight] Wiki-OS がバージョンアップして Silverlight になってた!

先日、「[.NET][Internet] Wiki-OS ... すげぇ!!」 で紹介した Wiki-OS がバージョンアップしたそうです。
https://www.wiki-os.org/
さらにすげぇ!

Wiki-OS completely rewritten in Silverlight! Cross-platform, categories, ability to embed applications, and more」 によると、今回 Silverlight 3 で完全に書き直したそうです。
元は WPF (xbap) だったため .NET Framework 3.0 以上がインストールされた Windows 上でしか動きませんでしたが、Silverlight になったため Windows、Mac OS で動くようになったそうです。(Linux はもうすぐとのこと)

さっそくアクセスしてみたところ、あちこちがアニメーションするようになっていたり、デザインが変わっていたり、いろいろと変わっているようです。ただ、XAML・C# をエディットするアプリがえらく簡素なものになっていたりと 「あれ?」 と思うところもあります。まぁ、developer preview と書いてありますし、まぁ、そういうことでしょう。
ちなみに、アプリケーションの作り方 (クラスライブラリとか) なんかも Silverlight に合わせて変わっているみたいです。

あと、今までアプリケーションへのリンクがありましたが、アプリケーションを embed する機能が追加されています。
これはちょっとおもしろいかも。
Wiki-OS 上に Silverlight アプリを作って、それを自分のブログに貼り付けたりできるわけです。
まぁ、今の Wiki-OS だといつの間にか他の人に改造されちゃったりするわけですがw (けど、それはそれでおもしろいかも)
この embed は <object> タグを埋め込むことになりますので、一応 enableHtmlAccess を true にはしない方がいいんじゃないかと思います。(これを true にすると Silverlight アプリから HTML DOM にアクセスできるようになる)
もちろん、Wiki-OS が表示する埋め込み用 HTML には enableHtmlAccess の指定はありません。(なのでデフォルトの false になります)
参考 MSDN ライブラリ:「HTML ブリッジのセキュリティ設定

というわけで、以下、試しに Calculator を貼り付けてみるテスト(うまくいくかな)


2009年9月15日火曜日

[.NET][Internet] Wiki-OS ... すげぇ!!

https://www.wiki-os.org/
これはすごいな。

どうやら .NET Framework 3.0、WPF で作られているようなので実行にはそれらが必要です。
(ブラウザ上で動きますが、本体は xbap みたいです)

アカウントが無くても左下の “Applications” から Calculator (電卓) とか Cube 3D (四角形がグリグリするデモ) とかいろいろと実行できます。
と、これだけだと普通の 「ブラウザ上に作ったデスクトップ環境」 ですが、すごいのはこれらのアプリが編集できちゃうってとこ。

ただ、編集するにはアカウントが必要なようです。
左上の “Create an Account (free)” でアカウントを作成できます。
(メールアドレスなんかを入力して OK するとアクティベーションコードが書かれたメールが送られてくるのでそいつを入れてやります)

左下の “Applications” の “Create New Project...” で新規にアプリを作成できます。
アプリは XAML と C# コードで作ります。
編集画面も Visual Studio 風なので WPF とか Silverlight とかをやったことのある人ならだいたいわかるんじゃないかと思います。
また、各アプリのタイトルバーにある “edit” をクリックすればそのアプリを変更することができます。
そう、既存のアプリを自由に変更できるんです。(ただし、Accounts Manager などクリティカルなアプリは一般ユーザでは変更できないようになっています)
もちろん、アプリの変更はすべての人に影響します。
誰かが電卓に機能追加してくれればそれをみんなが使うことができるわけです。
”Applications” の “View All...” に他の人が作ったものも含めてすべてのアプリが載っています。
誰がいつどんな変更をしたのかはタイトルバーの “menu” の “View History of Changes...” を見ればわかりますし、”Applications” にある History アプリを使えばすべての変更履歴を見ることができます。
また、この History ウインドウの “Undo Selected” を使えば変更を元に戻すことができます。

いやぁ、この発想はすごいなぁ。
確かに Wiki OS だわ。
こんな発想、どっから思いつくんだろう。


2009年9月9日水曜日

[IIS][Silverlight] Live Smooth Streaming もうすぐリリース (was: マイクロソフト、「Silverlight 4」の詳細を明らかに)

最初に見たのは CNET Japan の 「マイクロソフト、「Silverlight 4」の詳細を明らかに」 というニュース。
Silverlight 4 の詳細が明らかになったんだったらぜひ知りたいところだけど、Silverlight 4 に関係ありそうなのは 「オフラインコンテンツ向けにも「PlayReady」デジタル著作権保護(DRM)技術のサポート機能を拡大する」 という部分だけって感じでイマイチよくわからない。
ブラウザ上で動く Silverlight がどうオフラインコンテンツと関係するのかもよくわからないし。

原文の方の 「Microsoft offers some Silverlight 4 details」 を見ても書いてあることはほとんど同じみたい。

で、おぎわらさんのところ で元ネタが Microsoft PressPass (Microsoft からのプレスリリース) の 「Microsoft Raises the Bar for Delivery of Live HD Online Video Using HTTP」 だと知った。
ん~、CNET の記事とはずいぶんイメージが違うな。

このプレスリリースって Live Smooth Streaming に関することが主で、その関連で Silverlight とか Silverlight 4 の話が出てきてるだけですね。

どうやら、今まで IIS Smooth Streaming と呼ばれていたものは Live Smooth Streaming と呼ばれるようになったみたいです。
そして、Live Smooth Streaming を実現するためのサーバ (IIS のアドオン) が IIS Media Services 3.0 というもので、これは 30日以内くらいにリリースされる予定とのこと。
また、9/11~15 にアムステルダムで開催される International Broadcasting Conference (IBC) で Silverlight 4 で作られた最新のメディア機能をプレビューするそうです。
この Silverlight 4 には、ネイティブなマルチキャストサポートや Microsoft PlayReady テクノロジによるオフラインなデジタル著作権管理 (DRM)サポートなどが含まれているとのこと。
加えて、IIS Smooth Streaming Transport Protocol と Protected Interoperable File Format (PIFF) 仕様を Microsoft Community Promise の元でリリースするとのことです。

一応書いておくと IIS Media Services 3.0 による Live Smooth Streaming のクライアントは Silverlight 3 です。
Silverlight 4 ではさらに進化するのかも知れませんが、Silverlight 4 までお預けということではありません。

後半に Silverlight 4 についてもうちょっとだけ書かれています。
IBC では Silverlight 4 のメディア機能の早期プレビュー版のデモをするようですが、これはオフライン PlayReady DRM の拡張と out of browser によって次世代のムービー視聴体験ができるようになることを示すそうです。
これらの機能によって、デジタルコピーやインターネット経由での配信であっても、消費者が DVD やブルーレイで得ていたのと同じようなリッチでインタラクティブなエクスペリエンスをムービー製作業者や小売業者が提供することが可能になるそうです。また、ムービー製作業者がネットワーク経由での更新や特典、生のイベントを提供したり、過去にムービーを購入した消費者との関連を強化したりできるようになるそうです。(この辺の英文はあまり自信がありません)

ちなみに、CNET のニュースでは 「offline content」 となっていますが、プレスリリースにはそういう言い回しは無く、あるのは 「offline DRM」 もしくは 「offline PlayReady DRM」 です。
特に後者はそのあとに 「and out of browser capabilities.」 と続いています。
普通に考えて 「オフラインコンテンツ向け」 じゃなく 「オフラインでも動作可能な DRM」 という意味なんじゃないかと。
特に out of browser と組み合わせればオフラインであっても DRM が働いたうえで Silverlight でムービーが視聴できるということなんじゃないかと。

あと、IIS Media Services 3.0 のリリースと同時にデベロッパ向けに Smooth Streaming player 開発キットのベータ版が提供されるそうです。
この開発キットではテンプレートを使ってカスタムプレイヤーを簡単に作ることができるとのこと。


[Silverlight] Silverlight 4 に欲しい機能は?

Silverlight feature suggestions より。
どうやら Silverlight 4 にどんな機能を盛り込むか意見募集中ということみたいです。
Tim Heuer 氏からは “Do you have a need to convert Flash applications?"、"How do you prefer to learn Silverlight?"、"Are you using the provided Silverlight Toolkit themes in your applications?" という 3つの問いが載っています。(1番目と 3番目は投票できるようになっています。2番目のはブログにコメントして欲しいとのこと)

あと、Silverlight Feedback Forum なんてものもあります。
見ればわかるとおりフォーラムというよりは投票所で、一人 10票まで投票できます。


2009年9月2日水曜日

[.NET] All-In-One Code Framework がアップデート

以前に 「[.NET] All-In-One Code Framework ってなんぞ?」 で紹介した All-In-One Code Framework が 2009/08/26 にアップデートしたそうです。

交信内容は
http://cfx.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=32006
にあります。
Windows 7 のサンプルなどいくつかのサンプルが追加されています。

って言うか、今まで全然気づいてなかったんですが、2009/07/30 には Silverlight 3 だとかいろいろ追加されてますし、結構頻繁にアップデートされてたんですね。


[Silverlight] Silverlight 3 がマイナーアップデート

Silverlight minor update released today」 によると Silverlight 3 が GDR 2 (3.0.40818.0) にマイナーアップデートしたそうです。
更新履歴が http://www.microsoft.com/silverlight/resources/technical-resources/ の “Deployment/IT Administration" をクリックして、"Release History" にあります。
これによると

  • Unicode キャラクターサポートの拡張。特に GB18030 について。
  • ネットワークパフォーマンスの向上。
  • ビデオシーキングの向上。

だそうです。
Tim Heuer 氏の記事の感じでは GB18030 がらみが主なのかな?

ちなみに、Silverlight Tools には更新は無いけど、Silverlight SDK はアップデートされてるようです。
また、development runtime も更新されています。
...と、あるんですが、日本語版も同時に更新されるんだろうか?

あれ?
http://msdn.microsoft.com/ja-jp/silverlight/
の 「Silverlight 3 ソフトウエア開発キット(SDK)」 のリンクをクリックすると ページが見つかりません になっちゃうな。更新中?


2009年8月28日金曜日

[Silverlight] Popfly Game Engine のソースコード公開

2009年 8月 24日をもって終了してしまった Popfly ですが、その一部のソースコードが CodePlex にて公開されたそうです。
http://popflygameengine.codeplex.com/

Popfly Parting Present」 によると、Microsoft 内の Web サービスと密に結びついていたり、他のプロダクトからのコードを含んでいたり、MS データセンター無しでは使いようが無かったり、といろいろな理由で Popfly の大部分のソースコードは公開することが不可能とのことです。
公開された Popfly Game Engine はゲームデータファイルを読み込んで実行する部分とのこと。
クリエータ (ゲームデータファイルを作る機能) は含んでませんが、データファイルを作るのに参考となる情報は十分に含まれているそうです。
また、サーバと通信するような機能 (ハイスコアやバッジといったものをサーバに保存するような機能) に関する部分も含まれていないとのこと。
しかし、Silverlight, C# でシンプルなゲームエンジンを作る方法を示したコードとしておもしろいものであると思っているとのことです。


[Silverlight][HTML5] uuCanvas.js - HTML 5 の &lt;canvas&gt; を Silverlight で実装

昨日の 「[Silverlight][HTML5] HTML 5 の <canvas> を Silverlight で実装してみたって。。。その発想は無かった」 にコメントを頂きました。

nitoyon さんより

日本でも同じようなことを試してるかたがいらっしゃいます!
http://d.hatena.ne.jp/uupaa/20081114/1226596120

こりゃすごい。
この記事にある 「Silverlight による HTML5::Canvas の実装」 は uuCanvas.js として↓にまとめられています。

http://uupaa-js-spinoff.googlecode.com/svn/trunk/uuCanvas.js/README.htm
uuCanvas.js は HTML 5 の <canvas> をサポートするための JavaScript ライブラリなんですが、Chrome、Safari、Opera、Firefox ではそれぞれのブラウザが持つ <canvas> を、IE では Silverlight で <canvas> 相当の機能を実現するようになっています。(IE で Silverlight が入っていない場合は VML を使うようになってるそうです)
なので、ちょっとしたお約束を守っておけば同じ HTML で IE でもそれ以外でも <canvas> を使うことができます。
詳しいことは uuCanvas.js のサイトを。
また、いろいろなデモもあります。

昨日紹介した記事にも “Aside: Yes, I know I'm not the first person to add <canvas> support to IE. :)” なんてありましたから、いろんな人がいろんな方法で <canvas> を実装したりしてるんでしょうね。
私は、昨日の記事を書くときに 「へぇ、<canvas> ってこういう機能なのかぁ」 と初めて <canvas> のことを知った (それまでは名前しか知らなかった) ような人なのでまったく知りませんでした。


2009年8月27日木曜日

[Silverlight][HTML5] HTML 5 の &lt;canvas&gt; を Silverlight で実装してみたって。。。その発想は無かった

Using one platform to build another [HTML 5's canvas tag implemented using Silverlight!] より。
Microsoft の Silverlight と WPF のデベロッパの方のブログですが、HTML 5 の <canvas> を Silverlight で実装してみたそうです。
いやぁ、すごい。
つか、その発想は無かったな。

記事にはいろいろと <canvas> を表示させてみたスクリーンキャプチャが貼り付けられています。
ただ、さすがにネット上のページを自由に表示できるというわけではなく、自分で HTML を画いてる必要があります。
まずは、<head> の中あたりにでも

<script type="text/javascript" src="Html5Canvas.js"></script>

と追加してやります。
そして、たとえば、

<canvas id="canvas1" width="150" height="150"></canvas>
<script type="text/javascript">
function draw() {
var canvas = document.getElementById('canvas1');
:
}
</script>

という風に <canvas> が使われていた場合は、<canvas>~</canvas> を

<script type="text/javascript">
InsertCanvasObject("canvas1", 150, 150, draw);
</script>

と置き換えてやります。
<canvas> を操作するための JavaScript たち (上記の draw() 関数など) はそのままで OK です。
これで InsertCanvasObject のところに Silverlight アプリが作られて、その中から draw() 関数が呼び出されます。

また、<canvas> の仕様をすべて実装したというわけではないそうです。
Mozilla のサンプルページの最初の 5ページを動かすのに十分な分だけサポートされているそうです。(たぶん Mozilla Developer Center's Canvas tutorial のことだと思う)
また、記事の最初の方に

  • Paths and shapes (move/line/curve/arc/clipping/etc.)
  • Strokes and fills (using solid colors/gradients/images/etc.)
  • Images
  • Context save/restore
  • Transformations (scale/rotate/translate/etc.)
  • Compositing (alpha/blending/etc.)
  • Text (font/alignment/measure/etc.)
  • Pixel-level manipulation
  • Shadows

というリストがありますが、これのイタリックになっているものは何も実装していないそうです。

ソースコードは記事の下の方にある "[Please click here to download the complete source code to Html5Canvas and the sample application shown above.]” というリンクからダウンロードできます。
Html5Canvas.Web プロジェクトを 「スタートアッププロジェクトに設定」 して、TestPage.html を 「スタートページに設定」 して実行すればサンプルページが開きます。
ちなみにソースは Ms-PL とのこと。

ちょこっとだけソースを見てみました。
CanvasRenderingContext2D.cs が処理のほとんどを行ってるんですが、思った以上にシンプルです。
というか、<canvas> の fillRect は XAML の Rectangle に、drawImage は Image に、Path は PathGeometry に、というようにほぼ単に XAML に置き換えてるだけなんですね。
記事にも <canvas> のことを調べてたら Silverlight でネイティブにサポートされているのと同じものが多いと思ったというようなことが書いてありますが、ほんとにそうなんですね。


[Silverlight] Parallel で最適化してみる例

Silverlight 3 のサンプルを Parallel で最適化してみたという例がなかなかおもしろかったので紹介。

もともとは 「Flirting With Silverlight」 にある Silverlight 3 のサンプルです。
(「ActionScript に比べてどうよ?」 みたいなところから始まっているようですが、そのあたりはここでは割愛)
”Example” が Silverlight 3 アプリへのリンクになってます。
見てもらえばそのままですが、これは WriteableBitmap にパーティクル(点々)を描いてみるというサンプルです。
マウスを乗っけるとグリグリと動きます。

このサンプルを Parallel を使って並列化してみたというのが 「Adding Concurrency Optimization in Silverlight 3」 です。
並列化と言ってもそんなに難しいことはしていません。
まず、.NET Framework 4.0 に追加される予定の Parallel.For をまねて ParallelFor メソッドを作ります。
この ParallelFor メソッドは記事に丸ままコードが載っています。
次に、OnStoryboardCompleted メソッドの中の 2ヶ所のループをこの ParallelFor を使うように変更します。
変更結果も記事に載ってますので、ここでは要点だけ。

まずは、

while (--index > -1) 
bitmap.Pixels[index] = 0x000000;

というループ。
これは WriteableBitmap の全ピクセルを 0x0 で埋める、すなわち、真っ黒に塗りつぶすためのコードです。
これを単に ParallelFor を使ったループに変更します。

もうひとつは

while (null != particle)
{
x = particle.X;
y = particle.Y;
z = particle.Z;
:
}

というループ。
こちらは ParallelFor できるように以下の修正を加えたそうです。

  • w、xi、yi といったループの外で宣言されているけど、実はループの中でしか使っていないというローカル変数をループの中に移動。
  • 元のコードでは particle という線形リストになっていたものをあらかじめ配列に格納しておいてそちらを参照するように変更。

コードを見比べてもらえばわかりますが、並列化できるようにしたって言うだけでそんなに大した変更ではありません。

さて、結果です。
OnStoryboardCompleted メソッドは 1フレーム描画するたびに呼ばれるようですから、この 2ヶ所を並列化しただけでもそれなりに効果があります。
記事前半にある “Silverlight Version, optimized to leverage Concurrency” が Silverlight アプリへのリンクになってます。
このアプリではスライダでいくつのスレッドで並列化するのか指定することができるようになってます。
私の環境だとスレッド数 1 だと 34fps くらい、スレッド数 8 だと 89fps くらいでした。
Core i7 で論理コア数 8 なんですが、スレッド数を 8 にした状態でタスクマネージャで見ていると、きちんとすべてのコアが動いてます。
けど、スレッド数をそれ以上に増やすとなぜか fps も下がって、しかも寝ているコアが出てきます。
うーん、なんかコアをうまく使えてないような。

ということで、スレッド数を多くした時の挙動はアレですが、論理コア数と同じスレッド数にしているときにはかなりのパフォーマンス向上が見込めそうです。
もちろん、論理コアがもともと 1しかないような場合にはオーバーヘッドの分だけパフォーマンス低下があるかもしれませんが。

ちなみに、ソースコードは記事の最後の方にある “Strange Attractor Project” というリンクからダウンロードできます。
大元の記事のコードでは StoryBoard で OnStoryboardCompleted を呼び出すというやり方でしたが、OnStoryboardCompleted メソッドが HandleRendering と改名され、CompositionTarget.Rendering イベントで HandleRendering を呼び出すというように変更されています。
StoryBoard だと最大 fps で動かせないでしょうからね。


2009年8月24日月曜日

[VS2010] Visual Studio 2010 のスタートスクリーンをカスタマイズする

Customizing the Visual Studio 2010 Start screen より。
Visual Studio 2010 のスタートスクリーンをカスタマイズする方法が紹介されています。
スタートスクリーンも XAML で書かれているそうです。

(一部のみ抜粋して翻訳)

試すには、まず 「Documents\Visual Studio 10」 フォルダの下にでも 「StartPages」 フォルダを作る。
そして、「Microsoft Visual Studio 10.0\Common7\IDE\StartPages」 フォルダの内容をコピーする。
VS2010 でプロジェクトを開いて、後は自由に編集!

スタートスクリーンのルートは 3つの行の Grid になっている。最初の行は Visual Studio のロゴを、3つ目の行は RSS フィードコントロールを含んでいる。すべてのアクションは真ん中の行にある。注意:真ん中の行はカスタムの VS コントロールを含んでいる。これは次のベータでまたカスタマイズされて置き換えられるだろう。

で、Border の Background を変えて背景色を変えたり、リンクを追加してみたりといった変更例が載っています。
あれ?変更した後にどうすればいいのか書いてないんですが、単に 「Microsoft Visual Studio 10.0\Common7\IDE\StartPages」 フォルダに XAML ファイルを放り込んでやればいいのかな?
# あいかわらず VS2010 を見たこともないので自分では確認できないです

さぁ、これで、きっと誰かがスタートスクリーンを痛IDE化してくれるはずw


2009年8月20日木曜日

[C#] Spec# が CodePlex に登場

Microsoft Research にあった Spec# が CodePlex に登場してました。
http://specsharp.codeplex.com/
と言っても、チュートリアル は 「もうすぐ」 と書いてあるだけですし、ドキュメントは Microsoft Research の方を見てくれ、とかそんな感じなんですが。

Spec# というのは C# に契約指向? (contract oriented) な機能を追加したものです。
Eiffel に 「表明」 と呼ばれる機能がありますが、あんなやつです。
Generics みたいに Microsoft Research で生まれて、その後本家 .NET Framework に取り込まれたものもありますが、Spec# が今後どうなっていくのかはわかりません。
F# も Microsoft Research 生まれですね。

以下、Spec# のわかりやすいところを紹介してみます。

■ NonNull

public Method(object! o)
{
...
}

こんな風に引数の型名に ! を付けると 「null であってはならない」 ことを表明できます。

■ PreConditions

public void Method(int a)
requires a > 0;
{
...
}

こんな風に requires でメソッド開始前の必要条件を指定できます。
「requires ValidString(s)」 みたいにチェック用メソッドを自分で定義してチェックさせることもできるようです。
で、条件を満たさない場合は RequiresException が発生する、のかな?(PPT にそう書いてありました)

■ PostConditions

public int Method(int x, int y)
ensures result == x + y;
{
return x + y;
}

こんな風に ensures でメソッド完了後の必要条件を指定できます。
上記の例では result キーワードを使って戻り値をチェックしてますが、他にもプロパティの値をチェックしたりといったことも書けるようです。
というか、requires と ensures には boolean を返す式をなんでも書けるんじゃないかと思います。

■ その他
Program Verification Using the Spec# Programming System [PPT] なんかを見ると他にもいろんな機能があるようです。
上記の例はいずれもメソッド単位のチェックですが、もっと細かくループ単位でのチェックだとか、反対にクラスのインスタンス単位でのチェックなんかもできるみたいです。


2009年8月18日火曜日

2009年8月7日金曜日

[Silverlight] WriteableBitmap のパフォーマンス

Silverlight 3 WriteableBitmap Performance Follow-Up より。
Silverlight 3 の WriteableBitmap のパフォーマンスが比較されています。
WriteableBitmap っていうのは、結局のところビットマップをバイト配列としてごにょごにょするわけですが、同じようなことができるようになっているクラスライブラリがいくつか公開されています。
それらのパフォーマンス比較です。
比較されているのは、

  1. Silverlight 3 の WriteableBitmap。
  2. オープンソースのゲームエンジン Balder の RawPngBufferStream クラス。
  3. Nikola さんの PngEncoder (Joe Stegman さんの改造バージョン)。
  4. Ian Griffiths さんの SlDynamicBitmap ライブラリ。
  5. Quakelight で使われている 8 ビット BitmapData。
  6. Silverlight 3 のピクセルセルシェーダー。

です。

記事に比較した結果も載ってますが、比較するための Silverlight アプリも貼りつけてありますので、実際に実行して自分の環境でどういう結果になるか試してみることもできます。
ちなみに、ソースもあります。

で、結果です。
1~5 では WriteableBitmap がもっとも速いそうです。
まぁ、ランタイムに組み込まれてるんですから当然という気はしますね。
5 の Quakelight は WriteableBitmap に近い速度が出るそうですが、これは 256色カラーのみに限定しているのでそもそも扱ってるデータ量が違いますからね。
そして、特筆すべきは 6 のピクセルシェーダーです。WriteableBitmap の 10倍の速度が出ています。
ピクセルシェーダーと言うと、既存の画像を加工するものというイメージがありましたが、今回のように計算によって描画できるものであればピクセルシェーダーだけで絵を描いてしまうこともできるわけですね。

記事にはこうあります。
「ピクセルシェーダーは GPU で実行されているわけではないけれども、他のものと比較するとかなり速い。プロシージャルな画像 (計算によって描ける画像) ならばピクセルシェーダーを使うのがお勧め。ただし、Silverlight 3 では制限付きのシェーダーモデル 2 がサポートされているのみということは忘れないように。あと、Silverlight 3 のピクセルシェーダーはマルチコア CPU だと自動的に並列実行されることに気付いた。デュアルコアのマシンだとシングルコアのマシンの 2倍くらいのフレームレートが出ていた。Silverlight でのソフトウエアシェーダーの実装が並列化されているのはまったく正しいし、特別なことではない。シェーダーは GPU 上では並列に実行されるようにデザインされている。」

Silverlight 3 のピクセルシェーダーは GPU で動いているわけではないっていう話だったのになぜ速いんだろうと不思議だったんですが、この自動的に並列化されているっていうのがミソなのかな?
もともとシェーダーランゲージは GPU の中で並列実行されるのが前提ですし。
もしかしたら、WriteableBitmap へのアクセスをうまく並列化してやればピクセルシェーダーを超えるパフォーマンスを出せるかもしれませんね。


2009年8月6日木曜日

[Silverlight] GPU アクセラレーションの RenderAtScale

さっきの記事 「[Silverlight] Re: Smooth:ハードウェア・アクセラレーターの動作確認」 をポストしたあとに RenderAtScale なんていうすばらしいものがあることに気付きました。

さっきの記事でも参考にさせてもらった András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の後半の “Render At Scale” より。

ざっと訳してみます。
「Silverlight はベクタベースのグラフィックだけど、ビットマップキャッシングはビットマップベース。ビットマップとベクタグラフィックの主な違いは、ベクタグラフィックは品質を落とさずにほとんど無限に拡大できるってところ。一方、ビットマップは大きく拡大するとカクカクになっちゃう。こういったとき、GPU はバイリニアフィルタリングを適用してくれる。[訳注: ジャギーを減らすためにアンチエイリアスしてくれるってことですね]

カクカクがイヤな場合、BitmapCache の RenderAtScale をセットすることができる。

(コードで書く場合)
var bmc = new BitmapCache();
bmc.RenderAtScale = 4;
lion1.CacheMode = bmc;
(XAML で書く場合)
<Canvas>
    <Canvas.CacheMode>
        <BitmapCache RenderAtScale="4" />
    </Canvas.CacheMode>
</Canvas>

上のコードは Silverlight にライオンのベクタを 4倍のサイズでレンダリングするように指示している。ただし、これは 16倍の GPU メモリを要求することになり、キャッシュされたビットマップをレンダリングするのも遅くなる。RenderAtScale の効果は、サンプルの “GPU Acceleration” チェックボックスをオンにしておいて、”High Res Bitmap” をオンにすれば見ることができるよ。」

どうでしょ?
効果のほどはサンプルを見ると一目瞭然だと思います。
András Velvárt さんの 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 の下の方にデモへのリンクがあります。
最初は GPU アクセラレーションを使っていない状態。
これだと、ベクタグラフィックなので拡大されてもライオンちゃんはスムースです。

”GPU Acceleration” をオンにすれば GPU アクセラレーションが有効になった状態になります。
この状態だと、ライオンちゃんが拡大されているときはジャギジャギになります。
これは XAML に書かれたサイズのまま GPU によってビットマップキャッシュされて、それが拡大縮小表示されているためです。

ここで “High res bitmap” をオン。
すると拡大されているライオンちゃんもスムースになります。
同時にフレームレートのところに表示されている 2番目の GPU メモリの消費量が増えているはずです。
これが RenderAtScale=”4” の状態です。
すなわち、XAML に書かれたサイズの 4倍 (面積で 16倍) の大きさでビットマップキャッシュされて、それが拡大縮小表示されているわけです。

GPU アクセラレーションを使い、拡大表示も行うときは、RenderAtScale は重要なパラメータになりそうですね。


[Silverlight] Re: Smooth:ハードウェア・アクセラレーターの動作確認

シーラカンスさんの 「Smooth:ハードウェア・アクセラレーターの動作確認」 を見て私も初めて知ったこと。

まず、フレームレートを表示する
<param name="enableFramerateCounter" value="True" />
について。
これを True にしておくと左上に数字が 4つ表示されます。
Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 によると、左から

  1. フレームレート
  2. 使用されている GPU メモリのサイズ(キロバイト)
  3. GPU アクセラレートされているサーフェスの合計数
  4. GPU アクセラレートが明示的に指定されていないけど GPU アクセラレートされているサーフェスの数(これについては以下参照)

だそうです。

そして、次に
<param name="EnableCacheVisualization" value="True" />
について。
これを True にしておくと GPU アクセラレートされているところは普通の色で、されていないところは赤色で表示されます。
さらに加えて緑色で表示されるところもあります。
この緑色が何かなんですが、こちらも 「Discovering Silverlight 3 ? Deep Dive into GPU Acceleration」 によると、

Cache visualization shows cached objects in their natural color, and non-cached ones in red. Note that the control panel is above the lions. Therefore it also has to be cached on the GPU otherwise the GPU would not be able to blend it over the lions, and therefore the entire scene could not take advantage of GPU acceleration. We have not marked the control panel to be BitmapCached, so Silverlight has done this for us automatically. The control panel is thus an implicit surface, and displayed in green on the Cache Visualization.


(ざっとした訳)
Cache Visualization はキャッシュされているオブジェクトは普通の色で、キャッシュされていないものは赤で表示される。ライオンの上のコントロールパネルに注目。これも GPU でキャッシュされている。でないと、GPU はライオンの上にこれをブレンドできない。そうすると、シーン全体の GPU アクセラレーションのアドバンテージが無くなってしまう。コントロールパネルの部分には BitmapCache を指定していないけれども、Silverlight は自動的に BitmapCache を指定されていることにしてくれる。と言うわけで、コントロールパネルの部分は暗黙的なサーフェスということになり、Cache Visualization では緑色で表示される。

ということだそうです。
へぇ、良くできてるなぁ。
そして、enableFramerateCounter で表示される 4番目の数字がこの 「暗黙的に GPU アクセラレートされているサーフェスの数」 ということになるわけですね。

シーラカンスさんの記事 「11.ハードウエア・アクセラレーションの効果を見てみる」 のサンプルでも緑色になっているところがあります。
ただ、これらは BitmapCache が指定されているサーフェスと重なっているというわけではありません。
まったく試してもいないあてずっぽうな推測ですが、Button の方は BlurEffect が指定されているために自動的に GPU アクセラレートされているのかもしれません。
けど、Rectangle の方はどういう理由なのかよくわかりませんね。
暗黙的に GPU アクセラレートされる条件ってどっかに公開されてるのかな?


2009年8月4日火曜日

[Silverlight] seadragon.com のクライアント機能

昨日の 「[Silverlight] seadragon.com」 に Kei1 さんからコメントをもらいました。(ありがとうございます)
なかなかおもしろかったので記事にしてみました。

Kei1 さんに教えてもらった
Seadragon.com release!
によると、seadragon.com は Silverlight がインストールされていない場合は Seadragon Ajax が、Silverlight がインストールされている場合は Silverlight が使われるようになっているそうです。
もちろん、Silverlight がサポートされていないブラウザ / OS の場合も Seadragon Ajax が使われます。
Seadragon には iPhone 用の Seadragon Mobile もありますが、それについては何も書かれてませんね。

さっそく IE の 「アドオンの管理」 で 「Microsoft Silverlight」 を無効にしてアクセスしてみました。
Silverlight に比べるとカクつきますがそれなりにきちんと表示されます。
直リンクだけではなく、貼り付けてある場合もきちんと Silverlight の有無を判断してくれます。


2009年8月3日月曜日

[XNA][Silverlight] SilverSprite を使って XNA スターターキットの &ldquo;Platformer&rdquo; を Silverlight に移植してみた、そうです

Porting XNA starter kit "Platformer” to Silverlight (SilverSprite) より。
最初は XNA も SilverSprite もほとんどやったことなかったそうですが、XNA Game Studio 3.1 をインストールしてちょっとしたゲームを作ったりして試した後、XNA のスターターキットに入っている “Platformer” というサンプルゲームを SilverSprite を使って Silverlight で動くようにしてみたそうです。
そしたら、4時間くらいでできちゃったとのこと。

記事には実際に Silverlight 3 で動く Platformer へのリンクもあります。
(XNA 版と同じ構成なので 9Mバイトあるそうです。そのため読み込みにはちょっと時間がかかります)

また、ソースコードも置いてあります。
変更したところは “laumania” で検索すればわかるようになってるそうです。


[C#] C# 4.0 の covariance と contravariance

あいかわらず、Visual Studio 2010 をダウンロードすらしていない私ですが、、、

C# 4.0 : Co-variance and Contra-variance より。
こんなことできるようになるのか。

というか、できなかったんだっけ?
C# 2.0 で delegate の covariance と contravariance はサポートされたけど、ジェネリックな delegate の場合は厳密に型付けされちゃうんだっけ?
それが out, in の記法によって covariance、contravariance を明示的に指定できるようになるってこと?

なんか、もう、どのバージョンで何ができて何ができなかったのか良くわからなくなってきてるな(笑)


[Silverlight] seadragon.com

http://seadragon.com/ がオープンしたそうです。

と言いつつ、Seadragon ってなんだっけ?w
Seadragon の本拠地は http://livelabs.com/seadragon/ だと思うけど、DeepZoom がテクノロジーの名称で、Seadragon がアプリケーションの名称ってことなのかな?
DeepZoom を iPhone で表示するアプリの名前も Seadragon だったし。
で、今回の seadragon.com は DeepZoom な画像をホストしてくれるサイトってこと?

探したらあった。
Seadragon - Deep Zoom on Demand
「Microsoft LiveLabs は Seadragon.com のリリースをアナウンスした。これは Azure ベースのサービスで、DeepZoom 画像のホストをオンデマンドで作成することができ、超ハイレゾ画像のクイックリンクをものすごく簡単に作ることができる」
とあるので、どうやらそういうことみたい。

というわけで、やってみた。
http://seadragon.com/ で画像の URL を入れて Create ボタンを押すだけ。
試しに http://seadragon.com/create/ に例として載ってる画像で Create してみた。
すると、その画像の DeepZoom 版へのリンク、貼り付け用のタグ、Delicious・Digg・Facebook・Twitter へのポスト用のリンクが出てくる。
貼り付け用のタグを貼りつけてみたのが↓

ちなみに、画像の URL が同じ場合は毎回同じ結果になるようです。

2009年7月31日金曜日

[Silverlight] Silverlight 3 でマルチタッチ

Silverlight 3 Multi-touch: The Basics より。
Silverlight 3 はマルチタッチに対応してます。
と言うか、Windows の WM_TOUCH メッセージに対応していると言った方がいいのかも。
ちなみに、リファレンスを見るとわかるとおり WM_TOUCH メッセージは Windows 7 と Windows Server 2008 R2 以降となっています。なので、Silverlight 3 だからと言って、XP や Vista でマルチタッチできるようになるわけではありません。
さらに Silverlight はブラウザの上で動くわけですからブラウザにも依存するのかもしれません。
MSDN Library の Multitouch Input には IE8 が必要そうなことが書いてあります。Windows 7 なので IE7 という選択肢はそもそも無いのかも知れませんが、Firefox とかがどうなるのかはよくわかりません。

Silverlight 上での実装方法ですが、単に System.Windows.Input.Touch クラスFrameReported イベント を受け取るようにするだけです。
FrameReported イベントに渡される TourchFrameEventArgs の GetTouchPoints() メソッドなどでタッチされている座標などがわかりますので、あとは好きなように実装すれば OK です。

Silverlight 3 Multi-touch: The Basics にはデモ動画やサンプルコードもありますので、興味のある人は見てみては。


[Silverlight] 同じページ上に Silverlight 2 と 3 が両方ある場合の話

Silverlight Version Compatibility より。
ある一つのページ上に Silverlight 2 アプリと 3 アプリの両方が混在して存在した場合どうなるか、という話です。

Silverlight 3 プラグインがインストールされていれば、Silverlight 2 アプリも 3 アプリも Silverlight 3 プラグインの上で動くことになります。
そして、2 アプリは v2 “quirks mode” な AppDomain で、3 アプリは v3 “quirks mode” な AppDomain で動きます。

quirks mode について、Silverlight のプログラムマネージャである Tim Heuer 氏のブログに簡単にですが書いてありました。
Check your Silverlight 2 apps for compatibility with Silverlight 3 の “A word on quirks mode” のところ。
要するに Silverlight 3 の中には Silverlight 2 互換モードがあって、AppManifest.xml の RuntimeVersion が 2.0.31005.0 (Silverlight 2 のときのバージョンナンバー) であれば自動的にこの Silverlight 2 互換モードで動くようになっているということみたいです。

これら 2つの記事の内容をあわせると、Silverlight アプリごとに AppDomain が作られ、また、quirks mode は AppDomain ごととなっている、ということになりますから、一つのページに 2 アプリと 3 アプリが混在していても問題は発生しないようになっている、ということになるわけですね。


2009年7月30日木曜日

[XNA] DeskTopLive.xna

http://b-o-w.jp/events/dtl_xna/
なにこれ、行きてぇ!

上記のサイトは少々見にくい(笑)ので、もう少し見易いのを XNA Today さんより。
DeskTopLive.xna の開催内容が発表されました


[Office] PowerPoint で HLSL

HLSL in Office より。
PowerPoint のアドインを書いてみたそうです。
そのアドインとは、画像と HLSL のソースを読み込んで、その画像にエフェクトをかけてくれるというもの。
記事で紹介されているソースコードを見ると、HLSL ソースコードをファイルとして保存して、それを DirectX SDK に含まれている fxc.exe でコンパイルして、できたファイルのパスを WPF の PixelShader に渡してエフェクトをかけて、なんてことをしています。
あとは、PngBitmapEncoder で PNG ファイルにして、VSTO でごにょごにょして PowerPoint に画像を挿入しているようです。

まぁ、実用というより実験的なものなんだと思いますが (fxc.exe が必要なので DirectX SDK を入れとかなくちゃいけませんし) こんなとこにも HLSL が出てくるのかぁ、と思ったもので紹介してみましたw


2009年7月29日水曜日

[.NET] IDisposable をスレッドセーフに実装する

A simple and totally thread-safe implementation of IDisposable より。
IDisposable をスレッドセーフにするリファレンス実装。
Interlocked.CompareExchange を使って軽量にスレッドセーフにしてますが、やってることはごく普通にスレッドセーフにしているだけですね。普通に lock なんかを使っても意味は同じです。

正直、IDisposable をスレッドセーフにする必要を感じたことは無いんですが、何となく気になったので。

ちなみに、IDisposable の実装方法のガイドラインは↓にあります。
アンマネージ リソースをクリーンアップするための Finalize および Dispose の実装
ここにあるように Dispose() メソッドは何回呼ばれても大丈夫なようにしておかなくちゃいけません。
ただ、スレッドセーフにしろとはまでは言ってませんし、実際、Dispose() メソッドがスレッドセーフになっているクラスはほとんどないんじゃないかと思います。


[Silverlight] Silverlight 3 には ItemContainerGenerator があるのか

Silverlight 2 には ItemContainerGenerator が無いため自前で実装する方法を 「[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする」 で紹介しましたが、
ItemContainerGenerator in Silverlight 3
によると Silverlight 3 には標準で ItemContainerGenerator があるんですね。
まったく知らなかった。

ちなみに、Silverlight 3 版の Silverlight Toolkit も独自に ItemContainerGenerator を実装するのはやめてビルトイン版のものを使うように変更されているそうです。(自分では確認してませんが)


2009年7月27日月曜日

[Silverlight] Silverlight 3 で表示している内容を印刷する

"Printing" in Silverlight 3 with WriteableBitmap より
これはすごいな。

Silverlight で表示している内容のスナップショットを印刷する方法が紹介されています。
ブラウザの印刷機能を使えば Silverlight で表示している内容も含めて印刷してくれると思いますが、ここで紹介されているのはまったく別の方法です。

まず、WriteableBitmap クラスを使って Canvas をビットマップ化します。
(WriteableBitmap には UIElement を渡せるので Canvas でなくても何でもいいです)

続いて Joe Stegman 氏の PNG encoder の EditableImage クラスを使って上記のビットマップを PNG にして、そのバイト配列を Base64 化した文字列として取り出します。

この Base64 化した PNG 文字列を、あらかじめ HTML 上に用意してある <input type=”hidden”> な項目の value としてセットしてやり、サブミット (PostBack) してやります。

あとは、これをサーバで受け取って、PNG を組み込んだ PDF を作るなりなんなりしてレスポンスを返してやれば OK です。

なるほどなぁ。
実にすばらしい。


2009年7月14日火曜日

[Office] Office 2010 には無料の Web ブラウザ版もあるらしい

7/13 の Worldwide Partner Conference 2009 で Microsoft Office 2010 のテクニカルプレビューの発表があったそうで、情報がいろいろと出てきてますね。
その中に、無料の Web ブラウザ版の話もあります。
Excel、Word、PowerPoint、OneNote が IE や Firefox で動くというものです。
さすがにクライアントアプリ版と同じってわけではなく、それなりに低機能版らしいですが。

http://www.microsoft.com/office/2010/
の “Office Web Applications” のところにビデオがありますが、ちょこっと IE や Firefox で動いているところが見れます。
リボンなんかもあるようで、それなりに Office っぽいですね。
けど、これ、何で作ってあるんだろう?
Silverlight だったりしたらそれはそれでおもしろいような気がするんだけど。
と思ったら、Twitter で 「Office 2010 web apps - perhaps one of the most ambitious script# projects!」 なんてつぶやきが。
Script# ってことは Ajax なアプリなのか。


2009年7月13日月曜日

[Expression] Expression Encoder 3 ではスクリーンキャプチャができるようになるらしい

Windows Media エンコーダ 9 にはスクリーンキャプチャ機能があったのに、Expression Encoder には無くなっちゃってたんですよね。
それが 「What’s new in Expression Encoder 3」 によると、Expression Encoder 3 にはスクリーンキャプチャ機能が付くようです。
良く読んでないけど、他にも H.264 のサポートの向上とかいろいろと良くなってるみたい。


[Silverlight] Silverlight 3 正式リリース

アナウンス通り 7月 10日に Silverlight 3 が正式リリースされましたね。
まぁ、もう、いろいろなところで紹介されてるので今さら書くことは無いんですが(笑)

Silverlight 3 Released! What is new/changed?
こちらに beta 1 から変わったところが紹介されてたので、気になったところだけピックアップ。

  • テキストのレンダリングが進化したらしい。ここには書かれてないけど、他のブログで ClearType をサポートするようになったので文字がきれいになったし、小さい文字も読みやすくなったと書かれてるのを見た。
  • 今まで Silverlight Tools を入れると勝手に入ってた ASP.NET サーバコントロールの asp:Silverlight と asp:Media は無くなった。<object> を書けばいい。欲しけりゃ http://silverlight.net/learn/whitepapers.aspx にある。
  • アセンブリキャッシングは beta では Microsoft の特定のアセンブリのみキャッシュ可だったが、どのアセンブリをキャッシュするか自由に指定できるようになった。
  • DataForm は Silverlight Toolkit に移動した。
  • (記事には書かれてないけど) Blend SDK ってのもあるみたい。Blend 3 に一緒に入ってる or 別途ダウンロードも可。Behaivor とかを作るときに必要なものが入っている模様。

[MS] Office 2010 THE MOVIE

http://www.office2010themovie.com/

なんだこれwww
さすが Microsoft が本気出すと凄いなwww


2009年7月8日水曜日

[.NET][COM] 続:Marshal.ReleaseComObject の危険性について

[.NET][COM] Marshal.ReleaseComObject の危険性について」 の記事へのコメントで Jitta さんに 「More on ReleaseComObject (and why we did not implement IDisposable on the classes contained in the RCW)」 という続き的な記事があることを教えてもらいました。
せっかくなのでこちらも軽く紹介。

以下、「More on ReleaseComObject (and why we did not implement IDisposable on the classes contained in the RCW)」 より。

[厳密な訳ではありません。かなり大雑把ですし、一部英文の意味がよくわからないところもあります。正確なところはぜひ原文をご覧ください。なお、文字色や区切り線は原文にあわせてあります]


RCW に IDisposable を実装しなかったのは RCW が積極的に COM オブジェクトを Release することにリスクがあるからだ。それらのリスクの詳細は Yves blog link を参照して欲しい。


けど、それから誰かに聞かれた。


OK。RCW が IDisposable を使わないと決めたことに異議は無い。必要無いときに ReleaseComObject を呼ぶべきではないということにも同意する。

しかし、他の 2つの点について同意できないことがある。

RCW への参照を保持しているコードを ReleaseComObject したあとに使うことができないということ。

あるスレッドが ReleaseComObject を呼ぶときに他のスレッドが同じオブジェクトを使っていると、AV [アクセス違反のこと] が発生したりメモリがおかしくなったりすること。

#1 (前者のこと) は COM オブジェクトに限ったことではない。アンマネージリソースをカプセル化しているオブジェクトには同じことが言えるはず。たとえば、FileStream オブジェクトはクローズしたあとにリードやライトをすることはできない。しかし、FileStream は IDisposable を実装できないということはない。

#2 (後者) は私には理解できない。ReleaseComObject は IUnknown::Release を一度呼び出すんだよね?そうであれば、他のスレッドにどう影響するんだ?COM インターフェースをスレッド間でマーシャリングするとき CoMarshalInterThreadInterfaceInStream を呼びそれから CoGetInterfraceAndReleaseStream を呼ぶ。この結果オブジェクトの参照カウンタは一つインクリメントされる。オブジェクトがフリースレッドモデルで同じマルチスレッドアパートメントに属す 2つのスレッド間でマーシャリングするときは、確かに物理的に同じポインタを受け取ることにはなるが、その場合であっても参照カウンタはインクリメントされる。あるスレッドが ReleaseComObject を呼び、別のスレッドがそのオブジェクトを使っていたとしよう。ReleaseComObject の結果として参照カウンタは 1つデクリメントされるけれども、オブジェクトはまだ生きてるし、2番目のスレッドは普通に動く。なぜ AV やメモリがおかしくなると言ったことになるのか理解できない。


Dave の追加説明。


#1 について。他のマネージドコンポーネントも同じじゃないかということは正しい。しかし、RCW 自身が持っている COM コンポーネントを呼び出すたびに切断されていないかどうかをチェックするというコストを払いたくない。そのようにスタブは最適化されている。RCW はこの最適化された x86 スタブを通じてメソッドを呼び出すので、すでに ReleaseComObject を呼ばれている場合には AV の原因となり得る。こういったわけで、IDisposable を実装してるほとんどのマネージドコンポーネントの振る舞いよりもひどいことになってしまう。

#2 について。両スレッドが MTA ならばプロキシを取得する必要はないし、パフォーマンス的な理由で呼び出しのたびに COM コンポーネントの AddRef や Release を呼び出したりしない。この理由で、MTA スレッドから ReleaseComObject を呼び出すと別の MTA スレッドでメソッドを呼び出したときに COM コンポーネント内部で AV が発生したりプロセス全体の状態がおかしくなったりする。

結局のところ以下のような話なのかと思いました。

#1 の方を前回の記事と合わせて考えると、要するに 「ReleaseComObject でも IDisposable でもいいけど、もうちょっとうまいことできないのか?」 という話に対して 「COM の呼び出し部分ってなかなかそううまくいかない。だから IDisposable はやめた。ReleaseComObject は用意しておくけど不用意に使うと死ぬよ。だからコード書く人が十分に気を付けて ReleaseComObject を使うか、もしくは反対に何もせずにランタイムに任すかして欲しい。ランタイムに任せたときは GC によって解放された時かプロセスが終了するときに Release されることになるよ」

#2 の方はそれなりに COM のことがわかってないと意味わからないかもしれませんね。
COM の仕様上、呼び出し元も呼び出し先も MTA (と言うか、フリースレッドと言った方がいいのかな?) ならばマーシャリングする必要はありません。同じポインタを使い回して問題ありません。これがプロキシを取得する必要が無い理由です。
MTA の場合はスレッドをまたいでも同じポインタを使い回しているということなわけですから、結局のところスレッドまたぎかそうでないかはまったく関係ない話になって、#1 と同じ話ということになるわけです。

じゃ、MTA じゃない場合は?
この場合にスレッドを超えようと思うと COM インターフェースポインタのマーシャリングが必要になるし、スレッド間の通信は実はメッセージポンプがベースだったりとか COM の一番ややこしい世界に入っていきます。
なので、RCW がどうやって管理してるのかなんて私にはさっぱりわかりませんw
と言うか、あらためて考えてみたら、たとえば STA な COM インターフェースポインタを持っている RCW があったとして、その RCW がマネージドな世界で別のスレッドに渡された場合っていったいどのタイミングで CoMarshalInterThreadInterfaceInStream、CoGetInterfaceAndReleaseStream してるんだろう?
あれ?
RCW が自動的にこれらをやってくれるってことは無いのかな?普通の方法ではどうやっても無理なような気がする。。。
ひょっとして、Marshal.GetComInterfaceForObject なりでインターフェースポインタを取り出して自分で CoMarshalInterThreadInterfaceInStream、CoGetInterfaceAndReleaseStream してやらないといけないのかな?

7/8 19:50 追記
さっそく渋木さん、菊池さんからコメントとトラックバックを頂きました。(ありがとうございます)
MTA じゃない場合、というか、COM インターフェースポインタのマーシャリングについてはやはり RCW は一切何もしてくれないそうです。
両スレッドが MTA だった場合は COM の仕様的にマーシャリングが必要無いわけですから、結局のところ 「RCW はスレッドのことなんてまったく何も気にしていない」 ということになるかと思います。
なるほど、だから #2 の方は両スレッドが MTA の場合についてのみ論じれば十分なわけですね。
それ以外の場合はそもそも COM の仕様的に不正な呼び出しになってしまうため、ReleaseComObject がどうこうという以前の問題になってしまうわけです。


2009年7月7日火曜日

[Silverlight][Expression] Silverlight 3 と Expression 3 は 7月 10日ローンチ

News: Microsoft Silverlight 3 and Expression 3 Launch より。
Silverlight 3 と Expression 3 が 7月 10日(たぶん米時間) にローンチされるようです。
なんか、virtual launch event とか書いてあるから、どこかでイベントがあるんじゃなく、ネット上でイベントがあるってことなのかな?
http://www.seethelight.com/
ここでキーノートセッションや in-depth セッションなんかが見れるみたいです。
(今アクセスすると残り日数がカウントダウンされてます)

結局、beta 1 の後は何も出ずに RTW か。
ほんとに大丈夫なんだろうか?


[Silverlight] マイケル・ジャクソン告別式を Smooth Streaming で配信

July 7th, 10AM PT/1PM ET、ロサンゼルスのステイプルズ・センター (the Staples Center in Los Angeles) で開催されるマイケル・ジャクソンの一般向け告別式が Smooth Streaming + Silverlight を使って HD 品質で中継されるそうです。
http://inmusic.ca/news_and_features/Michael_Jackson

(日本時間だと 8日の AM2時になるのかな?間違ってるかも)

2ch でもやけに評判がよかったスムースストリーミングですがw (【1080p】MS Silverlightのスムースストリーミングが凄すぎる件【XBOXLIVE】) さすがに今回は相当なアクセスがあるでしょうし、サーバや回線が耐えられるのかちょっと心配。
逆に言うと、HD 品質は無理にしてもそれなりに配信できたらあらためて 「スムースストリーミングすげぇ!」 ってことになるかも。


[Silverlight] windows4all.com

http://windows4all.com/
すごっ
Silverlight で作った Vista 風のデスクトップですね。
デスクトップと言っても、もちろん、ブラウザの中で動くわけですが。

ちょっと不思議に思った点。
デスクトップの中に Internet Explorer のアイコンがあって、これを立ち上げるとちゃんとブラウズできます。
しかし、Silverlight には WebBrowser コントロールみたいなものは無かったはずです。
これ、どうやってるのか不思議でした。
ちゃんとは調べてませんが、たぶん、HtmlPage 経由で HTMLDOM を操作して <frame> か何かを Silverlight の上に重ねてるんじゃないかと思います。
うまいこと考えたなぁ。
ちなみに、Firefox で http://windows4all.com/ にアクセスした場合も Internet Explorer がありますが、ブラウザ部分で右クリックしたときに出てくるコンテキストメニューは Firefox のものだったりします(笑)

ところで、こういうのを見ると http://www.windowsvista.si/ を思い出す人もいるんじゃないかと思います。
以前に自分の書いた 「www.windowsvista.si - WPF/E のサンプル」 なんて見ると、まだ Silverlight という名前が無く WPF/E と呼ばれていたころなんですね。


2009年7月2日木曜日

[.NET][COM] Marshal.ReleaseComObject の危険性について

先日書いた 「[IE][C#][COM] IE のセキュリティゾーンをプログラムから操作する」 に、元記事を書かれた Dennis "D.C." Dietrich さんがコメントをくれました。
(わざわざ翻訳して読んでくれたそうです。コメントをもらったのは 6/26 ですが、今まで書く暇がありませんでした)

そのコメントにて
Discussion of Marshal.ReleaseComObject and its dangers
こちらの記事を紹介してくれました。

[厳密な訳ではありません。かなり大雑把ですし、一部英文の意味がよくわからないところもあります。正確なところはぜひ原文をご覧ください]

Marshal.ReleaseComObject を使えば望んだときに即座にリリースできる。しかし、COM コンポーネントのマネージド表現である RCW のこれを呼ぶとき、もしこの RCW を AppDomain 上の他のマネージドコードが保持していると、リリースできなくて InvalidComObjectException が発生するだろう。

さらに悪いことは、呼び出しがすでにリリースされた RCW に行われると、その振る舞いは未定義である。AV [訳注: アクセスバイオレーションのこと?] が発生する機会になったり、メモリを腐らせたり、妙なクラッシュをするまでだらだらと実行し続けたりとデバッグをするのが非常に大変になったりする。

このリスクは CoCreateInstance が毎回同じインターフェースポインタを返すようなシングルトンな COM コンポーネントの場合にさらに悪化する。AppDomain 内の別々の独立したマネージドコードが同じシングルトンな COM コンポーネントの RCW を使っているとき、それらのうちのどれかがその COM コンポーネントの ReleaseComObject を呼び出すと他のところが壊れる。

これが、本当に必要だという場合を除いて ReleaseComObject を使うべきではないと私が強く勧める理由だ!

別の話として、本当に ReleaseComObject を使う必要があるときには、.NET Framework 2.0 からある Marshal.FinalReleaseComObject を使うべき。この API は RCW が何回参照されていても COM コンポーネントをリリースしてくれる。FinalReleaseComObject ならばループの中で ReleaseComObject がゼロを返すまで繰り返すなんてことをしなくて済む。

なるほど、ものすごく納得です。

IInternetSecuriryManager のような COM インターフェースの場合は、うかつに Marshal.ReleaseComObject を呼び出すくらいなら放置しておいた方が安全というですね。
ただ、リリースのタイミングで後始末するようなインターフェースもあったりするので、常に放置すればいいとは限りませんし、単純に 「○○すればいい」 というようなルール化は難しいでしょうからケースバイケースで判断するしかないでしょうね。

ちなみに、Excel を Automation 経由で呼び出す場合なんかの話は、上の議論とは別だと思います。
こういった場合は、Excel のプロセスをきちんと終了させるために、かなり気を使って Marshal.ReleaseComObject を適切に呼び出してやらなくちゃいけません。
ReleaseComObject を適切に呼び出すということは、言いかえれば生成からリリースまでそのすべてを自分で管理するということです。
ですから、上記で言っているような 「他のところでリリースしちゃった」 というようなことはおこり得ません。(と言うか、そういったことが無いように全部自分で管理するわけですが)


2009年6月25日木曜日

[IE][C#][COM] IE のセキュリティゾーンをプログラムから操作する

Adding and removing websites to/from security zones programmatically (C#) より。
なんとなく気になったので覚え書き。

IE のセキュリティゾーンへ / から WebSite を追加したり削除したりするのはどうやんの?という話。
IInternetSecurityManager を使えばできるよ、と。
そのために UrlMon.idl を midl でコンパイル。
できたタイプライブラリ UrlMon.tlb を tlbimp でマネージドへ。
これで CLSID_InternetSecurityManager とか必要なものが手に入った。
後は、いつもどおり CLSID_InternetSecurityManager を CreateInstance してごにょごにょすれば OK。

というわけで、C# とありますが内容は全部 COM ですw

あと重要な注意。
記事で紹介されているコードでは Marshal.ReleaseComObject してません。
try . . . finally で括って、使い終わったら確実に Marshal.ReleaseComObject するようにしておいた方がいいです。
(7/2 追記 Dennis "D.C." Dietrich さんからコメントをもらい、やみくもに Marshal.ReleaseComObject すればいいというものでもないとわかったのでこの一文は取り消します。詳しくは 「[.NET][COM] Marshal.ReleaseComObject の危険性について」 をご覧ください)


[Silverlight] Siverlight が Xbox 360 で動くようになる?

Silverlight Ads on Xbox LIVE Announced at Cannes より。
6/22 (火) の the Cannes Lions International Advertising Festival 2009 にて、来年内に Xbox LIVE で Silverlight を使うことによってリッチメディアテクノロジーな Interactive Advertising Bereau (IAB) をできるようにするってなアナウンスがあったようです。
Interactive Advertising Bereau (IAB) って何のことなのかわかってなかったりしますが、先を読んでいくと、どうやら Silverlight を使えば静止画だけではなく動画も使えるし、インタラクティブにもできるし、インターコネクトにもできる、それに PC やモバイルにも同じものが使える、とかなんとかあります。
Xbox 360 で Silverlight が動くようになれば、マーケットプレースなどいろんなところでいろんなことができるようになるってことでしょうか?
ちなみに日本の Xbox LIVE のマーケットプレースはゲームくらいしか無いみたいですが、欧米などでは映画や音楽などいろいろと充実してるとかって聞いたことがあります。

実は、昨日、スコット・ガスリー氏が Twitter で

It was actually an XBOX 360 that was demoed using Silverlight. We have a Silverlight port that supports PowerPC (including .NET)

3:40 AM Jun 24th webで

なんてつぶやいてたんですよね。
「確かに Silverlight を使った Xbox 360 のデモをやったよ。PowerPC 版の Silverlight 持ってるからね。(.NET 込みで)」 なんて感じでしょうか?
これがたぶん上記の発表のことなんでしょうね。

ちょっと検索してみたら
Microsoft introduce la tecnologia Smooth Streaming 1080p su Xbox 360
こんなニュースが。
これ何語?
全然読めませんし、読んでませんがw タイトルだけでも Xbox 360 で 1080p の Smooth Streaming ができるようになるっていうような内容なんだろうとわかりますね。画像もありますし。
ちなみに、画像はオープンソースの 3DCG ソフトである Blender で作られている Big Bug Bunny の一コマですね。
記事の中にはちゃんと Silverlight っていう単語も出てきています。

ということで、まだもうしばらく先にはなりそうですが、Xbox 360 でも Silverlight が動くようになるみたいです。
マーケットプレースってことなので Silverlight でゲームを作れるってわけじゃ無いでしょうが。


2009年6月24日水曜日

[Silverlight] Silverlight 3 の 3D Projection を使って影をつける

Shadow effect using 3D projection in Silverlight 3 より。
これ、すごいなぁ。
Silverlight 3 beta 1 が入っていれば上記ページにアクセスすると実際に動いているところを見れます。
球のあたりのマウスを持っていくと、球の表面にライトの反射が、球の後ろに影が描画されます。

Silverlight 3 で追加される 3D Projection は、言ってしまえば形を変形して奥行きがあるかのように見せかけるっていうだけのもので、ライトやら影やらの計算ができるってわけではないです。
(だから 3D Projection = 3D 投影 っていう名前なんでしょう)

では、どうやっているのか。

ライトの反射は、実は単なる円形のグラデーションだそうです。
グラデーションの原点 (GradientOrigin) をマウスにあわせて動かしているだけです。
他には何もしていません。

影の方ですが、こちらも単なる灰色のグラデーションで、それを 3D Projection でそれらしく変形しているだけです。
具体的には PlaneProjection を使っていますが、それの LocalOffsetX、LocalOffsetY をマウスにあわせて動かしているだけです。
他には何もしていません。

ソースを見ると本当にこれだけのことしかしていません。
うーん、なんと言うか、、、センスいいなぁ。


2009年6月19日金曜日

[Silverlight] DataGrid のセルの見た目にアクセスする

前 2つの記事
  「[WPF] ListBox や ComboBox の各行の見た目にアクセスする
  「[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする
に関連しますが、Silverlight の DataGrid では ItemContainerGenerator のようなアプローチが使えません。
というのも、Silverlight の DataGrid は Control の子になっていて ItemContainerGenerator に必要なメソッドがないからです。
しかし、ちょっとした工夫で同じようなことができますので、それを紹介してみます。

さっそくですが必要となるコードを載せちゃいます。
そんなに難しい話では無くて、必要なのは以下のコードだけです。

public partial class MainPage : UserControl
{
private Dictionary<int, DataGridRow> rowContainer = new Dictionary<int, DataGridRow>();

public MainPage() { InitializeComponent();
this.dataGrid1.LoadingRow += dataGrid1_LoadingRow; }
void dataGrid1_LoadingRow(object sender, DataGridRowEventArgs e) { this.rowContainer[e.Row.GetIndex()] = e.Row; }
private FrameworkElement GetDataGridCell(int columnIndex, int rowIndex) { var e = this.dataGrid1.Columns[columnIndex].GetCellContent(this.rowContainer[rowIndex]); while (true) { if (e == null) { return null; } if (e is DataGridCell) { return e; } e = e.Parent as FrameworkElement; } }
private void button1_Click(object sender, RoutedEventArgs e) { var cell = GetDataGridCell(1, 2); var v = VisualTreeHelper.GetChild(cell, 0); if (v is Grid) { ((Grid)v).Background = new SolidColorBrush(Colors.Red); } } }

上記は MainPage に dataGrid1 という名前の DataGrid が置いてある場合のコードです。
まず、DataGrid の LoadingRow イベントを受けるようにします。
このイベントは DataGridRow が作られるたびに呼び出されます。
LoadingRow イベントでは作られた DataGridRow を Dictionary に保存しておきます。(キーは行のインデックス、値は DataGridRow)

GetDataGridCell() メソッドがこのコードのキモです。(キモって言うほどたいしたことしてるわけじゃないですが)
DataGridColumn.GetCellContent() メソッドを使うとセルの中のコンテントを取得することができます。
DataGridColumn はカラム位置のインデックスで簡単に取得できます。
行の指定は DataGridRow を渡すことによって行います。
これに必要なので LoadingRow イベントで DataGridRow を取っておいたわけです。
さて、この DataGridColumn.GetCellContent() メソッドですが、これで返ってくるのはセルの中のコンテントそのもの、たとえば、TextBlock などです。
これだとちょっと使いにくいので親をさかのぼって DataGridCell を探し、それを返します。

DataGridCell ってのが ListBox の項目コンテナ (ListBoxItem) に相当すると思ってもらえばいいかと思います。
ListBox では、ItemContainerGenerator が無かったとはいえ PrepareContainerForItemOverride() メソッドなど項目コンテナを取得するすべは用意されていました。
DataGrid にはそういったものが無いためコンテントを取得し、そっから親をたどることによって項目コンテナに相当するものを取得しているわけです。

DataGridCell が取得できたら後は ListBox と同じようにビジュアルにアクセスできます。
上記のボタンクリックイベントでは (桁インデックス:1、行インデックス:2) のセルを取得し、その子ビジュアルを取得して背景色を変更しています。

ここでちょっと注意。
Silverlight の DataGrid は必要となったときに初めて DataGridRow が作られるようになっています。
初期化時にすべての行が作られるわけではありません。
隠れていて表示されていない行の DataGridRow はスクロールして表示されたときに初めて作られたりします。
ですので、データはあっても DataGridRow はまだ無いという状況がありえます。
上記のコードはそういったチェックをしていないため、まだ作られていない行にアクセスすると死にます。
本当ならちゃんと DataGridRow が生成済みかどうかをチェックしてやるようにしてください。

ちょっと調子に乗って DataGrid のセルの中に DataGrid が入っているというのを試してみましたw
XAML はこんな感じ。

<data:DataGrid x:Name="dataGrid1" AutoGenerateColumns="False">
<data:DataGrid.Columns>
<data:DataGridTemplateColumn Header="Grid">
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Padding="4,4,4,4" Text="グリッド"/>
<data:DataGrid AutoGenerateColumns="True"/>
</StackPanel>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
</data:DataGrid.Columns>
</data:DataGrid>

ボタンが押された時のコードはこんな感じ。

private DataGrid FindInnerDataGrid(DependencyObject o)
{
if (o is DataGrid)
{
return o as DataGrid;
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); ++i)
{
var x = FindInnerDataGrid(VisualTreeHelper.GetChild(o, i));
if (x != null)
{
return x;
}
}
return null;
}

private void button2_Click(object sender, RoutedEventArgs e) { var cell = GetDataGridCell(3, 2); var grid = FindInnerDataGrid(cell); grid.ItemsSource = new[] { "あああ", "いいい", "ううう" }; }

GetDataGridCell() メソッドを使って DataGridCell を取得するのは先のコードと同じです。
DataGridCell を取得したら、そこからビジュアルツリーをたどって最初に見つけた DataGrid を目的のものとしています。
セルの中に DataGrid が入っているなんて変態的な状況は普通おこらないはずなのでとりあえずこれで動きます。
もうちょっとまともにやるなら、DataGridCell から最初に ContentPresenter を探して、さらにその子供から DataGrid を取得するようにした方がいいかもしれません。
まぁ、こうやって DataGrid が取得できれば後はどうとでもできます。
試しに ItemsSource を設定してみたらちゃんとデータバインドされて表示が更新されました。

上記に上げたコードほとんどそのまんまですが、Visual Studio 2008 のソリューションを上げておきました。
Silverlight 3 beta 1 のプロジェクトですがソースコード自体は Silverlight 2 でも問題無いはずです。
SilverlightDataGridSample.ZIP-download


[Silverlight] ListBox や ComboBox の各行の見た目にアクセスする

たとえば、ボタンをクリックされたら ListBox の 2行目の背景色を変えたい、なんてことがあったとします。
ListBox のそれぞれの行はたぶん Border とか Rectangle とか TextBlock とかを組み合わせて描かれてるんだと思いますが、そいつらにアクセスして背景色を変えたいというわけです。

WPF 編はこちら → 「[WPF] ListBox や ComboBox の各行の見た目にアクセスする

■ Silverlight 2、3 の場合
WPF と同じように VisualTreeHelper を使って ListBox の頭からビジュアルツリーをたどっていけば各行のビジュアルにもたどり着くことができます。
具体的には、ビジュアルツリーをたどっていくと行数分だけ ListBoxItem が出てきます。
この ListBoxItem の下がそれぞれの行のビジュアルです。

Silverlight でも WPF と同じように ItemContainerGenerator が使えると便利なんですが Silverlight には ItemContainerGenerator がありません。
(ItemContainerGenerator が何か知らないって人は WPF 編 を見てください)
けど、実は Silverlight Toolkit に ItemContainerGenerator クラスがそのままの名前で含まれています。
なので、こいつを使えば、、、って、実は Silverlight Toolkit に含まれている ItemContainerGenerator クラスはコンストラクタが internal になっていて外部から使えません orz
いけずぅ

というわけで、以下、自分で実装する方法です。
Silverlight Toolkit に含まれているものを参考にして必要最小限のところだけ実装すると以下のようになります。

public class ItemContainerGenerator
{
private List<KeyValuePair<DependencyObject, object>> container = new List<KeyValuePair<DependencyObject, object>>();

public ItemContainerGenerator() { }
public void PrepareContainerForItemOverride(DependencyObject element, object item) { this.container.Add(new KeyValuePair<DependencyObject, object>(element, item)); }
public void ClearContainerForItemOverride(DependencyObject element, object item) { foreach (var x in this.container) { if (x.Key == element) { this.container.Remove(x); return; } } }
public DependencyObject ContainerFromIndex(int index) { return this.container[index].Key; }
public DependencyObject ContainerFromItem(object item) { foreach (var x in this.container) { if (x.Value == item) { return x.Key; } } return null; } }

次に ListBox を継承して ItemContainerGenerator 対応版にしてやります。
ここでは MyListBox という名前にしました。

public class MyListBox : ListBox
{
private ItemContainerGenerator itemContainerGenerator = new ItemContainerGenerator();

public ItemContainerGenerator ItemContainerGenerator { get { return this.itemContainerGenerator; } }
public MyListBox() { }
protected override void PrepareContainerForItemOverride(DependencyObject element, object item) { this.itemContainerGenerator.PrepareContainerForItemOverride(element, item); base.PrepareContainerForItemOverride(element, item); }
protected override void ClearContainerForItemOverride(DependencyObject element, object item) { this.itemContainerGenerator.ClearContainerForItemOverride(element, item); base.ClearContainerForItemOverride(element, item); } }

XAML を書き変えて ListBox の代わりに自分の MyListBox を使うようにしてやります。

<UserControl x:Class="ItemContainerSample.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:ItemContainerSample"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<my:MyListBox x:Name="listBox1">
<ListBoxItem Content="Item 1" />
<ListBoxItem Content="Item 2" />
<ListBoxItem Content="Item 3" />
<ListBoxItem Content="Item 4" />
<ListBoxItem Content="Item 5" />
</my:MyListBox>
<Button x:Name="button1" Click="button1_Click" Content="Button" />
</StackPanel>
</Grid>
</UserControl>

これで WPF と同じように ItemContainerGenerator を使って項目コンテナを取得することができるようになりました。

private void button1_Click(object sender, RoutedEventArgs e)
{
var item = this.listBox1.ItemContainerGenerator.ContainerFromIndex(2);
var v = VisualTreeHelper.GetChild(item, 0);
if (v is Grid)
{
((Grid)v).Background = new SolidColorBrush(Colors.Red);
}
}

ListBox の項目コンテナが ListBoxItem だというのは WPF と同じです。
ただ、この ListBoxItem の最初の子ビジュアルは WPF と違い Grid になっていました。
また、いくつかビジュアルツリーをたどっていくと ContentPresenter が出てきて、データテンプレートを使っている場合はそいつの子がデータテンプレートの内容になっているというのは WPF と同じです。

上記のコードから明らかなように、ItemContainerGenerator 対応版にするためにはそのコントロールが PrepareContainerForItemOverride() メソッド、ClearContainerForItemOverride() メソッドをサポートしている必要があります。
これらのメソッドは ItemsControl クラスのものです。
ですから、WPF と同じように ItemsControl から継承している ComboBox なども ItemContainerGenerator 対応版にすることができると思います。
また、Silverlight Toolkit に含まれている TreeView などは始めから ItemContainerGenerator に対応していたりします。

内容的には上に書いたものと同じですが、VisualStudio 2008 のソリューションを↓に置いときました。
Silverlight 3 beta 1 のプロジェクトですが、ソースコード自体は Silverlight 2 でも問題無いはずです。
ItemContainerSample.ZIP-download

ところで、Silverlight には DataGrid がありますが、あれは ItemsControl の子じゃないし、このアプローチは無理なんですね。
というわけで、DataGrid についてはこちら → 「[Silverlight] DataGrid のセルの見た目にアクセスする