KEVIN SCHMID: Hola a tots. Benvingut al seminari CS50 en Node.js. El meu nom és Kevin. Sóc TF CS50. I jo sóc una espècie de molt emocionat sobre aquest seminari. Crec Node.js és molt cool. Espero que aquest seminari es pot utilitzar com un bé, suposo, trampolí per alguns dels seus projectes de final si vostè està interessat en l'ús de una mena Node.js. Tindrem sort de començar el seminari fos per parlant només d'una mica de la tipus de fons escalabilitat perspectives de Node.js, a continuació, anem a passar a alguns exemples de codi. I vaig a tenir el codi en un lloc web, i es pot veure en el codi. I després del seminari, vaig a classe de discurs sobre com es pot configurar Node.js al seu ordinador. D'acord. Així que anem a començar. Així que suposo que només volia parlar de servidors web, de veritat, en primer lloc. I per començar aquesta discussió, bàsicament, tenen un diagrama que és de el llibre de text utilitzat per CS61, que bàsicament mostra la interacció entre un procés de client, igual que la seva web explorador o com el seu client objectiu o alguna cosa per l'estil, i un servidor web. Així que aquest tipus d'aparença similar a la imatge que es va veure en conferència sobre Dimecres on bàsicament tenim una mica de procés del client com Google Chrome. I després, el pas un és el client envia una sol · licitud. Així que pot ser com a bo anem a visitar, no sé, CS50.net. Així que emetem aquesta sol · licitud. I algú recorda el nom de el protocol que especifica com sol · licitud ha d'estar estructurat? Sip. AUDIÈNCIA: [inaudible]. KEVIN SCHMID: Exactament. Així que és com HTTP, oi? Així que, bàsicament, l'especificació de la forma aquesta sol · licitud en realitat s'han d'establir cap a fora, perquè al final del dia, la sol · licitud es realment com un cadena que bàsicament diu que vull això. I l'especificació perquè és HTTP. Així que això és com un protocol. Llavors el servidor rep aquesta sol · licitud. Així que vostès tenen un servidor web instal · lat en l'aparell CS50. És Apache. I aquesta setmana, quan es treballa en un problema establir 07:00, en realitat es va a treballar amb aquest servidor web. Així que el servidor rep aquesta sol · licitud, i llavors ha de tipus de ratllar la seva cap i dir, com bé ho Què faig amb això? Així que en base al que decideixi fer, llavors potser hagi de posar-se en contacte amb algun tipus de recursos. I aquest recurs podria ser un munt de coses diferents. D'una banda, podria ser només com un arxiu HTML estàtic. Així que podria ser simplement com un HTML que és com per seu lloc web personal. Podria ser un arxiu estàtic com una imatge o com una pel · lícula que té. Fins i tot podria haver de parlar a algun tipus de base de dades com una base de dades MySQL. Així que no sempre ha de comunicar amb un recurs, però en alguns casos, és possible. Llavors, què farà després d'això és que va a tornar la resposta. I la resposta d'això és També especifica HTTP. Amb això, el client pot rebre. Es pot destrossar i processar-la. I llavors vostè aconsegueix una pàgina web com Google o CS50.net o el que vas anar a. ¿D'acord? Per tant aquesta és la interacció bàsica que estarem tractant amb. I estem més o menys serem centrant-se en aquesta part de la interacció, el servidor. D'acord. Genial. Algú té alguna pregunta fins ara? D'acord. Així com hem dit, el lloc web rep aquesta petició HTTP i després emet aquest Resposta HTTP. I com parlem abans, la Servidor web aparell CS50 és Apache. Així que quan vostès treballa a P va fixar 07:00, vostè estarà treballant amb el Servidor web Apache. Vostè mai haurà de treballar molt amb Apache directament massa. Vostè espècie de configurar Apache una mica en especificar els hosts virtuals o v els amfitrions, i ens posarem en contacte perquè d'aquí a una estona. Però, bàsicament, el servidor web Apache creat per treballar amb PHP tipus de fora de la caixa. Així que el que realment passa és quan es va a un dels seus llocs web com, per exemple, amfitrió index.php barra local o alguna cosa, és el navegador envia aquesta sol · licitud, i després d'Apache està assegut allà i s'adona que fer amb ell. I l'acció és executar aquest codi a index.php i a continuació, l'envia fora de nou. Així que cal. Així que tipus de parlat d'això. Per tant, només podria servir a un arxiu estàtic o executar algun codi PHP i després tema la resposta. Així que una pregunta comuna que pot venir up és així, com podem realment ocupem amb tenir múltiples usuaris a la vegada? Així que imagina't si estigués escrivint una web servidor, si tinguessis un servidor web que que estava intentant escriure en alguna cosa com C o alguna cosa per l'estil, bàsicament es pot pensar en com hi ha podria ser algun tipus de codi que rebria la sol · licitud, però després el que ha de fer tota aquesta feina en ell. Potser, per exemple, en contacte amb el base de dades o alguna cosa per l'estil. Cert? I llavors seria fer aquest tipus de processament i després enviat de tornada la resposta. Així que això és com l'alt visió general de nivell. Però no és immediatament obvi com pot fer això perquè dues persones o fins i tot 1.000 persones podrien treballar amb el seu servidor web al mateix temps. Així que la solució que utilitza Apache es diu fils o processos. Així que vostè pot haver sentit parlar de aquests termes abans. Està bé si vostè no té, però només pensar sobre temes o processos com a mitjans per un sistema operatiu o un programa d'usuari o una mena o un servidor web per executar espècie de múltiples coses alhora. Així que vostè pot haver escoltat el terme com fils d'execució. Així que és una mica com si estiguessis tipus de multitasca. I si t'he vist a la caixa de la seva portàtil, o alguna cosa així, multinucli, el que pot fer és que es pot executar dos fils diferents en diferents parts de la CPU perquè puguin de fet passar a la vegada. Així que això és realment de gran abast. I això és una espècie d'Apache de solució a aquest problema. Així que hi ha alguna cosa així com totes les qüestions amb aquest enfocament, encara? Així que suposo que tipus de les vaig escriure allà. Però els dos tipus de utilitzar una gran quantitat de memòria. És molt car per crear un fil o un procés. I part de la raó és que només com quan s'està executant un programa de C com el seu principal i després que les trucades altra funció, que té algun tipus de pila. Així fils també requereixen un completament pila separada que poden ser bastant grans. I si vostè pot imaginar tenir tones de els usuaris del seu lloc web, vostè hauria un munt de diferents temes. Això és un munt de piles de gestionar i mantenir. Així que és el consum de memòria de grans dimensions. I després, també, diguem que vostè té només una CPU, o diguem que vostè té més subprocessos que tingui aquests multicores. Cert? Així que anem a dir que tenia 10 temes i que només tenia cinc CPU. D'alguna manera has de fer aquesta cosa on canviar entre el corrent un que està en marxa, ja que no es pot executar en els 10 alhora. I això es diu un canvi de context. I aquest terme en realitat té un parell de diferents contextos, però anem a pensar en ell com el canvi entre dos fils. Això pot ser bastant car, perquè bàsicament el que ha de fer vostè és ha de deixar de fer el que estàs fent, guardar l' estat d'aquest fil conductor, i després canviar a un altre lloc. Així que no tothom veu la classe de la motivació de per què les discussions i processos podrien ser una mica voluminós? I vostè té una pregunta? D'acord. Genial. Algú té alguna pregunta? D'acord. Així que si fem un pas enrere per un segon, hi ha com una mena de observació que podem fer sobre una gran quantitat d'aplicacions web. I això és realment que molts d'ells en realitat no ho facis molt útil treballar a l'interior d'un fil. Així que algú s'ha iniciat a P va fixar set a absolut? Així que és el que vols per descriure potser algunes de les parts? Ha treballat en iniciar sessió o alguna cosa per l'estil? AUDIÈNCIA: No KEVIN SCHMID: OK. No importa. Ho sento. Però, bàsicament, en el conjunt P, ets estarà fent un munt de tipus de consultes a una base de dades per obtenir alguna la informació que la base de dades. I el que tu codi estarà fent, el que aquest procés Apache o aquest fil Apache estarà fent mentre que s'ha de posar en contacte amb el base de dades és que és una cosa així serà assegut allà i que serà a l'espera de la base de dades per respondre. Ara que pot no semblar tan gran la tractar pel fet que la base de dades està en el seu Aparell CS50, oi? Però hi ha una espècie de xarxa latència allà perquè ara la web servidor ha d'emetre la seva pròpia petició al la base de dades per comunicar-se amb el base de dades i després aconseguir que la informació de nou. Així que ara és com bé espérame, jo sóc anirà a buscar alguna cosa de la base de dades i després hi ha un molta espera passant. Això té sentit? I per a algunes coses no és tan dolent. Si només ha de, per exemple, memòria d'accés, que no és com latència d'E / S horrible. I quan dic, oh latència / I, ho estic referint és com qualsevol mena de d'entrada i sortida. No obstant això, per accedir a un arxiu en el disc, igual que si volia servir l'estàtica HTML arxiu que estava a la meva pàgina web o cosa així, com que ha de parar una mica, llegir aquest arxiu a des del disc i, a continuació, en aquest procés estic esperant. No estic fent un treball útil. Això no és cert del tot, però és és comú en aplicacions com P setembre 07:01 munt d'aplicacions que no ets realment fent molt pensament. I quan dic que el pensament, vull dir com el treball computacional. Així que el treball computacional podria ser alguna cosa com, per exemple, que volia escriure un servidor web que només computa l'enèsim nombre de Fibonacci. Això no sona com un tot servidor web diversió. Igual que jo no esperaria que el lloc sigui el proper Facebook, però això és una mica de tipus de treball computacional. I vostè pot imaginar que amb la substitució de algun altre tipus d'interès treball computacional. Diguem que estàs escrivint alguna cosa que calculen els graus de la separació entre dues persones o alguna cosa per l'estil. Així que sí involucra algun tipus de càlcul, oi? I tot i així, fer que vostè encara té de fer un munt d'espera per a tal vostè ha de consultar una base de dades per buscar fins qui és amic de qui o alguna cosa així. Així que no és aquest tipus de noció el treball de càlcul. Això té sentit? Algú té alguna pregunta? Ah, i suposo que em vaig posar els servidors de xat que hi ha perquè els servidors de xat són una mena de un altre bon exemple d'això. Un servidor de xat no té fer molt pensament. Només ha d'esperar perquè la gent enviar missatges i després quan ells, els envien. ¿D'acord? Així que per recapitular de nou, Apache i servidors web similars, com que una forquilla gran quantitat de temes i processos que pot ser una mica un malbaratament. Així que suposo que la pregunta que pot venir que és què hem de tenir diversos subprocessos i processos? Què passa si només teníem un? Així que anem a classe de pintura una imatge del que això es veuria així. Així que farem servir només un fil. ¿D'acord? Així que imagineu això amb un fil. Suposem que no estàvem fent realment que gran utilitat - i quan dic útil, em refereixo a la feina computacional - en aquests múltiples fils abans. Així que anem a classe de consolidar tot en un sol fil. I què si teníem un fil aquest tipus de poc va, en el llaç i constantment xecs van fer alguna cosa nou succeeixi. Així, per exemple, una cosa nova succeir podria significar que tinc una mica de volta de la base de dades, o algú enviat a mi una nova petició HTTP. Així que aquests són tipus d'esdeveniments que això passi, oi? I llavors, què puc fer quan els nous coses succeeixen és en aquest mateix fil de l'execució, aquest sol fil de execució, puc trucar a un codi que s'ocuparia d'aquesta cosa en particular. Així per exemple, si tinc una mica de volta de la base de dades, que podia córrer la meva petita part de càlcul de la mateixa que en realitat només prepara la cosa per enviar de tornada a l'usuari. Així que fa aquest tipus de sentit? Però el que en realitat són la implicacions d'això? Cert? Com que hem escrit una gran quantitat de codi que - i jo només vaig a anar per davant en les diapositives si això està bé. Així que si no t'importa, estic va a fer un pas enrere. Així que aquest tipus de coses és anomenat un bucle d'esdeveniments. ¿D'acord? I és cosa de la bàsic idea darrere Node.js. Llavors, què està fent realment Node.js com una xarxa servidor és que hi ha un sol fil és a dir, bàsicament, donar voltes en un bucle com un temps un tipus de baix el capó d'Node.js que està constantment xecs, rebre coses noves? I llavors s'executarà manipuladors que ha configurat. Però una bona pregunta que ens hem de fer és, Com podem fer que això passi amb les coses existents? Així que vaig posar una línia de codi C que aquí bàsicament sembla que s'està obrint una presentar, oi? Ella només em va sortir amb un àlbum. Així que vaig haver de obrir el seu arxiu nou. Així que la forma en que el nostre codi C per al funcionament - i crec que la raó per la qual vaig triar era arxius perquè això és una espècie de l'extensió del treball d'E / S que hem fet en C a una sensació que no hi ha sortida d'entrada. Així que cridem a aquest codi que fa f oberta. I després a la línia següent de la nostra programa, ara podem treballar amb f. Així que aquest seria un exemple d'alguna cosa això és com síncron o bloqueig perquè en aquesta primera línia no estem a l'espera fins que descarregar el fitxer obert. Així que en la segona línia, sabem que pot treballar amb F, però això significa que aquesta segona línia no pot realment funcionar fins que la primera línia es porta a terme. Això té sentit? Així que això seria dolent per posar en un controlador d'esdeveniments. I la raó d'això és que aquest tipus d'espera, no? Així que això es revertiria de nou amb nosaltres a la mateixa cosa. I ara no podríem fins i tot tenir l' benefici de múltiples fils o processos perquè tenim un fil a Node.js. Això té sentit per a tothom? AUDIÈNCIA: Esperi. Així que quin és el reemplaçament? KEVIN SCHMID: Oh, així que si. Així que vaig a arribar a la substitució. D'acord. I què si teníem alguna cosa que s'assemblava a això? I què si ara he editat f obrir una mica? Així que estic passant en el mateix dos arguments que abans. Encara m'encanta la nova cançó que ella va sortir amb. Però jo estic passant una tercera cosa que aquesta variable es denomina codi. Però, què és en realitat codi en aquest context? És com una variable C regular? És una funció, no? I això pot ser una mica estrany perquè En realitat sóc com ara passant un funcionar en una altra funció. Així que un parell de coses a tenir en compte sobre aquesta. Un, no estic realment cridar la funció de codi. Així que vostè no veu el codi amb el parin parin esquerra, dreta. Estic de pas en codi. I en C, el que això realment fer m'és donar-li un punter a la real codi, i llavors això podria executar-lo. Però només pensar-hi com ets passant el codi que s'executarà quan s'obre aquest arxiu. Però el que això significa és que ara el resta de la meva programa que podria fer altres coses, pot continuar fent altres coses mentre que, en realitat no esperem, però només hi ha a la part posterior del cap que quan està obert, la carrera d'aquest arxiu que codi a la part superior. Això té sentit? I ara, la idea darrere de Node.js és que el codi en la matèria acord amb f part ha de ser bastant curt i simple i directe i no ser realment molt computacionalment intensives. És possible que hagi de obrir un altre arxiu, però que també hauria de ser bastant ràpid perquè simplement ha de dir fer una altra f obrir i després trucar a aquest altre codi. Així que per ser totalment clar, la f obrir que funciona la nova cançó de Katy Perry done mp3, això va a bastant molt tornar immediatament. I llavors podem simplement seguir fent altres coses, perquè tot el que ara f convocatòria oberta no es digui bàsicament el codi obert f subjacent obrir aquest arxiu i quan hagi acabat d'obrir aquest presentar o quan t'ho retorna, a continuació, executeu el codi. Però en realitat no executar aquest codi. I tenies una pregunta? AUDIÈNCIA: Vostè sembla donar a entendre alguns vegades que l'addició de computacionalment Codi intensiva espècie de trencar el [Inaudible] sistema impulsat. [Inaudible]? KEVIN SCHMID: Aquesta és una gran pregunta. Així que en realitat tenen un exemple de com vostè podria integrar computacionalment Codi intensiva en una miqueta. Així que quan arribem als exemples de codi, Vaig a estar segur per tirar aquesta. Està bé? Gràcies. Quin era el seu nom? AUDIÈNCIA: Aaron. KEVIN SCHMID: Aaron ens porta a una molt bon punt, que és que si tingués un codi de còmput intensiu en les coses a veure amb la part f, la resta de el meu programa no es pot executar i no es pot escoltar per a noves sol · licituds ni res fins que tots això ha acabat. Així que si estic escrivint codi de node en general llevat que fem alguna cosa que vaig suggerir més tard, quan ens fixem en la exemples de codi, he d'estar segur que el meu codi no ocupa aquest bucle d'esdeveniments. Això té sentit? D'acord. Genial. Així Node.js ofereix aquest marc que també pot crear per esdeveniments servidors amb. Pel que té aquest tipus de asíncron sense bloqueig d'E / S biblioteques, mentre que les biblioteques estàndard de C que hem estat treballant, com si només utilitzar-los de la mateixa manera que hem estat utilitzant amb F s'obre i coses, els que estan bloquejant perquè vostè realment ha d'esperar que aquest arxiu per obrir. Però Node.js et dóna això i bàsicament corbates en V8 de Google Motor de JavaScript que és la raó que Chrome és tan ràpid en el processament JavaScript perquè té aquest motor V8. Així que sé que sona com un d'aquests Conferències de desenvolupadors WWDC cosa on s'acaba de llançar un grapat de la nombre de carta coses per a processadors i dir que això és tan genial. Però és genial que ho van fer això perquè Javascript - o potser si vostè no està familiaritzat amb JavaScript encara perquè no hem tingut les conferències sobre el mateix - però Javascript és una interpretació idioma. I aquest és un punt important també. Així que és important per a la nostra web servidors per ser ràpid, oi? I si només estàvem corrent JavaScript codi que es va interpretar amb només qualsevol edat intèrpret podria ser lent. Així que els beneficis de tenir aquest node intèrpret V8 súper ràpid. I jo no sé si ho van nomenar perquè la bufetada V8 al front cosa, però està bé. Així que m'he preparat alguns exemples en aquesta adreça URL. Després del seminari, jo sóc una mena d'anar a parlar de com vostè pot aconseguir conjunt de nodes , Però per ara, només una espècie de desig caminar a través d'alguns exemples de codi. Així que si vols seguir al llarg de tot el codi font està disponible. ¿D'acord? Així que vaig a deixar aquesta URL per una mica. I llavors jo només vaig a canviar en el terminal. Estan tots bé amb aquesta URL? Així que vaig a canviar el al meu terminal aquí. Així que aquí està el codi que Que tinc per avui. Per què no comencem per file simpler.js? L'altra cosa és que tot això codi serà escrit en Que JavaScript vostè pot o poden no estar familiaritzats amb. Suposo que un parell de coses és que molts de codi JavaScript és el tipus de sintaxi i l'estructura és molt similar a C, perquè puguis tipus de recollir com que avança. He tractat d'escriure un munt de la codi de partida per això d'una manera que és similar a C, de manera que és una mica més llegible. Però a mesura que avancem, estaré demostrant alguns dels addicionals característiques de JavaScript que són una mena de fresc. Però donem una ullada a aquest programa d'exemple. Suposo que tot està tallat allà. Jo només vaig a arreglar això de veritat ràpida si això està bé o no. No sé el que això farà. És això una mica millor? Pots veure la var i aquestes coses? D'acord. Així que la primera línia és com el codi JavaScript versió d'una variable declaració. Així que per posar de relleu el que això faria sembla en C. Així que això és igual que índex de mi dient igual a tres o alguna cosa per l'estil. Així que jo no vaig especificar el tipus. JavaScript té tipus, però és molt dinàmicament mecanografiat en la naturalesa, de manera que no va proporcionar cap tipus de tipus sobre el mateix. Pel que només té var. Això és com a variable. ¿D'acord? I estic trucant aquesta HTTP variable. I a la meva mà dreta, tinc el expressió que vull posar en HTTP. I això diu requereix HTTP. Així que això és una mica similar a incloure. És una mica més com poderós que incloure en el sentit que inclou seria simplement copiar i enganxar la capçalera presentar per als prototips de funcions o el que sigui amb les definicions de tipus. Però requerirà que realment està succeint per treure'ns el codi. Així que vostè pot pensar en ella com importar una mica de codi. Així en algun lloc en el mòdul de Node.js sistema o el que sigui, tenen tot això Codi del servidor HTTP així que estic anar a buscar pel meu propi ús personal en aquest programa. ¿D'acord? Així que tinc aquesta funció que he escrit. I noti que no tenia d'especificar el tipus de devolució o el tipus de la arguments de nou. Així que tipus de solta escrit en quin tipus de sentit. Dos arguments que adopti en, la sol · licitud i la resposta. Així que això és conceptualment una mena familiar de la imatge que teníem a la pantalla abans perquè obtenim aquesta sol · licitud que tenir des de l'usuari. I després tenim una resposta que podem escriure coses que. Així que la primera línia d'aquest fa res.writeHead 200 i després aquest tipus de contingut de text sense format. Així que anem a peça Aquest part una mica. Així que anem a centrar-nos en res.write per una mica. Així que escriure és, bàsicament, i escriure el cap, són només formes d'escriure una mena de terme les coses a la resposta. ¿D'acord? Així que escriure el cap, si algú se'n recorda de la conferència de HTTP, és que vostès recordar encapçalats a la part superior de la cosa HTTP? Per què no puc simplement Demo capçaleres ràpid. Seria útil? O hem simplement una mena de - D'acord. Clar. Així que quan el navegador va a google.com o alguna cosa per l'estil, en realitat hi ha una mica més - això és com un secret - hi ha com una mica més d'informació que ve a través de la canonada que només el poc de recerca i tot. Així que li mostri això, em vaig utilitzar un programa anomenat Curl. ¿D'acord? Així que això és una cosa que es pot executar en la línia d'ordres de Mac OSX o al aparell o el que sigui. I pel que si em ris HTTP google.com, Vaig a veure el codi HTML. I això és, per ser justos, només el HTML quin tipus de et diu que redirigir a www si el teu navegador si no gestionar automàticament el redirecció. Així que això és només HTML, però vaig afegir a crespar aquest guió puc etiquetar. ¿D'acord? I això va a mostrar me les capçaleres. Així que aquesta és també la informació que ve a través de quan arribi aquesta resposta. ¿D'acord? Així que a la part superior, apareix aquest HTTP 301 es mouen de manera permanent. I això és una cosa important perquè això es refereix al codi d'estat. De manera que el 301 aquí és el codi d'estat, que és bàsicament només un sencer que li diu al navegador o qui estigui llegint això, si pretens que vostè és un navegador i que s'està veient això, bàsicament, ara si ens fixem en això i veus un 301, vostè sap que tinc fer alguna cosa especial amb base a 301, o alguna cosa va succeir especial basat en el 301. Pel que diu es va traslladar permanentment. I llavors, en el fons, tenim un munt de parells de valors clau. Així que tenim la ubicació és www.google.com. I després classe de totes aquestes altres coses, però en el fons, el que la ubicació és dit és la nova ubicació és a www.google.com. Així que ara si vas a google.com, se li sort de veure el tipus de navegador parpelleig per un segon i després se li redirigirà de tornada a www.google.com. Així les respostes poden contenir aquestes capçaleres. I un parell de coses a destacar. Així que diguem que en realitat estàvem amb èxit en visitar una pàgina web. Així que permetin-me anar a - el que és un bon lloc web? Sóc dolent en el pensament de bona llocs web a l'acte. AUDIÈNCIA: Wikipedia. KEVIN SCHMID: OK. Fem Wikipedia. Així que aquí em va commoure. Oh, espera. Era jo? Sí, ho era. D'acord. Així que he de fer www. Així que em faré www. I com poden veure, aquí està tot l'HTML que el navegador processaria per a Wikipedia. Però si em quedo amb el desplaçament cap amunt aquí, el que vaig a veure a la part superior - wow, hi ha una gran quantitat de HTML en Wikipedia - però el que puc veure a la part superior aquí és el codi 200 d'estat com oposat a la 301 que vaig veure abans. I adonar que té un bon Acceptar i al costat d'ella. Així que això és com el bon codi d'estat. S'assembla familiar aquest nombre 200? Sí, perquè quan ho vaig fer simpler.js, Vaig escriure un 200 allà. Així que això és bàsicament dient dir-li al navegador o qui està tractant d'arribar a això que van tenir èxit. O que alguna cosa així com que van tenir èxit també. I no hi ha aquest tipus de sintaxi especial en Javascript per declarar una mapa d'aquestes tecles com a tipus de contingut i aquests valors com a text sense format. Així que si ens fixem en la resposta que tornar de Wikipedia abans, - Vaig a tractar de desplaçar una mica més ràpid - vostè té aquestes tecles com a servidor i aquests valors d'Apache. Així que tens les claus i valors. I vostè pot especificar en Node què enviar de tornada. Així que això és en realitat una mena de, d'alguna maneres, i en certa manera no és realment, però és una mica més baix nivell que el codi PHP que vostè pot ser escriure per a P va fixar 07:00 perquè PHP i Apache espècie de tenir cura d'alguns d'aquestes coses per a vostè. En PHP, pot reemplaçar el valor predeterminat comportament per escriure les seves pròpies capçaleres. No obstant això, per als fins del present, obtenim per escriure les nostres pròpies capçaleres. Llavors, aquesta línia té sentit tothom, la línia del cap d'escriptura? D'acord. Impressionant. Així que el que faig és que acabo la resposta dient hola món. D'acord. Però això és només una funció anomenat controlador de sol · licituds. Així que ara realment he de tipus de fer alguna cosa amb aquesta funció, no? Així que aquí el que faig és no és present línia que fa iguals servidor var HTTP.create servidor, i després em Va esdevenir al controlador de sol · licituds. Així que aquest és el tipus de node manera de crear un servidor. I noto que estic passant al controlador de sol · licituds. Així que això està dient la createServer funció que vull que em facis una servidor, i quan el servidor rep una resposta, necessito que truquis a aquesta sol · licitar funció de controlador. ¿D'acord? Perquè la línia més o menys acaba immediatament. De manera que la línia de servidors var es fa bé després de fer això més o menys. Vull dir, ha d'establir algun intern estat de saber que hauria de cridar a aquesta funció controlador de sol · licituds, però que no va a seure allà i per exemple té l'usuari va enviar em una petició encara? M'ha enviat a l'usuari una petició encara? Per tant, no es bloqueja. ¿D'acord? Així que el que això va a fer és que, bàsicament, ara emmagatzema un punter a aquest codi, aquesta funció controlador de sol · licituds, i després s'executarà aquest codi quan algú formuli una sol · licitud. I després fem server.listen. El 1337 no és prou arbitrària. No tenia cap raó en particular per recollir aquest número. Va ser totalment a l'atzar. Però això només especifica el port. Així que la majoria dels servidors web veuràs que utilitzar el port 80, ja que és una espècie de com la convenció. Així que si vaig a una cosa així com: No ho sé, Wikipedia.org, i vaig posar dos punts 8 - oh wow, no es pot veure això. Ho sento. Però si ho faig Viquipèdia - Vaig a escriure aquí només perquè està clar que a la cambra. Però si prenc això en un navegador dos punts 80, que especifica anar a Wikipedia.org al port 80. Així que és com la forma en que els Estats Units té múltiples ports com on es pot enviar coses a classe de. Així que és com anar a aquest particular, col · locar en aquest servidor. D'acord. Així que em vaig decidir 1337. Hi ha tot un seguit de nombres que es pot recollir. Això no era totalment especial. Però, què faré ara és que vaig a córrer Node. Déjame entrar realment que una parella línies més avall perquè puguis veure-ho. Jo faré Node, i estic va a córrer simpler.js. I parlarem de com arribar Node creat en una mica. Però ara s'acaba d'executar el servidor. Així que una cosa que podem intentar que no podrà els que ho emocionant és que podem realment tractar d'accedir-hi en Curl. Així que jo puc fer Curl, i la meva màquina host local. També veurà aquest escrit com això de vegades. Host local i 127.0.0.1 són amables de com l'ordinador de casa. Així que és com parlar amb seu propi ordinador. D'acord. I llavors puc dir 1337. Així que si em quedo aquesta línia de codi, que diu hola món. I si jo volia veure aquestes coses que tingut de text sense format o tipus de contingut el que sigui, jo podria fins i tot posar això aquí. I noti que sí diu a D'acord. I tinc text sense format. I després hi ha el tipus de totes aquestes altres coses que node es sumarà en allà per a mi. Això no és molt important. Vull dir, hi ha algun tipus de tècnica aspectes de pel que són una espècie del cool que parlar, però només per mostrar vostè, també té el poder de canviar aquests en tot. Així que només puc afegir un munt d'aquest tipus de coses. I llavors ara, si em veig en el meu de sortida, serà que. Així doncs, aquestes capçaleres signifiquen certes coses als navegadors i coses per l'estil. I capçaleres, bàsicament, pot dir-li al navegador com respondre a alguna cosa. Si alguna vegada has sentit parlar de les galetes abans, o si alguna vegada has estat molest per una pàgina web establint galetes, o es converteix en el bloc de galetes o alguna cosa així. En realitat es pot establir galetes en aquests capçaleres. Així li diuen a un navegador com el comportament en alguns casos. D'acord. Així que això va ser simpler.js. Algú té alguna pregunta en aquest arxiu de codi font? D'acord. Genial. Així que anem a eliminar l'r aquest i mirar simple.js. Així que això és més o menys el mateix programa. Acabo d'escriure una mica diferent perquè volia a una espècie de punt culminant algunes característiques de JavaScript. Així que adonar-se que el controlador de sol · licituds funció ha desaparegut totalment. Oh sí, li van fer una pregunta? AUDIÈNCIA: Sí, els arguments que passen a que funció, què són? KEVIN SCHMID: Així que aquests són JavaScript objectes. En la documentació de Node.js, es bàsicament diu quins mètodes són disponible en ells. Simplement passa que té l'accés a la aquest mètode anomenat capçal d'escriptura i al final i coses per l'estil. Però hi ha un munt més mètodes. I per exemple, com un d'ells en particular, sobre rec, pot fer-ho alguna cosa així com el que es rec.method li dirà si és un get d'HTTP o Peticions HTTP POST i coses així. Així que hi ha tot tipus de diferents propietats, però els dos són JavaScript objectes, i l'únic que tenen existeixen funcions vinculades als que us pot escriure coses que. ¿D'acord? Així que adonar-se que controlador de sol · licituds està totalment anat. Però el codi que tenia a la sol · licitud de gestor segueix aquí. Encara tinc aquesta res.writeHead i encara tinc aquest res.end. I el que aquest és un exemple de a Javascript és aquesta idea d'un funció anònima. i anònim és com un nom apropiat per això, ja que fa, literalment, no tenir un nom. No hi ha sol · licitud funció gestor d'aquí. No té nom, però encara està tenint una discussió. Així que encara tinc rec i res. I encara tinc el codi. Això és perfectament normal El codi JavaScript. Així que puc declarar una funció sense donar explícitament un nom. És una mica confús al principi. Hi ha algunes coses útils, com que vostè pot fer amb aquestes funcions anònimes. Algú té alguna pregunta sobre això, o està bé només per, per ara, espècie de simplement acceptar que va a fer el mateix? Sip? AUDIÈNCIA: Són funcions de primera classe en JavaScript? KEVIN SCHMID: Ells són els primers classe en JavaScript. I només sé que aquests conceptes de que passa en una funció anònima com aplica el JavaScript que pot escriure en el seu projecte final per el navegador web també. Així, per exemple, en el codi JavaScript en el seu navegador, també és cert esdeveniment impulsat en el sentit que el que vas a tenir és quan l'usuari fa clic en aquest botó, vull que executar aquest codi. Així que és el mateix tipus d'idees de la costat del client quan un clic del ratolí o ratolí sobre alguna Imatge en màxima pàgina web, executa aquest codi. Això pot aplicar-se a servidors. Així que això és una cosa així com l'apassionant raó per la qual Javascript és un molt persones idònies o alguns pensen que és una llenguatge adequat per a aquest tipus de servidor de controlador d'esdeveniments perquè té aquestes funcions anònimes. Vostè té tota la idea d' aquest codi asíncron. D'acord. Algú té alguna pregunta? D'acord. Així que això va ser simple.js. Així que donem una ullada a una més o un parell més. Així que això és sleep.js. Així és que ningú coneix la funció de repòs C? Des potser una de les conferències anteriors o alguna cosa per l'estil? Així que, bàsicament, es pot passar d'un pinso nombre de segons, o utilitzant U dormir un nombre de milisegons o nanosegons. I, bàsicament, el programa només deixarà de corrent per aquesta quantitat de temps. Cert? I llavors es despertarà amb el temps i llavors només seguirà funcionant el programa. Així que aquest tipus de servidor dóna la impressió de dormir. Així que adonar-se que tenim la mateixa res.writeHead 200 amb la capçalera com abans, però llavors estem trucant a aquest funció crida conjunt de temps d'espera. Establir temps d'espera també està disponible en el navegador web Google Chrome o Safari o el que sigui. I bàsicament el que està fent aquí Es tracta de prendre en una funció. Cal notar, de nou, és un funció anònima. Així que és una mena de fresc perquè som utilitzant una funció anònima dins d'un funció anònima que pot ser una mica estrany. Però està prenent aquesta funció, que és bàsicament dient - i la forma en què aquest obres és de 5000 mil · lisegons, vull vostè executi aquesta funció que només acaba la resposta i escriu sent. Així que això fa l'efecte com dormir, però la forma en que aquesta realitat Works és anem a córrer a través d' aquesta línia molt ràpidament. Només estem escrivint alguna cosa. I després també a córrer a través d' aquesta línia molt ràpidament. Així que no estem realment va esperar cinc segons. Només anem a córrer aquest codi a l'instant. I després hi ha, de nou, aquest petit cicle d'esdeveniments que té ara aquesta cosa registres que, bàsicament, és només constantment donant voltes en un cercle i mirant el rellotge en una sola fil i refrany, té cinc segons però va passar? I després, quan es veu que el segon la mà s'ha mogut com cinc segons, o el que sigui, llavors es desperta i diu: oh, què he de fer? Oh he de executar aquest codi. I després es va a executar res.end bo. Així que de nou, mai estem esperant aquí. Així que no és que aquest codi dins de aquesta funció es prendrà 05:00 segons per córrer. Aquest codi s'executarà més o menys instantàniament, almenys en relació a els cinc segons que estàvem parlant sobre anterior abans. Així que per mostrar això en acció, Jo puc fer Node.sleep.js. I ho va fer m'equivoco alguna cosa? És possible. Ho sento. Anem a veure el que podem fer per arreglar això. D'acord. Així que sens dubte utilitzar Node.js. Només estic fent broma. D'acord. Només un segon. D'acord. Jo sé el que és. Així que la qüestió és que a la meva altra pestanya aquí, jo estava corrent node que ja estan en aquesta mateixa direcció, 1337. Així que l'error que aquest va llançar, si mirem en real de prop, és la direcció en utilitzar, EADDRINUSE. Així que ja estava utilitzant 1337 aquí. Així que si tanco això endavant, i llavors ara tractar d'executar aquest, és d'esperar, tot estarà bé. D'acord. Pel que només es pot tenir una cosa tipus d'escoltar en un port alhora. Una altra solució hauria estat per a mi simplement editar aquest programa i fer que sigui com 1338 o alguna cosa així així. Però ara el somni s'està executant. Així que anem a intentar-ho en realitat en el navegador aquesta vegada perquè és un mica avorrit per veure en un terminal. Així que només vaig a anar a aquest 127 direcció una altra vegada en 1337. I si vostè pot veure - No sé si és possible - però el meu el navegador de prendre un temps molt, molt llarg temps per carregar o com cinc segons. I a continuació, després que, finalment va posar fi a la resposta. I no es pot veure perquè la cosa es mou sobre una mica, però si faig això una mica més petit, pot veure que diu hola. Així que em va donar la sent, però després de cinc segons. I pot ser que sigui una mica més net per veure aquí a la terminal, de manera que estic anem a fer una - farem aquí - fem-ho Curl aquesta direcció de nou amb el 1337. I acabo de classe que seure aquí durant cinc segons. Però cal notar que el servidor pot acceptar noves respostes. Així que imprimeix bo. I per a una demostració d'això, bàsicament, el que Que puc fer en aquest altre tab - així que diguem que faig això en una altra pestanya, Jo faré Curl i el mateix alguna cosa nova. I jo vaig a intentar expulsar aquests nois fora al mateix temps. Així que vaig a fer això, i estic anar a córrer per aquí i estic va a fer-ho de nou. I ho farem de manera que pot veure els dos. Aquest imprès sent i que un impresa sent tot el camí a - farem aquest experiment nou. En realitat, farem servir aquest enganyar, si això està bé. Així que vaig a utilitzar una mica de shell que em permet córrer bàsicament dues còpies d'aquest programa en paral · lel. Així que va a executar el primer programa i el segon programa en paral · lel. Així que ara si pressiono Enter, es va per fer aquesta petició més o menys instantàniament al mateix temps. Així que anem a donar-li una oportunitat a això. Així que ara ho nota diu dos processos. I si vostè és curiós, que 27.000 nombre és, bàsicament, l'ID del procés. I després avís, van imprimir Ei, a la vegada. No era com que havíem d'esperar cinc segons per un i després d'això, Cinc segons després aconseguir el segon. Així que això és una cosa, d'alguna manera, és en realitat no prova, però és evidència intuïtiva que no es tracta només com esperar cinc segons i el bloqueig tot el fil. Acceptar cool. I Aaron va fer una pregunta anterior que era, bé, i si nosaltres fem alguna cosa - Sip? AUDIÈNCIA: Esperi. Com és diferent de memòria intermèdia printf, però? No és el que fa automàticament que? Per què hem de preocupar per això? KEVIN SCHMID: Oh, podries dir que una vegada més? AUDIÈNCIA: No li agrada memòria intermèdia printf fer exactament el mateix? KEVIN SCHMID: El buffer printf? AUDIÈNCIA: Si. D'acord. No va ser en una de les proves que eren parlant de com si fa printf alguna cosa i després l'han pausar 1 segons, i després ho tens bucle de deu temps, que va a esperar deu segons i llavors printf tot junt? KEVIN SCHMID: Oh, està bé. AUDIÈNCIA: Està fent el mateix cosa, llavors en aquest cas? KEVIN SCHMID: tant el dubte era bàsicament, en una de les antigues proves o alguna cosa així, hi havia una pregunta que bàsicament, si vostè diu print f 10 coses alhora i després vaig dormir com a el procés d'impressió dels terme, al final, per alguna raó, ho faria simplement bolcar els tots fora de la pantalla. Així que hi ha una espècie de dos diferents conceptes aquí. Així que suposo que una cosa és que, en aquest cas, estem tractant amb dos diferents classe de gent que demana el servidor coses a la vegada. I la raó que el tipus de printf espera d'aquesta manera i ho bolca amb magnificència alhora es relaciona més amb com tipus de printf - Així que la forma printf és en realitat implementat és que, bàsicament, ha de parlar amb el sistema operatiu per escriure aquestes coses a la consola. Pel que no vol fer tot això coses immediatament quan dius printf alguna cadena ja que podrien ser car si ha de fer això tot el temps. Així que si vostè fa printf sent, el seu programa podria no imprimir realitat que immediatament a la consola. Es podria dir, OK, el vaig escriure. I llavors espècie d'esperar que li donis una mica més abans que realment s'escriuen a la consola. Així que la raó que aquest era el cas - i és una espècie de relació el somni - és que el somni era una espècie de just injectat allà per demostrar l' fet que no escriu sincrònicament. Però la raó que és només rendiment de manera que vostè no ha de fer que molts contactes a el sistema operatiu. Però aquí, el que realment estem tractant de fer amb aquesta cosa de son és només espectacle que quan tenim dues persones que visiten Aquest lloc web, que no posarà en una línia en la qual es dirà He d'ajudar a vostè i, a continuació, quan estic totalment acabat ajudar-després que aquests cinc segons i després em vaig a passar a la següent persona. Així que la petició de la primera persona no lligar aquest bucle d'esdeveniments si això té sentit. Però aquí és en realitat un exemple d'alguna cosa que va a lligar el bucle d'esdeveniments. Així que aquí està una funció horrible calcular el n-èsim de Fibonacci. És, literalment, la pitjor manera que pugui calcular l'enèsim nombre de Fibonacci. I això és realment només per reconèixer d'on va sortir, hi ha realment - Vull dir, vostè pot tractar d'anar a buscar-hi - però hi ha com un molt llarg el blog Post que algú va escriure. És com una d'aquelles coses de Reddit. Però algú va criticar Node.js i van usar això com un exemple. Així que com que volia que vostè acaba de mostrar dues diferents perspectives, per simplement un coneixement general dels conceptes darrere d'aquestes dues coses. Però aquesta és triat com només un horrible, computacionalment horriblement ineficient de forma intensiva per a calcular la enèsim nombre de Fibonacci. Així com una nota al marge, per què és és horrible com d'una manera? Sip? AUDIÈNCIA: Diguem que vostè comença amb 1000. 1000 es divideix en 999 i 998. Cadascuna d'aquesta es divideix en dues coses. Cadascuna d'aquesta es divideix en dues coses. KEVIN SCHMID: així. AUDIÈNCIA: Durant tot el camí cap avall. KEVIN SCHMID: Exactament. Així que per repetir per la càmera, si trucar a fib sobre com 1000 o alguna cosa així així, no és, òbviament, menys de o igual a un, així que vaig a vaig a aquest cas més, i després em vaig trucar a fib 999 més fib 998. I després, més o menys tot això treball que FIB 999 fa és tipus d'a aquest nivell. Si vostè va avall, és encara més redundant que això, però si només crec fib computar 998 aconsegueix nosaltres molt a prop de la FIB 999. Així que realment hauríem de ser una mica més intel · ligent sobre la forma en què tipus de reutilitzem aquests, però no estem reutilitzant aquestes coses en absolut. Així que vostè pot imaginar aquesta gegantina, arbre gegantí que és simplement horrible. Però de totes maneres, està bé. Així que això era mentida. Només es necessita un temps per funcionar. Sip? AUDIÈNCIA: [inaudible]. KEVIN SCHMID: Oh, podries repetir la pregunta? AUDIÈNCIA: [inaudible]. KEVIN SCHMID: Oh així que això és només el codi això serà una espècie de sobre la costat del servidor. Així que això no serà trobat al navegador o qualsevol cosa. És bàsicament el que tenim és que quan l'usuari aquí més o menys marques seva petició de nou, quan una mena de fer una sol · licitud, anem a trucar a aquesta funció en el costat del servidor. I després anem a arribar el resultat de nou de cridar a aquesta funció. I llavors només haurem d'imprimir l'usuari. De manera que l'usuari no té realment tractar amb aquesta funció massa. No va ser aquesta la pregunta? Això té sentit? D'acord. Genial. Així que de nou, ho fem tot aquest res.writeHead cosa on imprimim la capçalera. I llavors va acabar la resposta en fer el nombre màgic és fib 45. Així que anem a executar aquest servidor. Així que em vaig a fer un fib.js. Node Així que ara el meu servidor fib s'està executant. I llavors aquí vaig fer una d'aquestes. ¿D'acord? Així que només vaig a dir, Curl. Així que prendrà una mica de temps, però espero que aviat va a acabar i s'imprimirà que 45a Fibonacci nombre. AUDIÈNCIA: [inaudible]. KEVIN SCHMID: ha aconseguir fer molt aviat. Per tant, ha de prendre de cinc a sis segons. No sé que és només V8 ser super ràpid, però en qualsevol cas, es tracta d'un exemple molt curt i propòsit poc elegant d'un no-trivial càlcul. Així que després d'un temps, es posa això. Però ara, què passa si faig el mateix tipus de experiment com abans on faig dues sol · licituds a la vegada? Així que aquí vaig a un Curl en aquesta direcció, i vaig fer una altra Curl. I recordi, quan vam fer això per a la dormir servidor, al qual bàsicament havíem de després de cinc segons, que pràcticament tant tots dos van tornar a la dreta gairebé al mateix temps. Així que no va ser particularment lligat. Però ho intentarem ara. OK, així que ens van donar els nostres dos processos. Recorda aquests són els identificadors de procés. Això serà una mica maldestre, mentre que la parada. Així que anem a quedar-nos aquí i esperar. Així que un d'ells ha de venir tornar després de com - OK, així que un va tornar. Però llavors per què no ho va fer el segon un ve de tornada encara? Sip? AUDIÈNCIA: El servidor no pot fer res mentre s'està calculant que gran nombre. KEVIN SCHMID: així. Així que la resposta va ser simplement que el servidor Realment no es pot fer res mentre està calculant que el nombre de Fibonacci. Així que ara acabo de rebre els meus dos coses de nou. Però crec que només de pensar en el codi una mica més, la manera com està funcionant i tot. Així que aquesta funció aquí és el codi que Li he dit a aquest servidor per executar quan es rep una nova petició entrant. Així que només va a córrer a través d'aquest Codi de tot, i després es va a anar enrere per al bucle d'esdeveniments i després continuar la comprovació de nous esdeveniments. Així que bàsicament el que hem succeint és el servidor és escoltar coses noves. La primera persona que demana el 45 és. Correm aquest codi per computar. Aquest codi pren al voltant de cinc sis segons per córrer. Llavors tornem al bucle d'esdeveniments i comprovar si hi ha noves sol · licituds. Així que aquest és un exemple de com, si tenen coses que són cridats computi obligat, o utilitzar una gran quantitat de còmput, no el poder, però com són computacionalment intensives - Crec que una cosa a dir sobre això és que aquesta funció està fent totalment, en la seva major part, bastant utilitat dret del treball. Durant tot el temps que la devolució de trucada funció corria, era bastant gastar molt més del seu temps només computing nombre que Fibonacci nth. Però només teníem un fil de tractar. En el model d'Apache, quan dues persones fet la sol · licitud per obtenir fib 45, és hauria tingut dos temes diferents. I llavors el treball del sistema operatiu Hauria estat, o el nivell d'usuari codi que maneja els fils, hagués estat la de tallar que fins al CPU, o encara que tenia diverses CPU, distribuir de manera uniforme a través de la CPU pel que ambdós estaven acabats més o menys al mateix temps. Així que per mostrar com podem classificar de - i això no és un perfecte totals solució, però alguna cosa del que puguem fer un tornar aquí i fer una mica millor. Així que el que tenim aquí és un programa que es diu FIB C. I això s'utilitza bàsicament un altre dels mòduls de node anomenat El mòdul de procés fill. Així que he inclòs a la classe superior de com m'agradaria fer una lliura incloure process.h nen o alguna cosa així. Ara tinc accés a aquesta variable CP que té tot el meu funcionalitat. Així que ara el que estic fent en aquesta resposta handler és que estic corrent aquest programa dot slash fib 45. Així que el que he fet - i jo només vaig per sortir d'aquest programa per un poc - és que m'he escrit un programa en C que bàsicament calcula la enèsim nombre de Fibonacci. Així que aquí és només un programa que he escrit en C que calcula això. Puc compilar, i puc córrer que en la línia d'ordres. I es va a calcular el Nombre 45a Fibonacci. Llavors va notar que només pren més o menys com sempre. Probablement podria haver utilitzat el tauler 03 a optimitzar o alguna cosa així, però jo només vaig fer com a normal configuració del compilador. I ho imprimeix. Però ara, què estic fent mena de? Oh, ho sento, arxiu incorrecte. Així que faig el mateix amb la capçalera com abans. Llavors faig això cp.exec. Així que el que això farà és que està va a executar aquest programa. Però la forma en que funciona és que que no esperar que aquest programa fins al final. Simplement diu bàsicament executar aquest programa. Així que, bàsicament, escriure el següent en el indicatiu de tipus d'. I després, quan hagis acabat amb ella, executar aquesta funció. Així que ara que tipus d'aconseguir aquest Tot restaurat de com que no estem esperant. ¿Aquest tipus de sentit? Sip? AUDIÈNCIA: [inaudible]? KEVIN SCHMID: Així que això va a obrir un nou procés per fer-ho. Així que això és en realitat, en alguns aspectes, malament, no molt malament, però és important dir que això és una mena de que es remunta a, d'una banda, l'Apache model en què fem les discussions i processos Per a cada sol · licitud o processos per a cada sol · licitud. Així que això és una espècie d'anàleg al que fa Apache. En alguns casos, s'acaba d'utilitzar una nova fil, que és una mica més de llum pes que un procés, però Apache podria acabar bifurcar un nou procés que és una espècie del que fem aquí implícitament fent punt fib barra 45. I llavors en aquest cas, quin tipus de incorrem les mateixes despeses de processos. Així que això és només una cosa que pots fer. Però només per mostrar aquest tipus de carrera. I aquesta xerrada és simplement molt dirigit a presentant aquest tipus de programes com manera de mostrar diferents perspectives sobre com dissenyar servidors així. Així que això està en marxa, i llavors ara si ho faig aquesta vegada, tinc dos identificadors de procés. Anem a parlar de coses que assenyalen. Així que noten que són de forma incremental. Això està bé. Perquè era 27.122 abans. Però notin ara, es va tornar més o menys al mateix temps. I ara, una bona pregunta per preguntar sobre per això va ser que el cas és, el treball era ara per fer una espècie d'aquestes coses tipus de jugar net amb cada altres, aquestes dues instàncies de dot fib barra 45 que vaig córrer o que va córrer Node? Qui espècie de fa just que tots dos aconseguir espècie d'equilibri en temps d'execució? AUDIÈNCIA: [inaudible]. KEVIN SCHMID: Si. Així que, bàsicament, quan ho faig fib slash dot 45 o alguna cosa així, ara és el tipus de fins al sistema operatiu per gestionar el temps d'execució d'aquests programes. I ara es pot programar en diferents CPU o pot programar. Es pot tallar a la vegada que un CPU rep o que rebin per executar-se en una CPU. Així que aquesta és la idea darrere d'això. Això té sentit per a tothom? Així que ara node no està realment jugant un participar a dividir aquestes tasques. D'acord. Així que això és gairebé el d'exemples. Només volia mostrar una cosa més perquè molt d'això ha estat fins ara no totalment pràctic fantàstic en alguns casos. Em puc imaginar tornar a casa després d'aquesta parlar i alguna cosa i dient com, així que tipus de aixecar del que parla que Puc fer que un servidor de Fibonacci el meu projecte final. Així que aquí és només una espècie d'un exemple més que s'espera que sigui - potser no, però potser - una mica més tipus d'interès per a projectes fi de carrera i pensant en el futur d'aquest tipus de coses. Així que això és chat.js. Així que això és com la classe d'alguna mostra codi del costat del servidor que es pot utilitzar per establir un petit servidor de xat com vostè va poder haver vist al Facebook Xat o el que sigui. Així que no estic dient que això és com Facebook Xateja, però això és una mena de com una bona - potser no és bo, però potser punt de partida per a una xerrada - bona servidor per al seu lloc web per a un projecte final. Així que donem una ullada al que està fent. Així que estem aconseguint aquesta cosa especial a la part superior, aquesta var SIO iguals requereix Socket.IO. Així que això és una altra cosa que no és així en realitat vénen inclòs amb Node però pot instal · lar. És un mòdul de node. Així com alguns extensió a node. SocketIO és realment molt una mena de fresc. És una abstracció que, bàsicament, el que el que fa és és el que permet tenir aquest flux de comunicació entre una tela navegador i un servidor web. Així que en la seva major part fins ara, hem tingut aquestes molt ràpida d'un segon o dos segones comunicacions entre una xarxa navegador i el servidor web. Així que és bàsicament anar a google.com, get les coses, enviar de tornada, i després hem acabat. Mai anem a parlar de nou fins que el usuari escriu en una altra cosa. Però, què Socket.IO i el mateix tipus de coses - i SocketIO és en realitat un de les coses que es construeixen sobre com WebSocket que és una espècie de disposició com a part d'HTML5 - que li permet tenir aquesta diàleg continu. I això és molt útil en un servidor de xat tipus de coses, ja que és una mena diàleg continu en alguna manera, perquè si vostè està conversant amb algú, ara pot simplement enviar un missatge pel tub, i a continuació, la servidor pot enviar un missatge per la canonada a l'altra persona que està xerrant amb. I llavors vostè pot tenir aquesta intercanviar així. Així que això és una cosa del que SocketIO és bo per. La raó que SocketIO utilitza WebSockets com una cosa és que en A més de WebSockets simplement vells, també fa alguns trucs per, bàsicament, compatibilitzar navegador ella. Així navegadors com Internet Explorer per desgràcia no són compatibles amb WebSockets només treure'l de la caixa. Per tant, utilitza algun altre tipus de fresc net coses amb Adobe Flash per permetre que tingui el suport de tots navegador. Així que és realment útil. I, de fet, sé que sóc una mena de que s'executa en el temps aquí, però CS50 Discutir, alguna vegada has vist alguna cosa com, no sé, en blanc i així és responent a aquest missatge o alguna cosa així, aquesta característica? Això és SocketIO. Així que quan algú comença a escriure a la quadre de discutir per fer una rèplica o alguna cosa, el seu navegador no ho és trucada en SocketIO emet algun tipus de cas que diu que hi ha algú respondre a aquest missatge. A continuació, el servidor diu, OK, Què he de fer? Bé, ara he de dir a aquests altres nois que estan en CS50 Discutiu buscant en aquest post que algú està responent. Així que això és una cosa del que és SocketIO bo per a aquest tipus de continuació de corrent de diàleg. D'acord. Així que el que tinc aquí - i estem just va a fer cas omís de la matriu connexions per una mica - el que faig és que no escolto altra. Així que això és només la forma en Socket.IO es dient anem a escoltar en aquest port. I llavors faig això en la connexió. Així que això és bàsicament Socket IO de manera de dir, quan vam rebre una connexió, vull que per executar aquest codi. I adonar-se que en lloc de tenir rec dors i van passar allà tinc Socket. I aquesta idea és, bàsicament, aquest sòcol cosa que es pot escriure i llegir que té l'usuari de missatges, possiblement. I els missatges que vostè enviï pot passar per això Socket. Això té sentit? Així que és aquesta cosa de continuar. Així que el que faig és que dic Socket.emit. I emeten menys pren el molt dos arguments. El primer argument és una cadena només representa el tipus de El que està emetent. Així que per a aquest cas, no tinc ús aquest nou missatge de cadena. I això és només bàsicament dient que el tipus d'aquesta cosa, el que estic l'enviament, és un nou missatge. Perquè pugui escoltar per tipus específics com un nou missatge o el que sigui mitjançant l'ús de punt a. Així que la connexió i l'usuari enviats allà, si ens fixem on anomenem punt en, els altres són cadenes que representen tipus de missatges d'usuari. Pel que és, bàsicament, que pot tenir aquest emit un d'aquests tipus de missatges, i a continuació, fer alguna cosa en resposta a un d'aquests tipus de missatges Així que estic emetent aquest nou missatge. Anem a ignorar connections.push per un segon. Però llavors jo dic, va enviar usuari Socket.on. Així que ara és una mica com quan el usuari m'envia un missatge, vull executar aquest codi. I adonar-se que aquesta funció anònima està tenint en aquesta variable trucada de dades que és bàsicament van tenir de missatges de l'usuari. Així que ara anem a tipus de conversa sobre la matriu de connexions. Així que això està dissenyat per a un client de xat on bàsicament tot el món és una espècie de a la mateixa sala de xat. Així que, bàsicament, el que necessitem per mantenir al voltant d'una certa matriu que bàsicament representa totes les persones en el xat en D'alguna manera, si això té sentit. Cert? Perquè hem de saber qui són aquests nois som així que els podem enviar els missatges que altres persones ens envien. Així que el que aquest codi fa és quan l'usuari envia un missatge - que és el tipus de l'esdeveniment - anem a executar aquest codi. I el que fem és que correm a través d'aquest matriu que hem anomenat les connexions. I més o menys per a cada connexió excepte el que és nostre, això és el que diu el codi, vam enviar una nova missatge amb aquest missatge adjunt informació. Així que si vostè nota aquí, el que vaig fer quan l'usuari realment fa que un nou connexió és que he afegit a la Mètode JavaScript.push, això és bàsicament dient com afegir que Sòcol com un valor en la nostra gamma de connexions. Així que ara quan s'executa aquest codi, ho farà enviar coses a aquells particulars connexions. Així que aquest pot ser un bon punt de partida per a la fabricació d'un servidor de xat o alguna cosa semblant. I el tipus de cosa interessant és que la codi que veus aquí com a i emeten i coses per l'estil és el mateix tipus de codi JavaScript que ho faria escriure al navegador per interactuar amb el servidor. Així que per això SocketIO és una espècie de ordenada i útil d'aquesta manera. Ah, i una cosa més aviat ràpid. Hi va haver un projecte final CS50 any passat que bàsicament van implementar una xerrada servidor Node.js. Crec que és Harvardchats.org però no estic - D'acord. No estic segur del que l'URL és, però Puc enviar això després. Però és una espècie de fresc el que pot fer amb Node.js. Així que espero que, en general, vostès tenen una bon sentit del Node.js és útil i com es podria aplicar tal al seu projecte final. Estaré enviant cap a fora major recursos al llarg d'aquesta. I gràcies per venir. Gràcies. [Aplaudiments]