/ 最近 .rdf 追記 設定 本棚

脳log[2010-03-10~]



2010年03月10日 (水) 自転車とイヤフォンの組み合わせってノイズキャンセリング関係なく敵視されるけど、窓を閉め切った自動車やフルフェイスヘルメットをかぶってエンジンの真上に頭が来る自動二輪を運転するよりは断然外界の音が聞こえている。エンジン回してる人は耳に頼った運転しないでしょう(ハンズフリーなら電話しててもいいわけだし)。自転車だって同じ。だから NWD-W202(なにが「だから」だ)。Bluetoothも考えたけどあれもこれも充電するのは面倒だし、レシーバーが結局ちょっとした MP3プレイヤーなみの大きさになるので汎用的に使う意図がなければ不必要。


2010年03月08日 (月) obsoleteって形容詞だと思うんだけど推測辞書に obsoletedや obsoletingが含まれてるんだよね(辞書には載っていないが)。obsoleted - Wiktionaryによれば nonstandardだけど一部の分野で使われている、ということらしい。

最終更新: 2014-12-05T17:23+0900

[tDiary] spam絨毯爆撃対策

送信元が限られてるのかワンパターンだったので、これまでは </a> を NGワードにしてほとんどの spamを防いでいたんだけど、今日は手ひどくやられた。

フィルタはインストール方法がよくわからない。Comment-key Filterを tdiary/filter/ に設置したがエラーが出るので、とりあえず最新の 2.3.3.20091124にアップデートした。そうすると plugin/60sf.rbが有効になっているはずなので misc/filter/ にフィルタスクリプトを、misc/filter/plugin/ にフィルタに関連する設定などを表示するプラグインスクリプトを、misc/filter/plugin/ja/ などにプラグインの言語リソースをインストールし、設定画面でフィルタを有効にするといずれのスクリプトも読み込まれるようになる。

 スパムフィルタ1: Comment-key Filter & Plugin version 0.5.0

コメントフォームにキー文字列を埋め込み、コメントが HTMLフォームを通して投稿されたことを確認する。キーは日記設置者の決めた文字列と日記の日付によって一意に決められるので、ある日のキー文字列を一度取得すればその日には何件でも機械的に投稿することができる。GETして HTMLを切り刻む手間をかければ最初から機械的に投稿することもできる。そんなのは防げない。

tDiary-2.3.3.20091124にインストールするのなら key.rbを misc/filter/key.rbへ、comment_key.rbを misc/filter/plugin/key.rbへ、ja/comment_key.rbを misc/filter/plugin/ja/key.rbへコピーすれば良い。key.rbというファイル名と KeyFilterというクラス名は対応しているので、key.rbから comment_key.rbへの改名はやめたほうがいい。コピー後にフィルタを有効にし、キー文字列を設定する。

 スパムフィルタ2: limit_freq.rb

連投対策。同じ IPアドレスからの連続する投稿をはじく。30分につき 3件までしか許可しない、など。

# coding: utf-8
#
# limit_freq.rb: 
#
#  a spam-filtering plugin of tDiary
#  rejects frequent comments posted from an IP address.

