メイン

「MashUp」のアーカイブ

2008年1月13日

Yahoo! Pipes と jQuery で1年前のはてなブックマーク人気エントリを表示するガジェットを作ってみる --- その2

昨日のエントリの続き。

作ったPipeを使って、1年前のはてぶ人気エントリを表示するガジェットの作成に取りかかったのですが、Pipeを作る際に参考にさせてもらったてっく煮のにとよんさんから

「1年前のはてブを表示。1年に限らず、数年まとめて見れたら面白いかもしれん。」

と、はてぶコメントをいただきました。それもそうだなと思い、軌道修正。

N年前の人気エントリをタブで分けて表示するガジェットにしてみました。

↓とりあえず完成系。

表示件数は「設定」から10~50の間で選択可能です。

はてぶが始まったのが、2005年2月10日なので、2月10日を超えると、タブが3つになります。

ガジェットのソースは↓こんな感じ。

xml : http://hatebu-plus.googlecode.com/svn/trunk/gadget/past-hatebu/past_hagena.xml

js : http://hatebu-plus.googlecode.com/svn/trunk/gadget/past-hatebu/past-hatena.js

var retryNum = 0;
var retryMaxNum = 10;
function init(){
	for(var i =0,len = days.length;i<len;i++){
		tabs.addDynamicTab(getDispDate(days[i]), callbackGenerator(days[i]));
	}
}
function callbackGenerator(day) {
	return function(tabId) {
		callbackTab(tabId, day);
	}
}
function callbackTab(tabId,day){
	retryNum ++;
	var feed_url = getURL(day);
	_gel(tabId).innerHTML = '<div class="feed">Loading...</div>';
	_IG_FetchFeedAsJSON(feed_url,function(feed) {
		var html ='';
		try{
		html = '<div class="feed"><span class="subtitle">'+getDispDate(day)+'の人気エントリ</span><ul>';
		for (var i = 0; i < feed.Entry.length; i++) {
			html += '<li><a target="_blank" href="'+feed.Entry[i].Link+'">'+feed.Entry[i].Title+'</a>'+createBookmarkNum(feed.Entry[i].Link,feed.Entry[i].Summary)+'</li>';
		}
		html = html + '</ul></div>';
		$(_gel(tabId)).html(html);
		_IG_AdjustIFrameHeight();
		retryNum = 0;
		}catch(e){
			if(retryNum <= retryMaxNum){
				callbackTab(tabId,day)
			}else{
				_gel(tabId).innerHTML = '<div class="feed">情報の取得に失敗しました。</div>';
				retryNum = 0;
			}
		}
	}, prefs.getInt("num_feed"),true);
	_IG_AdjustIFrameHeight();
}
function getURL(d){
	var m = d.getMonth() + 1;
	((''+m).length == 2)? m = ''+m:m = '0' + m;
	var da = d.getDate();
	((''+da).length == 2)?da=''+da:da='0'+da;
	var ds = (d.getFullYear())+ m + da;
	return 'http://pipes.yahoo.com/chrisryu/pasthatebu?date='+ds+'&_render=rss';
}
function getDispDate(d){
	return d.getFullYear() + '-' + (d.getMonth()+1) + '-' + d.getDate() + '';
}
function createBookmarkNum(link,desc){
	var num = parseInt($(desc).text().split('/')[0]) ;
	var img = '<img src="http://b.hatena.ne.jp/entry/image/' + link + '" onload="_IG_AdjustIFrameHeight();">';
	return ' <a class="bookmarknum" target="_blank" href="http://b.hatena.ne.jp/entry/'+link+'">'+num+' users</a>';
}
_IG_RegisterOnloadHandler(init);

特殊なことをしているのは、

}catch(e){
	if(retryNum <= retryMaxNum){
		callbackTab(tabId,day)
	}else{
		_gel(tabId).innerHTML = '<div class="feed">情報の取得に失敗しました。</div>';
		retryNum = 0;
	}
}

の部分。

ガジェットからFeedを取得しに行くと、最初の取得でタイムアウトが発生してるっぽいんですね。一度アクセスすると、Google側のキャッシュが効いて大丈夫みたいなんですが。そういうわけで、最大10回までリトライするようにしています。

