SlideShare a Scribd company logo
Node.js で学ぶマルチスレッドプログラミング入門サイボウズ・ラボ / Shibuya.pm竹迫 良範 @TAKESAKO
2009/04/06Cybozu University2JavaScript
sleep のない言語 JavaScriptどうやって実現するか?function sleep(msec) { // CPU_100%  var t = (new Date()).getTime()-(-msec);   while ( (new Date()).getTime() < t ) {} }function sleep(msec) {   // LiveConnect  Packages.java.lang.Thread.sleep(msec); }
クロスブラウザで sleep を実現(無理矢理)function sleep(msec) {   try { // for IEwindow.showModalDialog(       "javascript:document.write('<script>"       + "window.setTimeout(function(){window.close()},"       +  msec + ");<"\/script>');");   } catch (e) {     try { // for Firefox, Opera with LiveConnectPackages.java.lang.Thread.sleep(msec);     } catch (e) {  // for Safari and others var limit = (new Date()).getTime() - (-msec);       while ((new Date()).getTime() < limit) {}     }   } }
1秒ごとに表示したい(よくある間違い)<script>function sleep(msec) {var t = (new Date()).getTime() - (-msec);  while ( (new Date()).getTime() < t );}function init() {var body = document.body;  sleep(1000);body.innerHTML += "<h1>Hello!</h1>";  sleep(1000);body.innerHTML += "<h2>Hello?</h2>";  sleep(1000);body.innerHTML += "<h3>Hello!?</h3>";};</script><body onload="init()"></body>
問題1:sleep している間 CPU_100% (><)
問題2:3秒後にまとめて表示される
setTimeoutで1秒ごとに表示する(正解)<script>setTimeout(function(){var body = document.body;body.innerHTML += "<h1>Hello!</h1>";setTimeout(function(){body.innerHTML += "<h2>Hello?</h2>";setTimeout(function(){body.innerHTML += "<h3>Hello!?</h3>";    }, 1000);  }, 1000);}, 1000);</script>
setTimeout.html – シングルスレッド+遅延
2009/04/06Cybozu University10				}, 1000);			}, 1000);		}, 1000);	}, 1000);}, 1000);
2009/04/06Cybozu University11				});			});		});	});});
yield
yield で1秒ごとに表示<!DOCTYPE html><title>Firefox2.0+ only</title><script type="application/javascript;version=1.7">(function(g){var f=arguments.callee;setTimeout( function(){f(g)},g.next())})((function(){  yield (1000);document.body.innerHTML += "<h1>Hello!</h1>";  yield (1000);document.body.innerHTML += "<h2>Hello?</h2>";  yield (1000);document.body.innerHTML += "<h3>Hello!?</h3>";})());</script>
yield.html– 疑似マルチタスク処理
やりたいこと = 細かく setTimeoutを呼ぶ// こんな風に書けたらいいなぁ(><)  for (var i = 0; i < 10000000; i++) {	//   すん	//  ごく	//   重たい	//    処理	//   ・・・setTimeout(次の行, 0); // ブラウザに処理を戻す	// でもループの中は繰り返したい  }  // 終了
JavaScript 1.7(Firefox 2.0+)
yield を含む関数は Generator になるfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator(); // [object Generator]// まだ document.title は変更されない
Generator#nextで次の yield まで実行戻るfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator(); // [object Generator]g.next(); // document.title = 1;g.next(); // document.title = 2;g.next(); // document.title = 3;
uncaught exception: [object StopIteration]function generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator();for (var j = 1; j <= 998; j++) { g.next() }g.next(); // document.title = 999;g.next(); // document.title = 1000;g.next(); // Error: uncaught exception:           //       [object StopIteration]
Generator#closefunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield;	}}var g = generator();for (var j = 1; j <= 998; j++) { g.next() }g.next(); // document.title = 999;g.next(); // document.title = 1000;g.close();
yield の引数が next() の戻り値になるfunction generator() {	for (var i = 1; i <= 1000; i++) {		document.title = i;		yield (i);	}}var g = generator();var r;r = g.next(); // r = 1;r = g.next(); // r = 2;r = g.next(); // r = 3;
next() の戻り値をチェックしてきちんと終了function generator() {	for (var i = 1; i <= 1000; i++) {document.title = i;		yield (i);	}	yield (-1); // 終了条件}var g = generator();var r;do { r = g.next() } while (r > 0); // 1...1000g.close();
巨大ループ中で setTimeout(f, 0) が呼べる!function generator() {	for (vari = 1; i <= 1000; i++) {document.title = i;		yield true;	}	yield false;}function driveGenerator(g) {    if (g.next()) { //  yield true?var f = function(){ driveGenerator(g) };setTimeout(f, 0);	} else {g.close(); //  yield false    }}driveGenerator( generator() );
yield + setTimeoutイディオムが完成(function(g){var f=arguments.callee;var t=g.next(); (t<0) ? g.close():setTimeout(function(){f(g)},t)})((function(){  for (vari = 0; i < 10000; i++) {document.title = i; // 重たい処理    yield (0); // ブラウザに一旦処理を戻す(setTimeout)  }  yield (-1); // 終了})());
yield すごい !
 でも… Firefoxでしか…
JavaScript1.7 の指定をしないと yield 動かない<script type="application/javascript;version=1.7">(function(g){var f=arguments.callee;var t=g.next(); (t<0) ? g.close():setTimeout(function(){f(g)},t)})((function(){  for (vari = 0; i < 10000; i++) {document.title = i; // 重たい処理    yield (0); // ブラウザに一旦処理を戻す(setTimeout)  }  yield (-1); // 終了})());</script>
28
HTML5 関連Web Workers
HTML5 Web Workers APImain.htmlworker.js(1) var worker = new Worker(“worker.js”);ワーカースレッドの作成(2) worker.postMessage(”hello”);(3) onmessage = function(e) {var result = e.data + ”!”;(4)   postMessage(result);(5) worker.onmessage = function(e) {       // DOM 更新処理window.alert(e.data);
ワーカスレッドを呼び出す UIスレッドworker.html<title>HTML5 Web Workers</title><script>var worker = new Worker("worker.js");worker.onmessage = function(e){document.body.innerHTML += e.data;}worker.postMessage("hello");</script>
ワーカスレッドの定義(重たい処理を分離)worker.jsfunction sleep(msec) {var t = (new Date()).getTime() - (-msec);  while ( (new Date()).getTime() < t );}//↓ワーカ側でメッセージを受信したときの処理onmessage = function(e) {  sleep(1000);postMessage("<h1>" + e.data + "!</h1>");}
Web Workers のセキュリティUIスレッドワーカスレッドwindow.document.write(“hoge”)Workerスレッドからはwndowオブジェクトに触れない!CPU_100%でもブラウザ固まらない!
Firefox, Safari, Chrome で動作
2009/04/06Cybozu University35Node.js拡張できる?
2009/04/06Cybozu University36
2009/04/06Cybozu University37
v8-juice
jsthread.sourceforge.net
40

More Related Content

What's hot (20)

Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
miura1729
 
大阪Node学園 六時限目 「generator小咄」
大阪Node学園 六時限目 「generator小咄」大阪Node学園 六時限目 「generator小咄」
大阪Node学園 六時限目 「generator小咄」
Shunsuke Watanabe
 
Qt Creator を拡張する
Qt Creator を拡張するQt Creator を拡張する
Qt Creator を拡張する
Takumi Asaki
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
Tatsuki SHIMIZU
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
眞樹 冨澤
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
 
ASP.NETを利用したAJAX開発の応用
ASP.NETを利用したAJAX開発の応用ASP.NETを利用したAJAX開発の応用
ASP.NETを利用したAJAX開発の応用
Sho Okada
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
眞樹 冨澤
 
第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村
Koichi Uchimura
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
Uehara Junji
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめ
Shoichi Yasui
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
Shota TAMURA
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
takesako
 
Precise garbage collection for c
Precise garbage collection for cPrecise garbage collection for c
Precise garbage collection for c
miura1729
 
大阪Node学園 六時限目 「generator小咄」
大阪Node学園 六時限目 「generator小咄」大阪Node学園 六時限目 「generator小咄」
大阪Node学園 六時限目 「generator小咄」
Shunsuke Watanabe
 
Qt Creator を拡張する
Qt Creator を拡張するQt Creator を拡張する
Qt Creator を拡張する
Takumi Asaki
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
第12回計算機構成
第12回計算機構成第12回計算機構成
第12回計算機構成
眞樹 冨澤
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
 
effective modern c++ chapeter36
effective modern c++ chapeter36effective modern c++ chapeter36
effective modern c++ chapeter36
Tatsuki SHIMIZU
 
ASP.NETを利用したAJAX開発の応用
ASP.NETを利用したAJAX開発の応用ASP.NETを利用したAJAX開発の応用
ASP.NETを利用したAJAX開発の応用
Sho Okada
 
第10回 計算機構成
第10回 計算機構成第10回 計算機構成
第10回 計算機構成
眞樹 冨澤
 
第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村第6回鹿児島node.jsの会資料_内村
第6回鹿児島node.jsの会資料_内村
Koichi Uchimura
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
Uehara Junji
 
UniRxことはじめ
UniRxことはじめUniRxことはじめ
UniRxことはじめ
Shoichi Yasui
 
About GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginnersAbout GStreamer 1.0 application development for beginners
About GStreamer 1.0 application development for beginners
Shota TAMURA
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
takesako
 

Similar to Node.js - JavaScript Thread Programming (20)

Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
 
Flow.js
Flow.jsFlow.js
Flow.js
uupaa
 
Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話
Masakazu Muraoka
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
Yuichi Sakuraba
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
maruyama097
 
ES6,7で書ける JavaScript
ES6,7で書ける JavaScriptES6,7で書ける JavaScript
ES6,7で書ける JavaScript
Shin Sekaryo
 
Reactive
ReactiveReactive
Reactive
Akihiro Ikezoe
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
koichik
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
dynamis
 
Enumerable lazy について
Enumerable lazy についてEnumerable lazy について
Enumerable lazy について
Tomoya Kawanishi
 
Web Workers
Web WorkersWeb Workers
Web Workers
kaboccha
 
setTimeout関数の楽しみ
setTimeout関数の楽しみsetTimeout関数の楽しみ
setTimeout関数の楽しみ
mtkn
 
PHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyieldPHPにおけるI/O多重化とyield
PHPにおけるI/O多重化とyield
Yahoo!デベロッパーネットワーク
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
Goro Fuji
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
 
Flow.js
Flow.jsFlow.js
Flow.js
uupaa
 
Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話Async awaitでの繰り返し処理についての小話
Async awaitでの繰り返し処理についての小話
Masakazu Muraoka
 
Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド - Project Loom - 限定継続と軽量スレッド -
Project Loom - 限定継続と軽量スレッド -
Yuichi Sakuraba
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
maruyama097
 
ES6,7で書ける JavaScript
ES6,7で書ける JavaScriptES6,7で書ける JavaScript
ES6,7で書ける JavaScript
Shin Sekaryo
 
東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates東京Node学園#3 Domains & Isolates
東京Node学園#3 Domains & Isolates
koichik
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
shigeki_ohtsu
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
dynamis
 
Enumerable lazy について
Enumerable lazy についてEnumerable lazy について
Enumerable lazy について
Tomoya Kawanishi
 
Web Workers
Web WorkersWeb Workers
Web Workers
kaboccha
 
setTimeout関数の楽しみ
setTimeout関数の楽しみsetTimeout関数の楽しみ
setTimeout関数の楽しみ
mtkn
 
Node-v0.12の新機能について
Node-v0.12の新機能についてNode-v0.12の新機能について
Node-v0.12の新機能について
shigeki_ohtsu
 
C#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive ExtensionsC#次世代非同期処理概観 - Task vs Reactive Extensions
C#次世代非同期処理概観 - Task vs Reactive Extensions
Yoshifumi Kawai
 
Inside frogc in Dart
Inside frogc in DartInside frogc in Dart
Inside frogc in Dart
Goro Fuji
 
Ad

More from takesako (18)

SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
takesako
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
takesako
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demo
takesako
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
takesako
 
再帰的 正規表現JSON Validator
再帰的 正規表現JSON Validator再帰的 正規表現JSON Validator
再帰的 正規表現JSON Validator
takesako
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一
takesako
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudo
takesako
 
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to usThat Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
takesako
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
takesako
 
Perl x86 JIT Programming
Perl x86 JIT ProgrammingPerl x86 JIT Programming
Perl x86 JIT Programming
takesako
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremony
takesako
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglot
takesako
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyo
takesako
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
takesako
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
takesako
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fall
takesako
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
takesako
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnect
takesako
 
SECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催についてSECCON CTF セキュリティ競技会コンテスト開催について
SECCON CTF セキュリティ競技会コンテスト開催について
takesako
 
Acme minechan
Acme minechanAcme minechan
Acme minechan
takesako
 
Acme::MineChan LT demo
Acme::MineChan LT demoAcme::MineChan LT demo
Acme::MineChan LT demo
takesako
 
x86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNTx86x64 SSE4.2 POPCNT
x86x64 SSE4.2 POPCNT
takesako
 
再帰的 正規表現JSON Validator
再帰的 正規表現JSON Validator再帰的 正規表現JSON Validator
再帰的 正規表現JSON Validator
takesako
 
正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一正規表現‐もう一つのバベルの塔‐木村浩一
正規表現‐もう一つのバベルの塔‐木村浩一
takesako
 
Perl6 Regex Programming with Rakudo
Perl6 Regex Programming with RakudoPerl6 Regex Programming with Rakudo
Perl6 Regex Programming with Rakudo
takesako
 
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to usThat Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
That Goes Without Alpha-Num (or Does It ?) all your base10 are belong to us
takesako
 
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
Devsumi2010 Ecmascript5 (ISO/IEC JTC1/SC22)
takesako
 
Perl x86 JIT Programming
Perl x86 JIT ProgrammingPerl x86 JIT Programming
Perl x86 JIT Programming
takesako
 
YAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing CeremonyYAPC::Asia 2008 Closing Ceremony
YAPC::Asia 2008 Closing Ceremony
takesako
 
HTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a PloyglotHTML Binary Hacks & GIF89a Ployglot
HTML Binary Hacks & GIF89a Ployglot
takesako
 
Devsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 TokyoDevsumi2008 - YAPC::Asia 2008 Tokyo
Devsumi2008 - YAPC::Asia 2008 Tokyo
takesako
 
GIF89a Oldtype
GIF89a OldtypeGIF89a Oldtype
GIF89a Oldtype
takesako
 
Shibuyajs Digest
Shibuyajs DigestShibuyajs Digest
Shibuyajs Digest
takesako
 
HTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fallHTML2.0 - digg - OSC2007-fall
HTML2.0 - digg - OSC2007-fall
takesako
 
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser DetectionShibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
Shibuya.pm#8 - ImageFight - HTML 2.0 New Browser Detection
takesako
 
Shibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnectShibuyajs24 JavaScript.GIF x LiveConnect
Shibuyajs24 JavaScript.GIF x LiveConnect
takesako
 
Ad

Node.js - JavaScript Thread Programming