ListはAdd順らしい

前の続き。

DictionaryはAdd順で列挙してくれるとは限らないらしい(なんせググって見つかったことである)。そしてさらにもうちょいググり続けるとListはAdd順で列挙してくれるらしい???(だんだんあやふやになってきたorz)

 

じゃ、Dictionaryの代わりにListにするかってことで

            var dic = new List<KeyValuePair<int, string>>();
            dic.Add(new KeyValuePair<int, string>(8, "伊丹"));
            dic.Add(new KeyValuePair<int, string>(4, "新伊丹"));
            dic.Add(new KeyValuePair<int, string>(6, "稲野"));
            dic.Add(new KeyValuePair<int, string>(3, "塚口"));

・・・・

new KeyValuePair<int, string>がいっぱいあってうざったい!!!!!!

Dictionaryならすっきりだったのに!!!!

 

てなわけでKeyValuePairのListに特化したClassを作ってみた。

    class ListKeyValuePair<T1,T2> : List<KeyValuePair<T1, T2>> {
        public void Add(T1 key,T2 value) {
            base.Add(new KeyValuePair<T1, T2>(key, value));
        }
    }

うん、やってることは単純だなぁ。これつかうと

            var dic = new ListKeyValuePair<int, string>();
            dic.Add(8, "伊丹");
            dic.Add(4, "新伊丹");
            dic.Add(6, "稲野");
            dic.Add(3, "塚口");

よし、これですっきし。

 

これ実戦投入する気はない(お堅い現場でつので)が、やるだけやったのですっきし。

 

 

 

Dictionaryの列挙順はAdd順じゃないかもだって?

こんなコード書いた。
 
            var dic = new Dictionary<int, string>();
            dic.Add(8, "伊丹");
            dic.Add(4, "新伊丹");
            dic.Add(6, "稲野");
            dic.Add(3, "塚口");
            foreach (var item in dic)
                Console.WriteLine(item.Value);
 
結果はこんなん
-------------
伊丹
新伊丹
稲野
塚口
-------------
 
ああ、よかった。無事に伊丹線の路線図できたね!
 
 と・こ・ろ・が
ちょっと気になることがあってググったら気になる記述が。
 

bbs.wankuma.com

 

>列挙処理のために、ディクショナリ内の各アイテムは、値とそのキーを表す KeyValuePair<TKey, TValue> 構造体として処理されます。 アイテムが返される順序は未定義です。

 

「順序は未定義です」

 

つまり、Dictionaryの各要素を列挙する場合、Addした順に列挙してくれるとは限らないということ???ある日突然「新伊丹」と「稲野」がひっくり返った路線図を吐き出すかもってか???

 

うーん、これはこまった。というわけで、ちょっと考えよ。

VisualStudioのメソッド抽出

VisualStudio2010でメソッド抽出やってみた。
 
<抽出前>
    string a = "";
    bool b = false;
    a = "";
    if (b)
        a = "true";
    Console.WriteLine(a);

<抽出後>
    string a = "";
    bool b = false;
    a = Hoge(a, b);
    Console.WriteLine(a);
 
private static string Hoge(string a, bool b) {
    a = "";
    if (b)
        a = "true";
    return a;
}
 
Hogeにstringの引数がくっついてるのが納得いかん(コードの書き方に難があるというのはいいっこなし)。
 
VisualStudio2015では納得いく動きになってんだけどね。
 

バグを乗り越えて(?)

現在お仕事してる現場関係のグチでおます。特定されない程度にぼかす。

 

その現場、過去(私が逃亡wしてた時期)にひでーバグを出してた。

 

