Date:  Wed, 04 Apr 2007 17:12:18 +0900
Subject:  【オブジェクト倶楽部: 2007-12号】
X-Mail-Count: 00187

【オブジェクト倶楽部: 2007-12号】

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.181 2007/04/04

■ I N D E X
┃
┣【Topics】第一回 天野カンファレンス 資料と動画の公開が始まりました
┣【Topics】第二回 全日本腰リールカンファレンス 開催迫る!
┣【プログラミング】Cayenneで始めるO/Rプログラミング[10]
┣【コラム】天野カンファレンスレポート
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 オブラブ待望の春イベント 〜 第1回 天野カンファレンス 〜
   ご来場、ありがとうございました!
  〇 〇━━━━━━━━━━━━━ ━━・ 

 3月28日、港区勤労福祉会館にて、オブジェクト倶楽部春イベント「天野カン
ファレンス」が、盛況のうちに実施されました。
快くご協力くださった講演者の天野氏のみなさま、お忙しい中ご参加くださっ
た皆さん。ありがとうございました。懇親会の席では日本のエンジニアの精鋭
がずらりと顔を揃え、かなり「ディープ」なカンファレンスとなりました。ご参
加いただいたすべての皆さまに心より感謝申し上げます。ありがとうございま
した。

気になる当日の様子や資料は、こちらのページで公開しております。
【ObjectClub HP】http://www.ObjectClub.jp/event/event2007spring/

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 第二回 全日本腰リールカンファレンス 開催迫る (4/6:新宿)
  〇 〇━━━━━━━━━━━━━ ━━・ 

腰リールカンファレンスの日時が迫っています。お申込みし忘れていた人は、
最終のご案内になりますよ!奮ってご参加くださいね。

主 催 : 全日本腰リール連盟(全コ連)
日 時 : 4月6日(金) 19:00-22:00(懇親会含む) 
場 所 : 新宿三井ビル34階 (株)豆蔵 トレーニングルーム
詳 細 : http://giantech.jp/wiki/WaistreelConference2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【プログラミング】Cayenneで始めるO/Rプログラミング[10]

ちょうどこの連載が始まったのが昨年のWWDCの直前でした。その頃は2006年末
から2007年初めには出る、と言われていたLeopardはまだ発売されていません。
でも、今度のWWDCのセッション内容にはLeopardのものがあるので、それまでに
は出るんでしょうね。Appleの暦で春は「3月20日〜6月20日」と決まっています。
WWDCは6/11-6/15。そういえばiPhoneの発売も6月だとか。まさかLeopardの秘密
の機能はiPhoneとの連携だったりするのかも、そしてWWDCで発表なんでわ!!

マックヲタな話はこの辺にしておいて、前回に引き続き、独自にSQLを記述する
方法を紹介します。もし前回を読んでない人は、話の流れが掴めないと思うの
で、バックナンバー[*1]で確認してくださいね。

それではCayenneで作られるSQLのカスタマイズに入ります。
まずSelectQueryを継承して、カスタマイズしたい場合は、createSQLActionメ
ソッドを修正することになります。このメソッドが返すSQLActionクラスが、
SQL自動生成をコントロールしているのです。まず「CayenneのSelectQueryを継
承した、CustomQueryクラス」を作ってみましょう。

public abstract class CustomQuery extends SelectQuery {
      @Override
      public SQLAction createSQLAction(SQLActionVisitor visitor) {
          SQLAction action = null;
          if(visitor instanceof JdbcActionBuilder) {  // (1)
              JdbcActionBuilder builder = (JdbcActionBuilder)visitor;
              String customScript = getCustomScript();  // (2)
              ColumnDescriptor column = getCustomColumnDescriptor(); // (3)
              action = new CustomSelectAction(this, builder.getAdapter(), builder.getEntityResolver(), customScript, column);  // (4)
          }
          return action;
      }
      protected abstract String getCustomScript();
      protected abstract ColumnDescriptor getCustomColumnDescriptor();
}

(1)で判断しているのはJDBCで接続しているかどうかです。JDBCで接続していな
い場合、今回は対象外としたいので、型をチェックしています。

(2)と(3)はabstractメソッドにして、CountQueryで実装するようにしましょう。

