« 2009年4月 | トップページ | 2009年8月 »

2009年5月の4件の記事

2009-05-30

テスト用更新Pingダミーサーバーを作成して検証。アクセスアップにつながるのか?

更新Pingとは
更新Pingとは、ブログなどを更新した際に、更新した事を通知する仕組みです。

ブログの設定で更新通知を送るサーバーを設定しておくと、記事の更新時にブログ名とブログのトップページのURLがサーバーに通知されます。

この情報を元に、受信サーバーは、RSSなどを取得したりして、更新情報を取得し、新着記事などとしてリンクを作成したりするのに使ったり、ブログ検索などにエントリーされます。
これによって、自分のブログへのリンクが増えたり、検索サイトでヒットする確率が増えるので、アクセス増加の可能性があります。

更新通知サービスが使えないブログ
楽天ブログでは、この更新Pingを送るサービスがありません。(と思います)
トラックバックPingなどのサービスを利用して、更新通知を送る事はできますが、更新Pingサーバーの設定はできないと思います。

このココログもベーシックだからか、自由な追加はできないみたいです。
あらかじめ用意された選択肢にチェックするようになっています。
ブロガーも設定方法がわかりませんでした。

そこで、自作しようというのが、そもそもの企みでした。

しかしながら、あまりいい加減に、現在稼動中のサービスに頻繁に更新Pingを送るのも迷惑ですし、実際にキチンと届いているのか。
また、送られるデータの形式は、本当に正しいのかを判断する事ができません。

更新Pingのしくみ
更新Pingは、RPC (Remote Procedure Call) という仕組みを使います。
リモートの手続きをコールします。
他のサーバーで動いているプログラムに、何らかのデータを渡して処理を行ってもらいます。

プログラミング言語のパスカル (Pascal) では、プロシージャは、値を返しませんが、RPCは戻値というか、レスポンスを返します。
これは、RPCがCGIなどのウェブアプリケーションで作られていて、HTTPアクセスに対する応答が必要だからではないかと思います。

更新Pingに更新を通知するには、XMLという形式のデータを、サーバーにPOSTします。
受信サーバーは、更新通知が送られてくると、エラーかどうかの情報と、そのメッセージ文字列をXML形式で戻してくれます。

しかし、実際には、エラーなし、「Thanks for the ping.」なんてメッセージが戻ってきても、本当に正常に送られているのかどうか、わかりません。
Pingサーバーにアクセスしている事、結果を受け取っている事は確認できますが、その先でブログ名が文字化けしてしまったり、URLが空文字列だったりという事があるかもしれません。

更新Pingを受け取ってみよう
そこで、正しく送られているであろう更新通知と、自作した更新通知を比較してみようと思い、受信した更新通知のXMLをファイル出力するCGIを作成しました。

そして、更新Ping送信機能のあるブログから、自作のPingサーバーに更新通知を送ります。
次に、自作のツールで更新通知を送ります。

その二つを比較してみました。
結果は、ほぼ同じでした。
<?xml version="1.0"?>
が、
<?xml version="1.0" encoding="UTF8"?>
だったりしましたが、調べてみると、encodingを省略した場合にはUTF-8として扱われるようなので、問題はなさそうです。

ということで、どうやら正常に送られていると考えて良さそうです。
ちょっとでも、アクセスアップにつながるといいかなと。

テスト用ダミーPingサーバーソース
#!/usr/bin/local/perl

# 受信データ読み込み
read (STDIN, $xml, $ENV{CONTENT_LENGTH});

# ファイルに出力
open OUT, ">> ping.xml";
print OUT $xml . "\n\n";
close OUT;

# 結果出力
print <<EOF
content-type: text/xml

<?xml version="1.0"?>
<methodResponse>
<params>
<param>
<value>
<struct>
  <member>
    <name>flerror</name>
    <value><boolean>0</boolean></value>
  </member>
  <member>
    <name>message</name>
    <value><string>Thanks for the ping.</string></value>
  </member>
</struct>
</value>
</param>
</params>
</methodResponse>
EOF

こんな感じで、エラー処理も何もしていないテストCGIを作りました。
危なっかしいので、テスト後は、すぐに削除しました。

ただ、普段は、MetaGatewayを使って書いているので、MetaGatewayの機能でPingを送る事ができるので、あまり使うことはなさそうですけど。

色々と勉強になりました。



| | コメント (0) | トラックバック (0)

2009-05-29

XMLRPC::Liteで更新Ping

更新Pingを手動で送信したかったのですが、なかなかどうして、うまくできていない様子です。

perlソースはeucなので、タイトル部分はJcode->new ('ブログタイトル')->utf8;とかして、UTF8にしているつもりです。
XMLRPC::Transport::HTTP::CGIを使って、簡単なサーバーCGIを作って、ログを取ってみたりすると、ブログタイトルはUTF8だし、URLもちゃんと取得できているような気がする。
で、http://ping.bloggers.jp/rpc/とかに送信してみると、Thanks for the pingとか、Thanks for your pingとかなんとか、メッセージが戻ってきてる。
かといって、自分でブラウザで見てても、新着とかに表示されていない。

はて。何が原因なんだろうか。もしかして、そもそも、何かの制約があって、pingを受け取っても表示しないとか、送り元のIPで許可があるとか?

色々と調べた結果、どうやらうまくいっているようす。

で、このブログから適当なサーバーのCGIに更新Pingを送信させて、受信したXMLをファイルにログとして書き出させてみます。

以下のような簡単なCGIを一時的に設置してテストしてみました。

read (STDIN, $xml, $ENV{CONTENT_LENGTH});
open OUT, ">> ping.xml";
print OUT $xml . "\n\n";
close OUT;

