<?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>@masuidrive blog &#187; Javascript</title>
	<atom:link href="http://blog.masuidrive.jp/index.php/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.masuidrive.jp</link>
	<description>life with open sources.</description>
	<lastBuildDate>Sat, 07 Jan 2012 18:37:25 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>【Titanium Advent Calendar 2011：五日目】Titanium Mobileでソケット通信</title>
		<link>http://blog.masuidrive.jp/index.php/2011/12/04/socket-with-titanium/</link>
		<comments>http://blog.masuidrive.jp/index.php/2011/12/04/socket-with-titanium/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 01:40:23 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Appcelerator]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[appcelerator]]></category>
		<category><![CDATA[javascript.socket]]></category>
		<category><![CDATA[tcp]]></category>
		<category><![CDATA[titanium mobile]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=570</guid>
		<description><![CDATA[　この記事は、@astronaughtsさんの「Titanium Advent Calendar 2011」企画で書いています。 　2011年もTitnium Mobileを使って頂きありがとうございました！まだ使ってない方は、この年末のお休みにでも、ぜひ試してみてください。来年は、日本法人設立など前半から大きな動きがあると思いますので、来年も引き続きよろしくお願いします。 　さて、本題ですが、ソケット通信の話になります。Titanium Mobile(以下Ti)では1.7からTCP通信の機能が充実しました。 　いままでTiの通信と言えばHTTPでしたが、これからはTCPソケットを使って、色々なサービスと通信することができるようになりました。 　ソケットと同時に、Tiでバイナリを扱うための、T.BufferとTi.Codecをサポートされ、ちょっと面倒ですがHTTP以外のプロトコルもバリバリ実装することができます。 　早速、ソケット通信の簡単な例を見ていきましょう。 var win = Ti.UI.createWindow({ title: "Win1" }); var textarea = Ti.UI.createTextArea({value: ''}); win.add(textarea); win.open(); // 読み込み用バッファ var readBuffer = Ti.createBuffer({length:1024}); // ソケット本体 var socket; socket = Ti.Network.Socket.createTCP({ host: "blog.masuidrive.jp", port: 80, connected: function(e) { // ソケットに接続された textarea.value += ">> Connected to host " + [...]]]></description>
			<content:encoded><![CDATA[				<p>　この記事は、<a href="http://twitter.com/astronaughts">@astronaughts</a>さんの「<a href="http://atnd.org/events/21951">Titanium Advent Calendar 2011</a>」企画で書いています。</p>
				<p>　2011年もTitnium Mobileを使って頂きありがとうございました！まだ使ってない方は、この年末のお休みにでも、ぜひ試してみてください。来年は、日本法人設立など前半から大きな動きがあると思いますので、来年も引き続きよろしくお願いします。</p>
				<p>　さて、本題ですが、ソケット通信の話になります。Titanium Mobile(以下Ti)では1.7からTCP通信の機能が充実しました。</p>
				<p>　いままでTiの通信と言えばHTTPでしたが、これからはTCPソケットを使って、色々なサービスと通信することができるようになりました。</p>
				<p>　ソケットと同時に、Tiでバイナリを扱うための、<a href="http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Buffer-object">T.Buffer</a>と<a href="http://developer.appcelerator.com/apidoc/mobile/latest/Titanium.Codec-module">Ti.Codec</a>をサポートされ、ちょっと面倒ですがHTTP以外のプロトコルもバリバリ実装することができます。</p>
				<p><span id="more-570"></span></p>
				<p>　早速、ソケット通信の簡単な例を見ていきましょう。</p>
				<p><img src="http://farm8.staticflickr.com/7164/6451767637_19c515c8e4.jpg" align="right"/><code>
				<pre style="width: 550px">
var win = Ti.UI.createWindow({ title: "Win1" });
var textarea = Ti.UI.createTextArea({value: ''});
win.add(textarea);
win.open();

// 読み込み用バッファ
var readBuffer = Ti.createBuffer({length:1024});

// ソケット本体
var socket;
socket = Ti.Network.Socket.createTCP({
  host: "blog.masuidrive.jp",
  port: 80,
  connected: function(e) { // ソケットに接続された
    textarea.value += ">> Connected to host " + socket.host + "\n";
    // 書き込むためのバイナリを作る
    var data = Ti.createBuffer({value:"GET /tmp/test.html HTTP/1.1\r\n"+
      "Host: blog.masuidrive.jp\r\n\r\n"});
    // ソケットに書き込む
    var bytesWritten = socket.write(data);

    var bytesRead;
    // 終わるまで読み込みループ
    while( (bytesRead = socket.read(readBuffer)) >= 0 ) {
      // 読み込んだバイナリを文字列に変換
	    var stringData = Ti.Codec.decodeString({
	      source: readBuffer, length: bytesRead });
  	  textarea.value += bytesRead + "> " + stringData + "\n";
  	  // 読み込みバッファをクリア
  	  readBuffer.clear();
    }
    // ソケットを閉じる
    socket.close();
  },
  closed: function(e) { // ソケットが閉じられた
    textarea.value += ">> Socket closed";
  }
});
socket.connect();
</pre>
				<p></code><br clear="right"/>　同期IOでは、上記のように書きます。ソケット通信の詳細は省きますが、他環境でソケットを扱ったことのある人であれば、分かると思います。ここまでは<a href="http://developer.appcelerator.com/blog/2011/05/titanium-mobile-intro-series-sockets.html">本家のブログ</a>でも解説されています。</p>
				<p>　実際にソケットプログラムをするときは、ほとんど非同期IOになると思います。しかし、本家記事では書いてない！と言うことで、</p>
				<p>　非同期IOでの書き方は下記の様になります。<br />
				<code>
				<pre>
var win = Ti.UI.createWindow({ title: "Win1" });
var textarea = Ti.UI.createTextArea({value: ''});
win.add(textarea);
win.open();

var socket;
var readBuffer = Ti.createBuffer({length:1024});

// データが読み込まれたときに呼ばれる
var readCallback = function(e) {
    // データが終了であれば、ソケットを閉じる
    if (e.bytesProcessed == -1) { // EOF
    	textarea.value += ">> Received socket closed\n";
    	socket.close();
        return;
    }

    // 読み込んだデータを表示
    var str = Ti.Codec.decodeString({source:readBuffer, length:e.bytesProcessed});
    textarea.value += e.bytesProcessed + "> " + str + "\n";

    // 次のデータが読み込まれる時のバッファとコールバックを設定
    Ti.Stream.read(socket, readBuffer, readCallback);
};

socket = Ti.Network.Socket.createTCP({
    host: "blog.masuidrive.jp",
    port: 80,
    connected: function(e) {
        // データが読み込まれる時のバッファとコールバックを設定
	    Ti.Stream.read(socket, readBuffer, readCallback);

        textarea.value += ">> Connected to host " + socket.host + "\n";

        // 書き込み処理
        var data = Ti.createBuffer({value:"GET /tmp/test.html HTTP/1.1\r\nHost: blog.masuidrive.jp\r\n\r\n"});
        var bytesWritten = socket.write(data);
    },
    closed: function(e) {
        textarea.value += ">> Socket closed";
    }
});
socket.connect();
</pre>
				<p></code></p>
				<p>　今度はデータが読み込まれる度に、readCallbackが呼ばれるようになりました。これを駆使する事で、TCPを使うほぼ全てのプロトコルを実装することができます。</p>
				<p>　私はこれを使って、<a href="http://ja.wikipedia.org/wiki/WebSocket">WebSocket</a>プロトコルを実装してみました。ソースは、<a href="https://github.com/masuidrive/ti-websocket-client">https://github.com/masuidrive/ti-websocket-client</a>で公開しています。</p>
				<p>　リアルタイムチャットなど、長時間のセッションを張りたい時にはHTTPを使えないので、このWebSocketを使う事で実現することができるようになります。</p>
				<p>　手元ではSocketIOでも動くようになっていて、本家にコミットしたいのですが、なんかSocketIO方向で大きな動きがあったので、色々追いかけないと行けないみたい orz</p>
				<p>　ソフトバンクの回線は80番ポートの通信にTransparency Proxyが入ってるようで、WebSocketなどHTTP 1.1以外のプロトコルが通ると一部通信内容がフィルタされるようです。iPhoneで通信をする場合は、80番ポート以外を使うことをオススメします。</p>
				<p>　明日は、<a href="https://twitter.com/ryugoo_">ryugoo_</a>さんです！よろしくお願いします！！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2011/12/04/socket-with-titanium/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>nodejs本体をdebugする方法</title>
		<link>http://blog.masuidrive.jp/index.php/2010/03/10/nodejs%e6%9c%ac%e4%bd%93%e3%82%92debug%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/03/10/nodejs%e6%9c%ac%e4%bd%93%e3%82%92debug%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 21:42:40 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[nodejs]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[node]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=371</guid>
		<description><![CDATA[　nodejsでsegmentation faultが出た場合は、下記のようにdebug付きnodeをコンパイルして、gdbで実行。 (extract source code) ./configure --debug &#038;&#038; make gdb --args ./node_g myscript.js run (make it crash) backtrace via Segmentation Fault, how to debug? &#8211; nodejs &#124; Google Groups.]]></description>
			<content:encoded><![CDATA[				<p>　<a href="http://nodejs.org/">nodejs</a>でsegmentation faultが出た場合は、下記のようにdebug付きnodeをコンパイルして、gdbで実行。</p>
				<pre><code>(extract source code)
./configure --debug &#038;&#038; make
gdb --args ./node_g myscript.js
run
(make it crash)
backtrace</code></pre>
				<p>via <a href="http://groups.google.com/group/nodejs/browse_thread/thread/e206075b03677a91/99a3982b2722f5e0?show_docid=99a3982b2722f5e0">Segmentation Fault, how to debug? &#8211; nodejs | Google Groups</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/03/10/nodejs%e6%9c%ac%e4%bd%93%e3%82%92debug%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Google V8ってruntimeのドキュメントないのか</title>
		<link>http://blog.masuidrive.jp/index.php/2010/02/21/google-v8-doesnt-have-specifications/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/02/21/google-v8-doesnt-have-specifications/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 09:36:07 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=356</guid>
		<description><![CDATA[　Google V8ってruntimeの仕様とかドキュメントないのかー。orz 　ECMAScript 3rd editionベースなんだけど、5th editionの機能もちょこちょこ入っていて、どれをサポートしているかソースを読まないとわからないんだよなぁ。 　どっかまとまってるところ知りませんか？＞誰か]]></description>
			<content:encoded><![CDATA[				<p> 　Google V8ってruntimeの仕様とかドキュメントないのかー。orz</p>
				<p>　<a href="http://ja.wikipedia.org/wiki/ECMAScript">ECMAScript</a> 3rd editionベースなんだけど、5th editionの機能もちょこちょこ入っていて、どれをサポートしているかソースを読まないとわからないんだよなぁ。</p>
				<p>　どっかまとまってるところ知りませんか？＞誰か</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/02/21/google-v8-doesnt-have-specifications/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[訂正版] Javascriptでクラスを継承する</title>
		<link>http://blog.masuidrive.jp/index.php/2010/02/15/inherited-javascript/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/02/15/inherited-javascript/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 02:44:18 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=340</guid>
		<description><![CDATA[Photo by spud murphy 　先ほどの記事のコードにミスがあり、継承を行うと、親クラスも書き換えてしまうバグがありました。コメントやTwitterで報告いただいた方々ありがとうございます。 　あの後、調べて見れると、あまりスマートに継承を実現する方法は無いみたいですが、ユーザが作ったクラス(StringなどのAtomic型を除く)は下記のコードで継承が行えます。 　特に、Array型を継承するのは、無理なようです。[]を上書きできないので、どうしようも無いみたいです。残念。 &#60;body&#62; &#60;div id="result"&#62;&#60;/div&#62; &#60;script&#62; var puts = function(str) { var el = document.getElementById('result'); el.innerHTML = el.innerHTML + str + "&#60;br/&#62;"; } // クラスを継承する extendClass = function(subClass, baseClass) { var inheritance = function() { }; inheritance.prototype = baseClass.prototype; subClass.prototype = new inheritance(); subClass.prototype.constructor = subClass; subClass.baseConstructor = baseClass; subClass.superClass [...]]]></description>
			<content:encoded><![CDATA[				<p class="eyecatch_photo"><img src="http://farm3.static.flickr.com/2240/2219132087_373029368d_m.jpg"/><span class="photo_by">Photo by <a href="http://www.flickr.com/photos/spudmurphy/" title="Link to spud murphy's photostream" rel="dc:creator cc:attributionURL"><b property="foaf:name">spud murphy</b></a></span></p>
				<p>　<a href="http://blog.masuidrive.jp/index.php/2010/02/14/inheritance-on-javascript/">先ほどの記事</a>のコードにミスがあり、継承を行うと、親クラスも書き換えてしまうバグがありました。コメントやTwitterで報告いただいた方々ありがとうございます。</p>
				<p>　あの後、調べて見れると、あまりスマートに継承を実現する方法は無いみたいですが、ユーザが作ったクラス(StringなどのAtomic型を除く)は下記のコードで継承が行えます。<br />
				　特に、Array型を継承するのは、無理なようです。[]を上書きできないので、どうしようも無いみたいです。残念。<br />
				<span id="more-340"></span></p>
				<pre>
&lt;body&gt;
&lt;div id="result"&gt;&lt;/div&gt;
&lt;script&gt;
var puts = function(str) {
    var el = document.getElementById('result');
    el.innerHTML = el.innerHTML + str + "&lt;br/&gt;";
}

// クラスを継承する
extendClass = function(subClass, baseClass) {
   var inheritance = function() { };
   inheritance.prototype = baseClass.prototype;

   subClass.prototype = new inheritance();
   subClass.prototype.constructor = subClass;
   subClass.baseConstructor = baseClass;
   subClass.superClass = baseClass.prototype;
}

var Parent = function(n) {
    this.n = n;
}
Parent.prototype.display1 = function() {
    puts("parent display1:"+this.n);
}
Parent.prototype.display2 = function() {
    puts("parent display2:"+this.n*2);
}

var Child = function(n) {
    Child.baseConstructor.apply(this, [n*2]);
}
extendClass(Child, Parent);

Child.prototype.display2 = function() {
    puts("child display2(over):"+this.n*2);
}

Child.prototype.display3 = function() {
    puts("child display3:"+this.n);
}

var child = new Child(1);
child.display1();
child.display2();
child.display3();
puts("&lt;hr/&gt;");

var parent = new Parent(1);
parent.display1();
parent.display2();

&lt;/script&gt;&lt;/body&gt;
&lt;/html&gt;
</pre>
				<p>参考　</p>
				<ul>
				<li><a href="http://d.hatena.ne.jp/sawat/20070221/cant_extends_array">この方法ではArrayを継承することは… できないッ！ &#8211; sawatの日記</a></li>
				<li><a href="http://kevlindev.com/tutorials/javascript/inheritance/index.htm">KevLinDev &#8211; Tutorials &#8211; JavaScript</a></li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/02/15/inherited-javascript/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[間違え] Javascriptでクラスの継承をする [訂正予定]</title>
		<link>http://blog.masuidrive.jp/index.php/2010/02/14/inheritance-on-javascript/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/02/14/inheritance-on-javascript/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 15:16:33 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=329</guid>
		<description><![CDATA[Photo by GLUEKITS 　すみません。下記記事は間違っています。近々訂正記事を書きます。 →訂正記事 Javascriptでクラスベースっぽく書いてる時に、継承したくなった場合の書き方。 ググってもすぐ出なかったのでメモ。 IE6,7,8 Firefox2,3,3.5 Safari 3,4で確認。 p.s node.jsに、MySQLドライバがないので、書き始めました。 &#60;html&#62; &#60;body&#62; &#60;div id="result"&#62;&#60;/div&#62; &#60;script&#62; var puts = function(str) { var el = document.getElementById('result'); el.innerHTML = el.innerHTML + str + "&#60;br/&#62;"; } var Parent = function(n) { this.n = n; } Parent.prototype = Array.prototype; Parent.prototype.display1 = function() { puts("display1:"+this.n); } Parent.prototype.display2 = [...]]]></description>
			<content:encoded><![CDATA[				<p class="eyecatch_photo"><img src="http://farm3.static.flickr.com/2150/2234732713_98d8daa2a1_m.jpg"/><span class="photo_by">Photo by <a href="http://www.flickr.com/photos/gluekit/" title="Link to GLUEKITS' photostream" rel="dc:creator cc:attributionURL"><b property="foaf:name">GLUEKITS</b></a></span></p>
				<p>　<strong>すみません。下記記事は間違っています。近々訂正記事を書きます。</strong></p>
				<p>→<a href="http://blog.masuidrive.jp/index.php/2010/02/15/inherited-javascript/">訂正記事</a></p>
				<p><strike>Javascriptでクラスベースっぽく書いてる時に、継承したくなった場合の書き方。</strike><br />
				ググってもすぐ出なかったのでメモ。</p>
				<p>IE6,7,8 Firefox2,3,3.5 Safari 3,4で確認。<br />
				<span id="more-329"></span><br />
				p.s<br />
				 <a href="http://nodejs.org">node.js</a>に、MySQLドライバがないので、<a href="http://github.com/masuidrive/node-mysql">書き始めました</a>。</p>
				<pre><strike>
&lt;html&gt;
&lt;body&gt;
&lt;div id="result"&gt;&lt;/div&gt;
&lt;script&gt;
var puts = function(str) {
var el = document.getElementById('result');
    el.innerHTML = el.innerHTML + str + "&lt;br/&gt;";
}

var Parent = function(n) {
    this.n = n;
}
<strong>Parent.prototype = Array.prototype;</strong>
Parent.prototype.display1 = function() {
    puts("display1:"+this.n);
}
Parent.prototype.display2 = function() {
    puts("display2: ERROR");
}

var Child = function(n) {
    <strong>Parent.apply(this, [n*2]); // 親クラスのコンストラクタを呼ぶ</strong>
}
<strong>Child.prototype = Parent.prototype;</strong>

Child.prototype.display2 = function() {
    puts("display2(over):"+this[0]);
}

Child.prototype.display3 = function() {
    puts("display3:"+this.n);
}

var child = new Child(1);
child.push(10);
child.push(20);
child.display1();
child.display2();
child.display3();
&lt;/script&gt;&lt;/body&gt;
&lt;/html&gt;</strike>
</pre>
				<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4873113296&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/02/14/inheritance-on-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[メモ] サーバサイドJavascriptのNode.jsをOSXにインストールする。</title>
		<link>http://blog.masuidrive.jp/index.php/2010/02/10/install-nodejs-to-osx/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/02/10/install-nodejs-to-osx/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 10:33:41 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=323</guid>
		<description><![CDATA[　自分メモ。Node.jsを、OSX上にインストールする。 node.jsのインストール curl -O http://s3.amazonaws.com/four.livejournal/20100209/node-v0.1.28.tar.gz tar xfz node-v0.1.28.tar.gz cd node-v0.1.28 ./configure make sudo make install dbslayerのインストール (要MacPorts) sudo port install apr apr-util db46 curl -O http://code.nytimes.com/downloads/dbslayer-beta-12.tgz tar xfz dbslayer-beta-12.tgz cd dbslayer ./configure make sudo make install]]></description>
			<content:encoded><![CDATA[				<p>　自分メモ。<a href="http://nodejs.org">Node.js</a>を、OSX上にインストールする。</p>
				<h2>node.jsのインストール</h2>
				<pre>
curl -O http://s3.amazonaws.com/four.livejournal/20100209/node-v0.1.28.tar.gz
tar xfz node-v0.1.28.tar.gz
cd node-v0.1.28
./configure
make
sudo make install
</pre>
				<h2>dbslayerのインストール (要MacPorts)</h2>
				<pre>
sudo port install apr apr-util db46

curl -O  http://code.nytimes.com/downloads/dbslayer-beta-12.tgz
tar xfz dbslayer-beta-12.tgz
cd dbslayer
./configure
make
sudo make install
</pre>
				<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4873113296&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/02/10/install-nodejs-to-osx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSSを拡張するプリプロセッサを考える</title>
		<link>http://blog.masuidrive.jp/index.php/2010/01/20/css-enhancer/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/01/20/css-enhancer/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 10:18:17 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=277</guid>
		<description><![CDATA[Photo by Aaron Landry 　CSSで、式とかマクロが使えたらなーと思うことがよくあるので、この際だからプリプロセッサを作ろうと思っています。 　文法としては、CSSの構造を大きく変えないで行きます。あくまでプリプロセッサ的な役割で。Sassの様に構文を変えてしまうと、デザイナーの人が取っつき難くなりそうで。 　今のところ、考えている文法の例を下に置きました。誰でも考えそうな所で、includeによる読み込み、ネストをサポート、式と制御構造のサポートを行います。 　このプリプロセッサはサーバサイドで動的に生成するのではなく、一度静的にCSSに変換して使うことを考えています。その為、User agentなど外部からの変数はサポートしません。 　使い方としては、コマンドラインツールによる変換と、Javascriptによる動的な読み込みをサポートする予定です。 開発中は、HTML内に&#60;script src=&#8221;ecss_loader.js?test.ecss&#8221;&#62;&#60;/script&#62;と書くことで、サーバに何も導入することなく、動的に拡張されたCSSを読み込むことが出来るようにします。 　文法や機能のアイディア、同じようなプロダクトを知っている！と言う方がいましたら、ぜひコメントお願いします。 例) %include "common.ecss"; %focus_color = "#4444ff"; %w = 32; %property x-opacity $value opacity: $(value); filter: alpha(opacity=$(value*100)); %end #mailbox { width: $(w+2+"px"); border: 1px solid gray; .item { width: $(w+"px"); } .focus { background-color: $(focus_color); } .disable { x-opacity: 0.5; } %for x [...]]]></description>
			<content:encoded><![CDATA[				<p class="eyecatch_photo"><img src="http://farm3.static.flickr.com/2054/2425718415_226f22a2fb_m.jpg"/><span class="photo_by">Photo by <a href="http://www.flickr.com/photos/s4xton/" title="Link to Aaron Landry's photostream" rel="dc:creator cc:attributionURL"><b property="foaf:name">Aaron Landry</b></a></span></p>
				<p>　CSSで、式とかマクロが使えたらなーと思うことがよくあるので、この際だからプリプロセッサを作ろうと思っています。</p>
				<p>　文法としては、CSSの構造を大きく変えないで行きます。あくまでプリプロセッサ的な役割で。<a href="http://sass-lang.com/">Sass</a>の様に構文を変えてしまうと、デザイナーの人が取っつき難くなりそうで。</p>
				<p>　今のところ、考えている文法の例を下に置きました。誰でも考えそうな所で、includeによる読み込み、ネストをサポート、式と制御構造のサポートを行います。</p>
				<p>　このプリプロセッサはサーバサイドで動的に生成するのではなく、一度静的にCSSに変換して使うことを考えています。その為、User agentなど外部からの変数はサポートしません。</p>
				<p>　使い方としては、コマンドラインツールによる変換と、Javascriptによる動的な読み込みをサポートする予定です。<br />
				開発中は、HTML内に&lt;script src=&#8221;ecss_loader.js?test.ecss&#8221;&gt;&lt;/script&gt;と書くことで、サーバに何も導入することなく、動的に拡張されたCSSを読み込むことが出来るようにします。</p>
				<p>　文法や機能のアイディア、同じようなプロダクトを知っている！と言う方がいましたら、ぜひコメントお願いします。<br />
				<span id="more-277"></span><br />
				例)</p>
				<pre>
%include "common.ecss";
%focus_color = "#4444ff";
%w = 32;
%property x-opacity $value
  opacity: $(value);
  filter: alpha(opacity=$(value*100));
%end

#mailbox {
  width: $(w+2+"px");
  border: 1px solid gray;
  .item {
    width: $(w+"px");
  }
  .focus {
    background-color: $(focus_color);
  }
  .disable {
    x-opacity: 0.5;
  }

%for x in ['red', 'green', 'blue']
  $(".item-"+x): background-color: $(x);
%end

%if debug==1
    .item {
      background: red !important;
    }
%end
}
</pre>
				<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4883375412&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4798010928&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4781912052&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/01/20/css-enhancer/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>緯度経度を文字列で表すGeoHash</title>
		<link>http://blog.masuidrive.jp/index.php/2010/01/13/geohash/</link>
		<comments>http://blog.masuidrive.jp/index.php/2010/01/13/geohash/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 07:34:20 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=212</guid>
		<description><![CDATA[　なんか世間的に位置情報アプリが流行ってるらしいし、Google App Engine(GAE)も楽しそう。どうせだから、GAEでなんか位置情報アプリでも作ってみよう！と思ってTwitterに書き込んだところ、Geohashという、位置情報のプロトコル？を教えてもらいました。 　これは、その名の通り、位置情報をハッシュで表す規格なのですが、いろいろおもしろい特徴があり、調べているうちに楽しくなってきたので、勢い余ってPure Rubyのライブラリまで書いちゃいました。 　そのあと、結局ライブラリを作ったところで満足して、アプリは何も作らなかったので、せめてGeohashの解説でも書いておこうと思います。 　位置情報は通常、緯度経度で表します。たとえば東京タワーの緯度経度は35.65861, 139.745447です。 北を上にした地図でいうと、緯度がY座標で経度がX座標です。英語では緯度をlatitude、経度をlongitudeと呼びます。 　この緯度経度は測地系によって値が違いますが、ここではGPSなどで使われている世界測地系を前提にします。 　位置情報系のアプリでは、「今いる場所をGPSで取得して、その近くにあるランドマークを表示する」ということがよく行われます。 　これをGoogle App EngineのDataStoreで行おうと思うと、2つのカラムで比較ができないという、DataStoreの制約が問題になります。(例: x&#62;1 and y&#62;1の様なことができない) 　そこで、GeoHashの登場です。GeoHashは、緯度経度の二つの座標を、一つの文字列にまとめたものです。 　東京タワーをGeoHashで表現すると「xn76ggrw26」になります。GeoHashはグリッドになるので、緯度経度のようにポイントではありません。 　先のハッシュが8文字あると、19m*31mのグリッドになります。 　GeoHashの最大の特徴は、その長さによって精度が変わることです。 東京タワーを中心とした 19m*31mのエリアは「xn76ggrw」ですが、これを頭5文字「xn76gg」だけ取り出すと、下の図の様なエリアを表します。 　データベースから、「xn76gg」の前方一致で検索することで、エリア内のポイントを簡単に取り出すことができます。 　しかし、これでは、上の図の様に、ランドマークがメッシュの端にある場合、すぐ近くのポイントもヒットしなくなってしまいます。 　 　そこで、geohashで検索する場合は、右の図の様に隣接するブロックも同時に検索します。東京タワーの周りを探す場合は、「xn76gg」だけを検索するのではなく、&#8217;xn76gu&#8217;,'xn76gf&#8217;,'xn76u5&#8242;,&#8217;xn76ge&#8217;,'xn76gs&#8217;,'xn76uh&#8217;,'xn76u4&#8242;,&#8217;xn76gd&#8217;,'xn76gg&#8217;も同時に検索することで、おおよそ2km*3kmの範囲で検索が可能です。 　多くのGeohashライブラリには、隣接するGeohashコードを計算する関数が用意されています。 それを使い、上記のように近接のブロックのGeohashコードを同時に検索することで、東京タワーからおおよそ1〜1.5kmのポイントを割り出すことができます。 　GAEのDataStoreは、文字列の前方一致が高速に行えるので、Geohashで場所の絞り込み検索などを容易に行うことができます。 　緯度経度から、Geohashで計算するライブラリは各種言語用にリリースされています。 Pure Rubyで書かれたライブラリが無かったで、自作したライブラリもありますので、Rubyの人はぜひ下記のコマンドでインストールしてみてください。 gem install pr_geohash 使い方は、READMEをご覧ください。 　実際にGeohashを試すことの出来るデモを下記のURLに設置しました。興味のある人は、直接触ってみると簡単に使い方が分かると思います。 http://blog.masuidrive.jp/wp-content/uploads/2010/01/geohash.html 　緯度経度を精度も含めて、文字列一つで扱えるのでURLに位置情報を入れたい場合など、便利なケースがあるんじゃないかと思います。 　Twitterでも緯度経度じゃなくて、Geohashで位置情報を管理してくれたらよかったのに。 そしたら、5文字ぐらいにすることで「だいたいシアトルにいる」みたいな大まかな位置情報だけ公開するとかできて、プライバシー的にも利点があったのになー。 p.s 　Geohashのエンコーディング方法の解説も欲しいって人います？ もし居たらコメントください。 追記 01/13 0:34 　Geohashのアルゴリズムを書きました。 参考データ: =begin 東京付近のGeoHashの精度を算出するRubyスクリプト &#124;文字数&#124; 南北 &#124; [...]]]></description>
			<content:encoded><![CDATA[				<p>　なんか世間的に位置情報アプリが流行ってるらしいし、Google App Engine(GAE)も楽しそう。どうせだから、GAEでなんか位置情報アプリでも作ってみよう！と思ってTwitterに書き込んだところ、<a href="http://en.wikipedia.org/wiki/Geohash">Geohash</a>という、位置情報のプロトコル？を教えてもらいました。</p>
				<p>　これは、その名の通り、位置情報をハッシュで表す規格なのですが、いろいろおもしろい特徴があり、調べているうちに楽しくなってきたので、勢い余って<a href="http://rubyforge.org/forum/forum.php?forum_id=35553">Pure Rubyのライブラリ</a>まで書いちゃいました。</p>
				<p>　そのあと、結局ライブラリを作ったところで満足して、アプリは何も作らなかったので、せめてGeohashの解説でも書いておこうと思います。<br />
				<span id="more-212"></span><br />
				　位置情報は通常、緯度経度で表します。たとえば東京タワーの緯度経度は35.65861, 139.745447です。<br />
				北を上にした地図でいうと、緯度がY座標で経度がX座標です。英語では緯度をlatitude、経度をlongitudeと呼びます。</p>
				<p>　この緯度経度は<a href="http://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E7%B3%BB">測地系</a>によって値が違いますが、ここではGPSなどで使われている<a href="http://ja.wikipedia.org/wiki/%E6%B8%AC%E5%9C%B0%E7%B3%BB">世界測地系</a>を前提にします。</p>
				<p class="eyecatch_photo"><img src="http://img.skitch.com/20100113-t8dqgi2q75tuwnj4xp19kuri4q.jpg" alt="geohash demonstrator" style="border: 4px solid #aaa;"/></p>
				<p>　位置情報系のアプリでは、「今いる場所をGPSで取得して、その近くにあるランドマークを表示する」ということがよく行われます。<br />
				　これをGoogle App EngineのDataStoreで行おうと思うと、2つのカラムで比較ができないという、DataStoreの制約が問題になります。(例: x&gt;1 and y&gt;1の様なことができない)</p>
				<p>　そこで、GeoHashの登場です。GeoHashは、緯度経度の二つの座標を、一つの文字列にまとめたものです。</p>
				<p>　東京タワーをGeoHashで表現すると「xn76ggrw26」になります。GeoHashはグリッドになるので、緯度経度のようにポイントではありません。<br />
				　先のハッシュが8文字あると、19m*31mのグリッドになります。</p>
				<p>　GeoHashの最大の特徴は、その長さによって精度が変わることです。<br />
				東京タワーを中心とした 19m*31mのエリアは「xn76ggrw」ですが、これを頭5文字「xn76gg」だけ取り出すと、下の図の様なエリアを表します。<br />
				<img src="http://img.skitch.com/20100113-d2k36g72c8j2fnqutn2kjyntce.jpg" style="border: 4px solid #aaa;"/></p>
				<p>　データベースから、「xn76gg」の前方一致で検索することで、エリア内のポイントを簡単に取り出すことができます。</p>
				<p>　しかし、これでは、上の図の様に、ランドマークがメッシュの端にある場合、すぐ近くのポイントもヒットしなくなってしまいます。<br />
				　<br />
				　そこで、geohashで検索する場合は、右の図の様に隣接するブロックも同時に検索します。東京タワーの周りを探す場合は、「xn76gg」だけを検索するのではなく、&#8217;xn76gu&#8217;,'xn76gf&#8217;,'xn76u5&#8242;,&#8217;xn76ge&#8217;,'xn76gs&#8217;,'xn76uh&#8217;,'xn76u4&#8242;,&#8217;xn76gd&#8217;,'xn76gg&#8217;も同時に検索することで、おおよそ2km*3kmの範囲で検索が可能です。</p>
				<p><img src="http://img.skitch.com/20100113-eefcf893i2uqs4wrtu32q3e55y.jpg" style="border: 4px solid #aaa;"/></p>
				<p>　多くのGeohashライブラリには、隣接するGeohashコードを計算する関数が用意されています。<br />
				それを使い、上記のように近接のブロックのGeohashコードを同時に検索することで、東京タワーからおおよそ1〜1.5kmのポイントを割り出すことができます。</p>
				<p>　GAEのDataStoreは、文字列の前方一致が高速に行えるので、Geohashで場所の絞り込み検索などを容易に行うことができます。</p>
				<p>　緯度経度から、Geohashで計算するライブラリは<a href="http://en.wikipedia.org/wiki/Geohash">各種言語用にリリース</a>されています。<br />
				Pure Rubyで書かれたライブラリが無かったで、自作したライブラリもありますので、Rubyの人はぜひ下記のコマンドでインストールしてみてください。<br />
				<code><br />
				gem install pr_geohash<br />
				</code><br />
				使い方は、<a href="http://github.com/masuidrive/pr_geohash">README</a>をご覧ください。</p>
				<p>　実際にGeohashを試すことの出来るデモを下記のURLに設置しました。興味のある人は、直接触ってみると簡単に使い方が分かると思います。<br />
				<a href="http://blog.masuidrive.jp/wp-content/uploads/2010/01/geohash.html">http://blog.masuidrive.jp/wp-content/uploads/2010/01/geohash.html</a></p>
				<p>　緯度経度を精度も含めて、文字列一つで扱えるのでURLに位置情報を入れたい場合など、便利なケースがあるんじゃないかと思います。</p>
				<p>　Twitterでも緯度経度じゃなくて、Geohashで位置情報を管理してくれたらよかったのに。<br />
				そしたら、5文字ぐらいにすることで「だいたいシアトルにいる」みたいな大まかな位置情報だけ公開するとかできて、プライバシー的にも利点があったのになー。</p>
				<p>p.s<br />
				　Geohashのエンコーディング方法の解説も欲しいって人います？<br />
				もし居たらコメントください。</p>
				<p><strong>追記 01/13 0:34 </strong><br />
				　<a href="http://blog.masuidrive.jp/index.php/2010/01/15/geohash-algorithm/">Geohashのアルゴリズム</a>を書きました。</p>
				<p><iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4627947011&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4627947011&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe> <iframe src="http://rcm-jp.amazon.co.jp/e/cm?o=9&amp;p=8&amp;l=as1&amp;asins=4797342773&amp;t=masuidriveblo-22&amp;IS1=1&amp;fc1=666666&amp;lc1=6666FF&amp;bg1=FFFFFF&amp;lt1=_blank&amp;bc1=FFFFFF&amp;npa=1&amp;f=ifr" style="width: 120px; height: 240px;" marginwidth="0" marginheight="0" frameborder="0" scrolling="no"></iframe></p>
				<p>参考データ:</p>
				<pre>
=begin
東京付近のGeoHashの精度を算出するRubyスクリプト

|文字数|   南北  |   東西  |
|    6 | 609.08m | 988.77m |
|    7 | 152.27m | 123.60m |
|    8 |  19.03m |  30.90m |
|    9 |   4.76m |   3.86m |
|   10 |   0.59m |   0.97m |
=end

puts (6..10).map {|i|
  lng_bit = (5 * i / 2.0).ceil
  lat_bit = (5 * i / 2.0).floor
  lng_grid_size = sprintf("%6.2fm", (360.0 / (2 ** lng_bit))*(25.0*60*60))
  lat_grid_size = sprintf("%6.2fm", (180.0 / (2 ** lat_bit))*(30.8*60*60))
  [i, lat_bit, lng_bit, lat_grid_size, lng_grid_size]
}.map{|r| "|#{r.join('|')}|"}.join("\n")
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2010/01/13/geohash/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Javascriptだけでコンテンツの言語を切り替えするスクリプト</title>
		<link>http://blog.masuidrive.jp/index.php/2008/09/22/switch-languages-in-javascript/</link>
		<comments>http://blog.masuidrive.jp/index.php/2008/09/22/switch-languages-in-javascript/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 08:00:05 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[multi languages]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=131</guid>
		<description><![CDATA[Photo by keepps 　前回のブラウザの言語をJavascriptから調べるを元に、ページのメッセージを言語切り替えするスクリプトを作ってみました。 　実際のページは、これです。 　一つのHTMLの中に複数の言語のメッセージを書き、それぞれの言語をCSSのクラスで指定することで、ブラウザに合わせた言語のみが表示されるようになります。 　日本語版のブラウザで見ると「こんにちは世界」、英語版やポルトガル語版のブラウザで見ると、それぞれの言語でメッセージが表示されます。 　デフォルトの言語は英語に設定しているので、日本語やポルトガル語以外のブラウザで見た場合は、英語のメッセージが表示されます。 　このスクリプトでは、JSでブラウザの言語を取得したあと、表示するCSSを切り替えることで、メッセージ切り替えを実現しています。使い方などはページのソースを参考にしてください。 　設置する前には、CSSとこのスクリプトはなるべく先頭で実行するようにしてください。あまり下の方で読み込むと画面がちらつく可能性があります。 　言語の切り替えするなら、Apacheのcontent negotiationでいいじゃん！ってご意見を複数から頂いたのですが、Railsのpage cacheで使いたい、複数言語のHTMLを作ると修正が面倒なので、1つのHTMLで全部の言語を記述したい、Google翻訳APIとも組み合わせたいなぁ、などの理由で作ってみました。 　なお、動作確認は、FF3 (3.0.1), FF2 (2.0.16), IE6 (SP2 6.0.2900), IE7 (7.0.5730), Safari3 (3.1.2), iPhone Safari (OS 2.1), Opera9 (9.27), Google Chrome (0.2.149.30)、Wii ブラウザで取れていますが、Windows MobileのIEやOperaでは動かない事を確認しています。 　Window MobileのIEやOperaでJavascriptのデバグの方法をご存じの方は教えていただけますか？ 　圧縮前のソースです。 function browserLanguage() { try { return (navigator.browserLanguage &#124;&#124; navigator.language &#124;&#124; navigator.userLanguage).substr(0,2) } catch(e) { return undefined; } [...]]]></description>
			<content:encoded><![CDATA[				<p class="eyecatch_photo"><img src="http://farm1.static.flickr.com/162/416489300_0bc6ba4901_m.jpg"/><span class="photo_by">Photo by <a href="http://www.flickr.com/photos/isg-online/" title="Link to keepps' photostream"><b>keepps</b></a></span></p>
				<p>　前回の<a href="http://blog.masuidrive.jp/index.php/2008/09/19/how-to-detect-your-browser-language-from-javascript/">ブラウザの言語をJavascriptから調べる</a>を元に、ページのメッセージを言語切り替えするスクリプトを作ってみました。</p>
				<p>　実際のページは、<a href="http://masuidrive.jp/tmp/lang.html">これ</a>です。</p>
				<p>　一つのHTMLの中に複数の言語のメッセージを書き、それぞれの言語をCSSのクラスで指定することで、ブラウザに合わせた言語のみが表示されるようになります。</p>
				<p>　日本語版のブラウザで見ると「こんにちは世界」、英語版やポルトガル語版のブラウザで見ると、それぞれの言語でメッセージが表示されます。<br />
				　デフォルトの言語は英語に設定しているので、日本語やポルトガル語以外のブラウザで見た場合は、英語のメッセージが表示されます。</p>
				<p>　このスクリプトでは、JSでブラウザの言語を取得したあと、表示するCSSを切り替えることで、メッセージ切り替えを実現しています。使い方などはページのソースを参考にしてください。<br />
				　設置する前には、CSSとこのスクリプトはなるべく先頭で実行するようにしてください。あまり下の方で読み込むと画面がちらつく可能性があります。</p>
				<p>　言語の切り替えするなら、Apacheのcontent negotiationでいいじゃん！ってご意見を複数から頂いたのですが、Railsのpage cacheで使いたい、複数言語のHTMLを作ると修正が面倒なので、1つのHTMLで全部の言語を記述したい、<a href="http://code.google.com/apis/ajaxlanguage/">Google翻訳API</a>とも組み合わせたいなぁ、などの理由で作ってみました。</p>
				<p>　なお、動作確認は、FF3 (3.0.1), FF2 (2.0.16), IE6 (SP2 6.0.2900), IE7 (7.0.5730), Safari3 (3.1.2), iPhone Safari (OS 2.1), Opera9 (9.27), Google Chrome (0.2.149.30)、Wii ブラウザで取れていますが、Windows MobileのIEやOperaでは動かない事を確認しています。</p>
				<p>　Window MobileのIEやOperaでJavascriptのデバグの方法をご存じの方は教えていただけますか？</p>
				<p><span id="more-131"></span><br />
				　圧縮前のソースです。</p>
				<pre>
function browserLanguage() {
  try {
    return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2)
  }
  catch(e) {
    return undefined;
  }
}

function setLanguage(default_language, languages) {
  var addCSSRule = (document.createStyleSheet)
    ? (function(sheet) {
      return function(selector, declaration) {
        sheet.addRule(selector, declaration);
      };
    })(document.createStyleSheet())
    :
    (function(sheet){
      return function(selector, declaration) {
        sheet.insertRule(selector + '{' + declaration + '}', sheet.cssRules.length);
      };
    })((function(e){
      e.appendChild(document.createTextNode(''));
      (document.getElementsByTagName('head')[0] || (function(h) {
        document.documentElement.insertBefore(h, this.firstChild);
        return h;
      })(document.createElement(&quot;head&quot;))).appendChild(e);
      return e.sheet;
    })(document.createElement(&quot;style&quot;)));

  var removeCSSRule = function(ruleName) {
    for(var i = 0; i < document.styleSheets.length; i++) {
      var styleSheet = document.styleSheets[i];
      var ii = cssRule = 0;
      do {
        cssRule = (styleSheet.cssRules ? styleSheet.cssRules : styleSheet.rules)[ii];
        if(cssRule &#038;&#038; cssRule.selectorText.toLowerCase() == ruleName) {
            styleSheet.cssRules ? styleSheet.deleteRule(ii) : styleSheet.removeRule(ii);
            return true;
        }
        ii++;
      } while(cssRule);
    }
    return false;
  }

  var array_include = function(ary, v) {
    for (var i in ary) {
      if (ary[i] == v) return true;
    }
    return false;
  };

  var lang = browserLanguage();
  if(lang==default_language || !array_include(languages, lang)) return false;

  addCSSRule("." + default_language, "display: none;");
  removeCSSRule("." + lang);
  return true;
}
</pre>
				</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2008/09/22/switch-languages-in-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ブラウザの言語をJavascriptから調べる。</title>
		<link>http://blog.masuidrive.jp/index.php/2008/09/19/how-to-detect-your-browser-language-from-javascript/</link>
		<comments>http://blog.masuidrive.jp/index.php/2008/09/19/how-to-detect-your-browser-language-from-javascript/#comments</comments>
		<pubDate>Fri, 19 Sep 2008 09:32:16 +0000</pubDate>
		<dc:creator>masuidrive</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[multi languages]]></category>

		<guid isPermaLink="false">http://blog.masuidrive.jp/?p=128</guid>
		<description><![CDATA[Photo by midnightglory 　多言語対応のサイトを作っていると問題になるのが、メッセージの切り替えです。PHPやRailsを使っている場合は、HTTP_ACCEPT_LANGUAGEを見てメッセージ生成を切り替えれば良いのですが、静的ファイルの場合は、そうは行きません。 　そこで、今回はJavascriptだけでブラウザの言語を取得する方法を調べてみました。 　ググっていると、ブラウザ依存ですが取得する方法が見つかったので、各ブラウザで検証した所、navigator.browserLanguage、navigator.language、navigator.userLanguageのいずれかで取得できることが分りました。 　ただ、この値はブラウザのデフォルト言語環境のなので、HTTP_ACCEPT_LANGUAGEとは違う値が返ってきます。たとえば、日本語OSに英語版のFirefoxを入れている場合は、&#8221;en&#8221;が返ります。 　それでまとめてみたのが、このbrowserLanguage()です。 実行すると&#8221;en&#8221;や&#8221;ja&#8221;などの言語情報が返ってきます。 function browserLanguage() { try { return (navigator.browserLanguage &#124;&#124; navigator.language &#124;&#124; navigator.userLanguage).substr(0,2) } catch(e) { return undefined; } } 　あなたのブラウザの言語設定は「 function browserLanguage() { try { return (navigator.browserLanguage &#124;&#124; navigator.language &#124;&#124; navigator.userLanguage).substr(0,2) } catch(e) { return undefined; } } document.write(browserLanguage() &#124;&#124; ""); 」です。 「」内に何も表示されていなかった場合は、コメントでブラウザの種類とバージョンを教えてください。 　動作確認ができているのは、FF3 (3.0.1), FF2 (2.0.16), [...]]]></description>
			<content:encoded><![CDATA[				<p class="eyecatch_photo"><img src="http://farm4.static.flickr.com/3105/2296608928_71cc6f14ce_m.jpg"/><span class="photo_by">Photo by <a href="http://www.flickr.com/photos/midnightglory/" title="Link to midnightglory's photostream"><b>midnightglory</b></a></span></p>
				<p>　多言語対応のサイトを作っていると問題になるのが、メッセージの切り替えです。PHPやRailsを使っている場合は、HTTP_ACCEPT_LANGUAGEを見てメッセージ生成を切り替えれば良いのですが、静的ファイルの場合は、そうは行きません。</p>
				<p>　そこで、今回はJavascriptだけでブラウザの言語を取得する方法を調べてみました。</p>
				<p>　ググっていると、ブラウザ依存ですが取得する方法が見つかったので、各ブラウザで検証した所、navigator.browserLanguage、navigator.language、navigator.userLanguageのいずれかで取得できることが分りました。</p>
				<p>　ただ、この値はブラウザのデフォルト言語環境のなので、HTTP_ACCEPT_LANGUAGEとは違う値が返ってきます。たとえば、日本語OSに英語版のFirefoxを入れている場合は、&#8221;en&#8221;が返ります。</p>
				<p>　それでまとめてみたのが、このbrowserLanguage()です。<br />
				実行すると&#8221;en&#8221;や&#8221;ja&#8221;などの言語情報が返ってきます。</p>
				<p><span id="more-128"></span></p>
				<pre>
function browserLanguage() {
  try {
    return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2)
  }
  catch(e) {
    return undefined;
  }
}
</pre>
				<p>　<strong>あなたのブラウザの言語設定は「<script language="javascript">
				function browserLanguage() {
				  try {
				    return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2)
				  }
				  catch(e) {
				    return undefined;
				  }
				}
				document.write(browserLanguage() || "");
				</script>」です。</strong></p>
				<p>「」内に何も表示されていなかった場合は、コメントでブラウザの種類とバージョンを教えてください。</p>
				<p>　動作確認ができているのは、FF3 (3.0.1), FF2 (2.0.16), IE6 (SP2 6.0.2900), IE7 (7.0.5730), Safari3 (3.1.2), iPhone Safari (OS 2.1), Opera9 (9.27), Google Chrome (0.2.149.30), Windows Mobile IE (7.7), Windows Mobile Opera (8.65), Wii ブラウザ (Opera 9.30)です。<br />
				思いつく限りの環境で試しました。</p>
				<p>　これだけでは役には立たないので、次はコレを使った言語切り替えライブラリを作ってみます。</p>
				<p><strong>追記</strong><br />
				　<a href="http://masuidrive.jp/tmp/lang.html">言語によるCSS切り替え実験中</a></p>
				<p>　このリンク先で、メッセージが出ていなかったり、「Sorry. We don&#8217;t support your language.」と表示されている、もしくは、日本語が表示されても、読み込み時にちらついているなどありましたら、コメントいただけると助かります。</p>
				<h2>参考資料</h2>
				<p>　各言語の実行結果。</p>
				<dl>
				<dt style="margin-top: 2em">FF3 (3.0.1)</dt>
				<dd>navigator.language: ja-JP</dd>
				<dd>navigator.browserLanguage: undefined</dd>
				<dd>navigator.systemLanguage: undefined</dd>
				<dd>navigator.userLanguage: undefined </dd>
				<dt style="margin-top: 2em">FF2 (2.0.16)</dt>
				<dd>navigator.language: ja</dd>
				<dd>navigator.browserLanguage: undefined</dd>
				<dd>navigator.systemLanguage: undefined</dd>
				<dd>navigator.userLanguage: undefined </dd>
				<dt style="margin-top: 2em">Safari3 (3.1.2)</dt>
				<dd>navigator.language: ja-jp </dd>
				<dd>navigator.browserLanguage: undefined </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: undefined </dd>
				<dt style="margin-top: 2em">iPhone Safari (OS 2.1)</dt>
				<dd>navigator.language: ja-jp </dd>
				<dd>navigator.browserLanguage: undefined </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: undefined </dd>
				<dt style="margin-top: 2em">Opera9 (9.27)</dt>
				<dd>navigator.language: ja </dd>
				<dd>navigator.browserLanguage: ja </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: ja</dd>
				<dt style="margin-top: 2em">IE6 (SP2 6.0.2900) / IE7 (7.0.5730)</dt>
				<dd>navigator.language: undefined </dd>
				<dd>navigator.browserLanguage: ja </dd>
				<dd>navigator.systemLanguage: ja </dd>
				<dd>navigator.userLanguage: ja </dd>
				<dt style="margin-top: 2em">Google Chrome (0.2.149.30)</dt>
				<dd>navigator.language: ja-JP </dd>
				<dd>navigator.browserLanguage: undefined </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: undefined </dd>
				<dt style="margin-top: 2em">Windows Mobile IE (7.7)</dt>
				<dd>navigator.language: undefined</dd>
				<dd>navigator.browserLanguage: undefined </dd>
				<dd>navigator.systemLanguage: ja </dd>
				<dd>navigator.userLanguage: ja </dd>
				<dt style="margin-top: 2em">Windows Mobile Opera 8.65</dt>
				<dd>navigator.language: ja</dd>
				<dd>navigator.browserLanguage: ja </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: ja </dd>
				<dt style="margin-top: 2em">Wii ブラウザ (Opera 9.30)</dt>
				<dd>navigator.language: ja </dd>
				<dd>navigator.browserLanguage: ja </dd>
				<dd>navigator.systemLanguage: undefined </dd>
				<dd>navigator.userLanguage: ja</dd>
				</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.masuidrive.jp/index.php/2008/09/19/how-to-detect-your-browser-language-from-javascript/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

