ページ

2015年5月19日火曜日

[Xamarin] 何もしてないのに Visual Studio で「値を Null にすることはできません」というエラーが表示される

いつの時点で出るようになったのかわかりませんが、最近 Visual Studio に「値を Null にすることはできません。パラメーター名:project」というエラーが常に表示されるようになってしまいました。

ValueCannotBeNull.png

英語だと “Value cannot be null. Paramater name: project” という表記みたいです。
検索してみるとありました。
Visual Studio reporting errors (Value cannot be null) since last set of Xamarin updates applied

  1. 以下の 2つのファイルを削除する。
    ”C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Xamarin\Xamarin\3.11.446.0\Xamarin.TestCloud.Integration.pkgdef”
    ”C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Xamarin\Xamarin\3.11.446.0\Xamarin.TestCloud.Integration.dll”
  2. 管理者でコマンドプロンプトを起動して以下のコマンドを実行する。
    C:\> "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\devenv.exe" /setup /nosetupvstemplates

なお、2のコマンドは、コマンド自体はすぐ終了しますし画面にも何も表示されませんが、見えないところで devenv.exe が動いています(タスクマネージャーで Visual Studio のプロセスを探せばわかります)。私の環境だと 1分くらいはかかるようでした。

これで「値を Null にすることはできません」エラーが表示されることは無くなりました。

2015年5月18日月曜日

[iOS] Xamarin.iOS で PCL 内のブレークポイントが効かない

どうも Xamarin の最近のアップデートをしてから PCL 内でのブレークポインが効かなくなってしまいました。正確にいつのアップデートからだったかはわかりませんが 2015年 4月後半か 5月前半くらいのアップデート以降のような気がします(以前は普通にブレークポイントで止まっていましたので)。
対策を調べたところ
https://bugzilla.xamarin.com/show_bug.cgi?id=29628#c7
これでとりあえずなんとかなるようです。
要するに

Comment 7 にある ”attachment 11037” のリンクの Xamarin.iOS.Common.After.targets ファイルをダウンロードして "C:\Program Files(x86)\MSBuild\Xamarin\iOS\” にコピーしてやる(オリジナルのファイルはリネームするなどして取っておいたほうがいいかと)。

と、これだけです。
Visual Studio を起動しなおして、クリーンしてからリビルドしてやると無事 PCL でもブレークポイントで止まるようになりました。

2015年3月31日火曜日

[Azure] クレジットカードじゃなくて請求書払いにしてみた

Azure を普通に使いはじめるとクレジットカードで支払いをすることになります。けど、法人だとクレジットカード払いじゃなくて請求書払い(銀行振込)にしたいということがよくあるんじゃないかと思います。手続きすれば Azure もちゃんと請求書払いにできるそうです。
手順は Azure の請求処理 にあるとおりにすれば OK です。

と言っても、私は請求書払いの手続きをしたことはありません。知り合いの会社さんがやってみたとのことで、その話を聞いただけです。(自分の覚え書きも兼ねてブログっとこうと思った次第)

先に Azure のアカウントとサブスクリプションを作った状態(まだ何も使っていない無料評価版状態)で Azure の請求処理 に書いてあるサポートに連絡したら、その後の手順を詳細に書いたメールがきてその通りに手続きするだけだったとのことでした。かなり丁寧に作業手順を書いてくれていたそうで、特に難しいことも無く、書かれたとおりに進めていくだけだったそうです。ただ、請求書払いにするには与信が必要になるので必要書類を送ったりなど時間的にはちょっとかかると言っていました(それでもそんなにかかるわけではないそうですが。確か 1週間程度で手続きが済んだと言ってたような)。ちなみに、書類のやりとりも Fax や郵送ではなくセキュアなファイル転送ツール?でファイルをやりとりするだけだったとのこと。(具体的にどういうツールを使ったのかはわかりません)
という感じで、クレカ払いのようにネットでポチポチするだけというわけでは無いですが、そんなに手間はかからず変更できるようでした。

Azure サポートのブログにも「Microsoft Azure 請求書について」という記事がありました。

2015年3月25日水曜日

[Azure] SQL Database で identity を使うと値が飛ぶ?

