• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Node.js ― Hello, world! の1歩先へ。
 

Node.js ― Hello, world! の1歩先へ。

on

  • 7,131 views

Node session in #jjug_ccc 2011 fall

Node session in #jjug_ccc 2011 fall
http://www.java-users.jp/contents/events/ccc2011fall/sessions.html#B2

Statistics

Views

Total Views
7,131
Views on SlideShare
5,619
Embed Views
1,512

Actions

Likes
12
Downloads
11
Comments
0

18 Embeds 1,512

http://d.hatena.ne.jp 644
http://blog.looseleafjs.org 497
http://kenichiro22.hatenablog.com 247
http://blog.roundrop.jp 28
http://blog.roundrop-local.jp 26
http://webcache.googleusercontent.com 18
http://paper.li 13
http://devmemo.local.com 11
http://www.johnnydaisuke.info 10
http://www13.jimdo.com 4
http://us-w1.rockmelt.com 3
http://www.slideshare.net 2
http://a0.twimg.com 2
http://feeds.feedburner.com 2
https://twitter.com 2
http://translate.googleusercontent.com 1
http://twitter.com 1
http://www55.jimdo.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • はじめまして。\n「Node.js — Hello, world! の1歩先へ。」というタイトルで発表させて頂きます、\n株式会社マインディア、Node.js日本ユーザグループの飛岡と申します。\n\nJavaのイベントでJavaScriptの発表をするという、アウェイ感満載な中ですが、\n最後までお付き合いよろしくお願いします。\n\n\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • さて、早速ですが、皆さん、Node.jsをご存知でしょうか?\n知っているという方?\n → おぉ、やっぱり知っている方が多いですね。\nそれでは、知っているけど、よくわからないという方、手を下ろして下さい\n → そうですよねぇ、厳しいですが、これが流行していると言われて久しい、Node.jsの現実です。\n
  • というわけで、まず、本日の発表の目標を定めておきましょう。\n\n\n\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • イベント駆動とか、非同期I/Oとかよくわからない言葉でいっぱいのNode.js。\nこれを、なんとなくこんな感じ、と掴んでもらうところまでが最低ライン。\n\nそのあと、こんなことができる、ということを知ってもらって、\n帰ったら触ってみよう、とみなさんに思ってもらえたら、このプレゼンは大成功です。\n
  • それでは、よろしくお願いします。\n\n
  • Introductionということで、本題に入る前に、コミュニティと自己紹介をさせて下さい。\n誰かわからない人の話を聞くよりは、後の話が頭に入るはず…ということで宜しくお付き合い下さい。\n
  • まず、私の所属している、Node.js日本ユーザグループ、Node.js_jpの紹介です。\n\n
  • 活動としては、一般的なこれらですね。\n翻訳の速さは他の言語にはない特徴です。\n本はもうちょっとで出版されるはずです。僕も一応レビュアとして微力ながらお手伝いしています。\n東京Node学園という名前はダジャレ風の、真面目な勉強会を開催していますが、\nNodeが流行ったおかげですぐ埋まってしまって僕も参加できたことはありません。\n
  • そして、いよいよ来週末、東京Node学園祭が開催されます。\nNode.jsの開発者Ryan dahlも来日する、アジア初のNodeカンファレンスです。\nチケットはおかげ様でsold outですが、資料等公開されると思うのでを是非御覧いただければと思います。\n\n
  • memberはこんな感じです、\nNode本体のコミッタから、高校生まで多種多様な顔ぶれです。\n2011/10/16現在、全869人のメンバーがいます。\n…で、その端っこに私がいます。\n
  • それでは少しだけ自己紹介をさせていただきます。\nTobioka Tatsuyaでオンラインでは、@tnantokaという適当なハンドルで活動していることが多いです。\n\n今年の夏まで3年間、金融SIerでOnlineBankingのSEをやってました。いわゆるスーツですね。\nで、ギークにあこがれをこじらせて今はエンジニアをやってます。\n\n\nBlogは、bornneet.comっていうダメ人間丸出しのドメインでやってます。\n基本的にはJavaScriptの人で、iPhoneアプリとか出したりもしてます。このサイトに今までの作品一覧を載せてますので興味のある方はご覧下さい。\n
  • で、最近はもうすっかりNode.jsばっかり触ってて、こういったモジュールやエントリを公開したりしてます。\nというわけで、少なくとも初心者ではないので、ある程度信憑性を持って聞いていただけるんではないかと思います。\n\n
  • 長い前フリがようやく終わりましたので、本題に行きましょう!\nまずは、改めてNode.jsとはの説明を試みたいと思います。\n\n冒頭にも話しましたが、結局なんなの?っていう人も多いと思います、\n実際、友達とかと話してても全然わかってもらえていないことも多い。\nこんなに流行ってて情報が足りないなんてことはないはずなのに、\nなぜこんなことになってしまうんでしょうか?\n\n5分超えてたらまく。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • 例えば、GoogleでNode.jsとはを検索します、\n出てくるのは、内部実装の話か、チャットアプリを作った話ですね。\nあとはWebSocketと混同しちゃってるような記事。\n最近は雑誌とかも出て改善されていますが、この状況では、わかんなくても納得な気がきます。\n
  • というわけで今日は良い感じの説明ができるように頑張ります。\n\n
  • では、Node.jsとはなんなのか、\n\n結論から言うと、単なるプログラム実行環境です。\nJavaなら java Hello\nperlなら、perl hello.pl\nnodeなら、node hello.js\nとなるだけです。\n\nこれだけ聞くと単純なのになぜこんなにわかりにくいのか。\n
  • では、Node.jsとはなんなのか、\n\n結論から言うと、単なるプログラム実行環境です。\nJavaなら java Hello\nperlなら、perl hello.pl\nnodeなら、node hello.js\nとなるだけです。\n\nこれだけ聞くと単純なのになぜこんなにわかりにくいのか。\n
  • では、Node.jsとはなんなのか、\n\n結論から言うと、単なるプログラム実行環境です。\nJavaなら java Hello\nperlなら、perl hello.pl\nnodeなら、node hello.js\nとなるだけです。\n\nこれだけ聞くと単純なのになぜこんなにわかりにくいのか。\n
  • では、Node.jsとはなんなのか、\n\n結論から言うと、単なるプログラム実行環境です。\nJavaなら java Hello\nperlなら、perl hello.pl\nnodeなら、node hello.js\nとなるだけです。\n\nこれだけ聞くと単純なのになぜこんなにわかりにくいのか。\n
  • では、Node.jsとはなんなのか、\n\n結論から言うと、単なるプログラム実行環境です。\nJavaなら java Hello\nperlなら、perl hello.pl\nnodeなら、node hello.js\nとなるだけです。\n\nこれだけ聞くと単純なのになぜこんなにわかりにくいのか。\n
  • それはこの定義のせいだと思います。\n\n"Node.jsは、イベントループ・非同期I/Oを利用したシングルスレッドモデルによって、スケーラブルなネットワークプログラムを簡単に実現することができる、サーバサイドJavaScript実装です。"\n
  • うぉーって感じですね。\n\n
  • 一見はてななこの定義ですが、2つにわけて説明することで、意外とすっきり理解できます。\n\n1つめは、スケーラブルなNWプログラミング環境、\n2つめは、サーバサイドJSですね。\n\nそれでは順に見ていきましょう。\n
  • 一見はてななこの定義ですが、2つにわけて説明することで、意外とすっきり理解できます。\n\n1つめは、スケーラブルなNWプログラミング環境、\n2つめは、サーバサイドJSですね。\n\nそれでは順に見ていきましょう。\n
  • まずは、1つめスケーラブルなNWプログラミング環境です。\nこいつがNodeをわかりづらくしてる主な要因ですね。\n\n
  • キーワードはシングルスレッド、です。\n\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • Prrefox/Worker MPMのApache等、古典的な実装では、\nこのように1リクエストごとに専用のプロセス・スレッドが割り当てられ、File I/Oなどが終わると応答を返します。この間、他のリクエストがあると他のプロセス・スレッドを割り当てることで、並列処理を可能にします。\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • 対してNodeは、リクエストがあったら、ファイルI/Oなどの要求を出して、\nスレッドを占有しません。\nこの間に他のリクエストがあっても同じくファイルI/Oの要求を出します。\nそれで、I/Oが終わったら、callbackシグナル等を受けて、レスポンスを返してます。\nこれをイベントループ、非同期I/Oなどの仕組みで実現しています。\n\nこの辺が難しいですが、このように、細かいところを気にしなければそんなに難しくはありません。\n\nでは、何のためにシングルスレッドな仕組みが必要なのでしょうか。\n\n\n
  • その1つとして、C10K問題があげられます。\nこれは大量のクライアントから接続されると、サーバのリソースが溢れてしまう、という問題ですね。\n例えば1httpに1プロセスを割り当てると、2MBほど消費してしまうので、\n1ブラウザから複数コネクション貼られたりすると、数千人程度の同時利用でパンクしてしまいます。\n\nこの問題は5〜6年前から日本でも話題になったいんですが、\n大規模サイトのみの話という感じで、実感のない人も多かったかもしれません。\nただ、WebがRealTimeの時代となっていく中で、もっと接続しっぱなしされるようになると考えられ、現実的な問題になってくる可能性があります。\n\nというわけでNodeのシングルスレッドなアプローチが生きてくるわけですね。\n\n
  • ただ、スケーラブルなNWプログラミング環境はNodeの専売特許ではありません。\nTwitterなどはRubyやScalaであんだけさばいているみたいですし。\nでは、なぜ、Nodeなのか。\n\nこれはnodejs.orgのトップページにある1文です。\n\n"easy way"というところが肝ですね。\n簡単に、というのがNode.jsの存在意義です。\n\nただ、皮肉なことにここが初心者の壁にもなっています。\nスケーラブルを実現する、イベントループや非同期I/Oなどの難解な言葉のせいですね。\n
  • 確かにアーキテクチャは大切です。\nただ、他の言語を使うときだって内部実装まで意識しているでしょうか。\n少なくとも、触り始めるにあたっては必須ではないはずです。\n
  • そもそもNodeのうりはというと、こちらもnodejs.orgからの引用ですが、"less-than-expert"でもできるのがNodeの売り。\nそもそもシングルスレッドなアプローチは他の言語でもできます。皆が理解できるなら、他の実装でやればいいですしね。\n\n
  • というわけで、Node.js とはという問いに対する、1つめの答えですが、\nルールに沿って書いていれば、高速なNWプログラムが書ける環境ということで、\n細かいことは気にしないのが吉だと思います。\n\n
  • それでは1つ目の顔が生きた例ということでkansi.jsというライブラリを作った時の体験談をひとつ。\nこのライブラリは設定したサーバに定期的にHTTPリクエスト送って監視するというものです。\n\n特に意識しなくても効率的にしょりできた例です。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • 普通の言語で特に工夫せずにloopとかでやるとこうなっちゃいそうですよね。\nresponceがあったら次のサーバへ、ということでtimeoutとかがあると後続の処理が遅れる。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • でもイベント駆動なNodeならこうなってくれて、timeout待ちとかで他のサーバの監視が遅れたりしないんですね。\nクライアントの例なのでちょっと特殊ですが、実際作っててこれはいいなと思いました。\n\n
  • さて、これで1つ目の顔は理解してもらえたとして、2つめの顔、\n最も実用的なサーバサイドJS、です。\n\n1つ目のところでは意識的にJavaScriptという単語をあまり出さないようにしたんですが、\nNodeはプログラミング言語としてJavaScriptを採用しています。\n\n12分ならオーケー\n\n
  • なぜJavaScriptかというと元々イベント駆動だったことや、みなさんにはHotSpot VMはおなじみだと思いますが、ラース・バックが関わったGoogle V8という高速な実装があったことが大きな理由です。\nまた、Webの必修言語ということで、経験者が多数いたことも流行に一足も二足も買いました。\n
  • JavaScript。名前以外はJavaと全く関係ないこの言語、皆さんもおなじみだと思いますが、サーバサイドJSとはを説明する前に改めて説明しておくと、\nJavaScriptはECMAScriptという標準仕様を実装した言語です。\nFlash作成に使うActionScriptもその仲間です。\nbrowser上で動き、DOM…HTMLやCSSを操作するものをクライアントサイドJSと呼びます。\n
  • JavaScript。名前以外はJavaと全く関係ないこの言語、皆さんもおなじみだと思いますが、サーバサイドJSとはを説明する前に改めて説明しておくと、\nJavaScriptはECMAScriptという標準仕様を実装した言語です。\nFlash作成に使うActionScriptもその仲間です。\nbrowser上で動き、DOM…HTMLやCSSを操作するものをクライアントサイドJSと呼びます。\n
  • そしてサーバサイドJSは、OSの上で動いて、ファイルシステムやNW、DB操作等を行います。\n他のプログラミング言語と同等のことができます。\n実行は、script srcでbrowserに読み込むクライアントサイドJSに対して、コマンドで行います。\n\n
  • では、サーバサイドJSの良さは何か。\nまず今までのクライアントサイドのコードの多くが流用できることがあげられます。\nまた、開発中JSのことしか考えなくて良いというのもメリットになります。\nAppletをクライアント側、サーバをServletで開発するのに近いのかもしれません。\n\n
  • 実はこのサーバサイドJS、スケーラブルなNW実装と同様、Nodeの専売特許じゃありません。\n特にRingo.JSなんかはJava上で動作し、GAE上で動いたりして脅威です。\nただ、現状Nodeが一番流行っており、ライブラリも充実し、これからも増えることから、一番実用的といって過言ではないと思います。\n\n
  • そして、開発者の名前がカッコイイ!ライアン・ダール、いい響きですね、言いたくなる。\n\n
  • とおふざけは置いておいて、Node.jsとはの回答その2です。\nサーバ上でJavaScriptによるプログラミングが可能な環境、ですね。簡単です。\n
  • さて2目の顔も簡単な例を。\nuserid, passwordのチェック、UI的にブラウザ側での実装は必須になってきている。\nでもサーバ側でもしなきゃいけない、正直めんどくさいですよね。\nサーバサイドJSなら、ブラウザのための関数等がそのまま動きます。\n工夫すればそのまま、最悪コピペで使える。\nほんとにJSのことだけ考えていればいい。\n
  • 2つの顔に分けて説明してきましたが、再度ひとつにまとめてみるとこうなります。\nスケーラブルなNWプログラムを実現する環境で、プログラミング言語としてJSを採用している、それだけです、とても簡単ですね。\n
  • というわけで、ここまで終わりました。\nあとはNodeの楽しさをひたすら伝えるだけなので、気が楽ですね。\n何かひとつでも興味を持ってもらえるものがあれば幸いです。\n\n15分ならバンザイ!\n\n
  • それでは、Nodeではこんなことができるということで、いくつか作品をお見せしましょう。\n\n
  • 作品紹介の題材ですが、\n8/27-29\nNode knockoutというハッカソンが開催されました。\n
  • ソロ1位のこの作品。実は全体でも1位なんですが、全体は別の作品に譲られました。\nリアルタイムにサイトの閲覧者の行動を観察し、チャットとかで話かけたりもできます。\n裏方の方にRealTimeWebを使う所が他にはないアイディアでした。\n\nちょっとサービスの特性上この場でデモはしづらいので割愛しますが、無料で登録できますので是非試してみてください。\n\n
  • Eight Bit Beat。みんなでマウスをポチポチしながら8bitサウンドを一緒に作れるサービスです。とても簡単に使えて楽しいので是非使ってみてください。\n\n【デモ】\nこれはすぐうごかせるのでやってみましょう。\nこうやって他の人の画面に即座に反映されて一緒に弄ることができます。\n
  • 続いては、Web IDEのnide。\n自動バックアップ&リビジョン管理がついており、UIがMac風で個人的には一番気に入った作品でした。\n\n【デモ】こちらは先日ソースコードが公開されたのでローカルで動かしてみます。\nnideコマンドでいけます。\n売りがリビジョン機能。\n\n
  • 最後に自分の作品も一応。ソロ部門7位という微妙な結果でした。\nParagraph.JSというリアルタイムWikiです。ページ単位ではなく段落単位の編集が可能で、他の人が触り始めるとその段落がリアルタイムでロックされ、保存されるとリロード無しに反映されます。\n\n【これも動かしてみます】\n\n
  • と、このような作品がたった48時間で178作品も作られました。\n熱いですね!\n\n
  • Nodeでできることの一例としてハッカソンの作品をざっと見ましたが、RealTimeな作品が多いですね、\nNode=Realtimeというわけではないんですが、やはり多いです。\nその理由ですが、前述のとおり、まず、NWプログラミングが得意というのがあります。\nそして、なんといってもSocket.IOの存在です。\n
  • リアルタイムWebと言えばWebSocketですが、まだブラウザの実装状況はまばらです。\nSocket.IOはFlashやXHR等をつかって、IE5.5以上で双方向通信を実現してくれるライブラリです。あまりに定番すぎて、Nodeの説明とごっちゃになってる場合もあるぐらいなので注意です。\n\nリアルタイムWebにしか使えないか、というともちろんそんなことはありません。\nついこの間もMLで一つの議論がありました。\n
  • それがNodeでCGIです。\nCGIはご存知の通り、Webサーバ上で外部プログラムを動かす古典的な方法です。\nナンセンスかと言われれば100%ナンセンスです。Nodeが頑張ってシングルスレッドとかで工夫しているのに他のWebサーバを前においちゃうじてんでアウトです。\nだだやっちゃいけないことはない\n
  • 実は5月にもう作ってました。\nblosxomという昔流行ったblog cgiを移植してます。\nどうしてもデーモンは立てられないけどnodeを使いたいという人は是非どうぞ。\n
  • これ知ってますか?\nのりを切るために開発されたけど、シュレッダーとして売ったらヒットしたという商品です。\n
  • というわけで作者の思想通りつかわなきゃいけないことはない。\nなんでも好きな言語でやっちゃうのはむしろ一番エンジニアとして健全。\nでもCGIでうまく動かないからといって文句を言うのはお門違いですね。\n
  • さて、そろそろNodeを触ってみたくなってきたでしょうか。\n\n
  • 最後に実際のNodeの開発の流れを御覧いただきましょう。\nというわけで、\n
  • blogエンジンをこの場で作ります。\n15分で作る、どっかで聞いたような話ですね。\n\n25分\n
  • まずはインストールです。\nnodeは最新バージョンがどんどん出ますので、nvm等のバージョン管理ソフトを使って入れるのが普通です。\nまた、moduleはnpmで管理します。\n\ngoogle v8のbuildに時間がかかる為nodeのイントールはそこそこ時間がかかるため、\n料理番組にならって、ここまでは既にやっておきました。\n\n\n
  • 今日はExpressという軽量フレームワークを使います。\ninstallはnpmコマンド1行。\nこの3行を実行すればもうWebアプリが動作します。\n\n【デモ】\n動かしてみましょう。\nnode app.jsで実演\n\n無事、動いたのでブログを作って行きましょう。\n\n
  • まずは投稿機能を作ります。\n機能はシンプルに新規投稿と一覧表示のみにしましょう。\n\n
  • まずはデータベースの準備をします。\nといってもsqliteはデフォルトで入ってることが多いと思うので、\nnodeのsqliteドライバを入れるだけです。\n\nその後、app.jsにdbのopen処理を追記します。\nここではopenするだけでいいんですが、それだとたまにエラーになるのでdummyでselect文を投げています。\n
  • 次にtableを準備します。\nタイトル、本文、投稿日のみのシンプルなものです。\nここはnodeは関係なくてsqlite3コマンドの仕事ですね。\n
  • さて、ではアプリケーションを実装していきましょう。\nまずは、新規投稿のviewから。\nこんな感じのformを書きます。\n
  • 次はロジックです。\nまずは投稿画面表示。これはとてもシンプルで、\nマッピングするURLと、さっき作ったviewファイルを指定し、\ntitleを渡してrenderするだけです。\n\nここまでで投稿画面は動いているはずなので、見てみましょう。\n\n【デモ】\n$ node-dev app.js\n再起動が面倒くさいので自動でやってくれるnode-devに切り替えます。\nposts/newを開く\nお、無事動いてますね。\n\n
  • 次は投稿を受け付けるPOST処理です。\nフォームの情報をそのままinsertするだけですね。\n\n【デモ】\nこれで投稿機能が完成したので動かしてみましょう。\n特にエラーが出ていないのでたぶん投稿されていると思います。\nが、このままだと表示されないのでせっかくの投稿が台無しです。\n\nというわけで、次は一覧表示を作ります。\n
  • こちらもまずはviewから。\npostごとにsectionを作っています。\nあと新規投稿へのリンクもつけています。\n\n
  • 次はロジックです。\ndateで降順して5件だけとってきています。\n\n【デモ】\nそれでは見てみましょう。\nちゃんと一覧表示されていますね。\n\n
  • このままでは誰でも投稿で来てしまうので、認証機能を付けましょう。\nと言ってもちゃんと作ってると時間がなくなるのでbasic認証で済ませます。\nこの3行を足せばOKです。posts/以下にbasic認証がかかります。\n\n【デモ】\n確認してみましょう。\nさっきまでアクセスできていたnew postが認証を求められるようになりました。\n\n\n
  • \n
  • ここまでで最低限のブログ機能はできましたが、\n最後にautopagarizeをつけてみます。\nスクロールが最下部に行ったら次のエントリを読むやつですね。\n\nなんだかんだいってNodeと言えば、ということでRealTime Webをちょっと取り入れて、\nWebSocketでやってみます。\n\n全然双方向通信が必要なところじゃないですが、WebSocketはHTTPに比べて送受信されるデータが少ないので、Ajaxの代わりに使うのも有効です。\n\n
  • socket.ioもnpm insallでinstall可能です。\n\n\n
  • app.jsにsocket.ioのサーバサイドのコードを書きます。\nここではnextというmsgがきたら、そのoffsetのpostを1件読み取って返しています。\n\n\n
  • こちらがクライントサイドのコードです。\nイベントの設定などで、若干長くなっていますが、sokcet.ioに関するのは少しだけです。\n\nスクロールバーが最下部に行ったら、nextメッセージをサーバに送り、\nサーバからnextメッセージが帰ってきたら、\nその情報を元に、sectionを1つ追加しています。\n\n
  • コードは以上です。テストの前にデータがたくさんあった方がよいので、\nこんな感じのコードでデータを1000件挿入しておきます。\n\n【デモ】\nそれでは…\nおぉ!早いですね、逆に見づらいぐらい(笑)\n\n\n
  • 機能はあまり多くないですが、以外と簡単にできることがおわかりいただけたかなぁとおもいます。\n\n
  • が、実はもっと簡単につくれる方法があります。\nNodeにもRails風のフレームワークがあるんですね。\n\n
  • こんなコマンドだけで投稿機能ができちゃいます。\n恐ろしいですね。\n【デモ】\n\n
  • \n
  • \n
  • そして、さらに本格的にブログをしたい方は、\n是非僕の開発した、LooseLeaf.JSを是非使ってみて下さい。\nたった3行で、Daily Nodeみたいなブログが動きます。\n
  • 宣伝で終わるのもあれなので最後にまとめを。\n\n
  • Node.jsとは\nみんなにスケーラブルなNWプログラミングをできる環境を提供し、\nで、そのプログラミングはJSでできます。\nということですね。\n\n
  • ちなみに正式名称はNodeですので、\n口に出すの時はこういった方が通っぽいです。\n\n\n
  • 本日のスライドでは内部実装やAPIにあまり深く触れませんでした。\nそのあたりに興味がある方はこれらの情報を御覧ください。\n\n
  • Nodeはまだまだこれからです。\n日本の会社も使い始めてますが、個人はサンプル止まりが多く\nチャンスはまだまだあります。\n是非一緒にTop Noderを目指しましょう。\n\n以上です。\n\n
  • ご清聴ありがとうございました。\n\n

