第一回で説明したとおり、トラックバックは以下のパラメータを持った HTTP POST リクエストです。
・ title(記事のタイトル)
・ excerpt(記事の要約)
・ url(記事の URL)
・ blog_name(ブログ名)

そこで、以下のようなコードを書いてやれば、トラックバックを送信できます。このメソッドを、記事を生成するメソッドか更新するメソッドから呼び出してやればよいでしょう。

require 'net/http'
require 'uri'
def send_trackback(url, article)
  Net::HTTP.version_1_2
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, 80)
  data = 'title=' + Article_Title + 
    '&url=' + Url
    '&blog_name=' + Title + 
    '&excerpt=' + Article_Content
  
  response = http.post(uri.path, data)
end


ひとつ注意してほしいことは、同じ記事(URL)に対して同じ内容のトラックバックを複数回送信すると相手先に迷惑になるので、そのような実装は避けてください。

Posted by あかさた
Ruby on Rails におけるトラックバックの受信に関する実装のポイントを説明します。

(0) 前提知識
トラックバックの仕様を説明します。トラックバックを、受信するということは、以下のパラメータを持った HTTP POST リクエストを受信するということです。
・ title(記事のタイトル)
・ excerpt(記事の要約)
・ url(記事の URL)
・ blog_name(ブログ名)
※ url 以外は省略される場合があります。

ですから、トラックバックは以下のような流れで実装することができます。
(1) 受信したトラックバックを貯めるためのテーブルを準備する
(2) トラックバックを受け取るコントローラにメソッドを作る
(3) レスポンスを返す


(1) 受信したトラックバックをためるためのテーブルを準備する


以下のようなカラムを含むテーブル(例:trackbacks)を作成します。
・ id
・ title
・ excerpt
・ url
・ blog_name
・ article_id
・ date

article_id は、トラックバックを受信した記事の ID です。date は、トラックバックを受信した日時です。

(2) トラックバックを受け取るコントローラにメソッドを作る


以下は、このブログのトラックバックを受け取る URL の例です。説明すると、コントローラ「articles」、メソッド「trackback」、ID は記事の ID です。
http://www.rmake-labo.com/akasata/articles/trackback/34


以下のように書くことで、受信したトラックバックの情報を取得することができます。受信したトラックバックの情報に基づいて、記事の view などを変更してください。

def trackback
  @title = params[:title]
  @excerpt = params[:excerpt]
  @url = params[:url]
  @blog_name = params[:blog_name]
  
  # ここに、DB に受信したトラックバックを挿入するコードを書く。
end


(2.1) 補足


トラックバックは通常の HTTP GET メソッドではなく、POST メソッドで送られてきます。ですから、以下のように、HTTP POST のみを受け付けるように、Controller に記述してやる必要があります。
verify :method => :post, :only => :trackback, 
    :redirect_to => { :controller => :application, :action => :index }


(3) レスポンスを返す


トラックバックを受けたら以下のようなレスポンスを返す必要があります。View(trackback.rhtml)に記述すると良いでしょう。

○ 正常なレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>0</error>
</response>

○ エラーのレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>1</error>
<message>The error message</message>
</response>

■ 参考
トラックバックを実装した
http://www.rmake-labo.com/akasata/articles/show/34

トラックバック技術仕様書
http://lowlife.jp/yasusii/stories/8.html


Posted by あかさた
Ruby on Rails では、Scaffold を生成して、ブログの記事やコメントの追加削除をできるようにするところまでは、Rails に慣れていない人でも数時間で到達します。しかし、それ以上の機能を持ったブログを開発しようとすると、ブログに関する知識がないとスムーズには進みません。

この連載では、Rails(Ruby)を使ってブログの実装を行っている人向けに、ブログに関する周辺知識を交えながら、実装に有用な情報を掲載していきます。

■ 対象読者
・ Ruby の文法の知識は初級 ~ 中級
・ Ruby on Rails の Scaffold を生成したことがある
・ ブログの実装はしたことがない、あるいはそれほど詳しくはない
・ 今、Rails を使ってブログを実装しようとしている

■ 連載
第一回 トラックバックを受信する(2007/1/8)
第一回【補足】 トラックバックを受け付けるために、文字コードを変更する
第二回 トラックバックを送信する(2007/1/8)
第三回 RSS を配信する(Coming soon)
第四回 XML-RPC を使って、更新 Ping を送信する(2007/1/8)

■ 番外編
Ruby on Rails を使用できる国内ホスティングサーバについて(Coming soon)

Posted by あかさた
このブログ(Ruby on Rails)をモバイル対応をしてみました。といっても、まじめにやったわけではなく、before_filter に以下のコードを埋め込んで、携帯ブラウザの場合は左右のメニューを隠したり、一度に表示する記事の量を抑えたりしています。

if user_agent.index(/DoCoMo|J-PHONE|Vodafone|KDDI|UP\.Browser/)

is_mobile = true
end


いくつかバグがあって、大きな画像を記事中に埋め込んでいるときは、容量オーバーで表示が途切れたり、文字コードは UTF8 にしているので、古い携帯や機種によっては見られない(というか見られない機種のほうが多い)という現象が発生します。

テストは AU の W43S で行いました。コメントを書くとかそういうことは一切テストしていないので、ものすごい不具合があるかも・・・。テストしてみました。普通に書き込めました。顔文字とか機種依存文字とか使うとだめだと思いますが、普通に書くぶんには問題なさそうです。