(4)で、このメソッドが戻すSQLActionを作成します。SelectActionクラスを継
承した、CustomSelectActionクラスを作りましょう。

public class CustomSelectAction extends SelectAction {
      private String customScript;      // (5)
      private ColumnDescriptor column;  // (6)
      public CustomSelectAction(CustomQuery arg0, DbAdapter arg1, EntityResolver arg2, String customScript, ColumnDescriptor column) {  // (7)
          super(arg0, arg1, arg2);
          this.customScript = customScript;
          this.column = column;
      }
      @Override
      protected SelectTranslator createTranslator(Connection connection) {
          CustomSelectTranslator translator = new CustomSelectTranslator();  // (8)
          translator.setQuery(query);
          translator.setAdapter(adapter);
          translator.setEntityResolver(getEntityResolver());
          translator.setConnection(connection);
          translator.setCustomScript(customScript); // ハック
          translator.setResultColumn(column);       // ハック
          return translator;
      }
}

差分は(5)と(6)で定義した部分です。この値はコンストラクタ(7)で受け取るよ
うにしています。その値は、オーバライドしたcreateTranslatorメソッド内で
使用しています。「ハック」とした部分でSelectTranslatorに、値を渡します。
SelectTranslatorクラスは実際にSQL文を生成するクラスですが、オリジナルの
クラスには、「ハック」のようにカスタムスクリプトやカラムを渡せません。
そこで、(8)で書いているとおりSelectTranslatorクラスを継承した、CustomSelectTranslator
クラスを使うことにします。実際のコードは以下のとおりです。

public class CustomSelectTranslator extends SelectTranslator {
      @Override
      public String createSqlString() throws Exception {
          String ret = null;
          ret = super.createSqlString();
          // SELECT と FROM の間を'カスタムSQL文'に書き換える。
          int fromIndex = ret.indexOf(" FROM ");
          ret = String.format("SELECT %s %s", customScript, ret.substring(fromIndex));
          return ret;
      }
      @Override
      public ColumnDescriptor[] getResultColumns() {
          return new ColumnDescriptor[]{column};
      }

      public void setCustomScript(String customScript) {
          this.customScript = customScript;
      }
      public void setResultColumn(ColumnDescriptor column) {
          this.column = column;
      }
      private String customScript;
      private ColumnDescriptor column;
}

createSqlStringメソッドをオーバライドし、独自SQLを作成します。
super.createSqlString()で標準のSQL文を作ると、SELECTとFROMの間に、テー
ブルのカラムが入ります。
カスタマイズはCountやSumなどの関数にすることを想定しているので、この部
分を置き換えよう、というものです。また戻りのカラム情報が変更されている
ので、getResultColumnsをオーバライドして、戻りカラム一覧を偽装しておく
ことが重要です。
CustomQueryもCustomSelectActionも、このCustomSelectTranslatorにカスタム
スクリプトと、カラムを渡したいためにカスタマイズしているのです。
最後にCustomQueryクラスを継承した、CountQueryクラスを作ってみましょう。

public class CountQuery extends CustomQuery {
      public int count(DataContext context) {
          int ret = 0;
          Map row = null;
          ResultIterator it = context.performIteratedQuery(this);
          if(it != null && it.hasNextRow()) {
              row = it.nextDataRow();
          }
          if(row != null) {
              ret = row.get("C");
          }
          return ret;
      }
      @Override
      protected String getCustomScript() {
          return "count(*) AS C";
      }
      @Override
      protected ColumnDescriptor getCustomColumnDescriptor() {
          return new ColumnDescriptor("C", TypesMapping.getSqlTypeByJava(Integer.class), TypesMapping.JAVA_INTEGER);
      }
}

countメソッドで件数を戻すようにします。CustomQueryでabstractにしていた
getCustomScriptおよびgetCustomColumnDescriptorメソッドを実装します。
getCustomScriptで戻すのは、SELECTとFROMの間に差し込むSQL文です。
getCustomColumnDescriptorでは、getCustomScriptで戻す値の型定義をします。
ColumnDescriptorクラスはCayenneの標準クラスで、O/Rマッピングの型を定義
できます。第一引数は、SQLから戻ってくるカラム名、第二引数はSQLで戻って
くる型、第三引数はJavaのオブジェクトにした場合の型です。TypesMappingに
は様々な型定義があるので、JavaDocを参考にしてください。
今回はCount関数について触れましたが、少し工夫するだけで、SUMなど別の関
数にも応用できると思います。

