Date:  Wed, 04 Oct 2006 16:27:55 +0900
Subject:  【オブジェクト倶楽部: 2006-37号】
X-Mail-Count: 00164

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

■ I N D E X
┃
┣【Topics】「みんPy写経会」が始まります
┣【Topics】『XP祭り関西2006 in ワッハ上方』感想文
┣【プログラミング】Cayenneで始めるO/Rプログラミング[4]
┣【プログラミング】Rubyで進むオブジェクトの道〜書籍紹介〜[16] 
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 「みんPy写経会」が始まります(10/13 19:00〜)
  〇 〇━━━━━━━━━━━━━ ━━・ 

先月完了した「ふつケル写経会」に続き、今月からはPythonの入門書を使った
「みんPy写経会*1」を開催します。
「みんなのPython」を題材として、サンプルコードなどを写経する勉強会です。
来週の10/13(金)から毎週金曜日、19:00〜20:30の1時間半です。
詳しくはこちら http://qwik.jp/minpyshakyo/ へどうぞ。

●「みんなのPython」 http://amazon.co.jp/o/ASIN/479733665X/xp-jp22

[*1]: 蛇足ですが「みんぱい」と読みます。

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 参加する、実践する、体感型イベント 
    『XP祭り関西2006 in ワッハ上方』感想文
  〇 〇━━━━━━━━━━━━━ ━━・ 

行ってきたどー!!大阪!!という訳で、9月30日(土)にワッハ上方で開催され
た「XP祭り関西」に参加してきました。各セッションの詳細は省きますが全体
的に濃度がとても濃くて大変楽しいイベントでした。
懇親会ではXP祭り2006オフィシャルソング「Dear XP」[*1]を有志が演奏[*2]
をして、大いに盛り上がり、充実した1日を過ごすことが出来ました。
東京<=>大阪を0泊2日の強行軍でしたが、多くの方からパワーと勇気をもらえた
一日でした。(かじた)

[*1]
Dear XP
http://www.youtube.com/watch?v=-_cNM-JZSnI

[*2]
懇親会で有志の方による演奏
http://www.youtube.com/watch?v=i9EjfRns8Q0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【プログラミング】Cayenneで始めるO/Rプログラミング[4]

最近我が家の黒テレビの調子が、悪くなってきました。実は22年近くも使い続
けているテレビなんです。結構テレビ見ると思うんです。でも、ここまで故障も
な 無事だったのが逆に不思議なのかもしれませんね・・・
先日AppleがiTVの発表がありました。実は、それに合わせてiTV+Mac mini+シネ
マディスプレイ+TVチューナーで、リビングテレビなんてことを模索していたん
ですが、ちょっとそこまで持たないかも。それならiMac24インチか!?と思って
るのですが、想像だけでも財布が寒くなってきましたので、この辺で本題へ。

前回の宿題としていた会員データ登録クラスですが、ヒントの通りmainメソッ
ドだけを変更することで対応できます。

     private void main() throws IOException, ParseException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         Member member = (Member)context.createAndRegisterNewObject(Member.class);
         System.out.print("会員ID:");
         member.setObjectId(new ObjectId("Member", Member.ID_PK_COLUMN, reader.readLine()));
         System.out.print("会員名:");
         member.setName(reader.readLine());
         System.out.print("誕生日(yyyy/MM/dd):");
         member.setBirthday(new SimpleDateFormat("yyyy/MM/dd").parse(reader.readLine()));
         reader.close();
     }

どうですか?わからなかった人は、上の例を参考に今回の例に進んでください。
早速今回は「ビデオを探す」例を紹介したいと思います。まず、思いつくのが
探し方です。プログラムではよく以下の2つの方法が取られています。
・主キーで探す
・主キー以外の列で条件に一致する一覧を取得する。
O/Rプログラミングでも、基本的な考え方はまったく同じです。ビデオ検索クラ
スを作って検証してみましょう。

/**
  * ビデオ検索クラス
  */
public class VideoSearch {
     DataContext context = DataContext.createDataContext();

     public static void main(String[] args) throws IOException {
         VideoSearch search = new VideoSearch();
         search.main();
     }
     private void main() throws IOException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         System.out.print("ビデオID:");
         Video video = Video.findByPrimaryKey(context, reader.readLine());
         System.out.format("ビデオID:%s\nタイトル:%s\n", video.getId(), video.getTitle());
         reader.close();
     }
}

