掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

Top Index

2014年07月20日
Selectクエリの結果をファイルに書き出す(XLSX編)
ClosedXML
※前回は「Selectクエリの結果をファイルに書き出す
VS2010+VB2010+.NET4+ClosedXML

ClosedXMLを使用したら瞬殺でしたので、
codeplex、またはnugetからdllを入手し利用することをお勧めします。

書いたコートはたったこれだけ。

Using book As New XLWorkbook
Using sheet = book.Worksheets.Add(source, sheetName)
End Using
book.SaveAs(path)
End Using

一応拡張メソッドも作ってみましたが、本家の関数も十分使いやすい。

DataTableをXLSXで出力したときの特徴
・ヘッダーに色が付く
・オートフィルタが付く(これはどうでもいいかな)
・罫線が引かれている
・電話番号のような数字だけで構成されてる文字はちゃんと文字として扱われる(先頭のゼロが消失したりしない)
・フォントは「Calibri」(あんま使ったことない)
・ウインドウ枠の固定はされていない
・XLS形式(Excel2003形式)での出力はサポートサポートされていない。

最後にパフォーマンスも見てみます。

続きを読む ...
 
[ 投稿者:mk3008 at 13:39 | VB.NET | コメント(0) | トラックバック(0) ]

2014年07月19日
Selectクエリの結果をファイルに書き出す
VB2010+VB2010+.NET4

よく使うので整理しときます。
やり方はいろいろあると思いますが、よく使いそうなのは以下の2つ。
A DataReader→DataTable→CSVファイル
B DataReader→CSVファイル

細かいこと(ソースコード)は後に回すとして、使い方はこんな感じ。
[A]
Dim tbl As New DataTable
tbl.Load(cmd.ExecuteReader)
Using sw = New StreamWriter("test.csv")
tbl.ToCsv(sw)
End Using
[B]
Using sw = New StreamWriter("test.csv")
cmd.ExecuteReader.ToCsv(sw)
End Using

せっかくなので、AとBでどれぐらい実行速度が違うか検証してみたところ、
Bの方が3〜4倍程度速い

以下、ソースコード


続きを読む ...
 
[ 投稿者:mk3008 at 17:23 | VB.NET | コメント(0) | トラックバック(1) ]

StringBuilderのLengthプロパティは遅いか?速いか?
CSVファイルを書き出す時など、
delimiter(区切り文字)を足すべきかどうかを判断する処理を多数書くことになります。
具体的にいうと、
・行データが空なら区切り文字を付けずに値を結合する
・それ以外は区切り文字を足してから値を結合する
の分岐を行うため、行が空かどうかを調べるわけですね。

行データをStringBuilderクラスで管理するとした場合、
今行データが空なのかどうかは調べる方法として
A Lengthプロパティで評価する。
B 初めて値が追加されたとき、フラグ変数にONにしてフラグ変数で評価する。
ぐらいが考えられます。

速度的にいうと「B」の方が速そうですが、コーディング的には「A」の方がシンプルですね。
で、「Aのコードは本当に遅いのか?」を調べたいと思います。

Dim s As New StringBuilder
Dim flag As Boolean = False

Dim checkPerformance =
Sub()
Dim sw As New Stopwatch
sw.Start()
For n As Integer = 1 To 100000
'無駄にコールする
If s.Length <> 0 Then flag = True
Next
sw.Stop()
Debug.Print("Length Check : " & sw.ElapsedMilliseconds)
End Sub

checkPerformance.Invoke()

For i As Integer = 1 To 1000
s.Append("*")
Next

checkPerformance.Invoke()

こんな無意味なコードを走らせて速度計測してみるわけです。

で、結論
Lengthプロパティの評価速度は文字列長に依存せず、高速に評価される。

PC環境にもよりますが、私のPC(Core i7 2.93GHz)で
10万回Lengthプロパティをコールして1msecかかる程度でした。

また、Appendを1,000回しようが、1,000,000回しようが、
Lengthプロパティの評価速度は変わりませんでした。
[ 投稿者:mk3008 at 12:05 | VB.NET | コメント(0) | トラックバック(1) ]

2014年07月10日
時系列マスタとジャーナルデータとの紐付
唐突にSQLネタです。

マスタを時系列で管理(特定期間内ごとに値がかあるもの)したいということはよくあります。
消費税マスタなんかがよい例でしょう。
単純に設計するなら…

  Taxesテーブル
PK StartDate
  TaxRate

こんな感じでしょうか。
構造としてはこれでよさそうですが、ジャーナルデータ(契約とか)とリレーションを張ろうとすると一瞬「?」となりますよね。


例として
  Contractsテーブル
  ContractDate
のようなテーブルとリレーションし、
契約日ごとの税率を求めることを考えてみます。
単純なjoin句で紐付することはできなさそうなので、
以下のようにアプローチすることにしましょう。

