[Anmeldelse: Quiz 1] [Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Harvard University] [Dette er CS50.] [CS50.TV] [Lucas Freitas] Velkommen alle. Dette er en anmeldelse af quiz 1. Ligesom en ansvarsfraskrivelse, det er - jeg mener, vi kommer til at forsøge at dække så meget materiale som muligt, men det betyder ikke, at vi kommer til at dække alle de ting, der kan være i quiz 1. Så vær sikker på at du også tage et kig på foredrag, sektioner, alt det, du kan. Quiz 1 vil være på onsdag, næste onsdag. Så sørg for at studere. Det kommer til at være, temmelig meget, ligesom den første quiz vedrørende dens format, men det er sandsynligvis vil være meget sværere. I det mindste sidste år, da jeg tog 50, jeg troede det var meget sværere. Så studere en masse. Jeg har tænkt mig at dække datastrukturer og Huffman kodning. Det er noget, en masse mennesker tror er kompleks, men jeg har tænkt mig at prøve at gøre det så let som muligt. Først og fremmest, hvad vi ønsker jer at vide for quiz 1 er at forstå de konceptuelle beskrivelser af hver af de datastrukturer, som jeg har tænkt mig at præsentere. Det betyder at du ikke behøver at faktisk gennemføre en hash tabel i din quiz 1. Vi ønsker ikke at gennemføre en hel hash tabel, måske skal vi prøve at gøre dig implementere nogle funktioner, de mest almindelige operationer, men vi kommer ikke til at gøre dig gennemføre alt. Så det er vigtigt, at du forstår konceptet bag hver datastruktur og også, at du er i stand til at kode i C, blot de mest almindelige operationer, de har for hver datastruktur. Og også være i stand til at gennemgå pointere og structs, fordi de synes en masse i disse datastrukturer. Først forbundet lister. Hægtede lister er faktisk meget lig arrays, men forskellen mellem en sammenkædet liste og en matrix, først og fremmest, at en sammenkædet liste har en meget fleksibel størrelse, mens i arrays du nødt til enten at vælge en meget stor størrelse for array, så du ved, at du vil være i stand til at gemme alle dine data i det array, eller du er nødt til at bruge malloc at have en fleksibel længde på array. I hægtede lister er det meget nemt at bare få flere elementer, sætte flere elementer i den linkede liste eller fjerne elementer. Og faktisk, hvis du ikke ønsker den linkede liste, der skal sorteres, du kan søge og fjerne elementer i konstant tid, så O (1) tid, så det er meget praktisk. Du skal bare nødt til at være omhyggelig med at altid huske at allokere og fri noder, bare fordi hvis du ikke gør det, vil du have memory leaks. Så hægtede lister - definitionen af ​​en node er ligesom det, vi har lige der. Jeg sætter int n, men du kan gemme alle data, du ønsker. Så hvis du ønsker at gemme en streng, det er fint. Hvis du ønsker at gemme en struct, det er fint, en dobbelt, hvad du vil. Jeg bare sætte int n for eksemplerne her. Og du har en pointer til den næste node. Så dybest set, en sammenkædet liste har nogle data, og så den peger på den næste node. Hvis det er det sidste element i den linkede liste, går det til at pege på NULL. Så dette er et eksempel på en sammenkædet liste. Okay, så lad os nu se, hvad vi skal gøre, hvis jeg ønsker at indsætte et element i en linket liste. For det første vil en funktion insert være af typen void fordi jeg ikke ønsker at vende tilbage noget. Og jeg har tænkt mig at tage en int som argument, fordi jeg ønsker at vide, hvad jeg vil indsætte. Så hvad er den første ting, jeg skal gøre? Nå, skal jeg allokere på newnode, så er den første linje. Jeg er bare at skabe en ny knude til at sætte i en linket liste. Så hvad kan jeg gøre? Tja, vi ved, at i vores implementeringer af hægtede lister i klassen, sætter vi altid hovedet som en global variabel. Så hvad vi kan gøre, er at ændre hovedet. Jeg kan gøre dette nye knudepunkt være den nye leder, og det kommer til at pege på den tidligere hoved. Hvordan kan vi gøre det? Den første ting, jeg har at gøre er at ændre 'n' i den nye node til værdi, som blev overført til funktionen. Så er newnode næste bliver hovedet. Hovedet vil blive newnode. Så det er ret simpelt. For at slette en node, kan vi gøre det som - En måde kunne vi gøre det er at sige, okay, hvis jeg ønskede at slette, for eksempel, 3, hvad jeg kunne gøre, er blot pege den forrige node til den næste node i 3.. Så jeg ville bare gøre sådan noget. Men hvad er problemet med at gøre det? Jeg har en hukommelsesfejl, så jeg har ikke adgang til det nummer 3 længere. Problemet med det er, at jeg ikke har tænkt mig at være i stand til at frigøre denne node. Jeg har tænkt mig at have hukommelsesfejl og (uforståelige) kommer til at hade mig. Så i stedet for at gøre det, skal jeg nok have en midlertidig pointer. Så jeg sætte temp. Det kommer til at pege på den knude, som jeg ønsker at slette. Og så kan jeg flytte de tidligere noder til punkt til det næste node af den knude, som jeg ønsker at slette. Og endelig kan jeg befri markøren. Behøver jeg at frigøre pointer, jeg skabte lige der? Jeg behøver ikke at bare fordi - forskellen er, at denne node blev oprettet ved hjælp malloc, så det er i den bunke, mens denne ene bare blev erklæret som en NULL switch i stakken. Så jeg behøver ikke at befri det. Okay. Så lad os nu tale om stakke. Stakke er temmelig ligetil. Vi gjorde stakke og køer i klasse bare at bruge arrays, men du bør være bekendt - bare være klar at du også kan gøre stakke i kø ved hjælp af hægtede lister så godt. Så hvis du har et array, hvad ville være en stak? En stak, først, vil have en størrelse. Du er nødt til at gemme det, der er på størrelse med den stak, som du har lige nu. Og også du ville have et array, i dette tilfælde af tal, men hvis du vil, kan det være et array af strygere, en vifte af struct, noget, som du vil gemme. Om stakken: Forskellen mellem en stabel og en sammenkædet liste er, at i stakken, du kun har adgang til det sidste element, der blev lagt i stakken. Det hedder sidst ind, først ud. Ligesom du har en stak af bakker, hvis du sætter en bakke på toppen af ​​stakken, du nødt til at fjerne den bakke først at få adgang til de andre bakker. Det er det samme med stakke. Så hvis jeg vil, for eksempel, tilføjer et element til en stak, hvad skal jeg gøre? Det hedder skub, og det er temmelig ligetil. Den første ting du skal gøre er at kontrollere, om størrelsen af ​​stakken ikke er større eller lig med kapaciteten af ​​stakken. Fordi hvis du allerede er på fuld kapacitet, kan du ikke tilføje noget andet. Og hvis ikke, er du bare nødt til at tilføje elementet til stakken. Og endelig forøge størrelsen. Så det er temmelig ligetil. Så jeg blot tilføje nummer 2. Og hvis jeg ønsker at pop, hvilket betyder, at jeg ønsker at fjerne det sidste element, der blev tilsat, og returnerer værdien af ​​elementet, den første ting, jeg er nødt til at kontrollere, er, at stakken ikke er tom. For hvis den er tom, kan jeg ikke vende tilbage noget. I så fald, vil jeg vende tilbage -1. Ellers vil jeg formindske størrelsen af ​​spec, og returnere numre (s.size). Hvorfor gjorde jeg formindske størrelsen og derefter vende tilbage s.size? Det er fordi, i dette tilfælde spec har str. 4, og jeg ønsker at vende tilbage det fjerde element, right? Men hvad er indekset for den fjerde element? Tre. Da jeg tror størrelse - vil være 3, kan jeg bare returnere s.numbers (s.size) fordi det er 3.. Så det er bare indekset. Nu køer. Køer er stort set den samme. Den eneste forskel er, at i stedet for at have sidste ind, først ud, har du først ind, først ud. Sandsynligvis, hvis du venter på at gå til en koncert, ville du ikke være glad, hvis du havde en stak i stedet for en kø. At være den sidste person til at komme ville være den første person til at komme ind i koncerten. Du ville sikkert ikke være glad. I køen, den første person til at få i er også den første person til at komme ud. Så i definitionen af ​​en kø, ud over at have størrelse i arrayet, du også nødt til at have hovedet, hvilket er indekset til lederen af ​​stakken. Så det første element lige nu. Sæt i kø er det samme som fremstød for stakke. Hvis du var meget naiv, ville du bare sige, godt, jeg kan bare gøre præcis det samme, som jeg gjorde for push. Jeg kan lige tjekke, hvis det ikke ud over kapaciteten. Hvis det er, jeg vender tilbage falsk, ellers kan jeg bare eksportere den nye værdi og derefter forøge størrelsen. Men hvorfor er det forkert? Lad os se dette eksempel. Jeg forsøger at enqueue en masse ting, og så vil jeg dequeue og enqueue. Der er en masse kommandoer, men det er meget simpelt. Jeg har tænkt mig at enqueue 5, så tilføje 5, og derefter 7, 1, 4, 6, og så vil jeg dequeue noget, hvilket betyder, at jeg har tænkt mig at fjerne det første element. Så jeg har tænkt mig at fjerne nummeret 3, right? Det første element. Okay. Nu, hvis jeg prøver at enqueue noget andet er, hvad kommer til at ske? Ifølge min implementering, Jeg skulle til at sætte det næste tal i indekset q.size. I dette tilfælde er størrelsen 8 så indekset 8 vil være lige her i den sidste position. Hvis jeg prøver at enqueue 1 lige her, ville jeg være at overskrive den sidste position til nummer 1, som er helt forkert. Hvad jeg ønsker at gøre, er at vikle rundt og gå til den første position. Måske vil du bare sige, ja, jeg bare nødt til at tjekke hvis jeg rent faktisk kan sætte noget der. Hvis ikke, jeg bare sige, åh, den nye fuld kapacitet er faktisk kapacitet - 1, og du kan ikke sætte et element der. Men hvad er problemet? Problemet er, at hvis jeg bare dequeue alting lige her og så prøver jeg at tilføje noget andet, ville det bare sige, godt, du var på fuld kapacitet, hvilket er 0. Så din kø er væk. Du er nødt til at vikle rundt, og en måde indpakning rundt at du fyre lært i visionære og andre psets var ved hjælp af mod. Du kan prøve det derhjemme at forstå, hvorfor du ville gøre q.size + q.head mod kapacitet, men hvis du tjekker lige her, Vi kan se, at det virker. Så i det sidste eksempel, var q.size 8 og hovedet var 1, fordi det var denne holdning her i array. Så det vil være 8 + 1, 9. Mod kapacitet 9 ville være 0. Det ville gå til indekset 0. Vi vil være i den rigtige position. Og prøv så køen derhjemme. Nogle vigtige ting: prøv at forstå forskellen mellem en stak og en kø. Derhjemme, forsøge at få meget fortrolig med at gennemføre enqueue, dequeue, skubbe og pop. Og også forstå, når du ville bruge hver af dem. Så lad os slappe af i 10 sekunder med en flok Pokemons. Og lad os nu gå tilbage til datastrukturer. Hash tabeller. En masse mennesker var bange for hash-tabeller. i problemet sæt 6, Stavekontrol. Hash tabeller og forsøger, en masse mennesker bliver skræmt af dem. De tror, ​​de er så svært at forstå. Ja? [Rob Bowden] Problem sæt 5. Problem sæt 5, ja. Tak Rob. Ja. Seks var Huff n 'Puff, ja. Problem sæt 5 blev Stavekontrol, og skulle du bruge enten en hash tabel eller en prøve. En masse mennesker troede, at de var super svært at forstå, men de er faktisk ret simpelt. Hvad er en hash tabel, dybest set? En hash tabel er en vifte af hægtede lister. Den eneste forskel mellem en matrix og en hash tabel er, at i hash tabellen, du har noget, der hedder en hash-funktion. Hvad er en hash-funktion? Jeg ved ikke, hvis du fyre kan læse her. Dette er et eksempel på en hash-tabel. Så du kan se, at du har et array med 31 elementer. Og hvad vi gør i en hash tabel have en hash-funktion der kommer til at oversætte en nøgle, hver int til et indeks. Hvis for eksempel, hvis jeg ønsker at vælge til B. Harrison, Jeg ville sætte B. Harrison i mine hashfunktioner, og hash-funktionen ville vende tilbage 24. Så jeg ved, at jeg ønsker at gemme B. Harrison i 24.. Så det er forskellen mellem blot at have en system og en hash tabel. I hash tabellen, du vil have en funktion, der vil fortælle dig hvor du vil gemme de data, du vil gemme. Hash-funktionen, du ønsker at kigge efter en hash-funktion der er deterministisk og godt fordelt. Som du kan se her, kan du se, at en masse af de data, som jeg ønskede at butikken var faktisk 19 i stedet for at bruge 31 og 30 og 29, der alle var frie. Så hash funktion, jeg brugte var ikke meget godt fordelt. Når vi siger godt fordelt, betyder det, at vi ønsker at have, groft, mindst 1 eller 2 for hver af de - som en forskel på 1 eller 2 for hver af indeksene i arrays. Du ønsker at have, groft, det samme antal elementer i hver linkede liste i array. Og det er nemt at kontrollere, om det er gyldigt i hash tabellen, se som hash-tabeller. Derefter træer. Dette er et træ. Træer i datalogi er op og ned eller anden grund. Så lige her har du roden af ​​træet, og derefter bladene. Du skal bare vide, nomenklaturen for forældre og barn. Hver node har sine børn, som er de knuder, der er under moderselskabet. Så for eksempel, 2 vil være den forælder til 3 og for det andet barn lige der, mens 3 vil være den forælder, for 1 og de andre børn, der er der. Og 1 vil være 3 barn, og så videre. Vi har noget meget mere interessant, kaldes en binær søgning træ, hvor alle de værdier på højre side af en knude kommer til at være på den rigtige, lige her - til højre kommer til at være større end det element i roden. Så hvis jeg har nummer 5 lige her, alle de elementer til højre kommer til at være større end 5, og på den venstre alle elementer kommer til at være mindre end 5. Hvorfor er det nyttigt? Tja, hvis jeg ønsker at kontrollere, om nummer 7 er her, for eksempel, Jeg bare gå til 5 først, og jeg har tænkt mig at se, er 7 større eller mindre end 5? Det er større, så jeg ved, det kommer til at have for at være på den rigtige af træet. Så jeg har meget mindre ting at se på. Til gennemførelse af en binær søgning træet, knude, jeg bare nødt til at have data så int n, og du kan også have en snor eller noget, du ønskede. Du skal bare nødt til at være forsigtige med at definere, hvad der er større, hvad er mindre. Så hvis du havde strenge, for eksempel, kunne du definere at alle disse ting på den rigtige kommer til at have større længde, venstre kommer til at have lavere længder, så det er virkelig op til dig. Hvordan kan jeg implementere finde for BST? Den første ting, vi bliver nødt til at gøre, er at kontrollere, om roden er NULL. Hvis det er NULL, betyder det, at ting ikke er der fordi du ikke engang har et træ, right? Så jeg vender tilbage falsk. Ellers vil jeg kontrollere, hvis antallet er større end værdien i roden. Jeg har tænkt mig at forsøge at finde det element på højre af træet. Du kan se, at jeg bruger rekursion her. Og derefter, hvis det er mindre, jeg har tænkt mig at se på venstre. Og endelig, ellers, hvis det ikke er mindre eller ikke større, det betyder, at det er selve værdien. Så jeg bare returnere sandt. Her kan du se, at jeg brugte om, hvis, hvis det. Og husk, i quiz 0, vi havde et problem, der havde om, hvis, hvis det, og du skulle finde ineffektivitet, og ineffektivitet var, at du har brugt hvis. Du skulle have brugt, hvis ellers hvis ellers hvis og andet. Så skal jeg bruge andet, hvis og andet, hvis og ellers her? Er der nogen - ja? [Student taler, lydløs] Det er perfekt. Så hun siger, at det ikke betyder noget, bare fordi ineffektivitet, som vi havde før var, at fordi, måske hvis nogle betingelse blev opfyldt, så du har udført en handling, men så du skulle kontrollere alle de andre betingelser. Men i dette tilfælde, det vendte med det samme, så det gør ikke noget. Så du behøver ikke at bruge andet, hvis. Og endelig, lad os tale om forsøg, som er alles favorit. En prøve er et træ af arrays. Det er meget hurtigt at se op værdier, men det bruger en masse hukommelse. Og det er som regel til at filtrere ord, så når du ønsker at gennemføre, for eksempel, ved jeg ikke, ligesom en telefonbog i telefonen og du ønsker at være i stand til at skrive B og bare have navne på folk, der har B. Det er meget let at gennemføre, at bruge en prøve, for eksempel. Hvordan definerer du en knude i en chance? Du skal bare nødt til at have en bool, der vil blive is_word. Det svarer til at bruge alle de karakterer, før denne node, du var i stand til at danne et ord, og så har du en bred vifte af henvisninger til noder. Kan du se, at vi har en bred vifte af forælder knudepunkter, så knude * array? Ja? Så lad os se, hvordan det vil fungere. For stavekontrollen, Vi har en vifte af 27 elementer, fordi vi har alle de breve plus apostrof. Før her jeg bare kommer til at bruge 2, fordi jeg ønsker at være i stand til at skrive på tavlen. Okay. Så dette er et eksempel på en prøve. Hvis jeg bare definere den første knude, jeg har en vifte af 2 elementer der er 2 pegepinde til NULL, så jeg bare sætte 'a' og 'b'. Og jeg har tænkt mig at have en bool, der siger is_word. Det kommer til at være falsk for det første, bare fordi, før, at du ikke har nogen tegn. Så et tomt ord er ikke et ord. Så det er falsk. Hvis jeg ønsker at tilføje 'a' til denne ordbog, hvad ville jeg gøre? Jeg vil bare nødt til at allokere et nyt knudepunkt for 'a', og tilsæt derefter sit ord til true. Så det bare repræsenterer at have 'a' kommer til at være sandt. Mening? Så hvis jeg ønsker at tilføje "ba", vil jeg nødt til at allokere 1 for 'B', og så vil jeg oprette boolean til false, fordi 'b' i sig selv er ikke et ord. Så jeg har tænkt mig at allokere en anden for 'a', så 'ba', og så vil jeg oprette det er et ord til virkelighed. Fordi 'ba' er et ord. Og så hvis jeg vil se, om 'b' er i denne ordbog, Jeg kan bare gå til den første, 'b'. Jeg går ned, og jeg ser på, er ord, og det siger falsk. Så det er ikke et ord. Hvis jeg ønsker at kontrollere "ba", Jeg går til den første, 'B', og gå derefter til 'a', og jeg ser rigtigt, så det er et ord. Mening? En masse mennesker bliver forvirrede af forsøg. Nej? Endelig Huffman-kodning. Huffman kodning er meget nyttigt for at spare hukommelse og komprimere tekstfiler bare fordi en masse gange, du bruger 'a' og »e«, for eksempel, i dine dokumenter, men jeg ved ikke, hvis du fyre bruge 'q' eller 'z' så meget. Have bare 1 byte for hver enkelt tegn, hver enkelt - de 256 tegn, som vi har i ASCII tabellen ikke er meget optimal, bare fordi der er nogle tegn, som du bruger meget mere, så bør du nok bruge mindre hukommelse for dem. Hvordan bruger jeg Huffman kodning? Vi er nødt til at gøre en Huffman træ.  En Huffman træ har knuder der har et symbol, der kommer til at være ligesom, 'a', 'b', 'c', bogstavet, uanset brev, du har, en frekvens, der er den frekvens, som ordet forekommer i teksten, at du var at skabe den Huffman træet for, og derefter en node, der kommer til at pege til venstre Huffman træ og en anden node, der kommer til at pege til højre. Så ligesom et træ. Hvordan kan du opbygge en Huffman træ? Du kommer til at plukke de 2 knuder, der har de laveste frekvenser. Hvis du har en uafgjort du kommer til at plukke de 2 knuder der har de laveste ASCII-værdier så godt. Så du kommer til at skabe et nyt træ ud af de 2 knuder , der vil have den kombinerede frekvens i forælder node. Og så er du kommer til at fjerne de 2 børn fra skoven og erstatte dem med moderselskabet. Og du kommer til at gentage, at indtil du kun har 1 træ i skoven. Så lad os se, hvordan du ville gøre en Huffman træ for ZAMYLA. Du kan se her, at alle bogstaverne har frekvens 1, bortset fra 'A', der har frekvens 2. Så jeg oprettede knudepunkter for alle de breve, jeg sat i rækkefølge ASCII værdi og hyppighed. Så hvis jeg ønsker at oprette det første træ, vil det være med 'L' og 'M'. Så det er her. Hyppigheden af ​​parret vil være 2 fordi det er 1 + 1, så den næste 2 med de laveste frekvenser er 'Y' og 'Z'. Og så har jeg dem alle at være - har en frekvens på 2. Så hvilke er dem, der har den laveste ASCII værdien for den næste? 'A' og 'L'. Så jeg oprette den nye node, og endelig, det er 4 og 2, så 2 bliver til venstre. Og dette er den Huffman træ. Så hvis jeg vil skrive noget tekst, ligesom i binær til at konvertere til tekst, ved hjælp af Huffman træet er meget let. For eksempel, hvis jeg siger, at flytte til venstre er en 0 og bevæger sig til højre er en 1, Hvad er der kommer til at repræsentere? Så ligesom 1, 1, så til højre, højre, og derefter 0, så forlod ville være L, og derefter 1, 0, 0. Så 1, 0, så bare 1, 0, 'A'. Og så 0, 1, så 'Z'. Og derefter 1, 0, 0 - no. 0, 0 vil være 'Y', så doven. Så det er alt for mig, Rob kommer til at tage over. [Rob Bowden] Så uge 7 ting. Vi har fået en masse at gå over rigtig hurtigt. Bitvis operatører, buffer overflow, CS50 bibliotek, så HTML, HTTP, CSS. Alt i som 15 til 20 minutter. Bitvis operatører. Der er 6 af dem, at du behøver at vide. Bitvise og bitvise eller, XOR, venstre skift, højre skift, og ikke. Højre Shift og ikke du så næppe i foredrag overhovedet. Vi vil gå over det hurtigt her, men det er godt at vide, at disse er de 6 der findes. Husk, at bitvise operatører er ligesom når du gør 3 + 4. Du er ikke beskæftiger sig med den binære den 3.-4. Med bitvise operatører du er faktisk beskæftiger sig med de enkelte bits i numrene 3 og 4. Så den første, som vi vil sige er bitvis ikke, og alt det gør, er flip alle bits. Så her, hvis du skriver dette i C, ville du ikke skrive det som ~ 11011 eller hvad, ville du skrive det som ~ 4, og så ville det vende den binære repræsentation af 4.. Så her, ~ nogle binære tal 1101101 vil præcis flip alle 1 s til 0'er og alle 0 s til 1 s. Som jeg siger der, den hyppige brug af dette, og vi vil se det i en bit, er som vi ønsker at komme op med nogle tal hvor alle bits er 1, med undtagelse af et af dem. Så det er som regel lettere at udtrykke tal hvor netop det enkelt bit er indstillet, og derefter tage den ~ af det, så hver anden bit er sat, bortset fra at en. Så det er, hvad vi kommer til at bruge mere i en bit. Bitwise eller. Her er 2 binære tal, og disse 2 numre er temmelig repræsentative, da de repræsenterer alle mulige kombination af bits skal du kunne operere på. Her når jeg or'd hver bit, vi bare at sammenligne lige ned. Så på den venstre side har vi en 1 og en 1. Når jeg bitvis | dem, hvad jeg kommer til at få? One. Så bitvis | 0 og 1 kommer til at give mig? One. Bitwise 1 og 0 vil være det samme, en. Bitwise 0 | 0 vil give mig 0. Så det eneste tilfælde, hvor jeg får 0 er i 0 | 0 tilfælde. Og du kan tænke på, ligesom dine logiske ors. Så hvis du tænker på 1 som sandt og 0 som falsk, det samme gælder her. Så sandt eller sandt, er sandt, sandt eller falsk, er sandt. Falsk eller sand er sandt; falsk eller falsk, er det eneste, der er faktisk falsk. Her er det eksempel, som du bør kende som et temmelig godt eksempel på, når der anvendes bitvis operatører. Her, hvis vi eller kapital 'A' med OX20, og vi vil se på disse i en anden, vi får noget. Og hvis vi eller små bogstaver 'a' med OX20, vi får noget. Så lad os trække op ASCII tabellen. Okay. Her ser vi, at "A" er - her har vi 'A' er decimal 65. Men jeg vil gå med hexadecimal, som er Ox41. Temmelig sikker på, vi så det i klassen. Jeg tror, ​​vi så det i klassen at det er ret nemt at konvertere fra hexadecimal til binær. Så her, hvis jeg ønsker at sætte 4 i binær, der er bare at være 0100. Det er 1 plads, 2 plads, 4 plads, så det er 4.. Så kan jeg opdele 1 i binær, som kommer til at være 0001. Og så dette vil være repræsentation af 'A' i binær. Tage små bogstaver »a«, er det nu kommer til at være Ox61, hvor opdele disse op i sin binær, så en 6 - Lad os rent faktisk gør det - er der ingen viskelæder? Viskelæder. Ox61. Så opdele 6 i binær vil være 0 + 4 + 2 + 0. Og opsplitning 1 kommer til at være 0001. Ser man på forskellen mellem disse 2, ser vi, at den eneste forskel mellem et lille og et stort »A« er denne enkelt bit. Så kommer tilbage til her - okay. Kommer tilbage til her, hvis vi ser på, hvad bit OX20 er, så opsplitning OX20 i sin binær, er 0010 0000. OX20, den eneste bit, der er sat, er denne bit, som vi beskæftiger os med, med at skifte mellem store og små "a". Hvis jeg eller 'A', som er det ene, 'A', hvis jeg eller 'A' med OX20, hvad skal jeg købe? [Studerende, lydløs] Små bogstaver »a«, fordi det kommer til at vende denne bit til en 1. Og hvis jeg eller 'a' med OX20, hvad jeg kommer til at få? Små bogstaver a, fordi bare ORING 'a' med OX20, Jeg skal bare være ORING denne enkelt bit til en 1, det er allerede en 1, så det er ligegyldigt. Så vi får 'a' og 'a'. Bitwise og. Igen, kan vi tænke på dette som vores logisk og modstykke. På venstre side har vi sand & sandt. Det kommer til at være sandt, og for alle de tilfælde, falsk og sand eller sand og falsk, eller falsk & falsk, ingen af ​​disse ting er sande. Så hvad vi ender med at få, er 1000. Så nu, her, her er, hvor jeg har brugt den trofaste bitvise ikke, hvor vi havde OX20. Så dette er OX20. Nu, hvad jeg ønsker at gøre, bitvis ~ af OX20. Det kommer til at vende alle de bits. Så jeg har 1101, 1111. Og så 'A' anded med ~ OX20 kommer til at give mig, hvad? Den eneste bit, vi virkelig har brug for at tænke på er denne ene, siden, hvis alle disse bits er sat til 1, så vi kommer til at få præcis, hvad 'A' var, undtagen eventuelt hvad denne bit er. For hvis det var en 1, nu det kommer til at være sat til en 0, fordi uanset hvad det er, anded med dette vil være 0. Så hvad er 'A' & ~ OX20 vil give mig? [Studerende besvare, lydløs] Og hvad er »a« og - det er 'A'. Og hvad er 'a' & ~ OX20 vil give mig? »A. ' Da dette er i øjeblikket en 1.. Anding med denne 0 kommer til at gøre det til en 0, og nu vi kommer til at få et 'A'. Begge er 'A', og sidst men ikke mindst af denne type, vi har XOR. Det er meget ligesom eller, bortset fra at det betyder udelukkende eller. Det er ligesom, hvad du normalt tænker på som eller i den virkelige verden. Så du gøre enten 'x' eller 'y', men ikke begge dele. Here 1 ^ 1 kommer til at være 0. Fordi sandt, det er - det virker ikke så godt med den logiske sandt og falsk som bitvise & og eller gøre, men sandt ^ sandt, er falsk. Fordi vi kun ønsker at vende tilbage sandt, hvis kun én af dem er sandt. Så 1 ^ 1 er 0. Hvad omkring 0 ^ 1? Er 1. 1 ^ 0 er 1, 0 ^ 0 er 0. Så under alle omstændigheder 0 bitvis noget 0 kommer til at være 0. 1 bitvis noget 0 eller 0 bitvis 1, hvis det er, | eller ^, det vil være en 1, og hvis det er & det vil være 0. Og det eneste tilfælde, hvor 1 bitvis 1 er ikke 1 er med eksklusive eller. Det er 0110. Så her nu, ved hjælp af XOR - så er vi tilbage ved 20. 'A' ^ OX20 er disse 2 bits, vi sammenligner. Så en 1 ^ 0 vil give mig et hvad? Et. 'A' ^ OX20 kommer til at give mig? Småbogstaver en. 'A' ^ OX20 kommer til at give mig? Capital A. Fordi uanset hvad dette gør, dette XORing med OX20 effektivt flipping hvad denne bit er. Hvis dette er et 0, er det nu kommer til at blive en 1. Da dette er en 1, 1 ^ 1 er 0. Så vores 'a' er blevet 'A', og vores 'A' er blevet 'a'. Så XOR er en rigtig bekvem måde blot at bladre sagen. Du ønsker bare at gentage over en streng af bogstaver og skifte tilfælde af hvert enkelt tegn, du bare XOR alt med OX20. Nu vi har forladt skift. Venstre skift er bare at, dybest set, skubbe alle numrene i, eller til venstre, og indsæt 0'er bag dem. Så her har vi 00.001.101. Vi kommer til at skubbe 3 0'er fra højre, og vi får 01101000. I nonbinary vilkår, vi se, at der er virkelig beskæftiger 13 venstre-forskudt med 3, hvilket giver os 104. Så venstre skiftende, vi ser her, x << y er dybest set x * 2 ^ y. 13 * 2 ^ 3, 2 ^ 3 er 8, så 13 * 8 er 104.. Hvis du lige tænker over binær i almindelighed, hvordan hvert ciffer, hvis vi starter fra højre, det er 1 sted, så 2 plads, så de 4 sted. Så ved at skubbe i 0'er fra højre, vi bare skubber ting, der var i det 4. plads til 8 plads, og ting, der var i det 8. plads til de 16 sted. Hvert skift bare ganger med 2.. Ja? [Studerende] Hvad sker der, hvis du flyttet med 5? [Bowden] Hvis du flyttet med 5 ville du bare miste cifre. Uundgåeligt, det er det samme. Ligesom, heltal er kun 32 bits, så hvis du tilføjer 2 virkelig store heltal, det bare ikke passer ind i et heltal. Så det er det samme her. Hvis du har flyttet med 5, vi ville bare miste det ene. Og det er lidt af, hvad jeg mener med "groft" hvor, hvis du skifter for langt, mister du bits. Højre skift kommer til at være det modsatte, hvor vi kommer til at puffe 0'er fra slutningen, og til vores formål, udfylde 0'er fra venstre. Så gør det, vi dybest set at vende det, vi allerede havde gjort. Og vi ser, at de tre 0'er til højre lige er faldet af, og vi har skubbet 1101 hele vejen til højre. Dette gør 104 3, som er effektivt, x / 2 ^ y. Så nu her, det er en lignende idé. Hvorfor er det bare nogenlunde x / 2 ^ y, og faktisk ikke x / 2 ^ y? Fordi hvis jeg havde flyttet med 4, ville jeg have mistet en 1. Dybest set, hvad du synes om, bare tænk på heltalsdivision i almindelighed. Så som 5/2 er to. Det er ikke 2.5. Det er den samme idé her. Når vi deler med 2, vi kan miste ulige bits undervejs. Så nu - det er det for bitvis. Det er alt du behøver at vide. Husk use cases, vi oplevede i klassen, som en bitmaske er nyttigt for bitvise operatører eller du bruger dem til bit-masker. Store bogstaver og små bogstaver, konverteringer er en temmelig prototypisk eksempel. Okay, så bufferoverflowsangreb. Nogen huske, hvad der var galt med denne funktion? Meddelelse erklærede vi en vifte af 12 byte, 12 chars, og så må vi kopiere, i vores buffer på 12 tegn hele strengen bar. Så hvad er problemet her? Det magiske nummer 12 skal temmelig meget straks pop ud som - hvorfor 12? Hvad hvis bar sker for at være mere end 12 tegn? Hvad hvis bar er millioner af karakterer? Her er spørgsmålet memcpy. Hvis bar er lang nok, vil det bare helt - »c«, »c« er ligeglad, at det var kun 12 tegn; »C« er ligeglad, at det ikke kan passe, at mange byte. Det vil bare helt overskrive char, de 12 bytes, vi har afsat til det, og alt forbi det i hukommelsen, der faktisk ikke tilhører denne buffer med hvad strengen bar er. Så det var det billede, vi så i klassen hvor vi har vores stack vokser op. Du bør bruges til disse billeder eller blive fortrolig med dem igen. Vi har vores stak vokser op, hukommelsesadresser starter ved 0 foroven og vokse ned til at kunne lide 4 milliarder i bunden. Vi har vores matrix 'c' et eller andet sted i hukommelsen, så har vi vores pointer til bar lige nedenunder, og så har vi det gemte rammehenvisningen i vores returadresse og vores moderselskab rutine stak. Husk, hvad afsenderadressen er? Det er, når main kalder en funktion foo, kalder en funktion bar, uundgåeligt, bar afkast. Så når bar vender tilbage, har de brug for at vide, at det kommer tilbage til foo der kaldte det. Så afsenderadressen er adressen på den funktion, at det har at vende tilbage til, når funktionen returnerer. Grunden til, at der er vigtigt for Bufferoverløbsangreb er fordi, bekvemt, hackere gerne ændre denne returadresse. I stedet for at gå tilbage til foo, vil jeg gå tilbage til hvor hackeren vil have mig til at gå tilbage til. Og bekvemt, hvor hackeren ofte ønsker at gå tilbage til er begyndelsen af ​​bufferen, som vi oprindeligt havde. Så bemærker igen, Little Indian. Apparatet er et eksempel på et Little Indian system så et heltal eller en pegepind er gemt med bytes omvendt. Så her ser vi - er det? Ja. Vi ser Ox80, OxC0, Ox35, OxO8. Husk de hexadecimale cifre? Vi har ikke vende hexadecimale cifre i Little Indian, fordi 2 hexadecimale cifre udgør en enkelt byte, og vi vende bytes. Det er derfor vi ikke gemmer, ligesom, 80530CO8. Vi gemmer i stedet hvert par af 2 cifre, startende fra højre. Denne adresse refererer til den adresse af start af vores buffer, at vi faktisk ønskede at kopiere ind i første omgang. Grunden, der er nyttige, fordi, hvad nu hvis angriberen skete der, i stedet for at have en streng, der var bare en harmløs snor ligesom deres navn eller noget, hvad hvis man i stedet, at strengen var blot nogle af vilkårlig kode der gjorde, hvad de ville have det at gøre? Så de kunne - jeg kan ikke tænke på noget kølig kode. Det kunne være noget, selv om. Alle katastrofal kode. Hvis de ville, kunne de bare gøre noget ved seg fejl, men det ville være meningsløst. De gør det som regel at hacke dit system. Okay. CS50 biblioteket. Dette er, dybest set, getInt, getString, alle disse funktioner, vi fastsat for dig. Så vi har char * streng, og det er den abstraktion, som vi blæste væk på et tidspunkt i løbet af semestret. Husk, at en streng er blot et array af tegn. Så her ser vi en forkortet udgave af getString. Du bør se tilbage på det at huske, hvordan det rent faktisk er gennemført. Vigtige detaljer er, bemærker vi får i et enkelt tegn ad gangen fra standard i, der er ligesom os at skrive på tastaturet. Så et enkelt tegn af gangen, og hvis vi får for mange tegn, så hvis n + 1 er større end kapaciteten, så er vi nødt til at øge kapaciteten på vores buffer. Så her er vi fordoble størrelsen af ​​vores buffer. Og det holder gang, vi indsætte tegnet i vores buffer indtil vi modtager en ny linje eller slutningen af ​​filen eller hvad, i hvilket tilfælde, vi er færdige med strengen og derefter den virkelige getString krymper hukommelsen, ligesom hvis vi tildelt for meget hukommelse det vil gå tilbage og krympe lidt. Så vi ikke viser det, men det vigtigste idé er det har at læse i et enkelt tegn ad gangen. Det kan ikke bare læse i en hel ting på én gang, fordi deres buffer er kun en bestemt størrelse. Så hvis strengen som den forsøger at indsætte i bufferen er for stor, så det ville overløb. Så her er vi forhindre, at ved kun at læse i en enkelt karakter på et tidspunkt, og voksende, når vi har brug for. Så getInt og de andre CS50 bibliotekets funktioner tendens til at bruge getString i deres implementeringer. Så jeg fremhævede de vigtige ting her. Det opfordrer getString at få en streng. Hvis getString undladt at returnere hukommelse, huske, at getString malloc'erers noget, så når du kalder getString bør du ikke (uforståelige) gratis at streng, du fik. Så her, hvis det ikke lykkedes at allokere noget, vi vender tilbage INT_MAX som bare et flag, der, hey, vi var faktisk ikke i stand til at få et heltal. Du bør ignorere hvad jeg vende tilbage til dig, eller du bør ikke behandle dette som et gyldigt input. Endelig antager, at lykkedes, vi bruger sscanf med denne særlige flag, hvilket betyder først matche et heltal, derefter matche alle tegn efter det heltal. Så opdager vi ønsker det lig med 1. Så sscanf afkast, hvor mange kampe, hvis succes gjort? Det vil returnere 1, hvis det med held matchede et heltal, det vil vende tilbage 0, hvis det ikke matcher et heltal, og det vil vende tilbage 2 hvis det matchede et heltal efterfulgt af nogle tegn. Så opdager vi prøve igen, hvis vi matcher noget, men 1. Så hvis vi trådte 1, 2, 3, C eller 1, 2, 3, X, derefter 1, 2, 3 ville blive lagret i heltal, X ville få gemt på den karakter, sscanf ville vende tilbage 2, og vi vil prøve igen, fordi vi kun ønsker et heltal. Hurtigt blæser gennem HTML, HTTP, CSS. HyperText Markup Language er strukturen og semantik af internettet. Her er et eksempel fra foredrag, hvor vi har HTML-tags. Vi har hoved-tags, body tags, Vi har eksempler på tomme tags, hvor vi faktisk ikke har en start og tæt tag, vi bare have link og image. Der er ingen afsluttende billede tag; der er bare et enkelt tag, som udretter alt tag skal gøre. Linket er et eksempel, vi vil se, hvordan du linker til CSS, scriptet er et eksempel på, hvordan du linker til en ekstern JavaScript. Det er temmelig ligetil, og husk, HTML er ikke et programmeringssprog. Her kan huske, hvordan du skal definere en formular eller i det mindste, hvad det ville gøre? En sådan form har en handling og en metode. De metoder, du kun nogensinde vil se, er GET og POST. Så får, er den version, hvor ting bliver sat i webadressen. POST er, hvor det ikke er sat i webadressen. I stedet er alle data fra formularen indsat mere skjult i HTTP-anmodning. Så her, handling definerer, hvor HTTP-anmodningen går. Hvor det går er google.com / search. Method. Husk forskellene mellem GET og POST, og bare sige som et eksempel, hvis du ønsker at bogmærke noget. Du vil aldrig være i stand til et bogmærke til en POST URL fordi dataene ikke er inkluderet i webadressen. HTTP, nu er HyperText Transfer Protocol. Hypertext Transfer Protocol, ville du forvente, at det at overføre HyperText Markup Language, og det gør det. Men det er også overfører nogen billeder, du finder på internettet, nogen downloads, du foretager starte som en HTTP-anmodning. Så HTTP er bare sproget i World Wide Web. Og her skal du genkende denne form for en HTTP-anmodning. Her HTTP/1.1 på den side bare siger, det er den version af protokollen jeg bruger. Det er temmelig altid vil være HTTP/1.1, som du vil se det. Så ser vi, at dette var GET, alternativet er POST, at du kan se. Og den webadresse, jeg forsøgte at besøge var www.google.com/search?q = blah, blah, blah. Så husk, at dette spørgsmålstegnet q = blah blah blah, er den slags ting, der er forelagt af en formular. Svaret kan det vende tilbage til mig ville se noget som dette. Igen, startende med den protokol, som kommer til at være det, efterfulgt af status kode. Her er det 200 OK. Og endelig vil den webside, jeg faktisk bedt om skal følges. Den mulige status kode du kan se, og du skal vide flere af dem. 200 OK, du har sikkert set før. 403 Forbudt, 404 Ikke fundet 500 Internal Server Error er som regel, hvis du går til en hjemmeside og noget er i stykker eller deres PHP kode nedbrud, hvorimod vi i apparatet har den store orange boks der kommer op og siger, ligesom, der er noget galt, er denne kode ikke virker eller denne funktion dårlige. Normalt websites ønsker ikke at vide, hvad funktioner er faktisk dårligt, så de i stedet vil bare give dig 500 intern server fejl. TCP / IP er 1 lag under HTTP. Husk at der er internet uden for World Wide Web. Ligesom hvis du spiller et online spil, der ikke går gennem HTTP, det går gennem en anden - det er stadig ved hjælp af internettet, men det bruger ikke HTTP. HTTP er blot ét eksempel på protokol bygget på TCP / IP. IP bogstaveligt betyder Internet Protocol. Hver computer har en IP-adresse, de er de 4-cifrede ting Ligesom 192.168.2.1, eller hvad, der har tendens til at være en lokal. Men det er mønstret for en IP-adresse. Så DNS, Domain Name Service, det er hvad der oversætter ting som google.com til en faktisk IP-adresse. Så hvis du skriver, at IP-adresse i en URL, der vil bringe dig til Google, men du har tendens til ikke at huske disse ting. Du har tendens til at huske google.com i stedet. Det sidste, vi har, er havne, hvor dette er TCP del af undersøgelsesperioden. TCP gør mere. Tænk over, ligesom, du har din web browser kørende. Måske har du nogle e-mail program kørende; måske du har et andet program, der bruger internettet kørende. De har alle brug for adgang til internettet, men din computer kun har 1 WiFi-kort eller hvad. Så porte er den måde, at vi er i stand til at splitte op hvordan disse programmer er i stand til at bruge internettet. Hver ansøgning får 1 specifik port, det kan lytte på, og som standard, HTTP bruger port 80. Nogle e-mail-tjenester bruger 25. De lave numre dem tendens til at være reserveret. Du er som regel i stand til at få højere nummererede dem for dig selv. CSS, Cascading Style Sheets. Vi style websider med CSS, ikke med HTML. Der er 3 steder, du kan sætte din CSS. Det kan være inline mellem typografi-tags, eller i en fuldstændig separat fil og derefter knyttet i. Og her er bare et eksempel på CSS. Du bør anerkende dette mønster, hvor det første eksempel er vi matche kroppen tag, og her er vi centrering kroppen tag. Det andet eksempel, vi matcher ting med ID footer, og vi anvender nogle stilarter til det. Bemærk, at ID-footer tekst-flugter til venstre, mens brødtekst-flugter center. Footer er inde i kroppen. Det vil i stedet, tekst-align venstre, selvom kroppen siger tekst-align center. Dette er hele overlappende del af det. Du kan få - du kan angive stilarter for kroppen, og derefter ting i kroppen, du kan angive mere specifikke stilarter, og tingene fungerer, som du forventer. Mere specifikke CSS beregnere forrang. Jeg tror, ​​det er det. [Ali Nahm] Hej alle. Hvis jeg bare kunne få din opmærksomhed. Jeg er Ali og jeg har tænkt mig at gå gennem PHP og SQL virkelig hurtig. Så vi kan begynde. PHP er en forkortelse for PHP: Hypertext Preprocessor. Og som du alle skal vide, det er en server-side scripting sprog, og vi bruger det til bagenden af ​​hjemmesider, og hvordan den gør en masse af de beregninger, den bag-kulisserne del. Syntaks. Det er ikke ligesom C, overraskelse, overraskelse. Det har altid at starte med, hvis du kan se, - jeg kan ikke komme videre. Du kan se, du har brug for de nye former for seler og så skal du også bruge? Php. Det er altid, hvordan du er nødt til at indramme dit PHP tekst, din PHP kode. Så det kan ikke bare være ligesom C, hvor du slags sætte det på først. Du er nødt til altid omgiver den. Og nu, de store syntaks er, at alle variabler skal starte med tegnet $. Du er nødt til at gøre det, når du definerer dem, og du behøver at gøre det når du refererer til dem senere. Du har altid brug for at $. Det er din nye bedste ven, temmelig meget. Du behøver ikke - i modsætning til C, behøver du ikke at lægge, hvad slags variabel type, det er. Så mens du har brug for de $, behøver du ikke at sætte, ligesom, int x eller snor y, etcetera, etcetera. Så en lille forskel. Som et resultat af dette, betyder det, at PHP er et svagt type. PHP er et svagt typen sprog, og det er svagt indtastet variabler. Med andre ord betyder det, at du kan skifte mellem forskellige typer af variable typer. Du kan gemme dit nummer 1 som en int, kan du gemme det som en streng, og du kan gemme det som en float, og det vil alle være at nummer 1. Selvom du opbevarer det i forskellige former, er det stadig - de variable typer er stadig holder i sidste ende. Så hvis du ser her, hvis du kan huske fra PSET 7, mange af jer sikkert haft problemer med dette. To lige store skilte, 3 lige store skilte, 4 lige store skilte. Okay, der er ingen 4 lige tegn, men der er 2 og 3. Du bruger 2 lige store tegn til at kontrollere værdierne. Det kan kontrollere tværs typer. Så hvis du kan se på det første eksempel, Jeg har num_int == num_string. Så din int og din streng er både teknisk, 1, men de er forskellige typer. Men for de dobbelte ligemænd, vil det stadig passere. , For de tredobbelte ligemænd, kontrollerer Men det er værdi, samt de forskellige typer. Det betyder, at det ikke kommer til at passere i det andet tilfælde her, hvor du bruger 3 lighedstegn i stedet. Så det er en stor forskel, at du burde have vist nu. String sammenkædning er en anden kraftfuld ting, du kan bruge i PHP. Det er dybest set bare denne handy dot notation, og det er hvordan du kan binde trådene sammen. Så hvis du har kat, og du har hund, og du ønsker at sætte de 2 strenge sammen, kan du bruge den periode, og det er sådan, hvordan det fungerer. Du kan også bare placere dem ved siden af ​​hinanden, som du kan se her i bunden eksempel hvor jeg har ekko streng 1, rum streng 2. PHP vil vide at erstatte dem som sådan. Arrays. Nu, i PHP, der er 2 forskellige slags arrays. Du kan have regelmæssige arrays, og du kan også have associative arrays, og vi kommer til at gå igennem dem lige nu. Regelmæssige arrays er netop dette i C, og så har du indekser, der er nummereret. Lige nu er vi bare kommer til at oprette en og lægge - så dette er, hvordan vi skaber et tomt array, så vi kommer til at lagt i indekset nummer 0. Vi kommer til at sætte nummer 6, værdien 6.. Du kan se det i bunden her. Where's - ved indeks nummer 1 vi kommer til at sætte værdi nummer 4, og så du kan se, at der er en 6, er der en 4, og derefter som vi udskriver ting, når vi prøver og udskrive værdi gemt i indeks nummer 0, så vil vi se værdien 6 kan blive udskrevet. Cool? Så det er regelmæssige arrays til dig. En anden måde kan du også tilføje ting til almindelige arrays nu er du kan bare tilføje dem i slutningen. Det betyder at du ikke behøver at angive den specifikke indeks. Du kan se nummeret, og derefter i de firkantede parenteser er der ingen indeks angivet. Og det vil vide - PHP vil vide at bare tilføje det til slutningen af ​​listen, den næste frie stedet. Så du kan se den 1 lige der ved at 0 stedet, de 2 gik lige der ved den første plet. De 3 går - tilføjes der. Så den slags giver mening. Du er bare hele tiden at tilføje det, og så når vi ekko indekset for nummer 1, det vil udskrive værdien 2. Så har vi arrays, der er associative arrays. Associative arrays, i stedet for at have talvaerdier, hvad de gør, er, at de har indeks, der er med snor. Du kan se, i stedet for - jeg sluppet af med alle disse tal indekser, og nu er det nøgle1 TAST2, TAST3, og de er i anførselstegn for at tilkendegive, at de er alle strengene. Så vi kan få et eksempel på dette. Det eksempel på dette er, at vi har den tf, og det er indekset navn. Vi kommer til at sætte "Ali" som navnet på indekset, kalorier spist, vi kan sætte en int denne gang i stedet for en streng, og derefter på indeks kan lide, kan vi sætte en hel vifte inde i den. Så dette er en slags - det er et lignende koncept til, hvordan vi havde indekser med tal, men nu kan vi ændre indeksene omkring at have dem som strenge i stedet. Du kan også gøre dette, udover blot at gøre det individuelt, du kan gøre det hele på én luns. Så du kan se, at tf af denne array, og så skal vi sætte dem alle i én gigantisk firkantet beslag sæt. Så det kan fremskynde tingene op. Det er mere af et stilistisk valg end ikke. Vi har også sløjfer. I C har vi sløjfer, der arbejder på denne måde. Vi havde vores array, og vi gik fra indeks 0 til slutningen af ​​listen, og vi udskriver det hele, ikke? Bortset fra problemet er for associative arrays, vi ikke nødvendigvis kender de talvaerdier fordi vi nu har strengen indeks. Nu skal vi bruge foreach loops, hvilket igen du forhåbentlig brugt i PSET 7. Foreach loops vil bare vide hver eneste del af listen. Og det behøver ikke at vide præcis den numeriske indeks, du har. Så har du foreach syntaks, så det er foreach, du sætter array. Så min matrix kaldes PSET, og derefter som ordet som, og så skal du sætte denne lokale midlertidig variabel, du vil bruge bare for den specifikke ting, der kommer til at have det specifikke - en instans eller et afsnit i opstillingen. PSET num vil holde 1, og så måske vil det holde nummer 6, og så vil det holde nummer 2. Men det er garanteret til at gå igennem hver enkelt værdi, der er i array. Nyttige funktioner, som du bør vide i PHP er kræve, så det gør sikker på, at du herunder bestemte filer, ekko exit, tom. Jeg kan varmt anbefale dig at se på PSET 7 og se på disse funktioner. Du har måske til at kende dem, så jeg vil helt sikkert vide, hvad, præcist, de alle gør. Og nu vi kommer til at gå gennem rækkevidde virkelig hurtigt. I omfang, PHP er lidt af en funky ting, i modsætning til C, og så vi bare kommer til at gå igennem det hurtigt. Så lad os sige, at vi starter på denne pil, vi har der. Og vi kommer til at starte med $ i. Så variablen "I" kommer til at være 0, og vi vil bare holde udskrive det i den store hvide boks derovre. Vi kommer til at starte med I0, og så skal vi til at gentage det. Så der er den 0. Og så vil vi forøge den ved for-løkken, og så det kommer til at være værdi på 1. Den ene er mindre end 3, så det kommer til at passere gennem det for-løkke, og så vil vi se den trykt igen. Vi kommer til at forøge det til 2 igen, og 2 er mindre end 3, så det vil passere for-løkken, og det vil udskrive 2. Så vil du bemærke, at 3 er ikke mindre end 3, så vi vil bryde ud af for-løkken. Så nu har vi forladt, og så vi kommer til at gå ind i afunction. Okay. Så du er nødt til at bemærke, at denne variabel, som vi har oprettet, »i« variabel, ikke lokalt scoped. Det betyder, at det ikke er lokale til løkken, og denne variabel kan vi stadig få adgang til og ændre bagefter, og det vil stadig være effektiv. Så hvis du går ind i den funktion nu, vil du se, at vi også bruge 'i' variable, og vi kommer til at forøge 'I' + +. Man skulle tro, i første omgang, er baseret på C, at det er en kopi af den 'i' variabel. Det er en helt anden ting, der er korrekt. Så når vi udskriver det, vi kommer til at udskrive 'i' + +, som kommer til at printe ud, at 4, og så vil vi - undskyld. Så vi kommer til at ende ud af denne funktion, og vi kommer til at være, hvor det pilen er lige nu. Det betyder, at da, men selvom funktionen ændret værdien af ​​»i«, at det ikke ændres uden for funktionen, fordi funktionen har en separat omfang. Det betyder, at når vi echo 'I', har det ikke ændret sig i omfanget af den funktion, og så så vi kommer til at udskrive 3 igen. Forskellige ting om omfang i PHP end i C. Nu i PHP og HTML. PHP bruges til at gøre websider dynamisk. Den slags gør tingene anderledes. Vi har det anderledes end HTML. Med HTML, vi altid bare have det samme statiske ting, som hvordan Rob viste, hvorimod PHP, kan du ændre tingene baseret på, hvem brugeren er. Så hvis jeg har det, jeg har, "Du er logget ind som -" og derefter navnet, og jeg kan ændre navnet. Så lige nu er det hedder Josef, og det har den "om mig", men så kan jeg også ændre navnet for at få Tommy. Og det ville være en anden ting. Så kan vi også ændre forskellige ting om ham, og det vil vise forskelligt indhold baseret på navnet. Så PHP kan slags ændre, hvad der foregår i dit websted. Samme her. Alligevel opmærksom på, at de har forskelligt indhold, selvom du er teknisk set stadig adgang til denne samme webside på overfladen. Generering af HTML. Der er 2 forskellige måder, du kan gøre dette. Så vi vil gå igennem lige nu. Den første måde er, har du - ja, undskyld. Så du bare have din regelmæssig for-løkke i PHP, og du derefter echo i PHP, og du ekko ud HTML. Brug hvad Rob viste dig HTML script og derefter bruge PHP udskrive til bare printe det ud til websiden. Den alternative måde er at gøre det, som om du adskille PHP og HTML. Så du kan have en linje af PHP, der starter for-løkken, så du kan have den linje af HTML i en separat ting, og du derefter afslutte løkken, igen, med en PHP. Så det er sådan at adskille det ud. På venstre side, kan du, at du har alle de - det er bare 1 luns af PHP. Til højre kan du se, at du har en linje af PHP, du har en linje af HTML, og du har en linje af PHP igen. Så adskiller det ud i, hvad de laver. Og du vil bemærke, at begge veje, for nogen af ​​dem, de stadig udskrive billedet, billedet billedet så HTML stadig udskrives på samme måde. Og så vil du stadig se de 3 billeder dukke op på dit website. Så det er 2 forskellige måder at gøre det samme. Nu har vi former og anmodninger. Som Rob viste dig, Der er former for HTML, og vi vil bare brise gennem dette. Du har en handling og du har en metode, og din handling slags viser dig, hvor du kommer til at sende det, og metoden er, om det kommer til at være en GET eller POST. Og en GET-anmodning, som Rob sagde, betyder, at du kommer til at sætte det i en formular og du vil se det som en URL, mens en POST anmodning vil du ikke se i en URL. Så en lille forskel. Men en ting, der er en lignende ting er, at POST og GET er lige usikker. Så du måske tror, ​​at bare fordi du ikke kan se det i webadressen, det betyder, at POST er mere sikker, men du kan stadig se det i dine cookies i de oplysninger, som du sender. Så tror ikke, at omkring en eller anden. En anden ting at bemærke er, at du også har afsnit variabler. Du fyre brugte dette i PSET 7 for at få dit bruger-id. Hvad der skete var, at du kan bruge denne associativt array, de $ _SESSION, og så er du i stand til at få adgang til forskellige ting og gemme forskellige ting på tværs af siderne. Sidste ting er, at vi har SQL, Structured Query Language, og dette er et programmeringssprog til at håndtere databaser. Hvad, præcist, er databaser? De er samlinger af tabeller, og hver tabel kan have lignende typer af objekter. Så vi havde en tabel brugere i din finansiering PSET. Og hvorfor er de nyttige? Fordi det er et middel til permanent lagring af oplysninger. Det er en måde at spore ting og styre tingene og faktisk se det på forskellige sider og holde styr. Hvorimod hvis du bare gemme det på, at en øjeblikkelig øjeblik og derefter bruge den senere, vil du ikke kunne få adgang til noget, som du har gemt. Vi har 4 store ting, som vi bruger til SQL-kommandoer. Vi har vælge, indsætte, slette og opdatere. Det er virkelig vigtigt for jer at vide for din quiz. Vi vil hurtigt gå over vælge lige nu. Dybest set, du vælger rækker fra en database. Så hvis du har, lige her - vi har disse 2 forskellige ting, og vi ønsker at vælge fra klasserne tabellen hvor awesome - hvor i awesome kolonne værdien er 1.. Så du kan se her, har vi disse 2 ting af klasse navn, CS50 og Stat110, og vi har klassen id'er og sloganet. Så vi ønsker at vælge alle disse oplysninger. Derefter kan du se lige her, at det er lidt plukke ud af at awesome kolonne hvor alle ting er 1, og den har da klasse-id, klasse navn og slogan, at det kan udvælge. Hvordan præcist gør du det i kode? Du er nødt til at bruge PHP. Så det er sådan, hvordan PHP og SQL er relateret til hinanden. Nu har vi vores kode, og vi kommer til at bruge vores søgefunktion som vi gjorde i PSET 7, og vi kommer til at køre SQL-forespørgsel. Så vi bliver nødt til - vi altid nødt til at tjekke, om rækken er tredobbelt lige hvis falsk. Så igen, du ønsker at kontrollere typen og værdien, og derefter, hvis det ikke virker, så du ønsker at undskylde, som sædvanlig, som vi gjorde i PSET 7. Ellers du ønsker at sløjfe gennem alt med dem handy foreach loops, at vi bare gik forbi. Nu, hvor vi springer igennem, og vi har gjort det tidligere, lad os antage, at vores forespørgsel gået, nu har vi vores foreach løkke. Og den første række har det, så her er den række, lige her, det er indrammet. Det kommer til at udskrive alle de oplysninger, det er blevet. Så det kommer til at printe ud i bunden "Wanna Lær HTML?" Så det kommer til at gå til den næste række, fordi det er afsluttet den første for-løkken, og så så det kommer til at udskrive den anden linje i det, der bliver STAT110, Find alle de øjeblikke. En sidste ting er på SQL-sårbarheder. Jeg kender David inde på dette en smule i foredraget. Du kan læse dette senere. Det er virkelig sjovt. SQL Injection er en slags tricky ting. Lad os sige, at du bare holde disse variabler lige ind i din forespørgsel, som du kan se i den første linje. Så det ser fint ud, right? Du er bare at sætte det brugernavn og adgangskode til din SQL-forespørgsel, og du ønsker at sende det ud og få hvad der er i din datatabel. Det virker temmelig simpelt. Så lad os sige en person lægger, om adgangskoden, dette eller tekst lige her - burde faktisk være i det røde felt. Så lad os sige, at de sætter det password ind i - det er, hvad de kommer ind. Så de putter eller "1" = 1. Slags en fjollet kodeord at have. Lad os nu bare erstatte det i, og du vil bemærke, at i denne SQL-forespørgsel nu, det evalueres til altid sandt, fordi du vil bemærke, at du kan SQL-forespørgsel vælge alle disse oplysninger eller du kan bare have 1 = 1. Så det er altid vil evaluere til true. Det kommer ikke til at virkelig arbejde, fordi det betyder, at hacker kan bryde ind i dit system. Løsningen på dette er, at du nødt til at bruge BOB-systemet, hvilket betyder, at du nødt til at bruge spørgsmålstegn, hvilket er hvad du fyre, der anvendes i PSET 7, hvor du kommer til at bruge et spørgsmålstegn i stedet for, hvor du ønsker at sætte noget, og så er du nødt til at have et komma, og så skal du have bagefter, efter din streng, til de forskellige variabler, som du ønsker at erstatte i dit spørgsmålstegn. Så du bemærke her, at nu har jeg disse røde spørgsmålstegn. Så jeg sætte de variabler efter mit strenge, så jeg ved at erstatte dem i den rækkefølge bagefter. Det vil sikre, at hvis nogen gør det på denne måde, og de har den eller 1 = 1 situation, der vil sørge for, i bagenden, så sørg for at det ikke vil faktisk bryde SQL-forespørgsel. Okay, så det er temmelig meget det, en hvirvelvind af PHP og SQL. Held og lykke til alle jer, og nu til Oregon [Oreoluwatomiwa Babarinsa] Okay alle. Tid til at gå over nogle JavaScript og nogle andre ting meget hurtigt, så vi ikke holde dig op i aften. JavaScript. Ja. JavaScript er lidt af en cool ting, angiveligt. De ting, du virkelig har brug for at vide om JavaScript, det er lidt ligesom klientsiden ende af, hvad din web-app kommer til at gøre. Der er nogle ting, du bare ikke ønsker at tage sig af al den tid på serveren side. Alle de små interaktioner, fremhæve en ting, der gør noget til at forsvinde. Du virkelig ikke ønsker at skulle tale med din server hele tiden for det. Og noget af det er ikke engang muligt at gøre på serveren side. Det er derfor, vi har brug for noget lignende JavaScript. Cool ting om JavaScript: Den er dynamisk skrevet. Hvad dette betyder er, at dit program ikke behøver at vide hvad, præcist, variablerne er, når du skriver det ud. Det vil bare slags regne det ud, som det kører. Andre ting, der er cool om det: Det er en klammeparentes sprog, hvilket betyder, at syntaks ligner C og PHP. Du behøver ikke at gøre meget ekstraarbejde, når du er ved at lære JavaScript. Her har vi en lille smule af JavaScript. Interessant ting her er, at hvis man ser på det, vi har lidt af JavaScript lige der i hovedet tag. Hvad er gør, er dybest set bare indeholde en JavaScript-fil. Dette er en måde, du kan medtage JavaScript i dit program. Så den anden lille smule er faktisk nogle inline JavaScript, meget lig en inline stil med CSS, og du bare skrive noget kode meget hurtigt der. JavaScript har arrays. Bare en anden måde at holde data rundt, meget nyttig. Meget flot og let syntaks. Du bruger firkantede parenteser til at få adgang til alt og holde det hele sammen. Intet er for kompleks. Det fede ved JavaScript og scripting sprog i almindelighed er, at du ikke behøver at bekymre sig om array-størrelser. Du kan bare bruge array.length og holde styr på det, og også array kan vokse eller skrumpe, som du har brug for det. Så du behøver ikke engang behøver at bekymre sig om nogen form for, åh nej, jeg har brug for at afsætte flere ting, eller noget lignende. Det fede er, at JavaScript har noget, der hedder objekter. Det er et objekt-orienteret sprog, så hvad det har er det væsentlige, en måde for dig at gruppere data sammen, noget der ligner en struct, men du kan få adgang til det som en struct eller i et associativt array syntaks. Det er ret simpelt, og hvad du kan gøre med dette er gruppe data sammen hvis du har en masse data, der er relateret. Fordi det er alle de ting du har brug for at beskrive en bil, du behøver ikke at have det i en masse forskellige steder. Du kan bare sætte det ind 1 objekt i JavaScript. Som du sikkert ved, iteration er en af ​​de kedelige opgaver. Du skal bare gøre det over en igen. Du er nødt til at tale med hvert objekt i bilen, eller du har brug for at gå igennem hver punkt på en liste eller noget lignende. Så JavaScript har, svarer til PHP, en foreach syntaks. I dette tilfælde er det en i løkke. Du ønsker at bruge dette kun på objekter. Der er nogle problemer, der opstår, hvis du bruger dette på arrays. Det generelt er en af ​​de ting, selv om, som er meget nyttigt, fordi du fjerne en masse af overliggende fordi du ikke behøver at trække op alt i dit objekt ved dig selv. Du behøver ikke at huske alle de centrale navne. Du skal bare slags få dem tilbage i denne syntaks. I denne, med til, du bare ønsker at huske at du får tilbage alle nøgler i en meget lignende måde at hash tabellen. Hvis du kan huske fra det, når du vil sætte i en streng, du kunne få noget ud som ville have en tilknyttet værdi med det. Hvad du kan gøre med dette er, du kan sige, okay, Jeg sætter i en bil, og jeg kaldte det en Ferrari. Så du kan sætte i strengen Ferrari igen senere, og du kan få det ud. Og du kan gøre det i en løkke, med i løkken. Så bare mere om objekter. Det vigtigste fra dette skal du huske er, at du kan bruge objektet struct lignende syntaks, når du vil med disse, undtagen hvis hvad din kommer til at bruge som en streng er ikke et gyldigt variabelnavn. Så hvis man ser på, at der har vi nøgle med mellemrum. Tja, hvis du skulle sætte object.key, rum, med plads, rum, der bare ikke ville give mening syntaktisk. Så du kan kun gøre det med denne slags beslag syntaks. Også JavaScript er meget rækkevidde-wise til PHP. Du har 2 måder at behandle omfang. Du kan ikke have det var foran en variabel, og det betyder bare det er global. Du kan se det fra hvor som helst. Selv hvis du skulle sætte dette i en if-sætning, andre steder i din kode efter dette punkt, du kunne se, at variabel. En anden ting er dog, med var, er det begrænset til uanset funktion, du er i. Hvis du ikke er i en funktion, godt, det er global. Men hvis du er i en funktion, er det kun synlig inden for denne funktion. Jeg har ikke et eksempel, men, ja. Det er en af ​​de ting, hvor du kan styre, hvad variabler, du ønsker at være global, Hvilke variabler, du ønsker at være lokal, men du behøver at være forsigtig med dette, fordi du ikke har den type finkornet kontrol, du gør i C, hvor hvis noget er erklæret i en for-løkke, det kommer til at bo i det for-løkke. De ting, vi faktisk bekymrer sig om at bruge JavaScript for er at manipulere websider, right? Jeg mener, det er derfor vi gør det. For at gøre dette, bruger vi noget, der hedder DOM. Document Object Model. Dybest set, hvad det gør, er det tager al din HTML og modeller, den ud i en flok af objekter, der er indlejret i hinanden. Du starter ud med noget som dette. Du har på den rigtige for mig, en flok kode derude, der er slags - Man skulle tro, det ville være meget svært at manipulere, fordi du ville være parsing gennem en masse tekst og at skulle stykke fra hinanden ting. Og hvad hvis det ikke var korrekt formateret? Dårlige ting ville ske. Så JavaScript tager sig af dette for dig, og du får en dejlig datastruktur, som den ene på min venstre, hvor du bare har et dokument, og inde, at du har noget, der hedder HTML, og inde, at du har et hoved og en krop, og inde i det hoved du har en titel, etcetera, etcetera, etcetera. Dette forenkler manipulere en webside, så det er bare, åh, jeg ønsker blot at tale til dette objekt. Sorter af en meget lignende måde, som du ville tale til et andet objekt, du har foretaget dig. Som jeg sagde, alt DOM er i dokumentet objekt. Enten er det bare ét sted, og så kan du gå inden for det at finde ting, og du kan gøre det - det er den gamle stil at gøre det, deroppe, hvor du gør document.getElementById, og derefter navnet, og som du sikkert kan fortælle, det bliver meget uhåndterlige efter et stykke tid. Så har du sandsynligvis ikke ønsker at gøre det. Det er derfor, vi har den næste ting vi kommer til at snakke om efter dette. Det vigtigste her er at, okay, du har alle disse elementer, right? Så måske jeg kan ændre farven på noget, når siden indlæses. Så hvad? Hvad hvis min bruger klikker noget? Jeg vil have det til at gøre noget interessant, når de klikker på noget. Det er derfor, vi har arrangementer. Du kan dybest set, finde ethvert element i din DOM, og derefter sige, hej. Når dette indlæser eller nogen klikker det, eller når de musen over det, gøre noget med det. Og hvad du har, er, du har funktioner, der håndterer dette for dig. Disse funktioner er hændelseshandlere. Hvad De er ude - det er bare en fancy måde at sige, denne funktion udføres kun, når denne hændelse sker. Så det håndterer begivenhed, der indtræder. Dette er, hvordan du vil lægge ud en event handler. Jeg har nogle knap, og når du klikker på det, det eksploderer. Så du skal ikke klikke på knappen. Dette er en måde at nærme sig det, ikke? Du har en knap tag, og ved klik du har en streng, der siger, Åh, ved den måde, jeg gør det eksploderende ting for mig. Ellers er det bare som en almindelig knap, du netop har lavet. Du kan også gøre dette på en anden måde, ved at snuppe DOM element, men vi vil spare, at efter vi taler om jQuery. JQuery: Det er et bibliotek, der er cross-browser. Du kan bruge den i stort set alt. Og det bare giver dig en masse værktøjer at arbejde med. Fordi JavaScript, mens kraftfuld, har ikke alle de værktøjer, du har brug for ud af boksen for at virkelig tackle en web-app, du måske ønsker at gøre. Så det forenkler en masse ting, giver dig en masse funktioner ud af boksen, som du normalt ville have til at skrive selv, igen og igen og igen. Og bare gør tingene meget enkle. Du har også vælgere, som lader dig tage alle de elementer fra din DOM meget mere enkelt, i stedet for at skulle bruge disse meget lange funktionskald. Mere om disse vælgere. Du har deroppe du har, lad os sige Jeg ønsker at få et element med id "rock." Tja, i jQuery, det er bare $ og derefter en streng, der har et pund, og derefter "klippe". Det er meget simpelt og meget hurtigere end den traditionelle JavaScript måde at tackle dette problem. Og du har lignende ting til klasser og elementtyper. jQuery er - en af ​​de smarte funktioner er, at du kan sortere i komprimere ned dine forespørgsler på din DOM meget, meget hurtigt. Nu er vi tilbage til håndtering begivenhed, og det er hvordan du ville håndtere en begivenhed i jQuery. Så hvad vi vil her er vi siger, okay. Jeg har et script-tag, right? Så jeg har denne inline JavaScript. Hvad vi vil gøre, er, at vi kommer til at sige, okay. Når dokumentet er klar, hvilket betyder, at dokumentet er blevet indlæst, Vi kommer til at gå ind på denne funktion, og vi kommer til at sige, okay, denne funktion er faktisk at gøre noget andet. Det er dybest set siger, okay, få mig elementet med id "mittid". Og så giver det en funktion handler, der udfører, når du klikker på det. Dybest set, hvad det betyder er, det siger, okay. Siden er indlæst, så jeg har tænkt mig at i finder dette element, give det denne event handler, og det dybest set opsætter din side for dig. Og det er, hvordan du ønsker at tænke håndtering begivenhed. Du ønsker bare at tænke på, okay, når der sker noget, hvad ønsker jeg at ske? Du ønsker ikke at tænke på, okay, jeg har brug for at sikre denne ting taler for denne ting, denne ting blah blah blah, fordi du bare ønsker at tale ting i form af arrangementer. Når dette sker, dette sker. Når dette sker, det sker. Og hvis tingene udløse andre ting, det er fantastisk. Men du ikke ønsker at forsøge at gøre kompliceret kode hvor du udløser flere ting på samme tid, fordi du bare kommer til at give dig selv en hovedpine. Okay. Nu kan vi få vores side til at håndtere hændelser, men lad os sige min brugeren klikker på en knap. Hvad hvis jeg ønsker at sende anmodningen tilbage til serveren, men jeg ønsker ikke at genindlæse siden, fordi at skulle genindlæse en ny side hver eneste gang får slags kedelige, og hvorfor har jeg brug at trække ned på overskriften igen, og footer igen, og alle elementer på siden igen bare for at opdatere hilsen eller tid? Så det er derfor, vi har noget som Ajax. Hvad vi kan gøre her med Ajax er, at vi kan sige, okay, Jeg ønsker at sende nogle data til serveren, og jeg ønsker at få et svar tilbage, så jeg kan opdatere min side, eller måske bare gøre nogle algoritmiske beregninger, der ikke nødvendigvis viser noget for brugeren. Hvad har du brug for at gøre dette? Nå, du har brug for en URL, du har brug for at snakke med. Din server kan ikke bare magisk lytte ind fra ingenting. Du skal have et bestemt sted du sender disse data til. Og du har også brug for nogle data til at sende, eller måske er det en dataless forespørgsel. Du ønsker bare at ping tilbage til serveren og sige, hey, jeg er i live, eller noget lignende. Og så du vil have en funktion, der dybest set håndtag med succes. Lad os sige, du kommer tilbage nogle oplysninger fra din server, og du ønsker at ændre brugerens titel på deres side. Så du ville få de oplysninger tilbage, og du ville skubbe det til skærmen. Hvad der sker, er, når siden er klar, du opretter en på klik-funktion for denne knap kaldet velkomst. Hvad det så gør, er, når der trykkes på knappen, du taler med greetings.php, du laver en POST anmodning og du siger, hey, få mig noget fra din side. Vi har ikke rigtig brug for at beskrive det, men greetings.php, lad os bare sige, giver tilbage "hej verden". Så vi får tilbage denne "Hej verden" og om succes, antager intet går galt, så vi bare gå til dette mål sted at vi angivet, og vi bare holde os svaret derinde. Og det er en meget enkel måde at oprette en Ajax forespørgsel. Meget hurtigt, Rob slags nævnt dette allerede, ting kan gå galt, kan dårlige ting sker, så du ønsker at gøre dig bekendt med disse HTTP svarkoder. Hvad disse er blot, ligesom 200, alt gik okay. Noget andet, der skete dårlige ting. Det er generelt de ting du ønsker at huske. Men det er rart at vide alle disse. Og endelig, når vi har været igennem alt dette, vi nødt til at tale meget hurtigt om design, og så kan vi lade jer alle forlader. Design. Ting du ønsker at huske. Spørg dig selv disse spørgsmål: Hvem skal bruge det? Hvad vil de bruge det til? Hvad gør mine brugere bekymrer sig om? Hvad gør de ikke bekymre sig om? Du skal bare ikke lyst til at lave en app, og lad det bare vokse og bliver denne gigant, altopslugende ting, du kan ikke engang færdig. Du ønsker at have diskrete mål og planer og ting, du ønsker at løse. Gør det ubesværet. Alt dette siger, dybest set, gør det nemt for brugeren at bruge det, skal du ikke gøre det til en kæmpe klat tekst som denne slide er faktisk. Du ønsker bare, at det er noget, hvor det er meget let for nogen at gå i og gøre, hvad de vil gøre. Du behøver ikke vil have dem til at navigere 5 sider at komme til din primære funktion af dit websted. Hvis Google havde 5 sider, før du kan endda søge noget, ingen ville bruge det. Og endelig papir prototype, fokusgruppe. Har godt design og testmetoder. Bare fordi du synes, det virker for dig, betyder ikke nogen anden mener det virker. Men ja, det er det. [CS50.TV]