[MUSIK SPELA] DAVID MALAN: Detta är CS50, och detta är början på veckan åtta. Och vi är så glada att välkomna tillbaka, stor överraskning, CS50 egen Ramon Galvan, en stigande senior som har varit spendera de senaste månaderna sedan juli i LA, i Hollywood, bokstavligen arbetar på en helt ny TV show kallad Colony, skaparen av vilka är faktiskt en Harvard alun själv. Och så vi är mycket glada över att se detta debut på USA nätverket i januari. Så håll ögonen öppna för det, och för mer Ramon för de kommande veckorna. Nu vet att slutet är nära. Och vad detta betyder är att det inte finns så mycket kvar av CS50, sorgligt att säga. Vi har bara tre problem uppsättningar left-- det finns problemet set six-- som är i dina händer nu eller snart kommer att vara, på grund av senare week-- är tänkt att överbrygga våra världar kommandoraden, där Vi har tillbringat större delen av vår tid med hjälp C, och världen av webbprogrammering. Tja, ser du en hel del idéer lånat från kommandoraden arbete, men också en hel del nytt och intressanta idéer som också kommer att vara förbunden för mobila applikationer och för teknik, mer allmänt, som du killar är alla bekanta idag på bärbara datorer och telefoner och liknande. Så du kommer inte att genomföra en webbsida eller en webbplats per se, men en verklig webbserver. Du kommer att skriva resten av en webbserver skriven i C, vars syfte i livet är att ta emot HTTP-begäranden, dessa virtuella kuvert vi hålla talar om, och faktiskt reagerar antingen med vissa statiska content-- som en prick HTML fil eller en punkt JPEG- eller någon annan antal filer, eller ens en PHP-fil där din webb servern kommer att tolka det PHP kod och spotta ut resultaten. Nu har vi gett dig med en hel del ram för det-- verkligen distributions kod för problem set sex är över 1000 rader lång, en Många som är kommentarer, att vara fair-- men detta är egentligen menade att vara en möjlighet att få händerna smutsiga dykning i ett ganska stort projekt att vi har mycket specifikt huggen ur bitar av för dig, så det verkligen när du avslutar CS50 och ange den verkliga världen av programmering och vill plaska i valfritt antal projekt, du har mycket större komfort ladda ner någon källa kod, vissa öppen källkod projicera på webben, och dykning i och göra ändringar som du tycker passar. Problem set sju kommer att vara om gör din egen web-baserad applikation som tar dynamisk ingång och producerar dynamisk effekt i form av en etrade.com liknande webbplats. Och problemet set åtta kommer att fokusera på ännu annat språk kallas JavaScript. Under tiden den slutliga Projektet är på horisonten. Den så kallade pre-förslag beror en vecka från och med idag. Pre-proposal-- per specifikationen, som är på CS50: s website-- är en ganska avslappnad möjlighet för att skicka en ganska kortfattad email till din undervisning stipendiaten bara för att underrätta honom eller henne om vad du tänker, till använda honom eller henne som bollplank. Och har en sanity check-- oavsett om du funderar om bita av för mycket eller kanske för lite, eller kanske du har ingen aning om och vill engagera sig i en konversation. Därefter är ett förslag och statusrapport, den så kallade CS50 hackathon här i Cambridge för Harvard och Yale studenter likadana. Den slutliga projektet genomförandet är sedan rakt. Och sedan en CS50 rättvis här, i Cambridge, samt en annan i New Haven. Så förslaget, ta en titt på hemsidan för dessa uppgifter. Men mer spännande är också en möjlighet att få händerna smutsiga, och era sinnen öppna för en hel gäng ämnen och verktyg och tekniker som är underordnade till kursen kärn kursplan, men icke desto mindre relaterade. Och även underbar språngbrädor till gör riktigt cool slut projekt som går långt utöver material vi har täckt formellt problem sätter eller föreläsning. Så gå till CS50: s hemsida för hela listan av seminarier. Om du inte registrerar ännu, det är bra. Gå vidare och registrera dig stilla och vi kommer följa upp med en live streaming länk, dag och tid finns på webbplatsen. Och allt kommer att vara registreras och sätta på nätet Om du inte kan göra vissa dagar och tider. När det gäller vad som ligger framför thereafter-- bra, Naturligtvis finns det CS50 hackathon. Detta foto, minns, från vecka noll tas runt 04:00 en kväll i år tidigare. Den CS50 mässan, vilket i sin tur kommer att äga rum i båda städerna. Och sedan, bara för att plantera frö, även om vi fortfarande har en månad plus kvar av terminen, om du vill gå med CS50 egen undervisning personal, och du vill starta funderar på att bli en CA, eller undervisning karl, vet att Vi börjar prata mer om det senare den här terminen. Men på bilden är de flesta av årets lag. Och så, PHP-- och jag var så ledsen förra veckan att [? Allyse?] Vänligt gick till insatser för att få oss dessa underbara rekvisita att jag inte sluta använda, så det egentligen bara såg lite dum att vi hade en spade sitter här hela dag i onsdags, och en liten sked. Men detta var min metafor sätt att försöka måla bilden av varför vi övergår från C till ett språk som PHP. Och samma kan sägas om alla Antalet languages-- Java, Python, Ruby eller knippen mot andra, men medan i C, till exempel, att skriva ett program i C kan typiskt vara ta en sked så här och att gräva ett hål i marken, i sand eller smuts. PHP kan du ta mycket större inslag av problemet, skriva mycket mindre kod med användning av en betydligt mindre verktyg, eftersom det finns så mycket mer funktionalitet pusslas in. Nu, om vi var verkligen dramatiskt, Vi skulle ha något att skotta här, men så var det. Under tiden, den andra metafor vi kom upp med är, naturligtvis, du kan använda något som en skiftnyckel hamra i något som liknar en spik. Men naturligtvis, den högra verktyg för användning går att vara inte så mycket språk som kallas C-- och nu har jag bara irriterad [? Sanders,?] Förmodligen, Vi kommer att fixa det later-- så rätt verktyg att använda ofta kommer inte att vara Detta lägsta verktyget nivå. Och faktiskt, är inte ett språk C som de flesta av er någonsin kommer att använda, eller nödvändigtvis använda igen. Och faktiskt, lite secret-- den enda gången Jag använder C själv är ganska mycket mellan September och december varje höst termin. Och det beror på att vi använda den som en möjlighet att lära grunderna programmering, och med det dator kunskap, data strukturer, algoritmer och like-- men mycket snabbt kommer du se nu att syntaxen och idéerna bakom C är så underbart överföras till modernare språk högre nivå, som PHP och Python och Perl och Java och Objective-C- faktiskt, inte så mycket Objective-C- men Swift, dessa nyare språk som många av er kommer sedan plaska med dig slutprojekt. Så utan vidare, låt oss faktiskt Använd PHP för att lösa vissa problem. Minns att tidigt, sista vecka, vi bara används CS50 IDE, Vi skrev ett dinky litet program som bara sa "Hello world." Och då jag sparade den i en fil som heter hello.php. Och då jag körde detta kommando. Och varför? På engelska, vad som händer här? Vad gjorde jag när Jag sprang detta kommando? Yeah? PUBLIK: Det finns någon funktion PHP som läser vad in-- förstår att. DAVID MALAN: Bra, det finns någon funktion PHP-- och låt mig vara mer specifik, det finns ett program som heter PHP, alias En tolk, som förstår innehållet i hello.php, och tolkar det uppifrån botten, vänster till höger, och gör vad de kommandon säger. Kommandona i hello.php, naturligtvis, bara källa code-- funktioner och variabler och loopar och liknande, som vi själva har börjat skriva i PHP. Men till skillnad från C, som är en kompilerad språk, PHP du bara skriva det, och köra det. Du hoppa över den mellansteg av omvandla den till ettor och nollor, och sedan köra den. Så vad är en Fördelen med detta? Varför vi hoppar över steget? Varför modernare språk tenderar att hoppa över det här steget? Vilken var den nytta? Eller bara intuitivt? Även om vi har inte skrivit mycket PHP före, vad är fördelaktigt om inte sammanställa koden tror du? Nej? Inte begå? Skrapa huvudet? Yeah. PUBLIK: Mer dynamisk. DAVID MALAN: Mer dynamisk? Vad menar du? PUBLIK: [OHÖRBAR] DAVID MALAN: OK, bra, så beroende på ingångs, du behöver inte kompilera det varje gång. Och det är verkligen så enkelt som that-- vad är poängen med att fortsätta att kompilera din kod? Detta är bara ett steg som är making-- detta kräver, Under de senaste veckor, dubbelt så många steg som bara kör ditt program. Det har varit bra att se att du se några felmeddelanden och så vidare, men det är fortfarande bara en irriterande steg. Och så programmerare insåg över tiden, varför inte vi börja skriva språk som inte behöver det ganska mekaniskt steg, så att kan bara skriva din kod och köra den. Men vad var priset som vi såg vi betalat förra veckan, med ett särskilt exempel? Ja? Fart. Så [? Vad är?] tolkar lite långsammare, att nollor och ettor är trevlig och snabb för en dator att förstå, eftersom Intel CPU, eller vad det är, bara förstår vad som händer på dessa mönster av bitar. Medan en tolk är ett program som verkligen måste läsa Ascii källan kod som du har skrivit, och konvertera det, så att säga, eller räkna ut hur det omvandlar slutligen till nollor och ettor. Så det tar bara lite bit av ett prestations träff. Så det är lite av en kompromiss. Nu om vi gör detta över här, låt mig gå vidare och göra ett exempel på följande sätt. Om jag går in här, ny fil, jag kommer att spara detta igen är hello.php. Och nu ska jag gå vidare och säger, "print hello world" - och påminna om att jag kan använda skriva ut, gör jag inte måste använda print-F. Och nu här nere, om jag gör PHP av hello.php, huh-- jag inte verkar ha tolkat det. Vad gjorde jag för fel? PUBLIK: De vinklade armband. DAVID MALAN: Ja, du behöver denna vinkel fäste där uppe. Så det är ganska irriterande, men du vänjer sig snabbt. Om jag måste skriva PHP-kod, jag i allmänhet måste tala om för programmet, eller berätta tolken, hey PHP, här kommer några PHP-kod. Och sedan för bra åtgärd, skulle jag stäng inte detta, utan snarare med bara frågetecken vinkel fäste, så att nu här nere, om jag kör detta igen, nu Jag får det önskade resultatet. Nu göra en liten optimering, bara så att du har sett det förut. Detta är typ av irriterande att jag måste köra PHP rymden hello.php, eftersom i det förflutna jag kan bara skriva dot slash programmets namn, som är ganska trevligt. Det är lite av en bättre användarupplevelse. Så visar det sig kan du göra det här i PHP med following-- jag kan använda denna ganska kryptiskt besvärjelse på toppen här, som i allmänhet kallas en Shebang, varvid detta är en skarp symbol, så att säga, är detta en smäll eller ett utropstecken. Och detta är nu vägen till ett program på en typisk Linux-system som kallas miljö, eller env. Och detta line-- lång historia short-- linje man bara säger hej dator, hitta PHP tolk för mig i miljön, hitta den i ditt minne, så att säga. Och vad är trevligt nu, att om jag går här nere, Jag kan göra punkt snedstreck hello dot php, eller-- hmm. Åtkomst nekad. Tja, kommer du att se ännu mer av detta med problem set sju, om du inte redan har gjort, med behörigheterna. Det visar sig att jag behöver att utföra detta kommando kallas [? chamod?] för förändring mode-- ett plus x hello.php. Jag behöver [OHÖRBAR] detta ett ytterligare steg som berättar min dator, göra hello.php körbar. Och nu titta på vad happens-- dot snedstreck hello.php, bara körs. Jag behöver inte ange tolken längre. Och jag kan göra det ännu vackrare, fortfarande, om jag byter namn den här grejen. Om jag flyttar hello.php bara Hello-- så märker i det övre vänstra, programmets namn är faktiskt nu bara Hej. Nu kan jag få det att se ut som en C-program, även om det är skrivet i PHP-- eller uppriktigt valfritt antal av andra språk. Så marginell förbättring, ingen funktionell skillnad. Men det är bara en liten nyfikenhet nu, så att du kan skriva program på alla språk, och användaren inte måste veta eller bry sig om vad de är. Nåväl, låt oss titta på ett mer övertygande exempel nu att jag piskade upp i förväg. Och detta kallas quote.php. Och det är tillgängligt på nätet. Och märker att det är ganska short-- men det är ett kommandorad program som är kommer att titta upp aktiekurserna för mig, som faktiskt går att vara relevant för problembild sju. Så låt oss se vad jag gör. Högst upp har jag fått öppna fäste frågetecken PHP. Sedan har jag fått denna linje, där jag är kräver en fil som heter functions.php-- vi kommer att se mer om detta i en bit, men detta är som C: s version av skarpa innefattar, vart vill du gå inkluderar en annan fil. PHP kallar det kräver, även om det även har en inkludera funktionen. Och det visar sig att function.php är bara något jag skrev innan klassen. Jag satte den i samma katalog, eftersom Jag ville faktor ut någon kod att vi kanske vill använda någon annanstans. Under tiden kan du förmodligen sluta vad som händer här. Detta är lite annorlunda från C- men Vad menar jag med att säkerställa korrekt användning? Översätt detta mer tekniskt. Under vilka omständigheter är jag avsluta programmet, eller spännande? Yeah? PUBLIK: När du inte har två kommandoradsargument. DAVID MALAN: När jag inte har att kommandoradsargumenten. Och kom ihåg att en av dem argument är programmets själva namnet. Och den andra kommer att vara ett annat ord jag skriver efter prompten. Så precis som C, här är mitt sätt att kontrollera, gjorde användaren samarbeta och köra programmet som jag tänkt? Nu, det finns något lite annorlunda med C- först av allt vi har denna dollartecken, och vad en dollar logga betecknar i PHP? Bara en variabel. Det är all-- bara en variabel, följt av vad du vill verkligen kalla det. Observera att det är något saknas från min PHP-program, precis som det saknades sista vecka, jämfört med C, vilket är vad? En typer, men också något annat. Det finns ingen något function-- huvudsakliga funktion. Det finns ingen huvudfunktion. Du börjar bara skriva din kod utan att behöva att oroa sig en ganska godtycklig konvention namnge någon standard Funktionen viktigaste. Så arg C är bara riktigt en global variabel att tolken gör tillgängliga för mig. Nu är detta intressant. Så slå upp saker. Dollartecken lager är på vänster, det är min variabel. På höger sida, Det är tydligen en funktion i PHP som kallas lookup som Jag passerar min sista kommandorad argument att-- vad ordet är. Och vi får se hur detta arbetar i ett ögonblick. Och sedan slutligen jag rapportera priset. Jag skriva ut en andel av en sådan och sådan. Och kom ihåg, detta är den sätt på PHP-- ett sätt i PHP-- där du inte behöver göra dollartecken S längre. Du kan bara använda klammerparenteserna och koppla in någon variabel. Du behöver inte oroa dig för använder printf på samma sätt. Och som en sidoreplik, när du sätter en variabel insidan av citattecken så här, du använder en fin teknik kallas variabel interpolation. Det betyder bara att koppla variabeln i här. Och som en sidoreplik, en del av er som kommer från andra program bakgrunder, Du får inte använda apostrof runt strängar för att göra detta. Du måste använda citationstecken för variabel interpolation att arbeta. Annars kommer du bokstavligen se dessa klammerparenteserna. Så slutligen, låt oss gå vidare och köra. Låt mig göra min terminal lite större. Låt mig gå vidare och köra insidan av min offert katalog. [? CDsource?] [? AM?] [? citat?] PHP citat dot PHP, och jag kommer att söka efter något som GOOG, som är dess ticker symbol, och en del av sitt nya namn, Alphabet Inc, kostar $ 717 per dag. Okej, om vi vill köra igen, någon har en annan börsinformation de vill titta upp? Microsoft tror jag är här, MSFT-- $ 53. Jag tror Yahoo är kanske det. Och Facebook är det. Så vad är det här programmet gör? Det magiska verkar bäddas i den uppslagsfunktion. Så låt oss ta en snabb titt. Det visar sig att inte komma med PHP, det är i functions.php. Och vi kommer inte att gå igenom detta i detalj, men märker avgörande ordet här är att på ledningen sex av functions.php-- Jag bokstavligen säger funktion. Jag ange namnet på min funktion. Jag ange någon argument, eller parametrar, Jag vill att funktionen att take-- inga slag. Och då jag genomföra det. Och jag ska våg min hand vid genomförandet, eftersom det är ganska avancerad höger nu, men vi får se det igen faktiskt i en vecka i problem set sju. Men jag kan städa upp det också. Jag ingår också i dagens kod en version citat, som inte har någon punkt PHP-fil. För vad är förmodligen på toppen av program som kallas bara citera? Det så kallade shebang-- den ganska kryptisk besvärjelse som säger att hitta PHP och sedan köra det på min kod här. Okej, så som ger oss där vi slutade sista time-- än med några mer avancerade exempel. Några frågor hittills om PHP eller vad vi gör? No-- okej. Yeah? PUBLIK: Inside the HTML-filer, gör du-- [? gör du ?] [? bara kalla det?] en [OHÖRBAR] PHP-fil? DAVID MALAN: Bra fråga. I en webb sammanhang, vilket vi är bokstavligen på väg att övergå till, du inte använder den så kallade shebang vid toppen, eftersom banan server-- ofta en program som heter Apache eller Microsoft IIS, Internet Information Server, eller valfritt antal andra webbserverprogramvaran, vet att när det ser en prick PHP-fil, att det bör köra tolken på den. Det ser inte på det första raden. Så denna första raden trick är bara när du är skriver kommandorad programs-- som vi kommer inte att göra super ofta, men det är vårt sätt att överbrygga våra C exempel för nu vår PHP. Så låt oss verkligen överbrygga denna värld från kommandoraden världen webben genom att göra följande. Låt mig gå vidare och dra över för bara ett ögonblick här. Så om vi har en webbserver, eller snarare om vi har min laptop hit, som jag ska dra ut så här. Och här har vi Internet i någon form. Och sedan över här, vi har en server i en building-- detta är hur internet works-- och här är en server med några lampor kanske. Vad som faktiskt händer mellan dessa två anslutningar? Så i denna byggnad är en webbserver. Det är bara en dator som kör vissa drift system-- kanske fri programvara som kallas Apache, som CS50 IDE körs. Så kan du faktiskt tänk på denna byggnad som den byggnad i som CSt0 IDE lagras. Det är där ni alla har konton, där ni alla har din egen webbserver kör, alla ni har egna unika webbadresser, som vi började diskutera, och du kommer att se mer i P. satt sex. Här är min laptop någonstans annanstans på internet. Och så när jag besöker en webbadress som tillhör för mig, är att internet trafik som går över till servern, serverns tar emot en HTTP request-- som en get index.html och det är svara på den webbsidan. Så det är den allmänna paradigm. Medan allt upp fram till nu i dag, allt hände bara i gränserna för denna byggnad. Jag använde min bärbara dator, men Jag var ansluten till CS50 IDE, så alla dessa program jag kör var inne på den servern själv. Men nu, låt oss börja återanvända PHP att skriva några faktiska program som serveras upp av en webbserver. Och för att göra detta, kommer jag att gå i en massa exempel att införa denna idé här. Så det här är lite av en finare sätt att som beskriver en programmeringsparadigm. Och i själva verket som du avslutar CS50 eller arbete på examensarbeten, eller ta del följer på klass, börjar du att se att world-- särskilt efter att ha vuxit upp med språk som C som är super låga level-- inser att det är bättre sätt att skriva programvara. Det finns vissa mönster du kan följa, vissa sätt att organisera dina filer och sätt att namnge dina funktioner, så att lång historia kort, världen har kommit upp med en massa förkortningar och namn för metoder för programmering. Dessa är bara tekniker som du kan använda. Och en av dem kallas MVC, för Model View Controller. Och detta är bara för nu, en alltför komplicerad sätt att säga hur du ska lägga ut en PHP-baserad webbplats, i vårt fall. How do you organisera dina filer, hur gör du organisera din logik, på ett sätt som gör det lättare att skriva mer komplicerade webbplatser? Och faktiskt, vi ska snabbt dit med p-set sju. Så i en värld av MVC, du kommer att se att vår kod kan i allmänhet karakteriseras som antingen modellkoden, eller controller kod eller vykod. Och jag kommer att oversimplify den såsom follows-- regulatorn är hjärnan hos ditt program, Det är där alla intressant logik händer. Så allt vi har varit skriver hittills i klassen, är ungefär som controller code-- det kontrollerande ditt program, dina loopar, ditt villkor, dina funktioner och variabler och allt det där. Visningar, nu, kommer att vara lite tydligare i världen av webben. En vy är estetik på din webbplats. Det är vad användaren sees-- bilderna HTML tabeller, HTML-taggar, och alla av detta, alla av den fluffiga estetiska saker som inte är så svårt att skriva, men är precis vad du genererar, är den så kallade uppfattning estetik. Och modell, i slutändan, kommer vara databas stuff-- som vi börjar dyka in alla ju mer denna onsdag. Så controller är logiken, uppfattning är den estetiska grejer, och modellen kommer att vara där vi lagra våra faktiska uppgifter. Så låt oss titta på detta mer konkret med följande exempel. Jag kommer att gå in i min katalog här av dagens källa code-- vilka alla finns på nätet. Och jag kommer att gå in i version noll. Och här är-- låt oss kalla det version noll CS50: s webbplats. Det finns inte mycket här alls. Det är en mycket enkel webbsida som är förmodligen använda vad HTML tags-- bara gissa från tidigare exempel? Vad är det? H1-- förmodligen den stora djärva titel att logotypen uppe, CS50. Och vad är på lek? Yeah? PUBLIK: Punktlista. DAVID MALAN: Onumrerad list-- så UL tag och kanske ett par LI-taggar. Och om du inte kommer ihåg dessa, det ärligt spelar ingen roll. Dessa är fluffig slags genomförandet detaljer om HTML att du snabbt slå upp och du är tillbaka på vägen. Vi kommer att fokusera mer på program idéer som de saftigare bitar. Så låt oss bara ta en snabb se HTML-- och faktiskt om jag öppnar upp vyn källan här, Japp, Det är precis vad som händer här. Det finns en UL-tagg. Kapslade inuti det är att LI-taggar. Och då jag lånade URL av den faktiska planen här. Och sedan i lectures.php är tydligen annan dynamiskt genererad sida som kommer att ha, låt oss see-- ah, de första två veckorna av föreläsning. Så vecka noll och vecka ett, låt oss titta på this-- om jag visa sidans källkod, även super enkelt. Dessa leder till två sidor kallas week0.php och week1.php. Så anser nu vad som händer. När jag klickar på week0.php, min laptop gör en begäran om week0.php. Webbservern, alias, CS50 IDE, tar emot den virtuella kuvert. Det ser ett meddelande som får week0.php. Det är då tolka filen, topp till botten, vänster för att right-- filen kallas week0.php-- och spotta ut resultaten. Så insidan av denna fil, week0.php, måste vara styrenheten logik som genererar denna HTML och vi kommer snart att se det. Men nu, låt mig klickar på vecka noll, och nu har vi onsdag och fredag, och nu har vi bilderna långsamt från vecka noll. Och du kanske minns detta från vägen tillbaka när. Så det är allt denna webbplats gör. Så låt oss fundera över hur det är att göra detta. Jag kommer att gå tillbaka till källkoden här, i CS50 IDE, och jag kommer att öppna upp index.php. På toppen av den här filen är ett gäng av kommentarer. Och sedan i mitten av den här filen, det visar sig, är ingen PHP-kod som helst. För om du inte har någon av de öppna fäste frågetecken PHP-taggar, du är fri att bara sätta HTML. För vad PHP tolk är tänkt att göra, är när det läser detta file-- uppifrån och ned, vänster till right-- det bara tolkar koden det ser mellan dessa vinkelfästen frågetecken. Och allt annat som det inte erkänna som PHP, bara spottar ut. Och HTML är bland de saker Det kommer bara att spotta ut. Så den här filen kan ha kallats index.html, men jag namnge allt dot PHP som en språngbräda. Lectures.php-- liknande sätt underwhelming, det är bara några HTML. Week0.php, på liknande sätt bara några HTML. Men nu ska vi sätta på ökända ingenjörs hatt, och fundera över hur vi kan förbättra den här. Det är inte svårt att göra detta, men jag typ av decentraliserade till kopiera och klistra in. Och faktiskt, om jag gör vecka två, du vet vad jag förmodligen kommer att göra? Jag kommer att gå till week1.php, jag kommer att markera allt. Jag kommer att kopiera den, klistra in den till en ny fil som heter week2.php, tweak några webbadresser och vara på väg. Så baserat på vad vi har sett i C redan, Detta känns inte rätt, förhoppningsvis. Kopiera, klistra in sällan den rätta lösningen. Så vad kan vi börja att göra för att förbättra detta? Var finns möjligheter för bättre design? När jag kommer till vecka åtta, det kommer att bli riktigt irriterande Om jag vill ändra teckensnitt för var och en av mina sidor, eller om jag vill att ändra strukturen av layouten. Så var är möjligheten för bättre design? Nåväl, låt oss betrakta vad som är delas mellan alla dessa filer. Här är vecka ett, här är vecka noll, här är lectures.php, Här är index.php-- vad är densamma och vad som är annorlunda, grovt räknat, i vart och ett av dessa filer? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: OK, bra. Så det finns ett mönster, säkert, varvid varje gång jag väljer föreläsning I, Jag ska generera en mycket liknande utseende sidan. Och så kanske jag kan utnyttja det faktum att verkligen, vi medvetet numeriskt indexeras vår lectures-- om jag kan sätta ännu mer ord i ditt svar. Och vad är det enda, verkligen, som är att byta mellan vecka en-- och låt mig rulla ner så det är ungefär i samma plats-- så här är vecka noll, ungefär på toppen. Här är vecka ett, vecka noll, vecka ett, vecka noll. OK, bokstavligen om du vet ingen som helst program detta är nu precis som en mönstermatchning spel. Så vad är annorlunda? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Bra, så titeln förändras, aldrig så lite. Zero kommer naturligtvis till ett. Samma sak händer i H1-tagg. Och vi vet inte riktigt ser det lika lätt, eftersom webbadresserna är lite lång. Men dessa webbadresser förändras något. Men vad är inte förändras är, vågar jag säga, de flesta av innehållet i page-- HTML-taggen är densamma, är huvudet samma, titeln är nästan densamma, kroppen är densamma, och nästan allt annat är densamma med undantag för de små tweaks. Så hur kan vi gå om facto en del av detta ut? Bra låt mig föreslå exakt att i nästa version. Så här i version ett, jag har exakt samma filer, plus ett par andra. Här finns index.php-- och även om du aldrig sett PHP förut, vad gör jag nog att lösa detta problem-- baserat på vad du ser här? Ja, det är en liten åtagande? Nej? Ja, gå vidare. PUBLIK: [OHÖRBAR] DAVID MALAN: Japp. PUBLIK: [OHÖRBAR] DAVID MALAN: Jag behöver du talar bara lite högre. PUBLIK: [OHÖRBAR] DAVID MALAN: OK, bra. Och jag think-- det var svårt att höra dig-- men jag tror att vad du får på är att taggarna som var vanliga där uppe, och taggarna som var vanliga på botten, har nu räknas bort, eller förvisas till vilka filer? Header.php och footer.php-- och vi kommer att göra några tweaks till ta itu med problem som du bara upp om siffrorna förändras, för exempel, om jag hörde dig rätt. Men det verkar vara kontentan av det. Om det fanns en stor mängd redundans på toppen av sidan, och en stor mängd redundans vid botten, låt oss bokstavligen bara höjdpunkt och skär det innehållet ut, lägga den i en separat file-- precis som idén om CSS, där vi räknade ut mycket liknande estetik, sätta det i en separat punkt PHP-fil, Använd kräva mechanism-- som är som ciss include-- som är i huvudsak som att säga gå greppa innehållet i header.php, och kopiera och klistra in dem här. Men vad detta betyder är att nu i index.php, jag har dessa två linjer. I lectures.php jag också har dessa två linjer. I week0.php jag också har dessa två linjer. Så nu, om jag vill ändra titeln på alla mina sidor, eller jag vill ändra grundläggande struktur, Jag kan ändra det nu bara ett ställe, eller två places-- sidhuvud och sidfot, respektive. Nu koden start att se lite mer kryptiskt, eller hur? Men om man tänker på vad sidan är doing-- om jag begär week0.php, precis som på ritningen över här-- när week0.php begärs, vad betyder det? Bokstavligen är den här filen begärs av webbläsaren. Webben server-- alias CS50 ID-- griper detta fil, week0.php, och läser det uppifrån och ned, från vänster till höger. På rad ett omedelbart möter det öppna fäste frågetecken PHP, kräver header dot PHP, och så vad PHP tolken does-- som är inbyggd i webben server, eftersom vi förkonfigurerade den för dig-- det går automatiskt i header.php, kopierar innehållet, klistrar dem här. Men sedan tolk möten frågetecken nära fästet, så det är allt gjort tänkande. Nu är det bara blint spottar ut linjer två till och med sju, eftersom det är bara rå HTML. Får ledningen åtta, och gör det samma magi igen-- öppna filen, ta tag i innehållet, och ålägger dem eller klistra in dem just då och där. Men jag bara nämnt en bugg. Detta är en partiell steg bakåt, för om vi tittar i header.php, Jag har typ av klippa ett hörn. Vad funktion gav jag upp för att få denna diskutabel bättre design? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, jag typ av klippa en nontrivial hörn. Ni påpekade att det förändrades var titeln, numret i titeln, och numret i H1. Så min lösning var OK, låt oss bara byta namn på sidan, och inte ta itu med det som helst problem. Så det är en partiell steg bakåt för säker. Men vad är anmärkningsvärt här är det vad jag har gjort annars factored ut alla vanliga grejer. Och i footer.php, märker jag räknade ur allt detta, om än mindre, gemensamma grejer. Så jag behöver på något sätt nu kunna ta ytterligare ett steg framåt, och fixa denna titel frågor. Så låt oss göra det. Låt mig gå in på min andra version här, som, återigen, har samma filer med undantag för ett nytt tillägg. Och det är lite mer mångordig, men låt oss se om vi kan retas isär vad som händer här. Så i stället för att kräva header.php och footer.php, Jag verkar endast kräver en file-- kallade naturligtvis helpers.php. Och låt mig föreskriver nu, vad som finns inuti av helpers.php är bara en massa funktioner som jag skrev, precis som förut. Men jag kallade det helpers.php. Nu uppenbarligen, i linje tre och 10, jag är anropa två functions-- render sidhuvud, sidfot göra. De kommer inte med PHP, skrev jag dem själv. Och jag satte dem i helpers.php. Nu har vi bara sett den här syntaxen en gång, och det var super kort. Men detta är tydligen ett argument för att göra huvudet, funktionen. Varför vet jag det? Väl här är en nära Paren, Här är en öppen Paren. Och naturligtvis, precis som i C, något mellan dessa parenteser är en input-- eller en argument till funktionen. Vad är datatyp detta argument, baserat på vad jag har markerat? Vad gör dessa hakparenteser ange baserat på förra veckan? Ja, det är en array-- specifikt en associativ array. Och denna syntax visserligen är lite funky, men detta är bara passerar i en nyckelvärdet paret. Det viktiga är, citat unquote titel, och värdet är CS50. Om vi ​​hade gjort detta i C, kanske det istället ser mer ut så här, bara citat unquote CS50-- eller faktiskt skulle det vara lockigt hängslen, eller något liknande i C, där nyckeln är noll, och värdet är CS50. Men återigen, i PHP, även om Syntaxen är, återigen, en lite konstig, det tillåter dig att passera ord istället för siffror att associera nycklar med värden. Så vad betyder då allt detta? Om jag går in helpers.php, låt oss titta på denna funktion. renderHeader.php, snarare renderHeader är min funktion, och jag vet att eftersom jag ser nyckelordet function här. Detta är nytt från C- det tydligen tar ett argument som kallas data-- men jag kunde ha kallat detta något, men jag kallade det uppgifter, bara för att vara lite clean-- och bara ta en gissning, särskilt om du har programmerat i någon annan högnivåspråk före, något ovanför C konceptuellt. Vad gör lika öppna fäste hakparentes förmodligen innebära? Eller vad kan det innebära? Vi har inte sett detta i C. Yeah? En tom array. Konkret innebär detta att om användaren inte ringa renderHeader med ett argument, jag fortfarande att ha ett argument som kallas data men standardvärdet är kommer att bli en tom array. Så det är bara en trevlig bekvämlighet. Jag behöver inte skrika på användaren, eller säga att du använt min funktion fel. Jag kan bara ge användaren en standard värde, om jag inte särskilt vård. Nu denna funktion, jag kommer att vifta mina händer på. Men detta extrakt funktionen kan oss att passera dessa variabler i uppgifter in header.php på följande sätt. Och detta är den sista biten, Jag tror, ​​funky syntax. Här är min nya version av header.php-- det brukade säga, bokstavligen, öppen fäste titel CS50, och det var det. Och samma sak för H1. Nu är det tydligen säger något ganska funky. Och låt mig underlätta detta för ett ögonblick som följer. Detta är vad jag har ändrat min titel för att vara. Men det börjar bli lite ful att ständigt öppna konsoler med PHP, och sedan använda utskriftsfunktionen. Det visar sig att PHP har en stenografi notation för detta, vilket är bara ett likhetstecken, som är tekniskt en funktion som kallas eko i stället för tryck, men det är samma sak, på ett effektivt sätt. Det ser bara bättre. Det är bara en syntaktisk socker, om ni så vill, som gör min kod ser lite bättre. Men det visar sig, och vi får se det igen Snart måste vi kalla detta irriterande lång funktion som kallas HTML speciella tecken i PHP, eftersom det visar sig Det finns vissa insatsvaror att användaren kan ge oss, eller att användarna kan ge oss, som kommer att bryta vår webbplats. Men vi ser att nästa vecka med JavaScript. Men för nu, vet bara att den här filen, headers.php, helt enkelt tar titeln som Jag passerade, det gör säker på att det är säkert att injiceras i en bana sida, och det spottar ut som min titel och som min H1. Så om jag går in i denna version nu, märker att föreläsningar har sin titel tillbaka, vecka noll har sin titel tillbaka, och faktiskt, HTML jag generera är identisk med vad min första version was-- utom för min blank, eftersom jag har börjat formatering min kod lite annorlunda. Men jag har skapat alla koden jag bryr mig om. Så låt mig paus för bara en stund och se om det finns några frågor eller förvirring jag har skapat. Okej, så låt oss vrida lite svårare här för att se om det finns ett möjlighet till förbättring. Helpers.php hade även denna funktion, kallad renderFooter. Och vad är anmärkningsvärt om renderHeader och renderFooter? Och återigen, för dagens ändamål, vet att extraktet funktion är bara mitt sätt att skicka argument in header.php och footer.php. Förlåt? PUBLIK: [OHÖRBAR] DAVID MALAN: Ja, bara jag förändrat kräver linjen. Så bokstavligen, har jag begått synden kopiera och klistra in, ännu en gång. Det är inte ett stort antal linjer, men kom on-- om jag kopiera och klistra in allt bara för att ändra ett litet ord, och ett litet ord som Alan pekar ut är sidfot här, jämfört med header här. Annars är allt identiska, med undantag för, Naturligtvis funktionens namn. Så vad kan vi göra bättre? Bra låt mig att öppna upp denna version här, varvid i helpers.php, varför inte jag bara få en lite smartare om detta? Skriv något mer komplicerad kod, men kalla det göra? Så vad har jag i grunden förändrats? Det tar ett argument now-- två argument, uppgifter fortfarande. Och vad är det första namn förmodligen används för, baserat på vad du läser här? Även om vissa av syntaxen är fortfarande ny. Vad är dollartecken mall? Förlåt? PUBLIK: sidhuvudet eller sidfoten. DAVID MALAN: sidhuvudet eller sidfoten. Så tydligen, bestämde jag att om det enda som förändras är vad mall jag vill att print-- och genom mall Jag menar att detta är modell för kod som jag vill skriva ut, men jag vill koppla in någon values-- så om det är bara header eller sidfot, varför inte jag parameter det och kallar argumentet dollartecken mall? Och sedan denna skraj syntax tillåter mig att skapa en bana i en variabel här. Så dollartecken vägen är en variabel. Vad gör detta syntax göra, om du är bekant? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Exakt. Om mallen är, citat unquote, sidhuvud, eller om mallen är, citationstecken unquote, sidfot, den linjen det att jag har markerat, linje åtta, är helt enkelt ta det namnet, som rubrik, och sammanlänka den med punkt PHP. Så att vi inte har denna operatör i C. Detta punktoperatorn är en fantastisk sak i PHP-- om du är bekant med JavaScript eller Java, du kan använda plus underteckna göra sammanfogning. I C är det en smärta i neck-- och jag är så ledsen, i p-set sex, du kommer att behöva göra this-- det är en smärta i nacken att sammanfoga strängar. Varför? Jo, därför att om du har en sträng som är denna långa, och en annan sträng som är denna långa, du kan inte bara koppla ihop dem. Vad vill du istället ha att göra i C? Yeah? PUBLIK: [OHÖRBAR] DAVID MALAN: Du måste malloc minne, eller använd en array på stacken. Och du har faktiskt göra den arrayen är tillräckligt stor för att passa detta plus detta, plus backslash noll. Sedan sammanfoga dem tillsammans med hjälp av rör katt eller manuellt med en for-loop, eller valfritt antal tekniker. Och vi visa ett par i p-set sex. Det är en smärta i nacken. Och det är verkligen vad jag menar om Detta jämfört this-- som C kontra PHP. Du får precis så mycket mer funktionalitet för gratis, så att du kan fokusera, helst på det roliga del av kodning, den projekt som du vill lösa, snarare än den låga nivån minutiae. Så det här bara genererar header.php eller footer.php baserat på vilka jag kallar. Och faktiskt om jag går i index.php, meddelande allt som changed-- Istället för ringer göra sidhuvud eller sidfot göra, Jag ringer render, följt av namnet på mallen som jag vill göra. Och du ser detta också, i problembild sju, där vi tillåta dig att använda Samma funktion att göra klasar och klasar av olika webbsidor. Så i stället för att uppehålla mig alltför mycket mer på dessa details-- där du kan se igen i problem set seven-- låt oss titta vid nu i början av en lösning till ett mer intressant problem. Hittills ingenting vi har gjort har sparade data. I själva verket, den enda gången som vi någonsin har sparat något som vi har gjort i denna klass är när vi hade en mycket enkel demo stund tillbaka, där vi använda filer IO i C, och jag tror att jag skrev i mitt namn, och Hannah namn, och Marias namn, eller kanske Andy namn, och då vi sparade en CSV file-- kommaseparerade värden fil. Och vi använde fopen-- Jag tror vi använde fprintf som jag minns, och vi sparat en fil. Nu, är att den enklaste form av en databas. Om du vill göra en webbplats för Frosh IMS-programmet, varvid freshmen kan registrera sig för en sport, du helst vill göra något med dessa uppgifter. Förra veckan gjorde vi ingenting med data-- vi just sagt, du är registrerad, inte riktigt. Eller kanske jag mailade Proctor, och det var det. Men det skulle vara trevligt om jag kunde ge det proctor en CSV-fil, som en Excel-fil. Eller ännu bättre, skulle det vara trevligt om jag kunde sätta dessa användares namn och sovsal namn och allt det i en databas som bara lever för evigt, tills jag väljer att ta bort data. En databas som gör det möjligt mig att hämta information. Och faktiskt, det är vad en databas är. Vi introducerar idag, och nästa vecka också, en teknik kallas SQL-- en Structured Query Språk, vilket är ett annat språk. Det är i huvudsak en programmerings språk, men för databaser. Och en databas för nu, bara tänka på som en super snygga version Microsoft Excel eller Google Kalkylblad eller Apple Numbers. Det är i allmänhet ett program som låter du kan lagra en massa uppgifter i rader och kolumner, ganska som du kanske i Excel. Men vad är trevligt, särskilt om Vi är inte super bekant med Excel, vad SQL låter dig göra är fråga här information genom att skriva rader kod där du kan, även om din databas har en miljon rader i det, du kan hitta saker supersnabb. I själva verket är Excel särskilt dålig på stora datamängder. Och i själva verket upp till ett par år sedan, visade sig Excel skulle bara tillåter dig att lagra upp till 65.535 rader av data-- som låter som en hel del, men på När jag var en grad student, och jag minns snubbla över detta eftersom jag var generera CSV-filer för min forskning och jag ville analysera dem snabbt genom att bara öppna upp i Excel. Naturligtvis, min dator bara kraschat, eftersom jag hade mer än 65.000 rader. Men där gjorde 65.535 ifrån? Vad var Microsoft gör, förmodligen? Om du är bra med dina befogenheter två? Ja, de använde en 16-bitars värde för att representera radnumret. Och två till 16 är 65,536-- minus ett, för om du noll index innebär att var flest antal rader jag kunde ha. Och det var bara ett beslut design. Genom att spara 16 bitar, begränsade de mig till 16.000 rader, i stället för 4 miljarder, som jag kunde ha haft idealiskt. Men för nu, ska vi införa detta mer i ett webbsammanhang. Och vad är trevligt om SQL är att även även om det är ganska stark och ganska sofistikerat, verkligen kokar det ner till fyra tangentoperationer, fyra nyckelfunktioner, om du will-- välja, för att hämta data, söka för data; radera eller radering av data; infoga för att lägga rader till databasen; och uppdatering. Så om du någonsin har använt Google Kalkylblad, Apple Numbers, Microsoft Excel, du har verkställt, mest troligt, allt av dessa åtgärder som en människa med bara med hjälp av tangentbordet och mouse-- infoga data, med hjälp av dina ögon för att välja eller söka efter uppgifter, eller uppdatera data eller ta bort data. Så vad betyder det? Tja, förinstallerat i CS50 IDE är ett program som heter MySQL. Det är en fri, öppen källkod databas som är super populär. Facebook, till exempel, använder den för att detta dag, bland annat verktyg som de använder. Och en hel del mycket populära webbplatser använder det till stor del eftersom det är snabbt, och eftersom det är gratis. Men absolut finns alternativ. Och några av er kanske plaska med alternativ för examensarbeten. Detta är en skärmdump, under tiden, av ett webbaserat verktyg som heter phpMyAdmin. Det är en slump att Detta webbaserade verktyg är också skriven på ett språk, PHP, men vad det är tänkt att göra är att ge oss ett webbaserat gränssnitt till en databas. Eftersom MySQL är typiskt något historiskt, du skulle samverka med endast med en kommandorad. Och det skulle vara super irriterande och svårbegripliga att ha att skriva textkommandon för att välja uppgifter, infoga data, och ta bort data. Så en del människor på internet skrev ett webbaserat program att bara låta oss hantera data i vår databas. Det är som att dubbelklicka på Excel, och kör en webbaserad version därav. Och vad du kommer att använda detta för i slutändan nästa vecka, inte p-set sex, men är att bygga något kallas CS50 Finance, som kommer att ha en databas över användare, med användarnamn och lösenord, dollar belopp som de har på sina bankkonton. Det kommer att bli något du använder för att lagra symbolerna och de kvantiteter över bestånd som användare har köpt med hjälp av virtuella dollar som du ger till dem. Och det kommer att tillåta användare att anmäla sig till din webbplats, så att även dina vänner kan lyssna på din webbplats och faktiskt registrera, logga in och leka och försöka hitta fel i koden, och försöka hitta fel på din webbplats. Och de kommer att registrera med sätta sig själva, effektivt, via koden du skriver till din databas. Till exempel är detta en sammanfattning skärmdump vad en databas kan se ut. Detta var från en av förra årets solutions-- Detta är som en mini Excel fil som finns lagrad i vår databas, lagras i denna programvara kallad MySQL. På vänster sida, jag har tydligen ges varje användare ett unikt nummer. I den andra kolumnen, har jag givit alla en användare name-- min egen bland dem. Och på höger sida, Jag har gett dem en hash. Nu detta är faktiskt ett lösenord, men det är inte en vanlig text lösenord. Det är en krypterade lösenord, om du vill, eller en hash lösenord. Som vi ska återkomma till inom kort. Men om du någonsin läst en artikel om hur ditt lösenord på någon bank eller någon webbplats kan ha äventyrats, Det kan i allmänhet innebära en av två saker. Så det här är bara ett utdrag av sex användare. Alla ni nu kan räkna via hacking eller cracking vad våra sex folks lösenord är. Men om du någonsin har fått en varning eller en ursäkt från ett företag eller en webbplats säger, ledsen, bröt en hacker i vår databas, bör du nog byta lösenord, vad kan det betyda? Tja, en, kan innebära Företaget har varit mer idiotiska, och har lagra dina lösenord i en kolumn som denna, okrypterad. Vilket innebär att motståndaren, som stal databasen bokstavligen vet ditt användarnamn och lösenord. Det är det värsta tänkbara scenario. Och som du ser i p-set sju, så lätt att undvika. Det finns absolut ingen ursäkt för att form av dumhet i dagens internet. Two-- och vi hittar några artiklar att vittna att det fortfarande händer, nonetheless-- två, kanske motståndaren stal denna version av databasen. Vilket är fortfarande slags dåligt, eftersom nu de vet att jag har sex kunder, Jag vet användarnamn av dessa sex kunder, och jag vet den krypterade versioner, eller streckade versioner, av dessa sex kunders lösenord. Men någon av er som kanske har gjort [? Hacker 2?] där du spruckna lösenord, eller tog En titt på den versionen av problemet set, varför är det fortfarande lite oroande Om motståndaren vet ditt hash lösenord? PUBLIK: Eftersom de kunde ange hela ordlistan in hashfunktionen. Och om ditt lösenord är en ordbok ord [? De kan bara match--?] DAVID MALAN: Exakt, motståndaren kan bara skriva kod, som några av er gjorde för [? Hacker?] 2, där du iterera över alla ord i ordlistan, eller alla möjliga kombinationer av A till Z och en genom nine-- vilket låter som en hel del, och det är. Men för en dator, Det är ganska snabbt. Och faktiskt, var att punkt [? Hacker 2,?] Var att ta saker som bokstavligen ser ut så här, och dekonstruera vad det egentligen var. Så ska vi titta på hur vi kan lagra denna mer effektivt. Det visade sig, tack och lov i MySQL, det kommer att bli datatyper. Och en av de roliga delarna om databasdesign, att vara ärlig, är egentligen bestämmer själv hur ska du representerar data? Om du representerar ett telefonnummer som en int, som ett stort antal, eller en lång tid? Eller vill du verkligen göra det som en sekvens av tecken? Och det kan vara mycket icke-triviala effekterna av detta. I själva verket en av de tidigaste, roliga förbunden berättelser är när Mark Zuckerberg byggde Facebook, var det ursprungligen skriven på, och fortfarande till stor del skriven i PHP. Och en av de största utmaningarna de mötte tidigt var skalning. När de höll lägga till skolan efter skola efter skolan, så vitt jag vet, en av de originella lösningar var i huvudsak att kopiera och klistra in några av de databaser och en del av koden, så att Harvard var körs på en egen server, och MIT kördes på sin egen server. Och det var därför, för vissa av er som kanske kommer ihåg, du kan inte ha vänner i andra nätverk. Du har förmodligen inte har vänner på MIT eller Harvard 10-tal år sedan, men du kan inte spänna nätverk för dels den anledningen. Och en av de största utmaningarna för Mark och för företag som Facebook faktiskt hanterar hundratals och tusentals och miljontals förfrågningar per sekund. Så de saker vi börjar talar om den här veckan verkligen kommer att vara relevant för skriva bra program, och populärt framgångsrika verktyg som kan hantera många användare. Så vi ska prata om saker som indexering och sökning, men det är det för dag. Vi kommer att se dig mer på onsdag. [MUSIK - "Seinfeld" TEMA] DAVID MALAN: Du kan till det, och subtrahera från den. Och du behöver inte hålla med någon förutbestämd mängd av minne. Tja, vad som kommer att kallas? TALARE 1: Tja, vad som händer? TALARE 2: Vad menar du? Han föreläser. DAVID MALAN: Och vi kan använda en Funktionen kallas malloc att memory-- TALARE 1: Varför är inte armarna flytta? TALARE 2: Tja that's-- du vet, det är normalt. Det är precis som han har bara stora korvar hänger där. TALARE 1: Det är normalt? TALARE 2: Ja, jag tror att vi bara antar att han av misstag ersatt sin deodorant med superlim.