KEVIN Schmid: Ciao a tutti. Benvenuti al seminario CS50 su Node.js. Il mio nome è Kevin. Sono un TF CS50. E io sono un po 'come davvero entusiasta di questo seminario. Penso Node.js è molto cool. Spero che questo seminario può essere utilizzato come un bene, credo, trampolino di lancio per alcuni dei tuoi progetti finali se siete interessati ad utilizzare qualcosa come Node.js. Ti sorta di avviamo il seminario fuori dal parlando solo di un po 'di tipo di sfondo scalabilità prospettive di Node.js, e poi ci sposteremo ad alcuni esempi di codice. E io ho il codice su un sito web, e si può guardare il codice. E dopo il seminario, sarò una sorta di colloquio su come è possibile impostare Node.js sul vostro computer. OK. Quindi cerchiamo di iniziare. Quindi credo che voglio solo parlare server web, in realtà, in primo luogo. E per iniziare questa discussione, ho fondamentalmente un diagramma che è da il libro di testo utilizzato per CS61, che fondamentalmente mostra l'interazione tra un processo client, come il tuo web il browser o come il vostro client scopo o qualcosa di simile, e un server web. Quindi questo tipo di aspetto simile al immagine che avete visto nella conferenza su Mercoledì dove in sostanza abbiamo un po ' processo client come Google Chrome. E poi passo uno è l' client invia una richiesta. In modo che possa essere qualcosa di simile Beh diciamo visitare, non lo so, CS50.net. Quindi noi emettiamo tale richiesta. E qualcuno ricorda il nome di il protocollo che specifica come tale richiesta deve essere strutturato? Yep. AUDIENCE: [incomprensibile]. KEVIN SCHMID: Esattamente. Così è come HTTP, giusto? Quindi, in pratica la specifica per quanto tale richiesta dovrebbe realmente essere posato out, perché alla fine della giornata, tale richiesta è davvero solo come un stringa che fondamentalmente dice Voglio questo. E la specifica per questo è HTTP. Ecco, questo è come un protocollo. Allora il server riceve tale richiesta. Quindi voi ragazzi avete un server web installato nell'apparecchio CS50. E 'Apache. E questa settimana, quando si lavora su un problema set di sette, ci troveremo a lavorare con il server web. Quindi il server riceve la richiesta, e allora deve sorta di graffiare la sua testa e dire come bene cosa faccio con questo? Quindi, in base a ciò che decide di fare, allora potrebbe essere necessario contattare qualche tipo di risorse. E questa risorsa può essere un sacco di cose diverse. Per uno, potrebbe essere solo come un file HTML statico. Quindi potrebbe essere solo come alcuni HTML che è come per il vostro sito personale. Potrebbe essere un file statico come un'immagine o come un film che avete. Si potrebbe anche avere a parlare a una sorta di banca dati come un database MySQL. Quindi non sempre deve comunicare con una risorsa, ma in alcuni casi, potrebbe. Allora che cosa sta andando a fare dopo che è sta andando a rispedire la risposta. E la risposta di questo è anche specificato da HTTP. Allora il cliente può ricevere. Si può strappare lo distingue e di processo. E poi si ottiene una pagina web come Google o CS50.net o tutto ciò che si è andato a. OK? Quindi questo è l'interazione di base che stiamo andando a che fare con. E stiamo praticamente andando a essere concentrandosi su questa parte del interazione, il server. OK. Freddo. Qualcuno ha delle domande finora? OK. Quindi, come abbiamo detto, il server web riceve questa richiesta HTTP e quindi emette questo Risposta HTTP. E come abbiamo parlato prima, il Server web appliance CS50 è Apache. Così, quando si lavora su ragazzi P impostare sette, si sta andando a lavorare con il Server web Apache. Non dovrete mai lavorare molto con Apache direttamente troppo. È una sorta di configurare Apache un po ' quando si specificano gli host virtuali o i v padroni di casa, e ci arriveremo a che in un po '. Ma in fondo, il web server Apache istituito a lavorare con il genere PHP di out of the box. Quindi, ciò che realmente accade è quando si va a uno dei vostri siti web come, ad esempio, host locale barra index.php o qualcosa del genere, è il vostro browser invia tale richiesta, e quindi Apache è seduto lì e figure fuori a che fare con esso. E l'azione da eseguire che il codice in index.php e poi inviarlo di nuovo. Quindi c'è questo. Così abbiamo una sorta di parlato. Quindi potrebbe solo servire un file statico o eseguire codice PHP e quindi problema la risposta. Allora una domanda comune che può venire up è bene, come abbiamo davvero a che fare di avere più utenti Allo stesso tempo? Quindi, immaginate se si stesse scrivendo un web server, se si ha un server web che stavi tentando di scrivere qualcosa come C o qualcosa di simile, in pratica si può pensare a come ci potrebbe essere una qualche sorta di codice che avrebbe ricevuto la richiesta, ma poi ha a che fare tutto questo lavoro su di esso. Può essere necessario, per esempio, contattare l' database o qualcosa di simile. Giusto? E poi sarebbe fare questo tipo di lavorazione e poi rimandato la risposta. Ecco, questo è come l'alta Panoramica livello. Ma non è immediatamente evidente come si può farlo in modo che due persone o anche 1.000 persone potrebbero funzionare con il tuo web server nello stesso tempo. Quindi la soluzione che utilizza Apache è chiamato thread o processi. Così si può avere sentito parlare di questi termini prima. E 'OK se non lo avete, ma basta pensare su thread o processi come modi per un sistema operativo o un programma utente o qualcosa di simile o di un server web a una sorta di eseguire più cose contemporaneamente. Così si può avere sentito il termine come thread di esecuzione. Quindi è un po 'come sei una sorta di multitasking. E se avete visto sulla scatola del laptop, o qualcosa del genere, multicore, cosa si può fare è che si può eseguire due thread diversi su diversi parti della CPU in modo che possano effettivamente accadere allo stesso tempo. Quindi questo è davvero potente. E questo è una specie di Apache soluzione a questo problema. Quindi ci sono un po 'come tutte le edizioni con questo approccio però? Quindi credo che tipo di loro scrissi lì. Ma entrambi sorta di usare un sacco di memoria. È molto costoso creare un filo o un processo. E parte del ragionamento è che solo come quando si sta eseguendo un programma C come il vostro principale e poi che le chiamate un'altra funzione, che ha qualche tipo di pila. Così discussioni richiedono anche un intero pila separato che può essere molto grande. E se si può immaginare di avere tonnellate di gli utenti sul tuo sito, si avrebbe un sacco di diversi thread. Questo è un sacco di pile a gestire e mantenere. Quindi è il consumo di memoria di grandi dimensioni. E poi, anche, diciamo che hai solo una CPU, o diciamo che hai più thread di quello che hai tali multicore. Giusto? Quindi diciamo che trovassi 10 thread e si aveva solo cinque CPU. È genere di dovete fare questa cosa, dove si passa tra la corrente uno che è in esecuzione, perché si non è possibile eseguire tutti e 10 in una volta. E questo si chiama un cambio di contesto. E questo termine ha in realtà un paio di contesti diversi, ma facciamo solo pensare ad esso come di commutazione tra due thread. Che può essere piuttosto costoso, perché fondamentalmente ciò che dovete fare voi è dovuto smettere di quello che stai facendo, salvare il stato di quel filo conduttore, e poi passare a qualche altra parte. Quindi non tutti i tipi di consultare la motivazione del perché thread e processi potrebbero essere un po 'ingombrante? E hai avuto una domanda? OK. Freddo. Qualcuno ha delle domande? OK. Quindi, se facciamo un passo indietro per un secondo, c'è un po 'come un osservazione che possiamo fare in merito un sacco di applicazioni web. E questo è davvero che un sacco di loro in realtà non fanno molto utile lavorare all'interno di un thread. Così qualcuno ha iniziato il P impostare sette a tutti? Quindi si vuole descrivere, forse alcune delle parti? Hai lavorato su login o qualcosa di simile? PUBBLICO: No. KEVIN Schmid: OK. Si figuri. Scusi. Ma in fondo, nella serie P, sei andando a fare un sacco di specie di query a un database per ottenere qualche informazioni dal database. E che il codice sta per fare, ciò che di processo Apache o quel filo Apache sta per essere fare mentre ha per contattare l' banca dati è che è una sorta di sarà seduto lì e sta andando ad essere attesa per il database di rispondere. Ora che potrebbe non sembrare un grosso affrontare perché il database è sulla vostra Apparecchio CS50, giusto? Ma vi è una sorta di rete latenza lì perché ora il web server deve emettere la propria richiesta di il database per comunicare con il database e quindi ottenere che informazioni indietro. Così ora è come bene attendere per me, io sono intenzione di andare a prendere qualcosa dal database e poi c'è un molta attesa in corso. Ritiene che senso? E per alcune cose non è poi così male. Se deve solo, per esempio, memoria ad accesso, che non è come orribile latenza di I / O. E quando dico, ho latenza di I / O, quello che sto riferisco è come qualsiasi tipo di come input output. Ma per accedere a un file sul disco, come se volevo servire la statica HTML file che è stato sulla mia pagina web o qualcosa di simile, io tipo di deve fermarsi per un po ', leggere il file dalla disco e quindi in quel processo sto aspettando. Non sto facendo un lavoro utile. Questo non è vero per tutto, ma è comune in applicazioni come P set sette e un sacco di applicazioni che non sei in realtà fare molto pensare. E quando dico pensare, voglio dire come il lavoro computazionale. Lavoro in modo computazionale potrebbe essere qualcosa come, ad esempio, si voleva scrivere un web server che appena calcolato il numero di Fibonacci all'ennesima potenza. Che non suona come un particolare divertimento server web. Come non mi aspetto che il sito sia il prossimo Facebook, ma che è un po ' tipo di lavoro di calcolo. E si può immaginare che la sostituzione con qualche altro tipo di interesse lavoro di calcolo. Diciamo che stavi scrivendo qualcosa quello calcolato i gradi di separazione tra due persone o qualcosa di simile. Quindi, che cosa comporta un qualche tipo di calcolo, giusto? E anche allora, per farlo avete ancora per fare un sacco di attesa per forse si deve interrogare un database per cercare su chi è amico di chi o qualcosa di simile. Quindi non è quel tipo di concetto lavoro di calcolo. Ritiene che senso? Qualcuno ha delle domande? Oh, e credo che ho messo server di chat c'è poiché i server di chat sono una specie di un altro buon esempio di questo. Un server di chat non ha fare molto pensare. Deve solo aspettare che la gente inviare messaggi e poi quando lo fanno, li inviano. OK? Quindi, solo per ricapitolare di nuovo, Apache e server web simili come quella di un fork sacco di thread e processi che può essere di tipo uno spreco. Quindi credo che la domanda che può venire da che è abbiamo bisogno di avere più thread e processi? Che cosa succede se abbiamo avuto solo uno? Quindi cerchiamo di specie di dipingere un quadro di ciò che questo sarebbe simile. Quindi cerchiamo di usare un solo thread. OK? Quindi, solo immaginare questo con un solo thread. Supponiamo di non stavamo facendo veramente molto utile - e quando dico utile, intendo il lavoro computazionale - in quelle più thread prima. Quindi cerchiamo di tipo di consolidare tutto in un unico thread. Così che cosa se avessimo un thread che tipo di va solo intorno nel ciclo e controlli costantemente fatto qualcosa nuovo accada. Così, per esempio, qualcosa di nuovo è accaduto potrebbe significare ho qualcosa di nuovo da il database, o qualcuno mandato me una nuova richiesta HTTP. Quindi questi sono i tipi di eventi che questo accada, giusto? E poi che cosa posso fare quando quelli nuovi le cose accadono è in questo stesso thread di esecuzione, questo singolo filo di esecuzione, posso chiamare un codice che avrebbe gestito quella cosa particolare. Così, per esempio, se ho qualcosa di nuovo dal database, ho potuto eseguire il mio piccola parte di esso che computazionale in realtà solo prepara la cosa giusta per rispedire per l'utente. Così fa questo tipo di senso? Ma quali sono realmente le implicazioni di questo? Giusto? Perché abbiamo scritto un sacco di codice che - e sto solo andando a saltare avanti nelle diapositive se è OK. Quindi, se non ti dispiace, io sono solo andando a fare un passo indietro. Quindi questo genere di cose è chiamato un ciclo di eventi. OK? Ed è una specie di base idea dietro Node.js. Così che cosa Node.js sta facendo veramente come web server è c'è un unico filo che è fondamentalmente andando in giro ad anello come un po 'un tipo di sotto la cappa di Node.js che è costantemente controllo, abbiamo ricevuto nuove cose? E poi verrà eseguito gestori che si imposta. Ma una buona domanda da porsi è, come possiamo rendere questo accada con le cose esistenti? Così ho messo una riga di codice C qui che sembra praticamente come si sta aprendo un presentare, giusto? Mi Ha appena uscito con un album. Così ho dovuto aprire il suo un nuovo file. Quindi il modo nostro codice C per il funzionamento - e credo che il motivo per cui ho scelto file è stato perché questo è una specie di misura del lavoro di I / O che abbiamo fatto in C in un senso che non c'è input output. Quindi chiamiamo questo codice fa f aperto. E poi nella riga successiva del nostro programma, possiamo ora lavorare con f. Quindi questo sarebbe un esempio di qualcosa che è come sincrono o blocco perché in quella prima linea vi stiamo aspettando fino a quando non ottenere il file aperto. Così sulla seconda linea, sappiamo che può funzionare con f, ma questo significa che che la seconda linea non può davvero correre fino alla prima riga è fatto. Ritiene che senso? Quindi questo sarebbe male mettere in un gestore eventi. E la ragione di ciò è che questo tipo di attese, giusto? Quindi questo ci sarebbe tornare la stessa cosa. E ora non avremmo nemmeno la vantaggio di più thread o processi perché abbiamo ottenuto un thread in Node.js. Questo fa senso per tutti? AUDIENCE: Aspetta. Quindi qual è la sostituzione? KEVIN SCHMID: Oh, quindi sì. Quindi ho intenzione di arrivare a la sostituzione. OK. Così che cosa se avessimo qualcosa che sembrava come questo? Quindi, cosa succede se ora ho modificato f aprire un po '? Così sto passando stesso due argomenti come prima. Amo ancora la nuova canzone che è venuta fuori con. Ma io sto passando una terza cosa che è questa variabile chiamata codice. Ma che cosa è in realtà il codice in questo contesto? E 'come una variabile C regolare? Si tratta di una funzione, giusto? E questo può essere un po 'strano perché In realtà sono come ora passare un funzionamento in un'altra funzione. Quindi un paio di cose da notare su questo. Uno, non sto effettivamente chiamando la funzione di codice. Quindi non si vede codice con il parentesi sinistra, parentesi di destra. Sto solo passando codice. E in C, ciò che questo sarebbe effettivamente fare mi è dare un puntatore a quella attuale codice, e quindi questo potrebbe funzionare. Ma basta pensare a come sei passando il codice da eseguire quando che il file viene aperto. Ma ciò significa che ora il resto del mio programma che potrebbe fare altre cose, può continuare a fare altro roba mentre noi, in realtà non aspettare, ma basta avere nella parte posteriore della testa che quando è aperto, percorso che di file codice in alto. Ritiene che senso? E ora l'idea dietro Node.js è che il codice roba do con f parte dovrebbe essere abbastanza breve e semplice e semplice e non realmente essere molto computazionalmente intensive. Può avere per aprire un altro file, ma che dovrebbe anche essere piuttosto veloce perché dovrebbe dire solo fare un altro f aprire e poi chiamare questo altro codice. Quindi, solo per essere completamente chiari, f aprite che fa la nuova canzone di Katy Perry mp3 fatto, che sta andando verso la bella molto tornare immediatamente. E allora possiamo solo continuare a fare altre cose perché tutto ciò che ora f invito aperto non si dice fondamentalmente la sottostante f codice aperto aprire questo file e quando hai finito di aprire questo file o quando si ottiene indietro, quindi eseguire il codice. Ma in realtà non esegue tale codice. E hai avuto una domanda? AUDIENCE: Lei sembrava implicare alcuni volte che l'aggiunta computazionalmente codice intensiva sorta di rompere il [Incomprensibile] sistema guidato. [Incomprensibile]? KEVIN Schmid: Questa è una grande domanda. Quindi io in realtà sono un esempio di come è possibile integrare computazionalmente intensive codice in un po '. Così, quando si arriva a esempi di codice, Sarò sicuro di tirare quella. Che è OK? Grazie. Qual è il tuo nome? AUDIENCE: Aaron. KEVIN Schmid: Aaron porta in primo piano un buon punto, cioè che se avessi codice computazionalmente intensive in la roba che fare con la parte F, il resto della il mio programma non può funzionare e non può ascoltare per le nuove richieste o nulla fino a quando tutti che roba è finito. Quindi, se sto scrivendo il codice Nodo in generale se non facciamo qualcosa come sto andando di suggerire più tardi, quando guardiamo la esempi di codice, devo essere sicuro che il mio codice non legare questo ciclo di eventi. Ritiene che senso? OK. Freddo. Quindi Node.js offre questo contesto che è possibile costruire questi event-driven server con. Così ha questo tipo di asincrona non-blocking I / O biblioteche, che le librerie standard C che siamo stati lavorando, come se solo usarli nello stesso modo che abbiamo stato il loro utilizzo con F apre e roba, quelli che stanno bloccando perché in realtà si deve aspettare per il file da aprire. Ma Node.js che ti dà e lega sostanzialmente in Google V8 Motore JavaScript che è la ragione che Chrome è così veloce in lavorazione JavaScript perché ha questo motore V8. Quindi so che suona come una di quelle WWDC conferenze per gli sviluppatori cosa dove hanno appena gettare un mazzo di numero di lettera di cose per i processori e dire questo è così cool. Ma è bello che hanno fatto questo perché JavaScript - o forse se non hai familiarità con JavaScript ma perché non abbiamo avuto le lezioni su di esso - ma JavaScript è interpretato lingua. E questo è un punto importante. Quindi è importante per la nostra web server per essere veloce, giusto? E se fossimo solo in esecuzione di JavaScript codice che è stato interpretato con solo qualsiasi vecchio interprete potrebbe essere lenta. Quindi i benefici del nodo di avere questo interprete super veloce V8. E io non so se hanno chiamato perché lo schiaffo V8 in fronte cosa, ma OK. Così ho preparato alcuni esempi a questo URL. Dopo il seminario, sto sorta di andare a parlare di come è possibile ottenere insieme Node up, ma per ora, ho solo una sorta di voglia a piedi attraverso alcuni esempi di codice. Quindi, se si vuole seguire, tutte le il codice sorgente è disponibile qui. OK? Quindi lascio questo URL per un po '. E poi io sto solo andando a passare nel terminale. Sono tutti bene con questo URL? Quindi ho intenzione di passare a mio terminale qui. Quindi, ecco il codice che Ho per oggi. Perché non cominciamo con simpler.js file? L'altra cosa è che tutto questo codice sta per essere scritta in JavaScript che si può o potrebbe non essere a conoscenza. Credo che un paio di cose è che un sacco di codice JavaScript è il tipo di sintassi e la struttura è molto simile a C, in modo da poter sorta di prenderlo come si va avanti. Ho cercato di scrivere un sacco di codice di partenza di questo in un modo che è simile a C in modo che sia un po 'più leggibile. Ma man mano che procediamo, sarò dimostrando alcune delle ulteriori funzionalità di JavaScript che sono genere di freddo. Ma diamo un'occhiata a questo programma di esempio. Credo che tutto è tagliato fuori là. Sto solo andando a riparare quello reale veloce se va bene o no. Non so cosa sta per fare. È un po 'meglio? Riesci a vedere la var e roba? OK. Quindi, la prima linea è come il JavaScript versione di una variabile dichiarazione. Quindi, solo per evidenziare ciò che questo sarebbe sembra in C. Quindi questo è proprio come Indice di me dicendo uguale a tre o qualcosa di simile. Quindi non ha specificato che tipo. JavaScript ha i tipi, ma è molto dinamicamente tipizzati in natura, quindi non ha fornito alcun tipo di tipo su di esso. Così ha appena var. Ecco come variabile. OK? E sto chiamando questo HTTP variabile. E alla mia destra, ho l' espressione che voglio mettere in HTTP. E questo dice richiedono HTTP. Quindi questo è una specie di simile da includere. E 'un po' più come potente di includere nel senso che includono sarebbe solo copiare e incollare l'intestazione file per i prototipi di funzione o qualunque sia con le definizioni del tipo. Ma richiedono che sta realmente accadendo per farci il codice. Così si può pensare ad esso come l'importazione del codice. Quindi, in qualche parte del modulo Node.js sistema o qualsiasi altra cosa, hanno tutto questo Codice server HTTP, quindi sono solo recupero per la mia uso personale in questo programma. OK? Allora ho questa funzione che ho scritto. E notare non ho dovuto specificare il tipo restituito o il tipo di argomenti ancora. Così tipo di loose digitato che tipo di senso. Due argomenti che prende in, la richiesta e la risposta. Ecco, questo è concettualmente un po 'come familiare dalla foto che avevamo sullo schermo prima perché otteniamo questa richiesta che noi avere dall'utente. E poi abbiamo una risposta che possiamo scrivere cose. Quindi la prima linea di questa fa res.writeHead 200 e poi questo tipo di contenuto plain text. Quindi cerchiamo di questo pezzo a parte un po '. Quindi cerchiamo di concentrarsi solo su res.write per un po '. Così scrittura è, fondamentalmente, e scrivere la testa, sono solo modi per una sorta di scrivere le cose alla risposta. OK? Così scrittura testa, se qualcuno ricorda dalla lezione HTTP, fare voi ragazzi ricordare le intestazioni al top della cosa HTTP? Allora perché non faccio solo Demo intestazioni vero rapidi. Vorrei che essere stata utile? O dovremmo appena sorta di - OK. Certo. Così, quando il browser va a google.com o qualcosa di simile, In realtà c'è un po 'di più - questo è come un segreto - c'è come un po 'più di informazioni che passa attraverso il tubo di una semplice la piccola ricerca e tutto. Quindi, per mostrarvi questo, sto andando di utilizzare un programma chiamato Curl. OK? Quindi questo è qualcosa che si può eseguire in la riga di comando di Mac OSX o in elettrodomestico o qualsiasi altra cosa. E così, se io Curl HTTP google.com, Vado a vedere l'HTML. E questo è, in verità, solo la HTML che tipo di voi dice di reindirizzare www se il tuo browser non lo fa gestire automaticamente l' reindirizzamento. Quindi questo è solo HTML, ma ho intenzione da aggiungere a Curl questo trattino I bandiera. OK? E questo sta a dimostrare me le intestazioni. Quindi questo è anche informazione che viene attraverso quando ottengo questa risposta. OK? Così in alto, si vede questo HTTP 301 trasferirsi definitivamente. E questo è una specie di importante perché questo si riferisce al codice di stato. Così il 301 ecco il codice di stato, che è fondamentalmente solo un numero intero che racconta il browser o chiunque sia la lettura di questo, se si fa finta che sei un browser e si sta vedendo questo, in pratica ora se si guardano che e si vede un 301, sai che ho fare qualcosa di speciale basato su 301, o qualcosa di speciale è accaduto basato sul 301. Così dice trasferì definitivamente. E poi, in fondo, abbiamo un gruppo di coppie di valori chiave. Così otteniamo la posizione è www.google.com. E poi genere di tutta questa roba, ma in fondo, ciò che la posizione è detto è la nuova posizione è a www.google.com. Così ora se si va a google.com, ti sorta di vedere il tipo di browser che lampeggiano per un secondo e poi si reindirizzare destra di nuovo a www.google.com. Quindi, le risposte possono contenere queste intestazioni. E un paio di cose da sottolineare. Quindi diciamo che eravamo in realtà di successo a visitare una pagina web. Allora lasciami andare su - che cosa è un buon sito web? Sto male al pensiero di buona siti in loco. AUDIENCE: Wikipedia. KEVIN Schmid: OK. Facciamo Wikipedia. Così qui mi sono commosso. Oh aspettare. Ero? Sì, ero. OK. Così ho avuto modo di fare www. Quindi ho intenzione di fare www. E come potete vedere, qui è tutto il codice HTML che il browser sarebbe processo per Wikipedia. Ma se continuo a scorrimento qui, quello che vedrò in cima - wow, c'è un sacco di HTML su Wikipedia - ma quello che posso vedere in alto: ecco questo codice di stato 200 come opposto al 301 che ho visto in precedenza. E notare che ha una bella OK amichevole accanto ad essa. Quindi questo è come il buon codice di stato. Ritiene che il numero 200 sembra familiare? Sì, perché quando l'ho fatto simpler.js, Ho scritto una 200 lì. Ecco, questo è fondamentalmente dicendo raccontare la del browser o chi sta cercando di arrivare a ciò che essi hanno avuto successo. O che un po 'come noi erano troppo successo. E c'è questo tipo di sintassi speciale in Javascript per dichiarare una Mappa di questi tasti come tipo di contenuto e questi valori come testo normale. Quindi, se si guarda alla risposta che abbiamo tornato da Wikipedia prima, - Ho intenzione di provare a scorrere un po 'più veloce - avete questi tasti come server di e questi valori Apache. Quindi hai chiavi e valori. Ed è possibile specificare questo Nodo cosa mandare indietro. Quindi questo è effettivamente tipo di, in qualche modi, e per certi versi non è davvero, ma è un livello di poco inferiore che il codice PHP che si può essere scrivere per P impostare sette perché PHP e Apache sorta di prendersi cura di alcuni di queste cose per voi. In PHP, è possibile ignorare l'impostazione predefinita comportamento scrivendo le proprie intestazioni. Ma ai fini di questa, otteniamo di scrivere le nostre intestazioni. Così fa quella linea senso tutti, la linea testina di scrittura? OK. Impressionante. Allora quello che faccio io finisco la risposta dicendo ciao mondo. OK. Ma questo è solo una funzione chiamato richiesta handler. Così ora io in realtà devo genere di fare qualcosa con questa funzione, giusto? Quindi, ecco quello che faccio c'è è questo linea che fa eguali server di var HTTP.create server, quindi ho passare nel gestore richiesta. Quindi questo è una specie di nodo modo di creare un server. E accorgo che sto passando nel gestore richiesta. Quindi questo sta dicendo la createServer funzione che voglio che tu mi faccia una server e quando il server riceve una risposta, ho bisogno che tu chiami chiedere funzione del gestore. OK? In modo che la linea più o meno finisce subito. Così la linea di server var è fatto bene dopo aver fatto che praticamente. Voglio dire, si deve impostare alcune interna Stato di sapere che si dovrà chiamare tale funzione richiesta del gestore, ma non sta andando a sedersi lì e per esempio ha l'utente inviato me ancora una richiesta? È l'utente mi ha mandato ancora una richiesta? Quindi non blocca. OK? Così che cosa farà è fondamentalmente ora memorizza un puntatore a questo codice, questa funzione di gestione richiesta, e quindi verrà eseguito il codice quando qualcuno presenta una domanda. E poi facciamo server.listen. Il 1337 non è abbastanza arbitrario. Non avevo motivo particolare per scegliere quel numero. E 'stato del tutto casuale. Ma che specifica solo la porta. Così la maggior parte dei server web vedrai che utilizzare la porta 80 perché è gentile di come la convention. Quindi se vado a qualcosa di simile, Non lo so, Wikipedia.org, e ho messo colon 8 - oh wow, non si può vedere che. Mi dispiace. Ma se faccio Wikipedia - Io scrivo qui solo in modo che è chiaro sulla fotocamera. Ma se prendo questo in un browser con due punti 80, che specifica andare a Wikipedia.org sulla porta 80. Così è come come gli Stati Uniti hanno più porte come dove potete spedire cose da tipo di. Così è come andare a questa particolare collocare su questo server. OK. Così ho scelto 1337. C'è tutta una serie di numeri che si possono raccogliere. Non era del tutto speciale. Ma che cosa ho intenzione di fare adesso è ho intenzione di correre Node. Lasciami entrare effettivamente che una coppia linee verso il basso in modo che si può vedere. Io vado a fare il nodo, e sono andando a correre simpler.js. E parleremo di come arrivare Nodo istituito in un po '. Ma ora è solo in esecuzione il server. Quindi una cosa che possiamo provare che non possono essere eccitante è che possiamo effettivamente provare ad accedere in Curl. Così posso fare Curl, e la mia macchina host locale. Vedrete anche questa scritta come questo a volte. Host locale e 127.0.0.1 sono gentili di come il vostro computer di casa. Quindi è come parlare a proprio computer. OK. E poi posso dire 1337. Quindi, se io eseguo questa riga di codice, si dice ciao mondo. E se volevo vedere quella roba che avuto testo tipo di contenuto semplice o qualunque cosa, potrei anche mettere questa qui. E notare che non dice OK. E io ho solo testo. E poi c'è una specie di tutto questo altro roba che Nodo aggiungerà in lì per me. Questo non è super importante. Voglio dire, ci sono una sorta di tecnica aspetti di quel tipo sono di fresco per parlare, ma solo per mostrare si, ho anche il potere di cambiare questi circa. Quindi posso solo aggiungere un po ' di cose del genere. E poi adesso, se guardo nel mio uscita, sarà che. Quindi queste intestazioni significano certe cose ai browser e cose del genere. E intestazioni può sostanzialmente dire un browser come rispondere a qualcosa. Se hai mai sentito parlare di biscotti prima, o se sei mai stato infastidito da una pagina web modificando i cookies, o girato sul blocco dei cookie o qualcosa di simile. Si può effettivamente impostare i cookie in queste intestazioni. Così raccontano un browser come comportamento in alcuni casi. OK. Quindi era simpler.js. Qualcuno ha domande su tale file di codice sorgente? OK. Freddo. Quindi cerchiamo di togliere la r da quella e guardare simple.js. Quindi questo è più o meno lo stesso programma. Ho appena scritto un po 'diverso perché volevo ordinare di evidenziare alcune caratteristiche di JavaScript. Quindi notare che il gestore di richieste funzione è totalmente scomparso. Oh sì, hai avuto una domanda? PUBBLICO: Sì, gli argomenti che sono passati a quella funzione, che cosa sono? KEVIN Schmid: Così quelli sono Oggetti JavaScript. Nella documentazione Node.js, essa fondamentalmente dice quali metodi sono contenuti in essi. Abbiamo appena capita di avere l'accesso al questo metodo chiamato testina di scrittura e di fine e cose del genere. Ma c'è un intero gruppo più metodi. E, per esempio, come uno di loro in particolare sulla rec, si può fare qualcosa come rec.method che sarà dirà se si tratta di un HTTP get o Richieste HTTP POST e cose del genere. Quindi ci sono tutti i tipi di diversi proprietà, ma sono entrambi Oggetti JavaScript e hanno solo funzioni ad essi che si può scrivere cose. OK? Quindi notare che gestore di richiesta è totalmente andato. Ma il codice che ho avuto a richiesta gestore è ancora lì. Ho ancora questo res.writeHead e ho ancora questo res.end. E che questo è un esempio di un JavaScript è questa idea di un funzione anonima. e anonimo è come un nome adatto per perché non letteralmente avere un nome. Non c'è nessuna richiesta funzione gestore in là. Non ha nome, ma ancora è prendere un argomento. Così ho ancora rec e res. E ho ancora il codice. Questo è perfettamente bene Codice JavaScript. Così posso dichiarare una funzione senza esplicitamente dandogli un nome. E 'un po' di confusione in un primo momento. Ci sono alcune cose utili come che si può fare con queste funzioni anonime. Qualcuno ha domande su questo, o è OK solo, per ora, sorta di appena accettare che farà la stessa cosa? Yep? AUDIENCE: sono funzioni prima classe in JavaScript? KEVIN SCHMID: Sono in primo luogo classe in JavaScript. E proprio sapere che questi concetti di passando una funzione anonima come Questo vale anche per il codice JavaScript che si possono scrivere nel tuo progetto finale per il browser web troppo. Così, per esempio, nel JavaScript il browser, è anche un po 'evento guidato nel senso che quello che ti avere è quando l'utente fa clic su questo Pulsante, voglio che eseguire questo codice. Quindi è lo stesso tipo di idee del lato client quando un clic del mouse oppure mouse sopra qualche immagine sul vostro pagina Web, eseguire questo codice. Che si possono applicare ai server. Ecco, questo è un po 'come l'emozionante motivo per cui JavaScript è davvero un adeguate o alcune persone pensano che sia un linguaggio adatto per questo tipo di server di autista evento perché avete queste funzioni anonime. Avete l'idea di questo codice asincrono. OK. Qualcuno ha delle domande? OK. Quindi era simple.js. Quindi diamo un'occhiata a un altro o una coppia più. Quindi questo è sleep.js. Così è chiunque ha familiarità con la funzione sleep C? Da forse una delle lezioni precedenti o qualcosa di simile? Quindi, in pratica è possibile passare penso che un numero di secondi o se si sta utilizzando U dormire un numero di millisecondi o nanosecondi. E in fondo il programma sarà solo smettere esecuzione per tale periodo di tempo. Giusto? E poi si sveglierà alla fine e poi sarà solo continuare a correre il programma. Quindi questo server sorta di dà l'impressione di dormire. Quindi notare che abbiamo la stessa res.writeHead 200 con l'intestazione prima, ma poi stiamo chiamando questa funzione chiamata set timeout. Impostare il timeout è disponibile anche in il browser web Google Chrome o Safari o qualsiasi altra cosa. E in fondo quello che sta facendo qui si è tenuto in una funzione. Notate, ancora una volta, si tratta di un funzione anonima. Ecco, questo è genere di freddo perché siamo utilizzando una funzione anonima in un funzione anonima che può essere un po 'strano. Ma è in corso quella funzione, che è fondamentalmente dicendo - e il modo in cui questo le opere è in 5000 millisecondi, voglio di eseguire quella funzione che appena finisce la risposta e scrive hey. Quindi questo dà l'impressione di come dormire, ma il modo in cui questa realtà Works è faremo correre attraverso questa linea molto rapidamente. Stiamo solo scrivere qualcosa. E poi ci sarà anche correre attraverso questa linea molto rapidamente. Quindi non stiamo effettivamente andando aspettare cinque secondi. Stiamo solo andando a correre questo codice all'istante. E poi c'è, ancora una volta, questo piccolo ciclo di eventi che ha ora questa cosa registri che, in fondo è solo costantemente andando in giro in un cerchio e guardando l'orologio in un unico filo e detto, ha cinque secondi passato ancora? E poi quando vede che la seconda mano si è mossa come cinque secondi o qualunque cosa, poi si sveglia e dice: oh, cosa devo fare? Oh, devo eseguire questo codice. E poi sta andando a eseguire res.end hey. Così ancora una volta, stiamo mai aspettando qui. Quindi non è che questo codice all'interno di questa funzione sta andando a prendere cinque secondi per l'esecuzione. Questo codice verrà eseguito praticamente istantaneamente, almeno rispetto a i cinque secondi che stavamo parlando in precedenza prima. Quindi, solo per mostrare in azione, Posso fare Node.sleep.js. E ho fatto rovinare qualcosa? Forse. Scusi. Vediamo cosa possiamo fare per risolvere questo problema. OK. Quindi sicuramente utilizzare Node.js. Sto solo scherzando. OK. Solo un secondo. OK. So di cosa si tratta. Quindi il problema è che nella mia altra scheda qui, stavo correndo nodo già che stesso indirizzo, 1337. Quindi l'errore che questo ha gettato, se guardiamo al reale da vicino, è l'indirizzo in utilizzare, EADDRINUSE. Quindi ero già usando 1337 qui. Quindi, se chiudo questa via, e poi ho adesso provate a eseguire questo, si spera, tutto andrà bene. OK. Così si può avere solo una cosa tipo di ascolto su una porta in una volta. Un'altra soluzione sarebbe stata per me per modificare solo quel programma e fare che sia come il 1338 o qualcosa del genere così. Ma ora il sonno è in esecuzione. Quindi cerchiamo di realmente provare in Browser questa volta perché è un poco commovente vedere in un terminale. Così sto solo andando per andare a quella 127 indirizzo di nuovo a 1337. E se si può vedere - Non so se è possibile - ma il mio browser di prendere una molto, molto lunga tempo per caricare o come cinque secondi. E poi, dopo che, finalmente conclusa la risposta. E non si vede perché la cosa viene spostato su un po ', ma se faccio questo un po 'più piccola, è può vedere che dice hey. Così ho preso il hey, ma dopo cinque secondi. E potrebbe essere un po 'più pulita da vedere qui sul terminale, quindi sono intenzione di fare un - facciamolo qui - facciamolo Curl tale indirizzo nuovamente con il 1337. E ho appena genere di dover sedersi qui per cinque secondi. Ma si noti che il server può accettare nuove risposte. Così la stampa hey. E per questo demo, fondamentalmente quello che Posso fare in questa altra scheda - quindi diciamo che faccio questo in un'altra scheda, Io vado a fare Curl e lo stesso cosa di nuovo. E ho intenzione di provare a calciare questi ragazzi fuori allo stesso tempo. Quindi ho intenzione di fare questo, e sono andando a correre qui e io sono intenzione di farlo di nuovo. E facciamo in modo che si può vedere entrambi. Quello stampato hey e quello stampato hey tutto il modo a - facciamolo di nuovo l'esperimento. In realtà, usiamo questo ingannare, se va bene. Quindi ho intenzione di usare una shell che cosa mi permette di correre fondamentalmente due copie di questo programma in parallelo. Quindi sarà eseguito il primo programma e il secondo programma in parallelo. Così ora se premo Invio, sta andando a fare tale richiesta più o meno istantaneamente allo stesso tempo. Quindi cerchiamo di dare a questo un colpo. Così ora notare che dice due processi. E se siete curiosi, che 27.000 numero è fondamentalmente l'ID di processo. E poi notare, hanno stampato hey allo stesso tempo. Non era come abbiamo dovuto aspettare cinque secondi per uno e poi, dopo che, cinque secondi dopo ottenere la seconda. Ecco, questo è una specie di, in qualche modo, è non proprio la prova, ma è evidenza intuitiva che non è solo come aspettare cinque secondi e il blocco l'intero thread. OK fresco. Così Aaron ha fatto una domanda in precedenza che era, beh, cosa se non facciamo qualcosa - Yep? AUDIENCE: Aspetta. Come è diverso da buffer di printf, però? Non si fa automaticamente? Perché dobbiamo preoccupare? KEVIN SCHMID: Oh, hai potuto dire che più una volta? AUDIENCE: Non gli piace buffer di printf fare la stessa cosa? KEVIN Schmid: Il buffer printf? AUDIENCE: Già. OK. Non era in uno dei quiz erano parlando di come se a destra printf qualcosa e poi lo hanno in pausa una secondo, e poi avete ciclo di dieci tempi, sarà attendere dieci secondi e poi printf tutto insieme? KEVIN Schmid: Oh, OK. AUDIENCE: Sta facendo la stessa cosa allora in questo caso? KEVIN Schmid: Quindi la domanda era sostanzialmente in uno degli ex quiz o qualcosa del genere, c'era una domanda che in sostanza se dici di stampa f 10 cose alla volta e poi dormito come in il processo di stampa quelli fuori, alla fine per qualche motivo, sarebbe basta scaricare quelli tutti fuori sullo schermo. Quindi c'è una specie di due diversi concetti qui. Quindi credo che una cosa è che, in questo caso, abbiamo a che fare con due diversi sorta di gente che chiede server per le cose allo stesso tempo. E la ragione che il tipo di printf attende così e discariche fuori tutto allo stesso tempo è più legata al come printf tipo di - quindi il modo printf è in realtà implementato è che ha sostanzialmente quella di parlare con il sistema operativo di scrivere che roba alla console. Quindi non vuole fare tutto questo roba subito quando si dice printf alcune stringhe perché questo potrebbe ottenere costoso se deve farlo ogni volta. Quindi, se si fa printf hey, il programma Non potrebbe effettivamente stampare tale immediatamente alla console. Si potrebbe dire, ok, l'ho scritto. E poi tipo di aspettare per voi di dare un po 'più prima realmente scrivendolo nella console. Quindi la ragione che quello era il caso - ed è una specie di estraneo al sonno - è che il sonno è stato una sorta di appena iniettato in là per dimostrare l' fatto che non scrive esso sincrono. Ma la ragione di ciò è solo prestazioni in modo che non c'è bisogno di fanno si che molti contatti il sistema operativo. Ma qui, quello che stiamo realmente cercando di fare con questa cosa il sonno è solo spettacolo che quando abbiamo due persone che visitano questo sito, non sta andando a mettere loro in una linea dove sta andando a dire Devo aiutare, e poi quando sono completamente finito aiutandovi dopo che queste cinque secondi, quindi ho intenzione di passare alla persona successiva. Così richiesta della prima persona non legare tale ciclo di eventi se questo ha un senso. Ma qui è in realtà un esempio di qualcosa che legherà il ciclo degli eventi. Quindi, ecco una funzione orribile calcolare l'ennesima Fibonacci. E 'letteralmente il modo peggiore possibile calcolare il numero di Fibonacci all'ennesima potenza. E questo è in realtà solo di riconoscere dove questo è venuto da, c'è in realtà - Voglio dire, si può provare ad andare a trovare - ma c'è come una lunga blog post che qualcuno ha scritto. E 'come una di quelle cose Reddit. Ma qualcuno ha criticato Node.js, e hanno usato questo come esempio. Così ho sorta di voluto mostrare solo due diverse prospettive solo per ottenere una conoscenza generale dei concetti dietro queste due cose. Ma questa è scelto come solo un orribile, computazionalmente terribilmente inefficiente modo intensivo per calcolare la numero di Fibonacci all'ennesima potenza. Così come nota a margine, perché è orribile come in un modo? Yep? AUDIENCE: Diciamo che iniziare con 1.000. 1.000 divide in 999 e 998. Ognuno di questo si divide in due cose. Ognuno di questo si divide in due cose. KEVIN SCHMID: Giusto. PUBBLICO: Per tutto il tragitto verso il basso. KEVIN SCHMID: Esattamente. Quindi, solo per ripetere per la fotocamera, se chiamare fib su come 1.000 o qualcosa del genere così, ovviamente non è inferiore a o uguale a uno, quindi ho intenzione di Vado a questo altro caso, e poi vado chiamare fib 999 più fib 998. E poi praticamente tutto di quel lavoro che fib 999 fa è tipo di a questo livello. Se si va giù, è ancora più ridondante Oltre a questo, ma se avete solo Ritieni calcolo fib 998 ottiene noi abbastanza vicino a fib 999. Quindi dovremmo davvero essere un po 'più intelligente su come tipo di riuso questi, ma non stiamo riutilizzando queste cose a tutti. Quindi potete immaginare questo gigantesco, gigantesco albero che è semplicemente orribile. Ma comunque, OK. Quindi era fib. Ci vuole solo un po 'a correre. Yep? AUDIENCE: [incomprensibile]. KEVIN SCHMID: Oh, hai potuto ripetere la domanda? AUDIENCE: [incomprensibile]. KEVIN Schmid: Oh, quindi questo è solo codice che sta per essere una sorta di sul lato server. Quindi questo non sta per essere trovato nel browser o nulla. E 'fondamentalmente quello che abbiamo è che quando l'utente qui praticamente marche loro richiesta di nuovo, quando abbiamo una sorta di fare una richiesta, stiamo andando a chiamare questa funzione sul lato server. E poi avremo il risultato di nuovo di chiamare tale funzione. E poi ci limiteremo a stamperemo all'utente. Così l'utente in realtà non si occupa con questa funzione troppo. Problemi che la questione? Ritiene che senso? OK. Freddo. Così ancora una volta, facciamo tutta questa res.writeHead cosa in cui stampiamo l'intestazione. E poi finisco la risposta facendo il numero magico è fib 45. Così facciamo solo eseguire questo server. Quindi ho intenzione di fare un nodo fib.js. Così ora il mio server fib è in esecuzione. E poi qui, vado di fare uno di questi. OK? Così sto solo andando a dire, Curl. Così sta andando a prendere un po 'di tempo, ma speriamo presto finirà e stamperà che 45a Fibonacci numero. AUDIENCE: [incomprensibile]. KEVIN SCHMID: dovrebbe avere fatto abbastanza presto. Così dovrebbe prendere 5-6 secondi. Non so che è solo V8 essere super veloce, ma in ogni caso, si tratta di un molto breve esempio e volutamente inelegant di un non banale calcolo. Così dopo un po ', fa arrivare questo. Ma ora, cosa succede se faccio lo stesso tipo di esperimento come prima dove faccio due richieste allo stesso tempo? Così qui ho intenzione di una Curl su tale indirizzo, e io vado per fare un altro Curl. E ricordate, quando abbiamo fatto questo per la Dormire di server, quando abbiamo praticamente avuto lo dopo cinque secondi, hanno praticamente molto sia tornato a destra intorno allo stesso tempo. Quindi non era particolarmente legato. Ma proviamo ora. Ok, quindi abbiamo ottenuto i nostri due processi. Ricordate quelli che sono gli ID di processo. Ciò sta andando essere un po ' imbarazzante mentre stallo. Quindi cerchiamo di restare qui e aspettare. Così uno di loro dovrebbe venire indietro dopo come - OK, così è tornato. Ma allora perché non ha fatto il secondo uno tornare appena ancora? Yep? PUBBLICO: Il server non può fare nulla mentre è il calcolo così grande numero. KEVIN SCHMID: Giusto. Quindi la risposta è stata semplicemente che il server davvero non si può fare nulla, mentre è calcolare il numero di Fibonacci. Così ora ho appena ricevuto i miei due cose indietro. Ma credo che solo a pensare al codice un po 'di più, come sta funzionando e tutto. Quindi questa funzione ecco il codice che Ho detto che questo server per eseguire quando riceve una nuova richiesta in arrivo. Quindi è solo andare a correre attraverso questo intero codice, e poi sta andando andare ritornare al ciclo degli eventi e poi continuare verifica di nuovi eventi. Quindi, in pratica quello che abbiamo accadendo è il server è ascolto di cose nuove. La prima persona chiede cosa 45 è. Corriamo questo codice per calcolarlo. Questo codice richiede circa cinque per sei secondi per l'esecuzione. Poi torniamo al ciclo degli eventi e verificare la presenza di nuove richieste. Quindi questo è un esempio di come, se si avere cose che sono cosiddetto calcolo legato, o usare un sacco di calcolo, non il potere, ma come sono computazionalmente intensive - Credo che una cosa da dire su questo è che questa funzione fa totalmente, per la maggior parte, piuttosto utile proprio lavoro. Per tutto il tempo che tale callback funzione era in esecuzione, era abbastanza molto trascorrendo la maggior parte del suo tempo solo informatica numero di Fibonacci all'ennesima potenza. Ma abbiamo avuto un solo thread da affrontare. Nel modello Apache, quando due persone presentato la domanda per ottenere fib 45, si avrebbe avuto due thread differenti. E poi il lavoro del sistema operativo sarebbe stato, o il livello utente codice che gestisce i fili, avrei stato di affettare che sul CPU, o anche se hai avuto più CPU, distribuirli in modo uniforme in tutta la CPU in modo che fossero entrambi finitura all'incirca allo stesso tempo. Quindi, solo per mostrare come si può ordinare di - e questo non è un perfetto totale soluzione, ma una sorta di come possiamo fare tornare qui e fare un po 'meglio. Quindi quello che ho qui è un programma chiamato Fib C. E questo utilizza fondamentalmente un altro dei moduli di nodo denominato Il Modulo processo figlio. Così ho incluso che in genere superiore di come vorrei fare una libbra includere process.h bambino o qualcosa del genere. Ora ho accesso a questa variabile CP che ha tutta la mia funzionalità. Così ora quello che sto facendo in questa risposta gestore è sto correndo questo programma dot ridurre drasticamente fib 45. Quindi quello che ho fatto - e sto solo andando per uscire da questo programma per un po '- è ho scritto un programma in C che fondamentalmente calcola la numero di Fibonacci all'ennesima potenza. Così qui è solo un programma che ho scritto in C che calcola questo. Posso compilarlo, e posso correre esso dalla riga di comando. E sta andando a calcolare il Numero 45th Fibonacci. Quindi notare ci vuole solo più o meno a lungo. Probabilmente potuto usare dash 03 per ottimizzarlo o qualcosa di simile, ma ho appena fatto come regolare impostazioni del compilatore. E si stampa fuori. Ma ora, cosa sto tipo di fatto? Oh scusate, file errato. Così faccio la stessa roba con l'intestazione come prima. Allora faccio questo cp.exec. Così che cosa sta andando a fare è che è andando a eseguire questo programma. Ma il modo in cui funziona è che non sta andando ad aspettare che il programma per terminare. Dice solo in fondo eseguire questo programma. Quindi, fondamentalmente digitare questo nel prompt dei comandi tipo. E poi, quando hai finito con essa, eseguire questa funzione. Così ora abbiamo genere di ottenere questo cosa tutta restaurata come non stiamo aspettando. Fa quel tipo di senso? Yep? AUDIENCE: [incomprensibile]? KEVIN Schmid: Quindi questo sarà effettivamente aprire un nuovo processo per farlo. Quindi, questo è in realtà, in qualche modo, male, non super male, ma è importante dire che questo è una specie di tornare a, da un lato, l'Apache modello in cui facciamo thread e processi per ogni richiesta o processi per ogni richiesta. Quindi questo è una specie di analogo a quello che fa Apache. In alcuni casi, sarà sufficiente utilizzare un nuovo filo, che è un po 'più di luce il peso di un processo, ma Apache potrebbe finire sborsare un nuovo processo che è una specie di quello che facciamo qui implicitamente facendo dot barra fib 45. E allora in quel caso, ci genere di incorrere le stesse spese dei processi. Quindi questo è solo una cosa che puoi fare. Ma solo per mostrare questo tipo di esecuzione. E questo discorso è solo in realtà mira a presentando questo tipo di programmi come modo per mostrare diverse prospettive come progettare i server del genere. Quindi questo è in esecuzione, e quindi ora se faccio questa volta, ho avuto due ID di processo. Diciamo solo parlare cose da sottolineare. Così accorgono che sono incrementale. Che figata. Perché era 27.122 prima. Ma ora bando, sono tornati più o meno allo stesso tempo. E ora, una buona domanda per chiedere di perché era che il caso è, il cui compito Era ora di una sorta di fare queste cose sorta di fair play con l' altri, queste due istanze di dot barra fib 45 che mi sono imbattuto o che il Nodo Ran? Chi sorta di rende giusto che sia ottenere tipo di equilibrato fase di esecuzione? AUDIENCE: [incomprensibile]. KEVIN Schmid: Già. Quindi, fondamentalmente, quando faccio dot barra fib 45 o qualcosa del genere, ora è genere fino al sistema operativo di gestire l'esecuzione di tali programmi. E ora li può programmare su CPU diverse o li può pianificare. Si può tagliare il tempo che uno CPU ottiene o che ottengono per funzionare su una CPU. Quindi questa è l'idea che dietro. Questo fa senso per tutti? Così ora il nodo non è realmente giocando un parte a dividere questi compiti. OK. Ecco, questo è quasi per esempi. Volevo solo dimostrare una cosa perché un sacco di questo finora è stato non del tutto super-pratico in alcuni casi. Posso immaginare di tornare a casa dopo questo parlare e qualcosa e dire come, bene io tipo di uscito di quel discorso che Posso fare un server Fibonacci per il mio progetto finale. Così qui è solo una sorta di un altro esempio che si spera sarà - forse no, ma forse - un po 'di più sorta di rilevanti progetti definitivi e pensare in anticipo per cose del genere. Quindi questo è chat.js. Quindi questo è una specie di un certo campione il codice lato server che si potrebbe usare per configurare un piccolo server di chat come si può avere visto sul Facebook Chat o qualsiasi altra cosa. Quindi non sto dicendo che questo è come Facebook Chat, ma questo è una specie di come una buona - forse non bene, ma forse punto di partenza per una chiacchierata - buona server per il tuo sito web per un progetto finale. Quindi diamo un'occhiata a quello che sta facendo. Quindi stiamo ricevendo questa cosa speciale in alto, questo Var SIO equivale a richiedere Socket.IO. Quindi questa è un'altra cosa che non è così effettivamente venire in bundle con Nodo ma è possibile installarlo. E 'un modulo Node. Quindi è proprio come alcuni estensione al nodo. SocketIO è in realtà molto genere di freddo. E 'un'astrazione che, in fondo ciò che che fa è è che ti permette di avere questo flusso di comunicazione tra un web browser e un server web. Così, per la maggior parte finora, abbiamo avuto questi molto pratica un secondo o due secondo le comunicazioni tra un web browser e il server web. Quindi è fondamentalmente andare a google.com, get la roba, mandare indietro, e poi abbiamo finito. Stiamo parlando mai di nuovo fino al tipi di utente in qualcosa d'altro. Ma ciò che Socket.IO e simile tipo di le cose - e SocketIO è in realtà uno delle cose che è costruito come WebSocket che è una sorta di disponibile come parte di HTML5 - che ti permette di avere questo continuo dialogo. E questo è molto utile in un server di chat genere di cose, perché è un po 'come un dialogo continuo in per certi versi, perché se stai chattando con qualcuno, ora è possibile solo inviare un messaggio lungo il tubo, e poi l' server può inviare un messaggio per tubo per l'altra persona che sei chiacchierando con. E allora si può avere questo scambiare così. Ecco, questo è ciò che tipo di SocketIO è buono per. La ragione per cui SocketIO utilizza WebSockets come una cosa è che in Oltre a semplicemente vecchi WebSockets, lo fa anche alcuni trucchi per fondo rendere compatibile lo browser. Così browser come Internet Explorer purtroppo non supportano WebSockets a destra, fuori dalla scatola. Quindi usa un altro tipo di fresco pulito cose con Adobe Flash per consentire di avere il supporto cross browser. Ecco, questo è veramente utile. E in realtà, so che sto tipo di esecuzione sul tempo qui, ma CS50 Discutere, avete mai visto qualcosa come, non so, in bianco così e così è rispondendo a questo post o qualcosa del genere così, questa caratteristica? Questo è SocketIO. Così, quando qualcuno inizia a digitare nel discutere box per effettuare una replica o qualcosa, il browser che cos'è chiamato in SocketIO emette una sorta di evento che dice qualcuno è rispondere a questo post. Poi il server dice: OK, cosa devo fare? Bene, ora devo dire quegli altri ragazzi che sono in CS50 Discuti cercando in questo post che qualcuno sta rispondendo. Ecco, questo è ciò che tipo di SocketIO è bene per questo tipo continuo di flusso di dialogo. OK. Quindi quello che ho qui - e siamo appena intenzione di ignorare la matrice di connessioni per un po '- quello che faccio è faccio un altro ascolto. Ecco, questo è proprio il modo in Socket.IO è dicendo che ascoltiamo su questa porta. E poi faccio questo su connessione. Ecco, questo è solo fondamentalmente Socket IO modo di dire, quando riceviamo un connessione, ti voglio per eseguire questo codice. E notare che invece di avere rec e res passati lì mi hanno Socket. E questa idea Socket è fondamentalmente questo cosa che si può scrivere e leggere dal che ha l'utente del messaggi possibilmente. E i messaggi che si desidera inviare può passare attraverso quella Socket. Ritiene che senso? Quindi è questa cosa continua. Quindi quello che faccio è che io chiamo Socket.emit. Ed emettere prende abbastanza tanto due argomenti. Il primo argomento è una stringa solo rappresenta il tipo di cosa si sta emettendo. Quindi, in questo caso, ho l'uso questa stringa messaggio nuovo. E questo è solo fondamentalmente dicendo che il tipo di questa cosa, quello che sto invio, è un nuovo messaggio. Così si può ascoltare per tipi specifici come nuovo messaggio o qualsiasi altra cosa utilizzando dot su. Così connessione e utente inviato lì, se si guarda a dove noi chiamiamo punto su, quelli sono altre stringhe che rappresentano tipi di messaggi utente. Quindi è fondamentalmente si può avere questo emettono uno di questi tipi di messaggi, e poi fare qualcosa in risposta a uno di questi tipi di messaggi Così sto emettendo questo nuovo messaggio. Stiamo andando a ignorare connections.push per un secondo. Ma poi io dico, l'utente Socket.on inviato. Così ora è un po 'come quando l' utente mi manda un messaggio, voglio di eseguire questo codice. E notare che tale funzione anonima sta prendendo in questa variabile chiamata dati che è fondamentalmente andando avere il messaggio di utente. Così ora andiamo sorta di parlare la matrice connessioni. Quindi questo è progettato per un client di chat dove praticamente tutti sono in genere di la stessa chat room. Quindi, fondamentalmente, quello che dobbiamo continuare a intorno è certa matrice che, in fondo rappresenta tutte le persone in chat in per certi versi, se questo ha un senso. Giusto? Perché abbiamo bisogno di sapere chi quei ragazzi siamo in modo che possiamo inviare loro messaggi che altre persone inviano a noi. Così che cosa fa questo codice è quando l'utente invia un messaggio - che è il tipo di l'evento - stiamo andando a eseguire questo codice. E quello che facciamo è corriamo attraverso questo array che abbiamo chiamato le connessioni. E praticamente per ogni connessione tranne quello che è nostro, che è quello che dice questo codice, inviamo una nuova messaggio con tale messaggio allegato informazioni. Quindi, se si nota qui, quello che ho fatto quando l'utente in realtà fa un nuovo connessione è ho aggiunto con l' Metodo JavaScript.push, questo è fondamentalmente solo dicendo come voglio che Socket come un valore in la nostra collegamenti array. Così ora quando questo codice viene eseguito, sarà inviare le cose da quelle particolari connessioni. Quindi questo può essere un buon punto di partenza per fare un server di chat o qualcosa di simile. E il genere di cosa interessante è che il codice che vedete qui come su e emettono e roba del genere è lo stesso tipo di codice JavaScript che si sarebbe scrivere nel browser per interagire con il server. Ecco perché SocketIO è una specie di ordinato e utile in questo modo. Oh, e solo una cosa più reale veloce. C'era un progetto finale CS50 scorso anno che in fondo attuato una chat server Node.js. Penso che sia Harvardchats.org ma io non sono - OK. Io non sono sicuro di quello che l'URL sia, ma Posso trasmettere quello fuori in seguito. Ma è una specie di raffreddare ciò che si può fare con Node.js. Quindi spero che, in generale, voi ragazzi avete una buon senso di ciò che Node.js è utile e come si potrebbe forse applicare per il progetto finale. Sarò mando fuori ancora un po ' risorse con questo. E grazie per essere venuti. Grazie. [Applausi]