さて、このままではうまく動作しません。コンパイルエラーになりますね。実
際Videoクラスには、findByPrimaryKeyやgetIdといったメソッドはありません。
こ ではVideoクラスをカスタマイズする方法も兼ねて、主キーで検索する方法
について考えてみたいと思います。
まずfindByPrimaryKeyメソッドを、Videoクラスに作ってみましょう。主キーで
検索するためには、2つの手法があります。
・キャッシュを使って取得する方法
・キャッシュを使わないで取得する方法
上記はCayenneが管理するキャッシュにデータがある場合は、DBから取得せずに
キャッシュから戻す方法、下記はDBから取り直してキャッシュを最新に更新す
る方法です。上記は以下の通りで、

Video video = (Video)DataObjectUtils.objectForPK(context, Video.ID_PK_COLUMN, id);

下記は以下の通りになります。

ObjectIdQuery query = new ObjectIdQuery(new ObjectId("Video", Video.ID_PK_COLUMN, id));
Video video = (Video)DataObjectUtils.objectForQuery(context, query);

この使い分けはケースバイケースだと思いますが、今回はキャッシュを使わな
い方式で進めたいと思います。なおこの修正はVideoクラスに行います[*1]。

public class Video extends _Video {
     public static Video findByPrimaryKey(DataContext context, String id) {
         ObjectIdQuery query = new ObjectIdQuery(createObjectId(id));
         Video video = (Video)DataObjectUtils.objectForQuery(context, query);
         return video;
     }
     public static ObjectId createObjectId(String id) {
         return new ObjectId("Video", ID_PK_COLUMN, id); // [*2]
     }
     public String getId() {
         return (getObjectId() != null && !getObjectId().isTemporary())
         ? (String)getObjectId().getIdSnapshot().get(ID_PK_COLUMN)
         : "0";
     }
}

new ObjectIdの表現は良く使うので、各クラスにメソッド化しておくのが良い
でしょう。getIdメソッド、はCayenneのドキュメントに紹介されている方法の
まま取り入れています。
ひとまずこれで前回作った「紅の豚」を検索してみたいと思います。

・・・省略
ビデオID:100
INFO  QueryLogger: --- will run 1 query.
・・・省略
INFO  QueryLogger: SELECT t0.title, t0.id FROM video t0 WHERE t0.id = ? [bind: '100'] - prepared in 32 ms.
・・・省略
ビデオID:100
タイトル:紅の豚

どうですか?100を入力したら「紅の豚」が表示されますね。JDBCプログラミン
グよりも、遥かに直感的でわかりやすいソースになっています。従来のコード
は、

   Connecntion conn = datasource.getConnection();
   String sql = " SELECT title, id FROM video WHERE id = ?";
   PreparedStatement ps = conn.prepareStatement(sql);
   ps.setObject(1, "100");
   ResultSet rs = ps.executeQuery();
   rs.next();
   Video video = new Video();
   video.setId(rs.getString("id"));
   video.setTitle(rs.getString("title"));

のようになっていました。登録の時に比べると、だいぶ手続きが多くなってい
てマジックナンバーも多く使わなければなりません。O/Rマッパを使ったソース
の見易さ、メンテナンス性の良さを、少しずつ実感できますね。
では続いて「主キー以外の列で条件に一致する一覧を取得する」方法を、紹介
したいと思います。ここでの例は「タイトルの一部に検索文字列を含む」もの
とます。つまり部分一致による検索です。

     private void main() throws IOException {
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         System.out.print("タイトル:");
         Expression exp = ExpressionFactory.likeExp(
                 Video.TITLE_PROPERTY,  "%" + reader.readLine() + "%");
         SelectQuery query = new SelectQuery(Video.class, exp);
         List<Video> list = context.performQuery(query);
         System.out.println("ビデオID   タイトル");
         for(Video video : list) {
             System.out.format("%-10s %s\n", video.getId(), video.getTitle());
         }
         reader.close();
     }

「主キー以外の列で、条件に一致する一覧を取得する」場合に必要なのが、
SelectQueryクラスです。これは、名前の通りSELECT文を使ってデータを取得す
るためのクラスになります。例えば全件取得したい場合は、

