ページ

2012年10月22日月曜日

[WinRT] ページの内容の保存は自分でやるべきなの?

Windows ストアアプリでページの内容を保存するのに NavigationCacheMode プロパティを使うと簡単という記事を結構見かけるんですがそれはまずい(場合もある)んじゃないかと思ってるんですがどうなんでしょう? @IT の 画面遷移する前の状態を保持するには?[Win 8] とか。

NavigationCacheMode は Page のインスタンスをメモリに取っておいて、次回同じ Page の場合はそれを使いまわすってだけです。なので、アプリが終了すれば当然キャッシュは無くなってしまいます。
で、Windows ストアアプリの大きな特徴として、バックグラウンドに回ってるアプリはいつの間にか終了させられることがあるってのがあります。
Windows ストアアプリのライフサイクルについては アプリに対する “常に動作している” 感覚を重視したアプリ ライフサイクルの管理 とか アプリケーションのライフサイクル (Metro スタイル アプリ) とか。前者の記事には 「ただし、Windows がシステム リソースを解放するためにアプリを終了する場合に備えて、このデータは保存しておく必要があります」 とあります。中断したときにいつ終了してもいいようにデータは保存しとけってことです。
けど、Metro スタイル アプリからメモリを回収する にあるようにメモリ不足になってもワーキングセットをスワップアウトすることによって可能な限り終了しないようになっているそうです。
ここまで OS 側でがんばってくれてるなら、横着して NavigationCacheMode を使うだけでもいいのかなぁという気もしないでもない感じです。もちろん、電源が切られたときはメモリ上の情報は無くなってしまいますから、そういった場合でもデータを残しておいたほうがいいアプリはきちんとファイルに保存しておく必要があるでしょう。結局、ケースバイケースでうまいことやるってことになるんだと思います。
ガイドライン的には中断したときに終了に備えてちゃんとデータを保存しとけってことになっていますので、やっぱりそれが一番いいんでしょう。アプリの中断と再開のガイドライン (Metro スタイル アプリ)

ちなみに、ページの内容を保存するのは SuspensionManager を使うのが簡単だと思います。これについても @IT に解説記事があります。起動時に以前の画面を復元するには?[Win 8]

2012年10月16日火曜日

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

書くのがちょっと遅くなりましたが 9月26日(水) 19時~21時に開催されたメトロスタイルエキスパート塾の第2回に行ってきました。

MetroStyleDeveloper (プチ) #06 大阪 ~メトロスタイルアプリ エキスパート塾++2~

各自開発環境の入った Windows 8 を持ってきてその場で実際にコードを書いてみようというハンズオン形式の勉強会。
場所は 1回目と同じく梅田のフェンリルさんの会議室をお借りして。

今回は私がスピーカー役で 「SharpDX を動かしてみる」 というテーマのハンズオンです。
SharpDX というのは DirectX をマネージドで使えるようにラップしたオープンソースのライブラリです。Windows ストアーアプリ(以前の MetroStyle アプリ)にも対応しています。なので、これを使えば Windows ストアーアプリでも C# で DirectX が使えます。
私自身が興味があったのでこのテーマを選びました。

が、正直、ちょっと無茶だったかなぁ。
DirectX といってもいろいろな機能がありますが、今回は SharpDX 経由で Direct3D を使って簡単な図形(三角形の面を一つだけ) を表示してみるっていうハンズオンにしたんですが、あらためてやってみるとこれだけでも

  • SharpDX はマネージドで書けるといっても、コード的にはほぼ C++ で DirectX を使うときとほとんど同じなのでどうしてもコード量が多くなる。Direct3D デバイスの初期化やら、ポリゴンの用意やら、レンダリングのためのコードやら、最低限動くようにするだけでもそれなりのコードが必要。
  • 三角形の面を一つだけといってもポリゴンを描画するのには変わりないので、きちんとやるならワールド - ビュー – プロジェクションといった座標変換が必要になる。コード自体はたいした行数ではないけど、その意味を説明するには行列演算のこととかを説明しなくちゃいけない。今回は 「ポリゴンを見える位置に持ってくるためにちょっとした計算をしてやります」 程度の簡単な説明だけで済ませた。
  • 今の Direct3D をやろうとするとシェーダーランゲージ(HLSL)が必須になる。今回は 「GPU での計算のために別の言語が必要になります」 だけにして、シェーダー自体は .cso ファイルをコピーしてもらってそれを使うようにしてもらった。
  • コード量を減らすためにレンダーターゲットのキャッシュとか全然してないのでパフォーマンス悪い。あと、Dispose() とかも省略しちゃってるところもあるのでメモリやリソースが枯渇して死んじゃうこともあるかも、というあんまりよろしくないコードになってる可能性あり。