Azure の SQL Database で identity を使ってるですが、たまに値が飛びます。
普段は 1、2、3、、、と普通に連続した数値になってますが、何かの拍子に 12501、12502、12503、22169、、、と突然値が飛びます。これが発生するのはしばらく DB アクセスが無かったときのあととかに多いように思います(が、きちんと調べたわけではありません)。
確かにドキュメントには連続した値が保証されるわけではないというようなことが書いてありますし、まぁ、重複した値が生成されることが無ければいいと言えばいいのですが。。。けど、実際に 1万近く飛んだりするのであまりハデに飛ばれると最大値に予定より早く達してしまうんじゃないかとか、ちょっと不安があります(bigint にしとけばそうそう最大値になることは無いでしょうが)。

検索してみると
http://stackoverflow.com/questions/20797672/azure-sql-server-identity-key-values-jumping-up-by-1-000
こんな感じで同様の報告はいくつもあるんですが、どうも仕様と考えた方がいい感じ。どうしてもイヤなら自分で採番するとかないんでしょうね。

2015年3月20日金曜日

[Xamarin] おぉ!Xamarin は Objective-C や Java より高速だったのか!

(タイトルは釣り用の誇張表現w)

@atsushieno さんのツイートより。

ほう、これは興味深い。
Mobile App Performance Redux」にて iPad Air 2(iOS 8.2)と Moto X(Android 5.0)で同じ意味のコードの速さ比べをやってみたという結果が紹介されています。
速度比べしているのは 600点の GPS 座標のデータ(これ自体は事前に準備)をごにょごにょと計算しながら SessionManager という独自のクラスに格納していくという内容みたいです。これを 1,000回繰り返した時間の 10回の平均なようです。

へ~ぇ、iOS では Swift > Xamarin > Objective-C だったとのこと(Swift が一番高速で次が Xamarin)。Swift と Objective-C ってこんなに速度違うってことにびっくり。そしてなにより Xamarin が Objective-C より速いとは。
ちなみに Xamarin.iOS ではビルド時にネイティブコードにコンパイルします。本家 .NET のようにコンパイル時に中間言語(IL)を作って実行時にそれをアセンブルして動くっていう形ではありません。iOS では実行時にマシンコードを生成するという方法は禁止されている(アプリの審査が通らない)のでこういった方式にはできません。なので、コンパイル時にネイティブコードが生成されます。
※ このあたりが知りたい方は @atsushieno さんの「Xamarin.iOSの仕組みとアプリケーションの構成」とかを読むといいんじゃないかと思います。
というような仕組みなので、ライブラリがきちんと最適化されていてコンパイラが賢ければそれだけ速くなってもまったくおかしくありません。というか、Xcode の Objective-C コンパイラってろくに最適化とかしてないってことなんですかね?

続いて Android。こちらも数値的には Xamarin の方が Java より速いです。が、まぁ、これはほぼ同じと言っていい感じですね。
ちなみに、Xamarin.Android は本家 .NET と同じ仕組みです。コンパイル時には IL が生成されて実行時に mono ランタイムによって解釈されて動きます。また、mono ランタイムは Java ランタイムの上に乗っているのではなく Android OS の上に乗っています。Java ランタイムと横並びになってるわけです。この辺りの話は「Xamarin.Androidの仕組みと、ソフトウェア構成」とかを読むといいんじゃないかと。

ちょっと気になったところ
コメント的に書いてあるところですが、Swift 版で最初は class Point を作って class Gate: Point と Point を継承するって形にしていましたがこれはパフォーマンス的にまずいので、struct Point にして Gate は Point を継承しない形にしたそうです。(Swift はまったく詳しくないのでわかってませんが、.NET の値型・参照型と同じ話なのかな?) たぶん これ とか これ の話じゃないかと思います。
Xamarin 版では、ループの中で DateTime.UtcNow を使ってたのはパフォーマンス上の制限になるので外に追い出したそうです。修正した結果は これ かな?元ネタを探してみたら このやりとり のようです。どうも DateTime.UtcNow はまずローカルタイムを取得してからそれを UTC に変換するので意外と処理量が多いってことなようです。まじですか。びっくりです。

パフォーマンスなんてどんな処理内容かによってガラッと変わったりしますからすべてがこうなるなんてまったく言えないと思いますが、それでもこの記事の内容は、たまに聞く「Xamarin って余計な層が噛んでるからネイティブに比べたら遅いんじゃないの?」というほとんど誤解といっていい指摘には十分な反証となりそうです。

2015年3月17日火曜日

