1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Oke. 3 00:00:12,900 --> 00:00:16,790 Dus welkom om de allereerste CS50 postmortem voor een quiz. 4 00:00:16,790 --> 00:00:18,340 We dachten dat we zouden huldigen deze traditie dit jaar. 5 00:00:18,340 --> 00:00:20,960 En dit zal een gelegenheid zijn te lopen door de 6 00:00:20,960 --> 00:00:22,220 oplossingen voor de quiz. 7 00:00:22,220 --> 00:00:26,160 En we zullen versnellen of vertragen gebaseerd op de rente van deze hier. 8 00:00:26,160 --> 00:00:29,730 >> Zodat u waarschijnlijk hier bent omdat je geïnteresseerd in hoe je zou kunnen hebben of 9 00:00:29,730 --> 00:00:31,170 moeten beantwoord sommige van deze problemen. 10 00:00:31,170 --> 00:00:33,300 Dus waarom niet we een kijkje nemen in deze sectie eerst? 11 00:00:33,300 --> 00:00:34,450 Zodat je snaren. 12 00:00:34,450 --> 00:00:37,600 Dit gaf je drie verschillende versies een programma dat was uiteindelijk 13 00:00:37,600 --> 00:00:39,650 bedoeld om een ​​string te krijgen van een gebruiker. 14 00:00:39,650 --> 00:00:42,530 Of het dat deed was overgelaten aan u om te bepalen. 15 00:00:42,530 --> 00:00:45,150 >> En we vroegen in vraag 0, veronderstellen dat versie 1 is 16 00:00:45,150 --> 00:00:46,400 samengesteld en uitgevoerd. 17 00:00:46,400 --> 00:00:48,860 Waarom zou het programma segfault? 18 00:00:48,860 --> 00:00:51,150 Op het eerste gezicht, suggesties waarom? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Yeah. 21 00:00:54,489 --> 00:00:59,260 >> Publiek: Ik herinner me deze in een eerder voorbeeld van naar de 22 00:00:59,260 --> 00:01:05,506 char * s en het zien van de scan van de s en het zien, want het is een pointer, hoe 23 00:01:05,506 --> 00:01:07,971 heeft zij invloed hebben op wat je gescand? 24 00:01:07,971 --> 00:01:10,940 Is het is of het adres van s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Goed. 27 00:01:11,480 --> 00:01:14,830 Dus uiteindelijk, de bron van een probleem Vermoedelijk zal verminderen 28 00:01:14,830 --> 00:01:16,210 die variabel is. 29 00:01:16,210 --> 00:01:17,280 En het is inderdaad een variabele. 30 00:01:17,280 --> 00:01:19,900 Het gegevenstype van deze variabele is char *, wat betekent dat het gaat om 31 00:01:19,900 --> 00:01:22,570 bevatten het adres van een personage. 32 00:01:22,570 --> 00:01:23,850 En daarin schuilt het inzicht. 33 00:01:23,850 --> 00:01:28,330 Het gaat om het adres bevatten een teken of, meer algemeen, de 34 00:01:28,330 --> 00:01:32,110 adres van het eerste teken in een hele blok karakters. 35 00:01:32,110 --> 00:01:36,680 >> Maar de vangst is dat scan s, doel in het leven, krijgt een adres en gegeven 36 00:01:36,680 --> 00:01:40,960 een formaat code, zoals% s, lezen een string in de brok van 37 00:01:40,960 --> 00:01:42,330 geheugen op dat adres. 38 00:01:42,330 --> 00:01:46,040 Maar omdat er geen gelijk-teken voor dat puntkomma op de eerste 39 00:01:46,040 --> 00:01:49,310 regel code, omdat we niet echt toewijzen elk geheugen met 40 00:01:49,310 --> 00:01:53,020 malloc, omdat het eigenlijk niet toewijzen een array van enige omvang, alle 41 00:01:53,020 --> 00:01:57,620 je doet is het lezen van de gebruiker keyboard input in sommige compleet 42 00:01:57,620 --> 00:02:00,490 garbage waarde, die is in s standaard. 43 00:02:00,490 --> 00:02:04,480 Dus kansen worden je gaat segfault als dat adres niet net zo toevallig 44 00:02:04,480 --> 00:02:08,009 een waarde die u kan worden, in feite, schrijven. 45 00:02:08,009 --> 00:02:10,889 Zo slecht niet toe te wijzen je geheugen daar. 46 00:02:10,889 --> 00:02:13,150 >> Dus in vraag 1, vroegen we, veronderstellen dat versie 2 is 47 00:02:13,150 --> 00:02:14,230 samengesteld en uitgevoerd. 48 00:02:14,230 --> 00:02:15,900 Waarom zou dit programma segfault? 49 00:02:15,900 --> 00:02:17,990 Dus dit is minder buggy. 50 00:02:17,990 --> 00:02:21,470 En er is eigenlijk maar een hand liggende manier waar u kunt 51 00:02:21,470 --> 00:02:22,810 leiden hier een segfault. 52 00:02:22,810 --> 00:02:23,730 En dit is thematisch. 53 00:02:23,730 --> 00:02:28,180 Elke keer dat we met behulp van c in het geheugen, wat zou je kunnen doen om een ​​segfault induceren 54 00:02:28,180 --> 00:02:30,718 met versie 2? 55 00:02:30,718 --> 00:02:35,560 >> PUBLIEK: Als u die ingang gebruiken in een tekenreeks die langer is dan 49 56 00:02:35,560 --> 00:02:35,975 karakters. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Precies. 58 00:02:37,260 --> 00:02:41,420 Elke keer zie je iets vaste lengte als het gaat om een ​​array uw 59 00:02:41,420 --> 00:02:44,650 radar moet doven dat dit zou kunnen zijn problematisch als je niet controleren van de 60 00:02:44,650 --> 00:02:45,810 grenzen van een array. 61 00:02:45,810 --> 00:02:46,650 En dat is hier het probleem. 62 00:02:46,650 --> 00:02:47,910 We zijn nog steeds met behulp van scanf. 63 00:02:47,910 --> 00:02:52,200 We zijn nog steeds met behulp van% s, wat betekent proberen een tekenreeks lezen van de gebruiker. 64 00:02:52,200 --> 00:02:56,300 Dat gaat worden ingelezen in s, die, op dit punt, is het effectief 65 00:02:56,300 --> 00:02:58,570 adres van een stuk van het geheugen of het equivalent. 66 00:02:58,570 --> 00:03:02,080 Het is de naam van een array tekens van het geheugen. 67 00:03:02,080 --> 00:03:07,610 >> Maar precies dat, als je een string te lezen die langer is dan 49 tekens, 49 68 00:03:07,610 --> 00:03:10,440 omdat je ruimte nodig hebt voor de backslash 0, je gaat overstromen 69 00:03:10,440 --> 00:03:11,390 die buffer. 70 00:03:11,390 --> 00:03:16,410 En je zou je geluk hebben en in staat zijn om schrijf een 51 karakter, 52, 53. 71 00:03:16,410 --> 00:03:18,560 Maar op een gegeven moment, het besturingssysteem gaat zeggen, nee. 72 00:03:18,560 --> 00:03:21,270 Dit is zeker niet het geheugen jij mag aanraken. 73 00:03:21,270 --> 00:03:23,380 En het programma gaat segfault. 74 00:03:23,380 --> 00:03:26,650 >> Dus daar moet de heuristiek enige zijn keer dat je vaste lengte hebt, heb je 75 00:03:26,650 --> 00:03:30,150 om ervoor te zorgen dat je het controleren van de lengte van wat het ook is dat je probeert 76 00:03:30,150 --> 00:03:31,090 lezen erin. 77 00:03:31,090 --> 00:03:35,110 >> PUBLIEK: Dus op te lossen dat je zou kunnen een verklaring hebben de controle had eigenlijk 78 00:03:35,110 --> 00:03:37,140 is de lengte groter of kleiner dan? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Absoluut. 80 00:03:37,730 --> 00:03:41,706 Je hoeft alleen een voorwaarde dat zegt, als het - 81 00:03:41,706 --> 00:03:46,080 of liever gezegd hoef je niet per se te kennen op voorhand hoeveel tekens de 82 00:03:46,080 --> 00:03:49,060 gebruiker gaat typen, omdat heb je kip en het ei. 83 00:03:49,060 --> 00:03:51,860 Pas als je hebt gelezen in met scanf kun je uitzoeken hoe lang het is. 84 00:03:51,860 --> 00:03:54,500 Maar op dat moment, het is te laat, omdat je het al hebt gelezen in 85 00:03:54,500 --> 00:03:55,710 sommige blok geheugen. 86 00:03:55,710 --> 00:03:59,590 Dus als een terzijde, de CS50 bibliotheek vermijdt dit probleem helemaal, recall 87 00:03:59,590 --> 00:04:01,060 met fgetc. 88 00:04:01,060 --> 00:04:05,390 En het leest een teken tegelijk, -tip toeing langs de wetenschap dat u 89 00:04:05,390 --> 00:04:08,060 kan een teken als niet overstromen je leest een voor een. 90 00:04:08,060 --> 00:04:11,580 >> De vangst is met getString recall is dat we voortdurend re-size 91 00:04:11,580 --> 00:04:13,590 dat stuk van het geheugen, die is gewoon een pijn. 92 00:04:13,590 --> 00:04:15,310 Het is een stuk van de lijnen van code om dat te doen. 93 00:04:15,310 --> 00:04:18,779 Dus een andere aanpak zou zijn om daadwerkelijk gebruik maken van een neef, dus 94 00:04:18,779 --> 00:04:19,790 te zeggen, van scanf. 95 00:04:19,790 --> 00:04:22,820 Er zijn varianten van veel van deze functies die daadwerkelijk controleert de 96 00:04:22,820 --> 00:04:25,870 lengte van hoeveel tekens je zou maximaal lezen. 97 00:04:25,870 --> 00:04:29,430 En je kon opgeven, niet lezen meer dan 50 tekens. 98 00:04:29,430 --> 00:04:34,110 Dus dat zou een andere aanpak, maar minder meegaand van grotere ingangen. 99 00:04:34,110 --> 00:04:37,040 >> Dus vraag 2 vraagt, stel dat versie 3 wordt gecompileerd en uitgevoerd. 100 00:04:37,040 --> 00:04:39,960 Waarom zou dat programma segfault? 101 00:04:39,960 --> 00:04:42,650 Dus dit is eigenlijk hetzelfde beantwoorden, hoewel 102 00:04:42,650 --> 00:04:43,590 ziet er een beetje liefhebber. 103 00:04:43,590 --> 00:04:46,440 We gebruiken malloc, dat aanvoelt als we geven ons meer opties. 104 00:04:46,440 --> 00:04:48,030 En dan zijn we vrijmaken dat geheugen op het einde. 105 00:04:48,030 --> 00:04:49,580 Het is nog steeds slechts 50 bytes van het geheugen. 106 00:04:49,580 --> 00:04:53,620 Dus we kunnen nog steeds proberen om te lezen in 51, 52, 1000 bytes. 107 00:04:53,620 --> 00:04:55,830 Het gaat om segfault voor dezelfde reden. 108 00:04:55,830 --> 00:04:57,530 >> Maar er is ook een andere reden. 109 00:04:57,530 --> 00:05:03,890 Wat kon rendement malloc naast het adres van een stuk van het geheugen? 110 00:05:03,890 --> 00:05:04,920 Het zou null terugkeren. 111 00:05:04,920 --> 00:05:07,560 En omdat we niet controleren op dat zouden we iets goed doen 112 00:05:07,560 --> 00:05:11,350 dom om een ​​andere reden, namelijk dat we misschien vertellen scanf, lezen 113 00:05:11,350 --> 00:05:16,050 invoer van de gebruiker via het toetsenbord in 0 locatie, AKA null. 114 00:05:16,050 --> 00:05:18,890 En ook dat zal zeker leiden tot een segfault. 115 00:05:18,890 --> 00:05:21,590 Dus voor het doel van de quiz is, zouden we hebben een van deze als een aanvaard 116 00:05:21,590 --> 00:05:22,740 geldige reden. 117 00:05:22,740 --> 00:05:23,420 Een identiek. 118 00:05:23,420 --> 00:05:25,720 Een daarvan is een beetje genuanceerder. 119 00:05:25,720 --> 00:05:28,975 >> Tenslotte, met betrekking tot het programma gebruik van het geheugen, hoe versie 2 doen en 120 00:05:28,975 --> 00:05:30,350 versie 3 verschillen? 121 00:05:30,350 --> 00:05:35,070 Dus voor wat het waard is, zagen we een schijnbaar eindeloze aanbod van mogelijke 122 00:05:35,070 --> 00:05:35,770 antwoorden op. 123 00:05:35,770 --> 00:05:39,300 En onder de antwoorden van mensen, wat we waren hoopte, maar we andere aanvaard 124 00:05:39,300 --> 00:05:42,250 dingen, was enige vermelding van de Dat versie 2 gebruikt 125 00:05:42,250 --> 00:05:44,560 de zogenaamde stack. 126 00:05:44,560 --> 00:05:46,710 Versie 3 is het gebruik van de heap. 127 00:05:46,710 --> 00:05:50,060 En functioneel, dit niet echt maken al dat veel van een verschil. 128 00:05:50,060 --> 00:05:54,040 Aan het eind van de dag, we zijn nog steeds net 50 bytes van het geheugen. 129 00:05:54,040 --> 00:05:56,640 >> Maar dat was een van de mogelijke antwoorden waren we op zoek naar. 130 00:05:56,640 --> 00:05:59,730 Maar je zult zien, als u uw quizzen terug van de TF's, dat we deden 131 00:05:59,730 --> 00:06:04,330 aanvaarden andere discussies van hun ongelijksoortige vormen van gebruik van het geheugen ook. 132 00:06:04,330 --> 00:06:08,600 Maar stack en heap zou zijn geweest een eenvoudig antwoord op te gaan met. 133 00:06:08,600 --> 00:06:11,150 Heeft u nog vragen? 134 00:06:11,150 --> 00:06:12,400 Ik geef je Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Dus probleem 4. 137 00:06:20,210 --> 00:06:21,985 Dit is degene waar je moest invullen het aantal bytes van alle 138 00:06:21,985 --> 00:06:23,460 deze verschillende soorten gebruikt. 139 00:06:23,460 --> 00:06:24,830 Dus eerste wat we zien. 140 00:06:24,830 --> 00:06:27,930 Ga uit van een 32-bit architectuur, als deze CS50 apparaat. 141 00:06:27,930 --> 00:06:33,530 Dus een van de fundamentele dingen over 32-bits architecturen, die ons vertelt 142 00:06:33,530 --> 00:06:37,490 precies hoe groot een pointer gaat om in de architectuur. 143 00:06:37,490 --> 00:06:43,020 >> Dus meteen, we weten dat elke pointer type is 32-bit of 4 bytes. 144 00:06:43,020 --> 00:06:46,010 Dus kijken naar deze tabel, een knooppunt * is een type pointer. 145 00:06:46,010 --> 00:06:47,250 Dat gaat worden 4 bytes. 146 00:06:47,250 --> 00:06:51,640 Struct knoop *, dat is letterlijk identiek aan knooppunt ster. 147 00:06:51,640 --> 00:06:53,590 En dat gaat worden 4 bytes. 148 00:06:53,590 --> 00:06:58,270 String, dus het maakt niet uit als een pointer nog niet, maar de typedef, een 149 00:06:58,270 --> 00:07:01,590 snaar is gewoon een char *, die is een type pointer. 150 00:07:01,590 --> 00:07:03,550 Dus dat gaat worden 4 bytes. 151 00:07:03,550 --> 00:07:06,150 >> Dus deze drie zijn 4 bytes. 152 00:07:06,150 --> 00:07:09,350 Nu, knooppunt en student zijn een beetje ingewikkelder. 153 00:07:09,350 --> 00:07:15,160 Dus kijken naar knooppunt en student, zien we knooppunt als een integer en een pointer. 154 00:07:15,160 --> 00:07:18,050 En leerling is twee pointers binnenkant van het. 155 00:07:18,050 --> 00:07:23,340 Dus in ieder geval voor ons geval hier, de manier we uiteindelijk berekening van het aantal 156 00:07:23,340 --> 00:07:27,020 Deze structuur is gewoon optellen alles dat er in de structuur. 157 00:07:27,020 --> 00:07:30,690 >> Dus voor knooppunt, hebben we een geheel getal, die 4 bytes. 158 00:07:30,690 --> 00:07:32,830 We hebben een pointer, die 4 bytes. 159 00:07:32,830 --> 00:07:35,820 En dus een knooppunt gaat tot het nemen van 8 bytes. 160 00:07:35,820 --> 00:07:39,490 En hetzelfde geldt voor studenten, hebben we een aanwijzer die 4 bytes en een 161 00:07:39,490 --> 00:07:40,770 pointer dat is 4 bytes. 162 00:07:40,770 --> 00:07:43,180 Dus dat gaat eindigen omhoog het zijn 8 bytes. 163 00:07:43,180 --> 00:07:45,480 Dus knooppunt en student zijn 8 bytes. 164 00:07:45,480 --> 00:07:48,950 En deze drie zijn alle 4 bytes. 165 00:07:48,950 --> 00:07:50,240 Vragen over zeggen? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Ja. 168 00:07:54,990 --> 00:07:58,413 >> PUBLIEK: Is het een 64-bit architectuur, zou dat 169 00:07:58,413 --> 00:07:59,880 verdubbelen ze allemaal? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: Het zou niet verdubbelen allemaal. 171 00:08:01,790 --> 00:08:05,830 Dus 64-bit architectuur, het, opnieuw, veranderingen die fundamentele ding dat een 172 00:08:05,830 --> 00:08:08,910 pointer is nu 64 bits. 173 00:08:08,910 --> 00:08:09,290 Yeah. 174 00:08:09,290 --> 00:08:10,930 Dus een pointer is 8 bytes. 175 00:08:10,930 --> 00:08:15,420 Dus deze dat 4 bytes waren zullen 8 bytes. 176 00:08:15,420 --> 00:08:18,617 Een student, die twee pointers was, goed, nu het gaat om 177 00:08:18,617 --> 00:08:19,800 zijn 8 bytes, 8 bytes. 178 00:08:19,800 --> 00:08:21,980 Het gaat om 16 bytes te maken. 179 00:08:21,980 --> 00:08:25,710 >> Maar knooppunt nog 4 bytes. 180 00:08:25,710 --> 00:08:27,800 Dus deze pointer gaat zijn 8 bytes. 181 00:08:27,800 --> 00:08:28,930 Dit is 4 bytes. 182 00:08:28,930 --> 00:08:30,870 Dus een knooppunt is alleen maar zijn 12 bytes. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Andere vragen op die ene? 185 00:08:39,280 --> 00:08:44,500 Dus de volgende, deze de HTTP status code. 186 00:08:44,500 --> 00:08:48,000 En je moest omstandigheden beschrijven waaronder deze macht 187 00:08:48,000 --> 00:08:49,810 aan u worden geretourneerd. 188 00:08:49,810 --> 00:08:56,730 een probleem dat ik hoorde dat sommige studenten hebben is dat ze geprobeerd om de 189 00:08:56,730 --> 00:08:58,950 fouten worden op het einde van de cliënt. 190 00:08:58,950 --> 00:09:02,320 Dus als we proberen om het verzoek in te dienen naar de server, gaat er iets 191 00:09:02,320 --> 00:09:03,820 fout aan onze kant. 192 00:09:03,820 --> 00:09:07,660 Maar in het algemeen, zijn deze codes wordt geretourneerd door de server. 193 00:09:07,660 --> 00:09:11,720 Dus willen we uitzoeken wat er gaande verkeerd of rechts op de server die 194 00:09:11,720 --> 00:09:14,280 zorgt ervoor dat deze dingen te worden geretourneerd. 195 00:09:14,280 --> 00:09:18,670 Dus waarom zou een server rendement statuscode 200? 196 00:09:18,670 --> 00:09:19,920 Elke gedachten? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Yeah. 199 00:09:23,730 --> 00:09:27,850 Dus iets over succes het verzoek ging door. 200 00:09:27,850 --> 00:09:30,260 En ze zijn in staat om terug te keren wat je vroeg. 201 00:09:30,260 --> 00:09:32,240 Dus alles was prima. 202 00:09:32,240 --> 00:09:35,662 Hoe zit het met 302 gevonden? 203 00:09:35,662 --> 00:09:36,618 Yeah. 204 00:09:36,618 --> 00:09:39,008 >> Publiek: De server was op zoek voor wat je gevraagd. 205 00:09:39,008 --> 00:09:40,442 Maar kon het niet vinden. 206 00:09:40,442 --> 00:09:42,850 Dus er is een fout. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Dus was de server op zoek naar wat je wilde. 208 00:09:47,720 --> 00:09:51,682 Dus gewoon kijken hier, 302 gevonden, het was in staat om het te vinden. 209 00:09:51,682 --> 00:09:53,035 >> Publiek: Het spijt me. 210 00:09:53,035 --> 00:09:54,388 Gevonden betekent dat ze vonden het. 211 00:09:54,388 --> 00:09:55,638 Sorry. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Dus 302 gevonden. 214 00:10:00,160 --> 00:10:02,350 De server kan vinden wat je wilde. 215 00:10:02,350 --> 00:10:04,640 >> Publiek: Maar het is niet weer te geven? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: Het verschil tussen Dit 302 en 200 is dat het 217 00:10:08,180 --> 00:10:09,280 weet wat je wilt. 218 00:10:09,280 --> 00:10:12,000 Maar het is niet precies waar je wilde vragen. 219 00:10:12,000 --> 00:10:14,580 Dus 302 is een typisch redirect. 220 00:10:14,580 --> 00:10:16,510 Dus je hebt een pagina opgevraagd. 221 00:10:16,510 --> 00:10:19,590 Het weet, oh, ik wil u deze terug. 222 00:10:19,590 --> 00:10:21,070 Maar dit is op een andere URL. 223 00:10:21,070 --> 00:10:23,534 Dus hey, je eigenlijk wilt dit. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: Het is een stuk dat zei dat gaven we jullie een redirect 225 00:10:26,950 --> 00:10:30,830 functie dat de header functie gebruikt dat op zijn beurt afgedrukt locatie, 226 00:10:30,830 --> 00:10:34,110 colon, en vervolgens de URL waarnaar je wilt de gebruiker te weigeren. 227 00:10:34,110 --> 00:10:37,480 Ook al heb je niet zien 302 expliciet daar, dat is wat PHP 228 00:10:37,480 --> 00:10:41,550 zou magisch plaatst als de header zeggen precies wat Rob zei dat er - 229 00:10:41,550 --> 00:10:41,930 gevonden. 230 00:10:41,930 --> 00:10:43,180 Maar ga hier plaats. 231 00:10:43,180 --> 00:10:45,960 232 00:10:45,960 --> 00:10:46,160 >> ROB BOWDEN: OK. 233 00:10:46,160 --> 00:10:47,630 Dus hoe zit het met 403 verboden? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> Publiek: Ik denk dat het dat de server is eigenlijk te zeggen dat de cliënt 236 00:10:57,120 --> 00:10:59,970 geen toegang tot de home page. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Dus ja. 238 00:11:03,260 --> 00:11:07,670 Nou, waren de typische antwoord dat we verwacht is zoiets als, de bestanden 239 00:11:07,670 --> 00:11:08,920 niet op de juiste chmodded. 240 00:11:08,920 --> 00:11:11,590 Dat is waarschijnlijk onder welke omstandigheden je zag ze. 241 00:11:11,590 --> 00:11:18,920 Maar er is een reden dat de cliënt schuld zou kunnen zijn hier. 242 00:11:18,920 --> 00:11:20,440 Er is eigenlijk een andere statuscode - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Dus deze zijn zeer vergelijkbaar. 245 00:11:22,820 --> 00:11:24,590 >> 401 is niet toegestaan. 246 00:11:24,590 --> 00:11:26,130 En 403 is verboden. 247 00:11:26,130 --> 00:11:31,890 En dus onbevoegd u uitsluitend als je niet bent ingelogd 248 00:11:31,890 --> 00:11:34,520 Maar het inloggen kan betekenen dat u bevoegd bent. 249 00:11:34,520 --> 00:11:37,930 Maar als je al aangemeld en nog steeds geen toestemming, dan 250 00:11:37,930 --> 00:11:40,140 je kunt ook verboden. 251 00:11:40,140 --> 00:11:45,320 Dus als je ingelogd bent en hoeft niet toestemming, verboden is ook 252 00:11:45,320 --> 00:11:47,164 iets wat je kunt krijgen. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: En het mechanisme die deze problemen meestal 254 00:11:48,900 --> 00:11:53,100 opgelost op de server via welk commando? 255 00:11:53,100 --> 00:11:57,700 Chmod, als het inderdaad een permissies geven op het bestand of de map. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: Dan 404 niet gevonden. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Yeah. 259 00:12:03,470 --> 00:12:10,150 Dus in tegenstelling tot 302, waar het was precies niet waar je vraagt, maar het weet wat 260 00:12:10,150 --> 00:12:12,710 je wilt, dit, het heeft gewoon geen idee wat je wilt. 261 00:12:12,710 --> 00:12:15,648 En u bent niet vraagt iets geldig. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Ik ben een theepot en vervolgens 500 interne server. 264 00:12:22,310 --> 00:12:24,870 Dus waarom zou je die vandaan? 265 00:12:24,870 --> 00:12:26,120 >> Dus segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Ik eigenlijk niet weet wat de indeling standaard voor. 268 00:12:30,640 --> 00:12:34,850 Maar als je PHP-code had iets verkeerd in, in theorie, het kon 269 00:12:34,850 --> 00:12:39,650 eigenlijk segfault, waarbij deze 500 internal server error, iets 270 00:12:39,650 --> 00:12:41,400 is er mis met je server configuratie. 271 00:12:41,400 --> 00:12:44,320 Of er is een syntax error in uw PHP-code. 272 00:12:44,320 --> 00:12:46,095 Of er iets ergs aan de hand is. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: We zagen segfault onder de antwoorden van een paar mensen. 274 00:12:48,320 --> 00:12:49,490 En technisch gezien, kan het gebeuren. 275 00:12:49,490 --> 00:12:53,820 Maar dat zou een PHP, het programma geschreven door andere mensen, eigenlijk 276 00:12:53,820 --> 00:12:57,790 segfault, die alleen als die mensen geschroefd en schreef buggy code in 277 00:12:57,790 --> 00:13:00,680 hun tolk zou PHP zelf segfault. 278 00:13:00,680 --> 00:13:06,460 Dus ook al 500 is als een segfault in de geest, het is bijna altijd de 279 00:13:06,460 --> 00:13:10,490 gevolg van een configuratiebestand kwestie met uw webserver of, zoals Rob zei, 280 00:13:10,490 --> 00:13:13,200 een syntax error, zoals jij heeft een offerte heeft afgesloten. 281 00:13:13,200 --> 00:13:16,180 Of u een puntkomma ergens verloren. 282 00:13:16,180 --> 00:13:23,677 >> PUBLIEK: Dus voor de Shuttle PSET, ik denken toen ik het deed zodra ik klikte op de 283 00:13:23,677 --> 00:13:26,300 browser, maar niets kwam, wat zij noemden witte pagina. 284 00:13:26,300 --> 00:13:28,056 Maar het was omwille van de code. 285 00:13:28,056 --> 00:13:29,440 Ik denk dat was JavaScript, toch? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Yeah. 287 00:13:29,770 --> 00:13:31,180 >> Publiek: Zou die fout nog komen? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Dus je zou niet hebben gekregen deze fout omdat alles 289 00:13:34,290 --> 00:13:36,930 vanuit het perspectief van de webserver was helemaal prima. 290 00:13:36,930 --> 00:13:39,090 Maar u heeft opgevraagd index.html. 291 00:13:39,090 --> 00:13:42,000 U verzocht shuttle.js en service.js. 292 00:13:42,000 --> 00:13:44,580 En het was in staat om met succes terug te keren om u al die dingen - 293 00:13:44,580 --> 00:13:44,980 200. 294 00:13:44,980 --> 00:13:45,680 OK. 295 00:13:45,680 --> 00:13:49,330 Het is pas wanneer uw browser probeerde te interpreteren van de JavaScript-code die 296 00:13:49,330 --> 00:13:51,370 Het is net, wacht, dit is niet geldige JavaScript-fout. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Andere vragen? 299 00:13:58,210 --> 00:14:00,750 Oke. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Dus de volgende up was nummer 11. 301 00:14:04,120 --> 00:14:07,610 En 11 was het engste voor een heleboel mensen. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Dus het belangrijkste ding om te noteren was dat dit inderdaad over 304 00:14:18,570 --> 00:14:19,840 een dubbel gelinkte lijst. 305 00:14:19,840 --> 00:14:23,160 Maar dit hetzelfde als vorig jaar was niet dubbel gelinkte lijst probleem, 306 00:14:23,160 --> 00:14:27,170 die niet geven u de waarschuwing dat de lijst kan, in feite, zijn ongesorteerd. 307 00:14:27,170 --> 00:14:29,640 >> Dus het feit dat de lijst was ongesorteerd en het feit dat dat woord was 308 00:14:29,640 --> 00:14:32,930 onderstreepte er moest brengen dat dit eigenlijk een vereenvoudiging 309 00:14:32,930 --> 00:14:35,430 wat anders zou zijn geweest een meer uitdagend probleem 310 00:14:35,430 --> 00:14:36,600 en een langere. 311 00:14:36,600 --> 00:14:40,760 Dus een veel voorkomende fout was hier te zijn gekomen oplossing van vorig jaar op de ene 312 00:14:40,760 --> 00:14:45,580 pager en dan gewoon blindelings kopiëren dat af als het antwoord, dat is de juiste 313 00:14:45,580 --> 00:14:48,520 antwoord op een andere vraag in dezelfde geest. 314 00:14:48,520 --> 00:14:51,340 Maar de subtiliteiten hier waren als volgt. 315 00:14:51,340 --> 00:14:55,200 >> Dus een, we hebben een knooppunt verklaard en gedefinieerd op de gebruikelijke manier hier. 316 00:14:55,200 --> 00:14:59,230 Dan gedefinieerd we lijst van een mondiale pointer geïnitialiseerd op null. 317 00:14:59,230 --> 00:15:02,150 Dan blijkbaar is er twee functies we hebben prototypes voor hier, insert 318 00:15:02,150 --> 00:15:03,240 en te verwijderen. 319 00:15:03,240 --> 00:15:06,600 En dan hebben we enkele voorbeelden van code hier van het doen van een bos van inserties. 320 00:15:06,600 --> 00:15:09,930 En dan vragen wij u in te vullen de uitvoering insert hieronder dergelijke 321 00:15:09,930 --> 00:15:14,380 een manier dat het ingevoegd n in de lijst in constante tijd, ook onderstreept, 322 00:15:14,380 --> 00:15:15,730 zelfs indien reeds aanwezig. 323 00:15:15,730 --> 00:15:20,600 >> Dus de schoonheid van de mogelijkheid om in te voegen in constante tijd is dat het impliceert 324 00:15:20,600 --> 00:15:23,060 dat je moet invoegen het nieuwe knooppunt waar? 325 00:15:23,060 --> 00:15:23,690 In de voorste. 326 00:15:23,690 --> 00:15:27,760 Dus het elimineert, gelukkig, althans een van de zaken die wordt gebruikt om te eisen 327 00:15:27,760 --> 00:15:30,520 nog meer regels code, zoals het deed vorig jaar en zelfs in de klas toen we 328 00:15:30,520 --> 00:15:34,040 doorgepraat dit soort dingen met mensen en sommige 329 00:15:34,040 --> 00:15:35,250 verbale pseudo-code. 330 00:15:35,250 --> 00:15:39,190 Dus hier de oplossing, laten we overslaan dat alleen een visueel hebben op 331 00:15:39,190 --> 00:15:40,480 het scherm. 332 00:15:40,480 --> 00:15:42,230 >> Merk op dat we het volgende doen. 333 00:15:42,230 --> 00:15:45,140 En ook merken de andere vereenvoudiging was dat zelfs als het 334 00:15:45,140 --> 00:15:48,280 reeds aanwezig, dus dit betekent dat als het nummer is er al, je kunt 335 00:15:48,280 --> 00:15:50,280 gewoon blindelings plaats een andere kopie ervan. 336 00:15:50,280 --> 00:15:52,560 En ook dat was bedoeld om een ​​te zijn vereenvoudiging, zodat je zou kunnen 337 00:15:52,560 --> 00:15:54,940 focus op echt, sommige meer intellectueel interessante deel en 338 00:15:54,940 --> 00:15:58,090 niet zomaar een extra foutcontrole gezien de beperkte tijd. 339 00:15:58,090 --> 00:16:02,880 >> Dus in dit monster oplossing, we verdelen een wijzer op de linker 340 00:16:02,880 --> 00:16:04,510 kant hier om een ​​knooppunt. 341 00:16:04,510 --> 00:16:07,190 Nu, beseffen dat wijzer, als Rob zei, is slechts 32 bits. 342 00:16:07,190 --> 00:16:09,060 En het eigenlijk niet bevatten een adres tot u 343 00:16:09,060 --> 00:16:09,970 toewijzen het adres. 344 00:16:09,970 --> 00:16:13,220 En dat doen we op de rechter kant via malloc. 345 00:16:13,220 --> 00:16:16,550 Net als een goede burger, controleren we dat malloc is in feite nul, waardoor 346 00:16:16,550 --> 00:16:18,690 we niet per ongeluk te creëren een segfault hier. 347 00:16:18,690 --> 00:16:22,840 En elke keer dat je malloc gebruikt in het leven, je moet controleren op null, opdat 348 00:16:22,840 --> 00:16:24,090 je hebt een subtiele bug. 349 00:16:24,090 --> 00:16:28,460 >> Vervolgens initialiseren we dat null door toewijzen n en vorige en volgende. 350 00:16:28,460 --> 00:16:32,450 En in dit geval hier, ik geïnitialiseerd voorafgaand aan nul, omdat deze nieuwe 351 00:16:32,450 --> 00:16:34,780 knooppunt zal de nieuwe zijn begin van mijn lijst. 352 00:16:34,780 --> 00:16:37,050 Dus er gaat worden niets ervoor. 353 00:16:37,050 --> 00:16:42,010 En ik wil in wezen voegen de bestaande lijst naar de nieuwe knoop door 354 00:16:42,010 --> 00:16:44,700 die naast die gelijk is aan de lijst zelf. 355 00:16:44,700 --> 00:16:47,120 Maar ik ben gewoon nog niet klaar. 356 00:16:47,120 --> 00:16:51,780 Dus als al de lijst zelf bestond, en er ten minste een knooppunt 357 00:16:51,780 --> 00:16:57,070 al op zijn plaats, indien dit is de lijst hier en ik steek een nieuw knooppunt hier, ik 358 00:16:57,070 --> 00:17:01,840 moet ervoor zorgen dat mijn vroegere knooppunt wijst naar achteren om mijn nieuwe knooppunt, 359 00:17:01,840 --> 00:17:04,260 omdat dit, wederom, een dubbel gelinkte lijst. 360 00:17:04,260 --> 00:17:05,460 >> Dat doen wij ook een sanity check. 361 00:17:05,460 --> 00:17:10,109 Als de lijst niet null is, als er al een of meer knooppunten er dan 362 00:17:10,109 --> 00:17:12,470 toevoegen dat terug verwijzing zo te zeggen. 363 00:17:12,470 --> 00:17:15,420 En dan is het laatste wat we nodig hebben te doen is eigenlijk het actualiseren van de globale 364 00:17:15,420 --> 00:17:20,329 variabele lijst zelf te wijzen die nieuwe knoop. 365 00:17:20,329 --> 00:17:21,790 Yeah. 366 00:17:21,790 --> 00:17:26,579 >> PUBLIEK: In de aanwijzer [Onverstaanbaar] is gelijk aan nul, doet dat 367 00:17:26,579 --> 00:17:30,420 omgaan met de lijst omdat de lijst is nul? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Nope. 369 00:17:30,596 --> 00:17:34,500 Dat is gewoon me die proactief voorzichtig, dat als dit mijn 370 00:17:34,500 --> 00:17:38,730 oorspronkelijke lijst met wellicht wat meer nodes hier en ik ben het invoegen van mijn 371 00:17:38,730 --> 00:17:42,380 nieuw knooppunt hierheen, er gaat niets meer dan hier te zijn. 372 00:17:42,380 --> 00:17:44,720 En ik wil dat idee vast te leggen door voorafgaand aan 373 00:17:44,720 --> 00:17:47,740 null op het nieuwe knooppunt. 374 00:17:47,740 --> 00:17:51,410 En vermoedelijk, als mijn code juist is en er is geen andere manier om in te voegen 375 00:17:51,410 --> 00:17:54,970 dan deze functie knooppunten vermoedelijk, zelfs als lijst heeft al 376 00:17:54,970 --> 00:18:00,090 een of meer knooppunten in, vermoedelijk de lijst, het eerste knooppunt, zou een 377 00:18:00,090 --> 00:18:02,750 vorige wijzer van null zelf. 378 00:18:02,750 --> 00:18:03,550 >> PUBLIEK: En gewoon een follow-up. 379 00:18:03,550 --> 00:18:08,139 De reden dat je pointer gezet volgende gelijken lijst wordt je maakt de aanwijzer 380 00:18:08,139 --> 00:18:13,579 voordat de lijst in dat het wijzend naar de volgende, denk ik - 381 00:18:13,579 --> 00:18:14,980 I Niet doen - 382 00:18:14,980 --> 00:18:15,450 geeft gewoon? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Precies. 384 00:18:16,400 --> 00:18:19,400 En dus laten we het zien als twee gevallen hier echt, hoewel de 385 00:18:19,400 --> 00:18:22,070 Om we zullen ze overwegen is niet helemaal hetzelfde als de code. 386 00:18:22,070 --> 00:18:26,250 Maar op een hoog niveau, als dit betekent lijst en dit is een 32-bit 387 00:18:26,250 --> 00:18:29,560 aanwijzer het eenvoudigste scenario dat dit null standaard. 388 00:18:29,560 --> 00:18:33,010 En stel dat ik wil invoegen de nummer 50 was het eerste nummer. 389 00:18:33,010 --> 00:18:37,640 Dus ik ga om verder te gaan en toe te wijzen een knooppunt, die gaat bevatten 390 00:18:37,640 --> 00:18:38,770 drie velden - 391 00:18:38,770 --> 00:18:42,070 n, vorige en volgende. 392 00:18:42,070 --> 00:18:44,580 >> Ik ga naar het nummer 50 gezet hier, omdat n is. 393 00:18:44,580 --> 00:18:46,130 Dit zal de volgende zijn. 394 00:18:46,130 --> 00:18:48,530 En dit zal previous zijn. 395 00:18:48,530 --> 00:18:50,910 En dus wat moet ik doen in dit geval? 396 00:18:50,910 --> 00:18:53,900 Nou, ik heb net gedaan lijn 1 hier. 397 00:18:53,900 --> 00:18:55,400 Pointer n krijgt n. 398 00:18:55,400 --> 00:18:57,740 Ik ben dan zeg, vorige moeten krijgen null. 399 00:18:57,740 --> 00:18:59,470 Dus dit gaat nul beschouwd. 400 00:18:59,470 --> 00:19:01,365 Dan ga ik zeggen volgende gaat naar de lijst te krijgen. 401 00:19:01,365 --> 00:19:05,150 >> En dit werkt gewoon goed uit. 402 00:19:05,150 --> 00:19:06,500 Dit is null. 403 00:19:06,500 --> 00:19:10,620 En dus zeg ik, het nieuwe knooppunt's volgende gebied moeten krijgen wat dit is. 404 00:19:10,620 --> 00:19:12,570 Dus dat zet andere null daar. 405 00:19:12,570 --> 00:19:14,510 En dan is het laatste wat Ik weet is kijk dan hier. 406 00:19:14,510 --> 00:19:17,870 Als lijst is niet gelijk nul, maar is gelijk aan nul, dus slaan we dat 407 00:19:17,870 --> 00:19:18,470 helemaal. 408 00:19:18,470 --> 00:19:23,520 En dus alles wat ik nu doen is de lijst krijgt wijzer, die pictorially gevolg 409 00:19:23,520 --> 00:19:25,570 een foto als dat. 410 00:19:25,570 --> 00:19:26,620 Dus dat is een scenario. 411 00:19:26,620 --> 00:19:30,490 >> En degene die je vragen over specifiek is een situatie als deze, 412 00:19:30,490 --> 00:19:33,190 waar we al een lijst met knooppunten. 413 00:19:33,190 --> 00:19:36,240 En als ik terug te gaan in de oorspronkelijke probleemstelling, de volgende wij zullen 414 00:19:36,240 --> 00:19:39,320 Steek bijvoorbeeld is 34, alleen voor Ter wille van de discussie. 415 00:19:39,320 --> 00:19:46,210 Dus ik ga gewoon handig trekken die dan hier. 416 00:19:46,210 --> 00:19:47,540 Ik heb net malloced. 417 00:19:47,540 --> 00:19:49,310 Laten we aannemen dat ik het controleren op null. 418 00:19:49,310 --> 00:19:51,870 >> Nu, ik ga initialiseren n te zijn 34. 419 00:19:51,870 --> 00:19:53,040 En dit zal n zijn. 420 00:19:53,040 --> 00:19:54,670 Dit zal de volgende zijn. 421 00:19:54,670 --> 00:19:57,100 En dit zal previous zijn. 422 00:19:57,100 --> 00:19:59,370 Laten we ervoor zorgen dat ik niet krijg deze naar achteren. 423 00:19:59,370 --> 00:20:01,110 Vorige komt eerst in de definitie. 424 00:20:01,110 --> 00:20:03,070 Laat mij dit oplossen. 425 00:20:03,070 --> 00:20:04,410 Dit is vorige. 426 00:20:04,410 --> 00:20:05,780 Dit is de volgende. 427 00:20:05,780 --> 00:20:08,620 Hoewel deze identiek zijn, laten we het consistent. 428 00:20:08,620 --> 00:20:09,450 >> Vorige. 429 00:20:09,450 --> 00:20:11,030 Dit is de volgende. 430 00:20:11,030 --> 00:20:16,310 Dus ik heb net malloced mijn briefje, gecontroleerd voor null, toegewezen 34 in het knooppunt. 431 00:20:16,310 --> 00:20:17,570 Vorige krijgt null. 432 00:20:17,570 --> 00:20:19,480 Dus dat geeft me dat. 433 00:20:19,480 --> 00:20:21,010 Volgende krijgt lijst. 434 00:20:21,010 --> 00:20:22,370 Dus lijst is deze. 435 00:20:22,370 --> 00:20:26,520 Dus dit is hetzelfde nu als tekenen deze pijl, zodat ze wijzen op een 436 00:20:26,520 --> 00:20:27,940 dezelfde. 437 00:20:27,940 --> 00:20:30,400 En dan ga ik kijken of lijst is niet gelijk aan nul. 438 00:20:30,400 --> 00:20:31,740 En het is deze keer niet. 439 00:20:31,740 --> 00:20:35,580 Dan ga ik naar de lijst doen vorige krijgt pointer. 440 00:20:35,580 --> 00:20:39,700 >> Dus Voorgaande krijgt PTR. 441 00:20:39,700 --> 00:20:44,300 Dit heeft dus tot gevolg heeft dat een grafische pijl hier. 442 00:20:44,300 --> 00:20:46,930 En dat wordt een beetje golvende lijnen. 443 00:20:46,930 --> 00:20:50,780 En dan, tot slot, ik updaten lijst aan te wijzen pointer. 444 00:20:50,780 --> 00:20:55,560 Dus nu deze verwijst naar deze man. 445 00:20:55,560 --> 00:20:57,170 En nu, laten we doen een snelle sanity check. 446 00:20:57,170 --> 00:20:59,470 >> Hier is de lijst, dat is de globale variabele. 447 00:20:59,470 --> 00:21:02,850 Het eerste knooppunt is inderdaad 34, omdat Ik volg die pijl. 448 00:21:02,850 --> 00:21:05,210 En dat klopt, want ik wil Steek aan het begin van de lijst 449 00:21:05,210 --> 00:21:06,070 alle nieuwe knooppunten. 450 00:21:06,070 --> 00:21:08,860 Zijn volgende veld leidt mij tot deze man. 451 00:21:08,860 --> 00:21:10,710 Als ik ga door, ik raakte naast null. 452 00:21:10,710 --> 00:21:11,760 Dus er is geen lijst meer. 453 00:21:11,760 --> 00:21:14,460 Als ik nu op de vorige, krijg ik terug waar ik verwacht. 454 00:21:14,460 --> 00:21:16,435 >> Dus er zijn nog een paar aanwijzingen, uiteraard te manipuleren. 455 00:21:16,435 --> 00:21:19,870 Maar het feit dat je verteld te doen dit in constante tijd betekent dat u alleen 456 00:21:19,870 --> 00:21:22,910 hebben een eindig aantal dingen jij mag doen. 457 00:21:22,910 --> 00:21:24,290 En wat is dat nummer? 458 00:21:24,290 --> 00:21:25,185 Het kan een stap zijn. 459 00:21:25,185 --> 00:21:25,700 Het is misschien twee. 460 00:21:25,700 --> 00:21:26,820 Het is misschien 1.000 stappen. 461 00:21:26,820 --> 00:21:30,500 Maar het is eindig, wat betekent dat je niet kunt hebben enige vorm van een lus aan de hand 462 00:21:30,500 --> 00:21:32,010 hier, geen terugkeer, geen lussen. 463 00:21:32,010 --> 00:21:37,390 Het moet gewoon hard-coded lijnen van de code zoals we hebben in deze steekproef. 464 00:21:37,390 --> 00:21:42,330 >> Dus de volgende probleem 12 vroeg ons om Voltooiing van de uitvoering van remove 465 00:21:42,330 --> 00:21:46,740 onder zodanige wijze dat het verwijdert n van de lijst in lineaire tijd. 466 00:21:46,740 --> 00:21:48,740 Dus je moet een beetje meer hebben speelruimte nu. 467 00:21:48,740 --> 00:21:52,380 Misschien dat n aannemen, indien aanwezig in de lijst, aanwezig zal zijn 468 00:21:52,380 --> 00:21:53,340 niet meer dan een keer. 469 00:21:53,340 --> 00:21:56,770 En dat ook bedoeld is een quiz-based vereenvoudigende veronderstelling, dus 470 00:21:56,770 --> 00:21:59,780 dat als je het getal 50 ergens in de lijst, u ook niet 471 00:21:59,780 --> 00:22:02,890 zorgen te maken over blijven herhalen, op zoek naar alle mogelijke 472 00:22:02,890 --> 00:22:06,990 exemplaar van 50, die net zou delegeren in sommige minutia in beperkte tijd. 473 00:22:06,990 --> 00:22:10,460 >> Dus met verwijderen, dit was zeker uitdagender en meer 474 00:22:10,460 --> 00:22:11,640 code te schrijven. 475 00:22:11,640 --> 00:22:14,990 Maar op het eerste gezicht, eerlijk gezegd, is het misschien kijken overweldigend en als iets 476 00:22:14,990 --> 00:22:17,060 er is geen manier waarop je zou kunnen hebben komen met een quiz. 477 00:22:17,060 --> 00:22:22,450 Maar als we ons richten op de afzonderlijke stappen, hopelijk zal het plotseling 478 00:22:22,450 --> 00:22:26,060 staking u dat elk van deze individuele stappen maakt duidelijk zin 479 00:22:26,060 --> 00:22:27,080 achteraf. 480 00:22:27,080 --> 00:22:28,200 Dus laten we eens een kijkje nemen. 481 00:22:28,200 --> 00:22:32,570 >> Dus eerst, we initialiseren wijzer zijn lijst zelf. 482 00:22:32,570 --> 00:22:36,040 Want ik wil lineaire tijd, dat betekent Ik ga wat loop hebben. 483 00:22:36,040 --> 00:22:39,730 En een gemeenschappelijke manier om itereren over de knopen in lijst structuur of enigerlei 484 00:22:39,730 --> 00:22:43,860 structuur iteratief te nemen een pointer naar de voorzijde van de gegevens 485 00:22:43,860 --> 00:22:46,990 structuur en dan gewoon beginnen met het updaten en loop je weg 486 00:22:46,990 --> 00:22:48,650 door de gegevensstructuur. 487 00:22:48,650 --> 00:22:50,040 Dus ik ga om precies dat te doen. 488 00:22:50,040 --> 00:22:54,260 >> Terwijl wijzer, mijn tijdelijke variabele, is niet gelijk aan nul, laten we 489 00:22:54,260 --> 00:22:55,660 ga je gang en controleren. 490 00:22:55,660 --> 00:22:56,910 Heb ik geluk? 491 00:22:56,910 --> 00:23:01,740 Is het veld n in de knoop Ik ben momenteel kijken gelijk aan de 492 00:23:01,740 --> 00:23:03,380 nummer Ik ben op zoek naar? 493 00:23:03,380 --> 00:23:05,410 En zo ja, laten we iets doen. 494 00:23:05,410 --> 00:23:10,020 Nu, merken dit als voorwaarde omringt de gehele 495 00:23:10,020 --> 00:23:11,520 volgende regels code. 496 00:23:11,520 --> 00:23:14,610 Dit is het enige wat ik zorg over - vinden van een nummer in kwestie. 497 00:23:14,610 --> 00:23:18,010 Dus er is geen ander, die vereenvoudigt dingen conceptueel een beetje. 498 00:23:18,010 --> 00:23:22,040 >> Maar nu, realiseerde ik me, en je zou kunnen hebben pas besefte dat dit na te denken 499 00:23:22,040 --> 00:23:24,720 het door een beetje, er is eigenlijk twee gevallen hier. 500 00:23:24,720 --> 00:23:28,060 Een is waar het knooppunt is bovenaan begin van de lijst, die een 501 00:23:28,060 --> 00:23:31,040 beetje vervelend, want dat is een speciaal geval, omdat je te maken hebt 502 00:23:31,040 --> 00:23:33,340 met dit ding, dat is de enige anomalie. 503 00:23:33,340 --> 00:23:35,720 Overal elders in de lijst, het is hetzelfde. 504 00:23:35,720 --> 00:23:38,050 Er is een eerdere knooppunt en een volgende knooppunt, vorige knooppunt, volgende knooppunt. 505 00:23:38,050 --> 00:23:40,940 Maar deze man is een beetje speciaal als hij in het begin. 506 00:23:40,940 --> 00:23:48,710 >> Dus als de wijzer is gelijk aan de lijst zelf, dus als ik aan het begin van 507 00:23:48,710 --> 00:23:53,960 de lijst en heb n gevonden, moet ik om een ​​paar dingen te doen. 508 00:23:53,960 --> 00:23:59,230 Een, moet ik naar de lijst veranderen wijzen naar het volgende veld, 50. 509 00:23:59,230 --> 00:24:01,270 Dus stel dat ik probeer te verwijderen 34. 510 00:24:01,270 --> 00:24:03,560 Dus deze man heeft om te gaan weg in slechts een moment. 511 00:24:03,560 --> 00:24:07,210 >> Dus ik ga zeggen, lijst krijgt pijltje. 512 00:24:07,210 --> 00:24:08,570 Nou, dit is wijzer. 513 00:24:08,570 --> 00:24:10,360 Vervolgens wijst hier. 514 00:24:10,360 --> 00:24:17,470 Dus dit wordt deze pijl rechts veranderende nu hier te wijzen op deze man. 515 00:24:17,470 --> 00:24:19,580 Nu, vergeet niet, we hebben een tijdelijke variabele. 516 00:24:19,580 --> 00:24:23,520 Dus er is geen knooppunten wees, want ik heb ook deze man in mijn 517 00:24:23,520 --> 00:24:25,010 uitvoering van verwijderen. 518 00:24:25,010 --> 00:24:29,600 Dus nu, als de lijst zelf is niet nul, Ik moet een beetje iets te repareren. 519 00:24:29,600 --> 00:24:32,690 >> Ik moet er nu voor zorgen dat deze pijl, die eerder wijst 520 00:24:32,690 --> 00:24:36,830 50-34, heeft dit te weg te gaan, want als ik probeer te ontdoen 521 00:24:36,830 --> 00:24:41,910 van 34, 50 had beter niet handhaven soort terugverwijzing naar het als 522 00:24:41,910 --> 00:24:42,820 pijl voorgesteld. 523 00:24:42,820 --> 00:24:44,820 Dus ik net deed deze lijn. 524 00:24:44,820 --> 00:24:46,520 Dus dan ben ik klaar. 525 00:24:46,520 --> 00:24:48,040 Die zaak is eigenlijk vrij eenvoudig. 526 00:24:48,040 --> 00:24:51,010 Afhakken van de kop van de lijst is relatief eenvoudig. 527 00:24:51,010 --> 00:24:52,980 >> Helaas is er dit vervelend anders blok. 528 00:24:52,980 --> 00:24:56,170 Dus nu moet ik het dossier te bestuderen waar er iets in het midden. 529 00:24:56,170 --> 00:24:59,880 Maar het is niet al te slecht, met uitzondering van voor de syntax zoals deze. 530 00:24:59,880 --> 00:25:03,080 Dus als ik niet aan het begin van de lijst, ik ben ergens in het midden. 531 00:25:03,080 --> 00:25:08,160 En deze lijn hier zegt, start op welk knooppunt u toch bezig bent. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Ga naar volgend veld het vorige knooppunt en richt die op de aanwijzer. 534 00:25:18,550 --> 00:25:20,390 >> Laten we dit doen picturaal. 535 00:25:20,390 --> 00:25:21,640 Dat werd steeds ingewikkelder. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Dus als ik een eerdere velden hier - laten we dit doen - volgende velden hier. 538 00:25:37,990 --> 00:25:41,200 Ik ga mijn pointers eerder vereenvoudigen dan trek je een hele hoop 539 00:25:41,200 --> 00:25:45,710 dingen heen en weer kriskras elkaar. 540 00:25:45,710 --> 00:25:50,870 En nu, laten we gewoon zeggen dat dit 1, 2, 3 ter wille van de discussie, zelfs 541 00:25:50,870 --> 00:25:53,410 hoewel dat niet meer in lijn met het probleem in kwestie. 542 00:25:53,410 --> 00:25:55,900 >> Dus hier is mijn gelinkte lijst. 543 00:25:55,900 --> 00:25:59,300 Ik ben op zoek naar twee in deze verwijderen bepaalde versie van het verhaal. 544 00:25:59,300 --> 00:26:01,960 Dus ik heb pointer bijgewerkt om worden gewezen op deze man. 545 00:26:01,960 --> 00:26:03,315 Dus dit is PTR. 546 00:26:03,315 --> 00:26:04,530 Hij wijst hier. 547 00:26:04,530 --> 00:26:07,170 Dit is de lijst, die bestaat wereldwijd als voorheen. 548 00:26:07,170 --> 00:26:09,200 En hij richt zich hier niet uit wat. 549 00:26:09,200 --> 00:26:10,800 En nu, ik ben op zoek naar twee te verwijderen. 550 00:26:10,800 --> 00:26:13,850 >> Dus als wijzer hier wijst, ben ik gaat volgen, schijnbaar, de 551 00:26:13,850 --> 00:26:17,110 vorige wijzer, die mij brengt bij 1. 552 00:26:17,110 --> 00:26:22,290 Ik ben vervolgens gaan zeggen dat de volgende veld, dat brengt me naar deze 553 00:26:22,290 --> 00:26:25,410 doos hier, gaat gelijke pijltje. 554 00:26:25,410 --> 00:26:28,400 Dus als deze wijzer, dit is de volgende. 555 00:26:28,400 --> 00:26:31,840 Dat betekent dat deze pijl behoeften om te wijzen op deze man. 556 00:26:31,840 --> 00:26:35,140 >> Dus wat dat regel code heeft slechts gedaan is een beetje van dit. 557 00:26:35,140 --> 00:26:37,500 En nu, dit is op zoek als een stap in de goede richting. 558 00:26:37,500 --> 00:26:41,390 We willen wezen tot 2 snip het midden van 1 en 3. 559 00:26:41,390 --> 00:26:44,400 Dus is het logisch dat we willen route deze pointer omheen. 560 00:26:44,400 --> 00:26:50,400 Dus deze volgende regel wordt gecontroleerd of wijzer volgende is niet nul, er is 561 00:26:50,400 --> 00:26:54,200 inderdaad iemand rechts van 2, dat betekent dat we ook moeten doen 562 00:26:54,200 --> 00:26:55,850 een beetje snip hier. 563 00:26:55,850 --> 00:27:00,590 >> Dus ik moet nu deze pointer volgen en het actualiseren van de vorige aanwijzer op 564 00:27:00,590 --> 00:27:05,410 deze man om een ​​beetje een te doen workaround hier het punt hier. 565 00:27:05,410 --> 00:27:07,100 En nu, visueel is dit leuk. 566 00:27:07,100 --> 00:27:11,930 Het is een beetje rommelig in dat er niemand wijst naar de 2 meer. 567 00:27:11,930 --> 00:27:13,600 2 wijst naar links. 568 00:27:13,600 --> 00:27:14,980 En 2 wijst naar rechts. 569 00:27:14,980 --> 00:27:17,480 Maar hij kan doen wat hij wil, omdat hij is over te krijgen bevrijd. 570 00:27:17,480 --> 00:27:19,480 En het maakt niet uit wat deze waarden zijn niet meer. 571 00:27:19,480 --> 00:27:23,040 >> Wat belangrijk is dat de resterende jongens zijn boven routing 572 00:27:23,040 --> 00:27:24,280 en onder hem nu. 573 00:27:24,280 --> 00:27:25,810 En inderdaad, dat is wat we nu doen. 574 00:27:25,810 --> 00:27:29,360 We gratis wijzer, wat betekent dat we vertellen de besturingssysteem, bent u welkom 575 00:27:29,360 --> 00:27:30,906 om deze terug te vorderen. 576 00:27:30,906 --> 00:27:34,900 En dan tot slot, keren we terug. 577 00:27:34,900 --> 00:27:37,220 Else impliciet, als we zijn nog niet teruggekeerd, 578 00:27:37,220 --> 00:27:38,290 we moeten blijven zoeken. 579 00:27:38,290 --> 00:27:41,485 Dus wijzer gelijk pijltje net betekent bewegen hier deze kerel. 580 00:27:41,485 --> 00:27:42,600 Verplaats hier deze kerel. 581 00:27:42,600 --> 00:27:45,400 Verplaats deze man hier als, in feite, we hebben het nummer niet vinden 582 00:27:45,400 --> 00:27:46,960 we zijn nog op zoek naar. 583 00:27:46,960 --> 00:27:49,630 >> Dus eerlijk gezegd, het ziet er heel overweldigend, denk ik, op het eerste 584 00:27:49,630 --> 00:27:52,180 gezicht, vooral als je moeite met deze tijdens de quiz dan zien 585 00:27:52,180 --> 00:27:52,850 iets als dit. 586 00:27:52,850 --> 00:27:55,050 En je jezelf een schouderklopje. 587 00:27:55,050 --> 00:27:57,080 Nou, er is geen manier waarop ik zou kunnen hebben komen met die op de quiz. 588 00:27:57,080 --> 00:28:00,470 Maar ik zou zeggen, je kunt als je breken het op in deze individuele 589 00:28:00,470 --> 00:28:04,400 gevallen en gewoon doorheen lopen voorzichtig, zij het, toegegeven, onder 590 00:28:04,400 --> 00:28:06,300 stressvolle omstandigheden. 591 00:28:06,300 --> 00:28:09,470 >> Gelukkig, de foto gemaakt alles gelukkiger. 592 00:28:09,470 --> 00:28:11,050 Je zou dit in te trekken een aantal manieren. 593 00:28:11,050 --> 00:28:12,760 Je hoeft niet naar de kriskras doen ding hier. 594 00:28:12,760 --> 00:28:14,520 Je zou het kunnen doen met rechte lijnen zoals deze. 595 00:28:14,520 --> 00:28:18,790 Maar de essentie van dit probleem, in algemeen zou realiseren dat de 596 00:28:18,790 --> 00:28:22,060 foto in het einde moet een beetje kijken zoiets als dit, omdat 597 00:28:22,060 --> 00:28:25,030 constante tijd impliceerde dat je blijft jammen en jammen en jammen de 598 00:28:25,030 --> 00:28:29,900 nieuwe knooppunten in het begin van de lijst. 599 00:28:29,900 --> 00:28:31,960 Heeft u nog vragen? 600 00:28:31,960 --> 00:28:34,565 Waarschijnlijk de meest uitdagende van zeker de codering vragen. 601 00:28:34,565 --> 00:28:37,690 >> PUBLIEK: Dus is de lijst vergelijkbaar met hoofd in de voorgaande voorbeelden. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. MALAN: Precies, precies. 603 00:28:39,640 --> 00:28:43,130 Gewoon een andere naam voor een globale variabele. 604 00:28:43,130 --> 00:28:44,380 Wereldwijd wat? 605 00:28:44,380 --> 00:28:48,880 606 00:28:48,880 --> 00:28:49,730 >> ROB BOWDEN: OK. 607 00:28:49,730 --> 00:28:52,020 Dus dit is het een waar je moest de paragraaf te schrijven. 608 00:28:52,020 --> 00:28:56,060 Sommige mensen schreven essays voor deze vraag. 609 00:28:56,060 --> 00:29:00,230 Maar je hoeft alleen maar om deze zes termen te gebruiken om te beschrijven wat er gebeurt als 610 00:29:00,230 --> 00:29:02,440 je probeert om contact facebook.com. 611 00:29:02,440 --> 00:29:07,930 Dus ik zal gewoon praten door het proces gebruik van al deze termen. 612 00:29:07,930 --> 00:29:11,290 Dus in onze browser, typen we facebook.com en druk op Enter. 613 00:29:11,290 --> 00:29:17,280 Dus onze browser gaat om een ​​te bouwen HTTP-verzoeken dat het gaat om sturen 614 00:29:17,280 --> 00:29:22,220 door een of ander proces bij Facebook voor Facebook om te reageren op ons met de 615 00:29:22,220 --> 00:29:24,450 HTML van de pagina. 616 00:29:24,450 --> 00:29:28,800 >> Dus wat is het proces die de HTTP-verzoek 617 00:29:28,800 --> 00:29:30,730 krijgt eigenlijk naar Facebook? 618 00:29:30,730 --> 00:29:32,790 Dus eerst moeten we vertalen Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Dus gewoon de naam Facebook.com, waar eigenlijk doet het HTTP-verzoek 620 00:29:38,780 --> 00:29:39,940 moeten gaan? 621 00:29:39,940 --> 00:29:44,120 Dus moeten we vertalen Facebook.com een IP-adres, die uniek 622 00:29:44,120 --> 00:29:47,620 geeft aan wat de machine eigenlijk we willen deze aanvraag te sturen naar. 623 00:29:47,620 --> 00:29:49,310 Uw laptop heeft een IP-adres. 624 00:29:49,310 --> 00:29:52,240 Iets aangesloten op het internet heeft een IP-adres. 625 00:29:52,240 --> 00:29:59,030 >> Dus DNS, Domain Name System, dat is wat gaat de vertaling te behandelen 626 00:29:59,030 --> 00:30:03,750 van facebook.com naar een IP-adres dat je eigenlijk wilt opnemen. 627 00:30:03,750 --> 00:30:08,075 Dus nemen we contact op de DNS-servers en zeg, wat is facebook.com? 628 00:30:08,075 --> 00:30:16,560 Het zegt, oh, het is het IP-adres 190,212 iets, iets, iets. 629 00:30:16,560 --> 00:30:16,900 Oke. 630 00:30:16,900 --> 00:30:18,850 Nu, ik weet wat machine Ik wil contact opnemen. 631 00:30:18,850 --> 00:30:22,360 >> Dus dan kun je HTTP request sturen naar die machine. 632 00:30:22,360 --> 00:30:24,140 Dus hoe werkt het naar die machine? 633 00:30:24,140 --> 00:30:27,200 Nou, het verzoek gaat uit router naar router stuiteren. 634 00:30:27,200 --> 00:30:32,630 Vergeet niet het voorbeeld in de klas, waar we eigenlijk zagen de route die de 635 00:30:32,630 --> 00:30:35,340 pakketten nam toen we probeerden communiceren. 636 00:30:35,340 --> 00:30:38,460 We zagen het springen over de Atlantische Oceaan Oceaan op een punt of wat dan ook. 637 00:30:38,460 --> 00:30:42,820 >> Dus de laatste term poort. 638 00:30:42,820 --> 00:30:46,520 Dus dit is nu op uw computer. 639 00:30:46,520 --> 00:30:49,970 Kun je meerdere dingen op dit moment communiceren met internet. 640 00:30:49,970 --> 00:30:53,730 Dus ik kan worden uitgevoerd, bijvoorbeeld Skype. 641 00:30:53,730 --> 00:30:55,670 Ik zou kunnen hebben een webbrowser geopend. 642 00:30:55,670 --> 00:30:59,010 Ik zou iets hebben dat torrenting bestanden. 643 00:30:59,010 --> 00:31:00,880 Dus al deze dingen zijn communicatie met de 644 00:31:00,880 --> 00:31:02,600 internet op een bepaalde manier. 645 00:31:02,600 --> 00:31:08,070 >> Dus wanneer uw computer ontvangt een aantal gegevens van het internet, hoe werkt het 646 00:31:08,070 --> 00:31:10,130 weten welke toepassing eigenlijk wil dat de gegevens? 647 00:31:10,130 --> 00:31:12,610 Hoe weet of deze specifieke gegevens zijn bedoeld voor de 648 00:31:12,610 --> 00:31:16,070 torrenting toepassing in tegenstelling naar de web browser? 649 00:31:16,070 --> 00:31:20,980 Dus dit is het doel van havens die al deze toepassingen 650 00:31:20,980 --> 00:31:22,720 beweerde een poort op uw computer. 651 00:31:22,720 --> 00:31:27,580 Dus uw webbrowser zegt, hey, Ik luister op poort 1000. 652 00:31:27,580 --> 00:31:32,240 En uw torrenting programma zegt, Ik luister op poort 3000. 653 00:31:32,240 --> 00:31:34,770 En Skype zegt: Ik gebruik poort 4000. 654 00:31:34,770 --> 00:31:41,950 >> Dus als je een aantal gegevens op te halen die hoort een van deze toepassingen, de gegevens 655 00:31:41,950 --> 00:31:45,510 wordt aangegeven met welke poort het eigenlijk worden meegestuurd naar. 656 00:31:45,510 --> 00:31:47,950 Dus dit zegt, oh, ik behoor naar poort 1000. 657 00:31:47,950 --> 00:31:50,950 Ik weet dan moet ik dit doorsturen langs op mijn web browser. 658 00:31:50,950 --> 00:31:56,440 Dus de reden dat het relevant hier is dat webservers hebben de neiging om 659 00:31:56,440 --> 00:31:58,240 luisteren op poort 80. 660 00:31:58,240 --> 00:32:02,420 Dus toen ik contact Facebook.com, ik ben gecommuniceerd met bepaalde machine. 661 00:32:02,420 --> 00:32:06,390 Maar ik moet die poort van die zeggen machine Ik wil communiceren. 662 00:32:06,390 --> 00:32:09,160 En webservers neiging om luisteren op poort 80. 663 00:32:09,160 --> 00:32:14,010 >> Als ze wilden, konden ze het stellen dus het geeft als op poort 7000. 664 00:32:14,010 --> 00:32:19,090 En dan in een webbrowser, ik kon handmatig Facebook.com: 7000 tot 665 00:32:19,090 --> 00:32:24,600 stuurt het verzoek naar poort 7000 van Facebook webserver. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: En in dit geval, zelfs hoewel we niet eisen dat mensen 667 00:32:26,820 --> 00:32:30,000 Dit vermeld, in dit geval, wat port zou het verzoek eigenlijk naar? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Probeer opnieuw. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Precies. 672 00:32:44,300 --> 00:32:47,960 Niet op zoek naar dat, maar een subtiliteit dat is er niemand de laatste. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Dus de HTTPS, want het is specifiek te luisteren naar de 674 00:32:51,770 --> 00:32:55,180 gecodeerd, het is op poort 4430. 675 00:32:55,180 --> 00:32:57,680 >> PUBLIEK: En e-mails zijn 25, toch? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Outbound e 25, yep. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Ik weet niet eens de meeste van weten het - alle van de lagere neiging om 678 00:33:03,760 --> 00:33:06,310 gereserveerd voor dingen. 679 00:33:06,310 --> 00:33:09,260 Ik denk dat alles onder 1024 is gereserveerd. 680 00:33:09,260 --> 00:33:13,450 >> PUBLIEK: Waarom zei je dat 3 was het verkeerde nummer? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Omdat in een IP-adres, er vier groepen van cijfers. 682 00:33:18,820 --> 00:33:21,090 En ze zijn van 0 tot 255. 683 00:33:21,090 --> 00:33:28,060 Dus 192.168.2.1 is een veel voorkomende lokale netwerk IP-adres. 684 00:33:28,060 --> 00:33:30,840 Let op al die minder dan 255. 685 00:33:30,840 --> 00:33:33,570 Dus toen ik begon met 300, dat kon onmogelijk hebben 686 00:33:33,570 --> 00:33:35,210 is een van de nummers. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Maar dat domme clip van - was het CSI, waar ze een 688 00:33:38,170 --> 00:33:39,970 getal dat te groot was voor het IP-adres. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Heeft u vragen hierover? 691 00:33:46,110 --> 00:33:51,710 De volgende, dus volledige verandering in onderwerp, maar we hebben dit PHP array voor 692 00:33:51,710 --> 00:33:53,270 de huizen in de quad. 693 00:33:53,270 --> 00:33:56,360 En we hebben een ongeordende lijst. 694 00:33:56,360 --> 00:33:59,550 En we willen uitprinten elke lijst-item gewoon het huis in de naam voorkomt. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Dus we hebben een foreach lus. 697 00:34:11,870 --> 00:34:17,540 Dus denk eraan, de syntax is foreach array item in de array. 698 00:34:17,540 --> 00:34:22,360 Dus door middel van elke iteratie van de lus, huis gaat over een van de te nemen 699 00:34:22,360 --> 00:34:24,060 waarden binnen de matrix. 700 00:34:24,060 --> 00:34:26,530 >> Op de eerste iteratie, huis zal Cabot House. 701 00:34:26,530 --> 00:34:30,370 Op een tweede iteratie, huis zal zijn Courier House en ga zo maar door. 702 00:34:30,370 --> 00:34:34,370 Dus voor elke quad als huis, we zijn gewoon af te drukken - 703 00:34:34,370 --> 00:34:37,250 je kon ook hebben herhaald - 704 00:34:37,250 --> 00:34:42,199 item in de lijst en vervolgens de naam van het huis en sluit vervolgens het item in de lijst. 705 00:34:42,199 --> 00:34:45,210 De accolades zijn hier optioneel. 706 00:34:45,210 --> 00:34:49,480 >> En dan hebben we ook gezegd in de vraag zelf, niet vergeten te sluiten de 707 00:34:49,480 --> 00:34:50,770 ongeordende lijst tag. 708 00:34:50,770 --> 00:34:53,949 Dus moeten we PHP te verlaten om dit te doen. 709 00:34:53,949 --> 00:35:00,280 Of we kunnen hebben herhaalde de sluiten ongeordende lijst tag. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Ook hier prima zou zijn geweest om een ​​oude school te gebruiken voor 711 00:35:02,380 --> 00:35:07,340 lus met een $ i = 0 0 en het gebruik van tellingen achterhalen van de lengte van de straal. 712 00:35:07,340 --> 00:35:09,240 Helemaal prima ook, net een beetje wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> PUBLIEK: Dus als je zou gaan [Onverstaanbaar], zou je doen - 715 00:35:14,742 --> 00:35:16,734 Ik vergeet wat de lus [onverstaanbaar] is. 716 00:35:16,734 --> 00:35:21,380 Zou u $ quad beugel i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Precies. 718 00:35:21,850 --> 00:35:23,100 Ja, precies. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Anders nog iets? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Oke. 723 00:35:32,010 --> 00:35:32,300 Trade-offs. 724 00:35:32,300 --> 00:35:38,290 Zo waren er trossen van antwoorden mogelijk elk van deze. 725 00:35:38,290 --> 00:35:40,510 We waren echt gewoon op zoek naar iets dwingend voor een kop en 726 00:35:40,510 --> 00:35:41,100 een keerzijde. 727 00:35:41,100 --> 00:35:44,830 En nummer 16 gevraagd, het valideren van gebruikers ingang client-side, zoals JavaScript, 728 00:35:44,830 --> 00:35:47,280 in plaats van server-side, als met PHP. 729 00:35:47,280 --> 00:35:49,450 Dus wat is een omgekeerde van doen client-side? 730 00:35:49,450 --> 00:35:53,780 >> Nou, een van de dingen die we voorgesteld is dat je latency te verminderen, omdat u 731 00:35:53,780 --> 00:35:56,750 niet hoeft bezig te houden met de server, die een paar kan duren 732 00:35:56,750 --> 00:36:00,390 milliseconden of zelfs een paar seconden door het vermijden van dat en net 733 00:36:00,390 --> 00:36:04,670 valideren van gebruikers input client-side door triggering een on-submit handler en 734 00:36:04,670 --> 00:36:06,650 just checking, hebben ze typt iets in voor de naam? 735 00:36:06,650 --> 00:36:08,080 Hebben ze iets typt in voor het e-mailadres? 736 00:36:08,080 --> 00:36:10,950 Hebben ze kiezen voor een studentenhuis uit het drop-down menu? 737 00:36:10,950 --> 00:36:14,360 >> U kunt ze geven onmiddellijke feedback met de computer gigahertz 738 00:36:14,360 --> 00:36:16,770 of wat ze hebben dat is eigenlijk op hun bureau. 739 00:36:16,770 --> 00:36:19,310 Dus het is gewoon een betere gebruikerservaring meestal ervaren. 740 00:36:19,310 --> 00:36:24,460 Maar een nadeel van het doen van client-side validatie, als je het doet zonder ook 741 00:36:24,460 --> 00:36:29,860 doen server-side validatie is dat bijna iedereen die uit CS50 weet 742 00:36:29,860 --> 00:36:33,980 dat je gewoon alle gegevens die u wilt kunt verzenden aan een server een aantal manieren. 743 00:36:33,980 --> 00:36:37,030 Eerlijk gezegd, in vrijwel elke browser, kunt u Klik rond in de instellingen en gewoon 744 00:36:37,030 --> 00:36:40,110 uitschakelen JavaScript, die zou, dus, uitschakelen elke vorm van 745 00:36:40,110 --> 00:36:41,080 validatie. 746 00:36:41,080 --> 00:36:44,460 >> Maar je moet ook nog wel herinneren dat zelfs ik deed wat mysterieuze dingen in de klas met behulp van 747 00:36:44,460 --> 00:36:47,790 telnet en eigenlijk doen alsof zijn een browser door het sturen van get 748 00:36:47,790 --> 00:36:49,240 verzoeken aan een server. 749 00:36:49,240 --> 00:36:51,030 En dat is zeker niet met behulp van een webbrowser. 750 00:36:51,030 --> 00:36:53,290 Dat is gewoon me typen van commando's een toetsenbord. 751 00:36:53,290 --> 00:36:57,410 Dus echt, elke programmeur binnen genoeg comfort met het web en HTTP 752 00:36:57,410 --> 00:37:01,690 zou kunnen sturen wat gegevens die hij of zij wil met een server zonder validatie. 753 00:37:01,690 --> 00:37:05,470 En als je server is niet ook het controleren, gaven zij mij een naam, is 754 00:37:05,470 --> 00:37:08,930 dit eigenlijk een geldig e-mailadres, deed ze kiezen voor een slaapzaal, kun je uiteindelijk 755 00:37:08,930 --> 00:37:12,800 Inzetten nep of gewoon lege gegevens in uw database, die waarschijnlijk 756 00:37:12,800 --> 00:37:15,450 is niet van plan om een ​​goede zaak zijn als je was in de veronderstelling dat het er was. 757 00:37:15,450 --> 00:37:16,770 >> Dus dit is een vervelend realiteit. 758 00:37:16,770 --> 00:37:19,890 Maar in het algemeen, client-side validatie is geweldig. 759 00:37:19,890 --> 00:37:21,810 Maar het betekent twee keer zoveel werk. 760 00:37:21,810 --> 00:37:25,970 Hoewel er bestaan ​​wel verschillende bibliotheken, JavaScript-bibliotheken voor 761 00:37:25,970 --> 00:37:28,830 bijvoorbeeld dat dit veel te maken, veel minder van een hoofdpijn. 762 00:37:28,830 --> 00:37:31,940 En je kunt een aantal van de code hergebruiken server-side, client-side. 763 00:37:31,940 --> 00:37:35,980 Maar besef dat het typisch meerwerk. 764 00:37:35,980 --> 00:37:36,415 Yeah. 765 00:37:36,415 --> 00:37:37,792 >> Publiek: Dus als we gewoon zei minder veilig - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [Lacht] 767 00:37:39,205 --> 00:37:39,680 Ugh. 768 00:37:39,680 --> 00:37:43,105 Dat zijn altijd de hardere degenen te worden beslist. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: Dat zou zijn aanvaard. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Wat? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: Ik heb dit probleem. 772 00:37:45,810 --> 00:37:46,735 Dat zou zijn aanvaard. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Yeah. 774 00:37:47,220 --> 00:37:47,830 >> PUBLIEK: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Maar we hebben niet accepteren de eerste - 776 00:37:51,770 --> 00:37:53,630 goed, wat we zochten is iets als je niet hoeft te 777 00:37:53,630 --> 00:37:55,270 communiceren met de server. 778 00:37:55,270 --> 00:37:58,355 We hebben niet gewoon accepteren sneller. 779 00:37:58,355 --> 00:38:00,080 >> Publiek: Hoe zit het met niet herlaad pagina? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Ja. 781 00:38:00,430 --> 00:38:03,000 Dat was een geaccepteerd antwoord. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: iets waar we voelden het was meer dan waarschijnlijk niet waarschijnlijk 783 00:38:06,300 --> 00:38:09,780 dat je wist wat je was zeggen, dat is een moeilijke 784 00:38:09,780 --> 00:38:13,500 lijn te trekken soms. 785 00:38:13,500 --> 00:38:16,000 Met behulp van een gekoppelde lijst in plaats een array handhaven van een 786 00:38:16,000 --> 00:38:17,590 gesorteerde lijst van gehele getallen. 787 00:38:17,590 --> 00:38:21,000 Dus een upside we vaak aanhalen met gekoppelde lijsten die hun hele gemotiveerd 788 00:38:21,000 --> 00:38:22,370 introductie was je dynamiek krijgen. 789 00:38:22,370 --> 00:38:23,030 Ze kunnen groeien. 790 00:38:23,030 --> 00:38:23,950 Ze kunnen krimpen. 791 00:38:23,950 --> 00:38:27,370 U hoeft dus niet te springen door hoepels om daadwerkelijk te creëren meer geheugen 792 00:38:27,370 --> 00:38:28,140 met een array. 793 00:38:28,140 --> 00:38:30,310 Of je hoeft niet alleen zeggen, sorry, gebruiker. 794 00:38:30,310 --> 00:38:31,410 De array wordt gevuld. 795 00:38:31,410 --> 00:38:35,850 Dus dynamische groei van de lijst. 796 00:38:35,850 --> 00:38:37,210 Een nadeel echter van gelinkte lijsten? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> Publiek: Het is lineair. 799 00:38:43,356 --> 00:38:45,800 Zoeken op gelinkte lijst is lineair in plaats van wat je loggen 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Precies. 801 00:38:46,360 --> 00:38:50,160 Het zoeken op een gelinkte lijst is lineair, zelfs als het gesorteerd, want je kunt 802 00:38:50,160 --> 00:38:53,170 alleen volgen deze broodkruimels, deze pointers, vanaf het begin van de lijst 803 00:38:53,170 --> 00:38:53,570 aan het einde. 804 00:38:53,570 --> 00:38:57,970 U kunt random access en niet benutten, dus, binair zoeken, zelfs als het 805 00:38:57,970 --> 00:39:00,740 gesorteerd, die je zou kunnen doen met een array. 806 00:39:00,740 --> 00:39:02,390 En er is ook een andere prijs. 807 00:39:02,390 --> 00:39:02,966 Yeah. 808 00:39:02,966 --> 00:39:03,800 >> PUBLIEK: Geheugen inefficiënt? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Yeah. 810 00:39:04,130 --> 00:39:06,940 Nou, dat zou ik niet per se zeggen inefficiënt. 811 00:39:06,940 --> 00:39:10,110 Maar het kost je meer geheugen, omdat je 32 bits voor elke behoefte 812 00:39:10,110 --> 00:39:13,400 knooppunt voor de extra aanwijzer op althans voor een afzonderlijk gelinkte lijst. 813 00:39:13,400 --> 00:39:16,660 Nu, als je alleen het opslaan van gehele getallen en je bent het toevoegen van de wijzer, dat is 814 00:39:16,660 --> 00:39:17,830 eigenlijk soort van niet-triviaal. 815 00:39:17,830 --> 00:39:19,340 Het verdubbelen van de hoeveelheid geheugen. 816 00:39:19,340 --> 00:39:22,330 Maar in werkelijkheid, als je het opslaan van een gelinkte lijst van structs dat zou kunnen hebben 817 00:39:22,330 --> 00:39:25,540 8 bytes, 16 bytes, nog dan dat, misschien is het minder 818 00:39:25,540 --> 00:39:26,500 van een marginale kostprijs. 819 00:39:26,500 --> 00:39:28,320 Maar het is een kosten toch. 820 00:39:28,320 --> 00:39:31,880 Dus een van deze zou hebben is fijn als nadelen. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 PHP plaats van C schrijven een command-line programma. 823 00:39:36,100 --> 00:39:41,890 Dus hier is het vaak sneller in een taal zoals PHP of Ruby of Python. 824 00:39:41,890 --> 00:39:43,700 Je gewoon snel te openen een teksteditor. 825 00:39:43,700 --> 00:39:45,900 Je hebt veel meer functies voor u beschikbaar. 826 00:39:45,900 --> 00:39:49,325 PHP heeft de gootsteen van de functies, terwijl in C, u 827 00:39:49,325 --> 00:39:50,420 hebben zeer, zeer weinig. 828 00:39:50,420 --> 00:39:53,820 In feite, de jongens kennen de harde manier dat je niet hoeft hash tables. 829 00:39:53,820 --> 00:39:55,000 Je hoeft niet hebt gelinkte lijsten. 830 00:39:55,000 --> 00:39:57,470 Als u wilt dat deze, moet je zelf implementeren. 831 00:39:57,470 --> 00:40:00,950 >> Dus een upside van PHP of echt geen geïnterpreteerde taal is de snelheid 832 00:40:00,950 --> 00:40:02,920 waarmee je kunt code schrijven. 833 00:40:02,920 --> 00:40:06,660 Maar een nadeel, dit zagen we toen ik snel opgezweept een misspeller 834 00:40:06,660 --> 00:40:11,780 implementatie in college met behulp van PHP, is dat middels een geïnterpreteerde taal 835 00:40:11,780 --> 00:40:13,570 is meestal langzamer. 836 00:40:13,570 --> 00:40:18,420 En we zagen dat aantoonbaar met een toename in tijd vanaf 0,3 seconden tot 3 837 00:40:18,420 --> 00:40:24,440 seconden, omdat de interpretatie dat werkelijk gebeurt. 838 00:40:24,440 --> 00:40:27,060 >> Een ander ondersteboven was dat je niet te compileren. 839 00:40:27,060 --> 00:40:30,130 Dus het versnelt ook de ontwikkeling overigens, omdat je niet hoeft 840 00:40:30,130 --> 00:40:31,360 twee stappen uitvoeren van een programma. 841 00:40:31,360 --> 00:40:32,140 Je hoeft alleen een. 842 00:40:32,140 --> 00:40:35,260 En dus dat is vrij meeslepend ook. 843 00:40:35,260 --> 00:40:38,450 Het gebruik van een SQL-database in plaats van een CSV-bestand om gegevens op te slaan. 844 00:40:38,450 --> 00:40:40,230 Dus SQL-database wordt gebruikt voor pset7. 845 00:40:40,230 --> 00:40:42,060 CSV-bestanden die u niet veel gebruikt. 846 00:40:42,060 --> 00:40:45,960 Maar je indirect worden gebruikt in pset7 als goed door te praten met Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Maar CSV is net als een Excel-bestand, maar super eenvoudig, waarbij de kolommen 848 00:40:49,330 --> 00:40:54,010 gewoon demarked door komma's binnen van een anders tekstbestand. 849 00:40:54,010 --> 00:40:56,740 En met behulp van een SQL-database is een beetje meer dwingend. 850 00:40:56,740 --> 00:41:00,060 Het is een omgekeerde, omdat je dingen zoals selecteren en invoegen en verwijderen. 851 00:41:00,060 --> 00:41:03,790 En je krijgt, vermoedelijk, indexen die MySQL en andere databases, zoals 852 00:41:03,790 --> 00:41:07,510 Oracle, bouwen voor u in het geheugen, waarin betekent dat uw select is waarschijnlijk niet 853 00:41:07,510 --> 00:41:09,000 naar lineaire boven naar beneden zijn. 854 00:41:09,000 --> 00:41:11,300 Het eigenlijk gaat om iets te zoals binary search of iets 855 00:41:11,300 --> 00:41:12,520 in dezelfde geest. 856 00:41:12,520 --> 00:41:13,930 Dus ze zijn over het algemeen sneller. 857 00:41:13,930 --> 00:41:16,040 >> Maar een nadeel is dat het is gewoon meer werk. 858 00:41:16,040 --> 00:41:16,730 Het is meer inspanning. 859 00:41:16,730 --> 00:41:18,140 Je moet databases begrijpen. 860 00:41:18,140 --> 00:41:18,940 Je moet het op te zetten. 861 00:41:18,940 --> 00:41:20,840 U hebt een server te draaien die database op. 862 00:41:20,840 --> 00:41:22,750 U moet begrijpen hoe het te configureren. 863 00:41:22,750 --> 00:41:24,930 Dus dit zijn slechts deze soorten van de trade-offs. 864 00:41:24,930 --> 00:41:27,860 Overwegende dat een CSV-bestand, kunt u maak het met gedit. 865 00:41:27,860 --> 00:41:28,770 En je bent good to go. 866 00:41:28,770 --> 00:41:31,550 Er is geen complexiteit verder dan dat. 867 00:41:31,550 --> 00:41:34,870 >> Met behulp van een Trie in plaats van een hash table met aparte chaining te slaan een 868 00:41:34,870 --> 00:41:37,490 woordenboek met woorden die doen denken van pset5. 869 00:41:37,490 --> 00:41:42,480 Dus een probeert op zijn kop, in theorie althans, dat is wat? 870 00:41:42,480 --> 00:41:46,380 Constante tijd, tenminste als je hashen van elk van de afzonderlijke 871 00:41:46,380 --> 00:41:48,990 letters in een woord, zoals jij zou kunnen hebben voor pset5. 872 00:41:48,990 --> 00:41:52,720 Dat zou vijf hashes, zes hashes als er vijf of zes 873 00:41:52,720 --> 00:41:53,900 letters in het woord. 874 00:41:53,900 --> 00:41:54,580 En dat is vrij goed. 875 00:41:54,580 --> 00:41:56,910 En als er een bovengrens van hoe lang uw woorden zou kunnen zijn, dat is 876 00:41:56,910 --> 00:41:59,320 inderdaad asymptotisch constante tijd. 877 00:41:59,320 --> 00:42:05,180 >> Overwegende dat een hash table met aparte chaining, het probleem is er met dat 878 00:42:05,180 --> 00:42:09,070 type gegevensstructuur is dat de prestaties van uw algoritmen meestal 879 00:42:09,070 --> 00:42:12,700 afhankelijk van het aantal zaken reeds in de gegevensstructuur. 880 00:42:12,700 --> 00:42:15,660 En dat is zeker het geval met kettingen, waarbij de meer spullen je 881 00:42:15,660 --> 00:42:18,800 in een hash table, hoe langer die ketens gaan, wat betekent dat in het ergste 882 00:42:18,800 --> 00:42:21,960 geval, het ding dat je misschien op zoek naar is helemaal aan het einde van een 883 00:42:21,960 --> 00:42:26,000 van die ketens, die effectief delegeert in iets lineair. 884 00:42:26,000 --> 00:42:29,450 >> Nu, in de praktijk kan absoluut het geval dat een hash tabel met 885 00:42:29,450 --> 00:42:32,820 ketens sneller dan een vergelijkbare trie implementatie. 886 00:42:32,820 --> 00:42:35,570 Maar dat is om verschillende redenen, onder die probeert zijn gebruik maken van een heleboel 887 00:42:35,570 --> 00:42:39,240 geheugen dat kan, in feite, vertraag naar beneden, omdat je niet leuk 888 00:42:39,240 --> 00:42:42,410 voordelen van een zogenaamde caching, waar de dingen die dicht bij elkaar zijn 889 00:42:42,410 --> 00:42:45,420 geheugen kan worden benaderd vaak sneller. 890 00:42:45,420 --> 00:42:48,180 En soms kun je komen met een echt goede hash-functie. 891 00:42:48,180 --> 00:42:51,060 Zelfs als je een beetje van het afval geheugen, je zou inderdaad kunnen 892 00:42:51,060 --> 00:42:54,430 dingen te vinden snel en niet zo slecht als lineair. 893 00:42:54,430 --> 00:42:58,410 >> Dus in het kort, was er niet per se met een van deze een of zelfs twee 894 00:42:58,410 --> 00:43:00,050 specifieke dingen die we zochten. 895 00:43:00,050 --> 00:43:03,080 Echt iets overtuigend als een positieve en negatieve aspecten 896 00:43:03,080 --> 00:43:04,800 algemeen gevangen ons oog. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Dus voor de kop, we deden niet accepteren op zijn eigen "sneller." U 898 00:43:11,840 --> 00:43:14,540 moest iets over te zeggen. 899 00:43:14,540 --> 00:43:17,910 Zelfs als je in theorie sneller gezegd, we wisten dat je soort van begrepen 900 00:43:17,910 --> 00:43:19,470 dat het een 0 of 1. 901 00:43:19,470 --> 00:43:22,820 En hash table, in theorie, is 0 of 1. 902 00:43:22,820 --> 00:43:26,550 Iets over runtime vermelden over het algemeen heb je de punten. 903 00:43:26,550 --> 00:43:32,640 Maar "sneller," de meeste van de oplossingen op het grote bord die werden pogingen waren 904 00:43:32,640 --> 00:43:34,990 objectief langzamer dan oplossingen dat waren hash tabellen. 905 00:43:34,990 --> 00:43:37,250 Dus sneller op zich is niet echt waar. 906 00:43:37,250 --> 00:43:41,550 907 00:43:41,550 --> 00:43:44,380 >> DAVID J. Malan: Dom de Dom Dom. 908 00:43:44,380 --> 00:43:46,686 Ik ben waarschijnlijk de enige die beseft dat is hoe dat zou moeten 909 00:43:46,686 --> 00:43:47,500 worden uitgesproken, toch? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Ik had eigenlijk geen idee. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Het maakte gevoel in mijn hoofd. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Ik doe deze. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Dus dit is het een waar je moest tekenen het diagram vergelijkbaar met je misschien 916 00:44:04,243 --> 00:44:06,040 hebben gezien op het verleden examens. 917 00:44:06,040 --> 00:44:12,200 Dus laten we gewoon kijken naar dit. 918 00:44:12,200 --> 00:44:18,170 Dus van de HTML-knooppunt, hebben we twee kinderen, het hoofd en het lichaam. 919 00:44:18,170 --> 00:44:20,570 Dus vertakken we - hoofd en lichaam. 920 00:44:20,570 --> 00:44:22,280 Het hoofd heeft een title tag. 921 00:44:22,280 --> 00:44:23,710 Dus we hebben een titel. 922 00:44:23,710 --> 00:44:28,450 >> Nu, het enige wat een heleboel mensen vergeten is dat deze tekst knooppunten zijn 923 00:44:28,450 --> 00:44:30,430 elementen binnen deze boom. 924 00:44:30,430 --> 00:44:36,260 Dus hier gebeuren we ze trekken als ovalen om ze te onderscheiden van deze 925 00:44:36,260 --> 00:44:37,380 typen knopen. 926 00:44:37,380 --> 00:44:41,450 Maar let ook hier hebben we de top, midden-en onderkant zal uiteindelijk op een 927 00:44:41,450 --> 00:44:42,560 tekstnodes. 928 00:44:42,560 --> 00:44:46,250 Dus vergeet die was enigszins van een veel voorkomende fout. 929 00:44:46,250 --> 00:44:48,770 >> Het lichaam heeft drie kinderen - deze drie divs. 930 00:44:48,770 --> 00:44:53,340 Dus div, div, div en vervolgens de tekst knooppunt kinderen van die divs. 931 00:44:53,340 --> 00:44:55,900 Dat is vrij veel het voor die vragen. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: En het is vermeldenswaard, hoewel we niet stilstaan ​​bij deze 933 00:44:57,860 --> 00:45:01,040 details in de tijd die we besteden aan JavaScript, dat de bestelling doet, in 934 00:45:01,040 --> 00:45:02,290 feit, materie technisch. 935 00:45:02,290 --> 00:45:06,330 Dus als hoofd komt voor lichaam in de HTML, dan moet lijken de 936 00:45:06,330 --> 00:45:08,860 links van lichaam in de werkelijke DOM. 937 00:45:08,860 --> 00:45:12,265 Dat zijn, in het algemeen, net FYI, iets geroepen document orde, waar 938 00:45:12,265 --> 00:45:13,260 het ertoe doet. 939 00:45:13,260 --> 00:45:17,470 En als je de uitvoering van een parser, een programma dat HTML leest in de bouw 940 00:45:17,470 --> 00:45:20,960 de boom in het geheugen, om eerlijk te zijn, dat is intuïtief waarschijnlijk wat je 941 00:45:20,960 --> 00:45:24,720 toch doen - van boven naar beneden, van links naar rechts. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Vragen over zeggen? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Doe ik de volgende? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Zeker. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Dus dit is de bufferoverloop aanval vraag. 948 00:45:39,320 --> 00:45:43,740 Het belangrijkste ding om te herkennen is, goed, hoe zou een tegenstander truc 949 00:45:43,740 --> 00:45:46,170 dit programma in het uitvoeren willekeurige code? 950 00:45:46,170 --> 00:45:51,860 Dus argv1, de eerste command line argument programma, dat kan worden 951 00:45:51,860 --> 00:45:53,920 willekeurig lange. 952 00:45:53,920 --> 00:45:59,160 Maar hier gebruiken we memcpy kopiëren argv1, die hier is bar. 953 00:45:59,160 --> 00:46:00,165 We passeren het als het argument. 954 00:46:00,165 --> 00:46:02,050 En dus is het overnemen van de naam bar. 955 00:46:02,050 --> 00:46:08,040 >> Dus we memcpying bar in deze buffer c. 956 00:46:08,040 --> 00:46:09,400 Hoeveel bytes zijn we kopiëren? 957 00:46:09,400 --> 00:46:14,040 Nou hoeveel bytes bar overkomt worden gebruikt, de lengte van dit argument. 958 00:46:14,040 --> 00:46:17,930 Maar c is slechts 12 bytes groot. 959 00:46:17,930 --> 00:46:22,280 Dus als we een command line argumenten in te typen dat is langer dan 12 bytes, we zijn 960 00:46:22,280 --> 00:46:25,470 ga dit overstromen bijzonder buffer. 961 00:46:25,470 --> 00:46:31,000 Nu, hoe kan een tegenstander te misleiden de programmeren in het uitvoeren van willekeurige code? 962 00:46:31,000 --> 00:46:34,910 >> Dus vergeet niet dat hier belangrijkste belt foo. 963 00:46:34,910 --> 00:46:37,340 En zo is dan de belangrijkste oproepen foo. 964 00:46:37,340 --> 00:46:40,408 Laten we trekken dit. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Dus hebben we onze stack. 967 00:46:46,990 --> 00:46:49,090 En belangrijkste heeft een stackframe onderaan. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 Op een gegeven moment, de belangrijkste oproepen foo. 970 00:46:53,250 --> 00:46:55,390 Nou, onmiddellijk, de belangrijkste oproepen foo. 971 00:46:55,390 --> 00:46:57,130 En dus foo krijgt zijn eigen stack frame. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Nu, op een bepaald punt, foo gaat terug. 974 00:47:02,220 --> 00:47:06,810 En ging foo rendement, moeten we weten op welke lijn van code binnen van de belangrijkste we 975 00:47:06,810 --> 00:47:10,610 waren om te weten waar we moeten weer in de belangrijkste. 976 00:47:10,610 --> 00:47:13,100 We kunnen foo bellen vanuit een geheel bos van verschillende plaatsen. 977 00:47:13,100 --> 00:47:14,620 Hoe weten we waar om terug te keren? 978 00:47:14,620 --> 00:47:16,460 Nou, we moeten dat ergens op te slaan. 979 00:47:16,460 --> 00:47:23,010 >> Dus ergens rechts hier in de buurt, we slaan waar we moeten terug naar een keer 980 00:47:23,010 --> 00:47:24,070 foo rendement. 981 00:47:24,070 --> 00:47:26,350 En dit is het retouradres. 982 00:47:26,350 --> 00:47:30,490 Dus hoe een tegenstander zou kunnen profiteren hiervan is dat 983 00:47:30,490 --> 00:47:37,550 deze buffer c wordt opgeslagen, laten we zeggen, hier is c. 984 00:47:37,550 --> 00:47:39,690 We hebben dus 12 bytes voor c. 985 00:47:39,690 --> 00:47:40,540 Dit is c. 986 00:47:40,540 --> 00:47:43,030 En dit is foo's stack ring. 987 00:47:43,030 --> 00:47:49,970 Dus als de kwaadwillende gebruiker meer binnenkomt bytes dan 12 of zij een opdracht in 988 00:47:49,970 --> 00:47:54,570 line argument dat is langer dan 12 personages, dan gaan we naar 989 00:47:54,570 --> 00:47:57,540 overstromen deze buffer. 990 00:47:57,540 --> 00:47:59,910 >> We kunnen blijven gaan. 991 00:47:59,910 --> 00:48:02,220 En op een gegeven moment, gaan we ver genoeg dat we beginnen 992 00:48:02,220 --> 00:48:05,120 overschrijven dit retouradres. 993 00:48:05,120 --> 00:48:08,310 We dus zodra overschrijven het retouradres, Dit betekent dat wanneer foo 994 00:48:08,310 --> 00:48:14,220 rendementen, we terugkeren naar de plaats waar de kwaadwillende gebruiker vertelt dat het door 995 00:48:14,220 --> 00:48:19,490 welke waarde het aangaan, met welke tekens de gebruiker heeft ingevoerd. 996 00:48:19,490 --> 00:48:24,320 En dus als de kwaadwillende gebruiker wordt bijzonder slim, kan hij deze hebben 997 00:48:24,320 --> 00:48:29,255 terug naar ergens in de printDef functie of ergens in de malloc 998 00:48:29,255 --> 00:48:31,830 functie, zomaar ergens willekeurig. 999 00:48:31,830 --> 00:48:38,420 >> Maar nog meer slimme is wat als hij de gebruiker terug naar hier. 1000 00:48:38,420 --> 00:48:41,920 En dan ga je het uitvoeren deze als regels code. 1001 00:48:41,920 --> 00:48:46,610 Dus op dat punt, kan de gebruiker in te voeren wat hij wil in deze regio. 1002 00:48:46,610 --> 00:48:52,210 En hij heeft de volledige controle over uw programma. 1003 00:48:52,210 --> 00:48:53,460 Vragen over zeggen? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Dus de volgende vraag is compleet de herimplementatie van foo een zodanige wijze 1006 00:49:00,970 --> 00:49:02,620 dat het niet meer kwetsbaar is. 1007 00:49:02,620 --> 00:49:03,870 >> Dus er is een paar manieren je kan dit gedaan hebben. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 We hebben nog steeds c alleen welzijn van lengte 12. 1010 00:49:13,330 --> 00:49:16,480 Je zou dit kunnen zijn veranderd als onderdeel van uw oplossing. 1011 00:49:16,480 --> 00:49:18,930 We hebben ook nog een cheque te maken zeker bar was niet null. 1012 00:49:18,930 --> 00:49:24,460 Hoewel je niet nodig hebt dat voor het volledige krediet. 1013 00:49:24,460 --> 00:49:27,690 Dus we eerst controleren van de snaarlengte van bar. 1014 00:49:27,690 --> 00:49:31,650 Als het groter is dan 12, dan eigenlijk niet doen de kopie. 1015 00:49:31,650 --> 00:49:33,010 Dus dat is een manier van vaststelling van het. 1016 00:49:33,010 --> 00:49:36,750 >> Een andere manier van de vaststelling is in plaats van met c slechts een lengte van 12, laat het dan 1017 00:49:36,750 --> 00:49:39,310 zijn lengte strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Een andere manier van de vaststelling is eigenlijk gewoon terug. 1019 00:49:43,370 --> 00:49:46,690 Dus als je had net gekregen ontdoen van al dit, als je gewoon alles had gewist 1020 00:49:46,690 --> 00:49:51,830 regels code, zou u hebben gekregen volledige krediet, omdat deze functie 1021 00:49:51,830 --> 00:49:54,150 eigenlijk niet alles bereiken. 1022 00:49:54,150 --> 00:49:57,650 Het kopiëren van de command line argument in een aantal array in 1023 00:49:57,650 --> 00:49:59,960 haar lokale stack frame. 1024 00:49:59,960 --> 00:50:01,310 En dan is het ding terugkeert. 1025 00:50:01,310 --> 00:50:04,020 En wat het ook volbracht is verdwenen. 1026 00:50:04,020 --> 00:50:09,740 Dus rendement ook een voldoende manier om volledige krediet. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Niet helemaal de geest van de vraag, maar per de aanvaardbare 1028 00:50:13,425 --> 00:50:15,580 spec toch. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Vragen over een van die? 1030 00:50:18,260 --> 00:50:22,270 Het een ding dat je op zijn minst nodig te hebben compileren code. 1031 00:50:22,270 --> 00:50:24,810 Dus hoewel technisch gezien ben je niet kwetsbaar als uw code niet 1032 00:50:24,810 --> 00:50:29,130 compileren, hebben we niet accepteren. 1033 00:50:29,130 --> 00:50:31,350 Geen vragen? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Wilt u om deze titel te zeggen? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Nee. 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Dus in dit ene, dit was ofwel goed nieuws of slecht nieuws. 1038 00:50:40,470 --> 00:50:43,870 Dit is letterlijk hetzelfde probleem als de eerste quiz. 1039 00:50:43,870 --> 00:50:46,140 En het is bijna hetzelfde probleem als pset1. 1040 00:50:46,140 --> 00:50:49,980 Maar het is bewust vereenvoudigd worden een eenvoudiger piramide, die kan worden 1041 00:50:49,980 --> 00:50:52,330 opgelost met een licht eenvoudiger iteratie. 1042 00:50:52,330 --> 00:50:55,680 En echt, wat we kregen bij hier was niet zozeer de logica, 1043 00:50:55,680 --> 00:50:58,100 want waarschijnlijk, door dit punt, je bent comfortabeler dan je was 1044 00:50:58,100 --> 00:51:01,850 week een met lussen of waarom loops, maar echt om elkaar te plagen dat 1045 00:51:01,850 --> 00:51:04,790 je een beetje comfortabel met de notie dat PHP is niet alleen om wat 1046 00:51:04,790 --> 00:51:05,290 programmering. 1047 00:51:05,290 --> 00:51:07,820 Het kan zelfs worden gebruikt als een taal command line programma's te schrijven. 1048 00:51:07,820 --> 00:51:10,060 >> En inderdaad, dat is wat we wilden om uw aandacht te vestigen op. 1049 00:51:10,060 --> 00:51:12,060 Dit is een command line PHP-programma. 1050 00:51:12,060 --> 00:51:16,690 Dus C code hier, terwijl juist in C, niet corrigeren voor PHP. 1051 00:51:16,690 --> 00:51:17,940 Maar de code is echt hetzelfde. 1052 00:51:17,940 --> 00:51:21,720 Als je de oplossingen voor Quiz vergelijken 0 tegen Quiz 1, zul je dat vinden 1053 00:51:21,720 --> 00:51:25,630 het is bijna identiek, behalve sommige dollartekens en voor de 1054 00:51:25,630 --> 00:51:27,250 Aangezien een gegevenstype. 1055 00:51:27,250 --> 00:51:31,720 In het bijzonder, als we een kijkje nemen hier, je zult zien dat we herhalen, in dit 1056 00:51:31,720 --> 00:51:33,730 geval, van 1 tot en met 7. 1057 00:51:33,730 --> 00:51:34,910 >> We zouden het gedaan hebben 0-index. 1058 00:51:34,910 --> 00:51:37,320 Maar soms, ik denk dat het gewoon mentaal makkelijker om na te denken over dingen 1059 00:51:37,320 --> 00:51:38,200 van 1 tot 7. 1060 00:51:38,200 --> 00:51:40,300 Als u wilt een blok, dan twee blokken, dan drie, dan 1061 00:51:40,300 --> 00:51:41,770 dot, dot, dot zeven. 1062 00:51:41,770 --> 00:51:45,960 We hebben j geïnitialiseerd op 1 en dan tellen op tot i. 1063 00:51:45,960 --> 00:51:48,150 En alles is hier verder identiek. 1064 00:51:48,150 --> 00:51:49,790 Maar opmerkelijk zijn een paar dingen. 1065 00:51:49,790 --> 00:51:53,230 Wij geven u deze twee lijnen, deze eerste een, goofily genoemd als een keet 1066 00:51:53,230 --> 00:51:54,560 voor scherpe knal. 1067 00:51:54,560 --> 00:51:58,770 En dat alleen geeft u het pad, de map waarin een programma kan 1068 00:51:58,770 --> 00:52:02,160 gevonden dat u wilt gebruiken om dit bestand te interpreteren. 1069 00:52:02,160 --> 00:52:04,710 >> En dan is de lijn na dat van betekent natuurlijk voer PHP modus. 1070 00:52:04,710 --> 00:52:07,740 En de lijn op de bodem betekent exit PHP modus. 1071 00:52:07,740 --> 00:52:09,740 En deze werkt in het algemeen met geïnterpreteerde talen. 1072 00:52:09,740 --> 00:52:14,370 Het is een beetje vervelend als je schrijven programma in een bestand genaamd foo.php. 1073 00:52:14,370 --> 00:52:17,320 En dan je gebruikers moet gewoon vergeet niet, OK, om dit programma uit te voeren, ik 1074 00:52:17,320 --> 00:52:22,320 maar "php ruimte foo.php." Soort vervelend als er niets anders. 1075 00:52:22,320 --> 00:52:25,270 En het toont ook aan dat je programma wordt geschreven in PHP, die niet allemaal 1076 00:52:25,270 --> 00:52:27,060 die verlichting voor de gebruiker. 1077 00:52:27,060 --> 00:52:30,100 >> Dus je kunt het. Php totaal verwijderen herinnert uit lezing. 1078 00:52:30,100 --> 00:52:35,690 En je kunt eigenlijk doen. / Foo als je hebt het chmodded doordat het 1079 00:52:35,690 --> 00:52:36,500 uitvoerbaar. 1080 00:52:36,500 --> 00:52:39,630 Dus chmod a + x foo zou moeten doen. 1081 00:52:39,630 --> 00:52:41,460 En als je ook toevoegen de keet hier. 1082 00:52:41,460 --> 00:52:45,320 Maar echt, het probleem was om op afdrukken van iets als dit. 1083 00:52:45,320 --> 00:52:51,100 Geen HTML, geen C-code zeker, slechts enkele PHP. 1084 00:52:51,100 --> 00:52:54,100 Dus Milo daarna terug in probleem 25. 1085 00:52:54,100 --> 00:52:58,050 En in 25, kreeg je de volgende skelet code, en dat was een 1086 00:52:58,050 --> 00:52:59,730 vrij eenvoudig webpagina. 1087 00:52:59,730 --> 00:53:04,230 En het sappige gedeelte HTML-wise was beneden hier, waar we in het lichaam 1088 00:53:04,230 --> 00:53:09,160 een vorm die unieke ID van de ingangen heeft binnenkant van die twee ingangen, een 1089 00:53:09,160 --> 00:53:11,950 met een idee van de naam, een een idee van knop. 1090 00:53:11,950 --> 00:53:14,240 >> De eerste was het type tekst, de tweede van het type in te dienen. 1091 00:53:14,240 --> 00:53:16,930 En dus gaven we u, eigenlijk, meer ingrediënten dan je nodig had, net zo 1092 00:53:16,930 --> 00:53:19,230 jullie hadden opties waarmee om dit probleem op te lossen. 1093 00:53:19,230 --> 00:53:21,130 U hoeft niet strikt nodig al deze ID. 1094 00:53:21,130 --> 00:53:23,580 Maar het staat je op te lossen het op verschillende manieren. 1095 00:53:23,580 --> 00:53:27,050 En op de top, merkt dat was het doel leiden 1096 00:53:27,050 --> 00:53:27,960 een venster als dit - 1097 00:53:27,960 --> 00:53:28,780 Hallo, Milo! - 1098 00:53:28,780 --> 00:53:31,270 om pop-up in de browser met behulp van de super simpel, als 1099 00:53:31,270 --> 00:53:33,190 niet lelijk, alert functie. 1100 00:53:33,190 --> 00:53:37,480 En zo, uiteindelijk, komt dit neer conceptueel een of andere manier te luisteren naar 1101 00:53:37,480 --> 00:53:41,290 inzendingen van het formulier client-side , Niet de server-side, een of andere manier 1102 00:53:41,290 --> 00:53:45,640 reageren op dat indiening door grijpen de waarde die de gebruiker heeft ingevoerd 1103 00:53:45,640 --> 00:53:50,120 in het veld naam, en vervolgens weer te geven in het lichaam van een waarschuwing. 1104 00:53:50,120 --> 00:53:53,460 >> Dus een manier waarop je dit kunt doen is met jQuery, die ziet er een beetje 1105 00:53:53,460 --> 00:53:56,880 syntactisch verwarrend op het eerste. 1106 00:53:56,880 --> 00:54:00,760 U kunt dit doen met pure DOM code - document.getelement door ID. 1107 00:54:00,760 --> 00:54:02,530 Maar laten we eens kijken naar deze versie. 1108 00:54:02,530 --> 00:54:05,110 Ik heb een paar belangrijke lijnen eerste. 1109 00:54:05,110 --> 00:54:09,460 Dus een, hebben we deze lijn, dat is identiek aan wat je misschien hebt gezien 1110 00:54:09,460 --> 00:54:13,830 in, geloof ik, form2.html van klasse in week 9. 1111 00:54:13,830 --> 00:54:16,960 En dit is gewoon te zeggen, uit te voeren de volgende code wanneer 1112 00:54:16,960 --> 00:54:18,430 het document klaar. 1113 00:54:18,430 --> 00:54:21,770 Dit is alleen belangrijk omdat HTML-pagina's worden boven lezen 1114 00:54:21,770 --> 00:54:23,280 beneden, van links naar rechts. 1115 00:54:23,280 --> 00:54:27,910 >> En daarom, als je probeert te doen iets in de code hier om wat DOM 1116 00:54:27,910 --> 00:54:31,560 element, sommige HTML-tag, dat is naar beneden hier, je doet het te vroeg, 1117 00:54:31,560 --> 00:54:34,220 omdat dit nog niet ingelezen in het geheugen. 1118 00:54:34,220 --> 00:54:37,740 Dus door dit te zeggen document.ready lijn, we zeggen, 1119 00:54:37,740 --> 00:54:39,040 hier is een code, browser. 1120 00:54:39,040 --> 00:54:42,440 Maar doe dit niet uitvoeren totdat de hele document klaar is, dat de DOM 1121 00:54:42,440 --> 00:54:44,320 boom bestaat in het geheugen. 1122 00:54:44,320 --> 00:54:47,110 Deze is een beetje meer eenvoudig, als syntactisch een 1123 00:54:47,110 --> 00:54:51,890 beetje anders, waar ik zeg, pak het HTML-element wiens unieke 1124 00:54:51,890 --> 00:54:53,560 identifier is ingangen. 1125 00:54:53,560 --> 00:54:56,220 Dat is wat de hash-tag duidt, het unieke ID. 1126 00:54:56,220 --> 00:54:58,070 En dan ik bel. Indienen. 1127 00:54:58,070 --> 00:55:01,660 >> Dus. Hier dient een functie anders bekend als een werkwijze, die 1128 00:55:01,660 --> 00:55:05,850 binnenkant van het object op de linker kant is er dat ik niet te benadrukken. 1129 00:55:05,850 --> 00:55:08,990 Dus als je denkt van inputs als een object in het geheugen - en dat is het ook. 1130 00:55:08,990 --> 00:55:10,440 Het is een knooppunt in een boom - 1131 00:55:10,440 --> 00:55:16,580 . Indienen middel wanneer dit formulier met Deze ID wordt ingediend, voeren 1132 00:55:16,580 --> 00:55:17,700 de volgende code. 1133 00:55:17,700 --> 00:55:20,290 Kan me niet schelen wat de naam van de functie is dat ik het uitvoeren. 1134 00:55:20,290 --> 00:55:23,760 Dus hier ben ik met behulp van, zoals voorheen, wat is zogenaamde lambda-functie of een 1135 00:55:23,760 --> 00:55:24,720 anonieme functie. 1136 00:55:24,720 --> 00:55:27,640 Het is helemaal niet intellectueel interessanter dan dat het geen naam heeft, 1137 00:55:27,640 --> 00:55:30,220 wat fijn is als je alleen bent ooit nog eenmaal aan te roepen. 1138 00:55:30,220 --> 00:55:34,490 En binnen is er ik eigenlijk behandelen de indiening van het formulier. 1139 00:55:34,490 --> 00:55:36,810 Ik voor het eerst een variabele declareert genoemd waarde. 1140 00:55:36,810 --> 00:55:40,610 En wat is dan het effect van deze gemarkeerd gedeelte hier nu? 1141 00:55:40,610 --> 00:55:44,755 Wat doet dat op een hoog niveau voor mij? 1142 00:55:44,755 --> 00:55:48,539 >> Publiek: Het wordt de waarde die de gebruiker niet in de onderstaande HTML. 1143 00:55:48,539 --> 00:55:50,920 Het wordt dat ID en vervolgens vindt de waarde ervan. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Precies. 1145 00:55:51,590 --> 00:55:54,300 Het grijpt het knooppunt, wiens unieke identifier is de naam. 1146 00:55:54,300 --> 00:55:56,900 Het wordt daarin de waarde, die is vermoedelijk wat de gebruiker 1147 00:55:56,900 --> 00:55:58,190 getypt hem-of haarzelf. 1148 00:55:58,190 --> 00:56:01,020 En dan slaat dat in de variabele genaamd waarde. 1149 00:56:01,020 --> 00:56:03,720 Even terzijde, kan je ook gedaan dit een beetje anders. 1150 00:56:03,720 --> 00:56:09,250 Volledig aanvaardbaar door iets te doen leugen var waarde krijgt 1151 00:56:09,250 --> 00:56:10,500 document.getElementById. 1152 00:56:10,500 --> 00:56:12,860 1153 00:56:12,860 --> 00:56:15,460 En dit is waarom het is een beetje vervelend om geen gebruik van jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Naam". Waarde. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Zo volledig aanvaardbaar. 1157 00:56:19,620 --> 00:56:22,770 Verschillende manieren om dit te doen. jQuery gewoon heeft de neiging om een ​​beetje meer beknopte en zijn 1158 00:56:22,770 --> 00:56:25,230 zeker meer populair onder programmeurs. 1159 00:56:25,230 --> 00:56:27,590 >> Nu, ik ben bezig met een beetje een gezond verstand controleren, omdat in het probleem 1160 00:56:27,590 --> 00:56:30,820 verklaring we expliciet gezegd, als de gebruiker heeft nog niet getypt zijn of haar 1161 00:56:30,820 --> 00:56:32,580 noemen, hebben geen waarschuwingen niet tonen. 1162 00:56:32,580 --> 00:56:35,390 Maar je kunt controleren of die, door gewoon controleren op de lege string voor een 1163 00:56:35,390 --> 00:56:37,850 citaat-unquote als er eigenlijk niets daar. 1164 00:56:37,850 --> 00:56:40,880 Maar als het niet gelijk is aan offerte-unquote, Ik wil waarschuwingen bellen. 1165 00:56:40,880 --> 00:56:45,610 En het interessante deel is dat we gebruiken de plus operator, die 1166 00:56:45,610 --> 00:56:48,130 wat doet in JavaScript? 1167 00:56:48,130 --> 00:56:48,740 Aaneenschakelen. 1168 00:56:48,740 --> 00:56:50,690 Dus het is net PHPs dot operator. 1169 00:56:50,690 --> 00:56:52,820 Zelfde idee, iets andere syntax. 1170 00:56:52,820 --> 00:56:55,280 En ik ben gewoon het creëren van de string die zag je op het screenshot - 1171 00:56:55,280 --> 00:56:57,750 Hallo, zo en zo. 1172 00:56:57,750 --> 00:56:59,200 >> En dan de laatste detail is dit. 1173 00:56:59,200 --> 00:57:04,970 Waarom moet ik valse binnenkant terug van deze anonieme functie? 1174 00:57:04,970 --> 00:57:07,420 >> Publiek: Er is geen waarde. 1175 00:57:07,420 --> 00:57:09,380 Je zet het in vorm. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Het zegt alleen maar, als de waarde niet gelijk aan leeg, doe het dan. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Er was een blanco in die onderwerping. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Voorzichtig. 1182 00:57:21,640 --> 00:57:22,830 Er is niemand anders hier. 1183 00:57:22,830 --> 00:57:25,510 En dat rendement valse buiten van de als de omstandigheden. 1184 00:57:25,510 --> 00:57:29,470 Dus benadrukt deze lijn, return false, voert niet uit wat toen 1185 00:57:29,470 --> 00:57:32,310 het formulier wordt ingediend. 1186 00:57:32,310 --> 00:57:36,810 Wat betekent de terugkeer valse binnenkant van deze event handler, zoals dat heet, 1187 00:57:36,810 --> 00:57:38,450 het evenement in kwestie zijnde indienen? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> Publiek: Omdat het slechts een keer gebeurt. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: Alleen gebeurt een keer. 1191 00:57:45,320 --> 00:57:46,821 Niet helemaal. 1192 00:57:46,821 --> 00:57:47,292 Yeah? 1193 00:57:47,292 --> 00:57:50,589 >> Publiek: Het voorkomt dat het formulier indienen om het standaard gedrag, 1194 00:57:50,589 --> 00:57:52,480 die de pagina reload zou maken. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Precies. 1196 00:57:53,110 --> 00:57:56,490 Dus ik ben overbelasting van de termijn in te dienen hier, want ik zeg, de vorm is 1197 00:57:56,490 --> 00:57:57,670 worden voorgelegd. 1198 00:57:57,670 --> 00:58:02,240 Maar zoals u voorstelt, is het eigenlijk niet ingediend in de ware HTTP manier. 1199 00:58:02,240 --> 00:58:06,870 Wanneer u op Verzenden klikt, vanwege onze onSubmit handler, we onderscheppen 1200 00:58:06,870 --> 00:58:09,040 dat formulier indienen bij wijze van spreken. 1201 00:58:09,040 --> 00:58:11,290 We zijn dan doen ons ding met JavaScript-code. 1202 00:58:11,290 --> 00:58:14,070 Maar ik ben met opzet terug vals, want wat ik niet willen dat er gebeurt een 1203 00:58:14,070 --> 00:58:18,430 fractie van een seconde later is voor het hele formulier zich op het web te worden ingediend 1204 00:58:18,430 --> 00:58:22,800 server met belangrijke waarde paren door het veranderen de URL naar iets als 1205 00:58:22,800 --> 00:58:26,180 q = katten of wat we ook deden, bijvoorbeeld in de klas. 1206 00:58:26,180 --> 00:58:29,640 Ik wil niet dat dit gebeurt, omdat er is geen server luisteren voor deze 1207 00:58:29,640 --> 00:58:30,690 formulier indienen. 1208 00:58:30,690 --> 00:58:32,320 Het is puur gedaan in JavaScript-code. 1209 00:58:32,320 --> 00:58:35,760 En dat is waarom ik heb niet eens een actie attribuut op mijn vorm, omdat ik 1210 00:58:35,760 --> 00:58:38,870 niet van plan om dit te laten ooit naar de server. 1211 00:58:38,870 --> 00:58:40,780 >> Dus het wordt voorgelegd. 1212 00:58:40,780 --> 00:58:44,340 Maar we onderscheppen die vorm indiening en het voorkomen van de standaard 1213 00:58:44,340 --> 00:58:47,477 gedrag, die daadwerkelijk ga helemaal naar de server. 1214 00:58:47,477 --> 00:58:48,730 >> Publiek: Dus het houden van het client-side. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Keeping het client-side. 1216 00:58:49,780 --> 00:58:51,030 Precies goed. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Next up was mijn oh MySQL. 1219 00:58:55,757 --> 00:59:00,000 1220 00:59:00,000 --> 00:59:00,430 >> ROB BOWDEN: OK. 1221 00:59:00,430 --> 00:59:04,990 Dus deze eerste vraag was over het algemeen ruw voor mensen. 1222 00:59:04,990 --> 00:59:07,270 Hoewel de latere ging het beter. 1223 00:59:07,270 --> 00:59:12,260 Dus je moest de juiste gegevens kiezen types voor beide kolommen. 1224 00:59:12,260 --> 00:59:17,750 En beide hebben sommige dingen over hen die 1225 00:59:17,750 --> 00:59:20,620 maken de keuze moeilijk. 1226 00:59:20,620 --> 00:59:24,430 Dus int was geen geldige Typ voor nummer. 1227 00:59:24,430 --> 00:59:29,410 De reden hiervoor is een 12-cijferige rekeningnummers nummer, een int is niet groot genoeg om 1228 00:59:29,410 --> 00:59:31,070 slaan totale cijfers. 1229 00:59:31,070 --> 00:59:36,570 Dus zou een geldige keuze een grote zijn geweest int als je toevallig te weten dat. 1230 00:59:36,570 --> 00:59:42,090 Een andere keuze had kunnen zijn een char gebied van lengte 12. 1231 00:59:42,090 --> 00:59:44,560 Dus een van die zou hebben gewerkt. 1232 00:59:44,560 --> 00:59:46,100 Int niet. 1233 00:59:46,100 --> 00:59:50,170 >> Nu, balans, denk terug aan pset7. 1234 00:59:50,170 --> 00:59:59,540 Dus we specifiek gebruikt decimaal naar opslaan van de waarde van aandelen of - 1235 00:59:59,540 --> 01:00:00,550 >> DAVID J. Malan: Cash. 1236 01:00:00,550 --> 01:00:01,060 >> ROB BOWDEN: Cash. 1237 01:00:01,060 --> 01:00:05,710 We gebruikten decimaal om de hoeveelheid op te slaan geld dat de gebruiker heeft op dit moment. 1238 01:00:05,710 --> 01:00:10,950 Dus de reden waarom we dat doen is want vergeet niet, drijvers. 1239 01:00:10,950 --> 01:00:12,480 Er is floating point precisie. 1240 01:00:12,480 --> 01:00:18,200 Het kan niet precies het geld op te slaan waarden als we willen hier. 1241 01:00:18,200 --> 01:00:23,630 Dus decimaal nauwkeurig kunnen slaan iets te zeggen, twee decimalen. 1242 01:00:23,630 --> 01:00:27,630 Daarom balans, we willen het decimale en niet drijven zijn. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: En ook, ook, hoewel het zou slim zijn geweest in andere 1244 01:00:30,230 --> 01:00:32,760 contexten te denken, misschien is dit is een kans voor een int. 1245 01:00:32,760 --> 01:00:34,420 Ik zal gewoon bijhouden dingen in centen. 1246 01:00:34,420 --> 01:00:38,670 Omdat we expliciet toonde de standaard waarde van het 100.00, dat 1247 01:00:38,670 --> 01:00:40,380 betekent dat het kon gewoon een int zijn. 1248 01:00:40,380 --> 01:00:45,310 En nog een subtiliteit ook met nummer was dat het niet bedoeld was 1249 01:00:45,310 --> 01:00:46,180 een strikvraag zijn. 1250 01:00:46,180 --> 01:00:49,860 Maar herinneren dat een int in MySQL, zoals in C, althans in de 1251 01:00:49,860 --> 01:00:51,440 apparaat, is 32-bits. 1252 01:00:51,440 --> 01:00:53,960 En hoewel we je niet verwachten dat precies weten hoeveel cijfers die 1253 01:00:53,960 --> 01:00:56,910 middelen, niet herinneren dat het grootste aantal je kan mogelijk vertegenwoordigen 1254 01:00:56,910 --> 01:01:00,710 met een 32-bits getal is ongeveer wat? 1255 01:01:00,710 --> 01:01:02,760 >> Welk nummer moet we altijd zeggen? 1256 01:01:02,760 --> 01:01:04,530 2 van de 32, wat ruwweg? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Je hoeft niet precies te weten. 1259 01:01:08,780 --> 01:01:10,580 Maar ruwweg is nuttig in het leven. 1260 01:01:10,580 --> 01:01:12,200 Het is ongeveer 4 miljard. 1261 01:01:12,200 --> 01:01:14,430 Dus hebben we gezegd dat een paar keer. 1262 01:01:14,430 --> 01:01:16,360 Ik weet dat ik gezegd heb dat een paar keer. 1263 01:01:16,360 --> 01:01:17,670 En het is ongeveer 4 miljard. 1264 01:01:17,670 --> 01:01:19,710 En dat is een goede regel van de duim te weten. 1265 01:01:19,710 --> 01:01:21,880 Als je 8 bits, 256 is het magische getal. 1266 01:01:21,880 --> 01:01:24,160 Als u 32-bits, 4 miljard geven of te nemen. 1267 01:01:24,160 --> 01:01:27,140 Dus als je gewoon opschrijven 4000000000, je zult zien dat het minder cijfers dan 1268 01:01:27,140 --> 01:01:30,970 12, waardoor het duidelijk niet genoeg zeggingskracht om het veroveren van een 1269 01:01:30,970 --> 01:01:34,220 12-cijferig rekeningnummer. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Dus de anderen ging het beter. 1272 01:01:38,520 --> 01:01:40,900 Dus stel dat de bank legt een $ 20 per maand 1273 01:01:40,900 --> 01:01:42,400 onderhoud vergoeding voor alle accounts. 1274 01:01:42,400 --> 01:01:45,506 Met welke SQL-query kon de bank aftrekken $ 20 van elke rekenen, zelfs als 1275 01:01:45,506 --> 01:01:47,520 het resulteert in een aantal negatieve saldi? 1276 01:01:47,520 --> 01:01:50,380 Dus eigenlijk zijn er vier hoofdtypen van vragen - 1277 01:01:50,380 --> 01:01:52,840 invoegen, selecteert, bijwerken en verwijderen. 1278 01:01:52,840 --> 01:01:56,080 Dus wat doen we denken dat we hier gaan gebruiken? 1279 01:01:56,080 --> 01:01:57,000 Updaten. 1280 01:01:57,000 --> 01:01:58,260 >> Dus laten we eens een kijkje nemen. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Dus hier zijn we updaten. 1283 01:02:05,870 --> 01:02:09,900 Wat tabel worden we updaten accounts? 1284 01:02:09,900 --> 01:02:11,670 Dus updaten accounts. 1285 01:02:11,670 --> 01:02:15,390 En dan de syntax zegt, wat in de rekeningen van zijn werken we? 1286 01:02:15,390 --> 01:02:19,520 Nou, we zetten we balans gelijk aan de huidige waarde van de balans minus 20. 1287 01:02:19,520 --> 01:02:22,860 Dus dit zal alle rijen updaten van de rekeningen, het aftrekken 1288 01:02:22,860 --> 01:02:26,250 $ 20 van de balans. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Een veel voorkomende fout hier, ook al hebben we soms vergaf het, 1290 01:02:29,260 --> 01:02:32,990 was om daadwerkelijk PHP code hier roepen de query functie of zetten 1291 01:02:32,990 --> 01:02:35,460 aanhalingstekens rond alles wat niet nodig om daar te zijn. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Vergeet niet dat MySQL een aparte taal van PHP. 1293 01:02:39,780 --> 01:02:42,410 We toevallig te schrijven MySQL in PHP. 1294 01:02:42,410 --> 01:02:46,180 En PHP is waarna het wordt naar de MySQL server. 1295 01:02:46,180 --> 01:02:51,120 Maar je hoeft geen PHP nodig om communiceren met een MySQL server. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Precies. 1297 01:02:51,730 --> 01:02:54,240 Dus geen variabelen met dollartekens moet in deze context. 1298 01:02:54,240 --> 01:02:59,550 Het kan gewoon allemaal van de wiskunde te doen binnen de database zelf. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Dus de volgende. 1301 01:03:01,300 --> 01:03:02,731 Is dit de volgende? 1302 01:03:02,731 --> 01:03:03,210 Yeah. 1303 01:03:03,210 --> 01:03:06,570 Dus met wat SQL-query kon de bank de rekeningnummers van haar op te halen 1304 01:03:06,570 --> 01:03:09,300 rijkste klanten die met saldi groter dan 1000? 1305 01:03:09,300 --> 01:03:13,280 Dus welke van de vier belangrijkste soorten gaan we hier? 1306 01:03:13,280 --> 01:03:14,430 Selecteren. 1307 01:03:14,430 --> 01:03:16,650 Dus we willen selecteren. 1308 01:03:16,650 --> 01:03:17,610 Wat willen we om te kiezen? 1309 01:03:17,610 --> 01:03:19,380 Wat kolom willen we selecteren? 1310 01:03:19,380 --> 01:03:20,970 We zullen specifiek willen te selecteren. 1311 01:03:20,970 --> 01:03:23,910 Maar als je zei ster, we ook aanvaard dat. 1312 01:03:23,910 --> 01:03:25,820 >> Dus kiezen nummer uit welke tafel? 1313 01:03:25,820 --> 01:03:26,640 Accounts. 1314 01:03:26,640 --> 01:03:28,370 En dan is de voorwaarde die we willen? 1315 01:03:28,370 --> 01:03:30,140 Wanneer saldo groter dan 1000. 1316 01:03:30,140 --> 01:03:31,720 We hebben aanvaard ook een grotere hoogste. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Laatste. 1319 01:03:36,190 --> 01:03:42,940 Met welke SQL-query kon de bank dicht, dat wil zeggen, verwijderen elke rekening die 1320 01:03:42,940 --> 01:03:44,480 heeft een saldo van $ 0? 1321 01:03:44,480 --> 01:03:47,620 Dus welke van de vier zijn wij gaat te willen gebruiken? 1322 01:03:47,620 --> 01:03:48,320 Verwijderen. 1323 01:03:48,320 --> 01:03:50,180 Dus de syntaxis voor dat? 1324 01:03:50,180 --> 01:03:51,890 Verwijderen uit welke tafel? 1325 01:03:51,890 --> 01:03:53,550 Accounts. 1326 01:03:53,550 --> 01:03:55,790 En vervolgens aan de voorwaarde we willen verwijderen - 1327 01:03:55,790 --> 01:03:57,280 waar saldo gelijk is aan nul. 1328 01:03:57,280 --> 01:04:03,050 Dus verwijder alle rijen van accounts waarbij het saldo nul. 1329 01:04:03,050 --> 01:04:04,300 Vragen over een van deze? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Willen in de rij? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: Queue gids. 1333 01:04:11,200 --> 01:04:17,110 Dus in dit ene, gaven we u een wat vertrouwde structuur die we onderzocht een 1334 01:04:17,110 --> 01:04:20,450 beetje in de klas naast structs, die een data was 1335 01:04:20,450 --> 01:04:21,910 structuur verwante geest. 1336 01:04:21,910 --> 01:04:24,670 Het verschil echter met een wachtrij is dat we een of andere manier herinneren wie 1337 01:04:24,670 --> 01:04:27,900 aan de voorzijde van de wachtrij in grote deel zodat we konden meer maken 1338 01:04:27,900 --> 01:04:30,530 efficiënt gebruik van het geheugen, althans als we met behulp van een array. 1339 01:04:30,530 --> 01:04:35,460 >> Omdat terugroepen, als we een array, als, Zo is de voorzijde van 1340 01:04:35,460 --> 01:04:38,470 de rij, als ik in de rij hier, en dan iemand in de lijn krijgt 1341 01:04:38,470 --> 01:04:42,710 achter mij, achter mij, achter mij, en een persoon stapt uit lijn, u 1342 01:04:42,710 --> 01:04:45,930 kon, zoals we zagen een aantal van onze menselijke vrijwilligers in de klas, hebben iedereen 1343 01:04:45,930 --> 01:04:47,100 verschuiven deze manier. 1344 01:04:47,100 --> 01:04:50,880 Maar in het algemeen, heeft iedereen doen iets wat niet het beste gebruik van de tijd 1345 01:04:50,880 --> 01:04:54,600 in een programma, want het betekent dat uw algoritme loopt in welke 1346 01:04:54,600 --> 01:04:56,520 asymptotische looptijd? 1347 01:04:56,520 --> 01:04:57,420 Het is lineair. 1348 01:04:57,420 --> 01:04:59,600 >> En ik voel me als dat is nogal dom. 1349 01:04:59,600 --> 01:05:02,890 Als de volgende persoon in de rij is de volgende persoon die wordt verondersteld in de te gaan 1350 01:05:02,890 --> 01:05:04,660 opslag, ze niet allemaal samen bewegen. 1351 01:05:04,660 --> 01:05:08,200 Laat die persoon worden geplukt wanneer de tijd komt, bijvoorbeeld. 1352 01:05:08,200 --> 01:05:09,870 Dus we kunnen een beetje tijd daar besparen. 1353 01:05:09,870 --> 01:05:14,840 En zo te doen dat, hoewel, dat betekent dat het hoofd van de wachtrij of de 1354 01:05:14,840 --> 01:05:18,060 vooraan in de wachtrij gaat geleidelijk verplaatsen dieper en dieper 1355 01:05:18,060 --> 01:05:23,340 in de array en uiteindelijk misschien eigenlijk wikkel rond als we met behulp van een 1356 01:05:23,340 --> 01:05:25,790 array om de mensen op te slaan in deze wachtrij. 1357 01:05:25,790 --> 01:05:28,390 Dus je kunt bijna denken aan de array als een cirkelvormige data 1358 01:05:28,390 --> 01:05:29,880 structuur in die zin. 1359 01:05:29,880 --> 01:05:33,970 >> Zodat je een of andere manier moeten bijhouden van de te houden grootte van het of echt het einde van het 1360 01:05:33,970 --> 01:05:36,250 en wanneer het begin is. 1361 01:05:36,250 --> 01:05:39,490 Dus stellen wij voor dat u verklaren een dergelijke wachtrij, roeping 1362 01:05:39,490 --> 01:05:41,330 het q, slechts een letter. 1363 01:05:41,330 --> 01:05:44,570 Dan stellen we dat het front geïnitialiseerd op nul en dat de grootte 1364 01:05:44,570 --> 01:05:45,470 geïnitialiseerd op nul. 1365 01:05:45,470 --> 01:05:47,770 >> Dus nu is er niets binnenkant van deze rij. 1366 01:05:47,770 --> 01:05:50,910 En wij vragen u in te vullen de uitvoering van enqueue hieronder in 1367 01:05:50,910 --> 01:05:55,250 zodanig dat de functie voegt n om het einde van q en dan geeft true. 1368 01:05:55,250 --> 01:05:58,690 Maar als q vol is of negatief, de functie moet in plaats daarvan return false. 1369 01:05:58,690 --> 01:06:01,060 En we gaven je een paar aannames. 1370 01:06:01,060 --> 01:06:04,320 Maar ze zijn niet echt functioneel relevant, alleen dat bool bestaat, 1371 01:06:04,320 --> 01:06:06,690 omdat, technisch, bool niet bestaan ​​in C, tenzij je onder andere een 1372 01:06:06,690 --> 01:06:07,310 bepaalde header file. 1373 01:06:07,310 --> 01:06:09,350 Dus dat was gewoon zorgen dat er werden er geen is dit een truc 1374 01:06:09,350 --> 01:06:10,940 vraag soort dingen. 1375 01:06:10,940 --> 01:06:16,280 >> Dus enqueue, we in de steekproef voorgesteld oplossingen te implementeren als volgt. 1376 01:06:16,280 --> 01:06:20,420 Een, controleren we eerst het gemak, het laaghangende fruit. 1377 01:06:20,420 --> 01:06:23,820 Als de wachtrij vol is of het nummer dat je probeert in te voegen is minder 1378 01:06:23,820 --> 01:06:26,380 dan nul, wat we zeiden in de specificatie van het probleem moet 1379 01:06:26,380 --> 01:06:30,320 niet worden toegestaan, omdat we alleen willen niet-negatieve waarden, dan moet je 1380 01:06:30,320 --> 01:06:31,640 gewoon direct return false. 1381 01:06:31,640 --> 01:06:33,820 Dus sommige relatief eenvoudig foutcontrole. 1382 01:06:33,820 --> 01:06:38,720 Als al je wilt dat de werkelijke voegen nummer, je moest een beetje doen 1383 01:06:38,720 --> 01:06:39,440 denken hier. 1384 01:06:39,440 --> 01:06:41,330 En dit is waar het is een beetje vervelend mentaal, want je moet 1385 01:06:41,330 --> 01:06:43,000 uitzoeken hoe wraparound behandelen. 1386 01:06:43,000 --> 01:06:46,870 >> Maar de kiem van het idee hier is dat van belang voor ons is dat wraparound 1387 01:06:46,870 --> 01:06:51,480 Vaak impliceert modulaire rekenkunde en de mod operator, het percentage kant, 1388 01:06:51,480 --> 01:06:55,140 waar je kan gaan van een grotere waarde terug naar nul en dan een en twee en 1389 01:06:55,140 --> 01:06:58,650 drie en dan terug rond nul, een en twee en drie enzovoort 1390 01:06:58,650 --> 01:06:59,380 opnieuw en opnieuw. 1391 01:06:59,380 --> 01:07:02,880 Dus de manier waarop we stellen voor om dit te doen is dat we willen index in de 1392 01:07:02,880 --> 01:07:05,850 array met de naam nummers waar onze gehele getallen liggen. 1393 01:07:05,850 --> 01:07:10,740 Maar om daar te komen, we willen eerst doen ongeacht de grootte van de wachtrij, maar 1394 01:07:10,740 --> 01:07:14,080 vervolgens aan dat wat de Voor de lijst. 1395 01:07:14,080 --> 01:07:17,880 En het effect van die zetten ons op de juiste positie in de wachtrij en 1396 01:07:17,880 --> 01:07:20,970 niet van uitgaan dat de eerste persoon in de rij aan het begin, waarvoor hij 1397 01:07:20,970 --> 01:07:24,130 ze absoluut kunnen zijn als we werden ook verschuiven iedereen. 1398 01:07:24,130 --> 01:07:26,710 Maar we zijn gewoon het creëren van werk voor onszelf als we namen 1399 01:07:26,710 --> 01:07:27,800 dat bepaald pad. 1400 01:07:27,800 --> 01:07:29,330 >> Dus we houden relatief eenvoudig. 1401 01:07:29,330 --> 01:07:32,180 We moeten niet vergeten dat we net een int toegevoegd aan de wachtrij. 1402 01:07:32,180 --> 01:07:35,850 En dan gaan we gewoon terug waar. 1403 01:07:35,850 --> 01:07:38,560 Ondertussen, in dequeue, vroegen we u het volgende doen. 1404 01:07:38,560 --> 01:07:42,260 Implementeren zodanig dat dequeues, dat is verwijdert en keert terug, 1405 01:07:42,260 --> 01:07:44,190 de int vooraan wachtrij. 1406 01:07:44,190 --> 01:07:46,410 Om de int verwijderen, volstaat om het te vergeten. 1407 01:07:46,410 --> 01:07:47,650 Je hoeft niet te zijn wat overschrijven. 1408 01:07:47,650 --> 01:07:48,820 Dus het is eigenlijk nog steeds. 1409 01:07:48,820 --> 01:07:51,930 Net als data op een harde schijf, we zijn gewoon het negeren van het feit 1410 01:07:51,930 --> 01:07:52,970 dat het er nu. 1411 01:07:52,970 --> 01:07:55,520 En als q leeg is, moeten we plaats terug negatief 1. 1412 01:07:55,520 --> 01:07:56,750 Dus dit voelt arbitrair. 1413 01:07:56,750 --> 01:08:01,640 Waarom keren negatief 1 in plaats van valse? 1414 01:08:01,640 --> 01:08:02,620 Yeah. 1415 01:08:02,620 --> 01:08:05,070 >> PUBLIEK: Q opslaat positieve waarden. 1416 01:08:05,070 --> 01:08:10,950 Omdat je alleen positieve waarden opslaan in de q, negatieve is een fout. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. MALAN: OK, waar. 1418 01:08:11,510 --> 01:08:14,850 Dus omdat we alleen het opslaan van positieve waarden of nul, dan is het prima om 1419 01:08:14,850 --> 01:08:18,050 terug een negatieve waarde als een schildwacht waarde, een speciaal symbool. 1420 01:08:18,050 --> 01:08:21,630 Maar je herschrijven geschiedenis daar, want de reden dat we alleen 1421 01:08:21,630 --> 01:08:25,890 retoursysteem voor niet-negatieve waarden is omdat we willen 1422 01:08:25,890 --> 01:08:27,670 hebben een sentinel waarde. 1423 01:08:27,670 --> 01:08:32,617 Dus meer in het bijzonder, waarom niet gewoon return false in geval van fouten? 1424 01:08:32,617 --> 01:08:33,099 Yeah. 1425 01:08:33,099 --> 01:08:35,510 >> PUBLIEK: Je hebt gefaald een integer terug. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Precies. 1427 01:08:36,630 --> 01:08:38,569 En dit is waar C krijgt vrij beperkend. 1428 01:08:38,569 --> 01:08:40,590 Als je zegt dat je gaat naar een int terug, heb je 1429 01:08:40,590 --> 01:08:41,279 naar een int terug. 1430 01:08:41,279 --> 01:08:43,689 Je kunt niet chique en beginnen terug te keren een bool of een float of een 1431 01:08:43,689 --> 01:08:45,040 touw of iets dergelijks. 1432 01:08:45,040 --> 01:08:49,370 Nu, ondertussen, JavaScript en PHP en andere talen kunnen, in feite, 1433 01:08:49,370 --> 01:08:51,310 heb je verschillende terugkeren soorten waarden. 1434 01:08:51,310 --> 01:08:54,819 En dat kan eigenlijk nuttig zijn, waar u zou kunnen positieve gehele getallen, nullen terug, 1435 01:08:54,819 --> 01:08:59,439 negatieve gehele getallen, of valse of null zelfs fout betekenen. 1436 01:08:59,439 --> 01:09:01,890 Maar we hebben niet dat veelzijdigheid in C. 1437 01:09:01,890 --> 01:09:04,569 >> Dus met dequeue, wat we voorstellen te doen is - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: U kunt valse terugkeren. 1440 01:09:09,830 --> 01:09:13,189 Het is gewoon dat vals is hash definiëren valse nul. 1441 01:09:13,189 --> 01:09:16,000 Dus als je vals terugkeren, je bent terug op nul. 1442 01:09:16,000 --> 01:09:25,470 En nul is een geldig ding in onze wachtrij, terwijl negatieve 1 is niet of 1443 01:09:25,470 --> 01:09:27,000 valse toevallig negatief 1. 1444 01:09:27,000 --> 01:09:29,972 Maar je moet niet eens moeten weten dat. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: Dat is waarom ik niet zeggen. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Maar het was niet waar dat je niet vals kunt terugkeren. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Zeker. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Dus dequeue, merken we accepteren vervallen als argument. 1450 01:09:44,240 --> 01:09:45,479 En dat is omdat we niet iets voorbij inch 1451 01:09:45,479 --> 01:09:48,359 We willen alleen het element te verwijderen aan de voorkant van de wachtrij. 1452 01:09:48,359 --> 01:09:49,819 Dus hoe kunnen we dat doen? 1453 01:09:49,819 --> 01:09:51,290 Nou, ten eerste, laten we dit doen snel sanity check. 1454 01:09:51,290 --> 01:09:53,350 Als de wachtrij grootte is 0, er is geen werk te doen. 1455 01:09:53,350 --> 01:09:54,210 Terug negatief 1. 1456 01:09:54,210 --> 01:09:54,800 Gedaan. 1457 01:09:54,800 --> 01:09:56,340 Dus dat is een paar lijnen van mijn programma. 1458 01:09:56,340 --> 01:09:58,180 Dus alleen vier lijnen blijven. 1459 01:09:58,180 --> 01:10:01,310 >> Dus hier Ik besluit om te verlagen de grootte. 1460 01:10:01,310 --> 01:10:04,620 En effectief decrementing de grootte betekent dat ik vergeten 1461 01:10:04,620 --> 01:10:06,010 iets wat er in zit. 1462 01:10:06,010 --> 01:10:09,910 Maar ik heb ook te werken waar de voorzijde van de nummers. 1463 01:10:09,910 --> 01:10:11,620 Dus om dat te doen, moet ik twee dingen doen. 1464 01:10:11,620 --> 01:10:16,390 Ik moet eerst herinneren wat het aantal is aan de voorkant van de wachtrij 1465 01:10:16,390 --> 01:10:17,860 want ik moet dat ding terug. 1466 01:10:17,860 --> 01:10:20,910 Dus ik wil niet per ongeluk vergeten over en overschrijven vervolgens. 1467 01:10:20,910 --> 01:10:22,840 Ik ga gewoon om te onthouden in een int. 1468 01:10:22,840 --> 01:10:27,310 >> En nu, ik wil updaten q.front te q.front 1. 1469 01:10:27,310 --> 01:10:30,070 Dus als dit was de eerste persoon in lijn, nu, ik wil plus 1 doen om 1470 01:10:30,070 --> 01:10:31,930 wijzen op de volgende persoon in de rij. 1471 01:10:31,930 --> 01:10:33,420 Maar ik moet dat wraparound verwerken. 1472 01:10:33,420 --> 01:10:37,270 En als de capaciteit is een wereldwijde constante, dat gaat mij toe om ervoor te zorgen 1473 01:10:37,270 --> 01:10:41,140 als ik wijzen op de allerlaatste persoon in lijn, zal de modulo operatie brengen 1474 01:10:41,140 --> 01:10:43,840 me terug naar nul bij de vooraan in de wachtrij. 1475 01:10:43,840 --> 01:10:46,050 En dat zorgt voor de wraparound hier. 1476 01:10:46,050 --> 01:10:48,950 En ga dan ik om terug te keren n. 1477 01:10:48,950 --> 01:10:51,530 >> Nu, strikt genomen, niet ik moeten verklaren n. 1478 01:10:51,530 --> 01:10:53,880 Ik hoefde niet om het te grijpen en op te slaan tijdelijk, omdat de waarde 1479 01:10:53,880 --> 01:10:54,740 er nog steeds. 1480 01:10:54,740 --> 01:10:57,490 Dus ik kon gewoon de juiste rekenkundige om het voormalige hoofd terug 1481 01:10:57,490 --> 01:10:58,450 van de wachtrij. 1482 01:10:58,450 --> 01:11:01,850 Maar ik voelde dat dit was meer duidelijk om daadwerkelijk pak de int, zet het 1483 01:11:01,850 --> 01:11:04,320 in n, en dan terug dat voor de duidelijkheid maar 1484 01:11:04,320 --> 01:11:05,735 niet strikt noodzakelijk. 1485 01:11:05,735 --> 01:11:09,313 1486 01:11:09,313 --> 01:11:12,130 Psst. 1487 01:11:12,130 --> 01:11:13,410 Ze zijn allemaal uitspreekbaar in mijn hoofd. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Dus eerste vraag is de binaire boom probleem. 1490 01:11:19,110 --> 01:11:22,140 Dus eerste vraag is, we zijn aangezien deze nummers. 1491 01:11:22,140 --> 01:11:27,160 En we willen een of andere manier invoegen in deze knooppunten zodanig dat het een 1492 01:11:27,160 --> 01:11:30,110 geldige binaire zoekboom. 1493 01:11:30,110 --> 01:11:36,260 Zodat het een ding om te onthouden over binary search bomen is dat het niet 1494 01:11:36,260 --> 01:11:39,800 alleen dat het ding naar links is minder en het ding om 1495 01:11:39,800 --> 01:11:41,120 Rechts is groter. 1496 01:11:41,120 --> 01:11:44,580 Het moet de gehele boom Links is minder, en de hele boom 1497 01:11:44,580 --> 01:11:45,740 rechts is groter. 1498 01:11:45,740 --> 01:11:55,260 >> Dus als ik 34 hier aan de top, en dan Ik zet 20 hier, dus dat is geldig zo 1499 01:11:55,260 --> 01:11:56,970 ver, want 34 hier. 1500 01:11:56,970 --> 01:11:57,920 20 gaat naar links. 1501 01:11:57,920 --> 01:11:58,950 Dus dat is minder. 1502 01:11:58,950 --> 01:12:03,640 Maar ik kan niet zet dan 59 hier, omdat ook al 59 is aan de rechterkant van de 20, 1503 01:12:03,640 --> 01:12:06,140 het is nog steeds links 34. 1504 01:12:06,140 --> 01:12:10,760 Dus met die beperking in het achterhoofd, de gemakkelijkste manier om dit waarschijnlijk oplossen 1505 01:12:10,760 --> 01:12:14,330 probleem is om gewoon soort van deze nummers - 1506 01:12:14,330 --> 01:12:18,720 zo 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 En voer dan deze van links naar rechts. 1508 01:12:21,640 --> 01:12:23,390 >> Dus 20 gaat hier. 1509 01:12:23,390 --> 01:12:24,630 34 gaat hier. 1510 01:12:24,630 --> 01:12:25,830 36 gaat hier. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 En je kon ook hebben bedacht met sommige inpluggen en realiseren, 1513 01:12:34,730 --> 01:12:38,830 oh, wacht, ik heb niet genoeg nummers hebben om dit in te vullen hier. 1514 01:12:38,830 --> 01:12:42,170 Dus ik moet reshift wat mijn route notitie gaat worden. 1515 01:12:42,170 --> 01:12:47,490 Maar merk op dat in de laatste drie, indien je leest van links naar rechts, het is in 1516 01:12:47,490 --> 01:12:48,740 oplopende volgorde. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Dus nu willen we verklaren wat de struct gaat worden voor de 1519 01:12:56,540 --> 01:12:58,300 knooppunten in deze boom. 1520 01:12:58,300 --> 01:13:02,720 Dus wat hebben we nodig in een binaire boom? 1521 01:13:02,720 --> 01:13:05,830 Dus we hebben een waarde van het type int, dus sommige int waarde. 1522 01:13:05,830 --> 01:13:07,220 Ik weet niet wat wij noemen in de oplossing - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 We moeten een aanwijzer naar de linkerkant kind en een pointer naar rechts kind. 1525 01:13:13,570 --> 01:13:17,540 Dus het gaat er zo uitzien. 1526 01:13:17,540 --> 01:13:20,510 En het zal echt kijken voordat wanneer heeft de dubbel-linked 1527 01:13:20,510 --> 01:13:25,090 lijst spul, zo bericht - 1528 01:13:25,090 --> 01:13:27,860 Ik ga moet scrollen alle weg terug naar probleem 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Zo merkt het ziet er identiek aan deze, behalve wij toevallig deze bellen 1531 01:13:36,390 --> 01:13:38,590 verschillende namen. 1532 01:13:38,590 --> 01:13:41,440 We hebben nog steeds een geheel getal waarde en twee pointers. 1533 01:13:41,440 --> 01:13:44,850 Het is gewoon dat in plaats van het behandelen van de pointers als wijzend naar het volgende ding 1534 01:13:44,850 --> 01:13:47,955 en de vorige ding, we behandelen de pointers om te wijzen op een linker kind 1535 01:13:47,955 --> 01:13:49,205 en rechts kind. 1536 01:13:49,205 --> 01:13:57,372 1537 01:13:57,372 --> 01:13:57,860 OK. 1538 01:13:57,860 --> 01:13:59,650 Dus dat is onze struct node. 1539 01:13:59,650 --> 01:14:03,920 En nu, de enige functie moeten we implementeren hiervoor is traverse, die 1540 01:14:03,920 --> 01:14:08,320 we willen gaan over de boom, drukkerij de waarden van de boom in orde. 1541 01:14:08,320 --> 01:14:15,241 >> Dus hier kijken, zouden we willen afdrukken uit 20, 34, 36, 52, 59 en 106. 1542 01:14:15,241 --> 01:14:17,970 Hoe gaan we dat bereiken? 1543 01:14:17,970 --> 01:14:18,890 Dus het is redelijk vergelijkbaar. 1544 01:14:18,890 --> 01:14:22,910 Als je zag in het verleden examen het probleem die je wilde om uit te printen 1545 01:14:22,910 --> 01:14:25,940 de hele boom met komma's ertussen alles, het was eigenlijk zelfs 1546 01:14:25,940 --> 01:14:27,320 eenvoudiger dan dat. 1547 01:14:27,320 --> 01:14:30,950 Dus hier is de oplossing. 1548 01:14:30,950 --> 01:14:33,110 Dit was aanzienlijk eenvoudiger als je het deed recursief. 1549 01:14:33,110 --> 01:14:36,650 Ik weet niet of iemand geprobeerd het iteratief doen. 1550 01:14:36,650 --> 01:14:38,340 >> Maar eerst moeten we ons basisscenario. 1551 01:14:38,340 --> 01:14:39,660 Wat indien de wortel nul? 1552 01:14:39,660 --> 01:14:40,610 Dan zijn we gewoon gaan om terug te keren. 1553 01:14:40,610 --> 01:14:42,300 We willen niet om iets af te drukken. 1554 01:14:42,300 --> 01:14:45,940 Anders gaan we te doorkruisen recursief naar beneden. 1555 01:14:45,940 --> 01:14:48,140 Print de hele linkerkant deelboom. 1556 01:14:48,140 --> 01:14:51,440 Dus drukken alles minder dan mijn huidige waarde. 1557 01:14:51,440 --> 01:14:53,930 En dan ga ik mezelf af te drukken. 1558 01:14:53,930 --> 01:14:57,310 En dan ga ik recurse langs mijn gehele rechter deelboom, dus alles 1559 01:14:57,310 --> 01:14:58,810 groter dan mijn waarde. 1560 01:14:58,810 --> 01:15:03,870 En dit gaat om af te drukken alles in orde is. 1561 01:15:03,870 --> 01:15:05,860 Vragen over hoe dit eigenlijk volbrengt dat? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> Publiek: Ik heb een vraag op de [onverstaanbaar]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Dus een manier van benaderen elke recursieve probleem is om gewoon te denken 1566 01:15:23,550 --> 01:15:26,275 over het leuk je moet denken over al de hoek gevallen. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Dus bedenkt dat we willen print deze hele boom. 1569 01:15:38,110 --> 01:15:42,030 Dus alles wat we zijn gaan richten op is dit bepaald knooppunt - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 De recursieve aanroepen, we doen alsof die gewoon werken. 1572 01:15:47,420 --> 01:15:54,000 Dus hier, deze recursieve oproep om traverse, we zonder erbij na te denken 1573 01:15:54,000 --> 01:15:58,640 over, maar het doorkruisen van de linker drie, stel dat al afgedrukt 20 1574 01:15:58,640 --> 01:16:00,730 en 34 voor ons. 1575 01:16:00,730 --> 01:16:03,350 En toen we uiteindelijk recursief roepen traverse op de 1576 01:16:03,350 --> 01:16:07,890 Oke, dat zal correct worden afgedrukt 52, 59, en 106 voor ons. 1577 01:16:07,890 --> 01:16:13,620 >> Dus aangezien dit kan printen 20, 34 en de andere kan afdrukken 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 alles wat we nodig hebben om te kunnen doen is druk onszelf in het midden van dat. 1579 01:16:17,180 --> 01:16:21,250 Dus uitprinten alles voor ons. 1580 01:16:21,250 --> 01:16:27,710 Print onszelf, zodat het huidige knooppunt afdrukken 36, regelmatige printf, en vervolgens 1581 01:16:27,710 --> 01:16:31,170 drukken alles achter ons. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: Dit is waar recursie krijgt echt mooi. 1583 01:16:32,730 --> 01:16:36,270 Het is deze geweldige sprong van het geloof waar je doet het kleinste beetje van het werk. 1584 01:16:36,270 --> 01:16:38,460 En dan laat je iemand anders doet de rest. 1585 01:16:38,460 --> 01:16:40,180 En dat iemand anders is, ironisch genoeg, u. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Dus voor serieuze brownie points, indien je omhoog te bladeren op de vragen - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: Op de vragen? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: En een beetje naar beneden te de cijfers, weet iemand waar 1590 01:16:53,490 --> 01:16:55,190 deze cijfers vandaan? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: Ik heb letterlijk geen idee. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Ze verschijnen de hele quiz. 1593 01:16:59,794 --> 01:17:01,150 >> Publiek: Zijn ze dezelfde nummers? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Die getallen. 1595 01:17:01,910 --> 01:17:03,260 Een beetje paasei. 1596 01:17:03,260 --> 01:17:08,100 Dus voor degenen onder u online kijken op thuis, als u ons kan vertellen via e-mail naar 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net wat de betekenis van deze terugkerende zes nummers zijn 1598 01:17:12,680 --> 01:17:18,560 hele Quiz 1, zullen we je douche met verbazingwekkend oog op de finale 1599 01:17:18,560 --> 01:17:21,610 lezing en een stressbal. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Mooi, subtiel. 1602 01:17:27,790 --> 01:17:29,570 >> ROB BOWDEN: Elke laatste vragen alles op de quiz? 1603 01:17:29,570 --> 01:17:32,608