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

ぺやろぐ

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

2016年もあと少し

雑記

おはこんばんちわおひさしぶりです。

生きてます。

ここ半年ほど仕事のほうがあまりよろしくなく、なかなかいろいろと進めることができませんでした……。

まぁ、




グラブルしてたってのもありますけどね。(てへぺろ




同期が始めたので復活して、いろいろやってました。(クラス4の解放とか十天衆とか)
で、先日プロデューサーの変更と修正のもろもろでその同期が引退してしまったのでこちらもそろそろフェードアウトしようかなぁと考えているところです。


この半年は「ゲームとはなんぞや」っていうのを考えるいい機会でした。
ある程度は自分の中で固まってきたので、近いうちにアウトプットできればと……。

この1年でかなり動くはずだったんだけど、全然進められなかったどころか若干振り出しに戻りつつあるので危機感をもって、でも焦らずに(焦ってもろくなことにならないのでw)準備を進めていきます。


今年もいろいろな方にお世話になりました。
来年も同じように関係が続いていけばいいなと思っております。

今年もあと少しですが、来年は大きな変化の年になるように今から準備していきます。



ではでは、来年もよろしくお願いいたします。

〔C#〕CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得する

C#

完全に個人用メモ。
どこかの誰かさんの役に立てばラッキー。
立たなくても俺の役に立つからおk。
そんな記事。

目的

CSVのデータ内にカンマがあっても、カンマ区切りでデータを取得することができるようになること。
TextFieldParserの存在を知ること。

経緯

とあるテーブルの値をまるまる開発環境から本番環境に移動したかったんだけど、開発環境と本番環境でDBの場所が違う。
なので、データを手動で更新する必要が出たんだけど、テーブル削除して新しく作るのはなんか怖いしってことでデータを一旦CSVに吐き出して持っていくことになった。
ただ、このままだと1個1個手動で書き換えとか嫌なので、出力したCSVからUPDATE文を作ってやろうと考えたのが今回の始まり。

作業開始

コンソールアプリでCSVからUPDATE文を書いたテキストを吐き出すプログラムを作ることになったんだけど、「データ内にカンマあるやん。普通にカンマ区切りにしたらまずいぞこれ。」と気づく俺氏。

幸いにもダブルクォーテーションでくくられてる中にあるから、そのあたりで判断させたらいけそうやなぁと検討をつけるが、どうやるんやろとグーグル先生に質問することに。
すると、まんまそれに対応したものを見つけました!(やったね!)

先人に感謝

で、見つかったのが「TextFieldParserクラス」
以下、実際のコード

string filePath = Console.ReadLine();
string fileName = filePath.Substring(filePath.LastIndexOf('\\') + 1).Replace('"',' ');

// ファイル名と文字エンコードを指定してパーサを実体化
using (TextFieldParser txtParser =
    new TextFieldParser(
            fileName,
            Encoding.GetEncoding("shift_jis")))
{
    // 内容は区切り文字形式
    txtParser.TextFieldType = FieldType.Delimited;
    // デリミタはカンマ
    txtParser.SetDelimiters(",");

    // ファイルの終わりまで一行ずつ処理
    while (!txtParser.EndOfData)
    {
        // 一行を読み込んで配列に結果を受け取る
        splittedResult = txtParser.ReadFields();
        
        using (StreamWriter writer = 
       new StreamWriter("sql.txt", true, Encoding.GetEncoding("shift_jis")))
        {
            // ここでテキストに書き出し
        }
    }
}

TextFieldParserっていうのを使い、デリミタにカンマを指定してあげると、区切り用のカンマできれいに区切ってくれます。
あとはそれをごにょごにょするだけ。
まさか、こんな便利なものが存在するとは。
ありがたいですねぇ。

まとめ

TextFieldParserすげぇ。
あと、「タブ区切り使えや」って意見は(∩゚д゚)アーアーきこえなーい

雑記なのでそこまで見なくていい記事

雑記

久々に雑記

技術的なことをアウトプットしようと建てたこのブログ。
もう放置気味になっているんだよね。

いやね、インプットがないわけじゃないの。
ただ、アウトプットできるほど理解が進んでないっていう。
まだ頭の整理が追い付いていないので書きようがない……。

ということで、今回は少し離れてただの雑記を書こうと思う。


突然だけど、今年度は目標を立てようと思う。
目的としては、そうでもしないと動きそうになさそうだから形だけでもってところ。

1.ブログの更新頻度を上げる。

とりあえず、コツコツやっていこうってことです。

もっと有意義な記事が書けるようにいろいろ触らないとなぁ……。
目標達成には、
1.記事が書けるようなものにもっと触れる。
2.自分の中でまとめる。
3.まとめが間違った情報にならないか、検証する。(最悪、記事内でもっといい方法あるかもとかでごまかす)
4.記事を書く画面を開く。(何気にここがハードル高かったり)

このあたりを意識して仕事していこうかな。



そうそう、近いうちにPSO2の配信を久々にやるかも。
設定6だとどれぐらいきれいに配信されるのか気になるし。
うちの子自慢したいし。

てことで、今回はこの辺で。

〔C#〕 nameof演算子が使えないけど、似たようなことをする(プロパティ名の取得)

C# 技術

nameof演算子は便利だねってお話。

目的

C# 5.0以下の環境でnameof演算子と似たようなものを実装する。
改めてnameof演算子っていいよねって気付く。

経緯

WPFの実装中、

private string name_;
/// <summary>
/// 名前
/// </summary>
public string Name
{
    get { return name_; }
    set
    {
        if (name_!= value)
        {
            name_= value;
            NotifyPropertyChanged("Name");
        }
    }
}

と文字列でNotifyPropertyChangedに引数を渡しています。
これ、プロパティ名を変更しても文字列は変更対象にならないので、ここの変更忘れが原因で動かなくなるってことが起きるんですよね。
まぁ、そこまで気づきにくい場所でもないのですがちょっと鬱陶しいですね。

登場! nameof演算子

とか思っていると、C#6.0でnameof演算子が追加され、以下のように書くことができるようになりました。

private string name_;
/// <summary>
/// 名前
/// </summary>
public string Name
{
    get { return name_; }
    set
    {
        if (name_!= value)
        {
            name_= value;
            NotifyPropertyChanged(nameof(Name));
        }
    }
}

nameof(プロパティ名))
たったこれだけの記述にするだけで変更がかかるようになり、つまらないミスをなくすことができるんですね。

これは素晴らしい。

いや、ほんと。

ですが、C#6.0の環境じゃないと使えない。

会社の環境によって使えるときと使えないときがあるんですよね。

「まぁ、その時は文字列でいいんじゃない?」って思ってしまいますがあえてnameof演算子と似たようなことができるようにがんばりましょう。

実装

以下、コード

今回使用するメソッドの定義

using System.Linq.Expressions;

    static class PropertyGet
    {
        /// <summary>
        /// プロパティ名を取得する
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="e"></param>
        /// <returns></returns>
        public static string GetPropertyName<T>(Expression<Func<T>> e)
        {
            var memberEx = (MemberExpression)e.Body;
            return memberEx.Member.Name;
        }
    }

WPFでの使用例
MainWindow.xaml.cs

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new MainViewModel();
    }

MainViewModel.cs

    public MainViewModel()
    {
        strChange = new RelayCommand(StrChange);
    }

    public ICommand strChange
    {
        get; private set;
    }

    private string str_;
    /// <summary>
    /// 文字列
    /// </summary>
    public string Str
    {
        get
        {
            return str_;
        }
        set
        {
            if (str_ != value)
            {
                str_ = value;
                // ここでさきほど定義したGetPropertyNameメソッドの呼び出し(戻り値がプロパティ名)
                NotifyPropertyChanged(PropertyGet.GetPropertyName(()=> Str));
            }
        }
    }

    /// <summary>
    /// PropertyChangedの実装
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;
    public void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(info));
    }

    private void StrChange()
    {
        Str = "名前を取得できているからこれが表示される";
    }

起動時はこちら
f:id:peyangu485:20160124185218p:plain

ボタン押下で
f:id:peyangu485:20160124185223p:plain

きちんと変更通知がわたっているので、文字列が表示されていますね。

まとめ

さすがにnameof演算子ほど短く、とは言えないですがそこそこいいんじゃないかと。
短くしたい場合は、クラス名とメソッド名をもっと簡略化すればいいかな。

どちらでも使えるようにしておきましょー。

〔C#〕〔WPF〕アプリの2重起動を防ぐ

C# WPF 技術

今回は、WPFアプリで2重起動を防ぐ方法を忘れないために書いておく。

目的

WPFアプリで2重起動を防ぐ。

実装

アプリによっては、2重起動されては困るものもあると思うので(今回まさに直面した)2重起動しないようにしてみた。

手を加えるのは、App.xaml、App.xaml.csの2つ。

App.xamlでStartup="Application_Startup" Exit="Application_Exit"を追加。

<Application x:Class="applicationname.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:applicationname"
             Startup="Application_Startup" Exit="Application_Exit">
    <Application.Resources>
    </Application.Resources>
</Application>

次にApp.xaml.csでApplication_StartupとApplication_Exitを実装。

public partial class App : Application
    {
        private void Application_Exit(object sender, ExitEventArgs e)
        {
            Mutex mutex_;
            if (Mutex.TryOpenExisting("テストアプリ", out mutex_))
            {
                mutex_.ReleaseMutex();
                mutex_.Dispose();
            }
        }

        private void Application_Startup(object sender, StartupEventArgs e)
        {
            Mutex mutex_ = new Mutex(false, "テストアプリ");
            try
            {
                if (!mutex_.WaitOne(0, false))
                {
                    MessageBox.Show("テストアプリはすでに起動しています。", "テストアプリ", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                    this.Shutdown();
                }

                var mainWindow = new MainWindow();
                mainWindow.Show();
            }
            finally
            {
                mutex_.Dispose();
            }
        }
    }

Mutexはきちんと解放しないと、次に起動ができなくなるので注意!

上のコードを入れておけば、2重起動を防ぐことができる。
メッセージボックスの表示は自由だけど。

めでたし、めでたし。


変更履歴
5/17 コード修正。

あけましておめでとうございます

新年、あけましておめでとうございます。
今年もぼちぼちと記事を更新していくので、よろしくお願いいたします<(_ _)>

新年1発目の技術的な記事については、現在準備中ですので少々お待ちください。

新年といえば、初売り!
福袋目当てに難波まで行ってまいりました!

ずっと前から欲しかったタブレットがそれなりにお安かったので購入。
キーボード付きですよ! キーボード付き!
f:id:peyangu485:20160103145439j:plain

ねんがん の タブレット を てにいれたぞ !

これでタッチ対応のアプリ製作が捗るってもんよ。

あれしたいこれしたいとか考えてたら仕事がおろそかになりそうだから気を付けないと……。

こんなブログですが、今年もよろしくお願いします。

じゃあの。

今年もお疲れさまでした。

こんばんは

2015年も最後になりました。

今年は引っ越しを2回したり、仕事に対する考えが変わったりと激動の1年でした。


来年はもっと忙しくなりそうな予感……。
ここらがふんばりどころなのかな。

今年はありがとうございました。
来年もよろしくお願いします。

よいお年をお迎えください。

じゃあの。