トップ 最新

ただのにっき

2007-01-24(水) [長年日記]

ISBN-13 ⇔ ISBN-10相互変換(3)

先日話題にした、Amazon ECSがISBN-13に対応したのを受けて、tDiaryのamazonプラグインを最新の2007-01-17版APIに対応させた。

IdTypeにイロイロと与えられるのはいいんだが、今のamazonプラグインにはそういうインタフェースがない。しょうがないので与えられたIDから数字以外の文字を除いたものが13桁あった場合には"ISBN"、それ以外は"ASIN"と判断。JPサービスの場合、他に"EAN"が指定できるが、無視して大丈夫だろうか。

おまけに、IdTypeを"ISBN"にした時にはSearchIndexを"Books"にするか"ForeignBooks"にするか選ばないといけないのだが、これも情報がないので"Books"固定に。ForeignBooksにリンクしたいときはどーすりゃいいんだ? これ以上amazonプラグインのインタフェースを複雑にするのは勘弁だしなぁ。

町田駅の特殊性に絶望した!

そろそろPASMOのことでも勉強しておこうかな〜、と思ってイロイロ調べていた。JR東日本と相互利用できるようになるってことは、いま小田急で使っている磁気定期券をSuicaに(もしくはPASMOに)一本化でき、ほとんどの生活圏内で「タッチ&ゴー」できるようになるからだ。

が。

調べていくうちに、不穏な情報にぶちあたる。

町田駅というのは特殊な駅で、JR町田は旧原町田駅なので、小田急町田駅との乗り換えが「制度上」認められていません。(難しく言うと連絡運輸協定がない)

ええぇぇぇー!? 制度上ってナニヨ!! 客をバカにしてんのかい!

いやー、たぶん鉄な人たちには常識的な話だったんだろうけど、なんで磁気時代から定期が別々だったのか、やっと真相が判明したよ。なんてこった。

で、PASMOのサイトには、無情にもこう書いてある:

2枚以上の定期券をお持ちになる場合は、お手数でも磁気定期券をご利用ください。

2枚以上のICカードの同時使用はできません。

じゃあ、町田駅で小田急線⇔横浜線を使ってる何千人だか何万人だかの人たちは、未来永劫、全面ICカード化は望めないってこと? スゴイハナシデスネ……。

Tags: suica pasmo

ドメイン名の長さでspam判定してみる

だいぶ前から「www.なんちゃらinsure.com」とか「www.ほにゃららlife.info」みたいな、妙に長い名前のreferer spamがよく来る。発信元はまちまちなので、botnet経由だろう。ネーミングも手を変え品を変えしてくるので、NGワードで締め出すのも、イタチごっこだ。

そこで、「ドメイン名が長かったらspam」というのは有効ではないかと思い、以下のようなスクリプトを書いてtDiaryのリンク元ファイルを検索させてみた。ピリオドで切り離したホスト名要素の中に、13文字以上のものがあればアウト、である:

require 'uri'
while s = gets
   next unless /^\d+ / =~ s
   n, u = s.split
   begin
      URI::parse( u ).host.split( /\./ ).each do |d|
         if d.length > 12 then
            puts uri.host
            next
         end
      end
   rescue URI::InvalidURIError
   end
end

どれどれ……

% ruby longdomain.rb 2007/*.tdr
takagi-hiromitsu.jp
sinseihikikomori.bblog.jp
   :
   :

ああもう……_| ̄|○


とはいえ、こういう「まとも」だけど長いドメインはたいていblogだから、トップページだけじゃなくpermalinkからのrefererが多く含まれている。トップページ(パスが「/」のURL)を選んで弾くようにすれば、十分役に立ちそう。

というわけで、以下のようにフィルタを書いて設置してみることにした(longdomain.rb)。

require 'uri'
module TDiary
   module Filter
      class LongdomainFilter < Filter
         def referer_filter( referer )
            begin
               uri = URI::parse( referer )
               uri.host.split( /\./ ).each do |d|
                  if d.length > 12 and uri.path == '/' then
                     return false
                  end
               end
               return true
            rescue URI::InvalidURIError
               return false
            end
         end
      end
   end
end

追記(2007-01-27): バグってたのでちょっと修正。