module TDiary::Filter
	class LimitFreqFilter < Filter

		def comment_filter( diary, comment )
			now = Time.now.to_i
			comment_i = Comment_t.new( now, @cgi.remote_addr )

			# 数値形式の日時と文字列形式の IPアドレスの二要素
			# 配列の配列を、日時をもとに昇順にソートしたもの。
			# log = [[123456, "1.2.3.4"], [234567, "5.6.7.8"],...]
			log = []

			require 'pstore'
			ps = PStore.new( cache_path )
			ps.transaction( false ) { |db|
				log = db.fetch( DBRoot, log )

				# 新しいコメントを logに追加する。
				log.insert( ArrayExtension.lower_bound(log){|pair| pair.first - comment_i.time }, [comment_i.time, comment_i.ipaddr] )

				# 古い logを捨てる。
				oldest = now - time_span
				log.slice!( 0 ... ArrayExtension.lower_bound(log){|pair| pair.first - oldest } )

				db[DBRoot] = log
				db.commit
			}

			# 残った logに投稿者の IPアドレスがいくつ含まれるか数え、
			# その数が閾値を超えていないか確かめる。
			count = 0
			if log.all?{|pair|
				count += 1 if pair.last == comment_i.ipaddr
				count < threshold
			} then
				return this_is_not_a_spam( comment )
			else
				debug("limit_freq.rb: spam: the # of comments posted from #{comment_i.ipaddr} exceeds threshold:#{threshold} within the last #{time_span.to_i}seconds.")
				return this_is_a_spam( comment )
			end
		rescue
			debug("limit_freq.rb: BUG: #{$!}")
			return this_is_not_a_spam( comment )
		end

	private
		DBRoot = 'LimitFreqLog'
		Comment_t = Struct.new(:time, :ipaddr)

		def cache_path
			return File.join( (@conf.cache_path || "#{@conf.data_path}cache"), 'limit_freq.data' )
		end

		# どれだけの期間(秒単位)、コメントの投稿頻度の判定に
		# 利用するログ(日時とIPアドレスのペア)を保存するか。 
		def time_span
			30 * 60
		end

		# time_span当たり、何件目の投稿からを拒否するか。
		def threshold
			4
		end

		module ArrayExtension
			# ソート済みだという前提を活かしていない!
			def lower_bound( arr, &block )
				index = 0
				arr.length.times{
					return index if 0 <= yield( arr[index] )
					index += 1
				}
				return index
			end
			module_function :lower_bound
		end
	end
end

やめればいいのに本体もちょろちょろと変更。

  • 設定画面における [セキュリティ]>[spamフィルタ]>「spamの扱い spamと判定されたツッコミを{非表示にする|捨てる}」という項目は tdiary/filter/spam.rbに固有の設定らしいのだが、そんなこととは夢にも思わないので、最初は自作のフィルタでスパム判定したコメントが捨てられることに困惑した。設定を本体に取り込んで他のフィルタからも利用しやすくした。
  • limit_freq.rbや limit-freq.rbや limit_--_freq.rb というフィルタに対しては LimitFreqFilterという名前のクラスを要求するようにした。(これらのファイルが複数存在するときは困るなあ。読み込み順で最終定義が変わりそう)
  • どういうわけか無名クラスの下に定義された TDiary::Filter定数を参照してエラーになるので ::TDiary::Filterとした。
Index: core/tdiary.rb
===================================================================
--- core/tdiary.rb	(リビジョン 44436)
+++ core/tdiary.rb	(作業コピー)
@@ -342,6 +342,22 @@
 
 				@logger.info("#{@cgi.remote_addr}->#{(@cgi.params['date'][0] || 'no date').dump}: #{msg}")
 			end
+
+		private
+			# config: hide or drop spam comment
+			def hide_spam?
+				return @conf.options.include?('spamfilter.filter_mode') && @conf.options['spamfilter.filter_mode']
+			end
+
+			def this_is_a_spam( comment )
+				comment.show = false
+				return hide_spam?
+			rescue
+				return false # comment could be a String(@cgi.referer).
+			end
+			def this_is_not_a_spam( comment )
+				return true
+			end
 		end
 	end
 
@@ -1303,7 +1319,7 @@
 			filter_path = @conf.filter_path || "#{PATH}/tdiary/filter"
 			Dir::glob( "#{filter_path}/*.rb" ).sort.each do |file|
 				require file.untaint
-				@filters << TDiary::Filter::const_get( "#{File::basename( file, '.rb' ).capitalize}Filter" )::new( @cgi, @conf, @logger )
+				@filters << TDiary::Filter::const_get( "#{File::basename( file, '.rb' ).split(/[-_]+/).map{|x|x.capitalize}.join('')}Filter" )::new( @cgi, @conf, @logger )
 			end
 		end
 
Index: core/plugin/60sf.rb
===================================================================
--- core/plugin/60sf.rb	(リビジョン 44436)
+++ core/plugin/60sf.rb	(作業コピー)
@@ -4,10 +4,9 @@
 # Modified by KURODA Hiraku.
 
 SF_PREFIX = 'sf'
