SVX日記

2004|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|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

2012-07-04(Wed) CAPTCHAを作ってみた

  tDiary用の簡易なCAPTCHAを作り直してみた。

  日本語がわからない人には、突破しにくいだろう。

  選択肢を「星飛雄馬の所属球団は?」とか「ヤマトが目指す星は?」とかにすると、日本語に堪能な外国人の書き込みも排除できるだろう(……って、排除してどうするよ)。

  作ったCAPTCHAは、しばらくしたら公開する予定。

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

フルタニアン(管理者) [名状しがたい書き込みテストのようなもの]

フルタニアン(管理者) [あしたのために(その1)えぐりこむように書き込みテスト]

フルタニアン(管理者) [ふるえるぞハート! 燃えつきるほど書き込みテスト!!]

横須賀のアランプロスト [司会のジル・ベッソンです。 エクセレント!!]

フルタニアン(管理者) [大喜利じゃねーっつーの!! ……では本日の笑点このへんでおひらきで……]


2012-07-05(Thu) ボルサリーノに憧れて……100円

  ハゲが進行してきたし、帽子でもかぶろうか、と思い始めた。世間一般では、憧れるのは「ボルサリーノ」ではなく「アンダルシア」らしいが、ともあれ、いきなり高価な帽子を買っても、かぶることが習慣づかないかもしれない。そこでダイソーである。

  画像の説明

  ボルサリーノとはかなり違うが、天然素材の中折れ帽という意味では同じ。ちょっとアロハな感じが気にくわないので黒いシャツを切った余り布で帽子のリボンを変更。

  画像の説明

  さて、かぶってみることにしよう。


2012-07-07(Sat) tDiary用簡易CAPTCHA

  よく考えたら、こういうのをCAPTCHAといっていいのかわからんが、まぁ、コメントスパムを拒否するのに十分な効果はあるのでよしとする。

  まずは、フィルタ側。

 ・/usr/local/share/tdiary/misc/filter/tcaptcha.rb
 
 # -*- coding: utf-8; -*-
 
 require 'digest/md5'
 
 module TDiary
     module Filter
         class TcaptchaFilter < Filter
             def comment_filter( diary, comment )
 
                 common_key = 'abc'              # 任意の文字列(プラグイン側と合わせる)
 
                 rw = @cgi.params['tcaptcha'].dup
                 dm = Digest::MD5.hexdigest((rw << common_key).sort.join(':'))
 
                 $stdout.sync = 1
 
                 if(result = (@cgi.params['tcaptcha_digest'][0] == dm))
 # =begin            # 強引なメッセージの出し方をするので、クッキーを食わせられなくなる
                     print "Content-Type: text/html\n\n"
                     print "<HTML><HEAD><META http-equiv='Content-Type' content='text/html; charset=UTF-8'></HEAD><BODY>\n"
                     print "<H1>Thank you for your comment</H1>\n"
                     print "<P>コメントありがとうございました。</P>\n"
                     sleep 5
 # =end
                 else
                     print "Status: 406 Not Acceptable\n"
                     print "Content-Type: text/html\n\n"
                     print "<HTML><HEAD><META http-equiv='Content-Type' content='text/html; charset=UTF-8'></HEAD><BODY>\n"
                     print "<H1>Tiny CAPTCHA challenge failed</H1>\n"
                     print "<P>Tiny CAPTCHA 認証に失敗しました。</P>\n"
                     print "<FONT color='white'><!--\n"  # 以降を強引に不可視にしようとする努力
                     sleep 5
                     raise 'Tiny CAPTCHA challenge failed'
                 end
 
                 comment.show = false            # 要査閲にするなら
 
                 result
             end
         end
     end
 end
 
 __END__

  つぎが、プラグイン側。

 ・/usr/local/share/tdiary/misc/plugin/tcaptcha.rb
 
 # -*- coding: utf-8; -*-
 
 require 'digest/md5'
 
 def comment_body_label
 
     common_key = 'abc'                          # 任意の文字列(フィルタ側と合わせる)
 
     q = @options['tcaptcha.question'] ||= '質問: 鳥の鳴き声'
     r = @options['tcaptcha.rights'] ||= ['チュンチュン', 'コケコッコ', 'ピヨピヨ', 'カァー', 'ホーホケキョ', 'ガァガァ']
     w = @options['tcaptcha.wrongs'] ||= ['ワン', 'ニャー', 'ブゥブゥ', 'ヒヒーン', 'パォーン', 'ガォー']
 
     rs = r.shuffle
     rw = ([rs.shift] + (rs + w).shuffle[0, 5]).shuffle
     dm = Digest::MD5.hexdigest(((r & rw) << common_key).sort.join(':'))
 
     h = ''; id = 0; rw.each {|i|
         h << "\t\t\t\t\t<INPUT type='checkbox' id='tc%d' name='tcaptcha' value='%s'><LABEL for='tc%d'>%s</LABEL>\n" % [id += 1, i, id, i]
     }
     h << "\t\t\t\t\t<INPUT type='hidden' name='tcaptcha_digest' value='%s'>\n" % dm
 
     tcaptcha = <<-FORM
 #{q}
 #{h}                </div>
                 <div class="textarea">
                     コメント
     FORM
     tcaptcha.chomp
 end
 
 def comment_body_label_short
     '本文'                                      # 未対応
 end
 
 __END__

  よく見れば「なんと強引な」という実装方法だが、アドイン形式では、私の要望を満たす実装方法は、これしかなさそうだ、という結論になった。

  ついでに、もひとつ。tDiaryをバージョン3に上げたからか、counterプラグインがおかしくなり、カウンタが景気よく回りすぎる症状が出てしまう。再訪問のカウント回避機能が効いていない。

  どうも再訪問のカウントは、基本クッキーを使って回避しているらしいのだが、調べるとブラウザまでクッキーが届いていない。仕方ないので、counterプラグインのみならず、tDiary本体にもデバッグ行を入れまくり、動作をトレースする。すると、なんだかコメントスパム等に対するフィルタ処理の関係で、各プラグインが2回ずつ呼ばれるようになってしまっている。counterプラグインは関数定義だけでなく、ロードされただけで実行される処理を持っており、2回連続で呼ばれると副作用でクッキーを吐かなくなってしまうようだ。

  いろいろ対処の仕方を考えたものの、結局「グローバル変数」を使って、1回目はスルー、2回目以降は動作するという「ハブ」みたいなパッチでごまかすことにした。


