読者です 読者をやめる 読者になる 読者になる

ぺやろぐ

ゲームと奈々ちゃんと時々プログラミング

〔C#〕XMLの読み書き

C#

今回は気が向いたのと備忘録も兼ねて、C#でのXMLファイルの読み書きについて。
単純な読み書きだけだから、細かい処理とかはまたいつか。

目的

XMLファイルの取り扱いを学ぶ。

実装

まず、保存するデータを持つクラスを作成

よくあるPersonクラス

publi class Person
{
    public string Name { get; set; }

    public string Age { get; set; }
}

こんなクラスがあったとする。

まずは、XMLに書き込む処理

public void SaveXml(List<Person> personList)
{
    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Person[])); 

    // Data.xmlは保存するファイル名

    using (System.IO.FileStream fs = new System.IO.FileStream("Data.xml", System.IO.FileMode.Create)) 
    {
        serializer.Serialize(fs, personList.ToArray());
    }
}

これで、Personのリストをxmlに保存することが可能。

次に、xmlからの読み込み処理

public List<Person> LoadXml() 
{
    Person[] loadAry;

    System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(Person[]));

    using (System.IO.StreamReader sr = new System.IO.StreamReader("Data.xml", new System.Text.UTF8Encoding(false)))
    {
        loadAry = (Person[])serializer.Deserialize(sr);
    }

    return loadAry.ToList();
}

これでXMLの中身を、Personのリストで返してくれる。

まとめ

xmlの中身は

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Person>
        <Name>aaaaa</Name>
        <Age>20</Age>
    </Person>
</ArrayOfPerson>

こんな感じになると思われる。
Nameの「aaaaa」とAgeの「20」は保存する前にリストに入れたデータ。

コード内ではリストで保持するので、データをごにょごにょしやすい。

〔C#〕〔WPF〕閉じる時に行う処理をMVVMで追加する

C# WPF

前回の記事で予告していた通り、「ここが詰まったよ!WPF」シリーズということで第1弾は閉じる時に行う処理の追加についてご紹介します。

第何弾までやるのかは未定です。

目的

コードビハインド側で言うところの「OnClosing()」メソッドに処理を追加することをMVVMで実装する。

経緯

閉じるタイミングで何かしたいときってOnClosingに記述すれば基本的にOKなんですが

protected override void OnClosing(CancelEventArgs e)
{
       base.OnClosing(e);

       // 何か処理追加
}

MVVM的にはこれはよろしくない。(と思っています。)

そこで、どうしようかと考えた結果が以下。(かんろくのソース流用)

実装

見た目を変更して閉じるボタンを自前で用意していることが前提条件です。
デフォルトのままの閉じるボタンに処理の追加は僕にはできませんでした。(情報求ム)
まず、ViewのコンストラクタでModelクラスのCloseActionプロパティにthis.Close()の処理を渡しておきます。

MainWindow.xaml.cs

public MainWindow()
{
     InitializeComponent();

     var mView = new ViewModel.MainViewModel();
     this.All.DataContext = mView;
     // OnClose時に処理を行いたいので、Model側で閉じられるようthis.CloseをVMに渡す。
     if(mView.Model.CloseAction == null)
           mView.Model.CloseAction = new Action(() => this.Close());
}

メソッド名はなんでもいいのですが、わかりやすくOnClosingとしておいたメソッドに、追加したい処理とCloseActionプロパティの呼び出しをします。

MainModel.cs

// 閉じる処理プロパティ

public Action CloseAction { get; set; }

public void OnClosing()
{
     // 追加したい処理
     CloseAction();
}

ViewModelではコンストラクタの中でICommandのCloseにModelクラスのOnClosingメソッドを紐づけさせます。 

MainViewModel.cs

public ICommand Close { get; private set; }

public MainViewModel() 
{

     Close = new RelayCommand(_Model.OnClosing);

}

RelayCommandはGitHubを確認してください。(
KanmusuDrop/RelayCommand.cs at master · peyangu/KanmusuDrop · GitHub
)

それができたら、xamlで閉じるボタンのCommandにCloseをBindしてあげると閉じるときに処理を挟むことができます。

