Apache Derby と JRuby on Rails を使った迅速なプロトタイピング

Ruby on Rails を使うことで、データ駆動型 Web サイトを以前よりも迅速に開発できるようになりました。また JRuby プロジェクトによって、Ruby はこれまでにないほど高速かつスケーラブルになりつつあります。Java™ 仮想マシンで Rails を実行することによる大きなメリットの 1 つは、他の Java ライブラリー (Apache Derby 組み込みデータベースなど) を活用できることです。Derby と JRuby、そして Rails を組み合わせることで、動的な Web アプリケーションのプロトタイピングを迅速に行えるようになります。これらの技術を組み合わせて使う方法を学び、次に皆さんが素晴らしいアイデアをプロトタイピングする際に活用しましょう。

Michael Galpin, Software architect, eBay

Galpin Michael photoMichael Galpin は、1998年以来、プロとして Java ソフトウェアを開発してきています。彼は現在 eBay に勤務しています。彼は California Institute of Technology で数学の学位を取得しています。



2008年 8月 26日

システム要件

この記事では、迅速な Web 開発を実現するために、いくつかの最先端技術を使います。これらの技術へのリンクはすべて「参考文献」セクションに挙げてあります。ここでは JRuby V1.1.3 と Apache Derby を使っています。これらは Java ベースの技術であり、JDK (Java Development Kit) V1.4 以上を必要とします。Apache Derby は JDK V1.6 とバンドルされているため、V1.6 JDK を使うように強くお勧めします。V1.4 または 1.5 VM を使用する場合には Derby を別にダウンロードします。この記事では JDK V1.5.0_13 と組み合わせて V10.4.1.3 を使用しました。またこの記事では Rails V2.1 も使っています。この記事を最大限に活用するためには Ruby と Ruby on Rails の知識があることが前提となります。


セットアップ

最近の多くの Web アプリケーション・フレームワークでは開発者の生産性が強調されています。開発者の時間は貴重なため、これは良いことなのですが、見逃されがちな項目の 1 つにセットアップの時間があります。セットアップの時間には、クリーンなマシンを開発者がコードの作成や実行を行えるマシンにするまでにどれほど複雑な作業が伴うか、という要素も含まれます。これは家で遊び半分に新しい技術をいじり回している開発者にとって重要なだけではなく、頻繁に新しい開発者を雇用し、そうした投資に対する回収を早めようとする組織にとっても重要です。この面で Rails は他のフレームワークよりも優れています。そして JRuby と Derby を組み合わせることによって、それが一層優れたものになります。

JRuby のインストール

ここでは V1.6 JDK がインストールされているものとします。JRuby は JDK がどこにインストールされているかを知る必要があるため、一般的な規約に従って、JDK がインストールされている場所を指す JAVA_HOME という環境変数を探します。またパスに $JAVA_HOME/bin が含まれていることを確認する必要があります。そうすると、後は JRuby をダウンロードして適当な場所に解凍するだけです。この場所 (JRUBY_HOME と呼ぶことにします) に対する環境変数を作成し、そしてパスに $JRUBY_HOME/bin を置くようにお勧めします。JRuby に関して必要なことはこれだけです。では Rails に関してはどうでしょう。

Rails のインストール

JRuby はネイティブ・コードの代わりに 100 パーセント Java を使って Ruby を実装したものです。Ruby にあるものはすべて JRuby に含まれており、その中には gem も含まれています。Rails をインストールするためには、単純に gem を使います (リスト 1)。

リスト 1. gem を使って Rails をインストールする
$jruby -S gem install rails
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activesupport-2.1.0
Successfully installed activerecord-2.1.0
Successfully installed actionpack-2.1.0
Successfully installed actionmailer-2.1.0
Successfully installed activeresource-2.1.0
Successfully installed rails-2.1.0
6 gems installed
Installing ri documentation for activesupport-2.1.0...
Installing ri documentation for activerecord-2.1.0...
Installing ri documentation for actionpack-2.1.0...
Installing ri documentation for actionmailer-2.1.0...
Installing ri documentation for activeresource-2.1.0...
Installing RDoc documentation for activesupport-2.1.0...
Installing RDoc documentation for activerecord-2.1.0...
Installing RDoc documentation for actionpack-2.1.0...
Installing RDoc documentation for actionmailer-2.1.0...
Installing RDoc documentation for activeresource-2.1.0...