[C#] Xamarin 始めました(始めてます)

始めましたと言っても最初に始めたのは「[勉強会] 第2回 Japan Xamarin User Group Conference 西日本編に参加しました」この記事を書いたちょっと前のことなので、すでに3ヶ月以上が経過しているんですけど。
個人的には Xamarin かなり気に入ってます。まぁ、Visual Studio が使えて C# で書けるって時点で気に入らないわけがないんですが(笑)

ところで、たまに「Xamarin を使うと C# で作ったものが iPhone でも Android でも動くようになるらしい」と誤解している人がいますので一応書いておくと、、、
Xamarin は『プログラミング言語として C# が使えるようになるだけ』です。
たとえば、iOS の加速度センサーからデータを取得するコードを Objective-C で書くとこんな感じです。

// iOS(Objective-C)でのコード
CMMotionManager *manager = [[CMMotionManager alloc] init];
if (manager.accelerometerAvailable) {
    manager.accelerometerUpdateInterval = 0.1;
    [manager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData *data, NSError *error) {
        // data.acceleration に加速度の値が入っている
    }];
}

これを Xamarin を使って C# で書くとこうなります。

// iOS(C#)でのコード
var manager = new CMMotionManager();
if (manager.DeviceMotionAvailable)
{
    manager.DeviceMotionUpdateInterval = 0.1;
    manager.StartDeviceMotionUpdates(NSOperationQueue.CurrentQueue, (data, error) =>
    {
        // data.Acceleration に加速度の値が入っている
    });
}

見比べればわかるように使っている言語が Objective-C から C# に変わっただけで、使っている API とかはほぼ同じです。
今度は Android で同じく加速度センサーからデータを取得するコードを Java で書くとこんな感じになります。

// Android(Java)でのコード
private SensorManager sensorManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    List<sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);
    sensorManager.registerListener(this, sensors.get(0), SensorManager.SENSOR_DELAY_UI);
}

@Override
public void onSensorChanged(SensorEvent event) {
    // event.values に加速度の値が入っている
}

これを Xamarin を使って C# で書くとこうなります。

// Android(C#)でのコード
private SensorManager sensorManager;

protected override void OnCreate(Bundle savedInstanceState) {
    this.sensorManager = (SensorManager)ApplicationContext.GetSystemService(Context.SensorService);
    var sensors = this.sensorManager.GetSensorList(Android.Hardware.SensorType.Accelerometer);
    this.sensorManager.RegisterListener(this, sensors[0], SensorDelay.Ui);
}

public void OnSensorChanged(SensorEvent event) {
    // event.values に加速度の値が入っている
}

こちらも見比べればわかるように使っている言語が Java から C# に変わっただけで、使っている API とかはほぼ同じです。

こんな風に、Xamarin は抽象化レイヤーを持ってるわけでもなくでも無く、プラットフォームが持つ固有の機能をほぼそのままラップして C# で使えるようにしている、と思えばいいんじゃないかと思います。API 自体は iOS や Android のものをそのままクラスライブラリにしてあるだけという感じです。(メソッドの一文字目が大文字になっているとか、CMMotionManager.StartDeviceMotionUpdates メソッドのように引数の型によって判断がつく場合はオーバーロードで済ませるようになっているとか、C# で使って不自然にならないように変更されている部分はあります)
また、Xamarin.iOS と Xamarin.Android はクラスライブラリも含めて基本的に別物です。CMMotionManager クラスは Xamarin.iOS にしかありませんし、SensorManager クラスは Xamarin.Android にしかありません。ですから CMMotionManager クラスを使ったコードは Android では動かないどころかそもそも Xamarin.Android でコンパイルすることができません。こういったプラットフォームによって異なる部分はそもそもソースコードを兼用したりといったことはできないわけですね。もちろん、ラットフォームに依存しない部分、たとえばデータを処理する部分とかは共通化できます。Portable Class Library(PCL)や Shared Project といったそれを支援する機能もあります。MVC や MVVM などでビューとコントローラー、ビューとビューモデルをデータバインディングやメッセージングを使ってきちんと疎結合にしてあげればプラットフォームに依存するビュー部分は iOS や Android ごとに作り、依存しない部分は PCL で共通に、といった感じにできるわけです。(WPF や Windows ストアーアプリと共通化するってことだってできます)

※ Xamarin.Forms というビュー部分を抽象化して iOS、Android、Windows Phone の各プラットフォームのビューを「一度書けばすべてで動く」ようにしてくれる機能もあります。Xamarin.Forms はまだまだ進化の途中という感じですが、これはこれでちょっとしたものを作るときには便利なので応援してます。

