«前の日記(2011-12-17) 最新 次の日記(2011-12-25)» 編集

会長@腹部日記


2011-12-19 [長年日記]

_ Windows環境で torquebox + JRuby + #tDiary を動作させる - #advent11rb

Ruby Advent Calendar jp: 2011 の19日目の記事です。18日目の昨日は @sakairyota さんのRubyのnilはおともだちでした。

本日のエントリは Windows環境で torquebox + JRuby + tDiaryを動作させる です。

まずは、それぞれについて軽く説明。

torquebox TorqueBox provides an enterprise-grade environment that not only provides complete Ruby-on-Rails and Rack compatibility, but also goes beyond the functionality offered in traditional Rails/Rack environments.
JRuby RubyインタプリタのJavaによる実装
tDiary tDiaryはWeb日記(いわゆるブログ)を実現するオープンソースソフトウェアです。ブログサービスをレンタルするのではなく、自分でWeb日記を運用する人のためのツールです。

tDiaryは @tdtds さん、 @hsbt さん、 @fdiary さんをはじめとして開発が盛んに行われています。この日記も当然tDiaryです。rack対応が非公式ながら着々と進んでおります。torqueboxはrackもサポートしているので、当然、tDiaryも動くはずです。ここで、本記事のレア度を増すために、Windowsで実施してみます。

準備します

環境は Windows7 Professional(64bit)です。

torquebox + JRuby

つい最近、2.0.0 beta版が公開されています。

解凍すると、JRuby1.6.5も含まれています。

環境変数の設定

Javaは用意されているものとします。

set JAVA_HOME=環境にあわせて
set JBOSS_HOME=C:\App\torquebox-2.0.0.beta1\jboss
set JRUBY_HOME=C:\App\torquebox-2.0.0.beta1\jruby
set PATH=%JRUBY_HOME%\bin;%PATH%
tDiary

Windows環境ではありますが、gitbash等を使って、tDiaryの最新ソースを取得します。

> git clone https://github.com/tdiary/tdiary-core.git
ディレクトリ構成
torquebox-2.0.0.beta1 <=> torquebox-current とジャンクションを作成。
C:\App\torquebox-current\jboss
                        \jruby
                        \share
                        \tdiary-core # git clone したtDiaryソース
                        RakeFile
とりあえず公式ドキュメントを・・・

torqueboxのドキュメントを流し読み。

よくわからんなーと思っていたところ、SlideShareにチュートリアルのようなものを発見。

Rakefileには以下を書けとのこと。tdiary-core\Rakefileの冒頭に追加しました。

require 'torquebox-rake-support'

rakeを実行してみようとすると、tDiaryのRakefileに bundle installせよ、と怒られたのでbundle install。*1

> jruby.exe -S bundle install

その後

> jruby.exe -S rake -T
rake clean                           # Remove any temporary products.
rake clobber                         # Remove any generated file.
rake rdoc                            # generate rdoc files
rake spec                            # Run the code in spec
rake spec:acceptance                 # Run the code examples in spec/accept...
rake spec:acceptance:cgi             # Run the code examples in spec/accept...
rake spec:acceptance:secure          # Run the code examples in spec/accept...
rake spec:core                       # Run the code examples in spec/core
rake spec:plugin                     # Run the code examples in spec/plugin
rake spec:report                     # Displayed code coverage with SimpleCov
rake test                            # Run tests
rake torquebox:archive               # Create a nice self-contained applica...
rake torquebox:check                 # Check your installation of the Torqu...
rake torquebox:deploy[context_path]  # Deploy the app in the current directory
rake torquebox:deploy:archive        # Create (if needed) and deploy as app...
rake torquebox:freeze                # Freeze application gems
rake torquebox:launchd:check         # Check if TorqueBox is installed as a...
rake torquebox:launchd:install       # Install TorqueBox as an launchd daemon
rake torquebox:launchd:restart       # Restart TorqueBox when running as an...
rake torquebox:launchd:start         # Start TorqueBox when running as a la...
rake torquebox:launchd:stop          # Stop TorqueBox when running as an la...
rake torquebox:run                   # Run TorqueBox server
rake torquebox:undeploy              # Undeploy the app in the current dire...
rake torquebox:upstart:check         # Check if TorqueBox is installed as a...
rake torquebox:upstart:install       # Install TorqueBox as an upstart service
rake torquebox:upstart:restart       # Restart TorqueBox when running as an...
rake torquebox:upstart:start         # Start TorqueBox when running as an u...
rake torquebox:upstart:stop          # Stop TorqueBox when running as an up...

torqueboxのtaskが出てきました。先のSlideShareの中身に従うと次は・・・

> jruby.exe -S rake torquebox:deploy
TorqueBox installation appears OK
TorqueBox Server OK: C:/App/torquebox-current/jboss/standalone
Deployed: tdiary-core-knob.yml
    into: C:/App/torquebox-current/jboss/standalone/deployments