「int配列の各要素につき値が0以外なら文字列変換して出力。0ならば空文字を出力。」に対してこんなバグ入りソースを書いてやがった(C#だべ)

 
<ソース> 
string s = "";
foreach(var item in new[] { 1, 2, 3, 0, 5 }) {
    if (item != 0)
        s = item.ToString();
    Console.WriteLine(s);
}
</ソース>
<結果>
1
2
3
3
5
</結果>
 
こういうくそバグでもリリースされた後の発覚となると厳しい原因分析があって次期バージョンの確認作業に反映しなければいけないわけ(次期バージョンやらせてもらえるだけでも感謝しないといけない状況でつが)で。。。リリース直前の確認項目に
「変数が初期化されているか」
が追加されることに。
 
リリース直前に?
 
また逃げたくなってきた(をい
 
 
 
 

トライやる・ウィーク

朝っぱらから近所を散歩してると「トライやる・ウィーク」なる旗がはためいていた。

わが兵庫県で始まった中学生の職業体験行事が始まったことを知らせるものである。

トライやる・ウィークでいろんなことを学ぶ(将来の私の年金原資である)中学生諸君のことは応援するものである。

 

それはさておき、もし、自分のいる仕事場(ソフトウェア開発)に職業体験の中学生を受け入れるとしたら、どんな問題があるだろうか?

ぱっと思い当たる問題は「ソースを見られる」こと。

さすがにUSBメモリ持ち込んでソースを持って帰るなんてことはしないだろうが、ソフトウェア開発の職業体験となるとソースを見せて理解させて改修させないと意味がないわけなのだが、自社販売のソフトならともかく他社販売のソフトだとソースを見せることがNGなわけで。

職業体験を受け入れることはできないか。

 

 

 

 

考え事。

いまのとこ相手にしてるコードが楽しくて泣きそう。現物はもうすこしエグいが薄めて書いた。

-----------------------------------------------------------------------

private bool CalcMethod(J001Form ParentForm){ /*ParentFormは呼び出し元Form*/
/*この辺略*/
if (h[hindex].count_1 >= 15){
    if ((decimal)h[hindex].valueA_1 + (decimal)h[hindex].valueB_1 > int.MaxValue)
        return false;
    h[hindex].sum_1 = h[hindex].valueA_1 + h[hindex].valueB_1;
}
if (h[hindex].count_2 >= 15){
    if ((decimal)h[hindex].valueA_2 + (decimal)h[hindex].valueB_2 > int.MaxValue)
        return false;
    h[hindex].sum_2 = h[hindex].valueA_2 + h[hindex].valueB_2;
}
if (h[hindex].count_3 >= 15){
    if ((decimal)h[hindex].valueA_3 + (decimal)h[hindex].valueB_3 > int.MaxValue)
        return false;
    h[hindex].sum_3 = h[hindex].valueA_3 + h[hindex].valueB_3;
}
/*以下中途returnのない処理が数百行続くが略*/

/*途中ParentFormへのアクセス(I\O)が数行ある*/
return true;
}

-----------------------------------------------------------------------

これの改修を担当することになったのだが
・h[hindex]の連発
・_1,_2,_3
を見てイラッとしてきたんでなんとかしなければと。


いわゆるリファクタリングとなると、ユニットテストとやらを書きたいとこだが、ひっかかってるのは
・引数にフォーム
・フォームのコンストラクタでプロジェクト特有のいろいろなことを裏でやってそう
・メソッドが長大。直すのは上記含む数行なのに。
・直す部分に引数のフォーム関係なくね?
・直す部分だけVisualStudioのメソッド抽出かけることができない(中途returnが邪魔)
etc

 

とりあえず直す部分の末尾にreturn true;つけてメソッド抽出してから考えよう。

 

 

 

Ich habe HDD (NAS買った)

ドイツ語あってるかしら>タイトル

 

タイトルに続けてPPAPのドイツ語版をやってみようとおもったが諦めて英語で。

 

I have a HDD,I have a HDD,Uh RAID 1

I have a HDD,I have a HDD,Uh RAID 1

RAID 1RAID 1,Uh Raid10 Network Attach Strage!

 

ま、ハズしたよね。ちゃんとNASのこと話す。

 

ハズしたPPAP(改)みたくHDD4台のNASはさすがに大仰(3T×4で6TのRAID10は個人で持つにはデカすぎる)なのでAS3102T&3T HDD×2を買う。

 

さくさくとくみ上げると

!! RAID1な3TのNAS爆誕\(^o^)/ !!

 

写真やわけのわからんExcelファイルは全部NASにぶち込んでしまおう。

PCを身軽にしてやろう。

PCをバックアップするたびに巨大なドキュメントも一緒にバックアップするのはやめよう。

PCを新調するたびにドキュメントをコピーしなくて済む!

 

うはっ、夢がひろがりんぐ。

 

追記

ストレージ系のお買い物をしたときのお楽しみはベンチマーク

すでにAS3102Tのベンチマークはググればいくらでも拾えるが、自分のとこでも確認したくていそいそとベンチマークをとったなり。

f:id:turkey_pc:20161129211100p:plain

これがNASベンチマークかよ。

ちなみにPC内蔵HDDのベンチがこれ。NASのほうが速い。

f:id:turkey_pc:20161129212558p:plain

 

他、いくつかベンチとってた値と比較すると下記のような序列。

内蔵SSD>>>>AS3102T>PCでのファイルサーバー(Core2Duo)>>内蔵HDD>>>>LinkStation(LS-GL)

 

速いNASを入手したので仕事の速度も速く・・・はならないわな。人間の能力以上には速くはなりません。