-@sf_path = ( @conf["#{SF_PREFIX}.path"] || "#{::TDiary::PATH}/misc/filter" ).to_a
-@sf_path = @sf_path.collect do |path|
-	/\/$/ =~ path ? path.chop : path
-end
+@sf_path = ( @conf["#{SF_PREFIX}.path"] || "#{::TDiary::PATH}/misc/filter" ).to_a.map{|path|
+	path.chomp('/')
+}
 
 # get plugin option
 def sf_option( key )
@@ -128,7 +127,7 @@
 			if File.readable?( path ) then
 				begin
 					require path
-					@sf_filters << TDiary::Filter::const_get("#{File::basename(filename, ".rb").capitalize}Filter")::new(@cgi, @conf, @logger)
+					@sf_filters << ::TDiary::Filter::const_get("#{File::basename(filename, ".rb").split(/[-_]+/).map{|x|x.capitalize}.join('')}Filter")::new(@cgi, @conf, @logger)
 					plugin_path = "#{dir}/plugin/#{filename}"
 					load_plugin(plugin_path) if File.readable?(plugin_path)
 				rescue Exception

 @2010-03-09: IPアドレスブロック

一件二件すり抜けるぐらいはいいかと思っていたがここ数日は毎日なのでいいかげん腹が立つ。なによりアクセスログを見たらヒット数、転送量トップが spammerだというのが決定的に許せない。節度を知れ。iptablesはいじれないので .htaccessで Apacheに拒否してもらう。


 @2010-03-11: 対応が早いね

spamコメントがくる月っていうのは、いつもの決まった 2、3か国からのアクセスではなく 10近い国から少数ずつアクセスがあるもんだけど、日単位では固定の IPアドレスから数十件の spamがくるのが常だった。でも今日は一件一件みごとに IPアドレスが異なっている。IPアドレスブロックで次のステージに進んでしまったのか。

spamコメントの目的が特定の URLへの誘導であるかぎりは、コメントに含まれる URLのドメインが白か黒かを判定する方法が有効でしょうね。外部に問い合わせるのは避けたかったんだけど、spamコメントの内容が URLも含めてワンパターンだから実際の問い合わせはごくごく限られた回数にできそうだし、悪くないかな。

 CodeRepos

ここで上記の comment-keyフィルタも含めてスパムフィルタの最新版が管理されていた。 >http://coderepos.org/share/browser/platform/tdiary/filter


 こぼれ話: rel="true"

plugin/00default.rbに含まれるメソッド navi_itemを自分でも使っていたのだけど、tDiaryをアップデートしたら三番目の引数が真偽値からリンクの rel属性文字列へと変更されているせいで rel="true" なるリンクができていた。こうする。

def navi_item( link, label, rel = nil )
	rel = "nofollow" if rel == true # backward compatibility

 @2010-03-09: 日記の編集もキャッシュベース?

スパムコメント一掃のために YYYYMM.tdcを削除したけど日記の編集画面からコメントが消えない。YYYYMM.parserを開くとコメントが含まれていたし、これを削除すると編集画面からもコメントが消えた。原因はデータファイルを直接削除するというイレギュラーな操作だけど、日記の編集はマスターデータに対して行いたい気もする。


2010年03月07日 (日) やっぱり毛皮骨肉店のバグは存在していたんだ。> 「ICE DROP - ファイナルファンタジータクティクス裏技集」初プレイで遭遇して源氏シリーズやセイブザクイーンが99個売られているのでバランス崩壊、自主規制、密猟の効果不明な一周目だった。

最終更新: 2010-03-08T01:18+0900

テキストエディタ + フォルダペイン

やっぱり、全画面表示にしていてもエクスプローラーが隠れてしまわない、っていうのが一番便利な点だと思います。

基本的にファイルをいろいろ開きまくるタチですから、タブとエクスプローラー的なものは結構重要だったりしますw

自分もエクスプローラビューの価値を理解しない、Windows Explorerにもナビゲーション ペインを表示させない人間なので、エディタにフォルダツリーにそういう価値(エクスプローラが隠れない)があるのを初めて知った。

