JRuby User @ Twitter
Twitterに日本のJRubyユーザのためのTwicco、
を作りました。
ちなみにTwiccoとは、Twitterでそのアカウントあてにつぶやくと、そのアカウントをfollowしているユーザ全員につぶやきが配信されるというコミュニティ機能です。
よろしくお願いします。
2009/04/16 by Tomo Nozawa
JRuby Google AppEngine Wrapper
Google AppEngineの各種サービスのJRubyラッパーを現在分かっている範囲でまとめました。
JRuby Google AppEngine Service ラッパー
ご参照ください。
2009/04/15 by Tomo Nozawa
tips & Rails template JRuby for GAE/J
Google AppEngineでJRubyを動作させるために現状分かっている注意点をまとめました。
JRuby on Google AppEngineの注意事項
またRails 2.3からの新機能アプリケーションテンプレートを使用して、非常に簡単にRailsアプリをGAE/J用にする方法をまとめました。
以上ご参照ください。
2009/04/14 by Tomo Nozawa
JRuby on Google AppEngine
昨日からGoogle AppEngineでPythonに続いて、Javaがサポートされました。
それにより、若干無理は感じますが、JRubyも動作します。
これは高井さんの言葉を借りれば、まさに「Googleにとっては小さな一歩だが、JRubyにとっては偉大な飛躍である」と言えるでしょう。
ということで、JRuby on RailsをAppEngine上で動作させるための方法を書きました。
2009/04/09 by Tomo Nozawa
(j)ruby on Merb : create resource and validator
前回の記事に追記したように、DataObjectsがJRubyで現在のところ、満足に動作しませんが、もうすぐサポートしたものが正式にリリースされるようなので、JRubyではなく、MRIをつかってMerb+Datamapperで遊んでいきたいと思います。
ちなみにソース(そんな大げさなものではないですが)は、githubで公開しています。
まず前回作ったアプリのディレクトリに移動し、config/dependencies.rbのdatamapperのバージョンを書き換えます。
dependencies.rbの
dm_gems_version = "0.9.8"
を
dm_gems_version = "0.9.9"
に変更します。Merbアプリケーションが起動する際に、最初にロードされる設定ファイル(正確にはinit.rbがロードされますが、init.rbの冒頭でdependencies.rbが呼ばれているため)で、アプリケーションが依存するMerb関連のgemをバージョンとともに定義したものです。
ここに定義されているgemは、機能としてはいわゆるgemというより、Merbのプラグイン的なものととらえる方が良いのかもしれません。
dependencies.rbがロードしおわると、init.rbの続きがロードされます。このinit.rbには、
use_orm :datamapper
use_test :rspec
use_template_engine :erb
というように、このMerbアプリケーションで使用する、ORM、テストフレームワーク、テンプレートエンジンが記載されており、これを変更することでもそれぞれのコンポーネントを変更することができます。もちろん変更した場合は、dependencyの宣言も変わってきます。
例えば、datamapperのかわりに、activerecordを使う場合は、
use_orm :activerecord
となり、dependency部分は、dm-xxxの部分はすべて削除し、merb_datamapperのかわりに、
dependency "merb_activerecord"
という感じになります。
では、続きです。RailsのScaffoldに相当するのが、Resourceです。resourceを生成することにより、model, controller, デフォルトのviewが自動生成されます。Stringのtitleと、TextのBoby,Datetimeのcreated_at,updated_atを作成します
merb-gen resource article title:string,body:text,create_at:datetime,updated_at:datetime
実行すると、model,controller,view以外にconfig/router.rbに
resources :articles
というルーティングが追加されます。
ここで、生成された article modelファイルを確認します。
class Article
include DataMapper::Resourceproperty :id, Serial
property :create_at, DateTime
property :updated_at, DateTime
property :body, Text
property :title, Stringend
このように、Railsというかactiverecordでは、スキーマの定義をmigrationファイルで行いましたが、datamapperではmodelファイルに直接記述します。
ちなみにMerb+activerecordの場合は、schema/migration/番号_resourcename_migration.rbというマイグレーションファイルが生成され、これを元にRailsと同様にmigrateすることになります。
つぎにtitleとbodyが空欄であることをさけるため、validateしたいと思います。datamapperでのvalidateは、modelに
validates_present :title
validates_present :body
というように書きます。もちろんvalidates_present以外にもさまざまなvalidatorが用意されています。
#入力されていないことの検証
validates_absent :spam# zip_codeが7桁であることの検証
validates_length :zip_code, :is => 7# ageが3桁以内であることの検証
validates_length :age, :in => 1..3# passwordとpassword_confirmationが同一であることの検証
validates_is_confirmed :password# passwordとpassword_repeatが同一であることの検証
validates_is_confirmed :password, :confirm => :password_repeat# registrationが正規表現にマッチしていることの検証
validates_format :registration, :with => /[A-Z]{3}-[0-9]{3}/# emailがメールアドレスであることの検証
validates_format :email, :as => :email_address# homepageがurlであることの検証
validates_format :homepage, :as => :url# ageがintegerであることの検証
validates_is_number :age, :integer_only => true# percentageが数字であることの検証
validates_is_number :percentage# emailが一意であることの検証
validates_is_unique :email
さらに独自にvalidatorを定義することももちろん可能で、たとえばpriceが正の値であることを検証したい場合は、
validates_with_method :price, :positive_price?
def positive_price?
if @price <= 0.0
[false, "価格には正の値を入力してください"]
else
true
end
end
というようにカスタムメソッドを設定してやると、独自のvalidatorをつくることができます。
長くなってきたので、ほとんどコーディングしてませんが、今回はここで終了です。
最後に、今回の作業をMerb+activerecordで行ったものも参考になるか分かりませんが、githubに置いておきました。
2009/01/16 by Tomo Nozawa
jruby on Merb : datamapper & merb-gen
前回の記事で、DatamapperのDBドライバがJRuby未対応と書きましたが、ようやく対応バージョンがリリースされたようです。
Merb + ActiveRecordで遊んで見るつもりでしたが、ORMをARにするといろいろと設定し直さないといけないところが出てくるので、せっかくリリースされたこともあり、Merb + Datamapperであそんでみたいと思います。
[1/15追記]申し訳ございません。現状インストールはできますが、実装が不十分なようで、(特にdatamapperとの連携部分)merb+datamapperでは動作しないことが判明しました。したがってJRubyで使うことはまだできません。大変申し訳ございません。
ただ、JRuby用Datamapperのドライバは現状開発中でgemのレポジトリにははいっていません。そのため、githubからダウンロードしてインストールする必要があります。
まずgit clone
$ git clone git://github.com/sam/do.git
できたディレクトリに移動して、ビルド&インストール。
$ cd do
$ jruby -S rake install
これでderby, sqlite3, postgres, mysql, hsqldb, そしてjdbc接続のドライバがインストールされます。
gem listすると、0.9.11のdo_xxxというgemがインストールされているはずです。
ということで、Merb+Datamapperを触っていきます。ブログアプリを作っていきたいと思います。
勉強しながら書いているので、間違いもあるかと思います。お気付きの場合、指摘していただけると幸いです。
Railsのrailsコマンドにあたるのが、merb-genです。これを使ってアプリケーションを生成します。
$ jruby -S merb-gen app blog
ところで、merb-genだけを入力するとオプションが表示されます。そのオプションの中に、アプリケーションのひな形を生成するオプション、app,coreとflat,very_flatがあると思います。それぞれで生成されるMerbアプリケーションの構成が異なります。
- app : 最も標準的なひな形。jQueryやdependencies.rbなど全部入り。
- core : railsのようなひな形。jQueryやdependencies.rb, database.ymlなど含まず
- flat : view,controller1つずつ、framework.rb(設定)の極小ひな形。
- very_flat : ファイル1つ(veryflat.rb)ですべての設定を行う超極小ひな形。
という構成になるようです。appでは、ORMやテストフレームワーク、テンプレートエンジンはデフォルト(それぞれ、Datamapper, RSpec, erb)を使用する設定でひな形が生成されます。これらをデフォルトから変更したい場合は、coreを使います。例えば、ORMをActiverecord,テンプレートエンジンをhamlにしたい場合は、
$ jruby -S merb-gen core test --orm=activerecord --template-engine=haml
というようになります。続きは次回。
2009/01/09 by Tomo Nozawa
jruby on merb : install
遅くなりましたが、明けましておめでとうございます。本年もよろしくお願いします。
今年はjruby-users.jpのコンテンツをちゃんとつくります
Rails3でマージされることになったMerb。
面白そうなので、触ってみようと思います。もちろんJRubyで。今回はとりあえずインストール
MerbはデフォルトではORMにDataMapperを使用しますが、DataMapper(以下DM)のDBドライバがまだJRubyに対応していないため,ORMにはActiveRecordを使用することにします。またこの関係で、通常の
jruby -S gem install merb
ではdo_sqlite3(DMのsqlite3用ドライバ)のインストールにこけてしまうので、インストールにも一工夫必要です。
ではインストール
開発サーバとしてglassfish、dbとしてsqlite3を使うので、インストールしていない場合はインストール。また(jdbc-)activerecordもインストールしていない場合はインストールします。
jruby -S gem install glassfish activerecord activerecord-jdbcsqlite3-adapter
インストール後、merbをインストール。
jruby -S gem install merb-core merb-more merb_activerecord
これでDM以外のMerbに必要なモジュールとMerbからactiverecordを使うモジュールがインストールされます。
ということで実際のアプリケーション作成は次回!
2009/01/07 by Tomo Nozawa
jruby1.1.6 release
JRuby1.1.6がリリースされました。
改良点は以下。
- フルRuby1.9パーサー
- ほとんどのRuby1.9コア、メソッド/ライブラリ/クラスをサポート
- 不要になった後も増加し続けるとIOリファレンスバグのfix
- Array.Sortの高速化
- jarからのgemの実行
- gemをjarとしてレポジトリ化、classpathから読み込み可能に
- JavaEmbedUtilsの改良
- RCプロセスのメモリリーク修正
- 1.1.5からの74個のバグ修正
となっています。お使いのかたはアップグレードを!。
2008/12/19 by Tomo Nozawa
sun techdays 2008 presentation pitch
僕もJRuby On Railsについて話しましたが、12月2、3日に行われたSun Tech Daysのプレゼン資料が公開になっています。すべてPDFです。
2008/12/15 by Tomo Nozawa
JRuby on rails 2.2.2 new feature(3) : Thread Safe
昨日のTechDaysでの講演がBuilder zdnetの記事になってました。ちょっと恥ずかしいです。
参加していただいた皆様、ありがとうございました。
あとJavaFX1.0がリリースされたので、ちょっとさわりはじめてみました。Netbeans6.5 on OSXで日本語が文字化けしてしまいます。Windowsでの回避方法は分かったのですが、macではわかりません。macは文字コードUTF-8だった気がするのですが、気のせいでしょうか?どなたか対処法ご存知でしたら、教えてください。
前置きが長くなりましたが、今回は上の記事にもありますが、Rails2.2.2のスレッドセーフとJRubyについてです。コネクションプールは次回。
ご存知の通り、Rails2.2.0からはスレッドセーフとなりました。この恩恵を一番受けるのが、JRubyです。
まずは次の図をご覧ください。