実行してみると、%JBOSS_HOME%\standalone\deployment に tdiary-nob.xmlが生成されています。

今回は以下です。

C:\App\torquebox-current\jboss\standalone\deployments\tdiary-core-knob.yml

Ruby1.9で動作させたいため、tdiary-core-knob.yml に以下を追記。

ruby:
  version: 1.9

では起動してみます。

> jruby.exe -S rake torquebox:run
TorqueBox installation appears OK
TorqueBox Server OK: C:/App/torquebox-current/jboss/standalone
Calling "C:\App\torquebox-current\jboss\bin\standalone.conf.bat"
===============================================================================

 JBoss Bootstrap Environment

 JBOSS_HOME: C:\App\torquebox-current\jboss

 JAVA: C:\App\JDK_7_u1_x64\bin\java

 JAVA_OPTS: -Dprogram.name=standalone.bat -Xms64M -Xmx512M -XX:MaxPermSize=256M -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.jboss.resolver.warning=true -Djboss.modules.system.pkgs=org.jboss.byteman -server

===============================================================================
(snip)
22:33:08,101 INFO  [org.torquebox.core.runtime] (MSC service thread 1-4) Created ruby runtime (ruby_version: RUBY1_8, compile_mode: JIT, context: global) in 3.12s
22:33:08,115 INFO  [org.jboss.as] (Controller Boot Thread) JBoss AS 7.1.0.Beta1 "Tesla" started in 5135ms - Started 152 of 221 services (68 services are passive or on-demand)
22:33:08,119 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "tdiary-core-knob.yml"
22:33:08,458 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.deployment.unit."tdiary-c
ore-knob.yml".CONFIGURE_MODULE: org.jboss.msc.service.StartException in service jboss.deployment.unit."tdiary-core-knob.yml".CONFIGURE_MOD
ULE: Failed to process phase CONFIGURE_MODULE of deployment "tdiary-core-knob.yml"
       at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:121) [jboss-as-server-7.1.0.Beta1.jar:]
       at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1824) [jboss-msc-1.0.1.GA.jar:]
       at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1759) [jboss-msc-1.0.1.GA.jar:]
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [:1.7.0_01]
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [:1.7.0_01]
       at java.lang.Thread.run(Thread.java:722) [:1.7.0_01]
Caused by: org.jruby.exceptions.RaiseException: (SyntaxError) /C:/App/torquebox-current/tdiary-core/misc/filter/plugin/ja/antispamservice.rb:7: invalid multibyte char (UTF-8)

あらっ、失敗。tDiaryのソース中にマルチバイト文字が含まれていると syntax errorになってしまっています。ログの途中に現れてる RUBY1_8という文字列からして、どうみても1.8で解釈されている様子・・・ymlファイルにruby:versionを指定してもダメみたいです。

めぼしい情報も見当たりませんでした。とりあえず今回は、tDiary動作に影響を及ぼさないと考えられる、マルチバイト文字が含まれるソースを削除していくという荒技に出ました。削ったファイルの量を見ると、どう見ても動作に影響を与えそうに思ってきました。。。大丈夫か、これ・・・

tdiary-core\spec\*
           \test\*
           \plugin\ja\*
           \misc\filster\plugin\ja
           \misc\style\emptdiary\*
           \misc\plugin\ja\*
                        a.rb
                        append-css.rb
                        calendar3.rb
                        counter.b
                        disp_referer.rb
                        draft.rb
                        dropdown_calendar.rb
                        image.rb
                        kw.rb
                        random_google.rb
                        recent_comment3.rb
                        speed_comment.rb

すると、あからさまに大事そうなファイルでエラーに。

Caused by: org.jruby.exceptions.RaiseException: (SyntaxError) /C:/App/torquebox-current/tdiary-core/plugin/00default.rb:944: invalid multibyte char (UTF-8)

944行目はここです。とりあえず英語にしてごまかそう。。

  @conf['comment_description'] = "ツッコミ・コメントがあればどうぞ! URIは1つまで入力可能です。"
  
  if @sp_path.inject(false){|r, dir| r || FileTest.exist?("#{dir}/hide-mail-field.rb") }
  	if @conf['sp.selected']
  		@conf['sp.selected'].concat("hide-mail-field.rb\n")
  	else
  		@conf['sp.selected'] = "hide-mail-field.rb\n"
  	end
  	@conf['spamfilter.bad_mail_patts'] = "@"
  	@conf['comment_description'].concat("spam対策でE-mail欄は隠してあります。もしE-mail欄が見えていても、何も入力しないで下さい。")

次は、もっと大事そうなファイルでエラーになりました。ここは先人達の知恵と涙の結晶っぽいところです。

Caused by: org.jruby.exceptions.RaiseException: (SyntaxError) /C:/App/torquebox-current/tdiary-core/tdiary/io/pstore.rb:103: invalid multibyte char (UTF-8)

