おまぬけ活動日誌

最近のツッコまれどころ

この日誌から Google してもらう


2009年02月10日(Tue) 今日もいろいろあった [同日]

[Ruby] ruby-1.8.7-p72を作ってみた

hsbtさんがやってくれたtDiary-pluginの ruby-1.9.1p0 動作チェックを見て、wether.rbが「動かないので修正が必要」と知って、どこまでできるか試してみることにした。

えーと、Ruby 1.9.1の歩き方を見ると、まずは1.8.7を使えと書いてある。(役にたつね。てへへ。)

というわけで、ftp://ftp.ruby-lang.org/pub/ruby/1.8/からruby-1.8.7-p72.tar.bz2をいただいてきて作ってみた。make test-allは0F0E。さすが。

…って、p72はREXMLのDoS脆弱性があるの?今回はローカルにtDiaryを動かすだけだからいいけど、えーと、ruby-1.8.7-p73以降はどこで入手するべきなのでしょう?Subversionレポジトリからcheckoutするのかな?

[tDiary] 久しぶりにtDiaryをいじろうとしてみる。

えーと。まずはcheckoutかな。

svn co https://tdiary.svn.sourceforge.net/svnroot/tdiary/trunk tdiary

さくっとtdiary/plugin/に移動して、 weather.rbとかja/weather.rbにテストケースが無いのをみてへこむ。 Legacy code。

どうしようかな。 まずは1.8.7-p72と1.9.1-p0で閲覧できるようにするか。

# /etc/init.d/httpd start
httpd を起動中: httpd: bad group name apache
                                                           [失敗]

先は長いぞ…。/usr/sbin/vigrしてapacheグループを追加してみた。 今度は成功。

次はsymbolic linkで設置する方法を思いだす。 公開サーバで下記のような荒っぽいことをやらないようにね。 この環境ではDocumentRootが/var/www/htmlなので、

# cd /var/www/html/
# mkdir tdiary
# chown <常用ユーザ> tdiary
$ cd /var/www/html/tdiary

えーい、もう一度checkoutしちゃえ。

$ svn co https://tdiary.svn.sourceforge.net/svnroot/tdiary/trunk

http://localhost/tdiary/trunk/ を見ると、 coreのディレクトリのアイコンが爆弾のマークなのが笑えますが。

あとはtDairy用のディレクトリなど。

$ mkdir data
$ chmod og+rwx data

tdiary.confはtdiary.conf.sampleからコピーして、 @data_path = '/var/www/html/tdiary/data' にしておいた。

/etc/httpd/conf/httpd.confでAllowOverrideをallにして、.htaccessは下記。

Options +ExecCGI
AddHandler cgi-script .rb

これでhttp://localhost/tdiary/trunk/core/index.rbが ruby-1.8.6-p111 (Momonga 4)で動くようになった。

index.rbとupdate.rbはどうしようかな。

tdiary.confで下記のようにしてみよう。

@index = "index-#{RUBY_VERSION}.rb"
@update = "update-#{RUBY_VERSION}.rb"

例えばindex-1.8.7.rbは下記。chmod a+x しておく。

この段階で./index-1.8.7.rbすると Permission denied - /var/www/html/tdiary/data//log/debug.log (Errno::EACCES) と言われた。

# cd /var/www/html/tdiary/data
# chmod -R a+rw *

これで端末からは起動できるようになったけれど、 ApacheからはPermission deneied。はっ、やつか。

# /usr/sbin/setenforce Permissive

これでもだめ。あー、わかりました。 常用ユーザーのホームディレクトリにapacheさんが行けなかったんだ。 chmod o+x $HOME。

これで、やっと、下記のURLが使えるようになりました。

  • http://localhost/tdiary/trunk/core/index-1.8.7.rb
  • http://localhost/tdiary/trunk/core/index-1.9.1.rb
  • http://localhost/tdiary/trunk/core/update-1.8.7.rb
  • http://localhost/tdiary/trunk/core/update-1.9.1.rb

環境をつくるだけで時間切れが近いのう… T_T

[Ruby][tDiary] お天気プラグインをruby-1.9.1で使えるようにする 成功したかな?編

たぶんnet/http.rbの微妙なAPIの変化にはまった模様。

まず1.8.7側からお天気プラグインの設定と利用。 「選択可能なプラグインはありません。あう。えーと、tdiary.confに下記を追加。

