検索エンジンがどうやってクリック履歴を追っているのか調べてみた

上記のグリモンを実装するために、検索エンジンがどうやってクリック履歴を追っているか調べてみました。まずは、一般的な検索の流れは以下のとおりです(よね)。

簡略化したフロー

  1. ユーザが好きなキーワードで検索する
  2. aタグの一覧が表示される
  3. aタグの一覧には何らかのトレースする仕組みが入っている <- ここがわからない
  4. aタグからリンク先に飛ぶ
  5. (これの繰り返し)

HTML+JavaScriptの勘所

接続ログをみてみると、だいたいの勘所が見えてきました。下記に列挙してみます。

Google
<a onmousedown="return clk(this.href,'','','res','1','','0CBgQFjAA')" class="l" href="http://d.hatena.ne.jp/DianthuDia/"><em>diaの備忘録</em></a>
<!-- 接続しにいくURLは
http://www.google.co.jp/url?sa=T&source=web&ct=res&cd=1&ved=0CBgQFjAA&url=http%3A%2F%2Fd.hatena.ne.jp%2FDianthuDia%2F&ei=fvUGTJX1LsuXcZe91JUO -->
window.clk = function (e, f, g, k, l, b, m)
{
    if (document.images)
    {
        var a = encodeURIComponent || escape, c = new Image, h = window.google.cri++;
        window.google.crm[h] = c;
        c.onerror = (c.onload = (c.onabort = function ()
        {
            delete window.google.crm[h]
        }));
        if (b && b.substring(0, 6) != "&sig2=") {
            b = "&sig2=" + b;
        }
        c.src = ["/url?sa=T", "\x26source\x3dweb", f ? "&oi=" + a(f) : "", g ? "&cad=" + a(g) : "", "&ct=", 
        a(k || "res"), "&cd=", a(l), "&ved=", a(m), e ? "&url=" + a(e.replace(/#.*/, "")).replace(/\+/g, 
        "%2B") : "", "&ei=", "fvUGTJX1LsuXcZe91JUO", b].join("")
    }
    return true;
};
Bing
<a onmousedown="return si_T('&amp;ID=SERP,5035.1')" href="http://d.hatena.ne.jp/DianthuDia/"><strong>diaの備忘録</strong></a>
<!-- 接続しにいくURLは
http://www.bing.com/fd/ls/GLinkPing.aspx?IG=7707d14150bf4d3997e7c7b8385f22df&ID=SERP,5035.1 -->
function si_T(a)
{
    if (document.images) {
        _G.GPImg = new Image;
        _G.GPImg.src = _G.gpUrl + 'IG=' + _G.IG + a;
    }
    return true;
}

どちらもImgタグのsrcにトレース用のURLをセットして、強制的にブラウザにリクエストを投げさせているみたいです。なるほど、これならばユーザーに気づかれずにトレースできますね!

Yahoo! Japan

<a href="http://wrs.search.yahoo.co.jp/;_ylt=A3yTKijU.wZMm4YAqDWDTwx.;_ylu=X3oDMTEyNTZucDQ1BHBvcwMxBHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDAwMDU-/SIG=120h03u8f/EXP=1275612500/*-http%3A//d.hatena.ne.jp/DianthuDia/20081114/p1" >
イヤホンの巻き方 - <b>dia</b><b></b><b>備忘録</b></a>

のようにリダイレクタをはさんでいるようです。hrefが検索の度に変わると、先程の記事に記載したように訪問済みかどうか判断出来ません。私のスクリプト はこのYahoo! Japanの仕様を、他のエンジンのやり方を参考に変更したものです。

Yahoo! JAPAN 検索結果の訪問済みのリンクをわかりやすくするGreasemonkeyかきました

【2011/05/08 追記】
2010年7月15日の仕様変更が入り、このプラグインは現在必要ありません。

インストール

インストールは コチラ から!

確認済み環境

設定

IS_REDIRECT
リクエスト方法を指定します。trueなら、標準の方法でクエリーを投げます(通常はこちらを設定してください)。falseなら直接、結果遷移します。

機能

通常のYahoo検索結果は、下記のような長いURLになってます。

<a href="http://wrs.search.yahoo.co.jp/;_ylt=A3yTKijU.wZMm4YAqDWDTwx.;_ylu=X3oDMTEyNTZucDQ1BHBvcwMxBHNlYwNzcgRzbGsDdGl0bGUEdnRpZANqcDAwMDU-/SIG=120h03u8f/EXP=1275612500/*-http%3A//d.hatena.ne.jp/DianthuDia/20081114/p1" >
イヤホンの巻き方 - <b>dia</b><b></b><b>備忘録</b></a>

このタグだと、検索の度にhrefが変わってしまいます。調べ物をしていて、以前見たページとそうでないページは分けて見たいですよね。そこでこのGreasemonkeyを使います。


<a href="http://d.hatena.ne.jp/DianthuDia/20081114/p1">イヤホンの巻き方 - <b>dia</b><b></b><b>備忘録</b></a>

このように、何度検索してもhrefが固定になります。これで訪問済みかどうかがわかりやすくなりました。

その他

これだけだとwrs.search.yahoo.co.jpに対して、リクエストが行きません。それについての解説は、技術よりになるので、本日の別記事をご参考ください。

注意

このスクリプトでの検索では、Yahoo! Japanが提供するフィッシングサイトの検知機能を利用できないと思います。その点を注意して使用してください。また、このスクリプトを使うことによる一切の責任を負うことはできませんので、自己責任でお願いします。

*1:現状では、検索後少しスクロールする必要あり

Windows XP ModeをVMware Playerで使う

Windows 7 Professional、Ultimate および EnterpriseではWindows XPがタダで使えます。普通はVirtual PCで使う形になりますが、人によっては様々な理由によりVMware Playerで使いたい人もいるでしょう。それを実現しようとすると、ちょっと躓く箇所があったので、手順をまとめてみることにします。

  1. Windows XP Modeだけをインストール
  2. VMware Player 3をインストール
  3. VMware Player 3を起動して、「ファイル」メニューから「Windows XP モード仮想マシンのインポート」をクリック
  4. 生成された仮想マシンの設定を変更する(例えば、コチラのような性能向上の設定など)
    • ただし、VCPU数は1のままにすること!
  5. 仮想マシンを実行し、ウィザードに従って、初期設定を済ませます
    • マウスが使えないので、キーボードで設定する事
  6. 初期設定が終わったら、「コントロールパネル」の「プログラムの追加と削除」から「Virtual PC 統合 ツール」の削除を行う
  7. 再起動する
    • この時点でマウスが使えるようになる
  8. VMware Tools をインストールし再起動する
  9. id:naba_san:20091102 さんのやり方でマルチプロセッサと認識させる
  10. 仮想マシンの設定から、VCPU数を好きな数に変更する


まとめると、

  • 最初、マウスが使えないが動じるな!
  • VCPUは最後まで弄るな!

ということです。

就職活動で役立ったもの(IT学生編)

最近、就職活動を終えました。就職活動にこれは役立った!というものをIT学生なりにまとめてみます。

iPhone

お役立ち度: ★★★

巷でも「就活には是非iPhone!」みたいな文句をよくみました。実際、私もiPhoneにはかなりお世話なりました。ざざっと列挙してみると、

  • 地図が確認できる。3GSならそれなりの精度で方位も確認でき、初めての土地でも目的地にたどり着ける。
  • Google DocsにESや履歴書、企業研究をまとめてあったので面接前にいつでも確認できる。
  • Google Calenderにスケジュールが一元管理されているので、予定がかぶる事がない。
  • マクドナルドにいけば、高速通信で調べ物(企業情報など)ができる。
  • 最寄り駅を自動認識して乗り換えを案内してくれるアプリがある。
  • 新聞がよめる。
  • 暇つぶしのゲームやラジオがある。

などです。地図・メモ帳が必要なし、というのがありがたかったです。

外部バッテリーは必須です。上記のようにiPhoneに頼りっぱなしだと、いざ電池が切れた時に本当に何も出来なくなります。私は、乾電池を使用するタイプを使っていました。乾電池にはeneloopを使いました。

ビックカメラSuicaカード (View Suica カード)

お役立ち度: ★★

Suicaは首都圏で就活する人にはもはや必須だと思います。ですが、毎回チャージが面倒です。Suicaオートチャージできる仕組みがあり、それができるのがView Suica カードです。
View Suica カードはたくさん種類があるのですが、その中でもお勧めなのはビックカメラSuicaカードです。年会費は実質無料*1なのはビックカメラSuicaカードだけです。提携カード(Type II)も含めると他にもありますが、JRが管理しているカードと比べると特典が少なくなってしまいます。ですので、ビックカメラSuicaカード がいいかな、と思います。


ちなみに、ビックカメラSuicaカード は普通の買い物にでも、クレジットカードとしても使えますが、そこまでポイントが高くつきません。私はジャックス R-styleカードと使い分けています。JRで切符を買う時以外は、R-styleカードを使っています。

VAIO type P

お役立ち度: ★★

iPhoneを持っているとはいえ、PCでないと出来ないこともあります。私は、空き時間にマクドナルドに行って、研究室のマシンにログインをして研究をしていたりしました。

VAIO type Pとネットブックとの違いは、サイズがすごく小さいのでかばんにいれていても全然気にならない事です。ネットブックはA4サイズなので、結構かさばります。ただし、重さはネットブック並みなので腕が疲れるかもしれません。

SkypeOut

お役立ち度:

会社に電話する機会が多くなるなと思い、Skypeクレジットを買っていました。電話をするときにはSkypeOutを使っていました。1500円分買っていましたが、今は600円くらい残っています。

ただ思っていたほど、電話をすることがなく、あったとしても先方から折り返しお電話をもらうことが多かったため、そこまで使いませんでした。

また、携帯から電話するの料金を比較してもそこまで変わるわけではありません。

SoftBank
    ホワイトプラン     21.00円/30秒(1-21時までSoftBankへは無料)
    Wホワイトプラン    10.50円/30秒(1-21時までSoftBankへは無料)
    シンプルオレンジS  15.75円/30秒

Skype
    固定電話へ       約 2.66円/分
    携帯/IPへ        約17.50円/分
    ※接続の度に9.9円の接続料がかかる
    ※クレジット有効期間は使用後180日間
    ※番号は非通知

※ 料金は各自で確認して下さい

何よりSkypeOutで一番困ったのが、通話開始十秒くらいがどうも品質が悪いみたいです。つまり、名乗っている時に品質が悪いので、何度も自分の名前をいうことになりました。3,4回に1回くらいの頻度で品質が悪い状況が発生していた気がします。

Edy

お役立ち度:

就活ではコンビニを利用する事が多かったため、電子マネーは重宝しました。Edyはどこのコンビニでも使えるので便利でした。ただ、私はiPhoneしかもっていないので、カード型のEdyを使っています。カード型はチャージが面倒なのが難点です。チャージ方法がレジかパソリくらいしかありません。なので、Suicaが使えるところではSuicaで支払っていました。Edyでもオートチャージできないかなぁ。。。


こんな感じです。IT学生ならではのアドバイスになっていれば幸いです。

*1:年1回の支払いが必要

RMagickでメモリリークが発生する

なぜメモリリークが発生するのか

そもそも、RubyにはGCがあるので自然に開放されるはずです。しかし、実際にはそうなっていません。これには下記のような理由があります。

RMagickはImageMagickのobj(mallocで確保した)を扱っていて、これはRubyのobjではありません。そのため、GCの対象にならず、メモリリークの危険性をはらむ事になります。

続きを読む

PythonでCPUを遊ばせたくない!

g:subtech:id:mala:20090920:1253447692にて、すばらしいスレッド関係のまとめが記載されていました。ちょうど、今取り組んでいる研究に必要なことなのでなんてタイムリーなんだ!と思いました。GJ!

さて、その中で気になったのがPythonでGILを無くす(回避する?)仕組みといういうところ。研究で使うため、PythonでCPUを遊ばせないようにするにはどうするのかということを調べていました。私が調べた限りでは、ちょっと前まではParallel Python、最近は2.6以降から導入されたmultiprocessingを使う、と認識しています。CPUを遊ばせたくない場合は、皆様はどのようにしているのでしょうか*1

ちなみに私は、multiprocessingを使っています。用途が並列処理なので主にPoolを使っています。下記に私が検討に使ったサンプルを記載します。Poolを使ってみようという方の参考になれば幸いです。

*1:Rubyは最近手をつけていないけど、Rubyではどうやれるのかなぁ。後で調べてみよう

続きを読む

ポルト留学 2日目(移動日2日目)

ポルト留学自体についてはコチラを参照

概要

本日は移動日2日目です。CDG空港から、入国審査と乗り換え手続きを行います。そして、飛行機に乗ってポルトに行き、寮につくまでを書き記します。

パリ --(TAP Portugal)--> ポルト
出発: 8/17, 1:55 PM CEST
到着: 8/17, 3:15 PM WEST
※パリでは9時間の待ち時間

続きを読む