JRuby を使う場合とネイティブの Ruby を使う場合で唯一実際に違うところは、gem コマンドの前に JRuby -S が付くことだけであることに注目してください。JRuby -S は $JRUBY_HOME/bin ディレクトリーの中にあるスクリプトを探すように JRuby に命令しているにすぎません。こうすることによって、JRuby の gem スクリプトを確実に取得することができます。

JRuby が既存の gem リポジトリーを使う (つまり gem リポジトリーを (ネイティブの) Ruby システムと共有する) ようにすることもできます。そのために必要なことは環境変数を設定することだけです。しかしこの方法はお勧めできません。大部分の gem は Ruby で作成されており、JRuby と互換性がありますが、一部の gem は C++ で作成されており、それらは JRuby とは互換性がないからです。同様に、JRuby の gem の一部は Java 言語で作成されており、ネイティブの Ruby と互換性がありません。

上記のコマンドを実行すると、しばらく時間がかかりますが、この時間は主にネットワーク接続のスピードに依存します。Rails には WEBrick という Web サーバーが付属しています。このサーバーは、とても実動に使える品質の Web サーバーではありませんが、迅速なプロトタイピングや開発には最適です。これで、あとはデータベース、つまり Apache Derby が必要なだけです。


Apache Derby のインストール

Rails では、データベース・アクセスの処理と、データベース・テーブルと Ruby のオブジェクト・モデルとの間でのオブジェクト・リレーショナル・マッピングの処理に関して、ActiveRecord ライブラリーを使います。この点は、Ruby ではなく JRuby を使うことで少し違いが生ずる部分の 1 つです。Java 言語の場合にはデータベースとの通信用に JDBC (Java Database Connectivity) API があるので、この JDBC API を Rails で活用したいと思います。そこで、ActiveRecord で JDBC を使えるようにするために追加の gem が必要です。この gem にはデータベース特有の情報も含まれるため、Derby 専用の gem をインストールする必要があります。

リスト 2. Derby 用に ActiveRecord-JDBC 用の gem をインストールする
$jruby -S gem install activerecord-jdbcderby-adapter
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
Successfully installed activerecord-jdbc-adapter-0.8.2
Successfully installed jdbc-derby-10.3.2.1
Successfully installed activerecord-jdbcderby-adapter-0.8.2
3 gems installed
Installing ri documentation for activerecord-jdbc-adapter-0.8.2...
Installing ri documentation for jdbc-derby-10.3.2.1...
Installing ri documentation for activerecord-jdbcderby-adapter-0.8.2...
Installing RDoc documentation for activerecord-jdbc-adapter-0.8.2...
Installing RDoc documentation for jdbc-derby-10.3.2.1...
Installing RDoc documentation for activerecord-jdbcderby-adapter-0.8.2...

皆さんが Rails のベテランであれば、上のリストがネイティブの Ruby の場合とあまり変わらないことに気付くと思います。Rails は必ずデータベース専用のアダプターを必要とします。しかし Rails には、MySQL 用と PostgreSQL 用、そして SQLite 用のアダプターがバンドルされています。もし別のタイプのデータベース (Oracle や IBM® DB2® など) を使ったことがある場合には、上と同じようなことをしているはずです。

先ほど触れたように、JDK V1.6 には Derby が既にバンドルされており、いつでもコードを作成できる (あるいはコードを生成できる) 状態になっています。JDK V1.5 または V1.4 を使っている場合には、さらにいくつかのステップが必要です。つまり Derby をダウンロードして解凍し、そして derby.jar を見つけ、それを $JRUBY_HOME/lib にコピーする必要があります。そうすると JDK V1.6 を使っている人に追いついたことになり、先に進むことができます。


