daily memorandum 2.3.0

CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ |


2004-07-06 (Tue)

_ [tdiary] straycat に引越そうとしたが。。。

style not found

ports から tdiary-2.0.0 を入れて、ksd からデータを移して、 準備おっけー! と思ったら、

   (eval):1:in `restore': compile error
   (eval):1: parse error
   ::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )
        ^ (SyntaxError)

   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:187:in `restore'
   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `eval'
   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:187:in `restore'
   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `transaction'
   /usr/local/share/examples/tdiary/tdiary.rb:1563:in `initialize'
   /usr/local/share/examples/tdiary/index.rb:44:in `new'
   /usr/local/share/examples/tdiary/index.rb:44
   index.rb:2:in `require'
   index.rb:2

だそうな。。。

これ、いろいろ調べてみたら、 結局 wiki_style.rb を tdiary/ 以下に入れてなかったのが敗因だった。 tdiary/defaultio.rb に

   diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )

という部分があるのだけど、この style( style ) が nil を返していたので。

ただ、このエラーメッセージは非常にわかりにくいし、 そもそも SyntaxError ってのはダメだろう。 もう少しマトモな例外投げられないのか? と思って調べたら、 IOBase#styled_diary_factory() を使えばよさそう。 こいつに少し手を入れて(引数に modified を与えられるようにした)

   - diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
   + diary = styled_diary_factory( headers['Date'], headers['Title'], body, style, Time::at( headers['Last-Modified'].to_i ) )

としたら、、、今度は無限ループしてるんですけど、、、(゜Д゜)

例外はちゃんと投げましょう

ということで、styled_diary_factory() が投げた例外が 最終的にどこで捕捉されるのか調べる。 辿っていくと、結局 index.rb の 48行目で

   rescue TDiary::TDiaryError

として捕捉してることがわかる(BadStyleError は TDiaryError のサブクラス)。 が、マズイことに、ここでは捕捉した例外を無視してしまっている。 で、さらにマズイことに、end の後で

   tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf ) if not tdiary

としているので、また例外が発生し、それが無視されて、 以下略、みたいな。。。

ぱっち

とりあえず、こんな感じで変更してみた。

   diff -ur tdiary-2.0.0.orig/index.rb tdiary-2.0.0/index.rb
   --- tdiary-2.0.0.orig/index.rb	Mon Mar 15 00:03:59 2004
   +++ tdiary-2.0.0/index.rb	Wed Jul  7 07:36:46 2004
   @@ -46,6 +46,7 @@
    	rescue TDiary::PermissionError
    		raise
    	rescue TDiary::TDiaryError
   +		raise
    	end
    	tdiary = TDiary::TDiaryLatest::new( @cgi, "latest.rhtml", conf ) if not tdiary

   diff -ur tdiary-2.0.0.orig/tdiary/defaultio.rb tdiary-2.0.0/tdiary/defaultio.rb
   --- tdiary-2.0.0.orig/tdiary/defaultio.rb	Sun Apr  6 22:51:59 2003
   +++ tdiary-2.0.0/tdiary/defaultio.rb	Wed Jul  7 07:36:31 2004
   @@ -184,7 +184,7 @@
    				begin
    					headers, body = TDiary::parse_tdiary( l )
    					style = headers['Format'] || 'tDiary'
   -					diary = eval( "#{style( style )}::new( headers['Date'], headers['Title'], body, Time::at( headers['Last-Modified'].to_i ) )" )
   +					diary = styled_diary_factory( headers['Date'], headers['Title'], body, style, Time::at( headers['Last-Modified'].to_i ) )
    					diary.show( headers['Visible'] == 'true' ? true : false )
    					diaries[headers['Date']] = diary
    				rescue NameError
   diff -ur tdiary-2.0.0.orig/tdiary.rb tdiary-2.0.0/tdiary.rb
   --- tdiary-2.0.0.orig/tdiary.rb	Sun Jun 27 01:09:21 2004
   +++ tdiary-2.0.0/tdiary.rb	Wed Jul  7 07:37:20 2004
   @@ -358,11 +358,15 @@
    			raise StandardError, 'not implemented'
    		end

   -		def styled_diary_factory( date, title, body, style = 'tDiary' )
   +		def styled_diary_factory( date, title, body, style = 'tDiary', modified = nil )
    			if style_class = style( style.downcase )
   -				return style_class::new( date, title, body )
   +				if modified then
   +					return style_class::new( date, title, body, modified )
   +				else
   +					return style_class::new( date, title, body )
   +				end
    			else
   -				raise BadStyleError, "bad style: #{style}"
   +				raise BadStyleError, "#{style} style not found"
    			end
    		end

これでエラーメッセージはこんな感じになる。

   Wiki style not found (TDiary::BadStyleError)

   /usr/local/share/examples/tdiary/tdiary.rb:369:in `styled_diary_factory'
   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:188:in `restore'
   /usr/local/share/examples/tdiary/tdiary/defaultio.rb:133:in `transaction'
   /usr/local/share/examples/tdiary/tdiary.rb:1563:in `initialize'
   /usr/local/share/examples/tdiary/index.rb:44:in `new'
   /usr/local/share/examples/tdiary/index.rb:44
   index.rb:2:in `require'
   index.rb:2

前よりはわかりやすいだろう。そして、何より無限ループしなくなる。

まだ問題はある

このほかにも、条件によっては *.td2 が 消されてしまうという問題もあるみたいで。 まだ再現条件完全にはつかめてないけど、 こっちの方がシンコクやなぁ。 でも、眠いからまた明日。。。

眠死

まとめるのは明日にしようとか思いつつ、日記書いてしまった。 眠いのに。。。 まぁ、忘れないうちにまとめといた方がいいのは確かなんですがね。

[]