1. Taxesテーブルは開始日しか持っていないので、終了日を求めて期間指定できる形式に加工する。
  ※終了日を物理的に列定義してもいいですが、編集時に整合性が壊れることがあるので
   極力持たないほうがいいでしょう。

2. 期間指定できるようになったTaxesテーブル(クエリ)を使い、
  betweenで契約日を挟んでやる。

できたクエリはこんな感じ。





続きを読む ...
 
[ 投稿者:mk3008 at 00:01 | SQL | コメント(0) | トラックバック(0) ]

2014年06月22日
[WPF]ComboBoxのAutoComplete機能を添付プロパティで実装する
※2014/6/29追記
全角文字(IME変換)に対応していない問題を修正。

このエントリーをはてなブックマークに追加



背景


ComboBoxは単純なようで奥が深いのか、使いづらい。
Binding方法がSelectedValueと、SelectedItemの2つあるのがややこしい。

問題点の掘り下げ


SelectedValueとSelectedItemの特徴を列挙。
(だいたいあっているはず。間違ってたらすいません。)

まずは「SelectedValue」
・Integer、SelectedValueなどのリテラル型のBindingに向く
・ObjectのBingindには向かない
・Nothingの代入はできない
・ItemsSourceに存在しない場合、表示されない

次に「SelectedItem」
・ObjectのBingindに向く
・Nothingの代入はできない
・ItemsSourceに存在しない場合、表示されない
・だいたいの場合、IEquatableインターフェイスを実装して等価判定を行う必要あり


現状での回避策?


・Nothingの代入ができない
IsEditableにして、テキストを編集可能にしてやると解決。
文字列をすべて削除すればNothingになる。
ただし、ItemsSourceに存在しない値も指定できるようになってしまう。
(実際はItemsSourceに存在しなければNothingが代入されるのですが、画面上は入力した文字列が残るため、VMとVで情報の乖離が起きている。)

・ItemsSourceに存在しない場合、表示されない
VM側の値は存在しているが、表現できないので空欄になってるだけ。(VMとVで情報が乖離)
これはTextに現在値をOneWayでBindingすれば、VMとVの乖離が解消される。(OneWayがみそ)

しっくりこないからしっくりさせる


IsEditable=Trueを前提として、以下の点をしっくりさせる。

・Nothingも代入したい
Nothingを許容するかどうかは保存ボタンでやればいいから、ComboBoxoの範疇ではないとする。

・ItemsSourceに存在しない値は選択できない
いわゆるDropDownStyle。
ItemsSourceに存在しない値を指定された場合、Nothingにする。
もちろん、Textに残った残骸文字列もきれいにする。

・でも初期値ならいい
ややこしいので、デモGifで説明しますと、「Group z」というのはItemsSourceには存在しません。
でも、VM側で「Group z」を指定されてしまいました。
こういう場合に限り、ItemsSourceになくてもNothing化はしません。
ただし、一度でも値を変えると二度と「Group z」に戻すことはできません。

・選択候補を絞る
いわゆるオートコンプリート。
本題ではないのだけれど、IsEditableにしてしまったらまぁいるでしょうね。

・選択候補が1つの時にロストフォーカスしたら採用する
本題とずれてきてましたが、便利そうなのでそうします。

ソースコード(添付プロパティ以外)


要点だけピッキング。完全なものはダウンロードファイル参照。



ソースコード(添付プロパティ)


※添付プロパティのソースコード(完全)は長いからページの後半に付けてます。

続きを読む ...
 
[ 投稿者:mk3008 at 17:08 | WPF | コメント(0) | トラックバック(0) ]

2014年06月07日
リポジトリをClone、Fetchするバッチ
リポジトリをClone、Fetchするバッチのご紹介。
普通は「Pushを検知してFetch」するかと思いますが、
外部公開しているようなサーバーを持っていない場合はWebフックできません。
ということで、夜間バッチで定期的にFetchしてやろうって話。
ニッチだね。

バッチ用マシンの環境設定

・Git for windows
http://msysgit.github.io/
インストール時、
「Adjusting your PATH envirionment」画面にて
「Run Git from Windows Command Prompt」を選択することに注意。

・git-credential-winstore
https://gitcredentialstore.codeplex.com/
バッチ操作でユーザー認証を自動化するためのツール。(?)
正確な使い方がわかりませんが、とりあえず1回起動してください。
---------------------------
Installing git-credential-winstore
---------------------------
Do you want to install git-credential-winstore to prompt for passwords?
---------------------------
はい(Y) いいえ(N)
---------------------------
と出ますので「はい」を選択。

バッチファイルの作成



バッチファイルは特に変更する必要ないですが、
sync.bat6行目のsite変数のみ、ご自身の環境に合わせたサイトにしてください。
※環境がBacklogじゃない場合は適当にいじくりなおしてください。

主にメンテが必要なのは「sync_reps.txt」こっちです。
処理をリスト化したもので、第1引数がプロジェクト名、第2引数がリポジトリ名です。
リポジトリを追加したら行追加してください。

実行

