2007年10月30日火曜日

ラムダ式?

C#3.0の話題を出したときに、少しだけでていたラムダ式。
CodeZineでサンプルがでていたのでちょっと張っておく。

Common Lispでのラムダ式の一例

(setf f #'(lambda (x) (expt 2 x))) (funcall f 10)

おびただしい量の括弧です。しかし、C# 3.0のラムダ式も負けてはいません。次のようになります。

カッコいいラムダ式の一例

Func<int, int> f = (((x)=>((((x)>10))?(((x)+x)):((x*(x))))));
f( 9 );

これ、なんていう正規表現?可読性の「か」の字もねぇぞ!

ADOでセッションプーリング

[HOWTO] ADO プログラムからのセッション プーリングの実装
なんでいまさら・・・と思ってみてみたら、Ado.Netじゃなくて純粋にADOだった。つまるところ、既存のVB6資産でも有効にできるってとこだねぇ。といってもウチの社内では「セッションプーリング」を判っている人はいないだろうから、多分今まで通り「AP起動時に接続、終了時に解放」という流れはそのままなんだろうなぁ。
まぁ自分もプーリング知るまでは、それしかない、と思っていたからあまり強くはいえないw

しかし接続文字列で指定できたとはねぇ・・・意外とまだ知られていない(公表されていない)設定があるんじゃないのかな?

2007年10月29日月曜日

DataGridViewでのEnterキー制御

業務アプリ作っていると必ずといっていいほど、話題になりやすいのがEnterキー制御。

昔からの習慣で、Enter押下で次の項目へカーソルを移動、というのが多いんだよね。それ自体は特に否定も肯定もしないけど。

ただ、その機能をDataGridViewに追加しようとする前に、ちょっとだけ考えてみて欲しい。
Enter押下→次のセル、だけでいいのかどうか?

画面によってはEnterで次コントロールというのがあるだろうし、下のセルへ移動させるのもあると思う。そのあたりを踏まえてどう拡張するかってのを考えて欲しい。そのあたりを踏まえていれば、あとあと「えー」なんて文句をいいたくなる事も減ると思うw

実際の対処なんて、大したことはないんだよね。
ProcessDialogKeyメソッド、ProcessDataGridViewKeyメソッド、ProcessRightKeyメソッドあたりを調べてもらえばわかると思うけど、このあたりで「Enterの際にはセル(またはコントロール)を移動する」というロジックにしてあげればOK。

ひっかかるとしたら、編集状態がからむとき。
EndEditメソッドを呼び出して、その結果OKなら移動してあげる、とかそういう制御は必要だろうね。

2007年10月24日水曜日

DataGridViewでセルの検索

DataGridViewを利用しているとやっぱりExcelみたいな使い方をしたくなると思われ。

前回(アンバウンドなDataGridViewでフィルター機能)書いたのもその一つ。なので今回はセルの検索をやってみようと。

セルを検索するときも、バインディングしているかどうかでロジックは変わる。
バインディングしている際は、現在のDataSetからDataViewを作り出してしまってしまえば、どの行が対象なのかがわかるので、後はどのセルかを走査してあげればOK。

アンバインドの場合は、元となるDataSetがないのでDataViewを使えない。なので力技の出番となるんだよね。
共有行を一気に非共有行へとしてしまうように(w)、全ての行とセルを一斉に走査するしかないんじゃないかなぁ。

あ、もちろんDataGridView自体をカスタマイズして、仮想モードでちゃんと動くようにしてある場合は別ね。

VistaのMDAC

元ネタはニュースグループに投稿されていた、「WindowsVista上でのVB6sp5のインストールにて」という件について。

Vistaでは今までのMDACと互換性を保持しているWindowsDACというものがインストールされている。そしてこれはMDAC2.8として扱われるのでそれ以前のバージョンはインストールすることはできない。

今回の件では、VB6Sp6であればインストール可能という事なのでどうにかなるだろうけど・・・。つか、とっくにサポートされていないSP4やSP5を使おうと考えるのが、もうダメってことなんだろうね。

2007年10月22日月曜日

機種依存な丸付き数字

自分としてはふるくさーい人間なんで、丸付き文字は「機種依存だコノヤロウ」と、問答無用で拒否する傾向にあったり。
で、いろんな話を聞いているとそのあたりの情勢も結構変わってきたようで。

旧来のShiftJis(JISX0208)では、1~20までしかなかった。なのでそれをベースにしているeuc-jpやISO-2022では表示できない。

ところが現在はJISX0213という規格もできて、そこでは1~50までがサポートされているんだよねぇ。ついでにいくとUnicode3.2規格でもサポートされるので、今後は普通に使っていい、とする必要はあるかも。

売上~請求~入金と、発注~支払~出金

今現在請求周りの再設計・・・。
そこで今まで考えてはいたけれど、ということを改めて見直してみた。それは「請求の裏返しが支払」という事。まぁ販売管理やっている人だと、結構こういう事言うのはあるね。

でも、それを実際にやってみたことはないんだよな。
絶対にデータのストレージ先は分けて設計しているんだよな。

ということで、頭の回路をフルフルに動かして考えてみた。結果、多分いけそうだね、という形までは思いつけたのよ。大元の考え方は次のような感じで。

ある科目なり項目に対して、金額(売掛または買掛)が発生するその金額に対して回収または支払の予定をたてる予定に対して金種(現金や振込み)の移動が発生する

こういう観点から見れば、売上~入金も発注~出金も同一のフレームワークで定義できるんだよね。
ついでなんでよく言われそうな点についても考えてみた。

(1)売掛と買掛を同一テーブルにすると見づらいし、メンテのときに面倒
ビューを利用すれ。本来はテーブルを直接触るほうが変。つか「見づらい」という観点でDB設計するな。

(2)売掛と買掛は意味合いが違うんだから、別テーブルじゃないとおかしいのでは?
情報を定義する際の視点の違い。どちらでも意味がちゃんと通るので、「こうじゃないとおかしい」のは成り立たない。どちらでもいい、が正解。

・・・まぁこんなところかと。ああ、なんかグチっぽいなぁw

2007年10月16日火曜日

自動採番

昨日、自動採番周りを再設計していた際に思い出した。
別の案件で同じように自動採番の仕組みを構築していたんだけど、排他制御まわりで上手くいかなかったんだよね。
で、そこで単純なことを忘れていたのに気づいたわけで。

大きなトランザクション中だから、自動採番近辺でトランザクション終了してもロックが外れるワケがない

・・・あたりまえだわなw
ということで今回はくだらないミスをしないためにも、自動採番周りは別セッション開いてやることにしようかと。ついでに、コネクションブールを考慮して、トランザクション終了時に自動で接続切るようにしてしまおうかな。

昔と違ってコネクションの接続解放のコストって大分なくなってるからねぇ。AP単位でコネクション維持しておく必要がなくなってるもんな。

アンバウンドなDataGridViewでフィルター機能

データバインディングした状態で、フィルタ機能をDataGridViewに実装するのはサンプルがMSDNにあるんだよね。DataGridView 列ヘッダー セルのドロップダウン フィルタ一覧を作成する
ただしアンバウンドな状態でのサンプルってのはないんだよな。

というのもアンバウンドな時にフィルタリングする、というのは処理的に大した話じゃないんで。

バインディングのときはDataViewを利用して簡単にフィルタを行えるけど、アンバウンドのときはそうはいかないのよ。同じ手法でやるとすると、「今現在保持している値をDataSetに収納する」ということをやってからじゃないと、DataViewでフィルタはかけることができないね。地味にこの部分がコスト高い。

なのでそこはすっぱりと諦めて(w)バインディングしているかどうかでフィルタ処理を行うクラスを切り替えてしまう、というのが一番いいんじゃないんだろうか。

ちなみにアンバウンドな時のフィルタというのは、「DataGridViewRow.Visible = False」にするだけ。
これだけな話なのでサンプルがないんだよね(w

2007年10月15日月曜日

いやはや

開発も佳境へ・・・だとどんなによかったか(w

まだ設計終わってないってどういう事よw

まぁね、今回はいい経験になるのは間違いないから、それを信じて頑張っているけどね。自分は周りをサポートするけど、俺をサポートする人材がいねぇ。なんとかならんか、これ。

2007年10月13日土曜日

SqlServerのチューニング

ハード的にSqlServerの動きを良くするには色々と方法があるそうで。

  • RAID-1(ミラー)構成にする
  • 物理的にディスクを増やす
  • CPUを増やす

「ミラーにする」というのはSqlServerに限らない話。Writeの速度は違うけど、Readの速度が最も早いのはミラー構成だからね。「物理的にディスクを増やす」のと「CPUを増やす」というのは若干SqlServerに限定した部分。SqlServerの同時実行命令数というのがこれらに依存するためなんだよね。DIskI/Oは物理ディスク数分しか同時実行できないので、極端に言うと物理ディスクを複数ぶら下げて、そのあたりにデータファイルを分散させるのがベスト。普通は自動拡張なんてさせないで、最初の時点で想定容量を求めた上で固定でアロケーションするんだけどな・・・。自動拡張でしかやったことない人だとわからないかも。
(それでも6.5までのSqlServerだと固定アロケーションが普通だったんだけどねぇ)

そしてCPUについては、まあ最近のご時勢でわかると思うけど・・・。簡単に言えば使えるスレッドの数はCPUの物理数とコア数に比例するから。
なので既存システムでスループットをあげたいという場合、最も行いやすい方法はこのあたりだろうね。ただ個人的には「設計の問題」が大きいから、サーバーごと新世代のHWにごっそり入れ替えるとかじゃなければ、それほどの機能向上は望めない気がしているけど。

2007年10月11日木曜日

Windowsの再アクティベーションの条件

サポートニュースグループでこんなのが流れてきた。

どうやらハード交換の際に再アクチが必要になるかどうか、ということだそうで。

  • ディスプレイアダプタ
  • SCSIアダプタ
  • IDEアダプタ
  • ネットワークアダプタのメディアアクセス コントロール (MAC) アドレス
  • RAM の容量の範囲 (0 ~ 64 MB、64 ~ 128 MB など)
  • プロセッサの種類
  • プロセッサのシリアル番号
  • ハード ディスク デバイス
  • ハード ディスクのボリュームシリアル番号
  • CD-ROM/CD-RW/DVD-ROM ドライブ

提示されたのはこれ。ディスプレイアダプタが条件に入っているのは正直「どうよ?」って感じかな。
メモリ容量もねぇ・・・今のご時勢なら除外すべきでしょ。
まぁ、これって2003Serverに対しての質問だったから、XPやVistaの場合はまた違うのかもね。

2007年10月10日水曜日

列挙型のTooltipによるガイドが・・・

Friendで定義してある列挙型なのに、マウスカーソルあてて出てくるToolTipを見るとPublicとして表示されているなぁ・・・。
Friend定義してあるクラスのファイルでやってみても同じように表示されてくるから、VisualStudioのバグだな、これ。
別にいたくもかゆくもないバグだから、きっと次のサービスパックでも直らない気がするw

MSセミナー行ってきた

昨日はSilverlightとASP.NET+AJAXなセミナーに行ってきた。
今のところ自分が作成するシステムでは使う予定はないけれど、使うようになる可能性は結構高いかなぁ、なんて思っているね。
多分1案件でもブラウザベースなものが受注できれば、確実に使うと思う・・・。

Silverlightはブラウザのプラグイン、AJAXはJavaScriptとどちらもセキュリティポリシー次第では使えなくなる場面はあるけれど、多分そんなにポリシーが厳しいお客さんの案件はウチにはこないだろ。
どちらにも共通しているのは「次のユーザー体験」というところ。
デザインセンスが切実に欲しい・・・。

しかしセミナーというところでは隠れた問題が・・・。

11/26:Ado EntityFramework
11/30:.Net3.5 TechnicalBriefing

ちくしょー。どっちも確実に出ておきたいんだけど、時期が問題だ!

2007年10月2日火曜日

プロパティでSystem.Typeを指定したい?(6)

前回までで、プロパティダイアログにて利用するTypeConverterが用意できたことになるので、残っているのはColumnクラス側で利用するプロパティに属性をつけてあげること。

その際の記述はこんな感じ。

System.ComponentModel.TypeConverter(GetType(コンバータクラス))

プロパティの属性としてそのまんまなTypeConverter属性を記述してあげると、デザイン時に意図した動きになってくれる。例えばこんなので。

<System.ComponentModel.Browsable(True), _
System.ComponentModel.Description("ここで指定したType情報を元に、セルの編集の際にサブエディタとしてインスタンス化します"), _
System.ComponentModel.TypeConverter(GetType(MultiLayoutTypeConverter))> _
Public Property EditorInstanceType() As System.Type
    Get
        Return DirectCast(MyBase.CellTemplate, MultiLayoutCell).EditorInstanceType
    End Get
    Set(ByVal value As System.Type)
        DirectCast(MyBase.CellTemplate, MultiLayoutCell).EditorInstanceType = value
    End Set
End Property

こんな感じで指定しておくとバッチリかと。

SmartUIアンチパターン

[ 技術講座 ] Domain-Driven Designのエッセンス 第2回から。

Smart UI(利口なUI)アンチパターン

層状アーキテクチャの対極をなすアンチパターン。ビジネスロジックやデータアクセスのコードが、UIのコードと一緒になってしまっている、いわばスパゲッティな状態。利口なUIと呼ぶのは、ビジネスロジックを含むすべての処理がUIの中で行なわれるから。最もやっつけで手軽なやり方がこれなので、設計を何も考ないとこの状態に陥ってしまう。開発チームのスキルが低くて、かついわゆる第4世代(4GL)と呼ばれるようなグラフィカルな開発ツールを最大限に利用する場合は、このパターンの採用にも一理ある。しかし、利口なUIを採用してしまうとMDDが一切機能しなくなるので、DDDは諦めるしかない。

いやはや全く。あまり強くは言えないけれどなー。
目標とするのはこういうところじゃないと、どこかでせっぱつまるっす。というか、つまったw