<?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>開発者ブログ</title>
	<atom:link href="http://neo-navi.net/stuff/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://neo-navi.net/stuff</link>
	<description>株式会社音生(ネオ)所属の開発者たちのブログ！</description>
	<lastBuildDate>Sat, 08 May 2010 08:49:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CodeIgniterのUploadクラスは画像とその他ファイルを同時に許可できない</title>
		<link>http://neo-navi.net/stuff/?p=182</link>
		<comments>http://neo-navi.net/stuff/?p=182#comments</comments>
		<pubDate>Sat, 08 May 2010 08:45:48 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=182</guid>
		<description><![CDATA[全然PHPのネタが無かったので、ちょっとやってみようかと思います。
とある開発でCodeIgniterのUploadクラスを使っていたのですが、
アップロードされたファイルに対して、許可する拡張子を画像＋その他拡張子（例えばzipとかtxtとか）に設定すると、
「許可されていない拡張子です」
というエラーがでてアップロードされません。こんなコードで発覚。
CIのバージョンは1.7.1です。
$config['allowed_types'] = &#8216;gif&#124;jpg&#124;png&#124;zip&#124;txt&#8217;;
// その他config設定は省略
$this-&#62;load-&#62;library(&#8216;upload&#8217;, $config);
$this-&#62;upload-&#62;do_upload();
こう書くと、画像以外のzipファイルをアップロードしたときにはうまくアップロードされません。
でも、$config['allowed_types']の項目は必須設定です。
「う～ん、なんでかなぁ」と思いながらソースを読んでいたら、

system/libraries/Upload.php line:566くらい
// Images get some additional checks
if (in_array($val, $image_types))
{
　　if (getimagesize($this-&#62;file_temp) === FALSE)
　　{
　　　　return FALSE;
　　}
}

と、こんな記述を発見。ちなみに$image_typesには画像拡張子の配列が、$valにはallowed_typesで設定した拡張子（&#124;で分割されています）
が入っています。
これだと、allowed_typesの中に画像系の拡張子が入っていると全てgetimagesize()が実行されます。
で、画像ファイル以外なら当然FALSEが返ります。その結果、アップロードは失敗。
これだと困るので、以下にように追記したらうまく動きました。

// Images get some additional checks
// 画像系の拡張子で、かつアップロードされたファイルの拡張子の末尾が画像系拡張子であればチェック
if (in_array($val, $image_types) &#38;&#38; strpos(substr($this-&#62;file_ext, 0), $val) !== FALSE)
{
　　if (getimagesize($this-&#62;file_temp) === FALSE)
　　{
　　　　return FALSE;
　　}
}

　
「strpos(substr($this-&#62;file_ext, 0), $val) !== FALSE」
とすることで、アップロードされたファイルの拡張子もチェックし、TRUEならgetimagesize()やってくれ、ってことです。
$this-&#62;file_extにはドットを含む拡張子の情報が入っているので、substrで1文字目をカットしてます。
セキュリティ的にどうなのかと言われるとアレですが、そもそも画像以外をアップロードさせるアプリケーションはそれだけリスクが高まるので、仕方無いですかね。
私は恒久的に使うのでコアに追記しましたが、疑り深い方はMY_Upload.phpなどでオーバーライドしたほうがいいかもです。
]]></description>
			<content:encoded><![CDATA[<p>全然PHPのネタが無かったので、ちょっとやってみようかと思います。</p>
<p>とある開発でCodeIgniterのUploadクラスを使っていたのですが、<br />
アップロードされたファイルに対して、許可する拡張子を画像＋その他拡張子（例えばzipとかtxtとか）に設定すると、</p>
<p>「許可されていない拡張子です」</p>
<p>というエラーがでてアップロードされません。こんなコードで発覚。<br />
CIのバージョンは1.7.1です。</p>
<blockquote><p>$config['allowed_types'] = &#8216;gif|jpg|png|zip|txt&#8217;;</p>
<p>// その他config設定は省略</p>
<p>$this-&gt;load-&gt;library(&#8216;upload&#8217;, $config);</p>
<p>$this-&gt;upload-&gt;do_upload();</p></blockquote>
<p>こう書くと、画像以外のzipファイルをアップロードしたときにはうまくアップロードされません。<br />
でも、$config['allowed_types']の項目は必須設定です。</p>
<p>「う～ん、なんでかなぁ」と思いながらソースを読んでいたら、</p>
<blockquote><p>
system/libraries/Upload.php line:566くらい</p>
<p>// Images get some additional checks<br />
if (in_array($val, $image_types))<br />
{<br />
　　if (getimagesize($this-&gt;file_temp) === FALSE)<br />
　　{<br />
　　　　return FALSE;<br />
　　}<br />
}</p>
</blockquote>
<p>と、こんな記述を発見。ちなみに$image_typesには画像拡張子の配列が、$valにはallowed_typesで設定した拡張子（|で分割されています）<br />
が入っています。</p>
<p>これだと、allowed_typesの中に画像系の拡張子が入っていると全てgetimagesize()が実行されます。<br />
で、画像ファイル以外なら当然FALSEが返ります。その結果、アップロードは失敗。</p>
<p>これだと困るので、以下にように追記したらうまく動きました。</p>
<blockquote><p>
// Images get some additional checks<br />
// 画像系の拡張子で、かつアップロードされたファイルの拡張子の末尾が画像系拡張子であればチェック<br />
if (in_array($val, $image_types) &amp;&amp; strpos(substr($this-&gt;file_ext, 0), $val) !== FALSE)<br />
{<br />
　　if (getimagesize($this-&gt;file_temp) === FALSE)<br />
　　{<br />
　　　　return FALSE;<br />
　　}<br />
}
</p></blockquote>
<p>　</p>
<p>「strpos(substr($this-&gt;file_ext, 0), $val) !== FALSE」</p>
<p>とすることで、アップロードされたファイルの拡張子もチェックし、TRUEならgetimagesize()やってくれ、ってことです。<br />
$this-&gt;file_extにはドットを含む拡張子の情報が入っているので、substrで1文字目をカットしてます。</p>
<p>セキュリティ的にどうなのかと言われるとアレですが、そもそも画像以外をアップロードさせるアプリケーションはそれだけリスクが高まるので、仕方無いですかね。</p>
<p>私は恒久的に使うのでコアに追記しましたが、疑り深い方はMY_Upload.phpなどでオーバーライドしたほうがいいかもです。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=182</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Subversionのリポジトリツリーを図にするには？</title>
		<link>http://neo-navi.net/stuff/?p=174</link>
		<comments>http://neo-navi.net/stuff/?p=174#comments</comments>
		<pubDate>Mon, 05 Apr 2010 08:32:13 +0000</pubDate>
		<dc:creator>sakurai</dc:creator>
				<category><![CDATA[お知らせ]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=174</guid>
		<description><![CDATA[最近、Subversionのリポジトリ管理に頭を悩ませることが多いです。
どうブランチ切ったか？　どこからどこまでマージした？　このタグはいつのスナップショット？
その時その時はきちんと名前付けやコメント付けをやってるつもりでも、後から見直してみると「ダメだ・・・このリポジトリは腐ってる・・・」とため息をつくことになるのは、僕だけなんでしょうか（笑）
ので、「とりあえず図にしてみればいいんじゃないかな？」と安直に思ったんですが、MS Wordとかで描くのはつまらない。マウスはなるべく触りたくないし、手で図オブジェクトを操作するのは必ずミステークの原因になるのは目に見えてるし。
大体そういうのって、誰かがツール作ってそうだなぁとも思ったんですが、どうもググっても見つからない。うーん。
だんだん考えるのもめんどくさくなってきて、
「とりあえずGraphViz使えばいいんじゃね？」
という結論にたどり着きました。
コードと図のサンプルはこちら。

digraph repositoryTree {
subgraph cluster_trunk {
fillcolor = &#8220;#00DDFF&#8221;;
style = filled;
label = &#8220;trunk&#8221;;
r381 [ style = filled ];
r537 [ style = filled ];
r541 [ style = filled ];
r381 -&#62; r537;
r537 -&#62; r541;
}
subgraph cluster_branches {
fillcolor = &#8220;#FF8888&#8243;;
style = filled;
label = &#8220;branches&#8221;;
subgraph cluster_dev_ktai {
fillcolor = &#8220;#FFFF00&#8243;;
style = filled;
label = &#8220;dev_ktai&#8221;
r382 [ style = filled ];
r538 [ style = [...]]]></description>
			<content:encoded><![CDATA[<p>最近、Subversionのリポジトリ管理に頭を悩ませることが多いです。</p>
<p>どうブランチ切ったか？　どこからどこまでマージした？　このタグはいつのスナップショット？<br />
その時その時はきちんと名前付けやコメント付けをやってるつもりでも、後から見直してみると「ダメだ・・・このリポジトリは腐ってる・・・」とため息をつくことになるのは、僕だけなんでしょうか（笑）</p>
<p>ので、「とりあえず図にしてみればいいんじゃないかな？」と安直に思ったんですが、MS Wordとかで描くのはつまらない。マウスはなるべく触りたくないし、手で図オブジェクトを操作するのは必ずミステークの原因になるのは目に見えてるし。<br />
大体そういうのって、誰かがツール作ってそうだなぁとも思ったんですが、どうもググっても見つからない。うーん。</p>
<p>だんだん考えるのもめんどくさくなってきて、<br />
「とりあえずGraphViz使えばいいんじゃね？」<br />
という結論にたどり着きました。</p>
<p>コードと図のサンプルはこちら。</p>
<p><a href="http://neo-navi.net/stuff/wp-content/uploads/2010/04/repository.png"><img class="alignnone size-medium wp-image-175" title="repository" src="http://neo-navi.net/stuff/wp-content/uploads/2010/04/repository-171x300.png" alt="リポジトリツリー画像サンプル" width="171" height="300" /></a></p>
<blockquote><p>digraph repositoryTree {<br />
subgraph cluster_trunk {<br />
fillcolor = &#8220;#00DDFF&#8221;;<br />
style = filled;<br />
label = &#8220;trunk&#8221;;<br />
r381 [ style = filled ];<br />
r537 [ style = filled ];<br />
r541 [ style = filled ];</p>
<p>r381 -&gt; r537;<br />
r537 -&gt; r541;<br />
}</p>
<p>subgraph cluster_branches {<br />
fillcolor = &#8220;#FF8888&#8243;;<br />
style = filled;<br />
label = &#8220;branches&#8221;;<br />
subgraph cluster_dev_ktai {<br />
fillcolor = &#8220;#FFFF00&#8243;;<br />
style = filled;<br />
label = &#8220;dev_ktai&#8221;<br />
r382 [ style = filled ];<br />
r538 [ style = filled ];<br />
r542 [ style = filled ];</p>
<p>r382 -&gt; r538;<br />
r538 -&gt; r542;<br />
}<br />
}</p>
<p>r381 -&gt; r382 [ headlabel = "ブランチ作成" fontsize = 8 fontcolor = "#FF0000" ];<br />
r537 -&gt; r538 [ headlabel = "merge" fontsize = 8 fontcolor = "#0000FF" ];<br />
r541 -&gt; r542 [ headlabel = "merge" fontsize = 8 fontcolor = "#0000FF" ];<br />
}</p></blockquote>
<p>おっ、意外と見やすい・・・と思う。うん。</p>
<p>個人的にはこれで満足。dotファイル書くのは面倒かもしれないけど、ある程度下地できたらコピペでOKだし。<br />
ちなみに、もうちょっと大きい例はこんな感じ。(ウチのとあるリポジトリから。気まずい部分は黒く塗りつぶしてます)</p>
<p><a href="http://neo-navi.net/stuff/wp-content/uploads/2010/04/repository1.png"><img class="alignnone size-medium wp-image-177" title="repository" src="http://neo-navi.net/stuff/wp-content/uploads/2010/04/repository1-177x300.png" alt="" width="177" height="300" /></a></p>
<p>ちょっとゴチャついてますが、慣れるとどのブランチがどれにマージされてるかなどが1〜2ステップで分かるようになります。<br />
結構いいと思うんだけど、どうかなー。</p>
<p>あと頑張れば自動生成できそうな予感。誰か作ってないかなぁ。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=174</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ものすごく意味のないコード</title>
		<link>http://neo-navi.net/stuff/?p=169</link>
		<comments>http://neo-navi.net/stuff/?p=169#comments</comments>
		<pubDate>Mon, 18 Jan 2010 12:56:01 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[お知らせ]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=169</guid>
		<description><![CDATA[jQueryのこと書いてたら思いついた。
既出かな？
$(function(){
alert($($($($($($($(&#8216;#box&#8217;).get()).get()).get()).get()).get()).get()));

});
さて、結果はHTML Elementでしょうか？jQueryオブジェクトでしょうか？

答え：どうでもいい（笑）

一応、jQueryオブジェクトです。
]]></description>
			<content:encoded><![CDATA[<p>jQueryのこと書いてたら思いついた。</p>
<p>既出かな？</p>
<p>$(function(){</p>
<p>alert($($($($($($($(&#8216;#box&#8217;).get()).get()).get()).get()).get()).get()));<br />
<br />
});</p>
<p>さて、結果はHTML Elementでしょうか？jQueryオブジェクトでしょうか？<br />
</p>
<p>答え：どうでもいい（笑）</p>
<p></p>
<p>一応、jQueryオブジェクトです。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=169</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>7バイトでIEかどうかを判定する方法</title>
		<link>http://neo-navi.net/stuff/?p=161</link>
		<comments>http://neo-navi.net/stuff/?p=161#comments</comments>
		<pubDate>Tue, 05 Jan 2010 06:18:37 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[お知らせ]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=161</guid>
		<description><![CDATA[少し前に、JScriptの条件付きコンパイルを使ってIEを判定する方法が流行りました。
var IE = /*@cc_on!@*/false;
とかやる方法ですね。
ただ、条件付きコンパイルは遅くなるだとか（信憑性は不明ですが）聞いたので使ってませんでした。
で、タイトルの方法。こう書くそうです。
var IE = !+&#8221;\v1&#8243;;
これで、IEはtrue,それ以外はfalseとなります（Opera,Safari,Firefox,Chromeで検証）。
swfObject.jsのソースを読んでたらこんなことしてるもんだから、もとネタを見たらちゃんと解説もしてありました。ちょろっと見たことを書いてみます。
→もとネタ　http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html
どうやら、\vは通常のブラウザはvertical space（改行つきスペース？）の文字として認識するようで、
var IE = !(+
1
)
と認識するようですね。で、1の否定で0だからfalse。うん、納得。
しかし、IEは\vは文字列として認識するようで、
var IE = !(+v)
カッコ内の結果をisNaNしてtrueになるようです。
こんなのよく考えたなぁ、と関心しながら自分のフレームワークに取り込みました。
indexOfでuserAgent判定してたから、その分早くなったかなぁ。
・・・でもこれってJScriptの解釈のせいなのかな？IE9からできなかったりして。
そうなったら元に戻すしかないね。
]]></description>
			<content:encoded><![CDATA[<p>少し前に、JScriptの条件付きコンパイルを使ってIEを判定する方法が流行りました。</p>
<p>var IE = /*@cc_on!@*/false;</p>
<p>とかやる方法ですね。</p>
<p>ただ、条件付きコンパイルは遅くなるだとか（信憑性は不明ですが）聞いたので使ってませんでした。</p>
<p>で、タイトルの方法。こう書くそうです。</p>
<p>var IE = !+&#8221;\v1&#8243;;</p>
<p>これで、IEはtrue,それ以外はfalseとなります（Opera,Safari,Firefox,Chromeで検証）。</p>
<p>swfObject.jsのソースを読んでたらこんなことしてるもんだから、もとネタを見たらちゃんと解説もしてありました。ちょろっと見たことを書いてみます。</p>
<p>→もとネタ　<a href="http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html">http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html</a></p>
<p>どうやら、\vは通常のブラウザはvertical space（改行つきスペース？）の文字として認識するようで、</p>
<blockquote><p>var IE = !(+</p>
<p>1</p>
<p>)</p></blockquote>
<p>と認識するようですね。で、1の否定で0だからfalse。うん、納得。</p>
<p>しかし、IEは\vは文字列として認識するようで、</p>
<blockquote><p>var IE = !(+v)</p></blockquote>
<p>カッコ内の結果をisNaNしてtrueになるようです。</p>
<p>こんなのよく考えたなぁ、と関心しながら自分のフレームワークに取り込みました。</p>
<p>indexOfでuserAgent判定してたから、その分早くなったかなぁ。</p>
<p>・・・でもこれってJScriptの解釈のせいなのかな？IE9からできなかったりして。</p>
<p>そうなったら元に戻すしかないね。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=161</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>セレクタ検索系でIEが遅くなる理由</title>
		<link>http://neo-navi.net/stuff/?p=158</link>
		<comments>http://neo-navi.net/stuff/?p=158#comments</comments>
		<pubDate>Mon, 30 Nov 2009 03:10:07 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[セレクタ]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=158</guid>
		<description><![CDATA[セレクタ検索を独自に実装されている方は多いと思いますが、どうにもIE（特にIE6、7）が遅いと感じることはありませんか？
もちろん、JScriptのエンジン自体が遅いからなのですが、それ以外にもちょっとしたことで速度が改善したりします。
特に私が感じたのは、「NodeList」のループの部分です。
var list = document.getElementsByTagName(&#8216;p&#8217;);
for (var i = 0; i &#60; list.length; i++) {
// do something
};
と書くことが多いかと思います。しかし、これは遅いです。
var list = document.getElementsByTagName(&#8216;p&#8217;), len = list.length;
for (var i = 0; i &#60; len; i++) {
// do something
};
これだと数倍早く動きます。600回くらいのループで検証しました（内部処理は++countくらいで）が、
前者はIE6で約500ms、後者だと20数msでループが完了しました。
NodeListはSnapShotではなくLiveなものだから、ループの際に逐一「.length」の変化を見てるのかな？
もしくはNodeList.lengthのアクセス自体が遅いのか。
どちらかはわかりませんが、とにかくループ前にNodeListの長さを変数に格納してループすると
早くなるようです。
「数msくらい気にしない」、もしくは「IEはこんなもん」と思うのならさほど気にしなくてもよさそうですが、検索が遅いとその後の処理も遅くなってしまいますよね。
※どうもセレクタ検索を書くと速度のチューニングにハマって仕事にならないですね。
とりあえずトータルではjQueryより早ければいいかな。
]]></description>
			<content:encoded><![CDATA[<p>セレクタ検索を独自に実装されている方は多いと思いますが、どうにもIE（特にIE6、7）が遅いと感じることはありませんか？</p>
<p>もちろん、JScriptのエンジン自体が遅いからなのですが、それ以外にもちょっとしたことで速度が改善したりします。</p>
<p>特に私が感じたのは、「NodeList」のループの部分です。</p>
<p>var list = document.getElementsByTagName(&#8216;p&#8217;);</p>
<p>for (var i = 0; i &lt; list.length; i++) {</p>
<p>// do something</p>
<p>};</p>
<p>と書くことが多いかと思います。しかし、これは遅いです。</p>
<p>var list = document.getElementsByTagName(&#8216;p&#8217;), len = list.length;</p>
<p>for (var i = 0; i &lt; len; i++) {</p>
<p>// do something</p>
<p>};</p>
<p>これだと数倍早く動きます。600回くらいのループで検証しました（内部処理は++countくらいで）が、</p>
<p>前者はIE6で約500ms、後者だと20数msでループが完了しました。</p>
<p>NodeListはSnapShotではなくLiveなものだから、ループの際に逐一「.length」の変化を見てるのかな？</p>
<p>もしくはNodeList.lengthのアクセス自体が遅いのか。</p>
<p>どちらかはわかりませんが、とにかくループ前にNodeListの長さを変数に格納してループすると</p>
<p>早くなるようです。</p>
<p>「数msくらい気にしない」、もしくは「IEはこんなもん」と思うのならさほど気にしなくてもよさそうですが、検索が遅いとその後の処理も遅くなってしまいますよね。</p>
<p>※どうもセレクタ検索を書くと速度のチューニングにハマって仕事にならないですね。</p>
<p>とりあえずトータルではjQueryより早ければいいかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=158</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>IEほど手間のかかるブラウザはないね。</title>
		<link>http://neo-navi.net/stuff/?p=156</link>
		<comments>http://neo-navi.net/stuff/?p=156#comments</comments>
		<pubDate>Fri, 06 Nov 2009 12:10:26 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=156</guid>
		<description><![CDATA[IE8が出てしばらく経ちますが、やはりIEの独自仕様に悩まされることは多々ありますよね。
addEventListenerがattachEventだったりgetAttribute(&#8216;className&#8217;)だったりnew ActiveXObjectだったりで・・・。
「Firefoxだけで動けばいい」という開発だったら工数は3分の1になりそうな感じです（ライブラリ未使用で）。
とはいえ、最近はIEの挙動不審が可愛く思えてきました。
「手間のかかる子ほど可愛い」とはよく言ったものですが、
ここまで手間がかかると逆に面白いくらいです。
もしもこの世界にIEしかなかったとしたら、それはそれで面白いことになりそうな気がしますね。
JavaScriptの至上命題は「クロスブラウザ」、これに尽きます。
いろいろと動くアプリケーションは簡単に設計できますが、「どのブラウザでも動く」アプリケーションは難しい。
本当に難しい。canvasなんて使った日にはもうお手上げでしょうか。
「IEの実装差分をどれだけ吸収できるか」が良いJavaScripterなのかもしれません。
・・・さすがにIE5とかは手がつけられませんが（笑）
]]></description>
			<content:encoded><![CDATA[<p>IE8が出てしばらく経ちますが、やはりIEの独自仕様に悩まされることは多々ありますよね。</p>
<p>addEventListenerがattachEventだったりgetAttribute(&#8216;className&#8217;)だったりnew ActiveXObjectだったりで・・・。</p>
<p>「Firefoxだけで動けばいい」という開発だったら工数は3分の1になりそうな感じです（ライブラリ未使用で）。</p>
<p>とはいえ、最近はIEの挙動不審が可愛く思えてきました。</p>
<p>「手間のかかる子ほど可愛い」とはよく言ったものですが、</p>
<p>ここまで手間がかかると逆に面白いくらいです。</p>
<p>もしもこの世界にIEしかなかったとしたら、それはそれで面白いことになりそうな気がしますね。</p>
<p>JavaScriptの至上命題は「クロスブラウザ」、これに尽きます。</p>
<p>いろいろと動くアプリケーションは簡単に設計できますが、「どのブラウザでも動く」アプリケーションは難しい。</p>
<p>本当に難しい。canvasなんて使った日にはもうお手上げでしょうか。</p>
<p>「IEの実装差分をどれだけ吸収できるか」が良いJavaScripterなのかもしれません。</p>
<p>・・・さすがにIE5とかは手がつけられませんが（笑）</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=156</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>「native」はGoogle Chromeでは予約語だったみたい。</title>
		<link>http://neo-navi.net/stuff/?p=153</link>
		<comments>http://neo-navi.net/stuff/?p=153#comments</comments>
		<pubDate>Thu, 22 Oct 2009 11:21:14 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=153</guid>
		<description><![CDATA[自分のフレームワークを使っていて、どうにもGoogleChromeだけが動かない事態が発生しました。
IEだけ動かない、というケースには慣れっこですが（笑）、Chromeだけ動かないのは少し驚きました。
var e = hogehogeGetElement();
var native = e.hugahuga();
みたいなコードが動かなくて困りました。他のブラウザでは全部動いているのに・・・。
何がダメなんだろう、と試行錯誤の末、変数名を変えたら動いた。
var n = e.hugahuga();
「native」ってChromeでは予約語なのかな？この変数を定義すると動かないんですよね。
ちょっと稀な経験をしてしまいました。
]]></description>
			<content:encoded><![CDATA[<p>自分のフレームワークを使っていて、どうにもGoogleChromeだけが動かない事態が発生しました。</p>
<p>IEだけ動かない、というケースには慣れっこですが（笑）、Chromeだけ動かないのは少し驚きました。</p>
<p>var e = hogehogeGetElement();</p>
<p>var native = e.hugahuga();</p>
<p>みたいなコードが動かなくて困りました。他のブラウザでは全部動いているのに・・・。</p>
<p>何がダメなんだろう、と試行錯誤の末、変数名を変えたら動いた。</p>
<p>var n = e.hugahuga();</p>
<p>「native」ってChromeでは予約語なのかな？この変数を定義すると動かないんですよね。</p>
<p>ちょっと稀な経験をしてしまいました。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=153</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>ドキュメントのレンダリングモードを知る方法</title>
		<link>http://neo-navi.net/stuff/?p=151</link>
		<comments>http://neo-navi.net/stuff/?p=151#comments</comments>
		<pubDate>Sun, 11 Oct 2009 13:12:22 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=151</guid>
		<description><![CDATA[最近はそれほどでもないですが、IE6などでは「後方互換モード」になるケースが多々あります。
DOCTYPEスイッチだとか、いろいろな要因で後方互換モードになってしまうのですが、ここいらで簡単にチェックできる方法があるのでご紹介したいと思います。
javascript:alert(document.compatMode);
こんなJavaScriptをロケーションバーに打ち込んでみてください。ダイアログが出てきます。
CSS1Compat
もしくは、
backCompat
なんてアラーとが出ますね。「CSS1Compat」なら標準モード、「backCompat」なら後方互換モードでレンダリングされている、という感じです。
最近のモダンブラウザなら大概はCSS1Compatでしょうが、IE6等でレイアウトが決まらないときにはチェックしてみるのもいいかも知れませんね。
・・・知ったからどうなの？というのは別問題ですが＞＜参考までに。
]]></description>
			<content:encoded><![CDATA[<p>最近はそれほどでもないですが、IE6などでは「後方互換モード」になるケースが多々あります。</p>
<p>DOCTYPEスイッチだとか、いろいろな要因で後方互換モードになってしまうのですが、ここいらで簡単にチェックできる方法があるのでご紹介したいと思います。</p>
<p>javascript:alert(document.compatMode);</p>
<p>こんなJavaScriptをロケーションバーに打ち込んでみてください。ダイアログが出てきます。</p>
<p>CSS1Compat</p>
<p>もしくは、</p>
<p>backCompat</p>
<p>なんてアラーとが出ますね。「CSS1Compat」なら標準モード、「backCompat」なら後方互換モードでレンダリングされている、という感じです。</p>
<p>最近のモダンブラウザなら大概はCSS1Compatでしょうが、IE6等でレイアウトが決まらないときにはチェックしてみるのもいいかも知れませんね。</p>
<p>・・・知ったからどうなの？というのは別問題ですが＞＜参考までに。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=151</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>速度の問題か好みの問題かな。</title>
		<link>http://neo-navi.net/stuff/?p=148</link>
		<comments>http://neo-navi.net/stuff/?p=148#comments</comments>
		<pubDate>Tue, 25 Aug 2009 01:10:20 +0000</pubDate>
		<dc:creator>sugimoto</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=148</guid>
		<description><![CDATA[最近新しく発刊された某書籍でJavaScriptで要素のCSSの値を数値で取得するところが気になった。
みなさんは普段どうやられているのかわかりませんが、要素elmを取ったとして、widthの値を数値で取る時、
var width = parseInt(elm.style.width)
と私はやります。書籍では、
var width = eval(elm.style.width.replace(&#8216;px&#8217;, &#8221;))
ってやってた。う～ん、まぁこの方法もアリだとは思うんですけど。
前者だとisNaNのチェックが必要になる分手間かな、とも思ったのですが、後者は結局undefinedのチェックをしないといけないわけで。どっちも一緒かもしれないですね。
時間があったので1000回繰り返す速度計測してみた。どうでもいいだろうけど。
window.onload = function() {
var div = document.getElementById(&#8216;test&#8217;), w, w2;
var st = (new Date()).getTime();
for (var i = 0; i &#60; 1000; i++) {
w = parseInt(div.style.width);
w = (isNaN(w)) ? div.style.width : w;
}
var ed = (new Date()).getTime();
var time = ed &#8211; st;
alert(&#8216;result : &#8216; + w + &#8216; , type : [...]]]></description>
			<content:encoded><![CDATA[<p>最近新しく発刊された某書籍でJavaScriptで要素のCSSの値を数値で取得するところが気になった。</p>
<p>みなさんは普段どうやられているのかわかりませんが、要素elmを取ったとして、widthの値を数値で取る時、</p>
<p>var width = parseInt(elm.style.width)</p>
<p>と私はやります。書籍では、</p>
<p>var width = eval(elm.style.width.replace(&#8216;px&#8217;, &#8221;))</p>
<p>ってやってた。う～ん、まぁこの方法もアリだとは思うんですけど。</p>
<p>前者だとisNaNのチェックが必要になる分手間かな、とも思ったのですが、後者は結局undefinedのチェックをしないといけないわけで。どっちも一緒かもしれないですね。</p>
<p>時間があったので1000回繰り返す速度計測してみた。どうでもいいだろうけど。</p>
<p>window.onload = function() {<br />
var div = document.getElementById(&#8216;test&#8217;), w, w2;<br />
var st = (new Date()).getTime();<br />
for (var i = 0; i &lt; 1000; i++) {<br />
w = parseInt(div.style.width);<br />
w = (isNaN(w)) ? div.style.width : w;<br />
}<br />
var ed = (new Date()).getTime();<br />
var time = ed &#8211; st;<br />
alert(&#8216;result : &#8216; + w + &#8216; , type : &#8216; + typeof w + &#8216; , time : &#8216; + time);<br />
var st2 = (new Date()).getTime();<br />
for (var i = 0; i &lt; 1000; i++) {<br />
w2 = eval(div.style.width.replace(&#8216;px&#8217;, &#8221;));<br />
w2 = (typeof w2 == &#8216;undefined&#8217;) ? &#8221; : w2;<br />
}<br />
var ed2 = (new Date()).getTime();<br />
var time2 = ed2 &#8211; st2;<br />
alert(&#8216;result2 : &#8216; + w2 + &#8216; , type : &#8216; + typeof w2 + &#8216; , time : &#8216; + time2);<br />
}</p>
<p>どっちも無ければ空値を返すようにしました。結果は表にするのも面倒なので大体の平均値を。</p>
<p>Firefox3.5   前者　：　6～8ms　、　後者　：　9～14ms</p>
<p>IE8              前者　：　15～16ms(max 31ms)　、　後者　：　15～16ms(max 31ms)</p>
<p>２つしかやってないけど、ややparseIntの方が早いかな？IEはどっちでも同じみたい。意味不明。</p>
<p>好みの問題だと言えばそうかもしれませんが、コンパイラを起動させるevalはあまり使うべきではないかと思います、個人的に。evalなんてresponseTextをJSONに変換する時くらいしか使わないけどなぁ。セキュリティ面でもよろしくない、と「JavaScript:The Good Parts」でも書かれてたし。</p>
<p>parseIntも遅いだろうけど、eval + String.replace()よりは早いってことかな。IE以外は。</p>
<p>CSSセットや値の取得なんて一番頻繁にやる部分だからできるだけ高速化しておきたいところですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=148</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>CodeIgniter読書会のキックオフセミナー開催</title>
		<link>http://neo-navi.net/stuff/?p=145</link>
		<comments>http://neo-navi.net/stuff/?p=145#comments</comments>
		<pubDate>Tue, 18 Aug 2009 02:19:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[お知らせ]]></category>
		<category><![CDATA[読書会]]></category>

		<guid isPermaLink="false">http://neo-navi.net/stuff/?p=145</guid>
		<description><![CDATA[今週の土曜日になりますが、PHPフレームワーク「CodeIgniter」の読書会を始めるためのキックオフセミナーを開催するに至りました。
実際は時間が1時間も無いため、具体的に突っ込んで読書を進めていくことはできないため、読書会の展望や進め方、各都市での開催予定について、お話します。
CakePHPなSymfonyなどの他フレームワーク使いの方々も振るってご参加ください。他のフレームワークを勉強することで、色々な考え方やアイディアも浮かんでくるんではないでしょうか？
セミナー時間割表
http://www.ospn.jp/osc2009-nagoya/modules/eventrsv/?id=1&#38;noform=1
セミナー会場
http://maps.google.co.jp/maps/ms?ie=UTF8&#38;hl=ja&#38;msa=0&#38;msid=108784144899608752188.0004497afc6c98eded884&#38;ll=35.141739,136.928444&#38;spn=0.012283,0.017166&#38;z=15&#38;iwloc=0004497b2056b8feb2e1f&#38;source=embed
参加費：無料
CodeIgniter読書会ML
http://groups.google.co.jp/group/codeigniter-reading
アマゾンのCodeIgniter徹底入門（￥3990）
http://www.amazon.co.jp/dp/4798116769/
]]></description>
			<content:encoded><![CDATA[<p>今週の土曜日になりますが、PHPフレームワーク「CodeIgniter」の読書会を始めるためのキックオフセミナーを開催するに至りました。</p>
<p>実際は時間が1時間も無いため、具体的に突っ込んで読書を進めていくことはできないため、読書会の展望や進め方、各都市での開催予定について、お話します。</p>
<p>CakePHPなSymfonyなどの他フレームワーク使いの方々も振るってご参加ください。他のフレームワークを勉強することで、色々な考え方やアイディアも浮かんでくるんではないでしょうか？</p>
<p>セミナー時間割表<br />
<a href="http://www.amazon.co.jp/dp/4798116769/" target="_blank">http://www.ospn.jp/osc2009-nagoya/modules/eventrsv/?id=1&amp;noform=1</a></p>
<p>セミナー会場<br />
<a href="http://maps.google.co.jp/maps/ms?ie=UTF8&amp;hl=ja&amp;msa=0&amp;msid=108784144899608752188.0004497afc6c98eded884&amp;ll=35.141739,136.928444&amp;spn=0.012283,0.017166&amp;z=15&amp;iwloc=0004497b2056b8feb2e1f&amp;source=embed" target="_blank">http://maps.google.co.jp/maps/ms?ie=UTF8&amp;hl=ja&amp;msa=0&amp;msid=108784144899608752188.0004497afc6c98eded884&amp;ll=35.141739,136.928444&amp;spn=0.012283,0.017166&amp;z=15&amp;iwloc=0004497b2056b8feb2e1f&amp;source=embed</a></p>
<p>参加費：無料</p>
<p>CodeIgniter読書会ML<br />
<a href="http://groups.google.co.jp/group/codeigniter-reading" target="_blank">http://groups.google.co.jp/group/codeigniter-reading</a></p>
<p>アマゾンのCodeIgniter徹底入門（￥3990）<br />
<a href="http://www.amazon.co.jp/dp/4798116769/" target="_blank">http://www.amazon.co.jp/dp/4798116769/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://neo-navi.net/stuff/?feed=rss2&amp;p=145</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>
