fc2ブログ

青柳 臣一 ブログ(趣味系)

[WPF][Silverlihgt] プリプロセッサを使って SL と WPF の XAML の非互換部分をどうにかする

Silverlight の XAML と WPF のそれはよく似てるんですが非互換部分も結構あります。
それを VC++ のプリプロセッサを使って何とかしてしまうと言う方法が
Using the preprocessor to share incompatible XAML between SL and WPF ? Part 1
で紹介されています。

何とかすると言っても、使うのはプリプロセッサですから、XAML 上に

<TextBlock
#if SILVERLIGHT
    Text="This is in Silverlight"
#else
    Text="This is in WPF"
#endif
/>

というように書いておくってことです。
もちろん、標準では #if なんて対応していませんから、ビルド時にプリプロセッサを呼び出すように PreprocessXaml.targets ファイルを用意しておき、これを自分の csproj ファイルに追記してやるという方法です。

紹介されているのは以上なんですが、#if を書きこんだ XAML ファイルをそのままでは Blend で読み込めないとかいろいろと制限も出て来そうですね。
記事のタイトルに “Part 1” と付いてるので、今後も続くのかな?

スポンサーサイト



[C++] 細かい手動最適化 (けど、結構効果あるのね)

Optimize Your Code: Matrix Multiplication より
結果を見て 「へぇ」 と思ったので紹介。

ところで、このブログの方、Microsoft の C++ Shanghai team のデベロッパと書いてあるけど、Shanghai チームって上海のことなのかな?それともそういうコード名のプロジェクトがある?

紹介してるのは n×n の正方行列の積を求めるコード。

Version 1 はごく普通にループ回して結果を求めるコード。
何の工夫もなし。

Version 2 は内側のループで一時変数を使うようにしたちょっとした改良。
最初これを見たとき 「これくらいはオプティマイザが勝手に最適化してくれるんじゃないかな?」 と思ったんですが、してくれないんですね。
ちゃんと解説が書いてあります。
「”result” が “m1” か “m2” の別名になってる (言い換えると “result” が “m1” か “m2” と同じところを参照している) かどうかをオプティマイザには判断付かないので result[i][j] に毎回バカ正直にメモリ書き込みすることになる」
なるほど、そりゃそうだ。

Version 3 は Version 2 に後ろの行列を計算前にひっくり返しておいて、計算後に元に戻すという処理を加えたもの。
これまた、「いったい何の意味が?」 と思ったんですが解説を読んで納得。
「この最適化はトリッキー。(Version 2 のコードの) プロファイルを取ってみれば、多数のキャッシュミスしてるのがわかるはず。行列をひっくり返してから計算すると m1[i] と m2[j] のシーケンシャルアクセスだけになる。これによってメモリリードのパフォーマンスがものすごく良くなる」
なるほど、先読みキャッシュの機構があるってことを前提にすればシーケンシャルアクセスの方が速くなるわけですね。

Version 4 は、、、なんだこりゃ?
float と double 用に SSE3 を使った実装か。
もう、こうなると C++ じゃないなw
つか、_mm_hadd_ps とかってのは Visual C++ の標準機能だったのか。こんなの知らんかったよ。

あとはそれぞれを Visual C++ 2010 CTP の Parallel ライブラリとラムダ式を使って並列化した実装。
へぇ、C++ でもラムダ式が使えるようになるのか。
これって C++0x ?
ラムダ式の頭についてる [&] は何だ?
検索してみた。。。変数のキャプチャ方法を指定。= でコピー、& で参照。[&, hoge] のように書くと hoge をコピーで、それ以外を参照で、といった指定もできる。
C++ もすごいことになっていくなぁ。

で、500×500の行列でやってみた表が載っています。
個人的には、Version 3 の改良がかなり効果があるのが意外でした。特に long long や double などサイズが大きくなるとかなり効果が出てますね。
500×500 の行列をひっくり返して、計算後にまた元にひっくり返して元に戻す、と処理量はだいぶ増えてるはずなのにメモリリードがシーケンシャルになるようにしただけでここまで明らかな効果があるとは。
あとは、2コアの Core2Duo だと Parallel の効果は微々たるものだけど、4コアの Xeon になるとかなりの効果があるっていうのも、まぁ、あたりまえだけれども、はっきりと数値に出てますね。

[Silverlight] Silverlight 3 で TextBox のキャレットの色も変えられる

Silverlight 3 Hidden Features: TextBox.CaretBrush より
「Silverlight 3 にはたくさんおもしろ機能があるし新機能もある。たくさんのブロガーがそいつらを紹介しているよね。けど、俺は忘れられちゃってるようなことにこそスポットを当てたいんだぜ。今日は TextBox.CaretBrush だ!」
いや、ほんとにこんな口調なのかどうかはわかりませんが(笑)、まぁ、こんなような意味の文章で始まってます。

んで、本題。

Silverlight 2 でキャレット (テキストボックスで文字を入力するときに点滅してるやつ) の色を変えることはできなかったので、TextBox の背景色を黒くしたりしているとキャレットが見えなくて困ることになります。
Silverlight 3 では CaretBrush=”White” のようにキャレットの色を指定できるようになりました。
プロパティ名からわかるようにブラシなのでグラデーションブラシなども指定できます。
(こんな細いものにグラデーションかけても意味ないでしょうが)

