David Malan: Alle reg. Dit is CS50, en dit is die einde van die week nege. Dit was 'n warrelwind oor die afgelope paar dae. En die sewe probleem, as jy knie diep in dit, besef daar is nogal 'n bietjie nuwe dis daar. Maar laat ons kyk of ons nie kan stuk alles saam hier kortliks voor dan ruimend af in nog 'n ander rigting en sien Waar anders kan ons gaan. So tot dusver, het ons gepraat het oor HTML. Ons het gepraat oor CSS. Ons het gepraat oor PHP. Jy het begin SQL te ervaar. Vandag, sal ons 'n bietjie gesels oor JavaScript. Maar hoe doen al hierdie uiteenlopende tale inmekaar? So het ons gepraat het verlede week oor die idee van 'n bediener. So laat ons trek net hierdie reghoek as 'n web bediener hier. En 'n web bediener dien sekerlik lêers. En sommige van die lêers kan HTML-lêers. So een van die dinge wat 'n web bediener kan spoeg kan 'n lêer wees dat ons sal net trek soos hierdie met 'n paar HTML. So in leketaal, wat beteken HTML laat doen? Publiek: Page kyk mooi. David Malan: OK, maak 'n bladsy kyk mooi, Alhoewel ek dink ek het bewys wat andersins. So HTML nie laat lê bladsye struktureel, en dit laat jou te soort estetiese merk op 'n bladsy, merk op statiese inhoud, sodat jy kan dan sien dit met 'n webblaaier. Maar dit is die sleutel. Dit is statiese inhoud. Jy skryf nie, moet jy dit stoor, en dan kan jy die skip dit. En die web bediener dien dan dit is vir jou besoekers. Maar ons stileer dinge met behulp van 'n ander taal geheel en al. Ons het begin om 'n styl kenmerk te gebruik op sekere merkers. En die styl kenmerk laat ons dinge soos font grootte en kleur. En jy het waarskynlik begin om te ontdek, of jy sal gou vir finale projekte potensieel, maar ander eienskappe wat jy kan gebruik in CSS. En so in leketaal, wat werklik dan nie CSS doen? Dit is net voorbeelde daarvan. Wat beteken dit laat doen HTML Dit lyk nie of van wat Ons het tot dusver gesien het? Publiek: Definieer style deur jouself. David Malan: Definieer style deur jouself. So definieer dinge soos klasse as jy teëgekom het, of 'n unieke nodes identifiseer in 'n dokument, sodat wat jy kan stileer hulle. Maar meer spesifiek, sou ek sê dat CSS werklik kan jy dinge doen om die laaste myl en kan jy baie om te spesifiseer meer presies die estetika, terwyl HTML vir die grootste deel kan jy jou bladsye struktuur. En selfs al is daar 'n paar gebreke, soos ons gesien het die etiket vir 'n opskrif tag, wat rofweg gesproke het dinge groot en vet. Dit is 'n mooi generiese definisie van die etiket - groot en vet. Wat lettergrootte is dit? Watter kleur is dit? Hoe vet is dit? En CSS kan jy fyner deuntjie dinge soos dat. Sowel as uitleg, soos sommige van julle het gesien. En eerlik, CSS is 'n bietjie van 'n slordig taal. Dit is baie sterk in wat jy kan maak letterlik 'n webwerf wat jy het gesien op die web vandag met dit nie, maar dit is soort van 'n pyn in die nek. En 'n paar van julle het jou kop klap teen die mure reeds net te doen iets dom soos sentrum 'n spyskaart op probleem die sewe as jy gekry het om te daardie stadium reeds. Maar besef, daardie dinge kry makliker oor tyd. Jy begin patrone te sien. En weer, sal Google jou vriend wees vir die verskillende maniere waarop jy kan los hierdie soort probleme. En durf ek sê met CSS, HTML en meer Die algemeen, kan jy probleme op te los in baie meer maniere, wat almal dalk baie goed wees korrek is, as wat jy kan in iets soos C, selfs nou PHP, of JavaScript. Daar is net baie verskillende maniere om dinge uit te lê. Maar dit begin om te kry morsig, het ons gesê. Net soort van meng jou HTML en jou CSS met die styl kenmerk was 'n bietjie slordig. En so het ons plaas het, soort van abstrakte praat, wat jy behoort ten minste begin om faktor jou CSS waarskynlik. Nie jou styl eienskappe, maar ten minste gebruik die styl tag binnekant wat deel van die webblad? Publiek: Hoof. David Malan: In die kop. Tot nou toe, ons het net die titel tot daar, maar jy kan ook 'n styl voeg merk, en jy kan jou CSS sit ongeveer praat na die top van die bladsy. Maar dan moet ons het dinge 'n stap verder en ons faktor wat meer in 'n aparte lêer. En so hierdie twee lêers was een of ander manier nou gekoppel. En inderdaad was dit die tag wat dit gedoen het. En wat was een van die oorkoepelende motivering vir factoring uit ons CSS al hoe meer? Publiek: Herbruikbaar. David Malan: Herbruikbaar. Reg? Jy kan gesien het in p-die sewe reeds dat 'n groot deel van die bladsye, die koop bladsy, die verkoop van bladsy, die portefeulje bladsy, is waarskynlik gestruktureerde ietwat dieselfde. Daar is 'n CS50 finansies logo aan die bokant tensy jy besluit om dit te verander. Daar is 'n footer by die onderkant van bladsye. En CSS kan jy dit dan faktor uit dit in 'n aparte lêer sodat as jy iets wil wêreldwyd verander oor jou hele werf, kan jy regtig net dit verander in een plek. Maar daar is 'n prys wat jy potensieel betaal deurdat hulle faktor uit die CSS van my HTML lêer in 'n aparte dien dit vermeld word met die tag, wat ons sien op Maandag. Wat sou die nadeel wees van hierdie? Dink terug 'n week gelede toe ons praat oor HTTP en TCP / IP en hoe die internet werk. Iets hier? GEHOOR: Dit neem meer tyd. David Malan: Dit neem meer tyd. Hoekom? GEHOOR: [onhoorbaar]. David Malan: Ja. So neem dit waarskynlik 'n bietjie meer tyd. Want 'n mens, die CSS is natuurlik nie in dieselfde lêer. So nou moet jy maak nie een nie, maar twee versoeke. En elkeen van daardie versoeke, soos ons sien in Chrome in die sogenaamde Inspekteur en het ons gekyk na die netwerk blad, elke van die lêers vereis een HTTP versoek, wat ons gesien het neem 'n bedrag van tyd. Nou, miskien is dit nie 'n baie. Miskien is dit net 20 millisekondes. Miskien is dit 200 millisekondes. Maar dink oor 'n bladsy soos Facebook, of CNN, of Google, wat baie groter as die voorbeelde wat ons het gekyk na dusver. Diegene bladsye kan hê dekades van lêers, elk van wat kan vereis dat 'n aflaai van 'n lêer. So dinge kan potensieel begin om te vertraag. En veral die dae toe ons almal het selfone in ons sakke en stadiger internet verbindings, om te wag 'n paar millisekondes, 'n paar meer millisekondes vir addisionele lêers kan eintlik stadig. Latency is die woord wat beskryf die soort van wag dat jy dat jy ervaar wanneer wag vir 'n stuk van inligting. Maar daar is 'n onderstebo. So dit is nie al soort van 'n - dit is eintlik 'n bietjie van 'n wipplank hier. Nadeel nou, maar wat implementeer kan doen As hulle slim om te vermy met dieselfde styles.css te versoek lêer weer kan wees wat om te doen? Cache dit. So kas - C-A-C-H-E - algemeen beteken hier net die te red lêer wat u versoek om die eerste keer, en dan na jou kas vir dit. Gaan jy soort stoor houer, en as jy reeds 'n afskrif van styles.css, selfs al is 'n paar ander bladsy in die p-stel, of enige webwerf, versoeke dit weer, net die te gee gebruiker wat dieselfde kas kopie. Moet nie die moeite wat dit versoek. Nadeel is daar, al is, soos sommige van julle het geskakel oor in die p-stel. As jy 'n verandering op die bediener en jy gaan terug na die leser en jy laai, soms die leser doen jy 'n guns en nie die moeite weer die aflaai van jou styles.css lêer want, kom op, wat is die kans dat hierdie style wat Facebook gebruik gaan uur te verander uur of dag tot dag? Dit is baie laag. Hulle kan verander met verloop van tyd, maar nie deur die minuut of deur die uur. So 'n truuk, net FYI wanneer web ontwikkeling, word dikwels hou die skuif sleutel byvoorbeeld en kliek dan op herlaai in die leser, en dit sal tipies vertel die leser herlaai alles, selfs al is jy reeds dit in die kas. So weer, upsides en nadele, maar almal van hulle uiteindelik ontwerp besluite te neem. So nou, ons het nie net die einde van die storie hier. As ek nou terug te gaan en weer en weer en terug, het ons begin om nie net bekend HTML, maar PHP. So in leketaal, wat beteken PHP laat ons doen? GEHOOR: [onhoorbaar]. David Malan: Wat is dit? GEHOOR: Stel logika in die kode. David Malan: Ja, stel logika in jou kode. So dit is 'n ware programmeertaal met loops, en veranderlikes, en funksies en voorwaardes, en al die dinge wat ons het al met behulp pad terug wanneer sedert nuuts af. En PHP, het ons gesien, kan gebruik word om óf op die command line - dit hoef nie iets te doen te hê met die web, selfs al is dit regtig sy oorsprong en wat dit is geneig om goed te wees en bevorderlik is vir - maar jy kan gebruik PHP bloot deur die natuur van die feit dat dit 'n druk () funksie, en 'n printf () funksie, of 'n eggo () funksie. Daar is trosse van maniere waarop jy kan druk teks met PHP. Daarom, kan jy hierdie programme taal te presies uitvoer wat ons praat voor. Jy kan dinamiese genereer jou HTML. Miskien nie alles nie. Miskien het jy hard-kode dinge, soos die kop, en die voet, en die logo, en jou styl velle, en al van dat. Maar vir iets soos p-set sewe, waar jy manipuleer aandele en wat die gebruiker se portefeulje, wat gaan dinamies verander, kan jy sekerlik gebruik PHP en die logika dit gee jy as 'n programmeertaal te uitset deelversamelings dinamiese van die bladsy. So wanneer jy praat oor dinamiese webblaaie, of web ontwikkeling, dis wat jy eintlik praat. Die gebruik van 'n taal soos PHP, of dinge sogenaamde Python, of Ruby, of Java, of nog ander tale, 'n databasis te bevraagteken dikwels, of 'n ander bediener, en dan dinamiese HTML spoeg uit. Nou is die eindresultaat, as 'n eenkant, is dat die HTML van die meeste webtuistes, insluitend jou p-set sewe, is waarskynlik gaan 'n groot gemors as wees jy kyk na die bron kode in 'n leser. Dit is nie 'n groot deal. Op hierdie punt, wanneer ons omgee styl, ons omgee vir die dinge wat jy skryf. Ons sal nie omgee oor die dinge dat dit wat jou kode uitgange. So moenie bekommerd wees oor inkeping hier as dit is PHP dis eintlik uitdruk dinge. Na alles, sal die leser nie omgee nie, en 'n mens sal nie soek by die bron in elk geval. Ons het die personeel, byvoorbeeld, sou word op soek na jou PHP. So laat my gee 'n vinnige voorbeeld nou waarom anders dit nuttig kan wees. So gesê, kan ek nie die laaste onthou keer as ek C gebruik om 'n probleem op te los in die werklike wêreld. Dit was waarskynlik in die nagraadse skool toe Ek moes 'n taal te gebruik wat was redelik lae vlak en het my die geleentheid om iets baie hoog te doen presteer om werklik red soveel CPU siklusse as wat ek kon, in 'n groot deel want ek het met behulp van groot stelle data, en elke CPU siklus getel. En eerlik, selfs in dinge soos selfone hierdie dae en ander toestelle waar jy nie heeltemal nie soveel geheue en jy nie heeltemal nie as veel CPU, met behulp van vinniger tale steeds 'n beroep. Maar in die werklike wêreld, wanneer jy net wil 'n paar program saam te gooi om sommige data te analiseer, of jy versamel 'n hele klomp van die inskrywings vir sommige studente groep en jy wil baie vinnig outomatiseer stuur e-pos een vir een aan elke een van daardie geregistreerdes, jy gaan te bereik vir 'n hoër vlak van taal as C om so te praat. Iets soos PHP of Python, of Ruby, of 'n half 'n dosyn ander wat bestaan hierdie dae. Maar daardie drie is waarskynlik die mees modieuse nou. En wat dit beteken is dat jy kan oopmaak 'n teks editor soos gedit of mees enigiets anders, en dan net begin kode skryf sonder om te bekommer oor die samestelling, sonder om te regtig bekommerd oor die geheue bestuur, hou in gedagte dat 'n bietjie sloppiness sal uiteindelik terug te kom om jou te byt as die data stel kry groter of die probleem kry 'n groot. Maar wat beteken dit vir ons is die volgende. Laat my gaan voort en hardloop speller van die probleem stel ses. So dit is my Trie-gebaseerde implementering wat ek gebruik op die groot raad waar ek so goed gevaar nie. Ons sal terug te kom in 'n week se tyd en weer diegene wat uiteindelik bo-op die groot bord by ons laaste lesing. Maar vir nou, laat my voor en net gaan hardloop my oplossing in die teks, en ons sal doen die King James Bybel, en hier gaan ons. So dit is al van die sogenaamde verkeerd gespelde woorde uit die King James Bybel. En my implementering het helfte van 'n tweede in totaal. So nie te sleg op hierdie spesifieke rekenaar. Maar dink aan hoeveel kode wat ek moes skryf. Dink hoeveel kode wat jy het om te skryf. Dink net hoe baie ure wat jy spandeer in die D-saal of jou koshuiskamer of waar ook al eintlik kodering tot die oplossing. Wel, as ek het eintlik 'n hoër vlak taal soos PHP, neem kennis van wat ek hier kan doen. Eerstens, veronderstel dat dit is in plaas jou verspreiding kode. Dit is 'n lêer genaamd speller. Dit is beskikbaar as deel van vandag se verspreiding kode. En ek gaan my hand te waai by die meeste van die besonderhede nie, maar dit is eintlik 'n interessante voorbeeld van hoe jy dalk hawe 'n taal soos C oor te PHP. Ek het letterlik twee teks vensters oopgemaak, een met my C-weergawe van speller.c, en ek het net begin vertaal dit in my kop tot PHP en tik dit uit die gebruik van die naaste ekwivalent funksies. So 'n paar van hierdie dinge is anders. Ons het die laaste keer dat PHP gebruik nie sluit in 'n baie dieselfde manier. Dit maak gebruik van tipies vereis, maar sluit nie bestaan ​​nie. Definieer is 'n bietjie anders # Definieer in C, maar dit is hoe kan ons dan 'n konstante. $ Argc dit blyk bestaan ​​in PHP, so het ons gesien dat voor. Dit is net veranderlikes, al wat begin met die dollar tekens. Onthou dit is net 'n klomp van drywende punte. So lang storie kort, jy is welkom om flip deur hierdie As nuuskierig, dit is byna 'n lyn-vir-lyn-omskakeling van die C-weergawe van speller.c in PHP. En jy kan dit weer doen vir helfte van 'n dosyn ander tale. Maar wat interessant is, is hierdie. Of wat is eerlik teleurstellend is dit. Laat my gaan voort en tik oor dictionary.php, en eis dat ek gaan om voort te gaan en weer te implementeer probleem stel ses hier. So laat ons stel eerste wat in hierdie lêer, wat in werking gestel sal word PHP, so laat my tags soos dit oop te maak. Kom ek gee myself 'n globale veranderlike, $ grootte kry nul. En ek gaan om te gee myself 'n gemors tafel. Ek sal 'n gemors tafel gebruik vir hierdie ding. Hoe kan ek verklaar 'n hash tafel in PHP? Gedoen. OK. So oop bracket naby bracket verteenwoordig wat in PHP, soos ons gesien het? 'N skikking, maar 'n skikking wat kon wees om 'n assosiatiewe skikking. 'N assosiatiewe skikking is 'n data struktuur wat assosieer sleutels met waardes. Nou in die eenvoudigste numeriese kruip skikking, die sleutels is wat? Nul, een, twee, drie, reg? Ou skool stop terug van C. Maar dit kan ook snare soos cat, en bar, of Maxwell, of enige sodanige string. So ek kan hefboom wat in net 'n oomblik. Laat my gaan voort en verklaar 'n funksie soos - Kom ons doen las () eerste. So funksie laai nie (). En PHP is 'n bietjie anders in die sin dat jy letterlik tik funksie, maar jy nie tik 'n terugkeer tipe. Ek gaan om voort te gaan en sê dat die vrag () funksie moet neem argument $ woordeboek, net soos C-weergawe het. Ek doen wat uit die geheue. En Ek stel voor dat ek gaan om dit te doen. Ek is net gaan foreach te doen. Ek gaan 'n funksie genoem te roep lêer (), verby in die naam van daardie lêer, wat is die veranderlike $ Woordeboek as $ woord. En dan binnekant van my lus vir hier, ek is gaan om voort te gaan en te stoor in my $ Tafel wat $ woord kry waar. Gedoen. O, wag. Gedoen. OK. Dit is die las () funksie sê in PHP. Nou, hoekom werk dit? En ek is soort van bedrog hier. So, een, foreach ons gesien kortliks laaste tyd. Dit beteken net dat jy kan Itereer oor 'n skikking sonder om met i en N en plus plus, en al wat. Woordeboek is natuurlik die lêer naam, iets soos 'n groot of klein, die twee woordeboeke wat ons gebruik laaste tyd. File is 'n funksie wat oopmaak teks lêer, lees dit in lyn deur die lyn, en hande wat jy terug 'n groot verskeidenheid, elk van waarvan die elemente is 'n lyn van die lêer. So wat is die kombinasie van fopen, en fread, en terwyl loop, en fclose, en al van dat. Ten slotte, as woord beteken net dit is die veranderlike ek gaan om toegang te hê op elke iterasie in hierdie lus. Dus, in kort, hierdie een sak beteken hier oop te maak die lêer wie se naam is in woordeboek, die veranderlike, Itereer oor dit reël vir reël, en elke keer as jy 'n lyn, winkel in 'n veranderlike genoem woord, en dan iets te doen met woord. Wat wil ek doen? Ek wil woord te sit in my hash tafel. Wel, ek kan sit iets in my hash tafel net soos in C met behulp van vierkantige hakies. Dit is die naam vir my hash tafel. Ek gaan na die indeks in daardie hash tafel by hierdie plek. So nie bracket nul, nie bracket een. Bracket quote unquote iets, alles wat die woord is. En net soos wat jy mag hê in jou Hutstabel werk Trie, jy moet net stoor effektief 'n Boole, implisiet of uitdruklik. Gedoen. Ek is die stoor van die waarde waar. Nou is daar 'n paar dinge Ek sny hoeke hier. Tegnies, daar gaan wees om 'n irriterende nuwe lyn, / n, aan die einde van elk van hierdie woorde. So ek moet waarskynlik noem 'n PHP funksie genoem kap (), wat letterlik kap dat af. En ek werklik nodig het om te doen 'n ander ding. Ek moet waarskynlik inkrementeer grootte aan elke iterasie, so ek dop wêreldwyd van wat dit is. En eerlik, en dit is een van die stupider aspekte van PHP, as jy gebruik van 'n globale veranderlike, moet jy uitdruklik sê dat jy is. So ek gaan eintlik tik in globale $ Grootte, globale $ tafel, en nou my funksie is voltooi. So nie heeltemal so eenvoudig soos voor, maar het waarskynlik minder tyd as die C weergawe, miskien? OK. So laat ons nou doen om die tjek () funksie. Kom ons kyk of dit ten minste het die ure op die einde wat dit geneem het om ons in C. So Laat my gaan voort en verklaar kyk as 'n funksie. Neem in argument woord, wat gaan kom uit speller. En ek is net gaan om te kyk of die volgende veranderlike isset, tafel bracket strtolower van 'n woord - laat balanseer al my hakies - dan terug waar. Else - dit was regtig die harde deel van hierdie program. Anders, terugkeer vals. Gedoen. Dis tjek (). Nou, hoekom werk dit? Wel, een wat ek geslaag het in 'n woord, Dit is 'n string. Twee, maak ek seker binnekant van die hash tafel, wat genoem $ tafel. Ek dwing om dit te onderkas deur te bel 'n funksie baie soortgelyk tolower () in C, maar dit maak die hele woord, nie 'n enkele karakter. En as dit is ingestel, met ander woorde daar is 'n waarde stel, met ander woorde, As dit waar is, dan ja, dit is 'n woord. Want ek het dit daar met die las (). En indien nie, ek gaan om terug te keer vals. Nou is die ander mense is maklik. Funksie grootte (), hoe doen ek dit? Ek wese nie terugkeer $ grootte. Maar ek tegnies nodig het om te doen dit irriterende ding. En eintlik up hoor, was ek sny een hoek te veel. Ek het regtig nodig het om globale $ tafel te doen. Maar wat gesê word, los). Los () is ongelooflik. Funksioneer los (). Hoe wil ek los () te implementeer? Gedoen. OK. So los (), geheue bestuur is heeltemal versorg vir jou in iets soos PHP en 'n baie van hoër-vlak tale. So dit is ongelooflik. Graag waarom die hel het ons het die afgelope agt plus weke op C skryfwerk glo regtig stadig, regtig tyd beslag probleme met tien ure van die werk onder ons gordels? Wel, vir een ding, kan dit werk fyn vir klein programme. Dit is beslis versnel my ontwikkeling tyd. Maar laat ons kyk wat gebeur in die werklike wêreld. Laat my gaan in hierdie gids in 'n terminaal venster. Daar is speller. En sien as 'n eenkant, en jy kan teëgekom het hierdie probleem in stel ses of sewe probleem stel. Jy hoef nie streng moet eindig PHP lêers met. PHP. As jy 'n lyn soos daardie eerste een op die heel boonste, dit is 'n spesiale lyn van sintaksis wat in wese beteken vind die program genoem PHP en gebruik dit om te interpreteer hierdie lêer. So nou niemand weet regtig wat Ek hardloop 'n PHP-program. Ek kan hardloop dit net asof dit is iets wat saamgestel is in C. Maar hier is die ding. Eintlik is, laat ons doen dit weer. Dropbox/pset6 /. Daar is speller. OK, 0,44 sekondes. Dit het vinniger hierdie tyd. Nou kom ons gaan in die PHP weergawe. Mooi raak. Maar dink net hoeveel tyd Ek sal gestoor word op kantoorure. OK. So 3,59 sekondes, wat eintlik klink nie akkuraat nie. Maar dit is omdat 'n lang storie kort, wanneer jy druk uit 'n groot hoeveelheid van die dinge op die skerm, wat self stadiger dinge af. Wat dit regtig het die SVE in die toestel was 3,59 sekondes, in In teenstelling met C, wat het 0,44 sekondes mees onlangs. Dit is werklik 'n bevel van grootte verskil. So waar is dat die prys vandaan? Hoekom is dit so veel stadiger? Waarom het PHP voer so swak? Danielle? Publiek: Jy het nie regtig gebruik om 'n hash tafel. David Malan: Ek het nie regtig gebruik om 'n hash tafel. So ek soort van gedoen het. So dit is 'n assosiatiewe skikking. Heel waarskynlik as die mense by PHP is regtig slim, hulle gebruik onder die kap 'n werklike hutstabel geïmplementeer in iets soos C of C + +. Maar. Ja. Publiek: [onhoorbaar]. David Malan: Ja. So elkeen van die funksies wat ek nou geskryf het - Eintlik is, kan jy sê dat weer 'n bietjie harder? Publiek: Elkeen van die funksies wat jy ingesluit het 'n baie meer volledige kapasiteit as - David Malan: So dit is baie waar. Daar is 'n baie meer oorhoofse dat ons nie regtig sien deur te fokus slegs op dictionary.php, wat ek net geskryf. In teenstelling hiermee, is daar 'n hele tolk gaan in die agtergrond. Trouens, toe ek gehardloop hierdie program, is dit was nie loop saamgestel nulle en ene ontwerp vir my Intel CPU. Inteendeel, dit was hardloop lyn deur die lyn PHP kode wat presies lyk soos ons dit getik. En so wanneer jy gebruik om 'n geïnterpreteer taal, jy eintlik nie betaal hierdie prys. Dit gaan 'n geruime tyd te neem om te lees jou lêer bo na onder, links na reg, en dan voer elke lyn weer en weer. Nou in werklikheid, veral op die web, jy kan eintlik bespoedig hierdie proses deur die kas van die resultate van die PHP-kode as dit vertaal. En dit maak sin op die web, want As jy nie 'n gebruiker soos my hier nie, maar 1000 of 10000 gebruikers, dan Dalk is dit die eerste keer dat die lêer is toeganklik is dit stadig, maar daarna dit is baie vinniger. Maar dit is ook weer, is 'n kompromis. En vir iets soos 'n navorsing data stel, of selfs iets soos 'n groot hierdie, jou gebruikers sal uiteindelik begin wat verlangsaming te voel. Dus, in kort, geïnterpreteer tale baie in die mode, baie gewild, en eerlik is waarskynlik die tale wat jy moet bereik vir wanneer probleme oplos Ná CS50. Maar besef hoeveel jy regtig neem as vanselfsprekend onder die enjinkap regtig die afgelope paar weke in hash tafels, en bome, en drieë, wat uiteindelik om werklik gebruik word dinge soos oop bracket implementeer, vierkante hakies, wat kan ons nou dank as vanselfsprekend aanvaar. So kom ons neem 'n blik nou in hierdie web konteks. En ek genoem laaste keer dat daar 'n klomp van superglobals in PHP wat is nie regtig relevant op die opdrag lyn. Hulle is meer betrokke in die konteks van die gebruik van PHP in 'n web konteks. So loop PHP op 'n web bediener in orde dinge soos HTML te genereer. En ons kyk na $ _GET en $ _POST en dit is waar outomaties gebruikers se insette eindig net indien u 'n vorm van 'n lêer wat eindig in. php op 'n webblad bediener soos die toestel. Maar laat ons kyk kortliks na $ _COOKIE En $ _SESSION. In leketaal, wat is 'n koekie as jy dit verstaan ​​in die konteks van gebruik van die web? Publiek: lêer op die rekenaar. David Malan: Ja. Dit is 'n lêer op die gebruiker se rekenaar geplant deur alles webwerf jy gebeur om te besoek. So wanneer jy na Facebook, wanneer jy gaan te bankofamerica.com, wanneer jy gaan na google.com, wanneer jy na byna enige webwerf in die wêreld hierdie dae, insluitend cs50.net, is 'n koekie geplant op jou rekenaar, wat óf 'n waarde gestoor in die geheue in jou rekenaar in jou leser se geheue, of soms wel 'n lêer gestoor op jou hardeskyf. En wat is tipies gestoor in die lêer is nie jou gebruiker naam, nie jou wagwoord, tipies nie iets sensitiewe tensy die webwerf is nie so goed met hul sekuriteit nie, maar eerder dit is 'n groot unieke identifiseerder onder ander dinge. Dit is 'n groot ewekansige getal geplant op jou rekenaar, maar jy kan dink as soort van 'n virtuele hand stempel soos uit 'n klub of 'n pretpark, wat laat die personeel, die eienaars van daardie diens, om te onthou wie jy is. So as die groot ewekansige getal is soos 12345678, alhoewel dit natuurlik nie te ewekansige, dink aan wat as die hand stamp dat wanneer jy besoek facebook.com vir die eerste keer, het hulle stamp dat die getal op jou hand. En dan, want jy praat HTTP, jy 'n leser, en omdat Facebook praat natuurlik dieselfde as 'n web bediener, die protokol HTTP sê dat elke keer as jy daarna besoek facebook.com, of dit nou 'n tweede later, 'n uur later, selfs die volgende dag, so lank as wat jy het nie uitdruklik aangeteken, wat effektief is soos om jou hande. HTTP sê jy moet jul hand stamp elke keer as jy terug te keer na die webwerf. Wat dan gebeur is Facebook hulle kyk na die hand en seël sê hulle, o, 123456789. Ek weet nie met die eerste oogopslag dat hierdie Dawid Malan in Cambridge, Massachusetts, maar hulle kan gaan hul databasis en sê, o, die persoon op wie se rekenaar wat ons geplant 123456789 Dawid Malan van Cambridge, Massachusetts. Kom ons wys dat die gebruiker dan sy profiel bladsy of sy Nuusvoer. Maar daar is 'n probleem hier as dit is hoe die web wel werk. Kom ons neem 'n blik op 'n vinnige voorbeeld. Kom ons eintlik gaan facebook.com om te sê. Maar voor ons daar kan gaan, laat my voort te gaan en maak Chrome se Inspekteur hier. Laat my kyk na die netwerk blad. En nou, laat ons gaan voort en tik in https://facebook.com. En ek doen dit sodat ons nie sien nie al daardie aansture en afval tyd soek deur dié. Laat my getref betree. Alle regte. Ons sien 'n hele klomp van die versoeke. Daar kom Facebook. Daar is 'n hele klomp van lêers. En hier, per my melding gemaak van latency laaste tyd, dit is 'n baie HTTP versoeke. Maar die eerste een is waarskynlik die mees interessant. So laat se rol af hier, en Ek sal vergroot in 'n sekonde. Dit gaan 'n soort wees 'n gemors, maar laat ons sien. Facebook is die stuur van 'n hele klomp van die dinge. Maar hokaai, interessant. Hulle plant nie een nie, maar vier hand seëls op my hand hier. Set-koekie, Stel-koekie, set-koekie, set-koekie. En daar is 'n paar eienskappe hier. Almal van hulle noem 'n paar soort van verstryking. En dit lyk soos Facebook hoop my om te onthou tot 2015. So dit is vermoedelik die tyd wat Ek moet meld of hulle sal net outomaties dink ek is kom nie terug nie. So dit is eintlik 'n ordentlike bedrag van die tyd. En daar is 'n paar ander dinge hier aangaan nie. Hierdie koekie blyk te wees met geweld verwyder deur te sê dit verval in 1970 voordat koekies bestaan. So die leser is net gaan om aan te neem OK, dis soos die hande was stempel. Maar nou dat my leser maak 'n daaropvolgende versoek - Laat my gaan voort en doen dit weer en laai. Nou laat my terug blaai om die top versoek en gaan af hier, versoek kop. Let op hierdie. So nou is ek onder geen reaksie kop, maar sien dit sê versoek kop. En sien dat my leser as deel van sy versoek na die slaan herlaai het gestuur om ten minste die volgende inligting. Nie set-koekie, maar koekie. So dit is die lyn, die HTTP kop so om te praat, waar my leser is 'n soort van sonder my wete dat dit aanbied my hand vir Facebook se inspeksie. So hierdie koekies kan wees gebruik dan vir wat? Om te onthou wie jy is, of onthou hoe baie keer het jy al daar was, of regtig iets nie. So hier is counter.php. En laat my zoom in op die skrif. En elke keer as ek herlaai die bladsy, sien dit is om te onthou hoeveel keer Ek het daar gewees het. Wel, dit is nie al wat indrukwekkend. Laat ons net naby dat blad en nou, laat ons terug te gaan http://localhost/counter.php. O ja, dit is interessant. Dit is nog steeds onthou, selfs al het ek die blad. En eerlik, as ek naby die leser, indien geïmplementeer in die regte manier, het ek kon nog onthou dat die gebruiker is wat hy of sy vir die eerste keer, en slegs een keer gaan ek in Chrome se spyskaart, wat hier is hier, en gaan na Geskiedenis, en klik Duidelike navigeer Data, as sommige van u mag hê in die verlede, Slegs dan sal julle koekies eintlik verwyder word tydens web ontwikkeling. So, as ons gaan - laat toemaak gedit hier. En as ons nou na hierdie lêer. Laat my gaan in ons vhosts / localhost / publiek, en laat my doen counter.php. Let daarop dat hierdie is 'n mooi eenvoudige program. Dit is 'n mooi eenvoudige webblad. So die top van die lêer is net kommentaar. Maar hier is 'n nuwe lyn wat jy kan gesien het reeds in p-set sewe, session_start (). Dit is 'n lyn van PHP kode wat wese vertel die web bediener, maak seker hande te stamp en maak seker hand seëls te keur. Dit is al wat in die lyn nie, en dit doen al van die proses vir ons. Toe sien ek net het twee takke hier. As die toonbank sleutel binnekant van hierdie spesiale globale veranderlike genoem $ _SESSION Gestel is - met ander woorde, indien daar is 'n paar waarde daar - Kom ons kry dit en stoor dit in 'n plaaslike veranderlike genaamd $ toonbank. Anders, laat se toewys $ toonbank die verstek waarde van 0. Nou hier is een aspek van PHP wat beide 'n seën en 'n vloek. PHP is 'n bietjie slordig. So terwyl dit in C, wat sou die omvang van die toonbank was hetsy hier of hier? Dit sou gewees het beperk aan diegene krullerige draadjies. Raai wat? In PHP, dit bestaan ​​selfs buite van daardie krulhakies, hier, en hier, en hier, en hier, en selfs onder. So ek sê dit is 'n seën in die sin dat jy nie hoef te dink as hard soos ons gedoen het weke gelede. Maar dit is ook 'n bietjie van 'n vloek in daardie maak nie saak waar jy gebruik om 'n veranderlike in PHP, ten minste in 'n program soos hierdie, dit is wêreldwyd toeganklik vir 'n beter of vir slegter. So jy moet in gedagte hou nou dat jou veranderlikes mag nie gedefinieer. Jy kan gedefinieer het hulle elders. Maar wat gaan ek uiteindelik doen? Ek gaan binne-in stoor van die globale veranderlike as 'n waarde van die toonbank sleutel om die gevolg van doen toonbank plus 1. So dit is net die rekenkundige wat nie die incrementation van die toonbank. En die feit dat ek die stoor wat waarde terug in hier is middel tot wese werk die databasis te onthou dat gebruiker 123456789 was hier twee keer. En toe ek dit weer doen die volgende keer wat ek herlaai die bladsy, dit gaan om seker te maak my hand stamp en sê, o, gebruiker 123456789 het nou hier is drie keer. En ja, wat PHP en soortgelyke tale doen vir ons is hulle gereken hoe en waar en vir hoe lank waardes in hierdie spesiale te stoor superglobal. En dit superglobal die volgende keer wat ek besoek die bladsy is 'n soort van mettertyd pre-bevolk, gevul met waardes wat Daar was die laaste keer wat jy besoek het, of dit was 'n tweede gelede, 'n week gelede, of in 2013, en ons praat nou oor 2015. PHP en die web bediener neem sorg van al wat vir jou. Publiek: [onhoorbaar]. David Malan: Veranderlikes in PHP is wese altyd globale tensy jy verklaar hulle binnekant van 'n funksie, en dan is hulle plaaslike te slegs die funksie. Maar omdat ek nie geskryf enige funksies, hulle is nou effektief globale regdeur my hele lêer hier. Publiek: Is daar 'n manier hulle plaaslike te maak? David Malan: Is daar enige manier om hulle plaaslike te maak? Slegs deur die wikkel hulle in funksies. Wat in die jongste weergawe van PHP, kan jy dit doen met 'n anonieme funksie. Maar meer op wat in die konteks van JavaScript. Maar die kort antwoord is nee. 'N lang antwoord is ja. Nice. Goeie quiz vraag. Alle regte. So laastens, die bladsy self is eintlik redelik eenvoudig. Let daarop dat wanneer ek verlaat PHP af, onthou dat al hierdie dinge af hieronder is net gaan om te spoeg raak uit rou aan die leser. Wat is goed, want ek wil stuur die gebruiker 'n paar HTML, maar ek wil om dinamiese werk wat HTML. En een manier wat ek kan doen is om te sorteer baie vinnig daal terug in PHP modus, gebruik oop bracket vraagteken gelyke teken en dan uitvoer die waarde van die toonbank. Of as dit lyk 'n bietjie kripties, hierdie gelyk teken is eintlik net 'n paar sintaktiese suiker vir hierdie printf ($ toonbank). Maar eerlik, dit is net 'n bietjie lelik en 'n klein irriterende te tik. So PHP bied 'n baie mooi hierdie funksie waar jy kan net sê dat dit meer saaklik op dieselfde manier. So wat gaan aan onder die enjinkap? Kom ons vinnig kyk na die netwerk blad hier vir counter.php. En laat my voor en eers toe laat se duidelike jou koekies. Kom ons duidelik op data sedert die begin van die tyd. Kom ons gaan terug oor hier en nou. Nou laat herlaai die bladsy. En ek is terug op nul. Omdat my hand stempel gewas is, Ek kry nou 'n nuwe koekie. Inderdaad as ek kyk na die blad netwerk en kyk na reaksie kop, kennisgewing dat die toestel stuur my 'n koekie wie se naam is ietwat arbitrêr nie, maar soort redelik, PHPSESSID. En dit is vir my gestuur het dit regtig groot ewekansige getal. Dit is nie heeltemal 'n nommer. Dit is nie heeltemal heksadesimale. Dit is 'n soort van alfanumeriese string, maar vermoedelik is dit lukraak. En dit is die hand stamp so aan spreek dat ek verwys. Intussen as ek kliek herlaai en dan kyk na hierdie tweede lyn vir my tweede versoek, kennisgewing nou dat my versoek kop sluit PHPSESSID gelyk het, nie ingestel-koekie nie, maar net koekie. En dit is die aanbieding my browser se van my hand stamp. So nou as 'n teaser, en ons sal praat meer hieroor in 'n week of so, maar hoe laat dit jou kwesbaar, Facebook rekening kwesbaar, en ander sulke rekeninge kwesbaar? Publiek: As iemand 'jou koekie. David Malan: Ja, as iemand het jou koekie. Ek bedoel waarlik, net soos sommige van julle dalk probeer het om soos 'n klub of 'n pretpark, as jy probeer om iets soos hierdie die stempel te kopieer, al is dit terug op 'n ander persoon se hand, en dan kan hy of sy dit aanbied as hul eie, as dit eintlik lyk identies, 123456789, dan is die web bediener is glo net gaan vertrou dat die gebruiker is nie. En dit is inderdaad 'n fundamentele bedreiging enige tyd wat jy gebruik koekies want as iemand wat net bestookt so te praat jou koekie, figure uit wat dit is, hetsy deur waarlik, dit kopiëring deur te kyk na jou rekenaar en om soos, OK. Dawid se koekie is JJ3JIK en so meer, en dan het hulle is slim genoeg om te weet hoe om te soort van die hand stuur wat koekie van 'n leser of van 'n program wat hulle skryf, kon hulle heeltemal meld in 'n webwerf as jy. Dit is nie so moeilik om te maak asof wees iemand anders as ons weer p-reeks twee, wat bekend gestel wat? Publiek: Kriptografie. David Malan: 'n bietjie bietjie van kriptografie. Eenvoudige kriptografie, ten minste in die standaard uitgawe, maar crypto nietemin. minder. So dit blyk of jy enkripteer al hierdie hoofde gebruik van iets wat jy dalk nou weet meer vertroulik as SSL, Secure Socket Layer, of https:// URLs, dan sal al hierdie dinge ons het al skrams by eintlik geïnkripteer, wat beteken dat dit is soos jy kan nie die hand stempel lees. Slegs facebook.com kan, of google.com, of in hierdie geval, die toestel kan lees dat die hand stamp. Tragies al is, en weer, dit is al te toepaslike met die NSA dinge van die laat, selfs SSL is breekbaar. En dit is eintlik nie so moeilik selfs kraak wat enkripsie. Nie soseer deur krake die kodering, maar deur tricking die leser in decrypten die data voortydig. Maar weereens, sal ons terg jy met wat voor lank. Vir nou, net bang wees nie. Dit is tragies soort waar. Alle regte. So, waar kom dit nou laat ons? Wel, laat ons dit doen. Kom ons gaan voort en neem 'n vinnige teaser voordat ons neem 'n breek. En ek dink ons ​​sal 'n bietjie langer vertoef vandag, maar ons gaan duik in iets splinternuut en sexy, wat sal skerp jou eetlus vir nog meer. So wat is die breker. So SQL, ons begin praat oor ooit so kortliks laaste tyd. Jy sal regtig jou hande vuil kry met 'n paar van dit in p-reeks sewe. En in leketaal, wat beteken SQL - S-Q-L - vir jou doen? Wat is dit? Ja. GEHOOR: Kom ons jou toegang data. David Malan: Ja. Dit laat jou toegang data in 'n databasis. Structured Query Language. En dit is in wese 'n programmeertaal. Daar is kenmerke van dit wat Ons sal nie eens in die klas gebruik. Maar jy kan effektief definieer funksies. Hulle is geroep gestoor prosedures in SQL. Maar ons sal dit hou redelik eenvoudig en net gebruik dit vir 'n paar basiese operasies soos die kies van data, data in te opdatering van data, en die verwydering van data. En jy kan nie regtig dink aan 'n databasis, soos 'n SQL databasis, as net om Microsoft Excel. Omdat SQL verwys na 'n relasionele databasis, waar verhouding beteken net tafels. Rye en kolomme. So iets is wat jy kan sit in 'n sigblad soos hierdie of Google Docs, jy kan dit in 'n SQL databasis deur waarby 'n tafel. Nou, hoe kan jy eintlik toegang daardie inligting? Wel, met opdragte of navrae soos hierdie. KIES, voeg, te verander en verwyder. En vir die grootste deel, dit is die slegs vier bestanddele wat jy nodig het om te doen iets heeltemal kragtig in probleem die sewe. Nou terug in die dag, sou jy eintlik interaksie met 'n databasis in 'n swart en wit terminale venster op 'n flikkerende vinnige soos hierdie. En die databasis wat ons loop op die toestel genoem MySQL, wat gratis en open source databasis enjin. As jy Google en lees die Wikipedia artikel, sal jy weet dat die naam 'n bietjie van oorgang vir 'n paar weergawes van Linux. Maria databasis is eintlik 'n opdok om so te praat van MySQL. Lang storie kort, Oracle gekoop MySQL. Oracle is 'n groot maatskappy. Mense is bekommerd dat dit sou nie meer bly redelik as open source, so dit is net 'n afskrif van MySQL wat nog steeds gratis, nog steeds open source, en geïnstalleer in Fedora Linux by verstek. Maar dit is 'n soort van 'n pyn in die nek om kennis te maak met 'n databasis op hierdie manier. Sodat ons sluit in die CS50 toestel 'n gratis open source instrument genoem phpMyAdmin. Net 'n toeval dat dit is geskryf in PHP. Daar is geen fundamentele nodig het vir PHP hier. Maar dit is net 'n web-gebaseerde instrument wat ons gratis afgelaai, geïnstalleer in die toestel, wat ons toelaat om 'n te hê grafiese gebruikerskoppelvlak waarmee die p-set sewe databasis te verken met wat nuwe databasis te skep, sê vir jou eie finale projek as jy wil hou, en uiteindelik skep dinamiese webwerwe soos CS50 Finansies wat u toelaat om data te bevraagteken en werk data dinamies. Jy is nie van plan om te gebruik net 'n eenvoudige teks lêer of CSV. Jy kan selfs gebruik om 'n slim databasis program sodat jy meer kan voer gesofistikeerde navrae as net die lees deur alles lineêr. So byvoorbeeld, dit is wat ons gee julle uit die boks vir p-reeks sewe. Dit is 'n tafel met blykbaar ten minste drie kolomme, waarvan een is gebruikersnaam, waarvan een is hash, en die ander wat ID. Maar die interessante ding, en net om te terg een gedagte hier, gebruikersnaam is vermoedelik reeds unieke, reg? Ek bedoel, die meeste 'n webwerf, indien jy het 'n rekening het nie, is daar kan nie twee keisers. Daar kan nie twee Malans. Daar kan nie twee jharvards. Sy unieke. Andersins, het hulle nie weet wat jharvard dit eintlik. So wat kan die motivering vir ook met 'n derde kolom aan die linkerkant daar genoem ID, wat lyk soos 'n getal wat is insgelyks uniek? Dit voel 'n bietjie oorbodig om my met die eerste oogopslag. Hoekom is dit dalk dwingende te hê nie net uniek gebruikers, maar ook unieke nommers? Publiek: Hulle kon dieselfde wagwoord. David Malan: Mense kan hê dieselfde wagwoord, seker nie. Dit kan absoluut gebeur. Maar as hulle hierdie unieke gebruikersnaam, ek sou argumenteer dat dit nie regtig saak, want as hulle tik in hul gebruikersnaam, ek moet net hul te kyk wagwoord, hul hash daarvan. Hoekom anders? GEHOOR: Faster soek. David Malan: Faster soek. Hoekom? GEHOOR: ID is net een. David Malan: ID is net een karakter, of om presies te wees, dit is 'n nommer, so dit is waarskynlik 32 stukkies of iets soos dit. Terwyl die gebruikersnaam, blykbaar Jason Hirschhorn is daar is 'n soort van belaglik lang, en dit gaan neem my 'n baie meer tyd om te string vergelyk H-I-R-S-C-H-H-O-R-N, en miskien 'n / 0 of iets soos dit, ten einde op te kyk Jason, eerder as om net sê gee my gebruiker nommer twee. Dit is 32 stukkies. Dit is 'n enkele INT wat jy het om te vergelyk. En inderdaad, dit is presies die rede waarom databasisse geneig unieke ID's te wys aan rye in hulle. Nou wat ander data tipes is daar Behalwe INT en blykbaar snare soos hierdie? Wel, om meer behoorlike, SQL databasis, soos MySQL, het CHAR velde. En CHAR 'n bietjie misleidend is nie 'n enkele teken. 'N CHAR veld in 'n MySQL databasis een of meer karakters nie, maar dit is 'n vaste aantal van karakters. So byvoorbeeld, as ek gaan oor na phpMyAdmin as jy dalk reeds het, of sal binnekort 'n probleem het naamlik die sewe en gaan om my databasis, en net vir die pret, laat ons 'n nuwe tabel genoem toets met net twee kolomme. Ek sal dan op gaan. En dit sal redelik vertroud, veral as jy geknoei om op jou eie. Hier het ek kan tik ID te skep 'n nuwe tabel van die tipe INT. Maar hier kan ek tik gebruikersnaam herskep wat vroeër tafel. En sien ek het 'n hele klomp tipes om van te kies. En dit is ook waarom phpMyAdmin is 'n soort van lekker. Dit is soort van self-onderrig in dat jy kan net 'n soort van punt en klik, en kyk na aftrekkieslyste, en hieruit aflei dat wat magte SQL gee. En inderdaad, as ek kies CHAR, het ek dan het die lengte, of hoe om te spesifiseer baie waardes, hoeveel karakters. So baie gemeenskaplike waardes is dinge soos 255, maar dit is 'n bietjie lank. Algemeen is agt vir 'n gebruikersnaam. Maar dit is 'n bietjie klein om hierdie dae. So dit is 'n ontwerp besluit. Is dit 8 karakters Max, 32, 255, 1000? Dit is regtig aan jou. Maar 'n CHAR veld is 'n vaste aantal. So kies te min en jy is soort geskroef as jy wil 'n langer gebruikersnaam. Kies te veel en wat is Die nadeel? GEHOOR: [onhoorbaar]. David Malan: Dit is verkwistende. Net soos in C, as jy 'n groter stuk van die geheue as jy nodig het, is jy net mors tyd en mors spasie. So as 'n alternatiewe, is daar Varchar, wat hierdie probleem oplos deur behandeling lengte nie as 'n vaste lengte, maar as 'n maksimum lengte, en die gebruik van 'n veranderlike aantal van karakters, wat dan geneig is om te gebruik net so baie karakters as wat jy werklik nodig het. Dit klink perfek. Hoekom kan ons nie ontslae raak van die CHAR data tik? Wat sou die nadeel van wees gebruik VARCHARs, wat klink soos dit is 'n mooi oorwinning? Ja? GEHOOR: [onhoorbaar]. David Malan: OK, goed. So as al jou data is dieselfde lengte, wat is die kommer? GEHOOR: Omdat jy mors data deur die vertel van hulle almal. David Malan: So as al jou data is dieselfde lengte, al is, wil ek argumenteer wat spesifiseer van 'n maksimum lengte op varchar is geen verskil tussen spesifiseer van 'n vaste lengte op CHAR indien jy weet dat die getal in advance. Maar daar is inderdaad, en ek sal sorteer uittreksel uit die antwoord van die werklikheid dat daar steeds 'n maksimum, wat kan wees irriterende, veral as jy ontmoeting 'n persoon se naam wat buitengewoon lank dat jy nie verwag. En dit is ook 'n bietjie minder doeltreffend om werklik te soek op VARCHARs as gekant teen soek karakters, veral vir 'n lang tafels wat baie en baie van die data. So ook hier, tematiese is weer geen ooglopende keuse. So net om te gee jou 'n gevoel van ander data tipes wat dalk van belang hetsy vir p-set sewe of in die toekoms, daar is INT. Daar is BIGINT, wat is soos 'n lang lang. Dit is geneig om 64 stukkies. Daar is DESIMALE, wat jy sien in die probleem stel, wat 'n baie skoner antwoord op die probleme wat ons ondervind met float en swaai punt onakkuraatheid. En dan is daar DATETIME. Daar is letterlik 'n data tipe wat om te lyk soos 'n jaar, 'n maand, 'n dag, en 'n uur, minuut en sekonde. Maar SQL databasis het ook ' dinge wat ons sal noem indekse. En 'n indeks is iets wat jy spesifiseer wanneer die skep van die tafel te maak soektogte en ander bedrywighede meer doeltreffend te maak. Spesifiek, daar is iets genoem die PRIMÊRE indeks wat jy kan verklaar soos volg. Ons het dit vir jou met die gebruikers tafel gee ons jou. Maar let as ek met die hand te herskep die gebruikers tafel hier gee dit 'n naam van die gebruikers. Ek het reeds aangedui ID. Ek vermeld INT. Ek gespesifiseerde gebruikernaam met maksimum 32 karakters. Maar as ons aanhou blaai in hierdie redelik groot venster, sien daar is 'n n klomp van die ander dinge wat ek kan gee. Een, kan ek spesifiseer eienskappe hou nie, jy weet wat, hierdie INT moet onderteken is nie. Ek wil nie negatiewe getalle, so laat ons maak dit nie onderteken is. Nietig is nie relevant hier, want Ek wil elke gebruiker te het 'n unieke nommer. Ek wil nie hê dit moet wees nul. Maar dit is interessant. Ek kan spesifiseer dat ID is óf die primêre sleutel van die databasis, of is dit unieke, of dit kruip, of volledige teks. So vir vandag se doeleindes, lang storie Kortom, 'n primêre middel wat dit sal beide konseptueel en tegnies die gebied wat ons gebruik om uniek identifiseer gebruikers. So as ons opkyk gebruikers, hierdie is 'n soort van 'n belofte om te kyk meestal deur dat n unieke identifikasie. En die databasis sal sorg dat as jy het 'n gebruiker nommer 3, kan jy nie fisies voeg 'n ander gebruiker met dieselfde nommer 3. Die databasis sal net weier jou veranderinge te stoor. Dit is 'n goeie ding, want jy kan jouself te beskerm van jouself. self Alternatiewelik, vir gebruiker. So het die tweede ry, onthou, is die rekening veld. So het die tweede ry is hier gebruikersnaam, soos ons gedoen het op die ver links daar. So wat anders kan ek wil spesifiseer? Ek is nie toegelaat nie, volgens SQL, twee primêre sleutels te spesifiseer. Jy kan 'n gesamentlike sleutel waar jy kyk na beide rigtings, maar hulle kan nie individueel primêre sleutels. So dit is buite die kwessie. So wat kan ek wil hê om van te kies? Wel, uniek maak, is soortgelyk in die gees tot 'n primêre sleutel waar jy spesifiseer hierdie veld sal uniek wees, maar dit is gaan nie die een wees wat Ek gebruik al die tyd. En ons gaan nie hierdie een te gebruik die tyd om watter rede weer? Dit is stadiger as moontlik dit is 'n lang rekening. Dit is net 'n vermorsing van tyd. Indeks, intussen, bepaal dat dit nie gaan om uniek te wees, maar ek wil graag jy jou magie te werk onder die kap om dit vinniger vir my om te soek op hierdie gebied. So is dit waarskynlik nie hier relevant. Vir gebruikersnaam, wil ek argumenteer dat Uniek maak, is 'n goeie antwoord. Maar veronderstel dat ons gemaak gebruikers meer interessant as net gebruikers, hashes en ID nommers. Wat gebeur as ons het mense volle name? Wat gebeur as ons het vir hulle spreek en ander data oor hulle? Wel, as jy spesifiseer dat 'n kolom in 'n databasis is opgeneem, wat beteken dat MySQL of Oracle, of wat ook al databasis jy gebruik, moet werk sy magie en die gebruik van 'n soort van fancy data struktuur soos 'n boom, of 'n tydstip waarop, of 'n hash tafel, of iets te waarborg dat wanneer jy soek vir data gebruik kies op daardie spesifieke gebied - wil wys my almal wat lewens op Oxford Street. 'N navraag soos dit. As jy vooraf vasgestel dat jy wil 'n indeks op die veld, die soektogte sal baie wees, baie vinniger. As jy spesifiseer nie 'n indeks, die beste wat jy kan doen, is om 'n lineêre soek as dit is nie gesorteer. Maar as jy spesifiseer indeks, is die smart mense wat die databasis gemaak - mense soos jy wat nou bome weet en drieë en hash tabelle - sal outomaties bou so 'n data struktuur in die geheue om seker te maak dat hierdie soektogte is baie vinniger. TEKST is intussen soortgelyke in gees, maar kan jy wildcard te doen soek, wil wys my almal wat lewe op strate wat begin met die letter O vir watter rede ookal. Jy kan dit doen wildcard soektogte soos dit. Of, meer dwingende dinge soos show my almal wat die woord het - wys my almal wie se naam begin met 'n spesifieke brief. Jy kan soek vir dokumente op hierdie manier. Alle regte. So, ontwerp geleenthede daar potensieel. Daar is ander wat ek sal waai my hande. Dit blyk dat jy kan verskillende stoor enjins. En dit is meer as wat ons nodig arcane beslis vir die probleem wat sewe. By verstek, is julle ouens gebruik iets genoem InnoDB. Jy sal melding van hierdie iewers in sien phpMyAdmin se koppelvlak waarskynlik. Maar weet dat daar ander ontwerp besluite te neem wat van potensiële rente kom finale projekte indien jy iets doen web-gebaseerde. Maar laat hierdie ons doen. Kom ons gaan voort en sit dit op die skerm as 'n teaser vir 'n storie waarby jy 'n kamermaat, en 'n glas melk. Kom ons neem 'n twee minute of so hier breek. En as jy rondom kan vashou, laat kom terug, kyk 'n bietjie meer op SQL, en dan 'n bietjie van JavaScript met p-stel agt in gedagte. Alle regte. So, laat ons jy dink oor 'n hoek saak wat baie maklik kan ontstaan in die konteks van die gebruik van 'n databasis, of eerlik, selfs met behulp van werklike wêreld dinge hou OTM geld te kry. So hier is 'n yskas. Veronderstel jy een het ook in jou koshuiskamer of jou huis. En jy het 'n kamermaat, en albei jy regtig wil melk byvoorbeeld. Sodat jy by die huis kom van die klas een dag. Hy of sy is nog nie terug. Jy maak die yskas. Jy wil regtig 'n groot glas melk. Daar is geen melk. So, wat doen jy? Jy naby die yskas. Jy gryp jou sleutels. Jy gaan uit na die vierkant. En jy in die lyn by CVS by daardie self afhandeling dinge, wat altyd langer neem as wat werklik met kassiere. In elk geval. So dan, intussen, dot dot dot, jou kamermaat by die huis kom en hy of sy Net so het 'n hunkering vir 'n paar melk. Sodat hy of sy maak die yskas, lyk binnekant, en oh, damn. Geen melk. Sodat hy of sy kop uit, gebeur om te gaan aan die ander CVS, wat slegs 'n blok weg vir een of ander rede, en hy of sy kry in lyn 'n bietjie melk te koop. Intussen het jy by die huis kom, moet hy of het sy by die huis kom, en wat doen jy uiteindelik het? Twee keer soveel melk. Maar jy het nie regtig soos melk wat veel. So nou het jy so baie melk wat nou een van hulle is net gaan om te gaan suur uiteindelik. So, dit is 'n baie slegte probleem. Reg? So wat gebeur? So fundamenteel, dit is 'n soort van 'n belaglike voorbeeld. Maar onder die enjinkap, wat ons gehad het gebeur hier is albei van julle nagegaan die toestand van 'n stuk van geheue, die yskas. Beide van julle nagegaan die staat van sommige veranderlike. Julle albei het 'n gevolgtrekking dat jy dan opgetree het. Maar helaas, terwyl jou kamermaat was by die winkel, die staat van daardie veranderlike verander, moet hy of sy kom terug en wil nou die toestand te verander, maar dit is reeds verander aan hom of haar. En natuurlik, sou hy of sy nie ' gegaan na die winkel as hulle geweet het dat jy reeds op pad. So in die werklike wêreld, hoe kan jy vermy die probleem, as jy het 'n yskas, jy het 'n kamermaat, en jy eintlik graag melk? GEHOOR: Kommunikasie. David Malan: Kommunikasie. OK. Maar hoe kan jy kommunikeer? GEHOOR: Laat 'n nota. David Malan: Skryf 'n nota, reg? Altyd laat 'n nota, vir ondersteuners van die show. Alle reg, so los altyd 'n aantekening, of sit werklik soos 'n slot of iets op die yskas wat hou jou kamermaat van die inspeksie van die toestand van daardie veranderlike. Nou, kan waarom dit wees related aan probleem stel sewe, of OTM. Wel, 'n wêreld in 'n OTM waar jy dalk in staat wees om te gaan na 'n OTM masjien hier, en 'n ander OTM hier. En dit gebeur dikwels. En dink jy het twee OTM-kaarte, wat moontlik is te kry. En jy meld in beide masjiene effektief gelyktydig, hopelik Terwyl niemand is op soek. En dan moet jy tik in jou PIN ongeveer gelyktydig. En dan moet jy doen om 'n balans navraag om te sien hoeveel geld jy het. En kom ons sê jy het $ 100 in jou rekening. So in wese gelyktydig, jy sê die een, zero, zero, betree. En jy hopelik terug te kry 'n bietjie geld. Maar hoeveel geld kan jy terug te kry? Nou rekenaars aan die einde van die dag, veral as hulle praat met bedieners, nie noodwendig dinge doen in die einde wat verwag word. So dink wat gebeur, as gevolg van watter netwerk spoed kwessies daar is, of CPU kwessies daar is nie, of iets soos dit, veronderstel dat die eerste OTM kontrole jou balans en sien, o, hierdie persoon het $ 100. Maar dan kry afgelei want miskien 'n rugsteun gebeur en dit is dus stadiger. Of miskien, terwyl die ondersoek, die netwerk verband het 'n bietjie stadiger omdat dit gebeur net. Hulle is fisiese toestelle. So intussen, die tweede OTM is vra dieselfde vraag. Hoeveel geld het Dawid het? $ 100 is die antwoord. Maar omdat die eerste ATM het nog nie gestuur is om die boodskap af te trek $ 100, beide OTM geïnspekteer het die bank se kluis sien daar is $ 100 is daar, en nou beide masjiene moontlik is gaan spoeg uit 'n antwoord. Nou, dit is 'n groot vir jou in 'n sekere sin As wat die bank doen uiteindelik word die bedrag verander minus 100 deur die opstel van die veranderlike gelyk aan jou bankrekening gelyk aan 0, in teenstelling te doen minus 100. Nou in die ergste geval vir die bank - of in die beste vir die bank, intussen, hulle gee jou $ 200, en jou bankrekening toon nou negatiewe $ 100, wat regtig nie voordeel wat u op alle. Maar die punt is dat hierdie ras voorwaarde vir twee kamermaats om melk, of vir twee kitsbanke probeer om kontant te kry en verander die toestand van 'n kluis op dieselfde tyd bestaan ​​enige tyd wat jy het 'n databasis. Nou in probleem die sewe, hierdie kwessie ontstaan ​​in die sin dat as jy koop 'n deel van Facebook voorraad, en dan vir byvoorbeeld jy koop 'n tweede deel van die Facebook voorraad, wat jy nodig het om te maak 'n besluit as die programmeerder. Ten einde te besluit hoe om die werk databasis, is kans jy gaan het een ry vir die voorraad, en hierdie is een manier om dit te implementeer. En jy gaan 'n aandeel te hê FB, wat hul voorraad ENKELE simbool maak vir die gebruik, of hierdie gebruiker ID, die unieke identifikasie. Maar dieselfde storie kan hier gebeur nie. As jy 'n nie in SQL, as jy sien in probleem die sewe wanneer jy sien, Ag, Dawid het 'n aandeel van Facebook voorraad. Laat my nou verander om dit te wees twee aandele, want hy wil 'n te koop tweede deel. Maar veronderstel Dawid het eintlik twee vensters oop, of dink dat dit is 'n gesamentlike rekening met twee gades, en beide van hulle probeer om uit te voer dieselfde operasie, is daar ook die potensiaal bestaan ​​vir 'n besluit te wees gemaak op grond van die vorige toestand van die wêreld - die rekening het 'n aandeel - en beide mense, of beide bedieners, nou probeer om te sê dit inkrementeer tot twee aandele. Maar in hierdie geval, kan jy dalk aangekla het my geld vir beide aandele nie, maar geinkrementeer net dat een keer. Dus, in kort, die fundamentele probleem hier, soos met die grap oor die plasing van 'n daarop, of om 'n slot op dit, is As twee mense, of twee drade - dink terug te krap - kan sien wat die toestand van 'n veranderlike en dan probeer om daardie veranderlike te verander, maar dié twee dinge gebeur nie by die dieselfde tyd, maar kan onderbreek kry deur ander dinge sien gebeur, data kan kry in 'n baie vreemde staat. En jy kan voordeel trek of jy kan ly in die sin van die geld voorbeeld. So in probleem stel sewe, gee ons u hierdie een lyn van kode, wat lank storie kort, los hierdie probleem in MySQL. Hierdie baie lang opdrag wat nie selfs pas op 'n lyn op die skerm hier verseker dat jou operasie is wat genoem atoom. Dit gebeur alles op een slag, of dit glad nie gebeur nie. Hierdie baie lang gedeelte kan nie kry onderbreek gedeeltelik. En wat dit doen, is letterlik wat dit sê. Voeg in 'n paar tabel om die volgende drie velde daardie spesifieke waardes, maar op duplikaatsleutel, doen nie 'n insetsel. Doen 'n werk. So dit is soos om 'n kies en 'n INSERT so te sê op dieselfde tyd. En wat is die sleutel wat waarskynlik word hier verwys? Dit blyk uit, en jy sal sien dit in probleem die sewe se spec, want ons het daar verklaar 'n unieke sleutel tot op hierdie spesifieke tafel sodanig dat jy kan nie meer rye vir dieselfde gebruiker met die dieselfde pennie voorraad simbool - In hierdie voorbeeld hier, DVN.V is 'n dom pennie voorraad dat ons verwys na in die spec. Want ons het verklaar dat dit om uniek te wees, wat dit beteken is dat as jy probeer om 'n dubbele ry in te voeg, is jy plaas gaan om dit te werk sonder enigiemand anders 'n kans om te verander die toestand van die wêreld nie. Dus, in kort, dit verseker dinge atoom. Meer in die algemeen al is, databasisse soos MySQL - en jy nie hierdie funksie nie nodig vir p-die sewe, maar hou dit in gedagte het vir die toekoms - ondersteun wat transaksies genoem, waar jy kan sê BEGIN TRANSAKSIE letterlik. Jy kan dan voer twee SQL-stellings. En 'n SQL-stelling, as jy sien in p-die sewe, lyk 'n bietjie iets soos hierdie. Werk 'n tabel genaamd rekening. Stel die balans kolom gelyk aan watter die balans kolom tans is minus 1000 waar die aantal, die rekeningnommer, soos die gebruiker ID, gelyk aan 2, en dan werk rekening dot dot dot. So in leketaal, nie wat hierdie twee navrae blyk te wees doen in die werklike wêreld sin van die bank? Publiek: Die oordrag te spaar. David Malan: Presies. Die oordrag van fondse van een rekening na die ander. En dit is nog 'n voorbeeld waar jy regtig wil hierdie twee dinge gebeur of nie gebeur nie. Jy wil nie om iets te kry in die middel van hulle en potensieel gemors die wiskunde, of gemors hoeveel die geld wat jy het, of hoeveel geld die bank het. So, wat is regtig nice oor transaksies in MySQL is dat, en databasisse meer algemeen, is dat hulle en slim mense wat nog geïmplementeer hierdie funksies uit te vind hoe om te maak seker dat beide van die dinge gebeur of glad nie. En as jy werklik aspirant te maak 'n webwerf wat gebruik word deur mense wat op kampus, mense in die werklike wêreld, doen iets in die begin sin, Dit is die soort van ontwerp besluite te neem wat geword ooit so belangrik is. Anders, kan jy begin om data te verloor, verloor gebruikers, of in die ergste geval as Ons het hier te sien, potensieel geld verloor. So weer, meer op wat in probleem stel sewe, sowel as miskien vir sommige van jy in die finale projekte. So laat verander dat die prentjie wat ons gehad het 'n oomblik gelede net in een manier. So laat my eintlik sien as ek kan - Nee, dis verby. Daar is dit. So dit is waar ons die laaste tyd oor. En dit blyk ons ​​gaan gooi een ding in die mengsel hier - 'n taal, die sogenaamde JavaScript. So JavaScript eintlik pas in hierdie stuk - en ek het nie heeltemal laat genoeg ruimte, so dit is nie nou op die skaal. OK, dit is regtig pateties. OK, so dit is JavaScript. Alle regte. Ek is regtig om dit te doen 'n slegte. Alle regte. So JavaScript is nog 'n ontwikkeling taal, en ons laaste, as dit help verseker dat daar nie veel meer van die brandkrane hier. So JavaScript is ook 'n geïnterpreteer taal, wat beteken dat jy dit nie doen nie stel dit in nulle en ene. Jy moet net hardloop nie. Maar wat is fundamenteel verskil met JavaScript is gewoonlik dat jy nie loop dit op jou web bediener. Dit maak nie hardloop raak in die toestel per se. Eerder, word dit afgelaai deur 'n gebruiker via HTTP in die leser - Chrome, Safari, Internet Explorer, Firefox, wat ook al - en dit is die leser wat voer hierdie bepaalde programmeertaal. So duidelik te wees, PHP dusver was uitgevoer óf by die opdrag lyn in ons swart en wit venster op 'n bediener soos die toestel, 'n rekenaar hou die toestel, of is dit ' uitgevoer deur 'n web bediener loop op 'n rekenaar. Maar die tema hier is dat PHP tot dusver uitgevoer is bediener-kant, so die gebruiker en die gebruiker se webblaaier nooit sien 'n lyn van PHP-kode. In werklikheid, as jy al ooit 'n leser oop te maak vir jou webwerf of 'n ander en jy eintlik sien PHP-kode in jou venster, iemand het geskroef. Want dit is nie bedoel om te wees gestuur word aan 'n leser direk. Dit is veronderstel om te uitgevoer word en draai in iets soos HTML. Maar JavaScript is in wese die teenoorgestelde. Dit is bedoel om te loop gewoonlik binne van 'n gebruiker se venster. En watter soort webwerwe gebruik JavaScript dan hierdie dae? Soos letterlik elke gewilde webwerf. Elke webwerf wat jy ouens waarskynlik gebruik daaglikse gebruik JavaScript vir die eenvoudigste en selfs die sexyste funksies. So iets soos Facebook Chat as jy dit gebruik. Hoe is dit eintlik werk? Wel, so ver, al die dinge wat ons het klaar is met HTML en PHP aanvaar dat jy trek 'n URL en jy getref Tik, en jy sien 'n paar HTML inhoud. En jy kliek op die skakel, wat verander die URL, verander die bladsy, en herlaadt 'n paar nuwe inhoud. Klik 'n ander URL of stuur 'n vorm, wat jy raak geklits na 'n ander bladsy en sien jy 'n paar nuwe inhoud. Maar met behulp van iets soos Facebook Chat, of Gchat, of Google Maps, selde het die hele bladsy te verfris sodanig dat sien jy 'n wit skerm vir 'n oomblik en dan nuwe inhoud. Inteendeel, webblaaie vandag is dinamies om weer op datum en weer en weer al die soort van agter die skerms. En dit blyk dat wanneer jy nie gaan iets soos Facebook, of Gchat, of Gmail en die bladsy updates outomaties sonder herlaai die hele skerm, wat gebeur het, is dat die leser het soort van die geheim gemaak addisionele HTTP versoeke - nie vir die hele web bladsye, maar net vir ' bietjie stukke van data, soos die direkte boodskap dat jou vriend net jy, of die status update gestuur wat iemand wat net jy, of die tweet gestuur dat iemand net gestuur. Dit is net die maak van klein versoeke vir data, en dan met behulp van JavaScript, hierdie programmeertaal te verander, wat die webblad lyk sonder die bediener te help, sonder die bediener genereer HTML. Dus, in kort, kan JavaScript dan gebruik word om nie net te haal nuwe data uit die bediener sonder herlaai 'n hele bladsy of die indiening van 'n vorm. Dit kan ook gebruik word om verandering die sogenaamde DOM - dokument voorwerp model - wat net die fancy manier vir sê die boom van HTML wat ons gesien het die laaste keer. So gerus te stel, JavaScript is sintakties so soortgelyk aan C as well. Daar is geen belangrikste funksie. Jy begin net die skryf van die kode en dit sal uitgevoer word, of meer behoorlik geïnterpreteer. Voorwaardes sal lyk soos hierdie. Geen verskil van C of PHP vir die saak. Boole uitdrukkings of ge-saam sal lyk soos hierdie. Saam Anded lyk soos hierdie. Skakelaars sal lyk soos hierdie. Vir loops sal lyk soos hierdie. Terwyl sirkelroetes sal lyk soos hierdie. Doen terwyl sirkelroetes sal lyk soos hierdie. Dit is 'n nuwe. So het JavaScript nie 'n foreach bou per se nie, maar dit bou vir veranderlike i opgestel, en ek in hierdie geval word 'n waarde van die indeks. So dit is 'n bietjie anders as wat foreach, al nuwe weergawes van JavaScript is om uit te kom al die tyd, sodat selfs die taal funksies is ontwikkel. En as 'n eenkant, JavaScript hierdie dae kan ook gebruik word op 'n bediener, net soos PHP met behulp van 'n raamwerk genoem Node.js. Een van CS50 se TFS, Kevin, het daartoe gelei dat 'n seminaar oor Node.js wat beskikbaar is by cs50.net/seminars. So as jy nuuskierig is, weet dat jy kan dit gebruik om op die bediener kant as goed, maar dit is 'n redelik onlangse tendens, maar 'n kragtige een op daardie. Dit is 'n bietjie anders. Dit is 'n skikking in JavaScript. En wat tref jou as verskillende versus C of PHP? Daar is 'n paar vinnige stories ons kan hier vertel. Wat ontbreek versus PHP? Publiek: [onhoorbaar]. David Malan: Ja? Jammer, weer sê? Publiek: Nie verklaar die tipe veranderlike. David Malan: Ons is nie te verklaar die tipe veranderlike. So eintlik hou van PHP, ons is nie vermelding van die tipe van die veranderlike. Inteendeel, ons is meer generies sê var vir veranderlike. Ons het nie PHP se ergernis van die hoef dollar-teken, wat terwyl vervelige te tipe, beteken om meer duidelik dat iets is 'n veranderlike. Terwyl hier, ons is soort van terug te C se benadering deur bel net 'n veranderlike deur die naam wat ons wil om dit te gee, soos getalle. En ook soos PHP, ons het vierkantige hakies vir die waardes binne daardie skikking. So veranderlikes in JavaScript ook kan lyk soos hierdie. Let hier is 'n string genoem is, maar insgelyks het ons nie vermeld dat dit 'n string. Hier is al 'n funksie wat nie bestaan ​​in presies dieselfde manier in PHP, maar 'n bietjie dieselfde. Dit is 'n voorwerp in JavaScript. En die voorwerpe is soort van die Swiss Army Mes van 'n data struktuur in wat jy kan gebruik om hulle vir 'n aantal van die dinge. Hier, byvoorbeeld, ons verklaar 'n veranderlike genoem kwotasie. Die tipe wat veranderlike is 'n voorwerp. Jy kan dink van hierdie as 'n C struct wat sleutels en waardes. Simbool is 'n sleutel. FB is 'n waarde, blykbaar 'n voorraad-simbool. Komma. Die prys is 'n ander sleutel, en die waarde daarvan is blykbaar 'n drywende punt, of 'n getal meer algemeen in JavaScript, van $ 49,26. So PHP het nie - ons het nie heeltemal gesien in PHP voorwerpe soos hierdie, maar ons het sien 'n analoog, wat was wat? Publiek: [onhoorbaar]. David Malan: Assosiatiewe skikkings. So terwyl PHP het assosiatiewe skikkings wie se sintaks is ooit effens sodat verskillende - ons het die vierkante hakies. Ons het die vreemde pyle simbole. JavaScript is voorwerpe, maar dit is meestal 'n semantiese verskil en 'n verskillende sinoniem vir nou. Maar, as 'n eenkant, PHP het ook voorwerpe in 'n manier dat Java en ander tale voorwerpe in objek-georiënteerde programmering. Maar ons sal hierdie net gebruik vir data tipes vir nou. Voorwerpe en assosiatiewe skikkings. Hierdie een kan dit maak 'n bietjie meer duidelik. Hier is die rede waarom 'n voorwerp is nuttig. As jy 'n student te verklaar, soos Zamyla, kan ons eintlik omsluit so te sê binne daardie voorwerp deur gebruik te accolades net soos voordat 'n hele klomp van die sleutels en waardes in hier. Ons het 'n ID, 'n huis, en 'n naam vir Zamyla, gevolg deur 'n kommapunt as gewoonlik aan die einde. Hier ook, is dit effens anders, maar ook baie sterk hierdie dae. Hier is 'n skikking, en ek weet dat, omdat daar is 'n vierkantige hakies up bo-op en 'n vierkantige hakies aan die onderkant. En dit is 'n verskeidenheid van wat data tik blykbaar in JavaScript? Dit is 'n verskeidenheid van dit lyk soos drie voorwerpe. En ek weet dit is net 'n voorwerp as gevolg van die krullerige draadjies. En sien daar is oop krullerige stut, 'n paar dinge, naby krullerige stut, komma, dan 'n paar meer, komma, en dan 'n paar meer. So dit is drie argumente geskei deur twee kommas. So, dit is 'n verskeidenheid van drie voorwerpe. En elkeen van daardie voorwerpe blyk te wees, 'n student of personeellid van 'n paar soort, elk met 'n ID, huis, en die naam. Maar ek het dit iets genoem genoem into - JavaScript Object notasie. En dit is 'n data-formaat wat eintlik is so baie gewild en in mode deesdae dat as jy skryf 'n aansoek wat gebruik maak van die Facebook API, die Twitter API, regtig byna enige API daar buite hierdie dae, insluitend 'n paar van die CS50 se eie, die data jy terug is nie in ou skool CSV formaat. Omdat onthou dat CSV is super eenvoudig. Dit is net kolomme geskei deur kommas. Into data gee jou meer metadata. Dit assosieer 'n sleutel met elke waarde so hulle het nie net aanvaar dat die nulde kolom is een waarde, kolom een is 'n ander, kolom twee is 'n ander. Alles in 'n into voorwerp hier is 'n soort van self-beskryf, omdat elke een van name in hierdie lêer het letterlik noem in die voorkant van dit as 'n aangehaal string. So laat ons 'n blik op 'n paar voorbeelde hier. Laat my gaan in die toestel. En laat my gaan in ons vhost Gids in die openbaar. En laat my gaan in die JavaScript gids. En laat ons gaan voort en oop Dom-0.html, waar DOM beteken net dokument voorwerp model. Dit is die boom goed waaraan Ek verwys na vroeër. En laat my die volgende stel. Hier is 'n webblad se liggaam is eenvoudig. So hier aan die onderkant, sien ek het 'n vorm. Ons het gesien wat voor. Dit het twee insette, waarvan een 'n ID van naam, waarvan een 'n tipe dien, en die eerste 'n mens se tipe is teks. So dit is eintlik klink eenvoudig. Kom ons gaan hier. Kom ons gaan terug na hierdie bladsy hier. Kom ons gaan in local host, en gaan na ons JavaScript gids, en gaan na Dom-0, en hier het ons hierdie vorm. So dit is blykbaar al hierdie bladsy nie. Dit het 'n naam in met 'n knoppie Stuur. Maar ek gaan nie hier PHP te gebruik. Ek gaan alles kliënt kant te doen om so te praat in JavaScript soos volg. Let daarop dat ek het inderdaad die naam gegee veld van hierdie insette 'n unieke identifikasie, wat sal eintlik red my 'n paar keer in 'n oomblik. En sien Ek het voorgestel 'n ander tag in die kop van my webblad, die  tag. So is dit in hierdie sin dat JavaScript is 'n kliënt-kant programmering taal. In hierdie geval, net soos CSS, het ek dit reguit binnekant van my HTML. Maar let ek verklaar 'n funksie wat lyk 'n bietjie soos PHP sintakties, maar dit is eintlik JavaScript, want weer, dit is kliënt-kant in die leser. En neem 'n raai wat dit gaan doen, selfs al is 'n paar van die sintaksis hier is 'n nuwe. Publiek: Sê hallo vir elkeen. David Malan: Dit gaan om te groet aan wie besoek hierdie bladsy. So hoe? So sien, dit blyk in JavaScript daar is 'n waarskuwing () funksie. Dit is 'n baie soort van hartseer funksie wat eintlik net geneig om gebruikers te irriteer. Dit is nie een wat jy moet regtig gebruik Tipies, maar dit is 'n vinnige en vuil manier soort van druk om iets 'n grafiese gebruiker koppel, soos 'n leser. Let hier dat ek het 'n string in aanhalingstekens. Dit blyk dat in teenstelling met C, JavaScript kan eintlik gebruik jy enkele haal, en gesê dit is net 'n soort van die stilistiese konvensie onder JavaScript programmeerders aanhalingstekens te gebruik. PHP, hulle eintlik 'n bietjie ander betekenis. Maar vir nou, weet net dat dit is die enigste rede. Die konvensie in JavaScript is dikwels te Gebruik aanhalingstekens, maar ons kan gebruik om dubbel aanhalings in beide plekke so goed. So dit is interessant. Onthou die laaste keer dat ons gehad het dat foto op die skerm wat 'n boom het waar jy die HTML-knoop, en die kop knoop, en die liggaam knoop, en dan 'n paar teks. Maar daar was een spesiale knoop by die top dat ek het die dokument. Wel, dit blyk in JavaScript, enige tyd wat jy 'n program in JavaScript skryf in 'n leser, het jy toegang tot 'n spesiale globale veranderlike. Soortgelyke in gees PHP se superglobals, hierdie een is ingeroep al klein dokument. Dit is soos 'n struct, maar dit struct het ook funksies binnekant van dit. So 'n C struct het net data tipies. Maar 'n JavaScript voorwerp as dit tegnies is ook funksies, andersins bekend as metodes, binnekant van dit. En jy kan 'n funksie roep binnekant van hierdie voorwerp letterlik doen sy naam, dot, en dan die naam van die funksie, of weer metode. Dit is net 'n sinoniem, regtig. En wat beteken die funksie doen? Jy kan soort van dink uit die naam. Kry element deur ID. So dit gaan die webblad te soek, soek die boom, op soek na watter knoop, AKA element, het 'n unieke ID van kwotasie unquote naam. En dan wat gaan ek doen? Ek gaan die waarde binnekant van te kry dat nodus in die boom gegee, en ek gaan om een ​​of ander manier sê hallo vir die naam. So neem 'n raaiskoot, selfs al het ons nie gesien het nie, doen wat die plus simbole hier en hier waarskynlik beteken? Publiek: koppel. David Malan: koppel. Reg, en dit is net ' soort van ontwerp besluite te neem mense gemaak jaar gelede. In PHP, jy koppel dinge met kolle. In C, jy spring deur verskeie hoepels en noem funksies soos strcopy () of strcat () of sodanige ander funksies. Maar in JavaScript, jy gebruik plus punte. So dit is net concatenating drie snare - hallo, 'n naam, en dan 'n uitroepteken. Dus, wanneer en waarom is die funksie genoem al? Wel, neem 'n raaiskoot van die HTML aan die onderkant. Hoekom is groet () genoem word, of wanneer? Blykbaar, as die beste wat ek kan sê, op dien, wanneer hierdie vorm ingedien word, Ek gaan om te doen wat is binnekant van hierdie aanhalings. En spesifiek, ek gaan om te bel groet () en dan terug onwaar. Wel, laat ons sien wat die netto uitwerking hier is die eerste. So laat my gaan voort en tik in, sê, Loren, Stuur. Hallo Loren. Kom ons kyk of miskien was dit net 'n gelukkige implementering. Nee. So is dit tik aan watter noem ek eintlik daar te vestig. Maar let op wat nie verander. Die URL is nog dom-0.html. Daar is geen register.php. Daar is geen tweede lêer. Daar is geen optrede kenmerk. So wat is hierdie terugkeer valse vermoedelik doen? Hoekom is ek 'n beroep groet () en dan terugkeer valse waarskynlik? Wat gewoonlik gebeur wanneer jy kliek Stuur op 'n vorm wat selfs ons het gesien in die afgelope week? Publiek: [onhoorbaar]. David Malan: Dit gaan iewers, reg? Dit gaan om 'n paar bestemming URL. Maar ek wil nie dat hier gebeur. Ek wil my webblad te heeltemal dinamiese soos Gmail, waar sodra jy daar, jy bly daar. Die URL nie verander in 'n manier wat dui op die hele bladsy is herlaai. Inteendeel, ek wil net iets te verander soos die druk van iets hier op die skerm. Wel, laat my skoon hierdie 'n bietjie. Laat my oopmaak nie dom-0, maar laat my oopmaak Dom-2. Net sodat jy het gesien sommige sintaksis hier. Dit blyk dat wat ons nou net gedoen het, is die gebruik van rou JavaScript. So dit is werklik die taal JavaScript. Sommige van julle sal weet 'n biblioteek genaamd jQuery. So jQuery is nie dieselfde ding as JavaScript. Dit is net 'n biblioteek wat 'n baie slim man geskryf en gewild soos dat byna almal in die wêreld nou gebruik jQuery toe met behulp van JavaScript. En met die eerste oogopslag, eerlik, dit lyk 'n bietjie meer kriptiese. Maar jy sal vind, veral as jy gaan daar is vir jou finale projek met web ontwikkeling, sal jy vind dat hierdie skoon dinge en spaar jou 'n hele paar reëls van die kode. So laat ons net blik op hoe hierdie vorm werk. Let op wat ek het verwyder blykbaar uit my HTML? Daar is geen op dien hanteerder om so te praat. Daar is geen eienskap. Omdat jy weet, wat Ek het nie regtig soos? Ek het gevoel asof ons val in ou gewoontes daar. Net soos dit was die begin van slordige te voel beide CSS te meng met HTML, omdat jy soort van gooi verskillende tale oor die hele plek, insgelyks het dit begin om te voel soos 'n slegte pad af te gaan waar Ek sit JavaScript-kode binnekant van my HTML eerder as factoring dit uit. So wat is die les hier. In dom-2.html, ek factoring dit uit. En ek doen dinge effens anders. Vir nou, ek gaan my hande te waai na wat dit regtig doen onder die kap. Maar net vir nou aanvaar dat die eerste reël van die kode in die biblioteek genoem jQuery beteken net wanneer die dokument gereed is, doen die volgende. Omdat webblaaie kan neem 'n tyd om te laai. Jy kan op 'n stadige internet verband, en dit kan spin en spin, en uiteindelik is dit gelaai. Dat die lyn van die kode sê net wag totdat die hele bladsy is gereed, die dokument gereed is, voor die uitvoering van hierdie kode. En nou sien, is dit waarskynlik die mees bruikbare eerste neem weg van jQuery. Hierdie reël hier is baie soortgelyk in die gees hierdie baie langer lyn hier. Terwyl dit in rou JavaScript-kode, is daar bestaan ​​'n dokument globale voorwerp wat het 'n funksie genoem getElementById (), die mense wat geskryf het jQuery vereenvoudig wat net sê dollar-teken, en dan binnekant van hakies sit twee aanhalings, en dan sit 'n hash simbool, gevolg deur die unieke ID wat jy wil aan te gryp. So dit is gelykstaande aan document.getElementById. Intussen het. Stuur net beteken op indiening van watter vorm jy verwys na aan die linkerkant, gaan voor en voer dit. Maar dit is nou die nuuskierigheid ook. Wat is vreemd oor wat Ek het hier uitgelig? Nie net is dit soort van sintakties nuwe, daar is ook iets wat ontbreek. Publiek: Dit is net genoem funksie? Dit is nie wakker genoem? David Malan: Ja. Wel, so alert () is af hier, om eerlik te wees. Maar daar is geen sprake van 'n noem, soos jy weet, cat of iets hier. En inderdaad, dit is een van die kenmerke JavaScript dit is nogal kragtige, maar ook baie nuwe. En PHP het eintlik dit so goed. Laat my gaan voort en doen iets ware vinnig. Laat my gaan voort en sit dit hier. Laat my dit doen. Funksie. Kom ons noem dit hanteerder (). 'N hanteerder funksie om so te praat. Iets wat 'n operasie hanteer. Laat my skoon my inkeping. En sit dit hier. En sit dit hier. Yep. OK. So nou het ek 'n funksie genoem hanteerder () dat ek weet regtig nie wat dit doen nie. Dit het net nog van daardie dinge. Oeps. Het te veel. Kom ons doen dit. Alle regte. Jammer. Alle regte. Laat my dit doen. OK. Dit lyk mooi en reguit stuur nou. Laat my dit doen. Doen dit. En OK. So nou, laat ons dit oor hier. Geen meer ontwikkeling op die vlieg. OK. So nou, laat ons gaan terug na waar die storie begin. Voorheen, het ek gesê dat hierdie lyn hier beteken dat wanneer die dokument gereed is, gaan voort en doen dit. Wat wil ek doen? Wel spesifiek, ek wil gaan voor en doen die volgende. Voer hierdie lyn van kode, en dan wat ek wil hê jy moet doen, is om noem dit funksioneer as die vorm ingedien word. Nou dit is wat is interessant. Dit is nie self 'n funksie. Let Ek is nie gekant hakies hier op die normale manier. Ek is letterlik verby 'n funksie genoem hanteerder () na 'n ander funksie genoem dien () as 'n argument as al is dit soos 'n veranderlike. En dit is een van die kenmerke van JavaScript, is funksies hulself is eintlik net voorwerpe. In werklikheid, hulle is regtig net veranderlikes van 'n soort. En as die naam van die funksie is hanteerder (), daar is geen rede Ek kan nie slaag dit in as 'n argument hier. En dit beteken dat wanneer die vorm met die ID van demo is ingedien is, noem hierdie funksie. Maar nou as ek ongedaan al hierdie dinge, Waarom het ek dalk doen hierdie 'n oomblik gelede? Wel, dit is 'n anonieme funksie. Want eerlik, het ek besef hoekom is ek pla tyd te mors waarby 'n funksie genoem hanteerder () net om te noem dit in een en slegs een plek? As ek nie nodig het om die naam, en ek doen nie nodig om dit te noem meer as een plek, laat ons net die uitvoering van die funksie reg waar ek dit nodig het. En so JavaScript en PHP ondersteun wat anoniem funksies genoem dat laat my toe om presies dit te doen hier. Maar ons is maar net krap die oppervlak. Kom ons terg met net 'n paar finale voorbeelde hier. As ek gaan in quote.php. Let daarop dat hierdie is eintlik 'n PHP funksie, 'n PHP-program, wat ek geskryf het wat verwag 'n HTTP parameter genoem simbool, en ek kan slaag in 'n waarde soos FB. En as ons eintlik kyk na die bron het, word hierdie gebruik daarvan 'n gratis webwerf genoem Yahoo Finansies, net soos p-reeks sewe, en dit is terug na my iets in glo die formaat bekend is into - JavaScript Object notasie. Dit is net 'n voorwerp. Let op die krulhakies, die aanhalings, die kolon, en die kommas. Nou intussen, dit is pretty cool. Omdat ek waarskynlik gebruik om 'n ontwikkeling taal URLs te genereer wat lyk soos hierdie dinamiese, reg? Ek kan dit verander na Google en terug te kry Google se voorraad prys van $ 1,017.55. So kom ons kyk of ons kan nie nou gebruik. Laat my gaan Ajax-0 hier, wat lyk soos die volgende. Dit is net 'n webwerf wat ' 'n vorm met 'n knoppie. Laat my hier voort te gaan en tik in YHOO vir Yahoo se beurs simbool, kliek Kry Quote, en nou sien ek gekry 'n waarskuwing met 32,86. Laat my eintlik gaan na 'n liefhebber weergawe van hierdie bladsy, weergawe twee, en tik in kom ons sê Microsoft, MSFT. Kry kwotasie. En nou sien, geen waarskuwing. Let op waar dit sê die prys bepaal moet word? Daar is die eenvoudigste van voorbeelde wat sinspeel op wat Gchat en Facebook Chat, en Gmail, en ander sulke webtuistes doen deur eintlik die verandering van die webblad. Let op hierdie. Laat my herlaai die bladsy. Laat my oopmaak Chrome se inspekteur. Laat my gaan aan die elemente blad hier. Nou sien as ek zoom in hier en open dit op, sien dat dit is my HTML DOM - my dokument voorwerp model. Dit is my HTML. Maar nou sien, selfs al is dit gaan om 'n bietjie moeilik wees om dit in beide om te sien plekke op een slag, as ek tik in FB hier, kyk na die onderkant van die skerm net. Dit is eintlik die verandering my HTML op die fly. En dit is om dit te doen eenvoudig deur iets soos hierdie. As ek oop Ajax-2, kennisgewing uitvoering iets so sexy as dat, alhoewel dit is redelik lelik, maar so gesofistikeerd as wat funksioneel, dit het 'n HTML aan die onderkant. Maar let ek gebruik om te merk. Ons het nooit hierdie gebruik, maar dit is soos 'n, maar dit beteken nie dwing alles op 'n nuwe reël. Dit maak net 'n vierkantige area op dieselfde lyn wese. Let daarop dat ek het dit 'n ID van die prys. En dit blyk deur dieselfde JavaScript-biblioteek, ek het 'n funksie genoem kwotasie () wat genoem word wanneer die vorm ingedien word. En wat ek doen is dit. Ek is waarby 'n veranderlike in JavaScript genoem url, die redding van die waarde quote.php? simbool =. Met ander woorde, ek self begin n HTTP-versoek om voor te berei, en dan Ek concatenating op wat met 'n plus Wat ook al die element met die ID simbool is, welke kennisgewing is dat teks veld reg hier. So, net soos ons het vorms in die verlede. En dan is dit blyk in jQuery, as jy noem. Val (), wat 'n beroep van 'n val funksie, 'n waarde funksie, wat kry wat die gebruiker getik in En dan is almal van die netwerk verkeer wat gebeur is nie. $. GetJSON. En as 'n eenkant, dollar teken net 'n snelskriknotasie. Dit is regtig jQuery.getJSON. Kry my into van hierdie URL, en wanneer die versoek kom terug, noem dit funksie en slaag in die argument alles wat kom terug van die bediener. So met ander woorde, as ek gaan terug na die leser, en ek gaan terug na quote.php, wat my leser doen, is om hierdie stuk van data. En wanneer ek gaan na hierdie webblad hier, sien as ons plaas gaan na die netwerk blad en duidelik nie, en dan tik iets soos GOOG vir Google en kry Quote, sien die bladsy nie verander het nie. Maar 'n HTTP versoek is, en wat kom terug hier as ons kyk na die reaksie is 'n hele klomp van into dat ons uiteindelik verkry met hierdie eenvoudige lyn hier. Data is wat geraak van die bediener. Prys is die naam van die sleutel wat ek omgee. So data.price gee my dat. Nou intussen, en hierdie is die laaste voorbeeld. Jy kan nog meer te doen met die bladsy. Een werklik goed twee. Ons kan terug te bring die merk, as jy onthou dit. Dis JavaScript. Ons kan dit doen. Baie opwindend. Ons sal laat dit as 'n fotonische lewe. Maar meer spannende, kan jy doen dinge soos hierdie. As ek gaan na geolocation-1, dit blyk dat Chrome weet dat ons by breedtegraad 42,37. -71,10. So daar is selfs meer daar tot jou beskikking. Maar meer op wat volgende week. Sien julle Maandag.