といった感じで 85分間程度のハンズオンでやるのはちょっと無理があったなぁ、と。
そもそも、これって SharpDX == DirectX のハンズオンであって、Windows ストアーアプリとかほとんど関係なくね?という感じになっちゃいました(苦笑)
そんな内容ではありますが、一応 PowerPoint の資料を下に貼り付けておきます。ハンズオン用の資料なので説明もほとんどありませんし、上記のようにあくまで最低限なコードですが。

10/22 追記
サンプルプロジェクト(Visual Studio 2012 のプロジェクト)を SkyDrive にあげておきました。
SurfaceImageSourceSample.zip
ハンズオンで使用したものよりちょっとだけコメント増やしたり、単なる三角形を三角錐にしたり、隠面処理されるようにステンシルバッファ(深度バッファ)も使うようにしたりしてありますが、基本的にはハンズオンで使用したコードとだいたい同じです。(なので、パフォーマンスがイマイチ出てないとか、本当なら Dispose() しなくちゃいけないのにしていないとかもそのままなので注意)
ここまで追記

終了後は何人かでカレー屋に遅めの夕食を食べに行き解散。(カツカレーが話題になっていた日でしたのでw)

次回の開催もすでに募集が始まっていますので興味のある方はぜひ。
MetroStyleDeveloper (プチ) #07 大阪 ~メトロスタイルアプリ エキスパート塾++3~

 

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

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

2012年3月1日木曜日

[Win8] Windows 8 First Apps Contest の受賞作

以前に紹介したこともある 「Windows 8 First Apps Contest」 ですが、その受賞作が紹介されてました。

Windows Store 開発者向けブログ: 「First Apps Contest 入賞作品の紹介
(日本語訳版です。英語の記事とほとんど同時に投稿されたみたい。気合はいってるなぁ)

やっぱり WPF や Silverlight、C# なんかの経験がそれなりにあった方が多いようですが、興味深いと思ったのが 2番目に載っている Pew Pew。どうやらこれってもともとあった JavaScript のゲームを MetroStyle に移植したみたいですね。そしてそれは 「驚くほど簡単だった」 とあります。へぇ。(作者さんが Adobe のシニア開発者で Flash の中の人ってのもおもしろいですが)

ところで、Windows 8 Consumer Preview を入れると、もう Windows Store に繋げることできるの?

2012年2月1日水曜日

[Win8] MetroStyle IE から Desktop IE へワンタッチ切り替え

Web Sites and a Plug-in Free Web より。
Windows 8 には MetroStyle な IE とデスクトップな IE があります。
そして、MetroStyle な IE では Silverlight や Flash といったプラグインが動きません。反対に、デスクトップな IE は従来通りの IE です。
なので、こういったプラグインを使っているページをみるときには MetroStyle な IE からデスクトップな IE に切り替える必要があります。
そこで、

HTTP ヘッダー

X-UA-Compatible: requiresActiveX=true

META タグ

<meta http-equiv="X-UA-Compatible" content="requiresActiveX=true"/>

のいずれかを入れておけば、MetroStyle な IE でそのページを開いたときに 「デスクトップな IE で開くか?」 と聞いてくるようになって、ワンタッチでデスクトップな IE に切り替えられるようになるそうです。

