ページ

2014年11月11日火曜日

[勉強会] 第2回 Japan Xamarin User Group Conference 西日本編に参加しました

第2回 Japan Xamarin User Group Conference 西日本編 に参加してきました。

最近は仕事でも Android や iOS アプリを作ったりすることもあるんですが、今まではユーザーさんからの指定もあって Java や Objective-C を使ってました。が、根っからの C# 好きとしてはできることなら C# 使いたいなぁと思ってました。そんなところに「開発環境は好きにしてよし」というお話があって、こりゃもう Xamarin 使うしかないだろ、というところで今回の勉強会が開催されることを知ったので参加することにしました。
つい最近 Xamarin を初めてインストールしたばかり(しかも製品版ではなくお試し版)という初心者です。だいぶ前から気にしていたので情報自体はそれなりに知ってはいたんですが、実際に使うのは初めてという状況でした。(MonoTrouch とか MonoDroid とか呼ばれてたころに ximian.com のメーリングリストを subscribe したりしていました。2010年前後とかそれくらいの頃だと思います。その頃から使ってみたいなぁと思ってはいたんですが機会がありませんでした)
今回の勉強会は、Xamarin の概要のおさらい、Xamarin Evolve 2014 の最新情報、実際に Xamarin を使ってみた話、といったセッションで構成されていました。私は「情報は知ってるけど、実際に使ってみるのはこれから」という段階だったのでぴったりと言えばぴったりな内容でした。ただ、次回は Xamarin のディープなところの話が聞いてみたいですね。

ちょっとおもしろかったのは、最初に田淵さんが「すでに Xamarin 使ってる人は?」「開発環境が Windows の人は?」といった挙手によるアンケートをされたんですが、Windows の人が私含めて 2~3人程度でほとんどの人が Mac だったところですね。私が普段参加したりスピーカーしたりする勉強会では C# とか .NET とかがテーマなので当然 Windows の人が中心です。やっぱりずいぶんと変わっくるもんだなぁと思いました。ちなみに、私は会社も自宅もマシンは 15インチの MacBook Pro ですが、ほとんどの時間は Parallels 上の Windows にいるのでほとんど Mac としては使っていないんですよね。もちろん Xcode を使ってるときなんかは MacOS ですが、それでもコードの編集は Windows 側の秀丸でやったりする場合もあります。23インチのディスプレイを 2つ外付けしてトリプルディスプレイにしているのでディスプレイ 1~2枚を Windows、残りを MacOS って感じにしていることが多いです(メインで使うディスプレイが外付けの方なので MacBook Pro の Retina ディスプレイが全然活用できていないという、ものすごくもったいないことになっていたりもします)。それとキーボードとマウスも外付けのものをつかっていて、これらが Microsoft Ergonomic Keyboard 4000 と Microsoft Mobile Mouse なので私の机の上はものすごく Mac 感が薄いです(笑)

と、話を戻します。
本当は各セッションの内容について書いておきたいところですが、ちょっと時間がないのでばっさり割愛。どのセッションもためになりましたし、おもしろかったです。ちょっと思ったのは、次回の Xamarin 勉強会のときにはスピーカーが出来る程度には詳しくなっておきたいなぁ、といったことです。いや、次回がいつ頃なのかとか全然知らないんですけどね。

セッション後は、場所はそのままに運営さんが用意してくれたジュースやビール、お菓子をつまみながら立食形式で懇親会でした。これも色々なお話が聞けてとてもおもしろかったです。
さらにそのあとは 6名で居酒屋さんに場所を移して本格的に飲みながら懇親会。こちらもいろんな意味で非常に濃かったです。Xamarin の話も盛り上がりましたが、アイマスの P な人(私ですが)とか、○○な人とか、××な人とかがいて、そんな話でも盛り上がりました。

2013年11月1日金曜日

[勉強会] LINQ 勉強会と C# の素晴らしさを語る会

ずいぶん時間が立ってしまいましたが、今まで書いてなかった勉強会 「LINQ 勉強会」「第2回 LINQ 勉強会」「C# の素晴らしさを語る会」 のことを書いておきます。