今やっているプロジェクトでは iOS、Android の両方に対応する必要があるんですが、ビュー部分だけプラットフォームごとに作ってそれ以外は PCL でまとめています(MVVMCross を使っています)。さらにスマホに閉じたアプリではなくサーバーと通信しあうタイプのアプリなんですが、サーバー側は ASP.NET Web API や SignalR なんかを使ってます。もちろん C# です。さらにサーバーにあるデータを表示したりする Windows アプリも必要なんですがこれは WPF + C# です。とすべて C# で統一できてとても楽になりました。もしこれがスマホが Objective-C と Java で、サーバーが PHP で、Windows アプリが WPF C# で、なんてことになっていたら開発効率的に大変なことになっていたと思います。あと、このアプリはデータを処理・解析する必要があって、それがスマホやサーバー、Windows クライアントのいずれでも動かす必要があるんですが、これももちろん PCL でまとめてあります。なので、同じデータ処理 DLL が iOS、Android、ASP.NET、WPF の中で動いています。最初の頃は mono を使って CentOS 上でも動いてました(諸事情で今は CentOS は使ってませんが)。もしこれがプラットフォームごとに別々に実装しなくてはいけなくなったりしたら気が遠くなります。C/C++ なんかを使えばある程度共用はできると思いますが今ほど簡単にはいかないでしょうし。

