1 00:00:00,000 --> 00:00:12,610 2 00:00:12,610 --> 00:00:12,900 >> DAVID J. Malan: Dobře. 3 00:00:12,900 --> 00:00:16,790 Takže vítejte na vůbec první CS50 posmrtné na kvíz. 4 00:00:16,790 --> 00:00:18,340 Mysleli jsme, že slavnostně tato tradice v letošním roce. 5 00:00:18,340 --> 00:00:20,960 A to bude příležitost projít 6 00:00:20,960 --> 00:00:22,220 řešení kvízu. 7 00:00:22,220 --> 00:00:26,160 A budeme zrychlit nebo zpomalit na základě na zájmu těch, kteří zde. 8 00:00:26,160 --> 00:00:29,730 >> Takže jste asi tady, protože jste zajímalo, jak byste mohli mít nebo 9 00:00:29,730 --> 00:00:31,170 měla zodpovědět některé z těchto problémů. 10 00:00:31,170 --> 00:00:33,300 Tak proč bychom se podívat Zpočátku této sekci? 11 00:00:33,300 --> 00:00:34,450 Tak jak se řetězce. 12 00:00:34,450 --> 00:00:37,600 To vám dal tři různé verze programu, který byl nakonec 13 00:00:37,600 --> 00:00:39,650 chtěl získat řetězec od uživatele. 14 00:00:39,650 --> 00:00:42,530 Zda nebo ne to dělalo to bylo ponecháno na vás zjistit. 15 00:00:42,530 --> 00:00:45,150 >> A ptali jsme se v první otázce, 0, Předpokládám, že verze 1 je 16 00:00:45,150 --> 00:00:46,400 sestavil a popraven. 17 00:00:46,400 --> 00:00:48,860 Proč může program segfault? 18 00:00:48,860 --> 00:00:51,150 Na první pohled, nějaké návrhy , proč? 19 00:00:51,150 --> 00:00:54,012 20 00:00:54,012 --> 00:00:54,489 Jo. 21 00:00:54,489 --> 00:00:59,260 >> DIVÁKŮ: Tak Vzpomínám si na to v Předchozí příklad při pohledu na 22 00:00:59,260 --> 00:01:05,506 char * s, a viděl scan S a vidět, protože je to ukazatel, jak 23 00:01:05,506 --> 00:01:07,971 to ovlivnilo to, co jste skenovat? 24 00:01:07,971 --> 00:01:10,940 Je to to nebo adresa s? 25 00:01:10,940 --> 00:01:11,180 >> DAVID J. Malan: OK. 26 00:01:11,180 --> 00:01:11,480 Dobrá. 27 00:01:11,480 --> 00:01:14,830 Takže v konečném důsledku, zdroj jakéhokoliv problému se pravděpodobně bude snižovat 28 00:01:14,830 --> 00:01:16,210 této proměnné s. 29 00:01:16,210 --> 00:01:17,280 A to je opravdu variabilní. 30 00:01:17,280 --> 00:01:19,900 Datový typ této proměnné je char *, což znamená, že to bude 31 00:01:19,900 --> 00:01:22,570 obsahovat adresu charakteru. 32 00:01:22,570 --> 00:01:23,850 A v tom spočívá pochopení. 33 00:01:23,850 --> 00:01:28,330 Bude obsahovat adresu znak nebo, obecněji, 34 00:01:28,330 --> 00:01:32,110 adresa prvního znaku v celý blok znaků. 35 00:01:32,110 --> 00:01:36,680 >> Ale úlovek je, že skenování s, účel život, je dána adresu a vzhledem 36 00:01:36,680 --> 00:01:40,960 Kód formátu, jako je% s, čtení řetězec do kusu 37 00:01:40,960 --> 00:01:42,330 Paměť na této adrese. 38 00:01:42,330 --> 00:01:46,040 Ale protože tam není rovnítko před že středník na první 39 00:01:46,040 --> 00:01:49,310 řádek kódu, protože to není ve skutečnosti alokovat paměť s 40 00:01:49,310 --> 00:01:53,020 malloc, protože ne ve skutečnosti alokovat pole nějaké velikosti, všechny 41 00:01:53,020 --> 00:01:57,620 děláte čte uživatele vstup z klávesnice do některé kompletní 42 00:01:57,620 --> 00:02:00,490 hodnota odpadky, které je s výchozím. 43 00:02:00,490 --> 00:02:04,480 Takže šance jsou vy budete segfault pokud že adresa není jen tak nestane 44 00:02:04,480 --> 00:02:08,009 být hodnota, kterou můžete, ve skutečnosti, napište. 45 00:02:08,009 --> 00:02:10,889 Tak špatné nerozdělit paměť tam. 46 00:02:10,889 --> 00:02:13,150 >> Takže v otázce č. 1, jsme se zeptali, Předpokládám, že verze 2 je 47 00:02:13,150 --> 00:02:14,230 sestavil a popraven. 48 00:02:14,230 --> 00:02:15,900 Proč může tento program segfault? 49 00:02:15,900 --> 00:02:17,990 Tak tohle je menší buggy. 50 00:02:17,990 --> 00:02:21,470 A je to opravdu jen jeden zřejmý způsob, kde můžete 51 00:02:21,470 --> 00:02:22,810 spustit segfault zde. 52 00:02:22,810 --> 00:02:23,730 A to je tematické. 53 00:02:23,730 --> 00:02:28,180 Kdykoliv jsme pomocí c v paměti, co se můžete udělat pro to, přimět segfault 54 00:02:28,180 --> 00:02:30,718 ve verzi 2? 55 00:02:30,718 --> 00:02:35,560 >> DIVÁKŮ: Pokud používáte tento vstup v řetězec, který je delší než 49 56 00:02:35,560 --> 00:02:35,975 znaky. 57 00:02:35,975 --> 00:02:37,260 >> DAVID J. Malan: Přesně tak. 58 00:02:37,260 --> 00:02:41,420 Kdykoli vidíte něco pevné délky , pokud jde o pole, vaše 59 00:02:41,420 --> 00:02:44,650 radar by měl jít pryč, že by to mohlo být problematické, pokud si nejste kontrola 60 00:02:44,650 --> 00:02:45,810 hranice pole. 61 00:02:45,810 --> 00:02:46,650 A že je tu problém. 62 00:02:46,650 --> 00:02:47,910 Pořád pomocí scanf. 63 00:02:47,910 --> 00:02:52,200 Pořád pomocí% s, což znamená, že se snaží číst řetězec od uživatele. 64 00:02:52,200 --> 00:02:56,300 To bude číst do s, což v tomto bodě, je účinně 65 00:02:56,300 --> 00:02:58,570 adresa bloku paměti nebo je to ekvivalent. 66 00:02:58,570 --> 00:03:02,080 Je to název pole znaků v paměti. 67 00:03:02,080 --> 00:03:07,610 >> Ale přesně to, pokud budete číst řetězec to je delší než 49 znaků, 49 68 00:03:07,610 --> 00:03:10,440 protože budete potřebovat prostor pro lomítkem 0, budete přetečení 69 00:03:10,440 --> 00:03:11,390 že vyrovnávací paměti. 70 00:03:11,390 --> 00:03:16,410 A můžete mít štěstí a být schopen napsat znak, 51. 52., 53.. 71 00:03:16,410 --> 00:03:18,560 Ale v určitém okamžiku, OS se chystá říct, no. 72 00:03:18,560 --> 00:03:21,270 To rozhodně není paměť budete dotýkat. 73 00:03:21,270 --> 00:03:23,380 A program bude segfault. 74 00:03:23,380 --> 00:03:26,650 >> Takže tam jsou heuristiky by měl být jakýkoli Čas máte pevnou délku, máte 75 00:03:26,650 --> 00:03:30,150 aby se ujistil, že jste kontrolu délky na co to je, že se snažíte 76 00:03:30,150 --> 00:03:31,090 číst do něj. 77 00:03:31,090 --> 00:03:35,110 >> DIVÁKŮ: Takže řešení, které byste mohli měli prohlášení kontrolu skutečně 78 00:03:35,110 --> 00:03:37,140 je délka větší nebo menší než? 79 00:03:37,140 --> 00:03:37,730 >> DAVID J. Malan: Přesně tak. 80 00:03:37,730 --> 00:03:41,706 Stačí mít podmínku , který říká, pokud - 81 00:03:41,706 --> 00:03:46,080 nebo spíše nemusíte nutně vědět, předem, kolik znaků 82 00:03:46,080 --> 00:03:49,060 uživatel bude psát, protože Máte kuře a vejce. 83 00:03:49,060 --> 00:03:51,860 Ne, dokud jste si ji s scanf můžete zjistit, jak dlouho to je. 84 00:03:51,860 --> 00:03:54,500 Ale v tomto okamžiku, to je příliš pozdě, proto, že jste již četli ji do 85 00:03:54,500 --> 00:03:55,710 některé blok paměti. 86 00:03:55,710 --> 00:03:59,590 Tak jako stranou, CS50 knihovna vyhýbá tento problém úplně, odvolání 87 00:03:59,590 --> 00:04:01,060 pomocí fgetc. 88 00:04:01,060 --> 00:04:05,390 A to přečte jeden znak v době, špičkách spolu s vědomím, že vás 89 00:04:05,390 --> 00:04:08,060 nemůže přetečení charakter, pokud budete číst jednu po druhé. 90 00:04:08,060 --> 00:04:11,580 >> Háček je s GetString odvolání je že máme neustále re-velikosti 91 00:04:11,580 --> 00:04:13,590 že kus paměti, který je jen bolest. 92 00:04:13,590 --> 00:04:15,310 Je to hodně řádků Kód k tomu, že. 93 00:04:15,310 --> 00:04:18,779 Takže jiný přístup by byl vlastně používat bratrance, takže 94 00:04:18,779 --> 00:04:19,790 mluvit, o scanf. 95 00:04:19,790 --> 00:04:22,820 K dispozici jsou varianty mnoho z nich funkce, které ve skutečnosti kontrolují 96 00:04:22,820 --> 00:04:25,870 Délka kolik znaků můžete číst maximálně. 97 00:04:25,870 --> 00:04:29,430 A vy jste mohli určit, nečtou více než 50 znaků. 98 00:04:29,430 --> 00:04:34,110 Tak, že by byl jiný přístup, ale méně vstřícný větších vstupů. 99 00:04:34,110 --> 00:04:37,040 >> Takže otázka 2 se ptá, předpokládám, že verze 3 je sestaven a proveden. 100 00:04:37,040 --> 00:04:39,960 Proč by to program, segfault? 101 00:04:39,960 --> 00:04:42,650 Takže tohle je vlastně stejný odpověď, i když to 102 00:04:42,650 --> 00:04:43,590 Vypadá trochu obsáhlejší. 103 00:04:43,590 --> 00:04:46,440 Budeme používat malloc, které se cítí jako dáváme sami sobě více možností. 104 00:04:46,440 --> 00:04:48,030 A pak jsme uvolnění, které paměti na konci. 105 00:04:48,030 --> 00:04:49,580 Je to stále jen 50 bajtů paměti. 106 00:04:49,580 --> 00:04:53,620 Tak bychom mohli ještě zkusit číst v 51, 52, 1000 bajtů. 107 00:04:53,620 --> 00:04:55,830 Bude to segfault pro přesně stejný důvod. 108 00:04:55,830 --> 00:04:57,530 >> Ale je tu další důvod, proč taky. 109 00:04:57,530 --> 00:05:03,890 Co jiného by mohlo malloc návrat vedle adresa bloku paměti? 110 00:05:03,890 --> 00:05:04,920 To by se mohl vrátit null. 111 00:05:04,920 --> 00:05:07,560 A protože nejsme kontrola to, že bychom mohli dělat něco 112 00:05:07,560 --> 00:05:11,350 hloupý jiného důvodu, což je to, že bychom mohli říkat scanf, přečtěte si 113 00:05:11,350 --> 00:05:16,050 vstup uživatele z klávesnice do 0 polohy, AKA null. 114 00:05:16,050 --> 00:05:18,890 A taky, bude určitě spustit segfault. 115 00:05:18,890 --> 00:05:21,590 Takže pro účely kvíz je, by se přijali jeden z těch, co 116 00:05:21,590 --> 00:05:22,740 pádný důvod. 117 00:05:22,740 --> 00:05:23,420 Jedním z nich je totožný. 118 00:05:23,420 --> 00:05:25,720 Jedním z nich je trochu složitější,. 119 00:05:25,720 --> 00:05:28,975 >> A konečně, s ohledem na programu je využití paměti, jak to verze 2 a 120 00:05:28,975 --> 00:05:30,350 Verze 3 se liší? 121 00:05:30,350 --> 00:05:35,070 Takže, co to stojí, viděli jsme zdánlivě nekonečnou zásobu možné 122 00:05:35,070 --> 00:05:35,770 odpovědi na to. 123 00:05:35,770 --> 00:05:39,300 A mezi odpověďmi lidí, co jsme byli doufal, že, ale přijali jsme další 124 00:05:39,300 --> 00:05:42,250 věci, byla nějaká zmínka o Skutečnost, že verze 2 se používá 125 00:05:42,250 --> 00:05:44,560 tzv. stack. 126 00:05:44,560 --> 00:05:46,710 Verze 3 je pomocí haldy. 127 00:05:46,710 --> 00:05:50,060 A funkčně, to není opravdu dělat vše, co velký rozdíl. 128 00:05:50,060 --> 00:05:54,040 Na konci dne, jsme stále jen dostat 50 bajtů paměti. 129 00:05:54,040 --> 00:05:56,640 >> Ale to byl jeden z možných odpovědí že jsme se dívali na. 130 00:05:56,640 --> 00:05:59,730 Ale uvidíte, jak vám vaše kvízy zpět z TFS, že jsme udělali 131 00:05:59,730 --> 00:06:04,330 přijmout jiné diskuse o jejich různorodé použití paměti, jakož. 132 00:06:04,330 --> 00:06:08,600 Ale stack a heap by bylo jednoduchá odpověď jít s. 133 00:06:08,600 --> 00:06:11,150 Jakékoliv dotazy? 134 00:06:11,150 --> 00:06:12,400 Dám vám Rob. 135 00:06:12,400 --> 00:06:18,360 136 00:06:18,360 --> 00:06:20,210 >> ROB BOWDEN: Takže problém 4. 137 00:06:20,210 --> 00:06:21,985 To je ten, kdy jste museli vyplnit v počtu bajtů z všech 138 00:06:21,985 --> 00:06:23,460 Tyto různé typy používané. 139 00:06:23,460 --> 00:06:24,830 Takže první věc, kterou vidíme. 140 00:06:24,830 --> 00:06:27,930 Předpokládejme, že 32-bitovou architekturu, takhle CS50 spotřebiče. 141 00:06:27,930 --> 00:06:33,530 Takže jedna ze základních věcí, o 32-bitové architektury, která nám říká, 142 00:06:33,530 --> 00:06:37,490 přesně, jak velký ukazatel se děje být v architektuře. 143 00:06:37,490 --> 00:06:43,020 >> Takže hned, víme, že každý ukazatel Typ je 32-bitů nebo 4 bajty. 144 00:06:43,020 --> 00:06:46,010 Takže při pohledu na tuto tabulku uzel * je typu ukazatel. 145 00:06:46,010 --> 00:06:47,250 To bude 4 bajty. 146 00:06:47,250 --> 00:06:51,640 Struct uzel *, to je doslova totožný s uzlu hvězdy. 147 00:06:51,640 --> 00:06:53,590 A tak, že to bude 4 bajty. 148 00:06:53,590 --> 00:06:58,270 String, takže to nevypadá jako ukazatel ještě, ale typedef, 149 00:06:58,270 --> 00:07:01,590 řetězec je jen char *, které je typu ukazatel. 150 00:07:01,590 --> 00:07:03,550 Tak, že to bude 4 bajty. 151 00:07:03,550 --> 00:07:06,150 >> Takže tyto tři jsou všichni 4 bajty. 152 00:07:06,150 --> 00:07:09,350 Nyní, uzel a studentů jsou trochu složitější. 153 00:07:09,350 --> 00:07:15,160 Takže při pohledu na uzel a studentem, vidíme, uzel jako celé číslo a ukazatel. 154 00:07:15,160 --> 00:07:18,050 A student dva ukazatele uvnitř ní. 155 00:07:18,050 --> 00:07:23,340 Tak alespoň pro náš případ, způsob že jsme nakonec výpočet velikosti 156 00:07:23,340 --> 00:07:27,020 Tato struktura je jen sečíst vše že je uvnitř struct. 157 00:07:27,020 --> 00:07:30,690 >> Takže pro uzel, máme celé číslo, což je 4 bajty. 158 00:07:30,690 --> 00:07:32,830 Máme ukazatel, který má 4 bajty. 159 00:07:32,830 --> 00:07:35,820 A tak jeden uzel se děje aby se do 8 bajtů. 160 00:07:35,820 --> 00:07:39,490 A podobně pro studenta, máme ukazatel, který je 4 bajty a další 161 00:07:39,490 --> 00:07:40,770 ukazatel, který je 4 bajty. 162 00:07:40,770 --> 00:07:43,180 Takže, co se děje na konec up je 8 bajtů. 163 00:07:43,180 --> 00:07:45,480 Uzel a studentské Takže je 8 bajtů. 164 00:07:45,480 --> 00:07:48,950 A tito tři jsou všichni 4 bajty. 165 00:07:48,950 --> 00:07:50,240 Dotazy na to? 166 00:07:50,240 --> 00:07:54,640 167 00:07:54,640 --> 00:07:54,990 Ano. 168 00:07:54,990 --> 00:07:58,413 >> DIVÁKŮ: Je to 64-bit architektura, by to 169 00:07:58,413 --> 00:07:59,880 dvojnásobek všichni z nich? 170 00:07:59,880 --> 00:08:01,790 >> ROB BOWDEN: To ne zdvojnásobit všechny z nich. 171 00:08:01,790 --> 00:08:05,830 Tak 64-bitové architektury, je, opět, změny, které zásadní věc, že 172 00:08:05,830 --> 00:08:08,910 Ukazatel je nyní 64 bitů. 173 00:08:08,910 --> 00:08:09,290 Jo. 174 00:08:09,290 --> 00:08:10,930 Takže ukazatel je 8 bajtů. 175 00:08:10,930 --> 00:08:15,420 Takže to, že se 4 byty se bude 8 bajtů. 176 00:08:15,420 --> 00:08:18,617 Student, který byl dva ukazatele, dobře, teď to bude 177 00:08:18,617 --> 00:08:19,800 být 8 bajtů, 8 bajtů. 178 00:08:19,800 --> 00:08:21,980 Bude to dělat 16 bajtů. 179 00:08:21,980 --> 00:08:25,710 >> Uzel, ale je stále ještě 4 byty. 180 00:08:25,710 --> 00:08:27,800 Takže tento ukazatel se děje být 8 bajtů. 181 00:08:27,800 --> 00:08:28,930 To je 4 bajty. 182 00:08:28,930 --> 00:08:30,870 Takže uzel se děje pouze na 12 bajtů. 183 00:08:30,870 --> 00:08:36,309 184 00:08:36,309 --> 00:08:39,280 Jakékoliv další dotazy na tohle? 185 00:08:39,280 --> 00:08:44,500 Takže další jeden, jedná se o stavové kódy HTTP. 186 00:08:44,500 --> 00:08:48,000 A vy jste měl popsat okolnosti, za nichž je síla 187 00:08:48,000 --> 00:08:49,810 se vrátil k vám. 188 00:08:49,810 --> 00:08:56,730 jeden problém, který jsem slyšel některé studenty je to, že se snažili, aby 189 00:08:56,730 --> 00:08:58,950 Chyby být na straně klienta. 190 00:08:58,950 --> 00:09:02,320 Takže když se snažíme, aby žádost na serveru, něco, co jde 191 00:09:02,320 --> 00:09:03,820 špatně na naší straně. 192 00:09:03,820 --> 00:09:07,660 Ale obecně, tyto kódy jsou vracených serverem. 193 00:09:07,660 --> 00:09:11,720 Takže chceme-li zjistit, co se děje špatné nebo přímo na serveru, který 194 00:09:11,720 --> 00:09:14,280 způsobí, že tyto věci, které mají být vráceny. 195 00:09:14,280 --> 00:09:18,670 Tak proč by mohla a server vrací stavový kód 200? 196 00:09:18,670 --> 00:09:19,920 Jakékoliv myšlenky? 197 00:09:19,920 --> 00:09:23,360 198 00:09:23,360 --> 00:09:23,730 >> Jo. 199 00:09:23,730 --> 00:09:27,850 Takže něco o úspěšném požadavek prošel. 200 00:09:27,850 --> 00:09:30,260 A oni jsou schopni se vrátit co jste chtěl. 201 00:09:30,260 --> 00:09:32,240 Takže je všechno v pořádku. 202 00:09:32,240 --> 00:09:35,662 Co o 302 nalezeno? 203 00:09:35,662 --> 00:09:36,618 Jo. 204 00:09:36,618 --> 00:09:39,008 >> Diváků: Server hledal za to, co jste požadovali. 205 00:09:39,008 --> 00:09:40,442 Ale to nemohl najít. 206 00:09:40,442 --> 00:09:42,850 Takže tam je chyba. 207 00:09:42,850 --> 00:09:47,720 >> ROB BOWDEN: Takže server byl hledá to, co jste chtěli. 208 00:09:47,720 --> 00:09:51,682 Tak právě hledáte tady, 302 nalezeno, to byl schopen ji najít. 209 00:09:51,682 --> 00:09:53,035 >> DIVÁKŮ: Omlouvám se. 210 00:09:53,035 --> 00:09:54,388 Nalezeno znamená, že oni si to. 211 00:09:54,388 --> 00:09:55,638 Promiňte. 212 00:09:55,638 --> 00:09:58,120 213 00:09:58,120 --> 00:10:00,160 >> ROB BOWDEN: Tak 302 Found. 214 00:10:00,160 --> 00:10:02,350 Server je schopen najít to, co jste chtěli. 215 00:10:02,350 --> 00:10:04,640 >> DIVÁKŮ: Ale to není to zobrazení? 216 00:10:04,640 --> 00:10:08,180 >> ROB BOWDEN: rozdíl mezi to 302 a 200 je to, že 217 00:10:08,180 --> 00:10:09,280 ví, že to, co chcete. 218 00:10:09,280 --> 00:10:12,000 Ale není to přesně tam, kde jste se chtěl zeptat. 219 00:10:12,000 --> 00:10:14,580 Takže 302 je typický přesměrování. 220 00:10:14,580 --> 00:10:16,510 Takže jste si vyžádali stránku. 221 00:10:16,510 --> 00:10:19,590 Je to ví, oh, chci ti vrátit tohle. 222 00:10:19,590 --> 00:10:21,070 Ale to je na jinou adresu URL. 223 00:10:21,070 --> 00:10:23,534 Tak hele, vy vlastně chcete toto. 224 00:10:23,534 --> 00:10:26,950 >> DAVID J. Malan: Je to kus, který řekl: že jsme dali vy přesměrování 225 00:10:26,950 --> 00:10:30,830 funkce, která používá funkci záhlaví který, podle pořadí, vytisknout umístění, 226 00:10:30,830 --> 00:10:34,110 tlustého střeva, a pak URL, na které Chcete-li odmítnout uživatele. 227 00:10:34,110 --> 00:10:37,480 I když jste neviděli 302 výslovně se, že je to, co PHP 228 00:10:37,480 --> 00:10:41,550 by se mávnutím kouzelného proutku vložte jako záhlaví říká přesně to, co řekl Rob tam - 229 00:10:41,550 --> 00:10:41,930 nalezeno. 230 00:10:41,930 --> 00:10:43,180 Ale naleznete zde místo. 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 Takže to, co o 403 zakázán? 234 00:10:47,630 --> 00:10:52,240 235 00:10:52,240 --> 00:10:57,120 >> DIVÁKŮ: Myslím, že to, že server je v podstatě říká, že klient 236 00:10:57,120 --> 00:10:59,970 nemůže získat přístup k domovské stránce. 237 00:10:59,970 --> 00:11:03,260 >> ROB BOWDEN: Takže ano. 238 00:11:03,260 --> 00:11:07,670 No, typická odpověď jsme byli čeká je něco jako, soubory 239 00:11:07,670 --> 00:11:08,920 nejsou náležitě chmodded. 240 00:11:08,920 --> 00:11:11,590 To je asi, za jakých okolností jste je viděli. 241 00:11:11,590 --> 00:11:18,920 Ale je tu důvod, že klient může být na štíru. 242 00:11:18,920 --> 00:11:20,440 Tam je vlastně další stavový kód - 243 00:11:20,440 --> 00:11:21,210 401. 244 00:11:21,210 --> 00:11:22,820 Takže se jedná o velmi podobné. 245 00:11:22,820 --> 00:11:24,590 >> 401 je neoprávněné. 246 00:11:24,590 --> 00:11:26,130 A 403 je zakázáno. 247 00:11:26,130 --> 00:11:31,890 A tak neoprávněnému vám exkluzivně dostat, pokud nejste přihlášeni 248 00:11:31,890 --> 00:11:34,520 Ale přihlášení může znamenat že jste oprávněni. 249 00:11:34,520 --> 00:11:37,930 Ale pokud jste již přihlášeni a můžete Stále nemáte oprávnění, pak 250 00:11:37,930 --> 00:11:40,140 můžete také získat zakázáno. 251 00:11:40,140 --> 00:11:45,320 Takže pokud jste přihlášeni a nemají povolení, zakázáno je také 252 00:11:45,320 --> 00:11:47,164 něco, co můžete dostat. 253 00:11:47,164 --> 00:11:48,900 >> DAVID J. Malan: A mechanismus , které tyto problémy jsou obvykle 254 00:11:48,900 --> 00:11:53,100 řeší na serveru přes to příkaz? 255 00:11:53,100 --> 00:11:57,700 Chmod, pokud je to vskutku oprávnění vydá na soubor nebo adresář. 256 00:11:57,700 --> 00:11:59,220 >> ROB BOWDEN: A 404 nebyla nalezena. 257 00:11:59,220 --> 00:12:03,100 258 00:12:03,100 --> 00:12:03,470 Jo. 259 00:12:03,470 --> 00:12:10,150 Takže na rozdíl od 302, kde nebylo přesně kde se ptáte, ale ví, co 260 00:12:10,150 --> 00:12:12,710 chcete, to, to prostě musí žádný nápad, co chcete. 261 00:12:12,710 --> 00:12:15,648 A vy se nepožaduje něco platný. 262 00:12:15,648 --> 00:12:18,580 263 00:12:18,580 --> 00:12:22,310 418 Jsem konvice a poté 500 interní server. 264 00:12:22,310 --> 00:12:24,870 Tak proč můžete dostat, že? 265 00:12:24,870 --> 00:12:26,120 >> Takže segfault - 266 00:12:26,120 --> 00:12:28,760 267 00:12:28,760 --> 00:12:30,640 Já vlastně nevím, třídění standard pro to. 268 00:12:30,640 --> 00:12:34,850 Ale pokud vaše PHP kódu něco špatně v tom, teoreticky, mohla by 269 00:12:34,850 --> 00:12:39,650 vlastně segfault, v tom případě, to 500 Interní chyba serveru, něco, co 270 00:12:39,650 --> 00:12:41,400 je se váš server je špatně konfigurace. 271 00:12:41,400 --> 00:12:44,320 Nebo je to chyba syntaxe v PHP kódu. 272 00:12:44,320 --> 00:12:46,095 Nebo se něco špatného děje. 273 00:12:46,095 --> 00:12:48,320 >> DAVID J. Malan: My jsme vidět segfault Mezi odpověďmi pár lidí. 274 00:12:48,320 --> 00:12:49,490 A technicky, mohlo by se to stalo. 275 00:12:49,490 --> 00:12:53,820 Ale, že by PHP, program napsal jiných lidí, ve skutečnosti 276 00:12:53,820 --> 00:12:57,790 segfaulted, který pouze tehdy, pokud tito lidé podělal a napsal buggy kód 277 00:12:57,790 --> 00:13:00,680 jejich interpret by PHP samo o sobě segfault. 278 00:13:00,680 --> 00:13:06,460 Takže i když je 500 jako segfault v duchu, je to téměř vždy 279 00:13:06,460 --> 00:13:10,490 Výsledkem je problém konfiguračního souboru s webovým serverem, nebo, jak řekl Rob, 280 00:13:10,490 --> 00:13:13,200 syntaktická chyba, jako jste vy neuzavřela cenovou nabídku. 281 00:13:13,200 --> 00:13:16,180 Nebo jste ztratili středník někde. 282 00:13:16,180 --> 00:13:23,677 >> DIVÁKŮ: Takže pro Shuttle pset, jsem že když jsem to udělal, když jsem kliknul 283 00:13:23,677 --> 00:13:26,300 prohlížeč, ale nic přišel, co oni volali bílá stránka. 284 00:13:26,300 --> 00:13:28,056 Ale bylo to proto, že z kódu. 285 00:13:28,056 --> 00:13:29,440 Myslím, že to bylo JavaScript, jo? 286 00:13:29,440 --> 00:13:29,770 >> ROB BOWDEN: Jo. 287 00:13:29,770 --> 00:13:31,180 >> DIVÁKŮ: Kéž by chyba ještě přijít? 288 00:13:31,180 --> 00:13:34,290 >> ROB BOWDEN: Takže byste se dostali to chyba, protože vše 289 00:13:34,290 --> 00:13:36,930 z pohledu webového serveru byl úplně v pořádku. 290 00:13:36,930 --> 00:13:39,090 Ale jste požadovali index.html. 291 00:13:39,090 --> 00:13:42,000 Požadovali jste shuttle.js a service.js. 292 00:13:42,000 --> 00:13:44,580 A to se podařilo úspěšně vrátit vám všem z těch věcí - 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 Je to pouze tehdy, když se váš prohlížeč pokoušel interpretovat kód JavaScript, který 296 00:13:49,330 --> 00:13:51,370 je to jako, počkejte, to není platné k chybě JavaScript. 297 00:13:51,370 --> 00:13:55,720 298 00:13:55,720 --> 00:13:58,210 Nějaké další otázky? 299 00:13:58,210 --> 00:14:00,750 Dobrá. 300 00:14:00,750 --> 00:14:04,120 >> DAVID J. Malan: Tak další až se číslo 11. 301 00:14:04,120 --> 00:14:07,610 A 11 byl nejděsivější pro mnoho lidí. 302 00:14:07,610 --> 00:14:14,620 303 00:14:14,620 --> 00:14:18,570 Takže nejdůležitější věc na vědomí zde se, že je to skutečně o 304 00:14:18,570 --> 00:14:19,840 dvojnásobně spojový seznam. 305 00:14:19,840 --> 00:14:23,160 Ale to nebylo stejné jako minulý rok dvojnásobně spojový seznam problém, 306 00:14:23,160 --> 00:14:27,170 který vám nedal na námitku, že seznam by mohl ve skutečnosti být netříděný. 307 00:14:27,170 --> 00:14:29,640 >> A tak skutečnost, že seznam byl netříděného a skutečnost, že toto slovo bylo 308 00:14:29,640 --> 00:14:32,930 zdůrazněno, že měl sdělit , že je to ve skutečnosti zjednodušení 309 00:14:32,930 --> 00:14:35,430 z toho, co by jinak bylo náročnější problém 310 00:14:35,430 --> 00:14:36,600 a delší. 311 00:14:36,600 --> 00:14:40,760 Takže Běžnou chybou zde bylo dali Řešení loňský na jednom 312 00:14:40,760 --> 00:14:45,580 pager a pak už jen slepě kopírovat, který se jako odpověď, která je správná 313 00:14:45,580 --> 00:14:48,520 odpovědět na jinou otázku podobně v duchu. 314 00:14:48,520 --> 00:14:51,340 Ale jemnosti zde byly následující. 315 00:14:51,340 --> 00:14:55,200 >> Takže jedna, jsme uzel prohlásil a jsou definovány v obvyklým způsobem zde. 316 00:14:55,200 --> 00:14:59,230 Pak jsme definovaný seznam je globální ukazatel inicializován na hodnotu null. 317 00:14:59,230 --> 00:15:02,150 Pak se zdá, že je dvě funkce máme prototypy pro tu, vložka 318 00:15:02,150 --> 00:15:03,240 a odstranit. 319 00:15:03,240 --> 00:15:06,600 A pak tu máme nějaký ukázkový kód zde dělat spoustu vložení. 320 00:15:06,600 --> 00:15:09,930 A pak žádáme vás, abyste dokončit provedení vložky pod takovým 321 00:15:09,930 --> 00:15:14,380 tak, že se vloží do n seznamu v konstantním čase, rovněž zdůraznil, 322 00:15:14,380 --> 00:15:15,730 i když již existuje. 323 00:15:15,730 --> 00:15:20,600 >> Takže krása je možné vložit v konstantním čase, je, že to znamená, 324 00:15:20,600 --> 00:15:23,060 že budete muset vložit nový uzel, kde? 325 00:15:23,060 --> 00:15:23,690 Do přední části. 326 00:15:23,690 --> 00:15:27,760 Tak to eliminuje, naštěstí, alespoň jeden z případů, které dříve vyžadovaly 327 00:15:27,760 --> 00:15:30,520 ještě více řádků kódu, jako to udělal v loňském roce, a to i ve třídě, když jsme 328 00:15:30,520 --> 00:15:34,040 mluvil skrze tyhle věci s lidmi a s některými 329 00:15:34,040 --> 00:15:35,250 slovní pseudo kód. 330 00:15:35,250 --> 00:15:39,190 Takže řešení tady, pojďme přeskočit k tomu stačí mít vizuální kontakt 331 00:15:39,190 --> 00:15:40,480 obrazovce. 332 00:15:40,480 --> 00:15:42,230 >> Všimněte si, že děláme následující. 333 00:15:42,230 --> 00:15:45,140 A také si všimnout další zjednodušení bylo, že i když je to 334 00:15:45,140 --> 00:15:48,280 již existuje, tak to znamená, že i v případě, číslo již existuje, můžete 335 00:15:48,280 --> 00:15:50,280 jen slepě vložit další kopie toho. 336 00:15:50,280 --> 00:15:52,560 A to také mělo být zjednodušení, takže byste mohli 337 00:15:52,560 --> 00:15:54,940 zaměřit se na, opravdu, někteří více intelektuálně zajímavá část a 338 00:15:54,940 --> 00:15:58,090 není jen nějaký další kontrolu chyb s ohledem na omezený čas. 339 00:15:58,090 --> 00:16:02,880 >> Takže v tomto roztoku vzorku se přidělí ukazatel na levé straně 340 00:16:02,880 --> 00:16:04,510 stranu zde k uzlu. 341 00:16:04,510 --> 00:16:07,190 Nyní si uvědomit, že ukazatel, as Rob řekl, je pouze 32 bitů. 342 00:16:07,190 --> 00:16:09,060 A to není ve skutečnosti obsahovat adresa, dokud 343 00:16:09,060 --> 00:16:09,970 přiřadit mu adresu. 344 00:16:09,970 --> 00:16:13,220 A my, že na pravé straně strana přes malloc. 345 00:16:13,220 --> 00:16:16,550 Jako dobrý občan, můžeme zkontrolovat, že malloc není ve skutečnosti, null, takže 346 00:16:16,550 --> 00:16:18,690 nemáme náhodou vytvořit segfault zde. 347 00:16:18,690 --> 00:16:22,840 A kdykoliv použít malloc v životě, vám by měla být kontrola na null, jinak 348 00:16:22,840 --> 00:16:24,090 Máte jemné chybu. 349 00:16:24,090 --> 00:16:28,460 >> Pak jsme se inicializovat, že null by přiřazení n a předchozí a další. 350 00:16:28,460 --> 00:16:32,450 A v tomto případě tady, jsem inicializaci předchozí na hodnotu null, protože tento nový 351 00:16:32,450 --> 00:16:34,780 uzel bude nový začátku mého seznamu. 352 00:16:34,780 --> 00:16:37,050 Takže tam to bude nic před ním. 353 00:16:37,050 --> 00:16:42,010 A já chci, aby v podstatě připojit Stávající seznam do nového uzlu 354 00:16:42,010 --> 00:16:44,700 nastavení vedle rovná seznam sám. 355 00:16:44,700 --> 00:16:47,120 Ale já jsem to udělal jen zatím. 356 00:16:47,120 --> 00:16:51,780 Takže v případě, že seznam sám o sobě již existoval, a tam byl alespoň jeden uzel 357 00:16:51,780 --> 00:16:57,070 již na místě, pokud se jedná o seznam tady a já vložit nový uzel tady, jsem 358 00:16:57,070 --> 00:17:01,840 je třeba, aby se ujistil, že můj bývalý uzel body zpět do mého nového uzlu, 359 00:17:01,840 --> 00:17:04,260 , protože to je, opět, dvojnásobně spojový seznam. 360 00:17:04,260 --> 00:17:05,460 >> Takže děláme kontrolu zdravý rozum. 361 00:17:05,460 --> 00:17:10,109 Pokud seznam není null, pokud je již jeden nebo více uzlů, pak tam 362 00:17:10,109 --> 00:17:12,470 Dodávám, že zadní odkaz, abych tak řekl. 363 00:17:12,470 --> 00:17:15,420 A pak to poslední, co potřebujeme udělat, je aktualizovat globální 364 00:17:15,420 --> 00:17:20,329 seznam proměnných sám bodu do tohoto nového uzlu. 365 00:17:20,329 --> 00:17:21,790 Jo. 366 00:17:21,790 --> 00:17:26,579 >> DIVÁKŮ: Ve směru šipky [Neslyšitelný] se rovná null, dělá, že 367 00:17:26,579 --> 00:17:30,420 vypořádat se s seznamu, protože Seznam je null? 368 00:17:30,420 --> 00:17:30,596 >> DAVID J. Malan: Ne. 369 00:17:30,596 --> 00:17:34,500 To je prostě to, že jsem aktivně pozor, v tom, že pokud je to můj 370 00:17:34,500 --> 00:17:38,730 Původní seznam se možná některé další uzly tady a já jsem vkládání my 371 00:17:38,730 --> 00:17:42,380 nový uzel sem, tam se děje být nic sem. 372 00:17:42,380 --> 00:17:44,720 A chci zachytit ten nápad nastavením dříve 373 00:17:44,720 --> 00:17:47,740 null na nový uzel. 374 00:17:47,740 --> 00:17:51,410 A pravděpodobně, pokud můj kód je správný a neexistuje žádný jiný způsob, jak vložit 375 00:17:51,410 --> 00:17:54,970 jiné, než je tato funkce uzly, pravděpodobně, i když seznam již 376 00:17:54,970 --> 00:18:00,090 jeden nebo více uzlů v něm, pravděpodobně Seznam, první uzel, by měl 377 00:18:00,090 --> 00:18:02,750 předchozí ukazatel null sám. 378 00:18:02,750 --> 00:18:03,550 >> DIVÁKŮ: A jen následné-up. 379 00:18:03,550 --> 00:18:08,139 Důvod, proč dát ukazatel next rovná Seznam je děláte ukazatel 380 00:18:08,139 --> 00:18:13,579 Před seznamu v tom, že to ukazuje na další, myslím, že - 381 00:18:13,579 --> 00:18:14,980 Já ne - 382 00:18:14,980 --> 00:18:15,450 jen seznam? 383 00:18:15,450 --> 00:18:16,400 >> DAVID J. Malan: Přesně tak. 384 00:18:16,400 --> 00:18:19,400 A tak se pojďme skutečně zvážit dvě případů zde opravdu, i když 385 00:18:19,400 --> 00:18:22,070 Aby budeme uvažovat o nich není úplně stejný jako kód. 386 00:18:22,070 --> 00:18:26,250 Ale na vysoké úrovni, v případě, že představuje seznam, a to je 32-bit 387 00:18:26,250 --> 00:18:29,560 ukazatel, nejjednodušší scénář že je to null ve výchozím nastavení. 388 00:18:29,560 --> 00:18:33,010 A předpokládám Chci vložit Číslo 50 bylo první číslo. 389 00:18:33,010 --> 00:18:37,640 Takže budu pokračovat a přidělit uzel, který bude obsahovat 390 00:18:37,640 --> 00:18:38,770 tři pole - 391 00:18:38,770 --> 00:18:42,070 n, předchozí a další. 392 00:18:42,070 --> 00:18:44,580 >> Chystám se dát číslo 50 tady, protože to bude n. 393 00:18:44,580 --> 00:18:46,130 To bude další. 394 00:18:46,130 --> 00:18:48,530 A to bude předchozí. 395 00:18:48,530 --> 00:18:50,910 A tak co mám dělat v tomto případě? 396 00:18:50,910 --> 00:18:53,900 No, já jsem právě udělal linku 1 zde. 397 00:18:53,900 --> 00:18:55,400 Ukazatel n dostane n. 398 00:18:55,400 --> 00:18:57,740 Já pak řekl, předchozí by měl dostat null. 399 00:18:57,740 --> 00:18:59,470 Takže to bude mít hodnotu null. 400 00:18:59,470 --> 00:19:01,365 Pak budu říkat další se chystá do seznamu dostat. 401 00:19:01,365 --> 00:19:05,150 >> A to prostě funguje dobře. 402 00:19:05,150 --> 00:19:06,500 To je null. 403 00:19:06,500 --> 00:19:10,620 A tak říkám, nový uzel je vedle pole by měl dostat, co to je. 404 00:19:10,620 --> 00:19:12,570 Tak, že klade další null tam. 405 00:19:12,570 --> 00:19:14,510 A pak poslední věc, I to je zkontrolovat zde. 406 00:19:14,510 --> 00:19:17,870 Pokud seznam není rovna NULL, ale je roven null, takže jsme vynechat 407 00:19:17,870 --> 00:19:18,470 dohromady. 408 00:19:18,470 --> 00:19:23,520 A tak vše, co dělat dál, je seznam dostane ukazatel, který má za následek obrazově 409 00:19:23,520 --> 00:19:25,570 obrázek takhle. 410 00:19:25,570 --> 00:19:26,620 Takže to je jeden scénář. 411 00:19:26,620 --> 00:19:30,490 >> A ten, který jste se ptal konkrétně je situace, jako je tato, 412 00:19:30,490 --> 00:19:33,190 kde již máme seznam jeden-uzlu. 413 00:19:33,190 --> 00:19:36,240 A když jsem se vrátit do původní Problém prohlášení, další sejdeme 414 00:19:36,240 --> 00:19:39,320 vložit řekněme je 34, jen pro saké diskuse. 415 00:19:39,320 --> 00:19:46,210 Takže budu jen pohodlně kreslit, které sem. 416 00:19:46,210 --> 00:19:47,540 Právě jsem malloced. 417 00:19:47,540 --> 00:19:49,310 Předpokládejme, že jsem kontrolu na null. 418 00:19:49,310 --> 00:19:51,870 >> Teď jdu k inicializaci n být 34. 419 00:19:51,870 --> 00:19:53,040 A to bude n. 420 00:19:53,040 --> 00:19:54,670 To bude další. 421 00:19:54,670 --> 00:19:57,100 A to bude předchozí. 422 00:19:57,100 --> 00:19:59,370 Pojďme se ujistěte se, že jsem to neudělal si to pozpátku. 423 00:19:59,370 --> 00:20:01,110 Předchozí je na prvním místě v definici. 424 00:20:01,110 --> 00:20:03,070 Dovolte mi, abych tento problém odstranit. 425 00:20:03,070 --> 00:20:04,410 Je to předchozí. 426 00:20:04,410 --> 00:20:05,780 To je vedle. 427 00:20:05,780 --> 00:20:08,620 I přesto, že jsou shodné, pojďme si to konzistentní. 428 00:20:08,620 --> 00:20:09,450 >> Předchozí. 429 00:20:09,450 --> 00:20:11,030 To je vedle. 430 00:20:11,030 --> 00:20:16,310 Tak jsem právě malloced mé vědomí, kontrolovat NULL, přiřadí 34 do uzlu. 431 00:20:16,310 --> 00:20:17,570 Předchozí dostane null. 432 00:20:17,570 --> 00:20:19,480 Tak, že mi to dává. 433 00:20:19,480 --> 00:20:21,010 Další dostane seznam. 434 00:20:21,010 --> 00:20:22,370 Takže seznam je to. 435 00:20:22,370 --> 00:20:26,520 Takže je to teď stejné jako čerpání této šipka, takže se upozornit na jeden 436 00:20:26,520 --> 00:20:27,940 ve stejném. 437 00:20:27,940 --> 00:20:30,400 A pak jsem kontrolu, zda seznam není rovno null. 438 00:20:30,400 --> 00:20:31,740 A není to tentokrát. 439 00:20:31,740 --> 00:20:35,580 Pak jdu udělat seznam předchozí dostane ukazatel. 440 00:20:35,580 --> 00:20:39,700 >> Takže seznam Předchozí dostane PTR. 441 00:20:39,700 --> 00:20:44,300 Tak to má za následek uvedení grafický šipka zde. 442 00:20:44,300 --> 00:20:46,930 A to je už trochu vlnité, linky. 443 00:20:46,930 --> 00:20:50,780 A pak, konečně, jsem aktualizovat seznam poukázat na ukazatel. 444 00:20:50,780 --> 00:20:55,560 Takže teď to ukazuje na toho chlapa. 445 00:20:55,560 --> 00:20:57,170 A teď, pojďme dělat rychlé Kontrola zdravý rozum. 446 00:20:57,170 --> 00:20:59,470 >> Zde je seznam, který je globální proměnná. 447 00:20:59,470 --> 00:21:02,850 První uzel je, ve skutečnosti, 34, protože Já jsem po tu šipku. 448 00:21:02,850 --> 00:21:05,210 A to je správné, protože chci, aby vložit na začátku seznamu 449 00:21:05,210 --> 00:21:06,070 všechny nové uzly. 450 00:21:06,070 --> 00:21:08,860 Jeho další pole mě vede k této chlapa. 451 00:21:08,860 --> 00:21:10,710 Pokud jsem dál, jsem narazila další je null. 452 00:21:10,710 --> 00:21:11,760 Takže to nic víc seznamu. 453 00:21:11,760 --> 00:21:14,460 Pokud jsem narazila předchozí, jsem si tam, kde jsem čekat. 454 00:21:14,460 --> 00:21:16,435 >> Takže stále existuje několik rad, samozřejmě, manipulovat. 455 00:21:16,435 --> 00:21:19,870 Ale skutečnost, že vám bylo řečeno, k tomu to v konstantním čase vás znamená pouze to, 456 00:21:19,870 --> 00:21:22,910 mají konečný počet věcí máte dovoleno dělat. 457 00:21:22,910 --> 00:21:24,290 A co je to za číslo? 458 00:21:24,290 --> 00:21:25,185 To by mohl být jeden krok. 459 00:21:25,185 --> 00:21:25,700 Mohlo by to být dva. 460 00:21:25,700 --> 00:21:26,820 Mohlo by to být 1000 kroků. 461 00:21:26,820 --> 00:21:30,500 Ale to je konečný, což znamená, že nemůžete mají nějaký druh zacyklení děje 462 00:21:30,500 --> 00:21:32,010 tady, no rekurze, žádné smyčky. 463 00:21:32,010 --> 00:21:37,390 Je to prostě musím být tvrdý-kódované linky kódu, jak máme v tomto vzorku. 464 00:21:37,390 --> 00:21:42,330 >> Takže další problém 12 nás požádala, abychom dokončení implementace vyřazení 465 00:21:42,330 --> 00:21:46,740 pod takovým způsobem, že se odstraňuje n ze seznamu v lineárním čase. 466 00:21:46,740 --> 00:21:48,740 Takže budete muset trochu více manévrovací prostor nyní. 467 00:21:48,740 --> 00:21:52,380 Můžete předpokládat, že n, je-li přítomna v seznamu, bude přítomen 468 00:21:52,380 --> 00:21:53,340 ne více než jednou. 469 00:21:53,340 --> 00:21:56,770 A to také má být test založený na zjednodušující předpoklad, aby 470 00:21:56,770 --> 00:21:59,780 že pokud najdete číslo 50 někde v seznamu, nemáte také 471 00:21:59,780 --> 00:22:02,890 mají na starosti i nadále iteraci, hledá všechny možné 472 00:22:02,890 --> 00:22:06,990 kopie z 50, což by právě přecházejí do nějaké drobné detaily, v omezeném čase. 473 00:22:06,990 --> 00:22:10,460 >> Takže s remove, tenhle byl určitě náročnější a více 474 00:22:10,460 --> 00:22:11,640 Kód psát. 475 00:22:11,640 --> 00:22:14,990 Ale na první pohled, upřímně řečeno, to by mohlo vypadat ohromující a jako něco, 476 00:22:14,990 --> 00:22:17,060 neexistuje žádný způsob, jak byste mohli mít přijít s na kvíz. 477 00:22:17,060 --> 00:22:22,450 Ale pokud se zaměříme na jednotlivé kroky, Doufejme, že to najednou 478 00:22:22,450 --> 00:22:26,060 Připadá vám, že každý z těchto jednotlivých kroky je zřejmý smysl 479 00:22:26,060 --> 00:22:27,080 ve zpětném pohledu. 480 00:22:27,080 --> 00:22:28,200 Takže pojďme se podívat. 481 00:22:28,200 --> 00:22:32,570 >> Tak za prvé, my inicializovat ukazatel být seznam sám. 482 00:22:32,570 --> 00:22:36,040 Protože chci lineární čas, to znamená Budu mít nějaké smyčky. 483 00:22:36,040 --> 00:22:39,730 A obyčejný způsob, jak iterovat přes uzly ve struktuře seznamu nebo jakékoliv 484 00:22:39,730 --> 00:22:43,860 struktury iterativně je, aby se ukazatel na přední části dat 485 00:22:43,860 --> 00:22:46,990 struktura a pak jen spustit aktualizaci to a jít svou cestou 486 00:22:46,990 --> 00:22:48,650 prostřednictvím datové struktury. 487 00:22:48,650 --> 00:22:50,040 Takže budu dělat přesně to. 488 00:22:50,040 --> 00:22:54,260 >> Zatímco ukazatel, můj dočasné proměnné, není rovno null, pojďme 489 00:22:54,260 --> 00:22:55,660 jděte do toho a zkontrolovat. 490 00:22:55,660 --> 00:22:56,910 Měl jsem štěstí? 491 00:22:56,910 --> 00:23:01,740 Je n pole v uzlu jsem v současné době při pohledu na rovný 492 00:23:01,740 --> 00:23:03,380 číslo jsem hledal? 493 00:23:03,380 --> 00:23:05,410 A pokud ano, pojďme něco udělat. 494 00:23:05,410 --> 00:23:10,020 Teď, všimněte si to, pokud podmínka obklopuje celý 495 00:23:10,020 --> 00:23:11,520 Následující řádky kódu. 496 00:23:11,520 --> 00:23:14,610 To je jediné, co mě zajímá - najít číslo v otázce. 497 00:23:14,610 --> 00:23:18,010 Takže neexistuje žádný jiný, který zjednodušuje věci koncepčně trochu. 498 00:23:18,010 --> 00:23:22,040 >> Ale teď jsem si uvědomil, a můžete mít jen si to uvědomil po myšlení 499 00:23:22,040 --> 00:23:24,720 je to přes trochu, je tu vlastně dvě případů zde. 500 00:23:24,720 --> 00:23:28,060 Jedním z nich je, pokud je uzel v začátku seznamu, který je 501 00:23:28,060 --> 00:23:31,040 trochu nepříjemné, protože to je zvláštní případ, protože se budete muset vypořádat 502 00:23:31,040 --> 00:23:33,340 s tou věcí, která je pouze anomálie. 503 00:23:33,340 --> 00:23:35,720 Všude jinde v seznamu, je to totéž. 504 00:23:35,720 --> 00:23:38,050 K dispozici je předchozí uzel a další uzel, uzel předchozí, další uzel. 505 00:23:38,050 --> 00:23:40,940 Ale ten chlap je trochu zvláštní v případě, že je na začátku. 506 00:23:40,940 --> 00:23:48,710 >> Takže v případě, že ukazatel se rovná seznam sama o sobě, takže když jsem na začátku roku 507 00:23:48,710 --> 00:23:53,960 seznam a našel jsem n, musím udělat pár věcí. 508 00:23:53,960 --> 00:23:59,230 Za prvé, musím do seznamu změnit poukazují na další pole, 50 let. 509 00:23:59,230 --> 00:24:01,270 Takže předpokládám, že se snažím odebrat 34. 510 00:24:01,270 --> 00:24:03,560 Takže ten chlap musí jít pryč jen chvíli. 511 00:24:03,560 --> 00:24:07,210 >> Takže jsem chtěl říct, seznam dostane ukazatel další. 512 00:24:07,210 --> 00:24:08,570 No, to je ukazatel. 513 00:24:08,570 --> 00:24:10,360 Dále se ukazuje sem. 514 00:24:10,360 --> 00:24:17,470 Tak to se mění na tuto šipku vpravo nyní poukázat na toho chlapa tady. 515 00:24:17,470 --> 00:24:19,580 Nyní, pamatujte, že máme dočasné proměnné. 516 00:24:19,580 --> 00:24:23,520 Takže jsme se osiřelé všechny uzly, protože jsem také toho chlapa v mém 517 00:24:23,520 --> 00:24:25,010 realizace remove. 518 00:24:25,010 --> 00:24:29,600 Takže teď, pokud seznam sám o sobě není null, Musím opravit něco. 519 00:24:29,600 --> 00:24:32,690 >> Musím se ujistit, že tato šipka, který je již ukazuje 520 00:24:32,690 --> 00:24:36,830 50 až 34, to má jít pryč, protože když se snažím zbavit 521 00:24:36,830 --> 00:24:41,910 z 34, 50 měl lepší ponechat v platnosti veškerá druh zpět odkaz na to, jak 522 00:24:41,910 --> 00:24:42,820 arrow navrhl. 523 00:24:42,820 --> 00:24:44,820 Tak jsem to udělal čáru. 524 00:24:44,820 --> 00:24:46,520 Tak jsem udělal. 525 00:24:46,520 --> 00:24:48,040 Tento případ je vlastně docela snadné. 526 00:24:48,040 --> 00:24:51,010 Odsekne hlavu seznamu je poměrně jednoduché. 527 00:24:51,010 --> 00:24:52,980 >> Bohužel, tam je to nepříjemné jiný blok. 528 00:24:52,980 --> 00:24:56,170 Takže teď, musím vzít v úvahu případ tam, kde je něco uprostřed. 529 00:24:56,170 --> 00:24:59,880 Ale není to příliš hrozné, s výjimkou pro syntaxi jako je tato. 530 00:24:59,880 --> 00:25:03,080 Takže pokud nejsem na začátku roku Seznam, jsem někde uprostřed. 531 00:25:03,080 --> 00:25:08,160 A tento řádek je zde říká, začátek na co uzlu jste na. 532 00:25:08,160 --> 00:25:11,210 533 00:25:11,210 --> 00:25:18,550 Přejít na další pole z předchozího uzlu a ukazují, že na ukazatel. 534 00:25:18,550 --> 00:25:20,390 >> Pojďme to obrazně. 535 00:25:20,390 --> 00:25:21,640 To bylo stále složitější. 536 00:25:21,640 --> 00:25:30,480 537 00:25:30,480 --> 00:25:37,990 Takže pokud mám předchozí pole zde - pojďme na to - další pole zde. 538 00:25:37,990 --> 00:25:41,200 Chystám se zjednodušit své ukazatele, spíše než kreslit spoustu 539 00:25:41,200 --> 00:25:45,710 věci tam a zpět brázdí navzájem. 540 00:25:45,710 --> 00:25:50,870 A teď, řekněme, že je to 1, 2, 3 kvůli diskusi, a to i 541 00:25:50,870 --> 00:25:53,410 i když to není vyrovnaná se problém se jedná. 542 00:25:53,410 --> 00:25:55,900 >> Takže tady je moje spojový seznam. 543 00:25:55,900 --> 00:25:59,300 Snažím se odstranit dva v tomto zejména verze příběhu. 544 00:25:59,300 --> 00:26:01,960 Takže jsem aktualizováno ukazatel se ukázal na toho chlapa. 545 00:26:01,960 --> 00:26:03,315 Tak tohle je PTR. 546 00:26:03,315 --> 00:26:04,530 On ukázal zde. 547 00:26:04,530 --> 00:26:07,170 Toto je seznam, který existuje na celém světě jako předtím. 548 00:26:07,170 --> 00:26:09,200 A on ukázal tu bez ohledu na to, co. 549 00:26:09,200 --> 00:26:10,800 A teď se snažím odstranit dva. 550 00:26:10,800 --> 00:26:13,850 >> Takže pokud je ukazatel ukazuje zde, jsem bude následovat, zdá se, 551 00:26:13,850 --> 00:26:17,110 předchozí ukazatel, který mi dává na 1. 552 00:26:17,110 --> 00:26:22,290 Já jsem pak chtěl říct, že příští pole, což mě přivádí na to 553 00:26:22,290 --> 00:26:25,410 box tady, bude rovná ukazatel další. 554 00:26:25,410 --> 00:26:28,400 Takže pokud tento ukazatel, je to hned vedle. 555 00:26:28,400 --> 00:26:31,840 To znamená, že to musí šipka poukázat na toho chlapa. 556 00:26:31,840 --> 00:26:35,140 >> Tak co, že řádek kódu má jen udělat, je trochu z toho. 557 00:26:35,140 --> 00:26:37,500 A teď to vypadá, jako krok správným směrem. 558 00:26:37,500 --> 00:26:41,390 V podstatě Chceme odstřihnout 2 out do středu 1 a 3. 559 00:26:41,390 --> 00:26:44,400 Takže je logické, že chceme trasy tohoto ukazatele kolem něj. 560 00:26:44,400 --> 00:26:50,400 Takže to další řádek je kontrola, zda ukazatel další není null, je tu 561 00:26:50,400 --> 00:26:54,200 opravdu někdo na pravé straně 2, to znamená, že musíme také udělat 562 00:26:54,200 --> 00:26:55,850 trochu odstřihnout zde. 563 00:26:55,850 --> 00:27:00,590 >> Takže teď je třeba dodržovat tento ukazatel a aktualizovat předchozí ukazatel na 564 00:27:00,590 --> 00:27:05,410 ten chlap udělat trochu obejít zde bod zde. 565 00:27:05,410 --> 00:27:07,100 A teď, vizuálně je to pěkné. 566 00:27:07,100 --> 00:27:11,930 Je to trochu chaotický v tom, že tam je nikdo ukázal na 2 už. 567 00:27:11,930 --> 00:27:13,600 2 ukazuje doleva. 568 00:27:13,600 --> 00:27:14,980 A 2 se ukazuje na pravé straně. 569 00:27:14,980 --> 00:27:17,480 Ale on může dělat, co chce, protože je to asi, aby se osvobodil. 570 00:27:17,480 --> 00:27:19,480 A nezáleží na tom, co tyto hodnoty jsou už. 571 00:27:19,480 --> 00:27:23,040 >> Co je důležité je, že zbývající kluci jsou směrování výše 572 00:27:23,040 --> 00:27:24,280 a pod ním teď. 573 00:27:24,280 --> 00:27:25,810 A vskutku, to je to, co dělat dál. 574 00:27:25,810 --> 00:27:29,360 Jsme bez ukazatel, což znamená, řekneme operační systém, jste vítáni 575 00:27:29,360 --> 00:27:30,906 kultivovat to. 576 00:27:30,906 --> 00:27:34,900 A pak se konečně vrátíme. 577 00:27:34,900 --> 00:27:37,220 Else implicitně, pokud se se ještě nevrátil, 578 00:27:37,220 --> 00:27:38,290 musíme hledat dál. 579 00:27:38,290 --> 00:27:41,485 Takže ukazatel se rovná ukazatel vedle právě znamená pohybovat toho chlapa tady. 580 00:27:41,485 --> 00:27:42,600 Přesunout toho chlapa tady. 581 00:27:42,600 --> 00:27:45,400 Přesunout toho chlapa tady, jestli ve skutečnosti, jsme nenašli číslo 582 00:27:45,400 --> 00:27:46,960 hledáme ještě. 583 00:27:46,960 --> 00:27:49,630 >> Takže upřímně řečeno, vypadá to naprosto ohromující, myslím, že na první pohled 584 00:27:49,630 --> 00:27:52,180 pohled, a to zejména pokud jste se snažil s tím během testu pak zjistit, 585 00:27:52,180 --> 00:27:52,850 něco takového. 586 00:27:52,850 --> 00:27:55,050 A ty pat si na záda. 587 00:27:55,050 --> 00:27:57,080 No, neexistuje způsob, jak bych mohl mít přijít s tím na kvíz. 588 00:27:57,080 --> 00:28:00,470 Ale řekl bych, můžete, pokud porušíte že se do nich jednotlivé 589 00:28:00,470 --> 00:28:04,400 případech a pouze pěšky přes něj opatrně, i když, pravda, pod 590 00:28:04,400 --> 00:28:06,300 stresující situace. 591 00:28:06,300 --> 00:28:09,470 >> Naštěstí, vyrobený obrázek vše šťastnější. 592 00:28:09,470 --> 00:28:11,050 Ty by mohly čerpat na tuto libovolný počet způsobů. 593 00:28:11,050 --> 00:28:12,760 Nemusíte dělat křížem krážem věc zde. 594 00:28:12,760 --> 00:28:14,520 Dalo by se to udělat s rovnou linky, jako je tento. 595 00:28:14,520 --> 00:28:18,790 Ale podstata tohoto problému, v Obecně platí, že bylo si uvědomit, že 596 00:28:18,790 --> 00:28:22,060 obrázek na konci by mělo vypadat trochu něco takového, protože 597 00:28:22,060 --> 00:28:25,030 konstantní čas znamenal, že budete mít rušení a rušení a rušení 598 00:28:25,030 --> 00:28:29,900 nové uzly na začátku seznamu. 599 00:28:29,900 --> 00:28:31,960 Jakékoliv dotazy? 600 00:28:31,960 --> 00:28:34,565 Asi nejnáročnější jistě kódování otázky. 601 00:28:34,565 --> 00:28:37,690 >> DIVÁKŮ: Takže je seznam podobný hlavu v předchozích příkladech. 602 00:28:37,690 --> 00:28:39,640 >> DAVID J. Malan: Přesně tak, přesně tak. 603 00:28:39,640 --> 00:28:43,130 Jen jiný název pro globální proměnná. 604 00:28:43,130 --> 00:28:44,380 Na celém světě, co? 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 Takže to je ten, kde se musel napsat odstavec. 608 00:28:52,020 --> 00:28:56,060 Někteří lidé psali eseje na tuto otázku. 609 00:28:56,060 --> 00:29:00,230 Ale stačí použít těchto šest termíny popsat, co se stane, když 610 00:29:00,230 --> 00:29:02,440 zkuste kontaktovat facebook.com. 611 00:29:02,440 --> 00:29:07,930 Tak jsem si jen promluvit prostřednictvím procesu s využitím všech těchto podmínek. 612 00:29:07,930 --> 00:29:11,290 Takže v našem prohlížeči, napíšeme facebook.com a stiskněte klávesu Enter. 613 00:29:11,290 --> 00:29:17,280 Takže náš prohlížeč se děje na výstavbu HTTP požadovat, že to bude posílat 614 00:29:17,280 --> 00:29:22,220 prostřednictvím nějakého procesu na Facebook pro Facebook reagovat na nás s 615 00:29:22,220 --> 00:29:24,450 HTML své stránky. 616 00:29:24,450 --> 00:29:28,800 >> Takže to, co je proces který požadavek HTTP 617 00:29:28,800 --> 00:29:30,730 skutečně dostane na Facebook? 618 00:29:30,730 --> 00:29:32,790 Takže nejprve musíme překládat Facebook.com. 619 00:29:32,790 --> 00:29:38,780 Tak právě dal název Facebook.com, kde vlastně dělá HTTP požadavku 620 00:29:38,780 --> 00:29:39,940 je třeba jít? 621 00:29:39,940 --> 00:29:44,120 Takže musíme přeložit Facebook.com na IP adresu, která jednoznačně 622 00:29:44,120 --> 00:29:47,620 určuje, co stroj vlastně chcete poslat tuto žádost. 623 00:29:47,620 --> 00:29:49,310 Váš notebook má IP adresu. 624 00:29:49,310 --> 00:29:52,240 Cokoliv, připojení k internetu má IP adresu. 625 00:29:52,240 --> 00:29:59,030 >> Takže DNS, Domain Name System, která je co se děje zvládnout překlad 626 00:29:59,030 --> 00:30:03,750 od facebook.com na IP adresu, která vlastně chcete kontaktovat. 627 00:30:03,750 --> 00:30:08,075 Tak jsme se kontaktovat DNS servery a řekněme, co je facebook.com? 628 00:30:08,075 --> 00:30:16,560 To říká, oh, to je IP adresa 190,212 něco, něco, něco. 629 00:30:16,560 --> 00:30:16,900 Dobrá. 630 00:30:16,900 --> 00:30:18,850 Teď vím, co stroj Chci kontaktovat. 631 00:30:18,850 --> 00:30:22,360 >> Takže pak pošlete svůj požadavek HTTP se k tomuto zařízení. 632 00:30:22,360 --> 00:30:24,140 Tak jak to dostat do toho stroje? 633 00:30:24,140 --> 00:30:27,200 No, žádost jde od na routeru odrážení. 634 00:30:27,200 --> 00:30:32,630 Vzpomeňte si na příklad ve třídě, kde jsme vlastně viděli cestu, která 635 00:30:32,630 --> 00:30:35,340 pakety se, když jsme se snažili komunikovat. 636 00:30:35,340 --> 00:30:38,460 Viděli jsme, že skok přes Atlantik Ocean na jednom místě, nebo cokoliv jiného. 637 00:30:38,460 --> 00:30:42,820 >> Takže poslední termín portu. 638 00:30:42,820 --> 00:30:46,520 Tak to je nyní na vašem počítači. 639 00:30:46,520 --> 00:30:49,970 Můžete mít více věcí v současné době komunikaci s internetem. 640 00:30:49,970 --> 00:30:53,730 Takže můžu být spuštěn, řekněme, Skype. 641 00:30:53,730 --> 00:30:55,670 Mohl bych mít webový prohlížeč otevřený. 642 00:30:55,670 --> 00:30:59,010 Možná jsem něco, co torrenting soubory. 643 00:30:59,010 --> 00:31:00,880 Takže všechny tyto věci jsou komunikaci s 644 00:31:00,880 --> 00:31:02,600 internet nějakým způsobem. 645 00:31:02,600 --> 00:31:08,070 >> Takže když váš počítač přijme nějaká data z internetu, jak se to 646 00:31:08,070 --> 00:31:10,130 vědět, co vlastně aplikace chce údaje? 647 00:31:10,130 --> 00:31:12,610 Jak to, zda tento konkrétní Data jsou určena pro 648 00:31:12,610 --> 00:31:16,070 torrenting aplikace na rozdíl od na webovém prohlížeči? 649 00:31:16,070 --> 00:31:20,980 Takže to je účel portů v tom, že Všechny tyto aplikace mají 650 00:31:20,980 --> 00:31:22,720 prohlásil port na vašem počítači. 651 00:31:22,720 --> 00:31:27,580 Takže váš webový prohlížeč říká, hej, Poslouchám na portu 1000. 652 00:31:27,580 --> 00:31:32,240 A váš torrenting programu říká, Poslouchám na portu 3000. 653 00:31:32,240 --> 00:31:34,770 A Skype říká, jsem pomocí portu 4000. 654 00:31:34,770 --> 00:31:41,950 >> Takže když vám některá data, která patří do jedné z těchto aplikací, dat 655 00:31:41,950 --> 00:31:45,510 je označen port, který je ve skutečnosti by měly být zaslány spolu se. 656 00:31:45,510 --> 00:31:47,950 Tak to říká, oh, já patřím na portu 1000. 657 00:31:47,950 --> 00:31:50,950 Vím, že pak musím, aby předal toto po mé webovém prohlížeči. 658 00:31:50,950 --> 00:31:56,440 Takže důvod, proč je to relevantní je, že webové servery mají tendenci 659 00:31:56,440 --> 00:31:58,240 naslouchat na portu 80. 660 00:31:58,240 --> 00:32:02,420 Takže když jsem se kontaktovat Facebook.com, jsem komunikaci s nějakým strojem. 661 00:32:02,420 --> 00:32:06,390 Ale musím říci, jaký port, který Stroj chci komunikovat. 662 00:32:06,390 --> 00:32:09,160 A webové servery mají tendenci být naslouchá na portu 80. 663 00:32:09,160 --> 00:32:14,010 >> Kdyby chtěli, mohli by ho nastavit tak, že uvádí jako na portu 7000. 664 00:32:14,010 --> 00:32:19,090 A pak ve webovém prohlížeči, mohl bych ručně zadat Facebook.com: 7000 k 665 00:32:19,090 --> 00:32:24,600 poslat požadavek na portu 7000 webového serveru Facebooku. 666 00:32:24,600 --> 00:32:26,820 >> DAVID J. Malan: A v tomto případě, a to i i když jsme neměli požadovat, aby lidé 667 00:32:26,820 --> 00:32:30,000 zmínit to, v tomto případě, jaký port by žádost skutečně jít na? 668 00:32:30,000 --> 00:32:36,630 669 00:32:36,630 --> 00:32:37,880 Zkuste to znovu. 670 00:32:37,880 --> 00:32:42,810 671 00:32:42,810 --> 00:32:44,300 Přesně tak. 672 00:32:44,300 --> 00:32:47,960 Nehledám, ale jemnost že tam nic jako poslední. 673 00:32:47,960 --> 00:32:51,770 >> ROB BOWDEN: Tak HTTPS, protože je to speciálně pro poslech 674 00:32:51,770 --> 00:32:55,180 zašifrované, je to na portu 4430. 675 00:32:55,180 --> 00:32:57,680 >> Diváků: A e-maily jsou 25, že jo? 676 00:32:57,680 --> 00:33:00,670 >> DAVID J. Malan: Odchozí e-maily, 25, jo. 677 00:33:00,670 --> 00:33:03,760 >> ROB BOWDEN: Já ani nevím, většina - všechny ty nižší bývají 678 00:33:03,760 --> 00:33:06,310 vyhrazeno pro věci. 679 00:33:06,310 --> 00:33:09,260 Myslím, že všechno pod 1024 je vyhrazeno. 680 00:33:09,260 --> 00:33:13,450 >> DIVÁKŮ: Proč říkáte, 3. Byl špatné číslo? 681 00:33:13,450 --> 00:33:18,820 >> ROB BOWDEN: Protože IP adresy, tam čtyři seskupení číslic. 682 00:33:18,820 --> 00:33:21,090 A oni jsou od 0 do 255.. 683 00:33:21,090 --> 00:33:28,060 Takže 192.168.2.1 je společný lokální sítě IP adresy. 684 00:33:28,060 --> 00:33:30,840 Všimněte si, všechny z nich jsou menší než 255.. 685 00:33:30,840 --> 00:33:33,570 Takže když jsem začal s 300, že nemohl mít 686 00:33:33,570 --> 00:33:35,210 jedním z čísel. 687 00:33:35,210 --> 00:33:38,170 >> DAVID J. Malan: Ale to hloupé klip od - byl to CSI, kde měli 688 00:33:38,170 --> 00:33:39,970 číslo, které je příliš velké pro IP adresu. 689 00:33:39,970 --> 00:33:42,940 690 00:33:42,940 --> 00:33:46,110 >> ROB BOWDEN: Případné dotazy na to? 691 00:33:46,110 --> 00:33:51,710 Příští, takže úplná změna téma, ale máme to PHP pole pro 692 00:33:51,710 --> 00:33:53,270 domy na čtyřkolce. 693 00:33:53,270 --> 00:33:56,360 A máme neuspořádané seznam. 694 00:33:56,360 --> 00:33:59,550 A chceme vytisknout každé položky seznamu Jen obsahující název domu. 695 00:33:59,550 --> 00:34:09,090 696 00:34:09,090 --> 00:34:11,870 Takže máme smyčky foreach. 697 00:34:11,870 --> 00:34:17,540 Takže pamatujte, že syntaxe je foreach pole jako položka v poli. 698 00:34:17,540 --> 00:34:22,360 Takže prostřednictvím každé opakování smyčky, Dům bude trvat na jedné z 699 00:34:22,360 --> 00:34:24,060 hodnoty uvnitř tohoto pole. 700 00:34:24,060 --> 00:34:26,530 >> Na první iterace, dům bude Cabot dům. 701 00:34:26,530 --> 00:34:30,370 Na druhé iterace, dům bude být Courier dům a tak dále. 702 00:34:30,370 --> 00:34:34,370 Takže pro každou čtveřici jako dům, jsme jen jít do tisku - 703 00:34:34,370 --> 00:34:37,250 jste také mohli ozvěnou - 704 00:34:37,250 --> 00:34:42,199 položku seznamu a pak název domu je a zavřete položku seznamu. 705 00:34:42,199 --> 00:34:45,210 Složené závorky jsou zde volitelná. 706 00:34:45,210 --> 00:34:49,480 >> A pak jsme také řekl v otázce sama o sobě, nezapomeňte zavřít 707 00:34:49,480 --> 00:34:50,770 Jednoduchý seznam zobrazí značka. 708 00:34:50,770 --> 00:34:53,949 Takže musíme opustit režim PHP aby se to udělat. 709 00:34:53,949 --> 00:35:00,280 Nebo bychom mohli ozvěnou zavřít neuspořádaný seznam tag. 710 00:35:00,280 --> 00:35:02,380 >> DAVID J. Malan: Také zde by pokuta byli použít starou školu 711 00:35:02,380 --> 00:35:07,340 smyčka s $ i = 0 0 a použitím se počítá na zjistit délku paprsku. 712 00:35:07,340 --> 00:35:09,240 Taky úplně v pohodě, jen trochu wordier. 713 00:35:09,240 --> 00:35:12,170 714 00:35:12,170 --> 00:35:14,742 >> DIVÁKŮ: Takže pokud jste se chystali [Neslyšitelné], by vy - 715 00:35:14,742 --> 00:35:16,734 Já zapomněl, co smyčka [neslyšitelné] je. 716 00:35:16,734 --> 00:35:21,380 Chtěli byste $ quad držák i? 717 00:35:21,380 --> 00:35:21,850 >> DAVID J. Malan: Přesně tak. 718 00:35:21,850 --> 00:35:23,100 Jo, přesně tak. 719 00:35:23,100 --> 00:35:26,650 720 00:35:26,650 --> 00:35:27,900 >> ROB BOWDEN: Ještě něco? 721 00:35:27,900 --> 00:35:31,350 722 00:35:31,350 --> 00:35:32,010 >> DAVID J. Malan: Dobře. 723 00:35:32,010 --> 00:35:32,300 Trade-off. 724 00:35:32,300 --> 00:35:38,290 Takže tam byly hrozny odpovědí možné, pro každou z nich. 725 00:35:38,290 --> 00:35:40,510 Byli jsme opravdu jen hledáte něco přesvědčivé pro vzhůru a 726 00:35:40,510 --> 00:35:41,100 nevýhoda. 727 00:35:41,100 --> 00:35:44,830 A číslo 16 zeptal, ověřování uživatelů " Vstup na straně klienta, jako u JavaScriptu, 728 00:35:44,830 --> 00:35:47,280 místo na straně serveru, jako u PHP. 729 00:35:47,280 --> 00:35:49,450 Takže to, co je vzhůru z dělá na straně klienta? 730 00:35:49,450 --> 00:35:53,780 >> No, jedna z věcí, které jsme navrhli, je že snížit latenci, protože vám 731 00:35:53,780 --> 00:35:56,750 Nemusíte se obtěžovat kontaktování Server, který může trvat několik 732 00:35:56,750 --> 00:36:00,390 milisekund nebo dokonce pár sekund vyloučením, že i jen 733 00:36:00,390 --> 00:36:04,670 ověřování vstupu na straně klienta uživatelů tím, spuštění obslužné rutiny on-předložit a 734 00:36:04,670 --> 00:36:06,650 jen kontrolovat, se jim napište něco pro jméno? 735 00:36:06,650 --> 00:36:08,080 Líbilo se jim něco psát in pro e-mailovou adresu? 736 00:36:08,080 --> 00:36:10,950 Líbilo se vybrat kolej z Rozevírací nabídka? 737 00:36:10,950 --> 00:36:14,360 >> Můžete jim dát okamžitou zpětnou vazbu pomocí počítače gigahertz 738 00:36:14,360 --> 00:36:16,770 nebo co mají, že je vlastně na svém stole. 739 00:36:16,770 --> 00:36:19,310 Takže je to jen lepší uživatelské zažít obvykle. 740 00:36:19,310 --> 00:36:24,460 Ale Nevýhodou dělá na straně klienta ověření, pokud si to bez toho, 741 00:36:24,460 --> 00:36:29,860 dělá server-side validaci je, že Nejvíce někdo přichází z CS50 ví 742 00:36:29,860 --> 00:36:33,980 že můžete jen odesílat data, která chcete na serveru libovolný počet způsobů. 743 00:36:33,980 --> 00:36:37,030 Upřímně řečeno, ve většině libovolném prohlížeči, můžete klikněte kolem v nastavení a jen 744 00:36:37,030 --> 00:36:40,110 vypnout JavaScript, která by proto, zakázat jakoukoli formu 745 00:36:40,110 --> 00:36:41,080 validace. 746 00:36:41,080 --> 00:36:44,460 >> Ale vy jste také mohli připomenout, že i já dělal nějaké tajemné věci ve třídě pomocí 747 00:36:44,460 --> 00:36:47,790 telnet a dokonce předstírá, že bude prohlížeč zasláním get 748 00:36:47,790 --> 00:36:49,240 požadavky na server. 749 00:36:49,240 --> 00:36:51,030 A to rozhodně není pomocí libovolného JavaScript. 750 00:36:51,030 --> 00:36:53,290 To je jen můj zadáním příkazů na klávesnici. 751 00:36:53,290 --> 00:36:57,410 Takže opravdu, každý programátor v dostatečně komfort s webem a HTTP 752 00:36:57,410 --> 00:37:01,690 mohl poslat co dat on nebo ona chce k serveru bez ověření. 753 00:37:01,690 --> 00:37:05,470 A pokud váš server není také kontrola, to se mi dát jméno, je 754 00:37:05,470 --> 00:37:08,930 to vlastně platnou e-mailovou adresu, dělal si vyberou koleji, můžete skončit 755 00:37:08,930 --> 00:37:12,800 nahoru vkládání falešné, nebo jen prázdné údaje do databáze, což pravděpodobně 756 00:37:12,800 --> 00:37:15,450 se nebude dobrá věc, pokud jste za předpokladu, že tam byl. 757 00:37:15,450 --> 00:37:16,770 >> Tak to je nepříjemné reality. 758 00:37:16,770 --> 00:37:19,890 Ale obecně, na straně klienta validace je skvělá. 759 00:37:19,890 --> 00:37:21,810 Ale to znamená, že dvakrát tolik práce. 760 00:37:21,810 --> 00:37:25,970 Ačkoli tam přece existují různé knihovny, JavaScript knihovny pro 761 00:37:25,970 --> 00:37:28,830 instance, které tvoří tolik, mnohem menší bolesti hlavy. 762 00:37:28,830 --> 00:37:31,940 A můžete znovu použít některé z kódu server-side, na straně klienta. 763 00:37:31,940 --> 00:37:35,980 Ale uvědomit, že to je typicky další práce. 764 00:37:35,980 --> 00:37:36,415 Jo. 765 00:37:36,415 --> 00:37:37,792 >> DIVÁKŮ: Takže kdybychom řekl méně bezpečné - 766 00:37:37,792 --> 00:37:39,205 >> DAVID J. Malan: [směje se] 767 00:37:39,205 --> 00:37:39,680 Fuj. 768 00:37:39,680 --> 00:37:43,105 Ti jsou vždy těžší ty se rozhodnout. 769 00:37:43,105 --> 00:37:44,480 >> ROB BOWDEN: To by byly přijaty. 770 00:37:44,480 --> 00:37:44,810 >> DAVID J. Malan: Co? 771 00:37:44,810 --> 00:37:45,810 >> ROB BOWDEN: Vytvořil jsem tento problém. 772 00:37:45,810 --> 00:37:46,735 To by byly přijaty. 773 00:37:46,735 --> 00:37:47,220 >> DAVID J. Malan: Jo. 774 00:37:47,220 --> 00:37:47,830 >> DIVÁKŮ: Cool. 775 00:37:47,830 --> 00:37:51,770 >> ROB BOWDEN: Ale my jsme nepřijali pro první - 776 00:37:51,770 --> 00:37:53,630 dobře, to, co jsme hledali, je něco jako vy nemusíte 777 00:37:53,630 --> 00:37:55,270 komunikaci se serverem. 778 00:37:55,270 --> 00:37:58,355 Nepřijali jsme prostě rychlejší. 779 00:37:58,355 --> 00:38:00,080 >> DIVÁKŮ: Co ne znovu načíst stránku? 780 00:38:00,080 --> 00:38:00,430 >> ROB BOWDEN: Ano. 781 00:38:00,430 --> 00:38:03,000 To byla přijata odpověď. 782 00:38:03,000 --> 00:38:06,300 >> DAVID J. Malan: Cokoliv, kde jsme cítili, to bylo více pravděpodobné než nepravděpodobné, 783 00:38:06,300 --> 00:38:09,780 že jste věděl, že to, co bylo říká, což je těžké 784 00:38:09,780 --> 00:38:13,500 vedení k tomu někdy. 785 00:38:13,500 --> 00:38:16,000 Místo pomocí propojeného seznamu z pole k udržení 786 00:38:16,000 --> 00:38:17,590 řazeny seznam celých čísel. 787 00:38:17,590 --> 00:38:21,000 Takže vzhůru se často citují se spojené seznamy, které motivovaly jejich celek 788 00:38:21,000 --> 00:38:22,370 úvod byl dostanete dynamiku. 789 00:38:22,370 --> 00:38:23,030 Mohou dorůst. 790 00:38:23,030 --> 00:38:23,950 Mohou zmenšit. 791 00:38:23,950 --> 00:38:27,370 Takže nemusíte se proskočit obručí skutečně vytvořit více paměti 792 00:38:27,370 --> 00:38:28,140 s řadou. 793 00:38:28,140 --> 00:38:30,310 Nebo nemusíte jen říci, je mi líto, uživatel. 794 00:38:30,310 --> 00:38:31,410 Pole je vyplněno. 795 00:38:31,410 --> 00:38:35,850 Takže dynamický růst seznamu. 796 00:38:35,850 --> 00:38:37,210 Nevýhodou však spojových seznamů? 797 00:38:37,210 --> 00:38:40,916 798 00:38:40,916 --> 00:38:43,356 >> DIVÁKŮ: Je to lineární. 799 00:38:43,356 --> 00:38:45,800 Vyhledávání na Google seznamu je lineární místo toho, co se přihlásíte 800 00:38:45,800 --> 00:38:46,360 >> DAVID J. Malan: Přesně tak. 801 00:38:46,360 --> 00:38:50,160 Vyhledávání na Google seznamu je lineární, i když je to dále, protože můžete 802 00:38:50,160 --> 00:38:53,170 jen postupujte podle následujících strouhanky, tyto ukazatele, od začátku seznamu 803 00:38:53,170 --> 00:38:53,570 až do konce. 804 00:38:53,570 --> 00:38:57,970 Nemůžete využít náhodný přístup a, tak, binární vyhledávání, i když je to 805 00:38:57,970 --> 00:39:00,740 dále, že byste mohli co dělat s matici. 806 00:39:00,740 --> 00:39:02,390 A je tu i další náklady. 807 00:39:02,390 --> 00:39:02,966 Jo. 808 00:39:02,966 --> 00:39:03,800 >> DIVÁKŮ: Memory neefektivní? 809 00:39:03,800 --> 00:39:04,130 >> DAVID J. Malan: Jo. 810 00:39:04,130 --> 00:39:06,940 No, já bych to nutně říkají neefektivní. 811 00:39:06,940 --> 00:39:10,110 Ale to stát více paměti, protože budete potřebovat 32 bitů pro každý 812 00:39:10,110 --> 00:39:13,400 uzel pro další ukazatele, na alespoň pro jednotlivě propojeného seznamu. 813 00:39:13,400 --> 00:39:16,660 Nyní, když jste jen ukládání celých čísel a přidáváte ukazatel, který je 814 00:39:16,660 --> 00:39:17,830 ve skutečnosti druh non-triviální. 815 00:39:17,830 --> 00:39:19,340 Je to zdvojnásobení množství paměti. 816 00:39:19,340 --> 00:39:22,330 Ale ve skutečnosti, pokud jste ukládání spojový seznam struktur, které by mohly mít 817 00:39:22,330 --> 00:39:25,540 8 bajtů, 16 bajtů, ještě než to, že je to možná méně 818 00:39:25,540 --> 00:39:26,500 z mezní náklady. 819 00:39:26,500 --> 00:39:28,320 Ale je to nákladově nicméně. 820 00:39:28,320 --> 00:39:31,880 Takže jeden z těch by si Byl v pořádku, stinné stránky. 821 00:39:31,880 --> 00:39:32,110 >> 18. 822 00:39:32,110 --> 00:39:36,100 Použití PHP namísto C psát příkazového řádku programu. 823 00:39:36,100 --> 00:39:41,890 Tak tady je to často rychlejší použít jazyk, jako je PHP nebo Ruby nebo Python. 824 00:39:41,890 --> 00:39:43,700 Prostě rychle otevřít do textového editoru. 825 00:39:43,700 --> 00:39:45,900 Máte mnoho dalších funkcí Vám k dispozici. 826 00:39:45,900 --> 00:39:49,325 PHP má kuchyňský dřez funkcí, zatímco v C, je 827 00:39:49,325 --> 00:39:50,420 mají velmi, velmi málo. 828 00:39:50,420 --> 00:39:53,820 Ve skutečnosti, kluci vědí tvrdě že nemáte hash tabulky. 829 00:39:53,820 --> 00:39:55,000 Nemáte spojeny seznamy. 830 00:39:55,000 --> 00:39:57,470 Chcete-li ti, musíte jim realizovat sami. 831 00:39:57,470 --> 00:40:00,950 >> Takže jeden vzhůru PHP nebo opravdu nějaký interpretovaný jazyk je rychlost 832 00:40:00,950 --> 00:40:02,920 pomocí kterého můžete psát kód. 833 00:40:02,920 --> 00:40:06,660 Ale nevýhoda, viděl jsme se, když jsem rychle se šlehačkou a misspeller 834 00:40:06,660 --> 00:40:11,780 implementace v přednášce pomocí PHP, je že použití interpretovaný jazyk 835 00:40:11,780 --> 00:40:13,570 je obvykle pomalejší. 836 00:40:13,570 --> 00:40:18,420 A my jsme viděli, že prokazatelně se zvýšení v době od 0,3 sekund až 3 837 00:40:18,420 --> 00:40:24,440 sekund, a to z důvodu výkladu že ve skutečnosti děje. 838 00:40:24,440 --> 00:40:27,060 >> Dalším dnem bylo to, že vám nemusíte kompilovat. 839 00:40:27,060 --> 00:40:30,130 Tak to také urychluje vývoj mimochodem, protože nemáte 840 00:40:30,130 --> 00:40:31,360 dva kroky k běhu programu. 841 00:40:31,360 --> 00:40:32,140 Stačí mít jeden. 842 00:40:32,140 --> 00:40:35,260 A tak to je docela přesvědčivé stejně. 843 00:40:35,260 --> 00:40:38,450 Namísto použití SQL databáze CSV soubor pro ukládání dat. 844 00:40:38,450 --> 00:40:40,230 Tak SQL databáze se používá pro pset7. 845 00:40:40,230 --> 00:40:42,060 Soubory CSV jste nepoužili moc. 846 00:40:42,060 --> 00:40:45,960 Ale vy jste ji použil nepřímo pset7 jako i tím, že mluví do Yahoo Finance. 847 00:40:45,960 --> 00:40:49,330 >> Ale CSV je, stejně jako soubor aplikace Excel, ale super jednoduché, kde sloupce jsou 848 00:40:49,330 --> 00:40:54,010 jen demarked čárkami uvnitř z jinak textového souboru. 849 00:40:54,010 --> 00:40:56,740 A pomocí SQL databáze je trochu více přesvědčivé. 850 00:40:56,740 --> 00:41:00,060 Je to obráceně, protože se věci jako vybrat a vložit a odstranit. 851 00:41:00,060 --> 00:41:03,790 A vám, podle všeho indexy, které MySQL a další databáze, jako je 852 00:41:03,790 --> 00:41:07,510 Oracle, vybudovat pro vás v paměti, které znamená, že váš výběr je pravděpodobně 853 00:41:07,510 --> 00:41:09,000 bude lineární shora dolů. 854 00:41:09,000 --> 00:41:11,300 Je to opravdu bude něco jako binární vyhledávání nebo něco 855 00:41:11,300 --> 00:41:12,520 podobně v duchu. 856 00:41:12,520 --> 00:41:13,930 Takže jsou obecně rychlejší. 857 00:41:13,930 --> 00:41:16,040 >> Ale nevýhodou je, že je to jen více práce. 858 00:41:16,040 --> 00:41:16,730 Je to více úsilí. 859 00:41:16,730 --> 00:41:18,140 Musíte pochopit databází. 860 00:41:18,140 --> 00:41:18,940 Musíte nastavit. 861 00:41:18,940 --> 00:41:20,840 Musíte server spustit že databáze. 862 00:41:20,840 --> 00:41:22,750 Musíte pochopit, jak ji nakonfigurovat. 863 00:41:22,750 --> 00:41:24,930 Takže to jsou jen ty druhy kompromisů. 864 00:41:24,930 --> 00:41:27,860 Vzhledem k tomu, CSV, můžete vytvořit s gedit. 865 00:41:27,860 --> 00:41:28,770 A máte dobré jít. 866 00:41:28,770 --> 00:41:31,550 Neexistuje žádný složitosti dál. 867 00:41:31,550 --> 00:41:34,870 >> Použití trie místo hash tabulky s oddělenou řetězení pro uložení 868 00:41:34,870 --> 00:41:37,490 slovník slov připomínajících z pset5. 869 00:41:37,490 --> 00:41:42,480 Proto se snaží vzhůru, teoreticky nejméně, je to, co? 870 00:41:42,480 --> 00:41:46,380 Konstantní čas, alespoň pokud jste hash na každém jednotlivci 871 00:41:46,380 --> 00:41:48,990 písmena ve slovech, jako jste vy, může mít pro pset5. 872 00:41:48,990 --> 00:41:52,720 To by mohlo být pět hash, šest hash v případě, že je pět nebo šest 873 00:41:52,720 --> 00:41:53,900 písmen ve slově. 874 00:41:53,900 --> 00:41:54,580 A to je docela dobré. 875 00:41:54,580 --> 00:41:56,910 A v případě, že je horní mez na tom, jak dlouho vaše slova mohou být, to je 876 00:41:56,910 --> 00:41:59,320 opravdu asymptoticky konstantní čas. 877 00:41:59,320 --> 00:42:05,180 >> Vzhledem k tomu, hash tabulka s odděleným řetězení, problém tam s tím 878 00:42:05,180 --> 00:42:09,070 druh datové struktury je to, že výkon svých algoritmů obvykle 879 00:42:09,070 --> 00:42:12,700 závisí na mnoha faktorech již v datové struktuře. 880 00:42:12,700 --> 00:42:15,660 A to je určitě případ řetězy, přičemž více věcí si dát 881 00:42:15,660 --> 00:42:18,800 do hash tabulky, už ti řetězy jít, což znamená, že v nejhorším 882 00:42:18,800 --> 00:42:21,960 případ, věc, kterou by mohl mít zájem o je úplně na konci jednoho 883 00:42:21,960 --> 00:42:26,000 z těchto řetězců, které účinně přejde do něčeho lineární. 884 00:42:26,000 --> 00:42:29,450 >> Nyní, v praxi by se zcela být v případě, že hash tabulky s 885 00:42:29,450 --> 00:42:32,820 řetězce je rychlejší než odpovídající Implementace trie. 886 00:42:32,820 --> 00:42:35,570 Ale to z různých důvodů, mezi , které se snaží využít celou řadu 887 00:42:35,570 --> 00:42:39,240 paměti, že může ve skutečnosti pomalé věci dolů, protože nemusíte dostat pěkný 888 00:42:39,240 --> 00:42:42,410 Výhody něco, co nazývá ukládání do vyrovnávací paměti, kde věci, které jsou blízko u sebe 889 00:42:42,410 --> 00:42:45,420 v paměti lze přistupovat často rychleji. 890 00:42:45,420 --> 00:42:48,180 A někdy můžete přijít s opravdu dobrý hašovací funkce. 891 00:42:48,180 --> 00:42:51,060 I když budete muset ztrácet trochu paměť, můžete skutečně být schopen 892 00:42:51,060 --> 00:42:54,430 najít věci rychle, a ne stejně špatný jako lineárně. 893 00:42:54,430 --> 00:42:58,410 >> Takže ve zkratce, nebylo nutně s některou z těchto jednoho nebo i dva 894 00:42:58,410 --> 00:43:00,050 konkrétní věci, které jsme hledali. 895 00:43:00,050 --> 00:43:03,080 Opravdu nic přesvědčivý jako proinflační a protiinflační 896 00:43:03,080 --> 00:43:04,800 obecně zachytil naši pozornost. 897 00:43:04,800 --> 00:43:11,840 >> ROB BOWDEN: Tak na druhou stranu, my jsme nepřijímá sama o sobě "rychleji." Vy 898 00:43:11,840 --> 00:43:14,540 musel říkat něco o tom. 899 00:43:14,540 --> 00:43:17,910 Dokonce i když jste řekl teoreticky rychlejší, věděli jsme, že tak nějak pochopil, 900 00:43:17,910 --> 00:43:19,470 že je to 0 z 1.. 901 00:43:19,470 --> 00:43:22,820 A hash tabulka, v teorii, není 0 1.. 902 00:43:22,820 --> 00:43:26,550 Za zmínku něco o běhu obecně Máš body. 903 00:43:26,550 --> 00:43:32,640 Ale "rychleji", většina řešení na velká deska, která se snaží byly 904 00:43:32,640 --> 00:43:34,990 objektivně pomalejší než řešení které byly hash tabulky. 905 00:43:34,990 --> 00:43:37,250 Tak rychleji a sama o sobě Není to pravda. 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 Jsem asi jediný, kdo si uvědomuje, to je, jak to má 909 00:43:46,686 --> 00:43:47,500 se prohlásil, že jo? 910 00:43:47,500 --> 00:43:50,400 >> ROB BOWDEN: Měl jsem vlastně ani ponětí. 911 00:43:50,400 --> 00:43:51,650 >> DAVID J. Malan: Je vyrobena pocit v mé hlavě. 912 00:43:51,650 --> 00:43:53,830 913 00:43:53,830 --> 00:43:57,580 >> ROB BOWDEN: Dělám tuhle. 914 00:43:57,580 --> 00:43:58,020 OK. 915 00:43:58,020 --> 00:44:04,243 Takže to je ten, kde jste museli čerpat diagram podobný byste mohli 916 00:44:04,243 --> 00:44:06,040 viděli na posledních zkouškách. 917 00:44:06,040 --> 00:44:12,200 Takže pojďme se jen podívat na to. 918 00:44:12,200 --> 00:44:18,170 Takže z uzlu HTML, máme dvě děti, hlava a tělo. 919 00:44:18,170 --> 00:44:20,570 Tak jsme se rozdělit - hlavu a tělo. 920 00:44:20,570 --> 00:44:22,280 Hlava má název značky. 921 00:44:22,280 --> 00:44:23,710 Takže máme titul. 922 00:44:23,710 --> 00:44:28,450 >> Teď, jedna věc, kterou mnoho lidí zapomněl je, že tyto textové uzly 923 00:44:28,450 --> 00:44:30,430 prvky v rámci tohoto stromu. 924 00:44:30,430 --> 00:44:36,260 Tak jsme tady náhodou je nakreslit jako ovály odlišit je od nich 925 00:44:36,260 --> 00:44:37,380 druhy uzlů. 926 00:44:37,380 --> 00:44:41,450 Ale Oznámení také zde máme vrchol, střední a dolní skončí na 927 00:44:41,450 --> 00:44:42,560 textové uzly. 928 00:44:42,560 --> 00:44:46,250 Tak zapomínám které bylo poněkud společného chyby. 929 00:44:46,250 --> 00:44:48,770 >> Tělo má tři děti - Tyto tři divs. 930 00:44:48,770 --> 00:44:53,340 Takže div, div, div a pak text uzel děti těchto divs. 931 00:44:53,340 --> 00:44:55,900 To je docela hodně to na tom, že otázky. 932 00:44:55,900 --> 00:44:57,860 >> DAVID J. Malan: A je třeba poznamenat, i když nebydlí na těchto 933 00:44:57,860 --> 00:45:01,040 Podrobnosti v době, kdy jsme strávili na JavaScript, který příkaz dělá, v 934 00:45:01,040 --> 00:45:02,290 Skutečnost, záležitost technicky. 935 00:45:02,290 --> 00:45:06,330 Takže pokud hlava je před tělem v HTML, pak by se měla objevit na 936 00:45:06,330 --> 00:45:08,860 vlevo těla ve skutečném DOM. 937 00:45:08,860 --> 00:45:12,265 To mu je, obecně, jen FYI, něco, co nazývá aby dokument, kde 938 00:45:12,265 --> 00:45:13,260 to záleží. 939 00:45:13,260 --> 00:45:17,470 A pokud jste byli se provádí analyzátor, program, který čte HTML v budově 940 00:45:17,470 --> 00:45:20,960 do stromu v paměti, abych byl upřímný, to je intuitivně pravděpodobně to, co jste 941 00:45:20,960 --> 00:45:24,720 dělat tak jako tak - shora dolů, zleva doprava. 942 00:45:24,720 --> 00:45:26,116 >> ROB BOWDEN: Dotazy na to? 943 00:45:26,116 --> 00:45:29,080 944 00:45:29,080 --> 00:45:30,000 Mám udělat další? 945 00:45:30,000 --> 00:45:32,380 >> DAVID J. Malan: Jistě. 946 00:45:32,380 --> 00:45:33,810 >> ROB BOWDEN: OK. 947 00:45:33,810 --> 00:45:39,320 Tak tohle je přetečení vyrovnávací paměti Útok otázka. 948 00:45:39,320 --> 00:45:43,740 Hlavní věc, kterou si uvědomit, tady je, dobře, jak by mohl protivník trik 949 00:45:43,740 --> 00:45:46,170 tento program do provádění libovolný kód? 950 00:45:46,170 --> 00:45:51,860 Takže argv1, první příkazového řádku argument tohoto programu, které může být 951 00:45:51,860 --> 00:45:53,920 libovolně dlouho. 952 00:45:53,920 --> 00:45:59,160 Ale tady jsme pomocí memcpy kopírovat argv1, který je zde bar. 953 00:45:59,160 --> 00:46:00,165 Jsme předáním jako argument. 954 00:46:00,165 --> 00:46:02,050 A tak je to s na jméno baru. 955 00:46:02,050 --> 00:46:08,040 >> Takže jsme memcpying bar do této vyrovnávací paměti c. 956 00:46:08,040 --> 00:46:09,400 Kolik bajtů jsme kopírování? 957 00:46:09,400 --> 00:46:14,040 No však mnoho bytů bar se stane používat, délku tohoto argumentu. 958 00:46:14,040 --> 00:46:17,930 Ale c je pouze 12 bajtů široký. 959 00:46:17,930 --> 00:46:22,280 Takže pokud bychom zadejte argument příkazového řádku to je delší než 12 bajtů, jsme 960 00:46:22,280 --> 00:46:25,470 bude přetékat to zejména vyrovnávací paměti. 961 00:46:25,470 --> 00:46:31,000 Nyní, jak by protivník trik naprogramovat do provedení libovolného kódu? 962 00:46:31,000 --> 00:46:34,910 >> Takže nezapomeňte, že zde Hlavní volá foo. 963 00:46:34,910 --> 00:46:37,340 A tak tedy hlavní výzvy foo. 964 00:46:37,340 --> 00:46:40,408 Pojďme nakreslit to. 965 00:46:40,408 --> 00:46:44,720 966 00:46:44,720 --> 00:46:46,990 Takže máme stack. 967 00:46:46,990 --> 00:46:49,090 A hlavní je rámeček zásobníku ve spodní části. 968 00:46:49,090 --> 00:46:51,860 969 00:46:51,860 --> 00:46:53,250 Na nějakém místě, hlavní výzvy foo. 970 00:46:53,250 --> 00:46:55,390 No, okamžitě, hlavní výzvy foo. 971 00:46:55,390 --> 00:46:57,130 A tak foo dostane svůj vlastní rámeček zásobníku. 972 00:46:57,130 --> 00:46:59,650 973 00:46:59,650 --> 00:47:02,220 >> Nyní, v určitém okamžiku, foo se chystá na návrat. 974 00:47:02,220 --> 00:47:06,810 A šel foo vrátí, musíme vědět, na co řádek kódu uvnitř hlavní my 975 00:47:06,810 --> 00:47:10,610 bylo, aby věděli, kde bychom měli pokračovat v main. 976 00:47:10,610 --> 00:47:13,100 Můžeme volat foo z celku spoustu různých místech. 977 00:47:13,100 --> 00:47:14,620 Jak můžeme vědět, kam se vrátit? 978 00:47:14,620 --> 00:47:16,460 No, musíme uložit, že někde. 979 00:47:16,460 --> 00:47:23,010 >> Takže někde přímo tady, uložíme kde bychom se měli vrátit k jednou 980 00:47:23,010 --> 00:47:24,070 foo vrací. 981 00:47:24,070 --> 00:47:26,350 A to je zpáteční adresa. 982 00:47:26,350 --> 00:47:30,490 Tak jak by mohl protivník využít to je skutečnost, že 983 00:47:30,490 --> 00:47:37,550 Tato vyrovnávací paměť c je uložena, pojďme říci, tady je cca. 984 00:47:37,550 --> 00:47:39,690 Takže máme 12 bajtů pro C. 985 00:47:39,690 --> 00:47:40,540 To je cca. 986 00:47:40,540 --> 00:47:43,030 A to je Foo stack kroužek. 987 00:47:43,030 --> 00:47:49,970 Takže v případě, že uživatel se zlými úmysly zadá více bajtů, než 12 let nebo je zadejte příkaz 988 00:47:49,970 --> 00:47:54,570 linka argument, že je delší než 12 znaky, pak budeme 989 00:47:54,570 --> 00:47:57,540 přetečení této vyrovnávací paměti. 990 00:47:57,540 --> 00:47:59,910 >> Můžeme jít dál. 991 00:47:59,910 --> 00:48:02,220 A v určitém okamžiku, můžeme jít daleko natolik, že začneme 992 00:48:02,220 --> 00:48:05,120 přepsání této zpáteční adresu. 993 00:48:05,120 --> 00:48:08,310 Takže jakmile jsme se přepsat návratovou adresu, to znamená, že při foo 994 00:48:08,310 --> 00:48:14,220 se vrací, vracíme se tam, kde uživatel se zlými úmysly se říká, to by 995 00:48:14,220 --> 00:48:19,490 bez ohledu na hodnotu vstoupila, bez ohledu na znaky uživatel zadal. 996 00:48:19,490 --> 00:48:24,320 A tak v případě, že uživatel se zlými úmysly je, že obzvláště chytrý, může mít tato 997 00:48:24,320 --> 00:48:29,255 návrat někam do printDef funkce nebo někde v malloc 998 00:48:29,255 --> 00:48:31,830 funkce, prostě kdekoliv libovolný. 999 00:48:31,830 --> 00:48:38,420 >> Ale i další chytré je to, co v případě, že má uživatel vrátit k právě zde. 1000 00:48:38,420 --> 00:48:41,920 A pak začnete provádění to jako řádky kódu. 1001 00:48:41,920 --> 00:48:46,610 Takže v tomto bodě, může uživatel zadat co chce v této oblasti. 1002 00:48:46,610 --> 00:48:52,210 A on má úplnou kontrolu na programu. 1003 00:48:52,210 --> 00:48:53,460 Dotazy na to? 1004 00:48:53,460 --> 00:48:56,380 1005 00:48:56,380 --> 00:49:00,970 Takže další otázka je kompletní reimplementace foo takovým způsobem, 1006 00:49:00,970 --> 00:49:02,620 že už to není zranitelná. 1007 00:49:02,620 --> 00:49:03,870 >> Takže tam je několik způsobů, jak jsi to mohl udělat. 1008 00:49:03,870 --> 00:49:10,900 1009 00:49:10,900 --> 00:49:13,330 Máme stále c pouze jsou délky 12. 1010 00:49:13,330 --> 00:49:16,480 Dalo by se změnily v tomto jako součást vašeho řešení. 1011 00:49:16,480 --> 00:49:18,930 Také jsme přidali kontrolu, aby se , že bar není null. 1012 00:49:18,930 --> 00:49:24,460 I když nepotřeboval že pro plnou úvěru. 1013 00:49:24,460 --> 00:49:27,690 Takže jsme kontrolu první délka řetězce baru. 1014 00:49:27,690 --> 00:49:31,650 Pokud je větší než 12, pak nejsou ve skutečnosti dělat kopie. 1015 00:49:31,650 --> 00:49:33,010 Takže to je jeden ze způsobů, kterým se to. 1016 00:49:33,010 --> 00:49:36,750 >> Další způsob, kterým se to je místo s c se pouze v délce 12, má to 1017 00:49:36,750 --> 00:49:39,310 být délka strlen (bar). 1018 00:49:39,310 --> 00:49:43,370 Další způsob, kterým se to je skutečně jen vrátit. 1019 00:49:43,370 --> 00:49:46,690 Takže pokud jste se právě zbavili všech to, pokud jste právě odstraněny všechny 1020 00:49:46,690 --> 00:49:51,830 řádků kódu, by jste se dostali plné uznání, protože tuto funkci 1021 00:49:51,830 --> 00:49:54,150 není ve skutečnosti dosáhnout nic. 1022 00:49:54,150 --> 00:49:57,650 Je to kopírování příkazového řádku Argument do nějakého pole v 1023 00:49:57,650 --> 00:49:59,960 její místní stack frame. 1024 00:49:59,960 --> 00:50:01,310 A pak, co se vrací. 1025 00:50:01,310 --> 00:50:04,020 A co to dokonalý, je pryč. 1026 00:50:04,020 --> 00:50:09,740 Takže návrat byl také dostatečné způsob, jak dostat všechny zásluhy. 1027 00:50:09,740 --> 00:50:13,425 >> DAVID J. Malan: Ne tak docela duch otázka, ale přijatelné za 1028 00:50:13,425 --> 00:50:15,580 spec nicméně. 1029 00:50:15,580 --> 00:50:18,260 >> ROB BOWDEN: Dotazy týkající se něco z toho? 1030 00:50:18,260 --> 00:50:22,270 Jedna věc, která vám alespoň potřebné k sestavování kódu. 1031 00:50:22,270 --> 00:50:24,810 Takže i když technicky nejste zranitelná, pokud váš kód není 1032 00:50:24,810 --> 00:50:29,130 sestavit, jsme neměli přijmout. 1033 00:50:29,130 --> 00:50:31,350 Žádné otázky? 1034 00:50:31,350 --> 00:50:33,320 OK. 1035 00:50:33,320 --> 00:50:34,580 >> DAVID J. Malan: Chcete říci, tento titul? 1036 00:50:34,580 --> 00:50:37,230 >> ROB BOWDEN: Ne 1037 00:50:37,230 --> 00:50:40,470 >> DAVID J. Malan: Tak v tomhle, to byl buď dobrá zpráva nebo špatná zpráva. 1038 00:50:40,470 --> 00:50:43,870 To je doslova stejný problém jako první kvíz. 1039 00:50:43,870 --> 00:50:46,140 A to je skoro stejný problém, pset1. 1040 00:50:46,140 --> 00:50:49,980 Ale to bylo záměrně zjednodušen, aby se jednodušší pyramida, který může být 1041 00:50:49,980 --> 00:50:52,330 řešena s mírně jednodušší iterace. 1042 00:50:52,330 --> 00:50:55,680 A opravdu, co jsme se dostat na zde nebylo tolik logiky, 1043 00:50:55,680 --> 00:50:58,100 protože pravděpodobně v tomto okamžiku, že jste mnohem pohodlnější, než jste byli 1044 00:50:58,100 --> 00:51:01,850 v týdnu jedné s pro smyčky nebo proč smyček, ale opravdu dráždit sebe, že 1045 00:51:01,850 --> 00:51:04,790 jste trochu pohodlnější s Představa, že PHP není jen o tom, co 1046 00:51:04,790 --> 00:51:05,290 programování. 1047 00:51:05,290 --> 00:51:07,820 To může ve skutečnosti být použit jako jazyk psát programy příkazového řádku. 1048 00:51:07,820 --> 00:51:10,060 >> A vskutku, to je to, co se snažíme upozornit na. 1049 00:51:10,060 --> 00:51:12,060 To je PHP programu pro příkazovou řádku. 1050 00:51:12,060 --> 00:51:16,690 Takže C kód zde, zatímco správná v C, není správné pro PHP. 1051 00:51:16,690 --> 00:51:17,940 Ale kód je ve skutečnosti stejné. 1052 00:51:17,940 --> 00:51:21,720 Pokud porovnáte řešení pro Quiz 0 proti Quiz 1, zjistíte, že 1053 00:51:21,720 --> 00:51:25,630 je to téměř totožné, s výjimkou Některé dolaru a pro 1054 00:51:25,630 --> 00:51:27,250 absence datového typu. 1055 00:51:27,250 --> 00:51:31,720 Zejména, pokud se podíváme tady, uvidíte, že jsme iteraci, v tomto 1056 00:51:31,720 --> 00:51:33,730 případ od 1 do až 7. 1057 00:51:33,730 --> 00:51:34,910 >> Mohli jsme to udělal 0 index. 1058 00:51:34,910 --> 00:51:37,320 Ale někdy si myslím, že je to jen mentálně jednodušší přemýšlet o věcech, 1059 00:51:37,320 --> 00:51:38,200 1-7. 1060 00:51:38,200 --> 00:51:40,300 Chcete-li jeden blok, a pak dva bloky, pak tři, pak 1061 00:51:40,300 --> 00:51:41,770 tečka, tečka, tečka sedm. 1062 00:51:41,770 --> 00:51:45,960 Máme j je inicializován na hodnotu 1 a pak se počítá až na i.. 1063 00:51:45,960 --> 00:51:48,150 A vše je zde jinak identické. 1064 00:51:48,150 --> 00:51:49,790 Ale stojí za zmínku, jsou pár věcí. 1065 00:51:49,790 --> 00:51:53,230 Dáme vám tyto dva řádky, to první jeden, goofily pojmenovaný jako shebang 1066 00:51:53,230 --> 00:51:54,560 pro ostrou ránou. 1067 00:51:54,560 --> 00:51:58,770 A to právě určuje cestu, složka, ve které může být program 1068 00:51:58,770 --> 00:52:02,160 zjistili, že chcete použít interpretovat tento soubor. 1069 00:52:02,160 --> 00:52:04,710 >> A pak vedení po tom, o Samozřejmě, že znamená, že vstup do režimu PHP. 1070 00:52:04,710 --> 00:52:07,740 A linka na samém dně znamená, že režim exit PHP. 1071 00:52:07,740 --> 00:52:09,740 A to funguje obecně, s interpretovat jazyků. 1072 00:52:09,740 --> 00:52:14,370 Je to docela nepříjemné, pokud píšete Program v souboru s názvem foo.php. 1073 00:52:14,370 --> 00:52:17,320 A pak uživatelé mají jen pamatujte, OK, pro spuštění tohoto programu, jsem 1074 00:52:17,320 --> 00:52:22,320 muset zadat "php prostor foo.php." Druh nepříjemné když už nic jiného. 1075 00:52:22,320 --> 00:52:25,270 A to také ukazuje, že váš program je napsán v PHP, který není vše 1076 00:52:25,270 --> 00:52:27,060 že osvětlení pro uživatele. 1077 00:52:27,060 --> 00:52:30,100 >> Takže můžete odstranit. Php úplně pamatujete z přednášky. 1078 00:52:30,100 --> 00:52:35,690 A můžete skutečně udělat. / Foo, pokud jste chmodded to tím, že to 1079 00:52:35,690 --> 00:52:36,500 spustitelný soubor. 1080 00:52:36,500 --> 00:52:39,630 Takže chmod + x foo by udělal to. 1081 00:52:39,630 --> 00:52:41,460 A pokud jste také přidat cirkus zde. 1082 00:52:41,460 --> 00:52:45,320 Ale ve skutečnosti, problém byl dostat na vytisknout něco takového. 1083 00:52:45,320 --> 00:52:51,100 No HTML, ne C-kódu jistě, jen některé PHP. 1084 00:52:51,100 --> 00:52:54,100 Takže Milo pak se vrátil do problému 25. 1085 00:52:54,100 --> 00:52:58,050 A v roce 25, jste dostali z následujících kostra kód, který byl 1086 00:52:58,050 --> 00:52:59,730 docela jednoduché webové stránky. 1087 00:52:59,730 --> 00:53:04,230 A šťavnaté část HTML-moudrý byl dole tady, kde máme uvnitř těla 1088 00:53:04,230 --> 00:53:09,160 forma, která má unikátní ID vstupů uvnitř které je dva vstupy, jeden 1089 00:53:09,160 --> 00:53:11,950 s myšlenkou jméno, jeden s myšlenkou tlačítka. 1090 00:53:11,950 --> 00:53:14,240 >> První byl typ textu, Druhá typu předložit. 1091 00:53:14,240 --> 00:53:16,930 A tak jsme vám dali, ve skutečnosti, více složky, než jste potřebovali, jen tak 1092 00:53:16,930 --> 00:53:19,230 vy jste měli možnosti, s nimiž k vyřešení tohoto problému. 1093 00:53:19,230 --> 00:53:21,130 Nemusíte nezbytně potřebují všechny tyto ID. 1094 00:53:21,130 --> 00:53:23,580 Ale to vám umožní řešit to různými způsoby. 1095 00:53:23,580 --> 00:53:27,050 A až na vrchol, všimněte si, že Cílem bylo vyvolat 1096 00:53:27,050 --> 00:53:27,960 Okno takhle - 1097 00:53:27,960 --> 00:53:28,780 Dobrý den, Milo! - 1098 00:53:28,780 --> 00:53:31,270 vyskočí v prohlížeči pomocí super jednoduché, pokud 1099 00:53:31,270 --> 00:53:33,190 Není ošklivá, funkce upozornění. 1100 00:53:33,190 --> 00:53:37,480 A tak nakonec, to se scvrkává koncepčně nějak poslouchat 1101 00:53:37,480 --> 00:53:41,290 podání formuláře na straně klienta , Ne na straně serveru, tak nějak 1102 00:53:41,290 --> 00:53:45,640 odpovědi na toto podání podle chytil hodnotu, která uživatel zadaný 1103 00:53:45,640 --> 00:53:50,120 do pole Název a poté jeho zobrazení v těle výstrahy. 1104 00:53:50,120 --> 00:53:53,460 >> Takže jeden způsob, jak to můžete udělat, je se jQuery, která vypadá trochu 1105 00:53:53,460 --> 00:53:56,880 syntakticky matoucí na první pohled. 1106 00:53:56,880 --> 00:54:00,760 Můžete to udělat s čistým DOM kódu - document.getelement podle ID. 1107 00:54:00,760 --> 00:54:02,530 Ale pojďme se podívat na tuto verzi. 1108 00:54:02,530 --> 00:54:05,110 Mám pár důležitých první linie. 1109 00:54:05,110 --> 00:54:09,460 Takže jeden, máme tento řádek, který je totožný s tím, co jste mohli vidět 1110 00:54:09,460 --> 00:54:13,830 v, věřím, form2.html z třídy v týdnu 9. 1111 00:54:13,830 --> 00:54:16,960 A to je jen říkám, provést Následující kód při 1112 00:54:16,960 --> 00:54:18,430 Dokument je nyní připraven. 1113 00:54:18,430 --> 00:54:21,770 To je důležité nejen proto, HTML stránky se čtou shora 1114 00:54:21,770 --> 00:54:23,280 dole, zleva doprava. 1115 00:54:23,280 --> 00:54:27,910 >> A proto, pokud se pokusíte udělat něco v kódu, až tady na nějakou DOM 1116 00:54:27,910 --> 00:54:31,560 prvek, některé značky HTML, která je dole zde, že jste to děláte příliš brzy, 1117 00:54:31,560 --> 00:54:34,220 , protože to nemá ani byly načteny do paměti. 1118 00:54:34,220 --> 00:54:37,740 Takže tím, že říká toto document.ready linka, říkáme, 1119 00:54:37,740 --> 00:54:39,040 tady je nějaký kód, prohlížeč. 1120 00:54:39,040 --> 00:54:42,440 Ale ne spustit, dokud celý Dokument je nyní připraven, že je DOM 1121 00:54:42,440 --> 00:54:44,320 strom existuje v paměti. 1122 00:54:44,320 --> 00:54:47,110 To je trochu víc jednoduché, pokud syntakticky 1123 00:54:47,110 --> 00:54:51,890 trochu jiná, kde říkám, grab prvek HTML, jehož jedinečný 1124 00:54:51,890 --> 00:54:53,560 identifikátor vstupy. 1125 00:54:53,560 --> 00:54:56,220 To je to, co značka hash označuje, jedinečný identifikátor. 1126 00:54:56,220 --> 00:54:58,070 A pak volám. Odeslat. 1127 00:54:58,070 --> 00:55:01,660 >> Tak. Předloží zde je funkce, jinak známý jako metoda, která je 1128 00:55:01,660 --> 00:55:05,850 uvnitř objektu na levé straně straně tam, že jsem neměl zvýraznit. 1129 00:55:05,850 --> 00:55:08,990 Takže pokud si myslíte, vstupů jako objekt v paměti - a opravdu to je. 1130 00:55:08,990 --> 00:55:10,440 Je to uzel na stromě - 1131 00:55:10,440 --> 00:55:16,580 . Předloží znamená, že když je tato forma se toto číslo je předložen, provést 1132 00:55:16,580 --> 00:55:17,700 Následující kód. 1133 00:55:17,700 --> 00:55:20,290 Nezajímá mě, co název Funkce je mi provádění. 1134 00:55:20,290 --> 00:55:23,760 Tak tady jsem pomocí, stejně jako dříve, to, co je tzv. funkce lambda nebo 1135 00:55:23,760 --> 00:55:24,720 anonymní funkce. 1136 00:55:24,720 --> 00:55:27,640 Je to vůbec intelektuálně zajímavé, jiné, než je to nemá jméno, 1137 00:55:27,640 --> 00:55:30,220 což je v pořádku, pokud jste jen kdy bude jednou zavolat. 1138 00:55:30,220 --> 00:55:34,490 A uvnitř jsem tam vlastně zvládnout předložení formuláře. 1139 00:55:34,490 --> 00:55:36,810 Poprvé jsem deklarovat proměnnou tzv. hodnota. 1140 00:55:36,810 --> 00:55:40,610 A co pak je účinek tohoto zvýrazněna část tady? 1141 00:55:40,610 --> 00:55:44,755 Co to udělat na na vysoké úrovni pro mě? 1142 00:55:44,755 --> 00:55:48,539 >> DIVÁKŮ: Dostane hodnotu, která uživatel neměl v následující HTML. 1143 00:55:48,539 --> 00:55:50,920 Dostane to ID a poté najde hodnotu něj. 1144 00:55:50,920 --> 00:55:51,590 >> DAVID J. Malan: Přesně tak. 1145 00:55:51,590 --> 00:55:54,300 Je to chytne uzel, jehož jedinečný Identifikátor je název. 1146 00:55:54,300 --> 00:55:56,900 To dostane hodnotu v něm, které je pravděpodobně to, co uživatel 1147 00:55:56,900 --> 00:55:58,190 napsal jej nebo sebe. 1148 00:55:58,190 --> 00:56:01,020 A pak se ukládá, aby do proměnné s názvem hodnotu. 1149 00:56:01,020 --> 00:56:03,720 Jako stranou, mohli byste mít také udělat to trochu jinak. 1150 00:56:03,720 --> 00:56:09,250 Zcela přijatelné tím, že dělá něco, co lež var hodnota dostane 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 A to je důvod, proč je to trochu zdlouhavý, že nebude používat jQuery. 1154 00:56:15,460 --> 00:56:16,710 "Jméno". Hodnota. 1155 00:56:16,710 --> 00:56:18,330 1156 00:56:18,330 --> 00:56:19,620 Takže naprosto přijatelné. 1157 00:56:19,620 --> 00:56:22,770 Různé způsoby, jak to udělat. jQuery jen má tendenci být trochu stručnější a 1158 00:56:22,770 --> 00:56:25,230 určitě více populární mezi programátory. 1159 00:56:25,230 --> 00:56:27,590 >> Teď dělám trochu zdravého rozumu zkontrolovat, protože v problému 1160 00:56:27,590 --> 00:56:30,820 prohlášení jsme výslovně řekl, pokud uživatel ještě napsaný jeho nebo její 1161 00:56:30,820 --> 00:56:32,580 jméno, nevykazují upozornění. 1162 00:56:32,580 --> 00:56:35,390 Ale můžete zkontrolovat tím, že právě kontrolu na prázdný řetězec pro 1163 00:56:35,390 --> 00:56:37,850 quote-konec citátu v případě, že je nic ve skutečnosti neexistuje. 1164 00:56:37,850 --> 00:56:40,880 Ale pokud to není rovná citátem-konec citátu, Chci volat upozornění. 1165 00:56:40,880 --> 00:56:45,610 A zajímavá část je, že jsme pomocí operátoru navíc, které 1166 00:56:45,610 --> 00:56:48,130 co dělá v JavaScriptu? 1167 00:56:48,130 --> 00:56:48,740 Zřetězit. 1168 00:56:48,740 --> 00:56:50,690 Takže je to jako Phps operátor tečka. 1169 00:56:50,690 --> 00:56:52,820 Stejný nápad, mírně odlišná syntaxe. 1170 00:56:52,820 --> 00:56:55,280 A já jsem jen vytvořit řetězec, který jste viděli na snímku obrazovky - 1171 00:56:55,280 --> 00:56:57,750 Ahoj, tak a tak. 1172 00:56:57,750 --> 00:56:59,200 >> A pak poslední detail je to. 1173 00:56:59,200 --> 00:57:04,970 Proč bych se vrátit false vnitřek této anonymní funkce? 1174 00:57:04,970 --> 00:57:07,420 >> DIVÁKŮ: Není hodnotu. 1175 00:57:07,420 --> 00:57:09,380 Můžete dát ve formě. 1176 00:57:09,380 --> 00:57:12,320 1177 00:57:12,320 --> 00:57:16,730 Je to jen říká, pokud hodnota není rovná prázdné, pak to udělat. 1178 00:57:16,730 --> 00:57:20,040 1179 00:57:20,040 --> 00:57:20,940 Tam byla prázdná v tomto podání. 1180 00:57:20,940 --> 00:57:21,170 >> DAVID J. Malan: OK. 1181 00:57:21,170 --> 00:57:21,640 Opatrní. 1182 00:57:21,640 --> 00:57:22,830 K dispozici je zde nikdo jiný. 1183 00:57:22,830 --> 00:57:25,510 A to return false je mimo ze pokud podmínky. 1184 00:57:25,510 --> 00:57:29,470 Tak tohle zvýrazní linii, vrátí false, provádí bez ohledu na to, kdy 1185 00:57:29,470 --> 00:57:32,310 Formulář je předkládán. 1186 00:57:32,310 --> 00:57:36,810 Co vrací false uvnitř tohoto Obslužná rutina události, jak se tomu říká, 1187 00:57:36,810 --> 00:57:38,450 událost v otázce že podání? 1188 00:57:38,450 --> 00:57:42,350 1189 00:57:42,350 --> 00:57:44,470 >> DIVÁKŮ: Vzhledem k tomu, stane jen jednou. 1190 00:57:44,470 --> 00:57:45,320 >> DAVID J. Malan: stane jen jednou. 1191 00:57:45,320 --> 00:57:46,821 Ne tak docela. 1192 00:57:46,821 --> 00:57:47,292 Jo? 1193 00:57:47,292 --> 00:57:50,589 >> DIVÁKŮ: Zabraňuje formulář od předložení výchozí chování, 1194 00:57:50,589 --> 00:57:52,480 které by na stránku znovu načíst. 1195 00:57:52,480 --> 00:57:53,110 >> DAVID J. Malan: Přesně tak. 1196 00:57:53,110 --> 00:57:56,490 Takže jsem přetížení termín předložení tady, protože já říkám, forma je 1197 00:57:56,490 --> 00:57:57,670 byl předložen. 1198 00:57:57,670 --> 00:58:02,240 Ale jak si navrhnout, že to ve skutečnosti není byla předložena v pravém způsobem HTTP. 1199 00:58:02,240 --> 00:58:06,870 Po klepnutí na tlačítko Odeslat, protože naše onSubmit handler, budeme zastavovat 1200 00:58:06,870 --> 00:58:09,040 že podací formulář, abych tak řekl. 1201 00:58:09,040 --> 00:58:11,290 Jsme pak dělá naše věc s kódem JavaScript. 1202 00:58:11,290 --> 00:58:14,070 Ale já jsem záměrně vrací false, protože to, co nechci, aby se to stalo 1203 00:58:14,070 --> 00:58:18,430 zlomek vteřiny později, je pro celý formulář sama o sobě, která bude předložena na webu 1204 00:58:18,430 --> 00:58:22,800 server s klíče a hodnoty, změnou URL musí být něco jako 1205 00:58:22,800 --> 00:58:26,180 q = kočky nebo co jsme udělali, Například, ve třídě. 1206 00:58:26,180 --> 00:58:29,640 Nechci, aby se to stalo, protože není server naslouchání na to 1207 00:58:29,640 --> 00:58:30,690 vytvořit podání. 1208 00:58:30,690 --> 00:58:32,320 Je to čistě provedeno v kódu JavaScript. 1209 00:58:32,320 --> 00:58:35,760 A to je důvod, proč jsem neměl ani akce atribut na mé formě, protože jsem 1210 00:58:35,760 --> 00:58:38,870 nemají v úmyslu, aby to někdy jít na server. 1211 00:58:38,870 --> 00:58:40,780 >> Takže je to být předloženy. 1212 00:58:40,780 --> 00:58:44,340 Ale my zachycení tohoto formuláře podání a prevenci výchozí 1213 00:58:44,340 --> 00:58:47,477 chování, což je ve skutečnosti jít celou cestu k serveru. 1214 00:58:47,477 --> 00:58:48,730 >> DIVÁKŮ: Takže udržet to na straně klienta. 1215 00:58:48,730 --> 00:58:49,780 >> DAVID J. Malan: Vedení je na straně klienta. 1216 00:58:49,780 --> 00:58:51,030 Přesně tak. 1217 00:58:51,030 --> 00:58:53,240 1218 00:58:53,240 --> 00:58:55,757 Další na řadě byl můj 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 Takže tato první otázka byla obecně hrubý k lidem. 1222 00:59:04,990 --> 00:59:07,270 I když ty později šel lépe. 1223 00:59:07,270 --> 00:59:12,260 Takže jste měli vybrat správnou údaje typy na obou těchto sloupců. 1224 00:59:12,260 --> 00:59:17,750 A jak z nich mají některé věci o nich, že 1225 00:59:17,750 --> 00:59:20,620 aby volba obtížné. 1226 00:59:20,620 --> 00:59:24,430 Takže int nebyl platný typ pro čísla. 1227 00:59:24,430 --> 00:59:29,410 Důvodem je 12-místné číslo účtu číslo, int není dostatečně velká, aby 1228 00:59:29,410 --> 00:59:31,070 uložení celkem číslic. 1229 00:59:31,070 --> 00:59:36,570 Takže volba je možná by byl velký int, pokud jste náhodou víte, že. 1230 00:59:36,570 --> 00:59:42,090 Další možností by mohlo být char pole o délce 12. 1231 00:59:42,090 --> 00:59:44,560 Takže jeden z těch by to fungovalo. 1232 00:59:44,560 --> 00:59:46,100 Int, že ne. 1233 00:59:46,100 --> 00:59:50,170 >> Nyní, rovnováha, si vzpomenu na pset7. 1234 00:59:50,170 --> 00:59:59,540 Tak jsme se speciálně používá desetinné číslo na uložit hodnotu akcií, nebo - 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 Použili jsme desítkové uložit částku hotovosti, které má v současné době uživatel. 1238 01:00:05,710 --> 01:00:10,950 Takže důvod, proč to děláme, je protože, pamatujte, že plave. 1239 01:00:10,950 --> 01:00:12,480 K dispozici je s plovoucí desetinnou čárkou v přesnosti. 1240 01:00:12,480 --> 01:00:18,200 Nelze přesně uložit hotovost hodnoty, jako je chceme zde. 1241 01:00:18,200 --> 01:00:23,630 Takže desítkové je schopen přesně sklad něco, řekněme, dvě desetinná místa. 1242 01:00:23,630 --> 01:00:27,630 To je důvod, proč bilance, chceme ho být desetinné, a ne plavat. 1243 01:00:27,630 --> 01:00:30,230 >> DAVID J. Malan: A taky, taky, i když to by mohlo být chytrý v jiných 1244 01:00:30,230 --> 01:00:32,760 souvislostech přemýšlet, možná to Je to šance pro int. 1245 01:00:32,760 --> 01:00:34,420 Budu jen sledovat věci haléře. 1246 01:00:34,420 --> 01:00:38,670 Protože jsme explicitně ukázal výchozí hodnota je 100,00, že 1247 01:00:38,670 --> 01:00:40,380 znamená, že to může být jen int. 1248 01:00:40,380 --> 01:00:45,310 A další jemnost také s řadou bylo, že to nebylo myšleno 1249 01:00:45,310 --> 01:00:46,180 být chyták. 1250 01:00:46,180 --> 01:00:49,860 Ale vzpomínám, že int v MySQL, stejně jako v C, alespoň v 1251 01:00:49,860 --> 01:00:51,440 zařízení, je 32-bit. 1252 01:00:51,440 --> 01:00:53,960 A i když neočekáváme, že vám přesně vědět, kolik číslic, které 1253 01:00:53,960 --> 01:00:56,910 prostředky, si připomenout, že největší počet můžete představovat potenciálně 1254 01:00:56,910 --> 01:01:00,710 32-bitové číslo je zhruba to, co? 1255 01:01:00,710 --> 01:01:02,760 >> Jaké číslo si vždycky říct? 1256 01:01:02,760 --> 01:01:04,530 2 až 32, což je to, co zhruba? 1257 01:01:04,530 --> 01:01:07,492 1258 01:01:07,492 --> 01:01:08,780 Nemusíte přesně vědět. 1259 01:01:08,780 --> 01:01:10,580 Ale asi je užitečné v životě. 1260 01:01:10,580 --> 01:01:12,200 Je to zhruba 4 miliardy. 1261 01:01:12,200 --> 01:01:14,430 Tak jsme řekli, že za několik minut. 1262 01:01:14,430 --> 01:01:16,360 Vím, že jsem řekl, že za několik minut. 1263 01:01:16,360 --> 01:01:17,670 A to je zhruba 4 miliardy. 1264 01:01:17,670 --> 01:01:19,710 A to je dobré pravidlo palce vědět. 1265 01:01:19,710 --> 01:01:21,880 Pokud máte 8 bitů, 256 je magické číslo. 1266 01:01:21,880 --> 01:01:24,160 Pokud máte 32 bitů, 4 miliard dávat nebo brát. 1267 01:01:24,160 --> 01:01:27,140 Takže pokud jste právě napsat 4000000000, uvidíte, že je to méně číslic než 1268 01:01:27,140 --> 01:01:30,970 12, což znamená, že je zjevně dost expresivita zachytit 1269 01:01:30,970 --> 01:01:34,220 Číslo účtu 12-místné. 1270 01:01:34,220 --> 01:01:34,940 >> ROB BOWDEN: OK. 1271 01:01:34,940 --> 01:01:38,520 Takže ty ostatní šlo lépe. 1272 01:01:38,520 --> 01:01:40,900 Takže předpokládám, že banka ukládá 20 dolarů měsíčně 1273 01:01:40,900 --> 01:01:42,400 udržovací poplatek na všech účtech. 1274 01:01:42,400 --> 01:01:45,506 S tím, co SQL dotazu by banka odečíst 20 dolarů z každého počtu, a to i v případě, 1275 01:01:45,506 --> 01:01:47,520 to má za následek některé negativní bilancí? 1276 01:01:47,520 --> 01:01:50,380 Takže v podstatě existují čtyři Hlavními typy dotazů - 1277 01:01:50,380 --> 01:01:52,840 vložit, vyberte, aktualizovat a mazat. 1278 01:01:52,840 --> 01:01:56,080 Takže to, co si myslíme, že jsme bude tady používat? 1279 01:01:56,080 --> 01:01:57,000 Aktualizovat. 1280 01:01:57,000 --> 01:01:58,260 >> Takže pojďme se podívat. 1281 01:01:58,260 --> 01:02:04,290 1282 01:02:04,290 --> 01:02:05,870 Tak tady jsme aktualizaci. 1283 01:02:05,870 --> 01:02:09,900 Co tabulce jsme aktualizaci účtů? 1284 01:02:09,900 --> 01:02:11,670 Tak aktualizace účtů. 1285 01:02:11,670 --> 01:02:15,390 A pak syntaxe říká, co v účtech jsme aktualizaci? 1286 01:02:15,390 --> 01:02:19,520 No, my jsme nastavení vyvážení rovnající se aktuální hodnota zůstatku minus 20. 1287 01:02:19,520 --> 01:02:22,860 Takže to bude aktualizovat všechny řádky účtů, odečtením 1288 01:02:22,860 --> 01:02:26,250 20 dolarů z rovnováhy. 1289 01:02:26,250 --> 01:02:29,260 >> DAVID J. Malan: Častou chybou tady, i když jsme někdy odpustil to, 1290 01:02:29,260 --> 01:02:32,990 bylo skutečně PHP kód zde volání funkce dotazu nebo uvedení 1291 01:02:32,990 --> 01:02:35,460 uvozovky kolem všeho, co Nepotřeboval, aby se tam. 1292 01:02:35,460 --> 01:02:39,780 >> ROB BOWDEN: Nezapomeňte, že MySQL je oddělený jazyk od PHP. 1293 01:02:39,780 --> 01:02:42,410 Jsme stalo, že se psaní MySQL v PHP. 1294 01:02:42,410 --> 01:02:46,180 A PHP se to pak posílá se k MySQL serveru. 1295 01:02:46,180 --> 01:02:51,120 Ale nemusíte PHP, aby se komunikovat se serverem MySQL. 1296 01:02:51,120 --> 01:02:51,730 >> DAVID J. Malan: Přesně tak. 1297 01:02:51,730 --> 01:02:54,240 Takže žádné proměnné se znaky dolaru by měla být v tomto kontextu. 1298 01:02:54,240 --> 01:02:59,550 To může jen dělat vše z matematiky v databázi samotné. 1299 01:02:59,550 --> 01:03:00,080 >> ROB BOWDEN: OK. 1300 01:03:00,080 --> 01:03:01,300 Takže ten příští. 1301 01:03:01,300 --> 01:03:02,731 Je to další? 1302 01:03:02,731 --> 01:03:03,210 Jo. 1303 01:03:03,210 --> 01:03:06,570 Takže s tím, co SQL dotazu by banka načtení čísla účtů svých 1304 01:03:06,570 --> 01:03:09,300 Nejbohatší zákazníci, které se zůstatky větší než 1000? 1305 01:03:09,300 --> 01:03:13,280 Tak který z těchto čtyř hlavních typů budeme chtít tu? 1306 01:03:13,280 --> 01:03:14,430 Vyberte. 1307 01:03:14,430 --> 01:03:16,650 Takže chceme vybrat. 1308 01:03:16,650 --> 01:03:17,610 Co chceme vybrat? 1309 01:03:17,610 --> 01:03:19,380 Co sloupec chceme vybrat? 1310 01:03:19,380 --> 01:03:20,970 Budeme se konkrétně chcete vyberte číslo. 1311 01:03:20,970 --> 01:03:23,910 Ale pokud jste řekl, hvězda, jsme Také připustil, že. 1312 01:03:23,910 --> 01:03:25,820 >> Takže zvolte číslo z jakého stolu? 1313 01:03:25,820 --> 01:03:26,640 Účty. 1314 01:03:26,640 --> 01:03:28,370 A pak stav chceme? 1315 01:03:28,370 --> 01:03:30,140 Kde zůstatek větší než 1000. 1316 01:03:30,140 --> 01:03:31,720 Jsme rovněž přijala větší než nebo rovno. 1317 01:03:31,720 --> 01:03:35,230 1318 01:03:35,230 --> 01:03:36,190 Poslední. 1319 01:03:36,190 --> 01:03:42,940 S tím, co SQL dotazu by banka zavřít, tj. odstranit každý účet, který 1320 01:03:42,940 --> 01:03:44,480 má bilanci 0 dolarů? 1321 01:03:44,480 --> 01:03:47,620 Tak který z těch čtyř jsme chtít používat? 1322 01:03:47,620 --> 01:03:48,320 Odstranit. 1323 01:03:48,320 --> 01:03:50,180 Takže syntaxe, že? 1324 01:03:50,180 --> 01:03:51,890 Odstranit z jakého stolu? 1325 01:03:51,890 --> 01:03:53,550 Účty. 1326 01:03:53,550 --> 01:03:55,790 A pak se podmínka, která chceme odstranit - 1327 01:03:55,790 --> 01:03:57,280 kde zůstatek se rovná nule. 1328 01:03:57,280 --> 01:04:03,050 Takže odstranit všechny řádky z účtů tehdy, je nulová. 1329 01:04:03,050 --> 01:04:04,300 Otázky týkající se některého z nich? 1330 01:04:04,300 --> 01:04:08,840 1331 01:04:08,840 --> 01:04:10,260 Chcete fronty? 1332 01:04:10,260 --> 01:04:11,200 >> DAVID J. Malan: průvodce fronty. 1333 01:04:11,200 --> 01:04:17,110 Takže v tomto jednom, vám dal nám poněkud seznámit struktura, která jsme zkoumali A 1334 01:04:17,110 --> 01:04:20,450 bit ve třídě vedle of struktur, který byl údaje 1335 01:04:20,450 --> 01:04:21,910 Struktura příbuzný v duchu. 1336 01:04:21,910 --> 01:04:24,670 Rozdíl však s frontě že jsme museli nějak vzpomenout, kdo 1337 01:04:24,670 --> 01:04:27,900 byl v přední části fronty, ve velkých část tak, aby jsme mohli udělat víc 1338 01:04:27,900 --> 01:04:30,530 efektivní využití paměti, alespoň pokud jsme pomocí pole. 1339 01:04:30,530 --> 01:04:35,460 >> Vzhledem k tomu, odvolání, pokud máme pole, pokud Například, to je přední část 1340 01:04:35,460 --> 01:04:38,470 fronta, když jsem si do fronty zde, a pak někdo dostane v souladu 1341 01:04:38,470 --> 01:04:42,710 za mnou, za mnou, za mnou, a jeden člověk vystoupí z řady, si 1342 01:04:42,710 --> 01:04:45,930 mohli, jak jsme viděli některé z našich člověka dobrovolníci ve třídě, mají všichni 1343 01:04:45,930 --> 01:04:47,100 posunout tímto způsobem. 1344 01:04:47,100 --> 01:04:50,880 Ale obecně, když všichni dělat něco, co není nejlepší využití času 1345 01:04:50,880 --> 01:04:54,600 v programu, protože to znamená, že vaše algoritmus běží v tom, co 1346 01:04:54,600 --> 01:04:56,520 asymptotická doba chodu? 1347 01:04:56,520 --> 01:04:57,420 Je to lineární. 1348 01:04:57,420 --> 01:04:59,600 >> A mám pocit, že je trochu hloupé. 1349 01:04:59,600 --> 01:05:02,890 Pokud je další člověk v řadě je další člověk, který má jít do 1350 01:05:02,890 --> 01:05:04,660 obchod, nemají všichni mají se pohybují společně. 1351 01:05:04,660 --> 01:05:08,200 Jen ať ten člověk se rval až přijde čas, například. 1352 01:05:08,200 --> 01:05:09,870 Takže můžeme si trochu času ušetřit tam. 1353 01:05:09,870 --> 01:05:14,840 A tak k tomu, že i když to znamená, že že hlava fronty nebo 1354 01:05:14,840 --> 01:05:18,060 přední fronty se chystá postupně pohybovat hlouběji a hlouběji 1355 01:05:18,060 --> 01:05:23,340 do pole a případně by mohly ve skutečnosti se zalomí kolem, pokud jsme pomocí 1356 01:05:23,340 --> 01:05:25,790 pole pro uložení lidi v této frontě. 1357 01:05:25,790 --> 01:05:28,390 Takže můžete téměř myslet pole jako kruhová údaje 1358 01:05:28,390 --> 01:05:29,880 struktura v tomto smyslu. 1359 01:05:29,880 --> 01:05:33,970 >> Takže si nějak muset sledovat velikost, nebo opravdu konec to 1360 01:05:33,970 --> 01:05:36,250 a pak, kde je počátek toho je. 1361 01:05:36,250 --> 01:05:39,490 Takže navrhujeme, že deklarujete jedna taková fronta, volání 1362 01:05:39,490 --> 01:05:41,330 to q, jen jedno písmeno. 1363 01:05:41,330 --> 01:05:44,570 Pak navrhujeme, aby přední být inicializován na nulu, a to, že velikost 1364 01:05:44,570 --> 01:05:45,470 být inicializován na nulu. 1365 01:05:45,470 --> 01:05:47,770 >> Takže teď, nic uvnitř této fronty. 1366 01:05:47,770 --> 01:05:50,910 A žádáme vás, abyste dokončit provádění Zařadí níže 1367 01:05:50,910 --> 01:05:55,250 takovým způsobem, že funkce přidá n na Konec q a potom vrátí hodnotu true. 1368 01:05:55,250 --> 01:05:58,690 Ale pokud q je plná, nebo negativní, Funkce by měla raději vrátit false. 1369 01:05:58,690 --> 01:06:01,060 A ti dal nám pár předpokladů. 1370 01:06:01,060 --> 01:06:04,320 Ale to není opravdu funkčně relevantní, jen to bool existuje, 1371 01:06:04,320 --> 01:06:06,690 protože, technicky, bool není existují v C, pokud obsahují 1372 01:06:06,690 --> 01:06:07,310 jisté hlavičkový soubor. 1373 01:06:07,310 --> 01:06:09,350 Takže to byla jen se tam, že byly ne je to jen trik 1374 01:06:09,350 --> 01:06:10,940 Otázka takové věci. 1375 01:06:10,940 --> 01:06:16,280 >> Tak enqueue, jsme navrhli ve vzorku řešení, realizovat následujícím způsobem. 1376 01:06:16,280 --> 01:06:20,420 Jednou jsme nejprve zkontrolujte snadnost, na nízko visící ovoce. 1377 01:06:20,420 --> 01:06:23,820 Pokud je fronta plná nebo číslo, které se snažíte vložit je méně 1378 01:06:23,820 --> 01:06:26,380 než nula, které jsme si řekli v Specifikace problému by 1379 01:06:26,380 --> 01:06:30,320 nemělo být dovoleno, protože chceme jen non-záporné hodnoty, pak byste měli 1380 01:06:30,320 --> 01:06:31,640 jen vrátit okamžitě false. 1381 01:06:31,640 --> 01:06:33,820 Takže některé poměrně snadné Kontrola chyb. 1382 01:06:33,820 --> 01:06:38,720 Pokud však budete chtít přidat, že skutečná číslo, co musel udělat trochu 1383 01:06:38,720 --> 01:06:39,440 na mysli. 1384 01:06:39,440 --> 01:06:41,330 A to je místo, kde je to trochu nepříjemné psychicky, protože budete muset 1385 01:06:41,330 --> 01:06:43,000 přijít na to, jak zacházet s wraparound. 1386 01:06:43,000 --> 01:06:46,870 >> Ale zárodek myšlenky zde, že je na zájem pro nás je, že ovinovací 1387 01:06:46,870 --> 01:06:51,480 často znamená, modulární aritmetika a mod operátor, procento straně, 1388 01:06:51,480 --> 01:06:55,140 kde můžete jít z větší hodnoty zpět na nulu, a pak jeden a dva a 1389 01:06:55,140 --> 01:06:58,650 tři a pak zpět kolem nuly, jedna a dvě a tři a tak dále 1390 01:06:58,650 --> 01:06:59,380 znovu a znovu. 1391 01:06:59,380 --> 01:07:02,880 Takže způsob, jak navrhujeme dělat to je že my chceme, aby index do 1392 01:07:02,880 --> 01:07:05,850 Pole s názvem čísla, kde naše celá čísla lhát. 1393 01:07:05,850 --> 01:07:10,740 Ale tam dostat, nejprve chci udělat bez ohledu na velikost fronty, ale je 1394 01:07:10,740 --> 01:07:14,080 přidejte se, že bez ohledu na Přední část seznamu je. 1395 01:07:14,080 --> 01:07:17,880 A efekt, který je nám dát na pravá pozice ve frontě a 1396 01:07:17,880 --> 01:07:20,970 Nepředpokládejte, že první osoba v souladu je na začátku, kterému 1397 01:07:20,970 --> 01:07:24,130 ona absolutně mohlo být, pokud bychom byl také posun každého. 1398 01:07:24,130 --> 01:07:26,710 Ale my jsme jen vytvořit práci pro sebe, kdybychom se 1399 01:07:26,710 --> 01:07:27,800 že konkrétní cesta. 1400 01:07:27,800 --> 01:07:29,330 >> Takže můžeme udržet relativně jednoduché. 1401 01:07:29,330 --> 01:07:32,180 Nechceme mít na paměti, že jsme jen přidal int do fronty. 1402 01:07:32,180 --> 01:07:35,850 A pak jsme se jen vrátit true. 1403 01:07:35,850 --> 01:07:38,560 Mezitím, v dequeue, jsme se zeptali můžete provést následující kroky. 1404 01:07:38,560 --> 01:07:42,260 Provést to takovým způsobem, že dequeues, že se odstraňuje a vrátí, 1405 01:07:42,260 --> 01:07:44,190 int na přední straně fronty. 1406 01:07:44,190 --> 01:07:46,410 Chcete-li odstranit int, postačí na to zapomenout. 1407 01:07:46,410 --> 01:07:47,650 Nemusíte přepsat svým dílem. 1408 01:07:47,650 --> 01:07:48,820 Takže je to pořád vlastně tam. 1409 01:07:48,820 --> 01:07:51,930 Stejně jako dat na pevném disku, jsme prostě ignorovat skutečnost, 1410 01:07:51,930 --> 01:07:52,970 že je to teď. 1411 01:07:52,970 --> 01:07:55,520 A pokud q je prázdná, měli bychom místo toho vrátí negativní 1. 1412 01:07:55,520 --> 01:07:56,750 Tak to cítí libovolný. 1413 01:07:56,750 --> 01:08:01,640 Proč návrat Negativní 1 místo falešný? 1414 01:08:01,640 --> 01:08:02,620 Jo. 1415 01:08:02,620 --> 01:08:05,070 >> DIVÁKŮ: Q je ukládání kladné hodnoty. 1416 01:08:05,070 --> 01:08:10,950 Vzhledem k tomu, uložit pouze kladné hodnoty v q, negativní je chyba. 1417 01:08:10,950 --> 01:08:11,510 >> DAVID J. Malan: OK, to je pravda. 1418 01:08:11,510 --> 01:08:14,850 Takže protože jsme jen ukládání pozitivní hodnoty nebo nula, pak je to v pořádku, aby 1419 01:08:14,850 --> 01:08:18,050 vrátí zápornou hodnotu jako strážce hodnota, speciální symbol. 1420 01:08:18,050 --> 01:08:21,630 Ale vy jste přepisování historie tam, protože důvod, proč jsme jen 1421 01:08:21,630 --> 01:08:25,890 vrací non-záporné hodnoty je proto, že chceme, aby 1422 01:08:25,890 --> 01:08:27,670 mít hodnotu sentinel. 1423 01:08:27,670 --> 01:08:32,617 Takže konkrétně, proč ne jen return false v případě chyby? 1424 01:08:32,617 --> 01:08:33,099 Jo. 1425 01:08:33,099 --> 01:08:35,510 >> DIVÁKŮ: jsi selhal vrátí celočíselnou hodnotu. 1426 01:08:35,510 --> 01:08:36,630 >> DAVID J. Malan: Přesně tak. 1427 01:08:36,630 --> 01:08:38,569 A to je místo, kde C dostane docela omezující. 1428 01:08:38,569 --> 01:08:40,590 Pokud říkáte, že jdete vrátit int, máte 1429 01:08:40,590 --> 01:08:41,279 vrátit int. 1430 01:08:41,279 --> 01:08:43,689 Nemůžete dostat fantazie a začít vracet bool nebo float nebo 1431 01:08:43,689 --> 01:08:45,040 string nebo něco takového. 1432 01:08:45,040 --> 01:08:49,370 Nyní, mezitím, JavaScript a PHP, a některé jiné jazyky mohou, ve skutečnosti, 1433 01:08:49,370 --> 01:08:51,310 jste se vrátil jiný typy hodnot. 1434 01:08:51,310 --> 01:08:54,819 A to může ve skutečnosti být užitečné, pokud můžete vrátit pozitivní INT, nuly, 1435 01:08:54,819 --> 01:08:59,439 negativní ints, nebo false nebo null ještě znamenat chybu. 1436 01:08:59,439 --> 01:09:01,890 Ale my nemáme, že Všestrannost v C. 1437 01:09:01,890 --> 01:09:04,569 >> Takže s dequeue, co jsme navrhnout, aby udělat, je - 1438 01:09:04,569 --> 01:09:07,350 1439 01:09:07,350 --> 01:09:09,830 >> ROB BOWDEN: Můžete se vrátit false. 1440 01:09:09,830 --> 01:09:13,189 Je to jen, že falešná je hash definovat false na nulu. 1441 01:09:13,189 --> 01:09:16,000 Takže pokud jste se vrátit false, budete vracet nulu. 1442 01:09:16,000 --> 01:09:25,470 A nula je platný věc v naší frontě, vzhledem k tomu, negativní 1 není-li 1443 01:09:25,470 --> 01:09:27,000 false stalo negativní 1. 1444 01:09:27,000 --> 01:09:29,972 Ale neměli byste ani potřebují vědět, že. 1445 01:09:29,972 --> 01:09:32,399 >> DAVID J. Malan: To je proč jsem to neřekl. 1446 01:09:32,399 --> 01:09:36,450 >> ROB BOWDEN: Ale to není pravda že se nemůžete vrátit false. 1447 01:09:36,450 --> 01:09:37,700 >> DAVID J. Malan: Jistě. 1448 01:09:37,700 --> 01:09:40,920 1449 01:09:40,920 --> 01:09:44,240 Takže dequeue, všimněte si, přijímáme ztrátu jako svůj argument. 1450 01:09:44,240 --> 01:09:45,479 A to proto, že nejsme kolem nic palců 1451 01:09:45,479 --> 01:09:48,359 Chceme jen odstranit prvek na přední straně fronty. 1452 01:09:48,359 --> 01:09:49,819 Takže, jak můžeme jít asi dělá? 1453 01:09:49,819 --> 01:09:51,290 No, za prvé, pojďme na to Rychlá kontrola zdravý rozum. 1454 01:09:51,290 --> 01:09:53,350 Pokud je velikost fronty je 0, je tu žádná práce je třeba udělat. 1455 01:09:53,350 --> 01:09:54,210 Návrat negativní 1. 1456 01:09:54,210 --> 01:09:54,800 Hotovo. 1457 01:09:54,800 --> 01:09:56,340 Tak to je pár řádků o mém programu. 1458 01:09:56,340 --> 01:09:58,180 Takže jen čtyři řádky zůstanou. 1459 01:09:58,180 --> 01:10:01,310 >> Tak tady jsem se rozhodl decrement velikosti. 1460 01:10:01,310 --> 01:10:04,620 A účinně snižující velikost Znamená to, že jsem zapomněl 1461 01:10:04,620 --> 01:10:06,010 něco, co je tam. 1462 01:10:06,010 --> 01:10:09,910 Ale já jsem také aktualizovat, pokud přední čísla jsou. 1463 01:10:09,910 --> 01:10:11,620 Takže k tomu, že musím udělat dvě věci. 1464 01:10:11,620 --> 01:10:16,390 Nejprve musím mít na paměti, jaké číslo je na přední straně fronty, 1465 01:10:16,390 --> 01:10:17,860 protože musím vrátit tu věc. 1466 01:10:17,860 --> 01:10:20,910 Takže nechci, aby náhodou zapomněl o tom a pak jej přepsat. 1467 01:10:20,910 --> 01:10:22,840 Jdu si vzpomenout na int. 1468 01:10:22,840 --> 01:10:27,310 >> A teď, chci aktualizovat q.front být q.front +1. 1469 01:10:27,310 --> 01:10:30,070 Takže jestli to byl první osoba v linka, teď chci udělat, plus 1 na 1470 01:10:30,070 --> 01:10:31,930 poukazují na další osoby v souladu. 1471 01:10:31,930 --> 01:10:33,420 Ale musím zvládnout, že wraparound. 1472 01:10:33,420 --> 01:10:37,270 A pokud kapacita je globální konstanta, že to bude mi dovolte, abych se ujistil, 1473 01:10:37,270 --> 01:10:41,140 jak jsem se poukázat na poslední osobou v linka, operace modulo přinese 1474 01:10:41,140 --> 01:10:43,840 mě zpátky na nulu přední fronty. 1475 01:10:43,840 --> 01:10:46,050 A to zpracovává wraparound zde. 1476 01:10:46,050 --> 01:10:48,950 A pak jsem se přistoupit k návratu n. 1477 01:10:48,950 --> 01:10:51,530 >> Nyní, přesněji řečeno, já ne musí prohlásit n. 1478 01:10:51,530 --> 01:10:53,880 Nemusel jsem se chytit ji a uložte jej dočasně, protože hodnota je 1479 01:10:53,880 --> 01:10:54,740 ještě tam. 1480 01:10:54,740 --> 01:10:57,490 Takže jsem mohl jen udělat správnou aritmetické pro návrat bývalého šéfa 1481 01:10:57,490 --> 01:10:58,450 fronty. 1482 01:10:58,450 --> 01:11:01,850 Ale já prostě cítil, že to bylo více zřejmé, skutečně chytit int, dát 1483 01:11:01,850 --> 01:11:04,320 v roce n, a pak se vrátit, že z důvodů přehlednosti, ale 1484 01:11:04,320 --> 01:11:05,735 není nezbytně nutné. 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 Jsou to všechno vyslovitelné v mé hlavě. 1488 01:11:13,410 --> 01:11:15,940 1489 01:11:15,940 --> 01:11:19,110 >> ROB BOWDEN: Takže první otázka je binární strom problém. 1490 01:11:19,110 --> 01:11:22,140 Takže první otázka je, že jsme vzhledem tato čísla. 1491 01:11:22,140 --> 01:11:27,160 A my chceme, aby nějak vložit do Tyto uzly tak, že je 1492 01:11:27,160 --> 01:11:30,110 platí binární vyhledávací strom. 1493 01:11:30,110 --> 01:11:36,260 Takže jedna věc k zapamatování binární vyhledávací stromy, je, že to není 1494 01:11:36,260 --> 01:11:39,800 jen to, co na levé straně je menší, a to na 1495 01:11:39,800 --> 01:11:41,120 právo je větší. 1496 01:11:41,120 --> 01:11:44,580 Je třeba, aby se stát, že celý strom vlevo je menší, a celý strom 1497 01:11:44,580 --> 01:11:45,740 na pravé straně je větší. 1498 01:11:45,740 --> 01:11:55,260 >> Takže když jsem dal 34 tady nahoře, a pak Dal jsem 20 tady, tak to platí, aby 1499 01:11:55,260 --> 01:11:56,970 daleko, protože 34 až tady. 1500 01:11:56,970 --> 01:11:57,920 20 bude na levé straně. 1501 01:11:57,920 --> 01:11:58,950 Tak to je méně. 1502 01:11:58,950 --> 01:12:03,640 Ale nemůžu pak dal 59 tady, protože 59, i když je na pravé straně 20, 1503 01:12:03,640 --> 01:12:06,140 je to pořád na levé straně 34. 1504 01:12:06,140 --> 01:12:10,760 Tak s tímto omezením na mysli, Nejjednodušší způsob, jak zřejmě řešení tohoto 1505 01:12:10,760 --> 01:12:14,330 Problém je jen trochu z těchto čísel - 1506 01:12:14,330 --> 01:12:18,720 tak 20, 34, 36, 52, 59, 106. 1507 01:12:18,720 --> 01:12:21,640 A pak vložíte zleva doprava. 1508 01:12:21,640 --> 01:12:23,390 >> Takže 20 jde zde. 1509 01:12:23,390 --> 01:12:24,630 34 jde zde. 1510 01:12:24,630 --> 01:12:25,830 36 jde zde. 1511 01:12:25,830 --> 01:12:29,360 52, 59, 106. 1512 01:12:29,360 --> 01:12:34,730 A také by přišel na to, s některé připojením a realizaci, 1513 01:12:34,730 --> 01:12:38,830 oh, počkej, já nemám dost čísel vyplnit to ve více než tady. 1514 01:12:38,830 --> 01:12:42,170 Takže musím reshift, co my trasa poznámka bude. 1515 01:12:42,170 --> 01:12:47,490 Ale všimněte si, že v posledních třech, pokud budete číst zleva doprava, je v 1516 01:12:47,490 --> 01:12:48,740 zvyšuje objednávky. 1517 01:12:48,740 --> 01:12:52,150 1518 01:12:52,150 --> 01:12:56,540 >> Takže teď, chceme deklarovat, co struct bude pro 1519 01:12:56,540 --> 01:12:58,300 Uzly tohoto stromu. 1520 01:12:58,300 --> 01:13:02,720 Takže to, co potřebujeme v binárním stromu? 1521 01:13:02,720 --> 01:13:05,830 Takže máme hodnotu typu int, takže některé int hodnota. 1522 01:13:05,830 --> 01:13:07,220 Já nevím, co jsme nazvali se v roztoku - 1523 01:13:07,220 --> 01:13:08,500 int n. 1524 01:13:08,500 --> 01:13:13,570 Potřebujeme ukazatel na levé straně dítěte a ukazatel na pravé dítě. 1525 01:13:13,570 --> 01:13:17,540 Takže to bude vypadat takto. 1526 01:13:17,540 --> 01:13:20,510 A to bude ve skutečnosti vypadat před když se dvakrát vázaná 1527 01:13:20,510 --> 01:13:25,090 Seznam věcí, tak Oznámení - 1528 01:13:25,090 --> 01:13:27,860 Budu muset procházet všechny Cesta zpět dolů do problému 11. 1529 01:13:27,860 --> 01:13:30,980 1530 01:13:30,980 --> 01:13:36,390 >> Takže všimnete, že vypadá stejně jako to, kromě nás jen tak zavolat těchto 1531 01:13:36,390 --> 01:13:38,590 různá jména. 1532 01:13:38,590 --> 01:13:41,440 Stále máme celé číslo hodnota a dva ukazatele. 1533 01:13:41,440 --> 01:13:44,850 Je to jen, že místo léčení ukazatele jako směřující k další věci 1534 01:13:44,850 --> 01:13:47,955 a předchozí věc, my léčbě ukazatelé poukázat na levé dítě 1535 01:13:47,955 --> 01:13:49,205 a právo dítě. 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 Tak to je naše struct uzel. 1539 01:13:59,650 --> 01:14:03,920 A teď, jediná funkce je třeba realizovat, je to traverza, která 1540 01:14:03,920 --> 01:14:08,320 Chceme jít přes strom, tisk z hodnot stromu v pořadí. 1541 01:14:08,320 --> 01:14:15,241 >> Takže hledáte tady, bychom chtěli vytisknout z 20, 34, 36, 52, 59, a 106. 1542 01:14:15,241 --> 01:14:17,970 Jak jsme toho dosáhli? 1543 01:14:17,970 --> 01:14:18,890 Takže je to dost podobné. 1544 01:14:18,890 --> 01:14:22,910 Pokud jste viděli v minulém zkoušku problém že jste chtěli vytisknout 1545 01:14:22,910 --> 01:14:25,940 Celý strom s čárkami mezi všechno, to bylo vlastně ještě 1546 01:14:25,940 --> 01:14:27,320 jednodušší, než to. 1547 01:14:27,320 --> 01:14:30,950 Takže tady je řešení. 1548 01:14:30,950 --> 01:14:33,110 To bylo výrazně jednodušší pokud jste to udělal rekurzivně. 1549 01:14:33,110 --> 01:14:36,650 Nevím, jestli někdo pokusil na to iterativně. 1550 01:14:36,650 --> 01:14:38,340 >> Ale nejdřív, máme základní případ. 1551 01:14:38,340 --> 01:14:39,660 Co v případě, že kořen je null? 1552 01:14:39,660 --> 01:14:40,610 Pak jsme jen tak vrátit. 1553 01:14:40,610 --> 01:14:42,300 Nechceme tisknout cokoli. 1554 01:14:42,300 --> 01:14:45,940 Jinak budeme procházet rekurzivně dolů. 1555 01:14:45,940 --> 01:14:48,140 Vytisknout celý levý podstrom. 1556 01:14:48,140 --> 01:14:51,440 Takže tisknout vše méně než mé současné hodnoty. 1557 01:14:51,440 --> 01:14:53,930 A pak budu tisknout sám. 1558 01:14:53,930 --> 01:14:57,310 A pak budu recurse se my Celá pravá podstrom, takže vše 1559 01:14:57,310 --> 01:14:58,810 větší než moje hodnoty. 1560 01:14:58,810 --> 01:15:03,870 A to se bude tisknout se vše v pořádku. 1561 01:15:03,870 --> 01:15:05,860 Otázky o tom, jak to ve skutečnosti dosáhne, že? 1562 01:15:05,860 --> 01:15:09,892 1563 01:15:09,892 --> 01:15:12,545 >> DIVÁKŮ: Mám otázku na [neslyšitelné]. 1564 01:15:12,545 --> 01:15:15,090 1565 01:15:15,090 --> 01:15:23,550 >> ROB BOWDEN: Takže jeden způsob, jak se blíží každá rekurzivní problém je jen, že 1566 01:15:23,550 --> 01:15:26,275 o to, jako bys měl myslet o všech případech rohu. 1567 01:15:26,275 --> 01:15:32,150 1568 01:15:32,150 --> 01:15:38,110 Takže za to, že chceme, aby vytisknout celý tento strom. 1569 01:15:38,110 --> 01:15:42,030 Takže vše, co se zaměříme na Je to zvláštní uzel - 1570 01:15:42,030 --> 01:15:43,740 36. 1571 01:15:43,740 --> 01:15:47,420 V rekurzivní volání, předstíráme ty prostě fungovat. 1572 01:15:47,420 --> 01:15:54,000 Tak tady to rekurzivní volání traverza, my bez přemýšlení 1573 01:15:54,000 --> 01:15:58,640 o tom, jen posuvné levé tři, představte si, že už se vytiskne 20 1574 01:15:58,640 --> 01:16:00,730 a 34 pro nás. 1575 01:16:00,730 --> 01:16:03,350 A pak, když jsme se nakonec rekurzivně volejte posuv na 1576 01:16:03,350 --> 01:16:07,890 pravdu, že bude správně tisknout 52, 59, a 106 pro nás. 1577 01:16:07,890 --> 01:16:13,620 >> Takže za předpokladu, že to může tisknout 20, 34, a ostatní lze tisknout 52, 59, 108, 1578 01:16:13,620 --> 01:16:17,180 všichni musíme být schopni udělat, je vytisknout sami ve středu, která. 1579 01:16:17,180 --> 01:16:21,250 Takže vytisknout vše, co před námi. 1580 01:16:21,250 --> 01:16:27,710 Vytisknout sami, takže aktuální uzel pro tisk 36, pravidelné printf, a pak 1581 01:16:27,710 --> 01:16:31,170 tisknout vše, co po nás. 1582 01:16:31,170 --> 01:16:32,730 >> DAVID J. Malan: To je místo, kde rekurze dostane opravdu krásné. 1583 01:16:32,730 --> 01:16:36,270 Je to úžasný skok víry, kde budete dělat nejmenší kousek práce. 1584 01:16:36,270 --> 01:16:38,460 A pak se nechat někoho jiný se postará o zbytek. 1585 01:16:38,460 --> 01:16:40,180 A že někdo jiný Je ironií osudu, můžete. 1586 01:16:40,180 --> 01:16:44,260 1587 01:16:44,260 --> 01:16:48,360 Takže pro závažné body za snaživost, pokud stiskněte navigační tlačítko nahoru na otázky - 1588 01:16:48,360 --> 01:16:50,530 >> ROB BOWDEN: Na otázky? 1589 01:16:50,530 --> 01:16:53,490 >> DAVID J. Malan: A trochu dolů na čísla, nevíte někdo, kde 1590 01:16:53,490 --> 01:16:55,190 Tato čísla pocházejí z? 1591 01:16:55,190 --> 01:16:56,610 >> ROB BOWDEN: Mám doslova tušení. 1592 01:16:56,610 --> 01:16:59,794 >> DAVID J. Malan: Objevují celé kvíz. 1593 01:16:59,794 --> 01:17:01,150 >> DIVÁKŮ: Jsou stejná čísla? 1594 01:17:01,150 --> 01:17:01,910 >> DAVID J. Malan: Tato čísla. 1595 01:17:01,910 --> 01:17:03,260 Trochu velikonoční vajíčko. 1596 01:17:03,260 --> 01:17:08,100 Takže pro ty z vás, sledovat on-line na domů, pokud nám můžete říci, prostřednictvím e-mailu na 1597 01:17:08,100 --> 01:17:12,680 heads@CS50.net co význam na tyto opakované šest čísel jsou 1598 01:17:12,680 --> 01:17:18,560 celé Quiz 1, budeme sprchovat vás s úžasnou pozornost na finále 1599 01:17:18,560 --> 01:17:21,610 přednáška a stres míček. 1600 01:17:21,610 --> 01:17:25,460 1601 01:17:25,460 --> 01:17:27,790 Pěkné, jemné. 1602 01:17:27,790 --> 01:17:29,570 >> ROB Bowden: Nějaké poslední otázky o něco na ten kvíz? 1603 01:17:29,570 --> 01:17:32,608