トップ «前の日記(2008-07-03) 最新 次の日記(2008-07-06)» 編集

じじぃの日記、ツッコミ可

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|

2008-07-04 [長年日記]

% [tDiary] bot が相手のときに表示すべきデータが存在しないリクエストだったら 404 を返すパッチ (かなりアドホック)

なんか表示に使うためのインスタンス変数がそれぞれ別の名前だったりするんで、似たようなことを何度も何度も書かされたのがちょっとせつない。 trunk とか追いかけてないので、2.2.0 用。 カテゴリ表示、日毎表示、月毎表示、長年日記に対応しているはず。 一応ごくごく簡単に動作確認はしたけど、まあなんかおかしくても知らん(ぉぃ

diff -urp tdiary-2.2.0.orig/index.rb tdiary-2.2.0/index.rb
--- tdiary-2.2.0.orig/index.rb	2007-01-08 14:55:23.000000000 +0900
+++ tdiary-2.2.0/index.rb	2008-07-04 11:05:42.000000000 +0900
@@ -103,6 +103,15 @@ begin
 			<body>Wait or <a href="#{$!.path}">Click here!</a></body>
 			</html>]
 	end
+rescue TDiary::NotFound
+	if @cgi then
+		print @cgi.header( 'status' => CGI::HTTP_STATUS['NOT_FOUND'], 'type' => 'text/html' )
+	else
+		print "Status: 404 Not Found\n"
+		print "Content-Type: text/html\n\n"
+	end
+	puts "<h1>404 Not Found</h1>"
+	puts "<div>#{' ' * 500}</div>"
 rescue Exception
 	if @cgi then
 		print @cgi.header( 'status' => CGI::HTTP_STATUS['SERVER_ERROR'], 'type' => 'text/html' )
diff -urp tdiary-2.2.0.orig/misc/plugin/category.rb tdiary-2.2.0/misc/plugin/category.rb
--- tdiary-2.2.0.orig/misc/plugin/category.rb	2007-09-27 22:57:22.000000000 +0900
+++ tdiary-2.2.0/misc/plugin/category.rb	2008-07-04 11:29:24.000000000 +0900
@@ -109,6 +109,8 @@ def category_list_sections
 	years = info.years
 	r = ''
 
+	raise ::TDiary::NotFound if @categorized.empty? and bot?
+
 	@categorized.keys.sort.each do |c|
 		info.category = c
 		if @category_icon[c]
diff -urp tdiary-2.2.0.orig/tdiary.rb tdiary-2.2.0/tdiary.rb
--- tdiary-2.2.0.orig/tdiary.rb	2007-12-15 22:55:06.000000000 +0900
+++ tdiary-2.2.0/tdiary.rb	2008-07-04 12:07:13.000000000 +0900
@@ -406,6 +406,7 @@ module TDiary
 	class PermissionError < TDiaryError; end
 	class PluginError < TDiaryError; end
 	class BadStyleError < TDiaryError; end
+	class NotFound < TDiaryError; end
 
 	#
 	# class IOBase
@@ -1711,6 +1717,14 @@ EOS
 			@diary ? @diary.last_modified : Time::at( 0 )
 		end
 
+		def eval_rhtml( prefix = '' )
+			if not @diary and @conf.bot?
+				raise NotFound
+			else
+				super(prefix)
+			end
+		end
+
 	protected
 		def load( date )
 			if not @diary or (@diary.date.dup + 12*60*60).gmtime.strftime( '%Y%m%d' ) != date.dup.gmtime.strftime( '%Y%m%d' ) then
@@ -1788,10 +1802,24 @@ EOS
 	end
 
 	#
+	# class TDiaryMonthBase
+	#  base of TDiaryMonth and TDiaryNYear
+	#
+	class TDiaryMonthBase < TDiaryView
+		def eval_rhtml( prefix = '' )
+			if @diaries.empty? and @conf.bot?
+				raise NotFound
+			else
+				super(prefix)
+			end
+		end
+	end
+
+	#
 	# class TDiaryMonth
 	#  show month mode view
 	#
-	class TDiaryMonth < TDiaryView
+	class TDiaryMonth < TDiaryMonthBase
 		def initialize( cgi, rhtml, conf )
 			super
 
@@ -1822,7 +1850,7 @@ EOS
 	# class TDiaryNYear
 	#  show nyear mode view
 	#
-	class TDiaryNYear < TDiaryView
+	class TDiaryNYear < TDiaryMonthBase
 		def initialize(cgi, rhtml, conf)
 			super

つーか、ハードタブ使ってるコードの diff ってどう取るのが正しいんだろ。 ちゃんとパッチあたるんかな、これ。 まあ、大した分量じゃないんで手パッチでもね。

ちなみに、Ruby のコードに diff の p オプション使ったことなかったんで試しに使ってみたら、なんか微妙にうまくいってるところもあって大変微妙。 対応してないなら全くうまくいかないと思うんで、一応対応してるってことなんかな。

