ページ

2012年9月7日金曜日

[勉強会] メトロスタイルアプリ エキスパート塾++1 に行ってきた

8/30(木) PM7~9
MetroStyleDeveloper (プチ) #05 大阪   ~メトロスタイルアプリ エキスパート塾++1~
に参加してきました。
場所は梅田のフェンリルさんの会議室をお借りして。フェンリルさんと言えば有名ブラウザーのスレイプニルを作っているところですね。
スピーカーがしゃべるだけというセッション形式ではなく、説明を聞きながら各自実際にコードを書き進めるというハンズオン形式です。なので、みんな Windows 8 と Visual Studio 2012 が入った PC を持参です。

今回のテーマはさおさんの 「WinRT 実践~C++/CX編~」
実におもしろかったです。
C++ さわったのは久しぶりだったんですが、C++11 の auto とかラムダ式とかの新しい構文と、C++/CX の ref new とか String^ とかで、正直何が何やら状態(笑)
メインテーマは C++/CX での非同期処理の書き方(ppltasks.h の then とか)とかだったんですが、さおさんの説明もわかりやすく、進め方もうまかったので、みんなで 「ほぇ~、こんな書き方するのかぁ」 なんていいながら、ああでもない、こうでもないとやっているとあっという間に終了時間になっちゃったという感じでした。

そういや、Visual Studio 2012 のソリューションエクスプローラーでは Assets フォルダーが 「資産」、Common フォルダーが 「共通」 なんて表示されることでも盛り上がったり。
しかし、これ、こんなところ翻訳する必要無いんじゃないか?これって、「ファイルを Assets フォルダーに入れてください」 と言いたいときに Explorer と VS2012 上とではフォルダー名が違うってことになるし、しかも言語によっても違うってことになっちゃうような。

最後に次回予告の LT。
次回は私が担当させて頂きます。テーマは 「SharpDX を使って C# で DirectX をやってみる」 私自身 DirectX も SharpDX も初心者で、今から勉強しますって感じなのでどの程度説明できるかはわかりませんが、みんなで楽しくできればと思いますので興味のある方はぜひ。
MetroStyleDeveloper (プチ) #06 大阪 ~メトロスタイルアプリ エキスパート塾++2~

ちなみに、Windows 8 には 90日間評価版もありますし、Visual Studio Express 2012 ならもともと無料です。
マイクロソフト・エバンジェリストの大西さんのブログ 「評価版を利用してWindows 8アプリの開発を体験しよう
MSDN に入ってない方でも一般販売までこれらを使って試してみるってこともできますよ。

2012年8月17日金曜日

[WP8][Win8] Windows Phone 8 で XNA が使えるのか? Windows 8 で XNA が使えるのか?

■ Windows Phone 7 での XNA
Windows Phone 7.x では DirectX 系のものが使いたいときは XNA を使うことになります。WP7 では C++ 使えませんし、レガシーな DLL や COM を呼び出すこともできないので DirectX を直接使うことはどうやったってできません。(技術的には出来るかもしれませんが、そういうことをやると審査に通らなくなっちゃうはずなので公開することが出来なくなっちゃいます)

