ページ

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 な人(私ですが)とか、○○な人とか、××な人とかがいて、そんな話でも盛り上がりました。