それでも反論はある。

  • 最大化しているのに、左側にテキスト編集と関係ない領域が存在するのが許せない。
  • フォーカスの管理が面倒くさい。

例えば、Vistaのフォルダ画面はフォーカス可能な場所が多すぎる。

アドレス欄 > 検索欄 > 状況に応じて変化するツールバー > リストビュー > カラム > (アドレス欄に戻る)

肝心要のリストビューに確実にフォーカスを移動する最短手順は Ctrl+E、↓だと思っているが他にあるだろうか?そしてエクスプローラがまたよくフォーカスを見失うんだ。そのたびに Ctrl+E、↓。

キーボードでアクセスできない機能があってはいけないと思うし、状況に応じて変化するツールバーはタブレットで操作しやすいらしいから、フォーカスできなくしたり、ツールバーを消したりするのはいい解決ではない。リストビューにフォーカスするショートカットがあればいいのかなあ。とすると編集領域にフォーカスするショートカットがあるならエクスプローラビューがあっても困らないな。

脱線。カラムクリックでソートする機能はエクスプローラが気軽にフィルタ、ソートできるツールなら役に立つんだろうけど、なにせ表示設定に関して馬鹿だからなにも変更したくない。ソートするときは間違ってカラムをクリックしたときだけだから、とにかく邪魔。Thunderbirdもメールのリストをカラムクリックでソートできるけど、メニューでソート条件を(より細かく)変えられるからカラムクリックはできないほうが使いやすい。そもそも最初に設定したとき以外にソート条件を変更したのって間違えてカラムをクリックしたのを戻すためだ。カラムのすぐ上にタブバーや QuickFolderのブックマークが存在するので今はこれらの操作に余計な気を使わされている。

最終更新: 2010-03-08T20:41+0900

無線LAN設定。Windows 7

長ったらしい事前共有キーをこねくりだす必要もなかった。

  1. 親機の電源を入れる。
  2. PCに USB子機を差す。> 自動でドライバインストール完了
  3. 接続先として親機を選ぶ。> 「セキュリティキーを入力してください。親機のボタンを押すことでも設定できます。」
  4. 親機の AOSSボタン(Buffaloだ)を押して待つ。接続完了。

「親機のボタンを押すことでも設定できます(という意味のメッセージ)」が気が利いている。初めて無線LANを導入する人にとっては存在しないパスワードを聞かれているのに等しい状況だろうからこれは助かる。

それでも問題はあるわけで。

 問題1: インターネットにつながらない。

既存の設定済みの Buffaloの無線ルーターの下に新しい無線ルーター(これも Buffalo)を接続したので、どちらも同じ 192.168.11.1(デフォルト設定)を名乗ってしまったことが原因っぽい。無線の問題では不具合が突然起こりよくわからないうちに直ってしまうことがよくあるのではっきりしないけど、時系列順に並べると、1.DHCPサーバーが見つからないと二台目のルーターが報告。2.二台目の LAN側IPアドレスを 192.168.12.1にした。3.開通。

現実には 1と 2の間には「あれ、おかしいな」という疑問のぐるぐるする時間があり、2の行動に根拠はなく、問題が起こったことで問題がありそうだと思っていた部分(重複するだろう IPアドレス)をいじってみただけだし、2と 3の間にも DHCPサーバーが見つからないという 1と同じエラーや、ちょっと違うエラーが出ていたりする。

 問題2: 接続速度が 54Mbps。

タスクマネージャの「ネットワーク」タブ、「リンク速度」カラムで確認してるんだけど、理論値 300Mbpsを謳う親機と子機のセット製品なんだから 54Mbpsは間違ってる。

子機のセキュリティ設定を、自動設定された WPA2-PSK(TKIP)から WPA2-PSK(AES)に変更した後で確認したら 270Mbpsになっていた。(親機と子機を本来の設置位置に移動すると 84Mbpsくらいになっていたから 300Mbpsにならないのは普通らしい)