以下、2007/1/7 に追記。
私なりに調べた携帯対応のポイントを書き連ねておきます。(このブログではほとんどできていませんが・・・。)
・ 携帯の機種によって必要な対応項目が異なるので、user_agent を調べて、機種ごとに適切な対応をとる必要があります。(HTML の形式、文字コード、一度に読み込めるページのサイズなど。)
・ 文字コードは昔は Shift-JIS が一般的でしたが最近はいろいろです。私の携帯では UTF8 も対応しています。
・ 携帯は読み込める容量が少ないので、大きな画像は縮小、文章も適切なところで切ってやる必要があります。
・ 携帯は画面サイズ(というか解像度)が小さいので、画面を有効活用するために、カタカナは半角にする必要があります・・・という話がありますが、個人的にはそろそろいいのではないかと考えています。最近の携帯は VGA(昔の PC のディスプレイ)位の解像度はあるので・・・。
・ パケット代を節約するためにも、余分な情報(このサイトで言えば、左右のメニューとか)は極力表示しないようにします。
・ Rails で作ったアプリは、割とそのままでも表示されました。でもこれは、au だけかな・・・?

以上です。

Posted by あかさた
以前の記事でトラックバック(受信のみ)を実装したと記述しましたが、ようやく送信も実装しました。要約の作成をちゃんとやっていない(今は全文を送信するという非常に迷惑な仕様になっている)とか問題は残っていますが。今のところ、はてなダイアリーへの送信には成功しています。

問い合わせ文字列に、title、url、blog_name、excerpt を指定して、post で送れば良いだけなのですが、Ruby の http 回りで少々てこずってしまいました。情報が少ないのです。

コードとしては以下のような感じです。
def send_trackback(url, article)

Net::HTTP.version_1_2
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, 80)
data = 'title=' + article.title +
'&url=' + Base_Url + 'articles/show/' + article.id.to_s +
'&blog_name=' + Title +
'&excerpt=' + article.content

response = http.post(uri.path, data)
end


Posted by あかさた
未踏の開発の現実逃避(?)がわりに、トラックバックを実装してみました。個人的に驚いたのは、トラックバック自体は仕様が小さくて実装にそれほど手間がかからなかったことでしょうか。こりゃ広まるわけだ。

■ 参考
トラックバック技術仕様書
http://lowlife.jp/yasusii/stories/8.html

■ 概要
トラックバックを実装したといっても、トラックバック ping を受信する機能を実装しただけです。トラックバックの受信は簡単で、以下の問い合わせ文字列を持った HTTP POST リクエストを受け取れる URL を準備すれば良いだけです。
・ title(記事のタイトル)
・ excerpt(記事の要約)
・ url(記事の URL)
・ blog_name(ブログ名)

Movable Type では、url だけの ping を受け取れるようですが、一応このブログでは上記をすべて必須として実装しています。というか、上記くらいの情報がないとトラックバックの情報を Web に埋め込みにくいからです。

成功すると以下のレスポンスを返しますが、はてなダイアリーなどを試した限りでは、このレスポンスは無視しているかもしれません。エラーのレスポンスを返しても、何も反応がなかったので。

○ 正常なレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>0</error>
</response>

○ エラーのレスポンス
<?xml version="1.0" encoding="iso-8859-1"?>
<response>
<error>1</error>
<message>The error message</message>
</response>

Movable Type には、RSS でトラックバック URL を配信したり、記事に RDF を埋め込んで、トラックバック URL を自動検出させたりすることができるようですが、当面はそうした機能は必要性を感じないので、実装しないことにします。

■ 感想
実装は簡単でしたが、コードはあちこちいじらないといけなかったので、疲れました。もっと変更しやすいように書いておけばよかった・・・。orz

Posted by あかさた
このブログに Google の検索機能を追加してみました。右上の検索ボックスです。検索すると、このページ内に埋め込まれた検索結果を見ることができます。なんというか、便利な時代ですねぇ・・・。

少々てこずったのは、ブラウザのウィンドウが小さいときに、このページのような 3 カラムの真ん中に検索結果を入れようとすると、検索結果が右側のカラムにはみ出してしまうという現象が発生したことです。google の検索結果は iframe で貼り付けられており、pixel 単位でサイズを指定することもできますが、ウィンドウのサイズを小さくしたときには、iframe のサイズをよほど小さくしないとレイアウトが崩れてしまいます。そして、iframe のサイズを小さくすると、ウィンドウのサイズを大きくしたときに、間延びしたレイアウトになってしまいます。
とりあえず、今は検索結果を表示しているときは右側のカラムを表示しないようにしています。意外と、html と CSS だけでは、レイアウトがうまくまとめられないことが多いですね。
# 私のスキル不足かもしれませんが・・・。orz

Posted by あかさた
今日はものすごく簡単なコメントスパム対策を施しました。つい先ほどコメントスパムを受け取ったためです。。。

そもそも、スパム対策というのはいくつかの方法があります。ブラックリスト方式(スパム書き込みをした IP アドレスを書き込めなくする)、フィルタリング(禁止用語などが含まれていると書き込めない)などです。

私が行ったのはもっと簡単なもので、書き込み手にコメントを書き込む際にチェックボックスにチェックをいれてもらう方法です。コメントスパムは海外から来ることが多いので、こんな簡単なものでも結構効果的なのです。ほかにも、英数字だけの書き込みははじくという方法も考えられるのですが、これはこれで不便かもしれないので、今回は見送りました。

最終的にはちゃんとしたスパム対策をしないといけないですね。

Posted by あかさた
というわけで、Ruby on Rails を使ってブログスクリプトを作ってみました。まだまだ機能は不足していますが、使わないことには何が足りないのかわからないと思うので、まずは使ってみることにします。

何か変なところが見つかったら教えてください。m(_ _)m

Posted by あかさた