DAVID MALAN: Okay. Dette er CS50, og det er i slutningen af ​​uge ni. Det har været en hvirvelvind i de sidste par dage. Og problemet sæt syv, hvis du er knæ dybt ind i det, indse, at der er en hel bit nyt, er derinde. Men lad os se om vi ikke kan stykke alt sammen her kort inden da kovending off i endnu anden retning og se hvor ellers vi kan gå. Så hidtil har vi talt om HTML. Vi har talt om CSS. Vi har talt om PHP. Du er begyndt at opleve SQL. I dag vil vi tale lidt om JavaScript. Men hvordan gør alle disse uensartede sprog passer sammen? Så vi talte i sidste uge om den begrebet have en server. Så lad os bare trække dette rektangel en web-server her. Og en web-server tjener sikkert filer. Og nogle af disse filer kan være HTML-filer. Så en af ​​de ting, som en webserver kan spytte kan være en fil, vi bare tegne som denne indeholder nogle HTML. Så i lægmandssprog, hvad betyder HTML lade dig gøre? PUBLIKUM: Side udseende nice. DAVID MALAN: OK, lave en side ser pæn, selv om jeg tror, ​​jeg har bevist som ellers. Så HTML lader dig lægge ud sider strukturelt, og det giver dig mulighed for at slags æstetisk markere en side, markere statisk indhold, så du kan derefter se det med en webbrowser. Men det er nøglen. Det er statisk indhold. Du skriver det, du gemmer den, og så skal du sende det. Og webserveren så tjener det op til dine besøgende. Men vi stilisere tingene ved hjælp af en anden sprog helt. Vi begyndte at bruge en stil attribut visse tags. Og den stil attribut lad os sætte ting som skriftstørrelse og farve. Og du har sikkert begyndt at opdage, eller du snart vil til endelig projekter potentielt, endnu andre egenskaber, som du kan bruge i CSS. Og så i lægmandssprog, hvad virkelig så gør CSS gøre? Disse er blot eksempler deraf. Hvad betyder det lade dig gøre det HTML synes ikke at fra det vi har set hidtil? PUBLIKUM: Definer typografier ved dig selv. DAVID MALAN: Definer typografier ved dig selv. Så definere ting som klasser, som du kan have stødt på, eller unikt identificere knuder i et dokument, så at du kan stilisere dem. Men mere specifikt, ville jeg sige, at CSS virkelig lader dig tage ting sidste kilometer og giver dig mulighed for at angive meget mere præcist æstetik, hvorimod HTML for det meste lader du strukturere dine sider. Og selv om der er nogle defaults, ligesom vi så tag for en overskrift tag, der groft sagt gjort tingene stor og fed. Det er en temmelig generisk definition af tag - stor og fed. Hvad skriftstørrelse er det? Hvilken farve er det? Hvor fed er det? Og CSS giver dig mere fint tune ting som. Samt layout, som nogle af jer har set. Og helt ærligt, CSS er en smule en rodet sprog. Det er meget magtfulde i at du kan gøre bogstaveligt enhver hjemmeside, at du har ses på internettet i dag med det, men det er sådan en smerte i nakken. Og nogle af jer har slået hovedet mod væggene allerede bare at gøre noget dumt ligesom centret en menu på Problemet sæt syv, hvis du har fået til dette punkt allerede. Men indse, disse ting blive nemmere med tiden. Du begynder at lægge mærke til mønstre. Og igen, vil Google være din ven for de forskellige måder, hvorpå du kan løse den slags problemer. Og jeg tør sige med CSS og HTML mere generelt, kan du løse problemer i mange flere måder, som alle kunne de meget vel være korrekt, end du kunne i noget lignende C, selv nu PHP eller JavaScript. Der er lige mange forskellige måder at lægge tingene ud. Men det begyndte at få rodet, vi sagde. Lige slags sammenblanding din HTML og din CSS med stil attribut var lidt sjusket. Og så vi i stedet sagt, en slags abstrakt set, at du skal mindst begynde at faktor ud af din CSS sandsynligvis. Ikke er din stil attributter, men mindst bruge stil tag inde i hvad del af websiden? PUBLIKUM: Head. DAVID MALAN: I hovedet. Indtil nu havde vi kun titlen op der, men du kan også tilføje en stil tagge, og du kan sætte din CSS groft taler mod toppen af ​​siden. Men så tog vi tingene et skridt videre og vi indregnet, at mere i en separat fil. Og så disse to filer var en eller anden måde nu forbundet. Og faktisk var det tag, der gjorde det. Og hvad var en af ​​den overordnede motivationer for factoring vores CSS desto mere? PUBLIKUM: Genbrugelighed. DAVID MALAN: Genbrugelighed. Right? Du har måske set i p-sæt syv allerede at en masse af de sider, hvor køb side, salgs side, portefølje side, er sandsynligvis struktureret noget tilsvarende. Der er en CS50 finans logo øverst medmindre du har besluttet at ændre det. Der er en sidefod på bunden af ​​siderne. Og CSS giver dig så at faktor det ud det i en separat fil, så hvis du ønsker at ændre noget på globalt plan tværs hele dit websted, kan du virkelig bare ændre det på ét sted. Men der er en pris, du betaler potentielt ved at have indregnet ud CSS fra min HTML-fil i en separat fil der refereres til den med tag, som vi så på mandag. Hvad kan downside være af denne? Tænker tilbage for en uge siden til, når vi er taler om HTTP og TCP / IP, og hvordan internettet fungerer. Noget herovre? PUBLIKUM: Det tager længere tid. DAVID MALAN: Det tager længere tid. Hvorfor? PUBLIKUM: [uhørlig]. DAVID MALAN: Ja. Så det nok tager lidt mere tid. Fordi en, CSS er naturligvis ikke i den samme fil. Så nu er du nødt til at gøre ikke én, men to anmodninger. Og hver af disse anmodninger, som vi så i Chrome i den såkaldte Inspector, og vi kiggede på nettet fanen hver af disse filer kræver en HTTP anmodning, som vi så tager en vis mængde tid. Nu, måske er det ikke en masse. Måske er det kun 20 millisekunder. Måske er det 200 millisekunder. Men tænk over en side som Facebook, eller CNN eller Google, som er meget større end de eksempler, vi har så på hidtil. Disse sider kan have snesevis af filer, hver især kan kræve en download af en fil. Så ting kan potentielt begynder at sætte farten ned. Og især i disse dage, hvor vi alle har mobiltelefoner i vores lommer, og langsommere internetforbindelser, skulle vente et par millisekunder, et par flere millisekunder til yderligere filer kan faktisk være langsom. Latenstid er det ord, der beskriver den slags venter, at du har, at du oplever, når venter på nogle stykke information. Men der er en upside. Så det er ikke alle slags - det faktisk er lidt af en vippe her. Downside nu, men hvad browsere kan gøre hvis de er smarte, for at undgå skulle anmode om det samme styles.css filen igen kan være at gøre hvad? Cache det. Så caching - C-A-C-H-E - generelt betyder her blot for at redde fil, du anmodede første gang, og så tjek din cache for det. Kontroller, at du er en slags storage container, og hvis du allerede har en kopi af styles.css, selv om nogle andre siden i p-set, eller enhver hjemmeside, anmoder det igen, bare for at give bruger den samme cachelagrede kopi. Gider ikke anmoder om den. Downside der, dog, som nogle af jer have udløst ovre i p-sættet. Hvis du foretager en ændring på serveren og du går tilbage til browseren, og du genindlæse, sommetider browseren gør dig en tjeneste, og ikke gider re-downloade din styles.css fil fordi, kom nu, hvad er oddsene at disse stilarter, at Facebook bruger vil ændre time til time eller dag til dag? Det er temmelig lav. De kan ændre sig over tid, men ikke af det minut eller time for time. Så et trick, FYI bare når du laver web udvikling, er ofte holde Shift-tasten nede for eksempel, og klik derefter på genindlæse i din browser, og der vil typisk fortælle browseren reload alt, selv hvis du allerede har det i cachen. Så igen upsides og ulemper, men alle af dem sidste ende design beslutninger. Så nu vi ikke bare afslutte historien her. Hvis jeg nu gå tilbage og tilbage og tilbage og tilbage, begyndte vi at introducere ikke bare HTML, men PHP. Så i lægmandssprog, hvad betyder PHP lad os gøre? PUBLIKUM: [uhørlig]. DAVID MALAN: Hvad er det? PUBLIKUM: Indføre logik i koden. DAVID MALAN: Yeah, introducere logik i din kode. Så det er en ægte programmeringssprog med løkker og variabler og funktioner og betingelser, og alle de ting, vi har brugt vej tilbage når siden bunden. Og PHP, vi har set, kan anvendes enten på kommandolinjen - det behøver ikke at have noget at gøre med web, men selv det er virkelig sin oprindelse, og hvad det har en tendens at være god til og befordrende for - men du kan bruge PHP blot ved naturen af det faktum, at det har en print () funktion, og et printf () funktion, eller et ekko () funktion. Der er bundter af måder, du kan udskrive tekst med PHP. Derfor kan du bruge denne programmering sprog til at udlæse præcist hvad vi talte om før. Du kan dynamisk generere din HTML. Måske ikke det hele. Måske du hårde kode ting, ligesom header og footer, og logoet, og dine style sheets, og alt dette. Men efter noget som p-set syv, hvor du manipulere bestandene og viser brugerens portefølje, som er gå til dynamisk at ændre, kan du sikkert bruge PHP og den logik, det giver du som programmeringssprog til output dynamisk delmængder på siden. Så når du taler om dynamiske hjemmesider, eller web-programmering, der er hvad du egentlig taler om. Ved hjælp af et sprog som PHP, eller ting kaldet Python eller Ruby eller Java, eller endnu andre sprog, at forespørge en database ofte, eller anden server, og så dynamisk spytte HTML. Nu slutresultatet, som en side, er at HTML de fleste hjemmesider, herunder din p-set syv, er formentlig kommer til at være et stort rod, hvis man ser på kilden kode i en browser. Det er ikke en big deal. På dette tidspunkt, vi når holder stil, vi interesserer os for ting, som du skriver. Vi vil ikke bekymre sig om de ting at hvad din kode udgange. Så du skal ikke bekymre dig om indrykning her, hvis det er PHP, der er faktisk udsende stuff. Efter alt, vil browseren er ligeglad, og et menneske vil ikke være på udkig ved kilden alligevel. Vi personalet, for eksempel, ville se på din PHP. Så lad mig give et hurtigt eksempel nu hvorfor ellers dette kan være nyttigt. Så helt ærligt, jeg kan ikke huske den sidste gang jeg brugte C til at løse et problem i den virkelige verden. Det var sandsynligvis i forskerskolen når Jeg havde brug for at bruge et sprog, der var forholdsvis lavt niveau, og gav mig mulighed for at gøre noget meget højt udfører virkelig spare så mange CPU cykler, som jeg kunne, for en stor del fordi jeg var ved hjælp af store datasæt, og hver CPU cyklus tælles. Og helt ærligt, selv i ting som telefoner disse dage og andre enheder hvor man ikke helt har så meget hukommelse, og du ikke helt har så meget CPU, der anvendes hurtigere sprog stadig tiltalende. Men i den virkelige verden, når du bare ønsker at smide nogle program sammen til analysere nogle data, eller du har indsamlet en hel bunke af registreringer for nogle studerende gruppe, og du vil meget hurtigt automatisere sende e-mails én efter én til hver enkelt af dem registranter, er du nødt til at nå til højniveausprog end C så at sige. Noget som PHP eller Python, eller Ruby, eller et halvt dusin andre, der findes disse dage. Men de tre er sandsynligvis den mest trendy lige nu. Og hvad det betyder er, at du kan åbne en tekst editor som gedit eller de fleste noget andet, og så bare begynde skrive kode uden at skulle bekymre om kompilering, uden at skulle virkelig bekymre sig om hukommelse ledelse, holde sig for øje, selvom at en lille sjusk i sidste ende vil komme tilbage at bide dig, hvis datasættet får større eller problemet bliver stort. Men hvad det betyder for os, er følgende. Lad mig gå videre og køre speller fra problem sæt seks. Så dette er min trie-baseret implementering som jeg brugte på den store bord, hvor jeg spillede ikke så godt. Vi kommer tilbage i en uges tid og gense dem, der ikke ender på toppen af stor bestyrelse på vores sidste forelæsning. Men for nu, lad mig gå videre og bare køre min løsning i tekst, og vi vil gøre King James Bible, og her går vi. Så dem er alle af den angiveligt forkert stavede ord ud af King James Bible. Og min implementering tog et halvt sekund i alt. Så ikke alt for dårlige på dette bestemt computer. Men tænk på, hvor meget kode jeg skulle skrive. Tænk hvor meget kode, du skulle skrive. Tænk på, hvor mange timer du har brugt på D-hal eller dit kollegieværelse eller hvor faktisk kodning op denne løsning. Tja, hvis jeg rent faktisk har et højere niveau sprog som PHP, tage til efterretning hvad jeg kan gøre her. Antag først, at det er i stedet din distribution kode. Dette er en fil kaldet stave. Det er til rådighed som en del af nutidens fordeling kode. Og jeg har tænkt mig at vinke min hånd på de fleste af de detaljer, men det er faktisk et interessant eksempel på, hvordan du måske port et sprog som C over til PHP. Jeg bogstaveligt talt åbnet to tekstvinduer, én med min C version af speller.c, og jeg er lige begyndt at oversætte det i min hovedet til PHP og skrive det ud ved hjælp af De nærmeste tilsvarende funktioner. Så nogle af disse ting er anderledes. Vi så sidste gang, at PHP ikke bruger omfatte helt på samme måde. Det bruger kræver typisk, selvom omfatter eksisterer. Definer er lidt anderledes fra # Define i C, men det er hvordan vi laver en konstant. $ Argc det viser sig eksisterer i PHP, så vi har set før. Disse er blot variable, alle der starter med dollartegn. Husk disse er blot en flok flydende punkter. Så lang historie kort, er du velkommen til at bladre gennem dette, hvis nysgerrig, det er næsten en linie-for-linie omdannelse af C-versionen af ​​speller.c i PHP. Og du kan gøre det igen for en halv snes andre sprog. Men hvad er interessant, er dette. Eller hvad er ærligt nedslående er dette. Lad mig gå videre og skrive om dictionary.php, og påstanden om, at jeg er kommer til at gå videre og re-implementere Problemet sæt seks her. Så lad os foreslå først at i dette fil, som vil blive gennemført i PHP, så lad mig åbne mine tags som. Lad mig give mig selv en global variabel, $ størrelse bliver nul. Og jeg har tænkt mig at give selv en hash tabel. Jeg vil bruge en hash tabel for denne ting. Hvordan kan jeg erklære en hash tabel i PHP? Udført. OK. Så åbneparentes luk beslag repræsenterer hvad i PHP, som vi har set? Et array, men et array, der kunne være et associativt array. En associativ array er en datastruktur, der associerer nøgler med værdier. Nu i den enkleste numerisk indekseret array, disse nøgler er hvad? Zero, en, to, tre, right? Old school ting tilbage fra C. Men det kan også være strenge som foo og bar, eller Maxwell, eller af en sådan streng. Så jeg kan udnytte, at på bare et øjeblik. Lad mig gå videre og erklære en funktion som - lad os gøre load () først. Så funktion belastning (). Og PHP er lidt anderledes, idet du bogstaveligt talt skrive funktion, men du skal du ikke skrive en tilbagevenden type. Jeg har tænkt mig at gå videre og sige, at load () funktionen skal tage i argument $ ordbog, bare som C-version gjorde. Jeg gør det fra hukommelsen. Og jeg foreslår, at jeg er kommer til at gøre dette. Jeg simpelthen vil gøre foreach. Jeg har tænkt mig at kalde en funktion kaldet fil (), der passerer i navnet på denne fil, som er variabel $ Dictionary som $ ord. Og så inde i mit for-løkke her, er jeg kommer til at gå videre og gemme i min $ Tabel, $ word får sandt. Udført. Åh, vent. Udført. OK. Det er belastningen () funktion siger i PHP. Nu, hvorfor det virker? Og jeg slags snyd her. Så en, foreach vi så kortvarigt sidste gang. Det betyder bare, at du kan gentage over et array uden at bekymre med i og n og plus plus, og alt dette. Dictionary er selvfølgelig filnavnet, noget som store eller små, de to ordbøger, vi brugte sidste gang. File er en funktion, der åbner op tekst fil, læser det på linje for linje, og hænder, du sikkerhedskopiere et kæmpe udvalg, hver af hvis elementer er en linje fra denne fil. Så det er en kombination af fopen, og fread, og mens løkken, og fclose, og alt dette. Endelig, som ordet betyder blot det er variabel Jeg har tænkt mig at få adgang til på hver iteration i denne sløjfe. Så kort sagt, denne ene liner betyder her åbne den fil, hvis navn er i ordbog, variablen, gentage over det linje for linje, og hver gang du får en linje, opbevares i en variabel kaldet ord, og derefter gøre noget med ord. Hvad ønsker jeg at gøre? Jeg ønsker at sætte ord i min hash tabellen. Tja, jeg kan sætte noget i min hash tabellen ligesom i C hjælp firkantede parenteser. Dette er betegnelsen for min hash tabel. Jeg har tænkt mig at indekset i at hash bord på denne placering. Så ikke beslag nul, ikke beslaget et. Beslag citat citat slut noget, hvad det ord er. Og ligesom du kan have i din hash tabel arbejde trie, du bare butik effektivt en boolesk, implicit eller eksplicit. Udført. Jeg lagre sande værdi. Nu er der et par ting Jeg skære hjørner på her. Teknisk set er der vil være en irriterende ny linje, / n, i slutningen af hver af disse ord. Så jeg skal nok kalde en PHP funktion kaldet chop (), som vil helt bogstaveligt hugge at off. Og jeg faktisk nødt til at gøre en anden ting. Jeg burde nok forøge størrelsen på hver iteration, så jeg holde styr globalt, hvad det er. Og helt ærligt, og det er et af de stupider aspekter af PHP, hvis du er ved hjælp af en global variabel, du har brug for udtrykkeligt at sige, at du er. Så jeg har tænkt mig at faktisk skrive i den globale $ Størrelse, global $ bord, og nu min funktion er afsluttet. Så ikke helt så simpelt som før, men sandsynligvis tog mindre tid end C versionen, måske? OK. Så lad os nu gøre check () funktion. Lad os se, om det i det mindste tog timevis at det tog os i C. Så lad mig gå videre og erklære kontrollere som en funktion. Tager i argument ord, som er komme fra stavekontrol. Og jeg bare at kontrollere, om Følgende variabel isset, tabel beslag strtolower af ord - Lad os afveje alle mine parenteser - derefter vende tilbage sandt. Else - det var virkelig hårdt del af dette program. Else, return false. Udført. Det er check (). Nu, hvorfor det virker? Tja, jeg passerede i et ord, som er en streng. To, jeg tjekker indersiden af ​​hash tabel, der hedder $ bord. Jeg tvinger det til små bogstaver ved at kalde en funktion helt svarer tolower () i C, men det gør hele ordet, ikke et enkelt tegn. Og hvis der er indstillet, med andre ord er der er et værdisæt, med andre ord, hvis det er sandt, så ja, dette er et ord. Fordi jeg sætte det der med belastning (). Og hvis ikke, vil jeg vende tilbage falsk. Nu er de andre er let. Funktion størrelse (), hvordan gør jeg det? Jeg hovedsagelig gøre return $ størrelse. Men jeg teknisk set har brug for at gøre denne irriterende ting. Og faktisk op høre, var jeg skære ene hjørne for mange. Jeg har virkelig brug for at gøre global $ bord. Men når det er sagt, losse). Unload () er forbløffende. Funktion losse (). Hvordan jeg ønsker at gennemføre unload ()? Udført. OK. Så losse (), hukommelse ledelse er helt taget hånd om for dig i noget som PHP og en masse højere niveau sprog. Så det er fantastisk. Ligesom hvorfor fanden vi tilbragte den sidste otte plus uger på C skrivning tilsyneladende virkelig langsom, virkelig tid forbrugende problemer med titusindvis af timer af arbejde under vores bælter? Tja, for én ting, dette kan arbejde fint for små programmer. Det er helt sikkert drønede op min udviklingstid. Men lad os se hvad der sker i den virkelige verden. Lad mig gå ind i denne mappe i et terminalvindue. Der er stavekontrol. Og bemærk som en sidebemærkning, og du kan have stødt på dette i problem sæt seks eller problem sæt syv. Du behøver ikke strengt at ende PHP-filer med. php. Hvis du sætter en linje som den første i helt i top, det er en særlig linje af syntaks, der væsentligt betyder finde det program, der hedder PHP og bruge det til fortolke denne fil. Så nu ingen rigtig ved, at Jeg kører en PHP-program. Jeg kan køre det bare som om det blev noget samlet i C. Men her er de ting. Faktisk, lad os gøre det igen. Dropbox/pset6 /. Der er stavekontrol. OK, 0.44 sekunder. Det fik hurtigere denne gang. Lad os nu gå ind i PHP-version. Nice touch. Men tænk bare hvor meget tid Jeg gemte på kontortid. OK. Så 3,59 sekund, som rent faktisk lyder ikke præcis enten. Men det er fordi lang historie kort, når du udskriver en enorm mængde ting til skærmen, at selv forsinker tingene ned. Hvad det virkelig tog CPU'en i Apparatet var 3,59 sekund, i kontrast til C, som tog 0,44 sekunder mest nylig. Det er virkelig en rækkefølge størrelsesorden anderledes. Så hvor er denne pris kommer fra? Hvorfor er det så meget langsommere? Hvorfor PHP udføre så dårligt? Danielle? PUBLIKUM: Du har ikke rigtig bruge en hash tabel. DAVID MALAN: Jeg har ikke rigtig bruge en hash tabel. Så jeg slags gjorde. Så det er et associativt array. Mest sandsynligt, hvis folk på PHP er rigtig smart, de brugte under hætte en egentlig hash tabel implementeret i noget lignende C eller C + +. Men. Ja. PUBLIKUM: [uhørligt]. DAVID MALAN: Ja. Så hver af de funktioner, jeg skrev nu - faktisk kan man sige, at når mere en lidt højere? PUBLIKUM: Hver af de funktioner, som du omfattede har en meget mere komplet kapacitet end - DAVID MALAN: Så det er meget sandt. Der er meget mere overhead, at vi er ikke rigtig at se ved kun at fokusere på dictionary.php, som jeg lige har skrevet. Derimod er der en hel tolk går i baggrunden. Faktisk, når jeg kørte dette program, det kørte ikke udarbejdet nuller og ettaller designet til min Intel CPU. Snarere var det kører linje for linje PHP-kode, der ser ud præcis ligesom vi har skrevet det. Og så når du bruger en fortolket sprog, du faktisk betaler denne pris. Det kommer til at tage lidt tid til at læse din fil top til bund, venstre til højre, og derefter udføre hver linje igen og igen. Nu i virkeligheden, især på internettet, du kan faktisk fremskynde denne proces ved hjælp af caching resultaterne af PHP-kode bliver fortolket. Og det giver mening på nettet, fordi hvis du ikke har en bruger som mig her, men 1.000 eller 10.000 brugere, så måske for første gang filen er tilgås det er langsom, men derefter Det er meget hurtigere. Men også dette, igen, er en afvejning. Og for noget som en forsknings-data indstillet, eller endda noget stort lignende dette, dine brugere vil i sidste ende begynder at føle, at afmatning. Så kort sagt, fortolket sprog meget på mode, meget populær, og helt ærligt er formentlig de sprog, du skal nå til ved løsning af problemer efter CS50. Men indse, hvor meget du virkelig tager for givet under hætten virkelig de sidste adskillige uger i hash tabeller og træer, og forsøger, som anvendes i sidste ende faktisk gennemføre ting som åbneparentes, firkantet beslag, som vi nu kan taknemmeligt tager for givet. Så lad os tage et kig nu i denne web sammenhæng. Og jeg nævnte sidste gang, at der er en flok superglobale i PHP, der er ikke rigtig relevant på kommandolinjen. De er mere relevant i forbindelse for at bruge PHP i en web-sammenhæng. Så kører PHP på en webserver, så at generere ting som HTML. Og vi kiggede på $ _GET og $ _POST, og det er her, automatisk brugernes input ender simpelthen, hvis du indsende en dannes til en fil der ender på. php på en web server som apparatet. Men lad os se kort på $ _COOKIE Og $ _SESSION. I lægmandssprog, hvad er en cookie som du forstår det i forbindelse med ved hjælp af internettet? PUBLIKUM: fil på computeren. DAVID MALAN: Ja. Det er en fil på brugerens computer plantet ved hvad hjemmesiden du tilfældigvis til at besøge. Så når du går til Facebook, når du går til bankofamerica.com, når du går til google.com, når du går til næsten enhver hjemmeside i verden i disse dage, herunder cs50.net er en cookie plantet på din computer, som er enten en værdi gemt i RAM i din computer i browserens hukommelse, eller undertiden faktisk gemmes en fil på din harddisk. Og hvad er typisk gemt i denne fil er ikke dit brugernavn, ikke din adgangskode, typisk ikke noget følsom medmindre hjemmesiden ikke er så godt med deres sikkerhed, men snarere det er en stor unik identifikation blandt andre ting. Det er et stort tilfældigt tal plantet på din computer, men du kan tænke på som en slags virtuel hånd stempel gerne fra en klub eller nogle forlystelsespark, der giver personalet, ejerne af det tjeneste, at huske, hvem du er. Så hvis store tilfældige tal er som 12345678, selv om det er naturligvis ikke alt for tilfældig, så tænk på, at da hånd stempel, at når du besøger facebook.com for første gang, de stemple dette nummer på din hånd. Og så fordi du taler HTTP, du være en browser, og fordi Facebook naturligvis taler det samme som en web server, siger HTTP, at når som helst du efterfølgende besøg facebook.com, uanset om det er en anden senere, en time senere, selv den næste dag, så længe du ikke har eksplicit logget ud, som effektivt er som at vaske dine hænder. HTTP siger, at du skal præsentere din hånd stempel, hver gang du vende tilbage til denne hjemmeside. Hvad Facebook så gør, er at de se på den hånd stempel og de siger, åh, 123456789. Jeg ved ikke, ved første øjekast, at denne er David Malan i Cambridge, Massachusetts, men de kan kontrollere deres database og sige, åh, den person, på hvis computer vi plantede 123456789 er David Malan fra Cambridge, Massachusetts. Lad os vise, at brugeren så hans profil side eller hans News Feed. Men der er et problem her, hvis dette er, hvordan internettet faktisk virker. Lad os tage et kig på et hurtigt eksempel. Lad os faktisk gå til at sige facebook.com. Men før vi kunne gå der, så lad mig gå videre og åbne op Chromes Inspector hernede. Lad mig se på fanen Netværk. Og lad os nu gå videre og skrive i https://facebook.com. Og jeg gør det, så vi ikke ser alle disse omdirigeringer og affald tid på at kigge igennem dem. Lad mig slå enter. Ok. Vi ser en hel masse af anmodninger. Der kommer Facebook. Der er en hel masse filer. Og her, pr min omtale af latenstid sidste gang, det er en masse af HTTP-anmodninger. Men den første er sandsynligvis de mest interessante. Så lad os rulle ned her, og Jeg zoome ind på et sekund. Dette kommer til at være slags en rod, men lad os se. Facebook er at sende os en hel masse ting. Men whoa, interessant. De er plantning ikke én, men fire håndstempler på min hånd her. Set-cookie, Set-cookie, set-cookie, set-cookie. Og der er et par funktioner her. Alle af dem nævne nogle slags udløb. Og det ser ud Facebook håber at huske mig indtil 2015. Så det er formentlig den tid, som Jeg skal logge ud, eller de vil bare automatisk antage jeg er kommer ikke tilbage. Så det er faktisk en anstændig mængde tid. Og der er nogle andre tingene foregår her. Denne cookie synes at være tvunget slettet ved at sige den udløb i 1970 før cookies eksisterede. Så browseren er bare at antage OK, det er ligesom vaske hænder stempel. Men nu da min browser gør en efterfølgende anmodning - lad mig gå videre og gøre det igen og genindlæse. Lad mig nu rulle tilbage til top anmodning og gå ned her, anmode overskrifter. Bemærke dette. Så nu er jeg under ikke respons overskrifter, men bemærker det siger anmodning overskrifter. Og mærke til, at min browser som en del af sin anmodning efter rammer reload har sendes mindst følgende oplysninger. Ikke set-cookie, men cookie. Så dette er den linje, HTTP-headeren, så til at tale, hvor min browser er sortering , uden at jeg ved det præsentere min hånd for Facebooks inspektion. Så disse cookies kan være bruges så til hvad? At huske, hvem du er, eller huske, hvordan mange gange du har været der, eller rigtig noget. Så her er counter.php. Og lad mig zoome ind på skrifttypen. Og hver gang jeg genindlæse denne side, bemærk det er at huske, hvor mange gange Jeg har været der. Tja, det er ikke alt, imponerende. Lad os bare lukke denne fane og lad os nu gå tilbage til http://localhost/counter.php. Åh, det er interessant. Det er stadig huskes, selv selvom jeg lukkede fanen. Og helt ærligt, hvis jeg lukker browseren, hvis det gennemføres på den rigtige måde, jeg kunne stadig huske, at denne bruger er som han eller hun var den første gang, og kun én gang jeg går ind i Chromes menuen, som herovre er her, og gå til Historie, og klik Slet browserdata, som nogle af jer har måske i fortid, først derefter vil dine cookies faktisk slettes under web udvikling. Så hvis vi går - Lad os tæt op gedit her. Og hvis vi går nu til denne fil. Lad mig gå ind i vores vhosts / localhost / offentligheden, og lad mig gøre counter.php. Bemærk at dette er en smuk simpelt program. Det er en temmelig simpel hjemmeside. Så toppen af ​​filen er kun bemærkninger. Men her er en ny linje, som du kan allerede har set i p-sæt syv, session_start (). Dette er en linje af PHP kode som hovedsagelig fortæller webserveren, gør Sørg for at stemple hænder og gøre Sørg for at tjekke hånd frimærker. Det er alt, denne linje gør, og det gør alt af denne proces for os. Så opdager jeg har bare misforstået to grene her. Hvis tælleren nøgle indersiden af ​​dette særlige globale kaldet variabel $ _SESSION Er indstillet - med andre ord, hvis der er en vis værdi er der - Lad os få det og gemme det i en lokal variabel kaldet $ tæller. Else, lad os tildele $ counter standardværdien på 0. Nu her er et aspekt af PHP, der er både en velsignelse og en forbandelse. PHP er lidt sjusket. Så mens det i C, hvad der ville omfanget af tælleren har været enten her eller her? Det ville have været begrænset til disse krøllede parenteser. Gæt hvad? I PHP, eksisterer det selv uden for de krøllede parenteser, her, og her, og her, og her, og selv dernede. Så jeg siger dette er en velsignelse i den forstand, at du ikke behøver at tænke så hårdt, som vi gjorde uger siden. Men det er også lidt af en forbandelse, idet uanset hvor du bruger en variabel i PHP, i det mindste i et program som dette, Det er globalt tilgængelig for bedre eller værre. Så du er nødt til at huske på nu, dine variabler kan ikke være udefineret. Du har måske defineret dem andetsteds. Men hvad skal jeg gøre i sidste ende? Jeg har tænkt mig at gemme inde i, at den globale variabel som en værdi af counter nøgle resultatet af laver tæller plus 1. Så det er bare det aritmetiske der gør optælling af denne tæller. Og det faktum, at jeg lagring, at værdi tilbage her er midler til at væsentlige opdatere databasen til Husk at brugeren 123456789 har været her to gange. Og når jeg gør det igen næste gang jeg genindlæse siden, det kommer til at kontrollere min hånd stempel og sige, åh, bruger 123456789 har nu været her tre gange. Og så hvad PHP og lignende sprog gør for os, er, at de er at regne ud af, hvordan og hvor og hvor længe at lagre værdier i denne særlige superglobal. Og dette superglobal næste gang jeg besøge siden er en slags magisk præ-befolket, fyldt med værdier, var der sidste gang, du har besøgt, om det var en anden siden, en uge siden, eller i 2013, og vi taler nu omkring 2015. PHP og webserveren tage sig af alt dette for dig. PUBLIKUM: [uhørligt]. DAVID MALAN: Variabler i PHP er væsentlige altid global, medmindre du erklære dem inde i en funktion, og så er de lokale for kun funktionen. Men fordi jeg har ikke skrevet nogen funktioner, de er nu effektivt global gennem hele min fil her. PUBLIKUM: Er der en måde at gøre dem lokalt? DAVID MALAN: Er der nogen måde at gøre dem lokale? Kun ved at pakke dem ind i funktioner. Hvilket i den nyeste version af PHP kan du gøre dette med en anonym funktion. Men mere om det i rammerne af JavaScript. Men det korte svar er nej. En længere er svaret ja. Nice. God quiz-spørgsmål. Ok. Så endelig selve siden er faktisk ret simpelt. Bemærk, at når jeg afslutter PHP mode, tilbagekaldelse at alle disse ting ned nedenfor er bare at få spytte ud rå til browseren. Hvilket er fint, fordi jeg ønsker at sende brugeren nogle HTML, men jeg ønsker til dynamisk opdatere denne HTML. Og en måde jeg kan gøre dette på er at sortere meget hurtigt falde tilbage ind i PHP tilstand, brug åbneparentes spørgsmålstegn lighedstegnet, og derefter sende værdien af tælleren. Eller hvis det ser lidt kryptisk, dette lighedstegnet er faktisk bare nogle syntaktisk sukker for dette printf ($ counter). Men helt ærligt, det er bare lidt grim og lidt irriterende at skrive. Så PHP meget pænt tilbyder denne funktion hvor du kan bare sige det mere kortfattet på samme måde. Så hvad der foregår nedenunder hætten? Lad os hurtigt se på nettet Fanen her for counter.php. Og lad mig gå videre og først lad os rydde dine cookies. Lad os klare browserdata siden begyndelsen af ​​tid. Lad os nu gå tilbage herovre. Lad os nu genindlæse siden. Og jeg er tilbage på nul. Fordi min hånd stempel er blevet vasket, Jeg får nu en ny cookie. Faktisk, hvis jeg ser på fanebladet netværk og se på respons overskrifter, varsel at apparatet sender mig en cookie, hvis navn er noget vilkårligt, men slags rimelighed, PHPSESSID. Og det er at sende mig dette virkelig store tilfældige tal. Det er ikke helt et nummer. Det er ikke helt hexadecimal. Det er en slags alfanumerisk streng, men formodentlig er det tilfældigt. Og det er den hånd stempel således at tale, at jeg henviser til. I mellemtiden, hvis jeg klikker reload og derefter ser på denne anden linje for min anden anmodning, meddelelse nu, at min anmodning overskrifter omfatter PHPSESSID lig dette, ikke set-cookie, men bare cookie. Og det er min browser præsentation af min hånd stempel. Så nu som en teaser, og vi vil tale mere om dette i en uge eller deromkring, men På hvilken måde gør det gøre dig sårbare, din Facebook-konto sårbare, og andre sådanne tegner sårbar? PUBLIKUM: Hvis nogen har din cookie. DAVID MALAN: Ja, hvis nogen har din cookie. Jeg mener virkelig, ligesom nogle af jer måske har prøvet på ligesom en klub eller en forlystelsespark, hvis du prøver noget som denne til at kopiere stempel, omend bagud på en anden persons hånd, og så han eller hun præsenterer det som deres egne, hvis den faktisk ser identiske, 123456789, så web server er tilsyneladende bare at tillid til, at brugeren er dig. Og det er faktisk en fundamental trussel helst du bruger cookies fordi hvis nogen bare spoofer så at taler din cookie, tal ud af, hvad det er enten ved virkelig at kopiere det ved at se på din computer og være ligesom, OK. Davids cookie er JJ3JIK og så videre, og så er smart nok til at vide hvordan slags manuelt at sende, at cookie fra en browser eller fra en program, de skriver, de kunne helt logge ind i en hjemmeside, som du. Det er ikke så svært at foregive at være en anden, medmindre vi revidere p-sæt to, der indførte hvad? PUBLIKUM: Kryptografi. DAVID MALAN: Lidt bit kryptering. Simpel kryptografi, i det mindste i standard udgave, men krypto alligevel. mindre. Så det viser sig, hvis du kryptere alle disse overskrifter ved hjælp af noget, som du måske nu kender mere familiært som SSL, secure socket layer, eller https:// URL'er, så alle disse ting vi har været kigger på er faktisk krypteret, hvilket betyder, at det er ligesom du kan ikke læse hånd stempel. Kun facebook.com kan, eller google.com, eller i dette tilfælde, kan apparatet læse, at hånd stempel. Tragisk selv om, og igen, det er alt for passende med NSA ting for sent, selv SSL er skør. Og det er faktisk ikke så svært at selv knække denne kryptering. Ikke så meget ved krakning af kryptering, men ved at narre browser til at dekryptere data for tidligt. Men igen, vil vi drille dig med det inden længe. For nu, bare være bange. Det er tragisk slags sandt. Ok. Så hvor kommer denne nu forlade os? Nå, lad os gøre det. Lad os gå videre og tage en hurtig teaser før vi tager en pause. Og jeg tror, ​​vi vil dvæle lidt længere i dag, men vi kommer til at dykke ned i noget helt nyt og sexet, som vil skærpe din appetit til endnu mere. Så det er teaser. Så SQL, begyndte vi at tale om nogensinde så kortvarigt sidste gang. Du vil virkelig få dine hænder beskidte med noget af det i p-sæt syv. Og i lægmandssprog, hvad betyder SQL - S-Q-L - gøre for dig? Hvad er det? Ja. PUBLIKUM: lader dig få adgang til data. DAVID MALAN: Ja. Det lader dig få adgang til data i en database. Structured Query Language. Og det er hovedsagelig en programmeringssprog. Der er funktioner i det at Vi vil ikke engang bruge i klassen. Men du effektivt kan definere funktioner. De kaldes gemt procedurer i SQL. Men vi vil holde det forholdsvis enkel og bare bruge det til nogle grundlæggende operationer ligesom udvælgelse af data, indsætte data, opdatering af data, og sletning af data. Og du kan virkelig tænke på en database, ligesom en SQL-database, som bare være Microsoft Excel. Fordi SQL refererer til en relationel database, hvor forhold betyder bare tabeller. Rækker og kolonner. Så alt du kan sætte i et regneark som dette eller Google Docs, du kan sætte ind i en SQL-database ved at erklære en tabel. Nu, hvordan kan du faktisk få adgang til disse oplysninger? Nå, med kommandoer eller spørgsmål som dette. SELECT, INSERT, UPDATE og DELETE. Og for det meste, der er fire kun ingredienser, du bliver nødt til at gøre noget helt kraftfuldt i problemet sæt syv. Nu tilbage i dag, ville du faktisk interagere med en database på en sort og hvid terminal vindue på en blinkende prompt som dette. Og databasen, vi kører på Apparatet kaldes MySQL, der er gratis og open source-database motor. Hvis du Google og læse Wikipedia artikel, vil du vide, at navnet er en smule overgang for nogle versioner af Linux. Maria database er faktisk en gaffel så at sige af MySQL. Lang historie kort, Oracle købte MySQL. Oracle er en stor virksomhed. Folk har været bekymret for, at det ville ikke længere være helt så open source, så dette er blot en kopi af MySQL der er stadig gratis, stadig open source, og installeret i Fedora Linux som standard. Men det er sådan en smerte i hals til at stifte bekendtskab med en database på denne måde. Så vi medtage i CS50 apparatet et gratis open source værktøj kaldet phpMyAdmin. Bare en tilfældighed, at det er skrevet i PHP. Der er ingen grundlæggende behov for PHP her. Men dette er kun en web-baseret værktøj, der vi downloades gratis, er installeret i apparatet, der tillader os at have en grafisk brugergrænseflade, som at undersøge p-sæt syv database som at oprette nye databaser, sige for dit eget projekt, hvis du vil lignende, og i sidste ende skabe dynamiske websites som CS50 Finance der giver dig mulighed for at forespørge data og opdatere data dynamisk. Du er ikke nødt til at bruge bare en simpel tekst-fil eller CSV. Du kan faktisk bruge en smart database program, så du kan udføre mere avancerede søgninger end bare at læse gennem alt lineært. Så for eksempel, det er det, vi giver dig ud af boksen for p-sæt syv. Dette er et bord med tilsyneladende mindst tre søjler, hvoraf den ene er brugernavn, hvoraf den ene er hash og den anden er-id. Men det interessante ting, og bare for at drille en tanke her, brugernavn er formentlig allerede enestående, right? Jeg mener, de fleste helst hjemmeside, hvis du har et brugernavn, der kan ikke være to Caesars. Der kan ikke være to Malans. Der kan ikke være to jharvards. Dens unikke. Ellers kan de ikke vide, hvilke jharvard det faktisk er. Så hvad kunne være motivationen for også at have en tredje kolonne til venstre der hedder id, der ligner en nummer, der er ligeledes unik? Det føles lidt overflødig til mig ved første øjekast. Hvorfor kunne det være overbevisende at have ikke kun unikke brugernavne, men også unikke numre? PUBLIKUM: De kunne have den samme adgangskode. DAVID MALAN: Folk kan have den samme adgangskode, sikker. Det kunne absolut ske. Men hvis de har denne unikke brugernavn, jeg vil hævde, at der ikke rigtig sag, fordi hvis de skriver i deres brugernavn, jeg behøver kun at kontrollere deres adgangskode, deres hash deraf. Hvorfor ellers? PUBLIKUM: Hurtigere søgning. DAVID MALAN: Hurtigere søgning. Hvorfor? PUBLIKUM: ID er blot én. DAVID MALAN: ID er blot ét tegn, eller for at være mere præcis, det er et tal, så det er nok 32 bit eller noget lignende. Mens brugernavn, tilsyneladende Jason Hirschhorn er deroppe er en slags latterligt lang, og det kommer til at tage mig en masse mere tid til snor sammenligne H-I-R-S-C-H-H-O-R-N, og måske a / 0 eller sådan noget, for at se op Jason, i modsætning til blot siger give mig bruger nummer to. Det er 32 bit. Det er en enkelt INT der du nødt til at sammenligne. Og ja, det er præcis derfor, databaser tendens til at tildele entydige id'er til rækker i dem. Nu, hvad andre datatyper er der foruden INT og tilsyneladende strings som denne? Nå, for at være mere korrekt, SQL databaser, ligesom MySQL, har CHAR felter. Og fjeldørred lidt misvisende er ikke en enkelt CHAR. En char felt i en MySQL-database er et eller flere tegn, men det er en fast antal tegn. Så for eksempel, hvis jeg går over til phpMyAdmin, som du måske allerede har, eller snart vil et problem sæt syv, og jeg går til min database, og bare for sjov, Lad os oprette en ny tabel kaldet teste med blot to kolonner. Jeg vil klik derefter på Go. Og det vil blive nogenlunde fortrolig, især da du pille rundt på egen hånd. Her kunne jeg skrive id for at oprette en ny tabel af typen INT. Men her jeg kan skrive brugernavn til genskabe den tidligere tabel. Og bemærk jeg har en hel masse af typer at vælge imellem. Og det er også grunden til phpMyAdmin er lidt rart. Det er slags selv-undervisning i, at du kan bare form for punkt, og klik, og se på dropdown menuer, og udlede der hvilke beføjelser SQL giver dig. Og ja, hvis jeg vælger CHAR, jeg så nødt til at angive længden, eller hvordan mange værdier, hvor mange tegn. Så meget fælles værdier er ting som 255, men det er en lidt lang. Almindeligvis er otte om et brugernavn. Men det er lidt lille i disse dage. Så dette er en design beslutning. Er det 8 tegn max, 32, 255, 1000? Det er virkelig op til dig. Men en CHAR felt er et fast antal. Så vælg alt for få og du er slags skruet hvis du ønsker en længere brugernavn. Vælg for mange og hvad er downside? PUBLIKUM: [uhørligt]. DAVID MALAN: det er uøkonomisk. Ligesom i C, hvis du har en større luns af hukommelse end du har brug for, er du bare spilder tid og spild af plads. Så som et alternativ, findes der VARCHAR, som løser dette problem ved behandling af længde ikke som en fast længde, men som en maksimal længde, og ved hjælp af en variabelt antal tegn, som derefter tendens til kun at bruge så mange tegn, som du faktisk har brug for. Det lyder perfekt. Hvorfor vi ikke slippe af med Tegndatatype så? Hvad kunne være bagsiden af ​​medaljen hjælp VARCHARs, som lyder ligesom det er en dejlig sejr? Ja? PUBLIKUM: [uhørligt]. DAVID MALAN: OK, godt. Så hvis alle dine data er den samme længde, hvad er den bekymring? PUBLIKUM: Fordi du spilder data ved at fortælle dem alle. DAVID MALAN: Så hvis alle dine data samme længde, vil jeg dog argumentere at angive en maksimal længde på VARCHAR er ikke anderledes end at angive et fast længde på CHAR hvis du ved, at antallet i forvejen. Men der er faktisk, og jeg vil slags uddrag fra dette svar virkeligheden at der stadig er et max, der kunne være irriterende, især hvis du støder på en persons navn, der er usædvanlig lang, at du ikke gjorde det forudse. Og det er også en lidt mindre effektiv til rent faktisk at søge på VARCHARs som modsætning til at søge tegn, især for lange borde, der har masser og masser af data. Så her også, tematisk er igen ingen indlysende valg. Så bare for at give dig en følelse af andre datatyper, der kunne være af interesse enten til p-sat syv eller fremtiden, er der INT. Der er BIGINT, som er ligesom lang lang. Det har tendens til at være 64 bits. Der er DECIMAL, som du kan se i problemet sæt, som er en meget renere svar på de problemer, vi stødt med float og flydende peger upræcise. Og så er der DATETIME. Der er bogstaveligt talt en datatype, der har at ligne et år, en måned, en dag, og en time, minut og sekund. Men SQL databaser har også ting, vi ringer indekser. Og et indeks er noget, du angive, når du opretter tabellen til at foretage søgninger og andre operationer mere effektiv. Konkret er der noget, der hedder det primært indeks, som du kunne erklære som følger. Vi gjorde det for dig med den brugere bord vi giver dig. Men læg mærke hvis jeg manuelt genskabe brugerne tabellen her give det et navn brugere. Jeg allerede angivne id. Jeg specificeret INT. Jeg angivne brugernavn med maksimalt 32 tegn. Men hvis vi holder rulle i dette forholdsvis bredt vindue, bekendtgørelse er der en masse andre ting, jeg kan angive. One, kan jeg angive attributter ligesom, ved du hvad, det INT burde være usigneret. Jeg ønsker ikke negative tal, så lad os gøre det usigneret. Null er ikke relevant her, fordi Jeg ønsker alle brugere have et unikt nummer. Jeg ønsker ikke at være nul. Men det er interessant. Jeg kan angive, at id er enten primære nøgle i denne database, eller det er unikke, eller det er indekseret, eller fuld tekst. Så for nutidens formål, lang historie kort, PRIMARY betyder, at dette skal være både konceptuelt og teknisk det felt, vi bruger til entydigt identificere brugere. Så når vi ser op brugere, dette er en slags af et løfte om at slå dem op for det meste af den unikke identifikator. Og databasen vil sikre, at hvis du har en bruger nummer 3, kan du ikke fysisk indsætte en anden bruger med det samme nummer 3. Databasen vil bare nægte at gemme dine ændringer. Hvilket er en god ting, fordi du kan beskytte dig mod dig selv. selv Alternativt for brugernavn. Så den anden række, tilbagekaldelse, er brugernavnet felt. Så den anden række her er brugernavn, som vi gjorde på det yderste venstre der. Så hvad ellers kan jeg ønsker at angive? Jeg er ikke tilladt, i henhold til SQL, at angive to primære nøgler. du kan angive en fælles nøgle, hvor du se på begge felter, men de kan ikke enkeltvis være primære nøgler. Så det er udelukket. Så der kunne jeg vil vælge? Nå, UNIQUE ligner i ånden til en primær nøgle, hvor du angiver dette område skal være unikke, men det er ikke kommer til at være den ene Jeg bruger hele tiden. Og vi kommer ikke til at bruge denne ene alle den tid, hvad grunden til igen? Det er langsommere potentielt hvis det er en lang brugernavn. Det er bare spild af tid. INDEX, i mellemtiden, præciserer, at det er ikke kommer til at være unikke, men jeg vil gerne dig at arbejde din magi under hætte for at gøre det hurtigere for mig at søg på dette område. Så dette er sandsynligvis ikke relevant her. For brugernavn, ville jeg argumentere for, at UNIQUE er et godt svar. Men formoder, at vi gjort brugerne mere interessant end blot brugernavne, hashes, og ID-numre. Hvad hvis vi gav folk fulde navne? Hvad hvis vi gav dem adresser og andre data om dem? Tja, hvis du angiver, at en kolonne i et database er indekseret, der betyder, at MySQL eller Oracle, eller hvad database du bruger, bør arbejde sin magi og bruge en form for fancy data struktur som et træ eller en trie, eller en hash tabel, eller noget til at garantere at når du søger efter data ved hjælp af vælger på det pågældende område - ligesom vise mig alle, at bor på Oxford Street. En forespørgsel sådan. Hvis du har angivet på forhånd, at du vil have et indeks på dette område, at søgninger vil være meget, meget hurtigere. Hvis du ikke angiver et indeks, den bedste du kan gøre, er en lineær søgning, hvis det er ikke sorteret. Men hvis du angiver INDEX, smart mennesker, der gjorde databasen - folk som dig, der nu kender træer og lande og hash-tabeller - vil automatisk bygge sådan en data- struktur i RAM for at sikre, at disse søgninger er meget hurtigere. FULLTEXT mellemtiden er ens i ånden, men tillader dig at gøre wildcard søgninger, ligesom vise mig alle, at bor på gader, der begynder med bogstavet O, uanset grunden. Du kan gøre med jokertegn sådan. Eller mere overbevisende ting som show mig alle, der har ordet - vise mig alle, hvis navn begynder med et bestemt bogstav. Du kan søge efter nøgleord på denne måde. Ok. Så, design muligheder der potentielt. Der er andre, som jeg vil bølge mine hænder på. Det viser sig, at du kan have forskellige opbevaring motorer. Og det er mere mystisk end vi har brug i hvert fald for problemet sæt syv. Som standard er du fyre hjælp noget, der hedder InnoDB. Du vil se omtale af dette sted i phpMyAdmin interface mest sandsynlige. Men ved, at der er andre design beslutninger, som er af potentiel interesse kommer afgangsprojekter hvis du gør noget web-baseret. Men lad os gøre det. Lad os gå videre og sætte dette på skærmen som en teaser til en historie involverer dig, en værelseskammerat, og et glas mælk. Lad os tage en to minutters eller så pause her. Og hvis du kan holde sig rundt, så lad os komme tilbage, se lidt mere på SQL, og så en smule af JavaScript med p-sæt otte i tankerne. Ok. Så lad os få dig til at tænke sig om en hjørne sag, der kan meget nemt opstå i forbindelse med anvendelse af en database eller helt ærligt, selv ved brug af virkelige verden tingene ligesom pengeautomater for at få penge. Så her er et køleskab. Antag, at du har fået en alt for i din kollegieværelset eller dit hus. Og du har en værelseskammerat, og begge af du virkelig gerne mælk for eksempel. Så du kommer hjem fra klassen en dag. Han eller hun er endnu ikke tilbage. Du åbner køleskabet. Du ønsker virkelig et stort glas mælk. Der er ingen mælk. Så hvad gør du? Du lukker køleskabet. Du fat i dine nøgler. Du går ud til pladsen. Og du får i linje på CVS på dem self checkout ting, som altid tage længere tid end egentlig have kasserere. Alligevel. Så, i mellemtiden, dot dot dot, din roommate kommer hjem, og han eller hun ligeledes har hang for nogle mælk. Så han eller hun åbner køleskabet, ser ud indvendigt, og åh, pokkers. Ingen mælk. Så han eller hun hoveder ud, sker for at gå til den anden CVS, som kun var en blok væk eller anden grund, og han eller hun får i kø for at købe nogle mælk. I mellemtiden, du kommer hjem, han eller hun kommer hjem, og hvad gør du i sidste ende har? Dobbelt så meget mælk. Men du kan ikke rigtig lide mælk, meget. Så nu har du så meget mælk, at nu en af ​​dem er bare at gå sur til sidst. Så dette er en virkelig dårlig problem. Right? Så hvad er der sket? Så fundamentalt, det er lidt af en latterlig eksempel. Men under hætten, hvad vi har haft ske her er både du tjekket tilstanden af ​​nogle stykke hukommelse, køleskabet. Begge du tjekket staten nogle variabel. Du begge trak en konklusion at du derefter har handlet på. Men desværre, mens din værelseskammerat var i butikken, staten at variabel ændret sig, han eller hun kom tilbage og nu ønsker at ændre tilstanden, men det er allerede blevet ændret på ham eller hende. Og selvfølgelig ville han eller hun ikke har gået til butikken, hvis de vidste, at du allerede var undervejs. Så i den virkelige verden, hvordan kunne du undgå dette problem, forudsat du har et køleskab, du har en værelseskammerat, og du faktisk kan lide mælk? PUBLIKUM: Kommunikation. DAVID MALAN: Kommunikation. OK. Men hvordan kan du kommunikere? PUBLIKUM: Efterlad en note. DAVID MALAN: Efterlad en note, right? Sørg altid for en bemærkning, fans af showet. Okay, så altid forlade en note, eller sætte virkelig som en hængelås eller noget på køleskabet, der holder din værelseskammerat inspicere tilstanden af denne variabel. Nu, hvorfor kan dette være relevant for Problemet sæt syv eller pengeautomater. Nå, forestille sig en verden i en ATM hvor du måske være i stand til at gå op til en ATM maskine her, og en anden ATM her. Og det sker ret ofte. Og formoder, du havde to ATM-kort, hvilket er muligt at opnå. Og du logger ind begge maskiner effektivt samtidig forhåbentlig mens ingen kigger. Og så skriver i din PIN-kode nogenlunde samtidigt. Og så skal du gøre en balance forespørgsel for at se, hvor mange penge du har. Og lad os sige du har $ 100 tilbage på din konto. Så det væsentlige samtidigt, du sige en, nul, nul, skal du indtaste. Og du forhåbentlig komme tilbage nogle penge. Men hvor mange penge kan du få tilbage? Nu computere i slutningen af ​​dagen, især hvis de taler til servere, ikke nødvendigvis gør tingene i den rækkefølge, der er forventet. Så formoder, hvad der sker på grund af uanset netværk hastighed spørgsmål der er, eller CPU problemer der er, eller noget lignende, antage, at første ATM kontrollerer din balance og ser, åh, denne person har 100 dollars. Men derefter bliver distraheret fordi måske en backup der sker, og så det er langsommere. Eller måske, mens du kontrollerer, netværket forbindelse fik lidt langsommere, fordi dette sker bare. De er fysiske enheder. Så i mellemtiden, den anden ATM stiller det samme spørgsmål. Hvor mange penge David har? $ 100 er svaret. Men fordi den første ATM endnu ikke sendt beskeden trække $ 100, både Pengeautomater har inspiceret bankens hvælving, se der er $ 100 der, og nu begge maskiner potentielt er kommer til at spytte ud et svar. Nu, dette er godt for dig i en vis forstand hvis hvad banken gør i sidste ende er ændre beløbet til minus 100 af indstille den variable svarende til din bankkonto lig med 0, i modsætning til at gøre minus 100. Nu i værste fald for banken - eller i den bedst for banken, i mellemtiden, de giver dig $ 200, og din bankkonto viser nu negativ $ 100, som virkelig ikke gavne dig på alle. Men pointen er, at dette løb betingelse for to bofæller få mælk eller to pengeautomater forsøger at få kontanter og ændre tilstanden af ​​en hvælving samtidig eksisterer nogen gang du har en database. Nu i problemet sæt syv, dette emne opstår i den forstand, at hvis du køber en andel af Facebook bestand, og derefter for eksempel kan du købe en anden andel af Facebook lager, skal du gøre en beslutning som programmør. For at afgøre, hvordan du opdaterer database, odds er du kommer til at har én række for den pågældende bestand, og det er en måde at gennemføre den. Og du kommer til at have en andel af FB, som er deres børssymbol for dette brugernavn, eller denne bruger Id, den entydige identifikator. Men den samme historie kan ske her. Hvis du gør en SELECT i SQL, som du vil se i problemet sæt syv, når du ser, Åh, David har én aktieklasse på Facebook lager. Lad mig nu ændre dette at være to aktier fordi han ønsker at købe en anden kvote. Men formoder David havde faktisk to browservinduer åbne, eller formoder, at Det er en fælles konto med to ægtefæller, og begge forsøger at udføre den samme operation, der også, det potentiale for en beslutning om at være foretaget på grundlag af den tidligere verdens tilstand - kontoen har én aktie - og både mennesker, eller begge servere, nu prøv at sige forøge det til to aktier. Men i dette tilfælde, du måske har opkrævet mig penge for begge aktier, men inkrementeres netop én gang. Så kort sagt, det grundlæggende problem her, som med vittighed om at forlade en Bemærk, eller sætte en hængelås på det, er hvis to mennesker, eller to tråde - tænke tilbage på bunden - kan inspicere nogle variable og derefter forsøge at ændre denne variabel, men disse to ting ikke ske på samme tid, men kan blive afbrudt af andre ting, der sker, data kan komme ind i en meget underlig tilstand. Og du kan drage fordel, eller du kan lide i den forstand eksempel penge. Så i problem sæt syv, giver vi dig denne linje kode, som længe historie kort, løser dette problem i MySQL. Denne meget lang instruktion, der ikke endda være på en enkelt linje på skærm her sikrer, at din operation er, hvad der kaldes atom. Det hele sker på én gang, eller det sker ikke på alle. Denne meget lange sætning kan ikke få afbrudt delvist. Og hvad det gør, er bogstaveligt talt hvad den siger. Sæt ind i nogle tabel følgende tre felter disse specifikke værdier, men om duplikeret nøgle, ikke gør en indsats. Gør en opdatering. Så det er ligesom at gøre en SELECT og en INSERT så at sige på samme tid. Og hvad er den nøgle, der er nok der henvises til her? Det viser sig, og du vil se dette i problem sæt syv spec, fordi vi har erklæret, at der er en unik nøgle på denne særlige tabel, så du kan ikke have flere rækker for den samme bruger med det samme penny stock symbol - i dette eksempel her, DVN.V er en dum penny stock, at vi henvises til i spec. Fordi vi har erklæret, at det unikke, hvad det betyder er, at hvis du forsøger at indsætte en dublet række, du er i stedet kommer til at opdatere det uden nogen andre har en chance for at ændre tilstand verden enten. Så kort sagt, dette sikrer tingene er atomare. Mere generelt selvom, databaser som MySQL - og du behøver ikke denne funktion p-sæt syv, men holde det i tankerne for fremtiden - støtte det, der kaldes transaktioner hvor man kan sige START TRANSACTION bogstaveligt. Du kan derefter udføre to SQL udsagn. Og en SQL-sætning, som du vil se i p-sæt syv, ser lidt noget som dette. Opdater en tabel kaldet konto. Indstil balance kolonne svarer til, hvad kolonnen i øjeblikket balance er minus 1,000 hvor nummeret, kontonummer, som bruger-id, lig 2, og derefter opdatere konto dot dot dot. Så i lægmandssprog, hvad gør disse to forespørgsler synes at gøre i virkelige verden følelse af banksektoren? PUBLIKUM: Overførsel til besparelser. DAVID MALAN: Præcis. Overførsel af midler fra en konto til den anden. Og dette er et andet eksempel, hvor du virkelig ønsker, at disse to ting til at ske eller ikke ske. Du ønsker ikke noget at komme i midten af ​​dem og potentielt rodet op matematik, eller rodet op, hvor meget penge du har, eller hvor meget penge har banken. Så hvad er virkelig rart om transaktioner i MySQL er, og databaser mere generelt, er, at de og intelligente mennesker, der har gennemført disse funktioner finde ud af at gøre sikker på, at begge disse ting sker eller slet ikke. Og hvis du virkelig ønsker at gøre en hjemmeside, der bruges af folk på campus, folk i den virkelige verden, gør noget i opstart forstand, det er disse former for design beslutninger, der blive stadig så vigtigt. Ellers, du begynder at miste data, mister brugere, eller i værste fald som vi har set her, potentielt tabe penge. Så igen, mere om det i problem sæt syv, samt måske for nogle af du i de afsluttende projekter. Så lad os ændre det billede, vi havde for et øjeblik siden bare i endnu en måde. Så lad mig faktisk se, hvis jeg kan - nope, der er gået. Der er det. Så dette er, hvor vi forlod sidste gang. Og det viser sig, vi kommer til at kaste en ting mere i blandingen her - et sprog kaldet JavaScript. Så JavaScript faktisk passer i dette stykke - og jeg ikke helt nok plads, så det er nu ikke til at skalere. OK, det er virkelig ynkeligt. OK, så det er JavaScript. Ok. Jeg er virkelig gør det en bjørnetjeneste. Ok. Så JavaScript er anden programmering sprog, og vores sidste, hvis det hjælper berolige, at der er ikke meget mere af brandhaner her. Så JavaScript er også et fortolket sprog, hvilket betyder, at du ikke gør kompilere det i nuller og ettaller. Du skal bare køre den. Men hvad er fundamentalt anderledes med JavaScript regel er, at du ikke køre det på din webserver. Det bliver ikke køre i Apparatet per se. Snarere, det bliver hentet af en bruger via HTTP i deres browser - Chrome, Safari, Internet Explorer, Firefox, uanset hvad - og det er den browser, der udfører dette bestemt programmeringssprog. Så for at være klar, PHP hidtil har været henrettet enten på kommandolinjen i vores sorte og hvide vindue, på en server ligesom apparatet en computer gerne apparatet, eller det har været udføres af en web-server kører på en computer. Men temaet her er, at PHP hidtil er blevet udført server-side, så brugeren og brugerens browser aldrig ser en linje af PHP kode. I virkeligheden, hvis du nogensinde åbne en browser for dit andet websted eller, og du faktisk se PHP kode i dit vindue, nogen har skruet op. Fordi det ikke er beregnet til at være sendes til en browser direkte. Det er meningen at blive henrettet, og drejes til noget som HTML. Men JavaScript er hovedsagelig det modsatte. Det er beregnet til at blive kørt typisk inde af en brugers browser-vindue. Og hvilke typer af hjemmesider bruger JavaScript så disse dage? Ligesom bogstaveligt hver populær hjemmeside. Hvert websted, du fyre sandsynligvis bruger dagligt bruge JavaScript for enkleste og endda mest sexede funktioner. Så noget som Facebook Chat, hvis du bruger det. Hvordan det rent faktisk arbejder? Nå hidtil, alle de ting vi har gøres med HTML og PHP antager, at du trækker op en URL, og du trykker Enter, og du se nogle HTML-indhold. Og du klikker på linket, der ændrer URL, skifter siden, og genindlæser nogle nye indhold. Klik på en anden URL eller indsende en formular, du få ført til en anden side, og du se nogle nye indhold. Men ved hjælp af noget som Facebook Chat, eller Gchat eller Google Maps, sjældent gør hele siden genopfriske sådan, at du ser en hvid skærm øjeblik og så nyt indhold. Snarere, websider i dag er dynamisk få opdateret igen, og igen og igen alle slags af bag kulisserne. Og det viser sig, at når du går til noget som Facebook eller Gchat, eller Gmail, og siden opdateres automatisk uden at genindlæse hele skærmen, hvad der er sket, er, at din browser har gjort slags hemmeligt yderligere HTTP-anmodninger - ikke for hele websider, men bare for små klumper af data, ligesom det instant message, at din ven bare sendt dig, eller statusopdatering, at nogen lige sendt dig, eller tweet at nogen netop sendt. Det er bare at lave små anmodninger om data, og derefter bruge JavaScript, dette programmeringssprog, at ændre, hvad websiden ligner uden server hjælper, uden serveren genererer, at HTML. Så kort kan JavaScript bruges så til ikke kun at hente nye data fra serveren uden at genindlæse hele side eller sender en formular. Det kan også bruges til at ændre det såkaldte DOM - Document Object Model - som er lige den fancy måde for siger træet HTML at vi så sidste gang. Så for at berolige, JavaScript er syntaktisk så ligner C så godt. Der er ingen hovedfunktion. Du skal bare begynde at skrive koden og det vil blive udført, eller fortolket mere korrekt. Betingelser vil se sådan ud. Ikke forskellige fra C eller PHP for den sags skyld. Boolske udtryk eller-ed sammen vil se sådan ud. Anded sammen ligne dette. Skifter vil se sådan ud. For løkker vil se sådan ud. Mens loops vil se sådan ud. Gør mens loops vil se sådan ud. Dette er nyt. Så JavaScript ikke har en foreach konstruere per se, men dette konstruere for variabel i i array, og jeg i denne tilfælde bliver en indeksværdi. Så det er lidt forskelligt fra det foreach, skønt nye versioner af JavaScript kommer ud hele tiden, så selv disse sprog har er under udvikling. Og som en sidebemærkning, JavaScript disse dage kan også bruges på en server, ligesom PHP ved hjælp af en ramme, der kaldes Node.js. Et af CS50 s TFs, Kevin, har medført en seminar om Node.js der er til rådighed på cs50.net/seminars. Så hvis du er nysgerrig, ved, at du kan bruge dette på serveren side, som godt, men det er en forholdsvis ny trend, men en kraftig en af ​​slagsen. Dette er en lidt anderledes. Dette er et array i JavaScript. Og hvad slår dig som anderledes versus C eller PHP? Der er et par hurtige historier Vi kan fortælle her. Hvad mangler versus PHP? PUBLIKUM: [uhørlig]. DAVID MALAN: Ja? Beklager, siger igen? PUBLIKUM: Ikke erklære typen af ​​variabel. DAVID MALAN: Vi er ikke erklære typen af ​​variabel. Så egentlig ganske ligesom PHP, vi er ikke angivelse af de typer af denne variabel. Snarere vi er mere generisk siger VaR variabel. Vi har ikke PHP gener for dollartegn, hvilket samtidig besværligt at typen, gør mere klart, at noget er en variabel. Betragtninger her, er vi slags tilbage til C tilgang ved blot at kalde en variabel ved navn, vi ønsker at give det, ligesom tal. Og også som PHP, har vi firkantede parenteser for værdier inde denne array. Så variabler i JavaScript også kunne se sådan ud. Bemærk her er en streng kaldet s, men ligeledes har vi ikke specificeret at det er en streng. Her er dog en funktion, der ikke eksisterer i nøjagtig samme måde i PHP, men en smule tilsvarende. Dette er et objekt i JavaScript. Og objekter slags den schweiziske hær Kniv af en datastruktur i, at du kan bruge dem til en række ting. Her, for eksempel, vi erklære en variabel kaldet citat. Den type af denne variabel er et objekt. Du kan tænke på det som en C struct der har nøgler og værdier. Symbol er en nøgle. FB er en værdi, tilsyneladende en bestand symbol. Komma. Prisen er en anden nøgle, og dens værdi er tilsyneladende et decimaltal, eller en nummer mere generelt i JavaScript, for 49,26 dollar. Så PHP har ikke - vi ikke har set i PHP objekter helt som dette, men vi kunne se en analog, hvilket var, hvad? PUBLIKUM: [uhørlig]. DAVID MALAN: Associative arrays. Så mens PHP har associative arrays hvis syntaks er stadigt en smule, så anderledes - vi oplevede de firkantede parenteser. Vi så de underlige pile symboler. JavaScript har objekter, men dette er for det meste en semantisk forskel, og en anderledes synonym for nu. Men som en sidebemærkning, PHP har også objekter på en måde, Java og andet sprog har objekter i objektorienteret programmering. Men vi vil bruge disse blot for datatyper til nu. Objekter og associative arrays. Dette kunne man gøre det lidt mere klart. Her er hvorfor et objekt er nyttigt. Når du ønsker at erklære en elev, Ligesom Zamyla, kan vi faktisk indkapsle så at sige indersiden af ​​det objekt ved hjælp krøllede parenteser ligesom før en hel masse nøgler og værdier i her. Vi har et ID, et hus, og et navn til Zamyla, efterfulgt af et semikolon som sædvanlig i slutningen. Hernede også, det er lidt anderledes, men også meget kraftfuld disse dage. Her er et array, og jeg ved, at fordi der er en firkantet beslag op top og en kantet parentes nederst. Og dette er en vifte af hvilke data skriv tilsyneladende i JavaScript? Dette er en matrix af det ser ligesom tre objekter. Og jeg ved, det er kun et objekt på grund af de krøllede parenteser. Og bemærk at der er åbent klammeparentes, nogle ting tæt klammeparentes, komma, derefter nogle flere, komma, og derefter nogle flere. Så det er tre argumenter adskilt af to komma. Så dette er en vifte af tre objekter. Og hver af disse objekter synes at være en studerende eller ansat af nogle slags, hver med et ID, hus, og navn. Men jeg har kaldt det noget kaldet JSON - JavaScript Object Notation. Og dette er et dataformat, der faktisk er så meget populære og mode i disse dage, at hvis du skriver en program, der bruger Facebook API, Twitter API, virkelig næsten enhver API derude i disse dage, herunder nogle af CS50 egen den data, du får tilbage er ikke i gamle skole CSV-format. Fordi huske, at CSV er super simpelt. Det er kun kolonner adskilt af kommaer. JSON data giver dig flere metadata. Det knytter en nøgle med hver værdi, så de behøver ikke at bare antage, at nulte søjle er en værdi, kolonne den ene er den anden, den anden kolonne er en anden. Alt i et JSON objekt her er en slags af selv-beskrive, fordi hver et af navnene i denne fil har bogstaveligt navn foran det som en citeret streng. Så lad os tage et kig på en par eksempler her. Lad mig gå ind i apparatet. Og lad mig gå ind i vores vhost biblioteket i offentligheden. Og lad mig gå ind i JavaScript bibliotek. Og lad os gå videre og åbne op DOM-0.html, hvor DOM betyder blot dokument objekt model. Det er træet ting, som Jeg nævnte tidligere. Og lad mig foreslå følgende. Her er en webside, hvis krop er temmelig simpel. Så hernede på bunden, Bemærk, at jeg har en formular. Vi har set dem før. Den har to indgange, hvoraf den ene har en ID navn, hvoraf den ene har en type af indsende, og den første ens type er tekst. Så det faktisk lyder ret simpelt. Lad os gå her. Lad os gå tilbage til denne side her. Lad os gå ind i localhost, og gå ind i vores JavaScript-bibliotek, og gå til DOM-0, og her har vi denne formular. Så det er tilsyneladende al denne side gør. Det har et navn felt med knappen Send. Men jeg har ikke tænkt mig at bruge PHP her. Jeg har tænkt mig at gøre alt klientsiden så at sige i JavaScript som følger. Bemærk, at jeg faktisk har givet navnet inden for denne indgang et unikt identifikator, som rent faktisk vil spare mig noget tid på et øjeblik. Og bemærk jeg har introduceret en anden tag i hovedet af min webside, den  tag. Så det er i denne forstand, at JavaScript er en klient-side programmeringssprog. I dette tilfælde, ligesom CSS, har jeg lagt det lige inde i min HTML. Men bemærk jeg har erklæret en funktion der ser lidt ligesom PHP syntaktisk, men det er faktisk JavaScript, fordi igen, det er client-side i browseren. Og tage et gæt, hvad det kommer til at gøre, selv om nogle af syntaksen her er ny. PUBLIKUM: Sig goddag til hvem. DAVID MALAN: Det kommer til at sige goddag til hvem besøger denne side. Så hvordan? Så bemærker, viser det sig i JavaScript der er en alert () funktion. Dette er en meget slags trist funktion, virkelig bare en tendens til at irritere brugerne. Det er ikke en du skal virkelig bruge typisk, men det er en hurtig og beskidt måde slags udskrive noget til en grafisk brugergrænseflade grænseflade, som en browser. Bemærk her, at jeg har fået en streng i enkelte anførselstegn. Det viser sig, at i modsætning til C, JavaScript kan faktisk have du bruger single citater, og helt ærligt det er bare lidt af den stilistiske konvention blandt JavaScript programmører at bruge enkelte anførselstegn. PHP, de rent faktisk har lidt anden betydning. Men for nu, bare vide, at det er den eneste grund. Konventionen i JavaScript er ofte at Brug apostroffer, men vi kunne bruge anførselstegn i begge steder. Så det er interessant. Husk sidste gang, at vi havde at billede på skærmen, der trak et træ hvor du havde HTML node, og hovedet node, og kroppen node, og så noget tekst. Men der var en særlig knude på meget top, at jeg kaldte dokumentet. Tja, det viser sig i JavaScript, enhver gang du skriver et program i JavaScript i en browser, har du adgang til en særlig global variabel. Tilsvarende i ånden til PHP s superglobale, denne ene kaldes i alle små bogstaver dokument. Det er ligesom en struct, men denne struct også har funktioner inde i det. Så en C struct bare har data typisk. Men en JavaScript objekt som denne teknisk er også har funktioner, også kendt som metoder inde i den. Og du kan kalde en funktion inde i dette objekt helt bogstaveligt gør sit navn, prik, og derefter navnet på funktionen, eller igen metode. Det er bare et synonym, virkelig. Og hvad betyder denne funktion gøre? Du kan slags gætte fra navnet. Få element af id. Så det kommer til at søge på websiden, søge det træ, på udkig efter uanset node, AKA element, har en unikt id citat unquote navn. Og hvad skal jeg gøre? Jeg har tænkt mig at få værdien indersiden af at node i træet, og jeg har tænkt mig en eller anden måde at sige goddag til det navn. Så tag et gæt, selvom vi ikke har set det endnu, hvad gør det plus symboler betyder her og her sandsynligvis? PUBLIKUM: sammenkæde. DAVID MALAN: sammenkæde. Right, og disse er blot slags design beslutninger mennesker gjort år siden. I PHP, du sammenkæde ting med prikker. I C, du hoppe gennem flere hoops og kalde funktioner som strcopy () eller strcat () eller andre lignende funktioner. Men i JavaScript, du bruger plusser. Så dette er blot concatenating tre strygere - hej, et navn, og derefter et udråbstegn. Så hvornår og hvorfor er denne funktion kaldet selv? Nå, tage et gæt fra HTML nederst. Hvorfor er hilse () kaldes, eller hvornår? Tilsyneladende, så godt jeg kan fortælle, om indsende, når denne formular er forelagt, Jeg har tænkt mig at gøre, hvad er indersiden af ​​disse citater. Og specielt, jeg vil kalde hilse () og derefter vende tilbage falsk. Nå, lad os se hvad nettet effekt her er først. Så lad mig gå videre og skrive i, siger, Loren, Send. Hej Loren. Lad os se, om dette måske var bare en heldig gennemførelse. Nope. Så det er at skrive ud, hvad navn jeg faktisk lagt der. Men bemærk, hvad der ikke ændrer sig. Webadressen er stadig DOM-0.html. Der er ingen register.php. Der er ingen anden fil. Der er ingen handling attribut. Så hvad er denne tilbagevenden falsk formentlig gør? Hvorfor kalder jeg hilse (), og derefter returnere falsk sandsynligvis? Hvad der normalt sker, når du klikker på Indsend en formular, at selv vi har set i den forløbne uge? PUBLIKUM: [uhørligt]. DAVID MALAN: Det går et eller andet sted, ikke? Det går til nogle destination URL. Men jeg ønsker ikke at det skal ske her. Jeg vil have min webside for at være helt dynamisk som Gmail, hvor når du er der, du bor der. URL'en ændrer ikke på en måde, angiver hele siden er ved at reloade. Snarere, jeg bare ønsker at ændre noget ligesom at udskrive noget her på skærmen. Jamen så lad mig rense dette op en lille smule. Lad mig åbne op ikke dom-0, men lad mig åbne dom-2. Bare så du har set nogle syntaks her. Det viser sig, at det, vi bare gjorde bruger rå JavaScript. Så dette er virkelig det sprog JavaScript. Nogle af jer måske kender et bibliotek kaldet jQuery. Så jQuery er ikke det samme ting som JavaScript. Det er bare et bibliotek, en rigtig smart fyr skrev og populariseret sådan at næsten alle i verden nu bruger jQuery, når du bruger JavaScript. Og ved første øjekast, helt ærligt, det ser lidt mere kryptisk. Men du vil finde, især hvis du går der for din afsluttende projekt med web udvikling, vil du opdage, at dette renser tingene op og sparer dig en ganske få linjer kode. Så lad os bare kaste et blik på, hvordan denne formular fungerer. Læg mærke til hvad jeg fjerner tilsyneladende fra min HTML? Der er ingen på indsende handleren så at sige. Der er ingen attribut. Fordi du ved, hvad Jeg vidste ikke rigtig kan lide? Jeg følte, at vi var ved at falde i gamle vaner der. Ligesom det var begyndt at føle sig sjusket at blande både CSS med HTML, fordi du slags smide forskellige sprog over hele sted, ligeledes havde dette begynder at føle som en dårlig vej at gå, hvor Jeg sætter JavaScript-kode inde i mit HTML snarere end factoring det. Så det er den lektie her. I dom-2.html, jeg factoring det ud. Og jeg gør tingene lidt forskelligt. For nu, vil jeg vinke mine hænder på, hvad det virkelig betyder under hætten. Men netop for nu antage, at der først linje kode i dette bibliotek kaldet jQuery betyder blot, når dokumentet er klar, skal du gøre følgende. Fordi websider kan tage lidt tid at indlæse. Du kan være på en langsom internet tilslutning, og det kan være spinning og spinning, og endelig den er indlæst. Denne linje kode bare siger vent hele siden er klar, at dokumentet er klar, før du udfører denne kode. Og nu mærke til, det er nok de mest nyttige først tage væk fra jQuery. Denne linje her er meget ens i ånd denne meget længere linje her. Betragtninger i rå JavaScript-kode, der eksisterer et dokument global objekt, har en funktion kaldet getElementById () de mennesker, der skrev jQuery forenklet at bare at sige dollar tegn, og derefter inde i parenteser lægge to citater, og derefter sætte en hash symbol efterfulgt af unikt id, du ønsker at få fat. Så svarer det til document.getElementById. Mellemtiden. Indsende betyder blot på indsendelse uanset form, du er henvise til venstre, gå fremad og udføre dette. Men det er nu den nysgerrighed også. Hvad er underligt om, hvad Jeg har fremhævet her? Ikke alene er den slags syntaktisk ny, er der også mangler noget. PUBLIKUM: Det er bare kaldte funktion? Det er ikke kaldet alarm? DAVID MALAN: Ja. Nå, så alert () er nede her, for at være fair. Men der er ingen omtale af en navn, ligesom du kender, foo eller noget op her. Og ja, det er en af ​​de funktioner, af JavaScript, der er helt kraftfuld, men også helt nye. Og PHP faktisk har det så godt. Lad mig gå videre og gøre noget hurtigt. Lad mig gå videre og sætte dette ud her. Lad mig gøre det. Funktion. Lad os kalde dette handleren (). En fører funktion, så at sige. Noget, der håndterer nogle operation. Lad mig rydde op i min indrykning. Og sætte dette her. Og sætte det her. Yep. OK. Så nu har jeg en funktion kaldet handleren (), at jeg ikke rigtig kender hvad det gør endnu. Det har bare stadig, at ting. Whoops. Tog for meget. Lad os gøre det. Ok. Undskyld. Ok. Lad mig gøre det. OK. Det ser pænt og lige videresende nu. Lad mig gøre det. Gør dette. Og OK. Så nu, lad os sætte dette herovre. Ikke mere programmering på flue. OK. Så nu, lad os gå tilbage til hvor historien begyndte. Tidligere sagde jeg, at denne linje her betyder, når dokumentet er klar, gå videre og gøre dette. Hvad ønsker jeg at gøre? Nå specifikt, jeg ønsker at gå videre og gøre følgende. Udfør denne linje kode, og derefter hvad jeg vil have dig til at gøre, er at kalde dette at fungere, når formularen er sendt. Nu er dette, hvad der er interessant. Dette er ikke i sig selv en funktion. Bemærk jeg ikke sætte parenteser her på den normale måde. Jeg er bogstaveligt talt passerer en funktion kaldet handleren () til en anden funktion kaldet indsende () som et argument som selv om det er ligesom en variabel. Og det er en af ​​funktionerne i JavaScript, er funktioner, selv er virkelig bare objekter. I virkeligheden, de er virkelig bare variabler af en slags. Og hvis navnet på den funktion er handleren (), er der ingen grund til at jeg ikke kan lade det som et argument her. Og det betyder, når formularen med id af demo er forelagt, kalder denne funktion. Men nu, hvis jeg fortryde alt dette, hvorfor så jeg måske gøre dette for et øjeblik siden? Nå, det er en anonym funktion. Fordi ærligt, jeg forstod, hvorfor er jeg generer at spilde tid erklære en funktion kaldet handleren () kun at kalde det i én og kun ét sted? Hvis jeg ikke har brug for det navn, og jeg gør ikke brug for at kalde det mere end et sted, lad os bare implementere funktionen lige hvor jeg har brug for det. Og så JavaScript og PHP støtte det kaldes anonyme funktioner, Tillad mig at gøre præcis det her. Men vi bare ridse overfladen. Lad os drille med blot et par afsluttende eksempler her. Hvis jeg går ind i quote.php. Bemærk, at det er faktisk en PHP funktion, en PHP-program, at jeg skrev der forventer en HTTP parameter kaldet symbol, og jeg kan passere i en værdi som FB. Og hvis vi rent faktisk se på kilden kode, dette forespørge en gratis hjemmeside kaldet Yahoo Finance, ligesom p-sæt syv, og det er at vende tilbage til mig noget i tilsyneladende format kendt er JSON - JavaScript Object Notation. Det er bare et objekt. Læg mærke til de krøllede parenteser, citater, tyktarmen, og komma. Nu i mellemtiden, det er temmelig cool. Fordi jeg nok kan bruge en programmering sprog til at generere URL'er der ligner dette dynamisk, ret? Jeg kan ændre dette til Google og komme tilbage Googles aktiekurs på $ 1,017.55. Så lad os se om vi ikke kan bruge det nu. Lad mig gå til ajax-0 her, hvilket ligner følgende. Det er bare et websted, der har en formular med en knap. Lad mig her gå videre og skrive i YHOO for Yahoos bestand symbol Klik på Hent Quote, og nu mærke til jeg har fået en alarm med 32,86. Lad mig faktisk gå til en mere avanceret udgave på denne side, version to, og skrive i lad os sige Microsoft, MSFT. Get Quote. Og nu mærke, ingen alarm. Læg mærke til hvor der står pris skal bestemmes? Der er den enkleste af eksempler, antyder hvad Gchat og Facebook Chat, og Gmail, og andre sådanne websites gør ved faktisk ændre websiden. Bemærk dette. Lad mig genindlæse siden. Lad mig åbne Chromes Inspector. Lad mig gå til elementerne fanen hernede. Bemærk nu, hvis jeg zoome ind hernede og åbne denne op, bemærke, at dette er min HTML DOM - mit dokument objekt model. Dette er min HTML. Men nu mærke til, selvom det går at være lidt svært at se det i både steder på en gang, hvis jeg skriver i FB heroppe, se bunden på skærmen alene. Det er faktisk ændrer min HTML på flue. Og det gør det ganske enkelt ved at gøre noget som dette. Hvis jeg åbner ajax-2, bekendtgørelse om gennemførelse noget så sexet som at selv om det er temmelig grimme, men så sofistikerede som der funktionelt, har det nogle HTML nederst. Men bemærk Jeg plejede at mærke. Vi har ikke brugt det før, men dette er ligesom en, men det gør ikke tvinge alt på en ny linje. Det bare gør et rektangulært område på samme linje væsentlige. Bemærk, at jeg gav det en ID på prisen. Og det viser sig ved anvendelse af den samme JavaScript bibliotek, jeg har en funktion kaldet citat (), der kaldes, når formularen er sendt. Og hvad jeg gør, er dette. Jeg erklære en variabel i JavaScript kaldet url, gemme værdien quote.php? symbol =. Med andre ord, jeg selv begynder at udarbejde en HTTP-anmodning, og derefter Jeg concatenating på, at med et plus uanset elementet med ID symbol er, hvor meddelelsen er, at tekstfelt lige hernede. Så ligesom vi havde formularer i fortiden. Og så viser det sig i jQuery, hvis du opkald. val (), der kalder på en val funktion, en værdi funktion, der får hvad brugeren har skrevet i. Og så alle de netværkstrafik der sker, er dette. $. GetJSON. Og som en sidebemærkning, dollar tegn er blot en forkortet notation. Det er virkelig jQuery.getJSON. Få mig til JSON fra denne webadresse, og da anmodningen kommer tilbage, kalder dette funktion og passere ind som argument hvad kom tilbage fra serveren. Så med andre ord, hvis jeg gå tilbage til browseren, og jeg går tilbage til quote.php, hvad min browser gør, er at få denne luns af data. Og når jeg går til denne webside her, varsel, hvis vi i stedet gå til netværket fanen og klare det, og indtast derefter noget som GOOG for Google og Get Citat, mærke siden ændrede sig ikke. Men en HTTP-anmodning blev fremsat, og hvad kom tilbage her, hvis vi ser på svar er en hel bunke af JSON at vi adgang til sidst med denne enkle linje her. Data der blev fået fra serveren. Prisen er navnet på den nøgle jeg ligeglad. Så data.price giver mig det. Nu mellemtiden, og dette er det sidste eksempel. Du kan gøre endnu mere med siden. En faktisk godt to. Vi kan bringe tilbage tagge, hvis du husker dette. Det er JavaScript. Vi kan gøre det. Meget spændende. Vi vil overlade som en cliffhanger. Men mere spændende, kan du gøre ting som dette. Hvis jeg går til geolocation-1, viser det sig at Chrome ved, at vi er på breddegrad længdegrad 42.37. -71,10. Så der er endnu mere der til din rådighed. Men mere om det i næste uge. Se dig mandag.