アプリケーションを作成する

「Convention over Configuration (設定より規約)」という表現は実際には Ruby on Rails から生まれたものであり、Convention over Configuration によってアプリケーションの作成が非常に容易になります。これは JRuby を使った場合もまったく同じです。Rails の生成プログラムを使うことで、アプリケーション・スタブを迅速に作成することができます。

リスト 3. アプリケーションを生成する
>rails deadly -d sqlite3
      exists  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  config/initializers
      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/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
      ...

出力の大部分は、どれも典型的な Rails の出力なので削除してあります。1 つ気付く点として、-d sqlite3 というオプションが指定されており、これによって生成プログラムのスクリプトに対して、データベースとして SQLite を使うように指示されます。SQLite は Derby と同じような組み込みのデータベースであり、Rails V2.0 以上に含まれているため、ここでは「安全な」オプションとなっています。次のセクションでは Derby の構成をセットアップします。他の Rails アプリケーションの場合とまったく同じように、このアプリケーションを起動します。

リスト 4. アプリケーションを起動する
=> Booting WEBrick...
JRuby limited openssl loaded. gem install jruby-openssl for full support.
http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2008-07-25 17:18:31] INFO  WEBrick 1.3.1
[2008-07-25 17:18:31] INFO  ruby 1.8.6 (2008-05-30) [java]
[2008-07-25 17:18:31] INFO  WEBrick::HTTPServer#start: pid=363524275 port=3000

そして他の Rails アプリケーションの場合とまったく同じように、http://localhost:3000 にアクセスしてブラウザーにアプリケーションを表示します (図 1)。

図 1. Rails アプリケーションを実行する
Rails アプリケーションを実行する

これらはすべて、Rails では標準的なものです。このウェルカム画面にも表示されているように、データベースをセットアップし、アプリケーションに何かを追加できるようにする必要があります。もちろん、ここで Derby を使うことを指定します。リスト 5 は Rails 用の Derby の構成内容を示しています。

リスト 5. database.yml
development:
  adapter: jdbc
  driver: org.apache.derby.jdbc.ClientDriver
  url: jdbc:derby://localhost/deadly_development;create=true
  username: app
  password: app
  
test:
  adapter: jdbc
  driver: org.apache.derby.jdbc.ClientDriver
  url: jdbc:derby://localhost/deadly_test;create=true
  username: app
  password: app
  
production:
  adapter: jdbc
  driver: org.apache.derby.jdbc.ClientDriver
  url: jdbc:derby://localhost/deadly_production;create=true
  username: app
  password: app

この構成に関して、いくつかのことに注目する必要があります。まず、このアダプターは単なる JDBC です。通常、ここでは (MySQL や Derby など) データベース専用のアダプターを指定します。しかしこの場合には JDBC ベースのアダプターを使います。そして URL では、Derby を使うことを指定しており、さらに create=true パラメーターに注目すると、このパラメーターによって、まだデータベースが存在していなければ作成するように Derby に命令します。最後に、username と password に注目してください。これらは単に Derby でのデフォルトになっています。これでデータベース接続を構成できたので、今度は少しばかりコードを作成する必要があります。いや実を言うと、Rails にコードを作成させる必要があるのです。


scaffolding

今までに Rails を使ったことがある人であれば、Rails の scaffolding を使ったことがあるか、あるいは少なくとも scaffolding が実際に使われているところを見たことがあるはずです。人々が Rails に関して「あっと驚く」主な要素がおそらく scaffolding であり、Rails が他の無数のフレームワークに採用され、コピーされている理由もそこにあります。Rails のほとんどのエキスパートは即座に、scaffolding は実稼働用の機能として使われることを意図したものではないと言うと思いますが、プロトタイピングに scaffolding が役立つことには間違いありません。scaffolding は長年にわたって進化してきており、特に Rails V2.0 では進化しています。では、リスト 6 で使用している生成コマンドを見てみましょう。