ちなみに、Silverlight も IE からみたら ActiveX なプラグインなはずなのでこのフラグが使えるはず。

2012年1月27日金曜日

[WP7] WebClient を gzip 圧縮対応させてパフォーマンスアップ

Please ship your next Windows Phone app with GZip: speed requests 50-80%」 より

どうやら Windows Phone 7.5 の WebClient は HTTP 圧縮に対応していないみたいです。
けど、WebClient をちょこちょことやってやればそんなに難しくなく圧縮に対応できるよ。そうすれば、通信の時間が短縮できてパフォーマンスアップできるかも、と。
(だから標準で対応してくれって言ってるんですね。確かにこれくらい対応しててもよさそうなもんだけど)

元ネタとなっている記事はこちら。「GZIP Compressed Web Requests in WP7 - Take 2
WebClient を使って圧縮に対応する方法が紹介されています。(ソースをダウンロードすることもできますし、NuGet から取得することもできます)

簡単に解説。(私もあまり詳しくないけど)
今どきの Web サーバーはレスポンスを gzip で圧縮して返すことができます。圧縮してデータのサイズを小さくできればネットワークの負荷を下げて効率を良くすることができるわけです。けど、毎回圧縮処理をするとそのぶん CPU 負荷があがっちゃうので良い面ばかりでもないです。
JSON や XML などといったテキストベースのデータの場合はかなり圧縮率が高くなることが期待できますが、反対に JPEG や MPEG といったもともと圧縮されているものはそれ以上圧縮しても何の意味もない、というか、かえってサイスが大きくなっちゃったり、CPU 負荷を上げたりと悪い面の方が大きくなってしまいます。
なので、圧縮を使ってるかはサーバーによっていろいろみたいです。圧縮をまったく使ってないサーバーだとか、静的な HTML ファイル等だけ圧縮してそれ以外のファイルや動的な CGI や PHP、ASP.NET などで作られるデータは非圧縮としているサーバーだとか。
で、もちろん、クライアントの側も対応していないと話になりません。
圧縮に対応しているクライアントは HTTP リクエストヘッダーに “Accept-Encoding: gzip” と入れておきます。
これが入っている時のみ、サーバーはレスポンスを gzip 圧縮して返します。(もちろん、非圧縮で返してもいい)
レスポンスが圧縮されているときはレスポンスのヘッダーに “Content-Encoding: gzip” と入っています。
上記で紹介されているコードを見ても、これと同じ事をやっています。で、レスポンスが gzip だったらレスポンスのストリームを SharpGIS.ZLib.GZipStream というもの経由で返すようにしています。

2012年1月26日木曜日

[Win8] ReFS の記事が日本語訳されてます

以前に 「[Win8] 仮想ストレージだとか NTFS の次の ReFS だとか」 で紹介した記事が日本語訳されています。

ストレージを仮想化して、スケーラビリティ、復元性、効率性を高める
Windows の次世代ファイル システム: ReFS

ちなみに、この 「Building Windows 8」 というブログ、他の記事も日本語訳されています。
日本語だけではなく、フランス語、ドイツ語、ポルトガル語、韓国語、中国語、ロシア語に訳されているようです。それぞれの言語にはブログの横にある Language から行けます。
だいたい、英語の記事が掲載されてから 4~5日後くらいに他の言語版が一斉に掲載されるというパターンが多いみたいです。

IEBlog とか Windows Store 開発者向けブログ とかも同じような感じで各言語に翻訳されているみたいです。

2012年1月23日月曜日

[勉強会] メトロスタイルな勉強会に行ってきた

この記事 でも紹介した MetroStyleDeveloper 主催の勉強会に行って来ました。
MetroStyleDeveloper #01 「MetroStyleってなぁに?

おもしろかったー!
すべてのセッションが Windows 8 / MetroStyle 関連な勉強会は日本初なのかも。