■ LINQ 勉強会
2013/6/29 グリーさんの大阪オフィスの部屋をお借りして開催された「LINQ 勉強会

米田さんのハンズオン形式のセッションがメイン。LINQ を使ってみるというハンズオンではなく、LINQ を作ってみる(IEnumerable なコレクション生成部とか Where とか Select とか)という内容。しかも「LINQ を作りましょう」ではなく、「こういう風に分割した方が柔軟性高くなるよね?」とやっていったらいつのまにか LINQ そのものになってた、という進め方。おもしろかったです。このセッションでは、私は質問があったら答えて上げる役として部屋の中をうろうろしてました。まぁ、あまり役には立ってなかったように思いますが。
米田さんの資料はこちら 「超LINQ入門

続いて、私もセッションをやらせてもらいました。「LINQ の概要とかもろもろ」ということで、LINQ のことを一通り、LINQ to Objects、LINQ to XML、LINQ to SQL といったところを浅く広く紹介するという感じのセッションです。米田さんのハンズオンのあとだったのでちょうどいい感じにまとまったかも。
以下にセッション資料を貼り付けておきます。

終了後は梅田の居酒屋で懇親会。楽しかった。

■ 第2回 LINQ 勉強会
2013/8/24 靭公園テニスセンター会議室にて開催された「第2回 LINQ 勉強会
テニス用の競技場の中にある会議室というおもしろい場所でした。以前にシアトル・マリナーズの本拠地のセイフィコフィールドの中を見学したことがあるんですが、そのときみた野球選手用のロッカールームとかミーティングする部屋とか記者会見場とかそういった雰囲気とおんなじような感じでした。

上に書いた「LINQ 勉強会」の第2回という位置づけですが、前回の続きというわけでなく純粋にもっともっと LINQ のこと話したいよね、という感じです(だと自分では勝手に思ってます(笑))

今回もセッションをさせて頂きました。「LINQ 概要」ということで前回と同じように LINQ のことを広く浅くという感じで紹介しました。前回とまったく同じだとつまらないので細々と変えてはいますが、まぁ、だいたい同じです。
けど、一応、セッション資料を貼り付けておきます。

続いて米田さんのハンズオン。生徒の成績データのコレクションを LINQ を使って抽出したり、ソートしたり、グループ分けしたりといった内容。元となるソースはあらかじめ米田さんが作ってきてくれました。WPF を使ってて、ちゃんとデータバインドして、という結構ちゃんとしたもの(笑)で、データ処理部分だけ書き換えればそれに応じて表示がかわるというもの。このソースを皆に配布して、いろいろ書き換えなが LINQ のいろんな機能の実習。わかりやすかったです。
米田さんの資料はこちら 「第2回 LINQ勉強会

続いては @Posaune さんのセッション。LeapMotion からの入力を Rx を使って受け取るという内容。まさか、LeapMotion が出てくるとは。みんな好きだなぁ。まぁ、私もこの日 LeapMotion を持っていってたんですが(笑)
認識した指の本数からグー、チョキ、パーを判断しようというもの。LINQ や Rx をうまく使うとほんとにすっきりとコードが書けますね。おもしろかったです。

終了後は近所の居酒屋で懇親会。
持って行った EnchantMOON をみんなに見せびらかしました(笑)

■ C#の素晴らしさを語る会
2013/10/12 マイクロソフト関西支店のセミナールームをお借りして開催された「C#の素晴らしさを語る会

15~30分のショートセッションで 15人もの方が C# や .NET の素晴らしさを語るというおもしろい内容。
セッションスライドは
http://www.vshtc.net/vshtcstudyosaka3
こちらにまとめられています。
私も C# や .NET の基礎的なことを紹介しつつ、気に入っているところを語るという内容でセッションをしました。私のセッション資料も上記のサイトにあります。

初心者向けといいながら後半になるにつれどんどんディープな世界に入っていくという初心者置いてきぼり状態でしたが(笑)いろいろなお話が聞けてとてもおもしろかったです。
そういや、あんまり async/await な非同期系の話がなかったな。私は大好きですが、なかなか仕事用のコードでは使う機会がないんですよねぇ。使うべきところで使わないのであれば「こんなの絶対おかしいよ」と言えるんですが、そもそも非同期を使う機会自体がなかなか無いと言うか。あったとしても、うかつに使うと「わけがわからないよ」と言われそうなんですよねぇ。けど、ASP.NET MVC でごにょごにょするようなことをやってるのでそこでは思いっきり使えるかな?まぁ、これは半分趣味みたいな開発ですが。

