1 00:00:00,000 --> 00:00:12,040 >> [Predvajanje glasbe] 2 00:00:12,040 --> 00:00:16,460 >> ZVOČNIK 1: V redu, to je CS50, in to je začetek štirih tednu 3 00:00:16,460 --> 00:00:20,420 in kot ste lahko slišali ali prebral, je bil svet konča. 4 00:00:20,420 --> 00:00:23,520 Gre vse po internetu se je znanje in osveščenost 5 00:00:23,520 --> 00:00:27,100 bug v program, programski jezik imenovan Bash. 6 00:00:27,100 --> 00:00:32,729 To je bilo čudovito blagovno znamko kot Shellshock ali vrat Bash, 7 00:00:32,729 --> 00:00:35,485 vendar predmeti, kot so ti niso bili redki. 8 00:00:35,485 --> 00:00:38,807 In v resnici, mnogi od njih prinese nazaj spomine Heartbleed, 9 00:00:38,807 --> 00:00:41,640 ki ste morda opazili v pritisnite nazaj to čez pomlad, ki 10 00:00:41,640 --> 00:00:43,980 je bilo podobno precej dramatično. 11 00:00:43,980 --> 00:00:47,110 Zdaj za tiste, ki ste tu danes, koliko od vas ima, 12 00:00:47,110 --> 00:00:50,330 tudi če ne boste razumeli, kaj to je vse o, slišal Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Vse v redu, in koliko vas računalnike, ki so ranljivi? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, ne bi smelo biti veliko, veliko več roke do sedaj, iz razlogov, bomo videli. 17 00:01:00,250 --> 00:01:02,580 >> Oglejmo si, kaj je se dogaja v medijih 18 00:01:02,580 --> 00:01:05,304 in potem to pojasni malo tu za nas tehnično. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> SPEAKER 2: Varnostni strokovnjaki imajo Opozoril je, da bi resna napaka 21 00:01:11,250 --> 00:01:15,650 biti na tem, da vplivajo na stotine milijone svetovnih uporabnikov spleta. 22 00:01:15,650 --> 00:01:20,600 Torej, kaj točno je hrošč, ki je bil poimenovan Shellshock, in kaj storiti? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Torej, je Shellshock znan tudi kot Bash bug, software izkorišča. 25 00:01:28,910 --> 00:01:33,230 Hekerji uporabljajo virus skeniranje ranljivi sistemov teče Linux in UNIX 26 00:01:33,230 --> 00:01:36,300 operacijske sisteme in jih nato okuži. 27 00:01:36,300 --> 00:01:38,730 Bash je ukazni vrstici lupine. 28 00:01:38,730 --> 00:01:43,460 To omogoča uporabnikom, vprašanje ukaze za začetek Programi in funkcije v programski opremi 29 00:01:43,460 --> 00:01:45,250 ki jih vnesete v besedilo. 30 00:01:45,250 --> 00:01:49,980 To je s programerji običajno uporabljajo, in ne bi smeli biti odprti za širši svet, 31 00:01:49,980 --> 00:01:51,590 čeprav Shellshock spremeni to. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> No, worringly, nekateri analitiki opozarjajo, da bi lahko bila večja grožnja, 34 00:01:57,910 --> 00:02:01,580 ker Shellshock omogoča popoln nadzor okuženem računalniku, 35 00:02:01,580 --> 00:02:06,030 ker Heartbleed le dovoljene hekerji za vohunjenje za računalnike. 36 00:02:06,030 --> 00:02:09,130 To je tako resna, da je je ocenjeno na 10 od 10 37 00:02:09,130 --> 00:02:11,900 za resnost s strani nacionalnih Ranljivost Database. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 vseh spletnih strežnikov na tveganje, vključno z nekaterimi Mac računalnikov. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Torej, poskrbite, da boste obliž svoje sisteme zdaj. 42 00:02:25,600 --> 00:02:29,330 Vsakdo, ki gosti spletno stran teče prizadeta operacijski sistemi 43 00:02:29,330 --> 00:02:31,800 bi moral ukrepati čim prej. 44 00:02:31,800 --> 00:02:35,390 Vsakdo, ki si lahko privoščijo, da je treba iskati na njihovo uporabo za spremljanje in spletni 45 00:02:35,390 --> 00:02:37,355 požarni zidovi, da pazi za napade. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 ZVOČNIK 3: Najhuje da bi se lahko zgodilo, je 48 00:02:41,770 --> 00:02:45,080 da bi nekdo napisal kodo, ki bo samodejno zagnal in skeniranje 49 00:02:45,080 --> 00:02:48,280 internet in bi vplivala na vsi od teh računalnikov. 50 00:02:48,280 --> 00:02:50,710 In ko bodo to storili, dobro, najslabša stvar, ki jo lahko naredite 51 00:02:50,710 --> 00:02:53,300 je šele izbrisati vse, ali zapreti mesta navzdol. 52 00:02:53,300 --> 00:02:55,360 Tako smo lahko videli škodo iz tega vidika, 53 00:02:55,360 --> 00:02:58,300 kjer bi imeli zlonamernih ljudi ki samo odloči, da bo povzročil opustošenje 54 00:02:58,300 --> 00:03:02,534 Z uskladitvijo sistemov navzdol ali brisanje datoteke in take stvari. 55 00:03:02,534 --> 00:03:05,200 SPEAKER 2: Nekateri pravijo, da je to ena izmed najbolj težko izmeriti 56 00:03:05,200 --> 00:03:08,080 hrošči v letih, in to lahko traja tedne ali celo 57 00:03:08,080 --> 00:03:10,820 mesecev za določitev končnega učinka. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> ZVOČNIK 1: Torej, vse to je res, vendar Hecno je, skoraj vse 60 00:03:15,560 --> 00:03:18,330 od podob, ki ste jo pravkar videl, razen morda tipkovnico, 61 00:03:18,330 --> 00:03:20,930 nima nič opraviti z bug whatsoever. 62 00:03:20,930 --> 00:03:23,960 Strežniki in žice in tako naprej, to je nekako le bežno povezani, 63 00:03:23,960 --> 00:03:27,410 ampak bistvo je pravzaprav zelo seznanjeni, kaj se dogaja tukaj. 64 00:03:27,410 --> 00:03:30,050 V bistvu me spustili v naša CS50 aparata. 65 00:03:30,050 --> 00:03:32,910 Dovolite mi, da gredo naprej in čim bolj terminal window tukaj. 66 00:03:32,910 --> 00:03:36,020 In fantje so bili z uporabo tega ali vdelani njihove različice, 67 00:03:36,020 --> 00:03:39,460 v gedit za pisanje programov, vpisovati ukaze, in tako naprej, 68 00:03:39,460 --> 00:03:43,690 in to je dejansko, in ima že več tednov, Bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 To je Bourne-spet lupini, ki je samo fancy način rekel, 70 00:03:46,890 --> 00:03:50,220 to je program, ki ima utripa hitro, učinkovito, 71 00:03:50,220 --> 00:03:51,970 da sedi tam čaka za vhod za vas. 72 00:03:51,970 --> 00:03:53,920 In to je ukaz linijski vmesnik, prek katerega 73 00:03:53,920 --> 00:03:57,650 fantje so bili teče ukaze in končno sestavljanje in nato teče 74 00:03:57,650 --> 00:03:58,400 programov. 75 00:03:58,400 --> 00:04:01,320 >> Ampak Bash je tudi programiranje jezika v naslednjem smislu. 76 00:04:01,320 --> 00:04:05,460 Veste, da obstajajo ukazi, kot so cd in ls in tudi Jek in drugi, 77 00:04:05,460 --> 00:04:09,580 vendar pa lahko določite lastne ukaze ki jih za njihovo izvajanje v Bash. 78 00:04:09,580 --> 00:04:11,420 Zdaj mi ne bo iti v podrobnosti 79 00:04:11,420 --> 00:04:16,089 da Bash programski jezik, ampak vedeti, na primer, da se v trenutku, 80 00:04:16,089 --> 00:04:17,607 ni ukaz imenovano "zdravo." 81 00:04:17,607 --> 00:04:19,440 Tako je mogoče najti v eden od teh paketov. 82 00:04:19,440 --> 00:04:20,856 To ni nameščen na mojem računalniku. 83 00:04:20,856 --> 00:04:21,870 Se obrnite na skrbnika. 84 00:04:21,870 --> 00:04:26,030 Ampak, če želim, da obstaja program, imenovano "zdravo" v Bash ali na mojem pozivu, 85 00:04:26,030 --> 00:04:30,810 Jaz lahko dejansko uporabljajo sintakso, ki je zelo všeč C. To ni čisto enak, 86 00:04:30,810 --> 00:04:35,020 ampak izgleda precej podobno funkcijo, čeprav manjka nekaj podrobnosti. 87 00:04:35,020 --> 00:04:38,090 Nič ne kaže, da se zgodi, ampak zdaj, če sem tip "zdravo" 88 00:04:38,090 --> 00:04:40,960 lahko dejansko napisati Program, ne v C, ne v Java, 89 00:04:40,960 --> 00:04:44,280 ne v drugem načrtovanju jezik, ampak v Bash sam. 90 00:04:44,280 --> 00:04:47,630 >> Zdaj Ključno je, da sem napisal ime sem si želel, da bi ta novi ukaz, 91 00:04:47,630 --> 00:04:50,820 in oklepaji so tudi simbolična saj je to funkcijo. 92 00:04:50,820 --> 00:04:54,010 Naj omenim, da lahko to storite tudi zabavno stvari, in v resnici, tudi na Mac OS, 93 00:04:54,010 --> 00:04:55,620 To je program, imenovan Terminal. 94 00:04:55,620 --> 00:04:58,800 Na voljo je vgrajen v kdorkoli je Računalnik, ki ima Mac v tej sobi, 95 00:04:58,800 --> 00:05:03,640 in lahko storite podobne stvari na Mac OS, lahko pa gre za več kot to. 96 00:05:03,640 --> 00:05:07,110 In to je malo tangencialna, ampak to je kar zabavno. 97 00:05:07,110 --> 00:05:09,715 Sem se spomnil zjutraj, ko je ta razmišljanja, 98 00:05:09,715 --> 00:05:13,279 z malo igro sem igral z enim od CS50 nekdanjih TF 99 00:05:13,279 --> 00:05:16,570 s katerim koli je hodil od njegova tipkovnica s svojo zaslon odklenjen, 100 00:05:16,570 --> 00:05:23,611 Jaz bi izvršitev ukaza kot to-- "pozdravi". 101 00:05:23,611 --> 00:05:26,610 In zdaj vsak čas se je vrnil v svojo tipkovnico, ko sem odprl zaslon 102 00:05:26,610 --> 00:05:27,985 in bi on sedi, poskusite narediti nekaj dela, 103 00:05:27,985 --> 00:05:29,250 Vsebino svojega directory-- 104 00:05:29,250 --> 00:05:29,510 >> [AUDIO PREDVAJANJE] 105 00:05:29,510 --> 00:05:30,010 >> Zdravo. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Pozdravljeni. 108 00:05:32,120 --> 00:05:35,030 >> ZVOČNIK 1: Tako je v pravičnosti, ni bilo dejansko "zdravo." 109 00:05:35,030 --> 00:05:36,894 Ponavadi je bilo nekaj bolj podobna to-- 110 00:05:36,894 --> 00:05:37,560 [AUDIO PREDVAJANJE] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 ZVOČNIK 1: --that I bilo-- tako da bi njegov računalnik 113 00:05:39,320 --> 00:05:42,170 Prisegam na njega kadar koli je dejansko sedel na svoji tipkovnici. 114 00:05:42,170 --> 00:05:46,265 In zelo hitro je pogruntal da ne zapustijo njegov zaslon odklenjen. 115 00:05:46,265 --> 00:05:48,730 Vendar to kaže na neke butasto zabave, ki vas 116 00:05:48,730 --> 00:05:50,210 imajo lahko z nekaj podobnega Bash. 117 00:05:50,210 --> 00:05:52,770 Ampak to je malo več resno, da ne bo pomote, kot to. 118 00:05:52,770 --> 00:05:57,235 In v resnici, to je eden najnevarnejši in dolgotrajne bugs 119 00:05:57,235 --> 00:05:58,860 da je res zajela svet v svetovnem merilu. 120 00:05:58,860 --> 00:06:02,060 Ta bug je bila približno približno 20 let, 121 00:06:02,060 --> 00:06:05,780 in boste udari v samo Trenutek, ki ga njegove relativne preprostosti. 122 00:06:05,780 --> 00:06:07,990 >> Torej je ta zastopnik ukaz, da če vas 123 00:06:07,990 --> 00:06:10,448 lastnik Mac dobesedno zdaj ko imate svoj pokrov odprt, 124 00:06:10,448 --> 00:06:12,940 lahko poskusite tipkanje v to program, imenovan Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminal je pod Aplikacije Utilities-- 126 00:06:15,410 --> 00:06:18,790 za enkrat, Windows uporabniki ne bi bilo treba skrbeti za to določenem threat-- 127 00:06:18,790 --> 00:06:22,310 ampak tisti, ki ste z Maci lahko vnesete to v oknu, kot bom naredil tukaj, 128 00:06:22,310 --> 00:06:24,210 in če vam tip da se v ta program 129 00:06:24,210 --> 00:06:28,830 imenovan Terminal, kot bom zdaj, če vidite besedo "ranljivi" 130 00:06:28,830 --> 00:06:32,200 računalnik izpostavljeni izkoriščanju. 131 00:06:32,200 --> 00:06:33,850 >> Kaj to dejansko pomeni? 132 00:06:33,850 --> 00:06:35,870 In to je res nekateri precej noro sintaksa, 133 00:06:35,870 --> 00:06:39,050 ampak dajmo vsaj potegnili nekatere zanimive vidike. 134 00:06:39,050 --> 00:06:42,567 Torej je nekaj sintakse, ki je videti malo znano, vsaj od C 135 00:06:42,567 --> 00:06:43,950 in načrtovanje na splošno. 136 00:06:43,950 --> 00:06:47,550 Vidim nekaj oklepajev, podpičja, zavitimi oklepaji, in take, 137 00:06:47,550 --> 00:06:50,820 vendar se izkaže, da je to neumna stvar tukaj v rumeno 138 00:06:50,820 --> 00:06:53,580 je v bistvu funkcija da ne naredi ničesar. 139 00:06:53,580 --> 00:06:57,840 Sredstva debelega črevesa storiti ničesar, in podpičje pomeni stop delam nič. 140 00:06:57,840 --> 00:07:00,250 Tako znotraj teh zavitimi oklepaji, dejstvo, 141 00:07:00,250 --> 00:07:02,440 da imam enako podpis na levo, to 142 00:07:02,440 --> 00:07:05,500 je v bistvu ustvarjanje ukaz, ali spremenljivi 143 00:07:05,500 --> 00:07:09,520 imenuje x in ga dodeliti da je rumena malo kode tam. 144 00:07:09,520 --> 00:07:14,040 , Da bi lahko nekaj podobnega "echo zdravo "ali" pravijo beep "ali kaj 145 00:07:14,040 --> 00:07:15,120 podoben tistemu. 146 00:07:15,120 --> 00:07:17,780 Ampak obvestilo, če vaše oči nadalje sprehaja v desno, 147 00:07:17,780 --> 00:07:22,150 to še ni na tej liniji kot šele konec tega podpičjem. 148 00:07:22,150 --> 00:07:25,160 "Echo ranljivi," in nato tistega, ki obstaja še več. 149 00:07:25,160 --> 00:07:26,530 Druga podpičje, bash -c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> Tako da skrajšam zgodbo, ta vrstica kode je 152 00:07:34,050 --> 00:07:36,660 zadostuje za prepričljiv Računalnik, ki je 153 00:07:36,660 --> 00:07:39,830 dovzetni za početje nekaj , da želite to storiti, 154 00:07:39,830 --> 00:07:44,290 zato, ker je napaka v Bash, s katerim čeprav je bil Bash naj ustavi 155 00:07:44,290 --> 00:07:48,980 branje linije poveljevanja pravice tam po rumeno besedilo, 156 00:07:48,980 --> 00:07:52,520 za 20-plus let starega hrošča, Bash je dejansko branje 157 00:07:52,520 --> 00:07:56,780 onkraj te podpičjem in lepa še to, kar je povedal. 158 00:07:56,780 --> 00:07:59,070 >> Torej, kaj je posledice od tega na koncu? 159 00:07:59,070 --> 00:08:01,340 Rekel sem "echo zdravo" ali "echo ranljivi," 160 00:08:01,340 --> 00:08:05,449 kaj pa če si kaj dejansko zlonamerno, kot rm -RF *, 161 00:08:05,449 --> 00:08:07,240 ki morda ne kdaj tipkal prej, 162 00:08:07,240 --> 00:08:08,920 in odkrito verjetno ne bi smeli prehitro, 163 00:08:08,920 --> 00:08:10,700 ker lahko narediš Veliko škode z njo. 164 00:08:10,700 --> 00:08:11,210 Zakaj? 165 00:08:11,210 --> 00:08:12,990 rm za kaj, seveda? 166 00:08:12,990 --> 00:08:14,270 Odstrani. 167 00:08:14,270 --> 00:08:15,930 * Pomeni kaj? 168 00:08:15,930 --> 00:08:16,430 Vse. 169 00:08:16,430 --> 00:08:18,180 Torej, to je tako imenovani joker, tako da to pomeni 170 00:08:18,180 --> 00:08:20,410 izbrisati vse, kar je v trenutni imenik. 171 00:08:20,410 --> 00:08:23,379 r se zgodi, da pomeni rekurzivna, kar pomeni, če kaj ste izbrisali 172 00:08:23,379 --> 00:08:26,420 je imenik, in notranjost je je druge datoteke in druge imenike, 173 00:08:26,420 --> 00:08:28,950 rekurzivno potopite tam in izbrisati vse to. 174 00:08:28,950 --> 00:08:31,040 In -f je najslabša od vseh. 175 00:08:31,040 --> 00:08:32,580 Kdo ve, kaj pomeni -f tukaj? 176 00:08:32,580 --> 00:08:33,690 177 00:08:33,690 --> 00:08:34,360 Force. 178 00:08:34,360 --> 00:08:37,830 Torej prisili sredstva, tudi če je to slaba ideja, 179 00:08:37,830 --> 00:08:40,939 to storiti, ne da bi me spodbudilo za nadaljnjo potrditev. 180 00:08:40,939 --> 00:08:43,230 Torej, veš, mi smejali to, vendar odkrito povedano, sem verjetno 181 00:08:43,230 --> 00:08:44,972 to večkrat vnesete dan, saj realnosti 182 00:08:44,972 --> 00:08:47,210 je, da je najhitrejša pot do izbrisati cel kup stvari. 183 00:08:47,210 --> 00:08:48,590 Ampak tudi jaz naredil nekaj škode. 184 00:08:48,590 --> 00:08:53,100 >> Ampak, če ste bili, da pretenta računalnik v opredelitvi nekaj neumnega spremenljivko 185 00:08:53,100 --> 00:08:56,810 ali funkcijo imenovan x, potem pa prelisičijo računalnik v izvršilni 186 00:08:56,810 --> 00:09:00,030 preko meja, ki funkcija, poleg tega podpičjem, 187 00:09:00,030 --> 00:09:04,430 da bi lahko res trik računalnik v izvršilni nekaj podobnega rm -rf 188 00:09:04,430 --> 00:09:07,810 ali ukaz Email ali ukaz Kopiraj. 189 00:09:07,810 --> 00:09:11,400 Vse, kar dobesedno lahko storite z računalnik, pa naj gre za brisanje datotek, 190 00:09:11,400 --> 00:09:15,350 ustvarjanje datotek, spamming nekoga, napadajo nekaj strežnika na daljavo, 191 00:09:15,350 --> 00:09:17,190 če lahko izrazijo z ukazom, si 192 00:09:17,190 --> 00:09:19,120 lahko pretentati računalnik v tem. 193 00:09:19,120 --> 00:09:21,510 >> Zdaj, kaj je primer kako si lahko to storil? 194 00:09:21,510 --> 00:09:24,300 No, tam je veliko računalnikov na internet teče Bash. 195 00:09:24,300 --> 00:09:26,390 Vse uporabnike nas Mac so med njimi. 196 00:09:26,390 --> 00:09:30,390 Veliko strežnikov Linux so med njih, kot tudi, in strežnikov Unix. 197 00:09:30,390 --> 00:09:32,630 Windows spet dobi relativno off kavelj 198 00:09:32,630 --> 00:09:34,590 če ste namestili posebna programska oprema. 199 00:09:34,590 --> 00:09:37,130 Zdaj veliko strežnikov, za instance, vodenje spletnih strežnikov, 200 00:09:37,130 --> 00:09:39,840 in v resnici je Linux morda najbolj priljubljen operacijski sistem 201 00:09:39,840 --> 00:09:43,060 da deluje na računalnikih, na internetu da služi up spletne strani. 202 00:09:43,060 --> 00:09:44,910 Zdaj, kot bomo videli kasneje v semestru, ko 203 00:09:44,910 --> 00:09:48,470 pošljete zahtevo vaš browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- na oddaljenem strežniku, 205 00:09:50,790 --> 00:09:53,730 Izkazalo se je, da je kljub temu, si tipkal www.example.com, 206 00:09:53,730 --> 00:09:59,590 Vaš brskalnik sporoča da je malo bolj skrivnostne, kot je ta. 207 00:09:59,590 --> 00:10:01,239 >> Opazil Nekaj ​​čudnega. 208 00:10:01,239 --> 00:10:03,030 Prvi dve vrstici Še nikoli nisem videl, 209 00:10:03,030 --> 00:10:04,904 vendar ne izgledajo še posebej nevarna. 210 00:10:04,904 --> 00:10:08,030 Ampak obvestilo, kaj sem ukradel za tretjo linijo tukaj. 211 00:10:08,030 --> 00:10:13,390 Če bi bila slab človek, da pošljete sporočilo kot je ta iz svojega računalnika 212 00:10:13,390 --> 00:10:17,270 ranljivi Mac ali ranljive Linux strežnik, 213 00:10:17,270 --> 00:10:21,580 Hecno je, da Bash, Tako preprosto je malo ukazno vrstico, 214 00:10:21,580 --> 00:10:27,450 je vseprisotna in je pogosto vajeni predvsem izvršiti 215 00:10:27,450 --> 00:10:30,020 vsebina sporočilo, ki ga prejme. 216 00:10:30,020 --> 00:10:33,490 In s to logiko, lahko pretentati spletni strežnik, zato 217 00:10:33,490 --> 00:10:36,370 s pošiljanjem nekaj podobnega User-Agent, ki običajno 218 00:10:36,370 --> 00:10:38,300 naj bi se reči, Ime vašega brskalnika. 219 00:10:38,300 --> 00:10:42,420 User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, ta 220 00:10:42,420 --> 00:10:44,590 je samo svojega brskalnika način se prepoznava. 221 00:10:44,590 --> 00:10:46,605 Ampak, če je slab človek zelo spretno pravi, mm-mm, sem 222 00:10:46,605 --> 00:10:47,930 ne bom ti povedal kaj je moj brskalnik, 223 00:10:47,930 --> 00:10:50,888 Jaz sem namesto tega bomo pošiljali ta skrivnosten videz stvar z rm -RF 224 00:10:50,888 --> 00:10:55,840 * V njem, lahko dobesedno trik ranljivi spletni strežnik na internetu 225 00:10:55,840 --> 00:10:59,055 v izvršilni točno, da je v tam za brisanje vseh datotek. 226 00:10:59,055 --> 00:11:00,930 In odkrito povedano, to ni celo najhujše. 227 00:11:00,930 --> 00:11:01,763 Lahko narediš karkoli. 228 00:11:01,763 --> 00:11:04,480 Začnete lahko razdeli zanikanje napada storitev 229 00:11:04,480 --> 00:11:07,030 Če ste poslali to sporočilo cele grozde spletnih strežnikov 230 00:11:07,030 --> 00:11:10,256 in nato jih imela vse spustimo, za instance, na Harvard.edu strežnikih, 231 00:11:10,256 --> 00:11:12,130 in jih lahko razvrstite po poku vraga iz njih 232 00:11:12,130 --> 00:11:15,490 omrežnega prometa, ki je bil s tem slab človek drugače sprožijo. 233 00:11:15,490 --> 00:11:18,760 >> Torej, skrajšam zgodbo, skoraj vsi v tej sobi, ki ima v lasti Mac 234 00:11:18,760 --> 00:11:20,240 je občutljiva na to. 235 00:11:20,240 --> 00:11:24,100 Sončni žarek je, da če ste teče spletni strežnik na vaš prenosnik, 236 00:11:24,100 --> 00:11:27,780 in če ste jih dejansko nastavljen to, da bi nekaj podobnega SSH vanjo, 237 00:11:27,780 --> 00:11:28,670 ti si dejansko varen. 238 00:11:28,670 --> 00:11:31,710 To je občutljiva, vendar ni eden poskuša priti v prenosni računalnik, 239 00:11:31,710 --> 00:11:33,290 tako da lahko nekako prepričani. 240 00:11:33,290 --> 00:11:36,210 Vendar pa bo Apple kmalu biti posodabljanje določi za to. 241 00:11:36,210 --> 00:11:39,660 Svet Linux je že izšla število popravkov za Fedora in Ubuntu 242 00:11:39,660 --> 00:11:43,790 in drugih različic Linuxa in dejansko če naletite posodobitev 50 na aparatu, 243 00:11:43,790 --> 00:11:45,930 celo, da se bo tudi treba posodobljena in popravljena. 244 00:11:45,930 --> 00:11:47,764 Ampak to je preveč, ne Res je ranljiva, 245 00:11:47,764 --> 00:11:49,804 ker, če nimate tinkered z napravo 246 00:11:49,804 --> 00:11:52,770 in javnosti na vaš prenosnik dostopne na internetu, ki ni 247 00:11:52,770 --> 00:11:54,910 privzeto, ki ste jih pravzaprav že v redu, ker 248 00:11:54,910 --> 00:11:56,890 za požarni zid in drugih tehnik. 249 00:11:56,890 --> 00:12:01,000 >> Ampak to je skrajni primer hrošča da smo živeli za dobesedno 20 250 00:12:01,000 --> 00:12:04,050 let, in kdo ve, če je kdo Ves ta čas je znano o tem? 251 00:12:04,050 --> 00:12:06,300 In v resnici, to je eden izmed temeljnih izzivov 252 00:12:06,300 --> 00:12:08,690 da bomo videli kasneje v semester o varnosti, 253 00:12:08,690 --> 00:12:13,020 je, da tako kot v resničnem svetu, dobri fantje so v slabšem položaju. 254 00:12:13,020 --> 00:12:16,500 Če želite, da slabi fantje ven, moramo poskrbite, da se vsa vrata zaklenjena, 255 00:12:16,500 --> 00:12:20,340 da je vsako okno varen, da vsaka točka vstopa v dom 256 00:12:20,340 --> 00:12:21,980 je varno, da slabi fantje ven. 257 00:12:21,980 --> 00:12:26,870 Ampak kaj slab človek moral storiti, da bi dejansko ogrozijo vaš dom 258 00:12:26,870 --> 00:12:28,200 in kradejo od vas? 259 00:12:28,200 --> 00:12:32,574 On ali ona je samo, da bi našli enega odklenjen vrata, ena broken window, ali kaj 260 00:12:32,574 --> 00:12:35,240 v tej smeri, in to je Isto za računalniško varnost. 261 00:12:35,240 --> 00:12:37,660 Mi lahko napišete milijone vrstic programske kode 262 00:12:37,660 --> 00:12:40,570 in porabili več sto ali tisoč ur, ki skušajo zaslužiti to pravilen, 263 00:12:40,570 --> 00:12:43,370 ampak če bi samo enega Napaka v točnosti, 264 00:12:43,370 --> 00:12:47,030 lahko postavite celoten sistem in dejansko v tem primeru, je celotna interneta 265 00:12:47,030 --> 00:12:48,660 in svet v nevarnosti. 266 00:12:48,660 --> 00:12:51,950 >> Torej, če želite izvedeti več o tem, pojdite na ta URL tukaj. 267 00:12:51,950 --> 00:12:54,450 Ni potrebe za ukrepanje Nocoj, če ste 268 00:12:54,450 --> 00:12:57,116 med tistimi, ki bolj udobno, da so tekmovanje v teku svoj spletu 269 00:12:57,116 --> 00:12:59,810 strežnik, v tem primeru bi smeli, v resnici, posodobite programsko opremo. 270 00:12:59,810 --> 00:13:03,244 >> In tudi to je naslov govor, in zdaj papir, 271 00:13:03,244 --> 00:13:05,410 da smo povezani na Spletna stran seveda za danes. 272 00:13:05,410 --> 00:13:07,600 Bilo ga je kolega imenom Ken Thompson, ki je 273 00:13:07,600 --> 00:13:10,120 je sprejemala zelo znan nagrada na področju računalništva, 274 00:13:10,120 --> 00:13:13,495 in on je dal ta govor nekaj let nazaj, v bistvu na to isto temo. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Sprašuje ljudje vprašanje, bi bilo res 277 00:13:20,520 --> 00:13:23,480 zaupanje, na koncu, programsko opremo, ki ste jih dobila? 278 00:13:23,480 --> 00:13:26,100 Na primer, vsi imamo je pisanje programov, 279 00:13:26,100 --> 00:13:27,820 in smo bili sestavljanje jim z Jek. 280 00:13:27,820 --> 00:13:31,830 In s svojim znanjem, ki ste jih napisal vseh programov za CS50, kjer obstaja 281 00:13:31,830 --> 00:13:35,310 zadnja vrata z menoj, tam je pot da je slab človek, če teče svoj program, 282 00:13:35,310 --> 00:13:37,410 lahko prevzame računalniku? 283 00:13:37,410 --> 00:13:38,310 Verjetno ne, kajne? 284 00:13:38,310 --> 00:13:40,180 Mario in požrešen, in Credit. 285 00:13:40,180 --> 00:13:41,680 Vse to so zelo majhne programe. 286 00:13:41,680 --> 00:13:43,910 Morali bi biti precej slabo, če vas dejansko 287 00:13:43,910 --> 00:13:47,310 je ves vaš računalnik ranljiv po pisanju 10 ali 20 vrstic kode, 288 00:13:47,310 --> 00:13:49,690 ali vsaj ne poznajo nekaterih posledic varnosti. 289 00:13:49,690 --> 00:13:52,023 Zdaj pravijo, da facetiously, ampak bomo videli danes 290 00:13:52,023 --> 00:13:54,600 in ta teden je dejansko Res, zelo enostavno 291 00:13:54,600 --> 00:13:57,980 da je slabo in da celo kratki programi ranljivi. 292 00:13:57,980 --> 00:14:02,880 >> Ampak za zdaj, vsaj zavedaš da se vprašanje sem vprašal 293 00:14:02,880 --> 00:14:04,850 Gre Jek v prevajalnik. 294 00:14:04,850 --> 00:14:08,360 Zato smo bili zaupamo Jek v zadnjih dveh ali treh tednih? 295 00:14:08,360 --> 00:14:12,650 Kdo pravi, da kdor je napisal Jek ni imela "če" stanje v tam 296 00:14:12,650 --> 00:14:17,680 da v bistvu vbrizga nekaj ničel in tisti, v vsakem programu se pripravlja 297 00:14:17,680 --> 00:14:21,180 da bi pustil ali njen dostop vaš računalnik, ko spiš 298 00:14:21,180 --> 00:14:23,580 in vaš prenosnik pokrov je odprt in je vaš računalnik teče? 299 00:14:23,580 --> 00:14:24,080 Prav? 300 00:14:24,080 --> 00:14:28,350 Imamo to vrsto čast sistema pravice Zdaj, ko smo prepričani, da je Jek zakonit. 301 00:14:28,350 --> 00:14:30,000 Zaupate, da je aparat zakonit. 302 00:14:30,000 --> 00:14:34,430 Zaupate, da dobesedno vsak program, na vašem Mac ali PC, je vreden zaupanja. 303 00:14:34,430 --> 00:14:37,510 In to preprosto bug kaže, tudi če to ni zlonamerno, 304 00:14:37,510 --> 00:14:40,580 to je absolutno ne verjetno, da bo tako. 305 00:14:40,580 --> 00:14:42,350 >> Torej bi morali biti strah kot hudič. 306 00:14:42,350 --> 00:14:45,560 Odkrito povedano, ni preprosta Rešitev tega drugo 307 00:14:45,560 --> 00:14:48,185 kot neke družbene zavesti naraščajoče kompleksnosti 308 00:14:48,185 --> 00:14:50,310 da gradimo na vrh naših računalniških sistemov, 309 00:14:50,310 --> 00:14:53,740 in kako bolj ranljiva smo lahko zelo dobro. 310 00:14:53,740 --> 00:14:55,570 >> Zdaj s tem je dejal, Breakout. 311 00:14:55,570 --> 00:14:59,889 Torej Breakout je problem določiti tri, in Breakout je igra od minulih dni 312 00:14:59,889 --> 00:15:02,180 da boste morda spomnite, vendar za nas problem določiti tri, 313 00:15:02,180 --> 00:15:04,450 to nam omogoča, da sprejmejo Stvari back up zarezo 314 00:15:04,450 --> 00:15:08,880 tako da, ko pišemo programe, celo v Terminal oknu, kot je ta, 315 00:15:08,880 --> 00:15:14,670 bomo lahko dejansko vozijo, na koncu, grafični programi niso 316 00:15:14,670 --> 00:15:17,800 za razliko od tistih, ki jih je imel Dostop v nič. 317 00:15:17,800 --> 00:15:20,910 Torej, to je za zaposlene je Izvajanje Breakout, 318 00:15:20,910 --> 00:15:23,930 ki je le ta brick-breaking Igra, ki jo premikanje vaših veslo nazaj 319 00:15:23,930 --> 00:15:27,590 in tja, in si udaril žogo zoper te barve opeke up vrhu. 320 00:15:27,590 --> 00:15:30,020 Torej, to je nam prinaša nekako nazaj, kjer 321 00:15:30,020 --> 00:15:33,180 smo lahko zelo hitro z nič, zdaj pa s C, 322 00:15:33,180 --> 00:15:35,800 izvajanje lastne grafični uporabniški vmesniki. 323 00:15:35,800 --> 00:15:38,960 >> Še več, ta Problem sklop predstavlja prvi 324 00:15:38,960 --> 00:15:41,000 , v kateri smo kar ti kup kode. 325 00:15:41,000 --> 00:15:43,940 In v resnici, sem prinesel izrecno pozornost, ker zlasti 326 00:15:43,940 --> 00:15:47,090 za tiste manj udoben, to problem določiti, vsaj na prvi pogled, 327 00:15:47,090 --> 00:15:49,170 se dogaja, da se počutim kot smo jo prevzeli zarezo. 328 00:15:49,170 --> 00:15:51,540 Saj smo vam ga je dal, za nekatere iskanju 329 00:15:51,540 --> 00:15:54,930 in reševanju problemov v pset, kup kode, ki jih je napisal, 330 00:15:54,930 --> 00:15:56,680 in nekaj pripomb ki pravijo "narediti" 331 00:15:56,680 --> 00:15:58,221 , kjer boste morali izpolniti obrazec. 332 00:15:58,221 --> 00:16:00,020 Tako da ne preveč strašljivo, vendar to je prvič 333 00:16:00,020 --> 00:16:03,370 smo vam izroči kodo, ki jo potrebujete za najprej prebrati, razumeti, in nato dodamo 334 00:16:03,370 --> 00:16:04,290 in jo izpolnite. 335 00:16:04,290 --> 00:16:05,940 >> In nato z Breakout, bomo storili enako, 336 00:16:05,940 --> 00:16:08,740 vam daje nekaj deset več vrstic kode, odkrito povedano, daj, da ti 337 00:16:08,740 --> 00:16:11,490 Veliko okvira za Igra vendar stop short 338 00:16:11,490 --> 00:16:14,304 izvajanja opeke in krogla in veslo, 339 00:16:14,304 --> 00:16:15,970 ampak bomo izvedli nekatere druge funkcije. 340 00:16:15,970 --> 00:16:18,280 In tudi, da je na prvi pogled, še enkrat, še posebej, če je manj udoben, 341 00:16:18,280 --> 00:16:21,480 Morda se zdi še posebej zastrašujoče in misliš, da je tako veliko novih funkcij 342 00:16:21,480 --> 00:16:24,070 morate zaviti vaš um okoli, in to je res. 343 00:16:24,070 --> 00:16:26,281 Toda ne pozabite, to je zelo všeč nič. 344 00:16:26,281 --> 00:16:28,780 Kvota se niste uporabili vse kosov sestavljanke v nič. 345 00:16:28,780 --> 00:16:31,120 Verjetnost, da vam ni mar za zavijanje vaš um okoli vse od njih 346 00:16:31,120 --> 00:16:33,617 ker vse to je bilo hiter pogled razumeti, oh, 347 00:16:33,617 --> 00:16:35,450 to je tisto, kar lahko naredim s tem puzzle kos. 348 00:16:35,450 --> 00:16:38,260 In res, v problem nastaviti 3 spec, vam bomo točko 349 00:16:38,260 --> 00:16:41,370 V dokumentaciji, ki bodo vam predstavil nekaj novih funkcij, 350 00:16:41,370 --> 00:16:43,570 in na koncu programskega konstruira uporabljate. 351 00:16:43,570 --> 00:16:47,610 Pogojev, zank, spremenljivke in funkcije 352 00:16:47,610 --> 00:16:50,720 bo enaka kar smo videli doslej. 353 00:16:50,720 --> 00:16:53,560 >> Torej res, kaj bomo dal si je nekaj vzorčno kodo, ki 354 00:16:53,560 --> 00:16:56,110 vam omogoča, da ustvarite okno da ne izgleda za razliko od tega, 355 00:16:56,110 --> 00:16:59,540 in ga na koncu spremeni v nekaj povsem tako. 356 00:16:59,540 --> 00:17:02,250 Torej izkoristite CS50, razpravljali o uradnih ur in več, 357 00:17:02,250 --> 00:17:05,290 in vseeno zadovoljen z dejstvom, da je znesek kodo morate pisati 358 00:17:05,290 --> 00:17:06,760 pravzaprav sploh ni tako veliko. 359 00:17:06,760 --> 00:17:10,359 Prvi izziv je samo aklimatizirati sami do neke kode, ki smo jih napisali. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Vsa vprašanja v zvezi pset3, Shellshock, ali kako drugače? 362 00:17:15,810 --> 00:17:19,226 >> OBČINSTVO: Zdelo se je, kot preživlja z Breakout 363 00:17:19,226 --> 00:17:22,154 da koda je skoraj objektno usmerjen slog, 364 00:17:22,154 --> 00:17:24,675 vendar sem mislil, C je objektno programa. 365 00:17:24,675 --> 00:17:26,050 ZVOČNIK 1: Odlično vprašanje. 366 00:17:26,050 --> 00:17:28,258 Torej, v pogledu skozi distribucijo kode, koda 367 00:17:28,258 --> 00:17:30,180 smo pisali za pset3, za tiste, ki poznajo, ga 368 00:17:30,180 --> 00:17:32,230 Izgleda, da je malo objektno usmerjen. 369 00:17:32,230 --> 00:17:33,800 Kratek odgovor je, da je. 370 00:17:33,800 --> 00:17:38,130 To je približek, kako si lahko storite objektno usmerjen kodo pomočjo 371 00:17:38,130 --> 00:17:41,850 jezik kot C, vendar je še vedno na koncu postopkovno. 372 00:17:41,850 --> 00:17:44,900 Ni metode notranji del spremenljivke, kot boste videli. 373 00:17:44,900 --> 00:17:46,180 Ampak to spominja na to. 374 00:17:46,180 --> 00:17:48,780 In bomo spet videli, da funkcijo ko pridemo v PHP in JavaScript 375 00:17:48,780 --> 00:17:49,946 proti koncu semestra. 376 00:17:49,946 --> 00:17:53,667 Ampak za zdaj, pomislite, da je namig o tem, kaj je, da pridejo. 377 00:17:53,667 --> 00:17:54,250 Dobro vprašanje. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 V redu. 380 00:17:56,550 --> 00:17:59,730 Torej zlivanjem je bilo, kako smo leva stvari zadnjič. 381 00:17:59,730 --> 00:18:03,250 In zlivanjem je kul občutek, da je bilo tako veliko hitreje, 382 00:18:03,250 --> 00:18:07,100 temelji vsaj na Letimičan testov smo prejšnji teden, kot, recimo, mehurček 383 00:18:07,100 --> 00:18:08,710 sort, izbor sort, vstavljanje sort. 384 00:18:08,710 --> 00:18:11,780 In kaj je bil čeden preveč je le kako jedrnato in čisto 385 00:18:11,780 --> 00:18:12,810 ga lahko izrazi. 386 00:18:12,810 --> 00:18:15,840 In tisto, kar smo rekli, da je zgornja vezan na čas spajanja teče 387 00:18:15,840 --> 00:18:16,340 razvrstiti? 388 00:18:16,340 --> 00:18:17,633 389 00:18:17,633 --> 00:18:18,495 Ja? 390 00:18:18,495 --> 00:18:19,360 >> OBČINSTVO: n log n? 391 00:18:19,360 --> 00:18:20,819 >> ZVOČNIK 1: n log n, desno. n log n. 392 00:18:20,819 --> 00:18:23,776 In se bomo vrnili na tisto, ki v resnici pomeni, ali če ta prihaja, 393 00:18:23,776 --> 00:18:25,570 ampak to je bilo bolje kot tisto, kar teče čas 394 00:18:25,570 --> 00:18:28,440 da smo videli za bubble Izbor in vstavljanje nekako? 395 00:18:28,440 --> 00:18:30,610 Torej n kvadrat. n kvadrat je večji od tega, 396 00:18:30,610 --> 00:18:34,650 in tudi če to ni očitno, vedo, da je log n manjši od n, 397 00:18:34,650 --> 00:18:36,910 tako da, če vam n-krat nekaj manjša od n, 398 00:18:36,910 --> 00:18:38,680 da se dogaja, da je manj kot n kvadrat. 399 00:18:38,680 --> 00:18:40,130 To je malo intuicije tam. 400 00:18:40,130 --> 00:18:42,190 Vendar smo plačali ceno za to. 401 00:18:42,190 --> 00:18:47,000 Bil je hitrejši, vendar pa tema, ki se je začela pojavljati prejšnji teden je bil ta kompromis. 402 00:18:47,000 --> 00:18:49,804 Imam boljšo zmogljivost čas pametno, ampak kaj 403 00:18:49,804 --> 00:18:52,470 sem moral porabiti za druge roko, da bi to dosegli? 404 00:18:52,470 --> 00:18:53,591 >> OBČINSTVO: Memory. 405 00:18:53,591 --> 00:18:54,465 ZVOČNIK 1: Ponovi? 406 00:18:54,465 --> 00:18:55,173 OBČINSTVO: Memory. 407 00:18:55,173 --> 00:18:57,040 ZVOČNIK 1: Memory, ali prostor bolj na splošno. 408 00:18:57,040 --> 00:18:59,040 In ni bilo super Očitno z našimi ljudmi, 409 00:18:59,040 --> 00:19:02,240 vendar pa opozarjajo, da naši prostovoljci so stopam naprej in poglobitvi 410 00:19:02,240 --> 00:19:04,780 nazaj, kot da obstaja niz tu, kot da bi tam 411 00:19:04,780 --> 00:19:07,130 Drugi niz tukaj, da ki bi jih lahko uporabili, ker smo 412 00:19:07,130 --> 00:19:09,080 potrebnejši nekam, da se združijo te ljudje. 413 00:19:09,080 --> 00:19:11,480 Mi samo ne bi jih lahko zamenjali v mestu. 414 00:19:11,480 --> 00:19:13,800 Torej zlivanjem vzvod je več prostora, ki 415 00:19:13,800 --> 00:19:15,620 nam ni bilo treba z drugi algoritmi, 416 00:19:15,620 --> 00:19:17,410 ampak glavo je, da je veliko hitreje. 417 00:19:17,410 --> 00:19:20,780 In odkrito povedano, v resničnem svetu prostor ti days-- RAM, trdi disk space-- 418 00:19:20,780 --> 00:19:25,030 je relativno poceni, in da je ni nujno slaba stvar. 419 00:19:25,030 --> 00:19:28,320 >> Torej, kaj je na hitro pogledamo, malo bolj metodično, na kar smo storili 420 00:19:28,320 --> 00:19:30,220 in zakaj smo rekli, da je bil n log n. 421 00:19:30,220 --> 00:19:33,260 Torej, tukaj so osem številk in Osem prostovoljcev smo imeli zadnjič. 422 00:19:33,260 --> 00:19:35,718 In prva stvar, ki Merge Razvrsti nam je povedal, da je naredil kaj? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 OBČINSTVO: Razdelimo na dva dela. 425 00:19:38,010 --> 00:19:38,663 ZVOČNIK 1: Ponovi? 426 00:19:38,663 --> 00:19:39,650 OBČINSTVO: Razdelimo na dva dela. 427 00:19:39,650 --> 00:19:40,610 ZVOČNIK 1: razdelite na dva dela, prav. 428 00:19:40,610 --> 00:19:42,818 To je zelo spominja na telefonski imenik, od razkoraka 429 00:19:42,818 --> 00:19:44,220 in osvojiti bolj na splošno. 430 00:19:44,220 --> 00:19:45,640 Tako smo pogledal na levi polovici. 431 00:19:45,640 --> 00:19:48,700 In potem, ko smo rekli, neke leva polovica elementov, 432 00:19:48,700 --> 00:19:49,690 kaj bomo naslednjič rečem? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Razvrstimo levi polovici levi polovico, kar nam je omogočilo, da se, 435 00:19:54,860 --> 00:19:57,570 potem delimo na dva dela, osredotočiti na štiri in dve. 436 00:19:57,570 --> 00:20:01,280 >> Kako si uredite seznam zdaj, rumene barve, velikosti dveh, z uporabo zlivanjem? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 No, ga razdelite na pol, ter razvrstite levo polovico. 439 00:20:04,580 --> 00:20:07,100 In to je bilo, kje se stvari imam malo neumno kratko. 440 00:20:07,100 --> 00:20:10,720 Kako ste razvrstiti seznam, ki je od velikost ena, kot je ta številka štiri tukaj? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 To je urejeno. 443 00:20:13,210 --> 00:20:14,200 Ste končali. 444 00:20:14,200 --> 00:20:17,300 >> Ampak potem kako razvrstiti seznam velikost ena, ko je številka dve? 445 00:20:17,300 --> 00:20:21,640 No, isto stvar, ampak zdaj, kar je bilo Tretji in najpomembnejši korak v zlivanjem? 446 00:20:21,640 --> 00:20:24,020 Ste morali združiti levico polovico in desno polovico. 447 00:20:24,020 --> 00:20:26,580 In ko smo naredili, da smo pogledali ob štirih, mi pogledal dva. 448 00:20:26,580 --> 00:20:28,750 Odločili smo se, vse v redu, Očitno sta na prvem mestu, 449 00:20:28,750 --> 00:20:31,840 zato smo poslali dva v svojem mesto, sledijo štiri. 450 00:20:31,840 --> 00:20:35,010 In zdaj moraš nekako nazaj, in to je nekako značilno 451 00:20:35,010 --> 00:20:37,570 algoritma kot Merge Sort, previjanje nazaj v spomin. 452 00:20:37,570 --> 00:20:40,240 Kaj je naslednja vrstica zgodbe? 453 00:20:40,240 --> 00:20:41,780 Kaj naj se osredotoča na naslednje? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Desna polovica levega in pol, ki je šest let in osem. 456 00:20:47,350 --> 00:20:50,320 >> Torej, povej mi samo korak skozi to brez belaboring točko preveč. 457 00:20:50,320 --> 00:20:53,330 Šest in osem, nato pa je šest razporejene, osem je razvrščen. 458 00:20:53,330 --> 00:20:57,190 Jih združiti skupaj, kot da je in zdaj naslednji velik korak 459 00:20:57,190 --> 00:21:00,990 je, seveda, razvrščanje desno polovico od Zelo prvi korak tega algoritma. 460 00:21:00,990 --> 00:21:02,870 Tako smo se osredotočili na eno, tri, sedem, pet. 461 00:21:02,870 --> 00:21:04,540 Nato smo se osredotočili na levi polovici. 462 00:21:04,540 --> 00:21:09,400 Leva polovica da pravica polovica da, in nato združiti v eno in tri. 463 00:21:09,400 --> 00:21:13,100 Nato desno polovico, nato levo polovico nje, nato desno polovico njega. 464 00:21:13,100 --> 00:21:15,985 Združiti, v, in kaj zdaj korak naprej? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Združiti velik levo polovico in velika desna polovica, tako da eden gre dol, 467 00:21:22,460 --> 00:21:27,330 Nato dva, nato tri, nato štiri, nato pet, nato pa šest, nato sedem, nato osem. 468 00:21:27,330 --> 00:21:31,990 >> Torej, zdaj, zakaj je to končno razkril, še posebej, če je n in logaritmi več 469 00:21:31,990 --> 00:21:35,487 splošno precej vas pobegniti, vsaj v zadnjih pomnilnik? 470 00:21:35,487 --> 00:21:37,070 No, opazil, da se višina te stvari. 471 00:21:37,070 --> 00:21:41,230 Imeli smo osem elementov, in je deljeno z dva, z dvema, po dva. 472 00:21:41,230 --> 00:21:44,590 Torej, se prijavite bazo dva od osmih nam daje tri. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 In verjemi mi, da če malo motna o tem. 475 00:21:48,540 --> 00:21:54,710 Vendar se prijavite baza dve od osmih je tri, Tako smo naredili tri plasti združevanja. 476 00:21:54,710 --> 00:21:57,170 In ko smo se združili elementi, koliko elementov 477 00:21:57,170 --> 00:21:58,950 pa gledamo na vsaki od teh vrstic? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 Skupno n, kajne? 480 00:22:01,437 --> 00:22:04,020 Ker je, da se združijo v zgornji vrstici, čeprav smo to storili po kosih, 481 00:22:04,020 --> 00:22:05,990 smo na koncu dotaknili vsak številko enkrat. 482 00:22:05,990 --> 00:22:09,054 In v drugi vrsti, da spajanje teh seznamov velikosti dveh, 483 00:22:09,054 --> 00:22:10,470 smo imeli na dotik vsak element enkrat. 484 00:22:10,470 --> 00:22:12,690 In potem sem res jasno v zadnji vrsti, 485 00:22:12,690 --> 00:22:15,430 smo se morali dotakniti vsakega od tistih, elementi enkrat, vendar le enkrat, 486 00:22:15,430 --> 00:22:18,400 tako da tu leži, potem je naša n log n. 487 00:22:18,400 --> 00:22:21,780 >> In sedaj, samo da se stvari malo Bolj formalno le za trenutek, če vas 488 00:22:21,780 --> 00:22:24,260 so bili do zdaj analizirati to na nekakšni višji ravni 489 00:22:24,260 --> 00:22:28,340 in poskušajo odločiti, kako dobro lahko greste o izražanju 490 00:22:28,340 --> 00:22:31,780 Čas tega algoritem teče samo jih je videti na njej in ne 491 00:22:31,780 --> 00:22:33,590 z uporabo izmišljen primer? 492 00:22:33,590 --> 00:22:36,590 No, koliko časa bi rekli, korak, kot je ta v rumeni bi potrebovali, 493 00:22:36,590 --> 00:22:37,173 če je n <2 donos? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 To je velik O česa? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 Torej, vidim eno, tako en korak, morda dva koraka, ker je, če 498 00:22:44,540 --> 00:22:47,110 in se nato vrne, vendar je konstanten čas, kajne? 499 00:22:47,110 --> 00:22:49,960 Tako smo omenjeni O (1), in da je kako bom to izraziti. 500 00:22:49,960 --> 00:22:51,480 T, bodi čas teče. 501 00:22:51,480 --> 00:22:54,150 n je velikost vhoda, Tako T (n), samo fancy način 502 00:22:54,150 --> 00:22:56,330 rekel teka čas, saj vnos velikosti n 503 00:22:56,330 --> 00:23:00,220 se bo o vrstnem redu konstantno časa, v O (1). 504 00:23:00,220 --> 00:23:01,970 >> Sicer pa, kaj pa je to? 505 00:23:01,970 --> 00:23:05,660 Kako bi se ti izrazi teče čas to rumeno črto? 506 00:23:05,660 --> 00:23:06,250 T česa? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Lahko nekako goljufija tukaj in odgovor na moje vprašanje ciklično. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Torej, če je čas teče splošno smo pravkar rekel, je T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 In zdaj ste nekako čolnarjenje tu in rekel, dobro, nekako levo polovico, 513 00:23:22,490 --> 00:23:23,920 nato pa razvrstite desno polovico. 514 00:23:23,920 --> 00:23:27,520 Kako bi mi simbolično predstavljajo Čas teče to rumeno črto? 515 00:23:27,520 --> 00:23:28,020 T česa? 516 00:23:28,020 --> 00:23:29,360 Kakšna je velikost vhoda? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 n preko dveh. 519 00:23:31,057 --> 00:23:32,140 Zakaj ne rečem, da je? 520 00:23:32,140 --> 00:23:36,449 In potem to je en T (n / 2) in nato še enkrat, če sem se združita dve razvrstite po polovici, 521 00:23:36,449 --> 00:23:38,615 koliko elementi bom da imajo na dotik skupno? 522 00:23:38,615 --> 00:23:39,780 523 00:23:39,780 --> 00:23:40,320 n. 524 00:23:40,320 --> 00:23:42,790 Tako da sem lahko to izraziti, samo da bi nekako fancy, 525 00:23:42,790 --> 00:23:44,430 kot čas, ki teče na splošno. 526 00:23:44,430 --> 00:23:51,140 T (n), je le čas T (n / 2), ki teče, plus T (n / 2), levo polovico in desno polovico, 527 00:23:51,140 --> 00:23:55,360 skupaj O (n), ki je verjetno n korakov, ampak mogoče, če sem z dvema prstoma, 528 00:23:55,360 --> 00:23:57,960 to je dvakrat toliko koraki, vendar je linearna. 529 00:23:57,960 --> 00:24:00,440 To je nekaj več korakov da je faktor n, 530 00:24:00,440 --> 00:24:02,270 tako da bi to lahko izrazi kot to. 531 00:24:02,270 --> 00:24:05,550 In to je, če zdaj bomo punt na nazaj naše visoke šole matematičnem učbeniku 532 00:24:05,550 --> 00:24:10,290 smo, da ponovitve na koncu konča višini to, n-krat log n, 533 00:24:10,290 --> 00:24:12,530 če ste dejansko storiti math bolj formalno. 534 00:24:12,530 --> 00:24:13,950 >> Torej, to je le dve perspektive. 535 00:24:13,950 --> 00:24:17,500 Ena številčno z hard-kodirane reprezentativnem vzorcu 536 00:24:17,500 --> 00:24:21,140 uporabo osem številk, in še več splošno pogledamo, kako smo prišli tja. 537 00:24:21,140 --> 00:24:25,670 Ampak kaj je res zanimivo tukaj je, še enkrat, ta pojem od kolesarjenja. 538 00:24:25,670 --> 00:24:26,900 Jaz ne uporablja za zanke. 539 00:24:26,900 --> 00:24:29,860 Sem nekako opredeljevanju nekaj v smislu sebi 540 00:24:29,860 --> 00:24:31,950 Ne samo s tem Matematična funkcija, 541 00:24:31,950 --> 00:24:34,860 ampak tudi v smislu tega psevdo kode. 542 00:24:34,860 --> 00:24:38,260 To pseudo koda je rekurzivna v tej dveh njegovih vodov 543 00:24:38,260 --> 00:24:42,310 v bistvu je povedal, da gredo se uporabi za reševanje manjših 544 00:24:42,310 --> 00:24:45,400 problem manjše velikosti, in nato znova 545 00:24:45,400 --> 00:24:48,820 in spet, dokler ne bomo Zmanjšati je do tega tako imenovanega osnovnega postopka. 546 00:24:48,820 --> 00:24:52,810 >> Torej, kaj je dejansko pripraviti bolj prepričljivi sprejme proč od tega, kot sledi. 547 00:24:52,810 --> 00:24:58,420 Naj grem v gedit in se pogled na nekatere današnje izvorne kode, 548 00:24:58,420 --> 00:24:59,930 predvsem ta primer tukaj. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, ki je očitno dodaja številke od ena do n. 550 00:25:03,709 --> 00:25:05,750 Pa poglejmo, kaj se pozna in ne poznajo tukaj. 551 00:25:05,750 --> 00:25:08,690 Najprej smo imeli nekaj vključuje, tako da nič novega ni. 552 00:25:08,690 --> 00:25:09,190 Prototip. 553 00:25:09,190 --> 00:25:11,370 Sem malo motna o ta po nekaj dneh, 554 00:25:11,370 --> 00:25:13,790 ampak tisto, kar smo rekli Prototip funkcije je? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 OBČINSTVO: [neslišno]. 557 00:25:16,015 --> 00:25:16,905 ZVOČNIK 1: Kaj je to? 558 00:25:16,905 --> 00:25:17,800 OBČINSTVO: Mi ga razglasi. 559 00:25:17,800 --> 00:25:18,883 ZVOČNIK 1: Mi ga razglasi. 560 00:25:18,883 --> 00:25:22,290 Torej si se učil Jek, hej, dejansko ne izvaja to še ni, 561 00:25:22,290 --> 00:25:25,740 ampak nekje v tej datoteki, verjetno, se dogaja, da se funkcija imenuje, kaj? 562 00:25:25,740 --> 00:25:26,930 563 00:25:26,930 --> 00:25:27,540 Sigma. 564 00:25:27,540 --> 00:25:30,540 In to je samo obljuba, da to bo izgledala takole. 565 00:25:30,540 --> 00:25:33,720 To bo trajalo celo kot input-- in sem lahko bolj eksplicitno 566 00:25:33,720 --> 00:25:36,570 in pravijo, int n --and je vrača int, 567 00:25:36,570 --> 00:25:39,900 vendar podpičjem sredstva, mm, bom dobil okoli za izvajanje tega malo kasneje. 568 00:25:39,900 --> 00:25:40,989 Again, Jek je neumno. 569 00:25:40,989 --> 00:25:43,280 To je le, da bo vedel, kaj ti je povedal, od zgoraj navzdol, 570 00:25:43,280 --> 00:25:45,765 zato moramo vsaj dati je namig o tem, kaj je, da pridejo. 571 00:25:45,765 --> 00:25:47,330 >> Zdaj pa si oglejmo glavne tukaj. 572 00:25:47,330 --> 00:25:50,040 Pojdimo se pomaknite dol in videli, kaj glavna počne. 573 00:25:50,040 --> 00:25:53,780 To ni tako dolgo, funkcije, in Dejansko je konstrukt tukaj pozna. 574 00:25:53,780 --> 00:25:57,590 Izjavljam spremenljivo n, nato pa Sem znova in znova nadlegovanja uporabnika 575 00:25:57,590 --> 00:26:01,880 Za pozitivno celo število z uporabo getInt, in le izhod iz te zanke 576 00:26:01,880 --> 00:26:03,280 potem ko je izpolnil uporabnik. 577 00:26:03,280 --> 00:26:05,670 Storijo, ko smo uporabili za nadlegovanja uporabnika na ta način. 578 00:26:05,670 --> 00:26:06,670 Zdaj je to zanimivo. 579 00:26:06,670 --> 00:26:08,510 Izjavljam, int imenovano "odgovor". 580 00:26:08,510 --> 00:26:11,420 Sem, da vrne vrednost dodeliti funkcije, imenovano "sigma". 581 00:26:11,420 --> 00:26:15,200 Ne vem, kaj to počne še ni, vendar Spomnim se ga razglasi pred nekaj trenutki. 582 00:26:15,200 --> 00:26:18,310 In potem sem mimo v vrednost, ki jo uporabnik vtipka, n, 583 00:26:18,310 --> 00:26:20,420 in potem sem poročala odgovor. 584 00:26:20,420 --> 00:26:22,260 No dajmo se pomaknete nazaj le za trenutek. 585 00:26:22,260 --> 00:26:28,620 Pojdimo v ta imenik, bo sigma 0, in dejansko vodijo ta program 586 00:26:28,620 --> 00:26:30,490 in glej kaj se zgodi. 587 00:26:30,490 --> 00:26:35,930 Torej, če grem naprej in rok ta program, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 in sem tip v pozitivni celo kot dva, Sigma, 589 00:26:40,139 --> 00:26:43,180 kot trdi grška simbol, je le bodo sešteti vse številke od 590 00:26:43,180 --> 00:26:44,320 nič za do dve. 591 00:26:44,320 --> 00:26:46,560 Torej 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 Torej, to naj mi upamo dati 3. 593 00:26:48,830 --> 00:26:49,750 To je vse, kar počne. 594 00:26:49,750 --> 00:26:52,690 In podobno, če sem to spet teči in sem dal to številko tri, 595 00:26:52,690 --> 00:26:56,721 to je 3 plus 2, tako da je 5, plus 1 naj bi mi dal 6. 596 00:26:56,721 --> 00:26:59,470 In potem, če dobim res noro in začnite pisati v večjih številkah, 597 00:26:59,470 --> 00:27:01,290 to naj bi mi večje in večje vsote. 598 00:27:01,290 --> 00:27:02,250 Torej, to je vse. 599 00:27:02,250 --> 00:27:04,010 >> Torej, kaj sigma izgledal? 600 00:27:04,010 --> 00:27:05,430 No, to je precej preprosta. 601 00:27:05,430 --> 00:27:08,940 Pomembno je, kako lahko smo izvajali To za zadnjih nekaj tednov. 602 00:27:08,940 --> 00:27:11,120 "Int", se bo vrsta donos. 603 00:27:11,120 --> 00:27:14,330 Sigma je ime, in to traja spremenljivka m namesto n. 604 00:27:14,330 --> 00:27:15,940 Bom spremeniti up top. 605 00:27:15,940 --> 00:27:17,340 Potem je to samo pregled sanity. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Bomo videli, zakaj v tem trenutku. 608 00:27:19,950 --> 00:27:24,220 Zdaj Izjavljam drugo spremenljivko, Vsota, inicializacijo nič. 609 00:27:24,220 --> 00:27:28,140 Nato sem imel to za zanko ponavljanjem, očitno zaradi jasnosti 610 00:27:28,140 --> 00:27:33,810 od i = 1 na do = m, ki je karkoli uporabnik vtipka, potem pa sem 611 00:27:33,810 --> 00:27:35,690 prirastek vsoto, kot je ta. 612 00:27:35,690 --> 00:27:37,360 In se nato vrne vsoto. 613 00:27:37,360 --> 00:27:38,440 >> Torej nekaj vprašanj. 614 00:27:38,440 --> 00:27:42,370 Ena, Trdim v mojem komentarju te ta izognemo tveganju neskončne zanke. 615 00:27:42,370 --> 00:27:45,620 Zakaj bi prenos negativno število povzroči, potencialno neskončno zanko? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> OBČINSTVO: Nikoli ne boste dosegli m. 618 00:27:51,290 --> 00:27:52,880 >> ZVOČNIK 1: Nikoli ne posegajte m. 619 00:27:52,880 --> 00:27:55,880 Toda m sprejet, tako da je menijo, preprost primer. 620 00:27:55,880 --> 00:27:58,510 Če je m sprejet z uporabnik kot negativnega. 621 00:27:58,510 --> 00:28:00,059 Ne glede na glavni. 622 00:28:00,059 --> 00:28:01,850 Glavna nas varuje pred tudi to, da sem pravkar 623 00:28:01,850 --> 00:28:04,680 pa res anal z sigma, da poskrbite, 624 00:28:04,680 --> 00:28:06,540 da vnos ne more biti negativna. 625 00:28:06,540 --> 00:28:10,130 Torej, če m je negativen, nekaj takega kot negativnega. 626 00:28:10,130 --> 00:28:11,930 Kaj se bo zgodilo? 627 00:28:11,930 --> 00:28:14,390 No, jaz se bom se inicializirana enem, 628 00:28:14,390 --> 00:28:19,060 in potem sem se bo manj kot ali enako m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Stati. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 To je bilo-- naj ne, dajmo Nix to zgodbo. 633 00:28:29,370 --> 00:28:32,780 Nisem vprašal to vprašanje, ker Tveganje, da sem namigoval, da 634 00:28:32,780 --> 00:28:38,360 se ne bo zgodilo, ker je i vedno bo večja than-- OK, 635 00:28:38,360 --> 00:28:39,871 I navije na to vprašanje. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Osredotočimo se le na ta del tukaj. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Zakaj sem se razglasi nekatere zunaj zanke? 640 00:28:48,830 --> 00:28:52,010 Obvestilo o liniji 49 imam deklarirano i znotraj zanke, 641 00:28:52,010 --> 00:28:54,950 ampak na spletu 48 imam razglašena za nekaj zunaj. 642 00:28:54,950 --> 00:28:55,695 Ja. 643 00:28:55,695 --> 00:28:56,611 OBČINSTVO: [neslišno]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 ZVOČNIK 1: Sure. 646 00:28:59,400 --> 00:29:03,360 Torej, v prvi vrsti prav gotovo ne želeli opredeliti in inicializacijo vsoto 647 00:29:03,360 --> 00:29:06,130 nič notranjosti zanke na vsaki ponovitvi 648 00:29:06,130 --> 00:29:09,370 ker bi bilo to jasno poraz Namen seštejemo številke. 649 00:29:09,370 --> 00:29:11,770 Jaz bi kar naprej spreminjati Vrednost nazaj na nič. 650 00:29:11,770 --> 00:29:17,992 In tudi, kaj je še ena več Skrivnosten Razlog za to isto odločbo oblikovanja? 651 00:29:17,992 --> 00:29:18,954 Ja. 652 00:29:18,954 --> 00:29:20,279 >> OBČINSTVO: [neslišno]. 653 00:29:20,279 --> 00:29:21,070 ZVOČNIK 1: Točno tako. 654 00:29:21,070 --> 00:29:24,060 Želim, da je dostopna zunaj zanke preveč na kakšni poti? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Na 53. 657 00:29:26,400 --> 00:29:29,910 In na podlagi našega pravilo palca od nekaj predavanj nazaj, 658 00:29:29,910 --> 00:29:33,680 spremenljivke so scoped, res, da zavitimi oklepaji, ki jih obsegajo. 659 00:29:33,680 --> 00:29:38,190 Torej, če ne razglasi vsoto znotraj teh zunanjih zavitimi oklepaji, 660 00:29:38,190 --> 00:29:40,250 Ne morem uporabljati v skladu 53. 661 00:29:40,250 --> 00:29:43,160 Povedano drugače, če bi razglasila Vsota tukaj, ali celo v 662 00:29:43,160 --> 00:29:45,410 Zanke, nisem mogel dostopati ga v 53. 663 00:29:45,410 --> 00:29:47,150 Spremenljivka bo dejansko odšla. 664 00:29:47,150 --> 00:29:48,579 Torej nekaj razlogov tam. 665 00:29:48,579 --> 00:29:50,370 Toda zdaj se vrnimo in glej kaj se zgodi. 666 00:29:50,370 --> 00:29:51,730 Torej dobi sigma klical. 667 00:29:51,730 --> 00:29:55,640 Dodaja up 1 plus 2 ali 1 plus 2 plus 3, in nato vrne vrednost, 668 00:29:55,640 --> 00:29:59,660 V njej so zbrani v odgovoru, in printf tukaj Zato vidim na zaslonu. 669 00:29:59,660 --> 00:30:03,079 Torej, to je tisto, kar bom poklical ponavljajoč Pristop, kjer je ponovitev samo 670 00:30:03,079 --> 00:30:03,870 pomeni z zanko. 671 00:30:03,870 --> 00:30:06,900 Za zanke while zanko, storijo, ko zanka, samo spet delaš nekaj 672 00:30:06,900 --> 00:30:08,380 in znova in znova. 673 00:30:08,380 --> 00:30:13,505 >> Ampak sigma je nekako čeden funkcije v da sem lahko različno izvajajo. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Kaj praviš na to, kar samo da bi nekako kul, 676 00:30:19,120 --> 00:30:21,880 Naj se res znebili z veliko odvračanja 677 00:30:21,880 --> 00:30:24,380 ker te funkcije je zelo preprosta. 678 00:30:24,380 --> 00:30:27,780 Pojdimo Zmanjšati dol samo na njegovih štirih temeljnih črt 679 00:30:27,780 --> 00:30:30,410 in se znebite vseh Pripombe in zavite oklepaje. 680 00:30:30,410 --> 00:30:34,334 To je nekako osupljivo alternativa izvajanje. 681 00:30:34,334 --> 00:30:37,250 V redu, morda ne moti, piha, ampak to je nekako seksi, vse v redu, 682 00:30:37,250 --> 00:30:39,920 da pogled na to toliko bolj jedrnato. 683 00:30:39,920 --> 00:30:43,120 Samo s štirimi vrsticami kode, Najprej moram to preverjanje prištevnosti. 684 00:30:43,120 --> 00:30:45,732 Če m je manjša ali enaka nič, sigma nima smisla. 685 00:30:45,732 --> 00:30:48,190 To naj bi bilo samo v V tem primeru za pozitivna števila, 686 00:30:48,190 --> 00:30:50,340 tako da sem le, da bo vrne nič samovoljno 687 00:30:50,340 --> 00:30:53,210 tako da ima vsaj nekateri tako imenovani osnovni primera. 688 00:30:53,210 --> 00:30:54,430 >> Ampak tukaj je lepota. 689 00:30:54,430 --> 00:30:59,930 Celota te ideje, dodajanje številke od 1 do n, ali m je v tem primeru, 690 00:30:59,930 --> 00:31:02,630 je mogoče storiti z vrsto prelaganje. 691 00:31:02,630 --> 00:31:04,947 No, kaj je vsota 1 do m? 692 00:31:04,947 --> 00:31:05,780 No, veš kaj? 693 00:31:05,780 --> 00:31:11,949 To je enako kot vsota m plus vsota 1 do m minus 1. 694 00:31:11,949 --> 00:31:12,740 No, veš kaj? 695 00:31:12,740 --> 00:31:13,940 Kaj je sigma od m minus 1? 696 00:31:13,940 --> 00:31:17,860 No, če ste nekako slediti tem Logično, to je isto kot m minus 1 697 00:31:17,860 --> 00:31:21,415 plus sigma iz m minus 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 Tako da lahko nekako samo-- to je kot, če ste pravkar 700 00:31:26,012 --> 00:31:28,220 poskuša nagajati prijatelju in jih nekaj vprašam, 701 00:31:28,220 --> 00:31:31,344 si nekako odzvati z vprašanjem, lahko nekako obdržati prelaganje. 702 00:31:31,344 --> 00:31:34,560 Toda kaj je ključnega pomena je, da če boste obdržali tako vprašanje manjši in manjši 703 00:31:34,560 --> 00:31:36,910 in manjši, ste Ne sprašujem, kaj je sigma 704 00:31:36,910 --> 00:31:39,116 n, kaj je sigma od n, kaj je sigma n? 705 00:31:39,116 --> 00:31:40,990 Vi sprašujete, kaj je sigma n, kaj je sigma 706 00:31:40,990 --> 00:31:42,839 n minus 1, kaj je sigma n minus 2? 707 00:31:42,839 --> 00:31:44,880 Sčasoma vaše vprašanje bo postal kaj? 708 00:31:44,880 --> 00:31:50,250 Kaj je sigma ene ali nič, zelo majhne vrednosti, 709 00:31:50,250 --> 00:31:52,220 in takoj, ko vas dobili, da svojega prijatelja, 710 00:31:52,220 --> 00:31:54,350 ne boste vprašati spet isto vprašanje, 711 00:31:54,350 --> 00:31:55,975 greš samo reči, oh to je nič. 712 00:31:55,975 --> 00:31:58,490 Mi smo se več igral te vrste butasto cikličnega igri. 713 00:31:58,490 --> 00:32:02,950 >> Torej rekurzija je dejanje pri načrtovanju funkcije, kliče sama. 714 00:32:02,950 --> 00:32:06,630 Ta program, ko se zbirajo in vodijo, je dogaja, da se obnašajo natanko enako, 715 00:32:06,630 --> 00:32:09,620 toda kaj je ključnega pomena je, da se v notranjosti funkcije, se imenuje sigma, 716 00:32:09,620 --> 00:32:13,150 je vrstica kode čemer smo sebe kliče, 717 00:32:13,150 --> 00:32:14,980 , ki bi običajno bilo slabo. 718 00:32:14,980 --> 00:32:21,160 Na primer, kaj če sem prvič zbrati to, zato poskrbite sigma-- 719 00:32:21,160 --> 00:32:22,710 da sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Pozitivno celo število, prosim, 50 1275. 722 00:32:27,690 --> 00:32:30,810 Torej, kaj funkcija izgleda biti, ki temelji na enem testu, pravilno. 723 00:32:30,810 --> 00:32:34,917 Toda kaj, če dobim malo nevarno in brišete tako imenovano osnovno zadevo, 724 00:32:34,917 --> 00:32:37,750 in samo reči, tudi jaz sem samo izdelavo to bolj zapleteno, kot je. 725 00:32:37,750 --> 00:32:42,450 Reciva izračun sigma ob m in nato dodajanjem 726 00:32:42,450 --> 00:32:44,564 v sigma m minus ena? 727 00:32:44,564 --> 00:32:45,980 No, kaj se bo zgodilo tukaj? 728 00:32:45,980 --> 00:32:47,140 Pojdimo pomanjšati. 729 00:32:47,140 --> 00:32:52,920 Pojdimo prevedite program, ga shranite, prevedite program, 730 00:32:52,920 --> 00:33:00,450 in nato pripravljen ./sigma-1 povečave, vnesite pozitivno celo prosim, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Koliko ste pripravljeni da priznaj, da vidim, da je? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 Torej, to se lahko zgodi pri več razlogov, 735 00:33:06,690 --> 00:33:09,148 in odkrito ta teden smo o tem, da bi vam več od njih. 736 00:33:09,148 --> 00:33:11,780 Toda v tem primeru poskusite nazaj k razumu 737 00:33:11,780 --> 00:33:14,430 kaj bi se lahko zgodilo tukaj? 738 00:33:14,430 --> 00:33:17,400 Segmentacija napaka, smo rekli zadnje čas, se nanaša na segment pomnilnika. 739 00:33:17,400 --> 00:33:18,690 Nekaj ​​slabega se je zgodilo. 740 00:33:18,690 --> 00:33:21,550 Toda, kaj je bilo mehansko, ki je šel po zlu 741 00:33:21,550 --> 00:33:25,000 sem zaradi moje odstranitve navedene tako imenovanega osnovnega primeru 742 00:33:25,000 --> 00:33:26,870 kjer sem se vrnil trdi kodirana vrednost? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Kaj misliš, da je šlo narobe? 745 00:33:30,460 --> 00:33:31,219 Ja. 746 00:33:31,219 --> 00:33:32,135 >> OBČINSTVO: [neslišno]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 ZVOČNIK 1: Ah. 749 00:33:36,970 --> 00:33:37,550 Dobro vprašanje. 750 00:33:37,550 --> 00:33:39,508 Torej velikosti števila da sem povzel 751 00:33:39,508 --> 00:33:41,920 imaš tako velika, da je presegla velikost pomnilniškega prostora. 752 00:33:41,920 --> 00:33:44,640 Dobra ideja, vendar ne bistveno dogaja, da povzroči nesrečo. 753 00:33:44,640 --> 00:33:48,230 To lahko povzroči integer overflow, kjer bitov samo obrnila 754 00:33:48,230 --> 00:33:51,760 in potem bomo zamenjali res velik številka, kot pa z negativnim predznakom, 755 00:33:51,760 --> 00:33:53,260 vendar to samo po sebi ne bo povzročilo nesrečo. 756 00:33:53,260 --> 00:33:55,509 Ker na koncu dan int je še vedno 32 bitov. 757 00:33:55,509 --> 00:33:57,640 Saj ne bo naključju ukrade 33. bit. 758 00:33:57,640 --> 00:33:58,431 Ampak dobra misel. 759 00:33:58,431 --> 00:33:58,984 Ja. 760 00:33:58,984 --> 00:33:59,900 >> OBČINSTVO: [neslišno]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 ZVOČNIK 1: Postopek nikoli ne neha teči, 763 00:34:02,300 --> 00:34:06,658 in res je sama ponovno poziva in znova in znova in znova 764 00:34:06,658 --> 00:34:08,449 in spet, in nobeden od te naloge doslej 765 00:34:08,449 --> 00:34:13,310 dokončati, ker njihov edini vrstici koda themself znova poziva 766 00:34:13,310 --> 00:34:14,219 in znova. 767 00:34:14,219 --> 00:34:16,080 In kaj je res dogaja tukaj in zdaj 768 00:34:16,080 --> 00:34:18,100 lahko nekako pripraviti to slikovno. 769 00:34:18,100 --> 00:34:20,899 Naj grem več na slika za trenutek. 770 00:34:20,899 --> 00:34:22,940 To je slika, ki bo sčasoma izpopolnili 771 00:34:22,940 --> 00:34:26,336 podrobneje, kaj se dogaja znotraj pomnilnika računalnika. 772 00:34:26,336 --> 00:34:28,460 In izkazalo se je, da je na dno te slike 773 00:34:28,460 --> 00:34:29,709 je nekaj, kar se imenuje sveženj. 774 00:34:29,709 --> 00:34:31,920 To je kos pomnilnika, kos RAM, 775 00:34:31,920 --> 00:34:33,920 to je samo uporablja kadarkoli Funkcija se imenuje. 776 00:34:33,920 --> 00:34:36,239 Vsak čas si, programer, pokličete funkcijo, 777 00:34:36,239 --> 00:34:38,860 operacijski sistem, kot Mac OS, Windows ali Linux, 778 00:34:38,860 --> 00:34:41,920 zagrabi kup bajtov, morda nekaj kilobajtov, morda nekaj megabajtov 779 00:34:41,920 --> 00:34:44,590 pomnilnika, ki jih roke za vas, in nato omogoča 780 00:34:44,590 --> 00:34:47,650 zaženete svojo funkcijo z ne glede na spremenljivke, kar potrebujete. 781 00:34:47,650 --> 00:34:50,699 In če potem pokličete drugo Funkcija in drugo funkcijo, 782 00:34:50,699 --> 00:34:53,590 boste dobili še en košček spomina in drugo rezino pomnilnika. 783 00:34:53,590 --> 00:34:57,090 >> In res, če teh zelenih pladnje od Annenberg predstavljajo tisti spomin, 784 00:34:57,090 --> 00:34:59,870 tukaj je, kaj se zgodi prvi Čas pokličete funkcijo sigma. 785 00:34:59,870 --> 00:35:04,510 To je kot dajanje pladenj takole o tem, kaj je na začetku prazna snop. 786 00:35:04,510 --> 00:35:07,142 Ampak potem če je pladenj se poziva, da se tako izrazim, 787 00:35:07,142 --> 00:35:08,850 kliče en primerek Sigma, ki je 788 00:35:08,850 --> 00:35:11,640 kot bi od operacijskega sistema, ooh, potrebujejo malo več pomnilnika, 789 00:35:11,640 --> 00:35:12,520 daj mi to. 790 00:35:12,520 --> 00:35:14,840 In potem postane to zloži na na vrhu. 791 00:35:14,840 --> 00:35:18,030 Toda kaj je ključ v tem, da Prvi pladenj je še vedno tam, 792 00:35:18,030 --> 00:35:20,620 ker je sklicevala na to drugo pladenj. 793 00:35:20,620 --> 00:35:23,500 Zdaj medtem, sigma pokličite sigma, , ki je, kot zahtevajo več pomnilnika. 794 00:35:23,500 --> 00:35:25,830 Gets nakopičena sem. 795 00:35:25,830 --> 00:35:29,350 sigma sigma klic, da je druga pladenj, ki dobi nakopičil tukaj. 796 00:35:29,350 --> 00:35:32,942 In če boste obdržali to delaš, na koncu, vrsta map ta vizualna 797 00:35:32,942 --> 00:35:35,525 v tem grafikonu, kaj se dogaja, da zgodi s skladovnice pladnjev? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 To se dogaja, da presega zneska pomnilnika ima računalnik. 800 00:35:41,160 --> 00:35:45,790 In takoj, ko je to zeleno pladenj nad vodoravno linijo 801 00:35:45,790 --> 00:35:49,410 zgoraj dimnika nad to besedo kup, kateri se bomo vrnili v prihodnosti, 802 00:35:49,410 --> 00:35:50,410 da je slaba stvar. 803 00:35:50,410 --> 00:35:52,810 Kup je drugačna segment pomnilnika, 804 00:35:52,810 --> 00:35:55,190 in če ste kaj ti pladnji pile in pile na, 805 00:35:55,190 --> 00:35:57,800 boš presega svoj segment pomnilnika, 806 00:35:57,800 --> 00:36:00,420 in program je dejansko šlo za nesrečo. 807 00:36:00,420 --> 00:36:02,930 >> Zdaj kot praha, to idejo rekurzijska, zato 808 00:36:02,930 --> 00:36:06,500 lahko nedvomno povzroči težave, vendar to ni nujno slaba stvar. 809 00:36:06,500 --> 00:36:08,840 Ker menijo, po Vse, kako-- in morda 810 00:36:08,840 --> 00:36:11,700 to traja nekaj pridobivanje vajeni da --how elegantno ali kako preprosta 811 00:36:11,700 --> 00:36:14,890 da izvajanje sigma je. 812 00:36:14,890 --> 00:36:17,440 In ne bomo uporabljati rekurzija vse, da je veliko v CS50, 813 00:36:17,440 --> 00:36:20,780 ampak v CS51, in res vsaka razred kje ste manipulirati podatkovne strukture 814 00:36:20,780 --> 00:36:23,640 kot so drevesa ali družinskih dreves, da imajo nekaj hierarhijo, 815 00:36:23,640 --> 00:36:26,000 to je super, super uporabna. 816 00:36:26,000 --> 00:36:29,750 Zdaj, kot prahi, da vas kot ambicioznimi računalniške znanstvenike 817 00:36:29,750 --> 00:36:33,180 so seznanjeni z nekaterimi od Googla znotraj šale, če greš na Google 818 00:36:33,180 --> 00:36:36,345 in pogledate, kaj je opredelitev, recimo, rekurzija, vnesite. 819 00:36:36,345 --> 00:36:40,208 820 00:36:40,208 --> 00:36:41,110 Uh-huh. 821 00:36:41,110 --> 00:36:42,670 Naj omenim, da sem potegnil nekaj. 822 00:36:42,670 --> 00:36:45,470 To je kot 10 minut odlašanje danes zjutraj. 823 00:36:45,470 --> 00:36:52,890 Če vas tudi Google "poševno" obvestilo z nagibanjem glave slightly-- 824 00:36:52,890 --> 00:36:55,120 in potem ta je morda najbolj odvratne vseh 825 00:36:55,120 --> 00:36:57,286 ker je nekdo preživel kot njihov dan izvajanju tega 826 00:36:57,286 --> 00:36:59,880 nekaj let ago-- pridi. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 Oh, wait-- da je bug. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> Torej teče na enem Največje spletne strani svetu 831 00:37:11,410 --> 00:37:13,510 so ti neumni velikonočna jajca. 832 00:37:13,510 --> 00:37:16,690 Verjetno porabijo enostavna, število vrstic kode 833 00:37:16,690 --> 00:37:19,280 samo zato, da bomo lahko imeli malo zabavnih stvari, kot je ta. 834 00:37:19,280 --> 00:37:22,140 Ampak vsaj zdaj dobiš nekatere od teh znotraj šale. 835 00:37:22,140 --> 00:37:28,330 >> Zdaj pa si oglejte nekaj White Lies smo bili sporoči prepozno, 836 00:37:28,330 --> 00:37:30,707 in začnite lupiti nazaj nekateri sloji tehnično 837 00:37:30,707 --> 00:37:32,790 tako, da boste resnično razumeli Kaj se je dogajalo 838 00:37:32,790 --> 00:37:34,860 in boste razumeli nekaj groženj, 839 00:37:34,860 --> 00:37:38,060 kot Shellshock, da sedaj začeli postanejo 840 00:37:38,060 --> 00:37:41,110 na čelu vsakogar pozornosti, vsaj v medijih. 841 00:37:41,110 --> 00:37:45,810 Torej, tukaj je zelo preprosta funkcija da vrne nič, nična. 842 00:37:45,810 --> 00:37:46,790 Njeno ime je swap. 843 00:37:46,790 --> 00:37:50,880 To traja v dveh spremenljivk in se vrne ničesar. 844 00:37:50,880 --> 00:37:52,260 Traja v a in b. 845 00:37:52,260 --> 00:37:53,337 Torej hitra predstavitev. 846 00:37:53,337 --> 00:37:54,170 Te smo odraščali. 847 00:37:54,170 --> 00:37:56,100 Mi lahko traja tudi malo prekinil sem za trenutek 848 00:37:56,100 --> 00:37:57,250 in še nekaj malega za popit. 849 00:37:57,250 --> 00:38:00,120 Če nekdo ne bi motilo pridružil me tukaj samo za trenutek. 850 00:38:00,120 --> 00:38:01,830 Kaj pa ti v maroon majico? 851 00:38:01,830 --> 00:38:02,335 Pridi gor. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Samo eno danes. 854 00:38:05,260 --> 00:38:06,251 Vseeno hvala. 855 00:38:06,251 --> 00:38:08,000 Vse v redu, in imamo Prihaja kdo tu? 856 00:38:08,000 --> 00:38:08,660 Kako ti je ime? 857 00:38:08,660 --> 00:38:09,360 >> SPEAKER 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> ZVOČNIK 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Pridi gor. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 Torej Laura, zelo preprost izziv danes. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Lepo, da yo spoznati. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 V redu. 866 00:38:16,910 --> 00:38:21,179 Torej imamo nekaj mleka sem in imamo nekaj pomarančnega soka tukaj 867 00:38:21,179 --> 00:38:23,345 in nekaj skodelic, ki smo danes sposodil od Annenberg. 868 00:38:23,345 --> 00:38:24,178 >> SPEAKER 4: Sposodil. 869 00:38:24,178 --> 00:38:27,240 ZVOČNIK 1: In šel naprej in vam pol kozarca to. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 V redu. 872 00:38:28,800 --> 00:38:30,750 In vam bom dal polovico kozarec mleka. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 Oh, in samo zato, da si lahko se spomnite, kaj je to bilo všeč, 875 00:38:35,890 --> 00:38:38,860 Spomnil sem se, da bi to gor in danes. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Ok. 878 00:38:42,530 --> 00:38:45,470 Če ne bi motilo, da vidimo, smo jim lahko dal preko svojih očal 879 00:38:45,470 --> 00:38:46,560 če hočeš. 880 00:38:46,560 --> 00:38:48,710 To bo svet iz oči Laura. 881 00:38:48,710 --> 00:38:49,210 V redu. 882 00:38:49,210 --> 00:38:53,820 Torej je vaš cilj, saj dve skodelici tekočina tukaj, mleko in pomarančni sok, 883 00:38:53,820 --> 00:38:58,370 je zamenjal dve vsebine, tako da pomarančni sok, ki gre v skodelico mleka 884 00:38:58,370 --> 00:39:00,710 in mleko gre v skodelice pomarančnega soka. 885 00:39:00,710 --> 00:39:02,359 >> SPEAKER 4: Ali dobim še eno skodelico? 886 00:39:02,359 --> 00:39:05,650 ZVOČNIK 1: Vesela sem, da si vprašal, čeprav da bi bilo veliko bolje posnetki 887 00:39:05,650 --> 00:39:06,710 če ne bi vprašal. 888 00:39:06,710 --> 00:39:10,620 Ampak ja, vam lahko ponudimo tretja cup, ki je prazna, seveda. 889 00:39:10,620 --> 00:39:11,120 V redu. 890 00:39:11,120 --> 00:39:12,300 Torej zamenjali vsebino tam. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Zelo lepo. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Zelo dobro. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Počneš to izredno previdno. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 In korak tri. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 V redu. 901 00:39:31,350 --> 00:39:31,930 Odlično. 902 00:39:31,930 --> 00:39:33,930 Velik aplavz bi bilo dobro za Lauro. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 V redu. 905 00:39:37,000 --> 00:39:40,790 Imamo malo poslovilno darilo za vas, vendar naj vzamem te. 906 00:39:40,790 --> 00:39:42,620 Najlepša hvala. 907 00:39:42,620 --> 00:39:46,170 Tako preprost primer, čeprav, dokazati, da če vam 908 00:39:46,170 --> 00:39:48,300 želijo, da bi zamenjali vsebino dveh posodah, 909 00:39:48,300 --> 00:39:52,360 ali pa jih pokličete spremenljivke, boste potrebovali nekaj začasnega skladiščenja 910 00:39:52,360 --> 00:39:56,710 na odru enega vsebine v tako da lahko dejansko narediti swap. 911 00:39:56,710 --> 00:40:01,790 Torej res, ta izvorna koda tukaj v C je predstavnik točno to. 912 00:40:01,790 --> 00:40:06,340 Če je bil pomarančni sok in mleko je b, in smo želeli, da bi zamenjali dva, 913 00:40:06,340 --> 00:40:08,990 Lahko poskusite nekaj ustvarjalnega z ležanjem ena v drugo, 914 00:40:08,990 --> 00:40:11,031 vendar to verjetno ne bi konča zlasti dobro. 915 00:40:11,031 --> 00:40:15,260 In tako smo uporabili tretji kozarec, klic je tmp, T-M-P po dogovoru 916 00:40:15,260 --> 00:40:19,370 in dal vsebino UL s tem, nato zamenjali eno skodelico, 917 00:40:19,370 --> 00:40:22,610 potem dal v UL originalni pokal, s čimer 918 00:40:22,610 --> 00:40:25,320 doseganje, točno tako, kot Laura storil, swap. 919 00:40:25,320 --> 00:40:26,850 >> Torej, kaj je naredil točno to. 920 00:40:26,850 --> 00:40:30,110 Dovolite mi, da gredo naprej in odprite up primer, ki je 921 00:40:30,110 --> 00:40:32,720 pravzaprav imenuje "no swap ", ker to ni 922 00:40:32,720 --> 00:40:36,180 kot enostavno narediti, kot si morda mislite. 923 00:40:36,180 --> 00:40:41,190 Torej, v tem programu, opazili, da Jaz sem z uporabo stdio.h, naš stari prijatelj. 924 00:40:41,190 --> 00:40:43,130 Imam prototip za swap tam gor, ki 925 00:40:43,130 --> 00:40:45,450 pomeni njegovo izvajanje je verjetno dol, 926 00:40:45,450 --> 00:40:48,050 in da vidimo, kaj je to glavni Program bo storil zame. 927 00:40:48,050 --> 00:40:52,020 Najprej sem razglasila int x dobi ena, in int y dobi dva. 928 00:40:52,020 --> 00:40:54,930 Torej, mislim tiste kot UL in mleko, oz. 929 00:40:54,930 --> 00:40:57,100 In potem sem samo še printf rekel x je to 930 00:40:57,100 --> 00:41:00,120 in y, je to samo zato, da sem lahko vizualno videli, kaj se dogaja. 931 00:41:00,120 --> 00:41:03,810 Potem sem printf trdijo da sem zamenjavo dveh, 932 00:41:03,810 --> 00:41:07,100 in potem sem izpisal trdijo, da si zamenjal, 933 00:41:07,100 --> 00:41:09,300 in sem spet izpisal x in y. 934 00:41:09,300 --> 00:41:13,010 Torej, tukaj v swap je točno tisto, Laura storil, 935 00:41:13,010 --> 00:41:16,240 in točno to, kar smo videli na zaslon pred nekaj trenutki. 936 00:41:16,240 --> 00:41:19,380 >> Torej, gremo naprej in biti boleče razočaran. 937 00:41:19,380 --> 00:41:24,690 Da ne bo zamenjave, in zagnati nobene zamenjave, povečanjem proizvodnje tukaj. 938 00:41:24,690 --> 00:41:28,320 Vnesite x 1, y 2, zamenjavam zamenjala. 939 00:41:28,320 --> 00:41:32,700 x je vedno 1, in y je vedno 2. 940 00:41:32,700 --> 00:41:37,630 Torej, čeprav, odkrito povedano, to izgleda ravno všeč, čeprav bolj tehnično, 941 00:41:37,630 --> 00:41:40,730 kaj Laura storil, ni videti, da deluje. 942 00:41:40,730 --> 00:41:42,130 Torej, zakaj je to? 943 00:41:42,130 --> 00:41:46,630 No, izkazalo se je, da se pri smo napisali program, kot je to 944 00:41:46,630 --> 00:41:51,590 da se je tako glavni, poudaril sem, in nato drugo funkcijo, kot zamenjave, 945 00:41:51,590 --> 00:41:54,230 poudarjeno tukaj, ki Zato poziva, svet 946 00:41:54,230 --> 00:41:57,030 Izgleda malo nekaj podobnega Ti pladnji trenutek nazaj. 947 00:41:57,030 --> 00:42:00,440 Ko glavni prvi dobi imenuje, To je, kot bi od operacijskega sistema 948 00:42:00,440 --> 00:42:04,030 za malo pomnilnika za vsak lokalni spremenljivke, kot sta x in y, ki ima glavno, 949 00:42:04,030 --> 00:42:05,660 in končajo tam. 950 00:42:05,660 --> 00:42:10,920 Ampak, če je glavna zahteva zamenjali, in glavni mine, da bi zamenjali dva argumenta, A in B, 951 00:42:10,920 --> 00:42:16,410 pomarančni sok in mleko, to ni všeč odnesete pomarančni sok in mleko 952 00:42:16,410 --> 00:42:17,500 z Lauro. 953 00:42:17,500 --> 00:42:21,300 Kaj računalnik počne, je to, prehaja kopije pomarančnega soka 954 00:42:21,300 --> 00:42:27,110 in kopije mleka Laura, tako da kar je v končni fazi v notranjosti tega pladnja 955 00:42:27,110 --> 00:42:32,510 je ena vrednost in dva ali UL in njihovi mleko, ampak kopije, 956 00:42:32,510 --> 00:42:34,790 tako da na tej točki v zgodbi, pa 957 00:42:34,790 --> 00:42:36,930 je UL in mleko v vsakem od teh pladnjev. 958 00:42:36,930 --> 00:42:39,260 Obstaja ena in dva V vsaki od teh pladnjev, 959 00:42:39,260 --> 00:42:41,720 in funkcija swap je res deluje. 960 00:42:41,720 --> 00:42:46,090 To je njihovo zamenjavo znotraj v drugem najvišjem predalu, 961 00:42:46,090 --> 00:42:48,147 ampak da je zamenjevanje nima vpliva. 962 00:42:48,147 --> 00:42:49,980 In na podlagi le nekaj Osnovno načelo, ki smo jih 963 00:42:49,980 --> 00:42:52,970 že prej govorili, in dejansko le nekaj minut nazaj, kaj 964 00:42:52,970 --> 00:42:58,770 lahko pojasni, zakaj spreminjanje in b notranjosti zamenjave 965 00:42:58,770 --> 00:43:05,560 nima vpliva na x in y, čeprav Opravil sem X in Y s funkcijo zamenjave. 966 00:43:05,560 --> 00:43:08,750 Kaj je ključna beseda pri tem, da Morda poenostavljeno razložiti? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Mislim, da sem ga slišal sem? 969 00:43:12,627 --> 00:43:13,335 OBČINSTVO: Return. 970 00:43:13,335 --> 00:43:14,085 ZVOČNIK 1: Vrnitev? 971 00:43:14,085 --> 00:43:14,590 Ne vrne. 972 00:43:14,590 --> 00:43:15,895 Pojdimo z eno drugo. 973 00:43:15,895 --> 00:43:16,395 Kaj je to? 974 00:43:16,395 --> 00:43:17,080 >> OBČINSTVO: [neslišno]. 975 00:43:17,080 --> 00:43:20,000 >> ZVOČNIK 1: OK, tako da smo lahko return-- da povratno delo v zgodbi, 976 00:43:20,000 --> 00:43:21,914 vendar pa še enostavnejša razlaga. 977 00:43:21,914 --> 00:43:22,580 OBČINSTVO: Področje. 978 00:43:22,580 --> 00:43:23,288 ZVOČNIK 1: Področje uporabe. 979 00:43:23,288 --> 00:43:24,300 Bom obseg. 980 00:43:24,300 --> 00:43:27,290 Torej področje, se spomnite, kjer naš x in y razglašena. 981 00:43:27,290 --> 00:43:30,840 Oni so razglašena v notranjosti za glavni tukaj gor. 982 00:43:30,840 --> 00:43:33,200 a in b, medtem, so dejansko razglasila 983 00:43:33,200 --> 00:43:35,930 notranjost zamenjave, ni čisto v Zaviti oklepaji, vendar še vedno 984 00:43:35,930 --> 00:43:37,690 V splošnem področju zamenjave. 985 00:43:37,690 --> 00:43:40,560 In res, in b obstajajo le v tem predalu 986 00:43:40,560 --> 00:43:44,850 iz Annenberg, to Drugi kos kode. 987 00:43:44,850 --> 00:43:49,500 Tako da smo res spreminja kopijo, vendar to ni res vse, da pomaga. 988 00:43:49,500 --> 00:43:52,190 >> Torej si oglejte to malo nižje ravni. 989 00:43:52,190 --> 00:43:55,430 Jaz grem nazaj v Source Directory, 990 00:43:55,430 --> 00:43:58,330 in bom najprej povečate tukaj, in samo 991 00:43:58,330 --> 00:44:02,290 Za potrditev, da sem v tem Večje okno terminala, 992 00:44:02,290 --> 00:44:04,430 Program se še vedno obnašajo, kot da je. 993 00:44:04,430 --> 00:44:06,840 Recimo, da zdaj, ko je to ni namerna. 994 00:44:06,840 --> 00:44:10,090 Jasno sem si želel zamenjave za dela, tako da se počuti kot hrošča. 995 00:44:10,090 --> 00:44:12,780 Zdaj lahko začnete z dodajanjem Veliko printf, da mojo kodo, 996 00:44:12,780 --> 00:44:16,010 tiskanje x tukaj, y nad tukaj, tukaj, b tukaj. 997 00:44:16,010 --> 00:44:18,220 Vendar odkrito povedano, to je verjetno kaj ste delali za nekaj tednov 998 00:44:18,220 --> 00:44:20,190 Zdaj, v uradnih urah in doma pri delu 999 00:44:20,190 --> 00:44:22,150 na psets poskušajo najti nekaj hroščev. 1000 00:44:22,150 --> 00:44:25,560 Ampak boste videli, če tega še niste storili, da je problem določiti tri vam predstavi 1001 00:44:25,560 --> 00:44:31,630 na ukaz imenovano GDB, kjer GDB, GNU razhroščevalnik, 1002 00:44:31,630 --> 00:44:34,040 si je cel kup funkcije, ki lahko dejansko 1003 00:44:34,040 --> 00:44:38,160 nam razumeti situacije kot je ta, ampak bolj očarljivo, 1004 00:44:38,160 --> 00:44:39,940 reševanju problemov in iskanju hroščev. 1005 00:44:39,940 --> 00:44:40,940 Zato bom to naredil. 1006 00:44:40,940 --> 00:44:44,770 Namesto da ./noswap, sem namesto tekoč teči GDB ./noswap. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Z drugimi besedami, grem teči moj Program ne Bash, naš novi prijatelj 1009 00:44:51,200 --> 00:44:51,850 danes. 1010 00:44:51,850 --> 00:44:53,970 Jaz grem teči moj Program noswap notranjosti 1011 00:44:53,970 --> 00:44:56,900 tega drugega programa, imenovanega GDB, ki je iskalnik napak, ki 1012 00:44:56,900 --> 00:45:01,035 je program, ki je zasnovan tako, da pomaga ste se pri ljudeh najti in odstraniti hroščev. 1013 00:45:01,035 --> 00:45:03,410 Torej, če sem udaril Run tukaj, tam je odvratne količino besedila 1014 00:45:03,410 --> 00:45:04,868 da res ne bo treba brati. 1015 00:45:04,868 --> 00:45:07,290 To je v bistvu moteča na poziv, ki 1016 00:45:07,290 --> 00:45:10,030 Bom udaril Control-L vstati na vrhu tam. 1017 00:45:10,030 --> 00:45:11,800 To je GDB poziv. 1018 00:45:11,800 --> 00:45:15,550 Če želim zagnati ta program zdaj, kot je to malo goljufija stanja na današnji 1019 00:45:15,550 --> 00:45:21,860 slide kaže, Run je prva ukaze, ki smo mislili, da uvedejo. 1020 00:45:21,860 --> 00:45:25,150 In jaz bom samo, da tip teči tu notranjosti GDB, 1021 00:45:25,150 --> 00:45:26,811 in res je tekel svoj program. 1022 00:45:26,811 --> 00:45:29,310 Zdaj je na voljo nekaj dodatnih izhodov zaslona, ​​kot je ta, 1023 00:45:29,310 --> 00:45:31,910 ampak to je GDB le da analni in nam povedal, kaj se dogaja. 1024 00:45:31,910 --> 00:45:34,451 Saj ni res treba skrbeti o teh podrobnosti. 1025 00:45:34,451 --> 00:45:36,890 Ampak kaj je res kul GDB, če naredim to again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L počisti screen-- pusti me naprej in tip "prekinil glavno," s tem, 1027 00:45:42,100 --> 00:45:45,743 ko sem pritisnite tipko Enter, ki določa, kaj je imenuje prelomna točka pri noswap.c, 1028 00:45:45,743 --> 00:45:51,270 linija 16, ki je, če GDB pogruntal moj program dejansko 1029 00:45:51,270 --> 00:45:53,070 je moja funkcija dejansko je. 1030 00:45:53,070 --> 00:45:55,070 To bomo prezreti za zdaj ampak to je naslov 1031 00:45:55,070 --> 00:45:57,310 v spomin posebej to funkcijo. 1032 00:45:57,310 --> 00:46:00,240 Torej, zdaj, ko sem teči s tipom, opazili, kaj je kul tukaj. 1033 00:46:00,240 --> 00:46:05,650 Moj program razbije v vrstici I povedal GDB za pavzo usmrtitev na. 1034 00:46:05,650 --> 00:46:09,850 Tako da mi ne bi bilo treba zdaj spremeniti svojo kodo, dodati nekaj printf-jev, ga prevesti, ponovitev 1035 00:46:09,850 --> 00:46:13,300 ga spremenite, dodate nekaj printf-jev, ga shranite, jo prevedem, ga zaženite. 1036 00:46:13,300 --> 00:46:18,100 Jaz lahko samo sprehod skozi mojega programa korak po korak za korakom na človeško hitrostjo, 1037 00:46:18,100 --> 00:46:20,880 ne na Intel-znotraj vrste hitrosti. 1038 00:46:20,880 --> 00:46:24,580 >> Torej sedaj opazil to linijo Tu se pojavi, in če grem nazaj 1039 00:46:24,580 --> 00:46:27,800 na moj program v gedit, opazili, da je to dejansko 1040 00:46:27,800 --> 00:46:29,280 Zelo prvi vrstici kode. 1041 00:46:29,280 --> 00:46:31,240 Tam je linija 16 v gedit. 1042 00:46:31,240 --> 00:46:34,610 Tam je postavka 16 v GDB in celo čeprav je ta črno-beli vmesnik 1043 00:46:34,610 --> 00:46:37,760 še zdaleč ni tako uporabnika prijazen, to pomeni 1044 00:46:37,760 --> 00:46:41,680 da linija 16 še ni bil izvršen še ni, vendar je na tem, da bo. 1045 00:46:41,680 --> 00:46:46,220 Torej res, če sem tip print x, ne printf, le print x, 1046 00:46:46,220 --> 00:46:50,730 Dobim lažne vrednost je nič, ker x še ni bila inicializirana. 1047 00:46:50,730 --> 00:46:54,760 Tako da bom naslednji tip, ali pa, če vas želijo biti fancy, samo N za dostavo. 1048 00:46:54,760 --> 00:46:59,090 Toda, ko sem s tipom naslednji vstop, zdaj opazite, da se preseli na liniji 17. 1049 00:46:59,090 --> 00:47:02,840 Torej je logično, če sem usmrčen linija 16 in sem zdaj tip tiskanja x, 1050 00:47:02,840 --> 00:47:03,640 kaj naj jaz vidim? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 One. 1053 00:47:05,520 --> 00:47:07,820 >> In zdaj je to res zmedeno. 1054 00:47:07,820 --> 00:47:11,260 $ 2 samo fancy način, če vas želite sklicevati na to vrednost kasneje, 1055 00:47:11,260 --> 00:47:12,510 lahko rečeš "dolar podpiše dva." 1056 00:47:12,510 --> 00:47:13,480 To je kot referenco nazaj. 1057 00:47:13,480 --> 00:47:14,570 Ampak za zdaj, le ignorirajo. 1058 00:47:14,570 --> 00:47:17,070 Zanimivo je to, kar je na desni strani enačaja. 1059 00:47:17,070 --> 00:47:21,000 In zdaj, če sem tip zraven še enkrat in tiskanje y, moram videti 2. 1060 00:47:21,000 --> 00:47:23,870 Jaz lahko zdaj tudi natisnete x še enkrat, in odkrito povedano, 1061 00:47:23,870 --> 00:47:27,130 če sem že malo zmeden, kje sem, sem lahko vnesete seznam za seznam 1062 00:47:27,130 --> 00:47:30,590 in sem videl samo nekaj konteksta okrog točka, da sem dejansko na. 1063 00:47:30,590 --> 00:47:35,180 In zdaj sem lahko vnesete Naslednji, in tam je x 1. 1064 00:47:35,180 --> 00:47:36,300 Zdaj sem tip zraven. 1065 00:47:36,300 --> 00:47:37,710 Oh, y 2. 1066 00:47:37,710 --> 00:47:40,750 In spet, da je zmedeno, ker proizvodnja GDB je 1067 00:47:40,750 --> 00:47:43,044 se pomešati s svojo močjo. 1068 00:47:43,044 --> 00:47:45,710 Ampak, če si v mislih, ki jih Že pogled nazaj in naprej po kodi 1069 00:47:45,710 --> 00:47:47,740 ali o iz strani s strani morda boste 1070 00:47:47,740 --> 00:47:51,020 vidim, da res sem samo odskočna preko mojega programa. 1071 00:47:51,020 --> 00:47:54,620 >> Ampak obvestilo, kaj se bo zgodilo, dobesedno. 1072 00:47:54,620 --> 00:47:56,380 Tukaj je linija 22. 1073 00:47:56,380 --> 00:48:01,315 Naj grem po njem, s čimer se gibljejo na do 23, in če sem natisniti x zdaj, še ena. 1074 00:48:01,315 --> 00:48:03,890 In če sem natisniti y zdaj, še ena. 1075 00:48:03,890 --> 00:48:05,820 Torej to ni koristno vaja. 1076 00:48:05,820 --> 00:48:07,450 Torej, kaj je to ponoviti. 1077 00:48:07,450 --> 00:48:10,069 Naj grem nazaj do spet top in vrsta rok. 1078 00:48:10,069 --> 00:48:12,110 In to govori program da se je debugged 1079 00:48:12,110 --> 00:48:14,109 se je že začelo, začel od začetka. 1080 00:48:14,109 --> 00:48:15,420 Ja, dajmo to storiti še enkrat. 1081 00:48:15,420 --> 00:48:22,000 In tokrat naredimo naslednji, naslednji, naslednji, naslednji, naslednji, 1082 00:48:22,000 --> 00:48:24,180 zdaj pa stvari postanejo zanimive. 1083 00:48:24,180 --> 00:48:27,760 Sedaj želim stopiti v swap, tako da jaz ne tip zraven. 1084 00:48:27,760 --> 00:48:34,380 Sem tip korak, zdaj ga opazili me je skočil na noswap.c linijo 33. 1085 00:48:34,380 --> 00:48:37,240 Če grem nazaj v gedit, kaj je linija 33? 1086 00:48:37,240 --> 00:48:40,500 To je prvi dejanski vrstica kode znotraj zamenjave. 1087 00:48:40,500 --> 00:48:44,150 Kar je lepo, ker zdaj ne morem nekako suniti okrog in dobili radovedni 1088 00:48:44,150 --> 00:48:46,052 o tem, kaj se dogaja zares tam. 1089 00:48:46,052 --> 00:48:46,760 Dovolite mi, da natisnete tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Vau. 1092 00:48:48,800 --> 00:48:51,438 Zakaj tmp imajo nekateri noro, lažne smeti vrednost? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 OBČINSTVO: To ni bil inicializiran. 1095 00:48:56,120 --> 00:48:57,150 ZVOČNIK 1: To ni bil inicializiran. 1096 00:48:57,150 --> 00:49:00,270 In res, ko zaženete program, ste dali cel kup pomnilnika 1097 00:49:00,270 --> 00:49:03,392 z operacijskim sistemom, vendar si ni inicializirana nobenih vrednosti, 1098 00:49:03,392 --> 00:49:05,600 tako da karkoli bits ste vidim tukaj, čeprav je 1099 00:49:05,600 --> 00:49:07,770 to noro velik negativen številka, pomeni le, 1100 00:49:07,770 --> 00:49:10,750 da so to ostanki iz nekatere prejšnje uporabe tega RAM-a, 1101 00:49:10,750 --> 00:49:13,050 čeprav nisem Sam ga še potrebno. 1102 00:49:13,050 --> 00:49:17,086 Torej, zdaj bom, da gredo naprej in tip naslednji, in če jaz zdaj tip tiskanja tmp, 1103 00:49:17,086 --> 00:49:17,835 kaj naj jaz vidim? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Zaradi je vrednost, je prvi argument, samo 1106 00:49:23,360 --> 00:49:25,550 kot x je prva stvar, ki se prenesejo v, 1107 00:49:25,550 --> 00:49:30,450 tako, x mora biti enaka, zato je treba natisniti tmp mi natisnete eno. 1108 00:49:30,450 --> 00:49:36,360 >> Torej, kaj boste videli na problem niz tri je tutorial z menoj na GDB, 1109 00:49:36,360 --> 00:49:40,020 vendar je spoznala, da je to začetek z pogledom na orodje, ki bo dejansko 1110 00:49:40,020 --> 00:49:42,774 vam pomagajo rešiti težave toliko bolj učinkovito. 1111 00:49:42,774 --> 00:49:44,690 Kaj bomo na koncu storili v sredo 1112 00:49:44,690 --> 00:49:48,180 je začela lupiti nazaj nekaj plasti in odstranite nekaj koles usposabljanja. 1113 00:49:48,180 --> 00:49:50,496 Ta stvar se imenuje niz, ki smo nekaj časa uporabljali, 1114 00:49:50,496 --> 00:49:53,370 bomo počasi vzeti od vas in začeli govoriti o 1115 00:49:53,370 --> 00:49:55,725 nekaj več ezoterično znan kot char *, 1116 00:49:55,725 --> 00:49:59,550 vendar bomo storili to lepo in sprva počasi, čeprav kazalci, 1117 00:49:59,550 --> 00:50:02,730 kot oni poklical, lahko storite nekaj Zelo slabe stvari, če zlorabljene 1118 00:50:02,730 --> 00:50:06,040 jih gledaš malo claymation od naš prijatelj Nick Parlante iz Stanforda 1119 00:50:06,040 --> 00:50:09,670 University, profesor na računalniku znanost, ki skupaj predogleda 1120 00:50:09,670 --> 00:50:11,075 o tem, kaj je, da pridejo na to sreda. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [VIDEO PREDVAJANJE] 1123 00:50:13,400 --> 00:50:13,900 Hej, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Zbudi. 1126 00:50:15,780 --> 00:50:17,240 To je čas za zabavo kazalca. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> Kaj je to? 1129 00:50:19,350 --> 00:50:21,150 Spoznajte kazalci? 1130 00:50:21,150 --> 00:50:22,050 Oh, Goody! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [END VIDEO PREDVAJANJE] 1133 00:50:23,730 --> 00:50:25,396 ZVOČNIK 1: To vas čaka v sredo. 1134 00:50:25,396 --> 00:50:26,440 Se vidimo potem. 1135 00:50:26,440 --> 00:50:27,106 [VIDEO PREDVAJANJE] 1136 00:50:27,106 --> 00:50:30,420 In zdaj, Deep Thoughts, z Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> Zakaj se učimo C? 1139 00:50:35,900 --> 00:50:36,785 Zakaj pa ne +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Smeh] 1142 00:50:40,910 --> 00:50:42,160 >> [END VIDEO PREDVAJANJE]