2007年05月30日

[コンテンツマッチ広告]Google Adsense と Overture の実力比較は Overture の勝利! このエントリーをはてなブックマークに追加

こんにちは、三沢光晴です(嘘です)。

※アホネタっす。真剣に読まないでね。

コンテンツマッチ広告といえば Google AdsenseOverture (オーバーチュア) が二大巨頭って感じである。

Google Adsense はりょーちも利用しており、個人でも気軽に利用できるところがよさげなんだが Overture はちょっと個人には敷居が高すぎる感がある。
Overture を採用しているサイトで最も有名なサイトは Yahoo! JAPAN だと思われる。
普段Webサイトを見ているときは、あまりコンテンツマッチ広告を注意深く見ていないので「このコンテンツに果たしてこの広告はマッチしているのか」などという視点で見ることは少ない。

しかし、先日ふと見た Overture の広告は「この広告自体がコンテンツなのでは?」と思うほど、記事にマッチした広告が掲載されていた。
キャプチャーしてみたので、どの程度マッチしているのか確認していただきたいっす。
overture.png

Yahoo!ニュース - 日刊スポーツ - マチャミ48歳!2歳サバ読みヨロチクビ〜の記事に年齢詐称の夏川純のレイクの広告が・・・

コンテンツマッチ広告もここまでマッチしてきたかー。Overture、凄いっす!(深読み?)

すまん。
posted by りょーち | Comment(0) | TrackBack(0) | 気になるサイト

2007年05月29日

JSONを使ってYouTubeを光速検索する「Youtube光検索」を作ってみた このエントリーをはてなブックマークに追加

こんにちは、糸居五郎です(嘘です)。

久々に YouTube ネタ。

最近JSONにプチはまり中である(遅い?)。
以前、Youtube APIを利用して YouTube TAG Search っていうのを作ってみたが、最近覚えた JSON とやらを利用すればもうちょい速くなるのではなかろうかと思い、JSONを使って作ってみたら、やっぱ、JSON使ったほーが速かった・・・orz
で、こんなものを作った。



余計な機能を排除してみたので(当たり前かもしれんが)本家 YouTube よりもかなり検索が速いよーな気がする。(自画自賛っぽい発言なのでダメ?)
JSON を使うと Javascript の XMLHttpRequest を使った通信(よく知らんが AJAX って言うんだっけ?)のメリットとしてよく挙げられている、画面全体をリプレースするのではなく、ホントに表示を変更したいとこだけを innerHTML で置き換えちゃうことができるよーに作れて便利だな。

YouTube API から送られてくるXMLデータをJSON形式に加工し、表示するだけの簡単なものなのだが、JSONデータを解析する部分をどーやって書けばよいかがよくわかんなかったところに 昨日のエントリー にも記載した JSONER で解析しながら、JSON形式のデータを加工してみた。
また YouTube APIのパラメータはUTF-8でエンコードしたものを渡す必要があるのだが Javascript でこれを実装するのに Escape Codec Library: ecl.js を利用している。

うーむ、なかなか便利じゃないですか?
JSON素晴らしいっす!
posted by りょーち | Comment(4) | TrackBack(0) | Web周辺技術

2007年05月28日

JSON形式のデータを簡単に扱えるJSONERが激しく便利 このエントリーをはてなブックマークに追加

こんにちは、那須与一宗隆です(嘘です)。

Javascript で JSONを扱うとき、データが複雑になると、アクセスしたい値を取得する際にどういう感じでスクリプトを書いたらよいか、わけがわからなくなることがある(というか多い)。
そんなとき、取得したJSONの構造がどーなっているのかを知るのに便利なツールが公開されていたっす。

使い方は上記のサイトに行ってみればわかるっす。
JSON形式のデータを参照する際には、
  • jTools.lookupAll();
というメソッドを利用。
JSON形式のデータのノードを操作するときは、
  • jTools.getChildren();
  • jTools.getFirstChildren();
  • jTools.getAttributes();
  • jTools.addChildren();
  • jTools.removeChildren();
  • jTools.removeChildr();
JSON形式のデータをXMLに変換(戻す?)ときには
  • jTools.jsonToXML();
などが使えるよーである。

上記サイトのデモを見てもらうとその便利さに驚くことであろう。
JSON使いの人は一度は見ておくことをオススメするっす。

特に便利なのが、
jTools.jsonToPathValue();
である。
これ、かなり最強っす。



#はてなブックマークにもあまり登録されていなかったので有名じゃないのかな?
posted by りょーち | Comment(0) | TrackBack(0) | Web周辺技術

2007年05月24日

JSON(P)があまりに便利なので「リンク取得 API for JSONP」を作った このエントリーをはてなブックマークに追加

こんにちは、羽仁進です(全くの嘘です)。

ここのところ、JSON(P)があまりに便利なのでいろいろつくれそーな気分になり、またもや何に使うのかわからないが、テキトーなものを作ってみた。

どーいうものかというと、指定したURLの<a>タグで指定されたリンク一覧をJSON(P)形式で取得するものである。

以下、使い方の説明っす。
パラメータ説明:
end point URL:
http://www.usamimi.info/~ryouchi/url/
パラメータ:callback:
コールバック関数名を指定
パラメータ:url:
一覧を取得したいURLを指定
パラメータ:encode:
文字コードを指定(指定しなければUTF-8になる)指定できる文字コードは、UTF-8,SJIS,EUC-JP

使い方:
callback関数:getUrlList()
encode:UTF-8
URL:http://ryouchi.seesaa.net/
の場合、
http://www.usamimi.info/~ryouchi/url/?callback=getUrlList&encode=UTF-8&url=http%3A%2F%2Fryouchi.seesaa.net%2F
などと指定する。

取得したデータは"url"と"text"のペアとなる。