リスト 6. scaffolding を生成する
>script/generate scaffold boat name:string captain:string crew:integer capacity:integer
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/boats
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      exists  public/stylesheets/
      create  app/views/boats/index.html.erb
      create  app/views/boats/show.html.erb
      create  app/views/boats/new.html.erb
      create  app/views/boats/edit.html.erb
      create  app/views/layouts/boats.html.erb
      create  public/stylesheets/scaffold.css
      create  app/controllers/boats_controller.rb
      create  test/functional/boats_controller_test.rb
      create  app/helpers/boats_helper.rb
       route  map.resources :boats
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/boat.rb
      create    test/unit/boat_test.rb
      create    test/fixtures/boats.yml
      create    db/migrate
      create    db/migrate/20080727053100_create_boats.rb

このコマンドによって ActiveRecord モデル (適切なルーティングがマッピングされたコントローラー) と、いくつかのビュー・テンプレートが生成されます。また、コマンドに指定されているパラメーター (モデルの属性に対応する名前と値のペア、そしてこれらの属性の型) に基づいて、データベースをマイグレーションするための最初のスクリプトも作成されます。データベースを作成するには、Rake を使ってデータベースのマイグレーションを実行するだけです (リスト 7)。

リスト 7. Rake を使ってデータベース・テーブルを作成する
>rake db:migrate
(in /Users/michael/code/aptana/workspace/deadly)
== 20080727053100 CreateBoats: migrating ======================================
-- create_table(:boats)
   -> 0.0395s
   -> 0 rows
== 20080727053100 CreateBoats: migrated (0.0407s) =============================

データベースと boats テーブルは、ご覧のとおり一度に作成されます。データベース・サーバーを起動する必要がなかったことに注目してください。JDBC ドライバーは Derby に接続しようとする場合、Derby を起動してデータベースを作成してから、スクリプトによってテーブルを作成します。これは単にメモリー内に作成される一時的なデータベースではなく、ディスク上に永続化されます。アプリケーションを再度起動すると、テーブルが作成されています。http://localhost:3000/boats にアクセスすると、図 2 のようなものが表示されるはずです。

図 2. boats (船) 用の scaffolding
boats (船) 用の scaffolding

この画面からあちこちをクリックして何隻かの船の情報を作成すると、そのすべての情報は Derby データベースに保存されます。サーバーを停止して再起動したり、マシンをリブートしたり、その他何でも試してみてください。再度サーバーを起動すると、作成されたデータはすべて残っています。scaffolding は得体の知れないもののように思われがちですが、そんなことはなく、ほとんどは単に生成されたコードにすぎず、修正が可能なのです。次に、scaffolding のコードを変更する簡単な例を見てみましょう。


カスタムの scaffolding

プロトタイピングは多くのアジャイル開発手法に非常に適しています。プロトタイピングを利用することで何かを素早く作成して実行させることができ、そしてプロダクト・マネージャーやユーザーなどから即座にフィードバックを得ることができます。例えば scaffolding ベースのプロトタイプをプロダクト・マネージャーに渡すと、プロダクト・マネージャーはそのアプリケーションをさまざまに調べることができます。彼らがプロトタイプをしばらく使った後に何隻かの船を追加すると、http://localhost:3000/boats は図 3 のような表示になります。

図 3. テスト・データを持つ、boats 用の scaffolding
テスト・データを持つ、boats 用の scaffolding

リスト 8 は BoatsController クラスの index メソッドを示しています。

リスト 8. index メソッド
class BoatsController < ApplicationController
  # GET /boats
  # GET /boats.xml
  def index
    @boats = Boat.find(:all, :order => "capacity DESC")

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @boats }
    end
  end
end

実際にはさらに 5 つのメソッド (showneweditcreateupdate、そして destroy) がありますが、それらのメソッドを変更する必要はありませんでした。実際のところ、ここで変更したのは index メソッドの最初の行 (find クエリー) のみです。元々は単に Boat.find(:all) でしたが、ここでは order 節を追加しています。この変更を行ってブラウザーの表示を更新すると、この変更が表示されます (図 4)。