でもって、タイトルの「jQueryで」ってことだったんですが、ガジェットの関数とか使ってたらjQueryの使いどころがなくなっちゃいました。使っているのは以下の2箇所ですが、どちらも無理から感がありありですね。

$(_gel(tabId)).html(html);

これは、_gel(tabId).innerHTML = html でOKだし。

var num = parseInt($(desc).text().split('/')[0]) ;

この部分は、今回Pipeで取得しているDiscrition 部分が<a><strong> XXX / XXX users</strong></a>という文字列なので、$関数に渡してjQuery オブジェクトにして、text() と split()を使って、登録ユーザ数を取得しています。

なんかjQueryを使っている感がなくなっちゃったので、jQueryをふんだんに使ったガジェットは、また別途作ってみることにします。

 

できあがったガジェットを観られる、1年、2年前の人気エントリを眺めていると、流行ものあったり、今でもブクマされるような普遍的なものがあったりして楽しいです。是非、iGoogleのお供にどうぞ。

2008年1月12日

Yahoo! Pipes と jQuery で1年前のはてなブックマーク人気エントリを表示するガジェットを作ってみる --- その1

昨年末にYahoo! Pipes で任意のページをスクレイピングできるようになったという記事があり、気になっていました。

ってことで、そのすごさを実感するためにガジェットを作ってみることに。

ガジェットは、「1年前のはてブホッテントリ(人気エントリ)を表示する」という内容。前からちょっと考えていたネタです。

クライアント側では、これまた最近お気に入りのjQueryを使ってみることにします。

手順は、以下の通り。

  1. Yahoo! Pipes で、日付を渡すとその日の人気エントリをRSS返してくれるAPIを作成
  2. そのAPIを利用して、クライアント側で情報を表示

 

Yahoo! Pipes で、日付を渡すとその日の人気エントリをRSS返してくれるAPIを作成

なるべく簡単に、ということで、てっく煮さんで作成されている「Shinya talkをRSS化」というPipeをコピーさせてもらいます。(※海外Yahoo!のIDが必要になるので、Yahoo! Pipes を利用したい方はIDを取得してください。)

リンク先で、「Clone」リンクをクリックすると、yp_hb_gd_0001.png

Shinya talkモジュールが自分のPipesとして登録されます。

 

yp_hb_gd_0002.pngここで「Edit Source」をクリックすると、Pipeの編集画面になります。

yp_hb_gd_0003.png

オリジナルのPipeの流れは、

http://www.fujiwarashinya.com/talk/index.phpをFetchPageモジュールで取得し、<div id="center">以降を、<a id= をdelimiterとして分割」→「item.content をitem.title / item.description にコピーし、item.content を item.linkにリネーム」→「各title / link / description を正規表現でそれぞれにマッチした値に変更」→「Feed から < が含まれたものを削除」

というものです。

僕が作ろうとしているのは、http://b.hatena.ne.jp/hotentry?mode=daily&date=20050210のような動的に変更するパラメータをもったURLにアクセスし、スクレイピングしたいので、ユーザ入力としてdateを受け取り、モジュールの中でURLを組み立てます。

 

yp_hb_gd_0004.png

あとは、ページの内容にしたがって、Regexモジュールの正規表現を書き換えればOKです。

正規表現を適当に書いてしまうと、モジュールの実行速度にも影響がでるので気を付けましょう。実際、僕も最初に作ったPipeは、1回の実行に24secほどかかっていましたが、正規表現を修正することで 3sec 程度まで短くなりました。

↓完成したPipeはこちらです。

Pipes: Past Hatebu API

ちなみに各モジュールでの実行時間は画面下のDebugger の右上に表示されます。実行時間が遅いときは、各モジュールをクリックして、ここの値をチェックし、ボトルネックを見つけます。

 

yp_hb_gd_0005.png

 

そのAPIを利用して、クライアント側で情報を表示

今度は、作成したAPIをJavaScriptから利用してみます。

ガジェットを作る前に、まずは普通のhtmlから呼び出すことにしてみました。

ってことで、jQueryのgetJSON を利用してJSONを取得しようとしたのですが、ここで問題が。

jQueryのgetJSONを利用すると、アクセスするURLに自動的にnew Date().getTime() の値が付加されちゃいます。そうすると、Yahoo! Pipes 側でのキャッシュが効かなくなってしまうんですね。

このAPI でスクレイピングする先のページの情報は、基本的に変わらないものなので、都度アクセスしてしまうと無駄が多いし、レスポンスも悪くなってしまいます。

で、今度は↓こんなコードにしてみました。

s.src = 'http://pipes.yahoo.com/chrisryu/pasthatebu?date='+ds+'&_render=json&_callback=cb'
s.charset = 'UTF-8';
s.type = 'text/javascript';
s.id = 'jsonp';
$(document.body).append(s);

これで大丈夫だろうと思ったら、アクセスしているURLに変化がない(getTime()の値がついたまま)なんですね。なんでだろうと思ったら、$(document.body).append(s)で勝手にjQuery.ajaxが呼ばれていて、結果getJSONと同じ動きになっていました。

意味がなかったので、ソースを以下のように修正。

s.src = 'http://pipes.yahoo.com/chrisryu/pasthatebu?date='+ds+'&_render=json&_callback=cb'
s.charset = 'UTF-8';
s.type = 'text/javascript';
s.id = 'jsonp';
document.body.appendChild(s);

かなりべたな感じですが、しょうがないですね。

ということで、今日はここまで。連休中にはガジェット作るところまでいけると良いな。 

2007年12月21日

× はてブガジェット 2つ追加 --- はてなセリフ & amazon.co.jp

昨日のエントリで「はてなハイク × はてブ iGoogle ガジェット」を公開しましたが、同じノリでガジェットを2つ追加しました。

↓はセリ × はてブのガジェットです。


はてなセリフも、はてなハイク同様の性質を持っているので、はセリ好きな人には良い感じのガジェットなんじゃないかと思います。


もう一つは、↓amazon.co.jp × はてブのガジェットです。

amazon.co.jpのページではてブされたページを見ることができます。

新着のタブが結構おもしろいです。

こっちはアフィリエイトID入ってるので、そういうのちょっとって人はスルーしてください。

2007年12月20日

はてなハイク × はてブ iGoogle ガジェット作った

はてなの新サービス「はてなハイク」が個人的にかなりヒットしていて、「エンジニアがやたら使う言葉 - はてなハイク」とか更新を楽しみにしてたりします。

でも、ログが早くて、なかなかおもしろいところに出会えなかったり。まあ、「Keywords - はてなハイク」のページから見たら良いんですけどね。

で、ふと「おもしろいページははてブされてるんじゃないか」とか思って見てみたら、やっぱりそこそこの人たちがぶくましていて。

じゃあそれを見るガジェットでも作ろうかなと思ったわけです。

↓で、とりあえずこんな感じで作ってみましたよ。

まあ、ちょいちょいいじるんで、ブクマボタンとかできるかもしれませんが、取り急ぎ公開することに。

よろしければ左下の追加ボタンからiGoogle へ追加してやってください。

2007年11月16日

iGoogle ガジェットコンテスト授賞式レポート

iGoogle ガジェットコンテストの授賞式に行って来ました。

受賞者は17:30からリハーサルとのことだったので、職場の人に無理言って早めに退社させてもらいました。

会場は渋谷のGoogle Japan 本社、セルリアンタワーです。


拡大地図を表示

↓ひときわ目立つ豪華なビルで、東急ホテルと一緒になってるんですね。

↓17:30で結構暗い感じ。もう冬ですね。

↓授賞式の会場はこんな感じ。普段は休憩室兼食堂だそうです。

↓軽食がちょっとお洒落な感じで並べてありました。(サランラップかかってますが;)

↓別角度から。なんかお洒落なんだけどアットホームな感じです。

食事の盛りつけとか、よく見たら普通に使うコップを台にしていたり、透明なガラス皿をひっくり返して使っていたりと、新しいモノを使わずに普段あるモノでしゃれた感じで演出してあって驚きました。

↓会場には数台のPCが設置されていて、今回の応募作品すべてが試せる状態になっていました。

↓Google オリジナルブレンドのコーヒー発見。飲んでみたかったなぁ。

式が始まったのは18:30過ぎ。Google Developer Day でも挨拶をされていたマグラスみづ紀さんの挨拶で始まりました。続いて、共同開催のR&Dの方が挨拶。ベーシックの1行プログラミングコンテスト以来の衝撃を受けたとか。

で、各賞の受賞。

一人ずつ壇上に呼ばれ、トロフィーや盾を受け取りました。

↓これはグランプリに輝いたQR Editを作られた方。まだ学生さんだそうです。恐れ入ります。

しばらくの歓談の後、グランプリ、準グランプリ、特別賞、インプレス賞の6名がそれぞれ自分のアプリを紹介して、Googleの人からコメントをもらうコーナーに。

僕は、ガジェットを作ったきっかけを、Google Developer Day でiGoogle を説明していたソフィアさんがかわいかったから、と説明したら、インプレス賞を取ったToshi Hayashi さんが後のコメントで同意してくれてました。

グランプリ、準グランプリ、もう一つの特別賞作品が結構まじめ系の使えるアプリだったのに対し、僕のはちょっと脱力系のアプリだったのですが、Google の方もその点は外さず認識していただいていたみたいで良かったです。あと、U.T.では「愛」とか特別な言葉で検索すると、特殊な文言を返すような仕様にしていたんですが、そこに気づいてくれていたのも嬉しかったですね。ちゃんと使ってくれたんだなぁ。

歓談の席では、他の受賞者の方とお話ができてかなり刺激になりました。次のガジェットのアイデアも固まったし、いつ作ろうかなとか思っています。


で、賞品なんですが、僕の特別賞はYouTube グッズ。

ニット帽に、腹巻き、トートバッグにUSBメモリでした。

インプレス賞のiPod touch はちょっとうらやましかったけど、YouTubeグッズもレアものだから嬉しかったです。


↓腹巻きを早速息子に着せてみました。結構ご満悦です。

↓グッズ全体はこんな感じ。

↓USBメモリが、メタルな感じで意外とカッコイイです。

↓こんな風になります。


授賞式の模様はYouTubeとかにアップされるみたいなので、興味のある方はそちらも見てみてください。

2007年11月 7日

iGoogle ガジェットコンテストで入賞しました!

iGoogle ガジェットコンテストで入賞しました!

iGoogleガジェットコンテスト|受賞作品決定! 審査結果の発表

受賞したのは、mash up award 3rd (MA3)にも出品していた「U.T. (Unique Translator) --- 英和・和英辞書サイト」です。

発表が10月下旬となっていたのに、なかなか発表がなかったので、やきもきしていました(毎日サイトをチェックしてましたよ・・・)。

特別賞には、MA3 で受賞していたstart command さんの名前が。この開発者の方には、マッシュアップ・カフェでお会いしたことがあって、熱くstart commandのサービスを語る姿が印象深かったです。おめでとうございます!

授賞式&パーティーが来週あるらしいので、これも楽しみ。

レポート書きたいと思います。

==2007.11.8 6:20 追記==
他にも入賞された方がブログに書かれていたのでリンクをはっておきます。
マッシュな日々 ≫ Blog Archive ≫ iGoogleガジェットコンテスト入賞!
2007-11-08 - 雑記・オブ・チョイチョイ

2007年10月 6日

MashupChallenge

MashupChallenge - quarterly mashup contest

MashupChallenge というMashup のコンテストが開催されています。

期間は、2007/10/1から年末までの3ヶ月間。

商品はWii とか iPod touch が用意されているようですが、一番の商品は「栄誉」だそうです。

おもしろいのはそのコンテストの仕組み。

参加登録をすると、コンテスト対象のAPIからランダムで5つのAPIが指定されるので、その中から少なくとも2つのAPIを利用してmashup サービスを作るのです。

僕も早速参加登録をしてみました。

指定されたのは、Twitter、YouTube、del.icio.us、JotSpot、BBCの5つ。

Twitter 、YouTube 、del.icio.us と3つもメジャーなサービスが入っているのが、ラッキーなのかどうか。

しばらくネタを考えることにします。

アーカイブ