2008年03月11日Google検索結果をリキッドマルチカラムで一望し、次の検索結果を先行読み込みして高速に表示し、かつ履歴で戻れるGreasemonkeyスクリプト注:Googleの仕様変更に伴い、このスクリプトは形骸化している。(agenda)で公開している。(agenda)は、10分かそこらで書いた適当なスクリプトだったのでいつか書き直そうと考えていたが、暇を見つけて終わらせたので公開しておく。今回Stylishやユーザースタイルシートは使わず、Greasemonkeyのみで動作するようにした。googlesearchutility.user.js。スクリーンショット留意点など訳あってwww.google.comでしか履歴は動作しない。www.google.co.jpでも基本的に動作はするが、そこらの履歴の壊れる糞Ajaxアプリケーションになってしまう。一度に得る検索結果はデフォルトの10件にしておかなければならない。20件以上ではスクロールが必要になり、何のためのマルチカラムか分からなくなるので対応する気はさらさらない。ソースはスパゲティで、書いていてうんざりした。Javascript1.7が使えるならゲージュツ的に仕上げてやるものを。履歴(戻る、進む)機能メインコンテンツが書き換わるAjaxアプリケーションを作るなら、ユーザーの履歴を守るのは義務だといっていい。その意味でGoogleカレンダーは正しい動作をしているのだが、Greasemonkeyスクリプトでも同じことをやるのはgoogle.com上のソースを管理する権限のない私にとって難しく、Googleカレンダーのソースを利用させてもらった。/calendar/echo.htmlのスクリプトはlocation.hashを引数に渡して親フレームの_goHist関数をcallしている。ユーザーによって引き起こされたいわば「戻る」「進む」イベントを知らせてくれるということだ。Greasemonkeyスクリプトでこれを利用するには、unsafeWindow._goHistを定義してやればいい。問題はunsafeWindow._goHist内部ではGM_xmlhttpRequest関数が使えないことだが、ノードの属性を書き換えるなどしてイベントを引き起こし、そのリスナでGM_xmlhttpRequestを呼び出すなど抜け道はある。iframeなどのフレームのsrc属性を書き換えると履歴に残るため、履歴を残したいタイミングでsrc属性の書き換えを行うことで、ページ遷移なしにユーザーの履歴をある程度操作可能になる。同じことはハッシュを用いたページ内リンクでもできることは容易に想像できるのだが、「戻る」や「進む」のイベントをキャッチする方法が分からなかった。述べたが、iframe内の文書のスクリプトは実質的にイベントリスナーになっているのだ。「戻る進むイベント」さえ得ることができれば、後は何とでもなる。余計な解説も、糞重たいライブラリも一切不要だろう。「糞重たいライブラリ」と自分で書いていて半ギレしてきたのだが、外部Javascriptファイルを10個も20個もリンクしている馬鹿サイトは本当に頭にくる。Web2.0という概念を認めるとしよう。0.5」に退行しているのも、これもまた間違いのない事実だ。本当に、本当に間抜けだと思う。2.0のその本質は「(体感)速度」なのだから。基本的に検索結果の各ページは別窓や別タブで開くことを前提にしているが、うっかり同じ窓で開いて先行読み込みした検索結果のキャッシュがクリアされてしまうこともあるだろう。そんなときでも「戻る」操作で一応状態は復元する。本当は現在の「ページ数」をdocument.titleに記載して履歴一覧が機能するようにしたかったがバグに悩まされ、面倒くさくなって放置してある。検索が完了すると、次の10件及び最後の検索結果を先行読み込みしてキャッシュに溜め込む。ちなみにGoogleは1000件までしか検索結果を提供しておらず、start=990をURLのパラメタとして付加してやれば最後の検索結果が得られるようだ。読み込みが完了した時点で総ページ数を分母として表示する。>>|をアクティブにすると最後の検索結果まで一気に移動する。このとき、先行読み込み機能は逆転し、前の10件の検索結果を先行読み込みするように切り替わる。|<<で最初の検索結果に移動すると元に戻り、再び次の10件を先行読み込みするようになる。リキッドマルチカラム。