さて10回に渡って連載してきた本シリーズも今回で終了です。長らく読んでい
ただいた皆様ありがとうございました。Cayenneを通じてO/Rマッパーを使った
プログラミングに少しでも馴染んでいただけたのなら、幸いです。
またの機会にお会いしましょう。でわでわ。。(きしだ)

[*1]バックナンバーは以下のURLを参照ください。
http://www.objectclub.jp/ml-arch/magazine/183.html
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-9&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-9&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-9&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【特別コラム】オブラブ待望の春イベント「第1回 天野カンファレンス」開催!

●人間は区別する生き物
 人間はいつも区別をすることで生きています。

「これは自分のスキルアップに役立つ仕事か、そうでないか」
「これはビジネスに結びつく技術か、そうでないか」
「これは食べても太らないものか、そうでないか」

などなど。人類は生存競争の過程の中で、区別する能力を高度に発展させてき
た種であると言えます。最初はその日をどうにか生きていくのに必要な情報処
理能力しかなかったものが、徐々に明日、明後日、来月、来年、と将来のこと
を考えるようになりました。
 意識の範囲が広がればいいことだらけかと言えば、決してそんなことはあり
ません。新人の頃は、

「飲み会の後のラーメンが最高なんだよね」

と楽しく夜のお腹を締めくくっていたのが、30歳を過ぎたあたりから

「ここでラーメン食べちゃうからお腹の肉が上昇カーブなんだよね」

と意識してしまい、今そこにある楽しみを我慢してしまうのです。
 意識の範囲は時間的に広がっていくだけではありません。家族のこと、同僚
のこと、社会のこと、世界のこと(?)、といったように空間的にも広がって
いきます。テレビをつければ連日凶悪な事件や世界各地での問題が報道され、
心を痛めている方も多いでしょう。
 意識の範囲が広がって賢くなれば心配の種もそれだけ多くなり、かえって苦
痛になってしまうものなのです。大人になるってつらいことですね!

●プログラマもいろいろ
 ところでプログラマって一言にいっても実はいろいろあるので、区別をして
考える必要があります。BASICのプログラマもいらっしゃれば、CやJava、.Net
のプログラマもいらっしゃいます。最近ではPerlやRubyなどアジャイルな言語
を得意とするプログラマの方も増えてきています。プログラミングといえばア
センブラだよという猛者な方いらっしゃることでしょう。

注)私のような雑誌編集を生業とする人間にとって、いろいろな言語があるお
かげで仕事が成り立っている半面、キャッチアップは並大抵のことではありま
せん。また、相手の方のご専門を取り違えてお話を振ってしまい、冷たい空気
が流れることも(汗)。もちろんオブジェクト倶楽部の皆様にはいつも心優し
く取材にご協力いただいており、感謝の気持ちでいっぱいです。

●世の中のプログラマは2種類!?
 しかし、那須のKent Beck氏によると、世の中のプログラマにはわずか「2種
類」しか存在しないとのこと。

「すべてのプログラマは2つに分けられる。天野かそれ以外か」

 なんとクリアーで自明な原理。これぞ「KISS:Keep It Simple, Stupid!」
の精神ですね(言い過ぎ?)。そして、この革命的な着想を経て行われたオブ
ジェクト倶楽部待望の春イベントこそが、今回レポートいたします「第1回 
天野カンファレンス」(2007年3月28日開催)です。本イベントでは

オブジェクト倶楽部事務局長:天野勝氏
オブラブ2006ベストトーカー:天野良氏
デブサミ2007ベストスピーカー:天野仁史氏

という業界をリードする3人の天野氏を迎え、どのようにして各「天野」氏が作
られていったのかが語られました。

●天野氏によるプレゼン
 最初の天野氏によると感動期、吸収期、傲慢期、成長期の4つのステージを経
