nodejs introduction
DESCRIPTION
2010/11/20 JStudy#2 (一部誤植訂正済)TRANSCRIPT
“yurufuwa” introductionof
2010/11/20@JStudy#2id: Jxck
2010年11月21日日曜日
Jack2010年11月21日日曜日
噂の Node.js について
•Node.js ってなんなのか?•何故ここにきてサーバサイドJSなのか?•どんなことが出来るのか?
的な話を、ゆるくふわっと解説します。
2010年11月21日日曜日
Node.js とは?
Node.js = サーバーサイドJS
2010年11月21日日曜日
それだけ?
2010年11月21日日曜日
なら昔からあるじゃん?
•Rhino •Jaxer•Nitroetc..
“なぜ” Node.js なの?2010年11月21日日曜日
“なぜ”を知る3つのキーワード
• イベントループ•ブロック• Google V8
2010年11月21日日曜日
イベントループ
2010年11月21日日曜日
スレッドモデルとイベントループ
•スレッドモデル✓沢山スレッドを起動して同時に処理する(マルチスレッド)
•イベントループ✓一つのスレッド(シングルスレッド)の中でイベントとコールバックを使って処理する。
2010年11月21日日曜日
マルチスレッド
スレッドが増える程メモリを消費
でも今はメモリも安いしたくさん積んでるし。。
2010年11月21日日曜日
富豪メモリ
「メモリが沢山あれば何とかなる」
と思っていた時期が、ボクにも有りました(キリ!
2010年11月21日日曜日
C10K問題
リアルタイムWebとやらの流行もあって、同時に1万くらい同時にアクセスがきて、しかも接続しっぱなしとかもあり得る時代になって来た。
そこまで行くと、メモリとかネットワークを強化しても、越えられない壁が有るかもしれないことが分かった。(実際はもっと深い話)
2010年11月21日日曜日
イベントループ
2010年11月21日日曜日
イベントループ
イベントとコールバックで処理をする。
シングルスレッドなので
メモリが少なくて済む。
2010年11月21日日曜日
イベントループモデル
イベントループを採用した実装は既にいくつかある。
•Twisted - Python•EventMachine - Ruby•AnyEvent - Perl
2010年11月21日日曜日
ブロック
2010年11月21日日曜日
イベントループとブロック
イベントループはシングルスレッドなので、途中でブロックが発生すると全体に影響する。
ブロックとは、何か時間のかかる処理のせいで、次の処理が待たされる状態。例えば、
•DB からデータをたんまり読み込む
•ネットワーク越しに応答をじっと待つetc
2010年11月21日日曜日
ブロックに注意
さっきの実装
•Twisted - Python•EventMachine - Ruby
•AnyEvent - Perlこれらはブロックを禁止していない。だからブッロクの有る処理が混じるとパフォーマンスに影響がでてしまう。
2010年11月21日日曜日
ノンブロックの強制
そこで、「普通にやってれば絶対にブロックしない」(ノンブロックを強制する)ようにしてしまえば解決だろ!
と考えた人が居た。
Ryan Dahl←この人
2010年11月21日日曜日
最適な言語は?
ちょっと前の話をまとめると、
•シングルスレッドである•イベントループを持つ
そんな言語が良い。そこにノンブロックなAPIを実装すれば勝つる!
2010年11月21日日曜日
JavaScript !!
Q: シングルスレッドですか?A:「あー、ワーカーとか使わなければ基本そうっす。」
Q: イベントループ持ってる?A: 「クリックしたら~、とかは良くやってますよ?」
完璧!> でも JS じゃ遅くね?
2010年11月21日日曜日
Google V8
2010年11月21日日曜日
Google V8
•メチャクチャ速いJS実装。•中間コードなし直コンパイル。•C++ からも色々使いやすい。•C++ でアドオンも書ける。
2010年11月21日日曜日
ここまでのまとめ
Node.js とは、シングルスレッドで、イベントループを持っていた JS にノンブロッキングな API を添えて、超速い V8 上で動く様にしたサーバーサイド JavaScript 実行環境。
ただ単に「サーバも JS で書きたい」という理由以上に、JavaScript が Ryan の要求を満たしていた。もし満たしてなかったら、別の言語になってたかも。
2010年11月21日日曜日
Node.js ++
• 少ないメモリで沢山さばける。• V8 なので速い。• 最初からブロックしない仕様になってる。• 難しいマルチスレッドプログラミングをしないで良い。• JavaScript で書ける。
2010年11月21日日曜日
Node.js --• CPUにもの凄い負荷のかかる処理(CPU Heavy)は苦手•マルチコア環境を使いこなせない✓ これは将来 Worker を使って解決の予定
•処理してない例外が発生するとイベントループ全体が止まる✓ uncaughtException という機構がある。
•コールバック入れ子の嵐✓ Defferd とか使う
•Windows.. orz✓ つ VM
2010年11月21日日曜日
Dive Into Node.js !!
2010年11月21日日曜日
Node.js でプログラミング
•Event Driven(Event Emitter)•ECMA 5th edition•Common JS•No Cross Browser•Same language in Client & Server
2010年11月21日日曜日
Event Emitter
•イベント用オブジェクト、こんなのが沢山出てくる。
•今までのイベントと基本同じ考え方
emitter.on(‘event’,callback); // bindemitter.emit(‘event’); // trigger
$(‘div’).bind(‘event’,callback);$(‘div’).trigger(‘event’);
2010年11月21日日曜日
ECMA 5th edition
基本は 3rd で、全部ではないが 5th も使える。
• getter/setter Syntax• Property Descriptor• Native JSON Object• Array.prototype.(map|reduce|filter)etc
2010年11月21日日曜日
Common JS
JavaScript のモジュールやテストに関する共通仕様。今対応しているのは以下の二つ。
* Modules 1.0 (require, exports ...)* Unit Testing 1.0 (Asssert ...)
2010年11月21日日曜日
No Cross Browser
2010年11月21日日曜日
Node.js の得意分野
•リアルタイムWeb的なアプリ。✓ Ajax, Comet, WebSocket etc
•重たいI/Oを伴うアプリ。✓ ファイルアップロードとか
•クライアントでもJSを沢山書くアプリ。✓ 共通の言語で全部書ける
2010年11月21日日曜日
Node.js を始めるには
言語 環境管理 パッケージ管理
Ruby rvm gem
Python Virtualenv PyPI
Perl Perlbrew CPAN
node nave npm2010年11月21日日曜日
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日日曜日
Socket.IO で WebSocket
•Socket.io✓WebSocket の定番ライブラリ。✓WebSocket が無いブラウザでも動く様になってる。
✓WebSocket は Node.js との相性がいい。
2010年11月21日日曜日
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日日曜日
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日日曜日
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日日曜日
他のモジュール
•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日日曜日
実装例
•Node Knock Out
• http://nodeknockout.com/
• 48時間の Node.js 耐久ハッカソン
•リアルタイムWebな作品が多い
2010年11月21日日曜日
日本語リソース
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日日曜日
他参考資料
• 本家: 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日日曜日
That's AllThank You.
2010年11月21日日曜日
Question?
2010年11月21日日曜日