Date:  Wed, 12 May 2010 17:13:31 +0900
Subject:  【オブジェクト倶楽部: 2010-18号】
X-Mail-Count: 00336

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.326 2010/05/12

■ I N D E X
┃
┣【プログラミング】IzPackで作るクロスプラットフォームインストーラ [9](最終回)
┣【プログラミング】ドキュメント指向データベースMongoDB [4]
┗ 編集後記

======================================================< P R >=====
組込みソフトウェアモデリング・フォーラム2010 抽選で100名様無料招待!
====================================================================

オブジェクト倶楽部は「組込みソフトウェアモデリング・フォーラム2010」へ
オフィシャルコミュニティとして参画します。その特典として、抽選で100名様
をご招待します。たくさんのご応募をお待ちしております!

▼応募方法
  下記URLから応募フォームにご登録をお願いします。
  http://www.seshop.com/event/enq/uml/ 
▼当選者数
  100名様を無料でご招待
▼応募締切
  5月19日(水) 17:00
▼当選 / 発表
  厳選なる抽選を行い当選された方に5月20日(木)中に参加証メールをお送りし
  ます。
▼応募規約
  ・当選者の登録情報は、本イベントの協賛企業へ提供されます。
    ※本イベントの協賛企業については、こちらをご覧ください。
    http://www.seshop.com/event/enq/uml/ 
  ・本キャンペーンで収集した当選者以外の登録情報に関しては、協賛企業へ
    の提供および、本イベントの事務局連絡以外利用しません。
  ・書籍(リアルタイムUMLワークショップ)は付きません。
  ・キャンペーンの内容は、予告なく変更される場合があります。
  ・ご応募は、お一人様一回限りとさせていただきます。複数のご応募は無効
    となりますので、あらかじめご了承ください。
  ・応募時のメールアドレスに不備がある場合は、応募が無効になる場合があ
    る他、参加証がお送りできない場合がございますのでご注意ください。
  ・発送方法につきましては、メールにて参加証をお送りします。
  ・応募後に、メールアドレスの変更、ドメイン指定受信を設定されますと、
    当選のご連絡をお送りすることができませんのでご注意ください。
  ・ハガキ、FAXでのご応募はお受けしておりませんので、ご了承ください。
  ・当選発表は、参加証メールの配信をもってかえさせていただきます。
▼お問合せ先
  Developers Summit 運営事務局 (土日、祝祭日を除く11:00〜18:00)
  E-mail:devinfo@shoeisha.co.jp

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━
■
┗【プログラミング】IzPackで作るクロスプラットフォームインストーラ [9](最終回)

こんにちは、村上です。
前回は、IzPackで作成したjarファイルをラップしたexeファイルの作成につい
て説明しました。今回はカスタムアクションという機能を使ってWindowsのレジ
ストリにアクセスする方法を紹介します。また、レジストリへのアクセスを利
用して環境変数を設定する方法を紹介します。

● カスタムアクション
IzPackにはカスタムアクションと呼ばれる機能があります。カスタムアクショ
ンは、インストーラ作成時、インストール実行時、アンインストール実行時に
指定したJavaのクラスを呼び出す機能です。この機能を利用することで、イン
スール実行の動作をカスタマイズすることができます。
カスタムアクションのJavaクラスは呼び出されるタイミングに応じて下記のイ
ンタフェースを実装する必要があります。
 * インストーラ作成時     : com.izforge.izpack.event.CompilerListener
 * インストール実行時     : com.izforge.izpack.event.InstallerListener
 * アンインストール実行時 : com.izforge.izpack.event.UninstallerListener

● RegistryInstallerListener
IzPackにはRegistryInstallerListenerというWindowsのレジストリにアクセス
するためのInstallerListenerの実装クラスが用意されています。
RegistryInstallerListenerを利用するためには下記の内容をinstall.xmlに追
記します。要素linstenerでカスタムアクションの実装クラスを指定します。下
記の例では属性installerと属性uninstallerにRegistryInstallerListenerを指
定しています。この指定でインスール時とアンインストール時に
RegistryInstallerListenerが呼び出されます。また、ネイティブリソースとし
てCOIOSHelper.dllを指定します。これはRegistryInstallerListenerはJNIを使
用してレジストリにアクセスするためです。