■ Windows 8 での XNA
ところで、Windows 8 のメトロスタイルアプリ(※1)では XNA は使えません。DirectX 系のものが使いたいときは 「C++ と DirectX を使え」 ということになっています。(SharpDX とかを使えば C# や VB から DirectX を呼び出せます。ただ、SharpDX はマネージドコードから DirectX を呼び出せるようにするラッパー + αなので 「DirectX を使え」 という点には変わりないです)

※1 メトロスタイルという名称は無くなるらしいですが、どういう名前になるのかわからないのでここではとりあえずメトロスタイルと表記します。

■ Windows Phone 8 での XNA
で、Windows Phone 8 ですが、まだ SDK もリリースされてないのでいろいろとわからないところが多いですが
Status update: Windows Phone 8 Developer Tools (2012.06.21)
にて、Microsoft の Mark Chamberlain 氏が

  • Windows 8 Metro UX(WinRT API)テクノロジーを使うようになる。
  • XAML/.NET と DirectX/C++ の両方をサポート。
  • DirectX/C++ で書かれたコードは Windows 8、Windows Phone 8、Xbox で走らせることができるぞ。
  • IE10 ベースの WebBrowser コントロールの上で HTML5 を動かすこともできる。

と説明しています。
かなり Windows 8 のメトロスタイルアプリに近くなるみたいですね。
(Windows 8 では HTML/JavaScript を使うこともできますが、WP8 にはそれは無さそう)
そして、XNA については

  • WP7 用の XNA アプリは WP7 と WP8 の両方で動く。
  • WP8 専用 XNA アプリを作ることもできる。

だそうです。
ということは、「WP8 には XNA を含んだ WP7 互換環境が入ってる」 だけじゃなくて 「WP8 にも XNA はある」 ってこと?
そうなると今度は 「Windows 8 のメトロスタイルアプリで XNA 使えるようにはならないの?」 という疑問が。WP8 の WinRT に XNA があるんだとしたら Windows 8 の WinRT にも XNA があってもいいよねぇ。

■ 再び Windows 8 での XNA
しかし、 「Windows 8, XNA and MonoGame – Part 1, Overview」 には

  • Windows 8 のメトロスタイルアプリの開発には XNA Framework は使えない。
  • 推奨は HTML5/JavaScript、XAML/C#、XAML/VB、DirectX/C++ のいずれか。
  • デスクトップアプリとしてなら XNA を選択できる。

と明言されています。
そして、

  • MonoGame を使えばメトロスタイルアプリで XNA を使うことができる。

だそうです。
MonoGame は XNA 互換フレームワークを実装するオープンソースプロジェクトです。(まだ開発中らしい)
名前からして Mono の一環でしょうし、Windows、Windows Phone、iOS、Android、Mac OS X、Linux、PlayStation Suite をサポートする予定だそうです。
記事に図がありますが、WinRT 上の MonoGame は SharpDX を使ってるようですから、要するに 「(WinRT 上の MonoGame は)SharpDX を使った XNA 互換のフレームワーク」 ということですね。そして、Microsoft は WinRT 上に XNA を実装するつもりは無いけど、MonoGame があるからまぁいいでしょ、ということなんでしょうね。なんというか、「お、おう」 という感じw

というわけで、Windows 8 のメトロスタイルアプリでは XNA は無いけど MonoGame があるから XNA 互換で開発ができるってことのようです。
(となると、WP8 も XNA が載ってるわけじゃなくって MonoGame を使うっていう落ちなような気がしてくるな)
ちなみに、「Windows 8, XNA and MonoGame - Part 2, Getting Started」 「Windows 8, XNA and MonoGame - Part 3, Code Migration and Windows 8 Feature Support」 ではチュートリアル的に MonoGame を使ってメトロスタイルアプリを作る方法が解説されています。

2012年7月24日火曜日

[勉強会] MetroStyle アイデアソン・ハッカソンに行ってきた

MetroStyleDeveloper と VS ハッカソン倶楽部のコラボ勉強会
7/14(土) MetroStyleアイデアソン
7/21(土) MetroStyleハッカソン
に参加しました。

7/14(土)
梅田の ECC コンピュータ専門学校にて。
この日は 「Windows 8 を入れてない人は入れてみよう」 「メトロスタイルの勉強会」 「アイデアソン」 という盛り沢山の内容。
私はセットアップのお手伝いなんかもするスタッフという立場での参加。

11時くらいに会場入り。
MetroStyleDeveloper のリーダーであるさおさんからの挨拶の後、さっそく Windows 8 Release Preview と Visual Studio 2012 RC のセットアップを開始。何人かの方がこれらの iso を持ってきていたので、それらを使ってセットアップ作業を進めます。私も DVD に焼いたものと USB メモリに入れたものを持って行きました。
ほとんどの方が VMWare Player を使っていたようです。VHD にインストールしている方もいました。2~3人くらいの方がインストール中に VMWare が落ちちゃってどうにもならず VMWare を諦めて VirtualBox に切り替えてました。今どきの仮想環境はホスト OS だけでなく CPU や BIOS のサポート具合なんかもからんでくるので、こういったよくわからないトラブルはどうしても発生しますね。

昼食を挟んで 13時からはメトロスタイルの勉強会開始。
セットアップ中の人はセットアップを進めながらセッションを聞く形。私は部屋の後ろからセットアップの様子を眺めつつセッションを聞いてました。詰まってそうな人がいたらちょこちょこと助言したり。Twitter にも書きましたが、後ろから眺めてると 30台以上のノート PC すべてが Windows 8 っていうのは何ともすごい光景でした。
最終的には全員の方が Windows 8 と VS2012 のセットアップに成功したようです。
仮想環境だと遅いという声も聞かれましたが、仮想環境だけどまったく問題無い(仮想環境とは気付かないくらい普通に動く)という方もいました。CPU、割り当てメモリ量、GPU などいろいろな要因があるんでしょうが、なんでこんなに違うのかはよくわかりません。ちなみに私は仮想環境は使わず VHD で直接入れているのですこぶる快適です。もう自宅の PC は Windows 8 Release Preview とか使わなくなっちゃいました。

そういや 3時ごろには恒例のおやつタイムもありました。みんなでドーナツを頂いたんだっけかな。

続いてアイデアソン。来週のハッカソンのときに開発するソフトのネタを考えます。
6チームほどにわかれてアイデア出し。出たアイデアは紙に書き留める。(事前に色ペンや画用紙・模造紙を配布済み)10~15分の短時間でいったん区切って各チームどんなアイデアが出たか発表。それを聞いて各自気になった所に移動。これを 3回くらい繰り返してメンバーを変えつつネタをブラッシュアップしていきます。そして、このチームで来週のハッカソンを行うことになります。
こういう形式は始めてでしたが(というか、アイデアソンやハッカソン自体ほとんど経験がありませんが)とてもおもしろかったです。短時間でも意外となんとかなるもんですね。

終了後は 4名(私含む)で飲みに。いろんな話で盛り上がりました。個人的にはちょっと飲み過ぎましたがw

アイデアソン後
VS ハッカソン倶楽部のリーダーである森理麟さんがチームごとに Google ドキュメントと Subversion のリポジトリを用意してくれました。
チームによっては Google ドキュメントのディスカッション機能(ドキュメント上でチャットできる)を使って打ち合わせをしたり、リポジトリにサンプルコードやプロジェクトの雛形を入れたりしていました。

7/21(土)
淀屋橋の IIJ さんの部屋をお借りしてハッカソン本番です。
森理麟さんの挨拶のあと、さっそくハッカソン開始。
チーム分けはアイデアソンで決まったまま。ハッカソンのみ参加の方はどっかのチームに潜り込む感じ。やはり事前にアイデアソンがあったのと、その後に一週間の時間があったのとで、各チーム比較的スムースに作業に入れたように思えました。
私は事前にチューターをお願いされていたのでチームには入らずに部屋の中をうろうろして質問に答えたり、人手が足りないところのお手伝いをしたりしてました。がっつりコーディングするという参加の仕方ではなかったわけですが、これはこれでものすごく楽しかったです。

今回のハッカソンは 「完成しなくても仕方ない」、というか、大多数の人が初体験のメトロスタイルアプリ開発なわけで、「さすがに 6時間で完成は無理だろ」 という感じもあったためか比較的まったりした雰囲気でした。それでも、最後の発表の段階では各チーム部分的にでもデモができるように仕上げてあって(デモが無理な部分はプレゼン資料で作ってあったりして)さすがという感じ。

終了後はみんなで懇親会。
さらにその後 4名(私含む)で二次会。
またちょっと飲み過ぎたかもw

ほんとに楽しかった。またぜひ参加したい。

2012年6月19日火曜日

[勉強会] VSUG DAY 2012 Summer(東京)に行ってきた

6/16 にマイクロソフトの品川オフィスで開催された VSUG DAY 2012 Summer に行って来ました。
当日早くに新幹線で移動して、ちょうど受付開始時間くらいに会場に到着。
すべてのセッションを聞かせて頂きましたが、Windows 8 に Visual Studio 2012、ASP.NET MVC と旬なものが盛り沢山といった感じでものすごくおもしろかったです。

私もセッションを担当させて頂きました。セッションで使った資料を下に貼り付けておきます。(そのうち VSUG のサイトにまとめて上げられるかもしれませんが)
そういや、デモをしようと VS2012 を立ち上げたときにメトロスタイルのデザイナーがエラーを表示して動かなかったのはちょっと焦りました。エラーメッセージを見ると 「解像度が 1024×768 を下回ってる」 となってて、原因がすぐにわかったので事なきを得ましたが。(プロジェクターに繋いだ時にいつの間にか 1024×600 とかになってて縦が 768 無かったのが原因)しかし、1024×768 無いとデザイナーすら立ち上がらないというのは知りませんでした。

終了後はいつものように懇親会に参加。
さらに二次会へと移動。実はこのあたりからあまり記憶がありません(汗)
その後、温泉に泊まり、お風呂の中で寝てしまったり、テーブルに突っ伏して寝てしまったりw
翌日はお台場のガンダム見てから新幹線で帰阪。

2012年6月16日土曜日

[勉強会] VSUG DAY 2012 Summer(東京) 6月16日開催!

今年も VSUG DAY 2012 Summer がマイクロソフトの品川オフィスをお借りして 6月16日に開催されます。
VSUG に会員登録さえしておけば参加は無料です。

今回は Windows 8、Visual Studio 11 といったところを中心としたセッションとなっています。
私もスピーカーをさせて頂きます。
(Windows Developer Days で 6月第1週に Windows 8 Release Preview がリリースされるとアナウンスされたので、それを使うつもりですが。。。ものすごく変わっていたらどうしようとちょっとビクビクしていたり)

VSUGDAY_2012_Summer_120×180.png

(この記事の日付を VSUG DAY が開催される日にしてあるので、それまで一番上に表示されます)

2012年6月14日木曜日

[Win8] 今さらですが Windows 8 Release Preview をインストール

今さらですが Windows 8 Release Preview をインストールしたのでその覚え書き。

インストール先 PC は MacBook Pro。(ちょうど今日新型の MacBook なんかが発表されてるようですが、もちろんそんなのではなく 1年くらい前の機種です)
Mac ではありますが、パーティション分けて Mac OS と Windows 7 が入っていて、その Windows 7 側に入れるので入れ方はごく普通の PC と同じです。

すでに入っている Windows 7 の環境を壊さないように VHD で入れることにしました。
VirtualPC や VirtualBox、VMWare などといった仮想マシンと違い、VHD は仮想ハードディスクです。すでに入ってる Windows 7 から見ると数十Gバイトあるでっかいファイルが一つ増えるだけです。パーティションを切り直したりなどややこしいことをする必要が無いので既存環境を壊す心配を(あまり)しなくてよくなります。かつ、仮想マシンだとそれなりにパフォーマンスが劣化しますが、VHD だとパーティションを分けてデュアルブートにしたのとほとんど変わらないためパフォーマンスの劣化はありません。(ハードディスクが仮想になっている分の影響はあるのかもしれませんが)

■ VHD に Windows 8 Release Preview をインストール

Windows 8 Release Preview を VHD にインストールする手順は
http://www.atmarkit.co.jp/fwin2k/win7/11vhdboot/11vhdboot_02.html
こちらの Windows 7 を VHD にインストールする手順と同じでした。
ざっと書いておくと

  1. まずは Windows 8 Release Preview の ISO イメージ をダウンロードして DVD なり USB メモリなどに焼く。(手元に手頃な USB メモリが無かったので DVD に焼きました)
  2. これを PC に入れてブート。(MacBook Pro の場合は Option キー押しながらブートして DVD を選択してやると “Press any key” とか何とか言われたので何かキーを押したらブートしてくれた)
  3. しばらく待っていると、最初のインストールする言語などを選ぶダイアログが出るのでここで Shift + F10 キーを押してコマンドプロンプトを立ち上げる。
    ここで以下のように入力。(太字が入力するところ)
    X:\Sources> diskpart
    DISKPART> create vdisk file=c:\VHD\Windows8RP.vhd type=fixed maximum=50000
    DISKPART> select vdisk file=c:\VHD\Windows8RP.vhd
    DISKPART> attach vdisk
    DISKPART> exit
    X:\Sources> exit
    これは、diskpart の create で C ドライブの VHD フォルダーに Windows8RP.vhd というファイル名でサイズ 50ギガバイトの仮想ハードディスクを作ってます。もちろん、ファイル名、サイズははなんでもいいです。おそらく Windows 8 Release Preview と Visual Studio 2012 を入れるくらいなら 30ギガくらいでも足りるんじゃないかと思いますが、やったこと無いので確実なところはわかりません。
    ちなみに、この create はそれなりに時間がかかります。50ギガだと 20~30分くらいかかったような。
    create が出来れば、あとは一瞬で終わります。
    仮想ハードディスクができたら exit してコマンドプロンプトを閉じます。
  4. インストールを進める。
    「今すぐインストール」 して、プロダクトキーを入力(プロダクトキーは ISO イメージのダウンロードサイトに書いてある)して、ライセンスに同意して、次のところでカスタムインストールを選択しインストール先を選ぶ。
    DiskPart で作った領域があるはずなのでそれを選択します。たとえば、「ドライブ 1 の割り当てられていない領域  48.8GB」 とかになっている。
  5. あとはそこにインストールしていけばいいはず。

ただ、私の MacBook Pro ではうまくいきませんでした。
上記の 4 のところで 「ドライブ 1 のパーティション 1 に Windows をインストールすることはできません」 とか言われちゃいます。詳細を表示してみると 「このディスクに Windows をインストールすることはできません。このコンピューターのハードウェアでは、このディスクでの起動がサポートされていない可能性があります」 とか何とか書かれてます。検索してみると MacBook に BootCamp 無しで Vista や Windows 7 を入れるときにも同じように言われるようです。で、解決策らしい解決策はみつかりませんでした。


■ 最初だけ VirtualBox を使って VHD に Windows 8 Release Preview をインストール

というわけで違う方法を。
使う方法は伊勢シンさんの 「インストールメディアを一切用意せずにWindows 8を物理ブートできるようにセットアップする方法」 こちらに書かれている方法まんまです。
こちらの記事はタイトルのとおり、DVD や USB メモリといったメディアが無いときに ISO ファイルだけでインストールする方法ですが、今回のように MacBook Pro で VHD を作ってもインストーラにはじかれちゃう時にも有効なようです。
伊勢シンさんの記事のままですが一応手順を書いておきます。

  1. 既存の Windows 7 に VirtualBox をダウンロードしてセットアップ。
  2. VirtualBox で Windows 8 の仮想マシンを作成。このとき、VHD には上で作った Windows8RP.vhd を指定する。(もちろん、伊勢シンさんの記事にあるように 「コンピューターの管理」 で VHD を作成してもいいと思います。ただ、以前に同じことをやったときに 「コンピューターの管理」 で作った VHD を VirtualBox が認識できなかったことがあります。どこかの設定を間違ってただけだと思いますが。VirtualBox にも VHD の新規作成がありますからそちらで作成すればもちろん VirtualBox に認識されます)
  3. 仮想マシンのストレージの CD/DVD に Windows 8 Release Preview の DVD を指定する。
  4. 仮想マシンを起動して Windows 8 Release Preview をセットアップ。
  5. 最初の再起動のところで仮想マシンを終了する。

伊勢シンさんのこの記事を最初に見たときはかなり驚いたんですが、こんなことができるんですね。
最初の再起動の時点までで起動に必要なものはひととおり VHD の中にコピー済みなわけです。なので、あとは VHD の中の OS をブートするようにしてやれば OK なんですね。
というわけで、まずはデュアルブートの選択ができるようにします。

  1. コマンドプロンプトを 「管理者として実行」 で立ち上げる。
    ここで以下のように入力。
    C:\> BCDEDIT /copy {current} /d "Windows 8 Release Preview"
        (ここで表示される {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx} を以下にコピーする)
    C:\> BCDEDIT /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx} device vhd=[C:]\VHD\Windows8RP.vhd
    C:\> BCDEDIT /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx} osdevice vhd=[C:]\VHD\Windows8RP.vhd

