>> KEVIN SCHMID: Bună ziua tuturor.
Bine ați venit la seminarul CS50 pe Node.js.
Numele meu este Kevin.
Sunt un TF CS50.
Și eu sunt un fel de foarte incantati cu privire la acest seminar.
Cred că Node.js este foarte cool.
Sper că acest seminar poate fi utilizat ca un bun, cred, rampă de lansare pentru
unele dintre proiectele finale dacă sunteți interesat în utilizarea
ceva de genul Node.js.
>> Vom fel de a începe prin a seminarului doar vorbesc despre un pic de
fel de scalabilitate fundal perspective de Node.js, și apoi
vom trece la câteva exemple de cod.
Și voi avea codul de pe un site web, si poti sa te uiti la codul.
Și după seminar, voi sorta a vorbi despre modul în care puteți configura Node.js
pe computer.
>> OK.
Așa că hai să începem.
Deci, cred eu vreau doar să vorbim despre servere de web, într-adevăr, în primul rând.
Și pentru a începe această discuție, am practic au o diagramă care este de la
manualul folosit pentru CS61, care practic arată interacțiunea
între un proces de client, cum ar fi dvs. de web Browser-ul sau ca clientul dvs. scop sau
ceva de genul asta, si un server web.
Deci, acest tip de arata similar cu imagine pe care ați văzut-o în curs pe
Miercuri, unde, practic, avem unele Procesul client ca Google Chrome.
>> Și apoi pas este client trimite o cerere.
Astfel că poate fi ceva de genul Ei bine, să vizita, eu nu știu, CS50.net.
Așa că am emite această cerere.
Și nu oricine amintesc numele de protocol care specifică modul în care
cerere ar trebui să fie structurat?
Da.
>> Audiența: [inaudibil].
>> KEVIN SCHMID: Exact.
Deci, e ca HTTP, corect?
Deci, practic caietul de sarcini pentru modul în care că cererea ar trebui să fie de fapt stabilite
afară, pentru că la sfârșitul zilei, că cererea este într-adevăr la fel ca un
șir care, practic, spune eu vreau asta.
Și caietul de sarcini pentru care este HTTP.
Deci, asta e ca un protocol.
>> Deci, atunci serverul primește această cerere.
Deci, voi avea un server de web instalata în aparatul CS50.
E Apache.
Și în această săptămână, atunci când lucrați pe probleme set de șapte, veți fi de fapt de lucru
cu serverul web.
Deci, serverul primește această cerere, și atunci trebuie să fel de zgârie sale
cap si spune ca bine ce să fac cu asta?
>> Deci, bazat pe ceea ce se decide să facă, atunci ar putea fi necesar să contactați un fel
de resurse.
Și că resursa ar putea fi o mulțime de lucruri diferite.
Pentru unul, ar putea fi doar ca un fisier HTML static.
Așa că ar putea fi la fel ca și unele HTML, care este ca pentru
site-ul tau personal.
Acesta ar putea fi un fișier static ca o imagine sau ca un film pe care le au.
S-ar putea avea chiar pentru a vorbi la un fel de baze de date
cum ar fi o bază de date MySQL.
Așa că nu trebuie întotdeauna să comunice cu o resursă, dar în
unele cazuri, ar putea.
>> Deci, atunci ce se va face după ce că este o să
trimite înapoi răspunsul.
Și răspunsul pentru acest lucru este de asemenea, specificate de HTTP.
Deci, atunci clientul poate primi.
Se poate rupe în afară și-l proceseze.
Și atunci veți obține o pagină web cum ar fi Google sau CS50.net sau
tot ce te-ai dus la.
OK?
>> Deci, aceasta este interacțiunea de bază care am de gând să se ocupe cu.
Și suntem destul de mult va fi concentrându-se pe această parte a
interacțiune, serverul.
OK.
Rece.
Oricine are orice întrebări până acum?
OK.
>> Așa cum am spus, serverul de web primește această cerere HTTP și apoi emite această
Răspuns HTTP.
Și, ca și cum am vorbit despre înainte, Server web aparat CS50 este Apache.
Deci, atunci când voi lucra la P set de șapte, ai de gând să fie de lucru cu
Server web Apache.
Nu vei mai avea de a lucra într-adevăr cu Apache direct prea mult.
Ai un fel de a configura Apache un pic Când specificați gazdele virtuale sau
a v gazde, și vom obține pentru că într-un pic.
>> Dar, în esență, serverul de web Apache configurat pentru a lucra cu PHP fel
a scos din cutie.
Deci, ce se întâmplă cu adevărat este atunci când te duci la unul dintre site-urile dvs., cum ar fi, să zicem,
locale slash index.php gazdă sau ceva, este browser-ul dvs., care trimite
cerere, și apoi Apache este așezat acolo și da seama de a face cu ea.
Iar acțiunea este de a executa acest cod în index.php și
apoi trimite-l înapoi.
Deci nu e asta.
Așa că am un fel de vorbit despre asta.
Așa că ar putea servi doar un fișier static sau rula unele cod PHP și apoi problema
răspunsul.
>> Deci, apoi o întrebare comună, care poate veni up este bine, cum nu avem de a face cu adevărat
cu care au mai mulți utilizatori în același timp?
Deci, imaginați-vă, dacă ați scrie un web de server, dacă ați avut un server de web care
ați încercat să scrie în ceva cum ar fi C sau ceva de genul asta,
în principiu, vă puteți gândi despre modul în care există ar putea fi un fel de cod care
ar primi cererea, dar apoi o are de a face toată această muncă pe ea.
Acesta poate avea, de exemplu, contactați baze de date sau ceva de genul asta.
Corect?
Și apoi s-ar face acest tip de prelucrare și apoi
trimis înapoi răspunsul.
Deci, asta e ca și cum high Privire de ansamblu asupra nivel.
>> Dar nu este imediat evident cum te poate face acest lucru pentru ca doi oameni sau
chiar și 1.000 de oameni ar putea lucra cu dvs. server web, în ​​același timp.
Deci, soluția care utilizează Apache se numește fire sau procese.
Deci, este posibil să fi auzit de acești termeni înainte.
E în regulă, dacă nu ai, dar gândește-te cu privire la subiectele sau procese ca moduri de
un sistem de operare sau un program de utilizator sau ceva de genul asta sau un server web
pentru a executa un fel de multiple lucruri de la o dată.
Deci, este posibil să fi auzit termenul de cum ar fi fire de execuție.
Deci e un fel de ai un fel de multitasking.
>> Și dacă ați văzut pe caseta de dvs. laptop, sau ceva de genul asta,
multicore, ceea ce poate face este posibil alerga două fire de diferite pe diferite
părți ale procesorului, astfel încât să poată întâmpla, de fapt, în același timp.
Deci, acest lucru este cu adevărat puternic.
Și aceasta este un fel de a lui Apache soluție la această problemă.
>> Deci, există un fel de probleme cu această abordare, deși?
Deci cred ca am facut un fel de le-a scris acolo.
Dar ambele dintre ele un fel de folosi o mulțime de memorie.
Este foarte scump pentru a crea un fir sau un proces.
>> Și o parte din raționamentul este că doar ca atunci când rulați un program C
ca principal și apoi că apelurile o altă funcție, care are
un fel de stivă.
Deci, fire necesită, de asemenea, un complet stivă separată care
poate fi destul de mare.
Și dacă vă puteți imagina cu tone de utilizatorii de pe site-ul dvs., va trebui
o mulțime de fire diferite.
Aceasta este o mulțime de stive de gestiona și să mențină.
Deci, este un consum mare de memorie.
>> Și apoi, de asemenea, să presupunem că aveți doar un procesor, sau să presupunem că aveți
mai multe fire decât ați aceste multicores.
Corect?
Deci, să spunem că ai avut 10 de fire și ați avut doar cinci procesoare.
Ai un fel de trebuie să fac acest lucru în cazul în care comutați între curentul
unul care se execută pentru că nu poate rula toate 10 dintr-o dată.
Și care se numește o schimbare de context.
Și că termenul are de fapt o pereche de contexte diferite, dar hai să
cred că de ea ca de comutare între două fire.
Care poate fi destul de costisitoare, deoarece de fapt ceea ce trebuie să faceți este să vă
trebuie sa te opresti ceea ce faci, salva de stat de care fir de funcționare, și
apoi trece în altă parte.
>> Deci, nu toată lumea fel de vedea motivația de ce fire și
procese ar putea fi un pic mai voluminos?
Și ai avut o întrebare?
OK.
Rece.
Are cineva vreo întrebare?
OK.
>> Deci, dacă am lua un pas înapoi pentru un al doilea, nu e ca un fel de
observație pe care o putem face despre o mulțime de aplicații web.
Și că este într-adevăr că o mulțime de ei de fapt, nu face atât de mult utile
locul de muncă în interiorul de un fir.
Așa a început cineva pe P stabilit șapte la toate?
Deci, nu vrei să descrie, poate unele părți?
Ai lucrat la autentificare sau ceva de genul asta?
>> Audiența: Nu.
>> KEVIN SCHMID: OK.
Nu face nimic.
Scuze.
Dar, în esență, în setul P, esti va fi a face o mulțime de fel de
interogări la o bază de date pentru a obține unele informații din baza de date.
Și ce codul este de gând să faci, ce acest proces Apache sau
care fir Apache se va face în timp ce trebuie să contacteze
Baza de date este un fel de a merge pentru a fi stând acolo și că va fi
așteptare pentru baza de date pentru a răspunde.
>> Acum, că nu ar putea suna ca-i mare a face, deoarece baza de date este pe dvs.
Aparat CS50, corect?
Dar există un fel de rețea latenta acolo pentru că acum web
server are de a emite propria sa cerere de a baza de date pentru a comunica cu
baze de date și apoi obține că informații înapoi.
Deci, acum e ca si cum bine așteptați pentru mine, eu sunt duc să iau ceva de la
baze de date și apoi există o mulțime de așteptare se întâmplă.
Asta face sens?
>> Și pentru unele lucruri nu-i așa de rău.
Dacă are doar la, de exemplu, memorie de acces, că nu e ca
oribil I / O latență.
Și când spun, I / O latenta, ceea ce am referindu-se la este la fel ca orice fel de
ieșire de intrare.
Dar pentru a accesa un fișier de pe disc, cum ar fi dacă am vrut să servi static HTML
fișier care a fost pe pagina mea de web sau ceva de genul asta, un fel de trebuie să
opri pentru un pic, citit acel fișier in de pe disc, și apoi în
acest proces Aștept.
Eu nu fac de lucru util.
>> Acest lucru nu este valabil pentru tot ceea ce, dar se este comun în aplicații cum ar fi set P
șapte și o mulțime de aplicații că tu nu ești
a face de fapt mult de gândire.
Și când spun gândire, vreau să spun cum ar fi munca de calcul.
De lucru, astfel de calcul ar putea fi ceva cum ar fi, să zicem, ai vrut să
Trimite un server web care doar calculată numărul Fibonacci n-lea.
Asta nu suna ca o deosebit de server web distractiv.
Ca și cum nu s-ar aștepta ca site-ul să fie următoarea Facebook, dar că este un
un fel de muncă de calcul.
>> Și vă puteți imagina că înlocuirea cu un alt fel de interesant
lucru de calcul.
Să presupunem că s-au scris ceva că calculate gradele de
separare între două persoane sau ceva de genul asta.
Astfel că nu implică un fel de calcul, corect?
Și chiar și atunci, pentru a face acest lucru aveți în continuare pentru a face o mulțime de așteptare pentru, poate,
aveți pentru a interoga o bază de date pentru a căuta up care sunt prietenii cu care sau
ceva de genul asta.
Deci, nu există acest tip de noțiune lucru de calcul.
Asta face sens?
Are cineva vreo întrebare?
>> Oh, și cred că am pus servere de chat acolo deoarece serverele de chat sunt un fel de
un alt bun exemplu în acest sens.
Un server de chat nu are pentru a face mai mult de gândire.
Ea are doar să așteptați pentru ca oamenii să trimite mesaje și atunci când
ei nu, trimite-le.
OK?
>> Deci, doar pentru a recapitula din nou, Apache și servere de web similare, cum ar fi faptul că o furculiță
mulțime de fire și procese care poate fi un fel de risipitor.
Deci, cred că întrebarea care ar putea veni din care este avem nevoie pentru a avea
mai multe fire și procese?
Ce se întâmplă dacă am avut doar unul?
>> Deci, haideți să fel de vopsea o imagine de ce acest lucru ar arata ca.
Deci, haideți să folosim un singur fir.
OK?
Deci, doar imagina acest lucru cu un singur fir.
>> Să presupunem că nu au fost într-adevăr a face că mult util - și când spun
util, vreau să spun de lucru de calcul -
în cele mai multe fire înainte.
Deci, haideți să fel de a consolida totul într-un singur fir.
Deci, ce se întâmplă dacă am avut un fir de acest tip a merge doar în jurul valorii de bucla și
în mod constant controale făcut ceva nou întâmpla.
Deci, de exemplu, ceva nou sa întâmplat ar putea însemna Am ceva înapoi de la
baza de date, sau cineva a trimis mi-o nouă cerere HTTP.
Deci, acestea sunt un fel de evenimente să se întâmple asta, nu?
>> Și atunci ce pot face atunci când cele noi lucrurile sa se intample este în același fir
de execuție, acest singur fir de execuție, pot suna un cod care
se va ocupa de chestia aia special.
Deci, de exemplu, dacă am ceva înapoi din baza de date, am putea alerga meu
mică parte de calcul a acesteia, care de fapt, pregătește doar un lucru pentru
trimite înapoi la utilizator.
Deci, nu ca un fel de sens?
>> Dar ceea ce sunt cu adevărat implicații ale acestei?
Corect?
Pentru că am scris o mulțime de cod care -
și eu sunt doar de gând să sari mai departe în slide-uri, dacă e în regulă.
Deci, dacă nu te superi, eu sunt doar de gând să ia un pas înapoi.
Deci, acest tip de lucru este numit o buclă eveniment.
OK?
Și e un fel de bază Ideea din spatele Node.js.
>> Deci, ceea ce este cu adevărat Node.js face ca un web server este există un singur fir
care este, în principiu întâmplă în jurul într-o buclă ca de ceva vreme un fel de sub
capota Node.js care este în mod constant verificarea, am primi lucruri noi?
Și apoi se va rula Stivuitoare că ați configurat.
Dar o întrebare bună care se pune este, cum putem face acest lucru
cu lucruri existente?
>> Așa că am pus o linie de cod C de aici că de fapt arata ca si cum ar deschide o
fișier, corect?
Am Ea a venit cu un album.
Așa că a trebuit să-i deschidă un nou fișier.
Deci, modul în care codul nostru C pentru funcționare -
și cred că motivul pentru care am ales fisiere fost deoarece aceasta este un fel de măsură
de muncă I / O pe care le-am făcut în C în un sentiment că există ieșire de intrare.
Deci, noi numim acest cod care face acest lucru f deschis.
Și apoi pe următoarea linie de nostru Programul, putem lucra acum cu f.
>> Deci, acest lucru ar fi un exemplu de ceva e ca și cum sincron sau
blocarea, deoarece pe care prima linie nu așteptăm până când vom
obține fișierul deschis.
Deci, pe a doua linie, știm că poate lucra cu f, dar acest lucru înseamnă că
că a doua linie nu poate rula într-adevăr până la prima linie se face.
Asta face sens?
>> Deci, acest lucru ar fi rău să pună într-un handler eveniment.
Și motivul pentru care este faptul că acest tip de asteapta, nu?
Deci, acest lucru ne-ar reveni pentru același lucru.
Iar acum nici măcar nu ar avea beneficia de mai multe fire sau
procese pentru că avem un fir în Node.js.
Asta face sens pentru toată lumea?
>> Audiența: Așteaptă.
Deci, ce-i înlocuirea?
>> KEVIN SCHMID: Oh, așa da.
Așa că am de gând să ajung la înlocuirea.
OK.
Și ce dacă am avea ceva care arata ca aceasta?
Deci, ce dacă acum am editat f deschide un pic?
Deci, eu sunt trece în aceeași două argumente ca înainte.
Eu încă place noua piesa că ea a venit cu.
Dar eu sunt trece printr-un al treilea lucru care este această variabilă numită cod.
>> Dar ceea ce este de fapt codul de în acest context?
Este ca o variabila C regulat?
Este o funcție, nu?
Și care ar putea fi un pic ciudat, deoarece Sunt de fapt ca acum trece printr-un
funcționeze într-o altă funcție.
>> Deci, câteva lucruri de reținut despre acest lucru.
Unul, eu nu sunt de fapt de asteptare funcția de cod.
Deci, tu nu vezi codul cu paren stânga, paren corect.
Sunt doar în trecere în cod.
Și în C, ceea ce ar face de fapt este da-mi un pointer la care efectiv
cod, iar atunci acest lucru ar putea rula.
Dar gandeste-te la asta ca esti trece codul pentru a rula atunci când
că fișierul este deschis.
>> Dar ce înseamnă acest lucru este că acum restul de programul meu, care ar putea face
alte lucruri, pot continua să facă alte lucruri în timp ce noi, nu într-adevăr așteaptă, dar
doar în partea din spate a capului nostru că atunci când sunt deschise, alerga ca fișier care
cod în partea de sus.
Asta face sens?
>> Și acum, ideea din spatele Node.js este că codul în chestii face cu f
parte ar trebui să fie destul de scurte și simple și simplu și să nu fie adevărat
foarte intens in calcule.
Aceasta poate avea pentru a deschide un alt dosar, dar că ar trebui să fie, de asemenea, destul de rapid
pentru că ar trebui să spun doar face o altă f deschideți și apoi apel această alt cod.
>> Deci, doar pentru a fi pe deplin clar, f deschide care face noua piesa Katy Perry
făcut mp3, care va destul de mult reveni imediat.
Și apoi putem pur și simplu să continue a face alte lucruri pentru că tot ceea ce acum f
apel deschis nu se spune, practic, cod deschis f stau la baza deschide acest fișier
și atunci când ați terminat deschiderea acestui fișier sau atunci când l înapoi,
apoi executați codul.
Dar ea nu se execută de fapt acest cod.
Si tu ai avut o întrebare?
>> Audiența: Ai părea să sugereze câteva ori că adăugarea de calcul
Codul intensiv fel de pauză [Inaudibil] sistem de condus.
[Inaudibil]?
>> KEVIN SCHMID: Asta este o întrebare mare.
Așa că am de fapt, un exemplu de cât de ai putea integra calcul
cod intensivă într-un pic.
Așa că atunci când vom ajunge la exemple de cod, Voi fi sigur de a trage asta.
Este că OK?
Mulțumesc.
>> Care era numele tău?
>> Audiența: Aaron.
>> KEVIN SCHMID: Aaron aduce o foarte bun punct, ceea ce este că, dacă am avut
un cod intensive de calcul în chestii-a face cu partea F, restul de
Programul meu nu poate rula și nu pot asculta pentru cererile noi sau nimic până când toate
chestii, care este terminat.
Deci, dacă eu scriu cod Node, în general, dacă nu facem ceva ca și cum am de gând
pentru a sugera mai târziu, atunci când ne uităm la exemple de cod, trebuie să fii sigur că
codul meu nu se lega această buclă eveniment.
Asta face sens?
OK.
Rece.
>> Deci Node.js oferă acest cadru care puteți construi aceste determinate de un eveniment
servere cu.
Așa că are aceste tipuri de asincron non-blocking I / O biblioteci, în timp ce
bibliotecile C standard pe care le-am fost de lucru cu, cum ar fi dacă ai doar
le folosesc în același mod în care ne-am fost folosindu-le cu F se deschide și
lucruri, acestea sunt blocarea, deoarece va trebui de fapt să așteptați pentru
care fișier pentru al deschide.
>> Dar Node.js vă oferă ca și o practic leagă în V8 Google
JavaScript motor care este motivul că Chrome este atât de rapid la procesarea
JavaScript deoarece are acest motor V8.
Deci, eu știu că sună ca unul dintre cei WWDC conferințe dezvoltator lucru
în cazul în care arunca doar o adunatura de Număr scrisoare lucruri de procesoare
și spun acest lucru este atât de cool.
Dar este rece că au făcut aceasta pentru că JavaScript -
sau, poate, dacă nu sunteți familiarizați cu JavaScript dar pentru că nu am avut
prelegeri pe ea -
dar JavaScript este un interpretată limbă.
>> Și acesta este un punct important de asemenea.
Asa ca este important pentru web nostru servere pentru a fi rapid, corect?
Și dacă am fost doar rularea JavaScript cod care a fost interpretată cu doar
orice interpret vechi ar putea fi lent.
Beneficii astfel încât nodul din care au acest super rapid interpret V8.
Și nu știu dacă l-au numit deoarece palmă V8 în frunte
lucru, dar OK.
>> Așa că am pregătit câteva exemple la acest URL.
După seminar, am un fel de a merge la vorbesc despre modul în care puteți obține set Node
, dar pentru acum, am doar un fel de doresc sa se plimbe prin câteva exemple de cod.
Deci, dacă doriți să urmați de-a lungul, toate Codul sursă este disponibil acolo.
OK?
>> Așa că vom lăsa acest URL pentru un pic.
Și apoi eu voi face la fel trece în terminal.
Toată lumea e bine cu această adresă URL?
Așa că am de gând să treacă peste la terminalul meu aici.
>> Deci, aici e codul care Am pentru ziua de azi.
De ce nu începem cu simpler.js fișier?
Un alt lucru este că toate acestea Codul va fi scris în
JavaScript care s-ar putea sau ar putea să nu fie familiarizați cu.
Cred că un cuplu de lucruri este faptul că o mulțime de cod JavaScript este un fel de
sintaxa și structura este foarte asemănătoare cu C, astfel încât să puteți fel de-l ridic ca
te duci de-a lungul.
Am încercat să scrie o mulțime de Codul de pornire pentru acest lucru într-un mod care este
similar cu C, astfel că este un pic mai ușor de citit.
Dar, așa cum am progres, voi fi demonstrând o parte din informațiile suplimentare
caracteristici ale JavaScript care sunt un fel de rece.
>> Dar să ne uităm la acest program de probă.
Cred că totul se taie acolo.
Mă duc să se stabilească faptul că reale repede, dacă e OK sau nu.
Nu știu de ce acest lucru este de gând să faci.
Este că un pic mai bine?
Poți vedea var și alte chestii?
OK.
>> Deci, prima linie este ca JavaScript versiune a unei variabile
declarație.
Deci, doar pentru a sublinia ceea ce ar fi aceasta arata ca in C. Deci, aceasta este la fel ca
index-mi spune este egal cu trei sau ceva de genul asta.
Asa ca nu am specifica tipul.
JavaScript are tipuri, dar e foarte dinamic tastat în natură, așa
nu a oferit nici un fel de tip de pe ea.
Așa că are doar var.
Asta e ca și variabilă.
OK?
>> Și am sunat acest HTTP variabile.
Și pe partea mea dreapta, i-au expresie pe care vreau să pună în HTTP.
Și aceasta spune necesita HTTP.
Deci, aceasta este un fel de asemănătoare pentru a include.
Este un pic mai mult ca puternic decât includ în sensul că includ
va copia doar și lipiți antetul fișier pentru prototipurile de funcții sau
indiferent cu definițiile de tip.
Dar necesită se intampla de fapt pentru a ne obține codul.
>> Deci, vă puteți gândi la ea ca la importam niște cod.
Deci, undeva în modulul Node.js sistem sau orice altceva, ei au toate aceste
Cod server HTTP așa că eu sunt doar aducere pentru propria mea
uz personal în acest program.
OK?
>> Deci, atunci am avea această funcție pe care le-am scris.
Și observați nu am avut de a preciza tipul de returnare sau de tipul
argumente din nou.
Deci, un fel de liber scris în ca un fel de sens.
Două argumente pe care le ia în, cererea și răspunsul.
Deci, asta e conceptual fel de familiar de la imaginea pe care am avut
pe ecran înainte, deoarece vom obține această cerere pe care le
au de la utilizator.
Și atunci avem un răspuns care putem scrie lucruri la.
>> Deci, prima linie de acest lucru nu res.writeHead 200 și apoi acest lucru
tip de conținut text simplu.
Deci, haideți să cap la aceasta în afară un pic.
Așa că haideți să ne concentrăm pe res.write pentru un pic.
Deci, scrie este, în principiu, și de a scrie cap, sunt doar modalități de a fel de a scrie în
lucruri la răspunsul.
OK?
Deci scrie cap, dacă cineva își amintește de curs HTTP, nu voi
amintiți-vă anteturile la top de lucru HTTP?
Deci, de ce nu am doar demo antetele repede.
Ar fi de ajutor?
Sau ar trebui să ne-am doar un fel de -
OK.
Sigur.
>> Deci, atunci când browser-ul se duce la google.com sau ceva de genul asta,
există de fapt un pic mai mult -
aceasta este ca un secret -
nu e ca și cum un pic mai mult informații care vine prin conducta decât
micul căutare și totul.
Deci, să vă arăt acest lucru, am de gând de a utiliza un program numit Curl.
OK?
Deci, acest lucru este ceva pe care le poate rula la linia de comandă Mac OSX sau în
aparat sau orice altceva.
Și așa că dacă eu nu Curl HTTP google.com, Mă duc să văd HTML.
Și acest lucru este, în corectitudine, drepți HTML ca un fel de ai spune la
redirecționare a www dacă browser-ul dvs. nu ocupa în mod automat
redirecționare.
>> Deci, aceasta este doar HTML, dar am de gând pentru a adăuga la Curl acest cratimă I pavilion.
OK?
Și acest lucru se întâmplă pentru a arăta mi antetele.
Deci, acest lucru este, de asemenea, informații care vine prin atunci când am obține acest răspuns.
OK?
>> Deci, în partea de sus, veți vedea acest HTTP 301 se mute definitiv.
Și acest lucru este destul de important, deoarece aceasta se referă la codul de stare.
Deci, 301 aici este codul de stare, care este de fapt doar un număr întreg
care spune browser-ul sau oricine e citit acest lucru, dacă te prefaci că
esti un browser și vedeți acest lucru, practic, acum, dacă te uiți la
că și veți vedea un 301, știi că am de a face ceva special pe baza
301, sau sa întâmplat ceva special bazat pe 301.
Deci, se spune mutat definitiv.
>> Și apoi, de fapt, ne-am o grămadă de perechi de valori-cheie.
Așa că am obține locația este www.google.com.
Și apoi un fel de toate aceste alte lucruri, dar în esență, ceea ce locația este
zicală este noua locație este la www.google.com.
Deci, acum, dacă te duci la google.com, veți un fel de a vedea tipul de browser de clipire
pentru o secundă și apoi vă va redirecționa înapoi la www.google.com.
Astfel încât răspunsurile pot conține aceste antete.
>> Și un cuplu de lucruri să sublinieze.
Deci, haideți să spunem că au fost de fapt de succes în vizita o pagină web.
Deci, lasă-mă să merg la -
ceea ce este un bun site-ul?
Sunt prost la gândire de bun site-uri de la fața locului.
>> Audiența: Wikipedia.
>> KEVIN SCHMID: OK.
Să facem Wikipedia.
Deci, aici am fost mutat.
Oh, așteptați.
Am fost?
Da, am fost.
OK.
Așa că am ajuns să fac www.
Așa că am de gând să fac www.
Și, după cum puteți vedea, aici e tot HTML că browser-ul va procesa
pentru Wikipedia.
>> Dar dacă am ține defilare aici, ceea ce veți vedea în partea de sus -
wow, există o mulțime de HTML pe Wikipedia -
dar ceea ce pot vedea în partea de sus de aici este acest cod de 200 de stare, spre deosebire de
301 pe care l-am văzut mai devreme.
Și observați că acesta are un frumos OK prietenos lângă el.
Deci, acest lucru este ca codul de stare de bine.
>> Se că 200 număr pare cunoscut?
Da, pentru că atunci când am făcut simpler.js, I-am scris un 200 acolo.
Deci, care este, practic, spune spune Browser-ul sau oricine este încercarea de a ajunge la
aceasta că ei au avut succes.
Sau ca un fel de noi au avut succes prea.
>> Și nu există acest tip de sintaxă specială în Javascript pentru declararea unei
harta din aceste taste, cum ar fi tipul de conținut și aceste valori, cum ar fi simplu text.
Deci, dacă te uiți la răspunsul pe care noi am întors de la Wikipedia înainte, -
Am de gând să încerc pentru a defila un pic mai repede -
aveți aceste taste, cum ar fi server de și aceste valori Apache.
Deci, v-ați luat cheile și valorile.
Și aveți posibilitatea să specificați acest lucru în Nodul ce pentru a trimite înapoi.
>> Deci, aceasta este de fapt un fel de, în unele moduri, și în unele moduri nu este
într-adevăr, dar este un nivel puțin mai jos decât codul PHP pe care le-ar putea fi
scris pentru P setat șapte deoarece PHP și Apache fel de a avea grijă de unele
de aceste lucruri pentru tine.
În PHP, puteți suprascrie implicit Comportamentul de scris propriile antete.
Dar, în scopul de acest lucru, vom obține pentru a scrie propriile antete.
>> Deci, nu că linie face sens pentru a toată lumea, linia capului de scriere?
OK.
Minunat.
>> Deci, atunci ceea ce fac este să se încheie răspunsul prin a spune salut lume.
OK.
Dar asta e doar o funcție numita cerere handler.
Deci, acum am de fapt, trebuie să fel de a face ceva cu această funcție, nu?
>> Deci, aici ceea ce fac este acolo este aceasta linie care nu este egal de server var
HTTP.create de server, și apoi am trece în de gestionare a cererii.
Deci, aceasta este un fel de Node modalitate de a crea un server.
Și observați că eu trec in de gestionare a cererii.
Deci, acest lucru este de a spune createServer Funcția pe care vreau să-mi facă o
server și atunci când serverul primește un răspuns, am nevoie de tine pentru a apela acest
solicita funcție handler.
OK?
>> Astfel că linia destul de mult se termină imediat.
Deci, linia de servere var se face dreptate după ce faci asta destul de mult.
Adică, trebuie să configurați unele interne de stat să știe că va trebui să
apela că funcția cerere handler, dar ea nu va sta acolo și
zicem are utilizatorul trimis mi-o cerere încă?
A utilizatorului mi-a trimis o cerere încă?
Astfel încât să nu blocheze.
OK?
>> Deci, despre ce va face este de fapt acum stochează un pointer la acest cod,
această funcție de gestionare a cererii, și apoi va rula acest cod, atunci când cineva
face o cerere.
Și apoi vom face server.listen.
>> 1337 este destul de arbitrar.
Nu am avut nici un motiv special pentru a alege acel număr.
Acesta a fost complet aleatoare.
Dar care specifică doar portul.
Deci, cele mai multe servere de web, veți vedea că ele folosi portul 80 pentru că e un fel
a cum ar fi convenția.
Deci, dacă mă duc la ceva de genul, Nu știu, Wikipedia.org,
și am pus colon 8 -
oh wow, nu puteți vedea asta.
Îmi pare rău.
Dar dacă fac Wikipedia -
Voi scrie aici doar pentru ca e clar pe aparatul de fotografiat.
Dar dacă iau asta într-un browser cu un colon 80, care specifică du-te la
Wikipedia.org la portul 80.
Deci, e ca si cum modul în care Statele Unite au mai multe porturi, cum ar fi în cazul în care aveți posibilitatea să navă
lucruri la fel de.
Deci, e ca si cum merge la acest special loc pe acest server.
OK.
>> Așa că am ales 1337.
Există o întreagă gamă de numere pe care le puteți alege.
Asta nu a fost totul special.
>> Dar ceea ce am de gând să fac acum este am de gând să ruleze Nod.
Permiteți-mi să introduceți de fapt că un cuplu linii de jos, astfel încât să puteți vedea.
Am de gând să fac nod, și eu sunt de gând să ruleze simpler.js.
Și vom vorbi despre cum să obțineți Nod înființat într-un pic.
Dar acum e doar rulează pe server.
>> Deci, un singur lucru, putem încerca, care nu pot fie că este interesant putem de fapt
încercați să-l accesați în Curl.
Deci, eu pot face Curl, și meu Masina este gazda locala.
Veți vedea, de asemenea, acest scris ca acest lucru uneori.
Gazdă locale și 127.0.0.1 sunt un fel a cum ar fi computerul de acasă.
Deci, e ca si cum vorbesc cu propriul computer.
OK.
>> Și atunci pot să spun 1337.
Deci, dacă am alerga aceasta linie de cod, se spune salut lume.
Și dacă am vrut să văd chestia asta că a textului de tip conținut simplu sau
orice, am putea pune chiar asta aici.
Și observați că acesta nu spune OK.
Și eu nu am simplu text.
Și apoi există un fel de tot acest celelalte lucruri care Nodul se va adăuga în
acolo pentru mine.
Asta nu e foarte important.
>> Vreau să spun, există un fel de tehnic aspecte de la care sunt un fel
de rece pentru a vorbi despre, dar doar pentru a arăta te, am, de asemenea, puterea de a
schimba aceste jur.
Deci, eu pot adăuga doar o adunatura de chestii de genul asta.
Și apoi acum, dacă mă uit în mea ieșire, va fi ca.
Deci, aceste antete înseamnă anumite lucruri la browsere și lucruri de genul asta.
>> Și antete poate spune de fapt un browser cum să răspundă la ceva.
Dacă ați auzit vreodată de cookie-uri înainte, sau dacă ați fost vreodată contrariat
de către o pagină web setare cookie-uri, sau pornit bloc cookie sau
ceva de genul asta.
Puteți seta de fapt, cookie-uri în aceste anteturi.
Deci, ei spun un browser cum a Comportamentul în unele cazuri.
OK.
>> Astfel că a fost simpler.js.
Are cineva intrebari pe acel fișier de cod sursă?
OK.
Rece.
>> Deci, haideți să scoateți r din care si uita-te la simple.js.
Deci, acest lucru este destul de mult același program.
Tocmai am scris un pic diferit pentru că am vrut pentru a sorta de a evidenția
unele caracteristici ale JavaScript.
>> Astfel observa că de gestionare a cererii Funcția a dispărut în totalitate.
Oh da, ai avut o întrebare?
>> Audiența: Da, argumentele care sunt transmise la acea
funcție, ce sunt ei?
>> KEVIN SCHMID: Deci, acestea sunt JavaScript obiecte.
În documentația Node.js, ea de fapt spune ce metode sunt
disponibil pe ele.
Noi doar se întâmplă să aibă acces la aceasta metoda numita cap de scriere și la sfârșitul
și chestii de genul asta.
Dar există o grămadă mai multe metode.
>> Și, de exemplu, ca unul dintre ei în special cu privire la REC, puteți face
ceva de genul rec.method care va să vă spun dacă este o HTTP obține sau
Cereri HTTP post și lucruri de genul asta.
Deci, există tot felul de diferite proprietăți, dar ambele sunt
JavaScript obiecte, și ei doar au funcțiile care le sunt atașate pe care le
pot scrie lucruri la.
OK?
>> Astfel observa că handler cerere este complet plecat.
Dar codul pe care am avut-o în cerere handler este încă acolo.
Încă mai am această res.writeHead și încă mai am această res.end.
Și ce acesta este un exemplu de la JavaScript este această idee de o
Funcția anonim.
și anonim este ca un nume potrivit pentru ea, pentru că pur și simplu nu
au un nume.
Nu e nici o cerere de funcție handler acolo.
>> Nu are nume, dar încă este a lua un argument.
Deci, eu încă am rec și res.
Și încă mai am codul.
Acest lucru este perfect în regulă JavaScript cod.
Deci, eu pot declara o funcție fără oferind în mod explicit un nume.
Este un pic confuz la început.
Există unele lucruri utile cum ar fi pe care le puteți face cu
aceste funcții anonime.
Are cineva orice întrebări cu privire la acest lucru, sau este OK doar la, de acum,
un fel de doar accepte că va face același lucru?
Da?
>> Audiența: sunt funcții în primul rând clasă în JavaScript?
>> KEVIN SCHMID: Ei sunt în primul rând clasă în JavaScript.
Și doar știu că aceste concepte de trecerea într-o funcție anonim ca
acest lucru se aplică JavaScript pe care le pot scrie în proiectul final pentru
browser-ul web prea.
Deci, de exemplu, în JavaScript în browser-ul dvs., este, de asemenea, oarecum eveniment
condus în sensul că ceea ce veți au este atunci când utilizatorul face clic pe acest
buton, vreau să rulați acest cod.
>> Deci, este același tip de idei ale partea de client atunci când un clic de mouse sau au
mouse-ul peste unele imagini pe dvs. pagina web, rula acest cod.
Care se pot aplica la servere.
Deci, asta e un fel de incitante motiv pentru care JavaScript este un adevărat
persoane adecvate sau a unor cred că este o limbaj adecvat pentru acest tip de
server de șofer eveniment pentru ca ai aceste funcții anonime.
Ai ideea de acest cod asincron.
OK.
Are cineva vreo întrebare?
>> OK.
Astfel că a fost simple.js.
Așa că haideți să ne uităm la o mai sau un cuplu mai.
Deci, aceasta este sleep.js.
Deci, este cineva familiarizat cu C funcția de somn?
Din poate una din prelegerile anterioare sau ceva de genul asta?
>> Deci, practic se poate trece într-Cred că o numărul de secunde sau dacă folosiți U
dormi un număr de milisecunde sau nanosecunde.
Și, practic, programul se va opri doar de funcționare pentru această sumă de timp.
Corect?
Și atunci se va trezi în cele din urmă și atunci acesta va continua doar de funcționare
programului.
>> Deci, acest server de tip dă impresia de dormit.
Astfel observa că avem la fel res.writeHead 200 cu antetul
înainte, dar apoi ne-am numesc asta Funcția numit set timeout.
Setați timeout este de asemenea disponibil în browser-ul web Google Chrome
sau Safari sau orice altceva.
Și, practic, ceea ce se face aici este se ia într-o funcție.
Notificare, din nou, este un Funcția anonim.
Deci, asta e un fel de misto ca suntem folosind o funcție anonim cadrul unei
Funcția anonim care poate fi un pic ciudat.
>> Dar se ia această funcție, ceea ce este practic spune - și modul în care acest
lucrări este în 5000 de milisecunde, vreau să execute funcții care
doar se termină răspunsul și scrie hei.
Deci, acest lucru dă impresia de ca dormit, dar modul în care acest fapt
funcționează este vom rula prin intermediul această linie foarte repede.
Noi doar scris ceva.
Și apoi vom rula, de asemenea, prin această linie foarte repede.
Deci, noi nu suntem de fapt merge să aștepte cinci secunde.
Mergem să ruleze acest cod instantaneu.
>> Și apoi există, din nou, acest mic bucla eveniment care are acum acest lucru
registre care, practic, este doar în mod constant merge în jurul într-un cerc
și se uită la ceas într-o singură fir și spune, are cinci secunde
trecut încă?
Și apoi, când se vede că a doua mână-a mutat ca cinci secunde sau
oricare ar fi, atunci se trezește și spune, oh, ce trebuie să fac?
Oh, am pentru a rula acest cod.
Și apoi se va rula res.end hei.
>> Deci, din nou, vom nu asteapta aici.
Deci, nu e ca acest cod în interiorul această funcție este de gând să ia cinci
secunde pentru a rula.
Acest cod va rula destul de mult instantaneu, cel puțin în raport cu
cele cinci secunde pe care le-au vorbit mai devreme înainte.
>> Deci, doar pentru a arăta acest lucru în acțiune, Eu pot face Node.sleep.js.
Și a făcut-am strica ceva?
Posibil.
Scuze.
Să vedem ce putem face pentru a remedia acest lucru.
OK.
Astfel folosi cu siguranta Node.js.
Glumesc.
OK.
Doar unul sec.
OK.
Eu știu ce este.
>> Deci, problema este că în altă filă mea aici, am fost difuzate Nodul deja pe
că aceeași adresă, 1337.
Astfel eroarea că această aruncat, dacă privim la real strâns, este adresa la
folosesc, EADDRINUSE.
Așa că am fost deja folosind 1337 aici.
Deci, dacă am închide asta, iar apoi eu acum încercați să executați acest lucru, sperăm, totul
va fi bine.
OK.
Astfel încât să puteți avea doar un singur fel de lucru de a asculta pe un port la o dată.
O altă soluție ar fi fost pentru mine pentru a edita doar că programul și face
fi ca 1338 sau ceva de genul asta.
>> Dar acum somn se execută.
Deci, haideți să-l încercați de fapt, în Browser-ul de data aceasta, pentru că este un
puțin mai puțin senzaționale pentru a vedea într-un terminal.
Așa că eu sunt doar de gând să meargă la acea 127 adresa din nou în 1337.
Și dacă puteți să-l văd -
Nu știu dacă se poate - dar meu Browser-ul lui de a lua o foarte, foarte mult timp
timp pentru a încărca sau ca cinci secunde.
>> Și apoi, după care, în cele din urmă încheiat răspunsul.
Și nu se poate vedea că lucrul este mutat peste un pic, dar dacă am face
acest lucru un pic mai mic, tu se poate vedea o spune hey.
Așa că am luat hei, dar după cinci secunde.
Și ar putea fi un pic mai curat pentru a vedea l aici pe terminal, așa că eu sunt
de gând să faci o -
hai sa facem aici -
hai să facem Curl că adresa din nou cu 1337.
Și am doar un fel de trebuie să stea aici timp de cinci secunde.
Dar observați că serverul poate accepta raspunsuri noi.
Deci, se imprimă hei.
>> Și la acest demo, practic ceea ce Eu pot face în acest alt tab -
deci haideți să spun că fac acest lucru într-o altă filă, Am de gând să fac Curl și același lucru
lucru din nou.
Și am de gând să încerce să lovi cu piciorul aceste baieti off în același timp.
Așa că am de gând să fac asta, și eu sunt va concura pe aici si eu sunt
de gând să o facă din nou.
>> Și să se facă astfel încât să se poate vedea ambele dintre ele.
Că o imprimată hei și că o imprimate hei tot drumul la -
hai să facem din nou că experiment.
De fapt, hai să folosim acest truc, dacă e în regulă.
>> Așa că am de gând să utilizeze un lucru shell care permite-mi pentru a rula în principiu, două exemplare
acestui program în paralel.
Deci, acesta va rula primul program și al doilea program în paralel.
Deci, acum, dacă am apăsați Enter, se va pentru a face această cerere destul de mult
instantaneu, în același timp.
Deci, haideți să facem o încercare.
>> Deci, acum, observa el spune două procese.
Si daca esti curios, care 27.000 numărul este de fapt ID-ul de proces.
Și apoi observa, ei imprimate hei, în același timp.
Nu a fost ca a trebuit să aștepte cinci secunde, pentru o și apoi, după care,
obține cinci secunde mai târziu a doua.
Astfel că e un fel de, în unele moduri, este nu într-adevăr dovezi, dar este
dovezi intuitiv că nu este vorba doar cum ar fi de așteptare cinci secunde și blocarea
întreaga firul.
OK rece.
>> Aaron a pus o întrebare mai devreme că a fost, și ce dacă am face ceva -
Da?
>> Audiența: Așteaptă.
Cum este diferit de tampon printf, deși?
Nu o face în mod automat că?
De ce nu trebuie să vă faceți griji despre asta?
>> KEVIN SCHMID: Oh, ai putea spune că o dată?
>> Audiența: Nu-i place tampon printf face exact același lucru?
>> KEVIN SCHMID: tampon printf?
>> Audienta: Da.
OK.
Nu a fost într-una din chestionare erau vorbesc despre modul în care, dacă ai dreptate printf
ceva și apoi l-au pauză o în al doilea rând, și apoi l-ați buclă zece
ori, o să aștept zece secunde și apoi printf totul împreună?
>> KEVIN SCHMID: Oh, OK.
>> Audiența: Este o fac același lucru lucru atunci în acest caz?
>> KEVIN SCHMID: Deci, întrebarea a fost în principiu, într-una din fostele chestionare
sau ceva, a existat o întrebare care în principiu, dacă spui de imprimare f 10
lucruri la un moment dat și apoi a dormit ca în procesul de imprimare aceste afară,
la sfârșitul pentru un motiv oarecare, ar fi doar arunca toate cele de pe ecran.
Deci, există un fel de două tipuri diferite concepte de aici.
>> Deci, cred că un lucru este că, în acest caz, avem de-a face cu două tipuri diferite
fel de oameni cer server de lucruri în același timp.
Și motivul pentru care tipul printf de așteaptă ca asta și haldele totul afară
la o dată este legata mai mult de cum fel de printf -
așa fel printf este de fapt implementat este are practic la
vorbesc cu sistemul de operare pentru a scrie că lucrurile la consola.
Deci, nu vreau să fac toate astea lucruri imediat atunci când spui printf
unele șir, pentru că ar putea obține scump dacă trebuie să
face acest lucru de fiecare dată.
>> Deci, dacă ai face printf hei, programul nu s-ar putea imprima de fapt, că
imediat la consola.
S-ar putea spune, OK, l-am scris.
Și apoi un fel de așteptați pentru tine de a da un pic mai mult înainte de fapt,
scrie-l la consola.
>> Deci, motivul pentru care acesta a fost cazul -
și e un fel de legătură de somn -
este că somnul a fost un fel de doar injectat acolo pentru a demonstra
faptul că nu se scrie ea sincron.
Dar motivul pentru care este doar de performanță, astfel încât să nu trebuie să
face că multe persoane de contact la sistemul de operare.
>> Dar aici, ceea ce suntem cu adevărat încearcă să facă cu acest lucru somnul este doar spectacol
că atunci când avem două persoane care vizitează acest site, aceasta nu va pune
le într-o linie în care se va spune Am să te ajut, iar apoi, când am
complet terminat ajutându-vă după aceste cinci secunde, apoi am de gând să
muta pe următoarea persoană.
Astfel încât cererea primului persoanei nu lega că bucla eveniment
în cazul în care are sens.
>> Dar aici este de fapt un exemplu de ceva care va lega
până bucla eveniment.
Deci, aici este o funcție oribil pentru calcula n-lea Fibonacci.
Este literalmente modul în mai rău se poate calcula numărul Fibonacci n-lea.
Și aceasta este de fapt doar să recunoască în cazul în care aceasta a venit de la,
există de fapt -
Adică, puteți încerca să găsim o - dar nu e ca un blog foarte lungă
posta că cineva a scris.
E ca unul din acele lucruri Reddit.
Dar cineva a criticat Node.js, și au folosit aceasta ca un exemplu.
Așa că am un fel de dorit să vă arăt doar doi perspective diferite doar pentru a obține
o înțelegere generală a conceptelor în spatele acestor două lucruri.
>> Dar acest lucru este ales ca doar un oribil, de calcul oribil ineficiente
mod intensiv pentru a calcula număr Fibonacci n-lea.
Deci, doar ca o notă separată, de ce este se oribil ca într-un fel?
Da?
>> Audiența: Spune începe cu 1.000.
1000 se împarte în 999 și 998.
Fiecare din aceasta se imparte in doua lucruri.
>> KEVIN SCHMID: Corect.
>> Audiența: Tot drumul în jos.
>> KEVIN SCHMID: Exact.
Deci, doar pentru a repeta pentru aparatul de fotografiat, dacă am apel fib pe cum ar fi 1000 sau ceva
cum ar fi faptul că, nu este în mod evident mai puțin sau egal cu una, așa că am de gând să
du-te la acest caz altcineva, și apoi am de gând pentru a apela fib 999 plus fib 998.
Și apoi destul de mult tot de care lucru care fib 999 nu este
un fel de la acest nivel.
Dacă te duci în jos, e chiar mai mult redundant decât atât, dar dacă doar
Cred FIB de calcul 998 se ne destul de aproape de fib 999.
Așa că ar trebui să fie într-adevăr un pic mai mult inteligent despre modul în care un fel de reutilizare
acestea, dar nu suntem reutilizarea aceste lucruri, la toate.
Deci, vă puteți imagina acest gigantic, arbore gigantic care este doar oribil.
>> Dar oricum, OK.
Deci asta a fost minciună.
Este nevoie de doar un timp pentru a rula.
Da?
>> Audiența: [inaudibil].
>> KEVIN SCHMID: Oh, ai putea repet întrebarea?
>> Audiența: [inaudibil].
>> KEVIN SCHMID: Oh, deci asta este codul doar care va fi un fel de pe
partea de server.
Deci, acest lucru nu va fi găsit în browser-ul sau nimic.
Este practic ceea ce avem este că, atunci când utilizatorul de aici destul de mult mărci
cererea lor din nou, atunci când am un fel de face o cerere, vom apela
această funcție pe partea de server.
Și apoi vom obține rezultatul înapoi de asteptare această funcție.
Și apoi vom imprima doar l pentru utilizator.
Astfel încât utilizatorul nu se referă într-adevăr cu această funcție prea mult.
>> A fost că problema?
Asta face sens?
OK.
Rece.
>> Deci, din nou, vom face tot acest res.writeHead lucru care ne imprima
antet.
Și apoi m-am încheia răspunsul de a face numărul magic este FIB 45.
Așa că hai să rulați acest server.
Așa că am de gând să fac un nod fib.js.
Deci, acum serverul meu minciună se execută.
>> Și apoi aici, mă duc pentru a face una dintre acestea.
OK?
Așa că eu sunt doar de gând să spun, Curl.
Asa ca va dura ceva timp, dar sperăm că în curând se va termina și
se va imprima ca al 45-lea Fibonacci număr.
>> Audiența: [inaudibil].
>> KEVIN SCHMID: Aceasta ar trebui se face destul de repede.
Deci, ar trebui să ia cinci la șase secunde.
Nu știu că e doar V8 fi super- rapid, dar în orice caz, aceasta este o
exemplu foarte scurt și intenționat neelegant de un non-trivial
calcul.
Deci, după un timp, ea nu obține acest lucru.
>> Dar acum, dacă eu fac același tip de experiment ca și mai înainte, unde fac
două cereri în același timp?
Deci, aici am de gând să o Curl pe adresa, și am de gând
a face o altă Curl.
Și amintiți-vă, atunci când am făcut acest lucru pentru somn de server, atunci când l-am avut, practic,
după cinci secunde, ei destul de atât de mult s-au întors din dreapta
cam în același timp.
Deci, nu a fost deosebit de legat.
>> Dar hai să încercăm acum.
OK, deci avem două procese noastre.
Amintiți-vă acestea sunt ID-urile de proces.
Acest lucru va fi un pic ciudat în timp ce trage de timp.
Deci, haideți să stai aici și să aștepte.
>> Deci, unul dintre ei ar trebui să vină înapoi după cum ar fi -
OK, așa că a venit înapoi.
Dar atunci de ce nu a făcut de-a doua o întoarce încă?
Da?
>> Audiența: Serverul nu poate face nimic în timp ce se calcul ca număr mare.
>> KEVIN SCHMID: Corect.
Deci, răspunsul a fost doar faptul că serverul într-adevăr nu se poate face nimic în timp ce
se calcul că numărul Fibonacci.
Așa că acum tocmai am primit-mi două lucruri înapoi.
Dar cred doar să se gândească la codul un pic mai mult, modul în care este de lucru
și totul.
>> Deci, această funcție aici este codul care I-am spus acest server pentru a rula atunci când
primește o nouă solicitare de intrare.
Deci, este doar de gând să trec prin această întregul cod, și apoi se va merge
înapoi la bucla de evenimente și apoi continuați de verificare pentru noi evenimente.
Deci, practic, ceea ce am întâmplă este serverul este
ascultare de lucruri noi.
Prima persoana care cere pentru ceea ce este de 45.
Vom rula acest cod pentru a calcula.
Acest cod are aproximativ cinci la șase secunde pentru a alerga.
Apoi ne întoarcem la bucla eveniment și verificați de noi cereri.
>> Deci, acesta este un exemplu de modul în care, dacă au lucruri care sunt așa-numita de calcul
legat, sau de a folosi o mulțime de calcul, nu de putere, dar ca sunt
de calcul intensiv -
Cred că un singur lucru de spus despre acest lucru este că această funcție este de a face în totalitate,
pentru cea mai mare parte, destul de drept de lucru util.
Tot timpul că de apel invers funcție a fost de funcționare, a fost destul de
mult petrece majoritatea timpului doar de calcul număr care Fibonacci n-lea.
>> Dar am avut doar un singur fir pentru a face față.
În modelul Apache, atunci când doi oameni a făcut cererea pentru a obține fib 45, ne-am
ar fi avut două fire diferite.
Și apoi de locuri de muncă al sistemului de operare ar fi fost, sau la nivel de utilizator
cod care gestionează firele, s-ar fi a fost de a felie că până pe
CPU, sau chiar dacă ai avea mai multe procesoare, le distribuie uniform pe procesoare
astfel încât acestea au fost atât de finisaj aproximativ în același timp.
>> Deci, doar să-ți arăt cum putem rezolva de - iar acest lucru nu este o perfectă totală
soluție, ci un fel de modul în care putem face un vin aici și să facă
un pic mai bine.
Deci, ceea ce am aici este un program numit FIB C. Și acest principiu, foloseste
un alt unul dintre modulele nod numit Modulul Process Copilului.
Deci, am inclus că la fel de sus ca și cum mi-ar face o jumătate de kilogram includ
process.h copil sau ceva.
Acum am acces la această variabilă CP care are toate funcțiile mea.
>> Deci, acum ce fac în acest răspuns handler este Eu conduc acest program
dot slash FIB 45.
Deci, ceea ce am făcut - și Mă duc pentru a ieși din acest program pentru o
pic -
Este Am scris un program C care practic calculează
număr Fibonacci n-lea.
Deci, aici e doar un program am scris în C, care calculeaza acest lucru.
Eu pot compila, și eu pot rula se la linia de comandă.
Și se va calcula Număr de 45 Fibonacci.
>> Deci, observați că doar nevoie de destul de mult la fel de mult.
Eu, probabil, ar fi putut folosi de bord 03 de optimizarea sau ceva de genul asta,
dar am făcut-o ca regulat setările de compilator.
Și îl imprimă.
>> Dar acum, ce am eu un fel de a face?
Oh pare rău, fișier greșit.
Așa că am face aceleași lucruri cu antetul ca mai înainte.
Apoi am face acest lucru cp.exec.
Deci, despre ce este de gând să faceți este să se va rula acest program.
Dar modul în care aceasta funcționează este faptul că ea nu va aștepta
acest program pentru a termina.
Pur și simplu, practic, spune executa acest program.
Deci, practic acest tip în comanda fel de promptă.
>> Și apoi, când ați terminat cu aceasta, rulați această funcție.
Deci, acum am un fel de a obține acest lucru întreg restaurat de
ca și cum nu ne asteptam.
Oare acest tip de sens?
Da?
>> Audiența: [inaudibil]?
>> KEVIN SCHMID: Deci, acest lucru va de fapt, deschide un nou proces de a face acest lucru.
Deci, aceasta este, de fapt, în unele privințe, rău, nu super-rău, dar este
important să spunem că aceasta este un fel de merge înapoi la, pe de o parte, Apache
model în care vom face fire și procese pentru fiecare cerere sau
procese pentru fiecare cerere.
Deci, aceasta este un fel de analog la ceea ce face Apache.
În unele cazuri, se va folosi doar un nou fir, care este un pic mai multă lumină
greutate decât un proces, dar ar putea Apache sfârșesc prin bifurcare un nou proces
care este un fel de ceea ce facem noi aici implicit, de a face punct slash FIB 45.
>> Și apoi, în acest caz, ne-am cam suporta aceleași cheltuieli de procese.
Deci, acesta este doar un singur lucru pe care îl pot face.
Dar doar pentru a arăta acest tip de funcționare.
Și această discuție este doar într-adevăr vizează prezintă aceste tipuri de programe ca o
mod de a arata perspective diferite asupra cum să se proiecteze servere de genul asta.
Deci, acest lucru se execută, iar apoi, dacă acum fac acest lucru din nou, am primit două ID-uri de proces.
>> Hai să vorbim despre lucrurile să se arate.
Astfel observa că acestea sunt treptat.
Asta-i grozav.
Pentru că a fost 27122 înainte.
Dar aviz acum, s-au întors la aproximativ în același timp.
>> Și acum, o întrebare bună de a cere despre de ce a fost că acest caz este, al cărui loc de muncă
a fost acum la un fel de a face aceste lucruri un fel de fair-play cu fiecare
alte, aceste două cazuri de dot slash FIB 45 că am fugit
sau Nod fugit?
Cine fel de face corect că ambele a lua un fel de echilibrat timp a alerga?
>> Audiența: [inaudibil].
>> KEVIN SCHMID: Da.
Deci, practic, atunci când fac dot FIB slash 45 sau ceva de genul asta, acum e
cam până la sistemul de operare pentru a ocupa runtime acestor programe.
Și acum se poate programa pe diferite procesoare sau
le poate programa.
Se poate felie de timp pe care o CPU devine sau care primesc
pentru a rula pe un procesor.
Deci, asta e ideea din spatele acest lucru.
Asta face sens pentru toată lumea?
Deci, acum Nod nu joacă într-adevăr o parte la împărțirea acestor sarcini.
OK.
>> Astfel că e aproape o pentru exemple.
Am vrut doar să arate un singur lucru mai mult pentru că o mulțime de acest lucru a fost până acum
Nu în totalitate super-practic în unele cazuri.
Îmi pot imagina venind acasă după această vorbi și ceva și spune ca,
ei bine, un fel de ieșit din acea convorbire care Pot face un server de Fibonacci pentru
proiectul meu final.
Deci, aici e doar un fel de un exemplu mai mult care sperăm că va fi -
poate nu, dar poate - un pic mai mult fel de relevante pentru proiecte finale și
gândire înainte de lucruri de genul asta.
>> Deci, aceasta este chat.js.
Deci, aceasta este un fel de ca o probă Codul partea de server pe care le-ar putea folosi pentru a
configura un server de chat mic ca este posibil să fi văzut pe
Facebook Chat sau orice altceva.
Deci, eu nu spun acest lucru este ca Facebook Chat-ul, dar acest lucru este un fel de
ca un bun - poate nu e bun, dar poate punct de plecare pentru o discuție - bun
serverului pentru site-ul dvs. pentru un proiect final.
Așa că haideți să ne uităm la ceea ce face.
>> Deci, suntem obtinerea acestui lucru special în partea de sus, acest var SIO
este egal necesita Socket.IO.
Deci, acesta este un alt lucru pe care ea nu vin de fapt, la pachet cu
Nod, dar puteți să-l instalați.
Este un modul de Nod.
Deci, e la fel ca unele extensie de Nod.
>> SocketIO este de fapt într-adevăr un fel de rece.
Este o abstracție care, practic, ceea ce ce face este este că vă permite să
au acest flux de comunicare între un web
browser și un server web.
Deci, pentru cea mai mare parte până acum, am avut acestea foarte rapid o secundă sau două
două comunicări între un web browser și serverul web.
Deci, este, practic merge la google.com, get chestii, trimite înapoi, și apoi
am terminat.
Noi nu vorbim din nou până la utilizator tipuri în altceva.
>> Dar ce Socket.IO și fel similar de lucruri - și SocketIO este de fapt o
din lucrurile pe care este construit pe ca WebSocket care este un fel de disponibil
ca parte a HTML5 -
care vă permite să aibă această continuarea dialogului.
Și acest lucru este foarte util într-un server de chat tip de lucru, pentru că este
ca un fel de dialog continuu în câteva modalități pentru că dacă sunteți pe chat
cu cineva, puteți acum doar trimite un mesaj prin conductă, și apoi
server poate trimite un mesaj în jos țeavă la o altă persoană ești
chat cu.
Și apoi puteți avea această schimb de genul asta.
>> Deci, asta e un fel de ceea ce SocketIO este bun pentru.
Motivul pentru care SocketIO utilizează WebSockets ca un lucru este faptul că, în
plus față de WebSockets pur și simplu vechi, face, de asemenea, unele trucuri pentru a practic
face browser-ul compatibil.
Deci, browsere, cum ar fi Internet Explorer din păcate nu acceptă WebSockets
drept afară de la cutie.
Asa ca foloseste un alt fel de rece curat lucruri cu Adobe Flash pentru a permite
tine de a avea un sprijin browser-ul cruce.
Așa că e foarte util.
>> Și, de fapt, eu știu că sunt un fel de care rulează pe timp aici, dar CS50
Discuta, ai văzut vreodată ceva ca și, nu știu, gol este așa și așa
răspuns la acest post sau ceva cum ar fi faptul că, această caracteristică?
Asta e SocketIO.
Așa că atunci când cineva începe tastarea în discuta despre box pentru a face un răspuns sau
ceva, browser-ul dvs. nu ceea ce-i denumit în SocketIO emite un fel de
eveniment care spune că cineva este răspuns la acest post.
>> Atunci serverul spune, OK, Ce trebuie să fac?
Ei bine, acum trebuie să-i spun ceilalți tipi care sunt pe CS50 Discutați despre căutarea
la acest post că cineva a răspuns.
Deci, asta e un fel de ceea ce este SocketIO bun pentru, acest tip continuă a
flux de dialog.
OK.
>> Deci, ceea ce am aici - și noi suntem doar O să ignore matrice de conexiuni
pentru un pic -
ceea ce fac este să fac un alt ascult.
Deci asta e doar modul în Socket.IO este a zis să ascultăm pe acest port.
Și apoi m-am face acest lucru pe conexiune.
Deci, asta e doar practic Socket IO fel de a spune, atunci când primim o
conexiune, te vreau pentru a rula acest cod.
>> Și observați că în loc de a avea rec și res trecut acolo am Socket.
Și această idee Socket este de fapt acest lucru pe care le puteți scrie și să citească
de care are utilizator mesaje, eventual.
Și mesajele pe care le-ar trimite pot trece prin asta Socket.
Asta face sens?
Deci, este acest lucru în continuare.
>> Deci, ceea ce fac eu numesc Socket.emit.
Și emit ia destul de mult două argumente.
Primul argument este un șir reprezentând doar tipul
lucru te emit.
Deci, pentru acest caz, am utilizare acest șir mesaj nou.
Si acesta este doar practic spune că tipul de acest lucru, ceea ce am
trimiterea, este un nou mesaj.
Astfel încât să puteți asculta pentru anumite tipuri cum ar fi un mesaj nou sau orice
prin utilizarea punct pe.
>> Astfel de conexiune și de utilizare a trimis acolo, în cazul în care te uiți la care ne numim punct pe,
acestea sunt alte siruri de caractere care reprezintă tipuri de mesaje de utilizatori.
Deci, practic, puteți avea această emit unul dintre aceste tipuri de mesaje, și
apoi face ceva ca răspuns la unul dintre aceste tipuri de mesaje
>> Așa că eu sunt emițătoare de acest nou mesaj.
Vom ignora connections.push pentru o secundă.
Dar apoi mi-am spus, utilizatorul Socket.on trimis.
Deci, acum e cam ca atunci când user-mi trimite un mesaj, vreau
vă pentru a rula acest cod.
Și observați că această funcție anonim este de a lua în această variabilă
numit de date care este de fapt întâmplă pentru a avea un mesaj utilizatorului.
>> Un fel de a vorbi despre așa că acum haideți matrice de conexiuni.
Deci, aceasta este proiectat pentru un client de chat în cazul în care, practic, toată lumea e un fel de in
aceeași cameră de chat.
Deci, practic, ceea ce avem nevoie pentru a păstra în jurul valorii de unele matrice care, practic,
reprezintă toți oamenii sunt conectati pe chat în unele puncte de vedere, în cazul în care are sens.
Corect?
Pentru că avem nevoie să știm cine ăia sunt astfel încât să le putem trimite mesaje
că alte persoane trimite la noi.
>> Deci, ceea ce acest cod nu este atunci când utilizatorul trimite un mesaj - care este tipul de
eveniment -
Vom rula acest cod.
Și ceea ce facem este să rulați prin intermediul acestui matrice care le-am numit conexiuni.
Și destul de mult pentru fiecare conexiune cu excepția celui care e al nostru, asta e
ceea ce spune acest cod, vom trimite o nouă mesaj cu mesajul atașat
informații.
>> Deci, dacă observați aici, ce am făcut când utilizatorul de fapt face un nou
este conexiunea Am adăugat cu Metoda JavaScript.push, aceasta este
în principiu, doar spun ca adăuga care Socket ca o valoare în
conexiuni nostru matrice.
Deci, acum, când acest cod se execută, acesta va trimite lucruri la cele special
conexiuni.
Deci, acest lucru poate fi un bun punct de plecare pentru a face un server de chat
sau ceva similar.
>> Și tipul de lucru cool este ca cod pe care le vezi aici, pentru ca pe și
emit și chestii de genul asta este aceeași un fel de cod JavaScript pe care le-ar
scrie în browser-ul pentru a interactiona cu serverul.
Deci, de aceea SocketIO este un fel de elegant și util în acest fel.
>> Oh, și doar un lucru foarte repede.
Nu a fost un proiect final CS50 anul trecut care a implementat practic o discuție
server din Node.js.
Cred că e Harvardchats.org dar eu nu sunt -
OK.
Eu nu sunt sigur ce URL-ul este, dar Eu pot trimite asta ulterior.
Dar este un fel de ceea ce se răcească puteți face cu Node.js.
>> Asa ca sper ca, in general, voi avea o bun simț a ceea ce este util Node.js
pentru și cum ai putea aplica, poate la proiectul final.
Eu va trimit ceva mai mult resurse, împreună cu aceasta.
Și vă mulțumesc că ați venit.
Mulțumesc.
>> [Aplauze]