ページ

2012年4月23日月曜日

[Silverlight][WP7][WinRT] XAML Spy

(まだダウンロードすらしてないけど)
http://xamlspy.com/
実行中アプリの XAML の内容を閲覧することが出来るツールです。Silverlgith、Silverlight For Windows Phone、WinRT に対応してます。
現在は Preview リリースなので無料で使用できるようです。

ちなみに作っているのは Silverlight Spy と同じところみたいです。

(@biac さんのつぶやきで気付いたので以下追記)
Silverlight は Web ブラウザーを内蔵していて、それ経由でアクセスすることにより任意のアプリの XAML を見ることができるようです。参考: Connecting a Silverlight application (Silverlight Spy も同様の動きでした)

Silverlight for Windows Phone はエミュレーター上で XAP を動かすことによって XAML を見るようです。なので、XAP が入手できるアプリであれば任意のアプリの XAML を見ることができるんじゃないかと思います。参考: Connecting a Windows Phone application

WinRT は Silverlight の Web ブラウザーや Silverlight for Windows Phone のエミュレーターにあたるものが無いようで、あらかじめコードに XAML Spy と通信するためのコードを埋め込んでおく必要があるようです。参考: Connecting a WinRT application ということは、あらかじめこのコードを埋め込んであるアプリの XAML しか見ることはできないことになりますね。

うーん、そうかぁ。
WinRT ランタイムをホストするための仕様なんかが公開されれば、それ経由で XAML にアクセスすることができるかもしれませんが、そうなるまではどうしようもないんでしょうね。

2012年4月20日金曜日

[.NET] async、await の発音は?

昨日参加した勉強会 MetroStyleDeveloper #02 での一コマ。
私はずっと 「async」「await」 を 「エイシンク」「エイウエイト」 と発音してました。
そしたら、さおさんから 「async って アシンク じゃなくて エイシンク だったんですかぁ」 と。で、私は 「非同期の asynchronous って エイシンクロナス ですよね?なので エイ でいいと思ってたんですが。。。どうなんでしょ?」 と。その場で 「どなたか英語に詳しい人、わかる人います?」 と聞いてみましたがどなたも返事なし。

ということで、あらためて調べてみた。
asynchronous は辞書の発音記号では eɪsíŋkrənəs。カタカナで書くとしたら 「エイシンクロナス」 ってところでしょうか。
await は辞書の発音記号は əwéɪt。カタカナで書くと 「アウエイト」 でしょうね。おぅ、こっちは エイ じゃなかったんだ。知らんかった。

さらに、あらためて Future directions for C# and Visual Basic を聞いてみた。
これは、C# の言語設計者であり、C# 世界の首領と言っていいであろう Anders Hejlsberg 氏の BUILD でのセッションです。
やっぱり、asynchronous は 「エイシンクロナス」、async は 「エイシンク」、await は 「アウエイト」 と言ってるように聞こえます。
(あと、async は async modifier で await は await operator なのか)

というわけで、これからは 「エイシンク」「アウエイト」 と言っておこう。
(ほんとはどう発音するのがいいのかご存じの方がいたら教えて下さい)