ともあれ、こんなんでもよければ叩き台にでもしてください。> しばたさん

(補足)

「存在するけど非表示の日記」については考慮してないので、実質的に表示するものが無くてもデータとして非表示にした分が存在する場合には 404 にならないはず。 まあ、ありえない日付を延々と辿られるのが嫌だって話が出発点だし、この程度は許容範囲だと思うけど。

(/補足)

% [tDiary] パッチについての言い訳とか(苦笑

ほんとは TDiary::TDiaryBase に

def has_data?
   true
end

みたいなメソッドを作っておいて、do_eval_rhtml メソッドではこれを使って分岐。 制御する必要のあるサブクラスではそれぞれ has_data? をオーバーライド。

…… っていう感じにしたかったんだけど、date 系の場合は initialize の時点で必要なデータが揃うのに、category 系の場合プラグイン内じゃないと必要なデータが揃わなくて、それが実行されるのは do_eval_rhtml の最後のとこだっていうのがネックになって諦めた。 少なくとも @categorized を埋める部分をプラグインから TDiaryCategoryView に移さなきゃならなくなって、そうするともう大掛かりすぎるでしょ。

んで結局、表示すべきデータの有無を一つのインターフェイスに纏められない時点で、それぞれのクラスの分を別々に書いても同じことだってことになって、あんな感じでお茶を濁した形。

なんつーか、TDiaryCategoryView なんていうクラスがある時点で、具体的な処理をやる部分がプラグイン (少なくとも今の形式のプラグイン) になってるのは変な気はしないでもない。 過去のしがらみっぽい気がするけど、trunk はどうなってんのかな。

% [game] ナナシ ノ ゲエム

昨日買ってちょろっとやったんだけど、サイレントヒル好きの心をくすぐる良い雰囲気を醸し出してる。

…… のだが…… (以下、文章はうろおぼえの超適当)

見たまえげれげれ君、呪いのゲームはすべてこの同じメールアドレスから送信されているんだ。 このアドレスはずっと以前につぶれて今では廃屋になっている病院のものだ。 廃屋からゲームが送られてくるなんておかしいだろう。 だから君はその廃屋を調べに行きたまえ。

…… みたいな流れにポカーンてなって萎えた。 もうどっからツッコんでいいものやら。 ついさっきまでホラーゲームだったのに、いきなりシュールギャグの世界になったのかと思ったよ。

行かねーよ、ばか。

なのに行ってしまう主人公げれげれ。あほか。 っていうかなんつー名前付けてんの、わし。 や、だって名前入力画面がやたらドラクエっぽくてつい。 とんぬらとどっちにするか迷ったんだけどさ。

まあ、これが主人公がアホなのをいいことに言葉巧みに操ろうというなんちゃら先生の策略なんであれば許せる…… か?

今日の新事実。「メールアドレスは建物に付属する」 もうね(ry

% [雑談] F-13

とうとう本筋の話が大きく動き出したなあ。 シェリルの跳ね返りっぷりが功を奏して、某氏の完璧な計画に大きな大きな穴が。 そして某氏はそのことに気付かないまま。

これは間違いなくシェリルの戦場ライブフラグだな。 バサラの影響受けてるみたいだから、すげぇノリノリで出てきそうw

本日のツッコミ(全8件) [ツッコミを入れる]
% きむら(K) (2008-07-04 15:28)

>ハードタブ使ってるコードの diff ってどう取るのが正しいんだろ。 <br>>diff --help | grep -i tab <br> -E --ignore-tab-expansion Ignore changes due to tab expansion. <br> -t --expand-tabs Expand tabs to spaces in output. <br> -T --initial-tab Make tabs line up by prepending a tab. <br> --tabsize=NUM Tab stops are every NUM (default 8) print columns. <br> <br>--expand-tabs あたりでどうでしょう? <br>

% jijixi (2008-07-04 16:32)

> --expand-tabs <br> <br>どっかに貼るときはいいけど、パッチとしては使えないような…… <br>

% きむら(K) (2008-07-04 17:03)

patch の方に空白とかタブを上手いこと無視するオプションがありますよん。 <br>

% jijixi (2008-07-04 17:39)

あら、そうすか。知らんかった。

% きむら(K) (2008-07-05 01:59)

マクロスFの感想の書き込みの時間が微妙に変わってきているのはなんかあるんでしょうか? <br> <br>TBSは今日も3:30すぎから〜 <br>

% jijixi (2008-07-05 03:01)

や、別に意味は無いですけど。 <br>見てすぐ書くときもあれば、しばらく経ってから書くこともありという感じで、なんとなくです。

% しばた (2008-07-05 10:43)

ひとまず、パッチを trunk に採用しました。ありがとうございました!

% jijixi (2008-07-05 17:24)

tDiary にはお世話になってるので、多少なりと貢献できたなら嬉しいです :-)

お名前:
E-mail:
コメント:

トップ «前の日記(2008-07-03) 最新 次の日記(2008-07-06)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com