null条件演算子 (?.演算子)

VS2015で追加されたnull条件演算子(?.演算子)について、今日初めて使ったので覚え書き。

この演算子を使用すると、 Maybeモナドのようにオブジェクトがnullかどうかを気にせずに実装を行えるようになります。

例1:
var control = form?.ActiveControl;
フォームオブジェクトからアクティブなコントロールを取得します。
フォームオブジェクトがnullの場合、controlはnullになります。

例2:
var color = form?.ActiveControl?.BackColor;
フォームオブジェクトからアクティブなコントロールの背景色を取得します。
フォームオブジェクトやアクティブコントロールがnullの場合、colorはnullになります。
なお、null条件演算子を使用しているため、colorの型はNullable<Color>になります。

例3:
var color = form?.ActiveControl?.BackColor ?? Color.White;
フォームオブジェクトからアクティブなコントロールの背景色を取得します。
フォームオブジェクトやアクティブコントロールがnullの場合、colorはWhiteになります。
colorの型はColorになります。

例4:
form?.ActiveControl?.Refresh();
フォームオブジェクトのアクティブなコントロールのRefreshメソッドを実行します。
フォームオブジェクトやアクティブコントロールがnullの場合、Refresh()メソッドは実行されません。

残念なのはプロパティやインデクサへのSetには使用できないこと。(自分が使い方を分かっていないだけかも)以下のようなコードは書けません。
form?.ActiveControl?.BackColor = Color.Black;
(frm?.ActiveControl?.BackColor).Value = Color.Black;

バージョン管理ソフト

弊社で使用しているバージョン管理ソフトはいまだにVSSです。
いい加減に更新しないと駄目だと思いつつも、手をつけることができずにいました。

開発ソフトもVS2012からVS2015に移行したいのですが、VS2015+VSSの相性が悪く、VSSを止めないとVS2015に移行できない。ですので、いやでもVSSを止めて別のバージョン管理ソフトに移行する必要があります。

今までVSSだっったのでTFSに移行するのが楽だと思うのですが、世の中のはやりがGitですし、マイクロソフトもGit推しで今後のTFSの動向が不安なため、Gitにしようと考えています。

WEBに繋がずローカルネットワークでと考えているので、まずはGitLabを試してみようと思います。

モバイル用キーボード

たまにタブレットで文章を書きたいときにキーボードが欲しくなるので、モバイル用のキーボードを購入しました。

今回のキーボード選びのポイントは2つ。
1.キーボードを使用したい時に持っていなければ意味が無いので、常にカバンに携帯しても邪魔にならない折りたたみ式であること。
2.タブレットのUSBポートが1つしかないのでBluetoothで
あること。

悩んだ結果、ミヨシのTOR-BT02にしまし。ですが、正直り気には入っていません。ほかの折りたたみ式の中ではましかと思ってこれに決めました。

 

 

 

10年前に使用していたVAIO TypeUについていた折りたたーボードのできが良く、これと比べてしまうため、どうにも見劣りしてしまいます。このキーボードは折りたたみでありながらキー配置やサイズが通常のキーボードと遜色なくキー入力ミスが少ないです。また、ポインティングデバイスも付いているのでマウスも不要です。残念なのは有線であることだけ。これと同機能でBluetoothのものが販売されたら即購入すると思います。

C#のソースコードを実行時にコンパイル

先日、アプリの実行時に入力した任意のC#ソースコードの値をロギングして、グラフ表示するコントロールを作成しました。

CSharpCodeProviderクラスを使用してC#ソースコードをコンパイルできるのは分かっていましたが、使用するのは初めてです。使い方が分かってしまえば、とても簡単に実装できました。

この実行時コンパイルの機能を利用して、アプリにマクロ機能を実装したり、実行時に任意の処理を注入したり色々と遊べそうです。 

画像処理ライブラリの機能追加

今月も色々と社内画像処理ライブラリに機能追加を行いました。

1.演算に使用する値や論理値を式入力できるようにする。また式で使用できる関数を色々と実装。これにより値操作がとても楽になりました。