続いてブートローダーを置き換えます。(Windows 7 のブートローダーでは Windows 8 を起動することが出来ないそうです)

  1. Windows 8 のインストールメディアのルートにある bootmgr を C:\bootmgr_new フォルダーにコピーする。
  2. マシンを再起動。
  3. 上の BCDEDIT の設定がうまくできていれば、Windows 7 と Windows 8 Release Preview を選択する画面が出るはず。ここで Windows 7 の上で F8 を押してオプションに入り、「コンピューターの修復」 でログインしてシステム回復オプションを表示し、コマンドプロンプトを起動する。
    この回復オプションのコマンドプロンプトで以下のように入力。
    C:\> ATTRIB –R –S –H C:\bootmgr
    C:\> REN C:\bootmgr C:\bootmgr.bak
    C:\> COPY C:\bootmgr_new\bootmgr C:\
    C:\> ATTRIB +R +S +H C:\bootmgr
    (ようするに Windows 8 Release Preview の DVD に入っている bootmgr を C ドライブのルートにコピーするってことです)
  4. 再びマシンを再起動。
  5. 今度は Windows 8 Release Preview の方を選択して起動すれば Windows 8 のセットアップの続きが始まるはず。

これで Windows 8 Release Preview が VHD にインストールできました。
ちなみに、コントロールパネルの 「システム」 の 「システムの詳細設定」-「起動と回復」 でブート時にデフォルトで選択する OS を指定できます。


