<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xml:lang="ja">
	<channel>
		<title>JavaScriptで遊ぶよ</title>
		<link>http://javascript.g.hatena.ne.jp/edvakf/</link>
		<description>JavaScriptで遊ぶよ</description>
		<dc:creator>edvakf</dc:creator>


		<item>
			<title>typeof arguments === ?</title>
			<link>http://javascript.g.hatena.ne.jp/edvakf/20100209/1265732770</link>

			<description><![CDATA[
		<div class="section">
			<blockquote title="%22Javascript quiz %22 解答と解説 - リタマス" cite="http://d.hatena.ne.jp/mooz/20100209/p1">
			<p>ちなみに <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> 5 だと <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/typeof">typeof</a> arguments === ”arguments” となるらしい. ややこしい.</p>
			<cite><a href="http://d.hatena.ne.jp/mooz/20100209/p1" target="_blank">%22Javascript quiz %22 解答と解説 - リタマス</a></cite></blockquote>
			<p>↑と僕の発言にリンクされてて、あやふやなことを言うべきじゃなかったと反省。反省の意味を込めて調べてみました。</p>			<br>

			<p><a href="http://www.ecmascript.org/docs.php" target="_blank">ECMAScript5 の仕様</a>の60ページ目を見ると、arguments <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88">オブジェクト</a>を作るアルゴリズムのところに</p>
			<blockquote>
			<p>4.	Set the <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Class">Class</a> internal <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/property">property</a> of obj to "Arguments".</p>
			</blockquote>
			<p>と書いてあります。</p>
			<p>このことから僕は <code><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/typeof">typeof</a> arguments === ”arguments”</code> になるのだと思っていました。</p>			<br>

			<p>次に71ページの <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/typeof">typeof</a> 演算子のところを見ます。(注、[ ← を二つ重ねるとはてな記法でおかしなことになっちゃうので間を空けて書いてます)</p>
			<blockquote>

			<table>
				<tr><th>Type of val</th><th>Result</th></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Undefined">Undefined</a></td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/undefined">undefined</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Null">Null</a></td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Boolean">Boolean</a></td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/boolean">boolean</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Number">Number</a></td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/number">number</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/String">String</a></td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/string">string</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Object">Object</a> (<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> and does not implement [ [Call] ])</td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Object">Object</a> (<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> or host and does implement [ [Call] ])</td><td>"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/function">function</a>"</td></tr>
				<tr><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Object">Object</a> (host and does not implement [ [Call] ])</td><td><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Implementation">Implementation</a>-defined except may not be "<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/undefined">undefined</a>", "<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/boolean">boolean</a>", "<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/number">number</a>", or "<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/string">string</a>"</td></tr>
			</table>
			</blockquote>
			<p>これを見ると、arguments は [ [Call] ] 内部<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/%e3%83%a1%e3%82%bd%e3%83%83%e3%83%89">メソッド</a>を持たないので、"<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Object">Object</a> (<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> and does not implement [ [Call] ])" か "<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Object">Object</a> (host and does not implement [ [Call] ])" のどちらかということになります。</p>
			<p>後者の場合は <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Implementation">Implementation</a>-defined なので、arguments もありかもしれません。</p>			<br>

			<p>次に、仕様の5ページを見ると、<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> とか host <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> について書いてあります。そのあたりを引用します。</p>
			<blockquote>
			<h4>4.3.6</h4>
			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> </h5>
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> an <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/implementation">implementation</a> whose semantics are fully defined by <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/this">this</a> specification rather than by the host environment.</p>
			<p><strong>NOTE	Standard <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> objects are defined <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/this">this</a> specification. Some <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> objects are built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a>; others may be constructed during the course of execution of an <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> program.</strong></p>
			<h4>4.3.7 </h4>
			<h5>built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> </h5>
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> supplied by an <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/implementation">implementation</a>, independent of the host environment, that is present at the start of the execution of an <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> program.</p>
			<p><strong>NOTE	Standard built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> objects are defined <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/this">this</a> specification, and an <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/implementation">implementation</a> may specify and define others. Every built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> is a <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a>. A built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> constructor is a built-<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> that is also a constructor.</strong></p>
			<h4>4.3.8 </h4>
			<h5>host <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> </h5>
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> supplied by the host environment to complete the execution environment of <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/ECMAScript">ECMAScript</a>.</p>
			<p><strong>NOTE	Any <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> that is not <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> is a host <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a>.</strong></p>
			</blockquote>
			<p>どうやら arguments は <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/native">native</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a> のようです。(仕様の中に章があって挙動が定義されているから)</p>			<br>

			<p>というわけで、ECMAScript5 でも <code><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/typeof">typeof</a> arguments === '<a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/object">object</a>'</code> になるっぽいです。</p>
			<p>適当なこと言ってごめんなさい。</p>			<br>

			<p>(もちろん上に書いた推測が間違ってる可能性もありますが)</p>
		</div>
]]></description>

			<dc:creator>edvakf</dc:creator>

			<pubDate>Tue, 09 Feb 2010 16:26:10 GMT</pubDate>



		</item>

		<item>
			<title>DOM Mutation Events は非同期にして使おう</title>
			<link>http://javascript.g.hatena.ne.jp/edvakf/20100204/1265312155</link>

			<description><![CDATA[
		<div class="section">
			<p>知ってる人にとってはどうってことない基本的なこと。</p>			<br>

			<p><a href="http://javascript.g.hatena.ne.jp/edvakf/20100204/1265312154" target="_blank">DOM 3 Events で deprecated 扱いになった</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> Mutations Events だけど、まだ代替品は無いわけで、これを使わざるをえない。</p>
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> Mutation Events は同期的なイベントなので、うまく使わないと全体の動作がモッサリしてしまうのが難点。</p>
			<p>つまり、ループで <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> ツリーを弄るようなスクリプトだと、ループ中に毎回呼ばれて大変なことになる。</p>
			<p>特に同期的動作が必要でない場合は setTimeout を入れてしまったほうがいい。</p>
<pre class="syntax-highlight">
<span class="synComment">// イベントリスナーを付ける</span>
<span class="synStatement">document</span>.addEventListener(<span class="synConstant">'DOMNodeInserted'</span>, nodeInsertedHandler, <span class="synConstant">false</span>);

<span class="synIdentifier">function</span> nodeInsertedHandler() <span class="synIdentifier">{</span>
  <span class="synComment">// ハンドラー内でイベントリスナーを削除する</span>
  <span class="synStatement">document</span>.removeEventListener(<span class="synConstant">'DOMNodeInserted'</span>, nodeInsertedHandler, <span class="synConstant">false</span>);

  setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> <span class="synComment">// 内容は別イベントに分ける</span>
    <span class="synComment">/* 処理 */</span>

    <span class="synComment">// イベントリスナーを復活させる</span>
    <span class="synStatement">document</span>.addEventListener(<span class="synConstant">'DOMNodeInserted'</span>, nodeInsertedHandler, <span class="synConstant">false</span>);
  <span class="synIdentifier">}</span>, 10);
<span class="synIdentifier">}</span>
</pre>

			<p>これだと何回ループが回っても DOMNodeInserted は最初に1回出るだけ。しかも同期処理中でやってることは setTimeout を置くだけなのであまり重くならない。</p>
			<p>もし挿入された要素が使いたいときは適当なスタックを用意。</p>
