実装するまで細かいことは考えられない病

https://twitter.coaam/turkey_pc/status/924077426174390272

C#のRandom.Next(int maxValue)のヘルプを見てわいてきた疑問が下記ツイートの件。

 

実際動かすとRandom.Next(0)は常に0を返していました。ヘルプの「指定した最大値より小さい」には反していますが、まぁこれはこれでいいのかなぁと。

 

で、なんでこんなアホなことに気が付いたのかといいますと、乱数を使うプログラムのテストプログラムを書きたかったからです。

乱数が最大値-1,最大値-2・・・・0を順序良く返した場合のテストを書くにはどうしたらいいのか?

ああ、そうだ。Randomクラスに似せてテストに都合のいい任意の値を吐いてくれるクラスを作ればいいんだと。

まあ上記のことはたぶん自動テスト書く人はみんなやってることでしょうが、自分もやってみたくて。 で、書いた。

f:id:turkey_pc:20171028104139p:plain

乱数をInterfaceにして本番用の乱数(RealRandom)とテスト用の乱数(FakeRandom)をそれぞれ実装。

 

FakeRandom.Nextを実装する際に「maxValueが0のときどうしよ?」と疑問が。で、本家のRandomはどうしているのか調べてみたところで冒頭のツイート。

 

境界値なんてバグの温床だからきちんと事前に確認しとけ、と言われるのですが日本語を読んでる段階では境界値に思いをはせることができないおいらです。

コードコピペで失敗した。

twitterに流すほどじゃないこと。

 

Value_A=0;
Value_B=0;
Value_C=0;

If(Obj_A!=null){
 Value_A=Obj_A.Value;
}
If(Obj_B!=null){
 Value_B=Obj_B.Value;
}
If(Obj_C!=null){
 Value_C=Obj_C.Value;
}

 

というコードがあったところに_Dを追加してほしいとのこと。はいはいコピペコピペということで

Value_C=0;

 をコピペしてCをDに書き換える。

Value_D=0;

 

んでもって

If(Obj_C!=null){
 Value_C=Obj_C.Value;
}

をコピペしてCをDに書き換える。

If(Obj_C!=null){
 Value_D=Obj_D.Value;
}

・・・・

さて実行だ。よし、動いた。

・・・・

コードレビューで指摘一件。

やっちゃった。

でもね、ちゃんと動くのよ。実際コードが動く場面ではObj_ホニャがnullになるケースないんで。とはいえ、そんなこと逆ギレしてもしかたないんで反省。

 

開発言語は日々進化する。

などと大げさなタイトルつけましたが内容はショボく中途半端にググったことをメモっただけ。

 

きっかけは拙ツイート

 でした。

Hoge(15,000,000)となっていれば見た目ですぐに引数の誤りが分かるのになぁとツイートしたとこでした。そこに救いの神が約一名

まぢですか?

Hoge(1_500_000)

・・・あかんやないか。

と神を疑い掛けたところで一番疑うべきポイントが頭に浮かんだ。

拙の開発環境が

<marquee>★★★Visual Studio 2010★★★</marquee>

ということである。おもわず変なタグつけちゃったよ(文字流れませんよ?)

 

いまだにVS2010を使ってる事情はさておき(上の会社から指示されたとかそういうこと)、最新環境でならできるのだろうなとググった。

 

"C# 2017 新機能 アンダースコア"でMicrosoft様のサイト引っ掛けることに成功

.NET Framework - C# 7.0 の新機能

https://msdn.microsoft.com/ja-jp/magazine/mt790184.aspx

f:id:turkey_pc:20171012162205p:plain

 

これだぁぁ!!!!!!

 

まさかこんな機能が実装されているとは思わずネタのつもりでツイートしたところ、神のお導きによりここにたどり着くことになろうとは。


 

この例に限らず、開発言語は常にわかりやすく間違えないようにコードを書けるように進歩を続けている。多くのプログラマの要望を少しずつかなえたものである。

プログラマたるもの、よりよき開発言語を用意してくれたMicrosoftに感謝して新しい開発言語を使っていこうではないかと思うものであります。

 

・・・というわけで、そろそろVS2017への移行を考えていただけませんでしょうか?>お偉い人々

名前空間

複数のnamespaceに同じ名前のclassがある場合

①自namespaceにその名前のclassがある場合

自namespaceのclassを使用する場合

名前空間の指定は省略できる(というか普通は省略する)
例 var a = new class1();


他namespaceのclassを使用する場合

クラス名の前に名前空間を指定する
例 var a = new namespace2.class1();
 ※後に出てくるusingによる名前空間の指定による省略はできない

 

②自namespaceにその名前のclassがない場合

