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処理用のクラスを返すようになっています。

ナチュラルソート

最近のWindwosのエクスプローラは、ファイル名のソート方法が今までと異なっています。

以前は単純にソートしているだけでしたが、最近はファイル名内の数値の個所を数値して認識してソートを行っています。
その結果、連番が付いているファイルなどを自然な順番でソートできています。

このソート方法はナチュラルソートと言われるらしく、ネットで調べると参考ソースコードもいくつか見つかりました。

今後、必要な場面が間違いなく有りそうなので、社内ライブラリに追加したいと考えています。

C# 継承元で継承先の型を使用したい

C#では、継承元で継承先の型を使用することが言語レベルではサポートされていません。これはクローンメソッドなどを作成する場合に不便です。

以下のようにジェネリックを使用することで同等のことが一応行えるようになります。

//継承元クラス
abstract class ClassA<TClass> where TClass : ClassA<TClass>, new() {
 public abstract TClass Clone();
}

//継承先クラス
class ClassB : ClassA<ClassB> {
 public int Value { get; private set; }

 public override ClassB Clone() {
  ClassB obj = new ClassB();
  obj.Value = Value;
  return obj;
 }
}

この場合、継承先クラスの型を知るためにTClassを使用しています。TClassの制約にClassA<TClass>が入っているので、ClassA<TClass>を継承したクラスしかTClassに使用できなくなっています。

同等のことが実現できましたが、見た目がシンプルでは無いですね。やはり言語レベルで何とかして欲しいところです。なお、アップルのSwift言語にはこの機能が実装されているそうです。

Project 2013

VISIO2013に続けてProjectも2013に変更しました。
いままではProject2000を使用していました。

Project2000はバグでタスクがうまく動かない場合があったり、Windows7以降のOSでは起動時にヘルプが必ず表示されたりエラーが出たり、何かと不満が多かったのですが、代わりになるソフトが他に無く使い続けていました。
Project2013はそのような問題はなく快適に使用できています。

やはりソフトは新しいほうが良いですね。

VISIO 2013

VISIOを2013に変更しました。
いままでは2003を使用していたので10年ぶりの更新です。

最近はUML図をastahで作成していたので、VISIOの使用頻度は下がっていましたが、
それでも無いと困るので新しくしました。

他のOffice製品と同じようにリボンUIになっており、使いやすそうではあります。
図形が今風のシンプルなデザインになってますね。最初はどうかなと思いましたが、仕様書に貼り付けても違和感なく、むしろスッキリして見やすいと感じました。

やはりソフトは新しいほうが良いですね。

C#で文字列式を演算する

文字列の式を演算したいと思う場合が結構あります。

DataTable.Compute()メソッドで実現できることが分かったので、実装して見ました。

以下が作成したメソッドです。string型の拡張メソッドになっています。
public static T Calc<T>(this string s, params object[] args) {
 using (DataTable dt = new DataTable()) {
  s = string.Format(s, args);
  object result = dt.Compute(s, “”);
  var converter = TypeDescriptor.GetConverter(typeof(T));
  return (T)converter.ConvertFromString(result.ToString());
 }
}

以下のように使うと、(2+4)/2の数値演算を行い、3を返します。
var value = “({0} + {1}) / 2″.Calc<double>(2,4);

以下のように使うと、2>=4の論理演算を行い、falseを返します。
var value = “{0} >= {1}”.Calc<bool>(2,4);

簡単ですね。

34インチウルトラワイドモニタ

DELLが販売している34インチウルトラワイドモニタU3415Wがほしくてたまらない。

仕事ではデュアルモニタを使用しているが、つなぎ目が気になる、輝度や色相の差が気になる。 解像度も現状の2つのモニタを足したサイズよりも大きい。ウルトラワイドでも(多分)見やすい曲面スクリーン。

しかし、金額が10万円! 高すぎるよ。