<Button x:Name="CloseButton" Content="r" Style="{DynamicResource CaptionButtonStyleKey}" Command="{Binding Close}">

 

まとめ

かんろくのドロップ情報を保存する処理がまんまこの流れです。

これはこれでどうなのかと思わなくもないですけどね。

一応、コードビハインドを使わずにできたってことで良しとしましょう。

もっといい実装方法あれば教えてください<(_ _)> 

ということで、第1弾「閉じる時に行う処理をMVVMで追加する」でした。

ツールの作成を通じて

技術 雑記

こんばんは

 

前回の記事で、ツールを作ったよーって感じでご紹介させていただきました。

でまぁ、あのツールを作った感想とか書いておこうかと。

 

今回、仕事で触ったことがないWPF+MVVMってことで調べるところからスタートしたんだけども、MVVMについてがほんとに苦労した。

正直、理解が及んでない状態のコードになってると思う。

自分の中ではMVVMに近づけようと努力したんだけどね。

足りていないのは単純に地力不足です。

 

で、自分なりに組んでいるとたしかに、きれいになっている気はする。

ただ、コードビハインドに書かないっていうのがなかなかなじめなかった。

閉じるボタンも自前で用意しているんだけど、コードビハインドならthis.Close()でいいところをMVVMにするとやたらめんどくて、「もう、コードビハインドでいいかな」と思ったこと数回。

ViewModelとModelの実装をごちゃごちゃ入れ替えたの数回。

 

でも、新しいことをやるって楽しいね。

今回のことで成長できたなって実感した。

仕事で触らないから、またこのパターンでツールを作りたいね。

(コードを公開したらどこかの優しい人が指摘してくれるかもしれないし。)

 

甘い部分はあるかと思いますが、使ってくださると喜びます。

よかったよ報告、バグ報告(ないことを祈る)をお待ちしております。

 

次回から、このツール作成時に詰まった部分を備忘録として残すためのシリーズ「ここが詰まったよ!WPF」をお送りするかもしれない……。

 

じゃあの。

 

艦娘ドロップ記録ツール - かんろく -

技術 艦これ

ということで、艦娘ドロップ記録ツール略してかんろくについて。

かんろくとは

ブラウザゲーム艦隊これくしょん ~艦これ~」の便利ツールです。

勝利判定を選択し、名前を入力するだけでドロップの記録がされるツールです。

イベントなどでの堀りの記録にどうぞ。

レアリティに応じて、背景色が変わります。
csv出力とドロップ登録時にツイートする機能を備えています。

ツールの性質上、他ゲーでも使えます。
ただし、レアリティに応じた背景色の変更はされません。

操作画面

f:id:peyangu485:20151206114858p:plain

主な機能

・ドロップ情報の記録

・登録したドロップ情報のCSV出力

・ドロップ情報のリセット

Twitter連携機能による、ドロップ情報ツイート機能

各機能の細かい説明は付属のreadme.txtに記述しています。

動作環境

Win7,Win8.1での動作は確認しています。

Win10での動作は確認しておりませんので、Win7Win8.1での使用をおすすめします。

使用条件

オープンソース/フリーウェアです。
無料でご利用いただけます。
ソースコードは、MITライセンスの下でGitHubにて公開しています。

ダウンロード

KanmusuDrop 1.00.zip

画面上部のダウンロードボタンを押してください。

 

※ダウンロード及びツールの使用は、すべて自己責任で行ってください。このツールを使用した結果生じた損害について、開発者は一切責任を負いません。

 

開発環境・言語・ライブラリ

C# + WPF

WIN7 + VS2013 Proffetional です。
ソースコードGitHubで管理しています。(公開するとまずい部分を含むクラスについては、公開していません)

Win7で使用する場合は、.NET FrameWorkは4.5のインストールが必要です。

Win8以降は標準でインストールされています。

Download Microsoft .NET Framework 4.5 from Official Microsoft Download Center

その他

ツールのアイコンを募集しています。

よろしくお願いします<(_ _)>

質問などはtwitterのリプかこの記事のコメントにお願いします。

変更履歴

2015/12/6 ver.1.00 GitHubにて公開。本体リリース。

 

 

社内ニート爆誕

技術 雑記 艦これ

