最新 追記

これ日記なん?


2006-09-02(Sat) [長年日記] この日を編集

_ [Ruby]mongrel win32 サービスを試す

mongrelがwin32サービスに対応しているらしい、というところで止まっていたのでちょっと試してみた。

OS

  • WindowsXP SP2 HOME

ruby

C:\home\kog\development\test_mongrel>ruby -v
ruby 1.8.4 (2005-12-24) [i386-mswin32]

gem list

C:\home\kog\development\test_mongrel>gem list
*** LOCAL GEMS ***

gem_plugin (0.2.1)
    A plugin system based only on rubygems that uses dependencies only

mongrel (0.3.13.3)
    A small fast HTTP library and server that runs Rails, Camping, and
    Nitro apps.

rake (0.7.1)
    Ruby based make-like utility.

sources (0.0.1)
    This package provides download sources for remote gem installation

win32-service (0.5.0)
    win32-service for doing services in Ruby

C:\home\kog\development\test_mongrel>

準備

C:\home\kog\development\test_mongrel>copy c:\opt\ruby\lib\ruby\gems\1.8\gems\mongrel-0.3.13.3-mswin32\examples\mongrel_simple_*.rb .

動かしてみます

mongrel_simple_ctrl.rb ってのがwin32サービスへのインストーラ・アンインストーラ・コントローラを兼ねているみたい。win32サービスとして動くのは mongrel_simple_service.rb の模様。

じゃあ動かしてみますかね。オプションなしならヘルプ出るでしょ。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb
C:\home\kog\development\test_mongrel>

...でない。明示しろってことか。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -h
Usage: mongrel_simple_ctrl [options]
    -d, --delete                     Delete the service
    -u, --uninstall                  Delete the service
    -s, --start                      Start the service
    -x, --stop                       Stop the service
    -i, --install                    Install the service
    -h, --help                       Show this help message.

じゃインスコ。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -s
One moment, start pending
Mongrel HTTP Server service started

早速とめてみる。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -x
mongrel_simple_ctrl.rb:62:in `stop': パイプは終了しました。 (Win32::ServiceError
)
        from mongrel_simple_ctrl.rb:62

エラーになるねえ。もう一回はどうだ?

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -x
mongrel_simple_ctrl.rb:62:in `stop': そのサービスを開始できませんでした。 (Win32
::ServiceError)
        from mongrel_simple_ctrl.rb:62

メッセージが変わった。管理ツールで確認すると止まっている模様。

管理ツールで起動・停止させてみると、起動はいいけど停止で時間がかかるときがあるみたい。時間がかかるとき、停止ダイアログの「キャンセル」ボタン押してもサービス自体は止まる模様。