会場は、IIJ 関西支社さんの会議室。
会議室と言っても、普通にセミナーなどに使うような部屋でした。

予定通り、私は 「Windows 8 / MetroStyle を見たことのない人向けにどんなものなのかを紹介」 ってなセッションを最初にさせて頂きました。
最初に 「動作している Windows 8 をまだ見たことない人」 と挙手をお願いしたんですが 4人ほどでした。これが 0人だったら 「オレのセッションやる意味なくね?」 となっちゃうところだったのでよかったです(笑)まぁ、それならそれで開発よりの話を多くするとか適当に対処するつもりではあったんですが。
ちなみに、参加者数は 27人程度だったそうです。

セッションで紹介した 「MetroStyle IE では、その Web サイト用の MetroStyle App がある場合、関連付けをすることができる」 というのの紹介は以下の記事にあります。
Connect Your Web Site to Your Windows 8 App
また、Windows 8 のキーボートショートカットは以下あたり
Windows 8 Tip: Windows Key Shortcuts
これに加えて Windows + Shift + C で右側のチャームが出ます。

私のセッションはデモばかりでしたのであまり意味が無いようには思いますが、一応セッション資料を SlideShare に上げましたので貼り付けておきます。

そして、他の方々のメトロスタイルなセッション。
デザイン的な面、実装体験的な面、XAML 的な面、C++ 的な面、VS11 的な面、といろいろな面からのセッションがあり、どれもとてもおもしろかったですし、ためになりました。
あぁ、そういえば VB 的な面からのセッションはなかったな(笑)

終了後は 15人ほどで懇親会。これも楽しかった。

2012年1月19日木曜日

[HTML5] Angry Birds を HTML5 に移植した人へのインタビュー記事・セッション

Joel Webber氏がAngry BirdsのHTML5への移植を語る
すごく興味深い。
HTML5 版は Google Web Toolkit を使って Java で書いてるのか。なんか、GWT を使って Java で書いたり、Script# を使って C# で書いたりと、「JavaScript だけど JavaScript は使ってない」 というのがどんどん増えていきそうだな。
レンダリングは WebGL モードと DOM モードがある。(セッション見たら WebGL、Canvas、DOM があるみたい)

記事にセッションへのリンクもあったので見てみた。(ほとんど聞き取れてないので、ほんとに見ただけって感じ)
Angry Birds on HTML5
以下、見ながら自分用の覚え書き

ゲームループ

  • ごく普通に ユーザーの入力 → ワールドの更新 → ワールドのレンダリング らしい

スレッド

  • モダンなゲームエンジンはシミュレーションとレンダリングに分かれてる
  • けど、JavaScript はシングルスレッド
  • HTML5 の Web Workers でマルチスレッドはできるが、そのぶん複雑になる

DOM によるレンダリング

  • 普通のエレメントや CSS を使う
  • <div style=”
    background: url(hoge.png) no-repeat;
    –webkit-transform: matrix3d(
    m00,m10,0,tx,
    m01,m11,0,ty,
    0,0,1,0,
    0,0,0,1);”/>
    みたいな感じ

Canvas によるレンダリング

  • 2D のグラフィックシステム
  • HTML5 Canvas は多くのブラウザーでハードウェアアクセラレーションが効く
  • var ctx = Canvas.getContent(“2d”);
    ctx.save();
    ctx.transform(m00, m01, m10, m11, tx, ty);
    ctx.drawImage(hoge.png, 0, 0);
    ctx.restor();
    みたいな感じ

WebGL によるレンダリング

  • 3D のグラフィックシステム(OpenGL ES 2 モデル)
  • もっとも高速
  • けど、まだほとんどサポートされてない