■ Microsoft アカウントへの切り替え

いきなり Microsoft アカウントでユーザーを作成すると C:\Users\%USERNAME% のところが Microsoft アカウントでの名前(live.com 上で登録する名前)になるようです。なので、ここに日本語(全角文字)を使ってると C:\Users\%USERNAME% も日本語(全角文字)になっちゃってとても気持ち悪いことになります。

今回、私がインストールしたときはローカルアカウントしか聞かれませんでしたが、以前 Developer Preview を入れたときは最初に Microsoft アカウントを聞かれて、そのときは確かに C:\Users\青柳臣一 とかってなってたように思います。

これは、

  1. インストール時は Microsoft アカウントでは無くローカルアカウントで入れる。
  2. インストール後に 「PC 設定」 の 「ユーザー」-「Microsoft アカウントへの切り替え」 で Microsoft アカウントに切り替える。

こうすると C:\Users\%USERNAME% のところは 1 で入力したユーザー名のものがそのまま使われるようです。
(こうすればいいとどこかで読んだのですが、どこで読んだのかわすれちゃいました)


■ BootCamp のドライバーをインストール

上記の方法で Windows 8 Release Preview を入れてみたところ、無線LAN、サウンド、カメラといった標準装備のデバイスが全然認識できてませんでした。(Consumer Preview のころも同じでしたが)
Mac 側で BootCamp のドライバーを DVD に作って、これを使ってドライバーを入れようとしました。しかし、セットアップを起動すると 「Windows 7 では無い」 と言われてセットアップできません。「互換性」 で Windows 7 にしても状況は変わらず、どうしようもありませんでした。

で、ちょっとまともな方法とは言えないかもしれませんが、以下の方法で対応。

BootCamp のドライバーディスクの Drivers フォルダーの下にある XxxxInstaller とか XxxxSetup とかの実行ファイルを片っ端から実行しました。32 とか 64 とか付いてるものは(今回は Windows 8 64bit なので) 64 の方を、付いていないものはとりあえず起動してみるという感じ。どうやら大元の setup.exe は Windows 7 かどうかをチェックしていますが、個別のインストーラーは特にチェックしていない様子。Drivers フォルダーの下をたどって、インストーラーらしいものを片っ端から実行してやると無線LAN、サウンド、カメラといったデバイスが一通り認識されるようになりました。

あと、これは MacBook だからかどうかわかりませんが、ディスプレイの輝度が明るくなったり暗くなったりどうもおかしいです。これは、「PC 設定」 の 「全般」-「画面」-「画面の明るさを自動的に調整する」 をオフにして手動で固定値にしてやりました。


■ Visual Studio 2010 や Windows Phone 7.1 SDK を入れる