終了後は近くの中華料理屋で懇親会。
その後、ミスド(だったかな?)に場所を変えて二次会。

■ そして
そして、12/14 に「第3回 LINQ 勉強会」が開催されます。現在、参加者募集中です。
またまた、私もスピーカーさせて頂く予定です。

って、今見たら、なんか私の紹介文が偉くかっこいいんですけど(笑)

2013年3月21日木曜日

[VS] Google Crash Handler が動いていると Visual Studio の XAML UI デザイナーがハングする?

2月後半くらいからこの現象が出るようになって困ってました。

  1. Windows 8 上の Visual Studio 2012 を起動。(私が使ってるのは Ultimate。他のエディションは不明)
  2. 「ファイル」-「新規作成」-「プロジェクト」 で Visual C# の 「Windows ストア」 で 「新しいアプリケーション (XAML)」 を作成。
  3. プロジェクトができたらソリューションエクスプローラーで MainPage.xaxml をダブルクリックして XAML UI デザイナーを開く。
  4. XAML UI デザイナーのどこかをクリック。

これで、Visual Studio がハングしてどうしようもなくなります。
私の環境では 100% こうなります。
同じような環境が 2つ(デスクトップ PC とノート PC)がありますがどちらも 100% 発生します。
上記では例として新規作成のプロジェクトにしましたが、既存のプロジェクトを開いて XAML UI デザイナーをクリックしても同様です。
何かに時間がかかっているだけかと思い 10分以上放置してみたこともありますが何ともなりませんでした。
ちなみに、WPF のデザイナーでは問題はでません。問題が出るのは Windows ストアーのデザイナーだけのようです。

この状態になったら以下の方法で部分的に復旧させることができます。

  • タスクマネージャーを開き 「Microsoft Visual Studio XAML UI Designer (32 ビット)」 という名前のプロセスを終了させる。

どうやら XAML UI デザイナーは別プロセスになっているようで、こうすると Visual Studio が操作できるようになります。
ただし、XAML UI デザイナーは死んだ状態なので下図のようになりデザイナーは使えません。

XAML_UI_Designer_Hangup.png

デザイナーは使えませんが、XAML を手書きはできますし、XAML UI デザイナー以外の部分は問題ないのでとりあえずこれで使ってました。(最近は XAML UI デザイナーが必要なことはあまりやってなかったのでこれで何とかなってた)

けど、これはさすがに不便なので解決策を探ることに、、、
まず手始めに何かのプロセスが影響を与えていないことを確認するためにタスクマネージャーで殺せるプロセスはみんな殺す。。。あれ?動くようになったぞ?
いきなりビンゴ。あとはどのプロセスが原因になっているのかを特定するため地道に試していくと、、、

  • タスクマネージャーで 「Google Crash Handler (32 ビット)」 という名前のプロセスを終了させれば Visual Studio 2012 の XAML UI デザイナーがハングしなくなる。

でした。

Google Crash Handler が何なのかはわかりません。(まぁ、名前的にクラッシュを検出してレポートするためのものなんでしょうが。そんなものが Visual Studio をハングさせてしまうというのも皮肉な話)
また、何を入れると入るのかもわかりません。Google 日本語入力(Google IME)、Chrome、Google Toolbar あたりだとは思いますが。
ちなみに、GoogleCrashHandler.exe は バージョン 1.3.21.135 で、タイムスタンプ 2013/02/06 08:21 でした。

と、冷静にまとめましたが、原因が特定できたときには思わずガッツポーズしちゃいましたよ(笑)

2013年3月20日水曜日

[勉強会] Room metro #14 大阪に行ってきた

3/16 開催の「Room metro #14 大阪」に参加してきました。
場所は淀屋橋の IIJ さんの会議室。人数の割には広めの会議室で、無線/有線 LAN もあり、UStream 配信も OK というすばらしい環境。(配信設備は自前で用意する必要があるけど、結局それも IIJ の方に(個人的に)借りたのかな?)