2. 配列の作成や連結を行うタスクを追加。

3.画像処理評価ソフトのデザイン変更。今までよりスッキリし、ノートパソコン等の小さい画面でも操作しやすくなりました。

画像案件

12月頃から開発を進めていた画像案件がもうすぐ一段落します。
今回の装置屋さんはとても優秀で、指示したとおりカメラと照明の微調整が行いやすいように作成してくれました。
おかげで現地調整が効率良く行え、今後の保守も行いやすそうです。
他の装置屋さんもこれくらい良い仕事をしてくれると助かるのですが・・・。

C#スクリプト

先日、C#スクリプトを試して見ました。
これを使用すればC#プログラムからスクリプトを実行できるようになります。

C#スクリプトの導入方法は他のサイトにも記載されているので置いといて、どのように実装するかだけ。

<実装例>
private int Test(string text) {
 var args = new TestArgs { Text = text }; ・・・(1)
 var script = CSharpScript.Create(
  ”Value = Text.Length * 2;” ・・・(2)
  , ScriptOptions.Default, typeof(TestArgs));
 var scriptState = script.RunAsync(args);
 scriptState.Wait();
 return args.Value;
}

public class TestArgs {
 public int Value { get; set; }
 public string Text { get; set; }
}

上記の(2)の個所がC#スクリプトのプログラム部分です。
上記は1行だけですが複数行のプログラムを記載できます。
おこなっている内容も特に意味が無く、Textプロパティの文字数を2倍して、Valueプロパティに代入しているだけです。
この計算結果を呼び出し元のC#側で使用することができます。

(1)でnewしているTestArgsクラスは、C#スクリプトへの入力と出力に使用するクラスで、上記ではTextプロパティを入力に、Valueプロパティを出力に使用しています。

上記の簡単な実装でスクリプトを実行できるのは非常に面白いです。
ですが、実際にどのような用途にこの機能を使うかは悩むところです。
思いつくのは、マクロとして使ったり、動的に演算式や判定条件を変更するなどでしょうか。
スクリプトなので速度はC#で実装するよりも遅いですし、もちろんビルド時に静的コードチェックもされないですし、よく考えて使わないと痛い目に遭うかも知れません。

画像処理ライブラリの機能追加

現在、社内の画像処理ライブラリに測長機能を実装しています。
用途が多そうな機能なのに今まで使う機会が無く、実装していませんでした。

手順やインターフェイスはほぼ決まっており、
基本的にはエッジ検出結果を元に内寸や外寸を計算します。

画像処理機能の追加は久しぶりで、色々と思い出しながら作成しています。

タッチパッド付き無線キーボード

先日、工場で使用するPC用にタッチパッド付き無線キーボードを購入しまいた。

マイクロソフトのN9Z-00023で、金額は2000円台とリーズナブルです。

工場などの場合、防塵用のPCラックにPCを格納し、キーボードはスライド式のキーボード台に固定されていたりするのですが、マウスは固定する訳にもいかず、ケーブルも煩わしいのですが、このキーボードがあればそんな悩みもスッキリ解決。

あとは作業者がタッチパッドによる操作に慣れて使って貰えるかだけです。

C# Switch拡張メソッド

C#のswitchステートメントって不便ですよね。古くさいというか。
戻り値が返せなかったり、複雑な条件が指定できなかったり。

ですので、Switch拡張メソッドを作ってみました。

たとえばint型変数valueの値によって文字列を返す場合、以下のように使用します。
var str = value.Switch()
.Case(0, “0です。”)
.Case(x => x > 0, “プラスです。”)
.Default(“マイナスです。”);

たとえば変数valueの値によって何らかの処理を行う場合、以下のように使用します。
value.Switch()
.Case(0, x => {
//0の場合の処理
}).Case(x => x > 0, x => {
//プラスの場合の処理
}).Default(x => {
//マイナスの場合の処理
});

Switch拡張メソッドはobject型の拡張メソッドになっており、CaseメソッドやDefaultメソッドなどをメンバに持つSwitch処理用のクラスを返すようになっています。