2010年03月06日 (土) [TM-150] SetPoint 6.00が出ていたらしい。アップデートは基本的に好きだけど、SetPointに限り、によってインストールはしない。設定項目が増えてるらしいので最初にインストールするバージョンとしてはいいかもしれないが。


2010年03月02日 (火) [javascript] 「MS、Webブラウザ選択画面にアルゴリズム上のバグか - @IT」<<< 「15.4.4.11 Array.prototype.sort (comparefn)」「comparefn が undefined でなく、かつ この配列の要素について首尾一貫した比較関数 (下記参照) でない場合、 ソートの振る舞いは実装依存である。」 例えば実装がクイックソートだった場合 > 「ランダムソート(笑)とは - 西尾泰和のはてなダイアリー


2010年02月27日 (土) 暇人\(^o^)/速報 : 【速報】ついにロマサガ2が移植決定!!! - livedoor Blog(ブログ) << 最初に購入した SFCソフトはこのロマサガ2。閃きシステムが術とは関係ないもんで合成術の一つも使えないままラスボスに突入して詰んだのはいい思い出。二周目で倒した(クイックタイムは覚えずに。エリクサーがなかったのが一週目の敗因)。


2010年02月26日 (金) UTF-7っぽい? 参考>「IE7においてはCVE-2007-1114を利用することで、ほぼ確実にUTF-7と誤認させること、すなわちXSSを発生させることができます。(そろそろ UTF-7 について一言いっとくか - 葉っぱ日記)


2010年02月24日 (水)

最終更新: 2010-02-26T20:42+0900

[無題]

 数学への不安は一桁の数を「数える」行為にも影響あり - スラッシュドット・ジャパン」から

いやはや、数字を数えるのも難しいものですよ。
{}の次が{{}}で、その次が{{},{{}}}で、次に{{},{{}},{{}, {{}}}}くらいまでは、すぐに分かりますが、
数学が苦手な私には、その次の{{},{{}},{{},{{}}},{{},{{}}, {{},{{}}}}}はなかなか出てこないですねぇ。

こういう話をかみ砕いて順々に展開していっていたのが『[単行本] ドナルド・E. クヌース【至福の超現実数―純粋数学に魅せられた男と女の物語】 柏書房』だったっけ。

 [BAD BOY] 絶対値。変化量。

1、2週間前の大雨の日に乗って以来、シフトの調子が悪かった。重いし変わらないし。シフトワイヤー(in&out)を交換してもらったらワイヤーの先に何もつながってないんじゃないかという軽さ。忘れていたよ。調整後にさらにちょっと伸びたのか、チチチチチとシフトダウンに失敗する段があって手元でアウターをちょっと延長した。購入した店だと完璧にやってくれるんだけどね。


2010年02月18日 (木) [リーンベル] 手がかじかむのでこの二日プレイできていない。銃より先に 20万もするパンチラスカートを買いました。他のスカートの 20倍以上もするこの値付けは明らかに中身に対するものだよね。同時入荷の 20分の1の方(こちらも生足)はピンクのスパッツレギンス(というらしい)でした。EoEでリーンベル(*´д`*)に安心してうつつをぬかしていられるのはもちろんゲームとして、それも RPGで大部分の時間を費やす戦闘が面白いからです。そこは tri-Aceですから(自分にとっての tri-Ace。ファンタジアと SO1の頃はゲーム機を持っていなかった)。blogでの開発者ならではの裏話に共感します。>>「これはむしろ謝罪文」「t・A・Bについて」一方、1、2を持っているアルトネリコの 3をスルーしたのは、2になったときに戦闘部分が劣化していたのと、1、2通してしょぼいグラフィックを補って余りある「ムスメ調合RPG」の真骨頂だった、ツボを押さえた萌え成分の安売りが発売前から目立ったから(ヒロイン増量、投下されるネタとそれへの反応)。キャラに対する制作者の愛を感じない。愛なきところに萌えはありません。付け加えると、戦闘システムを評価できるほどの情報も提供せずに「なぜ脱ぐのか」「何をすると脱ぐのか」「脱げば脱ぐほど強くなる」なんて解説を繰り広げる公式サイトに販促効果はありません。


2010年02月16日 (火) みりおんぐらむとみねこあでしょうかいされていたほんをきおくした。だが本屋で近寄りがたいレーベルだ。


2010年02月15日 (月) [今日の無題] const, ポインタ, Bing, 月例パッチ不具合, ポイント

最終更新: 2010-02-26T19:22+0900

 [C++] const, ポインタ

当たり前のことを書こう。1) const int* と int* const. ポインタが constなのは後者でポインタの指す対象が constなのが前者。2) const char* と char*はどちらもポインタ型だけど、int*と char*ぐらい違う型だと認識すべき。const_castや reinterpret_castが使えるという点で、関数ポインタやメンバ関数ポインタとその他のポインタを比べたときほど違いはしないようだが。ついでに、関数ポインタのサイズ以上の落とし穴を最近知った。「配列の要素の次のアドレス モナド」配列の最後の要素の次の次を指すポインタが配列の先頭を指すポインタより大きいとは限らないんだと。数値にもオーバーフローがあって数が巻き戻ったりするから、むしろ、配列として確保されたメモリ領域を一つはみだした部分を指すポインタが配列の要素を指すポインタより大きくなければならないと予め決められている部分に感心すべきか。

 Bingは URLの評価が高すぎるんじゃないか?

constで検索したら建設関係ばっかり。URLに constが含まれてるだけなのに。(ほとんど全ての) URLと同じ文字を使って文章を書いてる人らはこの検索結果に満足できる?日本語で検索する場合はマッチするのは本文に限られるし自動で言語フィルタまでかかってるようなもので全く問題ないけど。

 >>IE全バージョンに含まれる脆弱性発覚、そして月例セキュリティ・パッチにも不具合 - スラッシュドット・ジャパン

Vistaで Media Player Classicが Windows Updateのあとエラー終了するようになるのも 2chで報告されていて、自分の所(Vista x64)でも mp3は再生できるけど動画が再生できなくなってる。これも直してほしいなあ。Media Player Classic Home Cinemaは終了しないみたいだけど、これは Quick Time系の動画みたいにシークが遅いのでできれば使いたくない。シーク速度を改善する方法はあるのかもしれないけどコーデックとかフィルタとかわからんのだよね。

Alt+Spaceでシステムメニューを開けない(Alt, Spaceでならできる)し、動画の再生中はスタートメニューの電源ボタン(スタンバイに設定)を押してもロックにしかならなくて、ファンが回りっぱなしで驚かされたりもするし(MPC HCがやってるというよりはメディア共有の省電力設定が影響してるのかもしれないけれど)。

 >>裁断機PLUS PK-513Lで雑誌を裁断してScanSnap S1500Mで取り込み、Dropboxで共有してGoodReaderでiPhoneに入れてみた!! [Mac] [net] [iPhone] [今日の楽天] [Shopping] - No Second Life

水を差す。これまでにためたポイントを使ったから○○円得した。今回△△ポイント付いたから△△円得した。この二つの合計を割り引いて実質 160円で買えた。なんていうのはポイントの価値を二倍に水増しした誇張でしょ。次に何か買うときもポイントを使ったから△△円得した、っていいませんか?

恨みがあるわけじゃなくて、アマゾンの書籍に付くゴミみたいなポイントだとか、スーパーでレジ袋を断ったときの 2円引きがなくならないかなあと日頃思っていることを吐き出したかっただけ。

レジ袋に関して。断って 2円引いてもらった後でやっぱり手持ちの袋に入りきらないことがわかった場合に袋をもらうことはできるのかとレジの青年に聞いてみたら、考えたこともないと。彼なら 2円引いてもらった上で快く袋をもらえそうだ。


2010年02月14日 (日) [リーンベル] エイミア先生の影響でマシンガン一筋のリーンベルさん。画面奥から手前に向かって滑り込んできてスカートを翻らせながら反転します。LVが上がらなくってもいいんです。(側宙しながらパイナップル(あるいは犬の糞)を放る姿は二周目で堪能するつもり)


2010年02月12日 (金) [790FX-GD70] BIOS v1.9 出てた。