図 4. 定員 (capacity) の順に並べた船のリスト
定員 (capacity) の順に並べた船のリスト

もちろん、他にも多くのカスタマイズが可能です。例えばユーザーがソートの基準の選択やルック・アンド・フィールの変更を行えるようにすることなどもできます。重要なポイントは、scaffolding コードがプロトタイピングそのものに有用なばかりではなく、フィードバックを行えるように scaffolding コードを変更することも容易だということです。とはいえ、scaffolding に適するものは限られます。場合によると、scaffolding を元に作られたものではない、さまざまなモデルやコントローラーをプロトタイピングする必要があります。幸い Rails には、そうした場合にも役立つ、他の生成プログラムも用意されています。


他の生成プログラム

例えば、ある船 (boat) の漁獲高 (catch) を表す catch モデルを作成したいとしましょう。boat と catch の間には 1 対多の関係があります。この新しいモデルに対して、別の生成プログラムを使って作業を始めることにします (リスト 9)。

リスト 9. catch モデルを生成する
>script/generate model catch quantity:integer
      exists  app/models/
      exists  test/unit/
      exists  test/fixtures/
      create  app/models/catch.rb
      create  test/unit/catch_test.rb
      create  test/fixtures/catches.yml
      exists  db/migrate
      create  db/migrate/20080727060346_create_catches.rb

生成コマンドの中で、quantity 属性 (列) のみを指定していることに注目してください。関係を追加するためには、少しばかり手動による編集を行う必要があります。まず、さきほど生成したマイグレーション・スクリプトを変更します。

リスト 10. CreateCatches マイグレーション・スクリプト
class CreateCatches < ActiveRecord::Migration
  def self.up
    create_table :catches do |t|
      t.integer :quantity
      t.integer :boat_id
      
      t.timestamps
    end
  end

  def self.down
    drop_table :catches
  end
end

ここで追加した boat_id を除いて、ここにあるものはすべて生成されたものです。今度は Rakes を使ってこのマイグレーションを実行します (リスト 11)。

リスト 11. Rake を使って catches テーブルを作成する
>rake db:migrate
(in /Users/michael/code/aptana/workspace/deadly)
== 20080727060346 CreateCatches: migrating ====================================
-- create_table(:catches)
   -> 0.0291s
   -> 0 rows
== 20080727060346 CreateCatches: migrated (0.0299s) ===========================

ここで、モデルを変更する必要があります。Boat モデルを開き、このモデルに 1 行のコードを追加します (リスト 12)。

リスト 12. Boat モデル
class Boat < ActiveRecord::Base
  has_many :catches
end

このクラスはデフォルトで空ですが、これは Rails がデータベースにあるテーブルのメタデータに基づいてこのクラスの属性を推論するからです。そこで単純にメタプログラミング・コマンドを追加し、1 隻の boat に多くの catch があることを示します。同様に、catch モデルを変更して boat と catch の関係を完成させます (リスト 13)。

リスト 13. Catch モデル
class Catch < ActiveRecord::Base
  belongs_to :boat
end

この場合も、単純にメタプログラミング・コマンドを追加し、catch が boat に属することを示します。boat_id を使って catch が boat に属することを示す際には、Rails の命名規約に従っています。今度は新しいコントローラーを作成します。

リスト 14. DeliveryController
class DeliveryController < ApplicationController
  def index
    @boats = Boat.find :all
    @catch = Catch.new
    respond_to do |format|
      format.html
    end
  end
  
  def record
    @catch = Catch.new(params[:catch])
    
    respond_to do |format|
      if @catch.save
        flash[:notice] = 'Delivery recorded successfully'
        format.html { redirect_to :action => "list"}
      end
    end
  end
  
  def list
    catches = Catch.find(:all)
    @totals = {}
    catches.each{|catch|
      if @totals[catch.boat]
        @totals[catch.boat] += catch.quantity
      else
        @totals[catch.boat] = catch.quantity
      end
    }
    @totals = @totals.sort {|a,b| b[1] <=> a[1]}
    respond_to do |format|
      format.html
    end   
  end
end

このコントローラーは 3 つのアクションを定義しています。その 1 つは index アクションであり、ユーザーが /delivery (Rails のルーティング規約によって /delivery は DeliveryController クラスにマッピングされます) を要求した場合のデフォルトです。この場合には、ビューの中で使えるように最初にすべての boat を取得する、という少し余分な作業を行います。

リスト 15. デフォルトの delivery ビュー
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
"http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; 
charset=iso-8859-1" />
        <title>Record a Delivery</title>
    </head>
    <body>
        <h1>Record a Delivery</h1>
        <% form_for @catch, :url => { :action => "record" } do |f| %>
          <%= f.error_messages %>
        
          <p>
            <%= f.label :quantity %>
            <%= f.text_field :quantity %>
          </p>
          <p>
                  <%= f.label :boat %>
                  <%= select("catch", "boat_id", @boats.collect{|b| [b.name, b.id] }, 
{ :include_blank => true })%>
          </p>
          <p>
            <%= f.submit "Record" %>
          </p>
        <% end %>    
    </body>
</html>

このコードは scaffolding を使うことで生成されるコードに似ていますが、それは迅速なプロトタイピングを行える Rails の機能を活用しているからです。例えば、ActionView クラスの form_for API を利用することで FormHelper オブジェクトを使います。ここでは、生成されるコードには見られないものをいくつか使っています。第 1 に、record メソッド (リスト 14) を呼び出すフォームのアクション URL を設定しています。このメソッドについてはこの後すぐに説明します。次に、select ヘルパーを使って、オプション値を持つ HTML のカスタム select タグを作成しています。また DeliveryController クラス (リスト 14) の index メソッドの中で取得した boats を使っています。そして少しばかり Ruby のイディオムを使って配列のコレクションを作成しています。各配列には boat の名前と ID があり、これらの名前や ID は、生成される HTML の中のオプションのラベルと値になります。Ruby の表現力の豊かさを示すこのコードは、コントローラーの中に入れることもできましたが、この表現力の豊かさこそが、Ruby を迅速なプロトタイピングと開発に非常に適したものにしている要素の 1 つなのです。

リスト 15 のフォームは、リスト 14 の DeliveryController クラスの record アクションに送信されます。この record メソッドでは、単に新しい Catch インスタンスが作成され、保存されます。そしてこのインスタンスを同じくリスト 14 の list アクションに転送します。この list アクションはデータベースに対してクエリーを実行し、すべての Catch レコードを取得します。そしてこれらのレコードを集約し、データベースの中の各 boat に対する catch の合計を計算します。この計算をカスタムのクエリーを使って行うこともできます。こうして集約された結果はソートされ、2 つの要素からなる配列 (第 1 の要素は Boat オブジェクト、第 2 の要素はその boat の catch の合計) に格納されます。そしてリスト 16 に示すビューに渡されます。

リスト 16. list ビュー
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
        <title>List Totals</title>
    </head>
    <body>
        <h1>Totals</h1>
        
        <table>
          <tr>
            <th>Boat</th>
            <th>Total</th>
          </tr>
        
        <% for total in @totals %>
          <tr>
            <td><%=h total[0].name %></td>
            <td><%=h total[1] %></td>
          </tr>
        <% end %>
        </table>
        
        <br />
        <%= link_to 'Add catch', :action => "index" %>
    </body>
</html>

これらはすべて、すべての船とそれぞれの合計漁獲高の表を作成するための、きわめて標準的な Rails のテンプレート動作です。最後にもう 1 つのヘルパーを使って、ユーザーの index アクションに対するリンク・バックを作成しています。これで、ミニ・アプリケーションのプロトタイプが完成しました。アプリケーションに関してはこれで終わりですが、もう 1 つ追加で説明しておくことがあります。それは JRuby と Derby を IDE と組み合わせて使う場合の簡単な注意事項です。


