レベル: 中級 Michael Galpin, Developer, Vitria Technology
2007年 12月 18日 更新 2008年 10月 01日
この記事は、XForms と IBM DB2 pureXML、そして Ruby を一緒に使うことで容易に Web アプリケーションを作成する 4 回シリーズの第 1 回です。このシリーズでは、病院で患者の情報を管理するための、仮定のアプリケーションを作成し、XForms、DB2 pureXML、そして Ruby on Rails それぞれの技術が個々に持つ強みの一端を知ると共に、これらの技術を併せて使用する方法も学びます。シリーズ第 1 回の今回は、XForms とDB2 pureXML、そして Ruby on Rails のどれもが、XML 中心の Web アプリケーションを迅速に構築する上でいかに有効かを検証します。
2008年10月01日の更新内容: 読者および著者からのフィードバックに対応し、リスト 1 の 1 行目で XML 列を持つテーブルを作成している部分を CREATE TABLE DOC.PATIENTS から CREATE TABLE xmlmd.PATIENTS へと変更しました。
はじめに
技術の世界は常に変化しています。新しい技術が次々と生まれ、また既存の技術は常に進化しています。こうした変化の力によって、新しいパラダイムとベスト・プラクティスが生まれます。場合によると、新しい技術は既存の技術を作り直して塗り替えたもののように見えることもありますが、そうした技術によって本当に作業が楽になることがあります。この記事は 4 回シリーズの第 1 回として、いくつかの共通点を持つ 3 つの新興技術について調べます。この 3 つの技術は、いずれも困難な課題を大幅に単純化することを目的としており、純粋に理論的な観点からも興味深い技術です。まず、機能が豊富な対話型の Web アプリケーションを作成するための技術である、XForms を調べます。次に、XML 文書を管理するための、強力な IBM® DB2® pureXML 機能について調べます。最後に、この 2 つの技術を Web アプリケーションのフレームワーク Ruby on Rails を使って結合し、病院での患者情報の入力を効率化する Web アプリケーションを作成します。ただし、この記事ではセキュリティーについては説明しないことに注意してください。実稼働環境では、例えば最初にログインを要求することによって、患者がアクセス制限されたディレクトリーにアクセスすることを防ぎ、また医師や看護師のためのフォームや領域をセキュアにするなどの必要があります。
前提条件
この記事では XML と Web アプリケーションに関して全般的に慣れていることを前提としています。これまでに 3 つのコア技術 (XForms とDB2 pureXML、そして Ruby on Rails) を経験したことがあればもちろん役立ちますが、それが必須なわけではありません。この記事を執筆するにあたり、Mozilla XForms プラグインのバージョン 0.8.0.3 を使用しました。このプラグインによって、Firefox を始めとするすべての Mozilla ブラウザーで XForms ランタイムをサポートすることができます。もう 1 つ、Mozilla 用の非常に便利なプラグインが XForms Buddy です。XForms Buddy は XForms 用のデバッガーです。この記事ではバージョン 0.5.6 を使用しました。また IBM の DB2 データベース・サーバーも必要です。この記事では Windows® システムと Linux™ システム、そして UNIX® システムで使用できる DB2 Express-C バージョン 9.5 を使用しています。最後に、Ruby on Rails が必要です。この記事では Ruby 1.8.6 と Rails 1.2.5 を使用しています。ダウンロード用のリンクは「参考文献」を参照してください。
病院での XForms
病院で患者情報を管理するためのアプリケーションの場合、それまで病院の職員が収集しなければならなかったデータを、患者が入力できるようにする必要があります。ここではそのための Web アプリケーションを作成し、Web ブラウザーを実行できる任意のコンピューターを患者用のデータ入力ステーションとして使えるようにします。ここで、最初の技術的な決断をします。このアプリケーション用のユーザー・インターフェースとして、XForms を使うのです。
XForms を使うのは、最先端を行くアプリケーションをにするために、また経歴書に何か輝かしいものを載せるために、新しい技術を使っているということなのでしょうか。決してそんなことはありません。XForms は、今回のような用途に対して最適なのです。XForms を使うことで、データを単純な XML モデルで定義することができ、さらにビューを標準の HTML 要素を使って定義することができます。XML と HTML の要素間のマッピングは XForms により宣言型で行われます。これはつまり、送信された何らかの値を取得して XML 構造の中に挿入するための、クライアント・サイドのコードもサーバー・サイドのコードも作成する必要がない、ということです。それを XForms が処理してくれるのです。しかも XForms は、それをすべて非同期で行います。つまり HTML フォームでの変更は XML モデルに反映され、サーバーに送信されて同期化されます。JavaScript を作成せずに Ajax の利点を活用できるのです。
ただし XForms は、現在すべてのブラウザーで汎用的にサポートされているわけではないことに注意してください。将来はサポートされるはずですが、まだその段階には至ってはいません。そのため、プラグインをインストールして XForms のサポートを追加する必要があります。これは大量に使用されるアプリケーションを作成する場合には問題になるかもしれません。しかし、ここで作成するような特化したアプリケーションの場合には、XForms は素晴らしい力を発揮します。このアプリケーションへのアクセスに使われるコンピューターの数は限られているため、すべてのコンピューターで適切なブラウザーとプラグインの組み合わせが使われることが保証できるからです。
XForms は強力な技術として、XML を扱う際にはどんな場合にも活用することができます。XForms はクライアント・サイドの技術であるため、どのような動的アプリケーションの場合も、XForms をサポートするためのサーバー・サイドの技術が必要です。バックエンドにはデータを保持するためのデータベースが必要になります。フロントエンドでは XML を使ってデータを表現するため、バックエンドも同じようにしたら素晴らしいのではないでしょうか。DB2 を使うことで、まさにそれを実現できるのです。
DB2 9 pureXML
XML を使用するアプリケーションを開発したことがある人なら、XML データをデータベースに保持させるための一般的な 2 つの方法のうち、どちらか 1 つを使ったはずです。1 つ目の方法は、XML からリレーショナルへの何らかのマッピング技術を使う方法です。多くの場合、この技術というのは皆さん自身が作成するカスタムのアプリケーション・ロジックです。このロジックによって XML 文書からデータを抽出し、そのデータをリレーショナル・データベースのテーブルの列に書き込むのです。これはよく、シュレッディングと呼ばれています。もちろん、そのデータを後で読み出す場合は、そのデータを「アンシュレッド」して XML 文書を再構成できる必要があります。
もう 1 つの一般的な方法は、単純に XML 文書をデータベースの CLOB 列の中にダンプする方法です。この方法は基本的に、XML を巨大な文字列として扱います。そうすると、後からその文字列をデータベースから読み出し、それをパーサーに渡して元の XML 文書を再作成することができます。この方法ではシュレッディングとアンシュレッディング用のコードを作成する必要がないため、通常はこの方法の方がずっと簡単です。しかしこの方法はあまり強力ではなく、XML 文書内のデータにクエリーを実行するための効率的な方法がありません。
ここ数年、XML データベースは一般的になりつつありますが、それは XML データベースがこうした種類の問題に対応しているためです。XML データベースではデータを XML としてそのまま保管できるため、シュレッドの必要がありません。また XQuery を使って効率的に XML へのクエリーを実行できるため、XML 文書の構造が失われることはありません。この機能をサポートしたデータベースの多くは小規模で特化されたものでしたが、今や IBM の旗艦データベースである DB2 を、ネイティブ XML データベースのリストに追加できるのです。
DB2 を使用すると、XForms で使われているのと同じデータを XML としてデータベースに保管することができます。必要なデータをシュレッディングしたりマッピングしたり、あるいは構文解析したりする必要はありません。ブラウザーの中のデータの「方言」は、データベースで使われている方言と同じです。DB2 では、SQL クエリーの中で XQuery を使うことができます (SQL/XML として知られています)。そのため、XML 文書の中のどのようなデータにも容易にアクセスすることができます。例えば、患者の苗字を使って情報を取得したいとします。この情報を XML 文書内に保存し、患者の苗字に基づく情報を取得するだけのための XQuery を作成することができます。では、これが DB2 ではどのように実現されているのかを詳しく見てみましょう。
DB2 のセットアップ
今度は DB2 をセットアップし、ネイティブ XML を使用するテーブルを作成します。DB2 が他の XML データベースに比較して優れている点は、リレーショナル・データと XML データを混在させられることです。リレーショナル・データか XML データかのいずれかを選択する必要はなく、両方を一緒に使うことができます。従って、XML 文書をテーブルに直接マッピングするのではなく、列にマッピングします。テーブルの中の指定された行は、複数の XML 文書を持つことさえできます。
XML を使用する新しいテーブルは、何通りかの方法で作成することができます。最も手軽な方法は、コマンドラインを使用してコマンドを発行する方法です。リスト 1 は、1 つの XML 列を持つテーブルを作成するスクリプトを示しています。
リスト 1. XML 列を持つテーブルを作成する
CREATE TABLE XMLMD.PATIENTS (
ID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (
START with +1 INCREMENT BY +1),
INFORMATION XML NOT NULL);
|
この例では、INFORMATION 列は XML 型です。ご覧のとおり構文は非常に単純であり、integer 型または varchar 型で列を宣言する場合とほとんど変わりません。コマンドラインを使ってテーブルを作成するのを避けたければ、同じことを DB2 Command Center を使ってグラフィカルに行うこともできます。Command Center の Create Table ウィザードを使うと、テーブルを作成することができます (図 1)。
図 1. Create Table ウィザードを起動する
Create New Table をクリックするとウィザードが開始されます。すると、テーブルの名前の情報を入力するための画面が表示されます (図 2)。
図 2. テーブルに名前を付ける
テーブルに名前を付ける画面では、テーブルの名前と同時にテーブルのスキーマを指定することができます。Next をクリックすると、列を定義するインターフェースが表示されます (図 3)。
図 3. 新しいテーブルの列の定義
Add ボタンをクリックすると Add Column インターフェースが表示されます (図 4)。
図 4. Add Column インターフェース
ここで、注意が必要です。XML データを含む列を定義するためには、その列のデータ型を XML に設定する必要があります。それだけですべて終わりです。ウィザードのデータ型リストの中に既に XML が入っているため、何も特別なことをする必要はありません。データ型の設定が終わって OK をクリックすると、XML 列が定義されていることがわかるはずです (図 5)。
図 5. XML 列が追加されている
さらに列を追加したり、また主キーや外部キーを追加したりといったことも、このウィザードを使って行うことができます。それが終わって Finish をクリックすると、テーブルが作成されます。
いずれかの方法でテーブルを作成すると、SQL を使ってそのテーブルにデータを挿入することができます。SQL を作成する際には、XML を文字列として扱うことができます (リスト 2)。
リスト 2. XML を挿入する
INSERT INTO XMLMD.PATIENTS(INFORMATION)
VALUES ('<?xml version="1.0" encoding="UTF-8"?>
<Info>
<FirstName>John</FirstName>
<Age>33</Age>
<Insurer>Blue Armor</Insurer>
<ID>555-88-1212</ID>
</Info>');
|
これは単純な文字列を挿入しているように見えるかもしれませんが、心配はありません。DB2 は XML を文字列のように扱うことはありません。これはクエリーの中で日付を書く方法と非常に似ています。ある構文を持つ文字列として日付を書くことによって、データベースはそれを構文解析し、特別なデータ型として扱います。もしその構文が無ければ、そのクエリーは失敗します。XML の処理も、それと同じように動作します。また、SQL と XQuery を使って XML にクエリーを実行することもできます (リスト 3)。
リスト 3. SQL/XML クエリー
SELECT XMLQUERY('<Patients>
{for $i in $x/Info
where $i/Insurer = "Blue Armor"
return <Patient>{$i/FirstName/text()}</Patient>}
</Patients>'
passing P.INFORMATION as "x") from XMLMD.PATIENTS P;
|
SQL (SELECT ... from ...) と XQuery がどのように混在されているかに注意してください。これは SQL/XML として知られています。重要な点は、XMLQUERY という予約語を使うことで XQuery を示していることです (この XQuery は、SQL の select 文を使って渡される XML 文書に対して実行されます)。このクエリーを実行すると、リスト 4 に示す XML 文書が返されるはずです。
リスト 4. 返される XML 文書
<?xml version="1.0" encoding="UTF-16"?>
<Patients>
<Patient>John</Patient>
</Patients>
|
これで、DB2 を使って XML をそのまま保管することがいかに容易であるかがわかりました。しかし XForms で使われる XML と DB2 で使われる XML との間に、まだ何かが必要です。そのために、Ruby を使います。
DB2 での Rails
今度は、フロントエンドの XForms をバックエンドの DB2 pureXML に結びつける方法を考えます。Ruby on Rails は Web アプリケーションを素早く簡潔に作成するための強力な手段です。また Ruby on Rails によってデータベースを容易に扱うことができますが、DB2 (特に DB2 pureXML) で、Rails は動作するのでしょうか? もちろんです。そして Rails に関連する大抵のもの同様、驚くほど簡単なのです。
Ruby 用の DB2 ドライバーをインストールする
最初に必要なことは、Rails での DB2 サポートを有効にすることです。もし Rails がインストールされていれば、Ruby Gems もインストールされているはずです。もしインストールされていなければインストールする必要があります (Ruby Gems はパッケージ管理システムで、Rails に DB2 サポートなどの機能を追加するには理想的です)。インストールが終わったら、コマンド・プロンプトで >gem install ibm_db と入力します。
これにより DB2 用の Ruby ドライバーがダウンロードされます。このドライバーがインストールされると、(Rails アプリケーションだけではなく) すべての Ruby アプリケーションが DB2 をサポートするようになります。Windows を使用している場合には、どのバージョンのドライバーをインストールするかを選択するように指示されます (リスト 5)。
リスト 5. DB2 ドライバーを選択する
>gem install ibm_db
Bulk updating Gem source index for: http://gems.rubyforge.org
Select which gem to install for your platform (i386-mswin32)
1. ibm_db 0.6.0 (mswin32)
2. ibm_db 0.6.0 (ruby)
3. ibm_db 0.4.6 (ruby)
4. ibm_db 0.4.6 (mswin32)
5. Skip this gem
6. Cancel installation
|
最新バージョンのドライバーを選択する必要があるため、選択肢は 1 または 2 です。Windows インストーラーを使って Ruby をインストールした場合には 1 を選択する必要があります。これで、DB2 pureXML を使用する Rails アプリケーションを作成する準備ができました。
Rails アプリケーションを作成する
以下の説明は Rails 開発者にはおなじみのはずです。ここではリスト 6 に示すアプリケーションを作成します。
リスト 6. Rails アプリケーションを作成する
>rails xmlmd
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/breakpointer
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
|
これにより、Web アプリケーションの骨格が作成されます。今度は、DB2 に接続できるようにconfig/database.yml を編集する必要があります (リスト 7)。
リスト 7. config/database.yml を編集する
# IBM DB2 Database configuration file
# Install the IBM DB2 driver and get assistance from:
# http://www.alphaworks.ibm.com/tech/db2onrails
development:
adapter: ibm_db
database: health
username: michael
password: your_password_here
schema: xmlmd
# == remote TCP/IP connection (required when no local database catalog entry available)
# host: bigserver // fully qualified hostname or IP address
# port: 50000 // data server TCP/IP port number
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: mysql
database: xmlmd_test
username: root
password:
host: localhost
production:
adapter: mysql
database: xmlmd_production
username: root
password:
host: localhost
|
この例では development 設定のみを変更し、test 設定と production 設定はデフォルトのままにしていることに注意してください。また、adapter には ibm_db という値を設定していることにも注意してください。この ibm_db が先ほどインストールしたドライバーです。このドライバーは Rails と共にインストールされるデフォルトのドライバーの 1 つではないため、Rails はこのドライバーを認識していません。幸い、これを認識させるのは簡単で、1 つのファイルを編集すればよいだけです。Ruby がインストールされているディレクトリーに行き、ファイル /lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record.rb を開きます。RAILS_CONNECTION_ADAPTERS という行を探し、リストの最後に ibm_db を追加します (リスト 8)。
リスト 8. Rails に DB2 サポートを追加する
RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlite firebird sqlserver db2 oracle
sybase openbase frontbase ibm_db )
|
今度は XML を使用するモデルを生成します。まず Rails の生成スクリプトを使って、通常の方法でモデルを作成します (リスト 9)。
リスト 9. Rails のモデルを生成する
>ruby script\generate model doctor
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/doctor.rb
create test/unit/doctor_test.rb
create test/fixtures/doctors.yml
create db/migrate
create db/migrate/001_create_doctors.rb
|
期待したとおり、マイグレーション用のスクリプトが生成されていることに注目してください。このスクリプトを使って、XML を使用する、もう 1 つのテーブルを生成します (リスト 10)。
リスト 10. Rails のマイグレーション・スクリプト: 001_create_doctors.rb
class CreateDoctors < ActiveRecord::Migration
def self.up
create_table :doctors do |t|
t.column :profile, :xml, :null => false
end
end
def self.down
drop_table :doctors
end
end
|
これは非常に典型的な Rails のマイグレーション・スクリプトです。「profile」という、1 つの列を定義しているにすぎません。特に興味深い唯一の点といえば、列の型を xml として定義していることです。これで、データベースに接続するための、そして XML 列が含まれるテーブルを作成するための Ruby スクリプトを、Rails を使って作成できました。あとはこのスクリプトをテストすればよいだけです。
Ruby と DB2 をテストする
Ruby/DB2 pureXML スクリプトのテストは簡単に行うことができます。このテストは単なる Rails のマイグレーションであり、他の場合と何も変わりません。これを実行するためには Ruby の rake コマンドを使います (リスト 11)。
リスト 11. マイグレーション用のスクリプトを実行する
>rake db:migrate
(in /xmlmd)
== CreateDoctors: migrating ===================================================
-- create_table(:doctors)
-> 0.7840s
== CreateDoctors: migrated (0.7860s) ==========================================
|
必要なことは、これだけです。エラーのデバッグをする際には、--trace オプションを使った方がよいかもしれません。このオプションは、誤ったユーザー名やパスワード、あるいは不適切なデータベースやスキーマが指定された場合など、接続の問題を診断する際によく役に立ちます。デバッグが終われば、新しいテーブルが存在していることをDB2 を使って検証できるはずです (リスト 12)。
リスト 12. describe コマンドを実行して新しいテーブルを検証する
db2 => describe table xmlmd.doctors
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
ID SYSIBM INTEGER 4 0 No
PROFILE SYSIBM XML 0 0 No
2 record(s) selected.
|
これで、XML 列を持つ DB2 のテーブルを、Ruby on Rails を使って作成することができました。ここまで来れば、興味深いことをいくらでも、Rails を使って行うことができます。例えば、データベースに XML を挿入するために、さらにマイグレーション・スクリプトを作成することができます。Ruby を使うと XML 文書の作成が一層容易になり、しかもそうして作成した XML 文書を文字列に変換して DB2 に送信すればよいだけです。また、XML を処理するための調整を少し行うだけで、Rails の scaffold を活用することもできます。
まとめ
シリーズ第 1 回目の今回は、XML 中心の Web アプリケーションを迅速に作成する上で、XForms と DB2 pureXML、そして Ruby on Rails がいかに有効かを学びました。まず、XForms によって対話型のフロントエンドを単純に作成できることを学びました。それによって Ajax の対話性を得られる一方、そのために JavaScript やマッピングのコードを作成する必要がありません。次に、DB2 pureXML を使うことで XML の保管と XML に対するクエリーの実行がいかに容易になるかを学びました。DB2 の SQL/XML を利用することで SQL と XQuery を混在できるため、データベースの中の XML データに容易にアクセスすることができます。最後に、DB2 pureXML で動作するように Ruby on Rails をセットアップする方法を学びました。ほんのわずかな調整をいくつか行うだけで、XML 対応のテーブルを、Ruby on Rails を使って DB2 の中に作成することができました。これで技術スタックの重要部分をすべて設定できました。このシリーズの次回の記事では、XForms と DB2 pureXML、そして Ruby on Rails を使った病院用の Web アプリケーションの作成を開始します。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Part 1 sample code | part1_doctorsOffice.zip | 2KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Michael Galpin は 1998年から Web アプリケーションの開発に従事しており、California Institute of Technology で数学の学位を取得しています。現在は、カリフォルニア州サンノゼにある eBay にアーキテクトとして勤務しています。 |
記事の評価
|