SHOEISHA iD

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

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

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

特集記事

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

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

命令の挿入

 srch()メソッドなどで登録した命令は、上から1つずつ順番に処理されます。その際、検索結果によっては処理を分岐させたい場合もあるでしょう。「Web AI」は、そういった「実行中の処理の分岐」を実現する仕組みを持っています。

 WebSrchでは、命令の実行中にinsrtOn()insrtOff()メソッドを使うことで、現在の処理の直後に新たな命令を追加していくことができます。

 これは、説明するよりも実際のコードを見てもらった方が早いと思います。以下、命令の挿入のサンプルを掲載します。

JavaScriptのソース:命令の挿入のサンプル
// flickr URL
var flickrUrl = "http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?"
// 変数の初期化
var kwArr  = ["cat", "dog"];      // キーワード配列
var cntArr = {cat : 0, dog : 0};  // 検索数を格納する連想配列
/*
 *------------------------------
 * 検索のメソッド・チェーン処理
 *------------------------------
 */
cWSrch
.reset()        // 命令格納のリセット
.srch({
  type : "web",
  loop : 2,     // ループ回数
  key : function() {return kwArr[cWSrch.loopCnt]},   // 検索キーワード
  res : function(res, cursor) {
    if (cursor) {
      var kw = kwArr[cWSrch.loopCnt];             // キーワード
      cntArr[kw] = cursor.estimatedResultCount;   // インデックス数の格納
      $("#res").append("<div>" + kw + " : " + cntArr[kw] +  "</div>");
    }
  }
})
.add(function() {
  /*
   *------------------------------
   * 分岐処理
   *------------------------------
   */
  if (cntArr.dog > cntArr.cat) {
    /*
     *------------------------------
     * dog が多い場合
     *------------------------------
     */
    $("#res").append("<div>Peoples like dogs!</div>");
    /*
     *------------------------------
     * 新たな命令を実行途中で挿入
     *------------------------------
     */
    cWSrch
    .insrtOn()      // ★挿入開始★
    .addCallback({
      // コールバック処理を追加
      exec: function() {
        $.getJSON(
          flickrUrl,
          {tags : "dog", format : "json"},
          function(json){
            $("#res").append("<div>flickr's dogs</div>");
            for (var i = 0; i < json.items.length; i ++) {
              var item = json.items[i];
              $("<img/>")
              .attr("src", item.media.m)
              .appendTo("#data");
            }
          cWSrch.endCallback();   // コールバックの終了を通知
          }
        )
      }
    })
    .add(function() {
      // 検索終了
      $("#res").append("<div>end : search dogs.</div>");
    })
    .insrtOff();    // ★挿入終了★
  } else {
    /*
     *------------------------------
     * cat が多い場合
     *------------------------------
     */
    $("#res").append("<div>Peoples like cats!</div>");
    $("#res").append("<div>I don't serach cats (T_T</div>");
  }
})
.add(function() {
  // 全体の終了処理
  $("#res").append("<div>end : exec cmnds.</div>");
  drwLoadAnm(false);      // ロードアニメ描画
})
.start();  // 実行開始
メソッドチェーンの挿入のサンプル
メソッドチェーンの挿入のサンプル

 検索結果によって処理を分岐させたあと、insrtOn()insrtOff()を使って、実行中に命令を挿入しています。上記のプログラムでは、「dog」のインデックス数が、「cat」のインデックス数より多い場合には、flickrで犬の画像を検索して表示するようにしています。

 「Web AI」では、こういった「非同期処理のメソッドチェーン化」と「命令実行中に新規命令を挿入可能な仕組み」を備えています。そのため、人間が検索結果に応じて「考えながら検索する」ような処理を、プログラムとして簡潔に記述できます。

次のページ
検索のメソッドチェーン化の仕組み

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

特集記事連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

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

イベント

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

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

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

メールバックナンバー