IDE のサポート

多くの開発者にとって、迅速なプロトタイピングと開発と言えば IDE を使うことを意味します。Ruby 用に IDE を作成するのは容易ではなく、それは JRuby の場合も同じです。しかし Eclipse ベースの RadRails など、いくつかの優れた IDE があります。この素晴らしいツールについては他の記事で解説されていますが (「参考文献」を参照)、JRuby と Derby と組み合わせて使う場合には少し注意が必要です。RadRails を始めとするほとんどの IDE では、その IDE のデバッガーを Ruby の VM にフックできるように、Ruby のデバッグ用の gem が必要です。これらの gem は、C++ で作成されているネイティブの gem であるため、JRuby で使うことは (まだ) できません。代わりに Java バージョンの gem を作成する必要がありますが、幸いなことに、この非常に重要な gem を作成するための作業は既に終わっています。Java ベースの 1 つの gem を直接ダウンロードし、2、3 種類ある他の標準的な Ruby ベースの gem の中にインストールする必要があります。このプロセスは以下のとおりです。

リスト 17. JRuby にデバッグのサポートを追加する
$jruby -S gem instal -l ruby-debug-base-0.10.1-java.gem 
Successfully installed ruby-debug-base-0.10.1-java
1 gem installed
Installing ri documentation for ruby-debug-base-0.10.1-java...
Couldn't find file to include: 'VERSION'
Installing RDoc documentation for ruby-debug-base-0.10.1-java...
Couldn't find file to include: 'VERSION'
$ jruby -S gem install --ignore-dependencies -v 0.10.1 ruby-debug
Successfully installed ruby-debug-base-0.10.1-java
1 gem installed
Installing ri documentation for ruby-debug-base-0.10.1-java...
Couldn't find file to include: 'VERSION'
Installing RDoc documentation for ruby-debug-base-0.10.1-java...
Couldn't find file to include: 'VERSION'
$ jruby -S gem install --ignore-dependencies ruby-debug-ide
Successfully installed ruby-debug-ide-0.2.0
1 gem installed

Ruby の標準的なデバッグ用 gem を利用した任意の IDE から、容易にブレークポイントの追加やアプリケーションのデバッグを行うことができます。また、そのデバッガーを使って Rails コードの一部をステップ実行することで、その魔法の一部をより適確に理解することができます。


まとめ

この記事では、JRuby と Rails、そして Apache Derby を組み合わせることによって、迅速なプロトタイピングと開発のための完璧な環境を作り出せることを説明しました。Rails を利用することで、生成プログラムを使ってボイラープレート・コードを作成することができ、あるいはカスタマイズしたアプリケーションを、ほとんど手間をかけずに作成することもできます。また JRuby と Derby を利用することによってトランザクション型の永続データベースをアプリケーションに組み込むことができ、そうすればアプリケーションが実行されるとそのデータベースも必ず実行されます。これを出発点として Rails の他の機能を利用し、さらにモデルやコントローラー、ビューを追加することもできますし、Rails の Ajax ヘルパーを使うことで、アプリケーションへの Ajax の追加も容易にすることができます。また Eclipse ベースの RadRails などの IDE を使うことで、プロトタイピングと開発をさらに迅速にすることもできます。


ダウンロード

内容ファイル名サイズ
Example source codeos-ad-prototype-jruby-deadly.zip110KB

参考文献

学ぶために

製品や技術を入手するために

  • JRuby プロジェクトの Web サイトから JRuby を入手してください。
  • Java SDK V1.6 を入手してください。
  • Apache Derby を入手してください。この記事では V10.4.1.3 を使っています。
  • Ruby をダウンロードしてください。この記事では V2.1 を使っています。
  • 皆さんの次期オープンソース開発プロジェクトを IBM trial software で革新してください。ダウンロード、または DVD で入手することができます。
  • IBM 製品の試用版をダウンロードし、DB2 や Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=342523
ArticleTitle=Apache Derby と JRuby on Rails を使った迅速なプロトタイピング
publish-date=08262008