Date:  Wed, 08 Nov 2006 16:04:05 +0900
Subject:  【オブジェクト倶楽部: 2006-42号】
X-Mail-Count: 00169

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.163 2006/11/08

■ I N D E X
┃
┣【Topics】オブジェクト倶楽部 クリスマスイベント開催決定!
┣【プログラミング】Cayenneで始めるO/Rプログラミング[5]
┣【キーワード】知ってるようで分からないビジネスワード勉強会[33]
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 オブジェクト倶楽部 クリスマスイベント開催決定!(12月20日:代々木)
  〇 〇━━━━━━━━━━━━━ ━━・ 

オブジェクト倶楽部のクリスマスイベント、今年も開催が決定しました!

日 時:2006年12月20日(水) 10:00〜17:00 (懇親会18:00〜20:00予定)
場 所:国立オリンピック記念青少年総合センター (http://nyc.niye.go.jp/)
内 容:講演、ワークショップ
参加費:講演会3,000円、懇親会4,000円

サイトでの詳細ページ公開は、11月15日頃を予定しています。次回のメルマガ
で改めて告知します。申し込み受付は11月22日を予定しています。
みなさん、どうぞお楽しみに!

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

ついに新iPod shuffleが発売になりました。友人が電車で使っていたら、目の
前に座っていた若者が大きい声で「新しいシャッフルだよー」と叫んだそうで
す(笑)。まだまだ出回っていないようですが、くれぐれも目撃しても大声を出
さないように注意しましょうね!
そんな話題のシャッフルですが、ジョブスはAppleの全従業員宛てに「予約注文
を全て処理し終わったら、iPod shuffleをプレゼントする」とメールを送った
との噂が。ホントのところはどうなんですかねー。気になります。

さて今回は、「ビデオを借りる」例を紹介したいと思います。
通常借りる人(アクター)は会員ですが、ここではビデオ店員がシステムに貸出
データを入力するというシナリオを想定します。

このシナリオの前提条件は、以下の通りです。

・会員がビデオを選んで貸出カウンターへ持ってくる

実行するシナリオは以下の通りで、今回例外シナリオは想定しない事とします。

・店員は会員から会員証、ビデオケースを受け取る
・店員はビデオメディアを探す
・店員は貸出条件を会員から聞く
・店員はシステムに貸出データを入力する
・店員は会員に貸出料金を提示して会計をする
・店員は会員に会員証を返却し、ビデオを貸し出す

本メルマガでは会計部分は範囲外とし、貸出データの登録にフォーカスします。
では、実際にTRYしてみましょう。

だいぶ前の事になってしまったので、貸出データのテーブルがどんなものだっ
たのか忘れてしまったかもしれません。振り返っておきましょう。

CREATE TABLE `lending` (
    `videoId` varchar(10) NOT NULL COMMENT 'ビデオID',
    `memberId` varchar(10) NOT NULL COMMENT 'ID',
    `rentDay` date default NULL COMMENT '貸出日',
    `returnDay` date default NULL COMMENT '返却予定日',
    PRIMARY KEY  (`videoId`,`memberId`),
    KEY `fk_member` (`memberId`),
    CONSTRAINT `fk_video` FOREIGN KEY (`videoId`) REFERENCES `video` (`id`),
    CONSTRAINT `fk_member` FOREIGN KEY (`memberId`) REFERENCES `member` (`id`)
);

「店員は会員から会員証、ビデオケースを受け取る」から考えます。
店員は会員証から会員ID、ビデオケースからビデオIDがわかるものとします。
つまり簡単に考えると、setVideoIdメソッドとsetMemberIdメソッドでセットす
れば良いという事が想像できます。
しかし例えば、これがデータベースでなく、普通のクラス関連だったらどうで
しょうか?

    貸出 ─ ビデオ
         L 会員

のようなクラスの関連を実現するために、以下のようなコードを記述するでしょ
う。

public class 貸出 {
      private ビデオ video;
      private 会員   member;

      public void setVideo(ビデオ video){
          this.video = video;
      }
      ・・・(省略)
}

O/Rマッピングで関連を実現する場合も、考え方は同じです。旧来の手法でJDBC
プログラミングをしていた頃は、上記のようなオブジェクト構造にはならずに、
テーブル構造と同じクラス定義を持っていたはずです。これはシステムの構造
上はデータベースと1対1になっているので、一見するとわかり易いように思え
るのですが、実際には存在チェックや関連先の値の取得など、複雑なコードを
記述しなければならない事が多いのです。
今回はビデオを借りるというシナリオの中で、O/Rマッピングの特徴の1つでも
ある、関連データの取り扱いのすばらしさを体感して欲しいと思います。

ちょっと前置きが長くなりましたが、自動生成された_Lendingクラスを見てく
ださい。作成されたメソッドには、ビデオIDや会員IDを扱うメソッドがないで
すね。その代わり上記のクラスと同じように、ビデオや会員のオブジェクトを
扱う以下のメソッドがあるはずです。

    public void setToMember(com.video.model.Member toMember)
    public com.video.model.Member getToMember()
    public void setToVideo(com.video.model.Video toVideo)
    public com.video.model.Video getToVideo()

つまりO/Rプログラミングはデータベースを意識せずに、Javaのオブジェクトを
セットしていけば良いわけです。実際に貸出と会員・ビデオの関連を、作成し
てみましょう。ビデオは前回にfindByPrimaryKeyメソッドを作りました。会員
についても同様に、メソッドを作ってみましょう。

public class Member extends _Member {
      public static Member findByPrimaryKey(DataContext context, String id) {
          ObjectIdQuery query = new ObjectIdQuery(createObjectId(id));
          Member member = (Member)DataObjectUtils.objectForQuery(context, query);
          return member;
      }
      public static ObjectId createObjectId(String id) {
          return new ObjectId("Member", Member.ID_PK_COLUMN, id);
      }
      public String getId() {
          return (getObjectId() != null && !getObjectId().isTemporary())
          ? (String)getObjectId().getIdSnapshot().get(ID_PK_COLUMN)
          : "0";
      }
}

ここまでくれば、後は会員IDとビデオIDを入力して、検索したデータをセット
するだけです。
シナリオでは、「店員はシステムに貸出データを入力する」という部分に該当
します。早速取り掛かりましょう。

/**
   * ビデオ貸出クラス
   */
public class VideoLender {
      DataContext context;

      public static void main(String[] args) throws Exception {
          VideoLender lender = new VideoLender();
          lender.init();
          lender.main();
          lender.end();
      }
      ・・・(省略)
}

VideoLenderクラスは、以前のVideoRegisterクラスなどと同じようにinit,main,
endから成り立つ登録系のクラスとします。initやendの内容も同様ですので、
今回は省略します。[*1]
ではmain処理を見てみましょう。

      public void main() throws Exception {
          BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
          System.out.print("ビデオID:");
          Video video = Video.findByPrimaryKey(context, reader.readLine());
          System.out.print("会員ID:");
          Member member = Member.findByPrimaryKey(context, reader.readLine());
          System.out.print("貸出日数:");
          Calendar returnDay = Calendar.getInstance();
          returnDay.add(Calendar.DAY_OF_MONTH, Integer.parseInt(reader.readLine()));

          Lending lending = (Lending)context.createAndRegisterNewObject(Lending.class);
          lending.setToVideo(video);
          lending.setToMember(member);
          lending.setRentDay(Calendar.getInstance().getTime());
          lending.setReturnDay(returnDay.getTime());

          reader.close();
      }

標準入力からビデオID、会員ID、貸出日数を入力します。
IDはそれぞれ、findByPrimaryKeyメソッドでオブジェクトを取得します。
返却日についてシナリオでは、「店員は貸出条件を会員から聞く」に該当しま
す。今回のサンプルでは、貸出条件を貸出日数という事にします。プログラム
上では、Calendar#add()メソッドで日数を加算して計算する、簡易なものとし
ます。

新しい貸出オブジェクトの作成は、ビデオや会員の時と同じように
createAndRegisterNewObjectメソッドで、コンテキスト内に登録待ち状態とし
てアサインしておきます(endメソッドのcommitChangesでデータベースに反映さ
れます)。それでは実際に実行してみましょう。

INFO  QueryLogger: Created connection pool: jdbc:mysql://localhost/sample
      ・・・(省略)
ビデオID:100
      ・・・(省略)
INFO  QueryLogger: SELECT t0.title, t0.id FROM video t0 WHERE t0.id = ? [bind: '100'] - prepared in 15 ms.
      ・・・(省略)
会員ID:1234
      ・・・(省略)
INFO  QueryLogger: SELECT t0.birthday, t0.name, t0.id FROM member t0 WHERE t0.id = ? [bind: '1234']
      ・・・(省略)
貸出日数:3
INFO  QueryLogger: --- will run 1 query.
INFO  QueryLogger: --- transaction started.
INFO  QueryLogger: INSERT INTO lending (memberId, rentDay, returnDay, videoId) VALUES (?, ?, ?, ?)
INFO  QueryLogger: [bind: '1234', '2006-09-12 00:00:00.000', '2006-09-15 00:00:00.000', '100']
INFO  QueryLogger: === updated 1 row.
INFO  QueryLogger: +++ transaction committed.

関連先のマスタデータを主キーで検索し、検索結果のオブジェクトをセットし
たにも関わらず、INSERT文に渡される値は、実際のカラムであるIDの値(この
例では入力した会員ID=1234とビデオID=100)だけです。つまりID以外の属性は
ここでは使われていません。実はこれだけなら、従来のSQL文を記述したような
JDBCプログラミングの方が、DBを扱うコードが少なくて良かったかもしれません。
では、実際にこれで何がうれしかったのでしょうか?実はこのコード例はO/R
マッピングの関連を取り扱う最初の1歩に過ぎません。O/Rマッピングにおける
本当の実力は、もっと強力なものです。
おっと!今回も時間が来てしまいました。次回は関連の技術をもっと深く探って
いきますので、ご期待ください。(きしだ)

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【キーワード】知ってるようで分からないビジネスワード勉強会[33]
        連想検索

こんにちは、hiroshiです。過ごしやすい季節もそろそろ終わりに近づき、最近
はめっきり寒くなってきました。こんな時には、紅葉でも見ながらゆっくりお
酒でも飲みたいものです。
先週の三連休には紅葉を見に行こうと思い立ちましたが、朝の紅葉地の渋滞の
酷さに断念してしまいました。皆様いかがお過ごしでしょうか。

今回は「連想検索」について紹介します。提案書や資料を作成するために、ネッ
トを使いますが、なかなか自分にヒットした内容が出てきません。同じような
体験が皆様もあるのではないでしょうか。今回紹介させていただく「連想検索」
は、そんな思いを解決してくれるかも知れません。

「連想検索」とは何なのでしょうか。
通常の検索では、キーワードを入力してそれにヒットする情報を引っ張ってき
ます。このキーワードがミソなのです。僕の場合は欲しい情報が漠然としてい
るので、有効なキーワードが入力できません。例えば、「今IT業界で問題になっ
ていること」を知りたいとき、これまではキーワードとして「IT業界」、
「問題」を入力して検索していました。これでは、僕のイメージしている文章
に行き着くのは時間がかかります。「連想検索」は、「今IT業界で問題になっ
ていること」という文章を検索キーとして、連想できる情報を探し出してくれ
るものです。類似性をとらえる検索方法であることから、「あいまい検索」や
「概念検索」と呼ばれることもあるようです。

「連想検索」は、どのような仕組みで類似性を捉えているのでしょうか。簡略
化して説明してみましょう。
連想検索は、まず検索キーとして与えられた文書から、その内容を特徴的に表
すような単語群(特徴語群)を抽出します。次に、抽出された単語から、今度は
文書を検索します。つまり、「文書→単語」、「単語→文書」というこの2つの
プロセスを踏むことで、類似文書の高速な検索を実現しています。一般的な文
章なら50語程度、専門的な学術文献であれば200語程度で、文書の持つ特性を表
す「特徴語群」が得られると言われています。

それでは、どのように使われているのでしょうか。国立情報学研究所のWebcat
Plusを使用してみました。このサイトは書籍検索を目的としているため、入力
した文章に関連のある書籍が検索結果として表示されました。これでも、何も
解らずにキーワード検索するよりは、情報が記載されている具体的な物に辿り
着けるため助かります。

その他、連想検索の利用状況を見てみると、主に書籍データベースの検索シス
テムに使われているようです。今後は一般の検索サイトのような、巨大な検索
システムに活用されることを期待しています。(hiroshi)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=D001-32&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=D001-32&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=D001-32&choice=2

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

今週は「ペンケースの中に何が入ってますか?」のホントのところ。打ち合せ
の時に大きなペンケースを持っている人がいました。いったい何が入ってるん
でしょうか?興味深々です。そんなわけで、今回はあなたのペンケースの中に
どんなものが入っているのか教えてくださいね。

回答はこちらから!(複数回答可能です)
http://www.objectclub.jp/special/kininaru/vol129/PlonePopoll_view2

  (1)シャープペン。
  (2)ボールペン。
  (3)鉛筆。
  (4)定規。
  (5)水性ペン。
  (6)ゲルマーカー。
  (7)蛍光ペン。
  (8)暗記ペン。
  (9)修正ペン、修正テープ。
  (10)ハンコや朱肉。
  (11)のり。
  (12)付箋。
  (13)消しゴム。
  (14)ちょっとしたおもちゃやアクセサリー。
  (15)ペンケースや筆記用具を持ち歩かない。
  (16)その他。
  (17)それは秘密です。
  (18)ちょっと語らせて!
    いつものとおり詳細をこのメールに返信ください!! 

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「今まで買った一番高価なものはいくら?」の結果は公開中。
ぜひご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol128/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。秋イベントの追加席があっという間に埋まりました。
編集後記を読んでくださっている人が、少なくとも10人はいることになります
ね。小さくガッツポーツです!さて、次はいよいよ冬イベントが迫っています。
今度のイベントも、例年に劣らず愛情たっぷり。寒い冬の一日を、暖かく過ご
せるようなイベントにしたいと準備中です。みなさん是非ご参加くださいね。

今週の強引な一言
*** 秋の日は釣瓶(つるべ)落とし(ことわざ)***
夕方になったと思ったら、あっという間に日が暮れる季節になりました。そん
なことを、「あっ!」と手を離したとたんに井戸の中にするすると落ちてゆく
釣瓶に例えたことわざです。心のどこかで釣瓶だから手を離しても大丈夫だと
思ってはいませんか?本気のリスクマネージメントは、心構えからですよ。
(上田雅美)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒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.