SelectQuery query = new SelectQuery(Video.class);
List<Video> list = context.performQuery(query);

というコードになります。ここに条件を付加していく形となります。
今回は簡単な例ですので、SelectQueryのコンストラクタで条件を指定します。
検索条件は、Expressionクラスを使って作ることができます。
Expressionのインスタンスは、自らnewして作ることも可能ですが、
ExpressionFactoryを使うのが簡単です。
ExpressionFactoryには、部分一致検索を作るlikeExpの他にも、完全一致
(machExp)、大小比較、範囲などの検索条件を作るファクトリメソッドが準備さ
れていますので、詳しくはJavaDocなどのドキュメントを参照ください。検索条
件を作ったら、DataContext#performQueryメソッドを使って検索を実行します。
結果はSelectQueryの第1パラメータで指定したクラスのオブジェクトがリスト
で戻ります[*3]。では、検索条件に「豚」と入れて検索を実行してみましょう。

・・・省略
タイトル:豚
・・・省略
INFO  QueryLogger: SELECT t0.title, t0.id FROM video t0 WHERE t0.title LIKE ? [bind: '%豚%'] - prepared in 16 ms.
・・・省略
ビデオID   タイトル
100        紅の豚

どうですか?主キーで検索した時と同じように、SQL文が自動生成されて検索が
実行されましたね。実際のシステムではもっと複雑な検索が要求されると思いま
すが、今回はここまでとします。複雑な検索例については、本シリーズ内でい
ずれ取り上げますので、しばらくお待ちください。
次回は「ビデオを借りる」という視点で関連先とのリンク方法について紹介し
ていきます。(きしだ)

[*1]:CayenneではVideoと_Videoというような2つのクラスが生成されます。
      Videoの中身は空で、実際の実装は_Videoにあります。このような設計は
      GenerationGapパターンと呼ばれ、継承したクラス(ここではVideo)を
      編集することで、自動生成(主に再生成)の影響を受けずにすむのが大
      きな特徴です。

[*2]:Cayenne1.1までは「new ObjectId(Video.class,ID_PK_COLUMN,id)」の
      記法が使えていたのですが、1.2からはモデラーでエンティティ名を指定
      できるようになったため、上記クラス指定メソッドは非推奨となっていま
      す。もしエンティティ名を文字列として記述したくない場合は、
      DataContext#getEntityResolver().lookupObjEntity(Video.class).getName()
      という呼び出しでエンティティ名をクラス名から解決することができます。

[*3]:1件も条件にマッチしなかった場合はnullでなく空のリストが戻ります。
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-3&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-3&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E010-3&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【プログラミング】Rubyで進むオブジェクトの道〜書籍紹介〜[16]

■はじめに
食欲の秋、読書の秋、Rubyの秋がやってきました。
今年はRailsという気候に恵まれ、Ruby豊作の年になりましたね。

いくつかの本屋では、Ruby、Railsの本がまとまったスペースに平積みになって
売られるほどの人気っぷりです。
今日は、改めてRuby、Railsの書籍を紹介します。まだRuby、Railsの本を手に
していない人も、今年の秋は、Ruby、Railsの読書/写経[*1]にふけるのも一興
ではないでしょうか

■Rubyバイブル本
プログラミングRuby 第2版 言語編(邦訳)
 http://www.amazon.co.jp/o/ASIN/4274066428/xpjp-22

プログラミングRuby 第2版 ライブラリ編(邦訳)
 http://www.amazon.co.jp/o/ASIN/4274066436/xpjp-22

Programming Ruby: The Pragmatic Programmer's Guide(洋書)
 http://www.amazon.co.jp/o/ASIN/0974514055/xpjp-22

書籍の「達人プログラマー[*2]」などでよく知られるDaveThomasらが書いた本
です。邦訳は、言語編とライブラリ編の2冊に分かれています。
海外のRubyブームを、この本無しに語ることはできないでしょう。

■Railsバイブル本
RailsによるアジャイルWebアプリケーション開発(邦訳)
http://www.amazon.co.jp/o/ASIN/4274066401/xpjp-22