どのセッション・LT もとてもおもしろかったです。

  • TypeScript はおもしろそうだし使ってみたいとは思ってるんだけど。node.js + TypeScript とかおもしろそうだし。
  • Direct3D はやっぱりめっちゃおもしろいよな。なんかやってみたい。
  • ちょっとしたデータを保存するには SQLite 便利っすよ。
  • P●P→C# ってよりやっぱり設計が大事っすよね。うん、大事。
  • やっぱりどうせアプリ作るなら最低限英語版は作んないとなぁ。
  • VAIO Tap 20 を持ち歩いてたら目立つだろうなぁ。けど、あれを電車の中に持ち込むのはちょっとw

で、今回 SQLite をネタにセッションをさせて頂きました。セッション資料を下に貼り付けておきます。
最初は 30分くらいのセッションのつもりだったので軽く SQLite を紹介する程度のつもりだったんですが、あとで「50分で」と聞いたので関連するネタを追加したんですね。前日は東京出張だったので新幹線の中で考えてました。(ファイルピッカー使っても一部のフォルダーしか見えないデモとか、PC 側で壁紙を変えると Surface 側も自動的に変わるとか、ARM バイナリーを Surface でリモートデバッグするとか、が追加したあたりのネタ)
んが、ちょっと追加しすぎて、というか、話してたら調子にのっちゃって時間をオーバーしちゃいました。てへぺろ(・ω<)

終わったあとは懇親会。
これも楽しかった。

2013年2月8日金曜日

[Mesh][SkyDrive] Windows Live Writer の下書きフォルダーを SkyDrive で同期する

任意のフォルダーを SkyDrive や Dropbox で同期する方法について。
Live Mesh では好きなフォルダーを同期させることができました。けど、SkyDrive だと “%UserProfile%\SkyDrive” フォルダー、Dropbox だと "%UserProfile%\Dropbox” に同期するフォルダーが固定されています。変更する方法もあるのかも知れませんが、任意のフォルダーを SkyDrive で同期するっていうような使い方はできなさそうです。
が、シンボリックリンクを使ってやれば普通にできます。

例として Windows Live Writer(以下 WLW) の場合。
ブログを書くのに WLW を使ってますが、WLW で下書きとして保存すると「マイドキュメント」の "My Weblog Posts" フォルダー("%UserProfile%\Documents\My Weblog Posts" フォルダー)に保存されます。このフォルダーを SkyDrive で同期させます。
こうしておけば、どっかの PC で下書きを保存して、別の PC で続きを書くってことができるようになります。(もちろん、それぞれの PC に SkyDrive アプリを入れておかないとダメですが)

やり方自体は簡単です。
ただ、フォルダーを削除したりするので意味がわからない人はやめておいたほうが無難かもです。

  1. "%UserProfile%\Documents\My Weblog Posts" フォルダーを削除する。(注意 当然ですが、今までに保存していた WLW の下書きなどが消えます。必要なら他のフォルダーにバックアップしておくなどしておいてください)
  2. "%UserProfile%\SkyDrive\My Weblog Posts" フォルダーを作成する。
  3. 管理者としてコマンドプロンプトを起動してそこで
    mklink /d "%UserProfile%\Documents\My Weblog Posts" "%UserProfile%\SkyDrive\My Weblog Posts"
    を実行する。
  4. (必要なら 1 でバックアップしたファイルを書き戻す)

と、まぁ、やることはこれだけです。

mklink でシンボリックリンクが貼られて「マイドキュメント」の "My Weblog Posts" フォルダーが SkyDrive の下の "My Weblog Posts" フォルダーに繋がります。WLW が下書きを「マイドキュメント」の下に保存すると、それは実は SkyDrive の下なので SkyDrive が同期してくれます。
私は Windows Live Essentials に Mesh が含まれなくなったとき(確か半年くらいだっけ)からこの方法で任意のフォルダーを SkyDrive で同期させています。来週、2月 13日で Live Mesh サービス自体が終了だというニュースを見て、あらためて書いてみました。

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 なのか)

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