詳しくは上記のデモを見るとわかると思うっす。
JSONなかなか面白いっす (^^;

ただ、利用用途って考えると、リンクを取得するだけなので、あまり有意義なものではないかも・・・orz
posted by りょーち | Comment(0) | TrackBack(0) | Web周辺技術

2007年05月23日

横山秀夫:「影踏み」 このエントリーをはてなブックマークに追加

影踏み
影踏み
posted with amazlet on 07.05.23
横山 秀夫
祥伝社 (2007/02)
売り上げランキング: 2224
ASIN No:4396333293

りょーち的おすすめ度:お薦め度

こんにちは、ダンプ松本です(嘘です)。

ってことで、横山秀夫の「影踏み」を読んでみた。

本書では更に今までの横山秀夫の小説にはあまり見受けられない視点で書かれている。彼の書く殆どの主人公は警察内部の人間だった。しかし、本書「影踏み」では「泥棒」という警察組織とは対極的にある人物を主人公に置いている。
この二つの相違点はあるものの、作中に横山秀夫らしい雰囲気は感じ取ることができた。
本書は「消息」「刻印」「抱擁」「業火」「使徒」「遺言」「行方」という七つの短編からなる。この短編に一貫して登場する人物は主人公の真壁修一、修一の中に住む弟の啓二、そして修一の内縁の妻である安西久子である。

各人の設定はこんな感じ。
真壁修一は「ノビ師」だった。「ノビ師」とは居住者が深夜に寝静まった頃、家に忍び込み現金を盗み出す手口の泥棒の俗称である。天窓やドマーニから侵入する「天蓋引き」。宵闇に紛れて空き巣を働く「宵空き」など盗みの手口により夫々隠語があるらしい。修一は「ノビ師」としては世間で知られた存在だった。
修一には啓二という双子の弟がいた。過去形になっているのは今はこの世にいないからである。啓二は実の母親に殺され、母と共にその肉体は焼け死んでいた。しかし、その魂は何故か修一に住み着き、修一の中に啓二がいるという不思議なことになっていた。

このあたりに今まで愚直なまでに警察内部の小説を書いてきた横山秀夫が本書で見せる新しい試みである。

「消息」では窃盗容疑で捕まった修一が二年の刑期を終え出所したところから始まる。先に述べたように修一の中には弟の啓二が存在している。修一の中の啓二は、一度見たものは決して忘れないという瞬間記憶能力を持っていた(って昔木村拓也の出演するドラマでそういうのあったね)。
出所後すぐに手をつけたのは自分が捕まったときに侵入していた家の調査である。修一はその家で感じた違和感の正体が何なのかを調べるため自分の「ノビ師」の能力と啓二の「瞬間記憶能力」の二つの能力を駆使し独自調査をし始めた。
一方、久子は修一が刑期を終えるまでじっと修一を待っていた。
久子は修一と内縁関係にあったが、その昔は久子を巡り修一と啓二で争っていた。双子ゆえに殆ど同じ容貌を持つ修一と啓二。啓二が死んでからも自分の中に啓二を感じ続けている修一は素直に久子と結ばれる気にはなれなかった。自分の心の中の葛藤さえも啓二に筒抜けであるのだ。
修一が感じた違和感の正体は一体なんだったのか?

七つの短編は程よいボリュームで区切られており、読みやすい。
しかし、りょーちとしてはどうも今ひとつ「ミステリー小説」として読むことが困難だった。やはりその原因は修一の中にいる啓二の存在にある。やはり純粋なミステリーって感じではないのでそのあたりちょっと拍子抜けした感がある。
また、法曹界を目指していた修一が啓二の死後、突如「ノビ師」になったその心情もいまひとつ納得できない。双子の繋がりってそんなに深いものなのか?

どうも今ひとつりょーちとして不完全燃焼って感じの一冊であった。

なお、今まで読んだ横山秀夫の感想をざっと見てみるとこんな感じであった。で、本書「影踏み」は3.0。
りょーちの横山秀夫満足率は
( 4.5 + 3.0 + 4.5 + 4.5 + 4.5 + 3.0 ) / 6 = 4.0
って感じか。

うーむ。初期の頃に読んだ「クライマーズ・ハイ」が結構良かったのでそれに引きずられていたのかもしれないということにあらためて気づかされた。
こうやって読書記録を作っておくことによって、自分が好きな作家の傾向が客観的に(いや、評価は主観的なので完全に客観的とはいえないのだが)理解できるよーな気がする。実際、りょーちの中での横山秀夫の作家としての評価は「与えられた題材を無難に形にする作家」という印象でしかない。まあ、これができるってことだけでも結構すごいとは思うのですが、なんとなくもうあまり読まなくてもよい作家に仲間入りしてしまったかも。
横山秀夫が作家としてダメとか言っているのではなく、自分の読みたい本と横山秀夫が作り出す物語とが合わなくなっているということである。まあ、そういうこともあるだろう。それが分かっただけでもまあ、本書を読んでみてよかったっす。

■他の方々のご意見(結構意見が分かれている?)

posted by りょーち | Comment(0) | TrackBack(0) | 読書感想文

2007年05月22日

BOOKLOG アイテム取得 API for JSONP このエントリーをはてなブックマークに追加

こんにちは、町亞聖です(嘘です)。

前回作成した BOOKLOG ASIN No 取得 for JSONP では、ブクログのユーザを指定して、そのASIN Noを取得するだけであった。「普通、アイテム名とか取得するだろ?」と思いつつも、何故そうしなかったかといえば、よくわかんなかったのである・・・orz
で、いろいろ試行錯誤すると(無理矢理)アイテム名を取得する方法が分かったので早速実装するのである。

下記を利用すれば、特定のブクログユーザの本棚にあるアイテムのASIN Noとアイテム名をJSON(P)形式で取得できるっす。更に、文字コードも指定できるよーなAPIを作ってみたっす。

で、以下、その説明。
BOOKLOG アイテム取得 API for JSONP
end point URL:
http://www.usamimi.info/~ryouchi/booklog/titlelink.php
パラメータ:callback:
コールバック関数名を指定
パラメータ:user:
一覧を取得したいユーザ名を指定
パラメータ:encode:
文字コードを指定する。指定できる文字コードは、UTF-8,SJIS,EUC-JPの3つ。(指定しなければUTF-8になる)


使い方:
・コールバック関数:viewasinno()
・encode:SJIS
・user:ryouchi
の場合、
http://www.usamimi.info/~ryouchi/booklog/titlelink.php?callback=viewasinno&encode=SJIS&user=ryouchi

などと指定する。


取得データ(サンプル)
viewasinno([{"asin":"4883924998" , "title":"\u795e\u69d8\u65e5\u8a18\u2015\u50d5\u306e\u7cbe\u795e\u75c5\u9662\u9a12\u52d5\u8a18"} ,
{"asin":"4916199626" , "title":"\u672c\u683c\u63a8\u7406\u59d4\u54e1\u4f1a"} ,
{"asin":"4812420881" , "title":"\u30c8\u30a5\u30eb\u30fc\u30fb\u30b3\u30fc\u30ea\u30f3\u30b0\u3008VOL.1\u3009"} ,
{"asin":"4104738026" , "title":"\u306f\u3044\u3001\u6cf3\u3052\u307e\u305b\u3093"} ,
{"asin":"4061823175" , "title":"\u88ab\u5bb3\u8005\u306f\u8ab0?"} ,
{"asin":"434400759X" , "title":"\u534a\u5cf6\u3092\u51fa\u3088 (\u4e0a)"} ,
{"asin":"4344007603" , "title":"\u534a\u5cf6\u3092\u51fa\u3088 (\u4e0b)"} ,
{"asin":"4763005014" , "title":"\u30b9\u30ce\u30fc\u30c9\u30fc\u30e0"} ,
{"asin":"408747402X" , "title":"\u5149\u3068\u5f71\u306e\u8a98\u60d1"} ,
{"asin":"4198506612" , "title":"\u6e9d\u9f20"} ,
{"asin":"4101448248" , "title":"\u672c\u306e\u96d1\u8a8c\u8840\u98a8\u9332"} ,
{"asin":"4894569116" , "title":"\u30a8\u30ea\u30fb\u30a8\u30ea"} ,
{"asin":"4101270228" , "title":"\u5947\u8de1\u306e\u4eba"} ,
{"asin":"4198922330" , "title":"\u9854"} ,
{"asin":"4167659018" , "title":"\u9670\u306e\u5b63\u7bc0"} ,
{"asin":"4062734567" , "title":"\u9b3c\u6d41\u6bba\u751f\u796d"} ,
{"asin":"4061821466" , "title":"\u30e9\u30b0\u30ca\u30ed\u30af\u6d1e\u2015\u300c\u3042\u304b\u305a\u306e\u6249\u300d\u7814\u7a76\u4f1a \u5f71\u90ce\u6cbc\u3078"} ,
{"asin":"4061821105" , "title":"\u30ab\u30ec\u30a4\u30c9\u30b9\u30b3\u30fc\u30d7\u5cf6\u2015\u300a\u3042\u304b\u305a\u306e\u6249\u300b\u7814\u7a76\u4f1a\u7af9\u53d6\u5cf6\u3078"} ,
{"asin":"4062734931" , "title":"\u4ea1\u56fd\u306e\u30a4\u30fc\u30b8\u30b9 \u4e0a \u8b1b\u8ac7\u793e\u6587\u5eab \u3075 59-2"} ,
{"asin":"406273494X" , "title":"\u4ea1\u56fd\u306e\u30a4\u30fc\u30b8\u30b9 \u4e0b \u8b1b\u8ac7\u793e\u6587\u5eab \u3075 59-3"} ,
{"asin":"4396631340" , "title":"\u30c7\u30a3\u30fc\u30eb\u30fb\u30e1\u30a4\u30ab\u30fc"} ,
{"asin":"4163220909" , "title":"\u30af\u30e9\u30a4\u30de\u30fc\u30ba\u30fb\u30cf\u30a4"} ,
{"asin":"4044295042" , "title":"Add\u2015\u6a5f\u68b0\u4ed5\u639b\u3051\u306e\u30db\u30e0\u30f3\u30af\u30eb\u30b9"} ,
{"asin":"4062649020" , "title":"\u30a6\u30e9\u30f3\u30d0\u30fc\u30ca\u306e\u68ee"} ,
{"asin":"4344403460" , "title":"\u865a\u8c8c\u3008\u4e0b\u3009"} ,
{"asin":"4344403452" , "title":"\u865a\u8c8c\u3008\u4e0a\u3009"} ,
{"asin":"416320900X" , "title":"\u30a4\u30f3\u30fb\u30b6\u30fb\u30d7\u30fc\u30eb"} ,
{"asin":"4043463022" , "title":"\u30d7\u30eb\u30c8\u30cb\u30a6\u30e0\u3068\u534a\u6708"} ,
{"asin":"4043541015" , "title":"\u5929\u4f7f\u306e\u5c4d"} ,
{"asin":"4104722014" , "title":"\u30e9\u30b9\u30fb\u30de\u30f3\u30c1\u30e3\u30b9\u901a\u4fe1"} ,
{"asin":"4575234990" , "title":"\u72af\u4eba\u306b\u544a\u3050"} ,
{"asin":"4396207557" , "title":"\u967d\u6c17\u306a\u30ae\u30e3\u30f3\u30b0\u304c\u5730\u7403\u3092\u56de\u3059"} ,
{"asin":"4163228705" , "title":"\u7a7a\u4e2d\u30d6\u30e9\u30f3\u30b3"} ,
{"asin":"4101448175" , "title":"\u3055\u3089\u3070\u56fd\u5206\u5bfa\u66f8\u5e97\u306e\u30aa\u30d0\u30d0"} ,
{"asin":"4061820834" , "title":"\u30c9\u30c3\u30da\u30eb\u30b2\u30f3\u30ac\u30fc\u5bae\u2015\u3042\u304b\u305a\u306e\u300e\u6249\u300f\u7814\u7a76\u4f1a\u6d41\u6c37\u9928\u3078"} ,
{"asin":"4344402685" , "title":"\u7121\u9593\u5730\u7344 \u4e0b \u5e7b\u51ac\u820e\u6587\u5eab \u3057 13-2"} ,
{"asin":"4344402677" , "title":"\u7121\u9593\u5730\u7344 \u4e0a \u5e7b\u51ac\u820e\u6587\u5eab \u3057 13-1"} ,
{"asin":"4797495588" , "title":"\u3061\u30fc\u3061\u3083\u3093\u306f\u60a0\u4e45\u306e\u5411\u3053\u3046"} ,
{"asin":"4344405455" , "title":"\u4f5c\u5bb6\u5c0f\u8aac"} ,
{"asin":"4488449018" , "title":"\u6a21\u5023\u306e\u6bba\u610f"} ,
{"asin":"4048734504" , "title":"\u5fd8\u308c\u96ea"} ,
{"asin":"408747349X" , "title":"R.P.G."} ,
{"asin":"434440551X" , "title":"\u706b\u306e\u7c89"} ,
{"asin":"4758430594" , "title":"\u9b54\u795e(\u307e\u304c\u307f)"} ,
{"asin":"4167642034" , "title":"\u30b2\u30eb\u30de\u30cb\u30a6\u30e0\u306e\u591c\u2015\u738b\u56fd\u8a18\u30081\u3009"} ,
{"asin":"4035401900" , "title":"\u6e80\u6708\u306e\u591c \u53e4\u6c60\u3067"} ,
{"asin":"4087472175" , "title":"\u5d29\u308c\u308b\u2015\u7d50\u5a5a\u306b\u307e\u3064\u308f\u308b\u516b\u3064\u306e\u98a8\u666f"} ,
{"asin":"434440324X" , "title":"\u8ee2\u751f"} ,
{"asin":"4894563878" , "title":"\u30a8\u30b9\u30d1\u30a4"} ,
{"asin":"4062648121" , "title":"\u4fee\u7f85\u306e\u7d42\u308f\u308a"} ,
{"asin":"4396326378" , "title":"\u7b11\u3046\u5c71\u5d0e"} ,
{"asin":"4488414028" , "title":"\u5b64\u5cf6\u30d1\u30ba\u30eb"} ,
{"asin":"4051029069" , "title":"\u661f\u304b\u3089\u304d\u305f\u5c11\u5973"} ,
{"asin":"4796643796" , "title":"\u5225\u518a\u5b9d\u5cf6\u300c\u8cab\u4e95\u5fb3\u90ce \u75c7\u5019\u7fa4\u300d"} ,
{"asin":"4101058210" , "title":"\u30ad\u30c3\u30c9\u30ca\u30c3\u30d7\u30fb\u30c4\u30a2\u30fc"} ,
{"asin":"4043461011" , "title":"\u4e8c\u91cd\u87ba\u65cb\u306e\u60aa\u9b54 (\u4e0a)"} ,
{"asin":"404346102X" , "title":"\u4e8c\u91cd\u87ba\u65cb\u306e\u60aa\u9b54 (\u4e0b)"} ,
{"asin":"4104616028" , "title":"GMO(\u4e0b)"} ,
{"asin":"410461601X" , "title":"GMO(\u4e0a)"} ,
{"asin":"4758410216" , "title":"\u706b\u661f\u30c0\u30fc\u30af\u30fb\u30d0\u30e9\u30fc\u30c9"} ,
{"asin":"448841401X" , "title":"\u6708\u5149\u30b2\u30fc\u30e0"} ,
{"asin":"4575711950" , "title":"8\u6642\u3060\u30e7!\u5168\u54e1\u96c6\u5408\u4f1d\u8aac"} ,
{"asin":"4062738279" , "title":"\u5ddd\u306e\u6df1\u3055\u306f"} ,
{"asin":"4334923755" , "title":"\u30b2\u30fc\u30e0\u306e\u540d\u306f\u8a98\u62d0"} ,
{"asin":"4059000345" , "title":"\u90aa\u8996\u2015\u6771\u4eac\u30b4\u30fc\u30b9\u30c8\u30b9\u30c8\u30fc\u30ea\u30fc"} ,
{"asin":"4062739682" , "title":"\u90aa\u9b54\u3008\u4e0b\u3009"} ,
{"asin":"4062739674" , "title":"\u90aa\u9b54\u3008\u4e0a\u3009"} ,
{"asin":"4062736691" , "title":"\u5618\u3092\u3082\u3046\u3072\u3068\u3064\u3060\u3051"} ,
{"asin":"4344004809" , "title":"\u9280\u884c\u7c60\u57ce"} ,
{"asin":"4796638113" , "title":"\u30d1\u30fc\u30d5\u30a7\u30af\u30c8\u30fb\u30d7\u30e9\u30f3"} ,
{"asin":"4062680130" , "title":"\u5931\u308f\u308c\u305f\u4e16\u754c \u75db\u5feb\u4e16\u754c\u306e\u5192\u967a\u6587\u5b66 (13)"} ,
{"asin":"416768201X" , "title":"\u795e\u306e\u3075\u305f\u3064\u306e\u8c8c"} ,
{"asin":"434440307X" , "title":"\u7761\u9b54"} ,
{"asin":"4062680157" , "title":"\u30e2\u30f3\u30c6\u30fb\u30af\u30ea\u30b9\u30c8\u4f2f \u75db\u5feb\u4e16\u754c\u306e\u5192\u967a\u6587\u5b66 (15)"} ,
{"asin":"4198915938" , "title":"\u7d2b\u82d1"} ,
{"asin":"4041304024" , "title":"\u60aa\u9b54\u306e\u624b\u6bec\u5504"} ,
{"asin":"4061817906" , "title":"\u5730\u7344\u306e\u5947\u8853\u5e2b"} ,
{"asin":"4041898048" , "title":"\u30d6\u30eb\u30fc\u30b9"} ,
{"asin":"4198613192" , "title":"\u30ab\u30ea\u30b9\u30de (\u4e0a)"} ,
{"asin":"4198613206" , "title":"\u30ab\u30ea\u30b9\u30de (\u4e0b)"} ,
{"asin":"4488416012" , "title":"\u751f\u3051\u308b\u5c4d\u306e\u6b7b"} ,
{"asin":"410443101X" , "title":"\u305d\u3057\u3066\u7c9b\u6e05\u306e\u6249\u3092"} ,
{"asin":"4763004204" , "title":"\u30c1\u30e7\u30b3\u30ec\u30fc\u30c8\u30fb\u30a2\u30f3\u30c0\u30fc\u30b0\u30e9\u30a6\u30f3\u30c9"} ,
{"asin":"4041789796" , "title":"\u59c9\u59b9\u2015Two Sisters"} ,
{"asin":"4106027674" , "title":"\u30aa\u30fc\u30c7\u30e5\u30dc\u30f3\u306e\u7948\u308a"} ,
{"asin":"4062092980" , "title":"\u6700\u60aa"} ,
{"asin":"4488425011" , "title":"\u615f\u54ed"}]);

このAPIを利用して簡単なデモを作ってみた。



BOOKLOG ユーザ名を入力しボタンを押すと、テキストボックスの中身を取得し、「BOOKLOG ASIN No 取得 for JSONP」に渡すパラメータを作成する。

下記のよーに使うとよいかも。(っていうか、この使い方しかできない?)

// アソシエイトIDを設定
var aid = "ryouchih-22";
function getasinno(){
  // divタグ内をクリア開始
  // prototype.jsを利用しています
  $(list).innerHTML ="";
  $(ruri).innerHTML ="";
  $(buri).innerHTML ="";
  // divタグ内をクリア終了
  // id=userの値を取得
  $user = document.getElementById('user').value;
  // jsonp取得用のURL作成
  // 下記のような形式で送る
  requesturl = "http://www.usamimi.info/~ryouchi/booklog/titlelink.php";
  requesturl += "?callback=viewasinno&encode=SJIS&user="+escape($user);
  // 取得したjsonpデータは外部スクリプトを埋め込むのと同様に利用可能
  // scriptタグ作成
  var script = document.createElement('script');
  script.src = requesturl;
  script.type = 'text/javascript';
  // scriptタグ append
  document.body.appendChild(script);
  // BOOKLOGユーザの本棚へのリンクを作成
  $(buri).innerHTML = '<a href = "http://booklog.jp/users/' + $user + '" target = "_blank">' + $user + 'さんの本棚</a>';
  // データの内容を見てみるためのリンクを作成
  $(ruri).innerHTML = '<a href = "' + requesturl + '" target="_blank">' + requesturl + '</a>';
}
function viewasinno(obj) {
  // objにはjsonpのデータが格納されている。
  // アイテム表示用HTMLの変数(resultData)を初期化
  var resultData="";
  // objのアイテムの数だけ繰り返す
  for(var i=0; i<obj.length; i++){
    // i番目の ASIN code は obj[i].asin で取得
    var iCode = obj[i].asin;
    // i番目のアイテム名(title) は obj[i].title で取得
    var title = obj[i].title;
    // ASIN code とアイテム名からamazonへのリンクを作成
    resultData += "<a href = 'http://www.amazon.co.jp/exec/obidos/ASIN/" + iCode + "/" + aid + "/ref=nosim/' target = '_blank'>" + title + "</a><br />";
  }
  // resultData を id=list の divタグ内に表示
  $(list).innerHTML = resultData;
}



例えばこんな風なこともできるであろう。

このAPIを使えばブクログの登録データを Javascript を使ってこのように加工できるのでちょいと便利と思われるっす。
このAPIはどーやって動いているかというと、特定のサイトをスクレイピングという手法を使ってパラメータを抜き出しているのである。
スクレイピングとは、Web APIを作成するひとつの手法で、ある決まったフォーマットに基づいて作成されたWebサイトはその構造も(殆ど)同じ構造であることに着目し、HTMLを正規表現などで解析し、必要部分(今回の場合はASINナンバーとアイテム名)を抜き出し、サーバ側で加工し、利用しやすい形式(今回の場合はJSONP形式)で再提供する手法のことをいうらしい。
今回解析対象としたサイトは りょーちの本棚 : Booklog(リストビュー) をスクレイピングしているっす。
上記サイトのHTMLを見ると、下記のよーな文がある。
<a href="/asin/4104738026/via=ryouchi" class="list_books_title" title="はい、泳げません">

先ずHTMLファイルを取得し、 <a> タグの href 属性の中で、/asin/の文字があるところだけを抜き出して見る。これを利用して、ASINコードを取得する。
次に title 属性を抜き出してタイトルを取得する。
ASIN と title を配列に入れ、PEAR :: PEPr :: Details :: Services_JSON でJSON(p)形式に加工するのである。
Services_JSONについての日本語の解説は下記を参考にしたっす。
また、APIの解析にはphpのtidy関数を利用しているっす。
で、どーでもよいが、tidy関数の文字コードのエンコードの指定と mb_convert_encoding() の文字コードの指定のパラメータが異なるのに気づくのにちょいと時間が掛かってハマったっす。(何故同じにしないのか・・・)

なお、無理矢理作った感があるが、ブクログのトップページには、「New Booklog Coming Soon..」の文字が・・・
うーむ。スクレイピング処理をしているので、HTMLの構造が変わると動かなくなるっす・・・(ダメばい)。

つーか、こんなの作らなくでも イエイリ先生 が、きっときちんとしたAPIを提供してくれるに違いないっす(謎)。

なお、JSONP だと JavaScript の XMLhttpRequest() 関数を利用しなくても、
<script type="text/javascript" src"=http://・・・・"></script>
のよーに読み込むような感じでオブジェクトとして直ぐに使えるってのが便利かも。
クロスドメインによりアクセスが制限されている場合などはこんな感じでやればよかろう。今後APIの提供もJSONP形式で提供されることが多くなるよーな予感がするっす。
(といっても、実際はJSONもJSONPもまだ今ひとつよくわかってないっす・・・orz)
(って、このフレーズはまたもや前回の記事のコピペでした)
posted by りょーち | Comment(2) | TrackBack(0) | Web周辺技術

2007年05月21日

BOOKLOG ASIN No 取得 for JSONP このエントリーをはてなブックマークに追加

こんにちは、村地弘美です(嘘です)。

前回作成した タイトル取得API for JSONP と同じよーな感じでもう一個作ってみた。

ブクログ -WEB本棚サービス- というマイ本棚サービスでユーザが登録している本のASIN NoをJSON(p)形式で取得するよーなものである。

で、以下、その説明。
end point URL:
http://www.usamimi.info/~ryouchi/booklog/index.php
パラメータ:callback:
コールバック関数名を指定
パラメータ:user:
ASIN Noを取得したいブクログのユーザ名

使い方:
callback関数:viewasinno()
user:ryouchi
の場合、
http://www.usamimi.info/~ryouchi/booklog/?callback=viewasinno&user=ryouchi

などと指定する。

取得データはこんな感じになる。
viewasinno([{'asin':'4883924998'} , {'asin':'4916199626'} , {'asin':'4812420881'} , {'asin':'4104738026'} , {'asin':'4061823175'} , {'asin':'434400759X'} , {'asin':'4344007603'} , {'asin':'4763005014'} , {'asin':'408747402X'} , {'asin':'4198506612'} , {'asin':'4101448248'} , {'asin':'4894569116'} , {'asin':'4101270228'} , {'asin':'4198922330'} , {'asin':'4167659018'} , {'asin':'4062734567'} , {'asin':'4061821466'} , {'asin':'4061821105'} , {'asin':'4062734931'} , {'asin':'406273494X'} , {'asin':'4396631340'} , {'asin':'4163220909'} , {'asin':'4044295042'} , {'asin':'4062649020'} , {'asin':'4344403460'} , {'asin':'4344403452'} , {'asin':'416320900X'} , {'asin':'4043463022'} , {'asin':'4043541015'} , {'asin':'4104722014'} , {'asin':'4575234990'} , {'asin':'4396207557'} , {'asin':'4163228705'} , {'asin':'4101448175'} , {'asin':'4061820834'} , {'asin':'4344402685'} , {'asin':'4344402677'} , {'asin':'4797495588'} , {'asin':'4344405455'} , {'asin':'4488449018'} , {'asin':'4048734504'} , {'asin':'408747349X'} , {'asin':'434440551X'} , {'asin':'4758430594'} , {'asin':'4167642034'} , {'asin':'4035401900'} , {'asin':'4087472175'} , {'asin':'434440324X'} , {'asin':'4894563878'} , {'asin':'4062648121'} , {'asin':'4396326378'} , {'asin':'4488414028'} , {'asin':'4051029069'} , {'asin':'4796643796'} , {'asin':'4101058210'} , {'asin':'4043461011'} , {'asin':'404346102X'} , {'asin':'4104616028'} , {'asin':'410461601X'} , {'asin':'4758410216'} , {'asin':'448841401X'} , {'asin':'4575711950'} , {'asin':'4062738279'} , {'asin':'4334923755'} , {'asin':'4059000345'} , {'asin':'4062739682'} , {'asin':'4062739674'} , {'asin':'4062736691'} , {'asin':'4344004809'} , {'asin':'4796638113'} , {'asin':'4062680130'} , {'asin':'416768201X'} , {'asin':'434440307X'} , {'asin':'4062680157'} , {'asin':'4198915938'} , {'asin':'4041304024'} , {'asin':'4061817906'} , {'asin':'4041898048'} , {'asin':'4198613192'} , {'asin':'4198613206'} , {'asin':'4488416012'} , {'asin':'410443101X'} , {'asin':'4763004204'} , {'asin':'4041789796'} , {'asin':'4106027674'} , {'asin':'4062092980'} , {'asin':'4488425011'}]);

このAPIを利用して簡単なデモを作ってみた。



BOOKLOG ユーザ名を入力しボタンを押すと、テキストボックスの中身を取得し、「BOOKLOG ASIN No 取得 for JSONP」に渡すパラメータを作成する。

下記のよーな感じになるっす。

var aid = "ryouchih-22";
function getasinno(){
 // divタグ内をクリア開始
 $(list).innerHTML ="";
 $(ruri).innerHTML ="";
 $(buri).innerHTML ="";
 $user = document.getElementById('user').value;
 // divタグ内をクリア終了
 // jsonp取得用のURL作成
 // 下記のような形式で送る
 // http://www.usamimi.info/~ryouchi/booklog/index.php?callback= (コールバック関数名) &url=(タイトルを取得したいURL)
 requesturl = "http://www.usamimi.info/~ryouchi/booklog/index.php";
 requesturl += "?callback=viewasinno&user="+escape($user);
 // 取得したjsonpデータは外部スクリプトを埋め込むのと同様に利用可能
 var script = document.createElement('script');
 script.src = requesturl;
 script.type = 'text/javascript';
 document.body.appendChild(script);
 // データの内容を見てみるためのリンクを作成してみる
 $(buri).innerHTML = '<a href="http://booklog.jp/users/'+$user+'" target="_blank">' + $user + 'さんの本棚</a>';
 $(ruri).innerHTML = '<a href="'+requesturl+'" target="_blank">' + requesturl + '</a>';
}
function viewasinno(obj) {
 var resultData="";
 for(var i=0; i<obj.length; i++){
  // asin code
  var iCode = obj[i].asin;
  resultData += "<a href='http://www.amazon.co.jp/exec/obidos/ASIN/" + iCode + "/" + aid + "/ref=nosim/'target='_blank'>" + iCode + "</a><br />";
 }
 $(list).innerHTML = resultData;
}



BOOKLOG の HTML をスクレイピングしているので、そのうち動かなくなる予感がするっす。
なお、なんだかBOOKLOGがリニューアルするっぽいので、直ぐにでも使えなくなること請け合いである・・・orz

JSONP だと JavaScript の XMLhttpRequest() 関数を利用しなくても、
<script type="text/javascript" src"=http://・・・・"></script>
のよーに読み込むような感じでオブジェクトとして直ぐに使えるってのが便利かも。
クロスドメインによりアクセスが制限されている場合などはこんな感じでやればよかろう。今後APIの提供もJSONP形式で提供されることが多くなるよーな予感がするっす。
(といっても、実際はJSONもJSONPもまだ今ひとつよくわかってないっす・・・orz)
(って、このフレーズは前回の記事のコピペでした)
posted by りょーち | Comment(0) | TrackBack(0) | Web周辺技術

2007年05月18日

連想ブログ検索 Techoreflexa 公開(using reflexa Web API) このエントリーをはてなブックマークに追加

こんにちは、ブラック嶋田です(嘘です)。

自称APIマニア(といっても使ってみて満足するだけなのだが)のりょーちとしてはどっかがAPIを提供したって話しを聞けばちょいと使ってみたりしたくなるのである。
なので、using API;: MASHUPEDIA - マッシュペディア - : Web API x Mashup などをみていると、「おっ、これちょっと使ってみようかな」って感じでテキトーなものを作って見たりするっす。

で、こないだ、その両方で紹介されていた reflexa Web API というものを使ってみたっす。

reflexa Web APIはある単語に関連するキーワードを返してくれる(だけ)のAPIである。使ってみるとなかなか面白いっす。関連しているかどうかはどのように推測するのかは不明であるが、APIにパラメータを渡せば、結果をJSON形式かXML形式で返してくれる。

例えば「プロレス」という言葉に関する関連キーワードはXML形式で こんな感じ で返してくれる。

この reflexa Web APITechnorati (テクノラティ) ブログ検索Google ブログ検索 を使ってこんなのを作ってみた。



単語を指定すると、その単語に関連する関連キーワードをタグクラウドっぽく表示し、TechnoratiとGoogle Blog検索の結果を表示するよーなものである。
作ってみて思ったが、関連性の高い単語だけが表示されるだけでも結構面白い発見があり、単語を見ているだけでも適度に暇つぶしができてGoodである。

検索時に関連性の強い単語が何かを推薦するのは Google Suggest などがあるのでまあ、それを使えばよいのかもしれないが、Google Blog 検索に Suggestion 機能が現在のところ実装されていないっす。今後 Google Blog Search でも実装されると思うっす。
Google さん、よろしくお願いいたします。

posted by りょーち | Comment(2) | TrackBack(0) | Web周辺技術

2007年05月17日

タイトル取得API for JSONP このエントリーをはてなブックマークに追加

こんにちは、大洋ホエールズのパチョレックです(嘘です)。

以前作成したURLを渡すとそのURLのタイトルをJSON形式で取得するAPIを作ってみたが、戻り値がJSON形式なので、扱いが面倒かもと思い、JSONPで返すよーなものを作ってみた。まあ、仮に「タイトル取得API for JSONP」とでもしておこう。
で、以下、その説明。
end point URL:
http://www.usamimi.info/~ryouchi/title/get_title_jsonp.php
パラメータ:callback:
コールバック関数名を指定
パラメータ:url:
タイトルを取得したいURLをencodeして指定

使い方:
callback関数:viewtitle()
URL:http://ryouchi.seesaa.net/
の場合、
http://www.usamimi.info/~ryouchi/title/get_title_jsonp.php?callback=viewtitle&url=http%3A//ryouchi.seesaa.net/
などと指定する。

取得データはこんな感じになる。
viewtitle( {"url":"http:\/\/ryouchi.seesaa.net\/" , "title":"\u308a\u3087\u30fc\u3061\u306e\u99c4\u6587\u3068\u66f8\u8a55"} );

このAPIを利用して簡単なデモを作ってみた。



ボタンを押すと、テキストボックスの中身を取得し、「タイトル取得API for JSONP」に渡すパラメータを作成する。

下記のよーな感じになるっす。

function gettitle(){
// データを渡すためのパラメータ作成
  requesturl = "http://www.usamimi.info/~ryouchi/title/get_title_jsonp.php";
// urlはinput タグのid=urlの値を取得し、escapeしたもの
// callbackは以下に記載するviewtitle()関数を指定する
  requesturl += "?callback=viewtitle&url="+escape(document.getElementById('url').value);
// jsonpで取得したデータをscriptとして扱うために読み込むエレメント作成
  var script = document.createElement('script');
  script.src = requesturl;
  script.type = 'text/javascript';
  document.body.appendChild(script);
// prototype.jsの$()関数を使い、id=rurlの値を変更
  $(ruri).innerHTML = '<a href="'+requesturl+'" target="_blank">'+requesturl+'</a>';
}
function viewtitle(obj) {
// callback関数
// obj.titleには取得したタイトル名が入っている
  $(title).innerHTML = obj.title;
// obj.urlには指定したURLが入っている
  $(uri).innerHTML = obj.url;
// 上記の情報を元にリンクを作成してみる
  $(link).innerHTML = '<a href="'+obj.url+'" target="_blank">'+obj.title+'</a>';
}


JSONP だと JavaScript の XMLhttpRequest() 関数を利用しなくても、
<script type="text/javascript" src"=http://・・・・"></script>
のよーに読み込むような感じでオブジェクトとして直ぐに使えるってのが便利かも。
クロスドメインによりアクセスが制限されている場合などはこんな感じでやればよかろう。今後APIの提供もJSONP形式で提供されることが多くなるよーな予感がするっす。
(といっても、実際はJSONもJSONPもまだ今ひとつよくわかってないっす・・・orz)
posted by りょーち | Comment(0) | TrackBack(0) | Web周辺技術

2007年05月16日

ミヒャエル・エンデ:「モモ」 このエントリーをはてなブックマークに追加

モモ―時間どろぼうとぬすまれた時間を人間にかえしてくれた女の子のふしぎな物語 (岩波少年少女の本 37)
ミヒャエル・エンデ
岩波書店
売り上げランキング: 4035
おすすめ度の平均: 5.0
5 こうしてレビューを書いている時間は無駄なのでしょうか?
5 ベッポじいさんが良い
5 今の時代にも驚くほど当てはまります
5 プレゼントに。
5 歩みの遅い亀が勝つ。


りょーち的おすすめ度:お薦め度お薦め度

こんにちは、貴家堂子です(嘘です)。

ミヒャエル・エンデの名作童話のモモを久々に読んでみた。ここ何年か読んでいなかったが、久々に読んでやはりその素晴らしさに感動っす。

ある町の円形劇場に突然住み着いていた小さな女の子のモモ。浮浪者のような身なりをしたモモはまだ小学生ほどの年齢でしたが、親も兄弟もなく、一人でこの円形劇場に住んでいました。町の人はすぐにモモと仲良くなりました。
モモには人にはできないあることができたのです。それは「人の話しを聞くこと」でした。町の人は何か悩みがあったりすると次第にモモを尋ねるようになりました。モモには待ちの人々の悩みを解決するよいアイデアを出したりするわけではありません。しかし、不思議とモモと話していると自分の頭の中で埋もれていたアイデアがまとまってきたりするのです。ソクラテスの弁証法に近いのかもしれませんが、熱心に人の話しを聞くことにより相手に何かを気づかせるということがモモにはできました。
そんなモモは町の子供達といろんな遊びを考えて遊ぶようになりました。モモたちの時代には今の時代のようにゲームなどは存在してません。しかし、自分達で面白いアイデアを考えて日々遊ぶことができたので、次第にモモは町の子供達にとってもなくてはならない存在になっていたのです。
そんなモモたちの町にある異変が起ころうとしていました。そしてその異変は誰にも知られることなく静かに、しかし確実に起こり始めていたのです。
モモたちを待ち受けていたのは灰色の男たちです。彼らの目的は人から「時間を奪う」ことにありました。この時間泥棒たちはいつも灰色の葉巻を吸い、生きているのです。
彼らはそこに存在しているのですが、人には意識されないような術をもっていました。音もなく町の人々に忍び寄り、恐ろしい計画を企てるのです。
今までのんびりと生活をしていた町の人々に「君は時間を無駄に使っている」と持ちかけるのです。そして今までにどれだけの時間を無駄にしているかを電卓などを駆使し説明し、効率的に時間を利用し、あまった時間を「時間貯蓄銀行」に貯蓄させるのです。
人々はそうやって灰色の男達に唆され、次第に時間を節約し、無駄なことをしないように過ごすようになっていきました。今までのようにモモのところにやってくる人は誰もいなくなってしまいました。モモは古い友人達を訪ね歩きましたがみんなとても忙しそうです。そうすることにより、次第にモモの友人達はまたモモのところにやってくるようになったのです。
しかし、このことをよく思わない人たちがいました。そうです。灰色の男たちです。モモの行動は結果的に人々の無駄な時間を搾取していた灰色の男たち奸計を阻止することになっていたのです。モモは灰色の男達に恐れられる存在になったのです。そしてモモに刺客が送られることになりました。灰色の男はモモに素敵なお人形(ビビガール)を与えましたがモモは興味を示しません。それどころか、逆にモモの「人の話しを聞く」特技により自分達の悪巧みについて知らず知らずのうちにモモに打ち明けてしまっていたのです。
灰色の男たちの恐ろしい計画を聞いたモモはみんなに知らせるために友人達に灰色の男について打ち明けましたが誰もその話しをまともに聞いてくれません。
灰色の男たちはモモを攫ってしまう計画を立てていたころ、モモの住む円形劇場に一匹のカメがやってきました。カメの背中には「ツイテオイデ!」と光る文字が現れました。
モモは光る文字の通りカメについていきました。一方同じ頃灰色の男達はモモを探し出すために町中に現れました。しかし、モモは灰色の男に捕まることはありませんでした。
「さかさま小路」を抜けるとそこは時間の国でした。時間の国でモモは「マイスター・ホラ」という老人に会いました。マイスター・ホラはモモを時間の国に呼ぶためにカメのカシオペイアを使いに出したことを話しました。モモはそこで時間の源を見ました。このことをみんなに話そうと思い、モモは町へ帰って行きますが、町では大変なことが起こっていたのです・・・
時間の国での一日は現実世界での1年に相当するようで、モモはすっかり浦島太郎のような状態になっていました。モモがいないこちらの世界ではこの1年のうちに、時間泥棒たちの活動により、誰も彼も忙しそうにしていました。そして灰色の男達はモモの友人の観光ガイドのジジことジロラモと道路掃除夫のベッポにも、その魔の手を広げていたのです。
すっかり本当に一人ぼっちになったモモは果たして時間泥棒たちにどーやって立ち向かうのか、友達たちは救われるのか?

モモは童話という手法を取っていますがSFといってもよい内容です。本書では「時間」という概念が非常に重要な意味を持ちます。物理学的な絶対時間ではなく、人間が本来体感する時間は同じ時間でも長く感じたり短く感じたりするものです。
何か自分が好きなことに夢中になっているときの時間はあっというまに過ぎ去っていきますが、難しいことや嫌なことをやっているときの時間はとても長く感じられます。人間にとっての時間は自分の体感している時間がとても重要だと思います。そして全ての時間はどんな人にも平等に割り当てられています。
「時間を有効に活用する」という言葉はともすれば「如何に無駄なことをやらないか」という置き換えられやすいが、人間にとって本当に重要なことは「無駄」の中にあるのではと思う。ただ、その「無駄」はダラダラと過ごすということではない。
また「大人になる」ということは無駄な時間を削減し、仕事をするよーなイメージがあるが、最近になってロハスとかそーいった「ゆっくり生活を楽しむぜ」的な動きが盛んになり、ギスギスした感じがちょいと緩和されているよーな気もする(金持ちの道楽的なものかもしれんが)。
いま、全力で走っている人々は「モモ」を読んで貰うと、過去の自分を振り返る余裕を手に入れることができるかもしれないっす。

ちなみに、りょーちとしては時間の世界に旅したモモが目にした「時間の花」を一度でいいから見てみたいなあと思ったりした。りょーちの保有する小説の中でも再読率のかなり高い一冊なので、また何時の日かきっと読むであろう・・・

■他の方々のご意見(名作だし、かなり好評!)


なお、文庫本が出ているらしい。(購入した時には文庫本なんてなかったよ・・・orz)。
モモ (岩波少年文庫(127))
ミヒャエル・エンデ
岩波書店
売り上げランキング: 682
おすすめ度の平均: 5.0
5 現在進行形の物語
5 今まで読んだ本の中で一番面白いです!!
3 絶賛するほどではない
5 大人になると別の形で心にしみるかもね。
4 児童文学ということで…

posted by りょーち | Comment(2) | TrackBack(0) | 読書感想文