Weblog - Coding
Posted at 2006-10-20T00:07:00+09:00 in Coding
TypePadがJSONフィードの出力に対応したそうで。JSONフィードってーのはdel.icio.usのJSON Feedsとかで見られる、JSONを利用したRSSやAtomっぽい配信フォーマットで、Pure JavaScriptで扱えるのが最大の特徴。特に仕様なんかは無い(と思う)。かなり昔にこのサイトで妄想として取り上げていたのが現実になった感じ。
というわけでblosxomでindex.jsonというTypePadのJSONフィードに似せた感じの出力を確保する仕組みの実装する方法書いてみる。TypePadのテンプレートに準拠したいところだけどTypePadとかいうprefixがちょっとアレなアレでアレ。
flavourだけでJSONフィードを出力するのはちょっと難しい。W3CDTFで日付を出力とかでつまづいちゃうので、interpolate_fancyプラグインとテキトウな作りのrssプラグインが必要な感じ。でもまぁとりあえずは以下のような感じで比較的手軽に実装可能。ただこのままだとjsonFeeds.entriesの最後の要素の後ろにもカンマが付いちゃうのでInternet Explorerでエラーが起きる。このことへの対処や日本語をUnicodeのhexでエスケープするとかも含め、実際に利用する場合はjsonfeedなどといった専用プラグインを作った方が良さそう。
content_type.json
text/javascript
head.json
// This JSON Feed automatically generated by blosxom 2.0
// http://creativecommons.org/licenses/by-nc/2.1/jp/
if (typeof(jsonFeeds) == "undefined") jsonFeeds = new Array();
jsonFeeds["$url/index.json"] = {
"title": "hail2u.net - $blog_title",
"link": "$url/",
"id": "tag:hail2u.net,2002:/blog/",
"author": "$rss::name ($rss::email)",
"updated": "$rss::last_build_date_w3cdtf",
"subtitle": "$blog_description",
"generator": "http://www.blosxom.com/?v=2.0",
"entry": [
date.json
空のファイルを用意。
story.json
{
"title": "$title",
"link": "$url$path/$fn.$default_flavour",
"id": "tag:hail2u.net,$yr<?$yr>:</?>$path/$fn",
"summary": "$rss::excerpt",
"author": "$rss::name ($rss::email)",
"category": "$categories::name",
"published": "$yr-$mo_num-$da<?$yr>T</?>$ti<?$yr>:</?>00+09:00"
},
foot.json
]
};
次はJSONFP(JSON Feed with Padding)だな。
Posted at 2006-10-11T08:25:00+09:00 in Coding
JSONで記述した設定ファイルをどこかのサーバーに置き、それを動的にscript要素を追加するアレで読み込み、適用するという試み。タイトルまんま。設定を保存するということは難しいので、使いどころはとても限られる。Bookmarkletでゴニョゴニョするサイトなんかで細かい指定パラメータの代わりに使うとかが唯一に近い光明。
とりあえず設定ファイルを指定するとデフォルトの設定とマージして適用するサンプルを作った。
- 設定ファイル指定無し
- 設定ファイル指定有り
二番目のようにクエリでfileパラメータの値に設定ファイルのURLを指定すると、デフォルトの設定
{
"username" : "anonymous",
"top" : "0px",
"left" : "0px",
"width" : "320px",
"height" : "240px",
"color" : "#ffffff",
"bgcolor" : "#336699"
}
と、設定ファイルで指定した設定
{
"username" : "Kitty",
"left" : "80px",
"width" : "240px",
"color" : "#ffffff",
"bgcolor" : "#996633"
}
がマージされて適用される。ここではユーザー名・X方向の位置・幅・背景色を設定ファイルで変更している(マージなので指定されていない設定はデフォルトの設定が適用される)。JSONのマージは、prototype.jsのHashオブジェクトのmergeメソッドを利用して行った(考えるのが面倒だったので)。
アサマシHTML作成ツールで似たようなことを既にやっているのだけど、これがテンプレート・ファイルの読み込み限定なのに対して、こちらはWindowsのINIファイルっぽく扱える感じ。セクション作れないけど。
単体で機能するライブラリにして、設定のロードをもっと手軽に扱えるような形にすればそこそこ利用価値のあるものになりそうだけど、所詮は読み込み限定なのでライブラリ化するほどのモノでもない気がする。そもそも使い道思いつかないし。
Posted at 2006-10-08T01:42:00+09:00 in Coding
エントリのネタに事欠いたので少し前に作ったdel.icio.usのnetworkをツリー状に展開しまくるモノについて書いてみる。タイトルの通りの代物で、基点となるユーザー名のnetworkをリストにして表示し、それぞれのリスト項目のユーザー名の後ろについている矢印画像をクリックすると、更にそのユーザー名のnetworkをリストにして表示し・・・と、延々とツリー状に展開しまくるもの。
ただnetworkを辿るだけでは寂しいので、右にbookmarkやfanを表示してみたりとかもしてある。自分のお気に入りのユーザーは誰をお気に入りにしてるのかとかを見て、「お、この人はこんなブックマークの人なのか。面白そう。networkに登録しよう!」みたいな使い方を想定しているのだけど、イマイチ(どころではない)。
ツリーを作るためにそれぞれのli要素のid属性にツリー構造を反映したnetwork-11-3-7といった規則的な値を振っていった事以外には特に考えることもなく作ったもの(な記憶)。そのため並行に処理とかさせていないので、全体的に「トロい」という感じ。
こういうものよりも、自分の直近30件のブックマークを調べて、似た傾向のユーザーを探すとかの方が実用性は高そう。JavaScriptでやるとなるとdel.icio.usへのアクセスにウェイトかけたりとか大変そうだ。そういう機能を含めたライブラリを作りたいところだけどなかなかどうして。そもそもあるURLのブックマーク情報はJavaScriptだけでは得ることができないけど。
Posted at 2006-10-02T12:56:00+09:00 in Coding
作成したFirefoxのExtensionをXPIパッケージにまとめる方法の一つとして、バッチ・スクリプトがHow to create Firefox extensionsでかなり昔から公開されている。これはbuild.batをいちいちコピーしなきゃならなかったりとか.svnフォルダなども含んでしまったりする。それをbuild.batをどこかにおいておけばドラッグ・アンド・ドロップでXPIパッケージが作れるようにしたりとか改造してみた。
@echo off
set x=%1
X:
cd %x%
set x=%cd%
md "%x%\build\chrome"
cd "%x%\chrome"
7z a -tzip "%x%.jar" -mx=0 * -xr!.svn
move "%x%.jar" ..\build\chrome
cd ..\
xcopy components build\components /c /i /s
xcopy defaults build\defaults /c /i /s
copy chrome.manifest build
copy install.rdf build
cd build
7z a -tzip "%x%.xpi" -mx=9 * -r -xr!.svn
move "%x%.xpi" ..\..\
cd ..\
rd build /s /q
pause
これをどっかに保存しておけばドラッグ・アンド・ドロップでXPIパッケージを作れるようになる(4行目のX:はExtensionを開発しているドライブ・レターに変更する必要がある)。僕は[defaults]とか[components]とかが必要なExtensionは作っていないので、そこらへんの動作は保障はできない。
少し前にFirefox 2.0 RC1に対応させたこのサイトで公開されているFirefox extensionは上記バッチファイルを使ってXPIパッケージを作成してみた。ちゃんと動いている模様。
そういやFirefox Product Teamから、
10/1深夜までにExtensionをFirefox 2に対応させてaddons.mozilla.orgにアップロードした人全てに、限定版の"Bon Echo" Extensionチーム・Tシャツを送る・・・つもり。
みたいな(超訳)メールが来てたんだけど、本当に送るのかな?送料だけでかなり大変そうだ。
Posted at 2006-09-28T16:47:00+09:00 in Coding
Yahoo! Search Web ServicesのJSON(P)を利用すれば、JavaScriptのみでサイト内検索が実現できる上、Ajax的にページ遷移無しで検索が実行できる。Google AJAX Searchが内部で利用しているJSONPらしきアレを利用するケースと違い、こちらは公式にアナウンスされているのでおおっぴらに利用できる。というわけで、ほとんど同じタイトルでほとんど同じネタを連続で書いてみる。
実装は、ひとつ前のエントリでもリンクを張っておいたサンプル・ページで利用しているyahoo-sitesearch.jsのような形になる。
Yahoo! Search Web ServicesのWeb Search APIへのリクエストは、
http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid={アプリケーションID}&query={検索語}&site={ドメイン名}&output=json&callback=handleWebSearch
という形で、outputパラメータでjsonを指定するとXMLの代わりにJSONで結果を得ることができ、callbackパラメータでコールバック関数名を指定すると指定したコールバック関数でpaddingしてくれる(JSONPにしてくれる)。あとはコールバック関数でデータを加工してやれば良い。サンプルではprototype.jsや自作ライブラリを使ってたりするが、多重リクエストのことなどは考えなくて良いと思われるので、単純にscript要素を作成して追加するというコードをベタに書いても問題ないと思う。
Yahoo! Search Web Servicesはドキュメントがしっかりしており、速度や安定性も申し分ない。日本語もきちんと扱われているので、「とりあえずJSONP使ってみよう」とか「JSONPってどんなことができるんだろう?」みたいな人の練習台にちょうど良いと思う。del.icio.usは超重かったりするし。
上記サンプルはこのサイトに特化した形になっていてわかりにくいと思うので、既存のライブラリを使わずベタにJavaScriptを書いたサンプルも用意した。100行に満たないコードで実装することができている。script要素を削除してないのはデバッグしやすいようにとか、JSONPで返ってくるデータの構造を良く知らない人のためにとか。こういう類の実際に利用されまくるものではちゃんと削除したほうが良いっぽい。
とりあえずWeblogの各ページにある検索フォームは差し替えてみた。キャッシュの都合で切り替わってないように見える(Powered by Googleとなってたら切り替わってない)時にはスーパー・リロード(Ctrl+F5)で。やはり検索結果がちょっとアレな気がする。どういうのが良いのか具体的にイメージできてないので、挙動的にはこんなもんかなーとかいう感じ。検索結果の表示の工夫よりも、検索語拾ってアサマシ広告を挿入すると良さそうとかそんなことばかり考えてる。
このように検索結果をページ遷移無しで表示することができると、訪問者が検索することイコール訪問者がページに留まることになる。サイト内に訪問者が留まる時間で考えるのなら、ページ遷移ありのごく普通なサイト内検索スクリプトでも変わらないのだけど、ページに留まるというのがミソ。ページに留まる時間が増えるということは、つまりそのページに挿入した広告が表示される時間が増えるということなので、広告収入を得る可能性の増加に直結する。
とかもっともらしいことを書いてみる。ウソ・・・とも言い切れないだろうけど、広告の表示される時間からイメージされる効果には程遠いと思う。検索語を拾ってアサマシの方が効果が高そう。
Posted at 2006-09-27T13:49:00+09:00 in Coding
Google AJAX Search APIは、動的にGoogle検索結果を自分のページに挿入することができるAPI(あまり使っているサイトを見ないけど)。Ajaxっつっても内部はJSONP(みたいなもの)だったりするので、普通にGwebSearchクラスのsetSiteRestriction()メソッドを使うのではなく、JSONPを直接叩いてサイト内検索を実装することもできる。もちろんサイト内検索に限った話ではないけど。
Google AJAX Search APIのGwebSearchクラスによる検索は、
http://www.google.com/uds/GwebSearch?callback={コールバック関数名}&context=0&lstkp=0&hl=ja&q={検索文字列}&key={Google AJAX Search API key}&v=0.1
というURLへリクエストすることによって検索結果を取得している。また、setSiteRestriction()メソッドによるサイト内検索は特別なURLへのリクエストではなく、検索文字列にsite:{ドメイン名}を追加しているだけ(ここらへんのことはLive HTTP Headersなんかでリクエストを監視していれば直ぐにわかる)。つまり、簡単な文字列の連結でリクエストするURLが作成できるので、コールバック関数さえ定義してやれば簡単にサイト内検索をすることができる。というわけでGoogle AJAX Search APIのJSONPを利用したサイト内検索のサンプルを作成してみた。
上記サンプルではgoogle-sitesearch.jsという外部JavaScriptファイルで実現している(prototype.jsやJSONPにリクエストするためのodj.jsとかいう自作ライブラリも使ってるけど)。google-sitesearch.jsでは、
var url = 'http://www.google.com/uds/GwebSearch?' + $H({
lstkp: 0,
context: 0,
rsz: 'small',
hl: 'ja',
q: $F('q') + ' site:hail2u.net',
key: apikey,
v: 0.1
}).toQueryString();
とprototype.jsを使ってJSONPへのリクエストURLを作成しているが、もちろん文字列の連結とかでも問題ない(encodeURIComponent()する必要はあるけど)。コールバック関数は、
function handleGwebSearchResults(i, r, n, m) {
r.results.each(function (result) {
// 各検索結果に対する処理
});
}
と四つ引数があることと第二引数に検索結果が格納されていることを意識して作れば良い。prototype.jsのArrayクラスに対する拡張のeach()メソッドとか使ってるけど、普通にforループでも書ける。各検索結果は、
{
GsearchResultClass:"GwebSearch",
unescapedUrl : "http://hail2u.net/archives/bsk.html",
url : "http://hail2u.net/archives/bsk.html",
visibleUrl : "hail2u.net",
cacheUrl : "http://www.google.com/search?q=cache:2EslMvGB3FEJ:hail2u.net",
title : "hail2u.net - Archives - <b>blosxom</b> starter kit",
titleNoFormatting : "hail2u.net - Archives - blosxom starter kit",
content : "できることならこれを利用し、<b>blosxom</b>の挙動を知った上で、一から<b>blosxom</b>を構築すること<br> をお薦めします。 <b>...</b> オリジナルの<b>blosxom</b>の使い方については説明する気はないです。<br> 公式サイトで公開されているプラグインも、オリジナルで使うときと同様に利用 <b>...</b>"
}
という明快な構造になっているので、あとは適当にHTMLを作って吐き出すだけ。特に難しいところはない。ただ、Google AJAX Search APIでは最高でも8件までしか検索結果を取得することができないので、8件以上検索結果がありそうな場合は、最後にGoogleのサイトへ誘導するリンクを付け足すようにした(startパラメータを利用して検索結果を重ならないようにしてある)。このサイトくらいの規模ならば8件とかでも充分だったりするのだけれども。
実際にこういった検索結果を動的に挿入云々をサイトで実装したい場合は、公式にJSON(P)がサポートされているYahoo! Search Web ServicesのWeb Searchを利用するべき(Yahoo! Search Web ServicesのJSONPを利用したサイト内検索のサンプル)。ただ、サイト内検索なんかではGoogleの方が明らかに検索結果が優秀なイメージがあって悩ましい。とりあえずYahoo!のSite Explorerでサイトマップ送信してみた。改善したらうれしい。
Posted at 2006-09-25T13:46:00+09:00 in Coding
コールバック関数を指定する形のJSONPへforループなどで複数回リクエストする場合、コールバック関数の実行される順はforループで回した順と一致するとは限らない(Opera除く)。そのため何番目にリクエストした結果に実行されたコールバック関数なのかといった処理状況をコールバック関数内で知ることが面倒だったりする(不可能というわけではない、多分)。それをあえて同期リクエストにすることでどうにかしてみようとかいう話。
同期リクエストするためには、forループなどでJSONPへのリクエストを一気に処理するのではなく、リクエストをひとつに留めてコールバック関数内で次に進むといった形で実装するが良さそう・・・とアイディアをバソキヤ求めて三千里の人に貰った。
つまり、
var urls = [
'http://del.icio.us/feeds/json/cho45',
'http://del.icio.us/feeds/json/drawnboy',
'http://del.icio.us/feeds/json/gorou',
'http://del.icio.us/feeds/json/hail2u',
'http://del.icio.us/feeds/json/miyagawa',
'http://del.icio.us/feeds/json/nagayama',
'http://del.icio.us/feeds/json/typester',
'http://del.icio.us/feeds/json/yoko'
];
というdel.icio.usで提供されているJSONフィードのURLのリストへ順番にリクエストし、その順番通りにコールバック関数を実行させるには、
addScript(urls[0] + '?callback=diplayPosts');
function addScript(url) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', url);
script.setAttribute('charset', 'UTF-8');
document.getElementsByTagName('head').item(0).appendChild(script);
}
function diplayPosts(posts) {
// JSONフィードに含まれるブックマークのJSONデータに対する処理色々
loadNext();
}
function loadNext() {
if (urls.length <= 1) return;
urls.shift();
addScript(urls[0] + '?callback=diplayPosts');
}
という感じに、コールバック関数(displayPosts())内で次に進む関数(loadNext())を呼び出すように実装するということになる。こうするとコールバック関数内でurls[0]を参照すれば、どのURLへのリクエストした結果として呼び出されたコールバック関数なのかすぐにわかる。単純にforループで回した場合は、ブックマークのデータを処理するコールバック関数が呼び出される順番が狂う場合がある(ネットワーク状態に依存)し、コールバック関数内からは誰のブックマークのJSONデータを処理しているのかを知る手段がなくなってしまう。
あえて同期リクエストすることにより、非同期であることからスムースに処理できる(ことが多い)というJSONPの長所を失う上に、処理に時間がかかってしまうという欠点もある。それでもあえて非同期でリクエストしないことによって、得られるものがいくつかあるわけで、場合によってはあえて並行リクエストをしないという選択はアリなのかもしれない。
少し前に作った指定したdel.icio.usのユーザーのnetworkに登録しているユーザーのブックマークを並べるモノは誰のブックマークやらわからない状態でずらっとブックマークが並べられていたが、同期リクエストに変更することによってユーザー名付きでブックマークを並べられるようになった。
Posted at 2006-09-24T04:48:00+09:00 in Coding
TrackBackの代わりにWebサービスAPIを利用してインバウンド・リンクをリスト化して表示しようかと考えた。blogにTrackBackの機能を持たせるのは悪くはないのだけどコストが高いと思うので、WebサービスAPIを利用して低コストでTrackBack的な情報をページに持たせることが出来たら良いなと。結果はうまくいかなかったのだけど。
TrackBackがコストが高いというのはやはりスパムの問題が大きい。規模の小さいサイトならTrackBack受信の仕組みが稼動するのはスパムを受けた時ばかりという状態になったりするだろうし、規模の大きいサイトならとてつもなく大量のスパムを戦うことになるだろう。つまり、TrackBackを受けることよりもスパムを弾くことに注力せざるを得ない。その結果としてpermalinkからTrackBack Auto-Discoveryを削除して、目視でTrackBack送信先URLを探させ指定させるなどといったアレな実装に行きついてしまったりもする。
対してインバウンド・リンクをWebサービスAPIで取得することによってTrackBackに似た情報を生成する場合は、スパムと戦う必要はほとんどない。TrackBackと比較して劣るところは多いと思うがスパム・フリーであること(絶対にというわけではないけど)は魅力的。
というわけで、Yahoo! Search Web ServicesのWeb Search APIを利用してJavaScriptでインバウンド・リンクをリスト化するものを作ってみた。インバウンド・リンクを検索結果として得るにはクエリ文字列で、
link:http%3A%2F%2Fexample.com%2Ffoo%2Fbar.html
などと指定してやれば良い(See Also: Yahoo! Help - Search - Search Tips)だけなので、特に難しいことはない。
試してみればわかるが、del.icio.usなどのあまり対象のページに持たせても意味の無いインバウンド・リンクをフィルタする必要がある上、それらを利用したサイトなどもフィルタしなければならない。スパムと戦うよりはコストはかからないだろうけど、こちらも効率的に対象のページに有用な情報を取得できるというわけではない。
Yahoo! Search Web ServicesにはSite Explorer Inbound Links APIというそのものずばりなAPIもあるのだけど、こちらはdel.icio.usばかりになってしまってもっと使いづらい。
Technoratiはまさにこういったインバウンド・リンクをリスト化するためにあるといっても過言ではないのだけど、重すぎて使い物にならなかった時期が長くて印象が悪く、使う気になれない。今もお世辞にも軽いとは言えないし、フィルタしなければならないリンクも結構出てくる。
こういったことを実現するために使えるWebサービスAPIは、フィードの提供に限ったものなども含めればいっぱいありそうではある。いわゆるblog検索なんかは全部そうだし。ちゃんと探してあとで完成品を書く。

