cloudfoundry ( vcap ) 上で jruby...
TRANSCRIPT
CloudFoundry ( vcap ) 上でJRuby でアプリを動かす
2012/01/19 (木)
第 4 回 CloudFoundry 輪読会
原 嘉彦 ( [email protected] )
自己紹介何者? : 原 嘉彦 ( Yoshihiko Hara )
twitter → GORO_Neko
mail → [email protected]
日頃何やってるヒト? :
IT 企業で Ruby や Java で Web アプリ作ってます。 Cloudfoundry との関わりは? :
現在は完全に趣味でかかわってます。
Ruby 好きが高じて Ruby 製の PaaS 基盤CloudFoundry をいじっていたと…仕事でも使いたいなぁ...ボソボソ
アジェンダ
1. JRuby ってなに?
2. JRuby が使えると何が嬉しいの?
3. vcap 上で JRuby でアプリを動かすことは 可能なの?
4. vcap 上で JRuby で動くアプリの作り方は?
1. JRuby ってなに? (1/6) Ruby の処理系の実装のひとつ Java で実装されている → 荒っぽく言えば
「JavaVM 上で Ruby 言語のプログラムを動作させる
ソフトウェア」
Javaさえインストールされていれば、 Ruby も JRuby もインストールされていなくとも Ruby スクリプトを実行できる → プラットフォームへのインストールをせずに JRuby を
使いたい場合は「jruby-complete-x.x.x.jar」を使う
Examples of implementationName Feature Homepage
MRI ( or
Ruby or
CRuby )
•Reference implementation of the Ruby programming language
•Matz's Ruby Interpreter
•It’s made of C
http://www.ruby-lang.org/en/
JRuby •It's made of Java ( If you uses JRuby, you need Java execution environment such as JRE/JDK )
•Java Object can be called from Ruby Script ( The opposite is also possible )
•Ruby Script can be executed on GoogleAppEngine
( ex. http://code.google.com/p/appengine-jruby/ )
http://www.jruby.org/
IronRuby •Targeting Microsoft .NET framework ( and Mono ) http://ironruby.net/
Rubinius •Most is made of Ruby http://rubini.us/
And More !!
1. JRuby ってなに? (2/6)
1. JRuby ってなに? (3/6)
Rubyはinstallされていない
JRubyもinstallされていない
Javaはinstallされている
Javaで、jruby-complete-1.6.5.jar を実行させることで、Ruby(JRuby)の機能が実行される
1. JRuby ってなに? (4/6)
puts "Ruby version -> #{RUBY_VERSION}"
puts "Patch Level -> #{RUBY_PATCHLEVEL}"
puts "Description -> #{RUBY_DESCRIPTION}"
puts "Release Date -> #{RUBY_RELEASE_DATE}"
puts "Platform -> #{RUBY_PLATFORM}"
puts 'Load paths'
$LOAD_PATH.each do |i|
puts i
end
■ 以下の内容で Ruby スクリプト Info.rb を書く
1. JRuby ってなに? (5/6)※ "RUBY_VERSION" 等は Ruby の組み込み定数/変数
組み込み定数名 概容
RUBY_VERSION Ruby のバージョンを示す文字列RUBY_PATCHLEVEL Ruby のパッチレベルを示す数値RUBY_DESCRIPTION Ruby の詳細を表す文字列
※ ruby -v で表示される内容が 格納されてい
RUBY_RELEASE_DATE Ruby のリリース日を示す文字列RUBY_PLATFORM プラットフォームを示す文字列
LOAD_PATH Rubyライブラリをロードするときの検索パス
1. JRuby ってなに? (6/6)
Javaで、jruby-complete-1.6.5.jar を実行させることで、Info.rb が実行される
2. JRuby が使えると何が嬉しいの? (1/3)
RubyとJavaの両方のライブラリが使用可能 → Ruby Object から Java Object が呼べる、また
Java Object から Ruby Object が呼べる
→ JDBC で DB と接続できたり、Swing で GUI を実現したり
既存の Java ライブラリがそのまま使えたり
ネイティブスレッドに対応している → 本家 Ruby ( CRuby ) はグリーンスレッドに対応
Jruby-Rack と組み合わせると、Tomcat 等、 Java Application Server 上で動作可能なアプリを 簡単に記述できる
→ アプリのチューニングに Java アプリのノウハウが活かせる
Ruby on Rails(erb)
JavaScript(Ajax)
Ruby on Rails JDBCDB
リッチユーザインターフェイス html
画面生成 データアクセス画面制御
Java
JRuby + jruby-rack
クライアント処理 サーバ処理
Prototype.js
jQuery帳票作成
iReport/
POI
TomcatApache
某社RDB
PDF/
Excel
Web サーバ AP サーバ DB サーバ
erb:Javaで言う JSP相当
ActiveRecord-JDBC
■ JRubyを使ったシステムイメージの例
2. JRuby が使えると何が嬉しいの? (2/3)
JRuby-rack とは rack(*1) の JRuby 版 Java で実装されている ( jruby-rack-x.x.x.jar ) 以下の用なオリジナル rack にはない JRuby-rack
固有の機能がある サーブレット・フィルター GoldSpike互換サーブレット Servlet/JSPとの統合 JRuby ランタイム管理
2. JRuby が使えると何が嬉しいの? (3/3)
*1: rack とは Ruby 製のフレームワーク。 rack 準拠の Ruby 用 AP Server 上であれば、 rack を利用したアプリはどこでも動く。
3. vcap 上で JRuby でアプリを動かすことは 可能なの? (1/2) 結論 : 可能と思われる 何故? :
● JRuby は Java アプリであり、JRuby-rack と組み合わせることで、Java Application Server上で動くアプリが作れる
● vcap 上で Java Application Server 上で動くアプリが動く
● 故に、vcap 上で JRuby & JRuby-rack を 利用したアプリが動く
3. vcap 上で JRuby でアプリを動かすことは 可能なの? (2/2) そもそも…
Javaは公式サポートされているけど Ruby をサポートしていないはずの
vcap(CraudFondry)と違って、デプロイ対象 アプリ中に存在するファイルの数や、サイズに 制限がかけられていた
Google App Engine(GAE) 上で、JRuby 使って Ruby アプリが動いていると言う前例もある わけで、動いて不思議はない。
4. vcap 上で JRuby で動くアプリの作り方は? (1/9)
CloudFoundry(vcap) に J2EE ( Java 製 Web ) アプリと 認識される形態にする → vmc は以下のどちらかの条件が成り立つ場合、 対象を Java アプリと判断する。
➢ デプロイ対象ファイル名が *.war➢ デプロイ対象内に WEB-INF/web.xml が存在
「 jruby-complete-x.x.x.jar 」および 「 jruby-rack-x.x.x.jar 」を同梱する
CloudFoundry(vcap) 内に Java の共通ライブラリとして登録できれば同梱は不要になるはずなんだけど…
4. vcap 上で JRuby で動くアプリの作り方は? (2/9)
J2EE アプリの 構成について
アプリのルートディレクトリ ┣━*.html ファイル、*.jsp ファイル、*.js ファイル等 ┣━jsp ┃ ┗━*.jsp ファイル ┣━html ┃ ┗━*.html ファイル ┗━WEB-INF ┃ ┣━web.xml ┃ ┣━class ┃ ┗━<path> ┃ ┗━<to> ┃ ┣━<hoge> ┃ ┃ ┗━*.class ファイル ┃ ┗━<fuga> ┃ ┗━*.class ファイル ┗━lib ┗━*.jar ファイル
4. vcap 上で JRuby で動くアプリの作り方は? (3/9)
vcap(*1)上で動くことが前提の「JRubyを利用したアプリ」の基本構成について
アプリのルートディレクトリ ┃ ┗━WEB-INF ┣━ web.xml ┗━lib ┣━ jruby-complete-x.x.x.jar ┗━ jruby-rack-x.x.x.jar
必須ファイルは、上記の赤枠で括られた 3 つ。ただしこれだけだと、jruby の動きをカスタマイズするRuby スクリプトが無いので「呼ばれたら何もしない」
アプリケーションになります。
4. vcap 上で JRuby で動くアプリの作り方は? (4/9)
web.xml の 記述概要
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <context-param> <param-name>public.root</param-name> <param-value>/</param-value> </context-param> <context-param> <param-name>rackup</param-name> <param-value> ※ ここには rack に渡すパラメタ等を記述 </param-value> </context-param> <filter> <filter-name>RackFilter</filter-name> <filter-class>org.jruby.rack.RackFilter</filter-class> </filter> <filter-mapping> <filter-name>RackFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jruby.rack.RackServletContextListener</listener-class> </listener></web-app>
ApplicationServerから呼び出されるか聞き耳を立てるリスナとして
org.jruby.rack.RackServletContextListenerを指定します
4. vcap 上で JRuby で動くアプリの作り方は? (5/9)
動かす対象が Ruby スクリプト( ViewInfo.rb ) の 場合のアプリの構成例
RackSample03 ┗━WEB-INF ┣━ web.xml ┣━ ViewInfo.rb ┗━lib ┣━ jruby-complete-x.x.x.jar ┗━ jruby-rack-x.x.x.jar
動かしたい Ruby スクリプトを追加します。
■ ViewInfo.rb に
ついて
4. vcap 上で JRuby で動くアプリの作り方は? (6/9)require 'rubygems'require 'rack'
class ExecutionEnvironmentInfo
def call(env) req = Rack::Request.new(env) res = Rack::Response.new res.write '<html><head><title>Information of Execution Environment</title></head><body>' res.write '<table border=1 bordercolordark=black>' res.write "<tr><td>Ruby version</td><td>#{RUBY_VERSION}</td></tr>" res.write "<tr><td>Patch Level</td><td>#{RUBY_PATCHLEVEL}</td></tr>" res.write '' res.write "<tr><td>Description</td><td>#{RUBY_DESCRIPTION}</td></tr>" res.write "<tr><td>Release Date</td><td>#{RUBY_RELEASE_DATE}</td></tr>" res.write "<tr><td>Platform</td><td>#{RUBY_PLATFORM}</td></tr>" res.write '<tr><td>Load paths</td><td>' res.write '<table border=1 bordercolordark=black>' $LOAD_PATH.each do |i| res.write '<tr><td>' res.write i res.write '</td></tr>' end res.write '</table></td></tr></body></html>' res.finish endend
この例では、・ファイル名:ViewInfo.rb・クラス名:ExecutionEnvironmentInfoにしました
rackアプリは、呼び出されるとcall メソッドが呼び出されます
4. vcap 上で JRuby で動くアプリの作り方は? (7/9)
web.xml の記述例<?xml version="1.0" encoding="utf-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <context-param> <param-name>public.root</param-name> <param-value>/</param-value> </context-param> <context-param> <param-name>rackup</param-name> <param-value> require 'ViewInfo.rb' run ExecutionEnvironmentInfo.new </param-value> </context-param> <filter> <filter-name>RackFilter</filter-name> <filter-class>org.jruby.rack.RackFilter</filter-class> </filter> <filter-mapping> <filter-name>RackFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jruby.rack.RackServletContextListener</listener-class> </listener></web-app>
Application Server からrack が 呼び出されたとき利用する Ruby スクリプト名と実行させたいことを記述します
web.xml が config.ru の代わりになると考えると良いかも
4. vcap 上で JRuby で動くアプリの作り方は? (8/9)
動かす対象が
Sinatra アプリの
場合のアプリの
構成例
SinatraSample03 ┗━WEB-INF ┣━ web.xml ┣━ Controller.rb ┣━gems ┃ ┣━gems ┃ ┃ ┣━rack-1.3.2 ┃ ┃ ┣━sinatra-1.2.6 ┃ ┃ ┗━tilt-1.3.3 ┃ ┗━specifications ┃ ┣━ rack-1.3.2.gemspec ┃ ┣━ sinatra-1.2.6.gemspec ┃ ┗━ tilt-1.3.3.gemspec ┣━lib ┃ ┣━ jruby-complete-x.x.x.jar ┃ ┗━ jruby-rack-x.x.x.jar ┣━public ┃ ┗━ *.jsファイル、cssファイル等 ┗━views ┗━ *.erbファイル
ローカルにインストールしたRuby + Rubygens で入手したSinatra の構成品をコピーします
ローカルにインストールしたRuby で開発したSinatra アプリの構成ファイル等を品をすべてコピーします
4. vcap 上で JRuby で動くアプリの作り方は? (9/9)
web.xml の記述例<?xml version="1.0" encoding="utf-8"?><!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"><web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5"> <context-param> <param-name>rackup</param-name> <param-value> require 'Controller' run Sinatra::Application </param-value> </context-param> <filter> <filter-name>RackFilter</filter-name> <filter-class>org.jruby.rack.RackFilter</filter-class> </filter> <filter-mapping> <filter-name>RackFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.jruby.rack.RackServletContextListener</listener-class> </listener></web-app>
Application Server からrack が 呼び出されたとき動作させるのがSinatra アプリであることとコントローラがController.rb であることをを記述します
ちなみに vcap 上でSinatra アプリを動かした場合待ちうけ Port 番号は通常は Port 80 になります
付録: 必須ファイルの入手先ファイル名 入手サイト(URL)
JRuby http://jruby.org/download
jruby-rack http://repository.codehaus.org/org/jruby/rack/jruby-rack/
今回の検証では以下の 2 ファイルを使いました・jruby-complete-1.6.5.jar・jruby-rack-0.9.7.jar
おわり
御清聴ありがとうございました
ばたっ!
… チカリタ
チョット待て !!Ruby on Rails の動かし方を何故説明しない !!!
JDBC 経由でのDB 接続方法の説明はどうした !!!!