UVCカメラ対応

先日、WEBカメラなどUVC規格のカメラを使用する案件を行いました。

いつもはUVCカメラのアクセスはOpenCVで行っていたのですが、OpenCVで露光やフォーカスなどのサポート有無や値範囲の取得方法が分からず(対応いていない?)、しかたないのでDirectShowを使用しました。

DirectShowのCOMオブジェクトを直にアクセスして操作するのはなかなか大変でしたが、良い経験になりました。
ライブラリ化を行ったので今後の案件では楽に使用できそうです。

スマートフォンのカメラ

こんにちはmtjです

ふらっと実家に戻ったり水族館等に行った時にスマートフォンのカメラを使うのですが
本当普段遣いするなら安いデジタルカメラなんていらないような性能をしています。

ふとスマホ用のPLフィルタで反射除去をしてみようと思ったのですが あまりうまく行きませんでした
やはりそういったフィルタを付けての本格撮影ならレンズフィルターが使えるカメラを使うべきなのかもしれませんね。
安いデジタルカメラはスマホに負けてしまうので今は高めのデジタルカメラが主流のようですね。

本格的でなくともスマートフォンという小さい機器1つにそのような機能(カメラ、音楽プレイヤー、PC、GPS)が入っているのは
すごい話だなと改めて実感します。

タプルを用いた値の交換

2つの値を交換したい時、皆さんはどのようにしていますか?

私は本日、以下のように愚直に行っていました。

var x = 1;
var y = 2;
var tmp = x;
x = y;
y = tmp;

スマートでないな~と思っていたのですが、
コードレビューにて同様の処理をタプルを用いて以下のように記述できるとの指摘を受けました。

var x = 1;
var y = 2;
(x, y) = (y, x);

う~ん、これはスマート!
(シンプルで可読性が高くて良いですね!)

タプルの構築と分解代入の複合により実現されるようです。
少し調べてみたところ、
コンパイル時には以下のような具合に最適化されるようです。

var tmp1 = y;
var tmp2 = x;
x = tmp1;
y = tmp2;

コンパイラも賢いですね!

今後もこのような知見を活かしてコードをシンプルに保てるようにしたい所存です。

(参考)
以下のサイトを参考に一部コードを引用させていただきました。
ありがとうございました。

複合型の分解 – C# によるプログラミング入門 | ++C++; // 未確認飛行 C

私が、開発に無駄に時間をかけすぎている問題

こんにちは。masugiです。

先日、先輩方の案件を手伝う、という形でとあるソフトウェアの機能の一部の実装に携わりました。その際、たった十数行のコードから成る処理を書くのに7時間もかかってしまいました。そして、私に案件の手伝いを依頼した先輩から、処理を書くのに時間がかかりすぎている、と言う指摘を受けました。

その処理を実装するためのサンプルコードを別の先輩が作ってくださっていたのですが、それを参考にせず、処理を実装する方法を一から自力で調べていました。
実装にかかった時間(7時間)のうち、大部分を処理を実装する方法の調査に充てていたので、予め先輩が用意して下さったサンプルコードを参考にしながら実装を進めていたら、実装に7時間もかけることにはなりませんでした。

今回の実装では、必要なメソッドや類似コードがすでにソフトウェア内の別のコードの中に書かれており、先輩方はそのメソッドやコードが書かれている場所・メソッドの使い方を知っているので、実装に使えそうなメソッドや参考となりそうなコードを自分で探すよりも、知っている人に聞いた方が早かったです。(使えそうなメソッドやコードを知っている人が周りにいない、という状況では自分で調べる必要がありますが)

私は人に聞く前にまずは自分で調べてみる、という習慣があるのですが、開発の現場では開発効率が重要なので、メソッドの使い方やコードの使い方について不明点があったら、そのメソッドやコードを書いた人に聞くことを積極的に行おうと思いました。

QRコードの読み込み

今行っている案件で、QRコードの読み込みを実装しています。

QRコードの読み込みにはZXing.Netを使用しましたが、画像の明るさやQRのサイズによって結構読めない場合がありました。
普通にZXing.Netを使用すると以下の結果になり、6個中3個しか読めていないです。見た目にはかなり綺麗にQRコードが撮影できているのですが。

単純に、前処理に大津の2値化を行うだけでもだいぶ精度が良くなりますが、今回はもっと高精度な前処理+ロジックを行うようにしました。詳細は秘密。
結果、全てのQRコードが読めるようになりました。

ワクチン3回目の副反応

こんにちはmtjです。