Ruby1.8.7(MRI)の場合、1つのOSのネイティブスレッドがRubyインタプリタに割り当てられ、GILがあって、Rubyのスレッドはグリーンスレッド(ユーザ空間のスレッド)として動作することになります。そのため、Railsがスレッドセーフになっても、Ruby自体がグリーンスレッドのため、グリーンスレッドレベルでのマルチスレッド化となり、Rubyインタプリタ自体はシングルスレッドで動作することになります。そのため、パフォーマンスを向上させるためには、複数のインタプリタを起動させる事が必要となります。
これに対して、JRubyの場合、JVMがネイティブスレッドに対応しており、JRubyのグリーン・スレッドが1対1でJVMに割り当てられたネイティブスレッドにマッピングされることになりますので、実質Railsがネイティブスレッドで動作することになります。そのため、MRIと同じ1つのプロセスでもよりよいパフォーマンスを得ることができるようになっています。
このようにRailsがスレッドセーフになったことで、JRuby on Railsがパフォーマンスという面で考えても非常によい選択肢となったのではないでしょうか?
2008/12/10 by Tomo Nozawa
(J)Ruby On Rails in Sun TechDays 2008
Rails 2.2.x系の新機能紹介を書く予定がかなり遅めの夏休みをとっていたりしたので、遅れ遅れになってしまってすいません。
そうこうしているうちに、2.2の正式リリース2.2.2がリリースされました。明日から続きを書く予定です。
ところで、来月12月2-4日、Sun Tech Days 2008 in Tokyoが開催されます。
このイベントで僕も(J)Ruby On Railsについて話させていただきます。
時間は12月3日(水)13:10-14:00 (J)Ruby On Railsです。
サイトの説明文では今一つ内容がつかみ辛いかもしれませんが、一応下記の内容で話す予定です。
主にRoRを知らない方向けの内容になりますが、最後にRails2.2.2とJRubyについて話します。
- Rubyとは?
- Ruby on Railsとは?
- RoRのMVC解説(HelloWorldアプリケーションを作成しながら)
- JRubyとは?(Ruby-Processing のライブコーディングするかも)
- Warbler/Glassfish v3
- RoR2.2.2+JRubyでパフォーマンス向上
こんな感じになる予定です。ぜひ立ち寄って見てください。
2008/11/25 by Tomo Nozawa
JRuby Community in CU
Yahoo! Japanが始めたビジネスSNS"CU"内にJRubyコミュニティをつくりました。よろしければ、ご参加ください。
Rails2.2のリリースを控え、いろいろ情報交換ができればと思っています。
よろしくお願いします。
2008/11/07 by Tomo Nozawa
JRuby1.1.5 release
JRuby1.1の5度目のバージョンアップ、1.1.5がリリースされました。
特徴は
- クラスごとのメソッドキャッシング
- コンスタントキャッシュの改善
- メモリ使用量の減少
- Javaの統合のデグレードの解消
- Rubygemsが1.3.1、RSpecが1.1.11
- 1.1.4から113のバグfixなどなど
先日とりあげたjetty-railsも問題なく動作するようになっています。
$ jruby -v
jruby 1.1.5 (ruby 1.8.6 patchlevel 114) (2008-11-03 rev 7996) [x86_64-java]
$ cd demo1/
$ jetty_rails
2008-11-04 12:01:33.585::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
starting 3000
2008-11-04 12:01:34.772::INFO: jetty-6.1.9
2008-11-04 12:01:34.865::INFO: NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2008-11-04 12:01:34.374:/:INFO: Info: using runtime pool timeout of 30 seconds
2008-11-04 12:01:34.374:/:INFO: Info: received min runtimes = 1
2008-11-04 12:01:34.374:/:INFO: Info: received max runtimes = 5
2008/11/04 by Tomo Nozawa
jetty_rails with JRuby1.1.4 not work
バグ情報ばかり書いている気がしないでもないですが、現在のところ、JRuby1.1.4ではjetty_railsが動作しません。これはバグとして認識されていて1.1.5で修正予定です。
現在のところ、jetty_railsを使いたい場合は1.1.3もしくはtrunk版を使う必要があります。
以下検証です。
1.1.4の場合
$ jruby -v
jruby 1.1.4 (ruby 1.8.6 patchlevel 114) (2008-08-28 rev 7570) [x86_64-java]
$ cd demo1
$ jetty_rails
/Applications/jruby-1.1.4/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:34:in `require': IO error -- jetty_rails/handler/delegate_on_errors_handler (LoadError)
from /Applications/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:36
from /Applications/jruby-1.1.4/lib/ruby/gems/1.8/gems/jetty-rails-0.6/bin/jetty_rails:19:in `load'
from /Applications/jruby-1.1.4/bin/jetty_rails:19
というようなエラーになり、起動できません。
1.1.3の場合
$ jruby -v
jruby 1.1.3 (ruby 1.8.6 patchlevel 114) (2008-07-20 rev 7243) [x86_64-java]
$ cd demo1/
$ jetty_rails
2008-10-30 11:54:42.815::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
starting 3000
2008-10-30 11:54:42.071::INFO: jetty-6.1.9
2008-10-30 11:54:42.162::INFO: NO JSP Support for /, did not find org.apache.jasper.servlet.JspServlet
2008-10-30 11:54:43.903:/:INFO: Info: using runtime pool timeout of 30 seconds
2008-10-30 11:54:43.903:/:INFO: Info: received min runtimes = 1
2008-10-30 11:54:43.908:/:INFO: Info: received max runtimes = 5
2008-10-30 11:54:50.870:/:INFO: Info: add application to the pool. size now = 1
2008-10-30 11:54:50.915::INFO: Started SelectChannelConnector@0.0.0.0:3000
1.1.3では問題なく起動できます。
2008/10/30 by Tomo Nozawa
JMaglev
ブラジルのデベロッパ「Fabio Kung」氏が面白いデモを行っています。JRubyとオープンソースのJVMクラスタリング(オブジェクトシェア)アプリTerracottaを使って、今年のRailsConfで話題になったMaglev
MagLev presentation at RailsConf 2008 from Monty Williams on Vimeo.
と同様に、パッチをあてたJRubyが動作する別々のJVM間でオブジェクトの共有を行うというデモ。
パッチはまもなく公開予定。異なるJVM間でJRubyのオブジェクトを共有できるとちょっと面白いことができるかもしれませんね。
Via
2008/10/09 by Tomo Nozawa
メイン | 次のページ »