と、こんなプロジェクトをやっているんですが正直ちょっと(いや、だいぶ)人手不足です。そのためリアルに求人してるんですが、興味があるっていう人どっかにいないかなぁ(Xamarin 知らなくても C# 好きなら OK)

2014年12月8日月曜日

[.NET] VB って If a = a Then が成り立たないことがあるのか!

先日、VB のコードを書いていて初めて知って衝撃を受けました。

Dim i As Integer? = Nothing
If i <> 1 Then
    i = 1
End If

なんのためらいもなくこういうコードを書いてました。当然 i は 1 ではないので If 文の中に入って 1 が代入されるもんだと思ってました。もちろん C# ではそうなります。けど、VB は違うんですね。コンパイラがどういうことやってるのかとりあえず IL を見てみました。IL の内容をそのまま VB で書くと

Dim result As Boolean?
If Not i.HasValue Then
    result = False
Else
    Dim compare As Boolean? = Not i.Value = 1
    result = compare
End If
If result Then
    i = 1
End If

こんな感じでした。(最適化無しのデバッグビルドです。最適化すればもっと効率いい IL になるんじゃないかと思います)
まず i が Nothing でないかを HasValue でチェックして、Nothing でない場合だけ 1 と比較しています。判定結果をいったん Boolean?(Nullable<bool>)に代入してる理由はよくわかりません。普通に Boolean で事足りると思うんですがなんでわざわざ Boolean? なんでしょうね?

というわけで、VB では比較する二項のいずれかの型が Nullable であり、その値が Nothing のときは常に条件は成り立ちません。たとえ等値演算子の両項が Nothing であっても成り立ちません。実際に以下のコードを試してみると「i0 と i1 は違う」と表示されます。

Dim i0 As Integer? = Nothing
Dim i1 As Integer? = Nothing
If i0 = i1 Then
    Console.WriteLine("i0 と i1 は同じ")
Else
    Console.WriteLine("i0 と i1 は違う")
End If

さらに同じ変数どうしでもダメです。

Dim a As Integer? = Nothing
If a = a Then
    Console.WriteLine("a と a は同じ")
Else
    Console.WriteLine("a と a は違う")
End If

これでも「a と a は違う」と表示されます。

もちろん、このことはリファレンスに載っています。
null 許容値型 (Visual Basic)
ここの「Null 許容型の比較」にあるように Nullable を比較した結果は True、False、Nothing のいずれかになり、そして Nothing は True でも False でもありません。さらに、Nothing は = や <> で比較することはできません(結果は常に Nothing になるので)。Nothing を比較できるのは Is か IsNot 演算子だけです。

いやぁ、びっくりした。
参照型の場合は、If obj Is Nothing Then のように Is、IsNot 演算子を使う癖がついてます。Nullable は値型だけど「なるべく参照型っぽく振る舞うようになっている」と思えば Is、IsNot を使わないとダメっていう発想になるかもしれませんが、なんとなく「値型だから」という気がしてなんの疑問も持たずに =、<> を使っちゃってました。そうか、ダメなのか。まぁ、気づいてしまえば確かに参照型っぽくしようと思うとこういう仕様になるっていうのは納得できますが。けど、上の例のように同じ変数の比較でも Nothing だと成り立たないっていうのはちょっとどうなのかなぁ。
それにしても、今までたまたま VB で Nullable を使うコードを書くことがほとんど無かったのもあって、ほんとにまったく気づいてませんでした(C# では Nullable 使いまくってますが)。

ちなみに、このことに気づいたのは INotifyPropertyChanged を実装していた時です。C# でオーソドックスに書いた時と同じように

Public Property MyValue As Integer?
    Get
        Return Me._MyValue
    End Get
    Set(value As Integer?)
        If Me._MyValue &lt;&gt; value Then
            Me._MyValue = value
            RaisePropertyChanged("MyValue")
        End If
    End Set
End Property

こんな風に書いて意図したように動かなくて気づいたわけです。(Me._MyValue か value が Nothing だとうまく動かない)
ではどういう風に書けばいいんだろう?と考えてみましたが、どうやら、

Public Property MyValue As Integer?
    Get
        Return Me._MyValue
    End Get
    Set(value As Integer?)
        If Not Me._MyValue.Equals(value) Then
            Me._MyValue = value
            RaisePropertyChanged("MyValue")
        End If
    End Set
End Property

と書けばいいようです。
Nullable の場合、一見 null になっていても HasValue、GetValueOrDefault() といったプロパティ/メソッドは呼び出せます。HasValue 呼び出せなかったら値が null かどうかチェックできなくなってしまうのでそりゃそうですよね。そもそも、あくまで Nullable<T> の中身が null であることを表しているだけであって Nullable<T> 自体のインスタンスはあるわけですから呼び出せて当然です。そして同様に Equals() も呼び出せます。Equals() は C# での == と同じ結果を返してくれるのでこれでうまくいきます。
もちろん、参照型の場合に値が  null なのに Equals() とか呼び出すと NullReferenceException なので注意。

と、今さらのように知って衝撃を受けたので長々と書いてみました。(VB にはまだまだ気づいてないことがありそう)

2014年12月1日月曜日

[勉強会] Room metro #28 大阪に参加してきた

2014/11/29 に開催された Room metro #28 大阪 に参加しました。
「XAML Day」ということで、XAML をテーマにした勉強会。

私も「XAML 入門」のセッションを担当しました。XAML の特徴や機能を Visual Studio なんかでデモりながらざっくり紹介してみました。セッション資料は slideshare にあげてありますが、デモ中心のセッションにしたのでセッション資料は見出ししかない感じですが。


他のみなさんのセッションはどれもとてもおもしろかったですし、勉強になることもいろいろありました。ほんと、XAML がテーマと言っても Blend あり、WF(Windows Workflow Foundation)あり、おもしろいデモありといろんなジャンルの話が聞けました。
そして、最後は東京から来ていただいたぐらばくさんのセッション。さすが艦これビューワーの作者さんということで、ガリガリと XAML を書いていく様は圧巻(きっと頭のなかに XAML パーサーが搭載されているんだろうという話に納得)。とりあえず、今風なアプリにするにはウインドウの枠を光らせておけばいいようです(違

セッション終了後は場所はそのままで希望者でハッピーアワー。軽食や飲み物を用意して立食形式でワイワイガヤガヤ。とても楽しかったです。そういえば、せっかくプロジェクターとかあったんだから何か映しといたらよかったかも。ただ、主催のさおさんもこういう形式は初めてということで食料が無くなってしまいそうになり途中で追加の買い出しに行ったりとちょっとバタバタしたところもありました。お店でやる懇親会とは違う良さはありますが、やっぱりこういう形式だと運営側に負担がかかっちゃいますね。コツを掴めば適度な量を用意できるようになるのかな?

さらにその後はお茶を飲みながら(私はビール飲んでましたが)二次会。後半は某社のネタで盛り上がってました(笑)

ぐらばくさんを中心に何人かの方は翌日京都観光に行くとのこと。私はシンデレラたちをプロデュースするために代々木競技場に行かなくてはいけないため残念ながら参加できず。

2014年11月18日火曜日

[勉強会] めとべや東京 #6 に参加しました

2014/11/15 飯田橋の IIJ さんの部屋を借りて開催された「めとべや東京 #6」に参加しました。めとべや大阪 の勉強会は何度も出たことがありますし、スピーカーも何度もしています。しかし、東京は今回が初めてです。翌日に東京で用事があったため、前入りして参加してみることにしました。

今回は、いろいろなアプリを開発してる方の開発秘話や苦労話など生の情報を聴けるセッションとのことでした。
実際その通りで、ネタ満載のセッションや結構技術的な細かいところにスポットをあてたセッションなど盛りだくさんでした。
ただ、実は朝まで仕事してて出発するのが遅くなってしまったため最初のマイクロソフト田中さんのセッションがほとんど聞けませんでした。残念。自分のせいなので仕方ありませんが。

おもしろかったのは Mac の方がほとんどいなくて、Windows 系のタブレットの方がとても多かったこと。Surface の方も結構いました。先週の Xamarin 勉強会のときはほとんど全員が Mac だったのに。

セッション後は近くの中華料理屋さんで懇親会。こちらもとても盛り上がりました。

ところで 2週間後の 11/29 には大阪で「Room metro #28」が開催されます。今回は XAML Day ってことで XAML をテーマにした勉強会です。XAML をテーマにした勉強会にするっていうのは以前から決まっていて、そんなところに先週開催された Connect(); にあわせて「The Roadmap for WPF」なんてものが公表されました。今後 WPF にさらに機能追加もするし、パフォーマンス向上なども進めていくなんてあって、一部では「WPF 大勝利」なんて話題になりました。その WPF の中でもとても重要な位置を占める XAML がテーマです。そして C# で iOS や Android アプリが作れるということで昨今とても話題になっている Xamarin も Xamarin.Forms (ビュー部分の作成も iOS、Android、Windows Phone で共通化できるという機能)でも XAML を使います。そんな XAML がテーマです。
というわけで、興味がある方はぜひ参加してみてください。まだサイトには載ってませんが私もスピーカーさせて頂くことになりました。(濃い~ところの話をしたらいいのかと思っていたら、入門編でお願いしますってことなので、おもいっきり入門的なところでいきます)

2014年11月13日木曜日

[Mac] MacBook Pro が輝きの向こう側にいってしまう

自宅で使用してる MacBook Pro(15インチの 2011 early)なんですが、どうも最近調子悪いです。
ハングアップしたりディスプレイに青や赤の点々が表示されたりします。この赤や青の点々ってのは結構不思議な感じです。わかりにくいですが写真を撮ってみました。

MacBookPro_DisplayTrouble.jpg

このときは青と赤の点々がディスプレイの周辺に結構たくさんちらばってます。もっと少ないときもあれば多いときもあります。位置はその時々で違います。色も青、赤だけでなく、黄色やピンクっぽいのも混ざって結構カラフルになるときもあります。定期的にチカチカと点滅したりすることもあったりします。ちょうどクリスマスツリーのイルミネーションのような感じです。「おぉ、今回のはきれいだ」なんて思っちゃうときもあります。そんなわけで記事タイトルを「輝きの向こう側にいってしまう」としてみました(笑)いや、笑い事ではないんですが。

外付けディスプレイで発生することもあるので液晶の故障ではなく、ビデオドライバとかそういったところがおかしいのだとは思います。
点々が表示されてもしばらくは使える場合もありますが、だいたいはシャットダウンして再起動しないと MacOS ごと固まったりします。

この MacBook Pro は毎日使ってますが、調子がいいと 1週間くらいはノートラブルで、調子が悪いと 2~3日に一度くらいは点々が出てハングアップという感じです。いままで何度もハングアップしてますが電源ボタン長押しで強制再起動してやれば復旧するのでなんとか使えてます。セーブしてないデータがあると悲惨なことになりますが、すっかりこまめにセーブする癖が付きました(笑)

検索してみたら SMC リセットとか PRAM クリアとかが効果あるかもってことでやっとみましたが特に変わらず。Option+D で起動して Apple Hardware Test をやってみましたが特に以上は見つからず。あとは OS を全部入れ直してみるか、修理に出すかだなぁ。どちらも時間がかかりそうなので踏ん切りが付かないんです。OS のせいなのかハードのせいなのかがわかればいいんですけどねぇ。

2014年11月12日水曜日

[WP7] Windows Phone 7.x は 2014/12/31 でアンロックできなくなる

microsoft の Windows Store チームからメールが届いてましたが、2014/12/31 以降は Windows Phone 7.x デバイスを開発テスト用にアンロックできなくなるようですね。unlock your Windows Phone 7.x devices にある手順で 2014/12/31 までにアンロックしておけば 24ヶ月間はアンロック状態を維持できるようです。もちろん、すでにストアーにある 7.x アプリには特に影響は無いとのこと。

そうなのかぁ。すでに使ってない Windows Phone 7.5 が 1つあるけど一応アンロックしておこうかな。

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)でアプリを作れるデバイスが数万円程度で手に入るんですからねぇ。