ごまなつ Blog

楽しく働ける世界を目指して

【C#】配列のコピーは=でやってはいけない

基本的な話です。

配列aを配列bにコピーして、その後配列bの要素を変更したいとします。

a[3]=[1,2,3]
b[3];
a=b;
b[3]= b[3]+2;

普通にコピーするだけならこれでいいだろ、と思うのですが、これでは参照ごとコピーされ、a[3]の値も変更されてしまいます。つまり、a=bとした場合、aが変更されたらbが、bが変更されたらaも変更されてしまいます。よって、どちらも変更したい場合でなければ、Array.Copyを使いましょう。

Array.Copy(コピー元、コピー先、長さ)

この動作を知っているとなにかの役に立つかもしれません。

【C#】ListViewで移動禁止にしたい

結論

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            if (e.IsSelected && (e.Item != selectedItem))
            {
                if (isChanged)  
                {
                    e.Item.Selected = false;
                    selectedItem.Selected = true;                   
                    if (Counter)
                    {
                        Counter = false;
                        MessageBox.Show("移動できません");
                    }
                    else
                    {
                        Counter = true;
                    }
                }
                else
                {
                    selectedItem = e.Item;
                }
            }
        }
        private void listView1_MouseUp(object sender, MouseEventArgs e)
        {
            selectedItem.Selected = true;   //これが無いと選択状態が消える
        }

動作

イベントハンドラで、選択されているアイテムが変更されるときに、選択されているアイテムがイベントハンドラを発生させていて、アイテムは異なるときに変更があったら選択を無効化して選択されたアイテムに戻しています。 このCounterというのは、選択を変更する一連の動作がItemSelectionChangedを2回呼ぶので、1回しかメッセージボックスを出さないように入れています。

MouseUpを入れておかないと、選択状態が消えます。listViewはほかの場所をクリックすると選択が消えますよね。

【C#】ListView_SelectIndexChangedは、一瞬-1がインデックスに入る

ListView_SelectIndexChangedは、ListViewの選択されているアイテムのインデックスが変更された時に発火するイベントハンドラです。なので、処理は

private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
        {
             //何らかの処理       
        }

となりますが、これではエラーになります。なぜか。それは、選択されているアイテムのインデックスが変更されるとき、一瞬-1がインデックスに入るからです。aからbに選択されているインデックス変更するには、

  1. aが選択されている
  2. 選択を外す
  3. bを選択する

という処理順番をとっているようです。2の状況では、インデックスが-1になり、存在しないインデックスにアクセスしようとしてエラーが起きています。よって、

private void ListView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (ListView1.SelectedItems.Count > 0)//
            {
                //何らかの処理
            }      
        }

とすることで、存在しないインデックスにアクセスしようとする状況を回避することでエラーを回避できます。

「アジャイルな強いチームを作るチームビルディング超実践ガイド」を読んでの感想

TL;DR

チームビルディングのやり方がわからない人にぜひ読んでほしい。意義とやり方がわかる。 同人誌なのにカバーと帯がついてるよ。まるで商業誌のようになってるよ

チームビルディング

私は組み込み系の職場であり、一人が担当製品のソフト面、一人が担当製品のハード面を担当するといった仕組みなので、いわゆるチーム開発というものがよくわかっていません。ですが、この本を読むことでチームビルディングがなぜ必要なのかわかりました。それがわかってもやり方がわからないじゃん、となるのですがいろいろな手法が紹介されています。同じ方向をチーム全員が向けるもの、多様性を認めるもの、関係の質を求めるもの、文化を作るものがあります。チームといってもまだチームになっていない状態から、自己組織化できているチームまであるのでそれぞれのチームに必要なチームビルディングの手法が載っていると考えます。

チームが何のためにあるのか、というと良い製品を作ることだと思います。いい製品を作るための要素には、チームメンバーがそれぞれ活躍していくことがあると思います。活躍するためには、そのメンバーの力だけでなくチームの力も必要だと思います。チームの力が発揮されるためには、全員が良い製品を作るという想いを持ち、その製品のイメージが全員で共有されていることやチームメンバーの関係が良いことが必要だと考えます。エンジニアだって人間なので、人間関係の悪さが影響するのは当然のことです。このチームの力を発揮するために、チームビルディングが必要だと考えます。

自分の陸上競技の経験から