<pre class="syntax-highlight">
<span class="synStatement">document</span>.addEventListener(<span class="synConstant">'DOMNodeInserted'</span>, nodeInsertedHandler, <span class="synConstant">false</span>);

<span class="synIdentifier">var</span> timer = <span class="synStatement">null</span>;
<span class="synIdentifier">var</span> nodes = <span class="synIdentifier">[]</span>;
<span class="synIdentifier">function</span> nodeInsertedHandler(e) <span class="synIdentifier">{</span>
  nodes.push(e.target);

  <span class="synStatement">if</span> (!timer) <span class="synIdentifier">{</span>
    timer = setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
      <span class="synComment">/* 処理 */</span>
      nodes = <span class="synIdentifier">[]</span>; <span class="synComment">// スタック初期化</span>
      timer = <span class="synStatement">null</span>; <span class="synComment">// タイマーを初期化</span>
    <span class="synIdentifier">}</span>, 50);
  <span class="synIdentifier">}</span>
<span class="synIdentifier">}</span>
</pre>

			<p>または</p>
<pre class="syntax-highlight">
<span class="synStatement">document</span>.addEventListener(<span class="synConstant">'DOMNodeInserted'</span>, nodeInsertedHandler, <span class="synConstant">false</span>);

<span class="synIdentifier">var</span> timer;
<span class="synIdentifier">var</span> nodes = <span class="synIdentifier">[]</span>;
<span class="synIdentifier">function</span> nodeInsertedHandler(e) <span class="synIdentifier">{</span>
  nodes.push(e.target);

  clearTimeout(timer);
  timer = setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
    <span class="synComment">/* 処理 */</span>
    nodes = <span class="synIdentifier">[]</span>;
  <span class="synIdentifier">}</span>, 50);
