JRuby on Rails

Preview:

Citation preview

JRuby on Rails

JJUG クロスコミュニティカンファレンス田中 洋一郎

1Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

自己紹介

• 田中 洋一郎– ATL Systems, Inc. チーフアーキテクト– S2Wicket コミッタ–こみゅすけ管理人–言語歴• Java 13 年目• Ruby 半年と少々

2Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

アジェンダ

• JRuby の背景• JRuby で Ruby on Rails を動かす理由• JRuby on Rails の実践• JRuby ならではの Java 連携• JRuby on Rails のメリット・デメリット

3Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Script Engine• AWK(Jawk 0.14), BeanShell(BeanShell 2.0b5), ejs,

FreeMarker(FreeMarker 2.3.11), Groovy(Groovy 1.5.6), Jaskell(Jaskell 1.0), Java, JavaScript(Rhino 1.6R7), Jelly(Jelly 1.0), JEP(Java Math Expression Parser 2.4.0), Jexl(Jexl 1.0), jst(TrimPath JavaScript Template 1.0.38), JudoScript(JudoScript 0.9), JUEL(JUEL 2.1.0-rc2), OGNL(OGNL 2.6.9), Pnuts(Pnuts 1.1), Python(Jython 2.2.1), Ruby(JRuby 1.1), Scheme(SISC 1.16.6), Sleep(Sleep 2.0), Tcl(Jacl 1.3.3), Velocity(Velocity 1.5), XPath, XSLT

• JavaFX Script, AppleScript, Bex Script, OCaml Script, PHP, Smalltalk, CajuScript

4Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Script Engine• AWK(Jawk 0.14), BeanShell(BeanShell 2.0b5), ejs,

FreeMarker(FreeMarker 2.3.11), Groovy(Groovy 1.5.6), Jaskell(Jaskell 1.0), Java, JavaScript(Rhino 1.6R7), Jelly(Jelly 1.0), JEP(Java Math Expression Parser 2.4.0), Jexl(Jexl 1.0), jst(TrimPath JavaScript Template 1.0.38), JudoScript(JudoScript 0.9), JUEL(JUEL 2.1.0-rc2), OGNL(OGNL 2.6.9), Pnuts(Pnuts 1.1), Python(Jython 2.2.1), Ruby(JRuby 1.1), Scheme(SISC 1.16.6), Sleep(Sleep 2.0), Tcl(Jacl 1.3.3), Velocity(Velocity 1.5), XPath, XSLT

• JavaFX Script, AppleScript, Bex Script, OCaml Script, PHP, Smalltalk, CajuScript

5Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby

• まつもとゆきひろ氏作のコンピュータ言語

「オープンソースの動的なプログラミング言語で、 シンプルさと高い生産性を備えています。 エレガントな文法を持ち、自然に読み書きができます。」 〜 Ruby ホームページより〜

6Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby• Ruby の特徴 〜 Ruby ホームページより〜

– シンプルな文法– 普通のオブジェクト指向機能 ( クラス、メソッ

ドなど )– 特殊なオブジェクト指向機能 (Mixin 、特異メ

ソッドなど )– 演算子オーバーロード– 例外処理機能– イテレータとクロージャ– ガーベージコレクタ– ダイナミックローディング– 移植性の高さ

7Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Programming Language Wars

〜 radar.orailly.com より〜

8Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Programming Language Trends

〜 radar.orailly.com より〜

9Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• Ruby による Web アプリフレームワーク

「 Ruby on Rails is an open-source web framework that’s optimized for programmer happiness and sustainable productivity. It lets you write beautiful code by favoring convention over configuration. 」 〜 Rails ホームページより〜

10Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• RoR の特徴– Model View Controller アーキテクチャ– Don’t Repeat Yourself

( 同じことを繰り返さない )– Convention over Configuration

( 設定よりも規約 )

11Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• フルスタック

dispatcher.cgi routes.rb

Controller

View

Model

Database

ActionPack

ActiveRecord

12Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

呼び出す Controllerを特定

O/R マッピング

Model への操作とView の決定

HTML や XML のレンダリング

Ruby on Rails

• コードセットの早期入手– rails コマンド、 script/generate スクリプトに

よる初期コードの自動生成

13Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• テスト環境の充実– Fixtures によるテストデータの自動投入– Function Test による Controller のテスト– assert_select によるレンダリング結果のテス