陸上競技をやっていた時に4×100mリレーをやってましたが、チームのタイムは単純に4人の100mのタイムを合計したよりも早くなります。物理的にはセパレートゾーンで加速できるからなどいろいろ要因があるんですが、心理的には全員が速くゴールする意識を持っていることもあると思います。

バトンを渡すメンバーと喧嘩をした時、バトンパスの精度が悪くなりました。相手のことを理解できていると、今日は調子がよさそうだから自分はセパレートゾーンを走る距離を短くしようとか、顔を見るとスタートしようとしているときの相手の気持ちがわかるようになったりします。不測の事態になった時の修正は、相手を理解することも必要だと感じました。

チームビルディングはエンジニアの製品開発において注目されてきましたが、スポーツではもともと重要視されていたので、根本では共通点が多くあるのかもしれないと感じました。スポーツから製品開発に学ぶこと、製品開発からスポーツに学ぶことがあるとよりよい世界になっていきそうですね。

多くのボードゲームはなぜ4人用なのか

私の持論ではありますが、なぜ個人勝負のボードゲームが4人用なのか考えたことを書きます。

TL;DR

2人用だと万人受けしない、3人用だと一人勝ちする人が出る、5人以上用だとゲームが長くなりがち。4人用だと家族でやりやすいといった点もある(ヨーロッパの場合)

ボードゲームで勝つために必要なもの

ボードゲームで勝つために必要なものは、スキルと運です。スキルは、そのゲームのうまさです。運は、その状況に最適な効果を起こせることです。たいていのボードゲームは、勝つためにはスキルと運をどちらもバランスよくできると勝てるようになっています。たまに運だけで勝てることもあります。 人間は、運だけで勝つと、「スキル関係ないやん、運ゲー。つまらん」となりますし、スキルだけで勝つと「最初からスキル差あるから勝てん。つまらん」となります。 スキルだけで勝つボードゲームは将棋、チェス、囲碁などあります。これは面白いと思っている人もいますよね。いうなれば、スキルだけで勝つゲームを好むのはゲームを積極的にプレーする、ゲーム好きの上級者です。反対に、ゲームを積極的にプレーしない人は、スキル差があるから勝てない、運で勝てるゲームがやりたいとなって、運が絡むゲームを好みます。つまり、万人に受けるためには、勝つために運とスキル両方が必要にする必要があるのです。

2人用のゲーム

2人用のゲームは、スキル差が如実に表れがちです。また、運を絡めようとすると今度は運ゲーになりがちです。このバランスをとるのがとても難しく、スキルを求める上級者のみに受けるか、運を求める人のみに受けるかとなりがちなのです。2人用のゲームは心理戦が多いですね。これだと、スキル以外のものを求めるので面白いですよね。

3人用のゲーム

ボードゲームは勝つために他のプレイヤーの妨害をできるようになっている場合があります。このようなゲームの場合、A、B、Cの3人のプレイヤーがいたとします。Aがかなり調子よく勝っていたとします。このときBが妨害に入った時、Cは妨害が入らなくなりますよね。妨害に入るとその分自分の行動を制限することになるので、妨害に入ったほうが不利になります。しかし、妨害しないとAが勝ちますが妨害するとCが勝ちます。この状態がCにも当てはまります。また、BとCが協力してAの妨害に入った場合、Aは完全に勝てなくなります。よって、最初に勝っても最終的に勝てないし、妨害に入っても勝てないというゲームになりがちです。

4人用のゲーム

先ほど3人用のゲームで述べたとおり、ほかのプレイヤーを妨害できるゲームではA、B、C、DがいたとしてAがBの妨害に入りCがDの妨害に入るといった、妨害がうまく働きます。協力して妨害に入ろうとしても、他のプレイヤーが3人いるのでそれぞれのプレイヤーで立場が異なり妨害に入るか自分が利益を得るかで状況が移り変わっていくというのも面白いです。

あと、ボードゲームはドイツなどのヨーロッパ発祥です。ヨーロッパは白夜があったりかなり寒かったりと外出しにくい気候の時家にいます。その時、友人や家族とボードゲームをやる文化があります。4人だと家族や友人でちょうどいい人数というのもあるそうです。

5人以上用のゲーム

単純にゲームが長くなりがちです。ルールも複雑になりやすく、どちらかというとパーティーゲーム寄りになります。パーティーゲームだと人数が多いほうが楽しいです。