www.itline.jp /usr/local/share/tdiary/misc/plugin # diff -U 4 counter.rb.org counter.rb
--- counter.rb.org	2012-04-29 20:27:26.000000000 +0900
+++ counter.rb	2012-07-08 02:44:54.290040583 +0900
@@ -476,16 +503,19 @@
 	def kiriban_today?
 		TDiaryCounter.kiriban_today?
 	end
 
+if($q_meet_again_q)
 	tdiary_counter_cookie = TDiaryCounter.run(@cache_path, @cgi, @options)
 	if tdiary_counter_cookie
 		if defined?(add_cookie)
 			add_cookie(tdiary_counter_cookie)
 		else
 			@cookie = tdiary_counter_cookie if tdiary_counter_cookie
 		end
 	end
+end
+$q_meet_again_q = true
 
 	def kiriban
 		if kiriban?
 			msg = @options["counter.kiriban_msg"] ? @options["counter.kiriban_msg"] : ""

  いずれも、裏技的なコードで、コミュニティに還元できそうなコードではない。たはっ。



2012-07-15(Sun) レース&レース

  今日はイッペイを連れて、暑い中、中京競馬場に行く。

  まったり向かいつつ、9〜12レースに300円ずつ。9と12で単勝をまぐれ当たり。払戻が580円と390円で、あっさりと1710円のプラス。それにしても12レース、先行逃げ切り6馬身差って……賭け事の厳しさを教えるつもりだったのだがな……。

  モンキースタイルを教えたところ、異様にサマになっているが、大丈夫なんだろうか。

  画像の説明

  帰りがけ、手動式で有名な「神宮前の踏切」が閉鎖されていた。なんか、寂しい。

  画像の説明

  帰宅して、ここ最近、思い出したようにグランツーリスモ3に取り組むイッペイ。自分はF1マシンに乗っているとはいえ、プロフェッショナルリーグ、グランツーリスモ・ワールド・チャンピオンシップ、コートダジュール(モナコ)で、15周。1回のピットインを挟みつつ、土壇場で787Bをブチ抜いて優勝。見事に350万とモナコマイスターの座をゲット。

  そもそもオイラはレースゲームが得意ではないが、6歳のガキにまったく歯が立たないほど下手だとは思わなかった。つーか、普通にちゃんとブレーキをからめつつ、壁に軽めに当たりつつ、極めてスムーズに走るのだよなぁ……正直、こいつはかなりのセンスを持っているのではないだろうか。特にラスカスと最終コーナの処理は唸らされる。

  まさか、後半5周、ヘタなF1中継よりも熱中して観戦してしまうとは思わなかった。これって、息子A-specモード、親父B-specモードって状況じゃねーか!?