どうも、仕事がなくて社内ニート中のぺやんぐです。

あまりにも暇なので久々に技術的なことを記事にしようと思い、ツールを作ってました。

 

艦これツールです。

その名も「艦娘ドロップ記録ツール」略して「かんろく」!!(ババン

経緯
イベント期間中(それ以外でも)に新しい子を入手するために、「掘り」という作業をするわけなんですが、私は毎回勝利判定と何がドロップしたのかをExcelにまとめていたわけです。
ですが、結構入力が面倒。
いちいち勝利判定記入のあとに半角キー押して名前入れてって流れが面倒になったわけです。
それぐらいならExcelの機能使えば多少は楽になりますが、Excel嫌いなんでできれば触りたくないわけです。
(VBAとか勉強するぐらいならRubyとかscalaとか勉強したい)


それに、次の案件がWPFだーって聞いてたので勉強がてらやってみるかってことでできたのがこのツール
ちなみに、その案件はなくなりました。(ここ笑うところ)

 

で、それなりの完成度まで来たので公開しようかなーっと思ったわけです。
どっかにこれよりいいものあると思うけど、目的は勉強なのでこれでいいんです……。
欲しいという奇特な方がいれば、配布するつもりです。(使ってみた感想とか要望が欲しかったりする。)

 

ちなみに艦娘とか名前につけてますが、別のゲームでも全然使えます。
名前入力して、出力してるだけなので。

これで少しは楽になるかな?
ツールについては、次の記事で(´Д`)

12/2 ~心機一転~

雑記

夏イベントのまとめの続きをすると言ったな、あれは嘘だ。

 

もう気が付けば99日放置ですって!

このすぐサボる癖なんとかしないと……。

 

で、今回からはこのはてなブログの方で書かせていただきます。

今後ともよろしくお願いします。

少しでも更新頻度が上がることを願って……。

 

今回、移行した理由なんですが、なんか同業者の方のブログ見てるとはてなが多かったからっていう、すごく適当な理由ですw

もしかしたら、こっちはプログラム系、あっちは趣味系に分ける可能性が微レ存。

 

技術的なことは多くなる予定です。(あくまで予定)

会社にいても、成長できそうにないしね。

こっちの方がいろいろと突っ込んでもらえそう。

 

では、今回はこの辺で。

 

じゃあの。

 

 

 

FizzBuzz問題

雑記 技術
ほんとにすぐできたからさっそく公開。

まず、FizzBuzz問題について

Wikiより
プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「Fizz Buzz」 (Bizz Buzz の場合は 「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

というゲームをプログラムで書いたらどうなるかっていうのが今回の記事のネタ。

またもやwikiより
このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood が FizzBuzz問題 (FizzBuzz Question)として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。

だそうです。

程度の差はあれど、動くものレベルなら作れるでしょうって思いきや、できない人がちらほらいるらしい。

問題文は
「1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。」
で、あとは追加で条件があったりする。

このままだとまぁ、いろいろ気になる部分はあるわけだけどもあえてスルーします。(あくまで遊びなので

で、こちらが私が書いたコード
fizz1buzz

実行結果↓
fizz1buzzcon
fizz1buzzcon2

とまぁ、こうなります。

本当に動くものレベルならこれでいけます。
少し改造したものがこちら
fizz2buzz
引数を変えれば、FizzBuzzの出力位置が変わるようにしました。
あと、出力する数字の数も。

実行結果↓
fizz2buzzcon
fizz2buzzcon2
fizz2buzzcon3

4の倍数と7の倍数で文字に変わってますね。
出力している数も120まで増えてます。

もっと、いろいろ制約つけたりあえてめんどくさい処理の仕方で書いてみたりなどなどネットを探せば出てきます。

個人的なわざわざシリーズとしてはStrategyパターン使ってみたら面白そうな、ただめんどそうな感じがしてます。

これを研修終わりの新人にさせてみると、個性が見られて楽しそうです。

最後に、コードの拙さについては遊びということで目をつぶっていただきたいです……。(久々にコード書くんだもの、ちかたないね)
ネットをさ迷って、自分の勉強不足を痛感してるので、これからに期待ってことでなにとぞ(m´・ω・`)m

じゃあの