て、現在は妄想期にあるとのこと。オブジェクト倶楽部事務局長として、プロ
グラマの交流の場を積極的に提供する同氏のスタンスが、山あり谷ありの経験
を経て生まれてきたことを教えてくれる貴重なプレゼンでした。
傲慢期がどんなものだったのか今の天野氏からはまったく想像もつきませんが、
形はどうあれ自分の技術に自身を持てるっていいことだと思います。

 続いてプレゼンを行った天野氏は、各種イベントで発表したトークスを振り
返りながら自らの経験を語ってくれました。この天野氏はオブラブ2006ベスト
トーカーとして知られる「良いほう/勝てないほう」の天野氏ですが、最近は
マッシュアッパーやマッシュアップマスターと呼ばれているそうです。これは
飲み会メンバーを「混ぜ合わせ」て「新しい価値を作り出す」という同士提唱
の「飲み会マッシュアップモデル」にちなんだ名称。なお天野氏によると、
「今度呑みましょう」という(果たすつもりのない)大人の約束はせず、呑む
と言ったら必ず呑むとのことでした。これぞ天野道ですね!

 最後に発表を行ったのは、IT戦士として知られるamachangこと天野氏です。
天野氏の人生は、青春時代、IT戦士前、IT戦士後の3つに分けられるとのことで
した。青春時代の素敵な仲間達との時間を取り戻すため、「自分を窮地に追い
込む」「人との出会いを大切にする」という心構えで日々IT戦士として格闘中
とのこと。最近は、Applloを使ったクロスドメインのサービスマッシュアップ
に興味を持っていらっしゃるそうです(マッシュアップはマッシュアップでも
天野氏の呑み会マッシュアップとは違って、こちらはちゃんとプログラミング
の話)。

 天野氏のプレゼン終了後は、質疑応答とワールドカフェ(椅子を持ってあち
こち動き回りながら行うディスカッション)が行われました。「人」について
これだけ話題が尽きないって、とても素敵なことだと思います。スルー力は低
くても、「人」を愛せるプログラマが大集合の一夜でした。人を愛せるのは人
だけ。人を愛せるプログラマが作ったプログラムはきっとどこかで役に立って
いるはずです。

●第2回はあるのか?
 第1回と銘打っているからには第2回の天野カンファレンスがあるのか、もし
くは伊藤カンファレンスや高橋カンファレンスといったスピンアウト路線に転
換していくのか、あるいか1回限りのネタイベントだったのか、今後もオブジェ
クト倶楽部の動向から目が離せません。
(記事協力:エンジニアマインド編集部 野口隆史氏)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-25&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-25&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-25&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「どんなときに有給休暇使いますか?」のホントのところ。
先日あるエンジニアと話していて、どうも私たちはどんなときに有給休暇を取
得するのか?が随分と違うようでした。人によりますね。さて、読者の皆さん
が有給休暇を取る理由で一番多いのはどんなことですか?

  病気や体調の不良。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=0
  仕事にグレたとき。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=1
  帰省。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=2
  遊びや趣味。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=3
  無理に取れといわれて。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=4
  子供や家族のため。。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=5
  セミナーに参加するなど、自己研鑽のため。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=6
  有給休暇は殆ど使いません。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=7
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=147&choice=8
  ちょっと語らせて!
     詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「新しい季節にやめることって?」の結果は公開中。ぜひご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol146/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。気がつけば「桜」をモチーフにした歌が増えました
ね。この時期、色々なところで耳にします。新しい「こと」が増える時期です。
新しいメンバーが増えたり、新しい物を買ったり、職場や環境が新しくなる人
も多いかもしれません。皆さんにはどんな「新しいこと」が訪れましたか?

今週の強引な一言
*** 花は桜木 人は武士(ことわざ)***
花ならば桜が優れており、人ならば武士が優れているという意味で、それぞれ
の分野で最も優れているものを表したことわざ。プログラマだったらGEEK?
誰から見ても一番っていうのは、なかなか難しいですね。(上田雅美)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒http://www.ObjectClub.jp/community/object_ml/help/
〇 免責事項、過去の記事は   ⇒http://www.ObjectClub.jp/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://www.ObjectClub.jp/
■ 編集代表:平鍋  健児
Copyright (c)2003-2007 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.