で、受信した更新Pingをファイル出力します。

結果は、以下を標準出力に出力しました。

content-type: text/xml

<?xml version="1.0"?>
<methodResponse><params><param><value><struct>
<member><name>flerror</name><value><boolean>0</boolean></value></member>
<member><name>message</name></value><string>Thanks  for the ping.</string></value></member>
</struct></value></param></params></methodResponse>

さしあたて、この記事の更新Pingが送られるようにしてみました。
受信側のCGIレスポンスは、何でもかんでもベタに成功時のXMLを出力するようにしてあります。

結果、自分で送信してる物と、同じXMLが送られている事がわかりました。

MetaGatewayからの結果

<?xml version='1.0'?>
<methodCall>
<methodName>weblogUpdates.ping</methodName>
<params>
<param>
<value><string>TagoSuckのプログラム日記 たごろぐ</string></value>
</param>
<param>
<value><string>https://tagosuck.cocolog-nifty.com/tagolog/</string></value>
</param>
</params>
</methodCall>

という事は、レスポンスのメッセージを見ても、成功しているという事だと思います。
表示されないのは、送信しているXMLの問題ではないのではないか?という結論にしようとおもいます。

あまり頻繁に送っているつもりはないのですが、スパム扱いになってフィルタリングされてしまっているか、RSS参照で記事の更新を伴っていないという事か。
ハッキリは分かりませんが、この辺りで納得する事にしました。

実際、効果の程はわかりませんが、時々使ってみようと思います。



| | コメント (0) | トラックバック (1)

2009-05-20

kakasiの辞書に単語を追加する

kakasiで分かち書きするのに、
kakasiの辞書では、単語がかなり細かいので、
もう少し長くしたいと思いました。

つまり、「楽天市場でお買い物」を "kakasi -w" すると
「楽天」、「市場」、「でお」、「買い物」になります。
これを「楽天市場」、「でお」、「買い物」にしたいと思いました。

辞書に独自の単語を登録すればよいのではないのか?
「楽天市場」という単語を登録して、「楽天」と「市場」にマッチしないようにしたい。

早速、Google先生に調べてもらいました。

やはり、より長い単語にマッチした場合には、そちらが優先されるという事がわかりました。

やり方はというと、どうやらmkkanwaというコマンドを利用するようです。
kakasiのソースからkakasidictを取り出し、
"mkkanwa kanwadict kakasidict"
とする事で、kanwadictが作成されるようです。

がっ!kanwadictは既に存在します。

試しに、kanwadictのバックアップを作っておいて、
実際に辞書を作成してみると、確かにできました。

更に、独自の辞書を追加するには、
"mkkanwa kanwadict kakasidict mydict"
のようにして、作成するようで、こちらもうまくいきました。

が、namazuからkakasiを使う場合には、今まで通りの辞書がいいと思い、
試行錯誤してみました。
"mkkanwa mydict.bin kakasidict mydict"
とか、して、
"echo 楽天市場でお買い物 | kakasi -w mydict.bin"
全然ダメです。

他にも色々やりました。
まったくダメでした。
ちょっと一服 . . . 。
気分転換はとても重要です。
物凄く単純な事に気がつきました。

「もしかすると、skkタイプのテキストファイルをそのまま指定すればよいのか?」

やってみました。
まず、適当な辞書を作成しました。
形式は、「ひらがな + 半角スペース + 漢字」です。
文字コードはEUC-JPで改行コードはLF(0xA)です。

File: rakutendict

らくてんいちば 楽天市場


"echo 楽天市場でお買い物 | kakasi -w rakutendict"

. . . あっさりできました。

バイナリにする必要はなかったようです。
辞書ファイルの指定は、追加辞書のファイル名だけでよいようです。

ひらがなへの変換も試してみました。
"echo 楽天市場でお買い物 | kakasi -JH"
> "らくてんしじょうでおかいもの"

"echo 楽天市場でお買い物 | kakasi -JH rakutendict"
> "らくてんいちばでおかいもの"




| | コメント (0) | トラックバック (1)

2009-05-19

楽天APIで自動アフィリエイトリンク作成

楽天ウェブサービス商品検索APIを使って、
ブログ記事に自動的にアフィリエイトリンク
作成するツールを作ってみました。

ウェブサービスを利用したリンクはURLが長くなるため、
大量にアフィリエイトリンクを埋め込みすぎると、
文字数制限の10,000バイトを超えてしまいます

そこで出現頻度を指定して、指定の出現頻度以上単語のみをキーワードとして商品検索するようにしました
ちなみに出現頻度は2~5から選択します。デフォルトで2です。

これでも、かなりの数の単語になります。
そこで、1byteのみの文字と2byteでも漢字以外の文字は
除外しました。

これで、対象がかなり熟語のみに絞られました。

次に、2回以上出現するキーワードを全てリンクにしてしまうと、
文字数がかさばるので、初回出現時のみリンクする事にしました。

文章を単語に区切るには、カカシ、チャセン、メカブなどの
形態素解析器で分かち書きします。
はPerlを使ったので、Text::Kakasi.pmを利用しました。

単語単位に切り分けができたら、連想配列のキーとして単語を登録します。
私は出現回数をカウントしているので、連想配列の値には、
ハッシュのリファレンスで、出現回数と商品検索結果のアフィリエイトURLを保存しています。
ここは、配列のリファレンスでもいいと思います。要素0に出現回数、要素1にURLでOKですね。

最終的に、記事の中から単語を検索して、リンク付きの文字列と置換しました。

| | コメント (0) | トラックバック (0)

« 2009年4月 | トップページ | 2009年8月 »