Bp study39 nodejs

4,749 views

Published on

node.j

Published in: Technology
0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,749
On SlideShare
0
From Embeds
0
Number of Embeds
160
Actions
Shares
0
Downloads
37
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

Bp study39 nodejs

  1. 1. 2010/11/30 id: yssk22 (CouchDB-JP)
  2. 2. 自己紹介  Yohei Sasaki (@yssk22)  CouchDB Fan ○ 今年はCouchDB なにもやってないorz ○ 12/12 に MongoDB / CouchDB 勉強会します.  気がついたら node.js ユーザーに.  ハンズオン資料はこちら. ○ http://bit.ly/a7Mm5i
  3. 3. 今日の話  「触るのはちょっと面倒だけど、気に なってるんだよ」ぐらいの人が対象です。 触るのはちょっと ↓ 触ってみたくなった ↓ ハンズオン資料 ↓ 本!? イマココ 目標
  4. 4. node.js とは何か.  Google V8  つまりJavaScript  Evented I/O  non-blocking I/O  フレームワーク化したもの  あるいは ミドルウェア  JavaScript 自体の言語仕様には手を加えてませ ん.
  5. 5. Hello World  hello.js  http://dl.dropbox.com/u/219436/node.js/bpst udy39/demo/hello.js
  6. 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
  7. 7. CommonJS  JavaScript の標準化の一環  モジュール  ユニットテスト  パッケージ  ....  この辺の標準に従っておくと、 CouchDB とか Rhino とか v8cgi とかで も使えるJavaScriptになる 対応 対応
  8. 8. CommonJS Module  ブラウザJSの場合 <script type="text/javascript" src="hellolib.js"></script> <script> hello(); </script>
  9. 9. CommonJS Module  node.js (CommonJS) の場合  hellolib.js ○ http://dl.dropbox.com/u/219436/node.js/bpstud y39/demo/hellolib.js
  10. 10. つまりJavaScript サーバーサイドも JavaScriptでいい じゃない. v8 ならそれなりに速いし
  11. 11. フロントエンドエンジニアリングの 将来 Tantek Çelik イエス。JavaScriptは勝ったんです、議論 の余地がありますか? Douglas Crockford あらゆる期待に反して、JavaScriptは世界 でもっとも重要なプログラミング言語にな りました。誰も望んでも期待もしていな かったけれど、そうなったんです。(笑) http://www.publickey1.jp/blog/10/yahoo_1.html
  12. 12. JavaScriptの勝利宣言 Ryan Dahl Nodeにこれだけ人気があるのはサーバで もJavaScriptが使えるためで、それは僕が 意図したことでもあります。と同時に、そ れはサーバサイドを書く手段として望まれ ていたことでもあったんです。それは大き な断絶だったんです。実はサーバを書くエ ンジニアはクライアントサイドを書くエン ジニアと同じだったのですから。そしてこ のシングルスレッド化されたサーバサイド のプログラミングスタイルこそ、サーバを 書くのに求められていたものなんです。 http://www.publickey1.jp/blog/10/yahoo_1.html
  13. 13. Why JavaScript?  みんな使ってる  使わざるをえない  そして、プログラミングモデルが実は ネットワークプログラム向き.
  14. 14. HTTP Server  httpd.js  http://dl.dropbox.com/u/219436/node.js/bpst udy39/demo/httpd.js
  15. 15. No More Lock!  httpd2.js  http://dl.dropbox.com/u/219436/node.js/bpst udy39/demo/httpd2.js
  16. 16. No More Lock!  JavaScript はシングルスレッド  マルチスレッド化しようという動きもある けれど.  ロックとかとは無縁  シングルスレッド != 並行処理できない  IOを工夫することで解決  IOの単位で処理を実行
  17. 17. Event Loop I/O Callback / EventHandler Functions event loop (single thread)
  18. 18. Evented I/O  node.js のAPIは非同期が基本  ランタイム内で以下のライブラリを利用 ○ libev  Event Loop のサポート ○ libeio  POSIX API の非同期サポート  JavaScript の書き方はブラウザでやる場合 とほとんど同じ  Callback  Event Handler
  19. 19. Callback Model var fs = require('fs'); fs.rename('foo.txt', 'bar.txt', function(err){ if(err) throw err; console.log('renamed'); } );
  20. 20. Event Model var stdin = process.openStdin(); stdin.on('data', function(chunk){ console.log(chunk); }); stdin.on('end', function(){ console.log('end'); });
  21. 21. ここまでのまとめ  JavaScript = Google V8  Chrome と同じ  Evented I/O  サーバープログラムの書きやすさ ○ No More Lock!  スレッドを消費しない効率性  JavaScript らしい書き方
  22. 22. つまりJavaScript サーバーサイドも JavaScriptでいい じゃない. v8 ならそれなりに速いし 効率的なコードが自然と書ける!
  23. 23. よくある質問を2つほど.
  24. 24. サーバーサイドの JavaScript っていわれて も、ライブラリはー?
  25. 25. var php = require('php'); var php = require('php'); php.sprintf('Hello %s', 'World');  基本的な関数はこれで大丈夫!  Ref: phpjs.org
  26. 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. 27. npm install hogehoge  node package manager  ライブラリ一覧 ○ http://npm.mape.me/  リポジトリはCouchDB ○ curl –X GET http://registry.npmjs.org/_users/
  28. 28. npm install express  Webフレームワーク Express  inspired by Sintra  Webアプリに必要な一通りの機能
  29. 29. npm install oauth  node 用 OAuth Client ライブラリ  Express と併せて使えば、認証はばっち り
  30. 30. npm install nodeunit  node.js 用 xUnit テストフレームワーク  「非同期」とはいえ、単一スレッドのコー ルバックモデルなので、記述する内容は同 じ.
  31. 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. 32. npm install socket.io  node.js 用 WebSocket ライブラリ  サーバー/クライアント 両方のJavaScriptを 提供 ○ 両方ともJSだからできる使いやすい実装  WebSocket 非対応ブラウザでもFlashとか 使ってよきに計らってくれる ○ ので、負荷さえ気にしなければリアルタイム アプリの実装に使える
  33. 33. で、パフォーマンスは?
  34. 34. やってみよう: retwis-js.  Python Hack-a-thon 2010.11 の時に、 redis がおもしろそうだったので node.js で実装してみた.  https://bitbucket.org/shibu/redis_docjp/o verview
  35. 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
  36. 36. timeline 表示のab結果(参考値) 0 50 100 150 200 250 5 10 15 20 25 30 50 75 100 125 150 200 250 Request/sec 同時接続数 (-c) node.js Python
  37. 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. 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
  39. 39. で、パフォーマンスは?  普通に使えるレベル.  Connection Pooling とか、その手のことは 気にしなくてもいける.  ただし、1 CPU しか消費しないので注意.  複数コアの環境では nginx を手前に置いてバラ ンスさせるのが良さそう ○ node.js でもそのうち対応するかも。  node-webworker
  40. 40. つまりJavaScript サーバーサイドも JavaScriptでいい じゃない. v8 ならそれなりに速いし 効率的なコードが自然と書ける! 実用的なアプリも書ける!
  41. 41. 続きはハンズオンで.

×