nodejs introduction

45
yurufuwa” introduction of 2010/11/20@JStudy#2 id: Jxck 20101121日日曜日

Upload: jxck-

Post on 20-Jun-2015

3.828 views

Category:

Technology


2 download

DESCRIPTION

2010/11/20 JStudy#2 (一部誤植訂正済)

TRANSCRIPT

Page 1: Nodejs Introduction

“yurufuwa” introductionof

2010/11/20@JStudy#2id: Jxck

2010年11月21日日曜日

Page 2: Nodejs Introduction

Jack2010年11月21日日曜日

Page 3: Nodejs Introduction

噂の Node.js について

•Node.js ってなんなのか?•何故ここにきてサーバサイドJSなのか?•どんなことが出来るのか?

的な話を、ゆるくふわっと解説します。

2010年11月21日日曜日

Page 4: Nodejs Introduction

Node.js とは?

Node.js = サーバーサイドJS

2010年11月21日日曜日

Page 5: Nodejs Introduction

それだけ?

2010年11月21日日曜日

Page 6: Nodejs Introduction

なら昔からあるじゃん?

•Rhino •Jaxer•Nitroetc..

“なぜ” Node.js なの?2010年11月21日日曜日

Page 7: Nodejs Introduction

“なぜ”を知る3つのキーワード

• イベントループ•ブロック• Google V8

2010年11月21日日曜日

Page 8: Nodejs Introduction

イベントループ

2010年11月21日日曜日

Page 9: Nodejs Introduction

スレッドモデルとイベントループ

•スレッドモデル✓沢山スレッドを起動して同時に処理する(マルチスレッド)

•イベントループ✓一つのスレッド(シングルスレッド)の中でイベントとコールバックを使って処理する。

2010年11月21日日曜日

Page 10: Nodejs Introduction

マルチスレッド

スレッドが増える程メモリを消費

でも今はメモリも安いしたくさん積んでるし。。

2010年11月21日日曜日

Page 11: Nodejs Introduction

富豪メモリ

「メモリが沢山あれば何とかなる」

と思っていた時期が、ボクにも有りました(キリ!

2010年11月21日日曜日

Page 12: Nodejs Introduction

C10K問題

 リアルタイムWebとやらの流行もあって、同時に1万くらい同時にアクセスがきて、しかも接続しっぱなしとかもあり得る時代になって来た。

 そこまで行くと、メモリとかネットワークを強化しても、越えられない壁が有るかもしれないことが分かった。(実際はもっと深い話)

2010年11月21日日曜日

Page 13: Nodejs Introduction

イベントループ

2010年11月21日日曜日

Page 14: Nodejs Introduction

イベントループ

イベントとコールバックで処理をする。

シングルスレッドなので

メモリが少なくて済む。

2010年11月21日日曜日

Page 15: Nodejs Introduction

イベントループモデル

イベントループを採用した実装は既にいくつかある。

•Twisted - Python•EventMachine - Ruby•AnyEvent - Perl

2010年11月21日日曜日

Page 16: Nodejs Introduction

ブロック

2010年11月21日日曜日

Page 17: Nodejs Introduction

イベントループとブロック

イベントループはシングルスレッドなので、途中でブロックが発生すると全体に影響する。

ブロックとは、何か時間のかかる処理のせいで、次の処理が待たされる状態。例えば、

•DB からデータをたんまり読み込む

•ネットワーク越しに応答をじっと待つetc

2010年11月21日日曜日

Page 18: Nodejs Introduction

ブロックに注意

さっきの実装

•Twisted - Python•EventMachine - Ruby

•AnyEvent - Perlこれらはブロックを禁止していない。だからブッロクの有る処理が混じるとパフォーマンスに影響がでてしまう。

2010年11月21日日曜日

Page 19: Nodejs Introduction

ノンブロックの強制

そこで、「普通にやってれば絶対にブロックしない」(ノンブロックを強制する)ようにしてしまえば解決だろ!

と考えた人が居た。

Ryan Dahl←この人

2010年11月21日日曜日

Page 20: Nodejs Introduction

最適な言語は?

ちょっと前の話をまとめると、

•シングルスレッドである•イベントループを持つ

そんな言語が良い。そこにノンブロックなAPIを実装すれば勝つる!

2010年11月21日日曜日

Page 21: Nodejs Introduction

JavaScript !!

Q: シングルスレッドですか?A:「あー、ワーカーとか使わなければ基本そうっす。」

Q: イベントループ持ってる?A: 「クリックしたら~、とかは良くやってますよ?」

完璧!> でも JS じゃ遅くね?

2010年11月21日日曜日

Page 22: Nodejs Introduction

Google V8

2010年11月21日日曜日

Page 23: Nodejs Introduction

Google V8

•メチャクチャ速いJS実装。•中間コードなし直コンパイル。•C++ からも色々使いやすい。•C++ でアドオンも書ける。

2010年11月21日日曜日

Page 24: Nodejs Introduction

ここまでのまとめ

Node.js とは、シングルスレッドで、イベントループを持っていた JS にノンブロッキングな API を添えて、超速い V8 上で動く様にしたサーバーサイド JavaScript 実行環境。

ただ単に「サーバも JS で書きたい」という理由以上に、JavaScript が Ryan の要求を満たしていた。もし満たしてなかったら、別の言語になってたかも。

2010年11月21日日曜日

Page 25: Nodejs Introduction

Node.js ++

• 少ないメモリで沢山さばける。• V8 なので速い。• 最初からブロックしない仕様になってる。• 難しいマルチスレッドプログラミングをしないで良い。• JavaScript で書ける。

2010年11月21日日曜日

Page 26: Nodejs Introduction

Node.js --• CPUにもの凄い負荷のかかる処理(CPU Heavy)は苦手•マルチコア環境を使いこなせない✓ これは将来 Worker を使って解決の予定

•処理してない例外が発生するとイベントループ全体が止まる✓ uncaughtException という機構がある。

•コールバック入れ子の嵐✓ Defferd とか使う

•Windows.. orz✓ つ VM

2010年11月21日日曜日

Page 27: Nodejs Introduction

Dive Into Node.js !!

2010年11月21日日曜日

Page 28: Nodejs Introduction

Node.js でプログラミング

•Event Driven(Event Emitter)•ECMA 5th edition•Common JS•No Cross Browser•Same language in Client & Server

2010年11月21日日曜日

Page 29: Nodejs Introduction

Event Emitter

•イベント用オブジェクト、こんなのが沢山出てくる。

•今までのイベントと基本同じ考え方

emitter.on(‘event’,callback); // bindemitter.emit(‘event’); // trigger

$(‘div’).bind(‘event’,callback);$(‘div’).trigger(‘event’);

2010年11月21日日曜日

Page 30: Nodejs Introduction

ECMA 5th edition

基本は 3rd で、全部ではないが 5th も使える。

• getter/setter Syntax• Property Descriptor• Native JSON Object• Array.prototype.(map|reduce|filter)etc

2010年11月21日日曜日

Page 31: Nodejs Introduction

Common JS

JavaScript のモジュールやテストに関する共通仕様。今対応しているのは以下の二つ。

* Modules 1.0 (require, exports ...)* Unit Testing 1.0 (Asssert ...)

2010年11月21日日曜日

Page 32: Nodejs Introduction

No Cross Browser

2010年11月21日日曜日

Page 33: Nodejs Introduction

Node.js の得意分野

•リアルタイムWeb的なアプリ。✓ Ajax, Comet, WebSocket etc

•重たいI/Oを伴うアプリ。✓ ファイルアップロードとか

•クライアントでもJSを沢山書くアプリ。✓ 共通の言語で全部書ける

2010年11月21日日曜日

Page 34: Nodejs Introduction

Node.js を始めるには

言語 環境管理 パッケージ管理

Ruby rvm gem

Python Virtualenv PyPI

Perl Perlbrew CPAN

node nave npm2010年11月21日日曜日

Page 35: Nodejs Introduction

Node.js で "HelloThe World!!"var http = require('http');

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('The World!!\n');}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