--- install.xml(変更部分のみ抜粋) ---

    <native type="3rdparty" name="COIOSHelper.dll" stage="both">
        <os family="windows"/>
    </native>

    <listeners>
        <listener installer="RegistryInstallerListener"
            uninstaller="RegistryUninstallerListener" >
            <os family="windows"/>
        </listener>
    </listeners>

------

上記の修正をinstall.xmlに加えてinstall.jarを作成して実行してみてくださ
い。その後で、Windowsのコントロールパネルの「プログラムの追加と削除」を
確認してみてください。現在インストールされているソフトウエア一覧に
Apache Ant 1.7.1が追加されています。上記の設定だけで「プログラムの追加
と削除」からアンインストールができるようになります。これによりレジスト
リへのアクセスが行われていることが確認できます。

● RegistrySpec.xml
「プログラムの追加と削除」の現在インストールされているソフトウエア一覧
にインストールしたアプリケーションを追加する以外の機能が必要な場合は
RegistrySpec.xmlを作成します。RegistrySpec.xmlにはレジストリに登録され
る値を定義します。
RegistrySpec.xmlはルート要素registryの配下の要素packを定義します。要素
packの属性nameにはinstall.xmlに定義した要素packの属性nameと同じ値を設定
します。install.xml内の同じ名前のpackがインストールされた場合に
RegistrySpec.xmlのpackの子要素で定義された値がレジストリに登録されます。
レジストリに登録するエントリーは要素value定義します。属性nameでレジスト
リでの名前を指定します。属性stringでレジストリの値を指定します。属性root
にはキーのルートを指定します。HKCR、HKCU、HKLM、HKU、HKPD、HKCC、HKDDS
のいずれかを指定しなくてはいけません。keypathには属性rootで指定したシン
ボルからのレジストリキーのパスを指定します。
下記のRegistrySpec.xmlはインストールを実行したユーザの環境変数とシステ
ム環境変数に環境変数ANT_HOMEを設定し、環境変数PATHの最後に
%ANT_HOME%\binを追加する定義です。

--- RegistrySpec.xml ---

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<registry>
    <pack name="Ant Script and Library">
                <value name="ANT_HOME"
                       keypath="Environment"
                       root="HKCU"
                       string="$INSTALL_PATH"/>
                <value name="PATH"
                       keypath="Environment"
                       root="HKCU"
                       string="$OLD_KEY_VALUE;%ANT_HOME%\bin"/>
                <value name="ANT_HOME"
                       keypath="SYSTEM\CurrentControlSet\Control\Session
Manager\Environment"
                       root="HKLM"
                       string="$INSTALL_PATH"/>
                <value name="PATH"
                       keypath="SYSTEM\CurrentControlSet\Control\Session
Manager\Environment"
                       root="HKLM"
                       string="$OLD_KEY_VALUE;%ANT_HOME%\bin"/>
    </pack>
</registry>

------

作成したRegistrySpec.xmlをリソースに含めるために下記のようにintall.xml
に追記します。

--- install.xml(変更部分のみ抜粋) ---

    <resources>
        ....
        <res src="RegistrySpec.xml" id="RegistrySpec.xml"/>
    </resources>

------

上記の修正を行いinstall.jarを作成して実行してみてください。インストール
を実行したユーザの環境変数とシステム環境変数に環境変数ANT_HOMEが追加さ
れ、環境変数PATHの最後に%ANT_HOME%\binが追加されています。

● まとめ
今回は、IzPackのカスタムアクションでWindowsのレジストリにアクセスする方
法を紹介しました。カスタムアクションには今回紹介した
RegistryInstallerListener以外にもAntを実行する
AntActionInstallerListener、AntActionUninstallerListenerやスクリプトを
実行するためのBSFInstallerListener、BSFUninstallerListenerが用意されて
います。IzPackの標準機能だけでは難しい処理などインストーラのカスタマイ
ズが必要な場合にはぜひカスタムアクションを使用してみてください。(村上)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━
■
┗【プログラミング】ドキュメント指向データベースMongoDB [4]

こんにちは、ursmです。

前回はドキュメントに対する単純な(完全一致の)クエリをご紹介しました。今
回はさらに複雑なクエリ表現を見ていきましょう。