ワクチン3回目を打ちましたが 自分の想定以上の副反応でした。
約3日は熱が出ていたのですが 熱は38度超えており体はかなりしんどいという合せ技でした。

スポーツ飲料、鎮痛剤は買ったほうがいいという助言が身にしみました。

これから打ちに行くという方は是非簡単に食べれる物 スポーツ飲料 鎮痛剤は用意したほうがいいかと思います
想像以上に動けませんでした。

Linqによるソート:OrderByとThenBy

先日、あるクラスのソートのためにICompareble<T>を実装したラッパークラスを作成したのですが、
コードレビューの際にLinqのOrderByを使用すれば良いとの指摘を受けました。

以下のようなクラスとそのリスト、値の演算メソッドがあった際に、

class Hoge {
	public int No { get; set; }
	public int Value { get; set; }
}
var hogeList = new List<Hoge>(){ /* 要素たくさん */ };
int CalcHeavyForSort(int value) {
	var ret = 0;
	// 重い演算
	return ret;
}

次のように書くことで、

hogeList = hogeList.OrderBy(x => CalcHeavy(x.Value)).ThenBy(x => x.No).ToList();

1. Valueの演算結果により昇順でソート
2. 1によるソートの順序内でNoにより昇順でソート
を実行してソートされたリストを取得できます。

降順ならOrderByDescending, ThenByByDescendingです。
特殊な比較を行いたい場合は、IComparerを引数に与えることもできるようです。

引数で与えたラムダ式の実行も1要素1回だけのようですので安心ですね。
(内部でラムダ式の戻り値のリストを作成し、
インデックス同士を比較するメソッド内でその戻り値リストへアクセスしているようです。)

雑ですが、もしも次のようにソート時に同じ重い演算を複数回実行する必要がある場合は、

hogeList = hogeList.GroupBy(x => CalcHeavy(x.Value))
		.ThenBy(x => CalcHeavy(x.Value) * x.No).ToList();

次のように匿名クラスでラッパーを作り、それをソートすると良さそうに思います。

hogeList = hogeList.Select(x => new {
		Source = x,
		CalcedValue = CalcHeavy(x.Value),
	})
	.OrderBy(x => x.CalcedValue)
	.ThenBy(x => x.CalcedValue % x.Source.No)
	.ToList(x => x.Source);

Linqは便利で可読性が高く保守もしやすいので、
シビアなパフォーマンスが求められるケースでなければ積極的に使っていきたいです。

眼精疲労

こんにちは。masugiです。
私の最近の休日の過ごし方を振り返ってみると、四六時中Youtubeの視聴、ネットサーフィン、twitterの徘徊のいずれかをしている気がします。
このような目を酷使するような休日の過ごし方によって、眼精疲労による頭痛がおこり、それが休日明けの業務まで続くことがありました。
私は休日はパソコンを長時間操作する習慣があり、長い時には1日中パソコンに向かっているのですが、
休日明けに頭痛に悩まされながら業務を行うはめにならないために、
(可能ならば)長時間にわたるパソコンの使用を控える、パソコンを長時間使用するときは定期的に休憩をとる、適切な姿勢でパソコンを使用するなど、
眼精疲労を予防することを心がけようと思います。

string型プロパティの複数行入力

TextBoxコントロールのTextプロパティなどはプロパティウィンドウで複数行入力が可能です。
以下の画面のように右端の下矢印ボタンクリックで複数行用の入力ウィンドウがポップアップします。

今回、これと同じ挙動を自作のプロパティで行いたく、調べた結果、以下のように属性指定すると複数行入力が行えることがわかりました。


        [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(System.Drawing.Design.UITypeEditor))]
        public string Text {
            get => _Text;
            set {
                ...
            }
        }

PGに数学が必要か否か

こんにちは mtjです。

自分の親にプログラムは誰でもできると話したら数学ができないと難しいと返されたので表題に書いてある通りの事を考えました
個人的には数学は必要なとこは必要だけど、基本必要無いと思います。

計算を作ってコードを作る部分はありますが、基本はそこまで高度な計算は考えません。
大体出来合いのライブラリ側が計算はやってくれます
もちろん動作を理解する上ではできることに越したことはありませんが、数学が苦手だからプログラムを諦めているような人は一度プログラムを触ってみることをおすすめします。

自分は商業科、専門学校出なので数学Ⅱ、数学Ⅲなんて触ったことすらありません
それでもプログラムは普通に書けるので正直学校の成績とプログラムは結びつけるべきではないと思っています。

勉強するやる気とパソコン関係が好きならプログラムは誰でも書ける物と思っています。