ちなみに、文字列を選択してるときのは色は Silverlight 2 でも 3 でも SelectionForeground と SelectionBackground で指定できます。

ということだそうです。
確かにこれは細かいですが、キャレットが見えないってのはユーザビリティに直結しますからすばらしい改善と言っていいんじゃないかと思います。
まぁ、私は、Silverlight 2 でキャレットの色が変えられないってことすら知らなかったんですけどね(^^;

[Blender] プレビューのためのレンダリングの効率化と 25 個の Tips

最近 BlenderNation に取り上げられてた以下の 2 つの記事
Efficient Preview Rendering in Blender
25 Useful Blender tricks that aren't so obvious
でいろいろ知らないことがあったので自分のために覚え書き。

まずは Efficient Preview Rendering in Blender から。

  • 3D View の Shift+P のプレビューは便利よ。(さすがにこれは知ってる)
    だいたいの場合は自動で更新される。
    されない場合は Shift+P、Shift+P で開きなおせば OK。
  • Scene buttons window (F10) の Render パネルの Border をオンにしておく。
    3D View で Numpad-Zero してカメラ視点にする。
    Shift-B で矩形を書く。
    これで F12 するとその矩形だけがレンダリングされる。
    (これは知らんかった。部分だけを確認したい場合はいいな)
  • AO するなら AAO にしとけば早いよ。
    (これはプレビューレンダリングの話とはちと違うような?)
  • Scene buttons window (F10) の Render Layer パネルの Mat: にマテリアル名を入れると全部のマテリアルがそれで描画される。
    (形状の確認やモーションの確認だけしたいときは、軽いマテリアルを作っておいてこいつで指定すれば早くなるのかな)
  • 同じく Light: にライト名を入れれば全部のライトの設定がそれになる。
  • Subsurf modifier の Render Level を下げれば早くなる。
    (そりゃそうだ)
  • Scene buttons window (F10) の Anim パネルにある rt: を 1 にする。
    すると Simplifcation パネルが出現するから、そこの Render Simplification をオンにする。
    これだけで早くなる。
    (うはっ、まじっすか。レンダリングに 6分 16秒かかるのが 2分 27秒になるっていう例が載ってるけど見比べてもどこの品質が下がってるのかわからんくらいだな)
    (注意 試してたら Render Simplification がオンになってると 3D View にある Render this window ボタンを Ctrl+クリックしてアニメーションを出力しようとすると何も出力されないとか一部おかしくなることがあるようです)
  • Open GL レンダリングとか BGE とか使うのも手。
  • Play ボタンで表示するアニメーション結果のウインドウ (playback window) はマウスの左右ドラッグでフレーム移動できる。
    ただ、3D View にある Render this window ボタンを Ctrl+クリックしてアニメーションを出力して出てるウインドウはこれができない。その場合は、いったん Esc キーで閉じて Ctrl-F11 で playback window を出せば OK。
    (こんな機能もしらなかったなぁ)

続いて 25 Useful Blender tricks that aren’t so obvious の方

  1. Save As のウインドウで “+” キーを押すとファイル名の末尾の数字が 1 増える。
  2. テクスチャの Load ボタンを Ctrl+クリックすると画像プレビュー付きのファイル選択ウインドウが出る。
    (「不安定だから自己責任でね!」 みたいなことが書いてあるので使用には注意)
  3. Ctrl-Numpad 0 でアクティブなオブジェクトがカメラになる。スポットライトの位置調整とかに便利。
  4. オブジェクトモードで複数のオブジェクトを選択して Ctrl-L でリンクを作ることができる。(最後に選択したオブジェクトにリンクされる)
  5. Ctrl-1, 3, 7 でそれぞれ 1, 3, 7 の反対向き視点。
  6. Alt-右クリックでループ選択。
    (ちなみに、記事では書いてませんが、Edit Mode の Editting (F9) の Mesh Tools More パネルで動作を変更できます。Loop Select だとループ選択。UV 展開するときは Tag Edges(Seam) にとしくと便利かも)
  7. スカルプトモードでは F でブラシサイズが、Shift-F で Strength が変更できる。
  8. カメラを選択して Shift-F でフライトモード。
  9. レンダリング結果を表示してるウインドウで J キーを押すと一つ前のレンダリング結果が表示される。
  10. (上の Scene buttons window (F10) の Render パネルの Border をオンにしておいて Shift-B ってやつと同じ)
  11. Shift-C で 3D Cursor が原点に戻る。C で 3D Cursor がビューの中心になるように表示される。
  12. Ctrl-U で Save Default Settings。(起動時にその状態で起動するようになる)
  13. Alt-M (もしくは W の Merge) の Collapse で頂点のマージ。
  14. Shift-F でそれなりに面を作ってくれる。
  15. オブジェクトが重なってるときは Alt-右クリックで選択肢が出る。
    (これ、ボーンの Edit Mode や Pose Mode でもできるようにならないかな)
  16. Ctrl-左/右矢印キーでシーンモードを変えられる。
  17. Edit Mode で Ctrl-L で選択している頂点に繋がってる頂点を全選択。
  18. R-R でトラックボール回転。
  19. Render window で A キーを押すとアルファマスクが表示される。保存するすべはないのでスクリーンショットを取るべし。
  20. Ctrl-左クリックで投げ縄選択。
  21. Atl-V でテクスチャスロットのイメージのサイズにあわせる?
    (試してみたも良くわかりませんでした)
  22. Alt-マウスホイールでフレーム移動。
    (うは、しらんかった。これいいじゃないか。
    しかも、なにげにやってみたら Shift-マウスホイールで上下平行移動、Ctrl-マウスホイールで左右平行移動、Alt-Shift-マウスホイールで上下回転、Alt-Ctrl-マウスホイールで左右回転とかいろいろできるし。いままで知らんかったよ)
  23. 3D View の select mode の vertex、edge、face のボタンは Shift キーを押しながらクリックすると複数をオンにできる。
    (ちょっ、まじ?全然知らんかった)
  24. Ctrl-1 で subserf modifier を追加。Ctrl-2, 3, 4 で level を変更。
  25. スライダーのところで Ctrl キーを押しながらマウスをドラッグすると 0.1 刻みになる。Shift-Ctrl だと 0.01 刻みになる。

まぁ、こっちはほとんど知ってたんですが、22 と 23 で 「ちょっ、まじ?そんな機能あったのかよ orz」 とちょっと衝撃を受けたので書いてみたw

[WPF][Silverlight] ビヘイビア(behavior)- Blend 3 との連携機能

It took me under 5 minutes to realize the power of behaviors! より

ええと、↑に書かれてることをギュッと圧縮すると以下みたいなことかな?

今までは Blend を使ってできることはデザインに関することだけでした。
たとえば 「クリックイベントのときに何をするか」 なんていうことはコードを書くしかありません。

それがビヘイビアを使うとこんなことができるようになります。
まずはアクションを用意。
たとえば以下みたいなの。

using System;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Expression.Interactivity;

public class SampleAction : TargetedTriggerAction<FrameworkElement>
{
    protected override void Invoke(object parameter)
    {
        MessageBox.Show("Click!")
    }
}

そして Blend 3 ではイベントとアクションを簡単に関連付けられます。
たとえば、ボタンにアクションをドラッグ&ドロップするだけ。
アクションにプロパティを持たせたりといったこともできますし、デベロッパがあらかじめ必要となるアクションを作っておけばあとは Blend 3 上でそれらを関連付けしていくことができます。

--

なるほど、確かにこれは便利そう。
Blend 3 Behaviors: A Sample Action
↑ではもう少し詳しく、アクションにプロパティ (もちろん依存プロパティです) を持たせたりする例が載っていました。

[Silverlight] 無料 Silverlight ゲーム集サイト silverarcade.com オープン

以前 「[Silverlight] XNA 2D ゲームが Silverlight で動く?」 のときに書いた http://silverarcade.com/ がオープンしてました。
すでにいくつかのゲームが遊べます。
(パズルゲームとかはやりだすと止まらなくなるからやばい)

どうやらこのサイトは単にゲームを載せるというだけでなく、Silverlight によるゲームのコミュニティを目指しているようです。
トップページに “The money we make by displaying ads is shared with the people who created the games.” (広告表示で得たお金をゲームの製作者で分けるようにしたい) といったことが書かれてますし、どちらかと言うと製作者側のコミュニティを目指しているんじゃないかと思います。

[Silverlight] Siverlight 3 の Out of Browser だとマウスホイールが捕捉できない?

昨日の 「[Silverlight] Silverlight 3 の Out of Browser とアセンブリ・キャッシングは混ぜて使えない (beta 1)」 を試してたときに気付きました。
試したソースが Silverlight.FX を使ってマウスホイールを使えるようにした DataGrid だったんですが、Out of Browser にするとマウスホイールが効かなくなってました。
考えてみると当然で、Silverlight.FX も特殊なことをやってるわけではなくて、内部では HtmlPage.Window.AttachEvent(“onmousewheel”, OnMouseWheel); なんて感じで HTML のイベントにアタッチしています。
Out of Browser では名前の通りブラウザの外なので HTML もありません。
どうなるのか確認してはいませんが、きっと AttachEvent なんかは無視されているんでしょう。
ですから当然 onmousewheel イベントなんかも無いわけで、マウスホイールなどを捕捉できないわけです。

って、こりゃどうしたらいいんだ?
今どき、マウスホイールを使えないアプリなんて考えられないんだが。

まったく誰も気づいてないなんてことは考えられないので検索してみた。
OUT-OF-BROWSER EXPERIENCES
↑で Bigsby さんが 「Silverlight 3 でのマウスホイールについては聞いたことないけど、Out of Browser のときにスクリプトのイベントはどうなるの?」 みたいなことをコメントしています。
それに対して heuertk さんが 「マウスホイールのネイティブサポートは無い予定だけど、プロジェクトにドロップして使えるヘルパクラスライブラリを用意する」 みたいな返事をしています。
この heuertk さんって Method ~ of ~ failed の Tim Heuer さんですね。(About Me を見ればわかりますが、Silverlight のプログラムマネージャの方)

というわけで、beta 1 では Out of Browser するとマウスホイールが使えませんが、そのうちにはちゃんと使えるようになるみたいです。

[Silverlight] Silverlight 3 の Out of Browser とアセンブリ・キャッシングは混ぜて使えない (beta 1)

Silverlight 3 ? Out of Browser Applications with Cached Extensions で知りました。
少なくとも Silverlight 3 beta 1 では Out of Browser と アセンブリ・キャッシング は混ぜて使えないそうです。

ちょこっと試してみました。

まず、Out of Browser。
Visual Studio 2008 + Silverlight Tools 3 beta 1 のウイザードで作った Silverlight アプリなら Properties\AppManifest.xml に <Deployment.ApplicationIdentity> がコメントアウトされた状態で記述済みです。
このコメントをはずしてビルドしてやるだけで Out of Browser 対応アプリの完成。(ShortName、Title、Blurb なんかは適当に)

次にアセンブリ・キャッシング。
これも Silverlight プロジェクトの 「Reduce Xap size by caching framework extension assemblies」 のチェックボックスをオンにしてビルドしてやるだけ。

こうして作ったアプリをローカルにインストールして Out of Browser で起動。
すると起動はするんですが真っ白で何も表示されません。
エラーメッセージも何も表示されません。
ただ真っ白なウインドウがあるだけです。

というわけで Out of Browser を試すときはアセンブリ・キャッシングはオフにしましょう。
# さすがに今後のリリースではビルド時にチェックされるなり、実行時にエラーが表示されるなりするようになると思いますが。

[Silverlight] Silverlight.FX でマウス・ホイール対応にする

Silverlight はそのままではマウスホイールに対応していません。
自分で HTML 上のマウスホイールイベントを捕まえて処理してやる必要があります。
と言っても、HTML に JavaScript でイベントハンドラを書いたりする必要はありません。
Silverlight 内から HTML のイベントにアタッチできるので Silverlight 内で完結できます。
コード例は Silverlight Tip of the Day #23 ? How to Capture the Mouse Wheel Event などにあります。
ただ、このコード例はホイールの値を取り出してるだけで、Getting mouse wheel to vertically scroll a datagrid なんかにも 「で、DataGrid でスクロールしたいんだけど、このあとはどうやったらいいの?」 なんて質問があったりします。それに対して Sergey.Lutay さんが完全に動くコード例を載せてくれていますので、、、

って、あれ?リンク切れてる?
さがしたら見つけたので勝手にリンクしちゃいます。
Sergey.Lutay 氏の SkyDrive です。
WheelCtrlKey_withDG.zip
この例では DataGrid を ScrollIntoView() でスクロールしています。

また、Silverlight DataGrid & ListBox mouse scroll support では ListBox など内部に ScrollViewer を持つものと、DataGrid など IScrollProvider を持つものの両方の例が示されています。
完全に動くサンプルコードもダウンロードできます。
詳しくは見てませんが、かなりきちんと作りこまれてるみたいです。

■ で、やっと本題(^^;
MouseWheel Behavior for Silverlight
↑では Silverlight.FX を使って簡単にマウスホイール対応にできると紹介されています。
ScrollViewer と TextBox のコード例が示されていますが、試してみたところ DataGrid にもちゃんと対応してました。
やったのは↓だけ。

  1. Silverlight のプロジェクトの 「参照の追加」 で Silverlight.FX の binaries\Debug\Silverlight\SilverlightFX.dll を追加する。(もちろん Release でもいいです)
  2. XAML に
    <UserControl ...
        xmlns:fxui="clr-namespace:SilverlightFX.UserInterface;assembly=SilverlightFX"
    を追加。
  3. 同じく XAML の DataGrid のところに
    <data:DataGrid ...>
        <fxui:Interaction.Behaviors>
            <fxui:MouseWheelScroll />
        </fxui:Interaction.Behaviors>
    </data:DataGrid>
    を追加。

ほんとにこれだけでちゃんとマウスホイール対応になりました。
すばらしい。

ちなみに、ちょっと Silverlight.FX のソースを見てみたら以下のようなことをしてました。

IScrollProvider scrollProvider = null;

AutomationPeer automationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(AssociatedObject);
if (automationPeer != null) {
    scrollProvider = (IScrollProvider)automationPeer.GetPattern(PatternInterface.Scroll);
}

if (scrollProvider == null) {
    ScrollViewer scrollViewer = GetChildScrollViewer(AssociatedObject);
    if (scrollViewer != null) {
        automationPeer = FrameworkElementAutomationPeer.CreatePeerForElement(scrollViewer);
        if (automationPeer != null) {
            scrollProvider = (IScrollProvider)automationPeer.GetPattern(PatternInterface.Scroll);
        }
    }
}

なるほど、「IScrollProvider を持ってるときはそれを使う。持ってないが ScrollViewer を持ってるときは ScrollViewer の IScrollProvider を使う」 とすることによって IScrollProvider で統一してスクロールできるんですね。

しかし、この Silverlight.FX っておもしろいなぁ。
添付プロパティを応用して外部から機能を拡張したりしてるんですね。
それについての解説は Silverlight Behaviors にあるようです。(読んでませんが)
ちなみに、Silverlight.FX には MouseWheelScroll と同じような感じで MouseTriger とか HoverEffect とかおもしろそうなものがいろいろ入ってます。
他にも Window とか盛りだくさんです。
けど、ドキュメントがみつかりません。ソースコードを読んでいくしかないのかなぁ(^^;
まぁ、まだバージョン 0.1.0.0 ですからね(^^

[CG] 4k の exe で作られたムービー

blender etc: 「etc - これが4kだと・・・!?」 より
すごすぎ

この 3分 36秒のムービーは 4k バイトの exe ファイルによって作られてるそうです。
映像も BGM もです。
ほんと、世の中にはすごい人がいるよなぁ。
↓でダウンロードできます。
http://www.pouet.net/prod.php?which=52938

zip の中に解像度別に exe がありますが、どれも 4096 バイト未満になっています。

elevated.txt (readme に相当) によると d3d9_33.dll を使ってるようなので Direct3D 9 が必要みたいです。また、Windows XP のみみたいです。
GPU にもそれなりに依存しているでしょうから、ちゃんと動くかは環境によるところもあるんじゃないかと思います。
私の環境では、BGM は鳴るんですが映像はまともに表示されませんでした。(GPU がしょぼいので仕方ないな)

ちなみに、exe を起動すると 1分くらい CPU ぶんまわして何かやってから動き始めます。きっと映像や BGM を必死に計算してるんでしょう。
elevated.txt にごく簡単にですが処理内容が書いてありました。(.tech. のところ)

ものすごく低密度なメッシュをプロシージャルなバーテックス・シェーダーでディスプレース (デコボコさせたり変形させたりという意味だと思う) してる。
テクスチャリングのためにテクスチャマップは一切使ってない。代わりに、テクスチャリング (とシェーディング) はフルスクリーン矩形上でプロシージャルに遅れて計算してる。
別の第 2 のフルスクリーン矩形上でモーションブラーを計算してる。
カメラの移動もシェーダーで計算してる。CPU じゃない。(この後に続く “as only the gpu knows the procedural definition of the landscape.” がよくわからないんだけど、「地形の定義にのみ基づいて GPU のシェーダーでプロシージャルにカメラ移動を計算している」 という意味かな?)

あと、この exe を作るために Crinkler というツールも使っているみたいです。
よくわかりませんが、どうやら exe を圧縮するツールみたい。
なので、素で 4096 バイト未満というより、圧縮も含めたいろんなテクニックを使って 4096 バイト未満に収めているということなのかもしれません。

で、http://iquilezles.org/www/ が作者さんのサイトなのかなぁ?
だとすると、↓も同じ人の作品?

有名な PIXAR のムービーをまねた動画ですが、これも 4k バイト未満の exe で再生されてるみたいです。
このデモのプレゼン資料が
http://iquilezles.org/www/material/function2008/function2008.htm
にあります。
よく意味がわからないところも多々あるんですが、この Luxo 4k という名前のデモは、

  • モーションは階層構造のあるボーンに対するカーブで表現
  • モーションは本家のムービーをトレースして作った。(そのためのツールは C# で作った)
  • “11 signals to store, 246 samples each (more than 10 seconds at 24 fps)” とあるのが素のモーションデータのサイズかな?
    11個の single が 246個 (10秒×24fps+α) ということだろうか? single は 4バイトだと思うからそのままだと 10824 バイト?
  • それをいろいろ工夫して 979バイトまで縮めた
  • 最終的に、アニメーションデータは 979バイト、アニメーションプレーヤーは 220バイト、メッシュデータは 96バイト、メッシュ生成 (のためのコードっていう意味?) は 147バイト、その他 (アニメーションの階層オブジェクト、ライティング、シャドウ、マテリアル、フォント、グラフィックとサウンドのセットアップ (のコード)) の合計で 3500バイト
  • サウンドは 100バイトくらい?
  • そんなこんなで 4096 バイト未満におさまった

といった感じみたいです。
これまたすごいなぁ。

[.NET] All-In-One Code Framework ってなんぞ?

なんか不思議なものを見つけたので覚え書き
All-In-One Code Framework
2009/4/11 に All-In-One Code Framework ってものがリリースされたそうです。
MSDN Forum サポートチームで codefx という名前だったものとかなんとか。

http://cfx.codeplex.com/Wiki/View.aspx?title=All-In-One%20Code%20Framework%20Examples
こちらがその内容みたいなんですが、

  • C#、VB、ATL、MFC なんかで in-process や out-of-process の COM server や ActiveX control をごにょごにょ
  • C#、C++ で ADO、ADO.NET、LINQ をごにょごにょ
  • VSTO で Outlook、Excel をごにょごにょ、C# で Excel automation をごにょごにょ
  • C++、C# でレガシー DLL をごにょごにょ、C# で P/Invoke をごにょごにょ、他にも C++ で CLR をホストしたりとかいろいろとごにょごにょ
  • C#、C++ で名前付きパイプ、メールスロット、共有メモリ、.NET リモーティング、WM_COPYDATA とかをごにょごにょ
  • C# で WinForm をごによごにょ
  • C# で Windows Hook をごにょごにょ
  • Win32 でスタックオーバーフローやスタック corruption (オーバーランのこと?) をごにょごにょ

なんて感じ。
結局はサンプル集ってことなのかな?よくわからんw

[Live] SkyDrive は Silverlight を使うようになり、Favorite は同期ができるようになる

SkyDrive Adds New Silverlight-Enabled Features より
SkyDrive が Siverlight を使うようになるそうです。
Windows Live の Photo Album (Live Spaces Photo Album とか呼ばれてたやつ) は今は SkyDrive の一部なのでフォトアルバムも Silverlight を使って操作したりできるようになるみたいです。

あと、これまたいつの間にか SkyDrive の一部になっている Favorite (お気に入り) もコンピュータ間で同期ができるようになるみたいです。
ていうか、これ、Windows Live ツールバー (以前は MSN ツールバーって呼ばれてたっけ?) を入れておくと IE のお気に入りを複数の PC 間で同期するってことができてたんですよね。
それが Favorite が SkyDrive に統合された時から動かなくなってました。
これは、便利に使ってたのでかなり残念でした。
それがようやく復活するんですね。

Minor updates to SkyDrive and Sync arrive
こんな記事もありました。
SkyDrive が Silverlight 対応するだけではなく、Windows Live Sync を通じて画像やファイルを複数の PC 間で同期することができるようになるそうです。
Favorite の同期もこれでやるってことなのかな?
というか、Live Mesh と Live Sync ってものすごく被っているような気がするんだが。

[IE] IE プラグイン用マネージドラッパー

IE8 - Managed Code PlugIns より
IE プラグイン用 COM インターフェースのマネージドラッパーがリリースされているそうです。
IE7 と IE8 対応で、Express Edittion も含めた Visual Sutdio 用だそうです。
SpicIE と呼ばれてるそうです。
http://code.msdn.microsoft.com/SpicIE

SpicIE では

  • IE browsing event handlers
  • IE toolbar buttons
  • IE menu entries
  • IE context menu entries
  • IE explorer bars
  • IE toolbars

なんてのが開発できるそうですから、MSDN Library: Browser Extensions にあるようなことは一通りできるみたいですね。
.NET 2.0、3.0、3.5 に対応とのこと。

へぇ、こんなのあったんだ。
こりゃいいな。

ところで、素朴な疑問。
この辺の IE Extensions は基本的にインプロセスの COM だけど、今後 .NET Framework 4.0 が出てきたら 2.0、3.0、3.5 と混ざっても平気なんだっけ?
と、ちょっと気になったので、検索してみたら
CLR 4.0: In Process Side-by-Side CLR Hosting
こんなのを発見。
この記事がなんの資料を元にしているのかがわかりませんが、4.0 では 2.0 と 4.0 の In-Process Side by Side のホスティングがサポートされるようですね。
で、3.0 と 3.5 はランタイムは 2.0 だから 2.0 と 4.0 がホストできれば事足りると。
(1.0 と 1.1 はサポート対象外みたいです)

[Silverlight] Silverlight 3 のローカル・メッセージング

1つのページ上に複数の Silverlight アプリケーションがのっかっている場合、それらが相互に通信する方法は Silverlight 2 までは特に用意されていませんでした。
ただ、通信することが不可能ってわけじゃ無いです。
Silverlight アプリは HTML 上のオブジェクトを操作することができます。JavaScript を呼び出すこともできます。基本的に HTML 上の JavaScript でできることは Silverlight でもできるようになっているわけです。
反対に JavaScript から呼び出し可能なようにプロパティ・メソッドを公開することもできます。
これらを利用すればある Silverlight アプリから別の Silverlight アプリを呼び出すことができます。
呼び出してほしい Silverlight アプリがプロパティ・メソッドを公開しておき、呼び出し元の Silverlight アプリがそれを呼び出してやればいいわけです。
まぁ、通信なんていう高度なものじゃなく、呼び出し元アプリは HMTL 上のオブジェクトを呼び出していると思っているだけ、呼ばれている方は HTML 上の JavaScript か何かから呼ばれていると思っているだけ、ということですが。
もちろん、呼び出すときにマネージドな世界から JavaScript オブジェクトな世界へ、そして、JavaScript オブジェクトな世界からマネージドな世界へとマーシャリングされますし、戻ってくるときにもマネージド→JS→マネージドとマーシャリングされます。
なお、String、DateTime、数値型などは標準でマーシャリングがサポートされていますので問題ありませんが、オリジナルのクラスなどはマーシャリング方法が不明となるため実行時に例外が発生します。
自分でマーシャラを定義したりできればいいんですが、そういった機能はないようです。
私はあきらめて System.Runtime.Serialization.Json.DataContractJsonSerializer クラスを使って JSON 文字列をやり取りするようにしました。

と、前置きが長くなりました。
Silverlight 3 の新機能、ローカル・メッセージングは Silverlight アプリどうしの通信を行うためのものです。
Silverlight 3: What's New with Local Messaging
によると、同じページ上にある Silverlight アプリどうしの通信だけでなく、ブラウザの別のタブ上にあるものや別のブラウザで動いているものとの通信もサポートされるようです。ただし、Silverlight アプリが同じドメイン上にあったものどうしでのみ通信できるようです。セキュリティ的に考えると妥当なところですね。

使い方はとってもシンプルです。
上記の記事にあるサンプルコードを見ればすぐわかるでしょう。
ただ、通信できる内容もシンプルでどうやら String だけの様子。(System.Windows.Messaging.LocalMessageReceiver クラスの MessageReceived イベントに渡されるのが string Message くらいしかない)
任意のオブジェクトを渡せると便利なんだけど、やっぱりそれは自分でシリアライズするなりして何とかしろってことなのか。

[技術?][アイマス] 顧客が本当に必要だったもの

あの有名な 「顧客が本当に必要だったもの」 のアイマスバージョンです。

いやぁ、これほんとよくできてるわw
すべてのコマに突っ込みどころがいくつもあるって感じww
もっとも、アイマスおよびニコマスにそれなりに詳しくないとわかんないかもしれませんがwww

なお、この画像は アイマスロダ にあったものです。
なので、作者さんとか出所とかはわかりません。

[Silverlight] Silverlight 3 のアセンブリ・キャッシング

Silverlight 3's New Assembly Caching
Silverlight 3 のアセンブリ・キャッシングについてまとめられていました。

Silverlight 2 では BCL (ベースクラスライブラリ) の一部ではあるが Silverlight ランタイムに含まれていないようなアセンブリ (たとえば System.Xml.Linq.dll など) も XAP ファイルにいっしょに収められていました。
Silverlight 3 ではこのようなアセンブリを XAP ファイルに含めなくてもよくなったそうです。

上記記事では設定方法についても解説されています。
Visual Studio 2008 のプロジェクトのプロパティにある “Reduce Xap size” チェックボックスをオンにする、必要な操作はこれだけだそうです。
これでリビルドすると XAP ファイルにはコアランタイムの一部とみなされるアセンブリは含まれなくなります。
また、manifest ファイルが自動的に書き換えられ、コアランタイムのダウンロード場所を示す <Deployment.ExternalParts> セクションが作られるそうです。

もちろん、Silverlight は必要なアセンブリが無ければ manifest ファイルを参照してダウンロードします。
ダウンロードしたアセンブリはデフォルトのブラウザキャッシュにキャッシュされるそうです。
もちろん、XAP ファイルもここにキャッシュされています。
このキャッシュは共有されます。
ある Silverlight アプリが System.Xml.Linq.dll をダウンロードしてキャッシュしたら、他のアプリがそれを必要とする場合はそのキャッシュが使いまわされるわけです。

記事の例では 225K あった XAP ファイルが “Reduce Xap size” をオンにしてビルドしたら 12K になったそうです。

なるほどぉ。
これはなかなかいいですね。
いったいどこまでがコアランタイムとみなされるのか、それはいったいどこで判断してるのか、といったところはよくわかりませんが、使うたびに XAP に入るよりはずっとよさそうです。
Silverlight Toolkit のような形でチャートだとか高度な DataGrid だとかといったコントロールが追加でリリースされたりすると思いますが、そういったものも毎回 XAP ファイルに入れる必要がなくなるかも。(というか入れなくて済むようにしてほしいなぁ)

[Blender] BGE って GLSL なんかも使えるのか

BlenderNation: 「Advanced GLSL 2D Filters」 より。
BGE (Blender Game Engine) で GLSL を使っていくつかのフィルタを書いてみた、という BlenderArtists.org のスレが紹介されています。

いったいどうやってそんなことするんだろう?と .blend ファイルを見てみたら BGE には Custom Filter ってのがあって GLSL のソースをそのまま渡せるんですね。
ちなみに、FX という名前の empty に Custom Filter やキー入力・マウス入力のセンサー、コントローラなどが仕込んであるようです。
GLSL のソースは Text Editor に書いてあります。
へぇ、こんなことできるのか。まったく知らなかった。

んで、GLSL で書いてみたといういくつかのフィルタの中に SSAO (Screen Space Ambient Occlusion) なんてのがあって、これまた、いったいこれは何だろう?と。
AO ってそれなりに計算負荷が高いってイメージがありますし、そもそも GLSL の 2D フィルタでいったいどうやって処理するんだろう?と。
検索してみたら、まんま 「Screen Space Ambient Occlusion」 という技術があるんですね。
なになに、、、
レンダリング後の各ピクセルについて深度バッファからどの程度周囲から遮蔽されているかを求めてピクセルの明るさを決める、、、
なるほどなぁ、ピクセルの深度だけで AO と同じようなことができちゃうわけか。
うまいこと考えるよなぁ。

ただ、普段使ってる PC では SSAO はうまく動いてないようでした。
Blender の GLSL 表示でバンプマッピングが表示されなかったりするし GPU が古すぎかな?

[Blender] Blender 2.49 が 4月末リリース

BlenderNation: 「Preparations Started」 より。

Blender 2.49 が 4月末リリース予定だそうです。
だいたい 4月 15日くらいにリリースキャンディデートを、それからだいたい 10日後くらいに正式版をリリース予定とのこと。

ユーザインターフェースなどもいろいろと変わるという 2.50 の前の (おそらくは) 最後の 2.4x シリーズのリリースになるはずです。
ですからあまり大きな変更や機能追加はないんじゃないかと思います。

ただ、「Texure node editor」 というのが気になりました。
検索してみると BlenderDev/TextureNodes これなのかな?
なるほどぉ、Material Nodes、Composite Nodes に加えて Texture Nodes が増えるんですね。
で、プロシージャルテクスチャがノードとして表現されてるからいろいろと組み合わせてその結果をテクスチャとできるのか。
アウトプットも複数できると。
なんか、マンデルブロート集合を計算してるらしき画像まであるけど、やろうと思えばこんなこともできるとw
アニメーションは Composite Nodes と同じように Time ノードなどを使うと。

アニメーションのところに “IPO integration would be nice, but that’s another project.” と書いてありますね。「IPO への統合はとてもすばらしいと思うけど、そりゃ別のプロジェクトだ」 てな感じでしょうか。
ほんと、Composite Nodes や Material Nodes にキーを打てたらものすごく可能性が広がるように思えるんだけどなぁ。

[Silverlight] Virtual Earth Silverlight Map コントロールをぐりぐり動かすデモ

Virtual Earth Silverlight Map Control CTP ? Crazy Spinning Map with Silverlight 3 Beta
Virtual Earth Silverlight Map コントロールと Silverlight 3 の Perspective 3D 機能を組み合わせたデモです。

記事内の “Virtual Earth Silverlight Map Control CTP / Silverlight 3 Crazy Spinning Map Sample” というリンクをクリックすれば実際にデモを実行してみることができます。(もちろん要 Silverlight 3 です)
デモでは、x, y, z それぞれごとにスライダで回転することができます。
また、「>」 ボタンをクリックするとぐるぐる回ります。「||」ボタンで止まります。

まぁ、Virtual Earth Silverlight Map コントロールと Perspective 3D を組み合わせただけですし、だからどうしたと言えばそうなんですが(笑)、やっぱりぐるぐる回りながらも Virtual Earth が普通に操作できるのを見ると 「すげぇ」 と感じました。
ぐるぐる回しながら操作してると酔いそうですがwww

[Silverlight] Silverlight 3 のハードウエア・アクセラレーションについて

Silverlight 3 の新機能、GPU によるハードウエア・アクセラレーションについてです。

Silverlight 3 Quick Tip #4: Hardware Acceleration
Bitmap Caching in Silverlight 3

まず、デフォルトではハードウエア・アクセラレーションは無効になっています。
<object> タグを使っている場合は

<param name="EnableGPUAcceleration" value="true" />

のように EnableGPUAcceleration を指定してやる必要があります。
ASP.NET サーバサイドコントロールの場合は <asp:Silverlight EnableGPUAcceleration=”true” ... />、Silverlight.js の場合は忘れましたが create するところで EnableGPUAcceleration を true にしてやります。

ただし、これだけでハードウエア・アクセラレーションが働くわけではありません。
ハードウエア・アクセラレーションを有効にしてやりたい XAML エレメントに CacheMode=”BitmapCache” を付けてやる必要があります。

<StackPanel CacheMode="BitmapCache"/>

とかっていう感じです。
CacheMode に指定できるのは今のところ BitmapCache のみのようです。
CacheMode が指定された要素、および、その子供たちがハードウエア・アクセラレーションの対象となります。

そもそも、ハードウエア・アクセラレーションが使えるのは

  • Windows: ブラウザ、および、フルスクリーン (DirectX 9.0c 以上が入っている必要あり)
  • Mac: フルスクリーンのときのみ (Safari のフラグイン・モデルの制限から来るらしい)

とのことです。

ただ、すべての処理がアクセラレートされるということはもちろん無く、(少なくとも今の beta では)

  • Transform 族(TranslateTransform、ScaleTransform、RotateTransform など)
  • 矩形クリッピング
  • ブレンディング

の処理でのみハードウエア・アクセラレーションが使われるそうです。
なので、こういった処理をほとんどしていないようなアプリケーションではハードウエア・アクセラレーションは何の効果もありません。
それどころか 「CacheMode を指定する要素はよくよく考えて決める必要がある」 と書かれています。
レンダリングシステムがキャッシュを使うべきかどうかを判断するオーバーヘッドがそれなりにある、また、レンダリングメカニズムはハードウエア・アクセラレーションする要素を描画するごとにアンマネージの中間サーフェスを使って処理するけれどもこれが実際には使われなかったらかなり高価なものにつく、といった感じで説明されています。
だから 「最上位の要素に CacheMode を指定する」 なんてことはしちゃダメで、ハードウエア・アクセラレーションが必要な最も葉側 (leaf-most) の要素にだけ CacheMode を指定すること、とのことです。
どうやら、ヘタに CacheMode を指定するとかえってパフォーマンスを落とすことになりかねないようですね。

あと、確認用の機能として

<param name="EnableCacheVisualization" value="true" />

というのがあります。
これを指定しておくとハードウエア・アクセラレーションが有効になっている要素は普通に、なっていない要素は赤く表示されます。

    [Silverlight] Navigation Framework

    Silverlight 3 の新機能、Navigation Framework についてわかりやすくまとまってたので覚え書き。
    The Silverlight 3 Navigation Framework

    • 外側の Frame とコンテンツを表す Page で構成される。
    • Page は XAML のファイル名で識別される。
    • Frame クラスの Navigate メソッドで Page を遷移させる。
    • Page の Title 属性がブラウザのキャプションに表示される。
    • Page の遷移は (可能であれば) ブラウザの履歴に自動的に残り、「戻る」 ボタンなどが使える。
      これは Frame の JournalOwnership 属性で挙動を変えることもできる。
    • NavigationService クラスの Navigate メソッドを使えば Page の遷移時に QueryString を渡すこともできる。
      Page の側では this.NavigationContext.QueryString で受け取る。
    • ディープリンク。各 Page へのリンク (XAML のファイル名) はブラウザのアドレスのところに出るのでブックマークしたりできる。
    • UriMapper クラスを使えば各 Page のエイリアスを定義できる。