<span class="synIdentifier">}</span>
</pre>

			<p>後者の場合は、例えば連続してイベントが発生 (キーを押しっぱなしにしたりとか、マウスを動かすなど) してノードを追加するときに、最後のイベントが終わってから 50ms 時間が空けば処理を実行する。debouncing と呼ぶらしい。前者だと、イベントが連続して発生すると、途中に割り込んで処理を実行する。どちらが良いかはその時の状況で使い分けたらいい。</p>
		</div>
]]></description>

			<dc:creator>edvakf</dc:creator>

			<pubDate>Thu, 04 Feb 2010 19:35:55 GMT</pubDate>



		</item>

		<item>
			<title>■</title>
			<link>http://javascript.g.hatena.ne.jp/edvakf/20100204/1265312154</link>

			<description><![CDATA[
		<div class="section">
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> Mutation 系のイベントは <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> 3 Events では deprecated となった。(だいぶ前の話だけど)</p>
			<blockquote title="Document Object Model (DOM) Level 3 Events Specification" cite="http://dev.w3.org//2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mutationevents">
			<p>Warning!  The MutationEvent <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/interface">interface</a> was introduced <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> Level 2 Events, but has not yet been completely and interoperably implemented across user agents.  <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/In">In</a> addition, there have been critiques that the <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/interface">interface</a>, as designed, introduces a performance and <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/implementation">implementation</a> challenge.  A <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/new">new</a> specification is under development <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/with">with</a> the aim of addressing the use cases that mutation events solves, but <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/in">in</a> more performant manner.  Thus, <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/this">this</a> specification describes mutation events <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/for">for</a> reference and completeness of legacy behavior, but deprecates the use of both the MutationEvent <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/interface">interface</a> and the MutationNameEvent <a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/interface">interface</a>.</p>
			<cite><a href="http://dev.w3.org//2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mutationevents" target="_blank">Document Object Model (DOM) Level 3 Events Specification</a></cite></blockquote>
			<p>DOMMutation の代わりとして watchSelector (CSS セレクターを使うもの) と watchCharacterData (テキストノード用) というのが考えられているらしい。</p>
			<ul>
				<li><a href="http://www.w3.org/2008/webapps/wiki/Selector-based_Mutation_Events_v2_(needs_a_better_name)" target="_blank">Selector-based Mutation Events v2 (needs a better name) - WEBAPPS</a></li>
			</ul>
			<p>IE の behavior: expression みたいな感じ。</p>
			<p>こちらは非同期なので、Mutation Events の使用ケースを完全に置き換えることはできない。(まあ元々 Mutation Events が同期だったのがパフォーマンス的によくないということだったので)</p>
			<p>上のページの下のほうにある、Replacing Traditional Mutation Events というところを見ると感じがつかめると思う。</p>			<br>

			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/DOM">DOM</a> 4 Events を目指してるとか前に読んだので、しばらくは DOMMutation が使われると思う。</p>
			<p>今まで listen だったところに watch というのがなんともアレだけど。</p>			<br>

			<p>その他、最近になって DOMActivate と DOMFocusIn と DOMFocusOut も deprecated となった。(<a href="http://lists.w3.org/Archives/Public/public-hypertext-cg/2010JanMar/0001.html" target="_blank">理由はこのへん</a>)</p>
			<blockquote title="XForms and Deprecating DOM* Events in DOM3 Events from Doug Schepers on 2010-02-01 (public-forms@w3.org from February 2010)" cite="http://lists.w3.org/Archives/Public/public-forms/2010Feb/0000.html">
<pre>
I previously mentioned to you that the DOMActivate, DOMFocusIn, and 
DOMFocusOut were being considered for deprecation in DOM3 Events.  After 
looking into the matter closely and talking with various invested 
parties, I&#39;ve now deprecated them in current drafts of the spec &#91;1]. 
I&#39;ve explained some of the rationale for this in the HCG &#91;2].
</pre>

			<cite><a href="http://lists.w3.org/Archives/Public/public-forms/2010Feb/0000.html" target="_blank">XForms and Deprecating DOM* Events in DOM3 Events from Doug Schepers on 2010-02-01 (public-forms@w3.org from February 2010)</a></cite></blockquote>
			<p>それだけ。</p>
		</div>
]]></description>

			<dc:creator>edvakf</dc:creator>

			<pubDate>Thu, 04 Feb 2010 19:35:54 GMT</pubDate>



		</item>

		<item>
			<title>Worker初期化の時間、通信時間</title>
			<link>http://javascript.g.hatena.ne.jp/edvakf/20100129/1264749135</link>

			<description><![CDATA[
		<div class="section">
			<p>てきとうなベンチ。</p>
			<ul>
				<li>メインページ</li>
			</ul>
<pre class="syntax-highlight">
<span class="synIdentifier">var</span> N = 20;
<span class="synIdentifier">var</span> workers = <span class="synIdentifier">[]</span>;

setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
	<span class="synStatement">for</span> (<span class="synIdentifier">var</span> i = 0; i &lt; N; i++) (<span class="synIdentifier">function</span>(i) <span class="synIdentifier">{</span>
		<span class="synIdentifier">var</span> w = <span class="synStatement">new</span> Worker(<span class="synConstant">'answer.js'</span>);
		w.start = <span class="synType">Date</span>.now();
		w.onmessage = <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> w.duration = <span class="synType">Date</span>.now() - w.start <span class="synIdentifier">}</span>;
		workers.push(w);
	<span class="synIdentifier">}</span>)(i);
<span class="synIdentifier">}</span>, 1000);

setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
	console.log(workers.map(<span class="synIdentifier">function</span>(w) <span class="synIdentifier">{</span><span class="synStatement">return</span> w.duration<span class="synIdentifier">}</span>));

	workers.forEach(<span class="synIdentifier">function</span>(w) <span class="synIdentifier">{</span>
		w.start = <span class="synType">Date</span>.now();
		w.postMessage(<span class="synConstant">''</span>);
		w.onmessage = <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span> w.duration = <span class="synType">Date</span>.now() - w.start <span class="synIdentifier">}</span>;
	<span class="synIdentifier">}</span>);
<span class="synIdentifier">}</span>, 3000);

setTimeout(<span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
	console.log(workers.map(<span class="synIdentifier">function</span>(w) <span class="synIdentifier">{</span><span class="synStatement">return</span> w.duration<span class="synIdentifier">}</span>));
<span class="synIdentifier">}</span>, 4000);
</pre>

			<ul>
				<li>answer.js</li>
			</ul>
<pre class="syntax-highlight">
postMessage(<span class="synType">Date</span>.now()+<span class="synConstant">''</span>); <span class="synComment">// 最初にロードしたときに返事</span>

onmessage = <span class="synIdentifier">function</span>() <span class="synIdentifier">{</span>
	postMessage(<span class="synType">Date</span>.now()+<span class="synConstant">''</span>); <span class="synComment">// メッセージが遅られたときに返事</span>
<span class="synIdentifier">}</span>
</pre>

			<p>以下、特に言及のないときは Worker Script がブラウザのキャッシュにあるときの数字。</p>			<br>

			<h4>N = 1 のとき</h4>
			<p><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a> と Safari では最初のレスポンスが3ms、次 (Worker がロードしてから十分時間をおいた後) のレスポンスが3msぐらい。(ただし answer.js がキャッシュされてないときは最初のレスポンスが30msぐらい)</p>
			<p>Chromium (昨日の時点での最新版) では 最初のレスポンスが100msぐらいで次は3msぐらい。</p>			<br>

			<h4>N = 5 のとき</h4>
			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a> (Worker がキャッシュにないとき)</h5>
<pre>
&#91;346, 347, 346, 351, 351]
&#91;0, 1, 1, 46, 1]
</pre>

			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a> (Worker がキャッシュにあるとき)</h5>
<pre>
&#91;18, 18, 18, 20, 20]
&#91;6, 6, 5, 5, 5]
</pre>

			<h5>Safari (Worker がキャッシュにないとき)</h5>
