スパムコメントが増えてきたので、このサイトのスパム対策(コメントのみ)を少し強化しました。

立てた対策は見えない入力領域を作って、そこに入力がある場合はスパムとみなすという感じです。ロボットなら、入力領域はとりあえず埋めてくる可能性があるので、多少効果があると踏んでいます。

Posted by あかさた
このブログの左側のメニューにはてブの人気エントリを表示してみました。はてなブックマークからサイトの注目記事を RSS で取得して、HTML に変換して表示しています。コードはざっと以下のような感じです。

require 'rss'
require 'net/http'
Net::HTTP.version_1_2

hotentries = ''
url = 'http://www.rmake-labo.com/akasata/'
rss_source = Net::HTTP.get('b.hatena.ne.jp', 
  "/entrylist?cname=&url=#{CGI.escape(url)}&sort=count&mode=rss")
rss = RSS::Parser.parse(rss_source)

rss.items.each do |item|
  hotentries += <<-EOS
    
  • #{item.title}
  • EOS end

    実運用する際は、はてなの RSS をキャッシュしたりしないと、はてなが重くなっちゃうので気をつけましょう。

    Posted by あかさた
    トホホ。とうとう、このブログにもコメントスパムがつき始めたようです。以前、Nucleus を使っていたときはコメントスパムが大量についたのですが、自作のスクリプト(Rails)に変更してからは、コメントスパムはついていなかったのですが・・・。

    今は、チェックボックスにチェックを入れないとコメントできないようにしていますが、これはどの程度効果があるのやら。英数字のみのコメントは無視するとか、それともブラックリストや単語ではじくことなどを考えだした方がいいのかも・・・。あるいは、半年以上経ったエントリにはコメントできないとか。

    トラックバックスパムは言及リンクチェックを入れているせいか、あまり問題は発生していません。が、最近は言及リンクチェック対策をしたスパムもある(トラックバックする前に、URL をリンク先に含めるなど)ので、油断はできませんが。

    スパムのおかげで余計なコストが増えて迷惑千万なのですが、法律の整備もままならない世界なので、当面は技術的に対処するしかないんでしょうね。はぁぁ・・・。

    Posted by あかさた
    Rails を動作させるプラットフォームとしては、scgi よりも Mongrel に力が入っているという話なので、Kodougu と同じくこのブログも Apache2.2 + Mongrel に変更しました。ついでに、Rails 1.2 に対応したのですが、ちゃんと動いているでしょうか・・・?

    このブログについてはこちらを参照してください。ソースコードのチェックアウトなどもできます。テストもロクに書いていないひどいコードですが。

    ■ 2007/3/16 22:44 追記
    従来はロードバランスしていなかったので、scgi サーバでは一つのコネクションしか処理できませんでした。アクセス数が少ないので、通常のブラウジングであればそれでも問題ないのですが、他のブログにトラックバック送信を行おうとすると問題になります。

    送信先のブログが言及リンクチェックをする場合ですが、チェックのためにこちらのサーバに接続すると、ブログ投稿者がコネクションを占有してしまっているので、送信先のブログはコネクションが空くのを待つようになり、こちらのサーバは送信先のトラックバック完了待ちになって、デッドロック状態になります。投稿者の接続がタイムアウトすると、送信先の言及リンクチェックが完了し、トラックバックが完了します。

    こんなばかばかしい現象も、ロードバランスをしたおかげで発生しなくなりました。

    Posted by あかさた
    mixi の日記に外部のブログを設定すると、非常に使い勝手が悪いわけですが、以下のブログにローテクですがとてもいいやり方が載っていました。

    小野和俊のブログ:mixi で外部ブログを使っている人への提案より

    だが、仕様は変えられなくてもストレスを回避するための方法を考えることができる。そこで提案したいのが、外部ブログを使っている人は、設定自体はミクシィ日記にしておいて、外部ブログに記事を書いたときには概要とリンクをミクシィ日記に書く、という運用面でのワークアラウンドである。記事が短い場合にはリンク自体張らずに内容を全部貼り付けてしまい、記事が長かったり、記事中にテーブルがあったりする場合には概要とリンク先 URL を貼り付ける。


    確かに手間なのですが、読み手にとってはとてもいいやり方だと思います。早速これから実践してみます。

    Posted by あかさた
    何かと難しい goo ブログとのトラックバックなどをまじめにテストしてみることにしました。

    とりあえず、以下にページ作成します。(言及リンク対策。)
    http://blog.goo.ne.jp/akasatarec/
    http://blog.goo.ne.jp/akasatarec/e/d0ba1a2fa56aab8cb83d75153e6a438d

    さて、トラックバックはうまくいくでしょうか。

    ■ 9:54 追記
    受信成功。ただし、こちらのトラックバックは goo に受け取ってもらえず。はてなは受け取ってくれるのに。(泣)

    Posted by あかさた
    すでに気づいている人も居るかもしれませんが、記事の右下にいくつか記事と関連のありそうな単語が並んでいると思います。タグです。このブログにタグを実装してみました。そこの単語をクリックすると、タグと関係のある記事が表示されます。

    記事とタグの間の関係を表すクラス図は以下のとおりです。

    1171499624_20070215_01.png

    上の図は Kodougu で書きました。(これがやりたかった。^^)何をやっているのかというと、クラス図のメタモデル(ストラクチャとノーテーション)を設計して、設計したモデリング言語(クラス図)を使ってモデリングして上図を作成したということです。上図の場合、モデリング言語設計は 10 分くらいでできました。

    もっとも、Kodougu のモデリング言語設計機能では、多重度が多の関連(属性)を要素に追加することが出来ないので、クラス図に属性をつけることはできません。
    # 今がんばっています。

    余談ですが、上図のような多対多の関連を実現するために、Rails ではテーブルを一つ作って、habtm という関連を作っています。(articles, tags, articles_tags という三つのテーブルが存在して、多対多関連の実現には articles_tags を使っています。habtm は has_and_belongs_to_many の略で、これを ActiveRecord で指定すると、多対多のテーブルの情報を使って自動的に関連を再現してくれます。)タグ実現の具体的な作業としては、ソースコードを自動生成したらドメインオブジェクトに habtm を一行追加して、ビューとコントローラを整えるだけです。なんというか、便利な世の中ですねぇ・・・。

    Posted by あかさた
    サイトのデザインを修正してみました。元々 3 カラム(両側にメニューがあって、中に記事が入る縦三列のデザイン)だったのですが、表示が崩れるなどの問題が頻発したため、2 カラムに修正してみました。色合いも原色を避けて少しくすんだ感じにしました。
    # まだなんかいまいちですが、デザイナじゃないですし・・・。

    左側のメニューについては、そのうち整理してもっと見やすくする予定です。

    Posted by あかさた
    トラックバックを受信するコードを実現しましたが、文字コードのことを考えていませんでした。はてなダイアリーなどは UTF8 なのですが、goo ブログは euc-jp らしく、UTF8 で運用しているブログでそのまま受信すると文字化けしてしまいます。そこで、受信したトラックバックの内容を UTF8 に変換するコードを書く必要があります。

    Ruby で文字コードを変換する方法はいろいろとありますが、ここでは kconv を使用します。kconv を使用すると、文字コードの自動判別をさせながら utf8 に変換するコードを書くことができます。

    例としては以下のようになります。toutf8 というメソッドが文字列を utf8 に変換しています。

    require 'kconv'
    @trackback.title = @title.toutf8
    @trackback.excerpt = @excerpt.toutf8
    @trackback.url = @url.toutf8
    @trackback.blog_name = @blog_name.toutf8

    もっと詳しく知りたい方は、こちらのページを参照することをお勧めします。

    Posted by あかさた
    XML-RPC を使って更新 Ping を送信する機能をこのブログに実装してみました。

    ■ 更新 Ping とは?
    ブログの更新をブログ検索サイト(Google のブログサーチとかテクノラティとか)に伝えるときに送信するメッセージのことです。これを送信すると、検索サイト(情報サイト)は、新着情報にそのブログの最新記事を載せてくれます。

    ■ メカニズム
    検索サイトなどでは、更新 Ping を受け付けるための Web サービス(XML-RPC)を公開しているので、ブログからはその Web サービスを実行すればよいということになります。
    ※ weblogUpdates という統一規格があるようです。

    ちなみに、REST 形式(POX over HTTP 形式)の Web サービスを公開しているサイトもあるので、XML-RPC 以外の方法も存在します。

    ■ 実装コード
    require 'xmlrpc/client'
    server = XMLRPC::Client.new2('http://pingoo.jp/ping/')
    server.call("weblogUpdates.ping", 'あかさたのページ', 
        'http://www.rmake-labo.com/akasata/')

    Web サービスを公開しているサイトとして、「http://pingoo.jp/ping/」を指定していますが、これは Pingoo! というサイトで、テクノラティなど有名な更新 Ping 受信サイトに更新 Ping を再転送してくれるサービスです。このサービスを使うと、更新 Ping を受け付けるサーバを一つ一つ調べる必要がないので楽です。

    ■ 動作の説明
    動作としては、次のとおりです。
    1. XML-RPC で更新ブログ名と URL 名を伝える
    2. Pingoo! は、送信元ブログを参照して RSS を取得し、最新の更新情報を取得する(※)
    3. Pingoo! は登録してある更新 Ping を受け付けるサーバに最新情報を送信する

    ※ このため、送信元ブログの HTML のヘッダには、以下のような RSS を指定するコードを実装しておく必要があります。

    Posted by あかさた