2012-07-20(Fri) ふたたび映画を見る

  先日に引き続き、ベルセルクを観てきた。

 

  黄金時代篇Iを観たのだから、そのうち観るつもりだったのだが、気づけば上映は今日で終わり。滑り込むように観てきた。前回は割と入っていたが、今回はガラガラ。ホント、人気があるのかないのかよくわからんな。

  前回の方が印象に残ったシーンは多かったような気もするが、順当によかった。これは、大画面で観る価値があるといえる。しかし、やっぱり、動きが素晴らしくダイナミックなだけに、24FPSなのが物足りなく感じてならない。一般的な4倍速回路とか噛ませてみたらどうなんだろうかな。ところで、グリフィスが捕らわれて以降って、「蝕」までに、なんか特別なイベントってあったっけ? なんだかIIIの内容が心配だ。

  それはそうと、なんで映画館ってさ、金を払って、席に座って、上映予定時刻に「上映開始」と宣言されてから……

  「堂々と広告を流しやがる」

  ……んだろうねぇ。おかしいだろーが、その慣習は。広告を流すなとはいわんが、流すんなら、上映予定時刻の「前まで」にしろよ、ったく。イラつくんじゃ、ボケ。

  「改めてまどか☆マギカが観たくなっちまったじゃねーか」

  しかし、一週間ずらして前後編を上映っていうスケジュールに見えるんだが、どういうことなんだろう。二週間のみ上映なのか? やるなら一度にやって欲しいんだが。つーか、TV版で十分に完璧すぎて、あれ以上、何を引いても、何を足しても、不満に思えるような。でも、新作カットなしなら、観に行く必要を感じないしな。つーか、前後編の後の完全新作って、いったい何をやるつもりなんだ……まさか、ほむらでエンドレスエイトをやるんじゃねーだろーな。

  話は変わるが、先日、実写版「あしたのジョー」を借りた。なんだか、DVDがリッピング対策をしてあるらしく、チャプターがシャッフルされたような状況で観た。そんなに、ピーコされるのがイヤですかね。まぁ、もうすぐリッピングも正式に違法になるらしいんで、どうでもいいんですけどね。

  ちなみに内容は、一般的な評価のとおり、力石と丹下のおっちゃんが、漫画から出てきたようにリアルで、それを観た価値はあった。が、ホントにそれだけでした。

  ついでにもうひとつ。ずっと忘れていたが、放送中は一応リアルタイムに観ていた「ガンダムOO」の映画版を借りた。テレビ版は、ひととおりは飽きずに全話を観たが、その程度。で、映画版は「未知の宇宙生物との対話」がテーマということは、なんとなく聞いていたが。

  「未知の宇宙生物との対話」っていう点で、エラく期待した。というのも、普通に表現すれば、エラく月並みな内容で終わってしまうハズなので、間違いなくそれだけは裏切ってくるだろうと。でも、どうやって裏切ってくるのか、まったく想像もつかない。だから、期待した。で、観た。結果、1ミリも裏切ってこなかった。クソが付くほど月並みな内容。母星を失ったってテレパシーで会話。見事なでに新規性ゼロ。大人向けらしいが、ガンダムがウジャウジャにバンバン撃ってるだけで、戦闘シーンの駆け引きすらなく、まったく観るべきものがない。観て損した。バカにすんなボケ。

  話は戻るが、今回のベルセルクのラスト近く、ガッツが鷹の団をやめて出て行く時に背負っていたのは、やっぱり「ズタ袋」でした。孤高のヒーローは絶対にズタ袋なんだよな。つーか、この映画を観た今日も自作のズタ袋を持ってたんで、なんか映画の帰りに「おいおい、ガッツ気取りがおるぞ」と思われそうで、ちょっと気恥ずかしかった。

  といいつつ、ちゃっかりオークションに出ているズタ袋を宣伝しておく。大方は売れて、残りわずかですんで。