<pre>
&#91;325, 499, 250, 212, 212]
&#91;325, 499, 250, 212, 212]
</pre>

			<p>↑1回目と2回目が同じなのはおかしい。測り方が悪かった。</p>
			<h5>Safari (Worker がキャッシュにあるとき)</h5>
<pre>
&#91;7, 5, 3, 5, 4]
&#91;9, 9, 9, 9, 9]
</pre>

			<h5>Chromium (Worker がキャッシュにないとき)</h5>
<pre>
&#91;4098, 4097, 4097, 4097, 4097]
&#91;4098, 4097, 4097, 4097, 4097]
</pre>

			<p>これも測り方が悪かった。</p>
			<h5>Chromium (Worker がキャッシュにあるとき)</h5>
<pre>
&#91;1171, 1164, 1121, 1164, 1124]
&#91;8, 8, 8, 8, 8]
</pre>
			<br>

			<p>今回はローカルから Worker を呼んでるけど、実際はネットワーク通信があるので1秒ぐらいはかかると思ってもいい。</p>			<br>

			<h4>N = 10 のとき</h4>
			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a></h5>
<pre>
&#91;3, 6, 8, 8, 9, 12, 10, 13, 13, 13] // 最初のレスポンス時間 × Worker 10個
&#91;5, 4, 4, 4, 4, 3, 3, 3, 3, 3] // 2回目のレスポンス時間 × Worker 10 個
</pre>

			<h5>Safari</h5>
<pre>
&#91;10, 11, 10, 6, 11, 9, 9, 9, 9, 10]
&#91;11, 11, 11, 11, 10, 10, 10, 10, 10, 10]
</pre>

			<h5>Chromium</h5>
<pre>
&#91;562, 502, 481, 501, 588, 541, 578, 537, 601, 540]
&#91;14, 9, 14, 14, 14, 14, 14, 14, 14, 14]
</pre>
			<br>

			<h4>N = 20 のとき</h4>
			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a></h5>
<pre>
&#91;4, 8, 6, 7, 10, 10, 11, 14, 12, 14, 15, 17, 17, 18, 19, 21, 21, 23, 24, 24]
&#91;8, 8, 8, 8, 8, 7, 7, 7, 6, 6, 6, 5, 5, 5, 5, 5, 4, 4, 4, 4]
</pre>

			<h5>Safari</h5>
<pre>
&#91;12, 16, 17, 11, 12, 11, 15, 16, 16, 12, 10, 16, 10, 15, 11, 14, 15, 5, 14, 14]
&#91;13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13]
</pre>

			<h5>Chromium</h5>
<pre>
&#91;740, 762, 907, 761, 909, 735, 852, 906, 906, 638, 929, 865, 853, 926, 925, 821, undefined, undefined, undefined, undefined]
&#91;14, 16, 16, 14, 13, 15, 16, 13, 13, 15, 13, 15, 16, 15, 15, 16, undefined, undefined, undefined, undefined]
</pre>

			<p>Chromium は 16 個を超える Workers とは通信できない。</p>			<br>

			<h4>N = 100 のとき</h4>
			<h5><a class="keyword" href="http://javascript.g.hatena.ne.jp/keyword/Firefox">Firefox</a></h5>
<pre>
&#91;9, 10, 10, 11, 11, 12, 13, 15, 15, 15, 16, 18, 17, 20, 19, 20, 21, 28, 23, 23, 27, 25, 27, 28, 30, 30, 32, 36, 33, 35, 37, 39, 38, 39, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 54, 52, 54, 55, 57, 56, 58, 58, 60, 60, 62, 63, 64, 65, 65, 95, 97, 106, 104, 105, 107, 127, 128, 156, 129, 154, 156, 181, 182, 185, 183, 184, 186, 214, 217, 217, 217, 266, 244, 267, 265, 296, 274, 302, 303, 323, 305, 322, 341, 342, 342, 396, 396]

&#91;17, 17, 17, 16, 16, 16, 16, 15, 15, 15, 15, 15, 14, 14, 14, 14, 15, 14, 15, 14, 15, 15, 15, 15, 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 11, 11, 11, 11, 11, 11]
</pre>

			<h5>Safari</h5>
