2013年11月25日月曜日

C# foreachでDictionaryのキーと値を同時に取得する

C#ではIEnumerableインターフェースを継承してるクラスで、foreachを使用することができる。
コレクションの全ての要素を一回ずつ読み込んでくれる機能。
forと違ってループ回数の指定とか面倒なことしなくてもいいのでなにかと便利。

で、PHPとかにもある機能なんだけども、PHPだと連想配列のキーも一緒に取得できる。
ならC#でもきっとできるさ、と思って調べてみたら、あった。

参考サイト

やり方は簡単。

/*---------------------------------------------------------------------------*/
foreach (KeyValuePair<string, string> pair in dictionary)
{
// なんかする
}
/*---------------------------------------------------------------------------*/

以上。
IDictionaryの要素が<TKey,TValue>のペアで構成されているため、
それを受け取れるようにしたのがKeyValuePairだそうな。

2013年11月22日金曜日

SQLite データをインポートする

C#でSQLiteを使っていて、既存のデータベースと同じデータを扱う必要が出た。
そうなると当然その既存のデータベースからインポートしてしまいたい。
結論から言うと、C#環境下ではできなかった。
もしかしたらできるのかもしれないけど、なんちゃってプログラマにはわからなかった。
SQLiteをダウンロードしてそっちでデータベースを作ってからC#側で使うしかないのかな?

SQLiteをダウンロード



サイトからファイルをダウンロード。
zipファイルを任意のフォルダに解凍すると、sqlite3.exeというファイルがぽつねんとできる。
あとはコマンドプロンプトから叩いてやるだけ。

テーブルにデータをインポートする


参考サイト

今回インポートするのはcsv。
データがダブルクォーテーションで囲まれていると失敗するらしい。
それから、1行目のデータがカラム名じゃなくても失敗する。
全部文字列だったら失敗しないかもしれない。
コマンドプロンプトでexeを展開したフォルダに移動。コマンドを叩いてやろう。

/*---------------------------------------------------------------------------*/
$ sqlite3 -separator , hoge.db ".import hoge.csv hoge"
/*---------------------------------------------------------------------------*/

-separatorオプションでセパレータ(区切り文字)を指定できるので、
カンマ区切りじゃなくても問題はなさそう。

/*---------------------------------------------------------------------------*/
$ sqlite3 hoge.ds
sqlite> .import hoge.csv hoge
/*---------------------------------------------------------------------------*/

この方法でもできるそうだけど、separatorの指定はどうやるんだろうか?
普通にでいいのかな?



/** 同日追記 **/

参考サイト
データをファイルからインポート

区切り文字は「.separator」で変更可能。
それから、カラム名もファイルからインポートするとデータ型が全部TEXTになってしまうようだ。
テーブルそのものは事前に作っておいて、データだけインポートしろってことかな。

jQuery 「jQuery Slider²」を使い、さらに弄ってみた

以前bxsliderを使う記事を上げた。
じゃあもうスライダーはこれでいいな、と思っていたら、
なぜかまったく関係ない要素表示が乱れるというバグが発生。
原因が全然分からんかったので、jQuery Slider²に乗り換えてみた。

参考サイト
とても簡単で軽量なjQueryスライダー「jQuery Slider2」を使ってみる | bl6.jp

まずは実行だ


というわけでサイトからダウンロードしてきてテスト。
特に特別なこともなく、jsファイルとcssファイルを読み込んだら、
htmlに動かしたい要素を追加してjavascriptで要素を指定してやるだけ。

さて、ここでひとつ問題にぶち当たった。
どうにもjQuery Slider²はページナビを右端から順繰り表示がデフォらしい。
オプションやcssを弄ってどうにかならんかと思ったけど、
オプションにはないし、cssはabsoluteが指定されているしでどうしようもない感じ。
仕方ないから、jsファイルを弄る。

ページナビをセンタリングする


参考サイト

使用ツール

まずはcssから余計な要素を削除しする。具体的にはtopとかrightとか。
leftは50%指定に変更。

/*---------------------------------------------------------------------------*/
.jquery-slider-pages {
   overflow: visible;
   position: absolute;
   bottom: 5px;
   left: 50%;
}
/*---------------------------------------------------------------------------*/


そしてjsファイルをツールで整形。
jquery-slider-pagesクラスを追加している部分で

要素数×ページナビの横幅÷2

ピクセル分margin-leftをマイナスしてあげよう。

/*---------------------------------------------------------------------------*/
if (settings.showProgress) {
positionEls.CSS("margin-left", -(count*pixel/2)+"px");
$this.append(positionEls);
}
/*---------------------------------------------------------------------------*/