- Software Design 編集部
- 技術評論社
- 2005-09-23
- ¥ 1,554
Posted at 2006-09-22T14:45:00+09:00 in Coding
はてなブックマークのエントリー情報取得APIは任意のURLに対するブックマークを返してくれるAPIなだけでなく、事実上はてなスクリーンショットのAPIとしても機能している。正確には、はてなスクリーンショットによるスクリーンショット画像のURLも返してくれるというだけ話なのだけど。
例としてlabs.hail2u.net/hatena/screenshot/を作成してみた。ここでは、
var sites = [
'http://hail2u.net/blog/',
'http://la.ma.la/blog/',
'http://lowreal.net/blog/',
'http://tokyoenvious.xrea.jp/b/'
];
というURLの配列から、
<p><img
src="http://screenshot.hatena.ne.jp/images/120x90/0/1/6/3/8/3c63fbe3a76655390497a260a44ec509d2f.jpg"
height="90"
width="120" /></p>
<p><img
src="http://screenshot.hatena.ne.jp/images/120x90/7/4/2/d/6/b497e3edc6d9badd41bac03419b4822e758.jpg"
height="90"
width="120" /></p>
<p><img
src="http://screenshot.hatena.ne.jp/images/120x90/notfound.jpg"
height="90"
width="120" /></p>
<p><img
src="http://screenshot.hatena.ne.jp/images/120x90/9/d/d/0/0/0992b943b07310949f8428ce82472381659.jpg"
height="90"
width="120" /></p>
というHTMLを生成することができている。
APIへのリクエストは動的にスクリプト要素を生成してやる例のアレをベースにしたもので、まららんやはてのくんが書いたりしてたのを参考にまたちょっと手が入っている(ソースを参照)。APIのリクエストを除いたスクリーンショットのURLを拾うコードは正味一行。
var ss = (bookmarkData == null) ? 'http://screenshot.hatena.ne.jp/images/120x90/notfound.jpg' : bookmarkData.screenshot;
はてなブックマークエントリー情報取得APIが迅速にレスポンスを返してくれるので、想像していたよりも軽快にHTMLが生成できた。もちろんスクリーンショットが欲しいURLがブックマークされている数が多ければそれだけレスポンスが遅くなるので、HTMLの生成も重くなるのだろうだけど。
ブックマークされていないとスクリーンショットのURLを取得することが絶対にできないことなどいわゆるサムネイル取得APIと比較して劣るところはあるけれども、スクリーンショット取得APIとしてそこそこ使えるのではないかと思う。
また、Perlではてなブックマークエントリー情報取得APIを利用したスクリーンショット画像へのリダイレクタとかも作った。これはスクリーンショットがあった場合はそのURLにリダイレクトという仕組みになっているので、
<img src="http://example.com/hatena_screenshot_redirector.cgi?url=http%3A%2F%2Fexample.org%2F" />
みたいに使うことができる。とりあえずリダイレクトさせることだけを目標に作った短いものなので、キャッシュ作らないで常にはてなにGETかけるとかヒドイCGI。使う人はちゃんと作り直してください。愛するはてなのために!
Posted at 2006-09-12T06:41:00+09:00 in Coding
未だにちょくちょくみてしまうprototype.jsの簡単なリファレンスであるDeveloper Notes for prototype.jsの日本語版とThe Document Object Model in Mozillaで配布されているGecko DOM ReferenceのZIP version(古い奴)をHTMLヘルプにしてみた。HTMLヘルプはちょっと作ってみちゃったりすると、HDD上にあるありとあらゆるHTMLのドキュメントをHTMLヘルプにしたい欲求に駆られてしまう・・・のは僕だけですか、そうですか。
prototype.jsの開発メモの方はHTMLに手を入れて、メソッドやプロパティにidを振り、キーワードでジャンプできるようにした。HTMLヘルプ向けにCSSもちょっと調整。チェックしきれてない説があるので、「このキーワードが変」とかあったらメールとかブクマ・コメントとかで。キーワードの割り当てが微妙な気がする。
実際にはscript.aculo.usに同梱されている1.5.0_rc1やSubversionリポジトリから拾ってきた最近のものを使っている人がほとんどだと思うので、使い道があまり無い。これからprototype.js触ってみるとかいう人には良いかも。
Gecko DOM Referenceの方はToCとIndexがあるのでそれらからほぼ自動生成。
HTMLヘルプは元になるHTMLさえあれば結構簡単に作れるので、いろいろと自分で作ってみてはどうでしょうか。そして作ったら公開してほしいなぁ、とか思いました。まる。コペ。コペ。そろそろ作り飽きてきた。
Weblog archives
by Month
- October, 2006 (9)
- September, 2006 (23)
- August, 2006 (31)
- July, 2006 (8)
- October, 2005 (13)
- September, 2005 (24)
- August, 2005 (26)
- July, 2005 (2)
- June, 2005 (2)
- May, 2005 (13)
- April, 2005 (30)
- March, 2005 (33)
- February, 2005 (13)
- January, 2005 (10)
- December, 2004 (28)
- November, 2004 (27)
- October, 2004 (25)
- September, 2004 (38)
- August, 2004 (52)
- July, 2004 (45)
- June, 2004 (41)
- May, 2004 (48)
- April, 2004 (36)
- March, 2004 (51)
- February, 2004 (55)
- January, 2004 (63)
- December, 2003 (46)
- November, 2003 (63)
- October, 2003 (92)
- September, 2003 (61)
- August, 2003 (93)
- July, 2003 (57)
- May, 2003 (5)
- April, 2003 (35)
- March, 2003 (35)
- February, 2003 (37)
- January, 2003 (62)
- December, 2002 (32)
This page was last modified on 2006-10-20T01:42:38+09:00 (in 0.116 secs).