使うこともあるかと Visual C# 2010 Express や Windows Phone 7.1 SDK を入れました。これらは Visual Studio 2012 と共存できます。もちろん、必要ない人は入れる必要はありません。

VS2010 は何も問題なく入りました。もちろん、VS2010 SP1 も問題なく当たりました。(というか SP1 を当てておかないと Windows Phone 7.1 SDK が入りません)

Windows Phone 7.1 SDK を Windows 8 Release Preview に入れるときは以下の手順が必要な必要です。
Windows Phone SDK 7.1.1をWindows 8 Release Previewへインストールする際の注意点


■ ブート時の OS の選択を消す

インストールとは関係無いですが、bcdedit で余計なエントリーを消す方法。

  1. コマンドプロンプトを 「管理者として実行」 で起動する。
    ここで、
    C:\> BCDEDIT
        ここに一覧が表示されるので消したいエントリーの identifier (GUID)を控える

    C:\> BCDEDIT /delete {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx}

■ ディスクの使用容量は?

途中でディスクの使用容量見てなかったんですが、

  • Windows 8 Release Preview
  • Microsoft Office 2010 Standard
  • Visual C# 2010 Express
  • Windows Phone 7.1.1 SDK
  • Visual Studio 2012 Ultimate

とこれだけ入れると 30.7ギガバイトでした。

2012年6月7日木曜日

[WP7] Lumia 800 を 105,000フィートまで飛ばしてみた

University of Southampton sends a Nokia Lumia 800 to 105,000 feet」 より。
こちらは Microsoft UK Education チームのブログですが、Southampton 大学が ASTRA(Atmospheric Science Through Robotic Aircraft : ロボット機による大気研究、という感じかな)の一環として Windows Phone 7.5 搭載の Nokia Lumia 800 を 105,000フィートまで飛ばしてみたということが紹介されています。
記事やリンク先には上空から撮影した美しい写真がいくつか紹介されています。(もちろん、Lumia 800 で撮影したものなんでしょうね)

大気調査用の風船に Lumia 800 を付けて飛ばし、高度 105,000フィート(32km)まで上がり、そこは –61C の世界だそうです。
データは Windows Azure で処理しているそうですが、どうやら高度 8km までは 3G で接続できていたということみたいです。図に高度 23km でパワーダウンとありますね。解説は見つかりませんが、低温すぎて機能不全をおこしちゃったのかな?けど、GPS やジャイロ搭載で通信機能まである安価な機器ってことで、観測用風船の軌道調査などに役立ちそうだってことみたいです。
確かに考えてみりゃ、GPS やジャイロ、カメラ、3G、WiFi といった機器を装備していて、かつ、無料の開発環境(Visual Studio)でアプリを作れるデバイスが数万円程度で手に入るんですからねぇ。

2012年6月1日金曜日

[VS2012] async/await のパフォーマンスの注意点

前の記事 で紹介した 「What’s New for Parallelism in Visual Studio 2012 RC」 の補足記事が来てました。

Performance consideration for Async/Await and MarshalByRefObject
これ、個人的にはものすごく重要なことのような気ガス

前の記事にあった StreamReader.ReadLineAsync メソッドが 3倍速くなったとかはどういうことなのか?
詳しくは上の記事を読んでもらった方がいいと思いますが、ざっくりと説明します。
上記の記事からコードの重要な部分をコピペします。

class MyObj 
{ 
    const int ITERS = 100000000; 
    private int m_data; 

    public async Task Foo1() 
    { 
        for (int i = 0; i < ITERS; i++) m_data++; 
    } 

    public async Task Foo2() 
    { 
        int localData = m_data; 
        for (int i = 0; i < ITERS; i++) localData++; 
        m_data = localData; 
    } 
}

この Foo1 メソッドと Foo2 メソッドの実行速度を調べると Foo1 の方が 3倍くらい遅いそうです。
なぜか?
async なメソッドはコンパイラによって中身がゴニョゴニョされて await が使用できるようなコードに変換されます。(メソッドの中身が IAsyncStateMachine を継承した別クラスに切りだされて、await ごとに状態遷移するようなステートマシンなコードになる) コード上では単なるフィールドへのアクセス(m_data へのアクセス)に見えますが、コンパイル結果は単なるアクセスじゃなくなっているわけです。そのため、その分遅くなってしまうということだそうです。

さらに

class MyObj

class MyObj : MarshalByRefObject

とすると差が大きくなります。
実に Foo1 は Foo2 の 72倍くらい遅くなってしまいます。Foo2 の方は MarshalByRefObject であっても無くてもほとんど速度は変わりません。
これは、どうやら以下の理由だそうです。
MarshalByRefObject を継承したクラスはリモートアクセスが可能になります。リモートアクセスする場合はプロキシーが生成され引数などがマーシャリングされて渡されるわけですが、これはかなり重い処理です。なので無駄にプロキシー経由にならないようになっています。プロキシーが必要かどうかは 「別 AppDomain かどうか」 で判断します。しかし、この判断自体もオーバーヘッドになってしまいます。なので、JIT は自分自身(すなわち “this”)にアクセスする場合は絶対に同じ AppDomain だとしてチェックを省略し、普通にローカルなフィールドにアクセスするのと同じ速度になるようにしています。
ところが、async なメソッドになると上に書いたようにメソッドの中身が別クラスに切り出されるため m_data へのアクセスは this へのアクセスではなくなります。そのため m_data にアクセスするたびに 「同じ AppDomain かどうかのチェック」 をしなくちゃいけなくなります。これがオーバーヘッドになって 72倍という速度差になります。(ちなみに、もし別 AppDomain になって、プロキシー経由のアクセスになると数百倍くらいの速度差にはなるんじゃないかと思います。COM のころはそんな感じでした)
ちなみに、Stream や TextReader、TextWriter といったクラスは MarshalByRefObject から派生しています。

これはプロパティにするとちょっとましになるそうです。

private int Data { get { return m_data; } set { m_data = value; } } 

public async Task Foo3() 
{ 
    for (int i = 0; i < ITERS; i++) Data++; 
}

意味的には Foo1 とまったく同じですが、JIT が最適化するヒントになって Foo3 は Foo2 に比べて 10倍くらい遅い(Foo1 に比べて6倍ちょっと速い)となるそうです。

