>> KEVINシュミット：みなさんこんにちは。
CS50セミナーへようこそ Node.js.上
私の名前はケビンです。
私はCS50タスクフォースだ。
そして、私は一種の本当に興奮のようだ このセミナーについて。
私はNode.jsのは非常にクールだと思います。
私はこのセミナーを使用することができることを願って のために良い、私は推測する、踏み台として
最終的なプロジェクトのいくつかの あなたが使用することに興味を持っている
Node.js.のようなもの
>> 私たちは、並べ替えのセミナーを始めるよ ほんの少しの話
背景のスケーラビリティの種類 そしてNode.jsのの観点、および
我々はいくつかのコード例に移動します。
そして、私はウェブサイトにコードがあるでしょう、 あなたはコードを見ることができます。
セミナーの後、私は話のようなものでしょう あなたはNode.jsのを設定する方法について
お使いのコンピュータ上で。
>> [OK]をクリックします。
それではを始めましょう。
だから私は、私は話をしたいと思います 本当に、最初のWebサーバー。
そしてこの議論を開始するには、私 基本的にある図を持っている
CS61に使用教科書、どの 基本的な相互作用を示しています
クライアントプロセスの間に、あなたのWeb​​のような ブラウザやお使いのAIMクライアントなど
そのようなこと、およびWebサーバー。
だから、これは種のようになります あなたが講義で見た絵
基本的に我々はいくつかを持っている水曜日 Google Chromeのようなクライアント·プロセス。
>> そして、ステップ1です クライアントが要求を送信します。
だからよくみましょうのようなものにすることができます 私は、CS50.netを知らない、アクセスしてください。
だから我々はその要求を発行します。
と誰もが名前を覚えていない どのようにそれを指定したプロトコル
要求は、構造化すべきですか？
うん。
>> 観客：[聞こえない]。
>> KEVINシュミット：その通りです。
だから、右、HTTPのようなものだ？
方法については、したがって、基本的仕様 その要求は、実際に敷設する必要があります
なぜなら、一日の終わりに、アウト、 その要求は、本当にただのようなものです
文字列、その基本的 私はこれをしたいと言います。
と仕様 そのためにHTTPです。
だから、プロトコルのようなものだ。
>> それではサーバーが受け取る その要求。
だから、あなたたちは、Webサーバがインストールされている CS50アプライアンス内。
それは、Apacheの。
そして今週は、問題に取り組むとき 7を設定すると、実際に作業になります
そのウェブ·サーバと。
そこでサーバーはその要求を受信し、 それは一種の、その傷を付けています
のようなよく何頭と言う 私はこれを行うのですか？
>> だから、それから、行うことを決定内容に基づいて、 それはいくつかの種類を連絡する必要があります
リソースの。
そのリソースは次のようになり さまざまなことがたくさん。
1の場合は、それだけかもしれない 静的なHTMLファイルのように。
だから、単にいくつかのような可能性が のためのようなものですHTMLの
あなたの個人的なウェブサイト。
なお、画像のような静的なファイルである可能性が またはあなたが持っている映画のよう。
それも、話をする可能性がある データベースのいくつかの種類に
MySQLデータベースのように。
だから、常に通信する必要がありません リソースが、中で
場合によっては、それは可能性があります。
>> だから、それが何を起こっているのか その後、それがために起こっているある
応答を返す。
これに対する応答である また、HTTPで指定された。
それでは、クライアントはそれを受け取ることができます。
それは離れてそれを引き裂き、それを処理することができます。
それから、あなたは、Webページを取得 GoogleやCS50.netなど
何でもあなたがに行ってきました。
OK？
>> だから、これは基本的な相互作用であること 我々は扱うことになるだろう。
そして、我々はかなりになるだろう のこの部分に焦点を当て
相互作用が、サーバー。
[OK]をクリックします。
涼しい。
誰もがこれまでにご質問がある？
[OK]をクリックします。
>> 我々は言ったように、Webサーバが受け取る このHTTPリクエストと、これを発行します
HTTPレスポンス。
とのような、我々は、前に約話をしました CS50アプライアンスのWebサーバは、Apacheです。
だからみんながPで作業するとき7を設定し、 あなたが働くことになるだろう
Apache Webサーバ。
あなたは本当に仕事をしなければならないことは決してないだろう あまりにも多くの直接Apacheで。
あなたは、ソートのApacheのほとんどを設定する あなたは、仮想ホストを指定した場合、または
Vホスト、そして我々は買ってあげる 少しのものと。
>> しかし、基本的には、Apache Webサーバ PHPの種類で動作するように設定
の箱から出して。
あなたが行くとき、何が本当に起こる たとえば、のようなあなたのウェブサイトの1に、
ローカル·ホスト·スラッシュのindex.phpか何か、 お使いのブラウザが送信していること
要求した後、Apacheは座っている そこに、それをどうする見つけ出し。
アクションが実行することです index.phpの中でそのコードと
再びそれを送信します。
だからがあります。
だから我々は一種のこのことについて話しました。
だから、単に静的なファイルを提供することができ または発行し、いくつかのPHPコードを実行し、
応答。
>> それでは、来ることができる一般的な質問 アップが順調で、どのように我々は本当に対処しない
複数のユーザーを持つと 同時に？
あなたがウェブを書いていたのであれば想像 サーバー、Webサーバーを持っていた場合、その
あなたが何かに書き込みをしようとしていた Cまたはそのような何かのように、
基本的にあなたが考えることができる方法がある コー​​ドのいくつかの種類することができること
その要求を受けるだろうが、 それはそれですべての作業を行う必要があります。
それは、例えば、連絡する必要があります データベースまたはそのような何か。
右？
そしてそれはようなものを行うだろう 処理した後、
レスポンスを送信しました。
だから、高いようなものだ レベルの概要。
>> どのようにしかし、それはすぐに明らかではありません それをすることができるように、2つの人々や
でも千人は、あなたと仕事ができる 同時にWebサーバ。
Apacheが使用していますので、ソリューション スレッドまたはプロセスと呼ばれています。
だから、聞いたことがあります これらの用語の前に。
それはあなたがいない場合OKですが、ちょうど考える のための方法として、スレッドやプロセスについて
オペレーティング·システムまたはユーザプログラムまたは そのようなことや、Webサーバー
ソートの倍数を実行する 一度物事。
だから、言葉を聞いたことがあるかもしれ 実行のスレッドのように。
だから、あなたがしているようなもののようなものだ マルチタスクの一種。
>> そして、あなたはあなたの箱に見てきた場合には ラップトップ、またはそのような何か、
あなたが何ができるかマルチコアは、次のことができている 別の上の2つの異なるスレッドを実行
CPUの部品は、できるように、 実際に同時に起こる。
だから、これは本当に強力です。
そして、これは、Apacheの一種である この問題を解決する。
>> とても親切のすべての問題などがある しかし、このアプローチには？
だから私は、私はちょっとそこにそれらを書いたと思います。
しかし、それらの両方の並べ替え 大量のメモリを使用しています。
これは、作成するのは非常に高価だ スレッドまたはプロセス。
>> 推論の一部はそういうことだ あなたがCプログラムを実行しているときのように
メインのような、次にその呼び出し 他の機能、すなわち有する
スタックのいくつかの種類。
だからスレッドも全く必要とし 別々のスタックした
非常に大きくすることができる。
そして、あなたが想像することができる場合のトンを持つ あなたのウェブサイト上のユーザーが、あなたが持っているだろう
異なるスレッドがたくさん。
それはしたスタックをたくさんだ 管理し、維持します。
だから、大量のメモリ消費量です。
>> そして、また、あなたが、唯一持っているとしましょう 1のCPU、または、あなたが、持っているとしましょう
あなたが持っているよりも多くのスレッド これらのマルチコア。
右？
それでは、あなたは10のスレッドを持っていたとしましょう あなたは唯一の5つのCPUを持っていた。
あなたはちょっとこの事をしなければならない場所 あなたが現在切り替える
あなたので、実行している1 一度にすべての10を実行することはできません。
そして、それはコンテキストスイッチと呼ばれています。
そして、その用語は、実際のカップルを持っている 異なるコンテキストが、ちょうどみましょう
スイッチングと考える 2スレッド間。
これはかなり高価になることができますので、 基本的に何をしなければならないことはあなたです
何をやっている停止する必要が、保存 その実行中のスレッドの状態、および
その後、どこか別の場所に切り替える。
>> だから、誰もがちょっと見ることはない なぜスレッドのモチベーションと
プロセスは少しかさばるかもしれない？
そして、あなたは疑問を持っていたのですか？
[OK]をクリックします。
涼しい。
誰か質問はありますか？
[OK]をクリックします。
>> だから我々は第二のために戻って一歩を踏み出すと、 種のようにあります
我々が作ることができ、観察 Webアプリケーションがたくさん。
そして、それは実際にそれらのものがたくさんだ 実際に多くの有用なをしない
スレッドの内部で作業。
だから、誰もが開始されました Pは全く7を設定されていますか？
だから、多分記述したいです 部品の一部？
あなたがログイン時に働いている もしくはそのようなものですか？
>> 観客：いいえ。
>> KEVINシュミット：わかりました。
気にしないで。
申し訳ありません。
しかし、基本的に、P·セットには、なら 並べ替えをたくさん作ることにしよう
いくつかを得るために、データベースへのクエリ そのデータベースからの情報。
そして、何あなたのコードが何されようとしている、 どのようなことをApacheプロセスまたは
Apacheのスレッドが何されようとしていること それは連絡することがありながら、
データベースには、それは一種のことになるだろうされている そこに座って、それはなるだろう
データベースが応答するのを待っている。
>> 今ではその大きなAのように聞こえるない可能性があります データベースが上にあるため対処
CS50アプライアンス、右？
しかし、ネットワークのいくつかの種類があります 今ウェブございますので、待ち時間
サーバーは、自身の要求を発行しなければならない と通信するためのデータベース
データベースから、そのを得る 情報バック。
だから、今では私は、よく私のために待つようなものだ から何かを取りに行くつもり
データベース、次にあります 起こって待っている多くの。
それは理にかなっていますか？
>> そして、いくつかのもののために、それは悪くはないのです。
それだけにある場合は、例えば、 ようではありません·アクセス·メモリ、
恐ろしいのI / Oの待ち時間。
私が言うときには、I / Oの待ち時間、私は今何を を参照すると様のあらゆる種類のようです
入出力。
しかし、同じように、ディスク上のファイルにアクセスするため 私は、静的なHTMLを提供したい場合
私のWebページ上にあったファイルまたは そのようなことは、私はちょっとする必要が
ビットのために停止すると、そのファイルを読む ディスクから、その後、内
そのプロセスは、私が待っています。
私は有益な仕事をしていないよ。
>> これは、すべての真実ではないですが、 Pセットなどのアプリケーションで共通している
7とアプリケーションの多く あなたがわからないこと
実際にははるかに思考をしている。
私は考えを言うとき、私は意味 計算作業などである。
だから、計算作業は、何か可能性が のように、言う、あなたがしたかった
ちょうど計算されたウェブサーバを書く n番目のフィボナッチ数。
それは特にのような音はありません 楽しいWebサーバ。
私は、そのサイトがあると期待していないような 次のフェイスブックが、それはいくつかある
計算作業の種類。
>> そしてあなたがそれを置き換えることを想像することができます 興味深いのいくつかの他の種類の
計算作業。
例えば、あなたが何かを書いていたとしましょう つまり度を算出
2人の間の分離 またはそのような何か。
だから、いくつかの種類を必要としない 計算のですよね？
そしてその時でさえ、あなたはまだ持っていることを行うには 多分待っているの多くを行うために
あなたが見て、データベースを照会する必要があります またはFriendsの方まで
そのような何か。
だから、概念のようなものがあります の計算作業。
それは理にかなっていますか？
誰もが疑問を持っていますか？
>> ああ、私はそこにチャットサーバーを置くと思います チャットサーバーはちょっとなので、
これのもう一つの良い例。
チャットサーバを持っていません 多くの思考をすることができません。
それはちょうど人々に待たなければならない ときに、メッセージを送信し、
彼らは、それらを送信ください。
OK？
>> だから、もう一度Apacheを要約すると、 そのフォークAのような同じようなウェブサーバ
スレッドとプロセスの多くはどの ちょっと無駄にすることができます。
だから私は来るかもしれない質問を推測する それから、我々は持っている必要がないことです
複数のスレッドやプロセス？
私達はちょうど1を持っていたものか？
>> それでは、この種の絵を描くましょう これがどのように見えるかの。
それでは、唯一つのスレッドを使用してみましょう。
OK？
だから1スレッドでこれを想像してみてください。
>> それでは、実際にやっていなかったとしましょう その多くの有用な - と私が言うとき
便利な、私は計算作業を意味する -
前と複数のスレッドで。
それでは、一種の統合ましょう 1スレッドにすべて。
それでは、我々は1つのスレッドが持っていた場合、その種類 ちょうどループで一周したら
常にチェックが何かをした 新しいが起こる。
したがって、たとえば、新しい何かが起こった 私は後ろから何かを持っ意味するかもしれない
送信されたデータベース、または誰か 私新しいHTTP要求。
ので、これらのイベントの一種である それは正しい、起こる？
>> そして私は何ができるかをするとき、これらの新しい ことが起こるこの同じスレッドである
の実行は、この単一のスレッドの 実行、私はいくつかのコードを呼び出すことができます
その特定のものを扱うことになる。
ですから、例えば、私は何かを持っている場合、バック データベースから、私は自分を実行することができます
その小さな計算一部が 実際にはするものを準備する
ユーザーに送り返す。
だから、メイク感覚のようなものしていますか？
>> しかし、本当に何ですか このことの意味？
右？
私たちが書いてきたので、 コー​​ド、その多くの -
と私は先にジャンプするつもりです 大丈夫かどうスライドで。
あなたが気にしないのであれば、私はちょうどよ バックステップを取るつもり。
だから、この種のものであり、 イベントループと呼ばれる。
OK？
そして、それは基本のようなものだ Node.js.の背後にある考え方
>> だから、Node.jsのは本当にウェブとして何をしているか サーバーは、単一のスレッドがあるとされ
つまり、基本的には、ループの周り起こっている 下のしばらく一種のような
絶えずだNode.jsののフード チェック、我々は新しいものを受け取りましたか？
そしてそれはハンドラが実行されます あなたが設定していること。
しかし、聞いて良い質問です、 どのように我々はこれを実現することができます
既存のものと？
>> だから私は、ここでCコードの行を置くこと それは開いているように見えます基本的に
ファイルは、右？
私は、彼女はちょうどアルバムで出てきた。
だから私は彼女に新しいファイルを開く必要がありました。
操作するためのCコードだから道 -
と私は、ファイルを選んだ理由だったと思います これは、エクステントの一種であるため、
我々はC言語でやったのI / O作業の 入出力があることを意味。
だから我々は、このコードを呼び出す このFは開きません。
して、私たちの次の行に このプログラムは、我々は今、Fで作業することができます。
>> だから、これは何かの例になります つまり、同期またはようなものだ
そのため最初の行にブロックする そこに我々は我々を待っている
開いているファイルを取得します。
第2ラインでは、我々は知っている私たち Fで動作しますが、これはことを意味することができます
その二行目は、実際に実行することはできません 最初の行まで実行されます。
それは理にかなっていますか？
>> だから、これは置くことが悪いだろう イベントハンドラで。
そしてその理由は、ということです 待機このような、右か？
だから、これは私たちを戻すだろう 同じものを。
そして今、私たちも持っていません 複数のスレッドの利益や
プロセスは、我々は得たので Node.js.中1のスレッド
それは誰にも意味がありません？
>> 観客：待ってください。
だから、交換は何ですか？
>> KEVINシュミット：ああ、そうです。
だから私はに行くつもりです 交換。
[OK]をクリックします。
だから我々が何かを持っていたものかどう つまり、このように見えた？
それでは、私が編集した、今の場合 Fが少し開いて？
だから私は、同じで渡している 前と2の引数。
私はまだ新しい曲を愛して 彼女が出てきたこと。
しかし、私はその第三のものを渡している この変数は、コードと呼ばれています。
>> しかし、コードは実際には何 この文脈で？
それは、通常のC変数のようなものです？
まさに、機能ですか？
そして、それは少し奇妙な理由かもしれ 私は実際に今渡すようだ
別の関数への関数。
>> このことについて注意するので、カップルのこと。
一、私は実際に呼び出していないよ コー​​ド関数。
だからとコードが表示されない 左括弧、右括弧。
私は、単にコードに渡している。
およびC言語で、これは実際に何をしますか 私にその実際へのポインタを与えている
コー​​ド、および、これはそれを実行することができます。
あなたがしているように、ちょうどそれについて考える ときに実行するコードを渡す
そのファイルが開かれます。
>> しかし、これが意味することになりましたということです 何ができる私のプログラムの他の部分
他のものは、他のをやって続けることができます スタッフたちは、本当に待ってではなく、一方
ちょうど私たちの頭の後ろに持っている ときに、ファイルのオープン、実行することを
一番上にあるコード。
それは理にかなっていますか？
>> そして今、Node.jsの背後にある考え方は、ということです Fと関係のもののコード
一部はかなり短く、簡単でなければならない 本当にも簡単ではない
非常に計算集約。
これは、別のファイルを開く必要があるが、可能性 それもかなり速いであるべき
それだけで、別の女を行うと言う必要があるため 開き、この他のコードを呼び出します。
>> だから、Fは完全に明確にする 新しいケイティペリーの曲をないことにオープン
DONE MP3、それはかなりになるだろう 多くはすぐに戻る。
そして、我々はちょうどやって続けることができます すべてのことになりましたFなぜなら他のもの
OPEN呼び出しは基本的に教えているん 基本となるFオープンコードでは、このファイルを開く
あなたは、これを開いて終了したら あなたはそれを取り戻すときにファイルや、
そのコードを実行します。
しかし、それは実際にそのコードを実行されません。
そして、あなたは疑問を持っていた？
>> 読者：あなたが数を意味するように見えた 計算上の追加の時間
休憩の集中的なコードの並べ替え [聞こえない]駆動システム。
[聞こえない]？
>> KEVINシュミット：それは素晴らしい質問ですね。
だから私は、実際には方法の例を持っている あなたは計算を統合できる
少しの集中コード。
だから我々は、コード例に到達したとき、 私はその1を引くしてくださいよ。
それは大丈夫でしょうか？
ありがとう。
>> あなたの名前は何でしたか？
>> 観客：アーロン。
>> KEVINシュミット：アーロンは非常にが表示されます もし私が持っていたということです良い点、
いくつかの計算集約的なコード F部、残りのものを行う
私のプログラムを実行することはできませんし、聞くことができない すべてまで、新しい要求や何のための
その原料を終了する。
だから私は、一般的にノードのコードを記述している場合 私は行くよように、我々は何かをしない限り、
私達が見ると、後で提案する コー​​ド例は、私がいることを確認する必要が
私のコードは提携しません このイベントループ。
それは理にかなっていますか？
[OK]をクリックします。
涼しい。
>> だから、Node.jsのは、このフレームワークを提供していること あなたはこれらのイベント駆動型を構築することができます
を搭載したサーバー。
だから、非同期のこれらの種類を持っている 一方で、I / Oライブラリ、ノンブロッキング
我々はしてきた標準Cライブラリ 、での作業だけであれば同じよう
我々がしたのと同じ方法でそれらを使用する Fでそれらを使用してして開き、
もの、それらをブロックしているため、 あなたが実際を待たなければならない
開くために、そのファイル。
>> しかし、Node.jsのはあなたにそれを与え、それ 基本的にはGoogleのV8エンジンに結びつける
その理由であるのJavaScriptエンジン Chromeは、処理に非常に高速であること
それのためのJavaScript このV8エンジンを持っています。
だから私はそれがそれらのいずれかのように音を知っている WWDC開発者会議の事
彼らはただの束を投げる場所 プロセッサ用の文字番号の事
これはとてもクールだと言う。
しかし、それは彼らがしたことをクールだ このためのJavaScript -
または多分あなたは精通していないのであれば JavaScriptをまだ我々は持っていなかったので、
それに関する講義 -
しかし、JavaScriptは解釈されます 言語。
>> そして、これはあまりにも重要なポイントです。
だから、私たちのウェブのために重要です サーバーには、右、高速に動作するように？
そして、我々は単にJavaScriptを実行している場合 と解釈されたコードだけ
古いインタプリタは、それが遅くなる場合があります。
これを持っていることから、ノードのメリット 超高速のV8インタプリタ。
彼らはそれを命名した場合、私は知らない なぜなら、額にあるV型8気筒平手打ち
物ですが、OK。
>> だから私は、いくつかの例を用意しました 次のURLで。
セミナー終了後、私は一種のつもりだ あなたはノードセットを取得する方法について話
アップ、しかし今のところ、私はちょうど並べ替えたい いくつかのコード例の中を歩くように。
だから、一緒にフォローしたい場合は、すべての ソースコードが存在可能です。
OK？
>> だから私は、次のURLを残しておきます 少しは最大。
そして私はちょうどに行くよ 端子に切り替えます。
誰もがこのURLで良いですか？
だから私は切り替えるつもりです ここに私の端子に接続されている。
>> そこでここではそのコードです 私は今日のために持っている。
我々は始まらない理由 simpler.jsファイル？
他の事はある、このすべて コー​​ドは、で書かれようとしている
JavaScriptをあなたはどちらたり、 に精通していない場合があります。
私はカップルのことは、そのたくさんあると思います JavaScriptコードの一種である
構文と構造が非常によく似ている C、など、種のそれを拾うことができますので、
あなたが一緒に行く。
私はたくさんの書き込みを試みた の方法でこのコードを開始
それはだように、Cと同様 もう少し読みやすい。
しかし、我々が進むにつれて、私ができるでしょう 追加のいくつかを実証
JavaScriptを特徴という ちょっとクールです。
>> しかし、ここでは、このサンプル·プログラムを見てみましょう。
私はすべてがそこにカットオフだと思う。
私はちょうどその本当のを修正するつもりだ 速い大丈夫かどう。
私はこれが何を起こっているのか分からない。
少し良くあることですか？
あなたはVARやものを見ることができますか？
[OK]をクリックします。
>> だから、最初の行では、JavaScriptのようなものです 変数のバージョン
宣言。
だからこれが何だろう強調表示します だから、これはただのようなものですCのように見える
私は、インデックスが3に等しいと言って またはそのような何か。
だから私は、型を指定しませんでした。
JavaScriptは型がありませんが、だ 非常にダイナミックに自然の中で入力したので、
その上に型のいずれかの種類を提供していませんでした。
だから、それだけで、varを持っています。
すなわち、可変のようなものだ。
OK？
>> そして、私は、この変数はHTTPを呼んでいる。
そして、私の右側に、私が持っている 私は、HTTPに入れたい式。
そして、これは、HTTPを必要とすると言います。
だから、これはちょっと似て含ませることである。
それはもう少しのような強力な以上だ 含める意味に含める
単にヘッダをコピーして貼り付けるだろう 関数プロトタイプのためのファイルまたは
型定義と何でも。
しかし、必要とするが、実際に起こっている 私たちにコードを取得する。
>> だから、と考えることができます いくつかのコードをインポートする。
だから、どこかでNode.jsのモジュール システムまたは何、彼らはこのすべてを持っている
HTTPサーバーのコードは、私はちょうどよ 私自身のためにそれを取得
このプログラムでは個人的な使用。
OK？
>> だから、私はこの機能を持っている 私が書いたことを。
予告私が指定する必要はありませんでした 戻り値の型またはタイプ
引数再び。
だから、ちょっと緩いに入力した 感覚のようなもの。
それは中のかかる二つの引数、 リクエストとレスポンス。
だから、概念的種のようなものだ 我々が持っていた絵でおなじみ
画面上の理由の前に 私たちは、この要求を取得する
利用者から持っている。
そして、我々は、その応答を持っている 我々はに物事を書くことができます。
>> だから、これの最初の行にはない 200をres.writeHeadしてから、この
コンテンツタイプtext平野。
それでは、少しこれを離​​れてつなぎましょう。
それでは、ただres.writeに焦点を当ててみましょう 少しのため。
だから書き込みは、基本的には、ヘッドを書く 並べ替え書き出すだけの方法があります
応答に物事。
OK？
誰もが覚えているのであれば、ヘッドを書く HTTPの講義から、君たちを行う
のヘッダを覚えている HTTPの事の上？
では、なぜ私はデモはありません 実際に素早くヘッダ。
それが参考になる？
それとも一種の私たち必要があります -
[OK]をクリックします。
かしこまりました。
>> だからあなたのブラウザがgoogle.comになると またはそのような何か、
実際にはほとんどそれだけではありません -
これは秘密のようです -
もう少し情報のようにあります それは単なるパイプを通ってくる
ちょっと検索してすべてのもの。
だから、あなたにこれを示すために、私は行くよ カールと呼ばれるプログラムを使用します。
OK？
だから、これはあなたが実行することができるものです お使いのMac OSXのコマンドラインまたは中
アプライアンスまたは何でも。
だから、私はカールない場合は、HTTP google.com、 私は、HTMLを見に行くよ。
これは、公正さに、あるだけ 並べ替えの方法を説明しますHTMLの
お使いのブラウザがない場合は、WWWにリダイレクト 自動的に処理
リダイレクション。
>> だから、これは単なるHTMLですが、私は行くよ このハイフンIフラグカールに追加するには。
OK？
これはショーになるだろう 私のヘッダー。
だから、これはまた、付属の情報です を通じて、私は、この応答を取得するとき。
OK？
>> だから上部には、これを参照してください HTTP 301は恒久的に移動します。
そしてこれは、重要なの一種である これはステータスコードを指す。
だからここに301は、ステータスコードです 基本的には整数である
つまり、ブラウザまたは誰だと伝えます あなたがそのふりをした場合、これを読んで
ブラウザだとあなたはこれを見ている、 基本的にはこれで、見れば
ことと、301を参照してください、あなたは私が持っている知っている に基づいて特別な何かをする
301、または起きた特別なもの 301に基づく。
だから、永久に移動述べています。
>> そして、基本的に、我々は持っている キーと値のペアの束。
だから我々は場所を取得 www.google.comである。
して、種類のすべてのこの他のもの、 しかし基本的には、どのような場所がある
ことわざは、新しい場所で www.google.comである。
だから今は、google.comに行けば、あなたはよ 並べ替えの点滅のブラウザの種類を参照してください。
秒してからリダイレクト 右後ろwww.google.comへ。
だから、応答は含めることができます これらのヘッダ。
>> 物事のカップルは指摘すること。
それでは、私たちが実際に成功したとしましょう Webページを訪問中。
だから私はへ行こう -
良いウェブサイトは何ですか？
私は良いの思考が苦手だ その場でのウェブサイト。
>> 観客：ウィキペディア。
>> KEVINシュミット：わかりました。
のウィキペディアをやってみましょう。
だからここに私は感動しました。
いや待て。
私はでしたか？
はい、私でした。
[OK]をクリックします。
だから私は、WWWを行うようになった。
だから私は、WWWをするつもりです。
ご覧のように、ここではすべてのHTMLです ブラウザが処理するだろうと
ウィキペディアのために。
>> しかし、私はここにスクロールし続ける場合には、 私が一番上に何が表示されます -
うわー、たくさんあり​​ます ウィキペディア上のHTML -
しかし、私がここで一番上に見ることができることです。 に関して反対この200ステータスコード
私は前に見た301。
そして、それは素敵なを持っていることに気付く その横にやさしい[OK]をクリックします。
だから、これは正常なステータスコードのようなものです。
>> その200番号は、見覚えのでしょうか？
はい、私はsimpler.jsをしたときなので、 私はそこに200を書いた。
だから、基本的に教えて言っている ブラウザや誰に取得しようとしている
彼らが成功したことを、この。
など、私たちのようなもの あまりにも成功した。
>> そして特別な構文、この種があります JavaScriptで宣言するための
コンテンツタイプのように、これらのキーのマップ とテキスト、プレーンのような、これらの値。
ですから、私たちという応答を見れば 前バックウィキペディアからだ -
私は、スクロールしようするつもりだ 少し速くアップ -
あなたはサーバのようにこれらのキーを持っている これらの値は、Apache。
だから、キーと値を持っている。
そして、あなたはこれを指定することができます 返信するどのノード。
>> これは、一部では、実際に種類のものである 方法、およびいくつかの点でそうではありません
本当に、それは少し低いレベルだ あなたは可能性がありますPHPコードより
Pに対する書き込みは7を設定しているので、PHPと Apacheは、ソートのいくつかの世話をする
あなたのためにこれらの事。
PHPでは、デフォルトを上書きすることができます 独自のヘッダを書き込むことで行動。
しかし、この目的のために、我々は、取得 私たち自身のヘッダを書き出す。
>> だから、その行はしても意味がありません 誰もが、書き込みヘッドライン？
[OK]をクリックします。
素晴らしい。
>> それでは私は何をすることは、私が応答を終了です ハローワールドと言って。
[OK]をクリックします。
しかし、それは単に関数の リクエストハンドラと呼ばれる。
だから今私は実際にちょっとしなければならない この機能を使用して何か、右か？
>> だからここに私は何をすべきか、これは存在している VARサーバ等号を行い、ライン
HTTP.createサーバー、そして私 要求ハンドラに渡す。
だから、これは、ノードの一種である サーバーを作成する方法。
そして、私は渡していることに気付く リクエストハンドラ内。
だから、これはcreateServerを語っている 私はあなたが私にしたい機能
サーバー、およびときに、サーバーが受信する 応答、私はあなたがこれを呼び出す必要があります
リクエストハンドラ関数。
OK？
>> だから、そのラインはかなり すぐに終了します。
だから、VARサーバラインが正しく行われている あなたはかなりそれをした後。
私が意味する、それはいくつかの内部を設定する必要があります あなたがしなければならないことを知っている状態
その要求ハンドラ関数を呼び出しますが、 それはそこに座ってするつもりはないし、
送信されたユーザーを持っていると言う 私、まだ要求？
ユーザーがまだ私に要求を送信した？
だから、ブロックしません。
OK？
>> だから、これが何を行いますと、それは基本的に 今、このコードへのポインタを格納し、
この要求ハンドラ関数、次いで そのコードを実行するタイミングを誰か
要求を行う。
そして、我々はserver.listenを行う。
>> 1337はかなり任意であります。
私は特別な理由がなかった その番号を選ぶため。
それは完全にランダムだった。
しかし、それは単にポートを指定します。
あなたは彼らのがわかりますので、ほとんどのWebサーバ それは親切なので、ポート80を使用
の慣習のような。
だから、私のようなものに行けば、 私は知らない、Wikipedia.org、
と私は、コロン8を入れて -
すごいああ、あなたはそれを見ることはできません。
ごめんなさい。
しかし、私はウィキペディアを行う場合 -
私はちょうどそのようにそれをここに書きます それはカメラのは明らかだ。
しかし、私は使用してブラウザにこれを取れば 指定コロン80は、に行く
ポート80でWikipedia.org。
だから、アメリカが持っているかのようなものだ あなたが出荷できる場所のような複数のポート
一種の名所。
だから、この特定に行くようなものだ このサーバー上に置きます。
[OK]をクリックします。
>> だから、僕は1337を選びました。
番号の全範囲があります あなたが選ぶことができます。
それは完全に特別なものではありませんでした。
>> しかし、私が今やろうとしているもの 私は、ノードを実行するつもりです。
私が実際に入力させることのカップル あなたがそれを見ることができるようにダウンライン。
私は、ノードをするつもりだ、と私はよ simpler.jsを実行するつもり。
そして、我々は取得する方法について話します ノードは、少しで設定。
しかし、今、それだけでサーバーを実行している。
>> だから一つのこと、我々は試すことができているではないかもしれない 刺激的な、我々が実際にできているということ
カールでアクセスしてみてください。
だから私はカールをし、私のことができます マシンはローカルホストです。
また、これが書かれた表示されます 時々、このような。
ローカルホストと127.0.0.1は親切です あなたの自宅のコンピュータのように。
だから、と話のようなものだ 自分のコンピュータ。
[OK]をクリックします。
>> そして私は1337年を言うことができます。
だから私は、このコード行を実行すると、 それは世界こんにちは言う。
そして、私はその原料を見たいと思った場合に プレーンテキストのコンテンツタイプを持っていたか、
何でも、私もここにこれを置くことができます。
そして、それがOKと言っていますことに注意してください。
そして、私は、テキスト、プレーンを持っている。
して、このすべての他の種類があります ノードの中に追加されますもの
そこに私のために。
それは、超重要ではありません。
>> 私が意味する、技術のいくつかの種類があります やさしい時の側面
について話をするが、ちょうど示すことクールなの あなたは、私も力を持っている
これらの周りを変更。
だから私はちょうど束を追加することができます そのようなものの。
[今すぐに、私は私を見ると 出力は、そのなります。
したがって、これらのヘッダーは、特定のものを意味する ブラウザやそのようなことに。
>> およびヘッダーは基本的にブラウザに指示することができます 何かに応答する方法。
あなたは今までのクッキーのことを聞いてしまった場合、 またはあなたがイライラしてきた場合には
クッキーを設定するWebページによって、 またはクッキーブロックになっているか
そのような何か。
あなたが実際にクッキーを設定することができます これらのヘッダにある。
そこで、彼らはどのようにブラウザに指示 いくつかのケースで行動。
[OK]をクリックします。
>> だからsimpler.jsた。
誰もが疑問を持っていますか そのソースコードファイルに？
[OK]をクリックします。
涼しい。
>> それでは、それとRを削除してみましょう そしてsimple.jsを見てください。
だから、これはかなりある 同じプログラム。
私はほんの少し違ったそれを書いた 私はハイライトのようなものしたかったので、
JavaScriptの機能の一部。
>> だから要求ハンドラに気付く 機能は完全に姿を消しました。
うんああ、あなたは疑問を持っていたのですか？
>> 観客：ええ、引数 それに渡される
機能、彼らは何ですか？
>> KEVINシュミット：だからものがある JavaScriptのオブジェクト。
Node.jsのドキュメントでは、 基本的な方法が何であるかを述べています
それらに利用できる。
私達はちょうどへのアクセス権を持って起こる 書き込みヘッドとエンドと呼ばれるこの方法
そのようなもの。
しかし、全体の束があります 複数のメソッド。
>> 例えば、そのうちの一つのような RECの特定には、行うことができます
その意志rec.methodのようなもの それはHTTP GETまたはだかどうかを教えてくれ
HTTP POST要求と そのようなこと。
だから、異なるのすべての種類があります プロパティが、彼らは両方だ
JavaScriptのオブジェクト、および彼らは持っている それらに接続されている機能は、あなたという
に物事を書くことができます。
OK？
>> だから要求ハンドラに気付く 完全になくなっています。
しかし、私は要求の中で持っていたコード ハンドラがまだそこにある。
私はまだこのres.writeHeadを持っている と私はまだこのres.endを持っている。
そして、これは中の例何ですか JavaScriptは、この考えです
無名関数。
と匿名フィッティング名前のようです それのためのそれは文字通りしないため、
名前を持っている。
何の機能要求はありません そこでのハンドラ。
>> 名前がないが、それでも 引数を取っている。
だから私は今でもRECとRESた。
と私はまだコードがあります。
これはまったく問題あり JavaScriptのコード。
だから私はせずに関数を宣言することができます 明示的に名前を与える。
最初は少し混乱だ。
いくつかのような便利なものがあります あなたが使ってできること
これらの匿名関数。
誰もがこの上の任意の質問がありますか、 またはそれは、ちょうど今のところ、までOK
並べ替えだけであること、それを受け入れる 同じことをしますか？
うん？
>> 観客：関数が最初に JavaScriptでクラス？
>> KEVINシュミット：彼らは最初である JavaScriptでクラス。
そして、ちょうどこれらの概念のことを知っている のような無名関数を渡す
これはJavaScriptに適用されます あなたの最終的なプロジェクトで書くこと
あまりにもWebブラウザ。
したがって、たとえば、JavaScriptで中 お使いのブラウザが、それはまた、ややイベントの
ある意味で駆動することが何をよ 持っているユーザーがこれをクリックしたときです。
ボタンを押すと、私はこのコードを実行したい。
>> だから、のアイデアと同じようなものだ クライアント側のマウスクリックや、それらとき
あなたにいくつかの画像の上にマウス Webページは、このコードを実行する。
つまり、サーバに適用することができます。
だから、ちょっと刺激的なものだ JavaScriptが本当に理由
適切なまたは一部の人々はそれがだと思う この種のに適した言語
あなたが持っているため、イベント·ドライバ·サーバー これらの匿名関数。
あなたは全体のアイデアを持っている この非同期コード。
[OK]をクリックします。
誰か質問はありますか？
>> [OK]をクリックします。
だからsimple.jsた。
それでは、もう一つを見てみましょう 以上のカップル。
だから、これはsleep.jsです。
そう精通して誰もがある C関数の睡眠？
以前の講義の多分1から もしくはそのようなものですか？
>> そこで、基本的に私は考えて渡すことができます 秒数またはUを使用している場合
ミリ秒数を寝る またはナノ秒。
基本的にプログラムは単に停止します その時間に立候補。
右？
そしてそれは最終的に目を覚ますとなります それは単に実行を継続します
プログラム。
>> したがって、このサーバーは、並べ替えの与え 睡眠の印象。
だから我々は同じを持っていることに気付く ヘッダとして200をres.writeHead
前が、その後我々はこれを呼んでいる 機能が設定されたタイムアウトと呼ばれる。
設定されたタイムアウトは、以下でも入手可能 ウェブブラウザGoogle Chromeの
またはSafariや何でも。
そして基本的にはここでやっているのか それは関数で取っています。
通知は、再び、それはだ 無名関数。
我々はしているので、だからそれはちょっとクールだ 内無名関数を使用して、
無名関数これ 少し奇妙なことができます。
>> しかし、それはある、その機能を取っている この方法と - 基本的に言って
作品は、私が欲しい、5000ミリ秒である あなたは、その機能を実行するためにどの
ただちょっと反応が終了し、書き込みます。
だから、これはのような印象を与えます 眠ったが、実際にはこの方法
作品は、私たちが通るよです 非常に迅速にこの行。
我々だけで何かを書いている。
そして、我々はまた、を介して実行します 非常に迅速にこの行。
だから我々は、実際につもりはない 5秒待つ。
我々だけで実行するつもり 瞬時にこのコード。
>> そして、再び、この小さなあります 今この事を持ってイベントループ
基本的にはあるレジスタ 常にサークルの中を行く
単一の時計を見て スレッドと言って、5秒を持っている
まだ合格？
そしてそれは、第2を見たとき 手は5秒以上のように移動した
何でも、それは、目を覚ますと言う ああ、私は何をしなければならないのですか？
ああ、私はこのコードを実行する必要があります。
そして、それはなるだろう ちょっとres.end実行します。
>> だからもう一度、私たちはここで待っていることはありませんしている。
だから、内部に、このコードではありません この関数は、5を取るために起こっている
実行するには秒。
このコードはかなり実行されます 瞬時に、少なくともに対する相対
我々は話していた5秒 約先に前に。
>> だから、この動作を表示する 私はNode.sleep.jsを行うことができます。
そして何かを私混乱をやった？
おそらく。
申し訳ありません。
のは、我々はこの問題を解決するために何ができるか見てみましょう。
[OK]をクリックします。
だから、間違いなくNode.js.を使用
私は冗談だ。
[OK]をクリックします。
ちょうど1秒。
[OK]をクリックします。
私はそれが何であるかを知っています。
>> だから、問題は、私の他のタブにあるということです ここで、私はすでにノードを実行していた
その同じアドレス、1337。
我々は見てみると、これは、投げたように、エラー それを現実の密接内のアドレスである
、EADDRINUSEを使用しています。
だから私はすでにここに1337を使用していた。
私は今、このを遮断し、もしそうであれば すべて、うまくいけば、これを実行しよう
罰金になります。
[OK]をクリックします。
だから、一つだけの並べ替えを持つことができます 一度ポートをリッスンしている。
別の解決策は、私のためだっただろう ちょうどそのプログラムを編集して作る
それは1338年か何かのように そのような。
>> しかし、今の睡眠が実行されています。
それでは、実際にそれを試してみましょう ブラウザー今回それはだから
参照するには少しありきたり それ端末。
だから、僕はそれに行くつもりです 1337で再び127アドレス。
そして、あなたがそれを見ることができれば -
私は、あなたができるかどうか知りません - しかし、私の ブラウザは非常に、非常に長いを取っている
または5秒のようにロードするための時間。
>> 次いでその後、最終的に 応答を終えた。
そして、あなたはそれを見ることができないため、事 私が作る場合は、少し上を移動しているが、
これは少し小さく、あなた それはちょっと言い見ることができます。
だから私はちょっとを得たが、 5秒後。
そして、それは見て少しきれいになるかもしれません ここで、端末上で、私はよ
やろうとして -
それでは、ここでやらせる -
それでは、そのアドレスカールやらせる 再び1337年に。
と私はちょっと座っている ここに5秒間。
しかし、注意してください、そのサーバー 新しい応答を受け入れることができます。
だから、ちょっと印刷します。
>> 基本的に、このデモには何 私はこの他のタブで行うことができます -
それでは、私は別のタブでこれを行うとしましょう​​、 私はカールと同じことをするつもりだ
事もう一度。
そして、私はこれらをキックしようとするつもりだ 同時にみんなオフ。
だから私は、これを行うつもりだ、と私はよ こっちにレースに行くと私は今
再びそれをするつもり。
>> となるように、あなたのは、それを作ってみよう それらの両方を見ることができます。
ちょっと印刷し、その1、その1 印刷されたちょっと奥に -
それではもう一度実験をやらせる。
実際に、のは、これを使ってみましょう それがOKなら、トリック。
>> だから私は、そのシェルのものを使用するつもり 私は基本的に2つのコピーを実行することができます
並行してこのプログラムの。
だから、最初のプログラムを実行します 並行して第二のプログラム。
私はEnterキーを押すのであれば、今、それが起こっている その要求はかなり作る
瞬時に同時に。
それでは、この打撃を与えてみましょう。
>> だから、今では2つのプロセスが言うに気づく。
そして、あなたが興味があれば、その27,000 番号は、基本的にはプロセスIDです。
そして彼らは、印刷、気づく ちょっと同時に。
それは我々が5を待たなければならなかったようではありませんでした その後1、その後秒、
5秒後に第二を得る。
だから、ある意味で、一種のだが、それはだ 本当に証拠が、それはだではない
それだけではないことを直感的な証拠 5秒待ってブロックするような
スレッド全体。
クール[OK]をクリックします。
>> だから、アーロンは、以前の質問をし、その だった、よく私たちが何かをしない場合 -
うん？
>> 観客：待ってください。
どのようにされているものとは異なる printfのバッファは、しかし？
それは自動的にそれをしないのですか？
なぜ我々はそれを心配する必要はありますか？
>> KEVINシュミット：ああ、あなたでし 1より多くの時間と言う？
>> 読者：printfのバッファを好きではない まったく同じことをする？
>> KEVINシュミット：printfのバッファ？
>> 観客：うん。
[OK]をクリックします。
彼らがいたクイズの1ではありませんでした どのようにしている場合、右のprintfの話
何かして、それが1を一時停止している 第二に、そして、あなたはそれを持ってループ10
時間、それは10秒待ってからだろう その後、一緒にすべてをprintfの？
>> KEVINシュミット：ああ、[OK]をクリックします。
>> 観客：それは同じことをやっている 事は、この場合の？
>> KEVINシュミット：そこで質問だった 基本的には旧クイズのいずれかで
か何か、その質問がありました 基本的には、印刷F 10を言うなら
その後、当時のものとはのように眠っていた それらをプリントアウトするプロセス、
何らかの理由で終了時に、それはでしょう ただ画面上で、それらのすべてをダンプ。
だから、異なる2のようなものがあります ここのコンセプト。
>> だから私は一つのことは、この中で、ということですね 場合、我々は、異なる2を扱っている
サーバを尋ねる人々のようなもの 同時に事のため。
やprintfのような理由 そのように待機し、それをすべてをダンプします
一度にさらに関連している どのようにprintf関数のようなもの -
その方法のprintfは実際にある 実装は、それは基本的にしなければならないです
書き込むには、オペレーティングシステムに話す コンソールにその原料。
だから、すべてのことをしたくない あなたはprintfの言うもの、すぐに
いくつかの文字列それは可能性があるため、 それがなければならない場合高価得る
毎回それをする。
>> あなたが行うのであれば、ちょっとあなたのプログラムをprintfの 実際に印刷されない場合があります
すぐにコンソールに。
これは、[OK]を、私はそれを書いた、と言うかもしれない。
して、種類のあなたが与えるのを待つ 実際に前にもう少し、それ
それをコンソールに書き出す。
>> それがそうであったように、その理由 -
それは一種の、無関係だ 睡眠へ -
睡眠はソートだけだったということです 証明するためにそこに注入
それは書いていないという事実 同期的。
しかし、その理由はただです パフォーマンスあなたがする必要がないように
多くの接点がすることを確認する オペレーティングシステム。
>> しかし、ここで、私たちは本当にやろうとしている このスリープ事は単なるショーであると
我々が訪れて2人を持っているとき このウェブサイトは、置くことはないだろう
それは言うために起こっているラインでそれら 私はあなたを助けるために持っているし、私はいる時
完全にこれらの後にあなたを助ける終え 5秒後、私はするつもりだ
次の人の上に移動。
だから、最初の人の要求はしません そのイベントループを拘束
それは理にかなっている場合。
>> しかし、ここで実際に例を示します ネクタイ何かの
イベントループまで。
だからここに恐ろしい機能です n番目のフィボナッチを計算します。
これは文字通り、あなたができるより悪い方法だ n番目のフィボナッチ数を計算する。
そして、これは単に確認する実際にある これはどこから来たのか、
実際にあります -
私が意味する、あなたはそれを探しに行くことを試みることができます - しかし、 非常に長いブログのようにあります
誰かが書いたことを投稿してください。
それはそれらの表示するのものの一つのようなものだ。
しかし、誰かがNode.jsのを批判して、 彼らは一例として、これを使用しました。
だから私はちょっとだけ2見せたかった ちょうど得るためにさまざまな視点
概念の一般的な理解 これら二つのことの背後にある。
>> しかし、これは、ちょうど恐ろしいとして選択される 恐ろしく非効率的な計算が
計算する集約的な方法 n番目のフィボナッチ数。
だからサイドノートとして、なぜ それは恐ろしい1の方法で、気に入りましたか？
うん？
>> 読者：あなたが始めると言う 千と出。
千は999と998に分割されます。
これはそれぞれ、二つに分割されます。
>> KEVINシュミット：右。
>> 観客：全押し。
>> KEVINシュミット：その通りです。
もしそうであればただ、カメラのために繰り返す私 千か何かのようにFIB呼び出す
そのように、それは明らかに満たないではありません または1に等しいので、私はするつもりだ
この他のケースに移動し、私は行くよ 999をFIBプラス998をFIB呼び出します。
して、ほとんどすべてのこと 999が行うFIB作品です
このレベルでの一種。
あなたがダウンした場合、それはさらに、冗長だ それよりも、しかし、もしあなただけの
コンピューティングFIB 998が取得すると思います 私たちは、非常に近い999をFIBする。
だから我々は、本当にもう少しでなければなりません 我々はこの種の再利用方法については賢い
これらが、我々は再利用していない すべてのこれらの事。
だから、これは巨大な想像することができます ただ恐ろしい巨大な木。
>> しかし、いずれにせよ、[OK]をクリックします。
だから、FIBた。
それだけで実行に時間がかかります。
うん？
>> 観客：[聞こえない]。
>> KEVINシュミット：ああ、あなたでし 質問を繰り返す？
>> 観客：[聞こえない]。
>> KEVINシュミット：ああそう、これは単なるコードです それは一種の上になるだろう
サーバ側。
だから、これは発見されようとしていません ブラウザや何でも。
それは、私たちが持っていることは、基本的だとするとき ここでユーザーは、ほとんどのmake
再び彼らの要求、ときに我々が並べ替え 要求を行う、私たちはコールするつもりだ
サーバ側でこの機能。
そして、我々は結果が返されます その関数を呼び出すから。
そして、我々はちょうど印刷されます ユーザーに。
したがって、ユーザーは実際に扱っていない あまりこの機能を備えた。
>> それが問題だった？
それは理にかなっていますか？
[OK]をクリックします。
涼しい。
>> だからもう一度、私たちは、この全体のres.writeHeadを行う 我々はプリントアウトしたもの
ヘッダー。
そして私は実行して、応答を終了 マジックナンバーはFIB 45です。
それでは、ちょうどこのサーバを実行してみましょう。
だから私は、ノードfib.js.をするつもりです
だから今、私のFIBサーバが実行されています。
>> そして、ここに、私は行くよ これらのいずれかの操作を行います。
OK？
だから、僕は、カールを言おうとしています。
だから、少し時間がかかりそうだが、 うまくいけばすぐに終了しますと
それはその第45回出力します フィボナッチ数。
>> 観客：[聞こえない]。
>> KEVINシュミット：それが必要 もうすぐ成し遂げる。
だから、五から六秒かかります。
私はただ、V8という超だかわからない 速いが、いずれの場合にも、これは
意図的に、非常に簡単な例と 非自明の洗練されてない
計算。
だからしばらくすると、これを取得しない。
>> しかし、今、私は何をすれば、同じ種類の 私が作る場所前と実験
同時に2つの要求は？
だからここに私はカール上に行くよ そのアドレス、私は行くよ
別のカールをすることができません。
我々はこれをしたときには、覚えている 我々は基本的にそれを持っていた睡眠サーバー、
5秒後に、彼らはかなり 多くは両方ともすぐに戻ってきた
同じ頃。
だから、特に縛られていませんでした。
>> しかし、ここでは今それを試してみましょう。
[OK]を、私たちは私たちの二つのプロセスを得た。
それらは、プロセスIDであることを忘れないでください。
これは少しになるだろう 我々は失速しながらぎこちない。
それでは、ちょうどここに滞在して待ちましょう。
>> だから、そのうちの一つは、来る必要があります 背中のような後 -
[OK]を、ので、1が戻ってきた。
しかし、その後、なぜ第二はしませんでした 1はまだ狙っ戻ってくる？
うん？
>> 観客：サーバーは何もできない それはその大きな数の計算ている間。
>> KEVINシュミット：右。
だから、応答があっただけで、そのサーバー 本当に何もすることはできませんが
それはそのフィボナッチ数を計算することだ。
だから今私はちょうど私の二つのことを戻った。
しかし、私は単にコードを考えることを推測 もう少し、それはどのように取り組んでいる
そしてすべてのもの。
>> だからここにこの機能は、コードであること 私はときに実行するには、このサーバーに指示しました
新しい着信要求を受信する。
だから、ちょうどこの介して実行するようになるだろう コー​​ド全体、そしてそれが行くことになるだろう
イベントループにバックアップし、継続 新しいイベントをチェック。
そこで、基本的に我々は何が起こっているもの サーバーがある
新しいもののために聞いて。
最初の人は45が何であるかを要求します。
我々はそれを計算するためにこのコードを実行する。
このコードは、およそ5を取る 実行するには6秒である。
その後、我々はイベントループに戻る そして、新しい要求をチェックします。
>> もしそうであれば、これは、方法の一例です いわゆる計算であるものを持っている
、結合された、または計算をたくさん使う 電源が入らないが、似ています
計算集約 -
私はこれについて言って一つのことだと思います この関数は、完全にやっている
ほとんどの部分は、かなり 有効な仕事の権利。
全体の時間というそのコールバック 関数が実行されていた、それはかなりだった
ずっとそのほとんどの時間を費やしてばかり コンピュn番目のフィボナッチ数。
>> しかし、私たちは、1つのスレッドを持っていた に対処する。
Apacheのモデルでは、とき2人 我々は、45をFIB取得する要求を行った
2つの異なるスレッドがあっただろう。
そして、オペレーティングシステムの仕事 き、またはユーザレベルであろう
スレッドを管理するコード、きになる でそのをスライスしてき
CPU、または、複数のCPUを持っていたとしても、 CPUに均等に分散
彼らは両方の仕上がりとなるよう 大体同時に。
>> だから我々は、一種の方法をお見せする - これは、総完璧ではあり​​ません
解決策が、並べ替えの方法我々はできる ここに戻って来て、間に合わせる
少しでも良い。
それでは、私がここにあることと呼ばれるプログラムです。 FIB℃、これは基本的に使用しています
と呼ばれるノードのモジュールの別の 子プロセスモジュール。
だから私は、一番上のようなもので、それを含めました の私には、ポンドをしますかのように
子process.hか何か。
今私は、このCPの変数へのアクセス権を持って そのすべての私の機能を備えています。
>> だから今、私は、この応答にやっている ハンドラは、私がこのプログラムを実行しているされている
ドットスラッシュFIB 45。
だから私は何をやった - と私は行くよ このプログラムの中から抜け出すために
少し -
私は、Cプログラムを書いているしている 基本的に計算し、
n番目のフィボナッチ数。
だからここに私が書いただけのプログラムです これを計算するC言語で。
私はそれをコンパイルすることができ、私は実行することができます それは、コマンドラインで。
そして、それは計算するために起こっている 第45回フィボナッチ数。
>> だから、それだけで取るに気づく 限りほとんど。
私はおそらくダッシュ03を使用することもできました それを最適化したり、そのようなこと、
私は普通のようでした コンパイラ設定。
そして、それはそれを出力します。
>> しかし、今、私はちょっと、何をやっている？
申し訳ありませんああ、間違ったファイル。
だから私は、同じものを行う 以前のようにヘッダー。
それから私はこのcp.execを行う。
それでは、これは何をするつもりなのはそれですです このプログラムを実行するつもり。
しかし、これが機能する方法があることである それがために待つことはないだろう
終了するそのプログラム。
それだけで基本的に述べています このプログラムを実行する。
そこで、基本的にこれを入力する の迅速な種類を指揮。
>> そして、あなたがして終わったら それは、この関数を実行します。
だから今、私たちはちょっとこれを取得 全体の復元の事
我々は待っていないよう。
のようなものは、理にかなっていますか？
うん？
>> 観客：[聞こえない]？
>> KEVINシュミット：だから、これは実際になります それを行うための新しいプロセスを開く。
だから、これはある意味では、実際には、 、悪のスーパー悪ではないが、それはある
これは種類のものであると言うことが重要 一方では、背面に行く、アパッチ
我々は、スレッドやプロセスを行うモデル 要求ごとに、または
リクエストごとのプロセス。
だから、これは類似の一種である Apacheは何に。
いくつかの場合においては、ちょうど新しいを使用する もう少し軽い糸、
プロセスよりも重量が、Apacheができ 新しいプロセスをフォークしてしまう
私たちがここで何をすべきかの一種である 暗黙的にドットスラッシュFIB 45を実行して。
>> そして、そのケースでは、この種の発生 プロセスの同じ費用。
だから、これはあなたがすることができるだけで一つのことです。
しかし、単にランニング、この種を表示します。
そしてこの話は本当に目指している などのプログラムのこれらの種類を提示
上のさまざまな視点を表示する方法 そのようなサーバをどのように設計するか。
だから、これは実行され、その後、今私がしている場合 これもまた、私は2つのプロセスIDを得た。
>> ちょうどについてお話しましょう 指摘すべきもの。
そこで、彼らは徐々にだということに気づく。
それはクールだ。
それは前に27122であったため。
しかし、通知は、今、彼らは戻ってきた ほぼ同時に。
>> そして今、良い質問について質問する なぜ場合は、その仕事であるということでした
それは一種のこれらの事をするようになりました 種類ごとに公正をプレイ
他方、これらの二つのインスタンスの 私は走ったドットスラッシュFIB 45
またはそのノードが走った？
並べ替え、それが公正なことを行う人々、彼らの両方 バランスの取れた実行時間の種類を取得？
>> 観客：[聞こえない]。
>> KEVINシュミット：うん。
そこで、基本的に、私は、ドットスラッシュFIBをするとき 45またはそのような何か、今ではだ
種類の、オペレーティングシステムまで これらのプログラムの実行を処理します。
今では、それらをスケジュールすることができます 異なるCPUまたはそれに
それらをスケジュールすることができます。
それはその1、時間をスライスすることができます CPUは、彼らが得ること、それを取得または
一つのCPU上で実行する。
だから、その背後にある考え方です。
それは誰にも意味がありません？
だから今のノードは、実際に再生されていない これらのタスクを分割するに参加。
[OK]をクリックします。
>> だから例については、ほとんどこれだけです。
私はもう一つのことを見せたかった これの多くは、これまでされているため、
完全にスーパー実用的ではありません いくつかのケースでは。
私は、この後に帰ってくる想像することができます トークや何かなどを言って、
よく私はちょっとその話から得たことを 私はのためのフィボナッチサーバを作ることができます
私の最終的なプロジェクト。
だからここだけの種類の1つの例です それがうまくいけばなり -
そうでないかもしれないが、多分 - もう少し ソートの最終プロジェクトに関連し、
そのようなことのために先に考えて。
>> だから、これはchat.js.です
だから、これは種のいくつかのサンプルのようなものです 次の目的で使用することができ、サーバー側のコード
のような小さなチャットサーバをセットアップする あなたは上で見たことがあるかもしれ
Facebookはチャットや何でも。
だから私は、これはFacebookのようなものですとは言わないよ チャットするが、これは種類のものである
良いそうでないかもしれないが、多分 - いいような 良い - チャットの開始点
あなたのウェブサイトのためのサーバ 最終的なプロジェクトのために。
それでは、それはやっているものを見てみましょう。
>> だから我々は、この特別なものを取得している 上部にある、これは、SiOをVAR
Socket.IOを必要とするに等しい。
だから、これはそうでない別のものである 実際にバンドルされて
ノードが、あなたはそれをインストールすることができます。
これは、ノードモジュールです。
だから、ほんの一部のようなものだ ノードへの拡張。
>> SocketIOは本当に実際に 涼しいの一種。
それは基本的にどのような抽象化です されないと、それはあなたができるようになり、それをある
この通信の流れを持っている ウェブとの間
ブラウザとWebサーバー。
だから、これまでのところ、ほとんどの部分は、我々は持っていた これらの非常に迅速な1秒か2
ウェブの間の第二の通信 ブラウザとWebサーバー。
だから、基本的にはgoogle.com、得るために行くだ もの、それを返送し、
我々は完了です。
私たちは、まで再話したことがないしている ユーザーが何か他にある。
>> しかし、Socket.IOと似たような種類の 物事 - とSocketIOは、実際には1である
として上に構築されて、物事の 並べ替え可能ですWebSocketの
HTML5の一部として -
つまり、あなたがこれを持つことができます 継続的な対話。
そして、これはチャットサーバに非常に有用である ものの一種となっておりますので
種の中で継続的な対話のような ある意味あなたがチャットしている場合、以下の原因
誰かと、あなたが今だけ送信することができます パイプダウンメッセージ、その後、
サーバーがダウンしてメッセージを送信することができる あなたがしている他の人へのパイプ
とおしゃべり。
それから、あなたはこれを持つことができます そのような交換。
>> だから、何のようなものだ SocketIOは適しています。
SocketIOはWebSocketをを使用しています理由 一つのことは、その中にあるように
ただ、昔ながらのWebSocketをすることに加え、 それはまた、基本的にいくつかのトリックを行います
それをブラウザ互換性を持たせる。
Internet Explorerのようなので、ブラウザで 残念ながら、WebSocketををサポートしていません
右箱から出して。
だから、クールなきちんとした他の種類を使用しています できるようにするのAdobe Flashとの事
あなたは、クロスブラウザーのサポートを持っている。
だから、本当に便利です。
>> そして実際に、私は一種の私を知っている ここでの時間で実行されているが、CS50
議論、あなたは今まで何を見てきました のように、私は知らない、ブランクが云々される
この記事か何かに返信 そのような、その機能？
それはSocketIOです。
だから、誰かが中に入力して起動したとき 返事をするボックスを議論したり
何か、お使いのブラウザは何ん のいくつかの種類を発するSocketIOで呼び出さ
誰かの言うイベント この投稿に返信する。
>> サーバは、[OK]を言う、 何をしなければならないのですか？
さて、私はそれらの他の人に指示する必要があり CS50に誰なの探して話し合う
誰かが返信だとこの記事では。
だからSocketIOが何であるかのようなものだ この継続的な種のこだわり
対話の流れ。
[OK]をクリックします。
>> だから私はここで何を持っている - と私たちはただだ 接続配列を無視しようとして
少しのために -
私は何をすると私は別のを聞くんです。
だから、それはちょうどSocket.IO方法ですだ のは、このポートをリッスンしましょう​​と言って。
そして私は、接続上でこれを行う。
だから、ただ、基本的にソケットのIOのだ 我々は受信したとき、というのが道
接続は、私はあなたが欲しい このコードを実行します。
>> 予告その代わりにRECを持っていることの そこに渡されたRESは私がソケットを持っている。
このソケットのアイデアは、基本的にはこれです 自分の書き込みと読み取りができる事
それとは、ユーザーのを持っている おそらくメッセージ。
そして、あなたが送信したメッセージ そのソケットを通過することができます。
それは理にかなっていますか？
だから、この継続的なことだ。
>> だから、私は何をすると私はSocket.emitを呼び出しています。
とEMITはかなりかかります ずっと2引数。
最初の引数は文字列である ただの型を表す
あなたが発光している事。
この場合のために、私が使用をしました この文字列に新しいメッセージが表示されます。
そして、それはただ、基本的に言っていること 私は何をこの事の種類、
送信、新しいメッセージです。
だから、特定のタイプを聞くことができます 新しいメッセージまたは何のような
上にドットを使用します。
>> ように、接続ユーザーがいる場合、そこに送られた あなたは、私たちがドットを呼び出すところを見て
それらは表して、他の文字列です ユーザメッセージの種類。
だから、あなたがこのEMITを持つことができ、基本的だ これらのメッセージタイプの1、および
その後に反応して何かをする これらのメッセージタイプの1
>> だから私は、この新しいメッセージを発​​するよ。
私たちは、connections.pushを無視しようとしている 秒。
しかし、私はSocket.onユーザーが送信された、と言う。
だから今、それは一種のときのようなものだ ユーザーは、私が欲しい、私にメッセージを送信します
あなたはこのコードを実行します。
予告そのこと無名関数 この変数に取って
基本的に起こっているデータと呼ばれる ユーザのメッセージを持っている。
>> だから今のの話のようなものをしましょう 接続配列。
だから、これは、チャットクライアント用に設計されています どこにあるのは基本的にすべての人々の親切
同じチャットルーム。
そこで、基本的に、我々は維持するために必要なもの 周りは基本的にいくつかの配列です
でチャットすべての人々を表して ある意味、それは理にかなっている場合。
右？
私たちは、人々の人を知っている必要がありますので、 私たちは彼らにメッセージを送ることができている
他の人が私たちに送ってください。
>> それでは、このコードが行うのはときに、ユーザーである メッセージを送信する - それは一種だ
イベント -
私たちは、このコードを実行するつもりだ。
そして、私たちがやっていることは我々がこの介して実行される 我々が接続を求めている配列。
そして、すべての接続のためのほとんど 我々の1を除いて、それはです
このコードが言うこと、我々は新しいを送信 その添付されたメッセージを持つメッセージ
情報。
>> ですから、ここに気づけば、私は時に何をしたか ユーザーが実際に新しいを作る
私はとの接続を追加したさ これはJavaScript.push法、
基本的には、アドインのように言って に値としてそのソケット
当社の接続配列。
このコードを実行すると、だから今、それは意志 それらの特定に物事を送る
接続。
だから、これは良い出発点になることができます チャットサーバを作るための
または似たような。
>> そしてクールなものの一種であること あなたは上のようなこちらをご覧コードと
放射し、そのようなものは同じです JavaScriptコードの種類を行うのと、その
対話するためにブラウザに送る サーバーと。
SocketIOはちょっとある理由ので、それはです きちんとしてそのように有用。
>> ああ、ちょうど1のより多くの事実際に素早く。
CS50最終的なプロジェクトは昨年がありました それは基本的にチャットを実装
Node.js.内のサーバー
私はそれがHarvardchats.orgだと思う しかし、私はないよ -
[OK]をクリックします。
私は、URLが何なのかわからないんだけど、 私はその後それを送信することができます。
しかし、それは一種の何がクールだ あなたはNode.js.で行うことができます
>> だから私は、一般的に、あなたたちは持っている、願っています Node.jsのが便利ですものの良識
のため、どのようにあなたは多分適用される可能性 最終的なプロジェクトに。
私はいくつかのより多くの発送になります これに伴って資源。
と来ていただきありがとうございます。
ありがとう。
>> [拍手]