>> KEVIN SCHMID: Bonjour tout le monde.
Bienvenue sur le séminaire de CS50 sur Node.js.
Mon nom est Kevin.
Je suis un TF CS50.
Et je suis un peu comme vraiment excité sur ce séminaire.
Je pense que Node.js est très cool.
J'espère que ce séminaire peut être utilisé comme un bon, je suppose, tremplin pour
certains de vos projets finals le cas vous êtes intéressé à utiliser
quelque chose comme Node.js.
>> Nous allons sorte de commencer le séminaire hors de juste parler un peu de la
sorte de fond évolutivité perspectives de Node.js, puis
nous passons à des exemples de code.
Et je vais avoir le code sur un site Web, et vous pouvez regarder le code.
Et après le séminaire, je vais genre de discours sur la façon dont vous pouvez configurer Node.js
sur votre ordinateur.
>> OK.
Donc, nous allons commencer.
Donc je suppose que je veux juste parler serveurs web, vraiment, d'abord.
Et pour commencer cette discussion, je avoir essentiellement un diagramme qui est compris entre
le manuel utilisé pour CS61, qui montre essentiellement l'interaction
entre un processus client, comme votre site navigateur ou comme votre client de but ou
quelque chose comme ça, et un serveur web.
Donc, ce genre de ressemble à l' image que vous avez vu en conférence sur
Mercredi où fondamentalement nous avons quelques processus client comme Google Chrome.
>> Et puis la première étape est la le client envoie une demande.
Alors, ça peut être quelque chose comme Eh bien nous allons visiter, je ne sais pas, CS50.net.
Donc, nous émettons cette demande.
Et ce que quelqu'un se rappeler le nom de le protocole qui spécifie la façon dont
demande devrait être structuré?
Yep.
>> PUBLIC: [inaudible].
>> KEVIN SCHMID: Exactement.
Donc, c'est comme HTTP, non?
Donc, fondamentalement, la spécification de la façon dont cette demande doit être effectivement mis
, parce que, à la fin de la journée, cette demande est vraiment juste comme un
chaîne essentiellement dit que je veux cela.
Et la spécification pour cela est le protocole HTTP.
Donc, c'est comme un protocole.
>> Alors le serveur reçoit cette demande.
Alors vous les gars ont un serveur web installé dans l'appareil de CS50.
C'est Apache.
Et cette semaine, lorsque vous travaillez sur le problème mis sept, vous aurez en fait travailler
avec le serveur Web.
Ainsi, le serveur reçoit cette demande, et alors il doit genre de rayer son
tête et dire comme bien ce dois-je faire cela?
>> Donc, sur la base de ce qu'il décide de faire, alors il peut avoir à contacter une sorte
de ressource.
Et cette ressource pourrait être un beaucoup de choses différentes.
D'une part, il pourrait être juste comme un fichier HTML statique.
Donc, il pourrait simplement être comme une HTML qui est comme pour
votre site personnel.
Il pourrait s'agir d'un fichier statique comme une image ou comme un film que vous avez.
Il pourrait même avoir à parler à une sorte de base de données
comme une base de données MySQL.
Donc, il n'est pas toujours nécessaire de communiquer avec une ressource, mais en
certains cas, il pourrait.
>> Alors ce qu'il va faire après qui est ça va
renvoyer la réponse.
Et la réponse à cela est également précisé par HTTP.
Donc, le client peut recevoir.
Il peut déchirer et le traiter.
Et puis, vous obtenez une page web comme Google ou CS50.net ou
tout ce que vous allé.
OK?
>> Donc, c'est l'interaction de base qui nous allons être confrontés.
Et nous sommes à peu près va être mettant l'accent sur cette partie de la
interaction, le serveur.
OK.
Cool.
N'importe qui ont des questions à ce jour?
OK.
>> Donc, comme nous l'avons dit, le serveur Web reçoit cette demande HTTP, puis émet ce
réponse HTTP.
Et comme nous avons parlé avant, la serveur Web de l'appareil de CS50 est Apache.
Ainsi, lorsque vous travaillez sur les gars P défini sept, vous allez travailler avec le
Le serveur web Apache.
Vous n'aurez jamais à vraiment travailler avec Apache directement trop.
Vous sorte de configurer Apache un peu lorsque vous spécifiez les hôtes virtuels ou
les hôtes de v, et nous aurons pour que, dans un petit peu.
>> Mais fondamentalement, le serveur Web Apache mis en place pour travailler avec le genre de PHP
de sortie de la boîte.
Donc ce qui se passe vraiment, c'est quand vous allez à un de vos sites comme, par exemple,
hôte barre index.php ou quelque chose de local, est que votre navigateur envoie
demande, puis Apache est assis il et détermine à faire avec elle.
Et l'action est d'exécuter ce code dans index.php et
alors envoyez-retour.
Il n'y a donc que.
Donc nous sorte de parlé.
Donc, il pourrait simplement servir d'un fichier statique ou exécuter du code PHP et question
la réponse.
>> Alors une question commune qui peut venir vous est ainsi, comment traitons-nous vraiment
avec de multiples utilisateurs ayant en même temps?
Alors, imaginez si vous écriviez un web serveur, si vous aviez un serveur Web
vous tentiez d'écrire quelque chose comme C ou quelque chose comme ça,
fondamentalement, vous pouvez penser à la façon dont il pourrait être une sorte de code qui
recevrait la demande, mais il doit faire tout ce travail sur elle.
Il peut y avoir, par exemple, communiquer avec le base de données ou quelque chose comme ça.
Droite?
Et puis, il ferait ce genre de traitement et
renvoyé la réponse.
Donc, c'est comme la haute Vue d'ensemble du niveau.
>> Mais il n'est pas immédiatement évident comment vous peut le faire de telle sorte que deux personnes ou
même 1000 personnes pourraient travailler avec votre le serveur web en même temps.
Donc, la solution qui utilise Apache est appelé threads ou processus.
Donc, vous avez peut-être entendu parler de ces termes avant.
C'est OK si vous ne l'avez pas, mais il suffit de penser sur les threads ou processus que des moyens pour
un système d'exploitation ou un programme d'utilisateur ou quelque chose comme ça ou un serveur Web
en quelque sorte de l'exécution multiple choses à la fois.
Donc, vous avez peut-être entendu le terme comme des fils d'exécution.
Donc c'est un peu comme si vous étiez sorte de multitâche.
>> Et si vous avez vu sur la boîte de votre ordinateur portable, ou quelque chose comme ça,
multicœur, ce que vous pouvez faire est que vous pouvez exécuter deux threads différents sur différents
les parties de la CPU de sorte qu'ils puissent en fait se produire en même temps.
Donc, c'est vraiment puissant.
Et c'est un peu Apache solution à ce problème.
>> Donc, y at-il un peu comme toutes les questions avec cette approche si?
Donc je suppose que je sorte d'entre eux écrit là.
Mais deux d'entre eux sorte de utiliser beaucoup de mémoire.
Il est très coûteux de créer un fil ou d'un processus.
>> Et une partie du raisonnement est que, tout comme lorsque vous utilisez un programme C
comme votre principal et que les appels une autre fonction, qui possède
une sorte de pile.
Donc, les discussions ont également besoin d'un tout pile séparé qui
peut être très grand.
Et si vous pouvez imaginer avoir des tonnes de utilisateurs sur votre site Web, vous auriez
un grand nombre de threads différents.
C'est beaucoup de piles à gérer et à entretenir.
C'est donc une grande consommation de mémoire.
>> Et puis, aussi, disons que vous avez seulement un CPU, ou disons que vous avez
plus de threads que vous avez ces multicores.
Droite?
Alors disons que vous aviez 10 threads et vous aviez seulement cinq processeurs.
Vous avez sorte de faire cette chose où vous basculez entre le courant
celui qui est en cours d'exécution parce que vous ne peut pas courir tous les 10 à la fois.
Et c'est ce qu'on appelle un changement de contexte.
Et ce terme a fait deux différents contextes, mais disons simplement
penser que la commutation entre deux fils.
Cela peut être assez cher, car essentiellement ce que vous avez à faire est de vous
avoir à arrêter ce que vous faites, faites gagner la état de ce fil conducteur, et
puis passer à un autre endroit.
>> Donc, tout le monde ne sorte de la voir motivation pourquoi les discussions et
processus peut être un peu encombrant?
Et avez-vous une question?
OK.
Cool.
Quelqu'un a des questions?
OK.
>> Donc, si nous prenons un peu de recul pour un deuxième, il ya peu comme un
observation que nous pouvons faire sur un grand nombre d'applications web.
Et c'est vraiment ce que beaucoup d'entre eux fait de ne pas faire beaucoup utile
travailler à l'intérieur d'un fil.
Donc, quiconque a commencé sur P défini sept du tout?
Alors voulez-vous décrire peut-être certaines des parties?
Avez-vous travaillé sur la connexion ou quelque chose comme ça?
>> PUBLIC: Non
>> KEVIN SCHMID: OK.
Ce n'est rien.
Désolé.
Mais fondamentalement, dans l'ensemble P, vous êtes allez faire beaucoup de sorte de
requêtes à une base de données pour obtenir une certaine les informations de cette base de données.
Et ce que votre code va être fait, ce que le processus Apache ou
ce thread Apache va faire alors il doit prendre contact avec le
base de données est-il en quelque sorte va être assis là et il va être
attente de la base de données pour répondre.
>> Maintenant que peut ne pas sembler un gros traiter parce que la base de données est sur votre
appareil CS50, non?
Mais il est une sorte de réseau latence là parce que maintenant le web
serveur doit émettre sa propre demande la base de données pour communiquer avec l'
base de données et ensuite obtenir que informations de retour.
Alors maintenant, c'est comme bien attendez-moi, je suis vais aller chercher quelque chose de l'
base de données et puis il ya un beaucoup d'attente en cours.
Cela fait-il sens?
>> Et pour certaines choses, ce n'est pas si mal que ça.
Si elle a simplement, par exemple, mémoire, qui n'est pas comme
terrible latence E / S.
Et quand je dis, I / O de latence, ce que je suis référence est comme n'importe quel genre de comme
d'entrée-sortie.
Mais pour accéder à un fichier sur le disque, comme si je voulais servir le HTML statique
fichier qui a été sur ma page web ou quelque chose comme ça, je sorte de besoin d'
arrêter un peu, lisez ce fichier à partir du disque, et ensuite en
ce processus, je suis en attente.
Je ne fais pas un travail utile.
>> Ce n'est pas vrai du tout, mais il est commun dans des applications comme P ensemble
sept et un grand nombre d'applications que vous n'êtes pas
en train de faire beaucoup de réflexion.
Et quand je dis pensée, je veux dire comme le travail de calcul.
Donc, le travail de calcul pourrait être quelque chose comme, par exemple, que vous vouliez
écrire un serveur web qui vient calculé le nombre de Fibonacci nième.
Cela ne ressemble pas à un particulier serveur web plaisir.
Comme je ne m'attends pas à ce site d'être le prochain Facebook, mais c'est un peu
genre de travail informatique.
>> Et vous pouvez imaginer que le remplacement de un autre type intéressant
travail de calcul.
Disons que vous écriviez quelque chose celui calculé les degrés de
séparation entre deux personnes ou quelque chose comme ça.
Alors qui n'implique une sorte de calcul, non?
Et même alors, pour ce faire, vous avez encore pour faire beaucoup de l'attente pour peut-être
vous avez pour interroger une base de données à examiner vous qui est ami avec qui ou
quelque chose comme ça.
Donc, il ya ce genre de notion le travail de calcul.
Cela fait-il sens?
Quelqu'un at-il des questions?
>> Oh, et je suppose que je mets serveurs de chat il parce que les serveurs de chat sont un peu
un autre bon exemple de cela.
Un serveur de chat n'a pas encore pour faire beaucoup de réflexion.
Il a juste à attendre que les gens envoyer des messages et puis quand
ils le font, les envoient.
OK?
>> Donc, juste pour résumer encore une fois, Apache et serveurs web similaires comme ça fourche un
beaucoup de discussions et les processus qui peut être une sorte de gaspillage.
Donc je suppose que la question qui peut venir de qui est-on besoin d'avoir
plusieurs threads et processus?
Que faire si nous avons juste eu un?
>> Donc, nous allons type de peinture une image de ce que cela pourrait ressembler.
Nous allons donc utiliser un seul thread.
OK?
Alors imaginez ce avec un fil.
>> Supposons que nous n'étions pas vraiment en train de faire que beaucoup utile - et quand je dis
utile, je veux dire le travail de calcul -
dans ces multiples discussions avant.
Donc, nous allons genre de consolider tout dans un seul fil.
Alors que faire si nous avions un fil de ce genre de juste qui circule dans la boucle et
constamment contrôles ont fait quelque chose nouveau se produire.
Ainsi, par exemple, quelque chose de nouveau est arrivé pourrait dire que je suis quelque chose de
la base de données, ou quelqu'un envoyé moi une nouvelle requête HTTP.
Ce sont donc les types d'événements que cela se produise, non?
>> Et puis ce que je peux faire quand les nouveaux les choses se passent dans ce même fil
d'exécution, ce seul thread d' exécution, je peux appeler un code qui
permettrait de gérer cette chose particulière.
Ainsi, par exemple, si j'ai quelque chose en retour de la base de données, je pouvais courir ma
petite partie de calcul de ce que effectivement prépare juste la chose pour
envoyer à l'utilisateur.
Il en va de ce genre de logique?
>> Mais ce sont vraiment les implications de cette?
Droite?
Parce que nous avons écrit beaucoup de code qui -
et je vais juste pour sauter en avant dans les coulisses si c'est OK.
Donc, si cela ne vous dérange pas, je suis juste va prendre un peu de recul.
Donc, ce genre de chose est appelé une boucle d'événements.
OK?
Et c'est un peu la base idée derrière Node.js.
>> Alors, que Node.js fait vraiment comme une toile serveur, c'est qu'il ya un seul fil
qui va fondamentalement autour d'une boucle comme un moment une sorte de sous
le capot de Node.js qui est constamment vérifier, avons-nous reçu de nouvelles choses?
Et puis, il activera les gestionnaires que vous définissez.
Mais une bonne question à poser est: comment pouvons-nous y arriver
avec des choses existantes?
>> Alors, j'ai mis une ligne de code C ici que ressemble fondamentalement à son ouverture une
déposer, non?
Je Elle vient de sortir un album.
J'ai donc dû lui ouvrir un nouveau fichier.
Donc, la façon dont notre code C en fonctionnement -
et je suppose que la raison pour laquelle je choisi fichiers était parce que c'est un peu de l'ampleur
des travaux d'E / S que nous avons fait dans C dans un sentiment qu'il ya d'entrée-sortie.
Nous appelons donc ce code qui le fait f ouverte.
Et puis sur la ligne suivante de notre programme, nous pouvons maintenant travailler avec f.
>> Donc, ce serait un exemple de quelque chose c'est comme synchrone ou
blocage parce que sur cette première ligne il nous attendons jusqu'à ce que nous
obtenir le fichier ouvert.
Donc, sur la deuxième ligne, nous savons que nous peut travailler avec f, mais cela signifie que
que deuxième ligne ne peut pas vraiment fonctionner jusqu'à ce que la première ligne est effectué.
Cela fait-il sens?
>> Donc, ce serait mauvais de mettre dans un gestionnaire d'événements.
Et la raison en est que ce genre d'attentes, non?
Donc cela nous revenir à la même chose.
Et maintenant, nous n'aurions même pas le bénéfice de plusieurs threads ou
processus parce que nous avons un fil dans Node.js.
Cela fait-il sens à tout le monde?
>> PUBLIC: Attendez.
Alors, quel est le remplacement?
>> KEVIN SCHMID: Oh, oui.
Donc, je vais arriver à le remplacement.
OK.
Alors que faire si nous avions quelque chose qui avait l'air comme ça?
Alors que faire si maintenant j'ai édité f ouvrir un peu?
Donc, je suis de passage dans la même deux arguments que précédemment.
J'aime toujours la nouvelle chanson qu'elle est venue avec.
Mais je suis de passage une troisième chose qui cette variable est appelé code.
>> Mais ce qui est réellement le code dans ce contexte?
Est-ce comme une variable ordinaire de C?
C'est une fonction, non?
Et c'est peut-être un peu bizarre parce que Je suis fait comme maintenant passer un
fonctionner dans une autre fonction.
>> Ainsi, un couple de choses à noter à ce sujet.
Premièrement, je ne suis pas fait appel la fonction de code.
Donc vous ne voyez pas le code de la parenthèse gauche, parenthèse droite.
Je ne fais que passer dans le code.
Et en C, ce que cela fait faire est me donner un pointeur sur cette réelle
code, et cela pourrait l'exécuter.
Mais il suffit de penser à ce sujet que vous êtes passer le code à exécuter lorsque
ce fichier est ouvert.
>> Mais ce que cela signifie, c'est que maintenant la reste de mon programme qui pourrait faire
autres choses, peut continuer à faire d'autres trucs pendant que nous, pas vraiment attendre, mais
juste avoir à l'arrière de nos têtes lorsqu'il est ouvert, terme de ce fichier que
code en haut.
Cela fait-il sens?
>> Et maintenant, l'idée derrière Node.js est que le code dans la substance de do avec f
partie devrait être assez court et simple et simple et pas vraiment
très calcul intensif.
Il peut avoir à ouvrir un autre fichier, mais qui devrait également être assez rapide
car il devrait simplement dire faire une autre f ouvrir et appeler cette autre code.
>> Donc, juste pour être tout à fait clair, la f ouvrir ce fait la nouvelle chanson de Katy Perry
mp3 faire, cela va assez beaucoup retourner immédiatement.
Et puis nous ne pouvons continuer à faire autres choses parce que tout ce qui maintenant f
appel ouvert ne se dit fondamentalement la sous-jacente code ouvert f ouvrir ce fichier
et lorsque vous avez terminé ouvrir ce déposer ou lorsque vous le récupérez,
puis exécutez ce code.
Mais il n'exécute pas le code.
Et vous aviez une question?
>> PUBLIC: Vous semblez impliquer un peu fois que l'ajout de calcul
Code intensive sorte de briser le [Inaudible] système piloté.
[Inaudible]?
>> KEVIN SCHMID: C'est une excellente question.
J'ai donc fait un exemple de la façon dont vous pouvez intégrer des calculs
Code intensive dans un peu.
Alors, quand nous arrivons à les exemples de code, Je vais être sûr de tirer celui-là.
Est-ce OK?
Merci.
>> Quel était votre nom?
>> PUBLIC: Aaron.
>> KEVIN SCHMID: Aaron apporte une très bon point, qui est que si j'avais
un code de calcul intensif en les trucs faire avec une partie f, le reste de
mon programme ne peut pas fonctionner et ne peut pas écouter pour les nouvelles demandes ou quoi que ce soit jusqu'à ce que tous
ça est terminé.
Donc, si je vous écris code Noeud en général sauf si nous faisons quelque chose que je vais
de proposer plus tard, quand nous regardons le des exemples de code, je dois être sûr que
mon code ne bloque pas cette boucle d'événements.
Cela fait-il sens?
OK.
Cool.
>> Donc Node.js offre ce cadre que vous pouvez construire ces événementielle
serveurs avec.
Ainsi, il a ce genre de asynchrone non bloquant E / S bibliothèques, alors que
les bibliothèques standard C que nous avons été travailler avec, comme si vous venez de
les utiliser de la même manière que nous avons été de les utiliser avec f s'ouvre et
trucs, ceux bloquent parce vous avez fait attendre
ce fichier pour l'ouvrir.
>> Mais Node.js vous donne cela et il cravates essentiellement en V8 de Google
Moteur JavaScript qui est la raison que Chrome est si rapide au traitement
JavaScript car il a ce moteur V8.
Donc, je sais que cela ressemble à l'un de ceux WWDC conférences de développeurs chose
où ils jettent tout simplement un groupe de la numéro de lettre choses pour processeurs
et dire que c'est tellement cool.
Mais c'est cool qu'ils ont fait car JavaScript -
ou peut-être si vous n'êtes pas familier avec JavaScript encore parce que nous n'avons pas eu
les conférences sur le sujet -
mais JavaScript est un langage interprété langue.
>> Et c'est un point important.
Il est donc important pour notre site web serveurs d'être rapide, non?
Et si nous étions juste en cours d'exécution JavaScript code qui a été interprété avec juste
n'importe interprète, il pourrait être lente.
Donc avantages nœud d'avoir ce super rapide interprète V8.
Et je ne sais pas si ils l'ont nommé parce que la claque de V8 dans le front
chose, mais OK.
>> Donc, je vous ai préparé quelques exemples à cette URL.
Après le séminaire, je suis une sorte de va parler de la façon dont vous pouvez obtenir ensemble de nœud
, mais pour l'instant, je veux juste une sorte de de marcher à travers quelques exemples de code.
Donc, si vous voulez suivre, tous les le code source est disponible.
OK?
>> Donc, je vais laisser cette URL pour un peu.
Et puis je vais juste passer dans le terminal.
Tout le monde est bien avec cette URL?
Je vais donc passer plus de à ma borne ici.
>> Alors, voici le code qui J'ai aujourd'hui.
Pourquoi avons-nous pas commencer par simpler.js fichier?
L'autre chose est que tout cela du code va être écrit dans
JavaScript que vous déciderez ou peut-être pas familier.
Je suppose que quelques choses est que beaucoup de code JavaScript est le genre de
syntaxe et la structure est très similaire à C, de sorte que vous pouvez sorte de ramasser comme
vous allez le long.
J'ai essayé d'écrire une grande partie de la un code de départ pour cela d'une manière qui est
similaire à C de sorte qu'il est un peu plus lisible.
Mais alors que nous progressons, je serai montrant une partie de l'supplémentaire
fonctionnalités de JavaScript qui sont plutôt cool.
>> Mais regardons cet exemple de programme.
Je suppose que tout est coupé là.
Je vais corriger cela réel rapide si c'est OK ou pas.
Je ne sais pas ce que cela va faire.
Est-ce un peu mieux?
Pouvez-vous voir le var et des trucs?
OK.
>> Ainsi, la première ligne est comme le JavaScript version d'une variable
déclaration.
Il suffit donc de mettre en évidence ce que ce serait ressemble à C. Donc, c'est tout comme
indice me dire égale à trois ou quelque chose comme ça.
Donc, je n'ai pas précisé le type.
JavaScript a des types, mais il est très typé dynamiquement dans la nature,
ne pas fournir toute sorte de type sur elle.
Ainsi, il a juste var.
C'est comme variable.
OK?
>> Et je vais appeler cette HTTP variable.
Et sur ma droite, j'ai l' expression que je veux mettre en HTTP.
Et cela dit nécessite HTTP.
Donc c'est un peu similaire à inclure.
Il est un peu plus puissant que comme inclure dans le sens d'inclure
serait tout simplement copier et coller l'en-tête déposer pour les prototypes de fonction ou
que ce soit avec les définitions de type.
Mais exiger qui se passe réellement pour nous obtenir le code.
>> Ainsi, vous pouvez penser que c'est l'importation du code.
Donc, quelque part dans le module Node.js système ou autre, ils ont tous ce
code du serveur HTTP, donc je suis chercher pour mon propre
usage personnel dans ce programme.
OK?
>> Alors j'ai cette fonction que j'ai écrit.
Et remarquez que je n'ai pas eu à préciser le type de retour ou le type de l'
arguments de nouveau.
Alors sorte de lâche tapé dans ce genre de sentiment.
Deux arguments qu'il prend dans, la demande et la réponse.
Donc, c'est un peu comme conceptuellement familier de l'image que nous avions
sur l'écran avant parce nous obtenons ce que nous demande
avoir de l'utilisateur.
Et puis nous avons une réponse nous pouvons écrire des choses à.
>> Ainsi, la première ligne de ce fait res.writeHead 200 puis ce
type de contenu texte brut.
Donc, nous allons pièce Cet dehors un peu.
Donc, nous allons nous concentrer sur res.write pour un peu.
Alors écriture est fondamentalement, et écrire la tête, ne sont que des façons de sorte de les écrire
choses à la réponse.
OK?
Donc, écrire la tête, si quelqu'un se souvient de la conférence de HTTP, que vous les gars
n'oubliez pas les en-têtes à l' haut de la chose HTTP?
Alors, pourquoi dois-je Demo pas seulement têtes réel rapides.
Serait-ce utile?
Ou devrions-nous juste une sorte de -
OK.
Bien sûr.
>> Ainsi, lorsque votre navigateur va google.com ou quelque chose comme ça,
il ya en fait un peu plus -
c'est comme un secret -
il ya comme un peu plus d'informations qui vient à travers la conduite de tout
la petite recherche et tout.
Donc, pour vous montrer, je vais à utiliser un programme appelé Curl.
OK?
Donc, c'est quelque chose que vous pouvez exécuter à votre ligne de commande Mac OSX ou dans le
appareil ou autre.
Et si je ne Curl HTTP google.com, Je vais voir le code HTML.
Et c'est, en toute équité, tout le HTML qui vous indique sorte de à
rediriger vers www si votre navigateur ne gérer automatiquement le
redirection.
>> Donc, ce n'est que HTML, mais je vais à ajouter à ce trait d'union Détendez-je pavillon.
OK?
Et cela va montrer me les en-têtes.
Donc, c'est aussi de l'information qui vient à travers quand je reçois cette réponse.
OK?
>> Donc, en haut, vous voyez ce HTTP 301 se déplacent en permanence.
Et c'est assez important parce cela fait référence à l'aide du code d'état.
Ainsi, la 301 ici est le code d'état, qui est fondamentalement juste un nombre entier
qui raconte le navigateur ou celui qui est cette lecture, si vous prétendez que
vous êtes un navigateur et que vous voyez ce, essentiellement maintenant si vous regardez
que et vous voyez une 301, vous savez que j'ai de faire quelque chose de spécial sur la base de
301, ou quelque chose de spécial s'est passé sur la base de la 301.
Alors il dit s'installe définitivement.
>> Et puis, au fond, nous avons un tas de paires clé-valeur.
Nous obtenons donc l'emplacement est www.google.com.
Et puis type de toutes ces autres choses, mais fondamentalement, ce que l'emplacement est
énonciation est le nouvel emplacement est à l'adresse www.google.com.
Alors maintenant, si vous allez à google.com, vous aurez sorte de voir le genre de clin de navigateur
pour une seconde, puis vous redirigera retour à www.google.com.
Ainsi, les réponses peuvent contenir ces en-têtes.
>> Et un certain nombre de choses à souligner.
Donc, disons que nous avons fait avec succès à visiter une page web.
Donc, laissez-moi aller à -
ce qui est un bon site web?
Je suis mal à penser le bien sites sur place.
>> PUBLIC: Wikipedia.
>> KEVIN SCHMID: OK.
Faisons Wikipedia.
Donc ici, je suis ému.
Oh, attends.
Étais-je?
Oui, je l'étais.
OK.
Donc, je dois faire www.
Donc, je vais faire www.
Et comme vous pouvez le voir, ici c'est tout le HTML que le navigateur traiterait
pour Wikipedia.
>> Mais si je continue à faire défiler ici, ce que je vais voir en haut -
wow, il ya beaucoup de HTML sur Wikipedia -
mais ce que je peux voir en haut ici est ce code, par opposition à la 200 d'état
301 que j'ai vu auparavant.
Et remarquez qu'il a une belle OK amical à côté de lui.
Donc, c'est comme le bon code d'état.
>> Est-ce que le numéro 200 semble familier?
Oui parce que quand je l'ai simpler.js, J'ai écrit une 200 il.
Donc, c'est essentiellement que dire la navigateur ou celui qui essaie de se rendre à
ce qu'ils ont réussi.
Ou ce genre de nous comme ont réussi aussi.
>> Et il ya ce genre de syntaxe spéciale en Javascript pour déclarer une
carte de ces touches comme type de contenu et ces valeurs comme texte brut.
Donc, si vous regardez la réponse que nous de rentrer de Wikipedia avant, -
Je vais essayer de faire défiler un peu plus vite -
vous avez ces touches comme serveur et ces valeurs Apache.
Donc, vous avez les clés et les valeurs.
Et vous pouvez le spécifier dans Nœud quoi renvoyer.
>> Donc, c'est en fait assez, dans certains moyens, et à certains égards, il n'est pas
vraiment, mais c'est un peu plus bas niveau que le code PHP que vous seriez peut-être
écriture pour P fixé sept parce que PHP et Apache sorte de prendre soin de certains
de ces choses pour vous.
En PHP, vous pouvez remplacer la valeur par défaut comportement en écrivant vos propres têtes.
Mais pour les fins de la présente, nous obtenons d'écrire nos propres têtes.
>> Donc, est-ce que la ligne de sens de tout le monde, la ligne de tête d'écriture?
OK.
Impressionnant.
>> Alors ce que je fais, c'est que je finis la réponse en disant bonjour monde.
OK.
Mais c'est juste une fonction appelé gestionnaire de requêtes.
Alors maintenant, j'ai fait de sorte de faire quelque chose avec cette fonction, non?
>> Alors, voici ce que je fais est il est ce ligne qui fait égaux serveur var
HTTP.create serveur, puis je passer dans le gestionnaire de demande.
Donc, c'est un peu le nœud moyen de créer un serveur.
Et remarque que je suis de passage dans le gestionnaire de demande.
Donc, ce dit la createServer fonction que je veux que vous me faites une
serveur, et lorsque le serveur reçoit une réponse, j'ai besoin que vous appelez cette
demander fonction de gestionnaire.
OK?
>> Alors que la ligne à peu près termine immédiatement.
Ainsi, la ligne de serveur var est bien fait après vous faites cela assez bien.
Je veux dire, il doit mettre en place une interne état de savoir que vous auriez à
appeler cette fonction demande du gestionnaire, mais il ne va pas rester là et
par exemple a l'utilisateur envoyé moi encore une demande?
A l'utilisateur m'a envoyé une demande encore?
Donc, il ne bloque pas.
OK?
>> Donc ce que cela va faire, c'est qu'il est fondamentalement stocke désormais un pointeur vers ce code,
cette fonction de gestionnaire de requête, puis se déroulera ce code lorsque quelqu'un
formule une demande.
Et puis nous faisons server.listen.
>> 1337, il est assez arbitraire.
Je n'avais aucune raison particulière pour prélever de ce nombre.
Il était totalement aléatoire.
Mais qui spécifie uniquement le port.
Ainsi, la plupart des serveurs Web vous verrez qu'ils utiliser le port 80, car c'est le genre
de comme la convention.
Donc, si je vais à quelque chose comme: Je ne sais pas, Wikipedia.org,
et je mets deux points 8 -
oh wow, vous ne pouvez pas le voir.
Je suis désolé.
Mais si je fais Wikipedia -
Je vais écrire ici juste pour que il est clair sur la caméra.
Mais si je prends ce dans un navigateur avec un colon 80, qui spécifie aller à
Wikipedia.org sur le port 80.
Donc, c'est comme la façon dont les États-Unis plusieurs ports comme l'endroit où vous pouvez expédier
choses à type de.
Donc, c'est comme aller à ce particulier placer sur ce serveur.
OK.
>> Alors j'ai juste choisi 1337.
Il ya toute une série de numéros que vous pouvez choisir.
Ce n'était pas tout à fait spécial.
>> Mais ce que je vais faire maintenant c'est que je vais courir Node.
Permettez-moi de réellement entrer que quelques lignes vers le bas de sorte que vous pouvez le voir.
Je vais faire de nœud, et je suis va courir simpler.js.
Et nous allons parler de la façon d'obtenir Noeud mis en place en un peu.
Mais maintenant, il est juste de lancer le serveur.
>> Donc, une chose que nous pouvons essayer qui ne peut pas être excitant est que nous pouvons effectivement
essayer d'y accéder en boucle.
Donc, je peux faire Curl, et mon machine hôte local.
Vous verrez également ce écrit comme ceci parfois.
Hôte local et 127.0.0.1 sont gentils comme votre ordinateur à la maison.
Donc, c'est comme parler à votre propre ordinateur.
OK.
>> Et puis je peux dire 1337.
Donc, si je lance cette ligne de code, il dit bonjour monde.
Et si je voulais voir ce genre de choses que eu moins de type de contenu simple ou
que ce soit, je ne pouvais même mettre cela ici.
Et remarquez qu'il ne dit OK.
Et j'ai le texte brut.
Et puis il ya genre de tous ces autres choses que Node ajouter dans
là pour moi.
C'est pas super important.
>> Je veux dire, il ya une sorte de technique aspects de à qui sont un peu
cool de parler, mais juste pour montrer vous, j'ai aussi le pouvoir de
changer ces autour.
Donc, je peux juste ajouter un tas des trucs comme ça.
Et puis maintenant, si je regarde dans mon sortie, il sera que.
Ainsi, ces têtes signifient certaines choses aux navigateurs et des choses comme ça.
>> Et en-têtes peuvent essentiellement dire à un navigateur comment répondre à quelque chose.
Si vous avez déjà entendu parler de cookies avant, ou si vous avez jamais été ennuyé
par une page web mise biscuits, ou transformé sur le bloc de biscuits ou
quelque chose comme ça.
Vous pouvez effectivement créer des cookies dans ces en-têtes.
Alors, ils disent un navigateur comment comportement dans certains cas.
OK.
>> C'était donc simpler.js.
Quelqu'un at-il des questions sur ce fichier de code source?
OK.
Cool.
>> Donc, nous allons supprimer le r de ce et regarder simple.js.
Donc, c'est à peu près le même programme.
Je viens d'écrire un peu différemment parce que je voulais faire un tri de clou
certaines fonctionnalités de JavaScript.
>> Donc remarquer que le gestionnaire de demande fonction a totalement disparu.
Oh oui, avez-vous une question?
>> PUBLIC: Ouais, les arguments qui sont transmis à qui
fonction, quels sont-ils?
>> KEVIN SCHMID: Donc, ce sont Objets JavaScript.
Dans la documentation Node.js, il dit essentiellement ce que les méthodes sont
disponible sur eux.
Nous arriver juste pour avoir l'accès à cette méthode appelée tête d'écriture et à la fin
et des trucs comme ça.
Mais il ya tout un tas plusieurs méthodes.
>> Et par exemple, comme l'un d'eux en particulier sur rec, vous pouvez faire
quelque chose comme rec.method qui sera vous dire si c'est obtenir un serveur HTTP ou
demandes HTTP POST et des choses comme ça.
Donc, il ya toutes sortes de différents propriétés, mais ils sont tous les deux
JavaScript objets, et ils ont juste fonctions attachées à ceux qui vous
peut écrire des choses à.
OK?
>> Donc remarquer que gestionnaire de requêtes totalement disparu.
Mais le code que j'avais en demande gestionnaire est toujours là.
J'ai encore ce res.writeHead et j'ai toujours ce res.end.
Et que ceci est un exemple de dans JavaScript est cette idée d'un
fonction anonyme.
et anonyme est comme un nom qui convient pour lui, car il ne littéralement
avoir un nom.
Il n'y a pas demande de fonction gestionnaire là.
>> N'a pas de nom, mais il reste est de prendre un argument.
Alors je me suis toujours rec et res.
Et j'ai encore le code.
Cela est parfaitement bien Le code JavaScript.
Donc, je peux déclarer une fonction sans donner explicitement un nom.
C'est un peu déroutant au premier abord.
Il ya des choses utiles comme que vous pouvez faire avec
ces fonctions anonymes.
Quelqu'un at-il des questions à ce sujet, ou est-ce juste OK, pour le moment,
sorte de simplement accepter qu'il va faire la même chose?
Ouais?
>> PUBLIC: Existe fonctions de première classe en JavaScript?
>> KEVIN SCHMID: Ils sont d'abord classe en JavaScript.
Et il suffit de savoir que ces concepts de passant dans une fonction anonyme comme
cela s'applique à l'JavaScript que vous peut écrire dans votre projet final pour
le navigateur web aussi.
Ainsi, par exemple, dans le code JavaScript à votre navigateur, c'est aussi un peu l'événement
entraîné dans le sens que ce que vous aurez avoir est lorsque l'utilisateur clique sur ce
bouton, je veux que vous exécutez ce code.
>> Il est donc le même genre d'idées de la côté client lors d'un clic de souris ou qu'ils
la souris sur une certaine image sur votre page Web, exécutez le code.
Cela peut s'appliquer à des serveurs.
Donc, c'est un peu comme le passionnant raison pour laquelle JavaScript est vraiment
personnes aptes ou certains pensent que c'est une un langage adapté à ce genre de
serveur de pilote de l'événement parce que vous avez ces fonctions anonymes.
Vous avez l'idée de ce code asynchrone.
OK.
Quelqu'un a des questions?
>> OK.
C'était donc simple.js.
Alors regardons un plus ou un couple plus.
C'est donc sleep.js.
Alors est quelqu'un familier avec la fonction sommeil C?
De peut-être l'une des conférences antérieures ou quelque chose comme ça?
>> Donc, fondamentalement, vous pouvez passer je pense que nombre de secondes ou si vous utilisez U
dormir un certain nombre de millisecondes ou nanosecondes.
Et dans le fond le programme s'arrêter courante pendant ce laps de temps.
Droite?
Et puis il se réveille finalement et alors il va juste continuer à fonctionner
le programme.
>> Donc, ce genre de serveur donne l'impression de dormir.
Donc remarquerez que nous avons le même res.writeHead 200 avec l'en-tête en tant que
avant, mais nous demandons ce fonction appelée ensemble timeout.
Définir le délai est également disponible en votre navigateur web Google Chrome
ou Safari ou autre.
Et au fond ce qu'il fait ici est ça prend dans une fonction.
Avis, encore une fois, c'est une fonction anonyme.
Donc, c'est plutôt cool parce que nous sommes en utilisant une fonction anonyme dans un
fonction anonyme qui peut être un peu bizarre.
>> Mais ça prend cette fonction, qui est essentiellement dire - et la façon dont cette
œuvres est en 5000 millisecondes, je veux d'exécuter cette fonction qui
se termine juste la réponse et écrit hey.
Donc, ce qui donne l'impression de comme dormir, mais la manière dont cette réalité
fonctionne, c'est que nous allons nous lancer dans cette ligne très rapidement.
Nous sommes en train d'écrire quelque chose.
Et puis nous allons aussi parcourons cette ligne très rapidement.
Donc, nous ne sommes pas réellement aller attendre cinq secondes.
Nous allons juste à courir ce code instantanément.
>> Et puis il ya, encore une fois, ce petit boucle d'événements qui a maintenant cette chose
registres qui est fondamentalement juste constamment tourner en un cercle
et en regardant l'horloge en un seul fil et dit, a cinq secondes
encore passé?
Et puis quand il voit que la deuxième main a bougé comme cinq secondes ou
que ce soit, il se réveille et dit, oh, que dois-je faire?
Oh, je dois exécuter ce code.
Et puis il va exécuter res.end hey.
>> Encore une fois, nous ne sommes jamais attendre ici.
Donc ce n'est pas que ce code à l'intérieur de cette fonction va prendre cinq
secondes pour courir.
Ce code sera exécuté à peu près instantanément, au moins par rapport à
les cinq secondes nous parlions tout à l'heure avant.
>> Il suffit donc de montrer en action, Je peux faire Node.sleep.js.
Et ai-je gâcher quelque chose?
Peut-être.
Désolé.
Voyons ce que nous pouvons faire pour résoudre ce problème.
OK.
Donc certainement utiliser Node.js.
Je plaisante.
OK.
Juste une seconde.
OK.
Je sais ce que c'est.
>> Donc, le problème est que dans mon autre onglet ici, je courais Noeud déjà
cette même adresse, 1337.
Donc l'erreur que cette jeté, si nous regardons à ce réel de près, est l'adresse en
utiliser, EADDRINUSE.
Donc j'utilisais déjà 1337 ici.
Donc, si je ferme cette session, puis-je maintenant essayez d'exécuter ce, espérons-le, tout
sera bien.
OK.
Donc, vous ne pouvez avoir une sorte de chose de l'écoute sur un port à la fois.
Une autre solution aurait été pour moi juste modifier ce programme et de faire
il sera comme 1338 ou quelque chose comme ça.
>> Mais maintenant, le sommeil est en cours d'exécution.
Donc, nous allons effectivement essayer dans la navigateur pour le moment parce que c'est un
peu sans intérêt à voir dans un terminal.
Donc, je vais juste aller à cette 127 adresse à nouveau à 1337.
Et si vous pouvez le voir -
Je ne sais pas si vous le pouvez - mais mon navigateur prenant une très, très longue
de temps à charger ou comme cinq secondes.
>> Et puis après, il a finalement terminé la réponse.
Et vous ne pouvez pas le voir parce que la chose est déplacé sur un peu, mais si je fais
ce un peu plus petit, vous peut voir qu'il dit hey.
Alors, j'ai fait le bon, mais après cinq secondes.
Et il pourrait être un peu plus propre à voir ici sur le terminal, donc je suis
va faire un -
faisons ici -
Faisons Curl cette adresse à nouveau avec le 1337.
Et je n'ai sorte de juste s'asseoir ici pendant cinq secondes.
Mais notez que le serveur peut accepter de nouvelles réponses.
Il imprime donc bon.
>> Et de faire la démonstration ce, essentiellement ce que Je peux faire dans cette autre onglet -
alors disons que je fais cela dans un autre onglet, Je vais faire Curl et la même
chose de nouveau.
Et je vais essayer de tirer les gars débarque dans le même temps.
Donc, je vais le faire, et je suis va courir ici et je suis
va le faire à nouveau.
>> Et nous allons faire en sorte que vous peut voir les deux.
C'est un bon imprimé et que l'on imprimé hey tout le chemin à -
Faisons à nouveau cette expérience.
En fait, nous allons utiliser cette tromper, si c'est OK.
>> Donc, je vais utiliser une chose shell me permet de courir essentiellement deux copies
de ce programme en parallèle.
Donc, il va courir le premier programme et le deuxième programme en parallèle.
Alors maintenant, si j'appuie sur Entrée, ça va en faire la demande à peu près
instantanément en même temps.
Donc, nous allons donner à ce coup.
>> Alors maintenant, notez qu'il dit deux processus.
Et si vous êtes curieux, que 27 000 nombre est essentiellement l'ID de processus.
Et puis remarquent, ils ont imprimé hé en même temps.
Ce n'était pas comme nous avons dû attendre cinq secondes pour un et puis après,
Cinq secondes plus tard obtenir le deuxième.
Donc, c'est en quelque sorte, à certains égards, c'est pas vraiment des preuves, mais il est
évidence intuitive que ce n'est pas seulement comme attendez cinq secondes, bloquant
l'ensemble du fil.
OK cool.
>> Aaron a posé une question plus tôt que était, bien que si nous ne faisons rien -
Ouais?
>> PUBLIC: Attendez.
Comment est-ce différent de tampon de printf, si?
N'est-il pas faire automatiquement?
Pourquoi avons-nous à vous en préoccuper?
>> KEVIN SCHMID: Oh, pourriez-vous dire que une fois de plus?
>> PUBLIC: N'aime pas le tampon de printf faire exactement la même chose?
>> KEVIN SCHMID: Le tampon de printf?
>> PUBLIC: Ouais.
OK.
N'était-ce pas dans l'un des questionnaires qu'ils étaient parler de la façon si vous droit printf
quelque chose et ensuite le faire arrêter un deuxième, et puis vous avez dix boucle
fois, il va attendre dix secondes alors printf tout ensemble?
>> KEVIN SCHMID: Oh, OK.
>> PUBLIC: Est-il en train de faire la même chose, alors dans ce cas?
>> KEVIN SCHMID: Donc la question était essentiellement dans l'un des anciens quiz
ou quelque chose, il y avait une question qui fondamentalement, si vous dites impression f 10
choses à la fois et puis dormi comme dans le processus d'impression à ceux qui,
à la fin pour une raison quelconque, il serait simplement vider les tous sur l'écran.
Donc, il ya deux différents types de concepts ici.
>> Donc je suppose une chose, c'est que, dans ce cas, nous avons affaire à deux différents
genre de personnes demandant le serveur pour des choses en même temps.
Et la raison pour laquelle le type de printf attend comme ça et décharges tout ça
à la fois est plus liée à comment printf sorte de -
donc la façon printf est en fait mis en œuvre, c'est qu'il a essentiellement pour
parler du système d'exploitation pour écrire ce genre de choses à la console.
Donc, il ne veut pas faire tout cela trucs immédiatement lorsque vous dites printf
une chaîne de caractères, car qui pourrait coûter cher si elle doit
faire à chaque fois.
>> Donc, si vous faites printf hey, votre programme peut-être pas fait imprimer que
immédiatement à la console.
Il pourrait dire, OK, je l'ai écrit.
Et puis sorte de vous attendre à donner un peu plus avant de réellement
en les écrivant dans la console.
>> Donc la raison que c'était le cas -
et c'est le genre de non liée au sommeil -
est que le sommeil était une sorte de juste injectée là pour démontrer la
fait qu 'il n'est pas écrit elle de façon synchrone.
Mais la raison en est tout simplement la performance de sorte que vous n'avez pas à
faire que plusieurs contacts à le système d'exploitation.
>> Mais ici, ce que nous essayons vraiment de faire avec cette chose de sommeil est juste spectacle
que lorsque nous avons deux personnes qui visitent ce site, il ne va pas mettre
eux dans une ligne où il va dire Je dois vous aider, et puis quand je suis
totalement terminé, vous aider après ces cinq secondes, puis je vais
passer à la personne suivante.
Donc, la demande de la première personne ne attacher la boucle d'événements
si cela fait sens.
>> Mais ici est en fait un exemple de quelque chose qui va lier
la boucle d'événements.
Alors, voici une fonction horrible calculer la nième Fibonacci.
C'est littéralement la pire façon possible calculer le nombre de Fibonacci nième.
Et c'est en fait juste de reconnaître d'où ça vient,
il ya en fait -
Je veux dire, vous pouvez essayer d'aller le trouver - mais il ya comme une très longue Blog
poster que quelqu'un a écrit.
C'est comme une de ces choses Reddit.
Mais quelqu'un a critiqué Node.js, et ils ont utilisé cela comme un exemple.
Donc j'ai un peu envie de vous montrer que deux différents points de vue juste pour obtenir
une compréhension générale des concepts derrière ces deux choses.
>> Mais il est choisi comme juste un horrible, calcul terriblement inefficace
de manière intensive pour calculer la nième nombre de Fibonacci.
Ainsi, tout comme une note côté, pourquoi est- il horribles comme une façon?
Ouais?
>> PUBLIC: Disons que vous commencez avec 1000.
1000 se divise en 999 et 998.
Chacun de ce se divise en deux choses.
>> KEVIN SCHMID: Droit.
>> PUBLIC: Tout le chemin vers le bas.
>> KEVIN SCHMID: Exactement.
Il suffit donc de répéter pour la caméra, si je appeler fib sur 1000 ou quelque chose comme
comme ça, ce n'est évidemment pas moins de ou égale à un, donc je vais
aller à cet autre cas, et puis je vais d'appeler fib 999, plus fib 998.
Et puis à peu près tout de ce travail qui FIB 999 ne fait
type de ce niveau.
Si vous allez vers le bas, il est encore plus redondant que cela, mais si vous venez de
pense fib calcul 998 reçoit nous assez proche de FIB 999.
Donc, nous devrions vraiment être un peu plus intelligent sur la façon dont nous sorte de réutiliser
ceux-ci, mais nous ne sommes pas réutiliser ces choses à tous.
Alors vous pouvez imaginer ce gigantesque, arbre gigantesque qui est tout simplement horrible.
>> Mais de toute façon, OK.
C'était donc fib.
Il faut du temps pour s'exécuter.
Ouais?
>> PUBLIC: [inaudible].
>> KEVIN SCHMID: Oh, pourriez-vous répéter la question?
>> PUBLIC: [inaudible].
>> KEVIN SCHMID: Oh si ce n'est que le code que ça va être une sorte de sur le
côté serveur.
Donc, cela ne va pas être trouvé dans le navigateur ou quoi que ce soit.
C'est essentiellement ce que nous avons est que lorsque l'utilisateur ici à peu près marques
leur demande de nouveau, quand nous sorte de faire une demande, nous allons appeler
cette fonction sur le côté serveur.
Et puis nous aurons le résultat de retour d'appeler cette fonction.
Et puis nous allons imprimer à l'utilisateur.
Ainsi, l'utilisateur ne traite pas vraiment avec cette fonction trop.
>> Était-ce la question?
Cela fait-il sens?
OK.
Cool.
>> Encore une fois, nous faisons tout ce res.writeHead chose où nous imprimons
l'en-tête.
Et puis je finis la réponse en faisant le nombre magique est fib 45.
Alors disons simplement exécuter ce serveur.
Donc, je vais faire un nœud fib.js.
Alors maintenant, mon serveur de fib est en cours d'exécution.
>> Et puis ici, je vais de faire un de ces.
OK?
Donc, je vais juste dire, Curl.
Donc ça va prendre un peu de temps mais bientôt je l'espère, il va finir et
il affiche cette 45e Fibonacci nombre.
>> PUBLIC: [inaudible].
>> KEVIN SCHMID: Il devrait se fait assez rapidement.
Donc, il devrait prendre de cinq à six secondes.
Je ne sais pas ce que c'est juste V8 être super rapide, mais dans tous les cas, il s'agit d'un
très court exemple et à dessein inélégant d'un non-trivial
calcul.
Ainsi, après un certain temps, il ne se présente.
>> Mais maintenant, si je fais le même genre de expérience comme avant où je fais
deux demandes en même temps?
Donc ici, je vais à un Curl sur cette adresse, et je vais
faire un autre Curl.
Et rappelez-vous, quand nous l'avons fait pour la dormir serveur, lorsque nous avons eu essentiellement,
après cinq secondes, ils ont pas mal beaucoup tous deux venus arrière droit
dans le même temps.
Donc, il n'était pas particulièrement attaché.
>> Mais essayons maintenant.
OK, donc nous avons eu nos deux processus.
Rappelez-vous que ce sont les ID de processus.
Cela va être un peu maladroit tandis que nous piétinons.
Donc, nous allons rester ici et attendre.
>> Alors l'un d'eux doit venir de retour après comme -
OK, donc on est revenu.
Mais alors pourquoi ne pas le second un come back pour l'instant?
Ouais?
>> AUDIENCE: Le serveur ne peut pas faire n'importe quoi alors qu'il est le calcul de ce grand nombre.
>> KEVIN SCHMID: Droit.
Donc, la réponse était juste que le serveur ne peut vraiment pas faire quoi que ce soit tout
c'est le calcul de ce nombre de Fibonacci.
Alors maintenant, je viens de recevoir mes deux les choses.
Mais je suppose que de penser à tout le code un peu plus, comment ça marche
et tout.
>> Donc, cette fonction ici est le code qui J'ai dit à ce serveur à courir quand il
reçoit une nouvelle demande entrante.
Donc, il va tout simplement de courir à travers ce code complet, puis il va aller
revenir à la boucle d'événements, puis continuer vérification des nouveaux événements.
Donc, fondamentalement, ce que nous avons passe est le serveur est
écoute pour de nouvelles choses.
La première personne demande ce 45 est.
Nous courons le code de la calculer.
Ce code prend environ cinq six secondes pour courir.
Ensuite, nous revenons à la boucle d'événements et vérifier les nouvelles demandes.
>> C'est donc un exemple de la façon dont, si vous des choses qui sont soi-disant calcul
lié, ou utiliser beaucoup de calcul, pas le pouvoir, mais comme sont
calcul intensif -
Je pense qu'une chose à dire à ce sujet est que cette fonction est fait en totalité,
la plupart du temps, assez droit de travail utile.
Pendant tout le temps que ce rappel fonction a été lancé, il était assez
beaucoup passer la plupart de son temps juste informatique numéro nième de Fibonacci.
>> Mais nous avions seulement un fil à traiter.
Dans le modèle Apache, lorsque deux personnes fait la demande pour obtenir fib 45, nous
aurait eu deux fils différents.
Et puis l'emploi de système d'exploitation aurait été, ou le niveau de l'utilisateur
code qui gère les fils, l'aurait fait consiste à diviser que sur la
CPU, ou même si vous aviez plusieurs processeurs, distribuer uniformément sur le CPU
de sorte qu'ils étaient tous les deux fini à peu près en même temps.
>> Donc, juste pour vous montrer comment nous pouvons trier du - et ce n'est pas un parfait totale
solution, mais sorte de comment nous pouvons faire une revenir ici et faire
un peu mieux.
Donc ce que j'ai ici est un programme appelé Fib C. Et ce utilise essentiellement
un autre des modules de noeud appelé Le module de traitement des enfants.
J'ai donc inclus que dans le genre haut des que je ferais un livre inclure
process.h des enfants ou quelque chose.
Maintenant, j'ai accès à cette variable de CP qui a toute ma fonctionnalité.
>> Alors maintenant, ce que je fais dans cette réponse gestionnaire est j'exécute ce programme
point slash fib 45.
Donc ce que j'ai fait - et je vais de sortir de ce programme pour un
peu -
c'est que je l'ai écrit un programme en C qui calcule essentiellement le
nième nombre de Fibonacci.
Alors, voici juste un programme que j'ai écrit en C qui calcule ce.
Je peux le compiler, et je peux courir il à la ligne de commande.
Et il va calculer le Nombre 45e Fibonacci.
>> Donc, il faut juste remarqué à peu près aussi longtemps.
Je pourrais probablement utilisé dash 03 à optimiser ou quelque chose comme ça,
mais je l'ai fait comme régulière paramètres du compilateur.
Et il imprime-le.
>> Mais maintenant, ce que je sorte de faire?
Oh désolé, mauvais fichier.
Donc, je fais la même chose avec l'en-tête avant.
Ensuite, je fais ce cp.exec.
Donc ce que cela va faire, c'est que c'est va exécuter ce programme.
Mais la façon dont cela fonctionne est que ça ne va pas attendre
ce programme à la fin.
Il dit juste fondamentalement exécuter ce programme.
Donc, fondamentalement, ce type dans le commander genre invite de.
>> Et puis, quand vous avez terminé avec il, exécutez cette fonction.
Alors maintenant, nous recevons ce genre de chose tout restauré
comme nous ne sommes pas en attente.
Est-ce que ce genre de sens?
Ouais?
>> PUBLIC: [inaudible]?
>> KEVIN SCHMID: Donc ce sera effectivement ouvrir un nouveau processus pour le faire.
Donc, c'est en fait, à certains égards, mal, pas super mal, mais il est
important de dire que c'est une sorte de revenir à, d'une part, l'Apache
modèle où nous faisons threads et processus pour chaque demande ou
procédés pour chaque demande.
Donc c'est un peu analogue à ce que fait Apache.
Dans certains cas, il suffit d'utiliser une nouvelle fil, qui est un peu plus de lumière
poids d'un processus, mais Apache pourrait finir bifurquer un nouveau processus
qui est une sorte de ce que nous faisons ici implicitement en faisant point barre fib 45.
>> Et alors dans ce cas, nous sorte de encourons les mêmes dépenses de processus.
Donc, c'est juste une chose que vous pouvez faire.
Mais juste pour montrer ce genre de course.
Et ce discours est vraiment destiné à présenter ce genre de programmes en
manière de montrer différents points de vue sur la façon de concevoir des serveurs comme ça.
Donc, cela est en cours d'exécution, puis maintenant, si je fais cette fois, j'ai eu deux ID de processus.
>> Parlons peu près choses à remarquer.
Donc remarquent qu'ils sont progressivement.
C'est cool.
Parce que c'était 27 122 avant.
Mais remarquez maintenant, ils sont revenus à peu près au même moment.
>> Et maintenant, une bonne question à poser à propos de pourquoi est-ce que l'affaire est, dont le travail
était maintenant en quelque sorte de faire ces choses sorte de fair-play à chaque
d'autres, ces deux instances de point barre fib 45 que j'ai couru
ou que Node ran?
Qui sorte de fait-il juste que les deux se genre de pondérées moment de l'exécution?
>> PUBLIC: [inaudible].
>> KEVIN SCHMID: Ouais.
Donc, fondamentalement, quand je fais point barre fib 45 ou quelque chose comme ça, il est maintenant
de sorte à le système d'exploitation à gérer l'exécution de ces programmes.
Et maintenant, il peut les programmer sur les processeurs différent ou
peut les programmer.
Il peut découper le temps que l'on CPU est ou qu'ils obtiennent
pour fonctionner sur un processeur.
Donc, c'est l'idée derrière cela.
Cela fait-il sens à tout le monde?
Alors maintenant nœud n'est pas vraiment joue un participer à diviser ces tâches.
OK.
>> C'est donc presque pour des exemples.
Je voulais juste montrer une chose parce que beaucoup de ce a été jusqu'ici
pas totalement super-pratique dans certains cas.
Je peux imaginer rentrer à la maison après cette parler et quelque chose et dire comme,
bien que je sorte de suis sorti de cet entretien que Je peux faire un serveur de Fibonacci pour
mon projet final.
Alors, voici en quelque sorte d'un exemple plus qui, nous l'espérons être -
peut-être pas, mais peut-être - un peu plus sorte de rapport avec les projets définitifs et
penser à l'avenir pour des choses comme ça.
>> C'est donc chat.js.
Donc c'est un peu comme certains échantillon code côté serveur que vous pouvez utiliser pour
mettre en place un petit serveur de chat comme vous avez pu voir sur le
Facebook Chat ou autre.
Donc, je ne dis pas que c'est comme Facebook Discute, mais c'est un peu
comme un bon - peut-être pas bon, mais peut-être point de départ pour un chat - bon
serveur pour votre site web pour un projet final.
Alors regardons ce qu'il fait.
>> Nous allons donc faire cette chose spéciale au sommet, ce Var SIO
égaux nécessite Socket.IO.
Donc, c'est une autre chose que ce n'est pas fait venir livré avec
Noeud mais vous pouvez l'installer.
C'est un module Node.
Donc, c'est juste comme une extension à nœud.
>> SocketIO est effectivement très plutôt cool.
C'est une abstraction que, fondamentalement, ce il ne fait que dire qu'il vous permet de
avoir ce flux de communication entre une bande
navigateur et un serveur Web.
Donc, pour la plupart, à ce jour, nous avons eu ces très rapide une seconde ou deux
les communications entre une seconde bande le navigateur et le serveur Web.
Donc, c'est essentiellement aller à google.com, get le truc, le renvoyer, puis
nous aurons terminé.
Nous ne sommes jamais à parler jusqu'à ce que le types d'utilisateur dans quelque chose d'autre.
>> Mais ce Socket.IO et même genre de choses - et SocketIO est en fait un
des choses qui est construit en tant que WebSocket qui est une sorte de disponible
dans le cadre de HTML5 -
qui vous permet d'avoir ce la poursuite du dialogue.
Et ceci est très utile dans un serveur de chat genre de chose, car il est
un peu comme un dialogue continu dans certains égards, parce que si vous discutez
avec quelqu'un, vous pouvez maintenant, envoyez simplement un un message dans le tuyau, puis le
serveur peut envoyer un message en bas de la tuyau à l'autre personne que vous êtes
bavarder avec.
Et puis vous pouvez avoir cette échanger comme ça.
>> Donc, c'est le genre de ce que SocketIO est bon pour.
La raison pour laquelle SocketIO utilise WebSockets comme une chose, c'est que dans
Outre tout simplement vieux WebSockets, il fait aussi quelques astuces pour l'essentiel
rendre navigateur compatible.
Donc navigateurs comme Internet Explorer malheureusement, ne supporte pas les WebSockets
dès la sortie de la boîte.
Donc, il utilise un autre type de frais soignée choses avec Adobe Flash pour permettre
vous avez le soutien du navigateur croix.
Donc, c'est vraiment utile.
>> Et en fait, je sais que je suis une sorte de fonctionnant sur le temps ici, mais CS50
Discuter, avez-vous jamais vu quelque chose comme, je ne sais pas, ébauche est ainsi et ainsi
répondre à ce message ou quelque chose comme ça, cette fonctionnalité?
C'est SocketIO.
Alors, quand quelqu'un commence à taper dans le boîte discuter pour faire une réponse ou
quelque chose, votre navigateur ne ce qui est appelé dans SocketIO émet une sorte de
Si quelqu'un est dit répondre à ce message.
>> Ensuite, le serveur dit, OK, que dois-je faire?
Eh bien maintenant, je dois dire à ces autres gars qui sont sur CS50 Discutez recherche
à ce poste que quelqu'un a répondu.
Donc, c'est le genre de ce qui est SocketIO bon pour ce genre continue de
flux de dialogue.
OK.
>> Donc ce que j'ai ici - et nous sommes juste va ignorer le tableau de connexions
pour un peu -
ce que je fais c'est que je ne l'écoute l'autre.
Donc, c'est juste la façon Socket.IO est disant écoutons sur ce port.
Et puis je fais ce lors de la connexion.
Donc, c'est juste fondamentalement Socket OI façon de dire, lorsque nous recevons une
égard, je vous veux Pour exécuter ce code.
>> Et remarquez qu'au lieu d'avoir rec res et passés là j'ai Socket.
Et cette idée de Socket est fondamentalement ce chose que vous pouvez lire et écrire
de celle a l'utilisateur de messages peut-être.
Et les messages que vous souhaitez envoyer peut passer par ce Socket.
Cela fait-il sens?
C'est donc cette chose continue.
>> Donc ce que je fais est que j'appelle Socket.emit.
Et émettent prend assez beaucoup deux arguments.
Le premier argument est une chaîne juste représentant le type d'
chose que vous êtes d'émission.
Donc, pour ce cas, je n'ai utilisation cette chaîne un nouveau message.
Et c'est juste en disant essentiellement que le type de cette chose, ce que je suis
envoi, est un nouveau message.
Ainsi, vous pouvez écouter pour des types spécifiques comme un nouveau message ou quoi
en utilisant le point.
>> Donc, la connexion et l'utilisateur envoyés là-bas, si vous regardez où nous appelons point sur,
ce sont les autres chaînes qui représentent les types de messages d'utilisateur.
Il est donc, fondamentalement, vous pouvez avoir cette émettent l'un de ces types de messages, et
puis faire quelque chose en réponse à l'un de ces types de messages
>> Je suis donc émettre ce nouveau message.
Nous allons ignorer connections.push pour une seconde.
Mais alors je dis, l'utilisateur Socket.on envoyé.
Alors maintenant, il est un peu comme lorsque l' l'utilisateur envoie-moi un message, je veux
d'exécuter ce code.
Et remarquez que cette fonction anonyme est prise dans cette variable
appelé données qui est essentiellement vont d'avoir le message de l'utilisateur.
>> Le genre de Alors maintenant laisser de parler le tableau de connexions.
Donc, cela est conçu pour un client de chat où fondamentalement tout le monde est un peu en
la même salle de chat.
Donc, fondamentalement, ce que nous devons garder autour s'agit d'un tableau que, fondamentalement,
représente tous les gens qui bavardent dans certains égards, si cela fait sens.
Droite?
Parce que nous avons besoin de savoir qui sont ces gars sommes afin que nous puissions leur envoyer des messages
que d'autres personnes nous envoient.
>> Alors, que fait ce code est lorsque l'utilisateur envoie un message - c'est le type de
l'événement -
nous allons exécuter ce code.
Et ce que nous faisons, c'est que nous courons à travers ce tableau que nous avons appelé les connexions.
Et à peu près à chaque connexion sauf celui qui est le nôtre, c'est
ce que dit ce code, nous enverrons un nouveau un message à ce message attaché
information.
>> Donc, si vous remarquez ici, ce que j'ai fait quand l'utilisateur effectue en fait une nouvelle
connexion est j'ai ajouté à la Procédé JavaScript.push, c'est
fondamentalement juste dire comme ajouter que Socket comme une valeur en
notre connexions réseau.
Alors maintenant, quand ce code s'exécute, elle est envoyer des choses à ceux particulier
connexions.
Donc cela peut être un bon point de départ de réalisation d'un serveur de chat
ou quelque chose de semblable.
>> Et le genre de truc cool, c'est que la code que vous voyez ici pour comme sur et
émettent et des trucs comme ça, c'est la même sorte de code JavaScript que vous le feriez
écrire dans le navigateur d'interagir avec le serveur.
Voilà pourquoi SocketIO est une sorte de propre et utile dans ce sens.
>> Oh et encore une chose très vite.
Il y avait un projet final CS50 l'année dernière que, fondamentalement, mis en œuvre une conversation
serveur dans Node.js.
Je pense que c'est Harvardchats.org mais je ne suis pas -
OK.
Je ne suis pas sûr de ce que l'URL est, mais Je peux envoyer que sur la suite.
Mais c'est le genre de refroidir ce vous pouvez faire avec Node.js.
>> J'espère donc que, en général, vous les gars ont un bonne idée de ce Node.js est utile
et comment vous pourriez peut-être demander à votre projet final.
Je vais envoyer quelques-uns plus ressources avec cela.
Et je vous remercie d'être venus.
Merci.
>> [Applaudissements]