まぁ、こうしても遅くなるのは確かなので結局のところ 「async なメソッドでは極力フィールドやプロパティにアクセスせず、可能な限りローカル変数アクセスになるようにする」 ということになりそうです。
別の意味でもなるべくローカル変数になるようにした方が安全です。
async なメソッドで await を使うと非同期で動くようになるわけですからそこからフィールドやプロパティにアクセスするときは排他を考えてやらなくちゃいけません。async/await を使うとあまりにお手軽に非同期できちゃうので忘れがちになってしまいますが、非同期で動いている以上、外部のリソースにアクセスする場合は常に 「別の非同期メソッドとの読み書きがバッティングして内容が破壊されるようなことは無いか」 を考えてやらなくちゃいけません。ローカル変数は外部ではありませんので、そういったややこしいことを考える必要が無くなります。(注意: 別のクラスのインスタンスをローカル変数に持っていて、そのインスタンスが別の非同期メソッドからアクセスされるような場合は当然ちゃんと考えてやらなくちゃいけません。ローカル変数ならなんでも大丈夫ってわけじゃありませんのでご注意を)

[VS2012] Visual Studio 2012 RC での変更点

What’s New for Parallelism in Visual Studio 2012 RC」 より。
Visual Studio 2012 RC での変更点がまとめられてました。

コンパイル時に async なメソッドには AsyncStateMachineAttribute がつけられるようになったそうです。コード解析するツールとかで async なメソッドであったことがわかるようにってことらしいです。

async/await キーワードに関しては(中身が)いろいろ変わった模様。
いろいろ改良されて、async/await 時に消費されるメモリも、オーバーヘッドもかなり減ったとのこと。
また、ベースクラスライブラリ(BCL)の Async なメソッド自体も改良されているそうです。たとえば、StreamReader.ReadLineAsync メソッドは 300% くらい速くなってるとか。他にも BufferedStream 類もいろいろ改良したとか、AsStream や AsStreamForRead なんかは BufferedStream を使うようにしたとか、非同期関連はコンパイラ・ライブラリ通していろいろと改良されているようです。

ASP.NET も Beta まではイベントハンドラに async 付けるとバギーだった(代わりに RegisterAsyncTask を使う)のが、どうやら async 付けても大丈夫になった模様。
他にも HttpRequest、HttpResponse でキャンセル可能になったとかいくつかの改良がされているようです。

Dataflow (System.Threading.Tasks.Dataflow)がなくなっちゃいました。
どうやら、Beta まではフル .NET Framework のパッケージに入ってたけどメトロスタイルには無いとかそういう状況だったけど、デスクトップとメトロスタイルの両方で使えるように .NET Framework からは分離して NuGet で提供するようにしたってことみたいです。
詳細は 「MEF and TPL Dataflow NuGet Packages for .NET Framework 4.5 RC [Nick]」 にあります。
System.Threading.Tasks.Dataflow.dll は無くなって Microsoft.Tpl.Dataflow として NuGet にある。これはデスクトップ、サーバー、メトロスタイルのすべてをサポートする。なお、まだ Prerelease なので “Include Prerelease” にしておかないと一覧で出てこない模様。
あと、MEF も Beta のころはメトロスタイルでは .NET Framework 版 MEF のサブセットが使えるという感じだったが、これからは MEF for Metrostyle という新しいパッケージとして NuGet で取得できるようになってるそうです。

2012年5月24日木曜日

[MetroStyle] WinRT に Jet API なんてあったのか

先日の記事へのコメント で WinRT に Jet API があると教えてもらいしました。
へぇ、確かにリファレンスに載ってますね。
Win32 and COM for Metro style apps (data)
けど、これ、「メトロスタイルアプリでサポートされている」 と書かれてますが、どう使ったらいいのかさっぱりわかりません。Jet API のリファレンス自体は既存のものをコピペしただけみたいで Vista とか Windows 2000 とか書かれたままですし、.h と .lib が書かれているだけで namespace とかなんにもないのでマネージドから使える気がしません。これって、DirectX が C++ からしか使えない(マネージドから使いたいときはラッパーを自分でどうにかする必要がある) のと同じように C++ からなら使えるってことなんですかね?

ライブラリーの名前が ESENT.dll となってますが、ESENT っていうのは Extensible Storage Engine のことで、Jet Blue と呼ばれることもある Jet の拡張版みたいなものらしいです。ESENT 自体は Active Directory や Windows Desktop Search、Windows Mail、Live Mesh、Windows Update などで使われているそうです。

