2015年5月21日木曜日

Azure上でWindows 10を試したい人向けメモ

少しだけつまづいたのでメモを残しておきます。
ある日のこと、確かWindows 10のTechnical Preview(Insider Preview)版はAzure上のテンプレから簡単に試せたよな…と思い新ポータルのギャラリーでwindows 10と検索するも、見つかりません(図1)。


図1 新ポータルでwindows 10を検索 

もしかして、と思い現行(旧)ポータルで検索してみると見つかりました(図2)。


図2 現行ポータルでwindows 10を検索

ここから起動してめでたしめでたし。

新ポータルから見つかるギャラリーと旧ポータルのものに結構違いがあるんですね。気をつけよう。

あとはインスタンスタイプの設定などを普通におこなって、無事に起動できました。
ビルド番号は10074でした。1月の版からはきちんと更新されていて、4月のBuildで発表された版になっていますね(図3)。

図3 2015/05/21時点で新たにWindows 10 PreviewのVMを作った感じ

しかしビルド10122はまだ来てないようです。今日出たばかりだから仕方ありませんね。まあ、ことプレビュー版に関しては、最新のものほど早くAzureへ展開してほしいものですが。

そうそう、ひとつtipsですが、プロビジョニングするタイミングでは大きめのインスタンスを作っておくのがおすすめです。
Win10TPの初期化作業って結構いろんな処理をしているようで、小さなインスタンスではログインして使えるようになるまで平気で20分以上かかりました。
大きめのインスタンス(A3あたり)を作って、プロビジョニングが完了してログインまで確認できたらA0/A1あたりへ落とすという使い方がよさそうです(A3でのプロビジョニングをおこなったところ、13分程度でリモート接続完了、デスクトップ表示まで到達しました)。

2015年4月30日木曜日

Kotlinで作る自由でラクなMOVERIO BT-200開発環境 2ヶ月目

Engadget・エプソン主催のMOVERIO体験会へ参加し、MOVERIO(BT-200AV)を6ヶ月間の無料モニターとして借り受けました。
本記事は、無料モニター2ヶ月目の記事です。
前回: 新MOVERIOは実用端末たりうるか。BT-200AVを借りて試した話
先月は、基本的に一般利用の視点でみていきました。ハードウェアとソフトウェア両面について雑多なメモを書き、特にAmazonのアプリストアを突っ込めば結構多くのシーンでアプリ不足はカバーできるのでまあそれはそれで、という話を書きました。
概況を把握したところで、今月はアプリ開発のための下準備をしました。

Effective C++読書メモ #32

Item 32: Make sure public inheritance models "is-a."
前回: Effective C++読書メモ #31
前回はコンパイル時の依存関係を減らすためにHandlerパターンやInterfaceパターンを使うこともできて、これらによるオーバーヘッドを避けたければprodビルド時にこの部分を差し替えられるような方法をとるのが良いよというつらそうな話だった。
今回はpublic継承の話。「「public継承はis-aだよ」」
えらく寓話的に、とにかくしつこく頭へ刷り込むように書いてある。
他のトピックはこの周辺を補強するもの。
  • ある振る舞いを持たない継承関係に関して、実行時エラーを出すようにするよりはコンパイル時にエラーを見つけられるようにしたほうが良いよという話
  • public継承をすると親の挙動は常時維持されるかというとそうではないよねという議論
  • rectangleとsquareの実装については分かりやすかった
    • 親のクラスで定義されているフィールドの一部を子の側でいじるなど、親の想定している状態に対して手を加えた場合に挙動が変わっても仕方ないねという話で、それは仕方ない
他の策としてhas-ais-implemented-in-terms-ofが挙げられている。これらはもう少し後のチャプターで出てくるのでその時に。

Effective C++読書メモ #31