2010年11月21日日曜日

Page 36: Nodejs Introduction

Socket.IO で WebSocket

•Socket.io✓WebSocket の定番ライブラリ。✓WebSocket が無いブラウザでも動く様になってる。

✓WebSocket は Node.js との相性がいい。

2010年11月21日日曜日

Page 37: Nodejs Introduction

Socket.ioWebSocketが無かったら(フォールバック)• Adobe Flash Socket• ActiveX HTMLFile (IE)• XHR with multipart encoding• XHR with long-polling• JSONP polling (for cross-domain)

サポートするブラウザ• Safari 4•Google Chrome 5• Internet Explorer 6• Internet Explorer 7• Internet Explorer 8• iPhone Safari• iPad Safari• Firefox 3• Firefox 4 (Minefield)

•Opera 10.61

2010年11月21日日曜日

Page 38: Nodejs Introduction

Socket.io サーバ側var socketio = require('socket.io');

var io = socketio.listen(server);

io.on('connection', function(client) { //接続イベント client.on('message', function(message) { //受信イベント //クライアントがメッセージを送って来たら実行される。 //messageが送られて来たデータ client.send(message); //送って来た本人だけに送る。 client.broadcast(message); //送って来た人以外全員に送る。 });});

2010年11月21日日曜日

Page 39: Nodejs Introduction

Socket.io クライアント側$(function() {

var socket = new io.Socket(null, {port: 8080}); socket.connect();

$('#button').click(function() { // 送信 socket.send('message'); return false; });

socket.on('message', function(obj) { // 受信ベント $('#output').text(obj); });});

2010年11月21日日曜日

Page 40: Nodejs Introduction

他のモジュール

•FW✓Express (like Sinatra), etc

•Template✓ejs(like erb), haml, sass, Jade, etc

•RDB✓sqlite, mysql, postgresql, etc

•KVS✓couch, mongodb, redis, etc

•Test/Spec✓Vows, jasmine, Qunit, etc

2010年11月21日日曜日

Page 41: Nodejs Introduction

実装例

•Node Knock Out

• http://nodeknockout.com/

• 48時間の Node.js 耐久ハッカソン

•リアルタイムWebな作品が多い

2010年11月21日日曜日

Page 42: Nodejs Introduction

日本語リソース

JP User Group : http://nodejs.jp/

@yssk22 hands on : http://bit.ly/a7Mm5i

@meso hands on : http://bit.ly/bNSDyD

@bad_at_math :

“node.js とは何か”: http://bit.ly/bdfrbz

2010年11月21日日曜日

Page 43: Nodejs Introduction

他参考資料

• 本家: http://nodejs.org/• JSConf09 Slide: http://bit.ly/6lZvhy• JSConf10 Slide: http://bit.ly/c67UQB• Knockout: http://nodeknockout.com/• Bench: http://bit.ly/ao3zc5• C10K: http://bit.ly/N2DWS

2010年11月21日日曜日

Page 44: Nodejs Introduction

That's AllThank You.

2010年11月21日日曜日

Page 45: Nodejs Introduction

Question?

2010年11月21日日曜日