で、ちょっと検索してみたら
Making ESENT / Jet APIs work in Metro-style apps
こんな記事を見つけました。
ESENT をメトロスタイルアプリ(C#)で使ってみたという記事です。
どうやら、CodePlex にある ManagedEsent (名前のとおり ESENT.dll をラップしてマネージドから使えるようにしたもの) を使ったら ManagedEsent のサンプルコードがほとんどそのままメトロスタイルアプリでも使えたってことのようです。
やっぱり、ESENT.dll はそのまま使えるのは C++ からで、マネージドから使いたいときはラッパーを自分でなんとかする必要があるみたいですね。

けど、サンプルコードとか見てもこの ESENT.dll ってあまり使い勝手はよさそうではないなぁ。ManagedEsent には IDisposable を実装して using を使えるようにしたクラスとかも用意されているようですが、それでもあまり気軽に使えるっていう感じではなさそう。
もともと、ローカルにちょっとしたデータを保存するのに便利なものはないかと思ってたんですが、これなら永続化可能なクラスを読み書きしたり、XElement 属あたりを使って XML を読み書きしたりした方が楽そう。(わざわざ WinRT で ESENT.dll を使えるようにしたのは、Windows 8 標準のメールアプリや SkyDrive アプリなんかで使いたかったからかなぁ。Windows Mail や Live Mesh が ESENT を使っているそうなので、そんな感じがする)

2012年5月22日火曜日

[MetroStyle] メトロスタイルアプリで SQLite を使う

Using SQLite in a Metro style app」 より。
Tim Heuer 氏のブログでメトロスタイルアプリで SQLite を使うことについて紹介されていたので覚え書き。

どうやら SQLite はすでに WinRT に対応しているので自分でビルドしてやればメトロスタイルアプリで使えるってことみたいです。
で、.h と dll を使えば C++/CX から使えるし、参照設定してやれば C#、VB、JavaScript から使えるようです。

そういや ARM でも使えるのかな?確か C++/CX ではターゲットを x86、x64、ARM から選べて、みんなを含めたパッケージにしておけばどこでも動くものが作れるって話だったと思うから、SQLite が ARM 向けにビルドできれば大丈夫そうではあるけど。

つか、WinRT で使える SQL Server Compact Edition とか無いのかな?

2012年5月21日月曜日

[VS11] Visual Studio 11 のラインナップ

A look ahead at the Visual Studio 11 product lineup and platform support」 より。
Visual Studio 11 の製品構成が発表されてました。

まず、Visual Studio 11 っていうのはあくまでコードネームで正式名ではないってことだったと思いますが、名称については特に何も書かれてないですね。VS11 が正式名になるんだろうか?

で、ラインナップですが、 http://www.microsoft.com/visualstudio/11/en-us/products ここに書かれてるようになるってことみたいです。上記の記事にある “Visual Studio product website” のリンクから行くと日本語のページにいきますが、英語の方のページを見てみると微妙に違います。ラインナップが書かれていますし、日本語のページの方はすべて “Visual Studio 11 Beta” と表記されていますが、英語の方は(タイトルロゴ以外は) “Beta” の文字が無くなっています。ただ、リンク先は Beta のままだったりするのでちょっとアレですが。

有償版の方は VS2010 と似たようなラインナップみたいですが、無償の Express は大きく変わるみたいですね。
C#、Visual Basic といった言語別の Express は無くなり、Express for Windows 8、Express for Web になるようです。for Windows 8 では C#、Visual Basic、C++、JavaScript が使えるようです。ここで言う “for Windows 8” がメトロスタイルアプリのことだけを言ってるのか、メトロスタイルでは無い .NET Framework アプリの開発もできるのかはよくわかりません。(自分は Express を入れてないからわからないんですが、確か VS11 Express for Windows 8 Beta ではメトロスタイルのみって話だったと思うんですが)
あと、記事には 「Blend、プロファイラー、ユニットテストなどといったメトロスタイルアプリの開発に最適なツールも提供される」 ともあります。Express にもこういった機能が入るってことでしょうか?Blend も Express に付いてるってこと?

で、最新のプラットフォーム向けの特別なツール無しの言語別の Express が使いたい場合は、今後も VS2010 Express は引き続き提供されるので、そっちをダウンロードして使ってくれということだそうです。
これは VS11 Express にはメトロスタイル用の for Windows 8 と Web 用の for Web しか無いからそれ以外の普通の .NET Framework 4、4.5 の開発とかネイティブ C++ の開発とかは VS2010 Express を使えってこと?せめて VS11 for .NET Framework 4.5 は欲しかったような(for Windows 8 に .NET Framework 4.5 も含まれるんならいいんですが)

あと、Windows Phone ですが、これは次の Windows Phone がリリースされる時に Visual Studio Express for Windows Phone がリリースされる予定だそうです。ということは Windows Phone 8 のときってことなんでしょうね。(それにしてもそろそろ Windows Phone 8 アプリが Silverlight for Windows Phone 7.1 の発展系になるのか、WinRT の Windows Phone になるのか、それ以外になるのか、といったくらいのところは教えて欲しいなぁ)
同じように Azure も次の Azure アップデートのときに Azure tools が提供されるようです。
それまでの間は VS2010 を使っていてくれとのこと。

そういや、Silverlight のことについてはまったく触れられてませんね。やっぱり、Silverlight Toolkit for VS11 が提供されることは無いのかなぁ。ちょっとさびしい。

VS11 は .NET Framework 4 と 4.5 をサポートするようです。4.5 は Vista 以降のみサポートなので XP、Windows Server 2003 をサポートするには 4 をターゲットにする必要があります。なお、4.5 の新機能の async/await は Async Targeting Pack for Visual Studio 11 を入れてやれば .NET Framework 4 でもサポートされるようになるそうです。これはうれしい。

C++ の方は XP、Windows Server 2003 をサポートするには VS2010 のコンパイラーとライブラリーを使用しろとあります。VS11 と VS2010 はサイドバイサイドで両方インストールできるので使い分け可能だそうです。ただ、VS2010 をサイドバイサイドでインストールすること無しに XP を直接ターゲットにできるようなオプションを評価中だそうです。

2012年5月10日木曜日

[MetroStyle] WriteableBitmapEx が WinRT に対応

CodePlex の WriteableBitmapEx が WinRT に対応したそうです。
WriteableBitmapEx は WriteableBitmap に DrawLine、DrawRectangle、DrawEllipse、DrawBeziers といったドローイングに必要なメソッドを追加してくれるライブラリです。(もともとの WriteableBitmap には点を打つ程度のメソッドしか用意されていない)
今見たら CodePlex のサイトはまだ更新されていないようなので DOWNLOADS のところか SOURCE CODE から 1.0.0.0 Beta 2 を落とすといいみたいです。(私はまだ試してませんが、これが WPF、Silverlight、Silverlight for Windows Phone、WinRT 対応版みたい)

詳細については 「One Bitmap to Rule Them All - WriteableBitmapEx for WinRT Metro Style」 で解説してくれています。
Silverlight の WriteableBitmap では Pixels プロパティでビットマップの中のピクセルデータに直接さわれるけど、WinRT の WriteableBitmap にはそういうのは無いので拡張メソッドとかで同じような感じに扱えるようにして対応したみたいです。
おどろいたことに WinRT ではピクセルデータのフォーマットが BGRA になってるんですって。(ビットマップは普通は ARGB でした) この BGRA という並びは Direct2D で使われているものとのこと。(ということは WriteableBitmap の中身は Direct2D だったりする?)

ちなみに、WinRT の WriteableBitmap を見ると PixelBuffer プロパティというのがあります。これでピクセルデータにアクセスできます。
PixelBuffer プロパティの型は IBuffer です。リファレンス見ると Length プロパティくらいしか無いですけど。
しかし、WindowsRuntimeBufferExtensions クラスに AsStream メソッドがあります。こいつで IBuffer から Stream を取り出せます。AsBuffer メソッドを使えば反対に byte[] を IBuffer にできます。

しかし、これ、ドキュメントがわかりにくいなぁ。
Windows.Storage.Streams 名前空間にある IBuffer をどうやって変換するのかと探しまわったら System.Runtime.InteropServices.WindowsRuntime にあるクラスを使えってんだからなぁ。しかも今の時点だと WinRT の API Reference と .NET Framework 4.5 の Class Library Reference って感じであるところがぜんぜん別だし。まぁ、Windows 8 Releace Preview が出る頃にはドキュメントも整理されるんじゃないかと思いますが。

ところで、このようにピクセルデータにアクセスするのが Stream 経由になるのでパフォーマンス的にはきびしいのかもしれません。
まぁ、パフォーマンスが必要なときは Direct2D を使えってことになるんでしょう。
この記事を書いた方も 「WinRT で 2D グラフィックスをやるときのベストソリューションは Direct2D を使うことだ」 と書いてますし。

2012年5月8日火曜日

[HTML5] BuildNewGames.com

Let’s help developers write cross-browser code. Announcing BuildNewGames.com.」 より。
1ヶ月ほど前の記事ですが、Microsoft が Bocoup というところと新しくパートナーシップを結んで BuildNewGames.com という Web ゲーム開発のデベロッパー向けのサイトを立ち上げたそうです。ここで言う Web ゲームとは Flash や Silverlight では無く、HTML5 CSS3 JavaScript を使ったプラグインフリーなもののことです。基本的に Chrome、Firefox、IE9/10 を対象にしている模様。

今見てみると、いくつかのチュートリアルがあります。
記事によるとゲーム開発関連のチュートリアルを 50本くらいは掲載していく予定みたいです。
(こういうのが日本語訳されたりってことは無いんだろうなぁ)

2012年5月7日月曜日

[MetroStyle] メトロスタイルアプリのグローバリゼーション

「WinRT でのグローバリゼーションはどうなってるんだろう?」 と思ってたらちょうど Tim Heuer 氏がまとめてくれてた。
Develop your app for everyone–localize your UI
以下、個人的に気になったところなどを覚え書きを兼ねて。

JavaScript WinRT
How to manage string resources」 によると、strings フォルダを作り、その下に en-us、ja-jp などのフォルダを作り、その下にリソースファイル(resources.resjson)を作る。ちなみに .resjson は拡張子からわかるように JSON 形式。
まず、以下のように onloaded で WinJS.Resources.processAll(); を呼び出しておく。

WinJS.Application.onloaded = function(){
    WinJS.Resources.processAll();
}

XAML では

<span data-win-res="{textContent:'greeting'}"></span>

というような形式で使える。data-win-res は 「Quickstart: Loading user- and device-specific UI resources」 によると data-win-res="{propertyname: 'resource ID', propertyname2: 'resource ID2}" という形式。(ならば、textContent じゃなく innerText と書いてもいいのかな?)
JavaScript では

var resLoader = new Windows.ApplicationModel.Resources.ResourceLoader();
xxx = resLoader.getString("resource ID");

で文字列リソースを取れる。
あと、画像には <img src=”images/logo.png”/> と書いてもスケールにあわせて images/logo.scale-100.png、images/logo.scale-140.png、images/logo.scale-180.png を使ってくれるという機能もある。(images を en-us、ja-jp とかの下に作っておくと言語別の画像を使ってくれるのかどうかは記述が見つからなかった)

C#/VB WinRT
QuickStart: Make your Metro style app world ready」 によると、en-us、ja-jp などのフォルダの下に画像ファイルやリソースファイル(Resources.resw)を入れる。
XAML は、

<TextBlock x:Uid="HelloWorld" Text="Hello World" />

という感じで書いておく。
Resources.resw には

Name=”HelloWorld.Text” Value=”こんにちは、世界”

という具合に書く。
Resources.resw の Name は 「Uid の値」 + 「プロパティ名」 で、Width など文字列以外のプロパティも書ける模様。(たぶん、文字列から変換するコンバーターがあればいいんだと思う) また、添付プロパティで別ネームスペースのものはネームスペースも明示しろとのこと。例: AutomationPeer.Name の場合は MediumButton.[using:Windows.UI.Xaml.Automation]AutomationProperties.Name のようになる。
余談だが、XAML で xmlns:xx=”clr-namespace:Xxxx” と書いていたのも “using:Xxxx” と書くようになったとか。
C# で文字列リソースを取得するのは、

var resLoader = new Windows.ApplicationModel.Resources.ResourceLoader();
xxx = resLoader.GetString("resource ID");

という感じ。

その他
CodePlex に RESX Translator with Bing というツールがある。どうやら .resx を丸ごと Bing で翻訳してくれるみたい。

Visual Studio 11 Beta には Multilingual App Toolkit というツールがある。これを使うと TPX や XLIFF で管理できる?(よくわからないけど XLIFF というのはマルチランゲージを管理するための形式の一つみたい)

http://amanuens.com/ というサイト。どうやらマルチランゲージのリソースを管理できるサイト。「New Feature: Support for Windows Metro Resource Files」 によるとすでに .resw や .resjson に対応済み。あと、このサイトには英語から/への翻訳を人手でしてくれるサービスもある模様 Software localization service powered by Humans (品質とかはよくわからない)

2012年5月1日火曜日

[MetroStyle] WinJS Promises

WDD でも 「JavaScript の非同期では Promise の then や done を使う」 というようなことを言っていたと思うけど、正直 Promise ってよく知らなかった。
で、以下のブログで動画で解説されててわかりやすかった。
WinJS Promises #1
#1~#6 まである。
英語だけどデバッガーで動作を見せながら解説してるので見てるだけでもわかりやすかった。
(ちなみにこれは Microsoft UK の方のプログです)

IE ブログにも解説あり(こっちは日本語文章)
"promise" による JavaScript での非同期プログラミング

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 からの移植が増えそうな気がするんだけど、そうはいかんもんだろうか。