計算

  • function mul(A, V, out) {
        out.x = V.x * A.m00 + V.y * A.m10;
        out.y = V.x * A.m01 + V.y * A.m11;
    }
    var A = new Mat(1, 0, 0, 1);
    var V = new Vec(0, 0);
    mul(A, V, out);
    これだと mul() の中身で 875 インストラクション(V8)
  • function mul(A, V, out) {
        out[0] = V[0] * A[0] + V[1] * A[2];
        out[1] = V[0] * A[1] + V[1] * A[3];
    }
    var A = new Float32Array(1, 0, 0, 1);
    var V = new Float32Array(0, 0);
    mul(A, V, out);
    これだと mul() の中身で 376 インストラクション(V8)
    ざっくり、こうすれば 30% の時間で済むことになる

ガーベジコレクション

  • GC が動くとその間止まる(60fps をキープできなくなる恐れあり)
  • そこで、事前にオブジェクトをアロケートする、オブジェクトをプールするといったことをする
  • 要するに、GC にゴミ回収させなければ、GC のせいで遅くならないってことか

起動時

  • ブラウザーのキャッシュをうまく使う
  • HTML5 AppCache は使える
  • 細かい画像をたくさん読み込むより、1つにまとめていっきに読み込む

PlayN

  • カジュアルゲーム用の Java ライブラリ
  • ターゲット: HTML5、Flash、Android
  • デスクトップの JVM を使って開発とデバッギング
  • developers.google.com/playn
  • GameLoop、Graphics、Audio、AssetManager、Network などのモジュール。Box2D も組み込んである

2012年1月18日水曜日

[勉強会] MetroStyleDeveloper 主催のメトロスタイルな勉強会 「MetroStyleってなぁに?」(大阪)

メトロスタイルの勉強会が今週末(2012/01/21(土))に大阪で開催されます。
MetroStyleDeveloper #01 「MetroStyleってなぁに?
まだ空席はあるようですので、興味のある方はぜひ!

私もスピーカーさせて戴くことになりました。
Windows 8 とかメトロスタイルとかがどんなものなのかを紹介します。
ほんとに紹介だけで、難しい話はしないつもり。
というか、私自身、メトロスタイル初心者なので難しい話はできないってのがほんとのところですが(笑)
なので、私も他の方のセッションを聞くのが楽しみです。

2012年1月17日火曜日

[Win8] 仮想ストレージだとか NTFS の次の ReFS だとか

ちょっと覚え書き。Windows 8 のファイルシステムとか。(まだよく読んでない)

Virtualizing storage for scale, resiliency, and efficiency
複数の物理ディスクをひとつのでっかい論理ディスクのように使えるといった機能が強化されるってことなのかな?
今までだって同じようなことは出来なかったっけ?何が変わるんだろ?

Building the next generation file system for Windows: ReFS
Windows 8 では NTFS の進化形である ReFS ってのが搭載される?
NTFS より堅牢性が高くなるとかスケールアップしやすくなるとかそういう感じ?
API 的には NTFS と互換性がそれなりにある模様。

上記いづれもブートディスクには使えないみたい。

2012年1月13日金曜日

[MSMVP] え?この人たちが MVP 審査落ち?

How I Lost, Regained and then Turned Down an MVP Award
長文ですし、最初のほうをナナメ読みしただけなんですが。。。

どうやら、この記事を書いてる Eisenberg 氏が MVP の審査に落ちちゃったようです。(Caliburn / Caliburn.Micro を作ってる人だそうです)
メールには 「MVP は過去一年に対するもので、そういう意味で十分でなかった」 とあったと。Caliburn.Micro は RC を 2011/2 にリリースしてからその後もバージョンアップしたりドキュメント書いたりしてたのに。
で、Twitter で 「Caliburn / Caliburn.Micro に対する私の活動は Microsoft にとっては十分で無かったんだってさ。今年は MVP 受賞出来なかったわ」 とつぶやいたら、すごくたくさんの人から敬意と励ましのレスが返ってきて、そして Microsoft の何人かの人からもレスが来て、聞いたところではスコット・ガスリー氏のところまで話がいったとか。で、結局 「前言撤回。MVP 受賞です」 と連絡が来たと。