Item 31: Minimize compilation dependencies between files
前回: Effective C++読書メモ #30
前回はinlineの使い方という話だった。今回はコンパイル時の依存関係をなるべく減らせという話。
再コンパイルを避けるためになんでもかんでもforward declarationへ逃がすのはむり。コンパイル時にオブジェクトの大きさを把握しておく必要があるし、テンプレート絡みだと正確な定義がどういうものか前方宣言だけではわからないから。
インタフェース定義のみを含んだクラスを作り、それにshared_ptrで実装クラスの実体を紐付けるpimplイディオムというのが紹介されてる。declarationとdefinitionでヘッダファイルを分けて両方メンテしろというのは結構厳しいなぁ。Clangとかコンパイル高速なやつを使えばそういう人間へ優しくない方法はそこそこ避けられる気がする。しかしこの用途のためにあるらしいiosfwd(iostreamのforward declarationをまとめたファイル)を知ることができたのはプラス。
この節でC++に純粋なinterfaceは構文として存在しないよというのを読めたのも結構プラス。
ところどころよく分からん(virtual ctorとかなんぞという)ので、この節はそのうち戻ってきてちゃんと読みなおす。節の結論としては、HandleクラスやInterfaceクラスは開発中のビルド時間削減に使って、最終版ビルド時にはこれらを外すようにするのが良いという話だった。
次からはC++におけるOOPの話。

Effective C++読書メモ #30

Item 30: Understanding the ins and outs of inlining.

これまでメモ無しで読んできていたのを他の本と同様にメモ残していくようにしたので今回から。Effective Objective-Cのメモとスタイルを揃えて通番途中からスタートしてみる。

インライン化の恩恵は関数っぽく扱えつつ関数呼び出しのオーバーヘッドがないというだけではない。コンパイラによるコンテキスト固有の最適化を追加でおこなえるかもしれない。逆に、コードサイズが増えてキャッシュミスしやすくなるかもしれない。インライン関数がかなり小さなものだったら、関数へコンパイルされるよりもコードが小さくなるかもしれない(スタックのpush/popとか無いのだし当然ではある)。

暗黙的なインライン関数の書き方があるの知らなかった。constで直値を返すアクセッサメソッドは勝手にinline扱いになるということなのかな。

テンプレートを考えなしにインライン化宣言するなという話もあったけれど、ちゃんと理解するにはC++力が足りなかった。そのうち戻ってこよう。

インライン化はコンパイラによって無視されうるという話。これ知らなかった。ループを含んだり再帰するようなものは無視する(そりゃそうか。これを安全にインライン化すると結局関数へ切り分けるのと同じかそれ以上に複雑なコード生成となりそう)。あと、virtualキーワードのついたもの(つまり実行時までどれが選択されるか分からないもの)もinlineできねーよとして無視される。言われてみると当然だった。

インライン関数のポインタを用意した場合などには、それに該当する実体が作成される。こうして整合性を取る(実体も別途用意されるの意かな)。

なんでもかんでもインライン化していいわけじゃないという話が続く。例としてctor/dtorが挙げられている。C++の仕様が求めることをコンパイラが実装した結果なにが起こるかという話。仮に空っぽのコンストラクタでも、フィールド初期化などはしてる。そしてその中で例外が起こったらすべて無かったことにしてくれる。これは裏側で例外処理時のコードを大量に生成してる。

ライブラリ構築時にはインライン化するか否かちゃんと考える必要がある。ライブラリの中身をインライン化してしまうと、ユーザの手元にあるそのコードをバイナリ差分として更新する手立てがない。焼きこまれてるんだから、当該コードを更新するためには再コンパイルが必要。インライン化されてなければ別バイナリをリンクし直すだけでok。この視点は無かったので役立つ。

デバッガの邪魔にもなる。これも気付いてなかった。言われると当然で、そもそも関数じゃないんだから単純にコールスタック追えない。まあプログラムカウンタはちゃんと分かる場所にあるはずなのでそれぐらい頑張ってほしいという気持ちではある。

まとめとして、明らかにインライン化すべき場所以外では使うなということだった。ここの処理コストを気にするほど全体は効率的に動かないじゃろというのが主なイメージ。

面白かった。

Essential C# 5.0読書メモ #3

前回: Essential C# 5.0読書メモ #2
前回はChapter 2で値型と参照型、そして配列の話。終わりのほうは特にメモ書くことなかったのでスルーして、今回は続きのChapter 3。
Chapter 3は演算子と制御フローの章。
ここもほぼ読むところはないのでメモ箇所のみ。