Node.js ― Hello, world! の1歩先へ。 Node.js ― Hello, world! の1歩先へ。 Presentation Transcript

  • Node.js— Hello, world! 1 mindia, Inc. / Node.js_jp — beyond the “Hello, world!”
  • About Node.js — beyond the “Hello, world!”
  • About Node.js — beyond the “Hello, world!”
  • About Node.js — beyond the “Hello, world!”
  • About Node.js — beyond the “Hello, world!”
  • About Node.js — beyond the “Hello, world!”
  • About Node.js … — beyond the “Hello, world!”
  • Today’s goal — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • WebScoketSocket.IO — beyond the “Hello, world!”
  • WebScoketSocket.IO — beyond the “Hello, world!”
  • WebScoketSocket.IO JS — beyond the “Hello, world!”
  • WebScoketWeb Socket.IO JS — beyond the “Hello, world!”
  • WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Node.JS C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Node.JS C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Node.JS C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Let’s start ! — beyond the “Hello, world!”
  • Introduction• Community• Myself — beyond the “Hello, world!”
  • Community• Node.js — beyond the “Hello, world!”
  • Activity• ML Blog••• Node — beyond the “Hello, world!”
  • 2011-10-29 — beyond the “Hello, world!”
  • Members @meso @bad_at_math “ ” “node.js ” @Jack_ @KOBA789 @koichik “Express/Socke.IO “ ”“Node ” ” 869 *2011/10/16 @tnantoka — beyond the “Hello, world!”
  • Members @meso @bad_at_math “ ” “node.js ” @Jack_ @KOBA789 @koichik “Express/Socke.IO “ ”“Node ” ” 869 *2011/10/16 @tnantoka — beyond the “Hello, world!”
  • @tnantoka• Tobioka Tatsuya - http://blog.bornneet.com/ - http://tatsuya.tobioka.net/2008.4 Mitsubishi UFJ Information Technology, Ltd. ~ 2011.7 SE OnlineBanking mindia, Inc.2011.8 ~ Rails, Node, etc. — beyond the “Hello, world!”
  • Node.js outputs• Modules - LooseLeaf.JS - connect-fs, connect-sqlite - Kanshi.js - Public.js• Articles - Node — beyond the “Hello, world!”
  • Node.js — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • • Node — beyond the “Hello, world!”
  • • Node - … — beyond the “Hello, world!”
  • • Node - …• Hello, world! — beyond the “Hello, world!”
  • • Node - …• Hello, world! - Chat…… — beyond the “Hello, world!”
  • • Node - …• Hello, world! - Chat……• Web — beyond the “Hello, world!”
  • • Node - …• Hello, world! - Chat……• Web - WebSocket……… — beyond the “Hello, world!”
  • • — beyond the “Hello, world!”
  • Node.js — beyond the “Hello, world!”
  • Node.js• — beyond the “Hello, world!”
  • Node.js• - $ java Hello — beyond the “Hello, world!”
  • Node.js• - $ java Hello - $ perl hello.pl — beyond the “Hello, world!”
  • Node.js• - $ java Hello - $ perl hello.pl - $ node hello.js — beyond the “Hello, world!”
  • Node.js• - $ java Hello - $ perl hello.pl - $ node hello.js• — beyond the “Hello, world!”
  • “ Node.js I/O JavaScript ” — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • Node.js 2“ Node.js I/O JavaScript ” — beyond the “Hello, world!”
  • Node.js 2“ Node.js I/O JavaScript ” — beyond the “Hello, world!”
  • Node.js 2“ Node.js I/O JavaScript ” — beyond the “Hello, world!”
  • 1• NW — beyond the “Hello, world!”
  • Keyword• — beyond the “Hello, world!”
  • /Apache index. html — beyond the “Hello, world!”
  • / Apacherequest index. html — beyond the “Hello, world!”
  • / Apacherequest Process/ Thread index. 1 html — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 html — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 htmlrequest — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 htmlrequest Process/ Thread 2 — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 htmlrequest Process/ Thread 2request — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 htmlrequest Process/ Thread 2request Process/ Thread 3 — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 html returnrequest Process/ Thread 2request Process/ Thread 3 — beyond the “Hello, world!”
  • / Apacherequest Process/ read Thread index. 1 html returnresponserequest Process/ Thread 2request Process/ Thread 3 — beyond the “Hello, world!”
  • Node index. html — beyond the “Hello, world!”
  • Noderequest index. html — beyond the “Hello, world!”
  • Noderequest read index. html — beyond the “Hello, world!”
  • Noderequest read index. htmlrequest — beyond the “Hello, world!”
  • Noderequest read index. htmlrequest read — beyond the “Hello, world!”
  • Noderequest read index. htmlrequest readrequest — beyond the “Hello, world!”
  • Noderequest read index. htmlrequest readrequest read — beyond the “Hello, world!”
  • Noderequest read index. html callbackrequest readrequest read — beyond the “Hello, world!”
  • Noderequest read index. html callbackresponserequest readrequest read — beyond the “Hello, world!”
  • Noderequest read index. html callbackresponserequest readrequest read I/O — beyond the “Hello, world!”
  • • C10K - ex) 2MB / proc. × 10000 http = 20 GB• - ,• Web2.0 → Real Time Web - — beyond the “Hello, world!”
  • Why Node.js• “Nodes goal is to provide an easy way to build scalable network programs. ”• NW - Node.js• - I/O… — beyond the “Hello, world!”
  • •• Node.js — beyond the “Hello, world!”
  • Node.js• “less-than-expert programmers are able to develop fast systems. ”• Expert• Node - Netty, EventMachine, AnyEvent, Twisted — beyond the “Hello, world!”
  • Node.js = ? 1• NW• — beyond the “Hello, world!”
  • ex) kanshi.js• HTTP• — beyond the “Hello, world!”
  • … http://example.com/kanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/kanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/ responsekanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/ response requestkanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/ response requestkanshi.js http://example.jp/ timeout http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/ response requestkanshi.js http://example.jp/ timeout request http://example.io/ — beyond the “Hello, world!”
  • … request http://example.com/ response requestkanshi.js http://example.jp/ timeout request http://example.io/ Internal server error — beyond the “Hello, world!”
  • http://example.com/kanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • request http://example.com/kanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • request http://example.com/ requestkanshi.js http://example.jp/ http://example.io/ — beyond the “Hello, world!”
  • request http://example.com/ requestkanshi.js http://example.jp/ request http://example.io/ — beyond the “Hello, world!”
  • request http://example.com/ response requestkanshi.js http://example.jp/ request http://example.io/ — beyond the “Hello, world!”
  • request http://example.com/ response requestkanshi.js http://example.jp/ request http://example.io/ Internal server error — beyond the “Hello, world!”
  • request http://example.com/ response requestkanshi.js http://example.jp/ timeout request http://example.io/ Internal server error — beyond the “Hello, world!”
  • 2• JavaScript — beyond the “Hello, world!”
  • Why JavaScript•• Google V8 - by Lars Bak(HotSpot VM)• “Web ” - — beyond the “Hello, world!”
  • JavaScript• ECMAScript JavaScript ActionScript browser Flash DOM(HTML/CSS) — beyond the “Hello, world!”
  • JavaScript• ECMAScript JS JavaScript ActionScript browser Flash DOM(HTML/CSS) — beyond the “Hello, world!”
  • JS • OS - NW DBCSJS <script src="node.js"></sciprt>SSJS $ node -e "console.log(hello, world);" > hello, world — beyond the “Hello, world!”
  • Why SSJS• JS -• JS - Applet × Severside Java — beyond the “Hello, world!”
  • • JS Node• Ringo.js - Java GAE• Node - — beyond the “Hello, world!”
  • +α• Ryan dahl•• Perl• — beyond the “Hello, world!”
  • Node.js = ? 2• Node JavaScript — beyond the “Hello, world!”
  • ex) Validation• - or• — beyond the “Hello, world!”
  • Node.js = ? 3• Node NW• Node JS — beyond the “Hello, world!”
  • Node.JS C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Node.js ShowCase — beyond the “Hello, world!”
  • Node knokcout 2011• 8/27 ~ 8/29• Node.js 48• Node• 178• — beyond the “Hello, world!”
  • Observer• 1• http://observer.no.de/•• — beyond the “Hello, world!”
  • Eight Bit Beats• 1• 8 http://eightbitbeats.com/ — beyond the “Hello, world!”
  • nide• 2• Web IDE•• http://coreh.github.com/nide/ — beyond the “Hello, world!”
  • Paragraph.JS• http://paragraph.looseleafjs.org/• 7 …• Wiki• — beyond the “Hello, world!”
  • • 48 178• Node.js — beyond the “Hello, world!”
  • Node = RealTime ?• …• NW• Socket.IO — beyond the “Hello, world!”
  • Socket.IO• WebSocket• Flash XHR IE5.5• Node …• Node — beyond the “Hello, world!”
  • Node CGI• 2011/9 ML• -• - — beyond the “Hello, world!”
  • blosxom.js• ^^; • 2011/5• Perl blog CGI• daemon — beyond the “Hello, world!”
  • — beyond the “Hello, world!”
  • ≠•••• — beyond the “Hello, world!”
  • Node.JS C10K WebScoketWeb Socket.IO I/O JS — beyond the “Hello, world!”
  • Node.js — beyond the “Hello, world!”
  • • 10 blog — beyond the “Hello, world!”
  • • nvm - git clone git://github.com/creationix/nvm.git ~/.nvm - echo "source ~/.nvm/nvm.sh" >> ~/.bash_profile - . ~/.bash_profile• node (with npm) - nvm install v0.4.12 - nvm alias default v0.4.12 — beyond the “Hello, world!”
  • Express•• - $ npm install express -g - $ express -s -t ejs blog - $ cd blog - $ npm install — beyond the “Hello, world!”
  • Posts• GET /posts/new POST /posts GET / — beyond the “Hello, world!”
  • node-sqlite• Node SQLite• $ npm install sqlite• app.js var db = new require(sqlite).Database(); db.open(blog.db, function(err) { if (err) throw err; db.query(SELECT * FROM posts, function(err, rows) { if (err) throw err; }); }); — beyond the “Hello, world!”
  • Table• $ sqlite3 blog.db "CREATE TABLE posts (title, body, date);" title string body string date string — beyond the “Hello, world!”
  • New post - View• views/new.ejs <h1><%= title %></h1> <form action="/posts" method="post"> <p><input type="text" name="title" /></p> <p><textarea name="body"></textarea></p> <p><input type="submit" /></p> </form> — beyond the “Hello, world!”
  • New post - Logic(1)•app.get(/posts/new, function(req, res, next) { res.render(new, { title: New post });}); — beyond the “Hello, world!”
  • New post - Logic(1)•app.post(/posts, function(req, res, next) { var sql = INSERT INTO posts VALUES (?, ?, ?); db.execute(sql, [req.body.title, req.body.body, new Date().getTime()],function(err, rows) { if (err) return next(err); res.redirect(home); });}); — beyond the “Hello, world!”
  • Index posts - view• views/index.ejs <h1><%= title %></h1> <p><a href="/posts/new">New post</a></p> <% posts.forEach(function(post) { %> <section> <h1><%= post.title %></h1> <p><%= new Date(post.date) %></p> <pre><%= post.body %></pre> </section> <% }); %> — beyond the “Hello, world!”
  • Index posts - Logic• app.jsapp.get(/, function(req, res, next){ var sql = SELECT * FROM posts ORDER BY date DESC LIMIT ? OFFSET ?; db.execute(sql, [5, 0], function(err, rows) { if (err) return next(err); res.render(index, { title: Index, posts: rows }); });}); — beyond the “Hello, world!”
  • Authentication• Basic• app.js app.all(/posts/*, express.basicAuth(function(username, password) { return username == admin && password == pass; })); — beyond the “Hello, world!”
  • • — beyond the “Hello, world!”
  • Auto pager• WebSocket — beyond the “Hello, world!”
  • Socket.IO• npm install socket.io — beyond the “Hello, world!”
  • Server Side• app.jsvar io = require(socket.io).listen(app);io.sockets.on(connection, function(socket) { socket.on(next, function(data) { var sql = SELECT * FROM posts ORDER BY date DESC LIMIT ? OFFSET ?; db.execute(sql, [1, data.offset], function(err, rows) { if (err) return console.log(err); socket.emit(next, rows[0]); }); });}); — beyond the “Hello, world!”
  • Client Side<script src="/socket.io/socket.io.js"></script><script src="/javascripts/jquery.js"></script><script src="/javascripts/bottom.js"></script><script src="/javascripts/script.js"></script>$(function() { var offset = 5; var socket = io.connect(/); socket.on(connect, function() { socket.on(next, function(post) { var section = <section><h1> + post.title + </h1><p> + new Date(post.date) + </p><pre> + post.body + </pre></section>; document.body.innerHTML += section; }); onBottom(function() { socket.emit(next, { offset: offset++ }); }); });}); — beyond the “Hello, world!”
  • Test • insert.jsvar db = new require(sqlite).Database(); var sql = INSERT INTO posts VALUESdb.open(blog.db, function(err) { (?, ?, ?); for(var i = 1; i <= 100; i++) { db.execute(sql, [title, body, new (function(i) { Date().getTime() + i * 1000], var title = Test + i; function(err, rows) { var body = [ if (err) throw err; i+ , console.log(Inserted "Test + i + "); }); , })(i); , } , , , , ].join(n);}); — beyond the “Hello, world!”
  • • — beyond the “Hello, world!”
  • • Railway• “Node on Rails”• MVC Web — beyond the “Hello, world!”
  • Posts with railway• $ npm install -g railway• $ rw i rwblog && cd rwblog• $ npm install -l• $ rw g crud post title body• $ rw s 3000• $ open http://localhost:3000/posts — beyond the “Hello, world!”
  • • LooseLeaf.JS• Node• $ npm install -g looseleaf@0.3.5• $ looseleaf blog• $ node blog/app.js• demo: http://blog.looseleafjs.org/ — beyond the “Hello, world!”
  • Conclusion — beyond the “Hello, world!”
  • Node.js•• JS — beyond the “Hello, world!”
  • “Node”• ”Node”• https://github.com/joyent/node/wiki/FAQ• Node — beyond the “Hello, world!”
  • beyond the this slide...• Node.JS by Node.js_jp (Commig Soon!)• node.js (@badatmath)• Node.JS (@forest1040)• (http://nodejs.jp/) — beyond the “Hello, world!”
  • • CA , DeNA• … •• Top Noder — beyond the “Hello, world!”
  • •• Node.js • Join us ! — beyond the “Hello, world!”