いろいろ試すとこういうメッセージの時もあった。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -x
mongrel_simple_ctrl.rb:62:in `stop': 制御要求を処理しているときに、サービスで例
外が発生しました。 (Win32::ServiceError)
        from mongrel_simple_ctrl.rb:62

じゃあ削除。

C:\home\kog\development\test_mongrel>ruby -rubygems mongrel_simple_ctrl.rb -d
Mongrel HTTP Server service deleted

たしかに動くことは動くけど、もうちょっとテストしないと怖いな。

あと、すぐに停止できないのも運用上気になる。サーバ落とすつもりで落ちてないってことになりかねないし。

_ [Ruby] ap4rreliable-msgの違い?

babieさんとこでap4rなるプロジェクトを知ったので、早速インスコして眺めてみた。非同期・異機種分散処理とかかなり好きなので。

...永続化層にreliable-msgを使っているとのことだが、正直reliable-msgとの違いがよくわからない。reliable-msgにもrails supportは含まれてるみたいだし。realiable-msgの上にレイヤーを作ってSOAP, XMLRPCサポートを追加したものなのかな?

日本語解説も読んだんだけど...

Rindaで処理エージェントを複数待機させておいて、処理メッセージをいくつかtupplespaceに放り込むと、それこそえさに群がる池の鯉のように処理エージェントが処理しまくるので見てて楽しいのだけど、Rindaでつなぐとお互いのRubyとdrubyのバージョンをあわせないといけないから、こういうライブラリのほうがいいってことなのかな?

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ Kilkoi [Cool topic! ;)]

_ bob [c4nrAT hi great site thx http://peace.com]

_ BMW [Cool site! Helpful topic! :)]


2006-09-10(Sun) [長年日記] この日を編集

_ [Ruby]ap4r解説してもらっちゃった!

開発者の方に疑問について解説してもらいました。ありがとうございます。やっぱり書いてみるもんですね:-p

せっかくなので自分の理解を図にしてみました。

ap4rとrinda比較

ap4rとreliable-msgの違いは2点。

  • ap4rは自分自身が処理Bに投げる。
    • 処理Aと処理BがそれぞれWebアプリの場合は両方ともhttpで待ち受けているので、確かにAとBが同じ枠組みでかけるなあ...なるほど。
    • というか、ひとつのアプリで処理Aと処理Bを実装して、これから呼び出してもらう感じか。
  • ap4rは別のap4rにroutingすることもできる。
    • 永続化機能がそれなりに重そうだからこれは必要になりそう。

なるほどそういうことか。

reliable-msgは詳しくないので、とりあえずRindaについて書いてみる。 Rindaの場合は処理Bがtuplespaceからとってくる。 処理Bはgetするときに待ち合わせるので、処理B, 処理B',...と増やしていける。つまり、処理Bをいくつか起動しておいて、tuplespaceにタプル(処理メッセージ)を放り込むと処理Bが入れ食い状態で動くというわけ。 逆に処理Bがひとつで処理Aがたくさんある場合(もしくは処理Bが処理し終える前に処理Aがタプルを放りこまれてしまう場合)は、tuplespace上で待ち行列ができて、処理Bは順番に淡々と処理をこなしていく感じになる。

ap4rでもRindaみたいなモデルでの設定って可能なのかしら。 つまり投げる側が処理Bの負荷に応じて手加減(!)できるみたいな。ap4rからの呼び出しが同期式なら(配送を確実に行うなら呼び出しが完了するまで待つ気がするので)最大同時呼び出し数と呼び出しのタイムアウトの組み合わせで実現できるのかな、なんて思ったり。

_ [Ruby]ActiveMQ+Stomp

っていう組み合わせにも興味があるんですけど、日本語解説記事が見つからない。どなたか公開してくれる親切な方いらっしゃいませんか...。

_ [Ruby][Rails]ActiveMessaging

さがしてみたらやっぱりあった。Railsプラグインみたい。


2006-09-12(Tue) [長年日記] この日を編集

_ [Ruby]わわ、初トラバだ

ita-wasaさんからトラバもらってるのにさっき気づきました。説明ありがとうございます。*1

kiwamuさんの図解を説明を聞いてからあらためて見てみると、なるほど狙いがよく理解できました。

ぜひ何かの仕掛けで使ってみたいと思います。

*1 RSSにツッコミは入るのにトラバは入らんのか...

_ [Ruby][Radiant]mongrelではRadiantは動かない?

http://ruby-lang.org/ja/ がリニューアルされたのを見て、よさそうだったので Radiant を試してみた。とりあえずgemでいれ、sqlite3でやってみる。

mongrel_rails を development で動かしてトップページにアクセスすると

 NoMethodError in SiteController#show_page

undefined method `find' for Status:Class

RAILS_ROOT: C:/home/www/www/radiant-trunk/config/..
Application Trace | Framework Trace | Full Trace

#{RAILS_ROOT}/app/models/page.rb:49:in `status'
#{RAILS_ROOT}/app/models/page.rb:57:in `published?'
#{RAILS_ROOT}/app/models/behavior.rb:92:in `find_page_by_url'
#{RAILS_ROOT}/lib/advanced_delegation.rb:10:in `find_by_url'
#{RAILS_ROOT}/app/models/page.rb:72:in `find_by_url'
#{RAILS_ROOT}/app/controllers/site_controller.rb:29:in `find_page'
#{RAILS_ROOT}/app/controllers/site_controller.rb:34:in `show_uncached_page'
#{RAILS_ROOT}/app/controllers/site_controller.rb:22:in `show_page'

productionでも同じ。うーん。

本日のツッコミ(全1件) [ツッコミを入れる]

_ ななし [mongrel 0.3.13.3 on XPsp2 radiant 0.5.2, rails 1.1.6で動きまいす..]


2006-09-17(Sun) [長年日記] この日を編集

_ [Hiki]Hikiで任意の箇所にアンカー&指示

後輩> Hikiでtocの見出しにtoc以外からジャンプできるようになりませんか?
俺  > tocの見出しアンカーって自動採番だから難しいと思うけど...

ってことでやってみた。ようは

<a name="kokodayo"> </a>

ってのがプラグインで指示できて、あとこれまた別の指示で

http://Server/hikifarm/hiki_sono_1/?Nantoka#kokodayo

みたいなリンクが生成されれればいいわけだから、

プラグイン

def a_h(anchor)
  %Q|<a name="#{anchor}"> </a>|
end

InterWikiName

* [[self|http:?$1]]

本文(リンクされるほう)

! {{a_h kokodayo}}見出し1なんだよ。

本文(リンクするほう)

* [[self:Nantoka#kokodayo]]

hiki-currentで確認した。 自Wiki内を指すリンクが簡単にハッシュ込みで指示できるならInterWikiNameへの追加はいらないんだけどなー。たとえば:

* http:?TextFormattingRules#plugin

と書くと

<li>?TextFormattingRules#plugin<a class="nodisp" href="./?c=edit;p=%3FTextFormattingRules%23plugin" title="ページ ?TextFormattingRules#plugin を新規作成し、編集します。">?</a></li>

になっちゃうし。

とりあえず任意の箇所にアンカーがおけるようになったしよしとするか。

_ [Hiki]hikiの src.rb の表示が寂しい

せっかくsvnを使っていることだし、ソースそのままでは味気ないので svn blame の出力がいいんじゃね?ということで作ってみた。あまりにも手抜きなのでdiffだけ載せる。

--- ..\hiki\misc\plugin\src.rb  Wed Jul 13 01:43:06 2005
+++ blame.rb    Sun Sep 17 06:49:29 2006
@@ -1,7 +1,4 @@
-# $Id: src.rb,v 1.8 2005/07/13 01:43:06 fdiary Exp $
-# Copyright (C) 2003 TAKEUCHI Hitoshi <hitoshi@namaraii.com>
-
-def src
+def blame
   sources = <<EOS
 <!DOCTYPE html
     PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
@@ -15,7 +12,7 @@
 <body>
 <div>
 EOS
-  page = @db.load( @page )
+  page = get_blame( @page )
   sources << (page ? page.escapeHTML.gsub(/\n/, "<br>\n").gsub(/ /, '&nbsp;') :
 'load error.')
   sources  << <<EOS
 </div>
@@ -36,6 +33,16 @@
   nil # Don't move to the 'FrontPage'
 end

+def get_blame(page)
+  ret = ''
+  Dir.chdir("#{@db.pages_path}") do
+    open("|svn blame -r HEAD #{page.escape.untaint}") do |f|
+      ret = f.read
+    end
+  end
+  ret
+end
+
 add_body_enter_proc(Proc.new do
-  add_plugin_command('src', src_label, {'p' => true})
+  add_plugin_command('blame', blame_label, {'p' => true})
 end)

これでsrc.rbの出力がsvn blame 相当になってちょっとうれしいかも。ていうか、history.rbの表示で、行ごとにrevisionがでてくれればいいのかも。ソース見る限りちょっと難しそうだったので見送り。

本日のツッコミ(全1件) [ツッコミを入れる]

_ college scholarships [nice post. thanks.]


2006-09-18(Mon) [長年日記] この日を編集

_ [Rails][Radiant]mongrelでRadiant動いた!

gem clean で古いものを一掃したら、mongrelが動かなくなった。で、mongrelを再インストールしたら見事に動いた。なんかおかしくなってたみたい。

_ [Hiki]Hikifarmのindex.cgiをコピーしなくてもいいようにする方法

hikifarmを設定するときに、hiki/misc/hikifarm/index.cgi, hiki/misc/hikifarm/hikifarm.conf を公開ディレクトリにコピーするようになっていますが、

  • 当方Windowsなのでコピー時に#!書き換えの一手間必要
  • そもそもコピーを忘れやすい。

ので、公開ディレクトリに本体をコピーしないでセットアップしたいなーと思っていました。今日いろいろやってみたらできたみたいなので書いてみます。まずい箇所あったら指摘していただけるとウレシス。

hikifarm.confを2回読むのはどうなん?という気もしますが。

index.cgi

#!c:/ruby/bin/ruby

hiki=''
eval(File.read('hikifarm.conf').untaint)
$:.unshift "#{hiki}"
load "#{hiki}/misc/hikifarm/index.cgi"

if __FILE__ == $0 || ENV['MOD_RUBY']
  $SAFE = 1
  $:.delete(".") if File.writable?(".")
  conf = HikifarmConfig.new
  $:.unshift(conf.hiki)
  App.new(conf).run
end

patch

--- index.cgi.orig	Mon Sep 18 12:41:00 2006
+++ index.cgi	Mon Sep 18 13:59:47 2006
@@ -125,7 +125,7 @@
     @wikilist = []
     @farm_pub_path = farm_pub_path

-    Dir["#{farm_pub_path}/*"].each do |wiki|
+    Dir["#{@farm_pub_path}/*"].each do |wiki|
       wiki.untaint
       next if not FileTest.directory?(wiki)
       next if FileTest.symlink?(wiki)
@@ -471,7 +471,7 @@
 class App
   def initialize(conf)
     @conf = conf
-    @farm = Hikifarm.new(File.dirname(__FILE__), @conf.ruby, @conf.repos_type, @conf.repos_root, @conf.data_root)
+    @farm = Hikifarm.new(File.dirname('hikifarm.conf'), @conf.ruby, @conf.repos_type, @conf.repos_root, @conf.data_root)
     @cgi = conf.cgi
   end

_ [Hiki]ついでに思ったところをつらつらと。

hikifarm/index.cgi は中にEUC文字列を含んでいるので、Windowsのメモ帳でそーっと書き換え(たとえばサーバ室にいて、おきにのエディタをセットアップしてなかったサーバをひとりでいじってるところを想像していただきたい)したつもりでみごとに文字化けさせたりってのは私だけでしょうか?これも分離したいなあ。プラグインみたいに依存部分を切り出せばいいのかしら?

それから、HikiFarm, HikiFarmIndexPage, HikiFarmRSSPage の各引数に HikiFarmConfigのattributeをバラして渡してるのはなんか意味があるんでしょうか?@confそのままじゃだめなん?

ついでに、ソース読んでてわかんなかったところを書いておこう。HikiFarmConfigのloadメソッドにこういうのがある。

   if FileTest::symlink?( __FILE__ ) then
     hikifarm_template_dir = File::dirname( File::expand_path( File::readlink( __FILE__ ) ) ) + '/template'
   else
     hikifarm_template_dir = File::dirname( File::expand_path( __FILE__ ) ) + '/template'
   end

ここの__FILE__って、公開ディレクトリにコピーされたindex.cgiではないのかな?実際にはみごとにhikifarm_template_dir には hiki/misc/hikifarm/template のフルパスが設定されるんだけど...(?_?


2006-09-26(Tue) [長年日記] この日を編集

_ [Rails]Rails1.2のActiveRecord

http://wiki.fdiary.net/rails/?RailsMeetingTokyo-0010 からトラバをたどってみていたら、

ActiveRecord周りのあまりの変化の少なさが目立つ。with_scope周りなど、特に更新されていない。1.2では、ActiveRecord周りの進化はあまり期待しないほうがよさそうだ。

らしい。

うーんそういう評価になったのか。個人的にはまともにdecimalがサポートされるようになったのがとても大きくて1.2は非常に楽しみなのですが。

1.1では、migrateでdecimalが設定できない(Floatにマップされてしまう)んで、積極利用できない判断(泣く泣く使える案件だけ使う)だったりするんですが、皆さんそんなにお困りじゃないのかしら?

困るといえば、ORACLEに対してもバインド変数を一切使ってくれないところがあります。とりあえず9i以降の cursor sharing = force 機能で逃げようかと思っているんですが、Rails+ORACLEとかってあんまりいないのかな?といいつつ今は私もMySQLをメインで使っていたりするのですが、それはこれの影響が結構大きかったりします。

先日ちょこっとActiveRecordを追ってみたんですが、やはり内部でSQL文をいったん文字列で組み立ててるところが多くて、とても修正できそうにありませんでした。つーか、バインド変数を明示的に使わないとパフォーマンスに影響するよ、ってのは値段のわりにどーなのよ>ORACLE、という気がしないでもないのですけど。