SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

「Web AI」ライブラリの使い方と内部仕様
- Web上のデータからJavaScriptだけで人工無脳を作成

ダウンロード sample.zip (16.7 KB)

クエリー圧縮によるデータの保存

 次は、URLクエリーの解析と構築、圧縮と解凍を行う「crocro.webAi.Tools.js」の解説を行います。まずはサンプルコードを見てください。

クエリー圧縮のサンプル
クエリー圧縮のサンプル
JavaScriptのソース:クエリーの操作
/*
 *------------------------------
 * 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の半角長ほどには短くなりません。しかし、ユニコードバイト長とほぼ変わらない程度まで、文字列の長さを圧縮できます。この仕組みを利用することで、かなり短く日本語文章を格納できます。

次のページ
日本語処理

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

柳井 政和(ヤナイ マサカズ)

クロノス・クラウン合同会社 代表社員http://crocro.com/オンラインソフトを多数公開。プログラムを書いたり、ゲームを作ったり、記事を執筆したり、マンガを描いたり、小説を書いたりしています。「めもりーくりーなー」でオンラインソフト大賞に入賞。最近は、小説家デビューして小説も書いています(『裏切りのプログラム』他)。面白いことなら何でもOKのさすらいの企画屋です。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5567 2010/11/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー