Kindle Voyageをつい買ってしまった。私の使い方だと(確かに高解像度になったしバックライトもより見やすいと体感できるが)、Kindle Paperwhite2012年モデルと比べて価格差ほどの価値は見い出せなかった。正直、買ってしまったことを後悔している。(言いたいこと全部タイトルに書いてみた)

言いたいこと全部タイトルに書いてみた。

C#ではpublic公開したいときはinterfaceでなくclassが推奨されているのはあまり知られてない気がするのと、C# 6か7でInternal implementation onlyが導入されそうな件 (タイトル長すぎ)

.NET C#でライブラリを公開するときはinterfaceを公開したほうがいいという意見を見かける。UnitTestとかでmock/stubのしやすさからinterfaceを使った方が便利なことは確かにある。 でもC#では、interfaceは後からメソッド追加すると、interfaceをimplementsしてた人たちが残念なことになるのだ。
なので、C#でインターフェース至上主義を突き進むと幸せになれないinterfaceで公開してしまうと後悔するかもなのだよ。

マイクロソフトの「クラス ライブラリ開発のデザイン ガイドライン」にはこうある

インターフェイスよりもクラスを定義するようにしてください。 ライブラリのその後のバージョンで、クラスには新しいメンバーを安全に追加できます。インターフェイスにメンバーを追加すると、既存のコードが破損します。
クラスまたはインターフェイスの選択

日本語訳が変な気がするが、言いたいことはおおむねわかる。 あと、public class Fooを公開したいとき、Fooが内部的なUnitTest用にinternal interface IFooをimplementしたくても、interfaceメソッドを実装するにはpublicメソッドにする必要があり、Fooでinternalにしておきたいメソッドまでpublicにしないといけなくなる。残念。

C#の将来版では、Internal implementation onlyというのができるかも。 C# Design Notes for Feb 4, 2015 · Issue #396 · dotnet/roslyn · GitHub

今日知ったこと Windowsで音声プログラミング Microsoft.Speech と System.Speech の違い

タイトル書いたら「音声プログラミング」ってなんかヘンだな。ソースコードを音声入力で書く...、とかじゃないですよ。Windows音声合成でしゃべらせたり音声認識に関するライブラリを使うってことです。
音声認識 - .NET デスクトップ アプリと音声認識

結論として、音声の使用経験が少ない方が .NET アプリに音声を追加する場合は、System.Speech ライブラリではなく Microsoft.Speech ライブラリを使用することをお勧めします。

...

System.Speech DLL は OS に組み込まれているため、すべての Windows コンピューターにインストールされています。Microsoft.Speech DLL (および関連ランタイムと言語) は、コンピューターにダウンロードしてインストールする必要があります。System.Speech による音声認識は、通常ユーザーのトレーニングが必要です。このトレーニングでは、ユーザーがいくつかのテキストを読み上げ、特定のユーザーの発音を認識するようにシステムが学習します。Microsoft.Speech による音声認識は、すべてのユーザーに対してすぐに動作します。System.Speech はほとんどすべての語を認識できます (自由発話のディクテーション) が、Microsoft.Speech はプログラムで定義した Grammar に当てはまる語やフレーズのみを認識します。 .NET デスクトップ アプリと音声認識

上の記事にMicrosoft.Speech と System.Speech の比較がわかりやすい表になっています。

Markdown記法の引用の使い方をかねて、プロなんだったら

Matzさん、いいことおっしゃった。

だいたいプログラマって、野球選手が野球にかけるのと同じくらいの時間かけてるじゃないですか。優秀な人は。
野球もそうなんだけど、頑張った人がみんなプロ野球の選手になれる訳じゃないんだけど、少なくともトップの人は凄い成功して、あの人みたいになりたいっていう憧れの存在って、プログラマーだとあんまりないよね。
Matzさんに聞く、新卒エンジニアの適正年収は?

野球は、広い意味で言えば、誰でもできる。運動音痴の私だが、少年野球チームに入ってたので、野球のおおむねのルールを知っていて、守備についたり、打席に立つことはできる。ここ何十年かキャッチボールもしてないけど、野球できますか? の問に、ある意味「はいできます」と答えてもいいかもしれない。同じように、ソフトウエアも、広い意味では誰でも書ける。でも、ソフト作ってコードを書いて給料もらっている時点でプロなので、野球でいったらプロ野球選手並みに、ソフトウエア作ることが上手でなければいけないのだ。おおよそ技術というものには上手下手があって、技術の対価としてお金をもらうということは、野球でいったら草野球レベルじゃ誰もその技術にお金を払ってくれないはず。

今さら(今こそ?)Win32関数 プロセスのウインドウ外のマウスカーソルを変更するSetSystemCursor()、元に戻すSystemParametersInfo(SPI_SETCURSORS)

WPFではアプリ自身のWindow外のマウスカーソルは変更できません。P/Invoke + Win32関数を使う必要があります。

カーソル設定はこれ
SetSystemCursor()
デスクトップ全体に効くので、うっかり変えるとマウス操作できなくなるのでご注意を。OSリブートすればマウスカーソル戻ります。

戻すのはこれ SystemParametersInfo()でSPI_SETCURSORSを指定。こんな感じで

SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0);

ああ結局最後はWin32なのだ。WPFというか、.NetがきっちりWin32にも追従してほしいけど、このあたりはしょうがないか。
うーんでもWPFよ、かゆいところに手が届かない感どうにかならんのか。そしてこのまま主役になれないのだろうなぁ... (遠い目)。

Node.jsの フレームワーク ExpressJSが4.0になって、結構変わった。

うう、いつのまに結構変わってますな。自分のアプリもloggerを使っていたのですが、モジュールmorganに分割されたので、使うにはpackage.jsonにmorganを追加と、コードにrequire('morgan')してごにょごにょ...。
こちらご覧くださいませ。わかりやすく書いてあります。
ExpressJS 4.0: New Features and Upgrading from 3.0 ― Scotch
まあ、モジュール化して切り出して、それらを使うときのコードもきれいに書ける方向のようです。
でも自分では、staticなhtml/jsをHTTPサーバとしてホストするのにしかExpressJS使ってないのですが。