2009年10月27日火曜日

[LibroSpot] OpenIDに対応しました

LibroSpotOpenIDに対応しました。

OpenIDって何?という方はこちらのページをどうぞ。
OpenIDとは? - Yahoo! Japan
YahooのOpenID解説ページですが他サービスも理屈は同じです。


もともとOpenIDには対応していたのですが、ちょっと分かりにくかったので日本のサービスを並べてみました。

Yahoo! Japan
mixi
livedoor
こちらの3サイトはリンクをクリックするだけでOpenID用の認証ページに遷移します。
(それぞれのサイトで未ログインの場合、お持ちのIDとパスワードを入力してログインしてください)


もちろんその他のサービスにも対応しています。

例えば はてな のアカウントをお持ちの方は
http://www.hatena.ne.jp/[あなたのはてなID]/
というURLを入力するだけです。


めんどうな登録も不要でもちろん無料ですので、是非ご利用下さい。

LibroSpot
http://jp.librospot.com

2009年10月26日月曜日

[2ちゃんねるまとめのまとめ] 人気の記事順に並べる機能を追加しました

2ちゃんねるまとめのまとめ は腕利きの2chまとめ職人さんたちが選りすぐったエントリーが並んでいるので、どのエントリーを見てもおもしろいのですが、「人気」順にならべる機能を追加しました。


人気順って?

ぶっちゃけてしまうと、はてなブックマークの被ブックマーク数順です。

被ブックマーク数のチェックははてなブックマーク件数取得APIGETリクエストでのシンプルなAPIってやつを利用しています。

本当にシンプルに数字だけを返してくるので

import urllib, urllib2
url = "http://foo.com"
response = urllib2.urlopen('http://api.b.st-hatena.com/entry.count?' + urllib.urlencode({'url': url}))
count = response.read() # => 50

これだけで被ブックマークが確認できるので楽ちんです。
(エラーとか考えなければ)

今回は、エントリー別の詳細ページに上のコードを仕込んで、キャッシュの期限を適度に設定してみました。
アクセスがあってキャッシュが効いてなければ、はてなにリクエストを投げる仕組みになっています。
返ってきた数字をストレージに保存しておけば被ブックマーク順に並べられるというわけです。


ただ、これだとアクセスがなければずーっと更新されないままになってしまうですよね。

Google App Engineを利用しているのでTask Queueなんかを使えばいいのかもしれませんが、まんべんなくリクエストを投げるのは難しい感じがする。

エントリーの投稿日とか被ブックマーク数の増加率とかを勘案してスケジュールを組めばいけるのかな。
めんどいけど。

2009年10月25日日曜日

Google AJAX Feed APIを使ってAmazonのベストセラー/ニューリリース商品を表示するガジェットを作ってみる

amazonのアソシエイトに参加している方向け。

amazonアソシエイトのサイトでも色々ウィジェットを提供してくれていますが、既成のものだと「見慣れた感」が強くて目に止まりにくいかと思われます。

そういうわけで、シンプル & カスタマイズしやすいものがあれば便利かなと思ってソースコードを公開してみます。

プログラミングとかJavascriptとかよく知らねという方はこちらをどうぞ
iGoogle: amazon.co.jp ベストセラーズ
iGoogle: 新刊本情報




» デモ


商品情報:
amazonが配信しているRSS (本のベストセラーとか)を利用

商品情報の取得:
Google AJAX Feed APIを利用。
これを利用するとサーバーにスクリプトを置かなくてもJavascriptだけでRSSフィードをパースできます。

Google AJAX Feed API
http://code.google.com/intl/ja/apis/ajaxfeeds/


商品を表示したい箇所に次のように書いておきます。
<div id="amazon_items"></div>


実際に商品RSSを取得して表示するJavascript。
head内とかHTMLの一番下(body閉じタグの直前など)に貼付けてみてください。
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load('feeds', '1');
google.setOnLoadCallback(drawItems);

// フィードの読み込みと描画を行う関数
function drawItems() {
var
tracking_id = 'aaaaa-22', // あなたのトラッキングID
thumb = 75, // サムネイル画像の1辺の長さ(px)
num = 5, // 表示する商品数
feed_url = 'http://www.amazon.co.jp/rss/new-releases/books/466280/ref=pd_nr_rss_link', // 表示したいカテゴリーのRSSフィードURL
feed = new google.feeds.Feed(feed_url + '?tag=' + tracking_id);
feed.setNumEntries(num);
feed.load(function(res) {
if (res.error) {
return false;
}
var h = '';
for (var i = 0; i < res.feed.entries.length; i++) {
var
e = res.feed.entries[i],
title = e.title.match(/#\d{1,2}:\s(.+)/),
img = e.content.match(/http:\/\/ecx\.images-amazon\.com\/.+\.jpg/),
author = e.content.match(/<span>([^<]+)/);
h += '<div style="clear:left;border-top:solid 1px #ccc;padding:5px 0;">';
if (img)
h +=
'<div style="float:left;">' +
'<a href="' + e.link + '" style="text-decoration:none;">' +
'<img src="' + img[0] + '" alt="" height="' + thumb + '" width="' + thumb + '" style="padding:0 12px 6px 0;border:none;" />' +
'</a>' +
'</div>';
h +=
'<div style="margin-left:' + (thumb+12) + 'px;">' +
'<a href="' + e.link + '" style="font-weight:bold;">' + ((title) ? title[1]: e.title) + '</a>';
if (author) h += ' &nbsp; <span>' + author[1] + '</span>';
h += '</div></div>';
}
h += '<div style="clear:left;"></div>';
document.getElementById('amazon_items').innerHTML = h;
});
}



GoogleのJavascript系APIを利用したことがない人のために軽く補足しておきます。
(太字がGoogle AJAX Feed APIを利用しているところです。)

最初におまじないをします。
<script type="text/javascript" src="http://www.google.com/jsapi"></script>

Google AJAX Feed API用のライブラリを読み込みます。
google.load('feeds', '1');

ライブラリの読み込みが完了してから実行するコールバック関数をセットします。
google.setOnLoadCallback(drawItems);

初期化します。引数は読み込みたいフィードのURLです。
feed_url = 'http://feeds.digg.com/digg/popular.rss';
feed = new google.feeds.Feed(feed_url);

デフォルトでは4件しかエントリーを返してくれません。
それ以上のエントリーを取得したい場合は明示的に指定する必要があります。
feed.setNumEntries(num);

feed.loadは実際にフィードの読み込み処理を行い、引数に指定したコールバック関数にフィードを操作する処理を書きます。
feed.load(function(res) {
// do something.
});



※ このスクリプトを使ってトラブルが発生しても当方は一切関知しません。

2009年10月20日火曜日

JaikuEngineでお手軽にTwitterクローンを作ってみる

作るというか、まあ、JaikuというTwitterのクローンサービスがありますが、それのクローンをGoogle App Engineに簡単にインストールできるよという話です。



Jaikuは2007年10月にGoogleが買収後、2009年1月に開発打ち切りが発表されました。

それはそれでザンネンなニュースなのですが
Google App Engineで動くオープンソースソフトとしてソースコードが公開されて、そちらで開発が進められています。

JaikuEngine
http://code.google.com/p/jaikuengine/


ローカル環境で動かしてみたのがこちら。


Jaikuの完コピです。
APIまで提供できます。


ちなみに、開発環境で
Google App Engine LauncherRunボタンとか dev_appserver.py app でサーバーを起動すると、上手く起動できませんでした。

アプリケーションのディレクトリで
python manage.py runserver 8080

とDjango流に起動させる必要があるようです。(初回だけ?)
(JaikuEngineはDjango製です)


8080以外のポートで起動させたい場合は
local_settings.py (dev_settings.pyをリネーム)
# 下の2行を修正
GAE_DOMAIN = 'localhost:8081'
DOMAIN = 'localhost:8081'



システム的にはこれだけです。
appcfg.py update app

すれば、公開完了!


ただ、対応言語が英語オンリーなので日本語化するとなると骨ですが。。。

このまま公開して無問題という方であれば、Python知らなくてもGoogle App Engineに不慣れでもサクっといけると思います。

2009年10月5日月曜日

jQueryのホットな記事をつぶやくTwitter botを作ってみた

以前作ったjQuery専門のニュースサイトを利用してjQueryのホットな記事をつぶやくbotを作ってみました。


@jquerybuzz
twitter.com/jquerybuzz





つぶやくのは多くて1時間に1度だけです。





ちなみに、このブログ名義のアカウントもTwitterにあります。
こちらもよろしく
http://twitter.com/mudaimemo