@options['sp.path'] = '../plugin'

これでプラグイン選択からweather.rbを選び、 お天気プラグインを設定。これで本文を追記したらちゃんと天気が記録されました。 えらい。

さーて。1.9.1からこの日記を表示してみますよ。

incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string) (Encoding::CompatibilityError)

ふむ。追うのは大変だけどきっと記録したファイルをASCII-8BITで読んでるんだね。 …これはdata/cache/*.parserが1.8.7と1.9.1とで互換じゃないからか。 これらのファイルを消すと、1.8.7が記録した天気を1.9.1で表示することができた。

しかし、1.9.1で天気を記録すると記録ファイルのerrorの項が 「undefined method `keys' for nil:NilClass」なんてなってる。 weather.rbの282-283行目をコメントアウトしてみると、 下記のようなバックトレースが得られた。

undefined method `keys' for nil:NilClass (NoMethodError)

/home/<常用ユーザー>/local/lib/ruby-1.9.1-x86_64/1.9.1/net/http.rb:809:in `get'
(plugin/weather.rb):265:in `block (2 levels) in get'
/home/<常用ユーザー>/local/lib/ruby-1.9.1-x86_64/1.9.1/net/http.rb:564:in `start'
/home/<常用ユーザー>/local/lib/ruby-1.9.1-x86_64/1.9.1/net/http.rb:453:in `start'
(plugin/weather.rb):264:in `block in get'
/home/<常用ユーザー>/local/lib/ruby-1.9.1-x86_64/1.9.1/timeout.rb:52:in `timeout'
/home/<常用ユーザー>/local/lib/ruby-1.9.1-x86_64/1.9.1/timeout.rb:82:in `timeout'
(plugin/weather.rb):261:in `get'
(plugin/weather.rb):440:in `get_weather'
(plugin/weather.rb):496:in `block (2 levels) in load_plugin'
/var/www/html/tdiary/trunk/core/tdiary.rb:822:in `call'
/var/www/html/tdiary/trunk/core/tdiary.rb:822:in `block in update_proc'
/var/www/html/tdiary/trunk/core/tdiary.rb:821:in `each'
/var/www/html/tdiary/trunk/core/tdiary.rb:821:in `update_proc'
/var/www/html/tdiary/trunk/core/tdiary.rb:1486:in `block in do_eval_rhtml'
/var/www/html/tdiary/trunk/core/tdiary.rb:1486:in `instance_eval'
/var/www/html/tdiary/trunk/core/tdiary.rb:1486:in `do_eval_rhtml'
/var/www/html/tdiary/trunk/core/tdiary.rb:1074:in `eval_rhtml'
/var/www/html/tdiary/trunk/core/update.rb:67:in `<top (required)>'
/var/www/html/tdiary/trunk/core/update-1.9.1.rb:2:in `load'
/var/www/html/tdiary/trunk/core/update-1.9.1.rb:2:in `<main>'

getの第二引数が今まではnilを許していたのが、 今後は{}にしなくちゃいけないのかしらん。 というわけでできたのが下記のパッチ。

Index: plugin/weather.rb
===================================================================
--- plugin/weather.rb	(リビジョン 3402)
+++ plugin/weather.rb	(作業コピー)
@@ -250,7 +250,7 @@
 		end
 	end
 
-	def get( url, header = nil, items = {} )
+	def get( url, header = {}, items = {} )
 		@url = url.gsub(/[\t\n]/, '')
 		@error = nil
 		@url =~ %r<http://([^/]+)(.*)>
@@ -437,7 +437,7 @@
 	if not w or w.error then
 		items = @options['weather.items'] || Weather_default_items
 		w = Weather.new( @date, @options['weather.tz'] )
-		w.get( @options['weather.url'], @options['weather.header'], items )
+		w.get( @options['weather.url'], @options['weather.header'] || {}, items )
 		if @options.has_key?( 'weather.oldest' ) then
 			oldest = @options['weather.oldest']
 		else

(追記) makerss.rbを単体で有効にしてみたらちゃんと動いているように見えた。 他のプラグインとの組合せで不具合が発現するのかな。 cgi.newしてやつとかありそうだ。


作り手とその取り巻きだけが楽しんでる間は本物じゃない。その中身が理解できない人々の生活を変えてこそ本物だ


zunda <zunda at freeshell.org>