この Twitter でのやりとりの際に StructureMap、FubuMVC、Storyteller の開発者である Jeremy Miller 氏、Moq の開発者である Daniel Cazzulino 氏も審査落ちしたことがわかったそうです。

MVP 受賞の連絡はもらえたけど、結局、Eisenberg 氏はいろいろ思う所があって MVP を辞退したようです。

--

これは、ちょっと Microsoft が 「やらかしちゃった」 という感じなのかな。
もともと MVP の審査は数値で表せられるものが重要視されています。「フォーラムで何回回答した」「勉強会で何回スピーカーをした。受講者数は何人だった」「解説記事を何本執筆した。参照数は何回だった」 なんてものですね。
これは、もちろん客観的に評価できるようにっていこうことと、効率よく評価できるようにってことがあるんでしょう。

MVP に応募するときに過去一年間の実績をマイクロソフトに報告します。
これを記入するためのシートが用意されています。(MVP に応募するとマイクロソフトから送られてきます)
私は日本語版しか見たことが無いので英語版がどうなっているのかは知りませんが、そういえば、このシートにはオープンソースのことについて書く欄は用意されてませんでした。もちろん、フリーコメント欄はありますから、そこにいくらでも書くことはできます。

けど、オープンソースでの貢献を評価するってなかなか難しいですよね。
コードの行数なんて意味ないですし、ダウンロード数が多けりゃいいってもんでもないですし。
そもそも、オープンソースで何か公開したからといって、それが常にコミュニティや他の人への貢献とはならないでしょうし。たとえば、単にオープンソースなゲームを公開したなんてのは MVP の対象では無いでしょう。けど、そのソースの解説記事を書いたりしてれば対象になって来そうな気はします。
なかなか数値化が難しい要素がいっぱいありそうです。
客観的、かつ、公平に評価するのには難しいかもしれませんが、ぜひマイクロソフトには頑張って欲しいところ。
ちょうど、昨日、MSDN にこんな記事が掲載されましたし。
オープン ソース、オープンな標準にマイクロソフトはどう取り組んでいるか ~ 丸山 不二夫 × Gianugo Rabellino 対談 ~

2012年1月12日木曜日

[.NET] All-In-One Code Framework

All-In-One Code Framework
Microsoft がメンテしているサンプル集です。
WPF、Silverlight、Azure、ASP.NET、Windows.Form、Windows 7、Windows Phone などなどいろいろなサンブルが入っています。デバイスドライバーのサンプルなんてのもあるみたいです。
言語も C#、VB、C++ など。
基本的に、コードの断片ではなく、動くアプリケーションとしてサンプルが作られているようです。(全部がアプリの体になっているのかは知りませんが)
そして、サンプルもちょこちょこと増えていっています。

と、これ自体は結構前からありますが、最近はぜんぜんチェックしてませんでした。
で、なにげに見てみたら、いつの間にか All-In-One Code Framework Sample Browser っていうのが出来てて、メトロ UI なアプリで見るようになってるんですね。(以前は単純にサンプルが入った圧縮ファイルをダウンロードするだけだったと思う)

どうやら ClickOnce なアプリケーションになっている模様。
初めて起動したときにダウンロードしたサンプルを保存するフォルダを聞かれます。(あとで “SETTINGS” で変更することもできます)
あとは、検索したりして欲しいサンプルをダウンロードするだけ。
けどちょっと一覧性が低くて探しにくい感じ。

あと、Visual Studio 2010 のアドオン版もありました。使い方は ClickOnce 版とほとんど同じ。
Microsoft All-In-One Code Framework Sample Browser
こちらを入れておくと Visual Studio の「ツール」メニューに “Search Code Sample” が増えます。もしくは、コードエディター上で右クリックして “Search Code Sample”。(コードエディターを右クリックした場合は、選択していた API を自動的に検索するって書いてあるんですが、私の環境だと検索してくれません。VS が日本語版だからかな?)

