25
CloudFoundry ( vcap ) 上で JRuby でアプリを動かす 2012/01/19 ( ) 4 CloudFoundry 輪読会 嘉彦 ( [email protected] )

CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

  • Upload
    others

  • View
    20

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

CloudFoundry ( vcap ) 上でJRuby でアプリを動かす

2012/01/19 (木)

第 4 回 CloudFoundry 輪読会

原 嘉彦 ( [email protected] )

Page 2: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

自己紹介何者? : 原 嘉彦 ( Yoshihiko Hara )

twitter → GORO_Neko

mail → [email protected]

日頃何やってるヒト? :

IT 企業で Ruby や Java で Web アプリ作ってます。 Cloudfoundry との関わりは? :

現在は完全に趣味でかかわってます。

Ruby 好きが高じて Ruby 製の PaaS 基盤CloudFoundry をいじっていたと…仕事でも使いたいなぁ...ボソボソ

Page 3: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

アジェンダ

1. JRuby ってなに?

2. JRuby が使えると何が嬉しいの?

3. vcap 上で JRuby でアプリを動かすことは 可能なの?

4. vcap 上で JRuby で動くアプリの作り方は?

Page 4: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

1. JRuby ってなに? (1/6) Ruby の処理系の実装のひとつ Java で実装されている → 荒っぽく言えば

  「JavaVM 上で Ruby 言語のプログラムを動作させる

ソフトウェア」

Javaさえインストールされていれば、 Ruby も JRuby もインストールされていなくとも Ruby スクリプトを実行できる → プラットフォームへのインストールをせずに JRuby を

使いたい場合は「jruby-complete-x.x.x.jar」を使う

Page 5: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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)

Page 6: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

1. JRuby ってなに? (3/6)

Rubyはinstallされていない

JRubyもinstallされていない

Javaはinstallされている

Javaで、jruby-complete-1.6.5.jar を実行させることで、Ruby(JRuby)の機能が実行される

Page 7: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で 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 を書く

Page 8: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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ライブラリをロードするときの検索パス

Page 9: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

1. JRuby ってなに? (6/6)

Javaで、jruby-complete-1.6.5.jar を実行させることで、Info.rb が実行される

Page 10: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 アプリのノウハウが活かせる

Page 11: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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)

Page 12: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 を利用したアプリはどこでも動く。

Page 13: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

3. vcap 上で JRuby でアプリを動かすことは 可能なの? (1/2) 結論 : 可能と思われる 何故? :

● JRuby は Java アプリであり、JRuby-rack と組み合わせることで、Java Application Server上で動くアプリが作れる

● vcap 上で Java Application Server 上で動くアプリが動く

● 故に、vcap 上で JRuby & JRuby-rack を 利用したアプリが動く

Page 14: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

3. vcap 上で JRuby でアプリを動かすことは 可能なの? (2/2) そもそも…

Javaは公式サポートされているけど   Ruby をサポートしていないはずの

vcap(CraudFondry)と違って、デプロイ対象 アプリ中に存在するファイルの数や、サイズに 制限がかけられていた

Google App Engine(GAE) 上で、JRuby 使って Ruby アプリが動いていると言う前例もある わけで、動いて不思議はない。

Page 15: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 の共通ライブラリとして登録できれば同梱は不要になるはずなんだけど…

Page 16: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 ファイル

Page 17: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 スクリプトが無いので「呼ばれたら何もしない」

アプリケーションになります。

Page 18: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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を指定します

Page 19: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 スクリプトを追加します。

Page 20: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

■ 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 メソッドが呼び出されます

Page 21: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 の代わりになると考えると良いかも

Page 22: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 アプリの構成ファイル等を品をすべてコピーします

Page 23: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

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 になります

Page 24: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

付録: 必須ファイルの入手先ファイル名 入手サイト(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

Page 25: CloudFoundry ( vcap ) 上で JRuby でアプリを動かすshinodas/cloudfoundry/20120119CloudFoundry_and_ JRuby.pdf · CloudFoundry ( vcap ) 上で JRuby でアプリを動かす

おわり

御清聴ありがとうございました

ばたっ!

… チカリタ

チョット待て !!Ruby on Rails の動かし方を何故説明しない !!!

JDBC 経由でのDB 接続方法の説明はどうした !!!!