Seasar Conference 2006 Autumn
Seasar Conference 2006 Autumnが開催されます。
http://event.seasar.org/sc2006autumn/
私が聞きたいと思っているセッションは
- id:sugimotokazuyaさんの「Seasar.NETプロダクトによるWindowsアプリケーション開発」
- id:t-wadaさんの「DI時代のTDD入門」
- id:higayasuoさんの「Super Agile Web Development with Seasar2」
どれも面白そうで、今から楽しみです。(^_^)
第3回 アジャイル開発のキモはフィードバック! :-)
Fujiwoさんの連載、第3回です。
今回のテーマはフィードバック。Fujiwoさんらしい珠玉のギャグがちりばめられて、思わず笑ってしまいますが、根底を流れるアジャイルの思想と深い知識と経験には本当に頭が下がります。
學(まな)びて思(おも)はざれば則(すなは)ち罔(くら)く、思(おも)ひて學(まな)ばざれば則(すなは)ち殆(あや)ふし
は、私も好きな言葉なので、思わず嬉しくなってしまいました。
それにしても、もはやアジャイラーの間では常識となっている「つっこまれビリティ」や「ちゃうんけ系」など、どれも素晴らしいアイデアですし、妙に詳しい福井の描写やおだんごの紹介、今回の登場人物である原 眞鎮(はらまあちん) さんや健二さんという名前に思わずニヤリとする人もいるのではないでしょうか。(^_^)
Fujiwoさん、本当にGood Job!!です。
オブラブ 2006 夏イベント
オブラブ、今回も参加してきました。
羽生田さんの基調講演はとても良かったです。「守破離」を様々な視点から捉えていて、1つのセッションなのに、すごく広がる感覚をおぼえました。時間の関係で途中飛ばし気味だったのが残念でしたが、セッション資料が後日ダウンロードできるとのことなので、そちらをゆっくり見てみようと思います。
- 「デベロッパー テスティング − ソフトウェア開発者の基礎体力」
t-wadaさんのデベロッパー テスティングは、さすがですね。t-wadaさんは自己紹介でプログラマ兼社長と仰っていて、プログラマを先に持ってくることで分かるように、現場での開発者をとても重視しています。その気持ちがセッションにも良く出ていました。受講した方はみんな信者のようにt-wadaさんとペアプロしたい!って思ったみたいです。プロジェクトと人の健康とつなげて伝えているのも良かった。t-wadaさんの「TDD 100人切り」とかXPJUGでやってみたいですね。
- オブLOVEワールド カフェ「過去から今、そして未来へ」
ワールド カフェは2回目ですが、今回のほうが良かった。ワールド カフェでは多くの人の知識や経験を共有できるのが素晴らしいですね。今回の金魚鉢形式は一人が入ると、一人が抜けるのですが、抜けたあと次のグループへ入っていくのは結構勇気がいるなぁと思いました。グループの人が立っている人に声をかけてあげるような工夫があればもっと良かったかも。
- パネル ディスカッション 「変わりゆくソフトウェア開発の中で変わらないもの」
それぞれの視点が違うので、会話がかみ合わなかった部分もあったような気がしますが、それはそれで面白かったです。羽生さんはアウェー感一杯の中でかなり頑張ってたと思います。(^_^;)
- ライトニング トークス
ライトニング トークスも毎回楽しみのひとつですが、今回の出場者もみなさん素晴らしい出来でした。私は和田師匠のがんばりに投票したのですが、優勝したあまのりょーさんのトークスもとても素晴らしかったです。
- 懇親会&二次会
懇親会も二次会もとても楽しくて、今回もすごく元気を貰いました。次回もぜひ参加したいと思います。
Microsoft Windows SDK Beta 2で遊ぶ
やっぱりWindows Workflow Foundationが一番面白いかも。
前回のCTPから結構変わってるんですね。Visual Studio 2005 Extensions for Windows Workflow FoundationはBeta 2ではエラーになりますね。Beta 2.2に変えると動きました。
ID("identity")属性を利用するときはトランザクションのaspectを設定する必要がある
S2Dao.NETではSQL ServerのIdentity列をプライマリー キーに指定しているテーブルに対して、DTOの値を自動インサートしてくれる機能があります。例えば
CREATE TABLE [Company] ( [CompanyID] [int] IDENTITY (1, 1) NOT NULL, [CompanyName] [nvarchar] (50) )
というようなテーブルがあった場合、
public class Company { private int companyID; private string companyName; [ID("identity")] public int CompanyID { set { this.companyID = value; } get { return this.companyID; } } public string CompanyName { set { this.companyName = value; } get { return this.companyName; } } public override string ToString() { return string.Format( "CompanyID:[{0}] CompanyName:[{1}]", CompanyID, CompanyName); } }
というDTOを用意して、
[Bean(typeof(Company))] public interface ICompanyDao { void AddCompany(Company company); ..... }
というDaoインターフェースを定義しておくとS2Dao.NETが自動的にSQLクエリを実行するクラスを生成してくれます。
public int AddCompany() { Company company = new Company(); company.CompanyName = "ABC会社"; this._companyDao.AddCompany(company); return company.CompanyID; }
後は上のコードのようにDaoインターフェースで定義したメソッドを呼び出すだけです。
この例で分かるように、CompanyIDを設定しなくてもデータベースのCompanyテーブルにデータが正しく挿入され、Identity列として定義したCompany.CompanyIDには挿入した時点のID値をS2DaoInterceptorから呼び出されるIdentityIdentifierGeneratorがセットして戻してくれます。
とても便利な機能なんですが、一点注意があります。Daoを呼び出すコンポーネントにトランザクションのアスペクトを指定しておく必要があります。これを忘れると内部で実行しているSQL文"select @@IDENTITY"の戻り値がDBNullとなり、対応するプロパティがSystem.Int32などのプリミティブ型の場合、キャスト例外が発生します。
理由はLocalRequiredTxHandlerなどのトランザクションを有効にするハンドラをアスペクトで指定しないと、TransactionContext.OpenConnectionメソッドが呼び出されず、その結果、BasicSelectHandler.Executeメソッドは毎回新しいSqlConnectionオブジェクトを作成し、Openするからです。SQL Serverの@@Identityは同一コネクションであればトランザクションで囲まなくても値が取得できますが、コネクションが異なるとNULLを返します。
S2Dao.NETのこの振る舞いはSQL Serverに慣れたプログラマは混乱するかもしれません。またソースを深く追いかけないと原因の特定も難しいです。ただ、今のこのデザインを変えるのは難しいと思いますので、ドキュメントで明記するのが良いのではないでしょうか。
ひょっとして、これってS2Dao.NETユーザーにとっては衆知の事実なんでしょうか?(^_^;)
PythonのDocTestはすごいらしい :-)
XPJUGのユーザー会で清水川さんがid:kikainekoさんにその素晴らしさをレクチャーしていたみたい。(^_^)
- PythonのDocTestでお手軽TDD by 清水川さん
http://www.freia.jp/taka/blog/347
Flushでも作成されていて、これを見るとよく分かりますね。
おー、かっこいい!関数内にテストを埋め込めるし、対話コンソールの内容をそのままテストにできるんだ。
ヘルプ ドキュメントとして表示されるのも良いですねー。
- これに刺激を受けて、id:kikainekoさんはRubyで同じようなのを作り始めたみたい。