浮動小数点演算について

+Infinity-Infinityがあること
IEEE 754準拠の浮動小数点演算では+0と-0の区別がある。単純に0.0と-0.0は区別して処理してくれるということで、きっと便利なシーンがある(自分の手元ではさほどなさそう)。

インクリメント/デクリメントについて

C++ではfoo(x++, x++);とした際の評価順がコンパイラ依存となっているが、C#では常に左から順に評価されるという話が書かれていた。あまり複雑なインクリメント配置はしたくないけれど、覚えておくと便利そうなやつ。
スレッドセーフでlockを利用しないインクリメント/デクリメント方法としてSystem.Threading.Interlockedクラス内にIncrement()Decrement()という両メソッドが生えているとのこと。
これらはプロセッサが持つ機能を使ってスレッドセーフに高速なインクリメント/デクリメント処理をおこなってくれると書かれていた。x86だとinc/dec命令とか使ってくれるのだろうか

コードブロック、スコープ、宣言空間

コードブロックとスコープは正確には違うよという話。unqualified nameで参照できる範囲がスコープで、ローカル変数のスコープはそれを囲むコードブロック。
そしてスコープと宣言空間も違う。スコープは、ある名前が何を指すかを解決するためのもの。宣言空間は、2つのものが同一の名前を持ってはいけない範囲のこと。
コードブロックはスコープの定義と共に宣言空間の定義もおこなう。

条件付き演算子

? : なやつ。C#で唯一の三項演算子だから三項演算子と呼ばれることもあるけれど、基本的には条件付き演算子と呼んだほうが良い旨が書かれていた。

null合体演算子

これ自体はそこそこ使うけれど、Coalescingという単語が特殊でよく覚えられないと気付いたのでメモ。

foreachループ

ループ本体がループ変数を利用するラムダ式か匿名メソッドを含む場合にループ変数の挙動がC# 5より前と5以降で異なるという話(詳しくはChapter 12らしい)があったのでメモっておく。

switch文

  • switchセクションからの脱出にcontinueを使うのは挙動把握が紛らわしくなるのでやめれとあった(そもそもそのパターンで使おうと思ったことがないけれど)
  • fall-throughをどうしても実現したければgotoを使えとあってファァとなった
    • goto default;以外、つまりラベル指定をおこないたければgoto case constant;とするように、とあって用途の特殊感が出てた
    • まあこうやって用途を制限してgotoにまつわる厄介な問題を回避するように言語設計されてるけど、やっぱりコードの流れを追いづらくなるのでgotoは避けようね、で終わっていた
  • defaultセクションを末尾に置く必要は特にないと書かれていて、そういえばそうかと思った

プリプロセッサ用のディレクティブ

#lineは馴染みがなかった。SourceMapのようなことができる(#warningで警告を発生させる際に、当該警告箇所ではなく別の場所が原因で問題が発生したことをコンパイラへレポートするもの)。
ライブラリを作っていると便利なシーンがきっとある感じがした。
結構長い章だったけれどこれで終了。次のChapter 4はメソッドとパラメータ。

Essential C# 5.0読書メモ #2

前回: Essential C# 5.0読書メモ #1
Chapter 2のちょうど真ん中あたりまで、データ型について読んだところだった。今回はその続きで値型と参照型のあたり。

値型と参照型の話

粛々と進むので粛々と読む。
途中で出てきたキャスト時の値あふれを例外として処理するための構文(リスト1)は知らなかった。セットでuncheckedも。
リスト1 checked構文の例
checked {
  var n = int.MAX;
  n = n + 1;
}

配列の話

Jagged Arrayの話がこんなにちゃんと出てくるの初めてだ…(それぐらい使ってない)。
さらっと終わるかと思うと結構続く。
BinarySearch()というメソッドが配列に生えているのを知らなかった。事前にソートしておかないとまともに結果を返してくれないよ、というのはそらそうだ。

あまりメモ量は無いけれど、Chapter 2が終わったのでここまでで今回は終了としておく。