1 00:00:00,000 --> 00:00:12,040 >> [Speel van musiek] 2 00:00:12,040 --> 00:00:16,460 >> Spreker 1: Alle reg, dit is CS50, en dit is die begin van die week vier, 3 00:00:16,460 --> 00:00:20,420 en as jy dalk gehoor het of lees, het die wêreld is eindig. 4 00:00:20,420 --> 00:00:23,520 Gaan rondom die internet is kennis en bewustheid 5 00:00:23,520 --> 00:00:27,100 van 'n fout in 'n program, 'n programmeertaal genoem bash. 6 00:00:27,100 --> 00:00:32,729 Dit het wonderbaarlik gebrandmerk as Shellshock, of die bash deur, 7 00:00:32,729 --> 00:00:35,485 maar artikels soos hierdie het nie ongewoon nie. 8 00:00:35,485 --> 00:00:38,807 En in werklikheid, baie van hulle bring herinneringe van Heartbleed, 9 00:00:38,807 --> 00:00:41,640 wat jy dalk opgemerk het in die druk terug die afgelope jaar, wat 10 00:00:41,640 --> 00:00:43,980 was insgelyks redelik dramaties. 11 00:00:43,980 --> 00:00:47,110 Nou die van julle hier vandag, hoeveel van julle het, 12 00:00:47,110 --> 00:00:50,330 selfs as jy nie verstaan ​​wat dit is alles oor, hoor Shellshock? 13 00:00:50,330 --> 00:00:51,370 14 00:00:51,370 --> 00:00:54,245 Alle reg, en hoeveel van julle rekenaars wat kwesbaar is? 15 00:00:54,245 --> 00:00:55,680 16 00:00:55,680 --> 00:01:00,250 OK, daar behoort te wees ver, ver meer hande tot nou, om redes wat ons sal sien. 17 00:01:00,250 --> 00:01:02,580 >> Kom ons neem 'n blik op wat is is aan die gang in die media 18 00:01:02,580 --> 00:01:05,304 en verduidelik dit dan 'n bietjie hier vir ons tegnies. 19 00:01:05,304 --> 00:01:07,670 20 00:01:07,670 --> 00:01:11,250 >> Spreker 2: Sekuriteit kundiges het gewaarsku dat 'n ernstige fout kon 21 00:01:11,250 --> 00:01:15,650 wees oor die honderde te beïnvloed miljoene van die wêreld se web gebruikers. 22 00:01:15,650 --> 00:01:20,600 So wat presies is die fout wat was genoem Shellshock, en wat beteken dit? 23 00:01:20,600 --> 00:01:23,720 24 00:01:23,720 --> 00:01:28,910 Wel, Shellshock is ook bekend as die Bash fout, die sagteware dit uitbuit. 25 00:01:28,910 --> 00:01:33,230 Hackers gebruik om die virus kwesbaar te scan stelsels hardloop Linux en Unix 26 00:01:33,230 --> 00:01:36,300 bedryfstelsels en dan hulle aansteek. 27 00:01:36,300 --> 00:01:38,730 Bash is 'n command line dop. 28 00:01:38,730 --> 00:01:43,460 Dit laat gebruikers kwessie beveel om te begin programme en funksies binne sagteware 29 00:01:43,460 --> 00:01:45,250 deur te tik in die teks. 30 00:01:45,250 --> 00:01:49,980 Dit is tipies gebruik word deur programmeerders en moet nie oop wees vir die res van die wêreld, 31 00:01:49,980 --> 00:01:51,590 al Shellshock verander nie. 32 00:01:51,590 --> 00:01:54,160 33 00:01:54,160 --> 00:01:57,910 >> Wel, worringly, sommige ontleders waarsku dit kan 'n groter bedreiging wees, 34 00:01:57,910 --> 00:02:01,580 omdat Shellshock kan volledige beheer van 'n besmette rekenaar, 35 00:02:01,580 --> 00:02:06,030 terwyl Heartbleed slegs toegelaat hackers om te spioeneer op rekenaars. 36 00:02:06,030 --> 00:02:09,130 Dit is so ernstig, is dit is aangewys 'n 10 uit 10 37 00:02:09,130 --> 00:02:11,900 vir die erns van die Nasionale Kwesbaarheid databasis. 38 00:02:11,900 --> 00:02:15,530 39 00:02:15,530 --> 00:02:20,015 2/3 van alle webservers is op risiko, insluitend 'n paar Mac rekenaars. 40 00:02:20,015 --> 00:02:22,760 41 00:02:22,760 --> 00:02:25,600 Wel, maak seker dat jy pleister jou stelsels nou. 42 00:02:25,600 --> 00:02:29,330 Enigiemand gasheer van 'n webwerf loop die geaffekteerde bedryfstelsels 43 00:02:29,330 --> 00:02:31,800 moet aksie neem so gou as moontlik. 44 00:02:31,800 --> 00:02:35,390 Enigeen wat dit kan bekostig moet kyk om hul monitering en web aansoek 45 00:02:35,390 --> 00:02:37,355 firewalls om te kyk uit vir enige aanvalle. 46 00:02:37,355 --> 00:02:39,979 47 00:02:39,979 --> 00:02:41,770 SPREKER 3: Die ergste ding wat kan gebeur, is 48 00:02:41,770 --> 00:02:45,080 dat iemand kode sou skryf dat outomaties gaan scan 49 00:02:45,080 --> 00:02:48,280 die internet en sou raak al hierdie rekenaars. 50 00:02:48,280 --> 00:02:50,710 En as hulle dit doen, wel, die ergste ding wat hulle kan doen 51 00:02:50,710 --> 00:02:53,300 net alles verwyder, of sluit die plekke af. 52 00:02:53,300 --> 00:02:55,360 So kan ons die skade sien vanaf die punt van die oog, 53 00:02:55,360 --> 00:02:58,300 waar ons kwaadwillige mense wil hê wat net besluit om chaos te veroorsaak 54 00:02:58,300 --> 00:03:02,534 deur te bring stelsels af of verwyder lêers, en dinge soos dat. 55 00:03:02,534 --> 00:03:05,200 Spreker 2: Sommige sê dit is een van die mees moeilik om te meet 56 00:03:05,200 --> 00:03:08,080 foute in die jaar, en dit Dit kan weke neem of selfs 57 00:03:08,080 --> 00:03:10,820 maande die uiteindelike impak te bepaal. 58 00:03:10,820 --> 00:03:12,180 59 00:03:12,180 --> 00:03:15,560 >> Spreker 1: So al wat waar is, Maar die snaakse ding is, byna almal 60 00:03:15,560 --> 00:03:18,330 van die beelde wat jy nou net gesien het, behalwe vir miskien die sleutelbord, 61 00:03:18,330 --> 00:03:20,930 het niks te doen met die fout hoegenaamd nie. 62 00:03:20,930 --> 00:03:23,960 Servers en drade en so meer, dit is soort van tangensiaal verwant is, 63 00:03:23,960 --> 00:03:27,410 maar by die kern dit is eintlik mooi vertroud wat gaan hier aan. 64 00:03:27,410 --> 00:03:30,050 In werklikheid, laat my gaan na ons CS50 toestel. 65 00:03:30,050 --> 00:03:32,910 Laat my voort te gaan en te sorg die terminale venster hier. 66 00:03:32,910 --> 00:03:36,020 En julle het al met behulp van hierdie, of die ingeboude weergawe daarvan, 67 00:03:36,020 --> 00:03:39,460 in gedit om programme te skryf, tik opdragte, en so meer, 68 00:03:39,460 --> 00:03:43,690 en dit is eintlik, en het al vir weke, bash, B-A-S-H. 69 00:03:43,690 --> 00:03:46,890 Dit is die Bourne-weer dop, wat net 'n fancy manier om te sê, 70 00:03:46,890 --> 00:03:50,220 dit is 'n program wat 'n flikkerende vinnige, doeltreffende, 71 00:03:50,220 --> 00:03:51,970 dat daar sit en wag vir insette vir jou. 72 00:03:51,970 --> 00:03:53,920 En dit is die opdrag line interface via wat 73 00:03:53,920 --> 00:03:57,650 julle ouens het al 'bevele en uiteindelik die opstel en dan hardloop 74 00:03:57,650 --> 00:03:58,400 programme. 75 00:03:58,400 --> 00:04:01,320 >> Maar Bash is ook 'n ontwikkeling taal in die volgende sin. 76 00:04:01,320 --> 00:04:05,460 Jy weet dat daar is opdragte soos CD en LS en ook kletteren en ander, 77 00:04:05,460 --> 00:04:09,580 maar jy kan jou eie instruksies te definieer deur die implementering van hulle in bash. 78 00:04:09,580 --> 00:04:11,420 Nou is ons gaan nie gaan in groot detail 79 00:04:11,420 --> 00:04:16,089 as die programmeertaal te bash nie, maar weet, byvoorbeeld, wat op die oomblik, 80 00:04:16,089 --> 00:04:17,607 daar is geen opdrag genaamd "hallo." 81 00:04:17,607 --> 00:04:19,440 So dit kan gevind word in een van hierdie pakkette. 82 00:04:19,440 --> 00:04:20,856 Dit is nie op my rekenaar geïnstalleer. 83 00:04:20,856 --> 00:04:21,870 Vra jou administrateur. 84 00:04:21,870 --> 00:04:26,030 Maar as ek wil daar 'n program te wees genoem "hallo" in Bash of by my vinnige, 85 00:04:26,030 --> 00:04:30,810 Ek kan eintlik gebruik sintaksis wat hou C. Dit is nie heeltemal dieselfde nie, 86 00:04:30,810 --> 00:04:35,020 maar dit lyk redelik soortgelyk aan 'n funksie, al is dit ontbreek 'n paar besonderhede. 87 00:04:35,020 --> 00:04:38,090 Dit lyk asof niks gebeur, maar nou as ek tik "hallo" 88 00:04:38,090 --> 00:04:40,960 jy kan eintlik skryf 'n program, nie in C nie in Java, 89 00:04:40,960 --> 00:04:44,280 nie in 'n ander ontwikkeling taal, maar in Bash self. 90 00:04:44,280 --> 00:04:47,630 >> Nou is die sleutel hier is dat ek die noem ek wou hierdie nuwe opdrag te gee, 91 00:04:47,630 --> 00:04:50,820 en die hakies is ook simbolies van dit is 'n funksie. 92 00:04:50,820 --> 00:04:54,010 As 'n eenkant, kan jy ook pret doen dinge, en in die feit, selfs op Mac OS, 93 00:04:54,010 --> 00:04:55,620 dit is 'n program genaamd terminale. 94 00:04:55,620 --> 00:04:58,800 Dit kom gebou in iemand se rekenaar wat 'n Mac in hierdie kamer, 95 00:04:58,800 --> 00:05:03,640 en jy kan soortgelyke dinge in Mac doen OS, maar jy kan meer as dit gaan. 96 00:05:03,640 --> 00:05:07,110 En dit is 'n bietjie tangensiaal, maar dit is soort van pret. 97 00:05:07,110 --> 00:05:09,715 Ek is vanoggend herinner, Wanneer dit te dink deur middel, 98 00:05:09,715 --> 00:05:13,279 van 'n bietjie spel ek gebruik om te speel met een van CS50 se voormalige TFS 99 00:05:13,279 --> 00:05:16,570 waardeur enige tyd wat hy sou weg van loop sy klawerbord met sy skerm ontsluit, 100 00:05:16,570 --> 00:05:23,611 Ek wil 'n opdrag uit te voer soos this-- "sê hallo." 101 00:05:23,611 --> 00:05:26,610 En nou enige tyd kom hy terug na sy klawerbord nadat ek die skoonmaak van die skerm 102 00:05:26,610 --> 00:05:27,985 en hy sal gaan sit, probeer om 'n werk te doen, 103 00:05:27,985 --> 00:05:29,250 n lys van die inhoud van sy directory-- 104 00:05:29,250 --> 00:05:29,510 >> [Audio speel] 105 00:05:29,510 --> 00:05:30,010 >> -Hello. 106 00:05:30,010 --> 00:05:31,621 107 00:05:31,621 --> 00:05:32,120 Hello. 108 00:05:32,120 --> 00:05:35,030 >> Spreker 1: So, in regverdigheid, dit was nie eintlik "hallo." 109 00:05:35,030 --> 00:05:36,894 Dit was gewoonlik iets meer verwant aan that-- 110 00:05:36,894 --> 00:05:37,560 [Audio speel] 111 00:05:37,560 --> 00:05:37,750 -Beep. 112 00:05:37,750 --> 00:05:39,320 Spreker 1: --that Ek would-- sodat sy rekenaar sou 113 00:05:39,320 --> 00:05:42,170 sweer by hom enige tyd wat hy eintlik gaan sit by sy klavier. 114 00:05:42,170 --> 00:05:46,265 En baie vinnig hy uitgepluis nie te laat om sy skerm ontsluit. 115 00:05:46,265 --> 00:05:48,730 Maar dit dui op die soort dom pret wat jy 116 00:05:48,730 --> 00:05:50,210 kan hê met iets soos Bash. 117 00:05:50,210 --> 00:05:52,770 Maar dit is 'n bietjie meer ernstige, om seker te maak, as dit wees. 118 00:05:52,770 --> 00:05:57,235 En in werklikheid, dit is een van die gevaarlikste en langdurige foute 119 00:05:57,235 --> 00:05:58,860 wat werklik die wêreld wêreldwyd. 120 00:05:58,860 --> 00:06:02,060 Hierdie fout is al vir sowat 20 jaar, 121 00:06:02,060 --> 00:06:05,780 en jy sal in net 'n getref word oomblik deur sy relatiewe eenvoud. 122 00:06:05,780 --> 00:06:07,990 >> So, dit is 'n verteenwoordiger beveel dat as jy 123 00:06:07,990 --> 00:06:10,448 self 'n Mac, letterlik nou wanneer jy jou deksel oop, 124 00:06:10,448 --> 00:06:12,940 jy kan probeer om te tik in daardie program genoem Terminal. 125 00:06:12,940 --> 00:06:15,410 Terminale is onder Aansoeke Utilities-- 126 00:06:15,410 --> 00:06:18,790 vir een keer, Windows gebruikers hoef nie te bekommerd wees oor hierdie spesifieke threat-- 127 00:06:18,790 --> 00:06:22,310 maar dié van julle met Mac kan tik dit in 'n venster soos ek hier sal doen, 128 00:06:22,310 --> 00:06:24,210 en as jy nie tik wat in hierdie program 129 00:06:24,210 --> 00:06:28,830 genoem Terminal, soos ek nou sal doen, As jy die woord sien "kwesbaar" 130 00:06:28,830 --> 00:06:32,200 jou rekenaar kwesbaar vir uitbuiting. 131 00:06:32,200 --> 00:06:33,850 >> Nou wat beteken dit eintlik beteken? 132 00:06:33,850 --> 00:06:35,870 En dit is weliswaar 'n paar mooi gek sintaksis, 133 00:06:35,870 --> 00:06:39,050 maar laat ons minstens trek uit sommige van die interessante aspekte. 134 00:06:39,050 --> 00:06:42,567 So daar is 'n paar sintaksis wat lyk 'n bietjie bekend is, ten minste van C 135 00:06:42,567 --> 00:06:43,950 en programmering meer algemeen. 136 00:06:43,950 --> 00:06:47,550 Ek sien 'n paar hakies, kommapunte, krulhakies, en so, 137 00:06:47,550 --> 00:06:50,820 maar dit blyk dat hierdie dom ding hier in geel 138 00:06:50,820 --> 00:06:53,580 is in wese 'n funksie wat doen niks. 139 00:06:53,580 --> 00:06:57,840 Die kolon middel niks doen nie, en die kommapunt beteken stop niks doen nie. 140 00:06:57,840 --> 00:07:00,250 So binnekant van hierdie krulhakies, die feit 141 00:07:00,250 --> 00:07:02,440 dat ek 'n gelyke teken aan die linkerkant, hierdie 142 00:07:02,440 --> 00:07:05,500 is in wese skep 'n opdrag of 'n veranderlike, 143 00:07:05,500 --> 00:07:09,520 genoem x, en die toeken van dit geel bietjie van die kode is daar. 144 00:07:09,520 --> 00:07:14,040 Dit kan iets soos "eggo wees hallo "of" sê beep "of iets 145 00:07:14,040 --> 00:07:15,120 soortgelyk aan dié. 146 00:07:15,120 --> 00:07:17,780 Maar let as jou oë dwaal verder aan die regterkant, 147 00:07:17,780 --> 00:07:22,150 daar is meer aan hierdie lyn as net die einde van die kommapunt. 148 00:07:22,150 --> 00:07:25,160 "Echo kwesbaar," en dan as dit nie daar is nog meer. 149 00:07:25,160 --> 00:07:26,530 Nog 'n kommapunt, bash -c :. 150 00:07:26,530 --> 00:07:28,120 151 00:07:28,120 --> 00:07:34,050 >> So lang storie kort, hierdie lyn van kode is 152 00:07:34,050 --> 00:07:36,660 voldoende vir dwingende 'n rekenaar wat 153 00:07:36,660 --> 00:07:39,830 kwesbaar om iets te doen wat jy wil om dit te doen, 154 00:07:39,830 --> 00:07:44,290 want daar is 'n fout in Bash waardeur selfs al Bash was veronderstel om te stop 155 00:07:44,290 --> 00:07:48,980 lees lyne van die opdrag reg daar na die geel teks, 156 00:07:48,980 --> 00:07:52,520 vir 'n 20-plus jaar oud fout, Bash het eintlik al lees 157 00:07:52,520 --> 00:07:56,780 verder as dit kommapunt en mooi veel om te doen wat dit vertel word. 158 00:07:56,780 --> 00:07:59,070 >> So, wat is die implikasie van wat uiteindelik? 159 00:07:59,070 --> 00:08:01,340 Ek het net gesê: "eggo hallo" of "eggo kwesbaar," 160 00:08:01,340 --> 00:08:05,449 Maar wat as jy iets eintlik kwaadwillige, soos rm-rf *, 161 00:08:05,449 --> 00:08:07,240 wat jy dalk nie het ooit getik, 162 00:08:07,240 --> 00:08:08,920 en eerlik jy waarskynlik moet nie te gou, 163 00:08:08,920 --> 00:08:10,700 want jy kan doen om 'n baie skade met dit. 164 00:08:10,700 --> 00:08:11,210 Hoekom? 165 00:08:11,210 --> 00:08:12,990 rm doen wat natuurlik? 166 00:08:12,990 --> 00:08:14,270 Verwyder. 167 00:08:14,270 --> 00:08:15,930 * Beteken wat? 168 00:08:15,930 --> 00:08:16,430 Alle. 169 00:08:16,430 --> 00:08:18,180 So dit is 'n sogenaamde wild card, so dit beteken 170 00:08:18,180 --> 00:08:20,410 alles verwyder in die huidige gids. 171 00:08:20,410 --> 00:08:23,379 r gebeur beteken rekursiewe, wat beteken dat as wat jy skrap 172 00:08:23,379 --> 00:08:26,420 is 'n gids, en binnekant van daar is ander lêers en ander dopgehou, 173 00:08:26,420 --> 00:08:28,950 rekursief duik in daar en verwyder al van dat. 174 00:08:28,950 --> 00:08:31,040 En f is die ergste van hulle almal. 175 00:08:31,040 --> 00:08:32,580 Wie weet wat f beteken hier? 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 So dwing beteken, selfs As dit is 'n slegte idee nie, 179 00:08:37,830 --> 00:08:40,939 doen dit sonder om te vra vir my vir verdere bevestiging. 180 00:08:40,939 --> 00:08:43,230 So, jy weet, ons lag , maar eerlik, ek het waarskynlik 181 00:08:43,230 --> 00:08:44,972 tik verskeie kere 'n dag, want die werklikheid 182 00:08:44,972 --> 00:08:47,210 is dit die vinnigste manier om te verwyder 'n hele klomp van die dinge. 183 00:08:47,210 --> 00:08:48,590 Maar selfs ek het 'n bietjie skade gedoen. 184 00:08:48,590 --> 00:08:53,100 >> Maar as jy 'n rekenaar te mislei in die definisie van 'n paar dom veranderlike 185 00:08:53,100 --> 00:08:56,810 of funksie genoem x, maar dan tricking die rekenaar in die uitvoering van 186 00:08:56,810 --> 00:09:00,030 buite die grense van daardie funksie, as dit kommapunt, 187 00:09:00,030 --> 00:09:04,430 jy kan wel 'n rekenaar mislei in die uitvoering van iets soos rm-rf 188 00:09:04,430 --> 00:09:07,810 of die e-pos opdrag of die opdrag Kopieer. 189 00:09:07,810 --> 00:09:11,400 Enigiets letterlik kan jy doen met die rekenaar, of dit nou die verwydering van lêers, 190 00:09:11,400 --> 00:09:15,350 skep lêers, spam iemand aanval 'n paar bediener afstand, 191 00:09:15,350 --> 00:09:17,190 As jy dit kan uitdruk met 'n opdrag, kan jy 192 00:09:17,190 --> 00:09:19,120 kan 'n rekenaar flous om dit te doen. 193 00:09:19,120 --> 00:09:21,510 >> Nou wat is 'n voorbeeld van hoe jy dit kan doen? 194 00:09:21,510 --> 00:09:24,300 Wel, daar is 'n baie van rekenaars op die internet loop bash. 195 00:09:24,300 --> 00:09:26,390 Almal van ons Mac-gebruikers is onder hulle. 196 00:09:26,390 --> 00:09:30,390 Baie van die bedieners is onder hulle so goed, en Unix bedieners. 197 00:09:30,390 --> 00:09:32,630 Windows kry weer relatief uit die haak 198 00:09:32,630 --> 00:09:34,590 tensy jy het geïnstalleer spesiale sagteware. 199 00:09:34,590 --> 00:09:37,130 Nou 'n baie bedieners, Byvoorbeeld, loop web bedieners, 200 00:09:37,130 --> 00:09:39,840 en in die feit dat Linux is dalk die gewildste bedryfstelsel 201 00:09:39,840 --> 00:09:43,060 om te loop op rekenaars op die internet wat dien tot webblaaie. 202 00:09:43,060 --> 00:09:44,910 Nou as ons sal later sien in die semester, wanneer 203 00:09:44,910 --> 00:09:48,470 jy stuur 'n versoek van jou browser-- Chrome, 204 00:09:48,470 --> 00:09:50,790 Internet Explorer, whatever-- na 'n afgeleë bediener 205 00:09:50,790 --> 00:09:53,730 dit blyk dat selfs al jy net getik www.example.com, 206 00:09:53,730 --> 00:09:59,590 die leser is die stuur van 'n boodskap dit is 'n bietjie meer arcane, soos hierdie. 207 00:09:59,590 --> 00:10:01,239 >> Maar let 'n bietjie iets vreemd. 208 00:10:01,239 --> 00:10:03,030 Die eerste twee lyne Ek het nog nooit gesien het nie, 209 00:10:03,030 --> 00:10:04,904 maar hulle sien nie veral dreigend. 210 00:10:04,904 --> 00:10:08,030 Maar let op wat ek gesteel vir die derde reël hier. 211 00:10:08,030 --> 00:10:13,390 As 'n slegte man was 'n boodskap te stuur soos dit van sy of haar rekenaar 212 00:10:13,390 --> 00:10:17,270 'n kwesbare Mac of 'n kwesbaar Linux bediener, 213 00:10:17,270 --> 00:10:21,580 Die funny ding is dat Bash, dat eenvoudige klein command prompt, 214 00:10:21,580 --> 00:10:27,450 is alomteenwoordig en is dikwels gebruik om wese voer 215 00:10:27,450 --> 00:10:30,020 die inhoud van 'n boodskap wat dit ontvang. 216 00:10:30,020 --> 00:10:33,490 En deur daardie logika, kan jy mislei 'n web bediener, dus 217 00:10:33,490 --> 00:10:36,370 deur die stuur van iets soos User-agent, wat gewoonlik 218 00:10:36,370 --> 00:10:38,300 veronderstel is om die te sê naam van die leser. 219 00:10:38,300 --> 00:10:42,420 Gebruiker-agent Chrome, User-agent Internet Explorer, user-agent Firefox, hierdie 220 00:10:42,420 --> 00:10:44,590 is net die leser se manier van die identifisering van self. 221 00:10:44,590 --> 00:10:46,605 Maar as 'n slegte ou baie slim sê mm-mm, ek is 222 00:10:46,605 --> 00:10:47,930 gaan jou nie te vertel wat my leser is, 223 00:10:47,930 --> 00:10:50,888 Ek plaas gaan om dit te stuur kriptiese-soek ding met 'n rm-rf 224 00:10:50,888 --> 00:10:55,840 * In dit, kan jy letterlik mislei 'n kwesbaar web bediener op die internet 225 00:10:55,840 --> 00:10:59,055 in die uitvoering van presies wat in daar is vir die verwydering van al die lêers. 226 00:10:59,055 --> 00:11:00,930 En eerlik, dit is nie selfs die ergste van dit. 227 00:11:00,930 --> 00:11:01,763 Jy kan niks doen nie. 228 00:11:01,763 --> 00:11:04,480 Jy kan begin met 'n versprei ontkenning van die diens aanval 229 00:11:04,480 --> 00:11:07,030 As julle gestuur om hierdie boodskap te hele trosse van web-bedieners 230 00:11:07,030 --> 00:11:10,256 en dan het hulle almal toesak, vir Byvoorbeeld, op Harvard.edu bedieners, 231 00:11:10,256 --> 00:11:12,130 en jy kan soort van bang die klink van hulle 232 00:11:12,130 --> 00:11:15,490 deur 'n netwerk verkeer wat anders veroorsaak deur hierdie slegte ou. 233 00:11:15,490 --> 00:11:18,760 >> So, 'n lang storie kort, byna Almal in die kamer wat 'n Mac besit 234 00:11:18,760 --> 00:11:20,240 kwesbaar is vir hierdie. 235 00:11:20,240 --> 00:11:24,100 Die silwer randjie is dat tensy jy bestuur van 'n web bediener op jou laptop, 236 00:11:24,100 --> 00:11:27,780 en tensy jy eintlik ingestel dit iets soos SSH te laat in dit, 237 00:11:27,780 --> 00:11:28,670 jy eintlik veilig. 238 00:11:28,670 --> 00:11:31,710 Dit is kwesbaar, maar daar is geen een probeer om te kry in jou laptop, 239 00:11:31,710 --> 00:11:33,290 sodat jy kan soort van gerus wees. 240 00:11:33,290 --> 00:11:36,210 Maar, Apple sal binnekort wees opdatering 'n oplossing vir hierdie. 241 00:11:36,210 --> 00:11:39,660 Die wêreld van Linux het reeds vrygestel 'n aantal fixes vir Fedora en Ubuntu 242 00:11:39,660 --> 00:11:43,790 en ander weergawes van Linux, en inderdaad as jy loop update 50 in die toestel, 243 00:11:43,790 --> 00:11:45,930 selfs dat daar te wees opgedateer en reggestel word. 244 00:11:45,930 --> 00:11:47,764 Maar dit het ook nie werklik kwesbaar, 245 00:11:47,764 --> 00:11:49,804 want tensy jy tinkered met die toestel 246 00:11:49,804 --> 00:11:52,770 en het jou laptop in die openbaar beskikbaar op die internet, wat nie 247 00:11:52,770 --> 00:11:54,910 by verstek, het jy eintlik is goed, want 248 00:11:54,910 --> 00:11:56,890 van firewall en ander tegnieke. 249 00:11:56,890 --> 00:12:01,000 >> Maar dit is 'n uiterste voorbeeld van 'n fout dat ons vir nog geleef het vir letterlik 20 250 00:12:01,000 --> 00:12:04,050 jaar, en wie weet of iemand al hierdie tyd het bekend oor dit? 251 00:12:04,050 --> 00:12:06,300 En in werklikheid, dit is een van die die fundamentele uitdagings 252 00:12:06,300 --> 00:12:08,690 dat ons later sal sien in die semester oor veiligheid, 253 00:12:08,690 --> 00:12:13,020 is dat net soos in die werklike wêreld, die goeie ouens is aan die nadeel. 254 00:12:13,020 --> 00:12:16,500 Die slegte ouens uit te hou, moet ons maak seker dat elke deur is gesluit, 255 00:12:16,500 --> 00:12:20,340 dat elke venster is veilig, wat elke punt van die inskrywing in 'n huis 256 00:12:20,340 --> 00:12:21,980 veilig is om die slegte ouens uit te hou. 257 00:12:21,980 --> 00:12:26,870 Maar wat doen die slegte ou te doen om werklik jou huis kompromie 258 00:12:26,870 --> 00:12:28,200 en steel van jou? 259 00:12:28,200 --> 00:12:32,574 Hy of sy het net een oopgesluit te vind deur, een gebreekte venster, of iets 260 00:12:32,574 --> 00:12:35,240 langs die lyne, en dit is die dieselfde ding in rekenaar sekuriteit. 261 00:12:35,240 --> 00:12:37,660 Ons kan miljoene skryf lyne van ontwikkeling kode 262 00:12:37,660 --> 00:12:40,570 en spandeer honderde of duisende ure probeer om dit korrek te kry, 263 00:12:40,570 --> 00:12:43,370 maar as jy net een fout in korrektheid, 264 00:12:43,370 --> 00:12:47,030 jy kan die hele stelsel sit en inderdaad in hierdie geval, die hele internet 265 00:12:47,030 --> 00:12:48,660 en die wêreld in gevaar stel. 266 00:12:48,660 --> 00:12:51,950 >> So as jy wil meer te leer oor hierdie, gaan na hierdie URL hier. 267 00:12:51,950 --> 00:12:54,450 Daar is geen behoefte vir aksie vanaand tensy jy 268 00:12:54,450 --> 00:12:57,116 onder diegene wat meer gemaklik dat is om jou eie web 269 00:12:57,116 --> 00:12:59,810 bediener, in welke geval jy moet, in werklikheid, werk jou sagteware. 270 00:12:59,810 --> 00:13:03,244 >> En dit is ook die titel van 'n toespraak, en nou 'n papier, 271 00:13:03,244 --> 00:13:05,410 dat ons op die gekoppelde het Natuurlik se webwerf vir vandag. 272 00:13:05,410 --> 00:13:07,600 Dit was deur 'n mede- vernoem Ken Thompson, wat 273 00:13:07,600 --> 00:13:10,120 is die aanvaarding van 'n baie bekende toekenning in Rekenaarwetenskap, 274 00:13:10,120 --> 00:13:13,495 en hy het hierdie toespraak 'n paar jaar gelede, in wese op dieselfde onderwerp. 275 00:13:13,495 --> 00:13:18,250 276 00:13:18,250 --> 00:13:20,520 Vra mense die vraag, jy moet regtig 277 00:13:20,520 --> 00:13:23,480 trust, uiteindelik, die sagteware wat jy ontvang het? 278 00:13:23,480 --> 00:13:26,100 Byvoorbeeld, het ons almal is die skryf van programme, 279 00:13:26,100 --> 00:13:27,820 en ons het die samestelling hulle met klang. 280 00:13:27,820 --> 00:13:31,830 En om jou kennis, jy het geskryf enige programme vir CS50 waar daar 281 00:13:31,830 --> 00:13:35,310 'n agterdeur van die spesies, daar is 'n manier dat 'n slegte man, as die bestuur van jou program, 282 00:13:35,310 --> 00:13:37,410 kon oor jou rekenaar te neem? 283 00:13:37,410 --> 00:13:38,310 Waarskynlik nie, reg? 284 00:13:38,310 --> 00:13:40,180 Mario en gulsig, en krediet. 285 00:13:40,180 --> 00:13:41,680 Dit is alles mooi klein programme. 286 00:13:41,680 --> 00:13:43,910 Jy wil hê om mooi wees sleg as jy eintlik 287 00:13:43,910 --> 00:13:47,310 jou hele rekenaar kwesbaar gemaak na die skryf van 10 of 20 reëls van die kode, 288 00:13:47,310 --> 00:13:49,690 of ten minste bewus van 'n paar van die sekuriteit implikasies. 289 00:13:49,690 --> 00:13:52,023 En ek sê dat grappig, maar ons gaan vandag om te sien 290 00:13:52,023 --> 00:13:54,600 en dié week is dit eintlik regtig, regtig maklik 291 00:13:54,600 --> 00:13:57,980 sleg wees en maak selfs kort programme kwesbaar. 292 00:13:57,980 --> 00:14:02,880 >> Maar vir nou, ten minste, besef dat die vraag wat hier gevra 293 00:14:02,880 --> 00:14:04,850 is oor die geratel in 'n vertaler. 294 00:14:04,850 --> 00:14:08,360 Hoekom het ons vertrou klang vir die afgelope twee of drie weke? 295 00:14:08,360 --> 00:14:12,650 Wie is om te sê dat elkeen klang geskryf het nie 'n "as" toestand daar 296 00:14:12,650 --> 00:14:17,680 wat in wese 'n paar nulle ingespuit en kinders in elke program dit stel 297 00:14:17,680 --> 00:14:21,180 wat sou laat hom of haar toegang jou rekenaar wanneer jy aan die slaap 298 00:14:21,180 --> 00:14:23,580 en jou laptop deksel is oop en op jou rekenaar? 299 00:14:23,580 --> 00:14:24,080 Reg? 300 00:14:24,080 --> 00:14:28,350 Ons het hierdie soort van eer stelsel reg nou waar ons vertrou dat klang is wettig. 301 00:14:28,350 --> 00:14:30,000 Jy vertrou dat die toestel is wettig. 302 00:14:30,000 --> 00:14:34,430 Jy vertrou dat letterlik elke program op jou Mac of PC is betroubaar. 303 00:14:34,430 --> 00:14:37,510 En as hierdie eenvoudige fout dui, selfs al is dit nie kwaadwillig, 304 00:14:37,510 --> 00:14:40,580 dit is absoluut nie waarskynlik die geval te wees. 305 00:14:40,580 --> 00:14:42,350 >> So moet jy bang soos die hel wees. 306 00:14:42,350 --> 00:14:45,560 Om eerlik te wees, daar is nie 'n eenvoudige oplossing vir hierdie ander 307 00:14:45,560 --> 00:14:48,185 as 'n soort van sosiale bewustheid van die toenemende kompleksiteit 308 00:14:48,185 --> 00:14:50,310 dat ons bou op die top van ons rekenaar stelsels, 309 00:14:50,310 --> 00:14:53,740 en hoe meer kwesbaar ons kan baie goed wees. 310 00:14:53,740 --> 00:14:55,570 >> Nou met wat gesê het, Breakout. 311 00:14:55,570 --> 00:14:59,889 So Breakout is probleem van drie, en Breakout is 'n spel van die verlede 312 00:14:59,889 --> 00:15:02,180 dat jy kan onthou nie, maar vir ons in die probleem van drie, 313 00:15:02,180 --> 00:15:04,450 dit stel ons in staat om te neem dinge weer op 'n kerf 314 00:15:04,450 --> 00:15:08,880 sodat wanneer ons die skryf van programme, selfs in 'n terminaal venster soos hierdie, 315 00:15:08,880 --> 00:15:14,670 ons eintlik kan hardloop, uiteindelik, grafiese programme nie 316 00:15:14,670 --> 00:15:17,800 Anders as wat ons gehad het toegang tot in nuuts af. 317 00:15:17,800 --> 00:15:20,910 So dit is die personeel se implementering van Breakout, 318 00:15:20,910 --> 00:15:23,930 wat net die baksteen-breaking spel, wat jy beweeg jou paddle terug 319 00:15:23,930 --> 00:15:27,590 en weer, en jy het die bal teen dié gekleurde stene op die top. 320 00:15:27,590 --> 00:15:30,020 So dit bring ons soort van terug na waar 321 00:15:30,020 --> 00:15:33,180 ons was in staat om baie vinnig met nuuts af, en nou met C, 322 00:15:33,180 --> 00:15:35,800 implementering van ons eie grafiese gebruikerskoppelvlakke. 323 00:15:35,800 --> 00:15:38,960 >> Maar meer as dit, hierdie probleem stel die eerste 324 00:15:38,960 --> 00:15:41,000 waarin ons gee jy 'n klomp van die kode. 325 00:15:41,000 --> 00:15:43,940 En in die feit, ek bring eksplisiete aandag aan hierdie, want veral 326 00:15:43,940 --> 00:15:47,090 vir diegene wat minder gemaklik, hierdie probleem stel, ten minste op die eerste oogopslag, 327 00:15:47,090 --> 00:15:49,170 gaan om te voel soos Ons het dit geneem op 'n kerf. 328 00:15:49,170 --> 00:15:51,540 Want ons het jou gegee het, vir 'n paar van die soektog 329 00:15:51,540 --> 00:15:54,930 en sorteer die probleme in die pset, 'n klomp van die kode wat ons geskryf het, 330 00:15:54,930 --> 00:15:56,680 en 'n paar van die kommentaar wat sê: "doen," 331 00:15:56,680 --> 00:15:58,221 waar jy in die spasies in te vul. 332 00:15:58,221 --> 00:16:00,020 So nie te skrikwekkend, maar dit is die eerste keer 333 00:16:00,020 --> 00:16:03,370 ons uitdeel jy kode wat jy nodig het om te eerste lees, verstaan, en dan voeg by 334 00:16:03,370 --> 00:16:04,290 en voltooi dit. 335 00:16:04,290 --> 00:16:05,940 >> En dan met Breakout, ons gaan om dieselfde te doen, 336 00:16:05,940 --> 00:16:08,740 gee jou 'n paar dosyn meer lyne kode wat, eerlik, gee jou 337 00:16:08,740 --> 00:16:11,490 'n groot deel van die raamwerk vir die spel, maar stop kort 338 00:16:11,490 --> 00:16:14,304 van die implementering van die stene en die bal en die paddle, 339 00:16:14,304 --> 00:16:15,970 maar ons doen implementeer 'n paar ander funksies. 340 00:16:15,970 --> 00:16:18,280 En selfs dit met die eerste oogopslag, weer, veral as minder gemaklik, 341 00:16:18,280 --> 00:16:21,480 lyk veral ontmoedigend en jy dink daar is so baie nuwe funksies 342 00:16:21,480 --> 00:16:24,070 wat jy nodig het om jou gedagtes te draai rond, en dit is waar. 343 00:16:24,070 --> 00:16:26,281 Maar hou in gedagte, is dit hou nuuts af. 344 00:16:26,281 --> 00:16:28,780 Kans is jy nie al gebruik die stukke van die legkaart in nuuts af. 345 00:16:28,780 --> 00:16:31,120 Kans is jy nie omgee om te draai jou gedagtes rondom almal van hulle 346 00:16:31,120 --> 00:16:33,617 want al het dit was 'n vinnige blik te verstaan, o, 347 00:16:33,617 --> 00:16:35,450 dit is wat ek kan doen met die legkaart stuk. 348 00:16:35,450 --> 00:16:38,260 En inderdaad, in probleem stel 3 spec, sal ons wys jou 349 00:16:38,260 --> 00:16:41,370 op die dokumentasie wat sal bekend te stel aan 'n paar nuwe funksies, 350 00:16:41,370 --> 00:16:43,570 en uiteindelik die ontwikkeling bou jy gebruik. 351 00:16:43,570 --> 00:16:47,610 Voorwaardes, lusse, veranderlikes en funksies 352 00:16:47,610 --> 00:16:50,720 identies te wees wat ons tot dusver gesien het. 353 00:16:50,720 --> 00:16:53,560 >> So ja, wat ons gee jy is 'n paar voorbeelde kode wat 354 00:16:53,560 --> 00:16:56,110 kan jy 'n venster wat lyk nie anders as dit, 355 00:16:56,110 --> 00:16:59,540 en uiteindelik draai dit in iets baie soos hierdie. 356 00:16:59,540 --> 00:17:02,250 So neem voordeel van CS50, bespreek kantoorure en meer, 357 00:17:02,250 --> 00:17:05,290 en troos in die feit dat die bedrag van die kode wat jy hoef te skryf 358 00:17:05,290 --> 00:17:06,760 is eintlik nie veel. 359 00:17:06,760 --> 00:17:10,359 Die eerste uitdaging is om net te acclimatiseren jouself tot 'n kode wat ons het geskryf. 360 00:17:10,359 --> 00:17:11,450 361 00:17:11,450 --> 00:17:15,810 >> Enige vrae oor pset3, Shellshock, of andersins? 362 00:17:15,810 --> 00:17:19,226 >> Publiek: Dit het gelyk soos gaan deur met Breakout 363 00:17:19,226 --> 00:17:22,154 dat die kode is byna 'n voorwerp-georiënteerde styl, 364 00:17:22,154 --> 00:17:24,675 maar ek het gedink C was 'n objek-georiënteerde program. 365 00:17:24,675 --> 00:17:26,050 Spreker 1: 'n uitstekende vraag. 366 00:17:26,050 --> 00:17:28,258 So in soek deur die verspreiding kode, die kode 367 00:17:28,258 --> 00:17:30,180 ons het vir pset3, vir diegene wat vertroud is, is dit 368 00:17:30,180 --> 00:17:32,230 lyk soos dit is 'n bietjie voorwerp-georiënteerde. 369 00:17:32,230 --> 00:17:33,800 Kort antwoord is, dit is. 370 00:17:33,800 --> 00:17:38,130 Dit is 'n aanpassing van hoe jy dalk objekgeoriënteerde kode doen met behulp van 371 00:17:38,130 --> 00:17:41,850 'n taal soos C, maar dit is steeds uiteindelik die proses. 372 00:17:41,850 --> 00:17:44,900 Daar is geen metodes binnekant van die veranderlikes, soos jy sal sien. 373 00:17:44,900 --> 00:17:46,180 Maar dit is wat herinner aan dit. 374 00:17:46,180 --> 00:17:48,780 En ons sal dat die funksie weer te sien wanneer ons by PHP en JavaScript 375 00:17:48,780 --> 00:17:49,946 teen die einde van die semester. 376 00:17:49,946 --> 00:17:53,667 Maar vir nou, dink aan dit as 'n wenk van wat om te kom. 377 00:17:53,667 --> 00:17:54,250 Goeie vraag. 378 00:17:54,250 --> 00:17:56,051 379 00:17:56,051 --> 00:17:56,550 Alle regte. 380 00:17:56,550 --> 00:17:59,730 So fuseren soort was hoe ons links dinge laaste tyd. 381 00:17:59,730 --> 00:18:03,250 En voeg soort was koel in die sin dat dit so baie vinniger, 382 00:18:03,250 --> 00:18:07,100 ten minste gebaseer op die vlugtige toetse ons het verlede week, as, sê, borrel 383 00:18:07,100 --> 00:18:08,710 soort, seleksie soort, voeg soort. 384 00:18:08,710 --> 00:18:11,780 En wat was netjies te net hoe saaklik en skoon 385 00:18:11,780 --> 00:18:12,810 jy kan dit uitspreek. 386 00:18:12,810 --> 00:18:15,840 En wat het ons gesê dit was 'n bo- gebind op die loop van die tyd van merge 387 00:18:15,840 --> 00:18:16,340 sorteer? 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 >> Publiek: n log n? 391 00:18:19,360 --> 00:18:20,819 >> Spreker 1: n log n, reg. n log n. 392 00:18:20,819 --> 00:18:23,776 En ons sal terug te kom na wat dit werklik beteken of waar dit vandaan kom, 393 00:18:23,776 --> 00:18:25,570 maar dit was beter as wat hardloop tyd 394 00:18:25,570 --> 00:18:28,440 wat ons gesien het vir borrel seleksie en voeg soort? 395 00:18:28,440 --> 00:18:30,610 So n vierkant. N vierkant is groter as dit, 396 00:18:30,610 --> 00:18:34,650 en selfs al is dit nie voor die hand liggend, weet dat log N kleiner as n, 397 00:18:34,650 --> 00:18:36,910 So as jy n keer iets kleiner as n, 398 00:18:36,910 --> 00:18:38,680 dit gaan minder as N vierkantig wees. 399 00:18:38,680 --> 00:18:40,130 Dit is 'n bietjie van intuïsie is daar. 400 00:18:40,130 --> 00:18:42,190 Maar ons 'n prys vir hierdie betaal. 401 00:18:42,190 --> 00:18:47,000 Dit was vinniger, maar 'n tema wat begin verlede week na vore kom, was hierdie nadeel. 402 00:18:47,000 --> 00:18:49,804 Ek het 'n beter prestasie tyd wys, maar wat 403 00:18:49,804 --> 00:18:52,470 het ek het om te spandeer op die ander hand, om dit te bereik? 404 00:18:52,470 --> 00:18:53,591 >> Publiek: Memory. 405 00:18:53,591 --> 00:18:54,465 Spreker 1: Sê weer? 406 00:18:54,465 --> 00:18:55,173 Publiek: Memory. 407 00:18:55,173 --> 00:18:57,040 Spreker 1: Memory, of ruimte meer in die algemeen. 408 00:18:57,040 --> 00:18:59,040 En dit was nie super duidelik met ons mense, 409 00:18:59,040 --> 00:19:02,240 maar onthou dat ons vrywilligers is vorentoe stepping en versterking 410 00:19:02,240 --> 00:19:04,780 terug asof daar is 'n verskeidenheid hier, en asof daar 411 00:19:04,780 --> 00:19:07,130 'n tweede reeks hier dat hulle kon gebruik nie, want ons 412 00:19:07,130 --> 00:19:09,080 nodige êrens dié mense om saam te smelt. 413 00:19:09,080 --> 00:19:11,480 Ons kan nie net ruil hulle in plek. 414 00:19:11,480 --> 00:19:13,800 So saamsmelt soort hefboom is meer ruimte, wat 415 00:19:13,800 --> 00:19:15,620 ons het nie nodig om met die ander algoritmes, 416 00:19:15,620 --> 00:19:17,410 maar die voordeel is dat dit baie vinniger. 417 00:19:17,410 --> 00:19:20,780 En eerlik, in die werklike wêreld ruimte hierdie days-- RAM, hardeskyf space-- 418 00:19:20,780 --> 00:19:25,030 relatief goedkoop is, en so is dit nie noodwendig 'n slegte ding nie. 419 00:19:25,030 --> 00:19:28,320 >> So laat ons neem 'n vinnige blik, 'n bietjie meer metodies, op wat ons gedoen het 420 00:19:28,320 --> 00:19:30,220 en waarom ons gesê dit is n log n. 421 00:19:30,220 --> 00:19:33,260 So hier is die agt nommers en die agt vrywilligers het ons die laaste keer. 422 00:19:33,260 --> 00:19:35,718 En die eerste ding wat Merge Kort gesê ons moet doen, is wat? 423 00:19:35,718 --> 00:19:37,010 424 00:19:37,010 --> 00:19:38,010 Publiek: Verdeel in twee. 425 00:19:38,010 --> 00:19:38,663 Spreker 1: Sê weer? 426 00:19:38,663 --> 00:19:39,650 Publiek: Verdeel in twee. 427 00:19:39,650 --> 00:19:40,610 Spreker 1: Verdeel in twee, reg. 428 00:19:40,610 --> 00:19:42,818 Dit is baie herinner aan die telefoon boek, deel 429 00:19:42,818 --> 00:19:44,220 en oorwin meer algemeen. 430 00:19:44,220 --> 00:19:45,640 So het ons gekyk na die linker helfte. 431 00:19:45,640 --> 00:19:48,700 En dan wanneer ons sê, soort die linker helfte van die elemente, 432 00:19:48,700 --> 00:19:49,690 wat het ons die volgende sê? 433 00:19:49,690 --> 00:19:51,210 434 00:19:51,210 --> 00:19:54,860 Sorteer die linker helfte van die linker helfte, wat ons toegelaat word om, 435 00:19:54,860 --> 00:19:57,570 na die verdeling in twee, fokus op die vier en twee. 436 00:19:57,570 --> 00:20:01,280 >> Hoe sorteer jy 'n lys nou, in geel, grootte twee, met behulp van Merge sorteer? 437 00:20:01,280 --> 00:20:02,330 438 00:20:02,330 --> 00:20:04,580 Wel verdeel dit in die helfte, en sorteer die linker helfte. 439 00:20:04,580 --> 00:20:07,100 En dit was waar dinge het 'n bietjie dom kortliks. 440 00:20:07,100 --> 00:20:10,720 Hoe sorteer jy nie 'n lys wat van grootte een, soos hierdie nommer vier hier? 441 00:20:10,720 --> 00:20:12,330 442 00:20:12,330 --> 00:20:13,210 Dit is gesorteer. 443 00:20:13,210 --> 00:20:14,200 Jy is klaar. 444 00:20:14,200 --> 00:20:17,300 >> Maar hoe sorteer jy 'n lys van grootte een wanneer dit is die nommer twee? 445 00:20:17,300 --> 00:20:21,640 Wel, dieselfde ding, maar nou wat was die derde en die belangrike stap in Merge sorteer? 446 00:20:21,640 --> 00:20:24,020 Jy het die linker om saam te smelt helfte en die regter helfte. 447 00:20:24,020 --> 00:20:26,580 En wanneer ons dit doen, het ons gekyk op vier, het ons gekyk na twee. 448 00:20:26,580 --> 00:20:28,750 Ons het besluit om al die regte, natuurlik twee kom eerste, 449 00:20:28,750 --> 00:20:31,840 So het ons twee in sy plek, gevolg deur vier. 450 00:20:31,840 --> 00:20:35,010 En nou moet jy soort van rewind, en dit is 'n soort van kenmerkende 451 00:20:35,010 --> 00:20:37,570 van 'n algoritme soos Merge Soort, rewind in die geheue. 452 00:20:37,570 --> 00:20:40,240 Wat was die volgende lyn van die storie? 453 00:20:40,240 --> 00:20:41,780 Wat moet ek word met die fokus op die volgende? 454 00:20:41,780 --> 00:20:43,110 455 00:20:43,110 --> 00:20:47,350 Die regter helfte van die linker helfte, wat ses en agt. 456 00:20:47,350 --> 00:20:50,320 >> So laat my net stap vir stap deur hierdie sonder belaboring die punt te veel. 457 00:20:50,320 --> 00:20:53,330 Ses en agt, dan ses is gesorteer, agt gesorteer is. 458 00:20:53,330 --> 00:20:57,190 Voeg hulle saam soos daardie, en nou is die volgende groot stap 459 00:20:57,190 --> 00:21:00,990 is, natuurlik, sorteer die regter helfte van die heel eerste stap van hierdie algoritme. 460 00:21:00,990 --> 00:21:02,870 So ons fokus op een, drie, sewe, vyf. 461 00:21:02,870 --> 00:21:04,540 Ons fokus dan op die linker helfte. 462 00:21:04,540 --> 00:21:09,400 Die linker helfte van dat die regter helfte van dat en dan saam te smelt in een en drie. 463 00:21:09,400 --> 00:21:13,100 Toe het die reg om die helfte, dan is die helfte verlaat daarvan, dan is die regter helfte van dit. 464 00:21:13,100 --> 00:21:15,985 Merge dit in, en wat nou stap bly? 465 00:21:15,985 --> 00:21:18,040 466 00:21:18,040 --> 00:21:22,460 Voeg die groot linker helfte en die groot regter helfte, so een gaan af daar, 467 00:21:22,460 --> 00:21:27,330 dan twee, dan drie, dan vier, dan vyf, dan is ses, dan sewe, dan agt. 468 00:21:27,330 --> 00:21:31,990 >> So nou waarom is dit uiteindelik die onthulling, veral as N en logaritmes meer 469 00:21:31,990 --> 00:21:35,487 algemeen eerder ontsnap jy, ten minste in die onlangse verlede? 470 00:21:35,487 --> 00:21:37,070 Wel, let op die hoogte van hierdie ding. 471 00:21:37,070 --> 00:21:41,230 Ons het agt elemente, en ons verdeel dit deur twee, twee, met twee. 472 00:21:41,230 --> 00:21:44,590 So teken basis twee van agt gee ons drie. 473 00:21:44,590 --> 00:21:45,640 474 00:21:45,640 --> 00:21:48,540 En glo my op dat indien 'n bietjie vaag op daardie. 475 00:21:48,540 --> 00:21:54,710 Maar teken basis twee van agt is drie, so ons het drie lae van samesmelting gedoen. 476 00:21:54,710 --> 00:21:57,170 En wanneer ons saamgesmelt elemente, hoeveel elemente 477 00:21:57,170 --> 00:21:58,950 het ons na elk van die rye? 478 00:21:58,950 --> 00:22:00,212 479 00:22:00,212 --> 00:22:01,437 'N Totaal van N, reg? 480 00:22:01,437 --> 00:22:04,020 Omdat die boonste ry om saam te smelt, selfs al het ons dit sporadies, 481 00:22:04,020 --> 00:22:05,990 ons uiteindelik weer aangeraak elke nommer. 482 00:22:05,990 --> 00:22:09,054 En in die tweede ry, te saam te smelt die lyste van grootte twee, 483 00:22:09,054 --> 00:22:10,470 Ons het elke element te keer raak. 484 00:22:10,470 --> 00:22:12,690 En dan is hier werklik duidelik in die laaste ry, 485 00:22:12,690 --> 00:22:15,430 Ons het elkeen van daardie te raak elemente keer, maar slegs een keer, 486 00:22:15,430 --> 00:22:18,400 so hierin lê, dan is ons n log n. 487 00:22:18,400 --> 00:22:21,780 >> En nou net dinge 'n bietjie te maak meer formele vir net 'n oomblik, as jy 488 00:22:21,780 --> 00:22:24,260 was nou ontleed hierdie 'n soort van 'n hoër vlak 489 00:22:24,260 --> 00:22:28,340 en probeer om te besluit, asook hoe kan jy gaan oor die uitdrukking 490 00:22:28,340 --> 00:22:31,780 die loop van die tyd van hierdie algoritme net deur te kyk na dit en nie 491 00:22:31,780 --> 00:22:33,590 deur die gebruik van 'n kunsmatige voorbeeld? 492 00:22:33,590 --> 00:22:36,590 Wel, hoeveel tyd sal jy sê 'n stap soos hierdie in geel sou neem, 493 00:22:36,590 --> 00:22:37,173 As n <2 terugkeer? 494 00:22:37,173 --> 00:22:38,840 495 00:22:38,840 --> 00:22:39,830 Dis 'n groot O van wat? 496 00:22:39,830 --> 00:22:41,450 497 00:22:41,450 --> 00:22:44,540 So ek sien een so 'n stap, miskien twee stappe, want dit is as 498 00:22:44,540 --> 00:22:47,110 en dan terug te keer, maar dit is konstante tyd, reg? 499 00:22:47,110 --> 00:22:49,960 Daarom het ons gesê O (1), en dit is hoe sal ek spreek hierdie. 500 00:22:49,960 --> 00:22:51,480 T, net hardloop tyd. 501 00:22:51,480 --> 00:22:54,150 N is die grootte van die insette, sodat T (n), net 'n fancy manier 502 00:22:54,150 --> 00:22:56,330 sê die bedryf tyd gegee insette van grootte n 503 00:22:56,330 --> 00:23:00,220 gaan wees op die einde van konstante tyd, in O (1). 504 00:23:00,220 --> 00:23:01,970 >> Maar anders, wat oor hierdie? 505 00:23:01,970 --> 00:23:05,660 Hoe sal jy druk die loop van die tyd van hierdie geel streep? 506 00:23:05,660 --> 00:23:06,250 T van wat? 507 00:23:06,250 --> 00:23:09,440 508 00:23:09,440 --> 00:23:12,665 Jy kan soort oneerlik hier en beantwoord my vraag siklies. 509 00:23:12,665 --> 00:23:14,770 510 00:23:14,770 --> 00:23:17,900 Dus, as die loop van die tyd in algemene ons net sê, is T (n). 511 00:23:17,900 --> 00:23:18,950 512 00:23:18,950 --> 00:23:22,490 En nou is jy soort vaar hier en sê, goed, net sorteer die linker helfte, 513 00:23:22,490 --> 00:23:23,920 en dan sorteer die regter helfte. 514 00:23:23,920 --> 00:23:27,520 Hoe kan ons simbolies verteenwoordig die loop van die tyd van hierdie geel streep? 515 00:23:27,520 --> 00:23:28,020 T van wat? 516 00:23:28,020 --> 00:23:29,360 Wat is die grootte van die insette? 517 00:23:29,360 --> 00:23:30,510 518 00:23:30,510 --> 00:23:31,057 N meer as twee. 519 00:23:31,057 --> 00:23:32,140 Hoekom het ek nie net sê dat? 520 00:23:32,140 --> 00:23:36,449 En dan is dit 'n ander T (n / 2) en dan weer, as ek voeg twee gesorteer helftes, 521 00:23:36,449 --> 00:23:38,615 hoeveel elemente gaan ek te hê om aan te raak totaal? 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 So ek kan uitdruk nie, net om te soort van fancy, 525 00:23:42,790 --> 00:23:44,430 as die loop van die tyd in die algemeen. 526 00:23:44,430 --> 00:23:51,140 T (n) is net die loop van die tyd van die T (n / 2), plus T (n / 2), links en regs helfte helfte, 527 00:23:51,140 --> 00:23:55,360 plus O (n), wat waarskynlik n stappe, maar miskien, as ek met twee vingers, 528 00:23:55,360 --> 00:23:57,960 dit is twee keer soveel stappe, maar dit is lineêr. 529 00:23:57,960 --> 00:24:00,440 Dit is 'n paar aantal stappe dit is 'n faktor van N, 530 00:24:00,440 --> 00:24:02,270 sodat ons dit kan uitdruk soos hierdie. 531 00:24:02,270 --> 00:24:05,550 En dit is hier waar ons nou sal voorspel dat die agterkant van ons hoërskool wiskunde handboek 532 00:24:05,550 --> 00:24:10,290 ons is dat herhaling uiteindelik eindig gelykstaande hierdie, n keer log n, 533 00:24:10,290 --> 00:24:12,530 as jy eintlik doen uit die wiskunde meer formeel. 534 00:24:12,530 --> 00:24:13,950 >> So dit is net twee perspektiewe. 535 00:24:13,950 --> 00:24:17,500 Een numeries met 'n hard-gekodeerde verteenwoordigende voorbeeld 536 00:24:17,500 --> 00:24:21,140 gebruik agt nommers, en 'n meer algemene blik op hoe ons daar gekom het. 537 00:24:21,140 --> 00:24:25,670 Maar wat is regtig interessant hier is, weer, hierdie idee van fietsry. 538 00:24:25,670 --> 00:24:26,900 Ek gebruik nie vir loops. 539 00:24:26,900 --> 00:24:29,860 Ek is soort van die definisie iets in terme van homself, 540 00:24:29,860 --> 00:24:31,950 nie net met hierdie wiskundige funksie, 541 00:24:31,950 --> 00:24:34,860 maar ook in terme van hierdie pseudo-kode. 542 00:24:34,860 --> 00:24:38,260 Hierdie pseudo-kode is rekursiewe in dat twee van sy lyne 543 00:24:38,260 --> 00:24:42,310 is in wese vertel dit om te gaan gebruik self 'n kleiner te los 544 00:24:42,310 --> 00:24:45,400 probleem van kleiner, en dan weer en weer 545 00:24:45,400 --> 00:24:48,820 en weer totdat ons Whittle dit na hierdie sogenaamde basis geval. 546 00:24:48,820 --> 00:24:52,810 >> So laat ons eintlik trek 'n meer dwingende neem-weg van dit soos volg. 547 00:24:52,810 --> 00:24:58,420 Laat my gaan in gedit en neem 'n kyk na 'n paar van vandag se bron-kode, 548 00:24:58,420 --> 00:24:59,930 in die besonder die voorbeeld hier. 549 00:24:59,930 --> 00:25:03,709 Sigma 0, wat blykbaar voeg die getalle van een tot n. 550 00:25:03,709 --> 00:25:05,750 So laat ons sien wat vertroud en onbekende hier. 551 00:25:05,750 --> 00:25:08,690 Eerste het ons 'n paar sluit, so niks nuuts nie daar nie. 552 00:25:08,690 --> 00:25:09,190 Prototipe. 553 00:25:09,190 --> 00:25:11,370 Ek is 'n bietjie vaag oor hierdie na n paar dae, 554 00:25:11,370 --> 00:25:13,790 maar wat het ons sê 'n prototipe van 'n funksie is? 555 00:25:13,790 --> 00:25:15,099 556 00:25:15,099 --> 00:25:16,015 Publiek: [onhoorbaar]. 557 00:25:16,015 --> 00:25:16,905 Spreker 1: Wat is dit? 558 00:25:16,905 --> 00:25:17,800 Publiek: Ons maak dit bekend. 559 00:25:17,800 --> 00:25:18,883 Spreker 1: Ons maak dit bekend. 560 00:25:18,883 --> 00:25:22,290 So jy leer klang, hey, eintlik nie die implementering van hierdie nie, 561 00:25:22,290 --> 00:25:25,740 maar iewers in hierdie lêer, vermoedelik, gaan word om 'n funksie genoem wat tot? 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 En dit is net 'n belofte dat dit gaan lyk soos hierdie. 565 00:25:30,540 --> 00:25:33,720 Dit gaan 'n heelgetal te neem as input-- en ek kan meer eksplisiete wees 566 00:25:33,720 --> 00:25:36,570 en sê int N --and dit gaan 'n int om terug te keer, 567 00:25:36,570 --> 00:25:39,900 maar kommapunt middel, mm, ek sal kry om om die implementering van hierdie 'n bietjie later. 568 00:25:39,900 --> 00:25:40,989 Weereens, klang is stom. 569 00:25:40,989 --> 00:25:43,280 Dit gaan net om te weet wat vertel dit bo tot onder, 570 00:25:43,280 --> 00:25:45,765 sodat ons nodig het om ten minste gee dit 'n aanduiding van wat om te kom. 571 00:25:45,765 --> 00:25:47,330 >> Kom ons kyk hier by die hoof nou. 572 00:25:47,330 --> 00:25:50,040 Kom ons blaai hier en sien wat hoof doen. 573 00:25:50,040 --> 00:25:53,780 Dit is nie so lank van 'n funksie, en in die feit dat die konstruksie hier is vertroud. 574 00:25:53,780 --> 00:25:57,590 Ek verklaar 'n veranderlike n, en dan Ek weer en weer teister die gebruiker 575 00:25:57,590 --> 00:26:01,880 vir 'n positiewe heelgetal gebruik getInt, en enigste uitgang uit hierdie lus 576 00:26:01,880 --> 00:26:03,280 Sodra die gebruiker voldoen het. 577 00:26:03,280 --> 00:26:05,670 Doen terwyl ons gebruik het om teister die gebruiker op dié manier. 578 00:26:05,670 --> 00:26:06,670 Nou is dit interessant. 579 00:26:06,670 --> 00:26:08,510 Ek verklaar 'n int genoem "antwoord." 580 00:26:08,510 --> 00:26:11,420 Ek ken dit die terugkeer waarde van 'n funksie genoem "Sigma." 581 00:26:11,420 --> 00:26:15,200 Ek weet nie wat dit beteken nie, maar Ek onthou dit 'n oomblik gelede verklaar. 582 00:26:15,200 --> 00:26:18,310 En dan is ek verby in die waarde wat die gebruiker getik in, n, 583 00:26:18,310 --> 00:26:20,420 en dan rapporteer ek die antwoord. 584 00:26:20,420 --> 00:26:22,260 Wel, laat ons blaai terug vir net 'n oomblik. 585 00:26:22,260 --> 00:26:28,620 Kom ons gaan voort in hierdie gids, maak Sigma 0, en eintlik hierdie program hardloop 586 00:26:28,620 --> 00:26:30,490 en kyk wat gebeur. 587 00:26:30,490 --> 00:26:35,930 So as ek gaan voort en run hierdie program, ./sigma-0, 588 00:26:35,930 --> 00:26:40,139 en ek tik in 'n positiewe heelgetal soos twee, Sigma, 589 00:26:40,139 --> 00:26:43,180 as die Griekse simbool impliseer, is net toe te voeg tot al die getalle van 590 00:26:43,180 --> 00:26:44,320 nul tot twee. 591 00:26:44,320 --> 00:26:46,560 So 0 plus 1 plus 2. 592 00:26:46,560 --> 00:26:48,830 So dit moet hopelik gee my 3. 593 00:26:48,830 --> 00:26:49,750 Dit is al wat dit doen. 594 00:26:49,750 --> 00:26:52,690 En so, as ek hardloop dit weer en ek gee dit die nommer drie, 595 00:26:52,690 --> 00:26:56,721 dit is 3 plus 2, so dit is 5, plus 1 moet gee my 6. 596 00:26:56,721 --> 00:26:59,470 En dan as ek kry regtig mal en tik in groter getalle, 597 00:26:59,470 --> 00:27:01,290 dit moet my gee groter en groter somme. 598 00:27:01,290 --> 00:27:02,250 So dis al. 599 00:27:02,250 --> 00:27:04,010 >> So wat beteken sigma lyk? 600 00:27:04,010 --> 00:27:05,430 Wel, dit is redelik eenvoudig. 601 00:27:05,430 --> 00:27:08,940 Dit is hoe ons kan geïmplementeer dit vir die afgelope paar weke. 602 00:27:08,940 --> 00:27:11,120 "Int" gaan die terugkeer tipe te wees. 603 00:27:11,120 --> 00:27:14,330 Sigma is die naam, en dit neem 'n veranderlike m in plaas van N. 604 00:27:14,330 --> 00:27:15,940 Ek sal dit verander nie tot bo. 605 00:27:15,940 --> 00:27:17,340 Dan is dit net 'n gesonde verstand tjek. 606 00:27:17,340 --> 00:27:18,430 607 00:27:18,430 --> 00:27:19,950 Ons sal sien waarom in 'n oomblik. 608 00:27:19,950 --> 00:27:24,220 Nou verklaar ek 'n ander veranderlike, som, inisialiseer aan nul. 609 00:27:24,220 --> 00:27:28,140 Toe ek hierdie For lus iterating, blykbaar vir duidelikheid, 610 00:27:28,140 --> 00:27:33,810 van i = 1 op tot 'n = m, wat wat die gebruiker getik in, en dan het ek 611 00:27:33,810 --> 00:27:35,690 inkrementeer die som soos hierdie. 612 00:27:35,690 --> 00:27:37,360 En dan terug die bedrag. 613 00:27:37,360 --> 00:27:38,440 >> So 'n paar vrae. 614 00:27:38,440 --> 00:27:42,370 Een, ek eis in my opmerking dat dit vermy die risiko van 'n oneindige lus. 615 00:27:42,370 --> 00:27:45,620 Hoekom sou slaag in 'n negatiewe getal veroorsaak, potensieel, 'n oneindige lus? 616 00:27:45,620 --> 00:27:49,396 617 00:27:49,396 --> 00:27:51,290 >> Publiek: Jy sal nooit bereik m. 618 00:27:51,290 --> 00:27:52,880 >> Spreker 1: Nooit bereik m. 619 00:27:52,880 --> 00:27:55,880 Maar m geslaag in, so laat oorweeg om 'n eenvoudige voorbeeld. 620 00:27:55,880 --> 00:27:58,510 As m geslaag in die gebruiker as negatiewe een. 621 00:27:58,510 --> 00:28:00,059 Ongeag van die belangrikste. 622 00:28:00,059 --> 00:28:01,850 Main beskerm ons teen Dit ook, so ek is net 623 00:28:01,850 --> 00:28:04,680 synde regtig anale met Sigma ook seker maak 624 00:28:04,680 --> 00:28:06,540 dat die insette nie negatief kan wees. 625 00:28:06,540 --> 00:28:10,130 So as m negatief is, iets soos negatiewe een. 626 00:28:10,130 --> 00:28:11,930 Wat gaan gebeur? 627 00:28:11,930 --> 00:28:14,390 Wel, ek gaan kry geïnisialiseer een, 628 00:28:14,390 --> 00:28:19,060 en dan is ek gaan wees minder as of gelyk aan m? 629 00:28:19,060 --> 00:28:24,130 630 00:28:24,130 --> 00:28:24,765 >> Staan. 631 00:28:24,765 --> 00:28:26,930 632 00:28:26,930 --> 00:28:29,370 Dit was-- laat nie, laat se nix hierdie storie. 633 00:28:29,370 --> 00:28:32,780 Ek het nie daardie vraag vra, want die risiko dat ek verwys na 634 00:28:32,780 --> 00:28:38,360 is nie gaan gebeur nie, want ek is altyd groter wees than-- OK, 635 00:28:38,360 --> 00:28:39,871 Ek trek die vraag. 636 00:28:39,871 --> 00:28:40,370 OK. 637 00:28:40,370 --> 00:28:42,030 Kom ons fokus net op hierdie deel hier. 638 00:28:42,030 --> 00:28:44,210 639 00:28:44,210 --> 00:28:48,830 Hoekom het ek verklaar sommige buite die lus? 640 00:28:48,830 --> 00:28:52,010 Kennis op die lyn 49 Ek het verklaar ek binnekant van die lus, 641 00:28:52,010 --> 00:28:54,950 maar aanlyn 48 Ek het verklaar 'n buite. 642 00:28:54,950 --> 00:28:55,695 Ja. 643 00:28:55,695 --> 00:28:56,611 Publiek: [onhoorbaar]. 644 00:28:56,611 --> 00:28:58,734 645 00:28:58,734 --> 00:28:59,400 Spreker 1: Natuurlik. 646 00:28:59,400 --> 00:29:03,360 So in die eerste plek het ek beslis nie doen nie wil verklaar en inisialiseer som 647 00:29:03,360 --> 00:29:06,130 nul binnekant van die lus op elke iterasie, 648 00:29:06,130 --> 00:29:09,370 want dit sou duidelik die nederlaag van die doel van 'n opsomming van die getalle. 649 00:29:09,370 --> 00:29:11,770 Ek sou hou die verandering die waarde terug na nul. 650 00:29:11,770 --> 00:29:17,992 En ook, wat is 'n ander meer arcane rede hiervoor is dat dieselfde ontwerp besluit? 651 00:29:17,992 --> 00:29:18,954 Ja. 652 00:29:18,954 --> 00:29:20,279 >> Publiek: [onhoorbaar]. 653 00:29:20,279 --> 00:29:21,070 Spreker 1: Presies. 654 00:29:21,070 --> 00:29:24,060 Ek wil dit buite toegang van die lus te op watter lyn? 655 00:29:24,060 --> 00:29:25,390 656 00:29:25,390 --> 00:29:26,400 Op 53. 657 00:29:26,400 --> 00:29:29,910 En op grond van ons reël van 'n paar lesings gelede 658 00:29:29,910 --> 00:29:33,680 veranderlikes scoped, regtig, om die krulhakies wat hulle omring. 659 00:29:33,680 --> 00:29:38,190 So as ek binne verklaar nie som van hierdie buitenste krulhakies, 660 00:29:38,190 --> 00:29:40,250 Ek kan dit nie gebruik nie in lyn 53. 661 00:29:40,250 --> 00:29:43,160 Sit 'n ander manier, as ek verklaar som hier, of selfs binne die 662 00:29:43,160 --> 00:29:45,410 Vir lus, kan ek nie toegang tot dit in 53. 663 00:29:45,410 --> 00:29:47,150 Die veranderlike sal effektief weg wees. 664 00:29:47,150 --> 00:29:48,579 So 'n paar van die redes. 665 00:29:48,579 --> 00:29:50,370 Maar laat ons nou terug te gaan en kyk wat gebeur. 666 00:29:50,370 --> 00:29:51,730 So Sigma kry genoem. 667 00:29:51,730 --> 00:29:55,640 Dit dra by tot 1 plus 2 of 1 plus 2 plus 3, en dan gee die waarde, 668 00:29:55,640 --> 00:29:59,660 stoor dit in antwoord, en printf hier is die rede waarom ek sien op die skerm. 669 00:29:59,660 --> 00:30:03,079 So dit is wat ons 'n iteratiewe bel benadering, waar iterasie net 670 00:30:03,079 --> 00:30:03,870 beteken deur 'n lus. 671 00:30:03,870 --> 00:30:06,900 'N lus vir 'n while lus, 'n doen terwyl lus, net om iets te doen weer 672 00:30:06,900 --> 00:30:08,380 en weer en weer. 673 00:30:08,380 --> 00:30:13,505 >> Maar Sigma is 'n soort van 'n netjiese funksie in dat ek kon dit anders te implementeer. 674 00:30:13,505 --> 00:30:14,620 675 00:30:14,620 --> 00:30:19,120 Wat van hierdie, wat net om te wees gaaf, 676 00:30:19,120 --> 00:30:21,880 laat my regtig ontslae te raak van 'n baie afleiding 677 00:30:21,880 --> 00:30:24,380 omdat die funksie is regtig eenvoudig. 678 00:30:24,380 --> 00:30:27,780 Kom ons Whittle dit af net aan sy vier kern lyne 679 00:30:27,780 --> 00:30:30,410 en ontslae te raak van al die kommentaar en krulhakies. 680 00:30:30,410 --> 00:30:34,334 Dit is 'n soort van 'n mind-blowing alternatiewe implementering. 681 00:30:34,334 --> 00:30:37,250 Alle reg, miskien nie verstommend, maar dit is soort van sexier, alles reg, 682 00:30:37,250 --> 00:30:39,920 om te kyk na dit so baie meer saaklik. 683 00:30:39,920 --> 00:30:43,120 Met net vier reëls van die kode, Ek moet eers die gesonde verstand tjek. 684 00:30:43,120 --> 00:30:45,732 As m minder as of gelyk aan nul, Sigma maak nie sin nie. 685 00:30:45,732 --> 00:30:48,190 Dit is net veronderstel om te wees in hierdie geval vir positiewe getalle, 686 00:30:48,190 --> 00:30:50,340 so ek gaan net te terugkeer nul arbitrêr 687 00:30:50,340 --> 00:30:53,210 sodat ons ten minste sommige sogenaamde basis geval. 688 00:30:53,210 --> 00:30:54,430 >> Maar hier is die skoonheid. 689 00:30:54,430 --> 00:30:59,930 Die geheel van hierdie idee, en voeg by die getalle van 1 tot N, of m in hierdie geval, 690 00:30:59,930 --> 00:31:02,630 kan gedoen word deur die soort van verby die bok. 691 00:31:02,630 --> 00:31:04,947 Wel, wat is die som van 1 tot m? 692 00:31:04,947 --> 00:31:05,780 Wel, jy weet wat? 693 00:31:05,780 --> 00:31:11,949 Dit is dieselfde as die som van m plus die bedrag van 1 tot m minus 1. 694 00:31:11,949 --> 00:31:12,740 Wel, jy weet wat? 695 00:31:12,740 --> 00:31:13,940 Wat is sigma van m minus 1? 696 00:31:13,940 --> 00:31:17,860 Wel, as jy soort volg hierdie logies, dit is dieselfde as m minus 1 697 00:31:17,860 --> 00:31:21,415 plus Sigma van m minus 2. 698 00:31:21,415 --> 00:31:22,480 699 00:31:22,480 --> 00:31:26,012 So kan jy soort van just-- dit is soos, as jy net 700 00:31:26,012 --> 00:31:28,220 probeer om 'n vriend te irriteer en hulle vra jou 'n vraag, 701 00:31:28,220 --> 00:31:31,344 jy soort van reageer met 'n vraag, jy kan soort van hou verby die bok. 702 00:31:31,344 --> 00:31:34,560 Maar wat is die sleutel, is dat as jy aanhou maak die vraag kleiner 703 00:31:34,560 --> 00:31:36,910 en kleiner, jy nie vra wat is Sigma 704 00:31:36,910 --> 00:31:39,116 van n, wat is sigma van n, wat is sigma van n? 705 00:31:39,116 --> 00:31:40,990 Jy vra wat is Sigma van N, wat is Sigma 706 00:31:40,990 --> 00:31:42,839 van N minus 1, wat is sigma van N minus 2? 707 00:31:42,839 --> 00:31:44,880 Uiteindelik jou vraag gaan word wat? 708 00:31:44,880 --> 00:31:50,250 Wat is sigma van een of nul, 'n paar baie klein waarde, 709 00:31:50,250 --> 00:31:52,220 en so gou as wat jy kry dat jou vriend, 710 00:31:52,220 --> 00:31:54,350 jy is nie van plan om te vra dieselfde vraag weer, 711 00:31:54,350 --> 00:31:55,975 jy net gaan om te sê, o, dit is nul. 712 00:31:55,975 --> 00:31:58,490 Ons klaar speel hierdie soort dom sikliese spel. 713 00:31:58,490 --> 00:32:02,950 >> So rekursie is die wet in ontwikkeling van 'n funksie roeping self. 714 00:32:02,950 --> 00:32:06,630 Hierdie program toe opgestel en loop, is gaan presies dieselfde manier op te tree, 715 00:32:06,630 --> 00:32:09,620 maar wat is die sleutel, is die feit dat binne van 'n funksie genoem Sigma, 716 00:32:09,620 --> 00:32:13,150 Daar is 'n reël van die kode waarin Ons noem onsself, 717 00:32:13,150 --> 00:32:14,980 wat normaalweg sou sleg wees. 718 00:32:14,980 --> 00:32:21,160 Byvoorbeeld, wat as ek die eerste saamgestel, so maak sigma-- 719 00:32:21,160 --> 00:32:22,710 maak Sigma 1 ./sigma-1. 720 00:32:22,710 --> 00:32:25,050 721 00:32:25,050 --> 00:32:27,690 Positiewe heelgetal is, asseblief, 50 1275. 722 00:32:27,690 --> 00:32:30,810 So, wat die funksie blyk te wees, wat gebaseer is op 'n toets, korrek is. 723 00:32:30,810 --> 00:32:34,917 Maar wat as ek 'n bietjie gevaarlik en verwyder die sogenaamde basis geval, 724 00:32:34,917 --> 00:32:37,750 en net sê, en ek is net die maak dit meer ingewikkeld as wat dit is. 725 00:32:37,750 --> 00:32:42,450 Laat ons net bereken die sigma deur m en dan voeg 726 00:32:42,450 --> 00:32:44,564 in sigma van m minus een? 727 00:32:44,564 --> 00:32:45,980 Wel, wat gaan hier gebeur? 728 00:32:45,980 --> 00:32:47,140 Kom ons zoom uit. 729 00:32:47,140 --> 00:32:52,920 Kom ons heropstel die program, behalwe dit, heropstel die program, 730 00:32:52,920 --> 00:33:00,450 en dan gereed ./sigma-1 inzoomen, Tik positiewe heelgetal asseblief, 50. 731 00:33:00,450 --> 00:33:02,180 732 00:33:02,180 --> 00:33:04,430 Hoeveel van julle is bereid om te erken maar om te sien dat? 733 00:33:04,430 --> 00:33:04,950 >> OK. 734 00:33:04,950 --> 00:33:06,690 So dit kan gebeur vir 'n aantal redes, 735 00:33:06,690 --> 00:33:09,148 en eerlik hierdie week ons oor te gee jy meer van hulle. 736 00:33:09,148 --> 00:33:11,780 Maar in hierdie geval, probeer agteruit te redeneer 737 00:33:11,780 --> 00:33:14,430 wat kan hier gebeur het nie? 738 00:33:14,430 --> 00:33:17,400 Segmentering skuld, ons het verlede tyd, verwys na 'n segment van die geheue. 739 00:33:17,400 --> 00:33:18,690 Iets sleg gebeur het. 740 00:33:18,690 --> 00:33:21,550 Maar wat was dit meganies dat het mis 741 00:33:21,550 --> 00:33:25,000 hier as gevolg van my verwydering van daardie sogenaamde basis geval, 742 00:33:25,000 --> 00:33:26,870 waar ek teruggekeer van 'n harde-gekodeerde waarde? 743 00:33:26,870 --> 00:33:28,970 744 00:33:28,970 --> 00:33:30,460 Wat dink jy het verkeerd geloop? 745 00:33:30,460 --> 00:33:31,219 Ja. 746 00:33:31,219 --> 00:33:32,135 >> Publiek: [onhoorbaar]. 747 00:33:32,135 --> 00:33:36,387 748 00:33:36,387 --> 00:33:36,970 Spreker 1: Ag. 749 00:33:36,970 --> 00:33:37,550 Goeie vraag. 750 00:33:37,550 --> 00:33:39,508 So het die grootte van die getal dat ek 'n opsomming van 751 00:33:39,508 --> 00:33:41,920 het so groot dat dit oortref die grootte van die geheue spasie. 752 00:33:41,920 --> 00:33:44,640 Goeie idee, maar nie fundamenteel gaan 'n ongeluk te veroorsaak. 753 00:33:44,640 --> 00:33:48,230 Dit kan integer oorloop veroorsaak, waar die stukkies net flip oor 754 00:33:48,230 --> 00:33:51,760 en dan fout wat ons 'n baie groot nommer vir soos 'n negatiewe getal, 755 00:33:51,760 --> 00:33:53,260 maar wat homself nie sal veroorsaak dat 'n ongeluk. 756 00:33:53,260 --> 00:33:55,509 Want aan die einde van die dag 'n int is nog 32 stukkies. 757 00:33:55,509 --> 00:33:57,640 Jy gaan nie per ongeluk steel 'n 33 bit. 758 00:33:57,640 --> 00:33:58,431 Maar 'n goeie gedagte. 759 00:33:58,431 --> 00:33:58,984 Ja. 760 00:33:58,984 --> 00:33:59,900 >> Publiek: [onhoorbaar]. 761 00:33:59,900 --> 00:34:00,551 762 00:34:00,551 --> 00:34:02,300 Spreker 1: Die metode nooit ophou loop, 763 00:34:02,300 --> 00:34:06,658 en inderdaad is dit noem homself weer en weer en weer en weer 764 00:34:06,658 --> 00:34:08,449 en weer, en nie een van daardie funksies ooit 765 00:34:08,449 --> 00:34:13,310 klaar, want hulle enigste lyn van kode noem hulleself weer en weer 766 00:34:13,310 --> 00:34:14,219 en weer. 767 00:34:14,219 --> 00:34:16,080 En wat is regtig hier gebeur, en nou is ons 768 00:34:16,080 --> 00:34:18,100 kan soort van teken dit picturaal. 769 00:34:18,100 --> 00:34:20,899 Laat my gaan oor 'n prentjie vir net 'n oomblik. 770 00:34:20,899 --> 00:34:22,940 Dit is 'n foto, wat sal uiteindelik die vlees uit 771 00:34:22,940 --> 00:34:26,336 in meer besonderhede, van wat aangaan binnekant van jou rekenaar se geheue. 772 00:34:26,336 --> 00:34:28,460 En dit blyk dat op die onderkant van hierdie foto 773 00:34:28,460 --> 00:34:29,709 is iets genoem die stapel. 774 00:34:29,709 --> 00:34:31,920 Dit is 'n stuk van geheue, 'n stuk van die geheue, 775 00:34:31,920 --> 00:34:33,920 dit is net 'n tyd gebruik 'n funksie genoem. 776 00:34:33,920 --> 00:34:36,239 Enige tyd wat jy 'n programmeerder, noem 'n funksie, 777 00:34:36,239 --> 00:34:38,860 die bedryfstelsel, soos Mac OS, Windows, Linux, 778 00:34:38,860 --> 00:34:41,920 gryp 'n klomp van die grepe, miskien 'n paar kilogrepe, miskien n paar megagrepe 779 00:34:41,920 --> 00:34:44,590 geheue, gee dit vir jou, en dan kan 780 00:34:44,590 --> 00:34:47,650 jy jou funksie gebruik watter veranderlikes wat jy nodig het. 781 00:34:47,650 --> 00:34:50,699 En as jy dan bel 'n ander funksie en 'n ander funksie, 782 00:34:50,699 --> 00:34:53,590 jy 'n ander deel van die geheue en 'n ander deel van die geheue. 783 00:34:53,590 --> 00:34:57,090 >> En inderdaad, as die groen bak van Annenberg verklaar dat die geheue, 784 00:34:57,090 --> 00:34:59,870 hier is wat gebeur met die eerste keer as jy bel funksie Sigma. 785 00:34:59,870 --> 00:35:04,510 Dit is soos om 'n skinkbord soos hierdie op wat aanvanklik 'n leë stapel. 786 00:35:04,510 --> 00:35:07,142 Maar dan as dit skinkbord roep self, om so te praat, 787 00:35:07,142 --> 00:35:08,850 roep 'n ander geval van Sigma, wat 788 00:35:08,850 --> 00:35:11,640 soos om te vra die bedryfstelsel, ooh, moet 'n bietjie meer geheue, 789 00:35:11,640 --> 00:35:12,520 gee my dat. 790 00:35:12,520 --> 00:35:14,840 En dan is dit kry opgestapel op bo-op. 791 00:35:14,840 --> 00:35:18,030 Maar wat is die sleutel hier is dat die eerste skinkbord is nog steeds daar, 792 00:35:18,030 --> 00:35:20,620 omdat hy vir drie maande hierdie tweede skinkbord. 793 00:35:20,620 --> 00:35:23,500 Nou intussen, sigma noem Sigma, dit is soos om te vra vir meer geheue. 794 00:35:23,500 --> 00:35:25,830 Kry opgestapel op hier. 795 00:35:25,830 --> 00:35:29,350 Sigma noem Sigma, dis 'n ander skinkbord wat opgestapel kry hier. 796 00:35:29,350 --> 00:35:32,942 En as jy dit doen hou, uiteindelik, soort kaart visuele 797 00:35:32,942 --> 00:35:35,525 aan daardie grafiek, wat gaan gebeur met die stapel bak? 798 00:35:35,525 --> 00:35:37,480 799 00:35:37,480 --> 00:35:41,160 Dit gaan om die bedrag te oorskry geheue jou rekenaar het. 800 00:35:41,160 --> 00:35:45,790 En sodra dit groen skinkbord meer is as die horisontale lyn 801 00:35:45,790 --> 00:35:49,410 bo en behalwe stapel dat die woord hoop, wat ons sal terug te kom in die toekoms, 802 00:35:49,410 --> 00:35:50,410 dit is 'n slegte ding. 803 00:35:50,410 --> 00:35:52,810 Die hoop is 'n ander segment van die geheue, 804 00:35:52,810 --> 00:35:55,190 en as jy toelaat dat hierdie bak hoop en hoop op, 805 00:35:55,190 --> 00:35:57,800 jy gaan om te oorskry jou eie segment van die geheue, 806 00:35:57,800 --> 00:36:00,420 en 'n program is inderdaad gaan om te crash. 807 00:36:00,420 --> 00:36:02,930 >> Nou as 'n eenkant, hierdie idee van rekursie, dus 808 00:36:02,930 --> 00:36:06,500 kan duidelik lei tot probleme, maar dit is nie noodwendig 'n slegte ding. 809 00:36:06,500 --> 00:36:08,840 Omdat oorweeg, nadat alles, how-- en miskien 810 00:36:08,840 --> 00:36:11,700 Dit neem 'n paar om gewoond te --how elegante of hoe eenvoudige 811 00:36:11,700 --> 00:36:14,890 dat die implementering van Sigma was. 812 00:36:14,890 --> 00:36:17,440 En ons gaan nie te gebruik rekursie alles wat baie in CS50, 813 00:36:17,440 --> 00:36:20,780 maar in CS51, en regtig 'n klas waar jy data strukture te manipuleer 814 00:36:20,780 --> 00:36:23,640 soos bome, of familie bome, wat 'n paar hiërargie, 815 00:36:23,640 --> 00:36:26,000 dit is super, super nuttig. 816 00:36:26,000 --> 00:36:29,750 Nou, as 'n eenkant, sodat jy as aspirant rekenaar wetenskaplikes 817 00:36:29,750 --> 00:36:33,180 vertroud is met 'n paar van Google se binnekant grappies, as jy gaan na Google 818 00:36:33,180 --> 00:36:36,345 en jy kyk wat is die definisie van, sê, rekursie, betree. 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 As 'n eenkant, ek trek 'n paar. 822 00:36:42,670 --> 00:36:45,470 Dit was soos 10 minute van uitstel vanoggend. 823 00:36:45,470 --> 00:36:52,890 As jy ook Google "skeef" kennisgewing deur kantel jou kop slightly-- 824 00:36:52,890 --> 00:36:55,120 en dan hierdie een is miskien mees gruwelike van alle 825 00:36:55,120 --> 00:36:57,286 want iemand het spandeer soos hul dag die implementering van hierdie 826 00:36:57,286 --> 00:36:59,880 'n paar jaar ago-- kom. 827 00:36:59,880 --> 00:37:01,140 828 00:37:01,140 --> 00:37:04,540 O, wait-- dit is 'n fout. 829 00:37:04,540 --> 00:37:08,410 830 00:37:08,410 --> 00:37:11,410 >> So loop op een van die wêreld se grootste webwerwe 831 00:37:11,410 --> 00:37:13,510 is hierdie dom bietjie Easter eiers. 832 00:37:13,510 --> 00:37:16,690 Hulle verbruik waarskynlik 'n nontrivial aantal reëls van die kode 833 00:37:16,690 --> 00:37:19,280 Net sodat ons kan bietjie pret dinge soos dat. 834 00:37:19,280 --> 00:37:22,140 Maar ten minste nou jy sommige van die binnekant grappies. 835 00:37:22,140 --> 00:37:28,330 >> Nou laat ons neem 'n blik op sommige van die wit lê het ons vertel van die laat, 836 00:37:28,330 --> 00:37:30,707 en begin om terug te skil sommige lae tegnies 837 00:37:30,707 --> 00:37:32,790 sodat jy werklik verstaan wat is aan die gang 838 00:37:32,790 --> 00:37:34,860 en jy kan verstaan sommige van die dreigemente, 839 00:37:34,860 --> 00:37:38,060 soos Shellshock, wat het nou begin om ' 840 00:37:38,060 --> 00:37:41,110 op die voorpunt van almal se aandag, ten minste in die media. 841 00:37:41,110 --> 00:37:45,810 So hier is 'n baie eenvoudige funksie dat die opbrengste niks, nietig. 842 00:37:45,810 --> 00:37:46,790 Sy naam is ruil. 843 00:37:46,790 --> 00:37:50,880 Dit neem in twee veranderlikes en dit gee niks. 844 00:37:50,880 --> 00:37:52,260 Neem in a en b. 845 00:37:52,260 --> 00:37:53,337 So 'n vinnige demonstrasie. 846 00:37:53,337 --> 00:37:54,170 Ons het hierdie up. 847 00:37:54,170 --> 00:37:56,100 Ons kan net sowel 'n bietjie breek hier vir 'n oomblik 848 00:37:56,100 --> 00:37:57,250 en het 'n bietjie iets om te drink. 849 00:37:57,250 --> 00:38:00,120 As iemand sou nie omgee by my hier vir net 'n oomblik. 850 00:38:00,120 --> 00:38:01,830 Hoe gaan jy in die maroen hemp? 851 00:38:01,830 --> 00:38:02,335 Kom op. 852 00:38:02,335 --> 00:38:04,060 853 00:38:04,060 --> 00:38:05,260 Net die een vandag. 854 00:38:05,260 --> 00:38:06,251 Dankie, al is. 855 00:38:06,251 --> 00:38:08,000 Alle reg, en ons het kom wat hier? 856 00:38:08,000 --> 00:38:08,660 Wat is jou naam? 857 00:38:08,660 --> 00:38:09,360 >> SPREKER 4: Laura. 858 00:38:09,360 --> 00:38:09,740 >> Spreker 1: Laura. 859 00:38:09,740 --> 00:38:10,370 Kom op. 860 00:38:10,370 --> 00:38:11,460 861 00:38:11,460 --> 00:38:13,850 So Laura, baie eenvoudige uitdaging vandag. 862 00:38:13,850 --> 00:38:14,704 863 00:38:14,704 --> 00:38:15,370 Nice yo te ontmoet. 864 00:38:15,370 --> 00:38:16,410 865 00:38:16,410 --> 00:38:16,910 Alle regte. 866 00:38:16,910 --> 00:38:21,179 So ons het 'n paar melk hier en ons het 'n paar oranje sap hier 867 00:38:21,179 --> 00:38:23,345 en 'n paar koppies wat ons geleen van Annenberg vandag. 868 00:38:23,345 --> 00:38:24,178 >> SPREKER 4: geleen het. 869 00:38:24,178 --> 00:38:27,240 Spreker 1: En gaan om voort te gaan en gee jou 'n halwe glas van hierdie. 870 00:38:27,240 --> 00:38:28,250 871 00:38:28,250 --> 00:38:28,800 Alle regte. 872 00:38:28,800 --> 00:38:30,750 En ons sal die helfte van jou 'n glas van die melk. 873 00:38:30,750 --> 00:38:31,905 874 00:38:31,905 --> 00:38:35,890 O ja, en net sodat jy kan onthou wat dit was soos, 875 00:38:35,890 --> 00:38:38,860 Ek onthou te bring hierdie en vandag. 876 00:38:38,860 --> 00:38:42,030 877 00:38:42,030 --> 00:38:42,530 Goed. 878 00:38:42,530 --> 00:38:45,470 As jy nie sou omgee, laat ons sien, ons kan sit hulle oor jou eie bril 879 00:38:45,470 --> 00:38:46,560 As jy wil. 880 00:38:46,560 --> 00:38:48,710 Dit sal die wêreld van Laura se oë. 881 00:38:48,710 --> 00:38:49,210 Alle regte. 882 00:38:49,210 --> 00:38:53,820 So jou doel te bereik, gegewe twee koppies vloeistof hier, melk en oranje sap, 883 00:38:53,820 --> 00:38:58,370 is ruil die twee inhoud, sodat die lemoensap gaan in die melk beker 884 00:38:58,370 --> 00:39:00,710 en die melk gaan in die oranje sap beker. 885 00:39:00,710 --> 00:39:02,359 >> SPREKER 4: Het ek nog 'n koppie? 886 00:39:02,359 --> 00:39:05,650 Spreker 1: Ek is so bly dat jy gevra het, alhoewel dit sou gewees het baie beter footage 887 00:39:05,650 --> 00:39:06,710 As jy nie gevra het nie. 888 00:39:06,710 --> 00:39:10,620 Maar ja, ons kan u 'n derde beker wat leeg is, natuurlik. 889 00:39:10,620 --> 00:39:11,120 Alle regte. 890 00:39:11,120 --> 00:39:12,300 So ruil die inhoud daar. 891 00:39:12,300 --> 00:39:16,100 892 00:39:16,100 --> 00:39:17,050 Baie mooi. 893 00:39:17,050 --> 00:39:20,390 894 00:39:20,390 --> 00:39:21,305 Baie goed. 895 00:39:21,305 --> 00:39:23,121 896 00:39:23,121 --> 00:39:24,745 Jy doen dit merkwaardig versigtig. 897 00:39:24,745 --> 00:39:26,970 898 00:39:26,970 --> 00:39:28,655 En stap drie. 899 00:39:28,655 --> 00:39:30,390 900 00:39:30,390 --> 00:39:31,350 Alle regte. 901 00:39:31,350 --> 00:39:31,930 Uitstekend. 902 00:39:31,930 --> 00:39:33,930 'N Groot applous sal goed wees vir Laura wees. 903 00:39:33,930 --> 00:39:36,500 904 00:39:36,500 --> 00:39:37,000 Alle regte. 905 00:39:37,000 --> 00:39:40,790 Ons het 'n bietjie afskeidsgeskenk vir jou, maar laat my toe om hierdie. 906 00:39:40,790 --> 00:39:42,620 Baie dankie. 907 00:39:42,620 --> 00:39:46,170 So 'n eenvoudige voorbeeld, al is, om te bewys dat as jy dit doen 908 00:39:46,170 --> 00:39:48,300 wil die inhoud te ruil van twee houers, 909 00:39:48,300 --> 00:39:52,360 of kom ons noem hulle veranderlikes, jy 'n paar tydelike berging 910 00:39:52,360 --> 00:39:56,710 een van die inhoud aan te bied in so dat jy eintlik kan doen om die ruil. 911 00:39:56,710 --> 00:40:01,790 So inderdaad, hierdie bron-kode hier in C verteenwoordigend van presies dit. 912 00:40:01,790 --> 00:40:06,340 As die lemoensap was 'n en die melk was b, en ons wou die twee te ruil, 913 00:40:06,340 --> 00:40:08,990 jy kan iets kreatief te probeer deur die gietende een in die ander, 914 00:40:08,990 --> 00:40:11,031 maar dat waarskynlik nie eindig besonder goed. 915 00:40:11,031 --> 00:40:15,260 En so het ons gebruik 'n derde koppie, oproep dit TMP, T-M-P deur konvensie, 916 00:40:15,260 --> 00:40:19,370 en sit die inhoud van die PB in, dan ruil die een beker, 917 00:40:19,370 --> 00:40:22,610 dan sit die PB in die oorspronklike beker, en sodoende 918 00:40:22,610 --> 00:40:25,320 bereiking, presies soos Laura het, die ruil. 919 00:40:25,320 --> 00:40:26,850 >> So kom ons doen presies dit. 920 00:40:26,850 --> 00:40:30,110 Laat my gaan voort en maak tot 'n voorbeeld wat 921 00:40:30,110 --> 00:40:32,720 eintlik geen sogenaamde " ruil, "want dit is nie 922 00:40:32,720 --> 00:40:36,180 as net gedoen as wat jy dink. 923 00:40:36,180 --> 00:40:41,190 So in hierdie program, sien dat Ek gebruik stdio.h, ons ou vriend. 924 00:40:41,190 --> 00:40:43,130 Ek het die prototipe vir omruil daar, wat 925 00:40:43,130 --> 00:40:45,450 beteken dat die implementering se waarskynlik onder, 926 00:40:45,450 --> 00:40:48,050 en laat ons sien wat hierdie belangrikste program gaan vir my om te doen. 927 00:40:48,050 --> 00:40:52,020 Ek het eers verklaar int x kry een, en int y kry twee. 928 00:40:52,020 --> 00:40:54,930 So dink van daardie as PB en melk, onderskeidelik. 929 00:40:54,930 --> 00:40:57,100 En dan het ek net 'n printf sê x is hierdie 930 00:40:57,100 --> 00:41:00,120 en y is dit net so kan ek visueel te sien wat aangaan. 931 00:41:00,120 --> 00:41:03,810 Toe ek printf beweer dat ek die uitruiling die twee, 932 00:41:03,810 --> 00:41:07,100 en dan het ek druk 'n beweer dat hulle verruil, 933 00:41:07,100 --> 00:41:09,300 en ek druk x en y weer. 934 00:41:09,300 --> 00:41:13,010 So hier in ruil is presies wat Laura het, 935 00:41:13,010 --> 00:41:16,240 en presies wat ons gesien het op die skerm 'n oomblik gelede. 936 00:41:16,240 --> 00:41:19,380 >> So laat ons gaan voort en wees baie teleurgesteld. 937 00:41:19,380 --> 00:41:24,690 Maak nie omruil en loop nie ruil, inzoomen op die uitset hier. 938 00:41:24,690 --> 00:41:28,320 Tik x is 1, y is 2, uitruiling verruil. 939 00:41:28,320 --> 00:41:32,700 x is nog 1 en y is nog 2. 940 00:41:32,700 --> 00:41:37,630 So selfs al is, eerlik, dit lyk presies wil, al is dit meer tegnies, 941 00:41:37,630 --> 00:41:40,730 wat Laura het, lyk nie te werk nie. 942 00:41:40,730 --> 00:41:42,130 So hoekom is dit? 943 00:41:42,130 --> 00:41:46,630 Wel, dit blyk dat wanneer ons skryf 'n program soos hierdie 944 00:41:46,630 --> 00:41:51,590 wat beide hoof, uitgelig hier en dan 'n ander funksie, soos ruil, 945 00:41:51,590 --> 00:41:54,230 uitgelig hier, wat dit noem, die wêreld 946 00:41:54,230 --> 00:41:57,030 lyk 'n bietjie iets soos hierdie bak 'n oomblik gelede. 947 00:41:57,030 --> 00:42:00,440 Wanneer belangrikste eerste kry genoem, dit is soos om te vra bedryfstelsel 948 00:42:00,440 --> 00:42:04,030 vir 'n bietjie van die geheue vir 'n plaaslike veranderlikes soos x en y wat hoof het, 949 00:42:04,030 --> 00:42:05,660 en hulle uiteindelik net daar. 950 00:42:05,660 --> 00:42:10,920 Maar as hoof oproepe ruil, en die belangrikste gaan twee argumente, A en B te ruil, 951 00:42:10,920 --> 00:42:16,410 lemoensap en melk, dit is nie soos uitreiking van die lemoensap en die melk 952 00:42:16,410 --> 00:42:17,500 te Laura. 953 00:42:17,500 --> 00:42:21,300 Wat 'n rekenaar nie, is dit verby afskrifte van die oranje sap 954 00:42:21,300 --> 00:42:27,110 en afskrifte van die melk te Laura, sodat Wat is uiteindelik binnekant van hierdie skinkbord 955 00:42:27,110 --> 00:42:32,510 is die waarde een en twee, of PB en melk, maar daarvan, 956 00:42:32,510 --> 00:42:34,790 sodat op hierdie punt in die verhaal, is daar 957 00:42:34,790 --> 00:42:36,930 is PB en melk in elk van hierdie bak. 958 00:42:36,930 --> 00:42:39,260 Daar is 'n een en 'n twee in elk van hierdie bak, 959 00:42:39,260 --> 00:42:41,720 en die ruil-funksie is inderdaad besig. 960 00:42:41,720 --> 00:42:46,090 Dit is die uitruiling hulle in van die tweede hoogste skinkbord, 961 00:42:46,090 --> 00:42:48,147 maar dat uitruiling het geen impak. 962 00:42:48,147 --> 00:42:49,980 En op grond van net 'n paar basiese beginsel wat ons het 963 00:42:49,980 --> 00:42:52,970 gepraat oor voor, en wel net 'n paar minute gelede, wat 964 00:42:52,970 --> 00:42:58,770 kan verduidelik waarom die verandering A en B binne ruil 965 00:42:58,770 --> 00:43:05,560 het geen effek op x en y, selfs al Ek geslaag x en y aan die ruil-funksie. 966 00:43:05,560 --> 00:43:08,750 Wat is die sleutel woord hier dat mag simplisties verduidelik? 967 00:43:08,750 --> 00:43:11,250 968 00:43:11,250 --> 00:43:12,627 Ek dink ek het dit gehoor hier? 969 00:43:12,627 --> 00:43:13,335 Publiek: Return. 970 00:43:13,335 --> 00:43:14,085 Spreker 1: Terug? 971 00:43:14,085 --> 00:43:14,590 Nie terugkeer nie. 972 00:43:14,590 --> 00:43:15,895 Kom ons gaan met 'n ander. 973 00:43:15,895 --> 00:43:16,395 Wat is dit? 974 00:43:16,395 --> 00:43:17,080 >> Publiek: [onhoorbaar]. 975 00:43:17,080 --> 00:43:20,000 >> Spreker 1: OK, so return-- ons kon maak terugkeer werk in die storie, 976 00:43:20,000 --> 00:43:21,914 maar daar is 'n nog eenvoudiger verduideliking. 977 00:43:21,914 --> 00:43:22,580 Publiek: omvang. 978 00:43:22,580 --> 00:43:23,288 Spreker 1: omvang. 979 00:43:23,288 --> 00:43:24,300 Ek neem omvang. 980 00:43:24,300 --> 00:43:27,290 So omvang, onthou waar ons x en y verklaar. 981 00:43:27,290 --> 00:43:30,840 Hulle is binne verklaar van die belangrikste reg hier. 982 00:43:30,840 --> 00:43:33,200 A en B het intussen is effektief verklaar 983 00:43:33,200 --> 00:43:35,930 binnekant van ruil, nie heeltemal in die krulhakies, maar nog steeds 984 00:43:35,930 --> 00:43:37,690 in die algemene gebied van ruil. 985 00:43:37,690 --> 00:43:40,560 En so ja, A en B slegs binne hierdie skinkbord bestaan 986 00:43:40,560 --> 00:43:44,850 van Annenberg, hierdie tweede deel van die kode. 987 00:43:44,850 --> 00:43:49,500 So ons inderdaad die verandering van die kopie, maar dit is nie regtig alles wat nuttig. 988 00:43:49,500 --> 00:43:52,190 >> So laat ons neem 'n blik op dit 'n bietjie laer vlak. 989 00:43:52,190 --> 00:43:55,430 Ek gaan om terug te gaan na die Bron Gids, 990 00:43:55,430 --> 00:43:58,330 en ek gaan na die eerste zoom in hier, en net 991 00:43:58,330 --> 00:44:02,290 om te bevestig dat ek in hierdie groter terminale venster, 992 00:44:02,290 --> 00:44:04,430 die program is nog steeds gedra soos dit. 993 00:44:04,430 --> 00:44:06,840 Veronderstel nou dat hierdie nie opsetlike. 994 00:44:06,840 --> 00:44:10,090 Dit is duidelik dat ek wou ruil vir werk, so dit voel soos 'n fout. 995 00:44:10,090 --> 00:44:12,780 Nou kan ek begin toevoeging van 'n baie printf se my kode, 996 00:44:12,780 --> 00:44:16,010 uit te druk x hier, y oor hier, 'n hier, b hier. 997 00:44:16,010 --> 00:44:18,220 Maar eerlik, dit is waarskynlik wat jy gedoen het vir 'n paar weke 998 00:44:18,220 --> 00:44:20,190 nou, in kantoorure en by die huis by die werk 999 00:44:20,190 --> 00:44:22,150 op psets probeer om foute te vind. 1000 00:44:22,150 --> 00:44:25,560 Maar jy sien, as jy nog nie het nie, dat die probleem van drie stel jou 1001 00:44:25,560 --> 00:44:31,630 'n bevel genoem GDB, waar GDB, GNU debugger, 1002 00:44:31,630 --> 00:44:34,040 het self 'n hele klomp van die funksies wat kan eintlik 1003 00:44:34,040 --> 00:44:38,160 Laat ons situasies te verstaan soos hierdie, maar meer dwingend, 1004 00:44:38,160 --> 00:44:39,940 probleme op te los en vind foute. 1005 00:44:39,940 --> 00:44:40,940 So ek gaan om dit te doen. 1006 00:44:40,940 --> 00:44:44,770 In plaas van ./noswap, ek is in plaas gaan GDB ./noswap te voer. 1007 00:44:44,770 --> 00:44:47,410 1008 00:44:47,410 --> 00:44:51,200 Met ander woorde, ek gaan om te hardloop my program nie in Bash, ons nuwe vriend 1009 00:44:51,200 --> 00:44:51,850 vandag. 1010 00:44:51,850 --> 00:44:53,970 Ek gaan loop my program noswap binne 1011 00:44:53,970 --> 00:44:56,900 van hierdie ander program genaamd GDB, wat 'n debugger, wat 1012 00:44:56,900 --> 00:45:01,035 is 'n program wat ontwerp is om te help Julle mense vind en foute verwyder. 1013 00:45:01,035 --> 00:45:03,410 So as ek getref Begin hier, daar is 'n gruwelike bedrag van die teks 1014 00:45:03,410 --> 00:45:04,868 dat jy nooit regtig het om te lees. 1015 00:45:04,868 --> 00:45:07,290 Dit is in wese 'n afleiding uit die vinnige, wat 1016 00:45:07,290 --> 00:45:10,030 Ek gaan om te tref Control-L opstaan ​​om die top is daar. 1017 00:45:10,030 --> 00:45:11,800 Dit is die GDB vinnige. 1018 00:45:11,800 --> 00:45:15,550 As ek hierdie program wil nou hardloop, as hierdie klein cheat sheet op vandag se 1019 00:45:15,550 --> 00:45:21,860 skyfie stel, Run is die eerste beveel dat ons bedoel is om te voer. 1020 00:45:21,860 --> 00:45:25,150 En ek is net gaan om te tik aanloop hier binnekant van GDB, 1021 00:45:25,150 --> 00:45:26,811 en inderdaad is dit gehardloop my program. 1022 00:45:26,811 --> 00:45:29,310 Nou is daar 'n paar ekstra uitgange van die skerm soos hierdie, 1023 00:45:29,310 --> 00:45:31,910 maar dit is GDB om net anale en vertel ons wat aangaan. 1024 00:45:31,910 --> 00:45:34,451 Jy moet regtig nie hoef te bekommer oor hierdie besonderhede nou. 1025 00:45:34,451 --> 00:45:36,890 Maar wat is regtig cool oor GDB, as ek dit doen again-- 1026 00:45:36,890 --> 00:45:42,100 Control-L goedkeuring van die screen-- laat my gaan voor en tik "breek hoof," daardeur, 1027 00:45:42,100 --> 00:45:45,743 toe ek Tik, die opstel van wat is genoem 'n breek punt noswap.c, 1028 00:45:45,743 --> 00:45:51,270 lyn 16, en dit is waar GDB uitgepluis my program eintlik 1029 00:45:51,270 --> 00:45:53,070 is, my funksie eintlik is. 1030 00:45:53,070 --> 00:45:55,070 Dit sal ons ignoreer vir nou maar dit is die adres 1031 00:45:55,070 --> 00:45:57,310 in die geheue spesifiek van hierdie funksie. 1032 00:45:57,310 --> 00:46:00,240 So nou wanneer ek tik hardloop, sien wat is koel hier. 1033 00:46:00,240 --> 00:46:05,650 My program breek op die lyn wat ek vertel GDB uitvoering te breek op. 1034 00:46:05,650 --> 00:46:09,850 So ek het nie nou my kode verander, voeg 'n paar printf se, heropstel dit, tik 1035 00:46:09,850 --> 00:46:13,300 dit verander, voeg 'n paar printf se, behalwe dit, heropstel dit is, loop dit. 1036 00:46:13,300 --> 00:46:18,100 Ek kan net loop deur my program stap vir stap vir stap op die menslike spoed, 1037 00:46:18,100 --> 00:46:20,880 nie by Intel-binne soort van spoed. 1038 00:46:20,880 --> 00:46:24,580 >> So nou sien hierdie lyn hier verskyn, en as ek terug gaan 1039 00:46:24,580 --> 00:46:27,800 om my program in gedit, sien dat dit is eintlik 1040 00:46:27,800 --> 00:46:29,280 die heel eerste reël van die kode. 1041 00:46:29,280 --> 00:46:31,240 Daar is lyn 16 in gedit. 1042 00:46:31,240 --> 00:46:34,610 Daar is lyn 16 binne GDB, en selfs al hierdie swart en wit koppelvlak 1043 00:46:34,610 --> 00:46:37,760 is nie naastenby so gebruiker vriendelik, dit beteken 1044 00:46:37,760 --> 00:46:41,680 dat die lyn 16 is nie uitgevoer nie, maar dit is om te wees. 1045 00:46:41,680 --> 00:46:46,220 So inderdaad as ek tik druk x, nie printf, net druk x, 1046 00:46:46,220 --> 00:46:50,730 Ek kry 'n paar valse waarde daar van nul, want x is nog nie geïnisialiseer. 1047 00:46:50,730 --> 00:46:54,760 So ek gaan na die volgende tik, of, as jy wil fancy wees, net n vir die volgende. 1048 00:46:54,760 --> 00:46:59,090 Maar toe ek tik die volgende tree, nou sien dit beweeg op lyn 17. 1049 00:46:59,090 --> 00:47:02,840 So logies, as ek uitgevoer lyn 16 en ek tik nou druk x, 1050 00:47:02,840 --> 00:47:03,640 Wat moet ek sien? 1051 00:47:03,640 --> 00:47:04,970 1052 00:47:04,970 --> 00:47:05,520 Een. 1053 00:47:05,520 --> 00:47:07,820 >> En nou is dit weliswaar verwarrend. 1054 00:47:07,820 --> 00:47:11,260 $ 2 is net 'n fancy manier, as jy later wil verwys na daardie waarde, 1055 00:47:11,260 --> 00:47:12,510 jy kan sê "dollar teken twee." 1056 00:47:12,510 --> 00:47:13,480 Dit is soos 'n terug verwysing. 1057 00:47:13,480 --> 00:47:14,570 Maar vir nou, net ignoreer. 1058 00:47:14,570 --> 00:47:17,070 Wat interessant is, is wat is op die regterkant van die gelykaanteken. 1059 00:47:17,070 --> 00:47:21,000 En as ek nou tik die volgende weer en druk y, moet ek sien 2. 1060 00:47:21,000 --> 00:47:23,870 Ek kan ook nou druk x weer, en eerlik, 1061 00:47:23,870 --> 00:47:27,130 As ek 'n bietjie verward waar Ek is, kan ek tik lys vir 'n lys 1062 00:47:27,130 --> 00:47:30,590 en sien net 'n paar konteks rondom die punt wat ek eintlik aan. 1063 00:47:30,590 --> 00:47:35,180 En nou, ek kan tik volgende, en daar is x 1. 1064 00:47:35,180 --> 00:47:36,300 Nou tik ek die volgende. 1065 00:47:36,300 --> 00:47:37,710 O, y is 2. 1066 00:47:37,710 --> 00:47:40,750 En weer, dit is verwarrend, omdat GDB se uitset 1067 00:47:40,750 --> 00:47:43,044 word die institutionele met my eie produksie. 1068 00:47:43,044 --> 00:47:45,710 Maar as jy in gedagte hou, deur skrams heen en weer by jou kode 1069 00:47:45,710 --> 00:47:47,740 of lê dit uit kant mekaar miskien, sal jy 1070 00:47:47,740 --> 00:47:51,020 sien wat werklik ek is net versterking deur middel van my program. 1071 00:47:51,020 --> 00:47:54,620 >> Maar let op wat gebeur volgende, letterlik. 1072 00:47:54,620 --> 00:47:56,380 Hier is lyn 22. 1073 00:47:56,380 --> 00:48:01,315 Laat my gaan oor dit, en daardeur beweeg op tot 23, en as ek druk x nou, steeds een. 1074 00:48:01,315 --> 00:48:03,890 En as ek druk y nou, steeds een. 1075 00:48:03,890 --> 00:48:05,820 Dit is dus nie 'n nuttige oefening. 1076 00:48:05,820 --> 00:48:07,450 So laat oordoen dit. 1077 00:48:07,450 --> 00:48:10,069 Laat my terug te gaan na die top en die tipe weer hardloop. 1078 00:48:10,069 --> 00:48:12,110 En dit is te sê dat die program dit is wat ontfout 1079 00:48:12,110 --> 00:48:14,109 het reeds begin, begin van die begin af. 1080 00:48:14,109 --> 00:48:15,420 Ja, kom ons doen dit weer. 1081 00:48:15,420 --> 00:48:22,000 En hierdie keer kom ons doen die volgende, volgende, volgende, volgende, volgende, 1082 00:48:22,000 --> 00:48:24,180 maar nou dinge interessant. 1083 00:48:24,180 --> 00:48:27,760 Nou wil ek stap in ruil, so ek tik nie volgende. 1084 00:48:27,760 --> 00:48:34,380 Ek tik stap, en nou sien dit het my na noswap.c line 33 gespring. 1085 00:48:34,380 --> 00:48:37,240 As ek gaan terug na gedit, wat is lyn 33? 1086 00:48:37,240 --> 00:48:40,500 Dit is die eerste werklike reël van die kode binnekant van ruil. 1087 00:48:40,500 --> 00:48:44,150 Wat is lekker, want nou kan ek soort steek rond en kry nuuskierig 1088 00:48:44,150 --> 00:48:46,052 oor wat aangaan werklik daar. 1089 00:48:46,052 --> 00:48:46,760 Laat my druk tmp. 1090 00:48:46,760 --> 00:48:47,770 1091 00:48:47,770 --> 00:48:48,800 Whoa. 1092 00:48:48,800 --> 00:48:51,438 Waarom het tmp het 'n paar gek, valse vullis waarde? 1093 00:48:51,438 --> 00:48:54,579 1094 00:48:54,579 --> 00:48:56,120 Publiek: Dit is nie geïnisialiseer. 1095 00:48:56,120 --> 00:48:57,150 Spreker 1: Dit is nie geïnisialiseer. 1096 00:48:57,150 --> 00:49:00,270 En inderdaad, wanneer jy 'n program, jy 'n hele klomp van die geheue is gegee 1097 00:49:00,270 --> 00:49:03,392 deur die bedryfstelsel nie, maar het nie geïnisialiseer enige waardes, 1098 00:49:03,392 --> 00:49:05,600 Dus, wat stukkies jy sien hier, selfs al is dit 1099 00:49:05,600 --> 00:49:07,770 hierdie mal groot negatiewe nommer, beteken net 1100 00:49:07,770 --> 00:49:10,750 dat dit die oorblyfsels van sommige vorige gebruik van die geheue, 1101 00:49:10,750 --> 00:49:13,050 selfs al het ek nie myself nodig dit nog nie. 1102 00:49:13,050 --> 00:49:17,086 So nou is ek gaan om voort te gaan en die tipe volgende, en as ek tik nou druk tmp, 1103 00:49:17,086 --> 00:49:17,835 Wat moet ek sien? 1104 00:49:17,835 --> 00:49:19,570 1105 00:49:19,570 --> 00:49:23,360 Wat ook al die waarde van 'n was, a is die eerste argument, net 1106 00:49:23,360 --> 00:49:25,550 soos x was die eerste ding wat geslaag het in, 1107 00:49:25,550 --> 00:49:30,450 so 'n en x moet dieselfde wees, so druk tmp moet druk my een. 1108 00:49:30,450 --> 00:49:36,360 >> So, wat jy sal sien in probleem stel drie is 'n handleiding van spesies op GDB, 1109 00:49:36,360 --> 00:49:40,020 maar besef dat dit is die begin 'n blik op 'n instrument wat eintlik 1110 00:49:40,020 --> 00:49:42,774 help om probleme op te los soveel meer effektief. 1111 00:49:42,774 --> 00:49:44,690 Wat ons uiteindelik gaan doen op Woensdag 1112 00:49:44,690 --> 00:49:48,180 is begin terug te skil 'n paar lae en verwyder 'n paar opleiding wiele. 1113 00:49:48,180 --> 00:49:50,496 Dat die ding genoem string wat ons gebruik het vir 'n geruime tyd, 1114 00:49:50,496 --> 00:49:53,370 ons gaan stadig neem dit weg van jou en begin praat oor 1115 00:49:53,370 --> 00:49:55,725 iets meer esoterisch bekend as char *, 1116 00:49:55,725 --> 00:49:59,550 maar ons gaan dit lekker om te doen en liggies op die eerste, selfs al wysers, 1117 00:49:59,550 --> 00:50:02,730 as hulle genoem word, kan 'n paar te doen baie slegte dinge as mishandel, 1118 00:50:02,730 --> 00:50:06,040 deur te kyk na 'n bietjie claymation uit ons vriend Nick Parlante van Stanford 1119 00:50:06,040 --> 00:50:09,670 Universiteit, 'n professor in die rekenaar wetenskap wat hierdie voorskou saam 1120 00:50:09,670 --> 00:50:11,075 van wat hierdie Woensdag te kom. 1121 00:50:11,075 --> 00:50:12,196 1122 00:50:12,196 --> 00:50:13,400 >> [Video speel] 1123 00:50:13,400 --> 00:50:13,900 Hey, Binky. 1124 00:50:13,900 --> 00:50:14,930 1125 00:50:14,930 --> 00:50:15,780 Wakker. 1126 00:50:15,780 --> 00:50:17,240 Dit is tyd vir wyser pret. 1127 00:50:17,240 --> 00:50:18,260 1128 00:50:18,260 --> 00:50:19,350 >> -Wat Is dit? 1129 00:50:19,350 --> 00:50:21,150 Meer inligting oor die riglyne? 1130 00:50:21,150 --> 00:50:22,050 O, goody! 1131 00:50:22,050 --> 00:50:22,897 1132 00:50:22,897 --> 00:50:23,730 [Einde video speel] 1133 00:50:23,730 --> 00:50:25,396 Spreker 1: Dit wag vir jou op Woensdag. 1134 00:50:25,396 --> 00:50:26,440 Ons sal sien dat jy dan. 1135 00:50:26,440 --> 00:50:27,106 [Video speel] 1136 00:50:27,106 --> 00:50:30,420 -En nou, diep gedagtes, deur Daven Farnham. 1137 00:50:30,420 --> 00:50:33,980 1138 00:50:33,980 --> 00:50:35,900 >> -Waarom Ons leer C? 1139 00:50:35,900 --> 00:50:36,785 Hoekom nie A +? 1140 00:50:36,785 --> 00:50:38,550 1141 00:50:38,550 --> 00:50:40,910 >> [Gelag] 1142 00:50:40,910 --> 00:50:42,160 >> [Einde video speel]