[C#] foreach の仕様が C# 5.0 で変更される

(Twitter 経由で知った 2ch のスレ経由で知った)
C# 5.0 の新機能 (C# によるプログラミング入門): 「foreach の仕様変更」 より。

おぅ、そうなんですか。知らんかった。
なんか、まったく同じ話を昔書いた覚えがあるなぁ、と思ったら 「Anonymous Method はクロージャではない その2」 これですね。
このときに 「それは仕様書の方が間違ってる」 と言ってた内容が C# 5.0 では正しいことになるというわけですね。
まぁ、確かに影響を受けるコードはそんなに多くないだろうとは思いますが、影響を受けるかどうかがパッと見でわかりにくいのがちょっとイヤンな感じ。(影響を受けるのは foreach のカウンタ変数をラムダ式や匿名メソッドでキャプチャしているときってことになるのかな?)

2012年4月19日木曜日

[.NET] .NET 4.5 は WinRT、Silverlight、Windows Phone のすべてを含む

.NET for Metro style apps」 より。
記事の中ほどに .NET Framework 4.5 は WinRT、Silverlight 5、Windows Phone 7.1 のすべてを含むということが図示されています。
WinRT は、今までの .NET Framework や Silverlight とはいろいろと違うところがあったりすると思いますが、.NET Framework 4.5 から見ればサブセットになるようにデザインされているようです。

と言っても、これはあくまで 「どっちがどっちのサブセットになっているか」 というような概念的なところでしょうし、そもそも、この解説を書いてるのが 「CLR コアフレームワークチームのプログラムマネージャー」 なので .NET Framework 4.5 や Silverlight といってもそのすべてのことではなく 「コア」 の部分のことです。
「コア」 っていうのは、簡単に言ってしまえば System.String とか System.Int32 とか List<T> とかっていう基本的な部分のことです。WPF やら XAML やらといった部分は含まれません。

このあたりの話は Silverlight 2 時代がわかりやすいんじゃないかと思います。
Silverlight 2 のときは .NET Framework と互換性がありませんでした。なので、Silverlight で作ったクラスライブラリのアセンブリ(DLL)を .NET Framework のプロジェクトで参照設定すると 「互換性がないアセンブリ」 と言われてビルドすることも実行することもできませんでした。たとえそのクラスライブラリが String しか使ってないような単純なものであってもです。
サーバーとクライアントでやりとりするデータをクラスとして表現してサーバーのプロジェクトとクライアントのプロジェクトで共有して使うっていうようなことが出来なかったんです。このころはソースコードを共有するしかありませんでした。(ソースコードは互換性がありました)
これが Silverlight 3 で変更されて .NET Framework と互換性があるようになりました。もちろん、.NET Framework にしか無い機能、Silverlight にしか無い機能を使ってるとダメですが、そうでなければアセンブリを相互に参照することができます。

ブログの記事にもリンクがある MSDN の 「汎用性のあるクラス ライブラリ」 が具体的です。
Visual Studio 11 Beta には汎用性のあるクラスライブラリを作るための Portable Class Library プロジェクトが入ってるそうです。このプロジェクトテンプレートを使えばどのプラットフォームのどのバージョンをサポートしたいかを選択できます。(たぶんそれに合わせて適切なアセンブリを参照してくれるんでしょう)
Portable Class Library で選択できるプラットフォームは以下みたいな感じ。

PortableClassLibraryDialog.png

Portable Class Library で使えるのは以下のアセンブリ。

  • mscorlib.dll

  • System.dll

  • System.Core.dll

  • System.ComponentModel.Composition.dll

  • System.ComponentModel.DataAnnotations

  • System.Net.dll

  • System.Runtime.Serialization.dll

  • System.ServiceModel.dll

  • System.ServiceModel.Web.dll

  • System.Xml.dll

  • System.Xml.Linq

  • System.Xml.Serialization.dll

  • System.Windows.dll

このうちすべてのプラットフォームで使えるコアアセンブリは mscorlib.dll、 System.dll、 System.Core.dll、 System.Xml.dll、System.Xml.Serialization.dll だけ。

2012年4月17日火曜日

[.NET] アプリの起動が速くなる MPGO (.NET 4.5)

Improving Launch Performance for Your Desktop Applications」 より。
MPGO という技術が解説されています。
上の記事ではかなり長文で詳細に説明されてますから、ここでは要点のみ。

.NET Framework のアセンブリは中に入ってるのは IL (中間コード)で、それが実行時(just in time – JIT)にコンパイルされて動きます。
ngen.exe を使って事前にコンパイルしておけば、実行時にコンパイルするオーバーヘッドがなくなるので起動などが速くなります。インストール時にインストーラによって ngen.exe が実行されるようにしておくというような感じで使われます。.NET Framework の System.DLL などは事前に ngen されています。
これがさらに managed profile guided optimization (MPGO)を使うと高速化できるそうです。

MPGO はコンパイル後のネイティブイメージがより効率良く読み込めるように配置してやる(キャッシュのヒット率が良くなるようにとかディスクアクセスが少なくなるようにとか)ことによって起動を高速化する技術だそうです。こういう技術ですので、それなりに大きなアプリでないとあまり効果は無いと思います。
また、これをするには事前に「トレーニング」が必要です。トレーニングというのは、実際にアプリを操作してそのときのコードの使われ方を記録するっていう操作です。なのでうまいことトレーニングしておかないと逆効果になってしまうようなこともあるんじゃないかと思います。

トレーニングするためのツール(mpgo.exe)は Visual Studio 11 Ultimate Beta に付いているそうです。
また、.NET Framework 4.5 に付いている ngen.exe は MPGO に対応しているそうなので、これを使ってトレーニング済みのアセンブリを ngen してやれば MPGO 済みのイメージとなるそうです。

2012年4月16日月曜日

[勉強会] MetroStyleDeveloper 大阪#02 「MetroStyle初心者の集い」に参加します

メトロスタイルな勉強会 MetroStyleDeveloper #02 が 4/19 の夜開催されます。
今回は平日の夜 19時~21時15分の開催です。

私も参加します。
スピーカーもさせて頂きますが、25分というショートセッションですし、「ざっくばらんに MestroStyle 初心者の集い」 がテーマなので、あまり堅苦しくなく軽いノリでいくつもりです。(と言うか、25分でまとめられる自信がない(笑))
まだ、余裕はあるようですので、興味のある方はぜひ。

2012年4月13日金曜日

[.NET] VB11 の新機能

Visual Basic 11 Beta Available for Download!」 より。
そういや、VB の新機能はまったく把握してなかった。
以下、気になったとこだけ。

Async / Await は、まぁ C# と同じ。

Iterator は、ん?なにこれ?VB は今まで yield return とか書けなかったんだっけ? Iterator キーワードと Yield キーワードを使うのか。

Iterator はラムダにも書ける。

Iterator Function()
    For Each fn In IO.Directory.EnumerateFiles("c:\\", "*.jpg")
        Yield fn
     Next
End Function.Invoke()

おぉう、これはキモい(笑) End Function の後ろに .Invoke() と続けることができるのか。

Caller Informatin は C# と同じだな。

ほう、Visual Studio は ByVal を付けなくなるのか。

2012年4月12日木曜日

[.NET] .NET Framework 4.5 の新機能 – Caller Information

こんなのあったんですね。
Caller Information (C# and Visual Basic)
機能としては見たまんまですね。呼び出し元の情報が取れるようになるというもの。
どうやらコンパイラがコンパイル時に埋め込むみたい。(実行時にスタックトレースをたどるというものでは無い)
なので難読化とかの影響は受けない。反対に動的に Invoke してるときとかは取れるとは限らない。という感じみたい。

2012年4月11日水曜日

[MetroStyle] マネージドコードで DirectX が使いたい

メトロスタイルでは基本的に WinRT を使うことになるわけですが、なんか WinRT に XNA って無くないですか?
Windows Phone にも乗って、Silverlight にも乗ったのに WinRT に乗らないとは思わなかったなぁ。
タブレットとかをサポートするために DirectX 自体がサポートされないのなら XNA が無いのもそりゃそうだと思うんですが。

Windows 8 アプリ開発者ブログ: 「XAML と DirectX の統合
これなんか読むとメトロスタイルでも DirectX は普通にあるんですよね?というか、DirectX はメトロスタイルでもかなり重要な要素だと思ってるように思います。けど、これを読むと、SurfaceImageSource なんかはマネージド側からはメソッドとかが見えなくなってて WinRT C++ から使わないといけないようになってるんですね。うーむ。

今は無いだけなのか、それとも今後も XNA をサポートするつもりは無いのかはよくわかりませんが、無いものは仕方ないですね。

で、どうやら SharpDX という DirectX をまんま C# でラップしたものがあるそうです。
DirectX 11.1、Windows 8 もサポートしていてメトロスタイルアプリからも使えるとあります。

Lighting Effects in your XAML/C# metro apps :)
Effect-Graphs in our XAML/C# metro apps using SharpDx :)
WinRT-XAML/C# アプリから SharpDX 経由で DirectX を使ってみたという記事がありました。
ほぅ。
自分では試してないですが、ほんとにちゃんと使えるみたいですね。

ちょっと気になるのは Windows Store から配布するには審査に通る必要がありますが、まさかマネージドから DirectX 呼んでると審査落ちするなんてことは無いですよね?(WinRT C++ が大丈夫なんですから大丈夫なんだと思いますが)

あと、ANX.Framework なんていうのもありました。
XNA 互換のライブラリだそうです。(SharpDX を利用)アルファとあるので完成度はわかりませんが。

というわけで XNA が無くても何とかなると言えば何とかなるのかな?
# いっそのこと OpenGL サポートしちゃえば iOS や Android からの移植が増えそうな気がするんだけど、そうはいかんもんだろうか。

2012年4月10日火曜日

[Silverlight] コントロールのテンプレートを書き換える

某所を見て難しいとか面倒とか言われていたので書いとく。

たとえば、「コンボボックスの IsEnabled が false のときの色を変えたい」なんてときはコントロールテンプレートを書き換えてやることになります。
Silverlight の標準のコントロールのテンプレートは MSDN の 「コントロールのスタイルとテンプレート」 にあります。コンボボックスなら 「ComboBox のスタイルとテンプレート」 です。

実際にコンボボックスを例にやってみます。

MSDN の前半に書かれているパーツやら状態やらは単なる説明なのでどうでもいいです。
XAML が書かれているところのちょっと上に使われている名前空間が書いてあります。xmlns:vsm と xmlns:sys を使ってるとあるのでこれらを書き足してやります。
続いて XAML の <Style TargetType=”ComboBox”> と <ControlTemplate x:Key=”ValidationToolTipTemplate”> を <UserControl.Resources> の中にそのままコピー&ペースト。
必要なのはこれだけです。

<UserControl x:Class="SilverlightApplication1.MainPage"
    ......
    xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    ......>

    <UserControl.Resources>
        <ControlTemplate x:Key="ValidationToolTipTemplate">
             ...MSDN の内容をここにペースト...
        </ControlTemplate>

        <Style TargetType="ComboBox">
             ...MSDN の内容をここにペースト...
        </Style>
    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">
        <ComboBox ... .../>
    </Grid>
</UserControl>

一つだけ注意があります。
MSDN 上では先に <Style ...> が書かれていますが、このスタイルの中で後に出てくる <ControlTemplate x:Key=”ValidationToolTipTemplate”> を使っています。この場合、実際の XAML では <ControlTemplate ...> を先に書いておかないとエラーになってしまいます。

あとはこの XAML を好きなように書き換えれば OK です。
上から眺めていけば

<vsm:VisualState x:Name="Disabled">
    <Storyboard>
        <DoubleAnimation Duration="00:00:00" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)" To=".55"/>
    </Storyboard>
</vsm:VisualState>

なんてのが見つかります。名前を見ただけでも 「Disabled になったときに DisabledVisualElement を 0.55 の透明度にする」 ということなんだろうという検討が付きますね。
で、この DisabledVisualElement を探すと

<Rectangle x:Name="DisabledVisualElement" RadiusX="3" RadiusY="3" Fill="White" Opacity="0" IsHitTestVisible="false" />

となってます。
試しに Fill=”White” を Fill=”Red” にしてみたら Disabled になったときに赤っぽくなるコンボボックスになりました。
XAML をガシガシ書き換えてやれば好きなようにカスタマイズできますので後はお好きなようにどうぞ。

ちなみに、Expression Blend を使うともっと簡単だったりします。
確か、コントロールを右クリックして 「テンプレートの編集」 とか何とかを選んでやるだけでよかったはず。

[勉強会] わんくま大阪 #48 に参加した

4/7 に開催された わんくま同盟 大阪勉強会 #48 に参加しました。
わんくまの勉強会に参加したのは確か 2回目。調べたら 1回目は 2007年 11月なのでずいぶん久しぶりですね。
前回もスピーカーさせてもらったんですが、今回も 「MetroStyle アプリ開発入門」 というセッションをさせてもらいました。

もちろん、自分のセッションだけでなく、すべてのセッションを聞かせてもらいました。
個人的にはあまりふれる機会がないようなジャンルのセッションが多かったので、どれもおもしろかったです。

懇親会にも参加しました。ちょっと飲み過ぎて翌日は二日酔いで大変でしたがw