usingで使用したい名前空間を事前に指定していない場合

使用したいclassがあるnamespace名を付ける
例 var a = new namespace2.class1();

 

usingで使用したい名前空間を事前に指定している場合

usingで指定した名前空間については記載を省略できる

例 using namespace2;
  (中略)
  var a = new class1();
ただし、他のusingで指定した複数の名前空間に同名classが存在している場合は名前空間の指定は省略できない(ビルドエラーになる)

ビルドエラーになる例

例 using namespace2; //ここにclass1あり

  using namespace3; //ここにもclass1あり
  (中略)
  var a = new class1(); //これはビルドエラー

 

 

 

 

PCのケーブル周りを整理した。

図を書くのめんどくさいのでざっくりメモ。

 

KVMスイッチ(SW-KVM4HDC)についているケーブルがちょっと嫌だった。

なぜか?

①全く使用しないアナログサウンド用のケーブルがついててなにかとほかのケーブルと絡みつく

②DVIケーブルが太くて硬いのでとりまわしがむずかしい

③DVIとUSBが同じ長さで固定されているが最近はDVIのほうにDPとの変換コネクタを挟むことが多いためにUSBのほうが相対的に短くなってしまうのでUSB側の接続時に強めに引っ張る必要が出てきた

 

てなわけで、こいつらまとめて解消すべく添付してたケーブルを全部引っこ抜いて「HDMIケーブル+DVI-D変換」と「USBケーブル」に置換。

 

さっぱりした。

 

 

KVMスイッチの名誉のために付記。

SW-KVM4HDC購入当時は映像出力はDVI-Dが主流でした。

いいタイトルが思い浮かびません。

プログラミングのこと。

 

画面上の部品のプロパティを設定するだけのメソッド(下記)がありまして

private void inittexts() {
this.textBox1.Text = "赤";
this.textBox2.Text = "黄";
this.textBox3.Text = "青";

this.textBox1.BackColor = Color.Red;
this.textBox2.BackColor = Color.Yellow;
this.textBox3.BackColor = Color.Blue;
}

 

画面に部品が一つ増えたがために行追加(下記)する必要がでてきました。

  this.textBox4.Text = "緑";

  this.textBox4.BackColor = Color.Green;

 

さて、これらをメソッドのどこに書くべきか?

①すでにあるコードに準じてTextとBackColorの設定行を分けて記述

②追加した行だけメソッド最下部にまとめて記述

 

まあ普通は①でしょう。

 

で、その後も順調にこの画面に部品が増え続けたとしませう。

private void inittexts() {
this.textBox1.Text = "赤";
this.textBox2.Text = "黄";
this.textBox3.Text = "青";
this.textBox4.Text = "緑";

//(ここに45行)

this.textBox50.Text = "黒";

 

this.textBox1.BackColor = Color.Red;
this.textBox2.BackColor = Color.Yellow;
this.textBox3.BackColor = Color.Blue;
this.textBox4.BackColor = Color.Green;

//(ここに45行)

this.textBox50.BackColor = Color.Black;

}

 

部品を追加する際のコードの物理位置がだんだん遠ざかってきました。TextとBackColorの設定は物理的にセットにしておいてほしかったなぁとこの時点で思うわけです(もっと早く気づけという意見多し)。

お気楽なプロジェクトならさっさと並び替えることでしょう(というかここまでにならない)が、重苦しい現場だとコードを並び替えるだけでも大騒動。それこそ画面全部品設定が正しいか再確認というめんどくさいことに。

 

つらひ。

所得税法がわからぬ。

所得税法がわからぬ。

いまさら職業会計人狙ってるわけじゃない(そこからは完全に落ちこぼれてまつ)のだが、システム屋として何の因果か所得税法の細部を見なくてはいけなくなってしもた。

でーいろいろ調べているうちに不思議な控除に遭遇した。

 

No.1175 勤労学生控除|所得税|国税庁

 

<引用>

勤労学生とは、その年の12月31日の現況で、次の三つの要件の全てに当てはまる人です。

(1)(略)

(2) 合計所得金額が65万円以下で(以下略)

(略)

3 勤労学生控除の金額

(略)
27万円

<引用おわり>

 

控除というのは所得を求めるのに必要なものなのだが、控除を適用する条件に所得があるというのがなんとも理解に苦しむ。

 

たとえば収入80万としてほかの控除がなければ

①勤労学生控除適用する 80万円-27万円=53万円

  所得53万円なので勤労学生控除は適用可で正解

②勤労学生控除適用せず 80万円-00万円=80万円

  所得80万円なので勤労学生控除は適用不可で正解

 

控除を適用したがために当該控除の所得要件をクリアできる場合、どっちが正解なんだろ??