こんなところに全角スペースが。

 	elsif /^[  <]/u !~ lines[0]
 		@subtitle = lines.shift.chomp
 	end

ところが、tDiaryでは標準の記法において全角スペースは重要になります。削除するわけにもいかないので、下記のように対処してみました。

 ZENKAKU_SPACE=[227, 128, 128].pack("C*")
 (snip)
 	elsif /^[#{ZENKAKU_SPACE} <]/u !~ lines[0]
 		@subtitle = lines.shift.chomp
 	end

tdiary-core/tdiary/tdiary_style.rbへも、同様の処置を施しました。そろそろ何やってるかわからなくなってきたのですが、もう一度挑戦。

> jruby.exe -S rake torquebox:run
(snip)
22:52:41,616 INFO  [org.torquebox.core.runtime.SharedRubyRuntimePool] (MSC service thread 1-1) Starting web runtime pool asynchronously
22:52:41,618 INFO  [org.torquebox.core.runtime] (Thread-95) Creating ruby runtime (ruby_version: RUBY1_9, compile_mode: JIT, app: tdiary-core, context: web)
22:52:41,689 INFO  [org.jboss.as.messaging] (MSC service thread 1-6) JBAS011601: Bound messaging object to jndi name java:/queues/torquebox/tdiary-core/tasks/torquebox_backgroundable
22:52:41,846 INFO  [org.jboss.web] (MSC service thread 1-3) registering web context:
22:52:41,900 INFO  [org.jboss.as.server.controller] (DeploymentScanner-threads - 2) Deployed "tdiary-core-knob.yml"
22:52:42,764 INFO  [org.torquebox.core.runtime] (Thread-95) Initialize? true
22:52:42,764 INFO  [org.torquebox.core.runtime] (Thread-95) Initializer=org.torquebox.web.rack.RackRuntimeInitializer@1a3513b5
22:52:43,114 INFO  [org.torquebox.core.runtime.BundlerAwareRuntimeInitializer] (Thread-95) Setting up Bundler
22:52:44,729 INFO  [org.torquebox.core.runtime] (Thread-95) Created ruby runtime (ruby_version: RUBY1_9, compile_mode: JIT, app: tdiary-core, context: web) in 3.11s

苦労のかいがあり、起動したようです。

ではおそるおそるブラウザからアクセス・・・

no_tdiary_conf

さぁ、tdiary.confがjbossの画面に登場し、やっとtDiaryらしくなってまいりました。

tdiary.confを用意するのを忘れていました。とりあえず日本語のtdiary.confは使えなさそうな気配がするため、英語版のtdiary.conf.sample_enをtdiary.confとして用意します。

うごきました!

default_top

追記してみます

success_append

おっけーおっけー

次はツッコミ

その名の通り、ツッコミを確認するまでがtDiaryの動作確認です。

tukkomi

おっけーおっけー

では肝心の日本語を追記してみます。

期待していませんが・・・

ja_status_500

JavaVMのStackTraceが出て、ダメでしたorz

マルチバイト文字がらみの現象を解決せずに進んできたためと考えられます。今回はここで体力切れです。

その他

rake torquebox:runを実行したコンソールでは、SAFEレベル未サポートとの警告が出ていました。

11:52:13,611 ERROR [stderr] (http--127.0.0.1-8080-1) vfs:/D:/Application/torquebox-2.0.0.beta1/tdiary-core/tdiary/core_ext.rb:81 warning: SAFE levels are not supported in JRuby

まとめ

  • tDiaryもなんとかtorqueboxで動く
    • tDiaryのrack対応のおかげ
  • 日本語関連が全くうまくいかない原因は・・・torquebox側に何かあるんじゃないかと推測
    • rake torquebox:runを行うと、invalid multibyte-char(UTF-8)がなんで発生してしまうのか??
    • ちなみに、jruby-rackではちゃんとtDiaryは動作する。JRubyの問題とも思えない。。
こんな感じで。。。
jruby -S rackup
2011-12-19 23:09:50] INFO  WEBrick 1.3.1
2011-12-19 23:09:50] INFO  ruby 1.8.7 (2011-10-25) [java]
2011-12-19 23:09:50] INFO  WEBrick::HTTPServer#start: pid=5572 port=9292

なんとか動いたので、オチがついてよかったです。実は書いている以上のデバッグをやったりしたので、退屈な職業プログラマには勉強になりました。

次回20日目は @sasata299 さんです。このエントリよりもきっとタメになるエントリになることでしょう!

*1 ActiveRuby等だとこの段階のnokogiriインストールで失敗してしまう。。。

本日のツッコミ(全1件) [ツッコミを入れる]
_ sugamasao (2011-12-26 02:02)

マルチバイト文字周りのエラーは、jrubyを起動する時に --1.9 を付けるとRuby1.9相当で動くと思うので、それで試したらイイ感じになったりしませんでしょうかー。(jRubyは普段触らないので全然的外れだったらごめんなさい)