クエリー圧縮によるデータの保存
次は、URLクエリーの解析と構築、圧縮と解凍を行う「crocro.webAi.Tools.js」の解説を行います。まずはサンプルコードを見てください。
/*
*------------------------------
* Googleからスクリプトをロード
*------------------------------
*/
google.load("search", "1");
google.load("feeds", "1");
google.load("jquery", "1.4.3");
/**
*------------------------------
* @title テスト
* @description
* ボタンを押した場合の処理。
*------------------------------
*/
function test() {
/*
*------------------------------
* 変数の初期化
*------------------------------
*/
var $WA = crocro.webAi; // 短縮表記
var cQ = new $WA.Query(); // クエリー
/*
* 元文字列の長さを求める
*/
var srcStr1 = $("#srcStr1").val();
var srcStr2 = $("#srcStr2").val();
$("#srcHanLen").html(getHanLen(srcStr1 + srcStr2));
$("#srcLen").html(getBytLen(srcStr1 + srcStr2));
/*
*------------------------------
* URLの作成
*------------------------------
*/
cQ.prsFrmUrl({url: "http://www.google.com/"});
//cQ.prsFrmLocation(); // 現在のURLをパースさせる場合
cQ.set("srcStr1", srcStr1); // 値の書き込み
cQ.set("srcStr2", srcStr2); // 値の書き込み
/*
*------------------------------
* 通常URL
*------------------------------
*/
var urlNrml = cQ.getUrl(); // 通常URLを取得
$("#urlNrml").val(urlNrml);
$("#urlNrmlLen").html(urlNrml.length);
/*
*------------------------------
* 圧縮URL
*------------------------------
*/
var urlCmprs = cQ.getCmprsUrl(); // 圧縮URLを取得
$("#urlCmprs").val(urlCmprs);
$("#urlCmprsLen").html(urlCmprs.length);
/*
*------------------------------
* 圧縮URLの復元
*------------------------------
*/
var cQR = new $WA.Query(); // クエリー
cQR.prsFrmUrl({url: urlCmprs}); // 圧縮URLをパース(自動解凍)
var strDcmprs1 = cQR.get("srcStr1"); // 値の取得
var strDcmprs2 = cQR.get("srcStr2"); // 値の取得
$("#urlDcmprs1").val(strDcmprs1);
$("#urlDcmprs2").val(strDcmprs2);
$("#urlDcmprsLen").html(getHanLen(strDcmprs1 + strDcmprs2));
}
/**
* @title 【半角長取得】
* @description
* 文字列の半角での長さを取得。
*/
function getHanLen(s) {
var resN = 0;
for (var i = 0; i < s.length; i ++) {
resN += (encodeURIComponent(s.charAt(i)).length > 3) ? 2 : 1;
}
return resN;
}
/**
* @title 【バイト長取得】
* @description
* ユニコード文字列のバイトの長さを取得。
*/
function getBytLen(s) {
var resN = 0;
for (var i = 0; i < s.length; i ++) {
var enc = encodeURIComponent(s.charAt(i));
resN += (enc.length > 3) ? enc.length / 3 : 1;
}
return resN;
}
「crocro.webAi.Tools.js」には、いくつかのオブジェクトが収録されています。このうち、クエリーの操作に使うのはcrocro.webAi.Queryというオブジェクトです。
このQueryオブジェクトは、URLクエリーのパースを行ったり(prsFrmUrl())、その一部を取得したり(get())、書き換えたり(set())できます。
また、書き換えたURLを文字列として取得するgetUrl()メソッドや、データを圧縮したURLを取得するgetCmprsUrl()メソッドも備えています。この「圧縮したURL」は、通常のURLと同じようにパースさせれば、自動的に解凍されて内部のクエリーを利用できます。
Queryオブジェクトの「クエリー圧縮解凍機能」を利用すれば、ある程度長い日本語文字列でも、比較的短いURLに格納できます(Internet Explorerでは、2000文字程度のURLならば問題なく扱えます)。また、Queryオブジェクトは、location.hrefを自動でパースするメソッド(prsFrmLocation())も持っています。
これらの機能を組み合わせれば、CGIを使わなくても、リンクやブックマークといった形で、データをユーザーに保存させることができます。
具体的なやり方については、「Web AI」のサンプルである「Cigazine」や「迷言辞典」を見てもらうと分かりやすいです。
これらのWebアプリでは、ユーザーの操作の結果を固定URL内に格納して表示しています。次にそのURLにアクセスがあった場合は、クエリーを自動で展開して、Webページの表示を書き換えています。こうすることで、サーバーに一切のデータを保存することなく、個別の動作結果をユーザーに提供しています。
それでは以下、通常のエンコードと、Queryオブジェクトを使った圧縮URLで、どれぐらいURLの長さが変わるのか、サンプルを掲載しておきます(実際のデータには改行はありません)。
| 種類 | 文字列長 | 実際の文字列 |
| 元の文字列 1文章目 (srcStr1=) 2文章目 (srcStr2=) |
半角:308 ユニコードバイト:462 |
吾輩は猫である。名前はまだ無い。 どこで生れたかとんと見当がつか ぬ。何でも薄暗いじめじめした所 でニャーニャー泣いていた事だけ は記憶している。 吾輩はここで始めて人間というも のを見た。しかもあとで聞くとそ れは書生という人間中で一番獰悪 な種族であったそうだ。この書生 というのは時々我々を捕えて煮て 食うという話である。 |
| 通常のエンコード | 1426 | http://www.google.com/?srcStr1= %E5%90%BE%E8%BC%A9%E3%81%AF%E7 %8C%AB%E3%81%A7%E3%81%82%E3%82 %8B%E3%80%82%E5%90%8D%E5%89%8D %E3%81%AF%E3%81%BE%E3%81%A0%E7 %84%A1%E3%81%84%E3%80%82%E3%81 %A9%E3%81%93%E3%81%A7%E7%94%9F %E3%82%8C%E3%81%9F%E3%81%8B%E3 %81%A8%E3%82%93%E3%81%A8%E8%A6 %8B%E5%BD%93%E3%81%8C%E3%81%A4 %E3%81%8B%E3%81%AC%E3%80%82%E4 %BD%95%E3%81%A7%E3%82%82%E8%96 %84%E6%9A%97%E3%81%84%E3%81%98 %E3%82%81%E3%81%98%E3%82%81%E3 %81%97%E3%81%9F%E6%89%80%E3%81 %A7%E3%83%8B%E3%83%A3%E3%83%BC %E3%83%8B%E3%83%A3%E3%83%BC%E6 %B3%A3%E3%81%84%E3%81%A6%E3%81 %84%E3%81%9F%E4%BA%8B%E3%81%A0 %E3%81%91%E3%81%AF%E8%A8%98%E6 %86%B6%E3%81%97%E3%81%A6%E3%81 %84%E3%82%8B%E3%80%82&srcStr2= %E5%90%BE%E8%BC%A9%E3%81%AF%E3 %81%93%E3%81%93%E3%81%A7%E5%A7 %8B%E3%82%81%E3%81%A6%E4%BA%BA %E9%96%93%E3%81%A8%E3%81%84%E3 %81%86%E3%82%82%E3%81%AE%E3%82 %92%E8%A6%8B%E3%81%9F%E3%80%82 %E3%81%97%E3%81%8B%E3%82%82%E3 %81%82%E3%81%A8%E3%81%A7%E8%81 %9E%E3%81%8F%E3%81%A8%E3%81%9D %E3%82%8C%E3%81%AF%E6%9B%B8%E7 %94%9F%E3%81%A8%E3%81%84%E3%81 %86%E4%BA%BA%E9%96%93%E4%B8%AD %E3%81%A7%E4%B8%80%E7%95%AA%E7 %8D%B0%E6%82%AA%E3%81%AA%E7%A8 %AE%E6%97%8F%E3%81%A7%E3%81%82 %E3%81%A3%E3%81%9F%E3%81%9D%E3 %81%86%E3%81%A0%E3%80%82%E3%81 %93%E3%81%AE%E6%9B%B8%E7%94%9F %E3%81%A8%E3%81%84%E3%81%86%E3 %81%AE%E3%81%AF%E6%99%82%E3%80 %85%E6%88%91%E3%80%85%E3%82%92 %E6%8D%95%E3%81%88%E3%81%A6%E7 %85%AE%E3%81%A6%E9%A3%9F%E3%81 %86%E3%81%A8%E3%81%84%E3%81%86 %E8%A9%B1%E3%81%A7%E3%81%82%E3 %82%8B%E3%80%82 |
| 圧縮URL | 476 | http://www.google.com/?_cmp=AA AKVHPkjJlCR06MHuUg+ULHK9W4QK/O MVrl8JRDQeMELRoHSBDCRuUSNXL4yq Evh6DOEQrlkNDGi4EaBppE8RylTxgZ ObwZSGMgVBhn+kRnalG5XkFzBiLlsC crl+R6VaKIURA6S4TMabrE0iEmjIG6 fnW4NdAnc4kATR2kcdCocYN4vWXrFq 65WW4DtQxkimtZcrp6gnIYaSQ6VJjM GbI11iHfvBg1cjQBUCBBGQcTLoxJUq bDoKfKndIoCOzev7rSWQr683EgQ1Qd usIoaWjPmxwZ84Qd6CXrU+gCeXL4yC HrTjhHmtuEq+ZO1noNnU49iRyuVhSr AzpXSdW5RrDMCVLlsDsqV+YuEQ9Ukb dDvDuPuz7p0nNs5cxtFu/7OpDsh+Zk chEghZiDCGEDzmZOI1IFgkhj5xTiny npjLITf885ZAg6qcQyVXsZuQQ_ |
圧縮URLは、内部的にユニコード形式でデータを持っています。そのため、Shift-JISやEUCの半角長ほどには短くなりません。しかし、ユニコードバイト長とほぼ変わらない程度まで、文字列の長さを圧縮できます。この仕組みを利用することで、かなり短く日本語文章を格納できます。