<pre>
&#91;88, 98, 92, 97, 98, 95, 90, 96, 50, 89, 97, 97, 96, 94, 96, 25, 78, 49, 93, 86, 84, 48, 96, 24, 84, 47, 95, 47, 91, 47, 47, 83, 94, 85, 82, 88, 75, 88, 92, 45, 93, 92, 45, 90, 75, 81, 87, 80, 75, 20, 91, 81, 44, 72, 51, 64, 79, 90, 43, 79, 43, 81, 78, 80, 55, 83, 89, 80, 79, 80, 79, 41, 17, 72, 78, 88, 89, 41, 85, 76, 77, 67, 71, 87, 84, 16, 65, 86, 79, 87, 78, 83, 86, 87, 78, 14, 83, 86, 62, 78]

&#91;18, 18, 18, 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 18, 17, 17, 17, 18, 17, 18, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18]
</pre>
			<br>

			<p>数字はどれも何度かやって安定した速さのときを取った。たまにこれの3倍ぐらいかかるようなときもある。</p>
			<p>Chromium では Workers はまだ使えるレベルではない。</p>
			<p>Workers を使うときは、並列化したいその瞬間に呼ぶのではなく、並列化することが分かっているなら予め予定した数をロードしておくのがいい。</p>
		</div>
]]></description>

			<dc:creator>edvakf</dc:creator>

			<pubDate>Fri, 29 Jan 2010 07:12:15 GMT</pubDate>



		</item>

		<item>
			<title>ArsTechnicaのSITEINFO</title>
			<link>http://javascript.g.hatena.ne.jp/edvakf/20100127/1264619379</link>

			<description><![CDATA[
		<div class="section">
			<ul>
				<li><a href="http://wedata.net/items/27761" target="_blank">アイテム: Ars Technica - データベース: AutoPagerize - wedata</a></li>
				<li><a href="http://wedata.net/items/2513" target="_blank">アイテム: Ars Technica - データベース: AutoPagerize - wedata</a></li>
				<li><a href="http://wedata.net/items/1747" target="_blank">アイテム: ars technica - データベース: AutoPagerize - wedata</a></li>
			</ul>
			<p>3つもあるが、どれも動いてない。</p>
			<p>SITEINFO を作るときに検索したりしないんだろうか?</p>			<br>

			<p>これなら動く。</p>
<pre class="syntax-highlight">
  <span class="synIdentifier">{</span>
    <span class="synConstant">&quot;url&quot;</span>: <span class="synConstant">'^http://arstechnica</span><span class="synSpecial">\.</span><span class="synConstant">com/'</span>,
    <span class="synConstant">&quot;nextLink&quot;</span>: <span class="synConstant">'//div[@class=&quot;next-page&quot;]/a'</span>,
    <span class="synConstant">&quot;pageElement&quot;</span>: <span class="synConstant">'id(&quot;story&quot;)/div[@class=&quot;body&quot;]'</span>,
    <span class="synConstant">&quot;exampleUrl&quot;</span>: <span class="synConstant">'http://arstechnica.com/business/news/2010/01/chrome-os-interview-1.ars/'</span>
  <span class="synIdentifier">}</span>
</pre>

			<p>あとで整理しとこっと。</p>			<br>

			<h4><ins datetime="2010-01-29T23:56:12+09:00">上の3つを消した</ins></h4>
			<p>消す前のやつを残しておく。</p>
<pre>
url	^http://arstechnica&#92;.com/
nextLink	id(&#34;pager-wrapper&#34;)/ul/li/a&#91;contains(text(),&#34;Next&#34;)]
pageElement	id(&#34;news-item&#34;)
exampleUrl	http://arstechnica.com/
</pre>

<pre>
url	^http://arstechnica&#92;.com/
nextLink	//a&#91;text()=&#34;Next Page &#62;&#34; and not (@class=&#34;Inactive&#34;)]
pageElement	//div&#91;@class=&#34;ContentBody&#34;]
exampleUrl	http://arstechnica.com/guides/buyer/guide-200809.ars
</pre>

<pre>
url	^http://arstechnica&#92;.com/articles/
nextLink	//p&#91;contains(concat(&#34; &#34;,@class,&#34; &#34;),&#34; Paging &#34;)]/a&#91;last()]
pageElement	//div&#91;@class=&#34;Body&#34;]
exampleUrl	http://arstechnica.com/articles/paedia/ie8-super-standards-mode.ars
</pre>

		</div>
]]></description>

			<dc:creator>edvakf</dc:creator>

			<pubDate>Wed, 27 Jan 2010 19:09:39 GMT</pubDate>



		</item>

	</channel>
</rss>