これでセンタリングが完了。
それっぽい見た目にはなったかな。

2013年11月20日水曜日

C# SQLiteを使ってみた

「SQLite? なにそれ?」状態の自分がSQLiteを使ってみた。

SQLiteってなんぞや?


参考サイト

色々と特徴が書き出されてるけど、要はアプリケーションに組み込む形でデータベースが
使えるとさえ分かっていればいいんだな。いいんだよね?

SQLiteをダウンロード


参考サイト

公式サイトにダウンロードしに行くと、なんかたくさんファイルがあった。
ちゃんと違いがあるみたいなので、上記サイトをよく読んで自分の環境にあったやつを使おう。
すごく丁寧に解説されている。
なぜかインストーラを使うと失敗するので、今回はzip版をダウンロード。

Visual C#で使う


参考サイト

いろんなページで参照に追加する追加する言ってるけど、どうするんだと思っていたら、
本当にプロジェクトに参照を追加するだけでよかったというオチ。
  1. 適当なプロジェクトを作る
  2. 「参照の追加」の「参照」タブから解凍したSystem.Data.SQLite.dllを追加
実行する際はexeと同じフォルダにSQLite.Interop.dllを追加してやろう。
サンプルとして上記サイトに書いてあるコードを実行させてもらいました。
テーブル追加、レコード追加、読み込み、出力の流れ。
動いた。

テーブルを作成すると、
実行ファイルと同じ場所にテーブルのデータファイル(?)が出来上がる。
当然同じテーブルは作れないので連続でテストする時は注意。

コマンドプロンプト ファイルを削除する

コマンドプロンプトでファイルを削除する。

/*---------------------------------------------------------------------------*/
del hoge.fuga
/*---------------------------------------------------------------------------*/

名前が一致したファイルを削除する。
ワイルドカードも使えるので、フォルダ内の特定拡張子のファイルを削除したいときなんかに。

/*---------------------------------------------------------------------------*/
del *.jpg
/*---------------------------------------------------------------------------*/

何気に便利。

2013年11月18日月曜日

コマンドプロンプト ファイルから文字列を検索して行を出力

簡単なファイル操作なり、処理なりは、
コマンドプロンプトないしバッチファイルのほうが楽かもしれないと最近思った。

コマンドプロンプトを使用してファイルから指定文字列を検索。
それを行で出力する。

参考サイト
コマンドプロンプト findstr - [文字列や正規表現を使って文字列を検索する]

/*---------------------------------------------------------------------------*/
findstr /N test test.txt > output.txt
/*---------------------------------------------------------------------------*/

上記の例では、test.txtから、testという文字列を検索。
行番号付きで、output.txtというファイルに書き出している。

色々オプションがあり、正規表現も使えるので、やたらややこしい条件がなければ、
大抵の検索はこれで済むと思われる。

2013年11月15日金曜日

C# アプリケーションを終了する

そもそもアプリを起動するためのデータが取得できなかっただとか、
アプリケーションに必須なものが取得できずアプリを終了せざるをえないこともあるだろう。
あるいは、閉じるボタン以外の場所をクリックしたいときに終了するとか。

そんなわけでどうすればアプリケーションを終了できるのかを調べてみた。

参考サイト
アプリケーション(自分自身)を終了させる: .NET Tips: C#, VB.NET

上記サイトによると、3つの方法で終了できるらしい。

/*---------------------------------------------------------------------------*/
this.Close();
System.Windows.Forms.Application.Exit();
System.Environment.Exit(0);
Environment.FailFast("イベントログに書き込む")
/*---------------------------------------------------------------------------*/

上から順番に、
  • メインフォームを閉じる
  • フォームアプリケーションの終了
  • エントリポイントを抜ける
  • 強制終了
だそうな。

上記2つはフォームアプリケーションでしか使用できないので、コンソールは下の2択。
さらにFailFastはアプリケーションの状態悪化時なんかに呼び出すべきものであるらしいので、
よほどのことがない限り、コンソールはEnvroiment.Exitでよさそう。

フォームアプリケーションは全部選択できるんだけど、上記の理由によりFailFastはなし。
Envroiment.Exitはプロセスを強制的に終了してエントリポイントを抜けるため、
呼び出した場所以降のメソッドが呼ばれない。
Closeは、そもそもメインフォーム以外の場所から呼べんじゃないですか。
参照を持っていれば話は別だけども。
ということでApplication.Exitが一番よさそう。