KEVIN SCHMID: Hello everybody. Welkom by die CS50 seminaar op Node.js. My naam is Kevin. Ek is 'n CS50 TF. En ek is soort van soos baie opgewonde oor hierdie seminaar. Ek dink Node.js is baie cool. Ek hoop dat hierdie seminaar gebruik kan word as 'n goeie, dink ek, springplank vir sommige van jou finale projekte indien jy belangstel in die gebruik van iets soos Node.js. Ons sal soort van begin om die seminaar af deur net praat oor 'n bietjie van die soort agtergrond scalability perspektiewe van Node.js, en dan ons sal beweeg na 'n paar kode voorbeelde. En Ek sal die kode op 'n webwerf het, en jy kan kyk na die kode. En ná die seminaar, sal ek soort van talk oor hoe jy kan 'Node.js op jou rekenaar. OK. So laat ons begin. So ek dink ek wil net om te praat oor web bedieners, regtig, eerste. En hierdie bespreking te begin, het ek basies 'n diagram wat uit die handboek gebruik vir CS61, wat basies dui die interaksie tussen 'n kliënt proses, soos jou web leser of soos jou doel kliënt of iets soos dit, en 'n web bediener. So hierdie soort lyk soortgelyk aan die prentjie wat jy sien in lesing oor Woensdag waar basies het ons het 'n paar kliënt proses soos Google Chrome. En dan stap een is die kliënt stuur 'n versoek. So wat kan iets soos goed laat wees besoek, weet ek nie, CS50.net. So reik ons ​​dat versoek. En nie almal onthou nie die naam van die die protokol wat bepaal hoe dit versoek gestruktureer moet word? Yep. Publiek: [onhoorbaar]. KEVIN SCHMID: Presies. So dit is soos HTTP, reg? So basies die spesifikasies vir hoe daardie versoek moet eintlik gelê word uit, want op die einde van die dag, wat versoek is eintlik net graag 'n string wat basies sê ek wil dit. En die spesifikasie want dit is HTTP. So dit is soos 'n protokol. So dan is die bediener ontvang daardie versoek. So julle ouens het 'n web bediener geïnstalleer in die CS50 toestel. Dit is Apache. En hierdie week wanneer jy werk op die probleem die sewe, sal jy eintlik werk met die web-bediener. So die bediener ontvang wat versoek en dan moet dit soort krap sy kop en soos sê goed wat doen ek met hierdie? So op grond van wat dit besluit om te doen, dan dit het 'n soort te kontak van die hulpbron. En dit kan 'n bron wees baie verskillende dinge. Vir een, kan dit net soos 'n statiese HTML-lêer. So dit kan net wees soos 'n paar HTML wat is soos vir jou persoonlike webwerf. Dit kan 'n statiese lêer soos 'n beeld wees of soos 'n film wat jy het. Dit kan selfs om te praat om 'n soort van databasis soos 'n MySQL databasis. Daarom is dit nie altyd om te kommunikeer met 'n bron nie, maar in sommige gevalle, dit kan. So dan wat dit gaan doen Na dit is dit gaan terug te stuur om die reaksie. En die reaksie, want dit is ook bepaal deur HTTP. So dan is die kliënt kan dit ontvang het. Dit kan dit uitmekaar skeur en verwerk dit. En dan kry jy 'n webblad soos Google of CS50.net of alles wat jy het om te. OK? So dit is die basiese interaksie wat ons gaan word behandel. En ons is pretty much gaan wees fokus op hierdie deel van die interaksie, die bediener. OK. Cool. Enigiemand enige vrae so ver? OK. So as ons gesê het, die web bediener ontvang hierdie HTTP versoek en dan reik hierdie HTTP reaksie. En soos ons gepraat oor voordat die CS50 toestel web bediener is Apache. So wanneer jy ouens werk op P die sewe, jy gaan om te werk met die Apache web server. Jy sal nooit weer hoef te werk regtig met Apache direk te veel. Jy soort instel Apache 'n bietjie As jy die virtuele gasheer of die v leërskare, en ons kry aan dié in 'n bietjie. Maar basies, die Apache webbediener stel om te werk met PHP soort van uit die boks. So wat werklik gebeur, is wanneer jy gaan om een ​​van jou webwerwe soos, sê, plaaslike gasheer streep jeug of iets, is jou leser stuur wat versoek, en dan Apache sit daar en figure uit te doen met dit. En die aksie is om uit te voer wat die kode in jeug en stuur dit dan af terug. So daar is nie. So het ons soort van gepraat het oor hierdie. So dit kan net dien 'n statiese lêer of hardloop 'n PHP-kode en dan kwessie die reaksie. So dan is 'n algemene vraag wat kan kom up is goed, hoe gaan ons nie regtig met die feit dat verskeie gebruikers op dieselfde tyd? So dink as jy 'n webblad is skriftelik bediener, as jy 'n web bediener wat jy het probeer in om iets te skryf soos C of iets soos dit, basies kan jy dink oor hoe daar kon 'n soort van die kode wees dat sou die versoek ontvang nie, maar dan dit het al hierdie werk op om dit te doen. Dit mag het om, byvoorbeeld, kontak die databasis of iets soos dit. Reg? En dan is dit dat die soort doen van die verwerking en dan terug gestuur het om die reaksie. So dit is soos die hoë vlak oorsig. Maar dit is nie onmiddellik duidelik hoe jy kan doen wat so dat twee mense of selfs 1000 mense kan werk met jou web bediener op dieselfde tyd. So die oplossing wat Apache gebruik is drade of prosesse genoem. So jy dalk gehoor het van hierdie terme voor. Dit is OK as jy nie, maar dink net oor drade of prosesse as maniere vir 'n bedryfstelsel of 'n gebruiker program of iets of 'n web bediener om soort van voer verskeie dinge gelyktydig. So kan jy die term gehoor het soos 'n draad van die uitvoering. So dit is soort van soos jy soort van multitasking. En as jy dit gesien het op die boks van jou laptop, of iets soos dit, multicore, wat jy kan doen, is wat jy kan hardloop twee verskillende drade op verskillende dele van die CPU, sodat hulle kan werklik gebeur op dieselfde tyd. So, dit is werklik 'n kragtige. En dit is 'n soort van Apache se oplossing vir hierdie probleem. So is daar soort van soos enige kwessies met hierdie benadering al? So ek dink ek soort van daar geskryf het. Maar beide van hulle soort gebruik om 'n baie van die geheue. Dit is baie duur om te skep 'n draad of 'n proses. En 'n deel van die redenasie is dat net soos wanneer jy loop 'n C program soos jou hoof en dan dat oproepe 'n ander funksie, wat 'n soort van stapel. So drade vereis ook 'n heeltemal aparte stapel wat kan baie groot. En as jy jou kan voorstel met ton van die gebruikers op jou webwerf, sou jy 'n baie verskillende drade. Dit is 'n baie stapels te bestuur en te onderhou. So dit is 'n groot geheue verbruik. En dan ook, kom ons sê jy het net een CPU, of kom ons sê jy het ' meer drade as jy diegene multicores. Reg? So kom ons sê jy het 10 drade en jy net vyf CPUs het. Jy soort van hierdie ding om te doen waar oorskakel tussen die huidige een wat loop nie omdat jy kan nie al 10 hardloop in 'n keer. En dit is bekend as 'n konteks skakelaar. En die term het eintlik 'n paar verskillende kontekste, maar laat ons net dink aan dit as skakel tussen twee drade. Dit kan redelik duur wees, want basies wat jy hoef te doen is om jou het om te stop wat jy doen nie, behalwe die van daardie hardloop draad, en dan oor te skakel na 'n ander plek. So het almal soort van sien motivering van waarom drade en prosesse dalk 'n bietjie lywige? En het jy 'n vraag? OK. Cool. Enigiemand enige vrae? OK. So as ons 'n stap terug vir 'n tweede, daar is soort van soos 'n waarneming dat ons kan maak oor 'n baie web programme. En dit is regtig so baie van hulle eintlik nie doen nie baie bruikbaar nie werk binnekant van 'n draad. So het iemand begin op P die sewe nie? So wil jy dalk beskryf sommige van die dele? Het jy aanmelding gewerk of iets soos dit? Publiek: No KEVIN SCHMID: OK. Never mind. Jammer. Maar basies, in die P stel, is jy gaan word om 'n baie soort van navrae aan 'n databasis 'n paar te kry inligting uit die databasis. En wat jou kode is gaan doen, wat dit Apache proses of dat Apache draad gaan om te doen terwyl dit het te kontak die databasis is dit soort van gaan wees sit daar en dit gaan wees wag vir die databasis te antwoord. Nou wat dalk nie klink soos so 'n groot gaan omdat die databasis is op jou CS50 toestel, reg? Maar daar is 'n soort van netwerk latency daar omdat dit nou die web bediener het sy eie versoek uit te reik na Die databasis met die te kommunikeer databasis en dan kry dat inligting terug. Dus is dit nou soos goed wag vir my, ek is gaan om te gaan kry iets uit die databasis en dan is daar 'n baie wag aangaan. Is wat sin maak? En vir 'n paar dinge wat dit is nie so sleg nie. As dit net moet, byvoorbeeld, toegang geheue, dit is nie soos aaklige I / O latency. En as ek sê, I / O latency, wat ek verwys is, soos enige soort van soos insette uitset. Maar om toegang te verkry om 'n lêer op die skyf, soos As ek wou die statiese HTML te dien lêer wat op my webblad of iets soos dit, ek soort van moet stop vir 'n bietjie, lees die lêer in van die skyf, en dan in dat die proses Ek wag. Ek doen nuttige werk. Dit is nie waar van alles nie, maar dit is algemeen in programme soos P stel sewe en 'n baie aansoeke dat jy nie eintlik veel denke. En as ek sê dink, ek bedoel computational werk. So computational werk kan iets wees soos, sê, jy wou skryf 'n web bediener wat net bereken die de Fibonacci getal. Dit klink nie soos 'n besonder pret web bediener. Soos ek sou nie verwag dat die site te wees die volgende Facebook, maar dit is 'n paar soort van computational werk. En jy kan dink vervang wat met 'n ander soort van interessante computational werk. Kom ons sê jy is iets skryf wat bereken is om die grade van skeiding tussen twee mense of iets soos dit. So wat nie behels 'n soort berekening, reg? En selfs dan, om te doen wat jy nog 'n baie wag om te doen vir miskien jy het 'n databasis te kyk om navraag te up wat is vriende met wie of iets soos dit. So is daar dat die soort van idee van numeriese werk. Is wat sin maak? Het enige iemand enige vrae? Ag, en ek dink ek het chat bedieners daar omdat chat bedieners is soort nog 'n goeie voorbeeld hiervan. 'N chat server nie veel te dink nie. Dit het net om te wag vir mense om te boodskappe stuur en dan wanneer hulle nie, hulle stuur. OK? So net om weer te vat, Apache en soortgelyke web bedieners soos daardie vurk 'n baie van die drade en prosesse wat soort van verkwistende kan wees. So ek dink die vraag wat kan kom van wat ons nodig het verskeie drade en prosesse? Wat as ons net een gehad? So laat se soort van 'n skildery van wat hierdie sou lyk. So laat ons gebruik net een draad. OK? So dink net dit met een draad. Kom ons dink ons ​​is nie regtig doen dat baie nuttig - en wanneer ek sê nuttig, ek bedoel computational werk - in die verskeie drade voor. So laat se soort konsolideer alles in een draad. So wat as ons het 'n draad wat soort net gaan rond in die loop en voortdurend tjeks het iets nuwe gebeur. So byvoorbeeld, iets nuuts gebeur kan beteken ek het iets terug van die databasis, of iemand gestuur my 'n nuwe HTTP versoek. So dit is soort van gebeure dit gebeur, reg? En dan wat ek kan doen wanneer daardie nuwe dinge gebeur, is in dieselfde draad van die uitvoering, hierdie enkele draad van uitvoering, kan ek 'n paar kode noem dat sou daardie spesifieke ding hanteer. So byvoorbeeld, as ek iets terug uit die databasis, kan ek draai my klein computational deel van dit wat eintlik net berei die ding te terug te stuur na die gebruiker. So doen dat die soort van sin maak? Maar wat is regtig die implikasies van hierdie? Reg? Want ons het geskryf 'n baie van die kode dat - en ek is net gaan om voort te spring in die skyfies as dit is OK. So as jy nie omgee nie, ek is net gaan 'n stap terug te neem. So hierdie soort ding is genoem 'n gebeurtenis lus. OK? En dit is soort van die basiese idee agter Node.js. So, wat Node.js is regtig doen as 'n web bediener is daar is 'n enkele draad wat basies gaan om in 'n lus soos 'n terwyl een soort onder die kap van Node.js wat voortdurend nagaan, het ons nuwe dinge ontvang? En dan sal dit loop hanteerders dat jy die opstel van. Maar 'n goeie vraag om te vra is, hoe kan ons maak dit gebeur met bestaande dinge? So ek het 'n lyn van C kode wat basies lyk soos dit is die opening van 'n lêer, reg? Ek Sy het net kom uit met 'n album. So ek het haar 'n nuwe lêer oop te maak. So die manier waarop ons C-kode vir die bedryf - en ek dink die rede hoekom ek verkies lêers want dit is 'n soort van die mate van die I / O werk wat ons in C gedoen het in 'n gevoel dat daar is insette uitset. So noem ons hierdie kode wat doen dit f oop. En dan op die volgende lyn van ons program, kan ons nou saam met f. So sou 'n voorbeeld van iets wees dit is soos loop-of blokkeer, want op daardie eerste reël Daar wag ons totdat ons kry die lêer oop te maak. So op die tweede lyn, ons weet dat ons kan werk met f, maar dit beteken dat dat die tweede lyn kan regtig nie hardloop totdat die eerste lyn gedoen word. Is wat sin maak? So hierdie slegte sou wees om te sit in 'n geval hanteerder. En die rede daarvoor is dat hierdie soort van wag, reg? So dit sou terugkeer ons terug aan dieselfde ding. En nou wil ons nie eens die voordeel van verskeie drade of prosesse, want ons het een draad in Node.js. Is wat sin maak vir almal? Publiek: Wag. So, wat is die vervanging? KEVIN SCHMID: O, so ja. So ek gaan kry om te die vervanging. OK. So wat as ons het iets wat lyk soos hierdie? So wat as ek nou geredigeer f maak 'n bietjie? So ek verby in dieselfde twee argumente as voorheen. Ek het nog lief vir die nuwe lied dat sy kom uit met. Maar ek verby 'n derde ding wat is hierdie veranderlike genoem kode. Maar wat is die kode eintlik in hierdie konteks? Is dit soos 'n gereelde C veranderlike? Dit is 'n funksie, reg? En dit kan 'n bietjie vreemd, want Ek is eintlik soos nou verby 'n funksioneer in 'n ander funksie. So 'n paar dinge om op te let oor hierdie. Een, ek is nie eintlik 'n beroep die kode funksie. So jy sien nie kode met die links paren, reg van voorwerpe. Ek is net verby in die kode. En in C, wat dit eintlik sou doen is vir my 'n wyser na daardie werklike kode, en dan is dit kan dit loop. Maar dink net oor dit as jy verby die kode uit te voer wanneer dat 'n lêer geopen word. Maar wat dit beteken, is dat dit nou die res van my program wat kan doen ander dinge, kan voortgaan om ander te doen dinge, terwyl ons, nie regtig nie wag nie, maar net in die agterkant van ons koppe wat wanneer die lêer se oop, hardloop wat kode aan die bokant. Is wat sin maak? En nou het die idee agter Node.js is dat die kode in die doen dinge met f deel moet wees redelik kort en eenvoudige en eenvoudig en nie werklik baie bestryk intensiewe. Dit kan 'n ander lêer oop te maak nie, maar wat moet ook redelik vinnig want dit moet net sê nie 'n ander f oop te maak en dan noem hierdie ander kode. So net heeltemal duidelik, die f te wees open wat nie die nuwe Katy Perry lied gedoen MP3, wat gaan mooi veel onmiddellik terug te keer. En dan kan ons net voortgaan om te doen ander dinge, want al wat nou f oop oproep maak is basies vertel die onderliggende f oop-kode van die lêer oop te maak en as jy klaar is die opening van hierdie lêer of wanneer jy dit terug, dan loop die kode. Maar dit maak nie eintlik loop dat code. En jy het 'n vraag? Publiek: Jy was 'n paar te impliseer keer dat die byvoeging van computationeel intensiewe-kode soort van breek die [Onhoorbaar] gedrewe stelsel. [Onhoorbaar]? KEVIN SCHMID: Dit is 'n groot vraag. So ek het eintlik 'n voorbeeld van hoe jy kan computationeel integreer intensiewe-kode in 'n bietjie. So wanneer ons by die kode voorbeelde, Ek sal seker maak dat die een om te trek nie. Is dit OK? Dankie. Wat was jou naam? Publiek: Aaron. KEVIN SCHMID: Aaron bring 'n baie goeie punt, en dit is dat as ek gehad het sommige computationeel intensiewe kode in die doen dinge met f deel, die res van die my program kan nie loop nie en kan nie luister vir 'n nuwe versoeke of iets tot al daardie dinge is klaar. So as ek skryf Node-kode in die algemeen tensy ons iets soos ek gaan om later stel wanneer ons kyk na die code voorbeelde, ek moet seker wees dat my kode nie saamvat hierdie gebeurtenis lus. Is wat sin maak? OK. Cool. So Node.js bied hierdie raamwerk wat jy kan hierdie gebeurtenis bou gedryf servers met. So het dit hierdie soort van asynchrone nie-blokkeer I / O biblioteke, terwyl die standaard C biblioteke wat ons al werk met, soos as jy net gebruik dit op dieselfde manier wat ons het gebruik hulle met f open en dinge, wat is die sluit omdat jy eintlik moet wag vir dat 'n lêer oop te maak. Maar Node.js gee jou daardie en dit bande basies in Google se V8 JavaScript-enjin wat is die rede dat Chrome is so vinnig by die verwerking JavaScript, want dit het hierdie V8 enjin. So ek weet dit klink soos een van daardie WWDC ontwikkelaar konferensies ding waar hulle gooi net 'n klomp van die brief aantal dinge vir verwerkers en sê dit is so cool. Maar dit is cool dat hulle gedoen het omdat JavaScript - of miskien as jy nie vertroud is met JavaScript nog nie, want ons het nie ' Die lesings op dit - maar JavaScript is 'n geïnterpreteer taal. En dit is 'n belangrike punt ook. So dit is belangrik vir ons web bedieners te vinnig, reg? En as ons net loop JavaScript kode wat vertolk is met net enige ou tolk dit kan stadig wees. So Node voordele uit met hierdie super vinnig V8 tolk. En ek weet nie of hulle dit genoem omdat die V8 klap in die voorkop ding, maar OK. So het ek voorberei n paar voorbeelde op hierdie skakel. Na afloop van die seminaar, ek soort van gaan praat oor hoe jy kan Node stel kry up, maar vir nou, ek het net soort van wil deur 'n paar voorbeelde kode te loop. So as jy wil volg saam, al die bron-kode is daar beskikbaar. OK? So ek sal hierdie URL verlaat vir 'n bietjie. En dan gaan ek net te oorskakel na die terminale. Is almal goed met hierdie URL? So ek gaan oor te skakel om my terminale hier. So hier is die kode wat Ek het vir vandag. Hoekom doen ons nie begin met simpler.js lêer? Die ander ding is dat al hierdie kode gaan in geskryf word JavaScript wat jy mag of mag nie vertroud wees met. Ek dink 'n paar dinge is wat 'n baie JavaScript-kode is die soort sintaksis en struktuur is baie soortgelyk aan C, sodat jy kan soort dit kom haal as jy gaan saam. Ek het probeer om 'n groot deel van die skryf begin-kode vir die in 'n manier wat soortgelyk aan C sodat dit 'n bietjie meer leesbare. Maar soos ons vorder, sal ek toon sommige van die bykomende kenmerke van JavaScript dat is gaaf. Maar laat ons kyk na hierdie voorbeeld program. Ek dink alles is daar afgesny. Ek gaan net dat ware op te los vinnig as dit is OK of nie. Ek weet nie wat dit gaan doen. Is dit 'n bietjie beter? Kan jy sien die var en dinge? OK. Dus is die eerste lyn is soos die JavaScript weergawe van 'n veranderlike verklaring. So net om te beklemtoon wat dit sou lyk soos in C. So dit is net soos my gesê indeks is gelyk aan drie of iets soos dit. So ek het nie die tipe spesifiseer. JavaScript wel tipes, maar dit is baie dinamiese getik in die natuur, so het nie enige soort van tipe op dit. So dit net 'var. Dit is soos veranderlike. OK? En ek vra hierdie veranderlike HTTP. En op my regterkant, ek het die uitdrukking wat ek wil om te sit in HTTP. En dit sê vereis HTTP. So dit is 'n soort van 'n soortgelyke in te sluit. Dit is 'n bietjie meer soos kragtig as sluit in die sin dat sluit sou net kopieer en plak die kop dien vir die funksie prototipes of alles wat met die tipe definisies. Maar vereis eintlik gaan om ons te kry die kode. Sodat jy kan dink dat dit as die invoer van sekere kode. So iewers in die Node.js module stelsel of wat ook al, hulle het al hierdie HTTP bediener-kode so ek is net haal dit vir my eie persoonlike gebruik in hierdie program. OK? So dan het ek hierdie funksie wat ek geskryf het. En sien ek het nie spesifiseer return of die tipe van die argumente weer. So soort van los getik in dat die soort van sin. Twee argumente wat dit neem om in, Die versoek en reaksie. So dit is konseptueel soort van soos bekend uit die prentjie wat ons gehad het op die skerm voor omdat ons kry die versoek dat ons het van die gebruiker. En dan het ons 'n reaksie wat ons dinge kan skryf aan. Dus is die eerste reël van hierdie nie res.writeHead 200 en dan is dit inhoud soort teks plain. So laat se werk dit uitmekaar 'n bietjie. So laat ons net fokus op res.write vir 'n bietjie. So skryf is basies, en skryf hoof, is net maniere om soort van uitskryf dinge aan die reaksie. OK? So skryf hoof, as iemand onthou van die HTTP lesing, het julle onthou kop op die top van die HTTP ding? So hoekom doen ek nie net demo kop ware vinnig. Sou dit nuttig? Of moet ons net soort van - OK. Seker nie. So wanneer jou leser gaan na google.com of iets soos dit, daar is eintlik 'n bietjie meer - dit is soos 'n geheim - daar is soos 'n bietjie meer inligting wat kom deur die pyp as net die klein soek en alles. So om jou te wys dit, ek gaan 'n program genaamd Curl te gebruik. OK? So dit is iets wat jy kan doen by die Mac OSX command line of in die toestel of wat ook al. En so as ek krul HTTP google.com, Ek gaan die HTML te sien. En dit is, in regverdigheid, net die HTML dat die soort van vertel jou te lei na www as jou blaaier nie outomaties hanteer die herleiding. So dit is net HTML, maar ek gaan om by te voeg hierdie koppelteken ek vlag te krul. OK? En dit gaan om te wys my kop. So is dit ook inligting wat deur wanneer ek hierdie reaksie. OK? So aan die bokant, jy sien dit HTTP 301 permanent te beweeg. En dit is 'n soort van belangrik omdat dit verwys na die status kode. So het die 301 hier is die status kode, wat is basies net 'n heelgetal wat vertel die leser of wie is die lees van hierdie, as jy voorgee dat jy is 'n leser en jy sien dit, basies nou as jy kyk na dat en jy sien 'n 301, jy weet ek het iets spesiaals wat gebaseer is op te doen 301, of iets spesiaals gebeur gebaseer op die 301. So sê verhuis permanent. En dan, in wese, het ons ' 'n klomp van die sleutel waarde pare. So kry ons die plek is www.google.com. En dan soort van al hierdie ander dinge, maar basies, wat die plek is woord is die nuwe plek is op www.google.com. So nou as jy gaan na google.com, sal jy soort van sien die leser soort knip vir 'n tweede en dan lei jy terug na www.google.com. So het die antwoorde kan bevat hierdie hoofde. En 'n paar dinge uit te wys. So kom ons sê ons was eintlik suksesvolle in die besoek van 'n webblad. So laat my gaan - Wat is 'n goeie webwerf? Ek is sleg dink van goeie webtuistes op die plek. Publiek: Wikipedia. KEVIN SCHMID: OK. Kom ons doen Wikipedia. So hier is ek verskuif. O wag. Was ek? Ja, ek was. OK. So het ek www te doen. So ek gaan www te doen. En soos jy kan sien, hier is al die HTML dat die leser sal verwerk vir Wikipedia. Maar as ek hou blaai hier, wat ek sal sien op die top - Sjoe, daar is 'n baie HTML op Wikipedia - Maar wat ek kan sien op die top hier is hierdie 200 status kode in teenstelling met die 301 wat ek gesien het vroeër. En sien dat dit het 'n mooi vriendelike OK langs dit. So dit is soos die goeie status kode. Is dit 200 aantal bekende lyk? Ja, want toe ek dit gedoen simpler.js, Ek het 'n 200 daar. So dit is basies sê vertel die leser of wie is probeer om te kry om te dit wat hulle suksesvol was. Of dat die soort van soos ons suksesvol was ook. En daar is hierdie soort van spesiale sintaks in JavaScript vir waarby 'n kaart van die sleutels soos inhoud tipe en hierdie waardes soos teks plain. So as jy kyk na die reaksie wat ons terug gekom van Wikipedia voor, - Ek gaan om te probeer om te blaai 'n bietjie vinniger - jy het die sleutels soos bediener en hierdie waardes Apache. So jy het die sleutels en waardes. En jy kan spesifiseer dit in Node wat terug te stuur. So dit is eintlik soort van, in sommige maniere, en in sommige opsigte is dit nie regtig nie, maar dit is 'n bietjie laer vlak as die PHP-kode wat jy kan wees skryf vir P die sewe omdat PHP en Apache soort van sorg van 'n paar van hierdie dinge vir jou. In PHP, kan jy die standaard ignoreer gedrag deur die skryf van jou eie kop. Maar vir die doeleindes van hierdie, ons kry ons eie kop uit te skryf. So het die lyn sin maak almal, die skryf hoof lyn? OK. Awesome. So het wat ek doen, is ek uiteindelik die antwoord deur te sê hallo wêreld. OK. Maar dit is net 'n funksie genoem versoek hanteerder. So nou is ek eintlik soort doen iets met hierdie funksie, reg? So hier wat ek doen, is daar hierdie lyn wat nie var bediener gelykes HTTP.create bediener, en dan het ek slaag in die versoek hanteerder. So dit is 'n soort van die knoop manier van die skep van 'n bediener. En sien dat ek verby in die versoek hanteerder. So, dit is die vertel van die createServer funksie wat ek wil hê jy my te maak 'n bediener, en wanneer die bediener ontvang 'n reaksie, ek het jou nodig om dit te noem versoek hanteerder funksie. OK? Sodat lyn pretty much afwerkings dadelik. So het die var bediener lyn is gedoen wat reg nadat jy dit doen pretty much. Ek bedoel, dit het om 'n interne staat om te weet dat jy sal moet noem dat die versoek hanteerder funksie nie, maar dit is nie van plan om daar te sit en sê het die gebruiker gestuur vir my 'n versoek nie? Het die gebruiker 'n versoek gestuur vir my nog? Daarom is dit nie sluit. OK? So, wat dit sal doen, is dit basies slaan nou 'n verwysing na hierdie kode, hierdie versoek hanteerder funksie, en dan sal die kode uitgevoer word wanneer iemand 'n versoek. En dan moet ons server.listen. Die 1337 is daar mooi arbitrêr. Ek het geen spesifieke rede vir die pluk dat die getal. Dit was heeltemal random. Maar dit net spesifiseer die hawe. So die meeste webbedieners jy sal sien dat hulle gebruik port 80 want dit is soort van soos die konvensie. So as ek gaan iets soos, Ek weet nie, Wikipedia.org, en ek sit kolon 8 - O wow, kan jy nie sien nie. Ek is jammer. Maar as ek doen Wikipedia - Ek sal hier skryf dit net so dat dit is duidelik op die kamera. Maar as ek dit in 'n leser met 'n kolon 80, wat bepaal na Wikipedia.org op poort 80. So dit is soos hoe die Verenigde State het verskeie hawens soos waar jy kan skip dinge soort. So dit is soos gaan na hierdie spesifieke plaas op hierdie bediener. OK. So ek het net verkies om 1337. Daar is 'n hele reeks van getalle wat jy kan kies. Dit was nie heeltemal spesiaal. Maar wat ek nou gaan doen is ek gaan Node te voer. Laat my eintlik voer dat 'n paar lyne af sodat jy dit kan sien. Ek gaan Node te doen, en ek is gaan simpler.js te voer. En ons sal praat oor hoe om te kry Node opgestel in 'n bietjie. Maar nou is dit net die bestuur van die bediener. So een ding wat ons kan probeer wat nie wees dat opwindend is, is wat ons kan eintlik probeer om dit te maak in die krul. So ek kan doen krul, en my masjien is die plaaslike gasheer. Jy sal ook sien dat hierdie skriftelike soos hierdie soms. Plaaslike gasheer en 127.0.0.1 is die soort van soos om jou rekenaar by die huis. So dit is soos praat met jou eie rekenaar. OK. En dan kan ek sê 1337. So as ek loop hierdie lyn van kode, dit sê hallo wêreld. En as ek wou dat dinge om te sien dat gehad inhoud soort teks plain of wat ook al, ek kan selfs sit dit hier. En sien dat dit nie sê OK. En ek het die teks plain. En dan is daar van alle soorte is die ander dinge wat Node sal voeg in daar is vir my. Dit is nie super belangrik. Ek bedoel, daar is 'n soort van tegniese aspekte van wat soort cool om te praat oor, maar net om te wys jy, het ek ook die mag het om te verander hierdie rond. So ek kan voeg net 'n klomp dinge soos dat. En dan nou, as ek kyk in my uitset, sal dit wees dat. So hierdie hoofde beteken sekere dinge te implementeer en dinge soos dat. En kop kan basies vertel 'n leser hoe om te reageer op iets. As jy al ooit gehoor het van koekies voor, of as jy al ooit vererg deur 'n webblad opstel van koekies, of draai op koekie blok of iets soos dit. Jy kan eintlik koekies in hierdie hoofde. So vertel hulle 'n leser hoe om te gedrag in sommige gevalle. OK. So dit was simpler.js. Het enige iemand enige vrae op dat die bron-kode lêer? OK. Cool. So laat verwyder die r uit daardie en kyk na simple.js. So dit is pretty much dieselfde program. Ek het net het dit 'n bietjie anders want ek wou soort van 'n hoogtepunt 'n paar kenmerke van JavaScript. So sien dat die versoek hanteerder funksie het heeltemal verdwyn. O yep, het jy 'n vraag? Publiek: Ja, die argumente wat geslaag het, word tot daardie funksie, wat is dit? KEVIN SCHMID: So dit is JavaScript voorwerpe. In die Node.js dokumentasie, is dit basies sê watter metodes is beskikbaar op hulle. Ons het net gebeur om die toegang te hê hierdie metode genoem skryf kop en einde en dinge soos dat. Maar daar is 'n hele klomp meer metodes. En byvoorbeeld, soos een van hulle in die besonder op rec, kan jy doen iets soos rec.method wat sal vertel of dit is 'n HTTP kry of HTTP post versoeke en dinge soos dat. So is daar alle soorte van verskillende eienskappe, maar hulle is albei JavaScript voorwerpe, en hulle het net funksies verbonde aan die wat vir julle dinge kan skryf aan. OK? So sien dat versoek hanteerder is heeltemal weg. Maar die kode wat ek gehad het in aanvraag hanteerder is nog steeds daar. Ek het nog steeds hierdie res.writeHead en ek het nog steeds hierdie res.end. En wat is hierdie 'n voorbeeld van in JavaScript is hierdie idee van 'n anonieme funksie. en anoniem is soos 'n gepaste naam want dit omdat dit nie letterlik nie het 'n naam. Daar is geen funksie versoek hanteerder in daar. Geen naam het nie, maar dit nog steeds is die neem van 'n argument. So ek hou nog steeds rec en res. En ek het nog steeds die kode. Dit is heeltemal fyn JavaScript-kode. So ek kan 'n funksie te verklaar sonder uitdruklik gee dit 'n naam. Dit is 'n bietjie verwarrend op die eerste. Daar is 'n paar nuttige dinge soos wat jy kan doen met hierdie anonieme funksies. Het enige iemand enige vrae oor hierdie, of is dit OK net vir nou, soort van net aanvaar dat dit sal dieselfde ding doen? Yep? Publiek: Is funksies eerste klas in JavaScript? KEVIN SCHMID: Hulle is die eerste klas in JavaScript. En net weet dat hierdie begrippe verby in 'n anonieme funksie soos dit van toepassing op die JavaScript dat jy mag in jou finale projek skryf vir die webblaaier ook. So byvoorbeeld, in die JavaScript in die leser, is dit ook 'n bietjie geval tree in die sin dat dit wat jy sal het, is wanneer die gebruiker druk hierdie knoppie, ek wil hê jy moet hierdie kode uit te voer. So dit is dieselfde soort van idees van die kliënt kant wanneer 'n kliek of hulle muis oor sekere beeld op jou webblad, gebruik hierdie kode. Dit kan van toepassing op bedieners. So dit is soort van soos die opwindende rede waarom JavaScript is 'n baie geskik of sommige mense dink dit is 'n geskikte taal vir hierdie soort gebeurtenis bestuurder bediener omdat jy hierdie anonieme funksies. Jy het die hele idee van hierdie asynchrone kode. OK. Enigiemand enige vrae? OK. So dit was simple.js. So laat ons kyk na nog 'n of 'n paar meer. So dit is sleep.js. So is enigiemand vertroud is met die C-funksie slaap? Van dalk een van die vorige lesings of iets soos dit? So basies wat jy kan slaag in Ek dink 'n aantal sekondes of as jy met U slaap 'n aantal millisekondes of nano sekondes. En basies die program sal net ophou hardloop vir die bedrag van die tyd. Reg? En dan sal dit uiteindelik wakker en dan sal dit net aanhou hardloop die program. Dus is hierdie bediener soort gee die indruk van die slaap. So sien dat ons dieselfde res.writeHead 200 met die kop as voor, maar dan is ons noem hierdie funksie genoem stel timeout. Stel time-out is ook beskikbaar in jou webblaaier Google Chrome of Safari of wat ook al. En basies wat dit is hier is dit om in 'n funksie. Kennis, weer, dit is 'n anonieme funksie. So dit is gaaf, want ons is gebruik van 'n anonieme funksie binne 'n anonieme funksie wat kan 'n bietjie vreemd. Maar dit is die neem van daardie funksie, wat basies sê - en die wyse waarop hierdie werke is in 5000 millisekondes, ek wil jy daardie funksie uit te voer wat net eindig die reaksie en skryf hey. So dit gee die indruk van soos slaap, maar die manier waarop dit werklik werk, is ons sal loop deur hierdie lyn baie vinnig. Ons is net iets te skryf. En dan sal ons ook loop deur hierdie lyn baie vinnig. So ons is nie eintlik gaan vyf sekondes om te wag. Ons is net gaan om te hardloop hierdie kode direk. En dan is daar, weer, hierdie klein gebeurtenis lus wat nou hierdie ding registers wat basies net voortdurend rond gaan in 'n sirkel en kyk na die horlosie in 'n enkele draad en gesegde, het vyf sekondes geslaag het nie? En dan wanneer dit sien dat die tweede hand het verskuif soos vyf sekondes of wat ook al, dan is dit wakker en sê, O, wat moet ek doen? Ag, ek het hierdie kode uit te voer. En dan gaan dit hardloop res.end hey. So weer, ons is nooit hier wag. So is dit nie dat hierdie kode binne-in hierdie funksie gaan vyf te neem sekondes te hardloop. Hierdie kode sal baie hardloop onmiddellik, ten minste met betrekking tot die vyf sekondes wat ons praat oor vroeër voor. So net om dit te wys in aksie Ek kan doen Node.sleep.js. En ek het iets gemors? Moontlik. Jammer. Kom ons kyk wat ons kan doen om dit te los. OK. So beslis gebruik Node.js. Ek is net 'n grap. OK. Net een sek. OK. Ek weet wat dit is. So die probleem is dat in my ander blad hier is ek hardloop Node reeds op dieselfde adres, 1337. So die fout dat dit gooi, as ons kyk by dit regtig nou, is adres in gebruik, EADDRINUSE. So ek reeds gebruik 1337 hier. So as ek toegesluit dit af, en dan het ek nou probeer om dit te hardloop, hopelik, alles sal goed wees. OK. So kan jy net een ding soort luister op 'n hawe in 'n keer. Nog 'n oplossing sou vir my gewees het om net die program wysig en maak dit sal wees soos 1338 of iets soos dit. Maar nou slaap loop. So laat ons eintlik probeer om dit uit in die hierdie tyd leser, want dit is 'n bietjie onopwindend te sien dit in 'n terminale. So ek is net gaan om te gaan na daardie 127-posadres weer na 1337. En as jy dit kan sien - Ek weet nie of jy kan nie - maar my leser se neem van 'n baie, baie lang tyd om te laai of soos vyf sekondes. En dan na dat dit uiteindelik die einde van die reaksie. En jy kan dit nie sien nie, want die ding geskuif oor 'n bietjie, maar as ek ' dit 'n bietjie kleiner, jy kan dit sien, sê hey. So ek het die hey, maar na vyf sekondes. En dit kan 'n bietjie skoner wees om te sien dit hier op die einde, so ek is gaan 'n om te doen - Kom ons doen hier - Kom ons doen Curl daardie adres weer met die 1337. En ek het net soort van moet sit hier vir vyf sekondes. Maar let op dat die bediener kan aanvaar nuwe antwoorde. So is dit druk hey. En dit na die demo, basies wat Ek kan doen in hierdie ander blad - so kom ons sê ek doen dit in 'n ander blad, Ek gaan Curl en om dieselfde te doen ding weer. En ek gaan om te probeer om dit te skop ouens af op dieselfde tyd. So ek gaan om dit te doen, en ek is gaan jaag hier en ek is gaan dit weer te doen. En laat ons dit so dat jy kan sien beide van hulle. Dat een gedruk hey en dat 'n mens gedruk hey al die pad aan - Kom ons doen daardie eksperiment weer. Eintlik, laat ons gebruik om hierdie mislei, as dit is OK. So ek gaan 'n dop ding te gebruik wat laat my toe om basies hardloop twee kopieë van hierdie program in parallel. So dit sal die eerste program hardloop en Die tweede program in parallel. So as ek nou druk Enter, gaan dit daardie versoek pretty much te maak onmiddellik op dieselfde tyd. So kom ons gee dit 'n skoot. So nou sien dit sê twee prosesse. En as jy nuuskierig is, wat 27000 getal is basies die proses ID. En dan sien, het hulle gedruk hey op dieselfde tyd. Dit was nie soos wat ons gehad het om te wag vyf sekondes vir een en dan na dit, vyf sekondes later kry die tweede. So dit is soort van, in sommige maniere, dit is nie regtig getuienis, maar dit is intuïtief bewyse dat dit is nie net soos wag vyf sekondes en blokkeer die hele draad. OK cool. So Aaron gevra om 'n vraag vroeër was, goed wat as ons nie iets doen - Yep? Publiek: Wag. Hoe is dit anders printf buffer, al is? Is dit nie outomaties doen? Hoekom moet ons bekommerd wees oor dit? KEVIN SCHMID: Ag, kon jy sê dat 'n mens meer tyd? Publiek: Hou nie printf buffer doen presies dieselfde ding? KEVIN SCHMID: Die printf buffer? Publiek: Ja. OK. Was nie in een van die vasvrae hulle praat oor hoe as jy regs printf iets en dan het dit breek een tweede, en dan moet jy dit lus tien keer, sal dit tien sekondes wag en dan printf alles saam? KEVIN SCHMID: O, OK. Publiek: Is dit om dieselfde te doen ding dan in hierdie geval? KEVIN SCHMID: So die vraag was basies in een van die voormalige vasvrae of iets, daar was 'n vraag wat basies as jy sê Print f 10 dinge op 'n tyd en dan geslaap soos in die proses van die druk van diegene wat nie, aan die einde vir een of ander rede, dit sou net stort diegene almal uit op die skerm. So is daar 'n soort van twee verskillende konsepte hier. So ek dink een ding is dat, in hierdie geval, is ons te make met twee verskillende soort van mense wat vra die bediener vir dinge op dieselfde tyd. En die rede dat die printf soort wag soos wat en stort dit uit in 'n keer is meer verwant aan hoe printf soort van - sodat die pad printf is eintlik geïmplementeer is dit basies het om te praat met die bedryfstelsel te skryf dat dinge aan die konsole. Sodat dit nie wil hê dat alle van daardie te doen dinge onmiddellik wanneer jy sê printf paar string, want dit kan kry duur as dit moet doen dat elke keer. So as jy dit doen printf hey, jou program dalk nie eintlik druk wat onmiddellik na die konsole. Dit kan sê, OK, ek het dit geskryf. En dan soort van wag vir jou te gee dit 'n bietjie meer voor eintlik uit te skryf aan die konsole. So die rede dat dit die geval was - en dit is soort van nie-verwante aan die slaap - is dat die slaap was soort van net ingespuit in daar te demonstreer feit dat dit nie skryf dit sinkronies. Maar die rede vir dit is net prestasie, sodat jy nie hoef te maak dat baie kontakte Die bedryfstelsel. Maar hier, wat ons regtig probeer om te doen met hierdie slaap ding is net show dat wanneer ons twee mense wat hierdie webwerf, is dit nie gaan sit hulle in 'n lyn waar dit gaan om te sê Ek het jou te help, en dan wanneer ek heeltemal klaar te help jy na hierdie vyf sekondes, dan gaan ek beweeg na die volgende persoon. Dus is die eerste persoon se versoek nie saamvat daardie gebeurtenis lus as dit sin maak. Maar hier is eintlik 'n voorbeeld iets wat le die geval lus. So hier is 'n verskriklike funksie te bereken die nth Fibonacci. Dit is letterlik die ergste manier wat jy kan bereken die de Fibonacci getal. En dit is eintlik net om te erken waar dit vandaan kom, daar is eintlik - Ek bedoel, kan jy probeer om te gaan soek - maar daar is soos 'n baie lang blog plaas dat iemand geskryf het. Dit is soos een van daardie dinge Reddit. Maar iemand gekritiseer Node.js, en hulle gebruik dit as 'n voorbeeld. So ek soort wou net wys dat jy twee verskillende perspektiewe om net te kry 'n algemene begrip van die konsepte agter hierdie twee dinge. Maar dit is gekies as net 'n aaklige, verskriklik ondoeltreffende computationeel intensiewe manier om die te bereken de Fibonacci getal. So, net soos 'n kant nota, hoekom is dit verskriklik soos in een manier? Yep? Publiek: Sê jy begin met 1000. 1000 split in 999 en 998. Elkeen van hierdie split in twee dinge. Elkeen van hierdie split in twee dinge. KEVIN SCHMID: Right. Publiek: al die pad af. KEVIN SCHMID: Presies. So net om te herhaal vir die kamera, as ek noem fib op soos 1000 of iets soos wat dit is natuurlik nie minder nie as of gelyk aan een so ek gaan gaan na hierdie geval anders, en dan gaan ek te noem fib 999 plus fib 998. En dan pretty much al wat werk wat fib 999 doen, is soort op hierdie vlak. As jy gaan sit, is dit selfs meer oorbodig as dit, maar as jy net dink die berekening van fib 998 kry ons redelik naby aan fib 999. So moet ons regtig 'n bietjie meer slim oor hoe ons soort van onthou hierdie, maar ons is nie hergebruik hierdie dinge nie. So jy kan dink hierdie groot, reusagtige boom wat net verskriklik. Maar in elk geval, OK. So dit was fib. Dit neem net 'n rukkie om te hardloop. Yep? Publiek: [onhoorbaar]. KEVIN SCHMID: Ag, kon jy herhaal die vraag? Publiek: [onhoorbaar]. KEVIN SCHMID: O so dit is net-kode wat gaan wees soort op die bediener kant. So gaan dit nie te vinde in die leser of iets nie. Dit is basies wat ons het, is dat wanneer die gebruiker hier redelik baie fabrikate hulle versoek weer, wanneer ons soort 'n versoek, ons gaan om te bel hierdie funksie op die bediener kant. En dan sal ons die resultaat terug te kry van die roeping van die funksie. En dan sal ons net druk dit aan die gebruiker. Sodat die gebruiker nie regtig gaan met hierdie funksie te veel. Was dat die vraag? Is wat sin maak? OK. Cool. So weer, doen ons dit geheel res.writeHead ding waar ons druk die kop. En dan eindig ek die reaksie deur te doen die magie nommer is fib 45. So laat ons net die uitvoering van hierdie bediener. So ek gaan 'n knoop fib.js. te doen So nou is my fib bediener loop. En dan is hier, ek gaan een van hierdie dinge te doen. OK? So is ek net gaan om te sê, krul. So dit gaan 'n rukkie neem, maar hopelik binnekort sal dit voltooi en dit sal druk wat 45 Fibonacci nommer. Publiek: [onhoorbaar]. KEVIN SCHMID: Daar moet raak redelik gou gedoen. So dit behoort te neem 5-6 sekondes. Ek weet nie wat is net V8 synde super vinnig, maar in elk geval, dit is 'n baie kort voorbeeld en doelbewus onelegant van 'n nie-triviale berekening. So na 'n ruk, kry dit nie. Maar nou, wat as ek doen wat dieselfde soort eksperiment voor waar ek twee versoeke op dieselfde tyd? So hier gaan ek 'n krul op daardie adres, en ek gaan 'n ander Curl te doen. En onthou, wanneer ons het dit vir die slaap bediener, wanneer ons basies moes dit na vyf sekondes, het hulle mooi veel twee het regs agter rondom dieselfde tyd. So dit is nie besonder vasgebind. Maar laat ons probeer om dit nou. OK, so ons het ons twee prosesse. Onthou dit is die proses-ID's. Dit gaan 'n bietjie wees ongemaklike terwyl ons stalletjie. So laat ons net hier bly en wag. So een van hulle moet kom terug na soos - OK, so een kom terug. Maar hoekom het nie die tweede een terug te kom net nog nie? Yep? Publiek: Die bediener kan niks doen nie terwyl dit die berekening van die groot aantal. KEVIN SCHMID: Right. So het die reaksie was net dat die bediener werklik kan niks doen nie, terwyl dit is die berekening van die Fibonacci-nommer. So nou is ek net my twee dinge terug. Maar ek dink net om te dink oor die kode 'n bietjie meer, hoe dit werk en alles. So hierdie funksie hier is die kode wat Ek het gesê hierdie bediener te hardloop wanneer dit ontvang 'n nuwe inkomende versoek. So dit is net gaan om te hardloop deur middel van hierdie hele kode, en dan is dit gaan om te gaan terug na die gebeurtenis lus en dan voortgaan kontrole vir nuwe geleenthede. So basies wat ons gebeur is die bediener is luister vir nuwe dinge. Die eerste persoon vra vir wat 45 is. Ons gebruik hierdie kode om dit te bereken. Hierdie kode neem ongeveer vyf ses sekondes te hardloop. Dan gaan ons terug na die gebeurtenis lus en kyk vir 'n nuwe versoeke. So dit is 'n voorbeeld van hoe, as jy dinge wat sogenaamde bereken gebind, of gebruik 'n baie computational, nie mag nie, maar soos is computationeel intensiewe - Ek dink een ding om te sê oor hierdie dat hierdie funksie is heeltemal te doen, vir die grootste deel, mooi nuttige werk reg. Die hele tyd dat terugbel funksie hardloop, dit was mooi veel geld spandeer die meeste van sy tyd net rekenaar wat de Fibonacci getal. Maar ons het net een draad het om te hanteer. In die Apache model, wanneer twee mense gemaak om die versoek te kry fib 45, ons sou twee verskillende drade gehad het. En dan is die bedryfstelsel se werk sou gewees het, of die gebruiker-vlak kode wat die bestuur van die drade, sou het is dat om te sny op die CPU, of selfs as jy het verskeie CPUs, versprei hulle eweredig oor die CPUs sodat hulle albei afwerking ongeveer op dieselfde tyd. So net om te wys hoe ons kan soort van - en dit is nie 'n totale volmaakte oplossing nie, maar soort van hoe ons kan maak 'n terug te kom hier en doen 'n bietjie beter. So, wat ek hier het is 'n program genaamd FIB C. En dit basies gebruik 'n ander een van Node se modules genoem Die Kind Proses Module. So ek het ingesluit dat die top soort van soos ek sou 'n pond doen sluit kind process.h of iets. Nou het ek toegang tot hierdie CP veranderlike wat al my funksies. So nou wat ek doen in hierdie reaksie hanteerder is Ek hardloop hierdie program dot streep fib 45. So, wat ek gedoen het - en ek gaan net om uit te stap van hierdie program vir 'n bietjie - is ek 'n C program wat geskryf is dat basies bere die de Fibonacci getal. So hier is net 'n program wat ek geskryf het in C wat bere hierdie. Ek kan stel nie, en ek kan hardloop dit by die opdrag lyn. En dit gaan te bereken die 45 Fibonacci nommer. So sien dit net neem pretty much so lank. Ek kon seker Dash 03 tot gebruik het optimaliseer dit of iets soos dit, maar ek het net soos gereelde samesteller instellings. En druk dit uit. Maar nou, wat ek soort van doen? O jammer, verkeerde lêer. So ek doen dieselfde dinge met die kop as tevore. Toe ek hierdie cp.exec. So, wat dit gaan doen, is dit gaan hierdie program uit te voer. Maar die manier waarop dit werk, is dat dit gaan nie om te wag vir daardie program te voltooi. Dit sê net basies voer hierdie program. So tik basies dit in die beveel vinnige soort. En dan, wanneer jy klaar is met dit is, loop hierdie funksie. So nou het ons soort van kry dit herstel, iets van soos ons wag nie. Maak dat die soort van sin maak? Yep? Publiek: [onhoorbaar]? KEVIN SCHMID: So dit sal eintlik open 'n nuwe proses om dit te doen. So dit is eintlik, in sommige maniere, kwaad nie super kwaad, maar dit is belangrik om te sê dat hierdie is 'n soort van terug te gaan na, aan die een kant, die Apache model waar ons drade en prosesse vir elke versoek of prosesse vir elke versoek. So dit is 'n soort van analoog na wat Apache doen. In sommige gevalle is, sal dit net gebruik om 'n nuwe draad, wat 'n bietjie meer lig gewig as 'n proses, maar Apache kon beland vurk 'n nuwe proses wat is 'n soort van wat ons hier doen implisiet deur te doen dot streep fib 45. En dan in daardie geval, ons soort aangaan dieselfde uitgawes van prosesse. So dit is net een ding wat jy kan doen. Maar net hierdie soort van loop om te wys. En hierdie gesprek is net regtig daarop gemik is om die aanbieding van hierdie soort programme as 'n wyse waarop die verskillende perspektiewe op om te wys hoe stuur soos wat te ontwerp. So hierdie aktief is, en dan nou as ek dit doen dit weer, ek het twee proses-ID's. Laat ons net praat oor dinge uit te wys. So sien dat hulle toenemend. Dit is cool. Want dit was 27.122 voor. Maar kennisgewing nou, kom hulle terug min of meer dieselfde tyd. En nou, 'n goeie vraag om te vra oor Waarom was dit die geval is, wie se werk was dit nou soort van te maak hierdie dinge soort van speel billike met mekaar ander, is hierdie twee gevalle van dot streep fib 45 dat ek gehardloop of dat Node gehardloop? Wie maak soort van dit regverdig dat hulle albei kry soort van gebalanseerde hardloop tyd? Publiek: [onhoorbaar]. KEVIN SCHMID: Ja. So basies, as ek dit doen dot streep fib 45 of iets soos dit, nou is dit soort tot die bedryfstelsel hanteer die runtime van die programme. En nou is dit hulle skeduleer op verskillende CPUs of dit hulle kan skeduleer. Dit kan sny tot die tyd dat 'n mens CPU kry dit of dat hulle uit te voer op 'n SVE. So wat is die idee agter dit. Is wat sin maak vir almal? So nou Node is regtig nie speel 'n deel in die verdeling van hierdie take. OK. So dit is byna dit vir voorbeelde. Ek wou net een ding om te wys omdat baie van hierdie tot dusver nie heeltemal super praktiese in sommige gevalle. Ek kan my voorstel die huis te kom nadat hierdie praat en iets en sê soos Wel, ek het soort van uit dat sprake dat Ek kan 'n Fibonacci bediener vir maak my finale projek. So hier is net soort van nog 'n voorbeeld wat hopelik sal wees - Miskien nie, maar miskien is - 'n bietjie meer soort relevant tot die finale projekte en dink vooruit vir dinge soos dat. So dit is chat.js. So dit is soort van soos 'n monster bediener kant kode wat jy kan gebruik om opstel van 'n klein chat bediener soos jy gesien het op die Facebook Chat of wat ook al. So ek is nie te sê dit is soos Facebook Chat, maar dit is 'n soort van soos 'n goeie nie - miskien nie goed nie, maar miskien goeie - beginpunt vir 'n geselsie bediener vir jou webwerf vir 'n finale projek. So laat ons kyk na wat dit doen. So is ons om hierdie spesiale ding aan die bokant, hierdie var SiO gelyk vereis Socket.IO. So, dit is 'n ander ding wat dit nie doen nie eintlik kom saam met Knoop, maar jy kan dit installeer. Dit is 'n knoop module. So dit is net soos 'n paar uitbreiding Node. SocketIO is eintlik baie gaaf. Dit is 'n abstraksie wat basies wat dit is, is dit jou toelaat om te hierdie stroom van kommunikasie tussen 'n web leser en 'n web bediener. So vir die grootste deel so ver, het ons het hierdie baie vinnige een sekonde of twee tweede kommunikasie tussen 'n web leser en die web bediener. So dit is basies gaan na google.com, kry ' die dinge, stuur dit terug, en dan ons gedoen het. Ons is nooit weer praat tot die gebruiker in iets anders. Maar wat Socket.IO en soortgelyke aard van die dinge - en SocketIO is eintlik een van die dinge wat gebou is op as WebSocket wat is 'n soort van beskikbare as deel van HTML5 - wat u toelaat om hierdie te hê voortgesette dialoog. En dit is baie nuttig in 'n chat server soort van ding, want dit is soort van soos 'n voortdurende dialoog in sommige maniere, want as jy gesels met iemand, kan jy nou stuur net 'n boodskap af in die pyp, en dan die bediener kan 'n boodskap stuur af in die pyp na die ander persoon wat jy is gesels met. En dan kan jy dit ruil soos dit. So dit is soort van wat SocketIO is goed vir. Die rede is dat SocketIO gebruik WebSockets as een ding is wat in Benewens net plain ou WebSockets, Dit is ook nie 'n paar truuks basies maak dit die leser versoenbaar is. So blaaiers soos Internet Explorer WebSockets ongelukkig nie ondersteun nie reg uit die boks. So dit maak gebruik van 'n ander soort van die koel netjiese dinge met Adobe Flash te laat jy kruis leser ondersteuning te hê. So dit is baie handig. En eintlik, ek weet ek is soort loop op tyd hier, maar CS50 Bespreek, het jy al ooit iets gesien soos, ek weet nie, leë so en so is antwoord op hierdie post of iets soos dit, dat die funksie? Dit is SocketIO. So wanneer iemand begin tik in die bespreek boks 'n antwoord of te maak iets jou blaaier wat is genoem in SocketIO straal 'n soort van gebeurtenis wat sê iemand is antwoord op hierdie post. Toe die bediener sê, OK, wat moet ek doen? Wel, nou ek het die ander ouens te vertel wat op CS50 Bespreek soek in hierdie pos wat iemand se antwoord. So dit is soort van wat SocketIO is goed vir hierdie voortgesette soort stroom van dialoog. OK. So, wat ek hier - en ons is net gaan die verbindings skikking te ignoreer vir 'n bietjie - wat ek doen, is ek 'n ander te luister. So dit is net die manier Socket.IO word sê Kom ons luister op hierdie hawe. En dan doen ek dit op verband. So dit is net basies Socket IK se manier om te sê, wanneer ons 'n verband wil ek u hierdie kode uit te voer. En let op dat in plaas van rec en res geslaag daar Ek het Socket. En dit Socket idee is basies hierdie ding wat jy kan skryf aan en lees van wat die gebruiker se boodskappe moontlik. En die boodskappe wat jy wil stuur kan gaan deur daardie voetstuk. Is wat sin maak? So dit is die voortsetting van ding. So, wat ek doen, is ek noem Socket.emit. En stoot neem mooi veel twee argumente. Die eerste argument is 'n string net wat die tipe ding wat jy afgee. So vir hierdie geval, ek het gebruik hierdie string nuwe boodskap. En dit is net basies sê dat die die tipe van hierdie ding, wat ek stuur, is 'n nuwe boodskap. Sodat jy kan luister vir spesifieke tipes soos 'n nuwe boodskap of wat ook al deur die gebruik van dot op. So verband en die gebruiker gestuur daar, as jy kyk na waar ons 'n beroep op dot, dit is die ander snare wat verteenwoordig tipes gebruiker boodskappe. So dit is basies wat jy kan hierdie stole het een van hierdie boodskap tipes, en dan om iets te doen in reaksie op een van hierdie boodskap tipes So ek afgee hierdie nuwe boodskap. Ons gaan connections.push te ignoreer vir 'n tweede. Maar dan sê ek, Socket.on gebruiker gestuur. So nou is dit is soort van soos wanneer die gebruiker stuur my 'n boodskap, ek wil jy hierdie kode uit te voer. En sien dat dat anonieme funksie neem in hierdie veranderlike genoem data wat basies gaan die gebruiker se boodskap te hê. So laat ons nou soort van praat oor die verbindings skikking. So dit is ontwerp vir 'n chat kliënt waar basies almal is soort van in dieselfde chat room. So basies, wat ons nodig het om te hou rondom is 'n paar skikking wat basies verteenwoordig al die mense gesels in sommige maniere, as dit sin maak. Reg? Omdat ons wat die ouens om te weet is sodat ons hulle die boodskappe kan stuur dat ander mense aan ons stuur. So, wat hierdie kode doen, is wanneer die gebruiker stuur 'n boodskap - dit is die tipe die geval - Ons gaan hierdie kode uit te voer. En wat ons doen, is ons loop deur middel van hierdie skikking wat ons verbindings genoem. En pretty much vir elke verbinding behalwe die een wat ons s'n, dit is wat hierdie kode sê, stuur ons 'n nuwe boodskap wat aangeheg boodskap inligting. So as jy hier sien, wat ek gedoen het toe die gebruiker eintlik maak 'n nuwe verband is ek het bygevoeg met die JavaScript.push metode, is dit basies net sê soos voeg dat Socket as 'n waarde in ons verbindings skikking. So nou wanneer hierdie kode loop, sal dit stuur dinge aan dié besondere verbindings. So dit kan 'n goeie beginpunt wees vir die maak van 'n chat server of iets soortgelyks. En die aard van die cool ding is dat die kode wat jy sien hier vir soos op en stoot en dinge soos wat dieselfde soort van JavaScript-kode wat jy wil skryf in die leser in interaksie te tree met die bediener. So dit is waarom SocketIO is soort netjies en nuttig in die manier. Ag, en net een ding ware vinnig. Daar was 'n finale projek CS50 verlede jaar wat basies 'n chat geïmplementeer bediener in Node.js. Ek dink dit is Harvardchats.org maar ek is nie - OK. Ek is nie seker wat die URL is nie, maar Ek kan stuur wat uit daarna. Maar dit is gaaf wat wat jy kan doen met Node.js. So ek hoop, in die algemeen, julle het 'n goeie sin van wat Node.js is nuttig en hoe jy kan dalk van toepassing jou finale projek. Ek sal stuur 'n paar meer hulpbronne saam met hierdie. En dankie vir die kom. Dankie. [Applous]