Weitere ähnliche Inhalte
Ähnlich wie Bp study39 nodejs (20)
Mehr von Yohei Sasaki (17)
Kürzlich hochgeladen (11)
Bp study39 nodejs
- 2. 自己紹介
Yohei Sasaki (@yssk22)
CouchDB Fan
○ 今年はCouchDB なにもやってないorz
○ 12/12 に MongoDB / CouchDB 勉強会します.
気がついたら node.js ユーザーに.
ハンズオン資料はこちら.
○ http://bit.ly/a7Mm5i
- 4. node.js とは何か.
Google V8
つまりJavaScript
Evented I/O
non-blocking I/O
フレームワーク化したもの
あるいは ミドルウェア
JavaScript 自体の言語仕様には手を加えてませ
ん.
- 6. 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
- 9. CommonJS Module
node.js (CommonJS) の場合
hellolib.js
○ http://dl.dropbox.com/u/219436/node.js/bpstud
y39/demo/hellolib.js
- 15. No More Lock!
httpd2.js
http://dl.dropbox.com/u/219436/node.js/bpst
udy39/demo/httpd2.js
- 16. No More Lock!
JavaScript はシングルスレッド
マルチスレッド化しようという動きもある
けれど.
ロックとかとは無縁
シングルスレッド != 並行処理できない
IOを工夫することで解決
IOの単位で処理を実行
- 18. Evented I/O
node.js のAPIは非同期が基本
ランタイム内で以下のライブラリを利用
○ libev
Event Loop のサポート
○ libeio
POSIX API の非同期サポート
JavaScript の書き方はブラウザでやる場合
とほとんど同じ
Callback
Event Handler
- 19. Callback Model
var fs = require('fs');
fs.rename('foo.txt', 'bar.txt',
function(err){
if(err) throw err;
console.log('renamed');
}
);
- 20. Event Model
var stdin = process.openStdin();
stdin.on('data', function(chunk){
console.log(chunk);
});
stdin.on('end', function(){
console.log('end');
});
- 21. ここまでのまとめ
JavaScript = Google V8
Chrome と同じ
Evented I/O
サーバープログラムの書きやすさ
○ No More Lock!
スレッドを消費しない効率性
JavaScript らしい書き方
- 25. var php = require('php');
var php = require('php');
php.sprintf('Hello %s', 'World');
基本的な関数はこれで大丈夫!
Ref: phpjs.org
- 26. 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 ...
- 27. npm install hogehoge
node package manager
ライブラリ一覧
○ http://npm.mape.me/
リポジトリはCouchDB
○ curl –X GET http://registry.npmjs.org/_users/
- 31. 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();
});
},
非同期メソッド
- 32. npm install socket.io
node.js 用 WebSocket ライブラリ
サーバー/クライアント 両方のJavaScriptを
提供
○ 両方ともJSだからできる使いやすい実装
WebSocket 非対応ブラウザでもFlashとか
使ってよきに計らってくれる
○ ので、負荷さえ気にしなければリアルタイム
アプリの実装に使える
- 34. やってみよう: retwis-js.
Python Hack-a-thon 2010.11 の時に、
redis がおもしろそうだったので node.js
で実装してみた.
https://bitbucket.org/shibu/redis_docjp/o
verview
- 35. 実験環境
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
- 37. 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なのでレスポンスが安定
- 38. 参考値
-n -c # / sec
Time 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