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

Top Index

2012年01月01日
Dapper の速度テストをしてみる
唐突ですが、Micro Orm なる言葉があるようです。
ざっくりいうと軽量かつ高速なORMといった感じ。

そのなかの1つ Dapper に速度テストがありましたので、
自作ORM(STORM)と速度比較をしてみました。
結果は以下の通り。
Running 500 iterations that load up a post entity
hand coded took 36ms
Mapper Query (buffered) took 39ms
Mapper Query (non-buffered) took 39ms
OrmLite QueryById took 39ms
Dynamic Mapper Query (buffered) took 40ms
Dynamic Mapper Query (non-buffered) took 40ms
PetaPoco (Fast) took 41ms
Dapper.Cotrib took 42ms
Dynamic Massice ORM Query took 43ms
PetaPoco (Normal) took 43ms
BLToolkit took 56ms
Linq 2 SQL Compiled took 65ms
Simple.Data took 76ms
*STORM took 144ms
Linq 2 SQL ExecuteQuery took 155ms
Linq 2 SQL took 489ms

※本当はもっとたくさんのORMと比較できるのですが、動作させる方法がわからなかったため、コメントアウトしちゃいました。

STORMは他のORMと比べると遅いですね・・・
開発効率重視でやってるので、速度はこんなもんで許してください。

※2/5追記
 STROMという名前のORMは他言語に存在しているので、
 今後はMaronに変えます。

※3/18追記
 いろいろ見直して、94msまで短縮。

※4/7
 さらに見直して、59msまで短縮。
 もう改善案も見当たらないので速度チューニングはこの辺でやめときます。

続きを読む ...
 
[ 投稿者:mk3008 at 13:51 | 雑記 | コメント(1) | トラックバック(0) ]

2011年12月21日
近況とかORMとか
またORM作ってます。
メジャーバージョンは4。
4回も作ってます…
うち1回はフルスクラップビルド。
で、今回は過去の経験も含め以下のような要件でやってます。

・シンプル
これがコンセプトです。

・ORMのみに注力する
ORM以外の機能は極力排除します。
これらの機能は拡張で対応してください。
たとえば、SQLのロギング機能は標準ではありませんが、
簡単にSQLコマンドをフックできるようにします。
log4netなどお好きなログツールを使用してください。

・コネクションを隠ぺいしない
ナンでもカンでもでもORMでやるのは愚の骨頂。
一括更新なんかはストアドやクエリを使ったほうがいいし、
レポート系はクエリ書いたほうがいい。
というわけで、コネクションを隠ぺいしません。
好きに使ってください。

・1コネクション中に複数のマッピング処理が実行可能
前はコネクションを隠ぺいしてたせいで、
マッピングする度にコネクションも閉じていましたが、
考えを改めましたので、コネクション開閉回数を抑えることができます。

・遅延ロードはサポートしない
いわゆる、参照した時にDBアクセスが発生するというやつはやりません。
あったら便利でしょうが、明示しない DB I/O が発生するのがイヤ。
事前に読み込んでおくか、ストアド化してください。

・ソートはサポートしない
ページングとか考えたらいりそうですが、今のところORMではやりません。
読み込んだリストを手動でソートするか、クエリでやってください。

・複雑な選択クエリもサポートしない
コネクションを隠していませんので、クエリでやってください。

・拡張性を残す
デリゲートを使って、関数で拡張したり、差し替えたりできるよにします。

・設定より制約
制約どおりであれば、
エンティティクラスを定義する際、属性やインターフェイス、基底クラスなどを
煩わしいことは一切なし。
なお、制約自体を独自関数に差し替えることは可能。

・ある程度の過剰読み込みを許容する
これはORM自体がそういうもんなんですが、あまりに過剰すぎてもいけない。
過剰に読み込まなくしたいが、その設定が複雑なのも簡便。
ということで、カスケードする階層を指定できるようにしています。
※0なら、自分自身。リレーションなし。
※1なら、自分自身と、その直近の親まで。という感じ。

・主キー検索条件を簡潔に書けるようにする
主キー検索する場合、普通は引数にIDを使いますが、
プロパティ名のリファクタリングなどが起きた時まぁまぁ面倒。
主キー検索条件はインスタンスそのものを使用します。
※文章で書いてもいまいちわからないでしょうが、まぁそういうことです。

んで、いまんところ読み書き、ダーティチェックまでは一応完成しました。
バージョン1のころと比べるとものすごいコード量が減ってます。
.NETのバージョンもあがったおかげで、プロパティの宣言も短く済みますしね。

あとはダーティチェックをEFの自己追跡っぽいコードに変えようか悩んでる最中。
しかし、EFの自己追跡ダーティチェックはPOCOといえるんだろうか・・・
パッと見POCOっぽいが、パーシャルクラスがえらいことになってるやん・・・
Silverlightでも使えるのはいいけど、ASP.NETに絞ったらどうなんだろとは思う。

もう少し調査してみる。

