bp study39 nodejs
DESCRIPTION
node.jTRANSCRIPT
![Page 1: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/1.jpg)
2010/11/30
id: yssk22 (CouchDB-JP)
![Page 2: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/2.jpg)
自己紹介
Yohei Sasaki (@yssk22)
CouchDB Fan
○ 今年はCouchDB なにもやってないorz
○ 12/12 に MongoDB / CouchDB 勉強会します.
気がついたら node.js ユーザーに.
ハンズオン資料はこちら.
○ http://bit.ly/a7Mm5i
![Page 3: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/3.jpg)
今日の話
「触るのはちょっと面倒だけど、気になってるんだよ」ぐらいの人が対象です。
触るのはちょっと↓
触ってみたくなった↓
ハンズオン資料↓
本!?
イマココ
目標
![Page 4: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/4.jpg)
node.js とは何か.
Google V8
つまりJavaScript
Evented I/O non-blocking I/O
フレームワーク化したもの あるいは ミドルウェア
JavaScript 自体の言語仕様には手を加えてません.
![Page 5: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/5.jpg)
Hello World
hello.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/hello.js
![Page 6: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/6.jpg)
Hello World
hello.js
JavaScript
仕様はGoogle V8に準拠
ECMA-262 3rd Edition + 5th Edの一部
V8 2.5.X
○ https://github.com/ry/node/commits/master/de
ps/v8
![Page 7: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/7.jpg)
CommonJS
JavaScript の標準化の一環 モジュール
ユニットテスト
パッケージ
....
この辺の標準に従っておくと、CouchDB とか Rhino とか v8cgi とかでも使えるJavaScriptになる
対応
対応
![Page 8: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/8.jpg)
CommonJS Module
ブラウザJSの場合
<script type="text/javascript"
src="hellolib.js"></script>
<script>
hello();
</script>
![Page 9: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/9.jpg)
CommonJS Module
node.js (CommonJS) の場合
hellolib.js
○ http://dl.dropbox.com/u/219436/node.js/bpstud
y39/demo/hellolib.js
![Page 10: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/10.jpg)
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
![Page 11: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/11.jpg)
フロントエンドエンジニアリングの将来Tantek Çelik
イエス。JavaScriptは勝ったんです、議論の余地がありますか?
Douglas Crockford
あらゆる期待に反して、JavaScriptは世界
でもっとも重要なプログラミング言語になりました。誰も望んでも期待もしていなかったけれど、そうなったんです。(笑)
http://www.publickey1.jp/blog/10/yahoo_1.html
![Page 12: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/12.jpg)
JavaScriptの勝利宣言
Ryan Dahl
Nodeにこれだけ人気があるのはサーバでもJavaScriptが使えるためで、それは僕が意図したことでもあります。と同時に、それはサーバサイドを書く手段として望まれていたことでもあったんです。それは大きな断絶だったんです。実はサーバを書くエンジニアはクライアントサイドを書くエンジニアと同じだったのですから。そしてこのシングルスレッド化されたサーバサイドのプログラミングスタイルこそ、サーバを書くのに求められていたものなんです。
http://www.publickey1.jp/blog/10/yahoo_1.html
![Page 13: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/13.jpg)
Why JavaScript?
みんな使ってる
使わざるをえない
そして、プログラミングモデルが実はネットワークプログラム向き.
![Page 14: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/14.jpg)
HTTP Server
httpd.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/httpd.js
![Page 15: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/15.jpg)
No More Lock!
httpd2.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/httpd2.js
![Page 16: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/16.jpg)
No More Lock!
JavaScript はシングルスレッド
マルチスレッド化しようという動きもあるけれど.
ロックとかとは無縁
シングルスレッド != 並行処理できない
IOを工夫することで解決
IOの単位で処理を実行
![Page 17: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/17.jpg)
Event Loop
I/O
Callback / EventHandler
Functions
event loop
(single thread)
![Page 18: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/18.jpg)
Evented I/O
node.js のAPIは非同期が基本
ランタイム内で以下のライブラリを利用○ libev Event Loop のサポート
○ libeio POSIX API の非同期サポート
JavaScript の書き方はブラウザでやる場合とほとんど同じ Callback
Event Handler
![Page 19: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/19.jpg)
Callback Model
var fs = require('fs');
fs.rename('foo.txt', 'bar.txt',
function(err){
if(err) throw err;
console.log('renamed');
}
);
![Page 20: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/20.jpg)
Event Model
var stdin = process.openStdin();
stdin.on('data', function(chunk){
console.log(chunk);
});
stdin.on('end', function(){
console.log('end');
});
![Page 21: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/21.jpg)
ここまでのまとめ
JavaScript = Google V8
Chrome と同じ
Evented I/O
サーバープログラムの書きやすさ
○ No More Lock!
スレッドを消費しない効率性
JavaScript らしい書き方
![Page 22: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/22.jpg)
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
効率的なコードが自然と書ける!
![Page 23: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/23.jpg)
よくある質問を2つほど.
![Page 24: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/24.jpg)
サーバーサイドのJavaScript っていわれても、ライブラリはー?
![Page 25: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/25.jpg)
var php = require('php');
var php = require('php');
php.sprintf('Hello %s', 'World');
基本的な関数はこれで大丈夫!
Ref: phpjs.org
![Page 26: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/26.jpg)
var msg = $('#msg').html();
var jsdom = require('jsdom');
var window =
jsdom.jsdom(content).createWindow();
jsdom.jQueryify(window, __dirname + "/jquery-1.4.2.min.js", function(_, $){
console.log($('#msg').html());});
jQuery が使えるんだ、問題ない.
YUI も使える...というかサーバーサイドYUI. Yahoo User Interface Library ...
![Page 27: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/27.jpg)
npm install hogehoge
node package manager
ライブラリ一覧
○ http://npm.mape.me/
リポジトリはCouchDB
○ curl –X GET http://registry.npmjs.org/_users/
![Page 28: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/28.jpg)
npm install express
Webフレームワーク Express
inspired by Sintra
Webアプリに必要な一通りの機能
![Page 29: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/29.jpg)
npm install oauth
node 用 OAuth Client ライブラリ
Express と併せて使えば、認証はばっちり
![Page 30: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/30.jpg)
npm install nodeunit
node.js 用 xUnit テストフレームワーク
「非同期」とはいえ、単一スレッドのコールバックモデルなので、記述する内容は同じ.
![Page 31: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/31.jpg)
nodeunit テストサンプル
module.exports = testCase({
'test resolveVideoUrl: http://bit.ly/12trpl (shortened URL of TEST_URL)': function(test){
youtube.resolveVideoUrl(
TEST_URL.shortened,
function(err, normUrl, body){
test.ok(!err);
test.equal(normUrl, TEST_URL.url);
test.ok(typeof body == 'string');
test.done();
});
},
非同期メソッド
![Page 32: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/32.jpg)
npm install socket.io
node.js 用 WebSocket ライブラリ
サーバー/クライアント 両方のJavaScriptを提供
○ 両方ともJSだからできる使いやすい実装
WebSocket 非対応ブラウザでもFlashとか使ってよきに計らってくれる
○ ので、負荷さえ気にしなければリアルタイムアプリの実装に使える
![Page 33: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/33.jpg)
で、パフォーマンスは?
![Page 34: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/34.jpg)
やってみよう: retwis-js.
Python Hack-a-thon 2010.11 の時に、redis がおもしろそうだったので node.js
で実装してみた.
https://bitbucket.org/shibu/redis_docjp/o
verview
![Page 35: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/35.jpg)
実験環境
Server: Mac OS X 10.6.5
3.06 GHz * 2 Core 4GB RAM
Client: Ubuntu 10.04
1.80 GHz * 2 Core 8GB RAM
実装差分
node.js版 Python版
nodejs 0.3.0 Python 2.6.4
Express 1.0.0rc4 tornado 1.1
redis 0.3.7 redis 2.0.0
ejs 0.2.1
![Page 36: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/36.jpg)
timeline 表示のab結果(参考値)
0
50
100
150
200
250
5 10 15 20 25 30 50 75 100 125 150 200 250
Req
uest
/ sec
同時接続数 (-c)
node.js
Python
![Page 37: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/37.jpg)
node.js 速い!? Python 遅い!?
python 版 50%しかCPU使用せず... redis へのconnectionを毎回作成している模様 -c 200 で結果が返らなくなった
○ Too many open files.
node.js 版も CPU 100% 使用のみ node プロセスが 99-100%, redis が38%ぐらい.
何も考えなくても1 client のconnectionで正常に動作
○ No more Lock!
-c 250 で Too many open files○ テンプレートファイルを毎回Open/Closeしている
両方ともEvent IOなのでレスポンスが安定
![Page 38: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/38.jpg)
参考値
-n -c # / secTime per Request
(across concurrent)Time per Request
Python node.js Python node.js Python node.js
1000 5 104.81 192.96 9.541 5.182 47.703 25.912
1000 10 107.16 217.58 9.331 4.596 93.315 45.959
1000 15 105.87 224.74 9.446 4.45 141.685 66.744
1000 20 107.06 226.41 9.34 4.417 186,802 88.334
1000 25 106.57 219.57 9.384 4.554 234.588 113.857
1000 30 106.64 221.37 9.377 4.157 281.317 135.522
1000 50 107.45 222.25 9.307 4.628 465.329 231.399
1000 75 102.18 215.6 9.787 4.638 734.033 347.865
1000 100 107.41 206.67 9.31 4.839 930.986 483.862
1000 125 101.31 212.42 9.87 4.708 1233.792 588.456
1000 150 210.4 4.753 712.936
1000 200 209.38 4.776 955.189
1000 250
![Page 39: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/39.jpg)
で、パフォーマンスは?
普通に使えるレベル.
Connection Pooling とか、その手のことは気にしなくてもいける.
ただし、1 CPU しか消費しないので注意.
複数コアの環境では nginx を手前に置いてバランスさせるのが良さそう
○ node.js でもそのうち対応するかも。
node-webworker
![Page 40: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/40.jpg)
つまりJavaScript
サーバーサイドもJavaScriptでいいじゃない.
v8 ならそれなりに速いし
効率的なコードが自然と書ける!
実用的なアプリも書ける!
![Page 41: Bp study39 nodejs](https://reader033.vdocuments.mx/reader033/viewer/2022052909/5598125e1a28ab431f8b480b/html5/thumbnails/41.jpg)
続きはハンズオンで.