ト– Integration Test によるシナリオテスト

–上記は全てコード記述&繰り返し実行が可能– Ruby on Rails において、最も重要

14Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• その他にも– Web アプリケーション開発は当然• MVC によるアーキテクチャ

–プラグインによる機能拡張– RESTful サービスの実装プラットフォーム• XML Model⇔ 変換や Builder 、 Routing など

– WebService 系実装( SOAP など)もサポート– MQ も対応可能–サクサク開発

15Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• 開発時のメリットは非常に大きい–シンプルなアーキテクチャ–コードセットの早期入手–テスト環境の充実

• 運用面は?

16Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• 運用環境– Apache, mod_proxy, mod_proxy_balancer– LiteSpeed, Pound– Lighttpd, FastCGI– Mongrel, Mongrel Cluster– mod_rails

17Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Ruby on Rails

• RoR アプリの安定運用環境は非常に難しい– UNIX 系サーバソフトウェアの知識が必要–そもそも CGI なので・・・–経験が浅く、公開されている情報が少ない–負荷分散を図りにくい• ビジネストランザクションに対応できない

–成功例が極端に少ない18Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Java

• JavaEE (旧 J2EE )の歴史–初登場は 2000 年–今年で 8 年目–多くの企業が採用実績を持つ–スケールアウト可能–運用監視面の強さ–競争原理の導入と実績• 多くのコンテナが成長

19Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Java• JavaEE コンテナ

– Apache JServ– Apache Tomcat– BEA Weblogic– IBM WebSphere– Oracle Application Server– SunOne Application Server– JBoss Application Server– Hitachi Cosminexus– Web OTX– Interstage– Geronimo– GlassFish

20Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

Java

• 運用時のメリットは非常に大きい–選択肢の豊富さ–スケールアウトしやすいアーキテクチャ–運用監視の充実–多くの稼働実績–情報の豊富さ

• 開発時は?

21Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby

• JavaVM 上で Ruby コードを実行可能にする

「 JRuby is an 100% pure-Java implementation of the Ruby programming language. 」 〜 Ruby ホームページより〜

22Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby

• JRuby の機能 〜 JRuby ホームページより〜

– A 1.8.6 compatible Ruby Interpreter written in 100% pre Java

– Most Builtin Ruby classes provided– Support for interacting with and defining java

classes from within ruby– Bean Scripting Framework(BSF) support– Distributed under a tri-license(CPL/GPL/LGPL)

23Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby

• JRuby のインストール– JDK のインストール• 環境変数 JAVA_HOME を設定

–アーカイブを展開• http://dist.codehaus.org/jruby/jruby-bin-1.1.1.tar.gz• 環境変数 JRUBY_HOME を設定• 環境変数 PATH に $JRUBY_HOME/bin を追加

– jruby -v を実行• ruby 1.8.6 (2008-04-28 rev 6555) [i386-jruby1.1.1]

24Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby

• JRuby のテスト– Ruby on Rails アプリが稼働すること

25Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby 上で Ruby on Rails アプリを動かす–開発時• Ruby 言語の特性がメリットとなる• Ruby on Rails の開発環境の良さをそのまま得られ

–運用時• JavaEE の運用環境の良さをそのまま得られる• より多くの選択肢を手にすることができる

26Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• Ruby on Rails のインストール– CRuby の場合• gem install rails --include-dependencies

– JRuby の場合• jruby -S gem install rails --include-dependencies• gem は JRuby に同梱されている

– jruby -S rails -v を実行• Rails 2.0.2

27Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• Ruby on Rails の各種コマンド実行–通常 ruby とするところを jruby とするだけ• jruby -S rails 〜• jruby -S rake 〜• jruby ./script/generate 〜• jruby ./script/server 〜• ・・・

28Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• データベース接続– Ruby on Rails に標準搭載の接続機構• Ruby on Rails標準のやり方に沿えば良い

– ActiveRecord-JDBC• jruby -S gem install activerecord-jdbc• database.yml

– adapter: jdbcdriver: [JDBC ドライバのクラス名 ]jndi: [ データソース名 ]

• environment.rb にもおまじないを追記

29Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby での Ruby on Rails の実行形態– Development Mode• WEBrick を起動 - jruby ./script/server