そして気が向いたら公開します。
[ 投稿者:mk3008 at 23:24 | 雑記 | コメント(0) | トラックバック(0) ]

2011年11月19日
WCFサービス起動トラブルメモ
「10 行でズバリ!! サービスの起動の自動化 (WCF の IIS ホスティング) (VB)http://code.msdn.microsoft.com/10-WCF-IIS-VB-cc1f5a62/」のサンプルを作成してところ、途中で躓きましたのでメモしておきます。

開発環境:Windows 7 Ultimate、Visual Studio 2010 Professional SP1、IIS7.5(多分)

工程「5. アプリケーションを IIS に配置する」にて、以下のようなエラーメッセージが表示される。
HTTP エラー 500.19 - Internal Server Error
ページに関連する構成データが無効であるため、要求されたページにアクセスできません。
エラー コード 0x80070021

ネットで調べたところ、解決策を紹介しているサイトがあったので紹介。
developerHobbies
IIS 7.0 on Vistaでサーバーエラー
http://developer-hobbies.blogspot.com/2008/05/iis-70-on-vista.html

これを試したあと、今度は別のエラーが発生。
HTTP エラー 404.3 - Not Found
拡張構成により、要求しているページは使用できません。ページがスクリプトの場合は、ハンドラを追加します。ファイルをダウンロードする場合は、MIME マップを追加します。

さらにネットで調べたところ、解決策を紹介しているサイトがあったので紹介。
k_maruの思うところ
■[技術メモ][.NET] WCF の .svc はハンドラマッピングの追加が必要
http://d.hatena.ne.jp/k_maru/20080320/1206003679

これを試したあと、今度は別のエラーが発生。
HTTP エラー 500.21
ハンドラー "***" のモジュール リストにあるモジュール "ManagedPipelineHandler" が正しくありません

さらにネットで調べたところ、解決策を紹介しているサイトがあったので紹介。
OakTree
ASP.NET 4.0を動かす
http://blog.kassyi.com/2010/07/aspnet-40.html

そしてついに動いた!
wcfservice

デバッグは簡単にできるけど、サービス稼動させるのは結構面倒だね・・・

以下、具体的に行った作業。

続きを読む ...
 
[ 投稿者:mk3008 at 23:29 | WEBアプリケーション | コメント(0) | トラックバック(0) ]

2011年10月30日
ReadOnly時、TextBoxになるComboBox
VisualStudio2010、WPF、VB2010、.NET4
※注意:TextBox表示としていますが、Labelでもなんでもいいです。個人的に文字列選択はしたいのでTextBoxにしただけです。深い意味はありません。


※2011/11/3 VMへ書き戻しされない不具合を修正。

ComboBoxのReadOnlyプロパティにしても、なぜか編集をロックすることができません。(できるかもしれませんが、見た目はどうみても編集できそう)
ですので、通常であればIsEnabledプロパティを使って編集をロックすると思いますが、IsEnabledだとグレーアウトしてしまう関係上、文字が見づらい・・・

ならば、ControlTempalteを使ってコントロールをごっそり入れ替えてしまいましょう。
完成後の画像:ReadOnly=False
ReadOnlyFalse

完成後の画像:ReadOnly=True
ReadOnlyTrue

以下、ポイントとか。

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

2011年10月05日
PostSharpでメソッドExitをフックする
開発環境:Windows7、VisualStudio2010、.NET4、VB、PostSharp2.0.9.3



説明省略。そのうち追加します。

以下、ソース抜粋。

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

PostSharpのCommunityEditionライセンスキーを取得する
PostSharpのCommunityEditionライセンスキーの取得方法がわかりづらかったのでメモっときます。
※ダウンロード方法は省略

1.http://www.sharpcrafters.com/ へアクセス

2.「Sign in」をクリック(画面右上にあります)

3.「OpenID URL」を入力して「Login」ボタンをクリック
 ※OpenIDを持っていない場合は http://www.openid.ne.jp/ で取得してください。

4.Open ID のサイトに飛びます。
 E-mailだけチェックをつけて、「一度だけ認証」ボタンをクリック
 ※E-mail以外は任意ですので、チェック付けても構いません。
 ※「認証状態を保持」ボタンでも多分いいと思います。

5.PostSharpのサイトに戻ってきます。
 Purchaseをクリック(画面右上にあります)

6.PostSharp Starter Editionを選択
 ※価格は0ユーロ、つまり無料です。

7.「BUY NOW」ボタンをクリック

8.「NEXT」ボタンをクリック(画面の下の方にあります)

9.「CONFIRM」ボタンをクリック

以上でOpenIDに登録したメールにライセンスキーが届きます。
[ 投稿者:mk3008 at 22:20 | PostSharp | コメント(0) | トラックバック(0) ]

2011年08月13日
VisualStudioに字下げ整形を再実行させるショートカットキー(備忘録)
(VisualStudio2010で検証)
xaml、xmlなどを編集していると、結構な頻度で字下げがぐちゃぐちゃになりますよね?
これを毎回手で直すのは大変ですが、以下のVisualStudioのショートカットキーを利用すると一発で整形されます。

  Ctrlキー+Kキー を押した後、 Ctrlキー+Dキー を押す

