<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaScript &#8211; Like@Lunatic</title>
	<atom:link href="/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>Naoki Sekiguchi&#039;s personal Web site.</description>
	<lastBuildDate>Wed, 01 Jan 2025 10:17:04 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.5</generator>

<image>
	<url>/wp-content/uploads/2021/01/cropped-og-32x32.png</url>
	<title>JavaScript &#8211; Like@Lunatic</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>[React.js] setStateしても直ちにstateは変更されない</title>
		<link>/2015/07/reactjs-setstate</link>
		
		<dc:creator><![CDATA[Naoki Sekiguchi]]></dc:creator>
		<pubDate>Wed, 08 Jul 2015 13:48:53 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[React]]></category>
		<guid isPermaLink="false">/?p=1175</guid>

					<description><![CDATA[最近仕事でReactをやっている。 今回のネタはひとこと（ひとコード？）で言うと以下のようなこと。 getInitialState () { return { clicked: false }; }, clickHandler () { this.setState({ clicked: true }); console.log(this.state.clicked); // -&#62; false }, render () { console.log(this.state.clicked); // -&#62; true return &#60;button onClick={this.clickHandler}&#62;Click Me&#60;/button&#62;; } インタラクションのハンドラで this.setState したとして、そのハンドラ内でthis.state を参照しても、まだ更新後の値は取れない。render() が呼ばれるタイミングでは更新後の値になっている。実際にステートが更新されるタイミングは意図的に制御されているらしい。トリッキーだ。 更新後の値は変数に入れておいて this.setState しつつ、ハンドラ内ではその変数の値を使うのがおそらく正解だろう。 getInitialState () { return { clicked: false }; }, clickHandler () { var value = true; this.setState({ clicked: value }); console.log(value); // -&#62; true }, render () { console.log(this.state.clicked); // -&#62; true return &#60;button onClick={this.clickHandler}&#62;Click Me&#60;/button&#62;; }]]></description>
										<content:encoded><![CDATA[<p>最近仕事で<a href="https://facebook.github.io/react/">React</a>をやっている。<br />
今回のネタはひとこと（ひとコード？）で言うと以下のようなこと。</p>

<pre><code>getInitialState () {
  return { clicked: false };
},
clickHandler () {
  this.setState({ clicked: true });
  console.log(this.state.clicked); // -&gt; false
},
render () {
  console.log(this.state.clicked); // -&gt; true
  return &lt;button onClick={this.clickHandler}&gt;Click Me&lt;/button&gt;;
}
</code></pre>

<p>インタラクションのハンドラで <code>this.setState</code> したとして、そのハンドラ内で<code>this.state</code> を参照しても、まだ更新後の値は取れない。<code>render()</code> が呼ばれるタイミングでは更新後の値になっている。実際にステートが更新されるタイミングは意図的に制御されているらしい。トリッキーだ。</p>

<p>更新後の値は変数に入れておいて <code>this.setState</code> しつつ、ハンドラ内ではその変数の値を使うのがおそらく正解だろう。</p>

<pre><code>getInitialState () {
  return { clicked: false };
},
clickHandler () {
  var value = true;
  this.setState({ clicked: value });
  console.log(value); // -&gt; true
},
render () {
  console.log(this.state.clicked); // -&gt; true
  return &lt;button onClick={this.clickHandler}&gt;Click Me&lt;/button&gt;;
}
</code></pre>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Chrome 43 からは DOM attribute が prototype プロパティに変更される</title>
		<link>/2015/04/dom-attribute-now-on-the-prototype</link>
		
		<dc:creator><![CDATA[Naoki Sekiguchi]]></dc:creator>
		<pubDate>Sun, 19 Apr 2015 08:45:10 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">/?p=1143</guid>

					<description><![CDATA[DOM Attributes now on the prototype chain それによって… hasOwnProperty()/getOwnPropertyDescriptor()/JSON.stringify() で、DOM attribute が検出できなくなる read-only な DOM attribute を上書きしようとすると例外を投げるようになる だそうな。 他人が作ったフレームワークは特に、それで動かなくなったりするものも出てくるかもしれないので頭の片隅に置いておくとよい。]]></description>
										<content:encoded><![CDATA[<p><a href="http://updates.html5rocks.com/2015/04/DOM-attributes-now-on-the-prototype" title="DOM Attributes now on the prototype chain">DOM Attributes now on the prototype chain</a></p>

<p>それによって…</p>

<ul>
<li>hasOwnProperty()/getOwnPropertyDescriptor()/JSON.stringify() で、DOM attribute が検出できなくなる</li>
<li>read-only な DOM attribute を上書きしようとすると例外を投げるようになる</li>
</ul>

<p>だそうな。<br />
他人が作ったフレームワークは特に、それで動かなくなったりするものも出てくるかもしれないので頭の片隅に置いておくとよい。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Maxのドキュメントを読む その2(Javascript in Max 02 – Basic Techniques)</title>
		<link>/2014/09/jsinmax02</link>
		
		<dc:creator><![CDATA[Naoki Sekiguchi]]></dc:creator>
		<pubDate>Thu, 11 Sep 2014 07:41:19 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Max]]></category>
		<guid isPermaLink="false">/?p=1240</guid>

					<description><![CDATA[JavaScript in Max ドキュメントの日本語備忘録的なエントリー第2弾。 Global Methods Document 以下のメソッドはグローバルコンテキストにあり、どこでも使うことができる。 messnamed (Max object name, message name, any arguments) Document グローバルシンボルに紐付けてネーミングされた Max オブジェクトにメッセージを送る。例えば receive オブジェクトなど。 以下の例は &#8220;jsmessage&#8221; と名付けられたオブジェクトに &#8220;hogehoge&#8221; とメッセージを送る例である。 Test Code function loadbang () { messnamed("jsmessage", "hogehoge"); } cpost (any arguments) Document コンソールにメッセージを出力する。引数とかは次項の post() と同じ。 Test Code function foo(a, b, c) { cpost(a, b, c); } function loadbang() { foo('foo', [ 'a', 'b', 'c' ], { 'hoge': 'fuga' }); } なお、グローバルスコープは jsthis オブジェクト（ブラウザ JavaScript でいうwindow オブジェクト）とドキュメントには書いてあるが、jsthisオブジェクトを呼び出そうとしてもMAXウィンドウに Javascript ReferenceErrod: jsthis is not defined と出て怒られる。 一方、一般的な this オブジェクトは機能している。 function foo() { } post(this.foo === foo); // 1 (true) post (any arguments) Document MAXウィンドウにメッセージを出力する。 \n を含めると改行になる。 post() を新しい行から初めても改行が出力される。 Test Code function foo(a, b, c) { &#8230; <a href="/2014/09/jsinmax02">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><a href="http://cycling74.com/wiki/index.php?title=Category:Javascript_In_Max_Docs">JavaScript in Max</a> ドキュメントの日本語備忘録的なエントリー第2弾。</p>

<h2 id="Global_Methods">Global Methods</h2>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#Global_Methods">Document</a></p>

<p>以下のメソッドはグローバルコンテキストにあり、どこでも使うことができる。</p>

<hr />

<h3 id="messnamed">messnamed (Max object name, message name, any arguments)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#messnamed_.28Max_object_name.2C_message_name.2C_any_arguments.29">Document</a></p>

<p>グローバルシンボルに紐付けてネーミングされた Max オブジェクトにメッセージを送る。例えば receive オブジェクトなど。
以下の例は &#8220;jsmessage&#8221; と名付けられたオブジェクトに &#8220;hogehoge&#8221; とメッセージを送る例である。</p>

<h4>Test Code</h4>

<pre><code>function loadbang () {
    messnamed("jsmessage", "hogehoge");
}
</code></pre>

<p><img decoding="async" src="1-1.png" alt="messnamed" /></p>

<hr />

<h3 id="cpost">cpost (any arguments)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#cpost_.28any_arguments.29">Document</a></p>

<p>コンソールにメッセージを出力する。引数とかは次項の <code>post()</code> と同じ。</p>

<h4>Test Code</h4>

<pre><code>function foo(a, b, c) {
  cpost(a, b, c);
}
function loadbang() {
  foo('foo', [ 'a', 'b', 'c' ], { 'hoge': 'fuga' });
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss02.png"><img fetchpriority="high" decoding="async" src="/wp-content/uploads/2014/04/ss02.png" alt="How Input to the js Object is Handled" width="692" height="429" class="alignnone size-full wp-image-1100" srcset="/wp-content/uploads/2014/04/ss02.png 692w, /wp-content/uploads/2014/04/ss02-300x185.png 300w, /wp-content/uploads/2014/04/ss02-483x300.png 483w" sizes="(max-width: 692px) 100vw, 692px" /></a></p>

<hr />

<p>なお、グローバルスコープは <code>jsthis</code> オブジェクト（ブラウザ JavaScript でいうwindow オブジェクト）とドキュメントには書いてあるが、jsthisオブジェクトを呼び出そうとしてもMAXウィンドウに <code>Javascript ReferenceErrod: jsthis is not defined</code> と出て怒られる。
一方、一般的な this オブジェクトは機能している。</p>

<pre><code>function foo() { }
post(this.foo === foo); // 1 (true)
</code></pre>

<hr />

<h3 id="post">post (any arguments)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#post_.28any_arguments.29">Document</a></p>

<p>MAXウィンドウにメッセージを出力する。
<code>\n</code> を含めると改行になる。
<code>post()</code> を新しい行から初めても改行が出力される。</p>

<h4>Test Code</h4>

<pre><code>function foo(a, b, c) {
  post(a, b, c);
}
function loadbang() {
  foo('bar', [ 'a', 'b', 'c' ], { 'hoge': 'fuga' });
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss02.png"><img fetchpriority="high" decoding="async" src="/wp-content/uploads/2014/04/ss02.png" alt="How Input to the js Object is Handled" width="692" height="429" class="alignnone size-full wp-image-1100" srcset="/wp-content/uploads/2014/04/ss02.png 692w, /wp-content/uploads/2014/04/ss02-300x185.png 300w, /wp-content/uploads/2014/04/ss02-483x300.png 483w" sizes="(max-width: 692px) 100vw, 692px" /></a></p>

<hr />

<h2 id="jsthisobject">The jsthis Object</h2>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#The_jsthis_Object">Document</a></p>

<p>Browser JavaScript だと &#8221;window&#8221; にあたるもの。
<code>jsthis</code> オブジェクトはグローバルコードにおける &#8221;this&#8221; を表す。グローバルコードで関数を定義すればそれは <code>jsthis</code> のメソッドになり、変数を定義すれば <code>jsthis</code> のメソッドになる。<code>jsthis</code> オブジェクトは以下のようなビルトインプロパティとメソッドを持つ。</p>

<h3>autowatch (Number, get/set)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#autowatch_.28Number.2C_get.2Fset.29">Document</a></p>

<p>これはとりわけ、1つのソースファイルからいくつかの js インスタンスを作っていて、ソースファイルを変更したらすべてのインスタンスを更新したいような時に便利。外部のテキストエディタでソースファイルを書いている場合も、これを使えばパッチ中の js オブジェクトは自動的に再コンパイルされる。
デフォルトではこの autowatch は <code>0 (off)</code> に設定されている。on にしたいときはグローバルコード中で行うことがベスト。</p>

<h3>box (Maxobj, get)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#box_.28Maxobj.2C_get.29">Document</a></p>

<p>js オブジェクトを含む Maxobj を返す。<code>jsui</code> オブジェクトからオブジェクトボックスの長方形を取得する際に便利。
詳しくは <a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_03_-_the_Max_Object">the Max Object</a> を参照のこと</p>

<h3>editfontsize (Number, get/set)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#editfontsize_.28Number.2C_get.2Fset.29">Document</a>
スクリプトを編集するウィンドウのフォントサイズを制御する。グローバルコードで書くと、テキスト編集のデフォルトフォントサイズ（Maxウィンドウのフォントサイズ）が変更される。</p>

<h3>inlet (Number, get)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#inlet_.28Number.2C_get.29">Document</a>
関数の実行中、 <code>inlet</code> プロパティには、その関数を呼び出したメッセージを受け取ったインレット番号が格納されている。
この番号は一番左のインレットから0で始まる。
グローバルコード中ではこのプロパティは <code>0</code> になる。</p>

<h3>inlets (Number, get/set)</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_02_-_Global_Methods#inlets_.28Number.2C_get.2Fset.29">Document</a>
インスタンスがいくつのインレットを持つべきかを指定する。&#8221;inlets&#8221; プロパティはグローバルコード中で指定しなければ効果がない。指定されなかった場合、インレットを1つ持ったオブジェクトが作られる。</p>

<h4>Test Code 1</h4>

<pre><code>function msg_int(a) { // a == 1
  post(a); // 1
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss03-1.png"><img decoding="async" src="/wp-content/uploads/2014/04/ss03-1.png" alt="msg_int" width="884" height="431" class="alignnone size-full wp-image-1101" srcset="/wp-content/uploads/2014/04/ss03-1.png 884w, /wp-content/uploads/2014/04/ss03-1-300x146.png 300w, /wp-content/uploads/2014/04/ss03-1-500x243.png 500w" sizes="(max-width: 884px) 100vw, 884px" /></a></p>

<h4>Test Code 2</h4>

<pre><code>function msg_int(a) { // a == 1
  post(a); // 1
}
function msg_float(a) { // a == 1.23456
  post(a); // 1.23
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss03-2.png"><img decoding="async" src="/wp-content/uploads/2014/04/ss03-2.png" alt="msg_float" width="876" height="423" class="alignnone size-full wp-image-1103" srcset="/wp-content/uploads/2014/04/ss03-2.png 876w, /wp-content/uploads/2014/04/ss03-2-300x144.png 300w, /wp-content/uploads/2014/04/ss03-2-500x241.png 500w" sizes="(max-width: 876px) 100vw, 876px" /></a></p>

<hr />

<h3 id="list">list</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#list">Document</a></p>

<p>inlet に最初の値が int もしくは float の list が入力されると <code>list()</code> が呼ばれる。
<a href="#howinputtothejsobjectishandled">上記の例</a>のように最初の値が String の list はその String 名の関数が呼ばれる。</p>

<h4>Test Code 1</h4>

<pre><code>function list(a, b, c) { // a == 1, b == 2, c == hoge
  post(a, b, c); // 1 2 hoge
  post(arguments.length); // 3
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss03-3.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-3.png" alt="list" width="870" height="418" class="alignnone size-full wp-image-1104" srcset="/wp-content/uploads/2014/04/ss03-3.png 870w, /wp-content/uploads/2014/04/ss03-3-300x144.png 300w, /wp-content/uploads/2014/04/ss03-3-500x240.png 500w" sizes="(max-width: 870px) 100vw, 870px" /></a></p>

<hr />

<h3 id="anything">anything</h3>

<p>inlet に入力されたものに該当する function が定義されていなかった場合、<code>anything()</code> で受け取ることができる。例えば int が入力されたときに <code>msg_int()</code> が未定義だったら <code>anything()</code> が呼ばれる。float や list でも同様。<br />
<code>anything()</code> 内部では <code>messagename</code> と <code>inlet</code> 変数が定義されており、それぞれ inlet に入ったメッセージの種類と、inlet 番号を参照できる。</p>

<h4>Test Code 1</h4>

<pre><code>function anything(a, b, c) { // a == 1, b == 2, c == hoge
  post("messagename", messagename); // messagename list
  post("inlet", inlet); // inlet 0
  post("anything", a, b, c); // anything 1 2 hoge
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss03-4.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-4.png" alt="anything" width="869" height="420" class="alignnone size-full wp-image-1105" srcset="/wp-content/uploads/2014/04/ss03-4.png 869w, /wp-content/uploads/2014/04/ss03-4-300x144.png 300w, /wp-content/uploads/2014/04/ss03-4-500x241.png 500w" sizes="(max-width: 869px) 100vw, 869px" /></a></p>

<hr />

<h3 id="loadbang">loadbang</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#loadbang">Document</a></p>

<p><code>loadbang()</code> はパッチ起動時に呼ばれる。<code>js</code> オブジェクトや <code>jsui</code> オブジェクトを追加した時ではなく、あくまでそれを予め含むパッチ起動時に呼ばれることに注意。<br />
<a href="http://cycling74.com/wiki/index.php?title=loadbang#loadbang_Tips_and_Workarounds">Cmd+Shiftを押しながらパッチを起動すると loadbang を無効化できる</a>が、無効になっているかどうかは <code>max.loadbangdisabled</code> プロパティに 1 が入っているかどうかで分かる。</p>

<h4>Test Code 1</h4>

<pre><code>function loadbang() {
  if (max.loadbangdisabled == 1) {
    post("no loadbang");
  } else {
    post("loadbang!");
  }
}
function bang() {
  post("bang!");
}
</code></pre>

<p>普通にパッチを起動した場合<br />
<a href="/wp-content/uploads/2014/04/ss03-5.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-5.png" alt="loadbang" width="869" height="419" class="alignnone size-full wp-image-1106" srcset="/wp-content/uploads/2014/04/ss03-5.png 869w, /wp-content/uploads/2014/04/ss03-5-300x144.png 300w, /wp-content/uploads/2014/04/ss03-5-500x241.png 500w" sizes="(max-width: 869px) 100vw, 869px" /></a></p>

<p>Cmd+Shiftを押しながらパッチを起動した場合<br />
<a href="/wp-content/uploads/2014/04/ss03-6.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-6.png" alt="noloadbang" width="873" height="418" class="alignnone size-full wp-image-1108" srcset="/wp-content/uploads/2014/04/ss03-6.png 873w, /wp-content/uploads/2014/04/ss03-6-300x143.png 300w, /wp-content/uploads/2014/04/ss03-6-500x239.png 500w" sizes="(max-width: 873px) 100vw, 873px" /></a></p>

<hr />

<h3 id="getvalueof">getvalueof</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#getvalueof">Document</a></p>

<p>JavaScript 内で定義した変数の値（String か Number）を <code>pattr</code> 関連オブジェクトから呼び出せるようにする関数。
→ pattr オブジェクトのことがよく分からないので、テストコードが書けない。後で復習する。</p>

<hr />

<h3 id="setvalueof">setvalueof</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#setvalueof">Document</a></p>

<p><code>pattr</code> 関連オブジェクトから JavaScript 内に変数（Number か String）をパスできるインターフェースを提供する関数。
value が複数の場合、<code>jsthis</code> オブジェクトの <code>arrayfromargs()</code> メソッドで引数を扱うと良いとのこと。<br />
→ pattr オブジェクトのことがよく分からないので、テストコードが書けない。後で復習する。</p>

<hr />

<h3 id="save">save</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#save">Document</a></p>

<p><code>save()</code> を定義すると、JavaScript 内の状態をパッチに保持することができる。
パッチが再読み込みされると、JavaScript 内の状態が復元される。</p>

<p><code>save()</code> 内だけで使える <code>embedmessage()</code> を使い、値を保存する。</p>

<ul>
<li><code>embedmessage()</code> の第1引数には保存された値を渡したいコールバック関数名を文字列で渡す</li>
<li><code>embedmessage()</code> の第2引数以降には保存したい値を渡し、これがコールバック関数の引数に渡される</li>
</ul>

<h4>Test Code 1</h4>

<pre><code>var valuetosave = 0;
function foo(v) {
  valuetosave = v;
}
function save() {
  embedmessage("callback", valuetosave);
}
function callback(v) {
  valuetosave = v;
  post(v);
}
</code></pre>

<p><code>foo 1</code> メッセージを送ったあと、パッチを再起動した場合<br />
<a href="/wp-content/uploads/2014/04/ss03-9-1.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-9-1.png" alt="save" width="873" height="419" class="alignnone size-full wp-image-1109" srcset="/wp-content/uploads/2014/04/ss03-9-1.png 873w, /wp-content/uploads/2014/04/ss03-9-1-300x143.png 300w, /wp-content/uploads/2014/04/ss03-9-1-500x239.png 500w" sizes="(max-width: 873px) 100vw, 873px" /></a></p>

<p><code>foo 2</code> メッセージを送ったあと、パッチを再起動した場合<br />
<a href="/wp-content/uploads/2014/04/ss03-9-21.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-9-21.png" alt="save" width="873" height="417" class="alignnone size-full wp-image-1112" srcset="/wp-content/uploads/2014/04/ss03-9-21.png 873w, /wp-content/uploads/2014/04/ss03-9-21-300x143.png 300w, /wp-content/uploads/2014/04/ss03-9-21-500x238.png 500w" sizes="(max-width: 873px) 100vw, 873px" /></a></p>

<hr />

<h3 id="notifydeleted">notifydeleted</h3>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#notifydeleted">Document</a></p>

<p><code>js</code> オブジェクトが削除されたときに呼ばれる</p>

<h4>Test Code 1</h4>

<pre><code>function notifydeleted() {
  post('js object was deleted.');
}
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss03-10.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss03-10.png" alt="notifydeleted" width="866" height="420" class="alignnone size-full wp-image-1113" srcset="/wp-content/uploads/2014/04/ss03-10.png 866w, /wp-content/uploads/2014/04/ss03-10-300x145.png 300w, /wp-content/uploads/2014/04/ss03-10-500x242.png 500w" sizes="(max-width: 866px) 100vw, 866px" /></a></p>

<hr />

<h2 id="Global_Code">Global Code</h2>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#Global_Code">Document</a></p>

<p>グローバルスコープに書かれたコードは編集された後、スクリプトがロードされるかコンパイルされたタイミングで評価される。
<code>js</code> / <code>jsui</code> オブジェクトが完全に作られる前に評価される。
js オブジェクトがいくつ inlet / outlet を持つかはグローバルコードからは分からない。これはグローバルコードから inlet / outlet をいくつにするか定義できることを意味する。しかし言い換えれば、まだ outlet が存在しなければ、使うことはできない。
初期化処理を書きたい場合は <code>loadbang()</code> の中に書くべし。</p>

<h3>グローバルコードでやるべきこと</h3>

<ul>
<li>inlet / outlet の数を定義する</li>
<li><code>jsarguments[]</code> プロパティ（<code>js</code> オブジェクトの引数）にアクセスする</li>
<li>inlet / outlet の値の操作</li>
<li>グローバル変数の定義と初期化</li>
<li>グローバルアプリケーション環境にアクセス＆操作するため、Max オブジェクトを使う</li>
</ul>

<h3>グローバルコードでやるべきでないこと</h3>

<ul>
<li>outlet から何か出力すること</li>
<li><code>js</code> オブジェクトが置かれたパッチ側を参照しようとすること</li>
</ul>

<hr />

<h2 id="Private_28Local29_Functions">Private (Local) Function</h2>

<p><a href="http://cycling74.com/wiki/index.php?title=Javascript_in_Max_01_-_Basic_Techniques#Private_.28Local.29_Functions">Document</a></p>

<p><code>js</code> オブジェクトへの inlet メッセージから参照されたくないローカル関数を作りたい場合、<code>local</code> プロパティに <code>1</code> をセットする。</p>

<h3>Test Code 1</h3>

<pre><code>function foo() {
  post("Welcome to 'foo' method!");
}
foo.local = 1;
</code></pre>

<p><a href="/wp-content/uploads/2014/04/ss05.png"><img loading="lazy" decoding="async" src="/wp-content/uploads/2014/04/ss05.png" alt="private function" width="875" height="422" class="alignnone size-full wp-image-1114" srcset="/wp-content/uploads/2014/04/ss05.png 875w, /wp-content/uploads/2014/04/ss05-300x144.png 300w, /wp-content/uploads/2014/04/ss05-500x241.png 500w" sizes="(max-width: 875px) 100vw, 875px" /></a></p>

<hr />

<p>未完</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>grunt-contrib-jshint の設定</title>
		<link>/2014/04/grunt-contrib-jshint</link>
		
		<dc:creator><![CDATA[Naoki Sekiguchi]]></dc:creator>
		<pubDate>Wed, 16 Apr 2014 04:38:01 +0000</pubDate>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">/?p=1079</guid>

					<description><![CDATA[Gruntfile.coffee に以下のように書く。 grunt.loadNpmTasks 'grunt-contrib-jshint' grunt.initConfig( jshint: main: options: jshintrc: true src: [ 'app' + sitePath + 'js/script.js' ] ... watch: js: options: livereload: true files: [ 'app' + sitePath + 'js/*' ] tasks: [ 'jshint' ] ) options.jshintrc = true を設定するとそれ以外の options は無視され同階層に置かれた .jshintrc ファイルを参照するようになる。 .jshintrc はJSON形式で記述する。 結果的に以下のような設定に。 { "node": true, "esnext": true, "bitwise": true, "camelcase": true, "curly": true, ... "globals": { "window": true, "document": true, "jQuery": true, "$": true, "_": true, "Backbone": true }, "-W116": true, "-W041": true } globals には「XXXグローバルオブジェクトがない」的な警告が出るときに、予め「このグローバルオブジェクトはあるから、警告出すな」とJSHint側に伝えておく設定。 -WXXX: true は特定のエラーを無視したいときに追加する設定。このエラーコード（ドキュメントの原文では warning code）は grunt --verbose（もしくは grunt -v）として verbose モードで Grunt タスクを起動すると表示されるようになる。 表示例： ^ [W116] Expected '!==' and instead saw '!='. ここでは W116 というのが warning code なのでそれを &#8230; <a href="/2014/04/grunt-contrib-jshint">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>Gruntfile.coffee に以下のように書く。</p>

<pre><code class="js">grunt.loadNpmTasks 'grunt-contrib-jshint'
grunt.initConfig(
  jshint:
    main:
      options:
        jshintrc: true
      src: [ 'app' + sitePath + 'js/script.js' ]
  ...
  watch:
    js:
      options:
        livereload: true
      files: [ 'app' + sitePath + 'js/*' ]
      tasks: [ 'jshint' ]
)
</code></pre>

<p><code>options.jshintrc = true</code> を設定するとそれ以外の options は無視され同階層に置かれた .jshintrc ファイルを参照するようになる。</p>

<p>.jshintrc はJSON形式で記述する。<br />
結果的に以下のような設定に。</p>

<pre><code class="js">{
  "node": true,
  "esnext": true,
  "bitwise": true,
  "camelcase": true,
  "curly": true,
  ...
  "globals": {
    "window": true,
    "document": true,
    "jQuery": true,
    "$": true,
    "_": true,
    "Backbone": true
  },
  "-W116": true,
  "-W041": true
}
</code></pre>

<p><code>globals</code> には「XXXグローバルオブジェクトがない」的な警告が出るときに、予め「このグローバルオブジェクトはあるから、警告出すな」とJSHint側に伝えておく設定。<br />
<code>-WXXX: true</code> は特定のエラーを無視したいときに追加する設定。このエラーコード（ドキュメントの原文では warning code）は <code>grunt --verbose</code>（もしくは <code>grunt -v</code>）として verbose モードで Grunt タスクを起動すると表示されるようになる。</p>

<p>表示例：</p>

<pre><code>^ [W116] Expected '!==' and instead saw '!='.
</code></pre>

<p>ここでは <code>W116</code> というのが warning code なのでそれを <code>"-W116": true</code> のように options に追加すると、警告は出なくなる。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>js-test-driverの使い方メモ</title>
		<link>/2012/12/js-test-driver</link>
		
		<dc:creator><![CDATA[seckie]]></dc:creator>
		<pubDate>Sun, 02 Dec 2012 05:41:31 +0000</pubDate>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Test]]></category>
		<guid isPermaLink="false">/?p=934</guid>

					<description><![CDATA[js-test-driverはGoogleが作った、JavaScriptをコンソールでテストするプログラム。試したのでメモを。環境はMountain Lion搭載のMacBookAir。 <a href="/2012/12/js-test-driver">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>js-test-driverはGoogleが作った、JavaScriptをコンソールでテストするプログラム。試したのでメモを。環境はMountain Lion搭載のMacBookAir。</p>

<p>ダウンロード：<br />
<a href="http://code.google.com/p/js-test-driver/downloads/list">http://code.google.com/p/js-test-driver/downloads/list</a></p>

<p>使い方：<br />
<a href="http://code.google.com/p/js-test-driver/wiki/GettingStarted">http://code.google.com/p/js-test-driver/wiki/GettingStarted</a></p>

<p>参考になる日本語記事：<br />
<a href="http://0-9.tumblr.com/post/15614207218/js-jstestdriver">http://0-9.tumblr.com/post/15614207218/js-jstestdriver</a><br />
<a href="http://everyday-eachday.blogspot.jp/2011/12/jstestdriver.html">http://everyday-eachday.blogspot.jp/2011/12/jstestdriver.html</a></p>

<p>ダウンロードページで <span class="file">JsTestDriver-x.x.x.jar</span> ってやつを落とす。ダウンロードしたファイルを <span class="path">~/bin/JsTestDriver.jar</span> みたいなパスに置く。コンソールから以下のコマンドでサーバーを起動。</p>

<pre><code>$ java -jar ~/bin/JsTestDriver.jar --port 4224
</code></pre>

<p>ポート番号は適当でいいらしい。コマンド成功したら、適当なブラウザで <span class="url">http://localhost:4224/</span> を開く。そうすると</p>

<ul>
<li>Capture This Browser</li>
<li>Capture This Browser in strict mode</li>
</ul>

<p>ってテキストリンクが並んでる画面になるので好きな方をクリック。（普通は <em>Capture This Browser</em> でいいと思われ）そうするとそのブラウザをウォッチしているような状態になる。で、そのブラウザのエンジンでテストが実行される。</p>

<p>実際にテストしたいプロジェクトのディレクトリを作る。例えば以下のような構造にする。</p>

<pre><code>|- jsTestDriver.conf
|- src
|--- hoge.js
|- test
|--- hoge_test.js
</code></pre>

<p><span class="file">hoge.js</span> が書きたいJavaScript。<span class="file">hoge_test.js</span> がhoge.jsに対するテストを書くファイル。<span class="file">jsTestDriver.conf</span> がjs-test-driverのためのファイル。テキストエディタで開き、以下のように記述。</p>

<pre><code>server: http://localhost:4224/
load:
- src/*.js
- test/*.js
</code></pre>

<p>コンソールに戻る。さっきサーバーを起動したプロセスウィンドウはそのままにしといて、新しいプロセスを起動。そっちで</p>

<pre><code>$ cd プロジェクトのディレクトリへ
$ java -jar ~/bin/JsTestDriver.jar --tests all
</code></pre>

<p>するとテストが走って <span class="file">hoge_test.js</span> に書いたテスト結果が表示される…予定なんだけど、この時点で <span class="file">hoge_test.js</span> には何も書いてないのでエラーになるはず。<br />
というわけで簡単なコードを書いてみる。</p>

<section>
### src/hoge.js
    function jsdriversample() {
        return true;
    }
</section>

<section>
### test/hoge_test.js
    TestCase(&#8216;jsdriversampletest&#8217;, {
        &#8216;test should return true&#8217;: function () {
            var result = jsdriversample();
            assertTrue(result);
        }
    });
</section>

<p>で、コンソールでコマンドを叩いてテストする。</p>

<pre><code>$ java -jar ~/bin/JsTestDriver.jar --tests all
</code></pre>

<p>ちなみにここで<code>'test should return true'</code>っていうのは各テスト単位の名前で、エラー時にコンソールに出力される。ちなみに文字列だからってマルチバイトは使えない。</p>

<p><code>assertなんちゃら</code>って関数でテストを実行してるんだけど、使えるassertionの一覧は以下に載ってる。<br />
<a href="http://code.google.com/p/js-test-driver/wiki/Assertions">http://code.google.com/p/js-test-driver/wiki/Assertions</a><br />
例えば <code>assertTrue</code> だったら、引数の値が <code>true</code> だったらテスト合格になる。</p>

<p>まだちょっと使ってみただけなので、もうちょい勉強して実務に生かしたい。</p>

<section class="postscript">
### 2012-12-06 追記
テストケースのメソッド名（上記の例では <code>'test should return true'</code> となっているところ）は必ず**<code>test</code>**で始まらないと、認識されないようです。
</section>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mobile Safari、フルスクリーンモード、UIWebView、どれからのアクセスか判別する</title>
		<link>/2012/11/detectiosstandalone</link>
		
		<dc:creator><![CDATA[seckie]]></dc:creator>
		<pubDate>Thu, 29 Nov 2012 08:33:21 +0000</pubDate>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">/?p=900</guid>

					<description><![CDATA[apple-mobile-web-app-capableというめmetaタグの値をyesにするとiOS Safariでそのページを「ホーム画面に追加」し、ホーム画面からアクセスした際にページをフルスクリーンモードで開くことができる。 &#60;meta name="apple-mobile-web-app-capable" content="yes" /&#62; 出典：Safari HTML Reference &#8211; Supported Meta Tags フルスクリーンモードで開いた場合、navigator.userAgentの値に「Safari」の文字列が現れなくなる。 Moble SafariでのuserAgent（iOS 5.1.1）: userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 フルスクリーンモードでのuserAgent（iOS 5.1.1）： userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 ところで、FacebookアプリやTwitterアプリなど、投稿内容のURLを踏むと、そのアプリの中でWebページが展開されるものがある。UIWebViewというやつ。この場合のuserAgentにも、やはり「Safari」の文字列は現れない。 FacebookアプリのuserAgent（iOS 5.1.1）: userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.1;FBBV/68414;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/KDDI;FBID/phone;FBLC/ja_JP] TwitterアプリのuserAgent（iOS 5.1.1）: userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 というわけでSafariという文字列があるかないかを頼りに、フルスクリーンモード、ないしはUIWebViewからのアクセスを判別しようとすると失敗する。 しかし上記出典のSafari HTML Referenceによると、フルスクリーンモードではwindow.navigator.standaloneというプロパティがtrueになるらしいので試した。 デモ iPhone/iPadのどちらでも、フルスクリーンモードのみでwindow.navigator.standaloneがtrueになるのを確認できた。 userAgent文字列からiPhone/iPadであることを判定した上で、 userAgentにSafariの文字列あり → Mobile Safari userAgentにSafariの文字列なし、かつwindow.navigator.standalone === true → フルスクリーンモード userAgentにSafariの文字列なし、かつwindow.navigator.standalone &#8230; <a href="/2012/11/detectiosstandalone">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p><code>apple-mobile-web-app-capable</code>というめmetaタグの値を<cod>yes</cod>にするとiOS Safariでそのページを「ホーム画面に追加」し、ホーム画面からアクセスした際にページをフルスクリーンモードで開くことができる。</p>

<pre><code>&lt;meta name="apple-mobile-web-app-capable" content="yes" /&gt;
</code></pre>

<p>出典：<a href="https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html#//apple_ref/doc/uid/TP40008193-SW1">Safari HTML Reference &#8211; Supported Meta Tags</a></p>

<p>フルスクリーンモードで開いた場合、<code>navigator.userAgent</code>の値に「Safari」の文字列が現れなくなる。</p>

<h4>Moble SafariでのuserAgent（iOS 5.1.1）:</h4>

<pre><code>userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3 
</code></pre>

<h4>フルスクリーンモードでのuserAgent（iOS 5.1.1）：</h4>

<pre><code>userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 
</code></pre>

<p>ところで、FacebookアプリやTwitterアプリなど、投稿内容のURLを踏むと、そのアプリの中でWebページが展開されるものがある。UIWebViewというやつ。この場合のuserAgentにも、やはり「Safari」の文字列は現れない。</p>

<h4>FacebookアプリのuserAgent（iOS 5.1.1）:</h4>

<pre><code>userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 [FBAN/FBIOS;FBAV/5.1;FBBV/68414;FBDV/iPhone4,1;FBMD/iPhone;FBSN/iPhone OS;FBSV/5.1.1;FBSS/2; FBCR/KDDI;FBID/phone;FBLC/ja_JP] 
</code></pre>

<h4>TwitterアプリのuserAgent（iOS 5.1.1）:</h4>

<pre><code>userAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Mobile/9B206 
</code></pre>

<p>というわけで<code>Safari</code>という文字列があるかないかを頼りに、フルスクリーンモード、ないしはUIWebViewからのアクセスを判別しようとすると失敗する。
しかし上記出典の<a href="https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html#//apple_ref/doc/uid/TP40008193-SW1">Safari HTML Reference</a>によると、フルスクリーンモードでは<code>window.navigator.standalone</code>というプロパティがtrueになるらしいので試した。</p>

<p><em><a href="/demo/detectiosstandalone.html">デモ</a></em>
<script src="https://gist.github.com/4158884.js"> </script></p>

<p>iPhone/iPadのどちらでも、フルスクリーンモードのみで<code>window.navigator.standalone</code>が<code>true</code>になるのを確認できた。</p>

<p>userAgent文字列からiPhone/iPadであることを判定した上で、</p>

<ul>
<li>userAgentに<code>Safari</code>の文字列あり → Mobile Safari</li>
<li>userAgentに<code>Safari</code>の文字列なし、かつ<code>window.navigator.standalone === true</code> → フルスクリーンモード</li>
<li>userAgentに<code>Safari</code>の文字列なし、かつ<code>window.navigator.standalone === false</code> → UIWebView</li>
</ul>

<p>という判定をすることができる。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JavaScriptの変数についての考察</title>
		<link>/2011/06/js_variable</link>
		
		<dc:creator><![CDATA[seckie]]></dc:creator>
		<pubDate>Mon, 06 Jun 2011 11:25:10 +0000</pubDate>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Programming]]></category>
		<guid isPermaLink="false">/?p=753</guid>

					<description><![CDATA[最近、Code Complete第2版という本を読んでいて、「変数の使用（第10章）」がとても為になる内容だったので、会社のチームメンバーに少しそのことについて話したら、JavaScriptについて興味深い話をすることができた。 <a href="/2011/06/js_variable">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
										<content:encoded><![CDATA[<p>最近、<a href="http://www.amazon.co.jp/gp/product/489100455X/ref=as_li_qf_sp_asin_tl?ie=UTF8&#038;tag=likealunatic-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=489100455X">Code Complete第2版</a><img loading="lazy" decoding="async" src="http://www.assoc-amazon.jp/e/ir?t=likealunatic-22&#038;l=as2&#038;o=9&#038;a=489100455X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />という本を読んでいて、「変数の使用（第10章）」がとても為になる内容だったので、会社のチームメンバーに少しそのことについて話したら、JavaScriptについて興味深い話をすることができた。</p>

<p>第10章の内容について、議論の対象となった部分を引用する。</p>

<blockquote>
<h3>10.3 変数の初期化のガイドライン</h3>
<h4>変数は最初に使用する場所の近くで初期化する</h4>
<section>
<h5>リスト10-2: 悪い初期化（Visual Basic）</h5>
<pre><code>' すべての変数を宣言する
Dim accountIndex As Integer
Dim total As Double
Dim done As Boolean

' すべての変数を初期化する
acountIndex = 0;
total = 0.0
done = False
...

' accountIndexを使用するコード
...

' totalを使用するコード
...

' doneを使用するコード
While Not done
...</code></pre>
</section>
&#8230;中略
<p>リスト10-2の例では、done変数を宣言した後、done変数を使用するコードが実行されるまでに、done変数が変更される可能性がある。</p>
&#8230;中略
<p>もう1つの問題は、すべての初期化を1か所にまとめると、done変数は最後の方でしか使用されないにもかかわらず、すべての変数がルーチン全体で使用されるという印象を与えることだ。</p>
&#8230;中略
<p>これは、「関連する作業を1つにまとめる」という近接の法則の一例である。</p>
</blockquote>

<p>なるほどなるほど。しかし僕は普段の業務でプログラミング言語らしきものはJavaScriptしか使わないので、JavaScriptに置き換えて考えよう。</p>

<pre><code>var accountIndex = 0,
    total = 0,
    done = false;
// accountIndexを使用するコード
...

// totalを使用するコード
...

// doneを使用するコード
while(!done) {
    
}
...</code></pre>

<p>これが本書で「悪い例」とされているコードをJavaScriptに置き換えたコードだ。しかし関数の先頭で <code>var hoge = 0, fuga = false;</code> のようにして変数をまとめて宣言（＆初期化）するのはJavaScriptではよく見られるコードだ。あの<a href="http://code.jquery.com/jquery-1.6.1.js">jQuery</a>ですらそのような記法を多用している。<br />
<a href="http://www.amazon.co.jp/gp/product/4873113911/ref=as_li_tf_tl?ie=UTF8&#038;tag=likealunatic-22&#038;linkCode=as2&#038;camp=247&#038;creative=1211&#038;creativeASIN=4873113911">JavaScript: The Good Parts</a><img loading="lazy" decoding="async" src="http://www.assoc-amazon.jp/e/ir?t=likealunatic-22&#038;l=as2&#038;o=9&#038;a=4873113911" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />によると</p>

<blockquote>
<p>ほとんどの言語では、変数は一般的に最初に利用される場所で定義するのが最も良い方法だ。しかしこれは、ブロックスコープを持たないJavaScriptでは好ましくない。すべての変数は、それぞれの関数の先頭で定義したほうが良い。</p>
</blockquote>

<p>とある。そう、JavaScriptはブロックスコープを持たない（{}でくくられた部分限定の変数スコープ）といういわゆる変態言語であり、変数のスコープを生成するのは関数ブロックのみだ。それが理由で、変数はまとめて関数の先頭で宣言するという記法がベストプラクティスとされている。</p>

<p>さてしかし、Code Complete第2版による「変数は最初に使用する場所の近くで初期化する」ほうがよいという理屈の続きはこうだ。</p>

<blockquote>
<h4>10.4.1 変数の参照はまとめて</h4>
<p>変数を参照してから次に参照するまでのコードは、「脆弱性の窓」（無防備な時間帯）である。その窓では、新しいコードが追加されたり、何気なく変数が変更されたり、変数に含まれていなければならない値が忘れられてしまったりする。変数の参照は、常に近いところにまとめて局所化するのが望ましい。</p>
&#8230;中略
<p>これを測定する方法は、変数の「<strong>持続間隔</strong>」を計算することである。</p>
&#8230;中略
<section>
<h5>リスト10-6: 1と0の持続間隔（Java）</h5>
<pre><code>a = 0;
b = 0;
c = 0;
b = a + 1;
b = b / c;</code></pre>
</section>
<p>この場合、bの1つ目の参照と2つ目の参照の間にコードが1行あるので、その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、<del>その持続間隔は1である。bの2つ目の参照と3つ目の参照の間にはコードがないので、</del>その持続間隔は0である。</p>
&#8230;中略
<p>リスト10-6では、bの<strong>平均持続間隔</strong>は (1 + 0) / 2 = 0.5 である。変数の参照を近くにまとめると、コードの読み手がコードをセクションごとに読んでいけるようになる。</p>
&#8230;中略
<br />
<h4>10.4.2 変数の「寿命」はできるだけ短く</h4>
<p>変数の持続間隔に関連して、変数の「<strong>寿命</strong>」という概念がある。変数の寿命とは、変数が存続する期間内に存在するステートメントの合計である。</p>
&#8230;中略
<p>変数の持続間隔とは異なり、変数の寿命は、最初に参照されてから最後に参照されるまでの変数の使用回数を計算に入れない。変数が最初に1行目で参照され、最後に25行目で参照された場合、変数の寿命は25（ステートメント）である。</p>
&#8230;中略
<p>変数の持続間隔と同様に、変数の寿命もできるだけ短くする、つまりステートメントの数を少なくすることが目標となる。持続間隔と同様に、ステートメントの数を少なくすると、脆弱性の窓が小さくなるという利点がある。</p>
&#8230;中略
<p>寿命を短くするもう1つの利点は、コードを正確に把握できることである。変数に10行目で値を代入し、45行目まで使用しない場合、2つの参照の間に空いている空間は、変数がその間に使用されていることを暗示する。</p>
&#8230;中略
<p>変数の寿命が短いと、コードが読みやすくなる。読み手が一度に頭に入れなければならないコードの行数が少なければ少ないほど、コードは理解しやすい。</p>
</blockquote>

<p>変数には「<strong>平均持続間隔</strong>」と「<strong>寿命</strong>」という概念があるという。そしてそれらが短くなった方がコードの読み手にとって読みやすいコードになるという。</p>

<p>去年、僕がとある案件で数千行に及ぶJavaScriptを書いた際、最も頭を悩ませたのはコードを頭に入れることだった。機能を追加・修正するために一度に頭に入れなければならないコードが多すぎたため、開発が進めば進む程、コードの修正は困難を極めた。</p>

<p>プログラミング初心者が誰しも一度はぶつかる壁なのかもしれない。コードの分割をはじめとする、コードの設計の重要性を肌で感じた瞬間だった。<br />
だからこそ、上記の「読み手が一度に頭に入れなければならないコードの行数が少なければ&#8230;」というくだりに深く納得したのだった。</p>

<p>さて、ではJavaScriptにおいて「<strong>変数の寿命を短くする</strong>」ことと「<strong>関数の先頭ですべての変数を宣言する</strong>」ことは両立するのだろうか？これについて隣席の<a href="http://twitter.com/keiskey">@keiskey</a>の意見はこうだった。</p>

<blockquote>関数1つの長さ自体を短くしてしまうのがいいのでは。<a href="http://code.google.com/intl/ja/closure/library/">Google Closure Library</a>のコードを見ていると、中身が2行しかないメソッドに長々とした名前が付いていたりする。そんな長い名前を付けるんだったら直接コードを書いてしまえばいいやん、と思うけど、「変数の寿命」のポリシーをもって書かれていると考えると合点がいく。</blockquote>

<p>なるほど&#8230;と再び納得するとともに、「この話、共有してよかった」と思った。</p>

<p>例えば上述（リスト10-2）のコードを一つの関数だと考えるとこうなる。</p>

<pre><code>function Account() {
    var accountIndex = 0,
        total = 0,
        done = false;
    // accountIndexを使用するコード
    ...

    // totalを使用するコード
    ...

    // doneを使用するコード
    while(!done) {
        
    }
    ...
}</code></pre>

<p>この関数をクラス風に書き直し、機能分割するとこういう感じになる。</p>

<pre><code>function Account() {
    // コンストラクタ
    ...
}
Account.prototype = {
    getAccountIndex: function() {
        var accountIndex = 0;
        // accountIndexを使用するコード
        ...
        return accountIndex;
    },
    getTotal: function() {
        var total = 0;
        // totalを使用するコード
        ...
        return total;
    },
    checkStatus: function() {
        var done = false;
        // doneを使用するコード
        while(!done) {
            ...
        }
    }
}</code></pre>

<p>prototypeにぶら下げたメソッド1つ1つを短くまとめて上手に機能分割することが、限りなく正解に近いのではないかと思った次第。</p>

<p>僕はプログラマと呼ばれる職種ではないのだけれど、プログラミングに関わる人間として、こういった考察はとてもおもしろいと感じる。また何か同じような話があったら書いていきたい。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>JSONがinvalidでもjQuery.getJSON()はエラーを吐かない</title>
		<link>/2010/05/getjson</link>
		
		<dc:creator><![CDATA[seckie]]></dc:creator>
		<pubDate>Fri, 21 May 2010 05:51:13 +0000</pubDate>
				<category><![CDATA[Web Development]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[json]]></category>
		<guid isPermaLink="false">/?p=681</guid>

					<description><![CDATA[記事のタイトルで言いたいことは言い切っちゃているんですけれども。 jQuery 1.4.2 の $.getJSON() 、もしくは $.ajax() でリクエストしたJSONファイルがinvalidだった場合、エラーは吐きませんがコールバック関数が実行されません。 [jQuery] getJSON callback not firing? &#8211; jQuery Forum なんでinvalidなのかと調べたところ・・・、JSONでは文字列は必ずダブルクォートで囲まないといけないことが判りました。シングルクォートではダメです。それからオブジェクトリテラルの左のオペランドにも、ダブルクォート省略不可！あー、なんか初歩的なところでつまづいています。 A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. http://json.org/ 何しろエラーが出ないので、何が悪いのかわかりにくいです＞＜ これで2時間はハマってしまった・・・。。]]></description>
										<content:encoded><![CDATA[<p>記事のタイトルで言いたいことは言い切っちゃているんですけれども。<br />
jQuery 1.4.2 の <a href="http://api.jquery.com/jQuery.getJSON/">$.getJSON()</a> 、もしくは <a href="http://api.jquery.com/jQuery.ajax/">$.ajax()</a> でリクエストしたJSONファイルがinvalidだった場合、エラーは吐きませんが<strong>コールバック関数が実行されません</strong>。</p>

<p class="ref"><a href="http://forum.jquery.com/topic/jquery-getjson-callback-not-firing-12-1-2010">[jQuery] getJSON callback not firing? &#8211; jQuery Forum</a></p>

<p>なんでinvalidなのかと調べたところ・・・、JSONでは文字列は必ずダブルクォートで囲まないといけないことが判りました。シングルクォートではダメです。それからオブジェクトリテラルの左のオペランドにも、ダブルクォート省略不可！あー、なんか初歩的なところでつまづいています。</p>

<blockquote cite="http://json.org/">
<p>A string is a collection of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. </p>
<p class="site"><a href="http://json.org/">http://json.org/</a></p>
</blockquote>

<p>何しろエラーが出ないので、何が悪いのかわかりにくいです＞＜ これで2時間はハマってしまった・・・。。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