完全一致でドキュメントを検索するには、find({プロパティ: 値})という形式
を使うのでしたね。例えば、x == 1となるドキュメントを検索するには以下の
ようにします:
> db.foo.find({x: 1})

これに対し、高度なクエリにはfind({プロパティ: {オペレータ: 値}})という
形式を用います。以下に主なオペレータと使い方を挙げます。

● $lt, $lte, $gt, $gte
プロパティの大小比較を行います。

> db.foo.find({x: {$gt: 5}})
xが5より大きいドキュメント

> db.foo.find({x: {$gte: 3, $lt: 6}})
xが3以上6未満のドキュメント

● $ne
プロパティが「等しくない」ことを表すオペレータです。

> db.foo.find({x: {$ne: 3}})
xが3でないドキュメント

● $in, $nin
プロパティが複数の値のいずれかに含まれるかを調べます。SQLのIN句に相当す
るものです。

> db.foo.find({x: {$in: [1, 3, 5]}})
xが1または3または5のドキュメント

> db.foo.find({str: {$nin: ['foo', /r$/]}})
strが'foo'に一致せず、末尾が'r'でもないドキュメント

● $all
配列プロパティが指定した値すべてを含んでいるかを調べます。

> db.foo.find({ary: {$all: [2, 4]}})
aryが2と4を両方含んでいるドキュメント

● $size
配列プロパティの要素数を調べます。

> db.foo.find({ary: {$size: 1}})
aryが1つの要素を含んでいるドキュメント

● $exists
プロパティが存在するかを調べます。

> db.foo.find({x: {$exists: true}})
xが存在するドキュメント

> db.foo.find({y: {$exists: false}})
yが存在しないドキュメント

● $elemMatch
配列プロパティの個々の要素について、指定した条件にマッチするかを調べま
す。

> db.foo.find({objs: {$elemMatch: {x: 1, y: 2}}})
objsの中にxが1かつyが2のオブジェクトがあるドキュメント

少々わかりにくいですが、例えば以下のようなドキュメントがヒットします。

{objs: [{x: 1, y: 2, z: 3}]}

$elemMatchを使わずに直接比較しても良さそうな気がしますが・・・

> db.foo.find({objs: {x: 1, y: 2}})

これではダメです。オブジェクトの完全一致になってしまうので、xとy以外の
プロパティが存在するドキュメントにヒットしなくなります。

では次のクエリはどうでしょうか。

> db.foo.find({'objs.x': 1, 'objs.y': 2})

一見良さそうですが、これもダメです。例えば、以下のドキュメントがヒット
してしまいます。

{objs: [{x: 1, y:3}, {x: 0, y: 2}]}

これは、objsについて「xが1の要素はあるか」「yが2の要素はあるか」がばら
ばらにチェックされるためです。

● $where
JavaScriptコードで直接比較条件を書きます。

> db.foo.find({$where: function() { return this.x >= 5 && this.x <= 10 }})
xが5以上10以下のドキュメント

とても柔軟な条件が指定できる反面、パフォーマンスは落ちます。組み込みの
クエリ構文で表現できない場合に限って使うのがいいでしょう。

● まとめ
MongoDBのちょっと高度なクエリ機能をご紹介しました。次回はドキュメントの
更新の予定です。(id:ursm)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人のナガタユウコです。私事で恐縮なのですが、このたび、
け、け、結婚しました><それに伴い名字が変わったのですが、オブジェクト
倶楽部の活動ではこれからも"ナガタ"ユウコを使っていきたいと思いますので
今後ともどうぞよろしくお願いします!(ナガタユウコ)

*** オブラブスタッフ自己紹介 ***
No.11 かくたに
( @kakutani, http://kakutani.com/ )
こんにちは。かくたにです。
オブジェクト倶楽部との関わりは、第1回のイベントから何らかのかたちで欠か
さず関わっています。いちばん新しいところで今年始めのいわゆる「アレグザ
ンダー祭り」を共同プロデュースしました。メルマガも読者になって久しいで
すね・・・。
普段はRubyやアジャイル開発に関係があったりなかったりする仕事に携わって
います。そういえば、私が生まれてはじめてライトニングトーク(LT)をしたの
もオブラブイベントでした。次のオブラブ夏イベントでもライトニングトーク
スはあると思うので、LT未経験の方はオブラブイベントでLTデビューというの
はいかがでしょうか。(かくたに)

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