ショートカットキーを2個組み合わせるという、あまりなじみのない操作ですが効果は絶大ですのでぜひ使ってください。
[ 投稿者:mk3008 at 10:18 | VS.NET Tips | コメント(0) | トラックバック(0) ]

2011年07月18日
1ユーザーに対するメニュー権限管理のイディオム
UserMenuDiagram
以下のような管理ができる。
1. ユーザーは1つのロールを所持しており、ロールを元に権限管理が行える。
2. ユーザーは0から複数の拡張ユーザーメニューを所持しており、属人的な権限管理が行える。
3. ユーザーが利用できるメニューは、「1」と「2」をマージしたものである。

備考
ロールで権限管理することを基本とし、拡張ユーザーメニューを利用することは控える。
拡張ユーザーメニューを使用する場合は、
  申請者
  上長
  目的
  有効期日(ex.年度末まで)
を管理し、保守のタイミングや確認方法を明らかにしておくと後々便利。

利用する際には、「3」のビュー(クエリ、モデル)を作成すると開発しやすい。

ユーザー別店舗、支店管理もこのイディオムで表現可能と思われる。
[ 投稿者:mk3008 at 13:38 | 設計メモ | コメント(0) | トラックバック(0) ]

2011年06月19日
Action(Of T) デリゲート実例サンプル|DB接続処理を汎用的にしよう
[.NET 4][VS2010][VB] ※.NET4以前のバージョンでは記述できない可能性があります。注意してください。

デリゲートとは、関数を変数のように扱うことです。
宣言は以下のように行い、

'処理を1行で記述する場合
Dim x As Action = Sub() Debug.Print("Sample")
'処理を複数行で記述する場合
Dim y As Action = Sub()
Debug.Print("Sample")
End Sub
'引数を利用する場合
Dim z As Action(Of String) = Sub(args As String) Debug.Print(args)

呼び出すときには以下のようにします。

x.Invoke()
y.Invoke()
z.Invoke("Sample")

で、何に利用できるのか?というと以下のようなことができます。
関数を変数のように扱うことができる。
他の関数に渡すことで、部分的なロジックを差し替えることができる。

まだピンとこないと思いますので、DB接続処理をサンプルに実例を挙げてみます。


・ボタン1をクリックすると、DBサーバーのシステム日付をデバッグウインドウに表示する。
・ボタン2をクリックすると、Employeesテーブルの行数をデバッグウインドウに表示する。
 ※処理内容に特に意味はないです。
  脳内で主キー検索、名前検索などの実用的なものに置き換えてください。

これを単純にコード化すると以下のようになります。

Private Sub Button1_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT CURRENT_TIMESTAMP"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub

Private Sub Button2_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles Button2.Click
Using cn As New SqlClient.SqlConnection("Data Source=localhost\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;Pooling=False")
cn.Open()
Dim cmd As IDbCommand = cn.CreateCommand
cmd.CommandText = "SELECT COUNT(*) FROM EMPLOYEES"
Debug.Print(cmd.ExecuteScalar)
End Using
End Sub

ボタン1とボタン2で全く同じDB接続処理を書いてますが、中身(発行するクエリ)が違うのでサブルーチン化(関数化)できません。
「SqlConnectionのインスタンスからコネクションの接続まで」をサブルーチン化することも可能ですが、
Using構文が使えなくなるので手動でDisposeする必要が出てきてしまい、記述漏れのことを考えるとベストと言いがたいです。

※接続文字列を定数化して記述ミスを防ぐというのはアリですが、それは一旦置いときます。

メインルーチンでIDbCommandクラスを生成し、それを関数(コネクション処理と引数のコマンドを実行する)に投げるという方法も考えられます。
が、複数のコマンドを1回の接続のうちに実行したい事例がでてきたら破綻してしまいます。

※そもそも戻り値の型を何にするかで揉めそうですが。

そこで、デリゲート(関数の変数化、ロジックの差し替え、委譲)の出番です。

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

2011年06月11日
ExcelファイルをCSVに変換するVBScript
Excelファイルって.NETから操作すると結構めんどくさいので、いったんCSVに変換してしたらどんなもんかね?
と思って変換ツールをVBScriptで作ってみました。



仕様
・Excelがインストールされてないと動きません。
・ExcelファイルをVBSファイルにドロップして使用してください。
・一度に複数ファイルをドロップしても可。
・エクセルファイル内に複数シートがあっても可。
・出力されるパスはExcelファイルと同じパスです。
・出力されるファイルは
 エクセルファイル名.[シート名].csv
・スクリプト実行中にエラーがあると面倒なので、Excel画面はあえて表示しています。
・気に入らない箇所があったら勝手に変更しちゃってください。

以下、ソース。

続きを読む ...
 
[ 投稿者:mk3008 at 12:13 | Excel マクロ | コメント(0) | トラックバック(0) ]