2012年1月11日水曜日

[Win8] Windows 8 First Apps Contest (申し込み期限済)

Windows 8 First Apps Contest
もう、ラウンド 1 の申し込み期限は過ぎちゃってますが、こんなコンテストがあったんですね。
Windows 8 のメトロスタイルのアプリのコンテストです。
ルール によると Japan からも応募できたようです。ただし、アプリ自体は英語じゃないとダメとありますが。

ちなみに、ラウンド 1 が 2011/12/06~2012/01/08 で、このラウンド 1 の中から勝ち残ったものがラウンド 2 に進むという形式みたいです。ラウンド 2 は 2012/01/16~2012/02/03。

優秀作 8本は、

  • Windows Store Beta オープン時にアプリが掲載される
  • BUILD で配布されたサムスンの Windows 8 プリインストール済みタブレット PC
  • Windows Azure 1年分
  • Windows Store のサブスクリプション 2年分

が景品だそうです。(金額にすると 4,899ドル相当とあります)

ラウンド 2 に進んだら、コンフィデンシャル版のアップデートされた Windows 8 をベータプラグラムからダウンロードして、そいつで動くようにアプリをビルドして、それを Windows Store にサブミットすること、とあります。
Windows Store Beta の開始が 2月下旬とかでしたっけ?そのころに Windows 8 Beta も出てくるとかってニュースになってたと思うので、そのバージョンが事前に配布されるんでしょうね。

ちょっと気になったのが、”One (1) two year subscription to the Windows Store. Approximate Retail Value (ARV) $99.99.” という一文。
これって Windows Store のサブスクリプションは 2年分が 1セットになってて、それが 99.99ドルって意味なのかな?
どっかで 99ドルのと 49ドルのがあるって見たような気がするけど、単に 2年だと 99ドルで 1年だと 49ドルってことなのかな?
そういやこれって、AppHub とは別に払わないといけないんだろうか?

2012年1月10日火曜日

[HTML5] Cut the Rope が HTML5 に移植されたそうです

Cut the Rope now in HTML5」 より。
ZeptoLab の 「Cut the Rope」 という iPhone、Android 用のゲームが HTML5 に移植されたそうです。(iPhone、Android 版は 7千万ダウンロードとのこと)
この移植を行ったのは PixelLabs、ZentoLab、Internet Explorer チームで、Chrome、Safari、IE9、Opera で動くそうです。

上記の記事に Play リンクがありますが、ゲームは http://www.cuttherope.ie/ です。
この記事で Cut the Rope というのを初めて知りましたが、普通におもしろいですね。
つい第2ステージまで遊んじゃいました。
実は Chrome で遊んでたんですが、第2ステージまでクリアして第3ステージに進もうとすると 「IE9 をダウンロードしてから戻って来てね。タスクバーにピンしとくといいよ!」 だそうですw

ちなみに、と Windows Phone 7.5 の IE で試してみたら、一応動きました。(最初のダウンロードがなぜか 72% で止まるんですが、しばらくまってるとちゃんと進みます)
ただ、遊んでみるとドラッグが IE に取られちゃうみたいでロープを切りことができません。これは 「オプション」 の 「drag to cut」 を 「click to cut」 にしてやれば切ることができるようになりました。
けど、しばらく遊んでるとものすごく重くなってゲームにならない感じになってしまいました。
残念。

で、記事に “The Developer Guide” なんてリンクもあります。
(ゲームそのものより、コッチの方が気になったんですけどね)
こちらには Objective-C から JavaScript に移植した際のもろもろなんかが書かれているようです。(まだ読んでない)
Windows 8 Apps へのリンクもあったり、「get ready for the Windows 8 Store!」 なんてことも書かれてたり。
あぁ、そうか、HTML5 にしとけば Metro style アプリにすることも簡単だってことになるのか。

2012年1月6日金曜日

[IE][JavaScript][WP7] JavaScript と Script# と PhoneGap

