タグ

ブックマーク / reinyannyan.hatenadiary.org (7)

  • 気まぐれな配列 push - (new Hatena).blog()

    データを配列に追加する時に、わざと「漏れ」を生じさせる、ということを考えてみました。 function push_or_not(ary, v) { (Math.random() <= 0.5) && ary.push(v); }およそ半分の確率で漏れます。 さらに漏れ具合をランダムにしてみましょう: function push_or_not2(ary) { // カリー化 var x = Math.random(); return function(v) { (Math.random() <= x) && ary.push(v); }; }大量のデータから適当にピックアップしたい、とか、取得漏れが生じても構わない、といった場合に使えるんじゃないかと思います。 例 1 (with Mochikit): var ary = []; forEach( large_list, push_or_no

    気まぐれな配列 push - (new Hatena).blog()
  • 配列の AND、非同期な AND 検索 - (new Hatena).blog()

    配列の積集合・和集合 ちょっと用があって、複数の配列の共通要素を取り出す関数を作ってみました。Mochikit を使っています。 function intersection() { var len = arguments.length; var tmp = {}; return filter( function(x) { tmp[x] || (tmp[x] = 0); return (++tmp[x] == len); }, chain.apply(null, arguments) ); }配列のイテレーションと同時に要素の出現回数を数えていき、全ての配列で出現しているものを抜き出します (各配列内での要素の重複は考慮に入れていません)。 このように、3 つ以上の配列でも簡単に AND を取ることが出来ます: intersection( [1,3,6,8,9], [2,4,6,8], [6

    配列の AND、非同期な AND 検索 - (new Hatena).blog()
  • 主語を入れ替えるか目的語を入れ替えるか - (new Hatena).blog()

    ちょっとしたスクリプトで、"+foo" という文字列を "OKs" という配列に、"-bar" という文字列を "NGs" という配列に入れる、という必要が生じました。 var OKs = [], NGs = []; "+foo -bar +baz ...".replace(/([-+])(\S+)/g, function(_, pm, value) { if (pm == "+") OKs.push(value); else NGs.push(value); });こういうのは出来れば一行で書きたいですよね? ということで幾つかバリエーションを考えてみました。 ふつうの三項演算: pm == "+" ? OKs.push(value) : NGs.push(value)push(value) が共通の操作であることに気付きます。こんな場合は: (pm == "+" ? OKs : NGs

    主語を入れ替えるか目的語を入れ替えるか - (new Hatena).blog()
  • (new Hatena).blog() - Mochikit で非同期な処理を逐次実行

    hail2u.net - JSONPに同期リクエスト snippets from shinichitomita’s journal - 非同期処理をシーケンシャルに扱うために を読んで、以前 prototype.js ベースでメソッドを逐次実行する仕組みを作ったのを思い出しました (id:reinyannyan:20060223:p1, id:reinyannyan:20060227:p1)。 コマンド・パターンを利用して、コマンドを、それを管理するオブジェクト (センター、マネジャー) に預けることで、簡単に大量の逐次処理が出来るようにしたものです。 例えば var x = new XMLHTTP; large_url_list.each(function(url) { x.get(url, callback); });のような、一度に大量の HTTP リクエストをする様なケースで、呼び

    (new Hatena).blog() - Mochikit で非同期な処理を逐次実行
  • livedoor clip の JSONP API からタグ・クラウドを生成するデモ - (new Hatena).blog()

    id:secondlife さんの AsyncJSONP (参照: MochiKit で JSONP の利用) を使って、MochiKit の勉強がてら作ってみました。 livedoor clip の JSONP API を利用してタグ・クラウドを生成する、というものです。最近どんなキーワードの話題が注目されているかが分かると思います: MochiKit を使ったのは実は今回が始めてなんですが、(昨今の脳トレブームにも通ずるような) 頭脳を刺激されるような感じがして、とても楽しいです。 OO 言語等との語順の違いとか、高階関数の利用が必然的に求められる点など、個人的に普段使わない頭の使い方をさせられるためなんでしょうね。 とりわけイテレータ関数の利用において、できるだけ中間の変数を作らず関数の組み合わせだけで処理する、というあたりが頭の使いどころになってくるようです。 例: // ふつうの

    livedoor clip の JSONP API からタグ・クラウドを生成するデモ - (new Hatena).blog()
  • escapeHTML の実装 3 パターン (ベンチマーク付き) - (new Hatena).blog()

    ウェブを扱うライブラリやプログラムで必ずと言って良いほど見かけるものに、escapeHTML という関数があります。 "&" 等、特別な意味を持つ文字を、表示等のために実体参照 (&amp;) に変換するお決まりの関数なんですが、実装には色々とバリエーションがあるものです。 1. String#replace メソッドを繰り返す (MochiKit 等) function escapeHTML(str) { return str.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); }このパターンが最も多く見受けられます。Ruby でも同様に gsub を繰り返す方式を見かけることがあります (例: RSS::Utils.html_escape)。 2. Str

    escapeHTML の実装 3 パターン (ベンチマーク付き) - (new Hatena).blog()
  • (new Hatena).blog() - DOM 要素の集合のイテレーション

    Update: id:reinyannyan:20060411:p1 に続きます getElementsByTagName の様なメソッドで得られた、配列ではない要素集合を配列のように扱いたい時に、prototype.js では "$A" という関数によってまず配列化する、という方法を用います。 これは非常に素晴らしい、便利な方法なんですが、集合の規模が大きくなると、それだけ配列化によるオーバーヘッドも大きなものになってしまいます。 そこで、仮にこのようなものを作ってみました。 // DOM Iterator var Domi = { each: function (collection, yield) { for (var i = 0; i < collection.length; i++) yield(collection[i]); } };べつに配列が欲しいわけじゃない、単純に ea

    (new Hatena).blog() - DOM 要素の集合のイテレーション
  • 1