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] ap4r と reliable-msgの違い?
babieさんとこでap4rなるプロジェクトを知ったので、早速インスコして眺めてみた。非同期・異機種分散処理とかかなり好きなので。
...永続化層にreliable-msgを使っているとのことだが、正直reliable-msgとの違いがよくわからない。reliable-msgにもrails supportは含まれてるみたいだし。realiable-msgの上にレイヤーを作ってSOAP, XMLRPCサポートを追加したものなのかな?
日本語解説も読んだんだけど...
Rindaで処理エージェントを複数待機させておいて、処理メッセージをいくつかtupplespaceに放り込むと、それこそえさに群がる池の鯉のように処理エージェントが処理しまくるので見てて楽しいのだけど、Rindaでつなぐとお互いのRubyとdrubyのバージョンをあわせないといけないから、こういうライブラリのほうがいいってことなのかな?
2006-09-10(Sun) [長年日記] この日を編集
_ [Ruby]ap4r解説してもらっちゃった!
開発者の方に疑問について解説してもらいました。ありがとうございます。やっぱり書いてみるもんですね:-p
せっかくなので自分の理解を図にしてみました。
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からの呼び出しが同期式なら(配送を確実に行うなら呼び出しが完了するまで待つ気がするので)最大同時呼び出し数と呼び出しのタイムアウトの組み合わせで実現できるのかな、なんて思ったり。
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でも同じ。うーん。
_ ななし [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(/ /, ' ') : '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がでてくれればいいのかも。ソース見る限りちょっと難しそうだったので見送り。
_ 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、という気がしないでもないのですけど。
Before...
_ Kilkoi [Cool topic! ;)]
_ bob [c4nrAT hi great site thx http://peace.com]
_ BMW [Cool site! Helpful topic! :)]