Google Bookmark が快適すぎる

Google Bookmark を使いはじめた。シンプルながら快適な使い心地で気に入っている。

  1. とにかく、ブックマーク編集画面が開くまでが速い
  2. ブックマーク先のページも含めて全文検索が可能

ソーシャル要素は考えず、純粋に「ブックマーク」という行為を突き詰めていくと、上記二点が非常に重要であることが分かると思う。

ちなみに、ブックマークレットにはGoogleブックマークに追加するブックマークレット(メモ欄対応版)で配布されているものを別窓で開くようにして使わせてもらっている。感謝。

Go

Io と並んで、自らの検索能力が試される名前の Go ですが、実用性と簡潔さを兼ねそなえた言語設計は好感がもてます。

Google Chrome に搭載されたオープンソースの JavaScript エンジン "v8" を試す

その発表から世間を騒がせた、Google の Web ブラウザ Chrome が遂に公開された

Google の検索履歴を記録する JavaScript を読んでみた

Google 検索履歴では、検索クエリーの履歴だけではなく、検索結果で実際にどのページをクリックしたか、も記録している。

検索結果ページのソースコードを読んでみると、履歴の保存は JavaScript で行われているようだ。

改行やインデントを加えて読みやすくしたソースコードを基に、履歴を保存する処理や興味深い部分を紹介する。

検索クエリーの保存

if (document.images) {
  new Image().src="/url?sa=Q&client=safari&rls=ja-jp&q=...";
}

まずは冒頭。新しい Image を生成することで http://www.google.com/url/ にアクセスさせている。

URL から推測するに検索クエリーを保存しているのだろう。

クリックされたページの URL を保存

クリックされたページの URL を保存する処理は、各リンクの onmousedown に JavaScript を仕込むことで実現している。

<a href="..." class=l onmousedown="return asq(event,this,'','','res','1','&amp;sig2=...')">

リンクをクリックすると asq 関数が実行されたのち、ページに遷移する、というわけだ。

asq 関数の実装

では、asq 関数はどのような実装になっているのだろう。それなりに長いので些末な部分は削除したソースは以下の通り。

window.asq = function(d,a,f,g,k,l,m) {
  if (window.XMLHttpRequest) {
    var c = window.encodeURIComponent ? encodeURIComponent : escape;
    var h = "", i = "";
    var b = new XMLHttpRequest;
    var e = d.altKey || d.metaKey;

    b.open(
      "GET",
      "/url?&url="+c(a.href.replace(/#.*/,"")).replace(/\+/g,"%2B")+"&ei=..."+m,
      true);

    if (!e) {
      b.onreadystatechange = function() {
        if (b.readyState == 4) {
          clearTimeout(j);
          a.dispatchEvent(d)
        }
      };
      var j = setTimeout(function() {
                b.abort();
                a.dispatchEvent(d)
              },
              2000);
    }

    b.send(null);
    return e
  }
  return true
};

XMLHttpRequest を使って、クリックされたページの URL を非同期送信している。強調した部分では、setTimeout でタイムアウト処理をしているようだ。

IE 6 以下の場合は?

見ての通り、asq 関数の実装は XMLHttpRequest オブジェクトがあるかどうかに依存している。

では、XMLHttpRequest オブジェクトではなく、ActiveXObject 経由で非同期通信を行う IE 6 などではどうするのだろう?

実は IE 6 などでアクセスすると、asq 関数ではなく、clk 関数というものが定義されるようになっている。この関数では検索クエリーの保存と同じように、Image オブジェクトによるアクセスが行われている。

Google のリダイレクタ

社内の開発合宿行ったり、そこで風邪もらったりしているうちに、すっかりブログの更新から遠のいてしまった。ぼちぼち復活。

2ちゃんねるではリファラ隠しのために、いわゆる ttp リンクや http://ime.nu/ などのリダイレクタが利用されている。リダイレクタという名前は勝手に使ってるだけで、正式なものか分からないけど、URL の末尾やパラメータに別の URL を指定すると、その URL にリダイレクトしてくれるページのこと。

もっとも、http://ime.nu/ のように、あいだに警告ページを挟んでリンクを表示する(実際にはリダイレクトしない)ページもリダイレクタと呼んでいる。

Google にも、このリダイレクタがあるのを、今日はじめて知った。

http://www.google.com/url?sa=D&q=http://www.yahoo.co.jp/

上の例は http://www.yahoo.co.jp/ に飛ばすためのリンク。

Want fries with that?

Open Source Projects