>> KEVIN SCHMID: Hej alle.
Velkommen til CS50 seminar på Node.js.
Mit navn er Kevin.
Jeg er en CS50 TF.
Og jeg er lidt ligesom virkelig begejstret om dette seminar.
Jeg tror Node.js er meget cool.
Jeg håber, at dette seminar kan bruges som en god, jeg gætte, springbræt for
nogle af dine afsluttende projekter, hvis du er interesseret i at bruge
noget som Node.js.
>> Vi slags starter seminaret fra ved bare tale om en lille smule af det
slags baggrund skalerbarhed perspektiver Node.js, og derefter
Vi flytter til nogle kode eksempler.
Og jeg vil have koden på en hjemmeside, og du kan se på koden.
Og efter seminaret, vil jeg sortere snak om, hvordan du kan oprette Node.js
på din computer.
>> OK.
Så lad os komme i gang.
Så jeg tror bare jeg ønsker at tale om webservere, virkelig, først.
Og for at starte denne diskussion, jeg dybest set har et diagram, der er fra
lærebog anvendes til CS61, som dybest set viser interaktionen
mellem en klient proces, ligesom din web browser eller gerne dit mål klient eller
sådan noget, og en web-server.
Så denne type ligner den billede, som du så i foredrag om
Onsdag hvor dybest set har vi nogle klient proces som Google Chrome.
>> Og så trin et er klient sender en anmodning.
Så det kan være noget lignende og lad os besøg, ved jeg ikke, CS50.net.
Så vi udstede denne anmodning.
Og er der nogen huske navnet på den protokol, der angiver, hvordan der
skal struktureres anmodning?
Yep.
>> PUBLIKUM: [uhørligt].
>> KEVIN SCHMID: Præcis.
Så det er ligesom HTTP, right?
Så dybest set specifikationen for hvordan denne anmodning bør faktisk lagt
ud, fordi i slutningen af ​​dagen, denne anmodning er egentlig bare gerne et
streng, der stort set siger, jeg vil have det.
Og specifikationen for det er HTTP.
Så det er ligesom en protokol.
>> Så serveren modtager denne anmodning.
Så du fyre har en web-server installeret i CS50 apparatet.
Det er Apache.
Og i denne uge, når du arbejder på problemet sæt syv, vil du rent faktisk skal arbejde
med at web-server.
Så serveren modtager denne anmodning, og så har det at slags ridse sin
hoved og sige ligesom godt, hvad gør jeg med det?
>> Så er baseret på, hvad det beslutter at gøre, så det kan have at kontakte nogle slags
ressource.
Og denne ressource kunne være en masse forskellige ting.
For én, kan det være lige som en statisk HTML-fil.
Så det kunne bare være ligesom nogle HTML, der er ligesom for
din personlige hjemmeside.
Det kunne være en statisk fil som et billede eller som en film, som du har.
Det kunne endda nødt til at tale til en form for database
ligesom en MySQL-database.
Så det behøver ikke altid at kommunikere med en ressource, men i
nogle tilfælde, det kunne.
>> Så hvad det kommer til at gøre efter det er det kommer til at
sende tilbage svaret.
Og svaret til dette er også angivet af HTTP.
Så kunden kan modtage det.
Det kan rive det fra hinanden og behandle den.
Og så får du en webside som Google eller CS50.net eller
uanset hvad du gik til.
OK?
>> Så dette er den grundlæggende interaktion, vi kommer til at beskæftige sig med.
Og vi temmelig meget kommer til at være fokus på denne del af
interaktion, serveren.
OK.
Fedt.
Nogen, der har nogen spørgsmål så videre?
OK.
>> Så som vi sagde, webserveren modtager denne HTTP-anmodning, og udsteder derefter dette
HTTP-svar.
Og som vi talte om før, CS50 apparat webserver er Apache.
Så når du fyre arbejde på P sæt syv, du kommer til at arbejde med
Apache webserver.
Du vil aldrig nødt til virkelig at arbejde med Apache direkte for meget.
Du slags konfigurere Apache lidt når du angiver de virtuelle værter eller
v værter og vi får som i en lille smule.
>> Men dybest set, Apache webserver sat op til at arbejde med PHP slags
af ud af boksen.
Så hvad der virkelig sker, er, når du går til en af ​​dine websteder som, siger,
lokale vært skråstreg index.php eller noget, er din browser sender, at
anmodning, og derefter Apache sidder der og tal ud med det at gøre.
Og handlingen er at udføre at kode i index.php og
derefter sende det ud igen.
Så der er der.
Så vi slags talt om dette.
Så det kunne bare tjene en statisk fil eller køre nogle PHP-kode og derefter emne
svaret.
>> Så et fælles spørgsmål, der kan komme op er godt, hvordan vi egentlig beskæftige
med at have flere brugere på samme tid?
Så tænk hvis du var at skrive en web server, hvis du havde en webserver,
du prøvede at skrive i noget som C eller noget lignende,
dybest set kan du tænke over, hvordan der kunne være en slags kode,
ville modtage anmodningen, men så det har at gøre alt dette arbejde på det.
Det kan have til for eksempel, skal du kontakte database eller noget lignende.
Right?
Og så ville det gøre den slags af behandling og derefter
sendes tilbage svaret.
Så det er ligesom den høje niveau overblik.
>> Men det er ikke umiddelbart indlysende, hvordan du kan gøre det, så to personer eller
endda 1.000 mennesker kunne arbejde med din web-server på samme tid.
Så den løsning, Apache bruger kaldes tråde eller processer.
Så du har måske hørt om disse vilkår før.
Det er OK, hvis du ikke har, men bare tænke om tråde eller processer som måder for
et operativsystem eller en bruger program eller noget lignende, eller en web-server
at slags udføre flere ting på én gang.
Så du har måske hørt udtrykket som tråde for henrettelse.
Så det er lidt som om du er slags multitasking.
>> Og hvis du har set på kassen af ​​din laptop, eller noget lignende,
multicore, hvad du kan gøre, er at du kan køre to forskellige tråde på forskellige
dele af CPU'en, så de kan rent faktisk sker på samme tid.
Så det er virkelig kraftfuld.
Og det er lidt af Apaches løsning på dette problem.
>> Så er der lidt ligesom eventuelle problemer med denne tilgang selv?
Så jeg tror jeg slags skrev dem der.
Men begge slags bruge en masse hukommelse.
Det er meget dyrt at skabe en tråd eller en proces.
>> Og en del af begrundelsen er, at bare ligesom når du kører et C-program
som din primære og derefter at opkald en anden funktion, der har
en slags skorsten.
Så tråde kræver også en helt særskilt stak der
kan være ganske store.
Og hvis du kan forestille dig at have tonsvis af brugere på dit websted, ville du have
en masse forskellige tråde.
Det er en masse af stakke til administrere og vedligeholde.
Så det er store hukommelse forbrug.
>> Og så også, lad os sige, at du kun har én CPU, eller lad os sige du har
flere tråde end du har disse multicores.
Right?
Så lad os sige, du havde 10 tråde og du kun havde fem CPU'er.
Du slags nødt til at gøre denne ting, hvor du skifte mellem den aktuelle
én, der kører, fordi du kan ikke køre alle 10 på en gang.
Og det hedder en sammenhæng switch.
Og dette udtryk har faktisk et par forskellige sammenhænge, ​​men lad os bare
Tænk på det som at skifte mellem to tråde.
Det kan være temmelig dyre, fordi dybest set, hvad du skal gøre er at du
nødt til at stoppe, hvad du laver, skal du gemme tilstand af at der kører tråd, og
derefter skifte til et andet sted.
>> Så betyder alle slags ser motivation hvorfor tråde og
processer kan være lidt pladskrævende?
Og vidste du et spørgsmål?
OK.
Fedt.
Nogen har nogen spørgsmål?
OK.
>> Så hvis vi tager et skridt tilbage til en anden, der er lidt ligesom en
bemærkning om, at vi kan lave om en masse af web-applikationer.
Og det er virkelig, at en masse af dem faktisk ikke gøre så meget nyttige
arbejde inde i en tråd.
Så har nogen gang på P sæt syv på alle?
Så vil du måske beskrive nogle af de dele?
Har du arbejdet på login eller sådan noget?
>> PUBLIKUM: Nej.
>> KEVIN SCHMID: OK.
Det gør ikke noget.
Undskyld.
Men dybest set, i P sæt, er du vil være at gøre en masse slags
forespørgsler til en database for at få nogle oplysninger fra denne database.
Og hvad din kode vil gøre, hvad der Apache proces eller
at Apache tråden kommer til at gøre mens det har at kontakte
database er det slags kommer til at være sidder der, og det vil være
venter for databasen til at svare.
>> Nu, lyder måske ikke som den helt store håndtere, fordi databasen er på din
CS50 apparat, right?
Men der er en vis form for netværk latens der, fordi nu på nettet
server har at udstede sit eget anmodning til databasen til at kommunikere med
database og derefter få at oplysninger tilbage.
Så nu er det som godt vente på mig, jeg er kommer til at gå få noget fra
database og så er der en masse venter foregår.
Giver det mening?
>> Og for nogle ting er det ikke så slemt.
Hvis det bare har at, for eksempel, access memory, er det ikke lide
forfærdelig I / O-latency.
Og når jeg siger, I / O-latency, hvad jeg henviser til, er ligesom enhver form for lignende
input output.
Men for at få adgang til en fil på disken, som hvis jeg ønskede at tjene den statiske HTML
fil, som var på min webside eller noget, jeg slags nødt til at
stoppe for lidt, læse filen i fra disken, og derefter i
den proces jeg venter.
Jeg gør ikke nyttigt arbejde.
>> Dette er ikke tilfældet for alt, men det er almindelig i applikationer som P sæt
syv og en masse ansøgninger at du ikke er
faktisk gør meget tænkning.
Og når jeg siger tankegang, mener jeg ligesom beregningsmæssige arbejde.
Så beregningsmæssige arbejde kunne være noget gerne sige, du ville
skrive en web-server, der netop beregnet n'te Fibonacci-tal.
Det lyder ikke som en særlig sjov webserver.
Ligesom jeg ville ikke forvente, at webstedet til at være den næste Facebook, men der er nogle
slags beregningsmæssige arbejde.
>> Og du kan forestille dig at udskifte det med en anden form for interessant
beregningsmæssige arbejde.
Lad os sige, du skrev noget , der beregnes grader af
adskillelse mellem to mennesker eller noget lignende.
Så det indebærer en vis form beregning, right?
Og selv da, at gøre, at du stadig har at gøre en masse for at vente på måske
du nødt til at søge en database til at se op, hvem der er venner med hvem eller
noget lignende.
Så der er den slags begreb beregningsmæssige arbejde.
Giver det mening?
Er der nogen, der har nogen spørgsmål?
>> Åh, og jeg tror jeg sætte chat-servere der fordi chat-servere er lidt
et andet godt eksempel på dette.
En chat-server ikke har at gøre meget tænkning.
Det har bare at vente for folk at sende beskeder og derefter når
de gør, så send dem.
OK?
>> Så bare for at opsummere igen, Apache og lignende webservere som denne gaffel en
masse af tråde og processer, der kan være slags spild.
Så jeg gætter på det spørgsmål, der kan komme fra der har vi brug for at have
flere tråde og processer?
Hvad hvis vi bare havde en?
>> Så lad os slags male et billede af, hvad det ville se ud.
Så lad os bruge én tråd.
OK?
Så bare forestille sig dette med én tråd.
>> Lad os antage, vi ikke virkelig gør at meget nyttigt - og når jeg siger
nyttigt, jeg mener beregningsmæssige arbejde -
i de flere tråde før.
Så lad os slags konsolidere alt i én tråd.
Så hvad hvis vi havde en tråd den slags af bare går rundt i loop og
konstant kontrol gjorde noget ny ske.
Så for eksempel, noget nyt skete kunne betyde, jeg fik noget tilbage fra
databasen, eller nogen sendt mig en ny HTTP-anmodning.
Så det er slags arrangementer at ske, ikke?
>> Og så hvad jeg kan gøre, når de nye Ting sker, er i samme tråd
af udførelse, denne enkelt tråd af udførelse, jeg kan kalde noget kode,
ville håndtere denne særlige ting.
Så for eksempel, hvis jeg fik noget tilbage fra databasen, kunne jeg køre min
lille beregningsmæssige del af det, faktisk bare forbereder ting at
sende tilbage til brugeren.
Det gør den slags mening?
>> Men hvad er egentlig det konsekvenser af dette?
Right?
Fordi vi har skrevet en masse kode, -
og jeg bare kommer til at springe fremad i dias, hvis det er OK.
Så hvis du ikke har noget imod, jeg er bare kommer til at tage et skridt tilbage.
Så denne slags ting er kaldes en begivenhed løkke.
OK?
Og det er sådan det grundlæggende Ideen bag Node.js.
>> Så hvad Node.js egentlig laver som en web server er at der er en enkelt tråd
der er dybest set går rundt i en løkke som en mens en slags under
hætten af ​​Node.js, der er konstant kontrol, modtog vi nye ting?
Og så vil det køre handlere at du opretter.
Men et godt spørgsmål at stille, er, hvordan kan vi gøre dette ske
med eksisterende ting?
>> Så jeg sætte en linje af C-kode her, at dybest set ligner det at åbne en
fil, right?
Jeg Hun kom bare ud med et album.
Så jeg var nødt til at åbne hende en ny fil.
Så den måde, vores C-kode til drift -
og jeg gætte grunden til jeg valgte filer var fordi det er sådan det omfang
af I / O-arbejde, som vi har gjort i C en fornemmelse af, at der er input-output.
Så vi kalder denne kode, gør dette f åben.
Og derefter på den næste linje i vores program, kan vi nu arbejde med f..
>> Så det ville være et eksempel på noget, det er ligesom synkron eller
blokering på grund på den første linje der venter vi, indtil vi
få åbnet filen.
Så på den anden linje, ved vi, at vi kan arbejde med f, men det betyder, at
at anden linje kan ikke rigtig køre indtil den første linie er udført.
Giver det mening?
>> Så det ville være dårligt at sætte i en event handler.
Og grunden til det er, at denne slags ventetider, right?
Så det ville vende os tilbage til de samme ting.
Og nu vil vi ikke engang har fordel af flere tråde eller
processer, fordi vi fik en tråd i Node.js.
Giver det mening for alle?
>> PUBLIKUM: Vent.
Så hvad er erstatningen?
>> KEVIN SCHMID: Åh, så ja.
Så jeg har tænkt mig at komme til udskiftningen.
OK.
Så hvad hvis vi havde noget der lignede dette?
Så hvad hvis nu jeg redigerede f åbent lidt?
Så jeg passerer i samme to argumenter som før.
Jeg elsker stadig den nye sang at hun kom ud med.
Men jeg passerer en tredje ting, som er denne variabel kaldet kode.
>> Men hvad er koden faktisk i denne sammenhæng?
Er det som en almindelig C-variabel?
Det er en funktion, right?
Og det kan være lidt underligt, fordi Jeg er faktisk ligesom nu passerer et
kan fungere i en anden funktion.
>> Så et par ting at bemærke om dette.
Én, jeg faktisk ikke kalde koden funktion.
Så du kan ikke se koden med venstre paren, Højre parentes.
Jeg er bare passerer i kode.
Og i C, hvad det rent faktisk ville gøre er at give mig en pointer til, at den faktiske
kode, og så dette kunne køre den.
Men tænk over det, som du er passerer kode, når
at filen åbnes.
>> Men hvad det betyder er, at nu resten af ​​mit program som kunne gøre
andre ting, fortsætte kan gøre andre ting, mens vi ikke rigtig vente, men
bare have i bagsiden af ​​vores hoveder, når den pågældende fil åbne, køre som
kode øverst.
Giver det mening?
>> Og nu ideen bag Node.js er, at koden i at gøre ting med f
del skal være temmelig kort og enkel og ligetil og ikke rigtig være
meget regnekraft.
Det kan have til at åbne en anden fil, men der bør også være temmelig hurtig
fordi det bare skal sige gøre en anden f åbne og derefter kalde denne anden kode.
>> Så bare for at være helt klar, f åbner der gør den nye Katy Perry sang
Udført mp3, der kommer til at temmelig meget tilbage straks.
Og så kan vi bare fortsætte med at gøre andre ting, fordi alt, hvad der nu f
åben indkaldelse gør er at fortælle stort set den underliggende f åben kode åbne denne fil
og når du er færdig åbne denne fil, eller når du får det tilbage,
derefter køre denne kode.
Men det betyder faktisk ikke køre denne kode.
Og du havde et spørgsmål?
>> PUBLIKUM: Du syntes at antyde et par tider, tilføjer beregningsmæssigt
intensiv kode slags bryde [Uhørligt] drevet system.
[Uhørligt]?
>> KEVIN SCHMID: Det er et godt spørgsmål.
Så jeg har faktisk et eksempel på, hvordan du kunne integrere beregningsmæssigt
intensiv kode i en lille smule.
Så når vi kommer til de kodeeksempler, Jeg vil være sikker på at trække det ene.
Er det OK?
Tak.
>> Hvad var dit navn?
>> PUBLIKUM: Aaron.
>> KEVIN SCHMID: Aaron bringer en meget god pointe, som er, at hvis jeg havde
nogle regnekraft kode i det gøre ting med f del, resten af
mit program kan ikke køre og kan ikke lytte for nye anmodninger eller noget, før alle
at ting er færdig.
Så hvis jeg skriver Node kode i almindelighed medmindre vi gør noget som jeg har tænkt mig
at foreslå senere, når vi ser på kode eksempler, jeg er nødt til at være sikker på at
min kode ikke binde denne begivenhed løkke.
Giver det mening?
OK.
Fedt.
>> Så Node.js tilbyder denne ramme, du kan bygge disse hændelsesstyrede
servere med.
Så det har den slags asynkron ikke-blokerende I / O-biblioteker, hvorimod
standard C-biblioteker, som vi har været arbejder med, ligesom hvis du bare
bruge dem på samme måde, som vi har brugt dem med f åbner og
stuff, er dem, der blokerer, fordi du faktisk nødt til at vente på
at filen for at åbne.
>> Men Node.js giver dig det, og det dybest set binder ind i Googles V8
JavaScript-motor, der er årsagen at Chrome er så hurtigt på behandling
JavaScript, fordi det har denne V8-motor.
Så jeg ved, det lyder som en af ​​dem WWDC udvikler konferencer ting
hvor de bare smide en flok af brev nummer ting for processorer
og sige dette er så cool.
Men det er cool, at de gjorde dette, fordi JavaScript -
eller måske hvis du ikke er bekendt med JavaScript endnu, fordi vi ikke har haft
forelæsningerne på det -
men JavaScript er et fortolket sprog.
>> Og det er et vigtigt punkt.
Så det er vigtigt for vores web servere til at være hurtig, right?
Og hvis vi bare kører JavaScript kode, som blev fortolket med blot
noget gammelt tolk det kunne være langsom.
Så Node fordele ved at have denne super hurtig V8 tolk.
Og jeg ved ikke, om de kaldte det fordi V8 slag i panden
ting, men OK.
>> Så jeg har forberedt nogle eksempler på denne URL.
Efter seminaret, jeg slags vil tale om, hvordan du kan få Node sæt
op, men for nu, jeg bare slags ønsker at gå gennem nogle kode eksempler.
Så hvis du ønsker at følge med, hele kildekoden er tilgængelig der.
OK?
>> Så jeg vil forlade denne URL op til en lille.
Og så er jeg bare kommer til at skifte til terminalen.
Er alle godt med denne webadresse?
Så jeg har tænkt mig at skifte over til min terminal her.
>> Så her er den kode, Jeg har i dag.
Hvorfor starter vi ikke med simpler.js fil?
Den anden ting er, at alt dette kode vil blive skrevet i
JavaScript som du måske eller kan ikke være bekendt med.
Jeg gætte et par ting er, at mange af JavaScript-kode er den slags
syntaks og struktur er meget lig C, så du kan slags samle det op som
du gå.
Jeg har prøvet at skrive en masse af de Koden for dette begynder på en måde, der er
svarende til C, så det er lidt mere læsevenlig.
Men som vi fremskridt, vil jeg være viser nogle af de ekstra
funktioner i JavaScript, er slags cool.
>> Men lad os se på denne prøve program.
Jeg gætter alt er afskåret der.
Jeg skal bare til at fastsætte, at reel hurtigt, hvis det er OK eller ej.
Jeg ved ikke, hvad det kommer til at gøre.
Er det lidt bedre?
Kan du se den var og kram?
OK.
>> Så den første linje er ligesom JavaScript version af en variabel
erklæring.
Så bare for at fremhæve, hvad det ville se ud i C. Så det er ligesom
mig at sige indeks er lig med tre eller noget lignende.
Så jeg ikke angive typen.
JavaScript har dog typer, men det er meget dynamisk skrevet i naturen, så
ikke giver nogen form for type på det.
Så det har blot var.
Det er ligesom variabel.
OK?
>> Og jeg ringer denne variabel HTTP.
Og på min højre side, har jeg den udtryk, som jeg ønsker at sætte i HTTP.
Og det siger kræver HTTP.
Så dette er slags ligner at inkludere.
Det er lidt mere ligesom kraftigere end omfatter i den forstand, der omfatter
ville bare kopiere og indsætte header fil til funktionstasterne prototyper eller
hvad med de definitioner type.
Men kræver rent faktisk sker at få os koden.
>> Så du kan tænke på det som importere noget kode.
Så et eller andet sted i Node.js modulet systemet eller hvad, de har alt dette
HTTP-server-kode, så jeg er bare hente det for min egen
personlig brug i dette program.
OK?
>> Så har jeg denne funktion at jeg har skrevet.
Og bemærk, jeg behøvede ikke at specificere afkastet type eller typen af ​​den
argumenter igen.
Så slags løs indtastet den slags mening.
To argumenter som den træffer i, anmodningen og svar.
Så det er begrebsmæssigt lidt ligesom kender fra det billede, vi havde
på skærmen, før fordi vi får denne anmodning, at vi
har fra brugeren.
Og så har vi et svar, vi kan skrive ting til.
>> Så den første linje i denne gør res.writeHead 200 og så er denne
indholdstype tekst sletten.
Så lad os brik dette hinanden lidt.
Så lad os bare fokusere på res.write for lidt.
Så skriv er dybest set, og skrive hoved, er bare måder at slags skrive
ting til svaret.
OK?
Så skriv hovedet, hvis nogen husker fra HTTP foredrag, tror du fyre
huske overskrifter på toppen af ​​HTTP ting?
Så hvorfor jeg ikke bare demo headers hurtigt.
Ville det være nyttigt?
Eller skal vi bare slags -
OK.
Sure.
>> Så når din browser går til google.com eller noget lignende,
Der er faktisk en lidt mere -
det er ligesom en hemmelighed -
Der er ligesom lidt mere information der kommer gennem røret end blot
den lille søgning og alting.
Så for at vise dig det, jeg vil at bruge et program kaldet Curl.
OK?
Så det er noget, du kan køre på Mac OSX kommandolinjen eller i
apparat eller hvad.
Og så hvis jeg Krølle HTTP google.com, Jeg har tænkt mig at se HTML.
Og det er i retfærdighed, bare HTML den slags fortæller dig at
omdirigere til www, hvis din browser ikke automatisk håndtere
omdirigering.
>> Så dette er blot HTML, men jeg har tænkt mig at tilføje til Krølle denne bindestreg jeg flag.
OK?
Og det kommer til at vise mig overskrifterne.
Så dette er også oplysninger, der kommer igennem, når jeg får dette svar.
OK?
>> Så i toppen, kan du se dette HTTP 301 flytte permanent.
Og det er ret vigtigt, fordi dette refererer til status kode.
Så 301 her er status-koden, som er dybest set bare et heltal
der fortæller browseren, eller hvem er læser dette, hvis du foregiver at
du er en browser og du ser dette, dybest set nu, hvis man ser på
det, og du ser en 301, du ved, jeg har at gøre noget særligt baseret på
Særlig skete 301, eller noget baseret på 301.
Så det siger flyttet permanent.
>> Og så, dybest set, vi har en flok af de vigtigste værdi par.
Så vi får placering er www.google.com.
Og så slags alt det andre ting, men dybest set, hvad placeringen er
ordsprog er den nye placering er på www.google.com.
Så nu, hvis du går til google.com, vil du slags se browser slags blink
for en anden og derefter omdirigere dig tilbage til www.google.com.
Så svarene kan indeholde disse overskrifter.
>> Og et par ting at påpege.
Så lad os sige, vi var faktisk en succes i at besøge en webside.
Så lad mig gå til -
hvad er en god hjemmeside?
Jeg er dårlig til at tænke på gode hjemmesider på stedet.
>> PUBLIKUM: Wikipedia.
>> KEVIN SCHMID: OK.
Lad os gøre Wikipedia.
Så her jeg blev flyttet.
Åh vent.
Var jeg?
Ja, jeg var.
OK.
Så jeg fik at gøre www.
Så jeg har tænkt mig at gøre www.
Og som du kan se, her er alle de HTML at browseren vil behandle
Wikipedia.
>> Men hvis jeg holder rulle op her, hvad jeg vil se i toppen -
wow, der er en masse af HTML på Wikipedia -
men hvad jeg kan se i toppen her er denne 200 status kode i modsætning til den
301, som jeg så tidligere.
Og bemærk, at det har en dejlig venlig OK ved siden af.
Så det er ligesom god tilstand kode.
>> Betyder at 200 nummer ser bekendt?
Ja, fordi når jeg gjorde simpler.js, Jeg skrev en 200 der.
Så det er dybest set siger fortælle browser eller hvem der forsøger at komme til
det, at de var en succes.
Eller den slags, som vi lykkedes også.
>> Og der er denne form for speciel syntaks i Javascript for at erklære en
kort af disse taster som indholdstype og disse værdier som tekst sletten.
Så hvis man ser på det svar, vi kommet tilbage fra Wikipedia før, -
Jeg har tænkt mig at forsøge at rulle op lidt hurtigere -
du har disse taster som server og disse værdier Apache.
Så du har fået nøgler og værdier.
Og du kan angive dette i Node, hvad de skal sende tilbage.
>> Så dette er faktisk slags, i nogle måder, og på nogle måder er det ikke
rigtig, men det er lidt lavere niveau end den PHP-kode, som du måske
skriver for P sæt syv fordi PHP og Apache slags tage sig af nogle
af disse ting for dig.
I PHP kan du tilsidesætte standardindstillingen adfærd ved at skrive dine egne overskrifter.
Men i forbindelse med dette, får vi at skrive vores egne overskrifter.
>> Så gør denne linje giver mening at alle, det skrivehoved linje?
OK.
Awesome.
>> Så hvad jeg gør, er jeg afslutte svar ved at sige hej verden.
OK.
Men det er bare en funktion kaldet sagsbehandler.
Så nu har jeg faktisk nødt til at slags gøre noget med denne funktion, right?
>> Så her hvad jeg gør, er der denne linje, som siger VaR server lig
HTTP.create server, og så er jeg passere i sagsbehandleren.
Så det er lidt af Node måde at skabe en server.
Og bemærk, at jeg passerer i sagsbehandleren.
Så dette fortæller createServer funktion, som jeg vil have dig til at gøre mig en
server, og når serveren modtager et svar, jeg har brug for dig til at kalde denne
sagsbehandler funktion.
OK?
>> Så denne linje temmelig meget færdig med det samme.
Så var serveren linje er gjort rigtigt når du gør det temmelig meget.
Jeg mener, det har at etablere nogle interne stat til at vide, at du ville have til
kalder sagsbehandler funktion, men det kommer ikke til at sidde der og
sige har brugeren sendt mig en anmodning endnu?
Har brugeren sendte mig en anmodning endnu?
Så det ikke blokerer.
OK?
>> Så hvad det vil gøre, er det dybest set gemmer nu en pegepind til denne kode,
denne sagsbehandler funktion, og derefter vil køre denne kode, når nogen
fremsætter en anmodning.
Og så gør vi server.listen.
>> 1337 er der temmelig vilkårlig.
Jeg havde ingen særlig grund for at plukke dette nummer.
Det var helt tilfældigt.
Men der bare angiver den port.
Så de fleste webservere, du vil se, at de bruge port 80, da det er sådan
ligesom konventionen.
Så hvis jeg går til noget lignende, Jeg ved det ikke, Wikipedia.org,
og jeg sætter kolon 8 -
oh wow, kan du ikke se det.
Undskyld.
Men hvis jeg gør Wikipedia -
Jeg skriver det her, bare så at det er klart, på kameraet.
Men hvis jeg tage dette i en browser med et kolon 80, der angiver at gå til
Wikipedia.org på port 80.
Så det er ligesom, hvordan USA har flere havne som, hvor du kan sende
ting til slags.
Så det er ligesom at gå til denne særlige placeres på denne server.
OK.
>> Så jeg valgte netop 1337.
Der er en hel række af numre at du kan vælge.
Det var ikke helt speciel.
>> Men hvad jeg har tænkt mig at gøre nu er jeg har tænkt mig at køre Node.
Lad mig faktisk ind, at et par linjer ned, så du kan se det.
Jeg har tænkt mig at gøre Node, og jeg er kommer til at køre simpler.js.
Og vi taler om, hvordan du får Node sat op i en lille smule.
Men nu er det bare at køre serveren.
>> Så én ting, vi kan prøve, der ikke må være så spændende er, at vi rent faktisk kan
forsøge at få adgang til det i Curl.
Så jeg kan gøre Curl, og mit maskinen er lokale vært.
Du kan også se denne skriftlige som denne til tider.
Lokale vært og 127.0.0.1 er venlige ligesom din hjemmecomputer.
Så det er som at tale med din egen computer.
OK.
>> Og så kan jeg sige 1337.
Så hvis jeg køre denne linje kode, det siger hej verden.
Og hvis jeg ønskede at se, at ting, der havde indholdstype tekst almindeligt eller
uanset hvad, jeg kunne endda sætte dette her.
Og bemærk, at det siger OK.
Og jeg har tekst sletten.
Og så er der slags alt dette andet ting, Node vil tilføje i
der for mig.
Det er ikke super vigtigt.
>> Jeg mener, der er en form for teknisk aspekter på, som er lidt
cool at snakke om, men bare for at vise dig, jeg har også magt til at
ændre disse rundt.
Så jeg kan bare tilføje en flok af den slags.
Og så nu, hvis jeg ser i min udgang, vil det være det.
Så disse overskrifter betyder visse ting til browsere og ting som.
>> Og headere kan stort set fortælle en browser hvordan man reagerer på noget.
Hvis du nogensinde har hørt om cookies før, eller hvis du nogensinde har været irriteret
af en webside indstilling cookies, eller tændt cookie blok eller
noget lignende.
Du kan faktisk sætte cookies i disse overskrifter.
Så de fortæller en browser, hvordan man adfærd i nogle tilfælde.
OK.
>> Så det var simpler.js.
Er der nogen har nogen spørgsmål på denne kildekode fil?
OK.
Fedt.
>> Så lad os fjerne r fra det og se på simple.js.
Så dette er temmelig meget det samme program.
Jeg skrev bare det lidt anderledes fordi jeg ønskede at sortere fremhævningstype
nogle af funktionerne i JavaScript.
>> Så opdager, at sagsbehandleren funktionen er helt forsvundet.
Åh jep, har du et spørgsmål?
>> Publikum: Ja, de argumenter der føres til at
funktion, hvad er de?
>> KEVIN SCHMID: Så dem er JavaScript objekter.
I Node.js dokumentation, er det dybest set siger, hvad metoder er
tilgængelig på dem.
Vi har lige tilfældigvis har adgang til denne fremgangsmåde kaldes skrive hoved og afslutning
og den slags.
Men der er en hel flok flere metoder.
>> Og for eksempel, som en af ​​dem især på rec, kan du gøre
noget rec.method som vil fortælle dig, om det er en HTTP få eller
HTTP POST-anmodninger og ting som.
Så der er alle mulige forskellige egenskaber, men de er begge
JavaScript objekter, og de skal bare have funktioner, der er knyttet til dem, at du
kan skrive ting.
OK?
>> Så bemærke, at sagsbehandleren er helt forsvundet.
Men den kode, jeg havde i anmodning handleren er der stadig.
Jeg har stadig denne res.writeHead og jeg har stadig denne res.end.
Og hvad dette er et eksempel på i JavaScript er denne idé om en
anonym funktion.
og anonymt er som et passende navn for det, fordi det bogstaveligt talt ikke
have et navn.
Der er ingen funktion anmodning handleren derinde.
>> Har ikke noget navn, men det stadig er at tage et argument.
Så jeg stadig fik rec og res.
Og jeg har stadig koden.
Det er helt fint JavaScript-kode.
Så jeg kan erklære en funktion uden udtrykkeligt give den et navn.
Det er lidt forvirrende i starten.
Der er nogle som nyttige ting at du kan gøre med
disse anonyme funktioner.
Er der nogen, der har spørgsmål om dette, eller er det OK bare at for nu,
slags bare acceptere, at det vil gøre det samme?
Yep?
>> PUBLIKUM: Er funktioner først klasse i JavaScript?
>> KEVIN SCHMID: De er først klasse i JavaScript.
Og bare vide, at disse begreber passerer i en anonym funktion som
dette gælder for JavaScript, som du kan skrive i dit afsluttende projekt for
webbrowseren også.
Så for eksempel i JavaScript i din browser, det er også noget begivenhed
kørt i den forstand, at hvad du vil har er, når brugeren klikker på dette
knap, jeg vil have dig til at køre denne kode.
>> Så det er den samme slags ideer klientsiden når et museklik eller de
musen over nogle billede på din webside, skal du køre denne kode.
Det kan anvendes på servere.
Så det er lidt ligesom det spændende Grunden til, at JavaScript er en rigtig
egnede eller nogle mennesker synes, det er en passende sprog til denne form for
begivenhed driver server, fordi du har disse anonyme funktioner.
Du har hele ideen om denne asynkrone kode.
OK.
Nogen har nogen spørgsmål?
>> OK.
Så det var simple.js.
Så lad os se på en mere eller et par mere.
Så dette er sleep.js.
Så er der nogen bekendt med C-funktionen søvn?
Fra måske en af ​​de tidligere foredrag eller sådan noget?
>> Så dybest set kan du gå på Jeg tror, ​​en antal sekunder, eller hvis du bruger U
sove antal millisekunder eller nanosekunder.
Og dybest set programmet vil bare stoppe køre for at mængden af ​​tid.
Right?
Og så vil det vågne op med tiden og så det vil bare fortsætte med at køre
programmet.
>> Så denne server slags giver indtryk af at sove.
Så bemærke, at vi har den samme res.writeHead 200 med overskriften som
før, men så vi kalder dette funktion kaldet sæt timeout.
Indstil timeout fås også i din web browser Google Chrome
eller Safari eller hvad.
Og dybest set, hvad det gør her Det tager i en funktion.
Bemærk, igen, det er en anonym funktion.
Så det er lidt cool, fordi vi er ved hjælp af en anonym funktion i et
anonym funktion, som kan være lidt underligt.
>> Men det tager den funktion, som er dybest set siger, - og den måde, denne
værker er i 5000 millisekunder, jeg vil du at udføre den funktion, som
bare ender svaret og skriver hej.
Så det giver indtryk af lignende sove, men den måde, dette faktisk
virker, er vi køre gennem denne linje meget hurtigt.
Vi er bare at skrive noget.
Og så vil vi også køre igennem denne linje meget hurtigt.
Så vi faktisk ikke gå at vente fem sekunder.
Vi vil bare køre denne kode øjeblikkeligt.
>> Og så er der igen, denne lille begivenhed loop, der nu har denne ting
registre, der dybest set er lige konstant går rundt i en cirkel
og ser på uret i et enkelt tråd og sige, har fem sekunder
gået endnu?
Og så når den ser, at den anden hånd er flyttet ligesom fem sekunder eller
uanset hvad, så er det vågner op og siger, åh, hvad skal jeg gøre?
Åh jeg er nødt til at køre denne kode.
Og så det kommer til at køre res.end hej.
>> Så igen, vi aldrig venter her.
Så det er ikke, at denne kode inde i denne funktion kommer til at tage fem
sekunder til at køre.
Denne kode vil køre temmelig meget øjeblikkeligt, i det mindste i forhold til
de fem sekunder, vi talte om tidligere før.
>> Så bare for at vise dette i aktion, Jeg kan gøre Node.sleep.js.
Og gjorde jeg rod op noget?
Muligvis.
Undskyld.
Lad os se hvad vi kan gøre for at løse dette.
OK.
Så helt sikkert bruge Node.js.
Jeg er bare sjov.
OK.
Blot ét sek.
OK.
Jeg ved, hvad det er.
>> Så problemet er, at i min anden fane her, var jeg kører Node allerede på
samme adresse, 1337.
Så den fejl, dette kastede, hvis vi ser ved det virkelig nøje, er adressen i
bruge, EADDRINUSE.
Så jeg var allerede bruger 1337 her.
Så hvis jeg lukker det ud, og så er jeg nu forsøger at køre dette forhåbentlig alt
vil være fint.
OK.
Så du kan kun have én ting sortere af at lytte på en port på en gang.
En anden løsning ville have været for mig til blot redigere dette program, og gøre
det være som 1338 eller noget sådan.
>> Men nu søvn kører.
Så lad os faktisk prøve det i browser denne gang, fordi det er en
lidt spændende at se det i en terminal.
Så jeg bare kommer til at gå til at 127 adressen igen på 1337.
Og hvis du kan se det -
Jeg ved ikke, om du kan - men min browserens tage en meget, meget lang
tid at indlæse eller lignende fem sekunder.
>> Og så efter at det endelig sluttede svaret.
Og du kan ikke se det, fordi de ting flyttes over en lille, men hvis jeg gør
dette lidt mindre, du kan se det, siger hej.
Så jeg fik den hey, men efter fem sekunder.
Og det kan være lidt renere at se det her på terminalen, så jeg er
kommer til at gøre en -
lad os gøre i her -
lad os gøre Curl denne adresse igen med 1337.
Og jeg bare lidt nødt til at sidde her i fem sekunder.
Men bemærk, at serveren kan acceptere nye svar.
Så det udskriver hej.
>> Og til demo dette, dybest set, hvad Jeg kan gøre i denne anden fane -
så lad os sige, at jeg gør dette i en anden fane, Jeg har tænkt mig at gøre Curl og det samme
ting igen.
Og jeg har tænkt mig at forsøge at sparke disse fyre off på samme tid.
Så jeg har tænkt mig at gøre dette, og jeg er kommer til at køre over her, og jeg er
kommer til at gøre det igen.
>> Og lad os gøre det, så du kan se dem begge.
At man udskrevet hey, og at man trykt hey hele vejen -
lad os gøre det eksperiment igen.
Faktisk, lad os bruge denne trick, hvis det er OK.
>> Så jeg har tænkt mig at bruge en shell ting, tillader mig at stort set køre to eksemplarer
af dette program parallelt.
Så det vil løbe det første program og det andet program i parallel.
Så nu, hvis jeg trykker på Enter, går det at gøre denne anmodning temmelig meget
går på samme tid.
Så lad os give det et skud.
>> Så nu mærke til det, siger to processer.
Og hvis du er nysgerrig, at 27.000 nummer er dybest set den proces id.
Og derefter mærke, de udskrives hej samtidig.
Det var ikke som vi måtte vente fem sekunder for en og derefter efter at,
fem sekunder senere få den anden.
Så det er lidt på nogle måder, det er ikke rigtig beviser, men det er
intuitiv beviser for, at det ikke bare ligesom vente fem sekunder, og blokere
hele tråden.
OK cool.
>> Så Aron stillede et spørgsmål tidligere, at var, godt hvad hvis vi gør noget -
Yep?
>> PUBLIKUM: Vent.
Hvordan er det forskelligt fra printf puffer, selv?
Er det ikke automatisk gøre det?
Hvorfor skal vi nødt til at bekymre sig om det?
>> KEVIN SCHMID: Åh, kunne du sige, at en gang mere?
>> PUBLIKUM: Er ikke lide printf buffer gøre præcis de samme ting?
>> KEVIN SCHMID: Den printf buffer?
>> PUBLIKUM: Ja.
OK.
Var ikke i en af ​​de quizzer, de var taler om, hvordan, hvis du lige printf
noget, og så har den pause en sekund, og så har du det loop ti
gange, vil det vente ti sekunder, og derefter printf det hele sammen?
>> KEVIN SCHMID: Åh, OK.
>> PUBLIKUM: Er det at gøre det samme ting, så i dette tilfælde?
>> KEVIN SCHMID: Så spørgsmålet var dybest set i en af ​​de tidligere quizzer
eller noget, der var et spørgsmål, som dybest set, hvis du siger print F 10
ting på en gang og derefter sov ligesom i processen med at udskrive dem ud,
ved udgangen af ​​en eller anden grund, ville det bare dumpe dem alle ud på skærmen.
Så der er lidt to forskellige koncepter her.
>> Så jeg gætte en ting er, at i denne tilfælde er der tale om to forskellige
slags mennesker beder serveren for ting på samme tid.
Og grunden til, at printf slags venter sådan og dumper det hele ud
på én gang er mere relateret til hvordan printf slags -
så den måde printf er faktisk gennemføres, er det dybest set har at
tale med operativsystemet til at skrive at ting til konsollen.
Så det vil ikke gøre alt dette ting det samme, når du siger printf
noget snor, fordi det kunne blive dyrt, hvis det har til
gøre det hver gang.
>> Så hvis du gør printf hey, dit program kan faktisk ikke udskrive det
straks til konsollen.
Det kan sige, OK, jeg skrev det.
Og så slags vente for dig at give det lidt mere før der rent faktisk
skrive det ud til konsollen.
>> Så grunden til, at det var tilfældet -
og det er lidt relateret til søvn -
er, at søvn var slags bare injiceres i der for at demonstrere
faktum, at det ikke skriver det synkront.
Men grunden til det er bare ydeevne, så du ikke behøver at
gør, at mange kontakter til operativsystemet.
>> Men her, hvad vi virkelig forsøger at gøre med denne søvn ting er bare show
at når vi har to mennesker besøger denne hjemmeside, er det ikke kommer til at sætte
dem i en linje, hvor det kommer til at sige Jeg er nødt til at hjælpe dig, og så når jeg er
helt færdig hjælpe dig efter disse fem sekunder og derefter vil jeg
gå videre til den næste person.
Så den første person anmodning ikke binde denne begivenhed loop
hvis det giver mening.
>> Men her er faktisk et eksempel af noget, der vil binde
op tilfælde løkke.
Så her er en forfærdelig funktion til beregne den n'te Fibonacci.
Det er bogstaveligt talt det værre måde, du kan beregne den n'te Fibonacci-tal.
Og det er faktisk bare at anerkende hvor det kom fra,
der er faktisk -
Jeg mener, kan du prøve at gå finde det - men der er ligesom en meget langvarig blog
skrive, at nogen skrev.
Det er ligesom en af ​​de Reddit ting.
Men nogen kritiserede Node.js, og de brugte dette som et eksempel.
Så jeg slags ville bare vise dig to forskellige perspektiver bare for at få
en generel forståelse af begreberne bag disse to ting.
>> Men dette er valgt som blot en frygtelig, grueligt ineffektiv beregningsmæssigt
intensiv måde at beregne n'te Fibonacci-tal.
Så lige som en side bemærkning, hvorfor er det forfærdelig gerne på én måde?
Yep?
>> PUBLIKUM: Sig du starter med 1.000.
1.000 deler sig i 999 og 998.
Hver af denne deler sig i to ting.
>> KEVIN SCHMID: Right.
>> PUBLIKUM: Hele vejen ned.
>> KEVIN SCHMID: Præcis.
Så bare for at gentage til kameraet, hvis jeg kalder fib på ligesom 1.000 eller noget
sådan, er det naturligvis ikke er mindre end eller lig med en, så jeg har tænkt mig at
gå til denne andet tilfælde, og så jeg har tænkt mig at kalde fib 999 plus fib 998.
Og så temmelig meget alle, der arbejde, fib 999 gør, er
slags på dette niveau.
Hvis du går ned, er det endnu mere overflødig end det, men hvis du bare
tænke computing fib 998 får os temmelig tæt på fib 999.
Så vi skal virkelig være en smule mere klog på, hvordan vi slags genbruge
disse, men vi er ikke genbruge disse ting overhovedet.
Så du kan forestille dig denne gigantiske, gigantisk træ, der er bare forfærdeligt.
>> Men alligevel, OK.
Så det var fib.
Det tager bare et stykke tid at køre.
Yep?
>> PUBLIKUM: [uhørligt].
>> KEVIN SCHMID: Åh, kunne du gentage spørgsmålet?
>> PUBLIKUM: [uhørligt].
>> KEVIN SCHMID: Åh, så dette er blot kode der kommer til at være slags på
server side.
Så dette er ikke kommer til at findes i browseren eller noget.
Det er dybest set, hvad vi har, er, at når brugeren her temmelig meget fabrikater
deres anmodning igen, når vi slags fremsætte en anmodning, vi kommer til at kalde
denne funktion på serveren side.
Og så vil vi få resultatet tilbage fra at kalde denne funktion.
Og så vil vi bare udskrive til brugeren.
Så brugeren ikke rigtig beskæftige med denne funktion for meget.
>> Var det spørgsmål?
Giver det mening?
OK.
Fedt.
>> Så igen, vi gør hele denne res.writeHead ting, hvor vi udskrive
overskriften.
Og så kan jeg afslutte reaktion ved at gøre det magiske tal er fib 45..
Så lad os bare køre denne server.
Så jeg har tænkt mig at gøre en node fib.js.
Så nu er min fib serveren kører.
>> Og så er her, jeg har tænkt mig til at gøre en af ​​disse.
OK?
Så jeg vil bare sige, Curl.
Så det kommer til at tage lidt tid, men forhåbentlig snart vil slutte og
det vil udskrive at 45th Fibonacci-tal.
>> PUBLIKUM: [uhørligt].
>> KEVIN SCHMID: Det bør få gjort temmelig snart.
Så det burde tage 5-6 sekunder.
Jeg kender ikke det er bare V8 være super hurtigt, men under alle omstændigheder er dette en
meget kort eksempel og bevidst inelegant af en ikke-triviel
beregning.
Så efter et stykke tid, betyder det at få denne.
>> Men nu, hvad nu hvis jeg gør det samme slags eksperiment som før, hvor jeg gør
to anmodninger på samme tid?
Så her jeg har tænkt mig at en Curl på denne adresse, og jeg har tænkt mig
at gøre en anden Curl.
Og husk, når vi gjorde dette for sove server, da vi grundlæggende havde det
efter fem sekunder, de temmelig meget begge kom tilbage til højre
omkring samme tid.
Så det var ikke specielt bundet op.
>> Men lad os prøve det nu.
OK, så vi fik vores to processer.
Husk det er de proces-id'er.
Dette kommer til at være lidt akavet, mens vi i stå.
Så lad os bare blive her og vente.
>> Så en af ​​dem skulle komme tilbage efter lignende -
OK, så kom tilbage.
Men hvorfor så ikke den anden man kommer tilbage endnu?
Yep?
>> PUBLIKUM: Serveren kan ikke gøre noget mens det computing det store nummer.
>> KEVIN SCHMID: Right.
Så svaret var bare, at serveren virkelig kan ikke gøre noget, mens
det er computere, der Fibonacci-tal.
Så nu har jeg lige fået mine to ting tilbage.
Men jeg gætter bare at tænke på koden lidt mere, hvordan det er at arbejde
og alting.
>> Så denne funktion her er den kode, Jeg har fortalt denne server til at køre, når det
modtager et nyt indgående anmodning.
Så det er bare at køre gennem dette hele koden, og så er det kommer til at gå
tilbage til begivenheden loop og derefter fortsætte kontrol af nye hændelser.
Så dybest set, hvad vi har sker er den server er
lytte efter nye ting.
Den første person anmoder om det, 45 er.
Vi kører denne kode til at beregne det.
Denne kode tager omkring fem til seks sekunder til at køre.
Så går vi tilbage til begivenheden loop og tjek for nye anmodninger.
>> Så dette er et eksempel på hvordan hvis du have ting, der er såkaldt beregne
bundet, eller bruge en masse beregningsmæssige, ikke magt, men som er
regnekraft -
Jeg gætte én ting at sige om dette er at denne funktion gør helt,
for det meste temmelig nyttigt arbejde til højre.
Hele tiden, at denne tilbagekald funktion kørte, var det temmelig
meget bruger det meste af sin tid blot computing som n'te Fibonacci-tal.
>> Men vi havde kun én tråd at håndtere.
I Apache-modellen, når to mennesker fremsat anmodningen at få fib 45, vi
ville have haft to forskellige tråde.
Og så operativsystemets job ville have været, eller brugerniveau
kode, der styrer trådene, ville have været at skære det op på
CPU, eller selv hvis du havde flere CPU'er, distribuere dem jævnt over CPU'er
så de var begge slut nogenlunde på samme tid.
>> Så bare for at vise dig, hvordan vi kan sortere på - og dette er ikke en total perfekt
løsning, men slags, hvordan vi kan lave en kommer tilbage her og gøre
en lille smule bedre.
Så hvad jeg har her, er et program kaldet Fib C. Og det dybest set bruger
en anden af ​​Node moduler kaldet Barnets Process Module.
Så jeg har medtaget, at øverst slags ligesom jeg ville gøre et pund inkluderer
barn process.h eller noget.
Nu har jeg adgang til denne CP variabel som har alle mine funktionalitet.
>> Så nu, hvad jeg gør i denne reaktion handleren er jeg kører dette program
dot skråstreg FIB 45..
Så hvad jeg har gjort - og jeg bare at træde ud af dette program for en
lidt -
er jeg har skrevet et C-program, der dybest beregner den
n'te Fibonacci-tal.
Så her er bare et program jeg har skrevet i C, der beregner dette.
Jeg kan kompilere det, og jeg kan køre det på kommandolinjen.
Og det kommer til at beregne 45th Fibonacci-tal.
>> Så mærke det bare tager temmelig meget så længe.
Jeg sandsynligvis kunne have brugt bindestreg 03 til optimere det eller noget lignende,
men jeg vidste bare som almindelig compiler indstillinger.
Og det udskriver det.
>> Men nu, hvad skal jeg slags gør?
Åh undskyld, forkert fil.
Så jeg gør det samme ting med header som før.
Så gør jeg det cp.exec.
Så hvad det kommer til at gøre, er det kommer til at køre dette program.
Men den måde det virker er, at det kommer ikke til at vente på
programmet for at afslutte.
Det bare dybest set siger udføre dette program.
Så dybest set skriver dette ind i kommandoprompten slags.
>> Og så, når du er færdig med det, køre denne funktion.
Så nu er vi slags få denne Hele restaureret ting af
som om vi ikke venter.
Er den slags giver mening?
Yep?
>> PUBLIKUM: [uhørligt]?
>> KEVIN SCHMID: Så det vil faktisk åbne op for en ny proces til at gøre det.
Så det er faktisk på nogle måder, ondt, ikke super ondt, men det er
vigtigt at sige, at dette er en slags gå tilbage til, på den ene side, Apache
model, hvor vi gør tråde og processer for hver anmodning eller
processer for hver anmodning.
Så dette er en slags analog hvad Apache gør.
I nogle tilfælde vil det blot bruge et nyt gevind, som er lidt mere lys
vægt end en proces, men Apache kunne ender forking en ny proces
som er form for, hvad vi gør her implicit ved at gøre dot skråstreg FIB 45..
>> Og så i dette tilfælde, vi slags pådrage de samme udgifter processer.
Så dette er blot en ting du kan gøre.
Men bare for at vise denne form for løb.
Og denne snak er bare virkelig tager sigte på præsentere disse slags programmer som en
måde at vise forskellige perspektiver på hvordan man designer servere som.
Så dette kører, og så nu, hvis jeg gør det igen, jeg fik to proces-id'er.
>> Lad os bare tale om ting at påpege.
Så bemærke, at de er trinvist.
Det er cool.
Fordi det var 27.122 før.
Men meddelelsen nu, de kom tilbage på nogenlunde samme tid.
>> Og nu, et godt spørgsmål spørge om hvorfor var, at sagen er, hvis job
var det nu for at slags gøre disse ting slags spille fair med hver
andre, disse to forekomster af dot skråstreg fib 45 at jeg løb
eller at Node løb?
Hvem slags gør det rimeligt, at de begge få slags afbalanceret køretid?
>> PUBLIKUM: [uhørligt].
>> KEVIN SCHMID: Ja.
Så dybest set, når jeg gør dot skråstreg fib 45 eller sådan noget, nu er det
slags op til operativsystemet til at håndtere runtime af disse programmer.
Og nu kan planlægge dem på forskellige CPU'er, eller det
kan planlægge dem.
Det kan skære op den tid, man CPU får det, eller at de får
til at køre på en CPU.
Så det er ideen bag det.
Giver det mening for alle?
Så nu Node er egentlig ikke spiller en del i at splitte op på disse opgaver.
OK.
>> Så det er næsten det for eksempler.
Jeg ville bare vise en ting mere fordi en masse af dette har hidtil været
ikke helt superpraktisk i nogle tilfælde.
Jeg kan forestille mig at komme hjem efter dette tale og noget og siger lignende,
godt jeg slags fik ud af at tale, Jeg kan lave en Fibonacci-server til
mit afgangsprojekt.
Så her er bare slags endnu et eksempel , som forhåbentlig vil være -
måske ikke, men måske - lidt mere slags relevante for afsluttende projekter og
tænke fremad for ting som dette.
>> Så dette er chat.js.
Så dette er lidt ligesom nogle eksempler server side kode, som du kan bruge til at
oprette et lille chat-server som du måske har set på
Facebook Chat eller hvad.
Så jeg siger ikke dette er ligesom Facebook Chat, men det er lidt
som en god - måske ikke godt, men måske godt - udgangspunkt for en snak
server til din hjemmeside for et afsluttende projekt.
Så lad os se på, hvad det gør.
>> Så vi får denne særlige ting foroven, dette VAR SIO
lig kræver Socket.IO.
Så dette er en anden ting, som det ikke faktisk kommer bundtet med
Node men du kan installere den.
Det er en Node modul.
Så det er ligesom nogle udvidelse til Node.
>> SocketIO er faktisk rigtig slags cool.
Det er en abstraktion, der dybest set, hvad det gør, er det er muligt at
har denne strøm af kommunikation mellem en web
browser og en webserver.
Så for det meste hidtil, har vi haft disse meget hurtig et sekund eller to
anden kommunikation mellem en web browser og webserveren.
Så det er dybest set gå til google.com, get de ting, sende det tilbage, og derefter
vi er færdige.
Vi aldrig taler igen før bruger typer i noget andet.
>> Men hvad Socket.IO og lignende form for ting - og SocketIO er faktisk en
af de ting, der er bygget på som WebSocket som er en slags tilgængelig
som en del af HTML5 -
der tillader dig at have denne fortsat dialog.
Og det er meget nyttigt i en chat-server slags ting, fordi det er
lidt ligesom en fortsat dialog i nogle måder, fordi hvis du chatter
med nogen, kan du nu bare sende en besked ned i røret, og derefter
server kan sende en besked ned rør til den anden person, du er
chatter med.
Og så kan du få denne udveksle sådan.
>> Så det er lidt af, hvad SocketIO er godt for.
Grunden til, at SocketIO bruger WebSockets som én ting er, at i
Udover blot almindelig gamle WebSockets, det gør også nogle tricks til stort set
gøre den browser kompatibel.
Så browsere som Internet Explorer desværre understøtter ikke WebSockets
lige ud af kassen.
Så det bruger en anden form for kølig pæn ting med Adobe Flash for at tillade
du har cross browser support.
Så det er virkelig nyttige.
>> Og faktisk, jeg ved jeg er lidt kører på tid her, men CS50
Diskuter, har du nogensinde set noget ligesom, jeg ikke kender, blank så og så er
besvarelse af dette indlæg eller noget gerne, at denne funktion?
Det er SocketIO.
Så når nogen begynder at skrive i diskutere boksen for at lave et svar eller
noget, din browser, hvad der er kaldet i SocketIO udsender en slags
begivenhed, der siger nogen er besvarelse af dette indlæg.
>> Derefter serveren siger, OK, hvad skal jeg gøre?
Nå nu jeg nødt til at fortælle de andre fyre der er på CS50 Diskuter leder
på dette indlæg, at nogen har besvarelse.
Så det er lidt af, hvad SocketIO er god at denne fortsatte slags
strøm af dialog.
OK.
>> Så hvad jeg har her - og vi er bare kommer til at ignorere forbindelser matrix
for en lille smule -
hvad jeg gør, er jeg ved en anden lytter.
Så det er bare den måde i Socket.IO er siger lad os lytte på denne port.
Og så vil jeg gøre dette på tilslutning.
Så det er bare dybest set Socket IO måde at sige, når vi modtager en
forbindelse, jeg vil have dig at køre denne kode.
>> Og bemærk, at i stedet for at have rec og res bestået derinde jeg har Socket.
Og denne Socket idé er dybest set dette ting, som du kan skrive til og læse
fra som har brugerens beskeder Muligvis.
Og de beskeder, du vil sende kan gå igennem, at Socket.
Giver det mening?
Så det er denne fortsatte ting.
>> Så hvad jeg gør, er jeg kalder Socket.emit.
Og udsender tager temmelig meget to argumenter.
Det første argument er en streng blot repræsenterer typen af
ting, du udsender.
Så i dette tilfælde, jeg har brug denne streng ny meddelelse.
Og det er bare dybest set siger, at typen af ​​denne ting, hvad jeg
afsendelse, er en ny besked.
Så du kan lytte efter bestemte typer som ny besked eller hvad
ved hjælp af prik på.
>> Så forbindelse og bruger har sendt der, hvis man ser på, hvor vi kalder prik på,
der er andre strenge, der repræsenterer typer af brugernes beskeder.
Så det er dybest set, du kan have denne udsender en af ​​disse meddelelsestyper, og
så gør noget som reaktion på en af ​​disse meddelelsestyper
>> Så jeg udsender denne nye meddelelse.
Vi kommer til at ignorere connections.push for en anden.
Men så siger jeg, Socket.on brugeren sendt.
Så nu er det er lidt ligesom, når bruger sender mig en besked, jeg vil
dig at køre denne kode.
Og bemærk, at det anonyme funktion tager i denne variabel
kaldet data, der dybest set går har brugeren budskab.
>> Så lad os nu slags snak om tilslutningerne array.
Så dette er designet til en chat-klient hvor stort set alle er slags i
samme chat-rum.
Så dybest set, hvad vi har brug for at holde omkring er nogle array, der dybest set
repræsenterer alle de personer chatter i nogle måder, hvis det giver mening.
Right?
Fordi vi har brug for at vide, hvem de fyre er, så vi kan sende dem beskeder
at andre folk sender til os.
>> Så hvad denne kode gør, er, når brugeren sender et budskab - det er den type
begivenheden -
vi kommer til at køre denne kode.
Og hvad vi gør, er vi kører gennem denne array, vi har kaldt forbindelser.
Og temmelig meget for hver forbindelse undtagen den ene, der er vores, det er
hvad denne kode siger, sender vi et nyt besked med det vedlagte meddelelse
information.
>> Så hvis du bemærker her, hvad jeg gjorde, da brugeren rent faktisk gør en ny
forbindelse er jeg har tilføjet med JavaScript.push metode, er dette
dybest set bare at sige ligesom tilføje at Socket som en værdi i
vores forbindelser array.
Så nu når denne kode kører, vil det sende tingene til dem, især
tilslutninger.
Så det kan være et godt udgangspunkt for at gøre en chat-server
eller noget lignende.
>> Og den slags cool ting er, at kode, som du ser her til ligesom på og
udsender og den slags, er det samme form for JavaScript-kode, som du ville
skrive i browseren til at interagere med serveren.
Så det er derfor SocketIO er slags pæne og nyttige i denne måde.
>> Åh, og kun én ting mere hurtigt.
Der var en CS50 afgangsprojekt sidste år der dybest set implementeret en chat
server i Node.js.
Jeg synes det er Harvardchats.org men jeg er ikke -
OK.
Jeg er ikke sikker på, hvad URL er, men Jeg kan sende det ud bagefter.
Men det er lidt cool hvad du kan gøre med Node.js.
>> Så håber jeg, i almindelighed, du fyre har en god fornemmelse af, hvad Node.js er nyttigt
til, og hvordan man kunne måske anvende til din endelige projekt.
Jeg vil sende nogle flere ressourcer sammen med dette.
Og tak fordi du kom.
Tak.
>> [Applaus]