sync_main.batを実行すれば、sync_reps.txtにあるリポジトリをFetchしてくれます。
ただ、初回実行時だけ、ユーザー認証ダイアログが出てきますのでそこだけ手作業。
以降はでてきません。
[ 投稿者:mk3008 at 21:09 | Git | コメント(0) | トラックバック(0) ]

2014年05月10日
シリアル化/逆シリアル化 VS2010
良く使いますが、過去バージョンが汚いコードなので手を入れます。


続きを読む ...
 
[ 投稿者:mk3008 at 13:06 | VB.NET | コメント(0) | トラックバック(0) ]

2014年05月04日
クリック時にロストフォーカスする添付プロパティ
VS2010+WPF+.NET4

ボタン、チェックボックスをクリックするとフォーカスが移ります。
このあとにスペースキーを押下すると再度クリックイベントが発生します。
これはWindows標準の仕様ですので、なんら問題ないですが、
スペースキーにショートカットキーを割り当てた場合、
上述の使用と競合するため意図しない挙動が起きてしまします。

というわけで、クリックイベント後、強制的にロストフォーカスするプロパティを作る。


添付プロパティめっちゃ便利…
※初期掲載時はビヘイビアとごっちゃになってました。

※フォーカスが移らない場合があったため、ウインドウにフォーカスを映すように変更。
[ 投稿者:mk3008 at 12:58 | WPF | コメント(0) | トラックバック(0) ]

2014年04月13日
MConfigをNuGetで公開しました
mconfig

MConfig NuGet

https://www.nuget.org/packages/MConfig/

作業方法については前回の記事を参照してもらうとして、
注意点や感想などを書いておきます。

・NuGetにアップロードされたファイルは取り消すことはできない
アップロードした後に間違いに気づいても取り消すことができません。
(バージョンをインクリメントして改定するしかない)
ですので、こちらのサイトを参考にし、
ローカルでテストすることを強くお勧めします。

・ローカルでテストするときの注意点
NuGetからインストールするとpackagesにキャッシュが残るので、再テストするときはこれを削除すること。

・インストール時何か処理を行いたい場合
/toolsに「Install.ps1」ファイルを配置して、そこに処理を記述する。
サンプルは以下参照。
(キャッシュを削除し忘れたり、定数値を探りながらやったので結構時がかかった。)
出力ディレクトリにコピー 'Copy To Output Directory'
1:常にコピーする     Always
2:新しい場合はコピーする Copy if newer
3:コピーしない      Never
ビルドアクション     'Build Action' to 'Content'
0:なし          None
1:コンパイル       Compile
2:コンテンツ       Content
3:埋め込まれたリソース  Embedded Resource
ビルドアクションはもっと種類がありますが、
有名どころさえ押さえとけばよいでしょう。

・.NET Frameworkのバージョンごとにバイナリファイルを用意するのが結構面倒
スクリプトなりマクロか何か作ったほうがいいかもしれない。
ちなみにわたしのVS2010Proではなぜかマクロが動作しなかった(壊れてる?)ので手作業。

・配布は面倒だが再利用性は抜群
DLLの参照設定などは大した手間ではないですが、
自動化で組み込まれるのはとても気持ちがいい。
ファイルサーバーで動作させることもできるので、
一般公開を前提としない社内フレームワークの配布にも使えそうです。

・依存関係も自動で補完
MConfigに依存関係はないので設定の仕方は確認していませんが、これも便利な機能です。
どこかで使ってみたいですね。
※ORMのKairyuは「MConfig」に依存させる予定。
[ 投稿者:mk3008 at 19:52 | フリーウェア | コメント(0) | トラックバック(0) ]

DLLをNuGetで公開しよう
リンク集です。

MSDN
NuGet でプロジェクト ライブラリを管理する

qiita.com
プロジェクトをNugetパッケージにして公開する

しばやん雑記
NuGet パッケージを作って公開する

Do Design Space
NuGet パッケージを作成して公開する

蒼の王座・裏口
Nugetがより快適になるNuget Package explorer

neue cc
NuGetパッケージの作り方、或いはXmlエディタとしてのVisual Studio

TFC
NuGetパッケージを企業内、チーム内だけで配布する方法・・・を超早でまとめ

@IT
特集:.NET開発の新標準「NuGet」入門(後編)
NuGetをさらに便利に使う方法とパッケージの公開


qiitaがわかりやすいですかね。
@ITは入門編っていうタイトルから読んでなかったですが副題がそれっぽいので後で読んでおこう。

付け加えるなら、
NuGetにパッケージをアップする前にいNuGet Package Explorerを使って、
パッケージファイルを見てみるといいでしょう。

詳しいことはわかりませんが、NuGet Package Explorerでないと
ライセンスのリンクが付けられなかったり、
複数の.netバージョンのサポートができなかったり
するような気がします。

続きを読む ...
 
[ 投稿者:mk3008 at 00:51 | VS.NET Tips | コメント(0) | トラックバック(0) ]