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

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