進化する ECMAScript
これは、Internet Explorer チームのブログ(英文記事を日本語訳してくれたもの)ですが、Microsoft が JavaScript に対して結構本気だっていうことがよく分かる感じです。Math、String、Number やグローバリゼーションの強化案ってことでプロトタイプを作ってすでに公開しているとのこと。
そういや、以前に jQuery でもグローバリゼーション・プラグインを公開していましたね。(@IT: 「Microsoft発のjQueryグローバリゼーション・プラグイン」)

と、まあ、こういった JavaScrpt の強化についても気になるところではありますが、個人的にこの記事で一番気になったのは 「数十万行の JavaScript コードから成る Office Web アプリケーション は、主に Script# をベースに記述されており」という部分。
そういや、Script# が使われていると聞いたことがあるような気がしないでもない。
Script# っていうのは、C# で JavaScript のコードを書けるようにするっていうシロモノです。(C# をコンパイルすると JavaScript が生成される。記事にも出てくる Google Web Toolkit は Java をコンパイルすると JavaScript が生成されるヤツですね)
私もプログに取り上げたことあったなぁと検索してみたら

といったあたり。2006年のころですか。WPF/E なんて単語も出てきてて、なつかしい。(ちなみに、WPF/E は Silverlight のコードネーム)

で、先日の PhoneGap と Script# を組み合わせて使うなんてことができるとおもしろいかも、なんて思いました。
これができるなら、Windows Phone、Android、iOS すべてで動くアプリを C# で書けるってことになりそうですね。
理屈の上では PhoneGap の API をマネージドであるかのように見せかけるアセンブリ ( ここ の “Referenced Assemblies” にあたるアセンブリ) があればいいのかな?

Mono for AndroidMonoTouch を使えばプログラミング言語としては C# を使えるけど、これらは API 自体はプラットフォームごとに異なるから UI 部分なんかはそれぞれごとに作らなくちゃいけないですよね?それに対して、PhoneGap は HTML+α がベースだから UI 部分も含めて大部分が使い回し可能ってことになりそう。
時間があったら Script# について久しぶりに調べてみたいな。

# ところで、Office Web アプリケーションを作るのに使った Script# って公開されてるのと同じものなんだろうか?ひょっとして、Microsoft 社内用のバージョンがあったりするのかな?

2012年1月5日木曜日

[WP7] Coding4Fun Windows Phone Toolkit

http://coding4fun.codeplex.com/
ほぅ、こんなのあったんだ。
Windows Phone 7 用のコントロール集です。
上記にスクリーンショットがありますが、RoundButton(丸いボタン)、TimeSpanPicker(時間間隔の選択)、Pipup を使ったメッセージボックスや入力ダイアログ、アバウトダイアログなど、色選択コントロールなんかが入っています。「Addition to the Coding4Fun Toolkit - MetroFlow」 にある MetroFlow コントロールも入っています。(言葉で説明しにくいですが横配置で選択されている項目だけが広くなるようなコントロールです)
あと、bool を Visibility に変換するコンバーターなども入ってます。
Themed Image Converter は現在のテーマが “Dark” か “Light” かによって使う画像を切替えてくれるコンバーターなのかな?そりゃいいな。(しかし、ApplicationBar は UIElement じゃないからデータバインドできないよ、とかって悲しい事になりそうな気がするけど)

パッケージ(NuGet)で入れれるみたいですが、Source Code のところの Latest Version をダウンロードすれば、サンプルも含めてソースコードをダウンロードできます。(確認してないけど、NuGet の方だとサンプルは入ってないんじゃないかな)
Latest Version のソースコードをダウンロードして、Visual Studio 2010 でソリューションを開き、Coding4Fun.Phone.TestApplication を 「スタートアッププロジェクトに設定」 して実行すればサンプルをエミュレーターで動かすことができました。("Dependencies\Microsoft.Phone.Controls.Toolkit.dll" を 「ブロックの解除」 してやらないとビルドできないかもしれません)