Agile Web Development With Rails(洋書)
http://www.amazon.co.jp/o/ASIN/097669400X/xpjp-22
Ruby、Railsブームの火付け役の本です。先輩は以下のサイトでPDF版が出た時
に購入し、大量にプリントアウトして「やばぁい、やばぁい[*3]」と、私に紹
介してくれたのを思い出します。
一年後には本当にすごいことになって、ほんとびっくりです。
http://www.pragmaticprogrammer.com/bookshelf/index.html

サイトによると年内には、第2版(PDF)がでるようです。
http://www.pragmaticprogrammer.com/titles/rails/index.html

■Ruby本
たのしいRuby第2版 Rubyではじめる気軽なプログラミング
http://www.amazon.co.jp/o/ASIN/4797336617/xpjp-22
Ruby入門書。私は第1版に大変お世話になりました。

Rubyレシピブック 268の技
http://www.amazon.co.jp/o/ASIN/4797324295/xpjp-22
今年の本ではないですが、技がコンパクトにまとめられていて、ちょっとした
調べ物に便利なので紹介。

■Rails本
はじめようRuby on Rails
http://www.amazon.co.jp/o/ASIN/4756147739/xpjp-22
ペアプロの会話を中心に進んでいくのが特徴的です。

ライド・オン・Rails Ruby on Rails
http://www.amazon.co.jp/o/ASIN/4797335750/xpjp-22
応用編では、RSS配信、Rindaでキューイングなどコアな内容になっています。

かんたんRuby on RailsでWebアプリケーション開発
http://www.amazon.co.jp/o/ASIN/4798111570/xpjp-22
ページを0〜10日目に分けてRailsを解説。その進行に合わせてれば、短期間で
学べます。

Ruby on Rails入門 優しいRailsの育て方
http://www.amazon.co.jp/o/ASIN/4798013951/xpjp-22
 Railsだけでなく、Rubyの解説も。アスキーアートで図示されている箇所があ
り、独特の「のり」があります。内容は濃く上級者にも対応。(IENAGA)

■参考
[*1]:【写経】ここでは、本をお手本にプログラムを書いて学ぶ事を指す。
      読むだけでなく実際に手を動かして学ぶことで体得率UPが期待できる。

[*2]:達人プログラマー
     http://www.amazon.co.jp/o/ASIN/4894712741/xpjp-22

[*3]:やばぁい:ここでは、「すごい」「すばらしい」「見事だ」を指す。
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-15&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-15&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E006-15&choice=2

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

今週は「どんな分野に興味がありますか?」のホントのところ。最近メルマガ
の記事評価への反応が少なくてさびしい、今日この頃です。ここで一つ、みな
さんの興味の対象が知りたいです。読者の皆さん、どんな分野に興味がありま
すか?(複数選択可能)

  回答はこちらから!
   http://www.objectclub.jp/special/kininaru/vol124/PlonePopoll_view2
  (1)プロジェクトマネジメント
  (2)プロジェクトファシリテーション
  (3)要求分析、要求開発
  (4)設計
  (5)プログラミング
  (6)テスト
  (7)デザイン(ユーザビリティ)
  (8)ライフハック
  (9)アジャイル
  (10)哲学、思想、ポリシー
  (11)ビジネス
  (12)軽い読み物、コラム
  (13)スクリプト言語/LL
  (14)ツールやフレームワークの紹介
  (15)編集後記
  (16)強引な一言
  (17)ちょっと語らせて!
     いつものとおり詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「携帯電話のポータビリティーを利用しますか?」の結果は公開中。
ぜひご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol123/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。キッザニア東京がオープンします。(東京:豊洲)
テレビで早速プレオープンの模様を見ましたが、子供たちがみんな良い顔して
楽しそうです。この中では色々な職業を体験することが出来るのですが、残念
なことにまだIT業界のお仕事が見当たりません。いつかは登場して欲しいです
ね。読者のみなさんはいつの頃から、今のお仕事に興味を持ちましたか?色々
な人に聞いてみたくなりました。

○キッザニア東京オフィシャルホームページ
  http://www.kidzania.jp/index.html

今週の強引な一言
*** 燈台下暗し(ことわざ) ***
「この業界を良くするんだ!」と自分の想いやアイデアを社外に広く主張する
のはとても素晴らしいことです。でも、自分の社内やすぐ隣の人を良くするこ
とはできてますか?足元が暗いままでは、机上の空論に終わるかもしれません
よ。
(上田雅美)

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