ボードゲームのルールの一番最初は、人数を集めることです。5人以上集めるの大変です。

xmlファイルのencodingと実際の文字コードが異なっている場合どうなるか

結論

serealizeの行でエラーになります。文字コードをそろえればうまくいきます。

背景

XMLファイルを読み書きするにはいろいろ方法がありますが、今回はシリアライズ、デシリアライズを使って読み込むことにしました。XMLファイルの構造に従ってクラスを作り、シリアライズしました。すると、シリアライズの行でエラーになりました。XMLファイルの内容をよく見ると、1行目のタグのEncodingとファイルの文字コードが食い違っていました。ファイルの文字コードを変更すると文字化けします。タグのEncodingをファイルの文字コードと揃えるとうまくいきました。

シリアライズ、デシリアライズのライブラリがある言語では文字コードとタグは勝手にそろうようになっていますが、持っておらず単純に文字列処理のみでファイルを書く場合は、設計者の勘違いなどのミスにより文字コード食い違いが起こります。変更が難しいのであれば、XMLファイルを読み込む側で処理するしかないのでしょうかね…。(デシリアライズ前に1行目を読み込んでEncodingの部分を変更する)

ゲーミンググラスG-SQUAREからPLAIDeに乗り換えて2ヶ月経った

私はゲーミングアイテムを集めたり使ったりするのが好きです。そして視力が悪いので医療器具として眼鏡をかけています。2年前、ゲーミンググラスの存在を知り、G-SQUAREを使うようにしました。最近、PLAIDeというゲーミンググラスが発売され、そちらが気になり乗り換えました。日常生活でも度入りのゲーミンググラスを検討している方の参考になると幸いです。

ゲーミンググラス

ゲーミンググラスはゲーミング眼鏡です。ブルーライトカット機能や、色が鮮やかに見えるようにレンズに色が入っていたりします。日本製だと、Bauhutteのゲーミンググラスもあります。G-SQUAREはニデック、PLAIDeは999.9の商品です。

私は、G-SQUAREを買った理由はLeague of LegendsのプロゲーミングチームであるDetonetion Forcus Meのコラボモデルがあったからで、応援の意味も込めて買いました。PLAIDeは、ゲーミンググラスへの単純な興味です。高級眼鏡で有名な999.9の眼鏡をかけてみたかったというのもあります。

度付きレンズ変更は別料金

最初の注意点は、G-SQUARE、PLAIDeともに度付きレンズに変更するのは本体と別料金だということです。よって、結構高価です。本体と度付きレンズ変更込みでG-SQUAREは4万前後、PLAIDeは5万前後かかりました。

2つの比較

ここからは、個人的な感想になります。

レンズの色

G-SQUAREはレンズに色が入っているため、日常生活で少しだけ色が変わって見えていました。PLAIDeは色が入っていないので、色の変化はありません。

かけ心地

PLAIDeはテンプルが薄く、軽いためまるで掛けていないようなかけ心地です。 G-SQUAREはPLAIDeに比べると重いため掛けてる感はあります。しかし、G-SQUAREは耳に当たる部分の角度を調整することができます。

PLAIDeはレンズ全てを覆う縁のタイプしかありませんが、G-SQUAREはレンズ上にしか縁がないタイプがあります。

ヘッドホンとの相性

G-SQUAREではヘッドホンを付けるとやはり耳に食い込んで痛いのは少しありました。(普通の眼鏡よりは確実に良い)PLAIDeはテンプルが薄いので、気になりませんでした。

総合的にはPLAIDeをお勧めする

何といってもかけ心地が良いです。G-SQUAREの方が長時間画面を見続けることも辛くなかったうえ、ゲーム画面が少しだけ見やすかったです。しかし、日常生活でも使うとなればPLAIDeのほうに分があると感じています。

とは言いましたが、個人の好みもありますし、生活スタイルによってどのゲーミンググラスが最適かは異なると思います。

ゲーミンググラス、買おう

要らないといわれればそれまでかもしれませんが、ゲーミンググラスという市場ができていること、この市場が大きくなればより良いゲーミンググラスが出てくるかもしれないことを考えると買うことには意味があると感じています。ゲーミンググラスを応援し、もっと言うならeスポーツによる経済効果を応援するためにも、ゲーミンググラスを買いませんか?私はこれからも買っていくつもりです。