– Test Mode• jruby -S rake test

– Production Mode• war ファイルを作成し、 AP サーバにデプロイ

30Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• war ファイル作成– goldspike

• jruby ./script/plugin install svn://rubyforge.org/var/svn/jruby-extras/trunk/rails-integration/plugins/goldspike

• jruby -S rake war:standalone:create

– warbler (内部で goldspike を利用 )• jruby -S gem install warbler• warble config• warble war

– あとは war ファイルを AP サーバにデプロイするだけ

31Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• goldspike– Servlet によるマルチスレッドモデルになる– CGI に比べてパフォーマンス的に有利

RailsServlet Rails App

JRuby

ActiveRecord-JDBC JDBC Driver

Database

32Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• 冗長化の際のセッションの扱い– CookieSession の場合• そのままで問題なし

– ActiveRecordSession の場合• そのままで問題なし

– FileSession の場合• 冗長化構成では使えない

– MemCachedSession の場合• MemCached のクラスタ化で対応可?

33Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby ならではのアーキテクチャ– EJB との連携• Model に EJB を適用• Java AP サーバ提供の分散 Tx 環境を利用可能

– RMI の利用• 他システム連携として適用• 既存システムを活用できる

34Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby on Rails と EJB

EJB

Database

dispatcher.cgi routes.rb

Controller

View

ActionPack

リモート呼び出し

35Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• サンプル

package jp.eisbahn.ejb;

import javax.ejb.Remote;

@Remotepublic interface Hello { public void sayHello(String name);}

36Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• サンプル

package jp.eisbahn.ejb;

import javax.ejb.Stateless;

public @Stateless class HelloImpl implements Hello { public void sayHello(String name) { return “Hello! “ + name + “-san.”; }}

37Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• サンプル

InitialContext context = new InitialContext();Object ref = context.lookup(“ejb/Hello/remote”);Hello target = (Hello)PortableRemoteObject.narrow(ref, Hello.class);target.sayHello(“yoichiro”);

38Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• サンプル

require ‘java’include_class ‘javax.naming.InitialContext’include_class ‘javax.rmi.PortableRemoteObject’include_class ‘jp.eisbahn.ejb.Hello’

context = InitialContext.newref = context.lookup(‘ejb/Hello/remote’)hello = PortableRemoteObject.narrow(ref, Hello)hello.sayHello(‘yoichiro’)

39Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails• JRuby ならではの Java 連携– オブジェクトのプロパティに対する操作

• Java の場合– model.setName(‘yoichiro’);– String name = model.getName();

• JRuby の場合– model.name = ‘yoichiro’– name = model.name

– Ruby らしいメソッド呼び出し• Java の場合

– action.doProcess();• JRuby の場合

– action.do_process

40Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby 上で Ruby on Rails アプリを動かす–開発時• Ruby 言語の特性がメリットとなる• Ruby on Rails の開発環境の良さをそのまま得られ

–運用時• JavaEE の運用環境の良さをそのまま得られる• より多くの選択肢を手にすることができる

41Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby 上で Ruby on Rails アプリを作る– IDE の恩恵• NetBeans 6.1 は Ruby コーディングに向いている• デバッガが使えるのはやっぱり強力

– GlassFish の JRuby サポート• JRuby がコンポーネントとして登録可能• glassfish gem: GlassFish へのデプロイが手軽になる

42Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

JRuby on Rails

• JRuby のデメリット–何といっても日本語• UTF-8以外は全滅と言ってもいいかもしれない• 携帯アプリを作ろうと思うと致命的

–動いちゃえば速い• でも起動が遅い• jruby -S rake test を繰り返し実行するのが苦痛にな

る• 安定はするが、瞬発力はまだまだ

43Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

まとめ

• JRuby の背景• JRuby で Ruby on Rails を動かす理由• JRuby on Rails の実践• JRuby ならではの Java 連携• JRuby on Rails のメリット・デメリット

44Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

最後に

• Blog 「天使やカイザーと呼ばれて」– http://www.eisbahn.jp/yoichiro/

• こみゅすけ– http://commusuke.eisbahn.jp/– JRuby on Rails on GlassFish

• 続きは「パネルディスカッション」で・・・

45Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30

ありがとうございました

46Copyright(C) 2008 Yoichiro Tanaka. All rights reserved.08.4.30