プログラムのできるSEとできないSE

こんにちはmtjです

PGの書けるSEと 書けない(書いたことがない)SEとのことで
自分は両方に合ったことがありますが だいたい上手くいくのはPGの書けるSEでしょう

書けないSEでうまくいっている例はSEの人がすごい勉強家でPGの知識、システムの知識等様々な分野で精通しているか
直下のプログラマーが優秀で大体の事を実現できる、対処してくれる人がいるかな気がします
(そもそも勉強家なSEはPGやってないだけでやれば書ける人が多いと思いますが)

PGを書いたことがあるということは リソースの考え方等作る知識があるので無理な事は無理ということができる可能性が高いです。
書いたことがないSEは無理かどうかも分からず承諾して 結果実現時に頓挫している例をよく見る気がします。

自分の経験ではなんちゃってSEを見る機会が多めだったのでSEと聞くとちょっと身構えてしまいます。

栄養ドリンクと夏季休暇

皆さんは休日、どのように過ごされていますでしょうか。

自分は疲労により椅子に座る気力もなくベッドに転がってだらだらとスマホを弄るなど、
無をしてしまうことが多々あります。
流石にもっと精力的かつ有意義に過ごしたいと思い、
先々週から週末に栄養ドリンクのユンケルを1本飲むようにしてみています。
流行りのエナジードリンクでなく栄養ドリンクなのは、
エナドリは学生時代に飲み過ぎたせいか少し苦手になってしまったからです。
まだ2週だけですが、心なしか週末に心身共に元気な状態で過ごせた気がします。
(プラシーボかもしれませんが。。。)

ところで、弊社は明日から15日まで一応夏季休業となっております。
この連休も元気に過ごせるよう、ユンケルを飲んでおこうかなと思っています。
皆様もお体にはお気をつけて、元気にお過ごしください。

ゲリラ雷雨

昨夜、関東では激しい雷雨に見舞われたそうです。
群馬県では局地的に1時間に120mm以上の雨が降った所もあるそうで、
想像しただけでも恐ろしいなと思いました。

この時季になるとゲリラ雷雨が特に起こりやすくなりますね。
激しい雨による道路の冠水や川の増水、落雷、突風などに
皆様くれぐれもお気を付けください。

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