GDDとは「Gut's Driven Development」の略です。簡単にいうとガッツ駆動方式のシステム開発です。
えぇまぁ、私の開発スタイルです。このBlogでは、そんなシステム開発の作業で発見したことを記録していきます。
(Google Developer Daysとはなんの関係ありません。)
2008年3月25日火曜日
[他]ソースの整形ツール(blog用?)
しかし、VS.NETのようにコードをカラー表示するとblogが見やすくなります。そこで調べてみると、コードからHTMLに変換するようなツールがいろいろあることがわかりました。
VS.NET2005以降の場合、アドオンツールがあり、コレ(リンク先失念)を導入するのがよいと思います。
ただし、アドオン機能なのでExpress Editionではサポートされません。
残念ならが製品版を持っていないので、私は利用することが出来ません。。。
そのため、ソース変換のサービスを利用しています。このblogではここを利用させてもらっています。ほかにもC# code formatなど有名なサイトがあります。
2008年3月21日金曜日
[.NET]SQLServer2005のクエリ通知機能
サンプルソースを作って。。。と思いましたが、環境を作ったりする時間が取れそうにないので、とりあえずメモだけ。
クエリ通知機能とは特定のテーブルテーブルに更新が合った場合にSQLServer側からイベントを発行してくれるような機能のようです。
ソケット通信に着替えると、サーバ(SQLServer)がUDPで更新情報を流しでクライアント(ADO.NET)がそれを受けてイベント発火。といったとことでしょうか。
詳細はここが参考になります。
で、クライアント側の処理を簡単に手順をまとめると、
- DBをオープンする
- 参照用のSqlCommandを生成する。SQL→「WAITFOR ( RECEIVE * FROM ContactChangeMessages);」
- SqlCommandにそれらしくCommandTimeoutを設定する
- SqlCommand.ExecuteReaderする
- SqlDataReader.Read()する。結果がtrueであれば結果有
※データベースに対して通知機能を有効にする必要があります。
おおざっぱにはこんな感じです。
アプリケーションサーバが複数台の構成になっていて、データを更新するたびに何かしら通知するような仕組みが必要な(つくりが悪い説もありますが。。。)場合、比較的楽に実装できそうですね。
2008年3月18日火曜日
[.NET]イベント実装の2つの方法
どちらの方法で実装しても結果は同じです。
「EventHandlerを独自で定義する方法」は、コントロールでなくても実装できるため汎用性が高く、実装も若干少なめです。しかし「EventHandlerをプロパティに保存する方法」はコントロールのそもそも持っているプロパティを使用するので何となくですが、自然な気がします。
・・・まぁどっちでもいいんですけどね。。。
以下サンプル。
■EventHandlerを独自で定義する方法
/// EventHandlerを独自で定義する方法
/// </summary>
public partial class TextBoxEx2 : TextBox
{
//イベントハンドラの定義
public event EventHandler OnReturn;
/// <summary>
/// コンストラクタ
/// </summary>
public TextBoxEx2()
{
InitializeComponent();
}
/// <summary>
/// キー押下
/// </summary>
protected override void OnKeyPress(KeyPressEventArgs e)
{
// リターンキー押下だったらイベント発行する
if (e.KeyChar == '\r')
{
e.Handled = true;
DoReturn();
return;
}
base.OnKeyPress(e);
}
/// <summary>
/// リターンキーイベント
/// </summary>
protected virtual void DoReturn(){
if (OnReturn != null)
{
//イベントを発生させます
OnReturn(this, EventArgs.Empty);
}
}
}
■EventHandlerをプロパティに保存する方法
/// EventHandlerをプロパティに保存する方法
/// </summary>
public partial class TextBoxEx1 : TextBox
{
/// <summary>
/// イベント識別用キー変数
/// </summary>
private static readonly object EventOnReturn = new object();
/// <summary>
/// イベントハンドラー設定プロパティ
/// </summary>
public event EventHandler OnReturn
{
add { base.Events.AddHandler(EventOnReturn, value); }
remove { base.Events.RemoveHandler(EventOnReturn, value); }
}
/// <summary>
/// コンストラクタ
/// </summary>
public TextBoxEx1()
{
InitializeComponent();
}
/// <summary>
/// キー押下
/// </summary>
protected override void OnKeyPress(KeyPressEventArgs e)
{
// リターンキー押下だったらイベント発行する
if (e.KeyChar == '\r')
{
e.Handled = true;
DoReturn();
return;
}
base.OnKeyPress(e);
}
/// <summary>
/// イベント発火処理
/// </summary>
protected virtual void DoReturn()
{
//該当のイベントハンドラを取得
EventHandler handler = (EventHandler)base.Events[EventOnReturn];
//イベント発火
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
2008年3月15日土曜日
[.NET]列挙体をフラグっぽく使う
たとえばこんな感じ。
wc.style = CS_HREDRAW | CS_VREDRAW
C#では、列挙体の型指定をつけた上で、それらしいことができます。
(値は適当です。)
public enum WNDClass {
None = 0x00000000,
Hredraw = 0x00000001,
Vredraw = 0x00000002,
foo = 0x00000004,
bar = 0x00000008,
WindowClass = Hredraw | Vredraw,
}
引数を渡すときにorすることもできます。
bool result = CreateWindow("abc", WNDClass.Hredraw | WNDClass.Vredraw);
//呼び出し先
public bool CreateWindow(string title, WNDClass cls){
//・・・処理
return true;
}
・・・知りませんでした。
2008年3月12日水曜日
[.NET]Reflectionでprivateフィールドに値を突っ込む
コードはこんな感じ。
HogeEx he = new HogeEx();
Type tp = typeof(Hoge);
FieldInfo info = tp.GetField("_bar", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
info.SetValue(he, true);
internal class Hoge
{
// Fields
public bool _foo = true;
private bool _bar = false;
}
internal class HogeEx : Hoge
{
// Fields
public bool _fooEx = true;
private bool _barEx = false;
}
ポイントとしては、
- 実際にprivateフィールドを持っているクラスのタイプを指定する
- Type.GetField()の第二引数に、BindingFlags.Instance|BindingFlags.NonPublicを指定する
- 値を突っ込む場合、↑に加え、BindingFlags.SetFieldを指定する
です。
たとえば、HttpRequestのFormに対して強引に値を突っ込みたい場合を考えてみます。HttpRequestのプロパティForm(NameValueCollectionの派生クラス)は参照のみの仕様です。値をセットしようとすると例外が発生します。これは、Form(NameValueCollection)のベースクラスであるNameObjectCollectionBaseのReadOnlyプロパティにより制御しています。そのプロパティの元はprivate変数の_readOnlyとなります。これにfalseを設定すればよい。ということになります。
Type tp = typeof(NameObjectCollectionBase);
FieldInfo info = tp.GetField("_readOnly", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance);
info.SetValue(req.Form, false);
req.Form.Add("foo", "bar");
2008年3月10日月曜日
[他]アクセスカウンタ設置
半日経過しましたが、意外なことに10件程度アクセスがありました。もっと少ないと思っていました。
今度は、コメントがもらえるようにがんばらねば。。。
2008年3月8日土曜日
[.NET]OracleClient
簡単に書くと以下のとおりです。
ODP.NETは省略しますが、.NETの時代になっても生き残っていたODBC。Orale独自の機能は使えなくなってしまいますが、プロバイダをそれらしく指定すれば接続できることをいまさらながら知りました。MDBとかと同じ方法ですね。
で次にOracle Instant Clientですが、コレもOracle社より提供されているクライアントなんですが、なんとインストール不要なんです。提供もzip形式ですし、コピー+path設定で動作させることが出来るようです。ODP.NETはこのクライアントのインストールがあるので、クライアントアプリケーションを配布するのがメンドウだったんですが、コレを使えば利便性がが上がるようです。Oracle Instant Clientの使い方は、ここが参考になります。
Oracle Instant ClientでもOracle独自機能は使えるんだろうか。。。今度試してみよう。
・・・いつの間にかODP.NET 11系がリリースされている!。10系ではVistaでまともに動作しなかったのですが、対応されているのだろうか。。。
2008年3月7日金曜日
[他]SVN+VS.NET その4
なんと、日本語パッチを開発してくれた人がいます!!
パッチはIILdotJPさんよりダウンロードできます。
インストーラはありませんが、アセンブリを差し替えることにより日本語化します。
私の環境はWindowsXP SP2/VS2005ですが正常動作してますね。
2008年3月6日木曜日
[.NET]ASP.NETのfontタグ
の一文で回避できるそうな。
掲示板でも紹介されていますが、最後に取り忘れないように注意!!
2008年3月5日水曜日
[Java]NTLM 認証
2008年3月1日土曜日
[.NET]自動トランザクション(ServicedComponent)
私の知る限り、.NET Framework3.5までの、実装方法は2種類の方法があります。
- System.Transactions.TransactionScopeを使う方法(新しい2.0系)
- System.EnterpriseServices.ServicedComponentを継承する方法(古い1.1系)
以前「1.」を.NET2.0+ODP.NETで利用したことがありました。そのときはC#との相性のよさと、使い勝手のよさに感動しました。しかし、今回、.NET1.1系の仕事であったため「2.」を使った自動トランザクションを調査しました。
「1.」では配備や設計ことなどあまり意識する必要はありませんでしたが、「2.」はcom+として動作する仕様であることから、配備(com+への登録作業)など結構メンドウでしす。しかし、自力トランザクションで何とかしようと思う場合を考えると、安全に実装できます。また慣れてしまえば、パターン化できます。今回複数の開発ベンダで作業するため、おのおのAPIを出し合ったりします。そういう場合このような技術が必須ですね
「2.」の方法では、クラスのアトリビュートに、トランザクション及びIsolation Levelの設定を行います。そのため、クラスの属性になるため設計に注意が必要です。同じクラス内であるメソッドはREAD UNCOMMITTEDあるメソッドではSERIALIZABLEな場合など、どうせならIsolation Levelの設定でやったほうがカッコいいんですけど面倒なんですよね。まぁSQLのヒントでも対応可能なんですけどね。