1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Uke 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Dette er CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 All høyre. Velkommen tilbake. Dette er CS50, og dette er begynnelsen av uke 7. 5 00:00:12,280 --> 00:00:14,690 Et par små kunngjøringer: 6 00:00:14,690 --> 00:00:18,150 Pset5 er nå i gang, eller snart skal være, 7 00:00:18,150 --> 00:00:21,590 og la meg si, helt ærlig, dette har en tendens til å være blant de mer utfordrende 8 00:00:21,590 --> 00:00:24,460 av kursets oppgavesett, så la meg nevne dette nå 9 00:00:24,460 --> 00:00:28,190 slik at denne uken mer enn noen gang du ikke vente til, si, onsdag kveld 10 00:00:28,190 --> 00:00:29,920 eller torsdag kveld for å dykke i. 11 00:00:29,920 --> 00:00:32,369 Dette er definitivt en interessant pset. Vi synes det er gøy. 12 00:00:32,369 --> 00:00:36,110 Hvis du faktisk få det helt riktig, og kan deretter utfordre den såkalte Big Board, 13 00:00:36,110 --> 00:00:39,830 har du en mulighet til å matche vettet med noen av kursets ansatte 14 00:00:39,830 --> 00:00:41,620 og noen av klassekameratene dine. 15 00:00:41,620 --> 00:00:44,670 What The Big Board er er når du har din spell-checker arbeid, 16 00:00:44,670 --> 00:00:48,860 vil du være i stand til å gå til cs50.net etter å ha kjørt en kommando, 17 00:00:48,860 --> 00:00:52,430 rent melde deg på, og deretter hvor mye tid og hvor mye RAM og mer 18 00:00:52,430 --> 00:00:56,130 at du har brukt i gjennomføringen vil bli utstilt her på kurset hjemmeside. 19 00:00:56,130 --> 00:00:59,740 Du vil merke at en hel haug av disse folkene her er oppført som ansatte 20 00:00:59,740 --> 00:01:04,220 siden over helgen, trodde ansatte det ville være morsomt å prøve å overgå hverandre. 21 00:01:04,220 --> 00:01:07,390 Så innser at målet her er ikke å overgå de ansatte. 22 00:01:07,390 --> 00:01:09,790 Selv er jeg bare her på nummer 13. 23 00:01:09,790 --> 00:01:13,790 Rent velge i, men det er en mulighet til å se hvor lite RAM 24 00:01:13,790 --> 00:01:16,790 og hvor få CPU sekunder kan du bruke vis-a-vis noen av dine klassekamerater. 25 00:01:16,790 --> 00:01:20,540 >> Og jeg skal innrømme at Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 tiden i nummer 1 posisjon som en av de TFS, 27 00:01:23,750 --> 00:01:28,120 Dette er en implementering som vi kaller ikke mulig 28 00:01:28,120 --> 00:01:32,700 gitt at han bruker nesten 0 RAM og nesten 0 sekunder for lasting. 29 00:01:32,700 --> 00:01:35,670 Så vi vil ta vare på Kevin offline. [Latter] 30 00:01:35,670 --> 00:01:40,950 Det er visse ferdigheter som Kevin er å sette på prøve her. 31 00:01:40,950 --> 00:01:45,280 En av de tingene vi trodde vi ville gjøre er også nå CS50x er en uke i gang, 32 00:01:45,280 --> 00:01:49,520 og dere er like mye en del av dette eksperimentet som de studentene er. 33 00:01:49,520 --> 00:01:53,720 Vi har spurt dem som en del av pset0 deres, som var på samme måte for å sende inn en Scratch prosjekt 34 00:01:53,720 --> 00:01:58,280 av interesse for dem - et spill, en interaktiv kunstverk, en animasjon eller lignende - 35 00:01:58,280 --> 00:02:03,700 en 1 - til 2-minutters video, hvis de ønsker, sier hei til verden og hvem de egentlig er. 36 00:02:03,700 --> 00:02:06,780 Jeg tenkte jeg skulle dele med dere bare et par av videoene som har blitt sendt så langt 37 00:02:06,780 --> 00:02:10,759 fordi for oss, på de ansatte minst, det virkelig har vært spennende 38 00:02:10,759 --> 00:02:14,220 og inspirerende å se disse folkene fra hele verden - land over hele verden - 39 00:02:14,220 --> 00:02:18,160 tuning i, av alle ting, til en datamaskin science kurs på internett, 40 00:02:18,160 --> 00:02:20,410 enten det er fordi de ønsker å fortsette sine egne studier, 41 00:02:20,410 --> 00:02:22,300 de ønsker å ta sine karrierer i en ny retning, 42 00:02:22,300 --> 00:02:24,390 de ønsker å fylle hullene i sin egen kunnskap, 43 00:02:24,390 --> 00:02:27,190 så noen av de samme grunnene som dere kanskje har vært her. 44 00:02:27,190 --> 00:02:31,090 >> Så jeg gir deg en slik student her. Du kan øke volumet bare litt. 45 00:02:31,090 --> 00:02:35,520 Her er en av våre studentens en liten innleveringer. 46 00:02:35,520 --> 00:02:40,380 Hei, verden. Jeg er en student av industri her i Malaga, Spania. 47 00:02:40,380 --> 00:02:45,840 Jeg er begeistret for dette online kurset fordi jeg elsker informatikk, det gjør jeg virkelig, 48 00:02:45,840 --> 00:02:48,880 og jeg virkelig setter pris på at jeg kommer til å utforske den. 49 00:02:48,880 --> 00:02:51,940 Og det faktum at jeg kan lære det samme alle dere gjør 50 00:02:51,940 --> 00:02:57,040 men i stedet for å være i Harvard Jeg er i Malaga, hvor fantastisk er det? 51 00:02:57,040 --> 00:03:02,040 Vel, jeg er Fernando, og dette er CS50. Se dere. 52 00:03:02,040 --> 00:03:07,100 [Latter] En annen klipp vi liker spesielt godt, vil du finne at denne herren engelsk er ikke så sterk. 53 00:03:07,100 --> 00:03:11,520 Det ser ut som han hadde det maskin oversatt, så oversettelsene selv er litt mangelfull, 54 00:03:11,520 --> 00:03:15,790 men dette var en av våre favoritter så langt så vel. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Hei, verden. [Snakker i japansk] 57 00:03:32,370 --> 00:03:39,830 [Jeg må hilse på japansk fordi min engelsk er svært upålitelige.] 58 00:03:39,830 --> 00:03:45,380 [Jeg har levert meldingen til deg fra byen Gifu, Japan.] 59 00:03:45,380 --> 00:03:49,820 [Jeg kan være en student for første gang på 20 år, som kan sees.] 60 00:03:49,820 --> 00:03:54,640 [Jeg er veldig takknemlig til Harvard University som ga meg denne muligheten, og EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf er en gitar og min favoritt ting i gang.] [Latter] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Hvorfor tror du jeg prøvde å delta på en cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, er det min lengsel.] 65 00:04:14,990 --> 00:04:19,740 [Spesielt hvis jeg er langt tilstedeværelse bodde i Japan.] 66 00:04:19,740 --> 00:04:26,680 [Jeg ønsket å prøve en gang klar over eksistensen av en slik EDX når.] 67 00:04:26,680 --> 00:04:32,500 [Tror du ikke så trenger du ikke relatert til alder av læring I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 er min lengsel. Mitt navn er Kazu, og dette er CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [applaus og jubel] 70 00:04:43,090 --> 00:04:49,220 En annen favoritt av våre var dette brevet her fra noen. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google det hvis du ikke er kjent med denne meme. 72 00:04:55,380 --> 00:05:01,480 >> Og så til slutt, et par andre som fikk lagt det kanskje vinne den bedårende prisen. 73 00:05:01,480 --> 00:05:06,820 [Studenter] Aww! >> [Malan] Vi må lytte. Dette er kort, så hør nøye. 74 00:05:08,580 --> 00:05:11,150 [Kvinnelige speaker] Hva heter du? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Kvinnelige speaker] Hva er dette? >> [Giggles] CS50. [Latter] 76 00:05:16,120 --> 00:05:19,510 [Malan] Han gjorde to tar, skjønt. 77 00:05:19,510 --> 00:05:22,240 Here we go, den siste. 78 00:05:23,030 --> 00:05:26,980 Mitt navn er Louie, og dette er CS50. 79 00:05:26,980 --> 00:05:30,250 [Latter] Dette er da CS50x. 80 00:05:30,250 --> 00:05:33,230 Takk til alle de av dere mens du følger langs hjemme 81 00:05:33,230 --> 00:05:35,620 som har vært partaking så langt. 82 00:05:35,620 --> 00:05:39,510 I dag, konkluderer vi vår diskusjon av datastrukturer, 83 00:05:39,510 --> 00:05:41,160 det minste noen av de mest fundamentale, 84 00:05:41,160 --> 00:05:44,760 og vi fortsetter vår samtale om HTML og web-programmering. 85 00:05:44,760 --> 00:05:48,520 Faktisk har vi brukt de siste noen syv uker ser på det grunnleggende av programmering - 86 00:05:48,520 --> 00:05:50,450 algoritmer, datastrukturer og lignende - 87 00:05:50,450 --> 00:05:53,050 og C, som du kanskje har opplevd så langt, 88 00:05:53,050 --> 00:05:57,060 er ikke nødvendigvis den mest tilgjengelige av språk 89 00:05:57,060 --> 00:05:59,090 som å gjennomføre noen av disse ideene. 90 00:05:59,090 --> 00:06:01,880 Og så starter denne uken og neste uke, og deretter følgende, 91 00:06:01,880 --> 00:06:07,110 Vi vil til slutt være i stand til å overgangen fra C, som er allment kjent som en ganske lavt nivå språk, 92 00:06:07,110 --> 00:06:11,190 til ting høyere nivå, blant dem PHP, JavaScript, og lignende, 93 00:06:11,190 --> 00:06:14,850 som vi vil se trekke på de samme erfaringene som vi har lært i løpet av de siste ukene, 94 00:06:14,850 --> 00:06:19,430 men du vil finne at erklære ting som matriser og hash tabeller og søking og sortering 95 00:06:19,430 --> 00:06:23,370 blitt så mye enklere fordi språkene selv vi begynne å bruke 96 00:06:23,370 --> 00:06:25,290 vil bli kraftigere. 97 00:06:25,290 --> 00:06:27,410 Men først, en applikasjon av trær. 98 00:06:27,410 --> 00:06:30,240 Det er svært vanlig i disse dager til å trenge å komprimere informasjon. 99 00:06:30,240 --> 00:06:34,770 I hvilken sammenheng du ønsker å komprimere en slags digital informasjon? 100 00:06:37,190 --> 00:06:39,670 >> Ja. >> [Student] Når du trenger å sende den over Internett. 101 00:06:39,670 --> 00:06:41,450 Ja, når du ønsker å sende noe over nettet. 102 00:06:41,450 --> 00:06:44,950 Hvis du ønsker å laste ned en stor fil, er det ideelt hvis noen i den andre enden 103 00:06:44,950 --> 00:06:48,760 har komprimert filen ved hjelp av en zip-format eller noe sånt 104 00:06:48,760 --> 00:06:53,760 slik at du sender færre bits enn ellers kunne overføres. 105 00:06:53,760 --> 00:06:55,500 Så hvordan komprimere du informasjon? 106 00:06:55,500 --> 00:07:00,540 Det hele koker ned til å bruke færre biter enn det som er påkrevd. 107 00:07:00,540 --> 00:07:03,220 Men dette er en slags merkelig ting fordi tenker tilbake til uke 0 og 1 108 00:07:03,220 --> 00:07:07,370 når vi snakket om ASCII og binær og vi snakket om ASCII spesielt 109 00:07:07,370 --> 00:07:10,690 som bruker 8 bits til å representere bokstaver i alfabetet 110 00:07:10,690 --> 00:07:16,120 slik at bokstaven A er representert ved 65, små bokstaver a er nummeret 97, 111 00:07:16,120 --> 00:07:21,210 og hvordan du representerer 65 eller 97, bruker du 7 eller 8 bits. 112 00:07:21,210 --> 00:07:24,120 Men fangsten er at det er noen bokstaver i det engelske alfabetet 113 00:07:24,120 --> 00:07:26,230 som ikke er like populær som andre. 114 00:07:26,230 --> 00:07:31,600 Z er ikke alle som populær, Q er ikke alle som populær, men A og E er super populære. 115 00:07:31,600 --> 00:07:37,280 Og likevel for alle disse brevene, som standard i verden bruker samme antall biter, bare 8. 116 00:07:37,280 --> 00:07:42,690 Så ville ikke det ha vært smartere hvis stedet for å bruke 8 biter for hver bokstav, 117 00:07:42,690 --> 00:07:47,440 selv de mest sjelden brukt som Q og Z, 118 00:07:47,440 --> 00:07:51,910 hva om vi brukte færre bits for A og E og S og de mest populære bokstaver 119 00:07:51,910 --> 00:07:55,000 og brukt flere biter for de mindre populære bokstaver, 120 00:07:55,000 --> 00:07:57,770 ideen er la oss optimalisere for vanlig sak, 121 00:07:57,770 --> 00:08:01,160 som er et tema i informatikk for å prøve å optimalisere hva som kommer til å skje mest 122 00:08:01,160 --> 00:08:05,310 og tilbringe litt mer tid, litt mer plass på de tingene som, ja, kan skje 123 00:08:05,310 --> 00:08:07,680 men ikke nødvendigvis som ofte. 124 00:08:07,680 --> 00:08:09,330 Så la oss ta et eksempel. 125 00:08:09,330 --> 00:08:12,610 >> Anta at vi ønsker å kryptere informasjon ganske effektivt. 126 00:08:12,610 --> 00:08:15,090 Du har kanskje vokst opp å vite noe om morse, 127 00:08:15,090 --> 00:08:17,450 og oddsen er du ikke kjenner den faktiske koden, 128 00:08:17,450 --> 00:08:21,750 men du husker kanskje at det er minst denne serien av prikker og streker. 129 00:08:21,750 --> 00:08:26,640 Dette er en ganske effektiv koding, og merker at den mest populære brev - for eksempel E - 130 00:08:26,640 --> 00:08:28,980 bruker den korteste av piper. 131 00:08:28,980 --> 00:08:31,740 Morse handler om pip-pip-pip-pip-pip-pip og holde toner 132 00:08:31,740 --> 00:08:34,799 enten for korte perioder eller lange perioder. 133 00:08:34,799 --> 00:08:40,330 E, som vist ved punktum, er en super kort pip, bare pip, og det ville representere E. 134 00:08:40,330 --> 00:08:43,960 I motsetning vil T være en lengre pip, som pip [forlenger lyd], 135 00:08:43,960 --> 00:08:45,710 og det ville representere T. 136 00:08:45,710 --> 00:08:48,840 Men det er fortsatt ganske kort fordi derimot hvis du ser på Z, 137 00:08:48,840 --> 00:08:52,690 å uttrykke Z du ville gå pip, pip [lengre lyd], pip, pip [kortere lyd]. 138 00:08:52,690 --> 00:08:55,360 Så det er lenger fordi det er mindre vanlig. 139 00:08:55,360 --> 00:08:58,150 Men fikser her er at morse er litt feil 140 00:08:58,150 --> 00:09:00,610 i at det er ikke umiddelbart dekodes. 141 00:09:00,610 --> 00:09:07,350 For eksempel anta at du hører på noen enden av ledningen pip [kort], pip [lang]. 142 00:09:07,350 --> 00:09:12,480 Hvilket budskap har jeg bare motta? En prikk og en strek. Hva representerer det? 143 00:09:12,480 --> 00:09:15,330 [Student] A. >> [Malan] Kanskje. 144 00:09:15,330 --> 00:09:18,270 Det kan også være E etterfulgt av T. 145 00:09:18,270 --> 00:09:23,390 Med andre ord, morse, selv om det benytter dette prinsippet optimalisere hjørnet tilfellet 146 00:09:23,390 --> 00:09:26,250 det ikke egner seg til umiddelbar decodability. 147 00:09:26,250 --> 00:09:29,850 Det vil si at mennesket som er å høre eller motta disse prikker og streker 148 00:09:29,850 --> 00:09:34,540 må liksom finne ut hvor pausene er mellom bokstaver, 149 00:09:34,540 --> 00:09:39,660 fordi hvis du ikke vet hvor disse pausene er, kan du forvirre A for ET eller vice versa. 150 00:09:39,660 --> 00:09:43,880 >> Så hva kan du gjøre? I morse kan du bare ta en pause mellom hver av bokstavene. 151 00:09:43,880 --> 00:09:47,660 Men pause er slags motsetning til hele poenget med å påskynde ting opp. 152 00:09:47,660 --> 00:09:52,880 Så hva om stedet vi kom opp med en kode der det ikke var så ille situasjonen 153 00:09:52,880 --> 00:09:56,570 hvor E er et prefiks for eksempel A - 154 00:09:56,570 --> 00:10:00,020 med andre ord, hvis vi kunne sørge for at oppskriftene er fortsatt kort for de populære bokstaver 155 00:10:00,020 --> 00:10:04,850 lang for de mindre populære bokstaver, men det er ikke mulig forvirring? 156 00:10:04,850 --> 00:10:08,930 En mann ved navn Huffman år siden oppfant denne ordningen kalles Huffman koding 157 00:10:08,930 --> 00:10:12,390 som utnytter faktisk en av de datastrukturer vi har brukt litt tid på å snakke om 158 00:10:12,390 --> 00:10:16,560 denne siste uken, som av trær, binære trær spesielt - 159 00:10:16,560 --> 00:10:19,710 et binært tre som betyr at den ikke har mer enn 2 barn. 160 00:10:19,710 --> 00:10:22,720 Det har kanskje en venstre barn, kanskje en høyre barn, og det er det. 161 00:10:22,720 --> 00:10:26,510 Så antar bare for moro skyld diskusjonen at noen ønsker å sende en melding 162 00:10:26,510 --> 00:10:31,270 som ser slik ut. Det er fullstendig meningsløst, men det er sammensatt av As, B, Cs, Ds, og Es. 163 00:10:31,270 --> 00:10:34,890 Og hvis du faktisk telle opp alle As, B, Cs, Ds, og Es 164 00:10:34,890 --> 00:10:36,870 og deretter dele på totalt antall brev, 165 00:10:36,870 --> 00:10:42,710 denne lille diagrammet her sier at 45% av bokstavene er Es, 20% er As, 166 00:10:42,710 --> 00:10:45,010 10% B, og så videre. 167 00:10:45,010 --> 00:10:47,330 Så med andre ord, antar at den oppgitte strengen der 168 00:10:47,330 --> 00:10:49,080 er bare noen melding om at du ønsker å sende. 169 00:10:49,080 --> 00:10:52,180 Det skjer for å være tull, så vi kan bruke så få bokstaver som mulig, 170 00:10:52,180 --> 00:10:55,220 men det er faktisk tilfelle at E er fortsatt det mest populære, 171 00:10:55,220 --> 00:11:01,450 og B og C er den minst populære, minst av disse 5 bokstavene i alfabetet. 172 00:11:01,450 --> 00:11:04,040 Så hvordan kan vi gå om å komme opp med en koding, 173 00:11:04,040 --> 00:11:08,430 en binær koding, et mønster av 0'er og 1'ere for hver av disse brevene 174 00:11:08,430 --> 00:11:14,820 på en slik måte at E er en kort mønster og kanskje B og C er litt lengre mønstre, 175 00:11:14,820 --> 00:11:19,270 igjen, ideen er at vi ønsker å bruke færre bits mesteparten av tiden 176 00:11:19,270 --> 00:11:21,790 og flere biter bare en gang på en stund. 177 00:11:21,790 --> 00:11:26,070 Ifølge Huffman koding, kan du opprette en skog av trær. 178 00:11:26,070 --> 00:11:31,190 Det er liksom en historie linje her som involverer trær og også prosessen med å bygge dem opp. 179 00:11:31,190 --> 00:11:32,420 La oss begynne. 180 00:11:32,420 --> 00:11:36,140 >> Jeg foreslår at du starter med denne skogen, så å si, av 5 trær, 181 00:11:36,140 --> 00:11:38,260 som hver er en ganske dum treet. 182 00:11:38,260 --> 00:11:42,800 Treet er sammensatt av kun en enkelt node, representert her ved en sirkel. 183 00:11:42,800 --> 00:11:45,310 Slik at hver av disse tingene kan være en C struct 184 00:11:45,310 --> 00:11:50,200 og innsiden av C struct kan være en flottør som representerer frekvens teller 185 00:11:50,200 --> 00:11:52,510 og så kanskje en røye som representerer bokstaven. 186 00:11:52,510 --> 00:11:56,470 Så tenk på disse nodene som bare noen gamle C struct, men for nå, høyere nivå. 187 00:11:56,470 --> 00:12:01,230 Dette er en skog av 5 trær, hver av som bare har én node. 188 00:12:01,230 --> 00:12:06,830 Hva Huffman foreslått er at vi begynner å kombinere disse trærne 189 00:12:06,830 --> 00:12:11,140 som har de minste frekvens teller inn litt større trær 190 00:12:11,140 --> 00:12:13,490 ved å koble dem med en ny rotnoden. 191 00:12:13,490 --> 00:12:17,560 Slik blant bokstavene her, merker at for enkelhets har jeg sortert dem fra venstre mot høyre, 192 00:12:17,560 --> 00:12:21,420 selv om det er strengt tatt ikke nødvendig, og merker at de minste noder 193 00:12:21,420 --> 00:12:23,930 er for tiden 10% og 10%. 194 00:12:23,930 --> 00:12:28,940 Så Huffman foreslått at vi flette disse to minste noder i et nytt tre 195 00:12:28,940 --> 00:12:34,450 ved å innføre en ny forelder node og deretter gi den forelderen en venstre barn og høyre barn 196 00:12:34,450 --> 00:12:37,720 hvor B er vilkårlig venstre og C er vilkårlig høyre. 197 00:12:37,720 --> 00:12:41,590 Og så Huffman videre foreslått at la oss nå bare tenke på den venstre barnet 198 00:12:41,590 --> 00:12:44,790 i ett av disse trær alltid som blir representert ved 0 199 00:12:44,790 --> 00:12:47,890 og rett barnet alltid som blir representert ved tallet 1. 200 00:12:47,890 --> 00:12:50,680 >> Det spiller ingen rolle om du snur dem så lenge du er konsekvent. 201 00:12:50,680 --> 00:12:54,650 Så nå har vi fire trær i denne skogen. 202 00:12:54,650 --> 00:12:58,050 Og jeg sier fire fordi nå treet til venstre - 203 00:12:58,050 --> 00:13:00,570 og det er ikke så mye et tre i den forstand at det vokser på denne måten, 204 00:13:00,570 --> 00:13:05,170 det er mer som en familie tre der nå 0,2 er liksom den overordnede av de to barna - 205 00:13:05,170 --> 00:13:07,930 merke til at i det overordnede har vi trukket 0,2. 206 00:13:07,930 --> 00:13:13,370 Vi har lagt til frekvenstellinger av de to barna og gitt den nye noden den totale summen. 207 00:13:13,370 --> 00:13:15,310 Så nå er vi bare gjenta denne prosessen. 208 00:13:15,310 --> 00:13:19,490 Finn de to minste noder og deretter bli med dem inn i et nytt tre 209 00:13:19,490 --> 00:13:21,380 og deretter gjenta prosessen videre. 210 00:13:21,380 --> 00:13:26,390 Akkurat nå har vi noen kandidater, 20%, 15%, og en annen 20%. 211 00:13:26,390 --> 00:13:29,780 I dette tilfellet har vi å bryte båndet. Vi kan gjøre det vilkårlig. 212 00:13:29,780 --> 00:13:31,540 Vi bør bare gjøre det konsekvent. 213 00:13:31,540 --> 00:13:33,760 I dette tilfellet vil jeg vilkårlig gå med den på venstre, 214 00:13:33,760 --> 00:13:39,880 og jeg nå slå sammen de 20% og 15% for å gi meg en ny forelder kalt 35%, 215 00:13:39,880 --> 00:13:46,310 hvis venstre barnet er 0, som rett barnet er 1, og nå har vi bare tre trær i skogen. 216 00:13:46,310 --> 00:13:47,960 Du kan kanskje se hvor dette går. 217 00:13:47,960 --> 00:13:51,150 Hvis vi gjentar dette et par ganger, vi kommer til å ha bare ett større tre, 218 00:13:51,150 --> 00:13:53,900 alle som kanter er merket med 0'er og 1'ere. 219 00:13:53,900 --> 00:13:55,710 La oss gjøre det igjen. 220 00:13:55,710 --> 00:14:02,600 35% er det treet rot. 20% og 45%, så vi kommer til å flette 35% og 20%. 221 00:14:02,600 --> 00:14:05,610 Nå har vi dette treet her. Vi legger dem sammen, har vi 55%. 222 00:14:05,610 --> 00:14:07,910 Nå er det bare to trær i skogen. 223 00:14:07,910 --> 00:14:11,900 Vi gjør dette en siste gang, og forhåpentligvis matematisk alle frekvenser legge opp 224 00:14:11,900 --> 00:14:15,570 fordi de skal siden vi beregnet dem fra get-go å legge opp til 100%. 225 00:14:15,570 --> 00:14:17,960 Og nå har vi ett tre. 226 00:14:17,960 --> 00:14:20,580 Så dette er en Huffman koding treet. 227 00:14:20,580 --> 00:14:24,400 Den slags tok en stund å komme dit verbalt, men realiteten er en for loop 228 00:14:24,400 --> 00:14:27,620 eller med en rekursiv funksjon, kan du bygge denne tingen opp ganske fort. 229 00:14:27,620 --> 00:14:32,440 Så nå har vi en ny node, og alle disse indre nodene er malloc'd, 230 00:14:32,440 --> 00:14:34,690 antagelig, underveis. 231 00:14:34,690 --> 00:14:38,650 Så nå på toppen av dette treet vi har 100%, men nå legger vi merke har en bane 232 00:14:38,650 --> 00:14:43,780 fra denne nye tipp-tipp-tipp oldefar til alle de tipp-oldebarn 233 00:14:43,780 --> 00:14:45,930 helt på bunnen, til alle bladene. 234 00:14:45,930 --> 00:14:52,840 >> Hva vi skal gjøre nå er å foreslå at for å representere bokstaven E, 235 00:14:52,840 --> 00:14:55,670 Vi vil bare bruke tallet 1. Hvorfor? 236 00:14:55,670 --> 00:15:01,000 Fordi hvis vi traversere dette treet fra den endelige roten ned til blad kjent som E, 237 00:15:01,000 --> 00:15:06,050 vi følger bare én kant, høyre kant, og som er merket selvfølgelig øverst til høyre en. 238 00:15:06,050 --> 00:15:11,550 Så konsekvensen her for Huffman var at E koding i binær skal bare være en. 239 00:15:11,550 --> 00:15:14,490 Og det er ganske forbanna effektiv. Kan egentlig ikke få noe mindre enn det. 240 00:15:14,490 --> 00:15:18,350 Derimot, er til å være representert, hvis du følger logikken, 241 00:15:18,350 --> 00:15:21,610 av hva mønster av biter i stedet? 01. 242 00:15:21,610 --> 00:15:25,500 Så for å komme til A, starter vi ved roten, og vi går til venstre og deretter går vi rett, 243 00:15:25,500 --> 00:15:28,580 som betyr at vi fulgt en 0 og deretter en 1. 244 00:15:28,580 --> 00:15:32,810 Så vi skal representere bokstaven A med mønsteret 0 og 1. 245 00:15:32,810 --> 00:15:36,010 Og nå ser vi allerede har en eiendom umiddelbar decodability 246 00:15:36,010 --> 00:15:38,090 at vi ikke har i morse. 247 00:15:38,090 --> 00:15:42,840 Selv om begge disse mønstrene er ganske kort - E er en bit, er en 2 biter - 248 00:15:42,840 --> 00:15:45,080 merke til at de ikke kan forveksles ene eller den andre, 249 00:15:45,080 --> 00:15:54,870 fordi hvis du ser en en det må være en E, hvis du ser en 0 deretter en 1 er det åpenbart må være en A. 250 00:15:54,870 --> 00:15:58,410 Tilsvarende, hva er D? 001. 251 00:15:58,410 --> 00:16:01,440 Hva er C? 0001. 252 00:16:01,440 --> 00:16:05,320 Og hva er B? 0000. 253 00:16:05,320 --> 00:16:09,550 Og igjen, fordi alle bokstavene vi bryr oss om er på bladene 254 00:16:09,550 --> 00:16:13,890 og ingen av dem er slags mellommenn i banen fra rot til blad, 255 00:16:13,890 --> 00:16:18,760 det er ingen fare for conflating 2 bokstaver 'forskjellige kodinger 256 00:16:18,760 --> 00:16:22,300 fordi alle disse bit mønster er deterministisk. 257 00:16:22,300 --> 00:16:25,280 0000 vil alltid være B. 258 00:16:25,280 --> 00:16:29,480 Det er ingen node et sted i mellom at du kan forvirre en bokstav for den andre. 259 00:16:29,480 --> 00:16:31,150 Så hva er konsekvensen her? 260 00:16:31,150 --> 00:16:35,080 >> Den mest populære brev - i dette tilfellet E - har fått den korteste koding, 261 00:16:35,080 --> 00:16:37,430 A har fått den nest korteste koding, 262 00:16:37,430 --> 00:16:41,390 og B og C, som vi allerede visste fra get-go var slags den minst populære 263 00:16:41,390 --> 00:16:45,390 ved 10% frekvens hver, har de fått lengst koding. 264 00:16:45,390 --> 00:16:49,410 Og så hva dette betyr nå er at hvis du ønsker å sende en melding som er komprimert 265 00:16:49,410 --> 00:16:51,950 over Internett eller i en e-post eller lignende, 266 00:16:51,950 --> 00:16:56,730 heller enn å bruke standard ASCII, kan du sende en Huffman kodet melding 267 00:16:56,730 --> 00:17:01,720 der hvis du ønsker å sende brevet E, sender du bare en enkelt bit. 268 00:17:01,720 --> 00:17:05,680 Hvis du ønsker å sende en A, sende deg to biter, 01, i stedet for å sende 8 bits 269 00:17:05,680 --> 00:17:10,190 etterfulgt av en annen 8 bits etterfulgt av en annen 8 biter og så videre. 270 00:17:10,190 --> 00:17:11,940 Men det er en fikser her. 271 00:17:11,940 --> 00:17:17,079 Det er ikke tilstrekkelig å bare bygge dette treet og deretter begynne å sende fra Alice til Bob 272 00:17:17,079 --> 00:17:20,010 kortere bit mønster, streng fra ASCII, 273 00:17:20,010 --> 00:17:23,140 fordi Alice har også å informere Bob av hva 274 00:17:23,140 --> 00:17:26,880 hvis Bob kommer til å være i stand til å lese hennes komprimert budskap? 275 00:17:26,880 --> 00:17:30,770 [Uhørlig student respons] >> Hva er det? 276 00:17:30,770 --> 00:17:32,310 [Uhørlig student respons] >> av hva treet er. 277 00:17:32,310 --> 00:17:35,160 Eller enda mer spesifikt, hva disse kodinger er, 278 00:17:35,160 --> 00:17:39,010 spesielt siden i løpet av denne historien gjorde vi en vurderingssak på ett punkt. 279 00:17:39,010 --> 00:17:43,640 Husk at vi måtte plukke vilkårlig mellom de to ulike 20% noder? 280 00:17:43,640 --> 00:17:49,800 Så det er ikke slik at Bob, mottaker, kan bare rekonstruere tre på sin egen 281 00:17:49,800 --> 00:17:53,390 fordi kanskje han vil skape treet aldri så litt annerledes fra Alice. 282 00:17:53,390 --> 00:17:56,670 Videre betyr Bob ikke engang vet hva den opprinnelige meldingen er 283 00:17:56,670 --> 00:18:00,770 fordi det eneste Alice sender ham, selvfølgelig, er den komprimerte meldingen. 284 00:18:00,770 --> 00:18:05,900 >> Så fangsten med kompresjon som dette er at, ja, kan Alice spare en hel masse biter 285 00:18:05,900 --> 00:18:09,900 ved å sende en til E og 01 for A og så videre, 286 00:18:09,900 --> 00:18:15,180 men hun har også å informere Bob hva kartleggingen er mellom bokstaver og biter 287 00:18:15,180 --> 00:18:19,620 fordi de ikke kan tydelig stole på bare ASCII lenger hvis vi ikke bruker ASCII. 288 00:18:19,620 --> 00:18:22,200 Slik at hun kan enten sende ham treet eller annen måte - 289 00:18:22,200 --> 00:18:26,600 skrive det ned, lagre det som binære data eller noe sånt - 290 00:18:26,600 --> 00:18:30,280 eller bare sende ham en liten jukselapp, en Excel-fil, som viser tilordningene. 291 00:18:30,280 --> 00:18:36,480 Så effekten av komprimering forutsetter egentlig at meldingene som du sender 292 00:18:36,480 --> 00:18:40,230 er ganske stor, minst mellomstore, 293 00:18:40,230 --> 00:18:42,180 fordi hvis du sender en super kort melding, 294 00:18:42,180 --> 00:18:45,390 Hvis du bare ønsker å sende meldingen BAD, som skjer for å være et ord vi kan stave her, 295 00:18:45,390 --> 00:18:49,550 B-A-D, er du sannsynligvis kommer til å bruke færre biter, 296 00:18:49,550 --> 00:18:53,130 men fangsten er hvis du må også informere Bob hva treet er 297 00:18:53,130 --> 00:18:57,530 eller hva disse kodinger er, du kommer til å sannsynligvis oppveie alle de besparelser 298 00:18:57,530 --> 00:19:00,110 av å ha komprimerte ting til å begynne med. 299 00:19:00,110 --> 00:19:02,210 Så det kan faktisk være slik at hvis du prøver å komprimere 300 00:19:02,210 --> 00:19:05,330 selv med noe som zip eller filformater kan du bli kjent med - 301 00:19:05,330 --> 00:19:07,780 ganske små filer, selv tomme filer - 302 00:19:07,780 --> 00:19:10,930 noen ganger disse filene kan bli større og ikke mindre. 303 00:19:10,930 --> 00:19:14,320 Men realistisk, det skjer bare for små filstørrelser, 304 00:19:14,320 --> 00:19:16,920 så det ikke kommer til å gjøre en gigabyte fil være 2 gigabyte; 305 00:19:16,920 --> 00:19:19,480 vi egentlig snakker byte eller bare et par kilobyte. 306 00:19:19,480 --> 00:19:22,330 >> Noen programmer som zip er smart nok til å innse at 307 00:19:22,330 --> 00:19:24,590 "Du kommer til å tilbringe flere biter komprimere dette." 308 00:19:24,590 --> 00:19:27,460 "La meg ikke bry komprimere det for deg i det hele tatt." 309 00:19:27,460 --> 00:19:30,160 Så dette er bare én måte så å komprimere tekstformat. 310 00:19:30,160 --> 00:19:32,300 Vi kunne gjennomføre noe sånt i C. 311 00:19:32,300 --> 00:19:35,370 For eksempel, her er hvordan vi kan representere en node i dette treet 312 00:19:35,370 --> 00:19:39,320 hvor vi har en char for symbolet, en flytende verdi for frekvensen, 313 00:19:39,320 --> 00:19:42,250 og som vi har sett med våre andre datastrukturer, 2 pekere, 314 00:19:42,250 --> 00:19:47,080 1 til venstre barnet, 1 til høyre, som begge kan være NULL, 315 00:19:47,080 --> 00:19:50,850 men hvis ikke, refererer det til en venstre barn og høyre barn. 316 00:19:50,850 --> 00:19:55,130 Så dette er da Huffman koding, og det er en måte at du kan gå om å komprimere informasjon, 317 00:19:55,130 --> 00:19:57,880 og det er absolutt en av de mest lett å implementere 318 00:19:57,880 --> 00:20:00,830 i sammenheng med, sier forrige ukes datastrukturer, 319 00:20:00,830 --> 00:20:03,250 men enda mer avanserte algoritmer eksisterer 320 00:20:03,250 --> 00:20:08,220 som kan gjøre enda mer sofistikerte mutasjoner av dine data. 321 00:20:08,220 --> 00:20:11,640 Eventuelle spørsmål deretter på trær, binære trær, eller komprimering av tekst? 322 00:20:11,640 --> 00:20:15,590 [Student] Er det noen tvetydighet, som om [hørbar] delt inn i 01, 323 00:20:15,590 --> 00:20:19,160 deretter 011 ville være tvetydige, ikke sant? 324 00:20:19,160 --> 00:20:22,730 [Uhørlig] >> Godt spørsmål. Tvetydighet. 325 00:20:22,730 --> 00:20:25,940 La meg oppsummere ved å henvise til dette bildet her. 326 00:20:25,940 --> 00:20:29,650 Fordi tegnene du komprimere, representasjoner av, 327 00:20:29,650 --> 00:20:32,850 per definisjon av denne algoritmen alltid forbli bladene, 328 00:20:32,850 --> 00:20:41,870 du aldri uhell bruke samme mønster av biter for prefikset av flere bokstaver. 329 00:20:41,870 --> 00:20:46,740 Så med andre ord, er du bekymret, det høres ut som, en tvetydighet som oppstår 330 00:20:46,740 --> 00:20:51,580 der 001 kan være starten på B eller begynnelsen av C eller noe sånt. 331 00:20:51,580 --> 00:20:56,780 Men det kan ikke være tilfelle fordi varsel om at alle bokstavene i alfabetet vi koding 332 00:20:56,780 --> 00:20:58,290 er på bladene. 333 00:20:58,290 --> 00:21:01,910 >> Tvetydigheten kan bare oppstå, som i tilfelle av morse, 334 00:21:01,910 --> 00:21:06,770 hvis du for eksempel var C sted langs stien fra roten til B. 335 00:21:06,770 --> 00:21:12,290 [Student] Høyre. Så i så fall, si A har 2 blader. >> Say A har - Si det igjen. 336 00:21:12,290 --> 00:21:18,760 [Student] Say A har 2 blader, F og G, og deretter G - >> OK. Men det kan ikke. 337 00:21:18,760 --> 00:21:23,230 En selv kunne ikke ha bladene F og G fordi disse bokstavene F og G 338 00:21:23,230 --> 00:21:27,560 selv ville være forlater sted til venstre for B eller høyre av E. 339 00:21:27,560 --> 00:21:28,900 Så per definisjon, må de være blader. 340 00:21:28,900 --> 00:21:32,940 Ellers er du helt riktig, har vi ikke løst problemet med at morse ansikter. 341 00:21:32,940 --> 00:21:38,150 Godt spørsmål. Andre spørsmål? All høyre. 342 00:21:38,150 --> 00:21:42,050 Denne oppfatningen av biter, viser det seg at vi har hatt makten hele tiden at vi ikke har faktisk brukt 343 00:21:42,050 --> 00:21:44,200 når det kom til å manipulere disse 0'er og 1'ere. 344 00:21:44,200 --> 00:21:46,600 Vi spurte om dette på en av de tidligste oppgavesett: 345 00:21:46,600 --> 00:21:52,340 nemlig, hvordan du går om å konvertere store til små bokstaver eller omvendt? 346 00:21:52,340 --> 00:21:55,460 Eller, mer konkret, spurte en av de første psets 347 00:21:55,460 --> 00:22:01,090 hvor mange biter trenger du faktisk nødt til å vende for å endre A til små bokstaver a eller vice versa? 348 00:22:01,090 --> 00:22:05,580 Her er en rask påminnelse om hva 65 og 97 ser ut i binær. 349 00:22:05,580 --> 00:22:08,060 Og selv om det spørsmålet har liksom bleknet i minnet, 350 00:22:08,060 --> 00:22:11,290 du kan se igjen her at hvor mange biter må venda 351 00:22:11,290 --> 00:22:15,810 å endre kapital A til små bokstaver a? Bare ett. 352 00:22:15,810 --> 00:22:19,650 >> Den eneste forskjellen på ett sted, den tredje biten fra venstre. 353 00:22:19,650 --> 00:22:24,240 Mens A har en 010, litt a har en 011. 354 00:22:24,240 --> 00:22:26,250 Så noe må vi bare være i stand til å snu det litt, 355 00:22:26,250 --> 00:22:29,410 og vi kan da utnytte eller små bokstaver. 356 00:22:29,410 --> 00:22:32,720 Vi har gjort dette i det siste ved å bruke nettopp dersom forholdene 357 00:22:32,720 --> 00:22:35,930 og sjekke om bokstaven er mellom kapital A og kapital Z, 358 00:22:35,930 --> 00:22:41,480 deretter utganger som A - a + 26 eller noe sånt. 359 00:22:41,480 --> 00:22:46,130 Du gjorde en aritmetisk endring bokstavene i alfabetet. 360 00:22:46,130 --> 00:22:49,270 Men hva om vi kunne bare snu det eneste bit? 361 00:22:49,270 --> 00:22:59,080 Hvordan kunne du gå om å ta en byte er verdt av biter, så 8 bits som 01000001 og 01100001? 362 00:22:59,080 --> 00:23:03,170 Hvis du hadde disse punktmønstre, hvordan kan vi gå om endring bare en av dem? 363 00:23:03,170 --> 00:23:07,610 Hva om vi innfører i gult her denne andre mønster av biter? 364 00:23:07,610 --> 00:23:13,420 Hvis jeg gjør hele gule streng 0s bortsett fra for en bit som jeg ønsker å endre 365 00:23:13,420 --> 00:23:17,900 og da jeg introdusere en ny operatør kjent som en bitvis operator - 366 00:23:17,900 --> 00:23:21,210 bitvis i den forstand at den opererer på individuelle biter, 367 00:23:21,210 --> 00:23:25,360 ikke på en hel byte eller fire byte alle samtidig. 368 00:23:25,360 --> 00:23:31,170 Denne vertikale linjen der i gult tyder på at hva om vi tar representasjon av kapital A 369 00:23:31,170 --> 00:23:37,060 og bitvis OR det med den gule sekvens av biter? 370 00:23:37,060 --> 00:23:41,300 Med andre ord, tenke tilbake til vår diskusjon av boolske uttrykk i Scratch og deretter i C. 371 00:23:41,300 --> 00:23:47,520 >> Gjør en boolsk eller betyr at for å være sant, enten det første har til å være sant 372 00:23:47,520 --> 00:23:50,700 eller andre ting er å være sant, eller de begge har til å være sant, 373 00:23:50,700 --> 00:23:53,270 og deretter den resulterende utgang er selve sant. 374 00:23:53,270 --> 00:24:00,230 I dette tilfellet her, hva vi får hvis vi tar 0 "eller" ed med 0? Falsk eller usant? 375 00:24:00,230 --> 00:24:04,280 Det er fortsatt falsk, så små en fortsatt som forventet. 376 00:24:04,280 --> 00:24:07,540 Hva om vi i stedet gjør 1 eller 0? 377 00:24:07,540 --> 00:24:12,640 Dette gjenstår nå 1, men merker hva som er i ferd med å skje her. 378 00:24:12,640 --> 00:24:18,630 Hvis vi starter med kapital A og vi fortsetter å "eller" de enkelte biter som vi gjør her, 379 00:24:18,630 --> 00:24:25,180 0 eller den gule gir oss det her nede? Dette gir oss en. 380 00:24:25,180 --> 00:24:35,120 Faktisk antar vi visste ikke hva det store versjonen av liten en egentlig var. 381 00:24:35,120 --> 00:24:38,270 La oss gå gjøre dette. La meg flytte dette tilbake over her. 382 00:24:38,270 --> 00:24:42,340 La oss gjøre dette igjen. 0 eller 0 gir meg 0. 383 00:24:42,340 --> 00:24:45,020 1 eller 0 gir meg en. 384 00:24:45,020 --> 00:24:48,020 0 eller 1 gir meg 1. 385 00:24:48,020 --> 00:24:52,880 0 eller 0 gir meg 0. Den neste er 0, den neste er 0, er den neste 0. 386 00:24:52,880 --> 00:24:55,660 1 eller 0 gir meg en. 387 00:24:55,660 --> 00:24:59,140 Og så selv om vi ikke vet på forhånd hva små bokstaver en var, 388 00:24:59,140 --> 00:25:04,770 ganske enkelt ved å "eller" ing A med dette mønsteret av biter som vi har presentert her i gult, 389 00:25:04,770 --> 00:25:09,400 du kan små bokstaver en kapital A ved å bla det litt. 390 00:25:09,400 --> 00:25:11,580 Vi brukte dette uttrykket uker siden: bla litt. 391 00:25:11,580 --> 00:25:13,710 Hvordan kan du faktisk gjøre det programmatisk? 392 00:25:13,710 --> 00:25:16,390 Du bruker det som vanligvis kalles en maske, en sekvens av biter, 393 00:25:16,390 --> 00:25:19,980 at i dette tilfellet bare så skjer for å se ut som dette nummeret her, 394 00:25:19,980 --> 00:25:22,980 og du "eller" det sammen med denne nye C operatør, 395 00:25:22,980 --> 00:25:29,940 ikke | |, bruker du et enkelt | og du vil faktisk få dette svaret her fordi hvorfor? 396 00:25:29,940 --> 00:25:35,120 Dette er det 1s sted, 2s sted, 4S, 8S, 16S, 32s. 397 00:25:35,120 --> 00:25:42,280 Så det viser seg at hvis du tar en stor bokstav A og bitvis OR den med heltall 32, 398 00:25:42,280 --> 00:25:47,520 fordi heltall 32, når du ser på det som biter, ser slik ut, 399 00:25:47,520 --> 00:25:50,860 som betyr at du kan snu litt på at du faktisk ønsker. 400 00:25:50,860 --> 00:25:52,630 Og tilsvarende - og vi skal se på koden i løpet av et øyeblikk - 401 00:25:52,630 --> 00:25:54,210 anta vi ønsker å gå den andre retningen. 402 00:25:54,210 --> 00:25:58,210 >> Hvordan du går fra små en til kapital A? Hvilken bit må endres? 403 00:25:58,210 --> 00:25:59,820 Det er den samme. 404 00:25:59,820 --> 00:26:03,970 Vi ønsker å endre det tredje bit fra en 1 til 0. 405 00:26:03,970 --> 00:26:06,310 Og hvordan kan vi gå om du gjør dette? 406 00:26:06,310 --> 00:26:10,130 Hvordan slår vi av litt? Med hva mønster av biter kan vi slå av litt? 407 00:26:11,580 --> 00:26:14,070 Hva om vi liksom snu masken? 408 00:26:14,070 --> 00:26:17,350 Mens før, gjorde vi hele gule masken 0s 409 00:26:17,350 --> 00:26:19,930 med unntak av én bit ønsket vi å slå på, 410 00:26:19,930 --> 00:26:25,580 hva om denne gangen, gjør vi hele masken 1s bortsett litt at vi ønsker å slå av 411 00:26:25,580 --> 00:26:28,330 og deretter bruke det operatør? 412 00:26:28,330 --> 00:26:30,560 Hva om vi "og" ting? La oss ta en titt. 413 00:26:30,560 --> 00:26:34,880 Hvis vi nå snu til dette, antar at jeg igjen lage en maske som er alt 1s 414 00:26:34,880 --> 00:26:37,650 med unntak av én bit som jeg ønsker å slå av 415 00:26:37,650 --> 00:26:43,860 og deretter heller enn "eller" de hvite tallene opp toppen med de gule tall her nede, 416 00:26:43,860 --> 00:26:46,940 hva om jeg i stedet "og" dem sammen? Det kalles en bitvis og. 417 00:26:46,940 --> 00:26:49,450 Logisk, er det det samme som en boolsk og. 418 00:26:49,450 --> 00:26:55,160 Dette gir meg 0 og 1 er 0. Så falsk og ekte er falsk. 419 00:26:55,160 --> 00:26:58,160 Sant og ekte er sant. 420 00:26:58,160 --> 00:27:04,020 Og her er det magiske: sant og usant er nå falsk, så vi har slått av at bit. 421 00:27:04,020 --> 00:27:06,560 Og nå resten av historien er noe enkel. 422 00:27:06,560 --> 00:27:11,970 Fordi resten av masken er 1s, spiller det ingen rolle hva tallene er i hvitt. 423 00:27:11,970 --> 00:27:15,580 Når du "og" noe med sann, er du ikke kommer til å endre verdien. 424 00:27:15,580 --> 00:27:20,200 Hvis det er sant, vil det forbli sant. Hvis det var falsk, vil den forbli falsk. 425 00:27:20,200 --> 00:27:23,190 >> Men den magiske skjer når du tar noe som var sant 426 00:27:23,190 --> 00:27:25,430 og du deretter "og" det med falsk. 427 00:27:25,430 --> 00:27:30,030 Dette har effekten av å slå av at litt. 428 00:27:30,030 --> 00:27:31,980 Så en liten kryptisk der. 429 00:27:31,980 --> 00:27:35,390 La oss faktisk ser på noen kode, som kan faktisk se enda mer kryptisk, 430 00:27:35,390 --> 00:27:38,220 men la oss ta en titt her på tolower. 431 00:27:38,220 --> 00:27:45,880 Hvis jeg ser på tolower, kommer fra hovedstaden A til små bokstaver a, 432 00:27:45,880 --> 00:27:47,730 la oss se hvordan vi kan implementere dette programmet. 433 00:27:47,730 --> 00:27:51,280 Her er viktigste, og det er ikke å ta noen kommandolinjeargumenter. 434 00:27:51,280 --> 00:27:55,980 Jeg erklærer en karakter c for brevet som brukeren kommer til å skrive i. 435 00:27:55,980 --> 00:28:00,690 Jeg deretter bruke en kjent do mens loop å bare sørge for at brukeren definitivt gir meg en kapital A 436 00:28:00,690 --> 00:28:05,010 eller B eller C. .. Z, slik at de gir meg noe mellom A og Z. 437 00:28:05,010 --> 00:28:08,580 Og nå hva gjør jeg her? 438 00:28:08,580 --> 00:28:14,870 Jeg er "eller" ing dette med 0x20, men det er faktisk det samme som - 439 00:28:14,870 --> 00:28:19,500 og vi vil komme tilbake til dette i et øyeblikk - 32. 440 00:28:19,500 --> 00:28:24,830 Så igjen, er 32 dette mønsteret biter her. Hvorfor vet vi dette? 441 00:28:24,830 --> 00:28:26,320 Bare tenk tilbake til uke 0. 442 00:28:26,320 --> 00:28:31,010 Dette er det 1s sted, 2s sted, 4s, 8S, 16S, 32s sted. 443 00:28:31,010 --> 00:28:33,470 Så dette gule tall skjer for å være 32. 444 00:28:33,470 --> 00:28:40,570 Da kan jeg ta med et brev som røye her, bitvis "eller" det med bokstavelig talt nummer 32, 445 00:28:40,570 --> 00:28:45,250 og hva får jeg tilbake? Små bokstaver versjon av røye. 446 00:28:45,250 --> 00:28:48,830 For et øyeblikk siden, men uttrykte jeg dette i en annen base notasjon. 447 00:28:48,830 --> 00:28:51,370 Hva gjorde dette representerer? >> [Student] Heksadesimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Dette skjer for å representere heksadesimal. 449 00:28:53,050 --> 00:28:55,170 Vi har ikke snakket om heksadesimal alle så mye, 450 00:28:55,170 --> 00:28:57,330 men det er faktisk praktisk i tilfeller som dette. 451 00:28:57,330 --> 00:29:01,730 >> Selv om det ser mer komplisert og selv om det ser ut som 20 og ikke 32, 452 00:29:01,730 --> 00:29:06,240 det viser seg at heksadesimal er faktisk super praktisk notasjon 453 00:29:06,240 --> 00:29:10,810 fordi i heksadesimal hvert siffer etter 0x - og dette betyr ingenting; 454 00:29:10,810 --> 00:29:13,960 dette er bare menneskelig konvensjonen som sier her kommer et heksadesimalt tall - 455 00:29:13,960 --> 00:29:18,590 hver av disse sifre er de to og deretter 0, kan selv være representert 456 00:29:18,590 --> 00:29:20,800 med nøyaktig 4 biter. 457 00:29:20,800 --> 00:29:27,840 Så hvis vi gjør dette, la meg åpne opp en tekst editor her - merkelig autofullfør - 458 00:29:27,840 --> 00:29:35,940 hvis vi gjør en liten tekst editor her, betyr at antall 0x20 her er 4 biter, her er en annen 4 biter. 459 00:29:35,940 --> 00:29:38,050 La oss gjøre den høyre 4 biter først. 460 00:29:38,050 --> 00:29:44,690 0 når representert med 4 biter er hva? Super lett. Bare alle 0s. 461 00:29:44,690 --> 00:29:46,780 Så 4 biter som 0s. 462 00:29:46,780 --> 00:29:53,510 Hvordan representerer du 2? Det har gått en stund siden vi gjorde dette, men det er 0100. 463 00:29:53,510 --> 00:29:57,310 Så dette er 1s sted, er dette 2s sted, og da er det ingen rolle hva de andre stedene er. 464 00:29:57,310 --> 00:30:00,610 Med andre ord, i heksadesimal kan du si 0x20, 465 00:30:00,610 --> 00:30:04,340 men hvis du da tenker på hva som er de 2 og hvordan er de representert i binær, 466 00:30:04,340 --> 00:30:07,130 hva er 0 og hvordan er de representert i binær, 467 00:30:07,130 --> 00:30:10,440 svarene på disse spørsmålene er dette og dette, henholdsvis. 468 00:30:10,440 --> 00:30:14,380 Så 0x20 skjer for å representere dette mønsteret av 8 bits, 469 00:30:14,380 --> 00:30:16,880 som er nettopp masken som vi ønsket. 470 00:30:16,880 --> 00:30:20,140 Så dette er for øyeblikket bare en intellektuell øvelse, 471 00:30:20,140 --> 00:30:24,520 men realiteten er i koden er det vanligvis mer vanlig å skrive konstanter som dette 472 00:30:24,520 --> 00:30:28,360 i heksadesimalt fordi da programmerer kan relativt enkelt, 473 00:30:28,360 --> 00:30:32,560 selv om det krever litt papir og blyant, finne ut hva som mønster av biter er 474 00:30:32,560 --> 00:30:35,960 fordi du kan ikke bare uttrykke 0'er og 1'ere typisk i koden. 475 00:30:35,960 --> 00:30:38,540 Du kan ikke gå 00010 og så videre. 476 00:30:38,540 --> 00:30:42,380 >> Du må velge desimal eller heksadesimal eller oktal eller andre merknader. 477 00:30:42,380 --> 00:30:47,540 De fleste mennesker har en tendens til å plukke heksadesimale bare slik at hvert siffer representerer fire biter 478 00:30:47,540 --> 00:30:49,320 og du kan gjøre dette raskt matematikk. 479 00:30:49,320 --> 00:30:54,990 Og jeg vil vinke min hånd på toupper, som er nesten det samme, det ser nesten identiske. 480 00:30:54,990 --> 00:31:01,900 Toupper skjer bruker ikke eller operatør, men heller denne fyren og df. 481 00:31:01,900 --> 00:31:09,300 Hva representerer df? df? Anyone? >> [Student] 255. 482 00:31:09,300 --> 00:31:12,780 255? Ikke 255. Det ville være ff. 483 00:31:12,780 --> 00:31:15,210 Vi vil forlate dette som en liten øvelse. 484 00:31:15,210 --> 00:31:23,460 Men hvis du går fra 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, og deretter hva som kommer etter 9? 485 00:31:23,460 --> 00:31:26,510 Vi er slags ut av desimaler, men i heksadesimalt hva som kommer etter 9? 486 00:31:26,510 --> 00:31:29,510 [Student] en. >> Så a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Du kan finne ut fra det hva mønster av biter d faktisk representerer. 488 00:31:33,470 --> 00:31:38,850 Og hvis vi gjør regnestykket, vil vi se at masken du ender opp med å få tilbake er identisk med denne. 489 00:31:38,850 --> 00:31:45,580 Dette er f, alt 1s, og dette er d. Så df representerer den masken. All høyre. 490 00:31:45,580 --> 00:31:50,980 Og til slutt, for ikke å gjøre ting høres super, super teknisk, 491 00:31:50,980 --> 00:31:53,840 men antar vi ønsket å skrive et program som gjør dette. 492 00:31:53,840 --> 00:31:58,960 La meg gå videre og gjøre binære, som er et program i en fil kalt binary.c. 493 00:31:58,960 --> 00:32:02,050 Og nå la meg kjøre binære og gi meg et ikke-negativt heltall. 494 00:32:02,050 --> 00:32:03,960 La oss starte enkelt og skriv inn 0. 495 00:32:03,960 --> 00:32:09,010 Dette er nå et program som skriver ut et heltall i den binære representasjon. 496 00:32:09,010 --> 00:32:13,470 Så hvis jeg spiller dette spillet igjen og skrive bare 1, skal jeg få en 32-bit representasjon av en. 497 00:32:13,470 --> 00:32:15,490 Hvis jeg gjør dette igjen med 2, bør jeg få det. 498 00:32:15,490 --> 00:32:19,310 Hvis jeg gjør 7, skal jeg få noen 1s på slutten og så videre. 499 00:32:19,310 --> 00:32:22,740 Det viser seg at jeg nevner dette fordi med bitvis operasjoner 500 00:32:22,740 --> 00:32:25,490 du faktisk kan gjøre en annen ting også. 501 00:32:25,490 --> 00:32:29,130 Du kan opprette disse maskene dynamisk. 502 00:32:29,130 --> 00:32:32,800 Ta en titt på denne siste eksempel involverer bitvis operasjoner. 503 00:32:32,800 --> 00:32:35,490 Her er første del av koden, spør brukeren om et tall, 504 00:32:35,490 --> 00:32:38,130 og det insisterer på at du gir meg et ikke-negativt heltall. 505 00:32:38,130 --> 00:32:39,780 Så det er liksom gamle skole ting. 506 00:32:39,780 --> 00:32:41,980 Men her er noe som er ganske interessant. 507 00:32:41,980 --> 00:32:44,910 >> Hvordan går jeg om å skrive ut et nummer i binære? 508 00:32:44,910 --> 00:32:48,970 Jeg først iterate fra hva til hva? 509 00:32:48,970 --> 00:32:52,270 Hva er størrelsen på en int typisk, i hvert fall i oppvaskmaskinen? >> [Student] 4. 510 00:32:52,270 --> 00:32:57,130 Det er fire. Så 4 * 8 er 32 - 1 er 31. 511 00:32:57,130 --> 00:33:02,590 Så hvis jeg begynner å telle fra 31, representerer det, det viser seg, 512 00:33:02,590 --> 00:33:07,630 bare konseptuelt, den 31. bit eller høyeste orden bit, som er denne fyren over her, 513 00:33:07,630 --> 00:33:09,650 mens dette kommer til å være litt 0. 514 00:33:09,650 --> 00:33:12,850 Så dette er litt 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Så hva er denne koden gjør? 516 00:33:14,950 --> 00:33:20,140 Merke dette for loop, selv om det ser kryptisk, er bare gjentar fra 31 ned til 0. Det var det. 517 00:33:20,140 --> 00:33:24,530 Så den interessante delen nå må være i disse 5 linjer her. 518 00:33:24,530 --> 00:33:28,110 Legg merke til at i denne linjen jeg erklære en variabel kalt maske 519 00:33:28,110 --> 00:33:30,790 å være i samsvar med vår historie av disse gule tall. 520 00:33:30,790 --> 00:33:32,200 Og hva er dette med? 521 00:33:32,200 --> 00:33:35,720 Dette er en annen bitvis operatør vi ikke har sett før, mest sannsynlig. 522 00:33:35,720 --> 00:33:38,300 Det er den venstre skifte operatør. 523 00:33:38,300 --> 00:33:40,060 Denne operatøren gjør dette. 524 00:33:40,060 --> 00:33:44,920 Her er nummer 1, og hvis du gjør jeg forlot skift, venstre shift, 525 00:33:44,920 --> 00:33:49,260 hva tror du som har effekten av å gjøre til den enkelte 1? 526 00:33:49,260 --> 00:33:51,290 Bokstavelig skiftende det over. 527 00:33:51,290 --> 00:33:57,540 Så hvis nummer 1 er det du har på venstre og du begynner ved å initialisere jeg til 31, 528 00:33:57,540 --> 00:34:03,490 hva kommer det til å gjøre? Det kommer til å ta dette nummer 1 og skift den 31 steder over her. 529 00:34:03,490 --> 00:34:06,210 Og fordi det er det tydeligvis ingen andre siffer bak det, 530 00:34:06,210 --> 00:34:10,350 de vil som standard bli erstattet med 0s. 531 00:34:10,350 --> 00:34:15,120 Så du vil starte med tallet 1, som selvfølgelig ser slik ut - 532 00:34:15,120 --> 00:34:18,659 og la meg trekke den over her i sentrum. 533 00:34:18,659 --> 00:34:22,139 Og deretter som du flytter ting til venstre, går denne fyren egentlig denne måten. 534 00:34:22,139 --> 00:34:24,659 Men så snart du gjør det, blir en 0 fylt i. 535 00:34:24,659 --> 00:34:28,360 Hvis du flytter den en gang til, går det på denne måten, og en annen 0 blir fylt i. 536 00:34:28,360 --> 00:34:31,000 >> Du skifte den igjen og deretter en annen 0 blir fylt i. 537 00:34:31,000 --> 00:34:37,900 Så hvis du gjør dette av en << I 31 steder, ender du opp med å få en maske 538 00:34:37,900 --> 00:34:42,550 som er 32 tegn, lengst til venstre en av disse er en 1, 539 00:34:42,550 --> 00:34:45,199 alle, hvorav resten er en 0. 540 00:34:45,199 --> 00:34:50,880 Og det viser seg, som en side, skiftende et nummer til venstre som dette 541 00:34:50,880 --> 00:34:53,530 også tilfeldig, og noen ganger praktisk, 542 00:34:53,530 --> 00:34:57,520 har effekten av å gjøre det til det nummeret? >> [Student] Dobling det. 543 00:34:57,520 --> 00:35:00,980 Dobling det fordi hver av kolonnene - det 1s sted, 2s sted, 4s sted, 544 00:35:00,980 --> 00:35:05,030 8s sted, 16s sted - de er alle dobling som du går til venstre. 545 00:35:05,030 --> 00:35:09,500 Eller rettere sagt, når du flytter 1s du kommer til å ende opp med doble verdien av nummeret. 546 00:35:09,500 --> 00:35:12,070 Du kan ende opp med å gjøre interessante transformasjoner av sifre 547 00:35:12,070 --> 00:35:15,640 av skiftende alt over på denne måten ved potenser av 2. 548 00:35:15,640 --> 00:35:17,150 Så hvordan fungerer dette? 549 00:35:17,150 --> 00:35:22,580 Dette gir da meg en maske som er alt 0s bortsett fra en en i nøyaktig sted jeg ønsker det, 550 00:35:22,580 --> 00:35:27,920 og deretter dette uttrykket, som er stjålet fra toupper.c, 551 00:35:27,920 --> 00:35:31,770 er bare å si ta nummeret n at brukeren har skrevet inn, 552 00:35:31,770 --> 00:35:34,730 "Og" det med at masken, og hva skal du bli? 553 00:35:34,730 --> 00:35:39,200 Du kommer til å få en 1 hvis det er en 1 i den maskerte beliggenhet, 554 00:35:39,200 --> 00:35:41,570 eller du kommer til å få en 0 hvis det ikke. 555 00:35:41,570 --> 00:35:44,370 Og så alt dette programmet gjør er effektivt det har en loop, 556 00:35:44,370 --> 00:35:48,340 og det skaper en maske med en 1 over her, så en 1 over her, så en 1 over her, 557 00:35:48,340 --> 00:35:52,950 og den bruker denne bitvis AND trikset å si er det en 1 bit i brukerens input her? 558 00:35:52,950 --> 00:35:59,220 >> Er det en 1 bit i brukerens input her? Og hvis så, bokstavelig talt ut en, ellers ut 0. 559 00:35:59,220 --> 00:36:03,780 Vi gjør dette med ints bare fordi det er derfor vi gjør 32 bits i stedet for 8, 560 00:36:03,780 --> 00:36:06,900 men hva vi har introdusert så er dette bitvis AND, dette bitvis OR, 561 00:36:06,900 --> 00:36:10,450 og denne venstre skifte operatør, som er ikke ofte veldig nyttig, 562 00:36:10,450 --> 00:36:12,230 men det viser seg at de kan være. 563 00:36:12,230 --> 00:36:16,560 Faktisk, hvis du skulle representere noe som en rekke boolske 564 00:36:16,560 --> 00:36:21,260 bare for å representere sant eller usant, antar du ønsket å holde styr på hvorvidt 565 00:36:21,260 --> 00:36:24,630 et rom fullt av 300 studenter er til stede, 566 00:36:24,630 --> 00:36:29,420 du kunne erklære en rekke størrelse 300 av typen bool slik at du får 300 bools, 567 00:36:29,420 --> 00:36:33,090 og du kan sette hver til true hvis noen er her og falsk ellers. 568 00:36:33,090 --> 00:36:37,550 Hvorfor er det representasjon i at data struktur ineffektiv? 569 00:36:39,370 --> 00:36:44,800 Hva er dårlig om utformingen av den datastrukturen, en rekke 300 bools? 570 00:36:46,190 --> 00:36:49,600 Hva er en bool, faktisk, under panseret? 571 00:36:49,600 --> 00:36:52,310 Også dette er noe som kanskje ikke er kjent. 572 00:36:52,310 --> 00:36:53,720 Det viser seg at det ikke er noen bool. 573 00:36:53,720 --> 00:36:56,620 Husk vi liksom skapt at med cs50.h fil, 574 00:36:56,620 --> 00:36:58,630 som selv har standard bool. 575 00:36:58,630 --> 00:37:00,930 C er slags dum, men når det kommer til bool. 576 00:37:00,930 --> 00:37:04,880 Den bruker 8 bits for å representere hver bool, som er helt bortkastet 577 00:37:04,880 --> 00:37:09,040 fordi åpenbart, hvor mange biter du trenger å representere en bool? Bare 1. 578 00:37:09,040 --> 00:37:13,190 Så det viser seg at hvis du har nå muligheten med bitvis operatører 579 00:37:13,190 --> 00:37:17,760 å manipulere individuelle biter selv i en char, selv i en enkelt byte, 580 00:37:17,760 --> 00:37:21,380 det viser seg at du kan redusere minnet som kreves for å representere noe dumt 581 00:37:21,380 --> 00:37:25,490 sånn frammøte stylet datastruktur med en faktor på 8. 582 00:37:25,490 --> 00:37:29,820 I stedet for å bruke åtte biter til å representere sant eller usant, kan du bokstavelig talt bruke en 583 00:37:29,820 --> 00:37:34,500 ved hjelp av en enkelt byte for hver åttende studenter i klassen 584 00:37:34,500 --> 00:37:41,990 og veksling 0-1 individuelle biter ved hjelp av disse typer lavt nivå triks. 585 00:37:43,850 --> 00:37:49,460 Som virkelig satt en stopper for energi. Er det noen spørsmål om bitvis operasjoner? 586 00:37:49,460 --> 00:37:52,710 >> Ja. >> [Student] Er det en eksklusiv eller operatør? 587 00:37:52,710 --> 00:37:56,440 Ja. Det er en eksklusiv eller operatør som ser slik ut, ^, gulrot symbol, 588 00:37:56,440 --> 00:38:02,070 som betyr at bare den første eller den andre ting kan være en 1 for utgangen til være en 1. 589 00:38:02,070 --> 00:38:07,750 Det er også en ikke ~, som vil tillate deg å invertere en 0 til en 1 eller vice versa, så vel. 590 00:38:07,750 --> 00:38:11,600 Og det er også en høyre shift operatør, >>, som er det motsatte av det vi så. 591 00:38:11,600 --> 00:38:13,850 All høyre. La oss ta ting nå til et høyere nivå. 592 00:38:13,850 --> 00:38:16,770 Vi begynte med å snakke om tekst og deretter komprimere den 593 00:38:16,770 --> 00:38:19,650 og representerer teksten med færre antall biter; 594 00:38:19,650 --> 00:38:22,890 Vi snakket litt om hvordan vi kan nå begynne å manipulere ting på en bitvis nivå. 595 00:38:22,890 --> 00:38:26,640 La oss nå zoome opp 10.000 fot til representasjon 596 00:38:26,640 --> 00:38:29,250 av mer komplekse ting som grafikk. 597 00:38:29,250 --> 00:38:32,950 Her har vi et flagg i Tyskland, her har vi en av Frankrike. 598 00:38:32,950 --> 00:38:36,350 Disse kan være representert i filformater du kanskje kjenner - GIF, for eksempel. 599 00:38:36,350 --> 00:38:40,030 Hvis du noensinne har sett et bilde på nettet som slutter på. Gif, 600 00:38:40,030 --> 00:38:43,000 Dette er en Graphics Interchange Format. 601 00:38:43,000 --> 00:38:47,530 Disse to flagg her slags egner seg til komprimering 602 00:38:47,530 --> 00:38:52,050 for hva kanskje åpenbar grunn? >> [Uhørlig student respons] 603 00:38:52,050 --> 00:38:53,440 Det er mye repetisjon, ikke sant? 604 00:38:53,440 --> 00:38:57,270 For å sende Tysklands flagg, tenk på dette som et bilde på skjermen 605 00:38:57,270 --> 00:38:59,030 tilbake i Scratch dager. 606 00:38:59,030 --> 00:39:02,380 Du husker kanskje at det er individuelle piksler eller punkter som komponerer et bilde. 607 00:39:02,380 --> 00:39:06,650 >> Det er en hel rad av svarte prikker og en annen hele rad av svarte prikker. 608 00:39:06,650 --> 00:39:10,110 Det er en haug med rader av sorte prikker som vi kunne se om vi virkelig har zoomet inn, 609 00:39:10,110 --> 00:39:13,370 mye som når vi zoomet inn på Rob ansikt i Photoshop. 610 00:39:13,370 --> 00:39:15,500 Så snart vi kom dypere og dypere og dypere inn i bildet, 611 00:39:15,500 --> 00:39:19,990 du begynte å se pikselering, alle rutene som komponerte øyet i dette tilfellet. 612 00:39:19,990 --> 00:39:24,130 Samme avtale her. Hvis vi zoomet inn ganske mye, ville du se individuelle prikker. 613 00:39:24,130 --> 00:39:27,110 Vel, dette er en slags avfall av biter. 614 00:39:27,110 --> 00:39:32,120 Hvis en tredjedel av flagget er svart og en tredjedel av flagget er gult og så videre, 615 00:39:32,120 --> 00:39:34,860 hvorfor kan ikke vi noe komprimere dette flagget? 616 00:39:34,860 --> 00:39:39,560 Og selv det franske flagget kan bli komprimert selv om mønsteret er litt annerledes. 617 00:39:39,560 --> 00:39:44,120 Det viser seg at GIF filformatet er en tapsfri komprimering format, 618 00:39:44,120 --> 00:39:48,420 som betyr at du kan ta et bilde som det tyske flagget her, 619 00:39:48,420 --> 00:39:53,540 du kan kaste bort mye av sine biter uten å ofre kvaliteten. 620 00:39:53,540 --> 00:39:55,340 Dette er i motsetning til noe som JPEG, 621 00:39:55,340 --> 00:39:57,050 som de fleste av oss er nok mer kjent. 622 00:39:57,050 --> 00:39:59,000 Facebook bilder og Flickr-bilder og lignende 623 00:39:59,000 --> 00:40:02,200 er nesten alltid lagres som JPEG når de er lastet opp, 624 00:40:02,200 --> 00:40:08,100 men JPEG er et lossy - lossy - format der du kaster bort biter 625 00:40:08,100 --> 00:40:10,430 men du også kaste bort kvalitet. 626 00:40:10,430 --> 00:40:13,890 Og så hvis du komprimere bilder med Photoshop eller laste dem opp til Facebook 627 00:40:13,890 --> 00:40:15,580 eller ta dem på en virkelig crappy telefon, 628 00:40:15,580 --> 00:40:19,510 du vet at bildet begynner å bli veldig flekkete og pixelated, 629 00:40:19,510 --> 00:40:22,290 og det er fordi det blir komprimert av datamaskinen eller telefonen 630 00:40:22,290 --> 00:40:24,550 ved bokstavelig talt å kaste informasjon unna. 631 00:40:24,550 --> 00:40:28,500 Men GIF er fantastisk i at det kan bruke færre bits enn det kanskje som standard 632 00:40:28,500 --> 00:40:30,750 uten å miste noe informasjon. 633 00:40:30,750 --> 00:40:32,410 >> Og det i hovedsak gjør så som følger. 634 00:40:32,410 --> 00:40:38,740 Snarere enn butikk i en fil som en BMP ville en RGB trippel for svart, svart, svart, svart, 635 00:40:38,740 --> 00:40:42,570 svart, svart, svart, svart, svart, svart, svart, svart og så videre, 636 00:40:42,570 --> 00:40:45,640 snarere er det GIF-format kommer til å si, "Black" 637 00:40:45,640 --> 00:40:48,330 og da, "Gjenta dette 100 ganger," eller noe sånt. 638 00:40:48,330 --> 00:40:52,280 "Black, gjenta dette 100 ganger, svart, gjenta dette 100 ganger ..." 639 00:40:52,280 --> 00:40:54,530 "Gul, gjenta dette 100 ganger." 640 00:40:54,530 --> 00:40:57,200 Og så det husker, i hovedsak, den lengst til venstre pixel 641 00:40:57,200 --> 00:41:02,160 og koder deretter noe oppfatningen av å gjenta at pixel igjen og igjen. 642 00:41:02,160 --> 00:41:06,110 Så GIF kan deretter komprimere seg uten å miste noe informasjon. 643 00:41:06,110 --> 00:41:09,510 Men hvis du skulle gjette, hvis det er algoritmen som GIF-filer bruk, 644 00:41:09,510 --> 00:41:13,180 hvilke av disse flaggene, selv om de ser identiske i størrelse, 645 00:41:13,180 --> 00:41:19,620 kommer til å bli mindre når de lagres på disken som en GIF? >> [Student] Tyskland. 646 00:41:19,620 --> 00:41:21,660 Tyskland kommer til å bli mindre? Hvorfor? 647 00:41:21,660 --> 00:41:26,620 [Student] Fordi du gjentar den mange, mange ganger horisontalt 648 00:41:26,620 --> 00:41:29,010 og deretter gjenta en annen gang. >> Nettopp. 649 00:41:29,010 --> 00:41:32,020 Fordi folk som oppfant GIF bare slags vilkårlig besluttet 650 00:41:32,020 --> 00:41:36,040 at repetisjon skal utnyttes horisontalt og ikke sidelengs. 651 00:41:36,040 --> 00:41:40,900 Det er mye mer repetisjon sideveis her i det tyske flagget enn i det franske flagget. 652 00:41:40,900 --> 00:41:44,430 Så hvis vi faktisk åpne opp en mappe på harddisken min som har disse GIFs, 653 00:41:44,430 --> 00:41:51,920 du kan faktisk se at det tyske flagget her er to kilobyte og den franske er 4 kilobyte. 654 00:41:51,920 --> 00:41:54,080 Det skjer for å være en tilfeldighet at man er dobbelt den andre, 655 00:41:54,080 --> 00:41:57,960 men det er faktisk slik at det franske flagget er mye større. 656 00:41:57,960 --> 00:42:01,250 >> Selv om vi snakker her om grafikk, kan de samme ideene gjelder 657 00:42:01,250 --> 00:42:05,150 ikke ting som flagg, men bilder som er litt mer komplisert. 658 00:42:05,150 --> 00:42:08,170 Hvis du tar et bilde av et eple, sikkert det er mye dobbeltarbeid der, 659 00:42:08,170 --> 00:42:11,040 slik at vi kunne liksom huske at standard bakgrunnen er blå 660 00:42:11,040 --> 00:42:13,230 , og ikke som den høyre bilde antyder, 661 00:42:13,230 --> 00:42:16,830 må huske fargen på hver eneste piksel i dette bildet. 662 00:42:16,830 --> 00:42:21,060 Så vi kan kaste biter unna det uten å miste informasjon. 663 00:42:21,060 --> 00:42:23,340 Eplet ser fortsatt akkurat det samme. 664 00:42:23,340 --> 00:42:27,510 I dette eksempelet her, kan du se hva som skjer i en film. 665 00:42:27,510 --> 00:42:31,970 Disse representerer old-school filmruller der i toppen bildet der 666 00:42:31,970 --> 00:42:36,900 du har en RV kjøring forbi et hus og et tre. 667 00:42:36,900 --> 00:42:42,130 Og som det van kjører forbi fra venstre til høyre, hva åpenbart ikke endring? 668 00:42:42,130 --> 00:42:45,320 Huset er ikke noe sted, og treet er ikke noe sted. 669 00:42:45,320 --> 00:42:47,700 Det eneste som beveger seg er van i dette tilfellet. 670 00:42:47,700 --> 00:42:51,650 Så som bakgrunn Uendret antyder, hva du kan gjøre i filmer 671 00:42:51,650 --> 00:42:56,530 er tilsvarende bare kaste bort informasjon som ikke endres i mellom rammer. 672 00:42:56,530 --> 00:42:58,900 Dette er vanligvis kjent som interframe komprimering 673 00:42:58,900 --> 00:43:02,120 der hvis denne rammen ser nesten identisk til denne, 674 00:43:02,120 --> 00:43:05,390 la oss ikke bry lagre på disk noen av identisk informasjon 675 00:43:05,390 --> 00:43:09,250 på disse mellomliggende frames, la oss bare bruke nøkkelbilder gang på en stund 676 00:43:09,250 --> 00:43:13,420 som faktisk lagrer denne informasjonen redundant bare som en liten mental helse sjekk. 677 00:43:13,420 --> 00:43:18,620 >> Som kontrast, er en annen tilnærming til komprimere videoen i denne andre og lavere eksempel her, 678 00:43:18,620 --> 00:43:23,970 der heller enn butikk 30 bilder, hva med å bare lagre 15 bilder per sekund i stedet? 679 00:43:23,970 --> 00:43:27,070 Snarere enn filmen slags flyter vakkert, perfekt, 680 00:43:27,070 --> 00:43:30,060 det kan se ut som det er hakkete litt, litt old school, 681 00:43:30,060 --> 00:43:37,190 men nettoeffekten vil være å bruke langt færre bits enn ellers ville være nødvendig. 682 00:43:37,190 --> 00:43:39,240 Så hvor kommer dette så la oss? 683 00:43:39,240 --> 00:43:41,700 Det var litt av en side på hvor ellers kan du gå med komprimering. 684 00:43:41,700 --> 00:43:45,140 For mer om dette, ta en klasse som CS175 her. 685 00:43:45,140 --> 00:43:46,990 Her er et annet eksempel innen video. 686 00:43:46,990 --> 00:43:49,190 Hvis bee er den eneste bevegelse, 687 00:43:49,190 --> 00:43:51,790 du virkelig kan kaste bort informasjon i disse midterste rammer 688 00:43:51,790 --> 00:43:55,260 fordi blomst og himmelen og blader ikke er i endring. 689 00:43:55,260 --> 00:43:57,960 Men la oss nå vurdere en siste ting. 690 00:43:57,960 --> 00:44:03,890 I de neste 5 minuttene la vi C bak evig i forelesningen? Ja. Ikke i psets, skjønt. 691 00:44:03,890 --> 00:44:10,210 Siste historien om C og så får vi til svært sexy ting 692 00:44:10,210 --> 00:44:13,870 involverer HTML og web-og woo-hoo. All høyre. 693 00:44:13,870 --> 00:44:16,050 Here we go. Det er motivasjon. 694 00:44:16,050 --> 00:44:20,020 Det viser seg hele tiden når vi har vært å skrive programmene vi kjører Clang. 695 00:44:20,020 --> 00:44:23,890 Og Clang, vi har sagt siden den første uken ganske mye, tar kildekoden 696 00:44:23,890 --> 00:44:25,740 og konverterer den til objektkode. 697 00:44:25,740 --> 00:44:28,540 Det tar C og konverterer den til 0'er og 1'ere. 698 00:44:28,540 --> 00:44:32,150 Jeg har slags ligget til deg for noen uker fordi det er ikke fullt så enkelt som det. 699 00:44:32,150 --> 00:44:36,750 >> Det er mye mer som skjer under panseret når du kjører et program som Clang. 700 00:44:36,750 --> 00:44:39,560 Faktisk kan prosessen med å sette sammen et program virkelig bli oppsummert, 701 00:44:39,560 --> 00:44:42,210 som du kanskje husker fra Rob video på kompilatorer, 702 00:44:42,210 --> 00:44:47,580 inn i disse fire trinnene: pre-prosessering, kompilering selv, montering, og linking. 703 00:44:47,580 --> 00:44:51,950 Men vi i klassen og de fleste mennesker i verden typisk oppsummere alle disse trinnene 704 00:44:51,950 --> 00:44:54,410 som bare "kompilering". 705 00:44:54,410 --> 00:44:58,070 Men hvis vi starter med kildekoden som dette, husker dette er kanskje den enkleste C program 706 00:44:58,070 --> 00:45:03,530 vi har skrevet så langt, husker at når kompilert det ender opp som ser slik ut. 707 00:45:03,530 --> 00:45:07,310 Men det er faktisk et mellomliggende trinn, og disse trinnene er som følger. 708 00:45:07,310 --> 00:45:10,750 Først er det denne tingen på toppen av dette, og de fleste av våre programmer, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Hva omfatter # gjøre for oss? 711 00:45:17,210 --> 00:45:24,150 Det ganske mye kopierer og limer innholdet i stdio.h inn filen min, slik at hvorfor? 712 00:45:24,150 --> 00:45:27,220 Hvorfor bryr jeg meg om innholdet i stdio.h? Hva er der av interesse? 713 00:45:27,220 --> 00:45:32,310 Printf erklæring, sin prototype, slik at kompilatoren så vet du hva jeg mener 714 00:45:32,310 --> 00:45:34,900 når jeg nevner denne funksjonen printf. 715 00:45:34,900 --> 00:45:39,390 Så trinn 1 i kompilering er pre-prosessering, der et program som Clang 716 00:45:39,390 --> 00:45:43,450 eller noen helper program som Clang kommer med leser koden topp til bunn, 717 00:45:43,450 --> 00:45:47,740 venstre til høyre, og hver gang den ser en # symbol etterfulgt av et søkeord som omfatter, 718 00:45:47,740 --> 00:45:53,980 den utfører den operasjonen, kopiere og lime inn i dette tilfellet stdio.h inn i filen. 719 00:45:53,980 --> 00:45:55,510 Det er trinn 1. 720 00:45:55,510 --> 00:45:59,620 Da har du en mye større C-fil på grunn av den enorme kopiere, lime inn jobb som bare skjedde. 721 00:45:59,620 --> 00:46:01,710 >> Trinn 2 nå er kompilering. 722 00:46:01,710 --> 00:46:04,880 Men det viser seg kompilere tar kildekoden som ser slik ut 723 00:46:04,880 --> 00:46:08,160 og gjør den til noe som ser ut som dette, 724 00:46:08,160 --> 00:46:12,560 som for de som er kjent heter? >> [Student] Assembly. >> Assembly språk. 725 00:46:12,560 --> 00:46:16,700 Dette er faktisk noe hvis du tar CS61 du vil dykke inn i mer detalj. 726 00:46:16,700 --> 00:46:22,380 Dette er omtrent så nær som du kan komme til å skrive 0'er og 1'ere selv 727 00:46:22,380 --> 00:46:25,850 men skriver ting på en slik måte som fortsatt gjør minst en liten bit av fornuftig. 728 00:46:25,850 --> 00:46:30,760 Dette er maskininstruksjonene, og hvis vi blar ned til den viktigste funksjonen her, 729 00:46:30,760 --> 00:46:35,470 merke til at det er dette push instruksjon, flytte undervisning, trekke instruksjon, 730 00:46:35,470 --> 00:46:38,550 call instruksjon, og så videre. 731 00:46:38,550 --> 00:46:42,930 Når du hører at datamaskinen har Intel inside, 732 00:46:42,930 --> 00:46:46,180 du har en Intel CPU i din Mac eller PC, hva betyr det? 733 00:46:46,180 --> 00:46:51,200 En CPU kommer innebygd med selskaper som Intel forstå visse instruksjoner. 734 00:46:51,200 --> 00:46:55,770 De har ingen anelse om hvilke funksjoner som swap er eller hovedsak er per se, 735 00:46:55,770 --> 00:47:00,060 men de vet hva svært lavt nivå instruksjoner som legge til, trekke fra, presse, 736 00:47:00,060 --> 00:47:02,430 flytte, ringe, og så videre er. 737 00:47:02,430 --> 00:47:06,170 Så når du kompilere C-kode i forsamlingen språk, 738 00:47:06,170 --> 00:47:11,820 din svært brukervennlig utseende kode er konvertert til noe som ser ut som dette, 739 00:47:11,820 --> 00:47:21,670 som beveger bokstavelig byte eller 4 byte rundt i slike små enheter i og ut av CPU. 740 00:47:21,670 --> 00:47:26,820 Men til slutt, når Clang er klar til å ta denne representasjonen av programmet 741 00:47:26,820 --> 00:47:30,940 inn 0'er og 1'ere, deretter trinnet kalles montering skjer, 742 00:47:30,940 --> 00:47:33,850 og dette igjen alle skjer i løpet av et øyeblikk når du kjører Clang. 743 00:47:33,850 --> 00:47:39,300 Vi starter her, utganger det en fil som dette, og da er det konverterer den til disse 0'er og 1'ere. 744 00:47:39,300 --> 00:47:42,000 Og hvis du ønsker å gå tilbake på et tidspunkt og faktisk se dette i praksis, 745 00:47:42,000 --> 00:47:48,220 hvis jeg går inn hello1.c--dette er en av de aller første programmene vi har sett på - 746 00:47:48,220 --> 00:47:53,710 normalt ville vi kompilere dette med Clang hello1.c og dette ville gi oss a.out. 747 00:47:53,710 --> 00:47:59,890 Hvis derimot du i stedet gi den-S flagget, hva du får er hello1.s 748 00:47:59,890 --> 00:48:02,750 og du vil faktisk se assembly. 749 00:48:02,750 --> 00:48:05,750 >> Jeg gjør dette for en svært kort program, men hvis du går tilbake til Scramble 750 00:48:05,750 --> 00:48:08,740 eller Gjenopprett eller hvilket som helst program du har skrevet og bare ut av nysgjerrighet 751 00:48:08,740 --> 00:48:13,240 ønsker å se hva det egentlig ser ut, hva som faktisk blir matet inn i CPU, 752 00:48:13,240 --> 00:48:15,700 kan du bruke den-S flagg med Clang. 753 00:48:15,700 --> 00:48:17,770 Men så til slutt, det er fortsatt en fikser. 754 00:48:17,770 --> 00:48:21,810 Her er de 0'er og 1'ere som representerer min gjennomføring av hallo, verden. 755 00:48:21,810 --> 00:48:25,530 Men jeg brukt en annens funksjon i programmet mitt. 756 00:48:25,530 --> 00:48:28,710 Så selv om prosessen har vært jeg ta hallo.c, 757 00:48:28,710 --> 00:48:34,280 det blir samlet i forsamlingen koden, og deretter den blir satt sammen til 0'er og 1'ere, 758 00:48:34,280 --> 00:48:37,460 den eneste 0'er og 1'ere som er outputted på dette tidspunkt 759 00:48:37,460 --> 00:48:40,270 er de som kommer fra min kode. 760 00:48:40,270 --> 00:48:44,400 Men personen som skrev printf, samlet de seg koden for 20 år siden 761 00:48:44,400 --> 00:48:47,000 og det er nå installert sted på apparatet, 762 00:48:47,000 --> 00:48:51,610 så vi noe å fusjonere sine 0'er og 1'ere med min 0'er og 1'ere, 763 00:48:51,610 --> 00:48:56,160 og det bringer oss til den fjerde og siste trinnet kompilering, kjent som linking. 764 00:48:56,160 --> 00:48:58,680 Så på venstre side har vi nøyaktig samme bilde som før: 765 00:48:58,680 --> 00:49:02,580 hallo.c blir assemblykode blir 0'er og 1'ere. 766 00:49:02,580 --> 00:49:05,960 Men husker at jeg brukte standard I / O-bibliotek i koden min, 767 00:49:05,960 --> 00:49:10,350 og det betyr et sted på datamaskinen er det en fil som heter stdio.c 768 00:49:10,350 --> 00:49:13,980 eller minst kompilert versjon derav fordi noen noen år siden 769 00:49:13,980 --> 00:49:18,530 kompilert stdio.c inn assembly-kode og deretter en hel haug med 0'er og 1'ere. 770 00:49:18,530 --> 00:49:21,130 Dette er det som kalles en statisk eller dynamisk bibliotek. 771 00:49:21,130 --> 00:49:23,350 Det er noen fil sitter et sted i apparatet. 772 00:49:23,350 --> 00:49:28,710 >> Men til slutt, må jeg ta min 0'er og 1'ere og vedkommende har 0'er og 1'ere 773 00:49:28,710 --> 00:49:32,760 og noe knytte dem sammen, bokstavelig talt kombinere de 0'er og 1'ere 774 00:49:32,760 --> 00:49:37,900 i en enkelt fil som heter a.out eller hello1 eller hva jeg ringte min program 775 00:49:37,900 --> 00:49:43,320 slik at sluttresultatet har all 1s og 0s som bør komponere mitt program. 776 00:49:43,320 --> 00:49:45,660 Så alt denne gangen dette semesteret når du har brukt Clang 777 00:49:45,660 --> 00:49:48,750 og enda mer nylig kjørte gjøre for å kjøre Clang, 778 00:49:48,750 --> 00:49:53,580 alle disse trinnene har skjedd slags umiddelbart, men svært bevisst. 779 00:49:53,580 --> 00:49:57,830 Og så hvis du fortsetter på i informatikk, nemlig CS61, 780 00:49:57,830 --> 00:50:00,850 Dette er laget som du vil fortsette å skrelle tilbake av det 781 00:50:00,850 --> 00:50:06,980 snakker om effektivitet, sikkerhetsimplikasjonene, og lignende av disse lavere nivå detaljene. 782 00:50:06,980 --> 00:50:09,220 Men med det, er vi i ferd med å forlate C bak. 783 00:50:09,220 --> 00:50:11,420 La oss gå videre og ta vår 5-minutters pause nå, 784 00:50:11,420 --> 00:50:14,190 og når vi kommer tilbake: Internett. 785 00:50:17,280 --> 00:50:19,170 All høyre. Vi er tilbake. 786 00:50:19,170 --> 00:50:23,590 Nå begynner vi ser ikke bare på HTML fordi, som du vil se, 787 00:50:23,590 --> 00:50:26,050 HTML selv er faktisk ganske enkelt 788 00:50:26,050 --> 00:50:29,270 men virkelig på web-programmering mer generelt, nettverk mer generelt, 789 00:50:29,270 --> 00:50:31,770 og hvordan alle disse teknologiene kommer sammen 790 00:50:31,770 --> 00:50:35,400 å tillate oss å lage mye mer avanserte programmer oppå Internett 791 00:50:35,400 --> 00:50:38,690 enn hittil har vi vært i stand til å i disse sorte og hvite vinduer. 792 00:50:38,690 --> 00:50:42,140 Faktisk, på dette punktet i semesteret, selv om vi vil bruke relativt mindre tid 793 00:50:42,140 --> 00:50:46,200 på PHP, HTML, CSS, JavaScript, SQL og mer, 794 00:50:46,200 --> 00:50:48,480 de fleste studenter ender opp med å gjøre endelige prosjekter som er web-basert 795 00:50:48,480 --> 00:50:51,230 fordi som du ser, den bakgrunnen du har nå i C 796 00:50:51,230 --> 00:50:54,450 er veldig mye som gjelder for disse høyere nivå språk. 797 00:50:54,450 --> 00:50:56,800 >> Og når du begynner å tenke på det endelige prosjektet, 798 00:50:56,800 --> 00:50:59,940 som, mye som Problem Set 0, der du ble oppfordret 799 00:50:59,940 --> 00:51:02,160 å gjøre det meste noe av interesse for deg i Scratch, 800 00:51:02,160 --> 00:51:05,790 den endelige prosjektet er din mulighet til å ta ny kunnskap og kunnskapsrike med C 801 00:51:05,790 --> 00:51:09,850 eller PHP eller JavaScript eller lignende for en snurr 802 00:51:09,850 --> 00:51:12,330 og lage din helt egen stykke programvare for verden å se. 803 00:51:12,330 --> 00:51:17,770 Og til frøet du med ideer, vet at du kan hodet her, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Hvert år, oppfordre vi ideer fra lærere og ansatte og student grupper på campus 805 00:51:21,800 --> 00:51:27,330 bare å sende inn sine ideer for interessante ting som kan løses ved hjelp av datamaskiner, 806 00:51:27,330 --> 00:51:29,860 bruker nettsteder, ved hjelp av programvare. 807 00:51:29,860 --> 00:51:32,360 Så hvis du sliter med å komme opp med en idé av dine egne, 808 00:51:32,360 --> 00:51:35,790 for all del bla gjennom ideer der fra i år og siste. 809 00:51:35,790 --> 00:51:39,990 Det er helt greit å takle et prosjekt som har blitt håndtert før. 810 00:51:39,990 --> 00:51:44,540 Vi har sett mange apps for å se status for vaskeri på campus, 811 00:51:44,540 --> 00:51:47,000 mange apps for å navigere i matsalen menyen, 812 00:51:47,000 --> 00:51:49,540 mange apps for å navigere i kurskatalogen og lignende. 813 00:51:49,540 --> 00:51:53,680 Og ja, i en fremtidig foredrag og i fremtidige seminarer, 814 00:51:53,680 --> 00:51:57,750 Vi vil introdusere deg til noen offentlig tilgjengelig APIer, både kommersielt tilgjengelig 815 00:51:57,750 --> 00:52:02,520 så vel som her er tilgjengelig fra CS50 på campus, slik at du har tilgang til data 816 00:52:02,520 --> 00:52:04,910 og kan deretter gjøre interessante ting med det. 817 00:52:04,910 --> 00:52:09,380 Så mer om endelige prosjekter i noen dager når vi slipper spesifikasjonen, 818 00:52:09,380 --> 00:52:12,990 men for nå, vet at du kan arbeide alene eller med en eller to venner 819 00:52:12,990 --> 00:52:16,010 på de fleste ethvert prosjekt av interesse for deg. 820 00:52:16,010 --> 00:52:18,080 Internett. 821 00:52:18,080 --> 00:52:22,300 Går du videre og trekke ut den bærbare datamaskinen, går du til facebook.com for første gang, 822 00:52:22,300 --> 00:52:27,020 ikke at du har logget inn nylig, og trykk Enter. Hva skjer egentlig? 823 00:52:27,020 --> 00:52:30,150 >> Når du trykker på Enter på datamaskinen, en hel haug med trinn 824 00:52:30,150 --> 00:52:32,600 starter slags magisk skjer. 825 00:52:32,600 --> 00:52:35,960 Så du her til venstre, web server som Facebook er her på høyre side, 826 00:52:35,960 --> 00:52:42,500 og noe du bruker dette språket kalles HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP er ikke et programmeringsspråk. Det er mer av en protokoll. 828 00:52:46,770 --> 00:52:52,310 Det er et sett av konvensjoner som nettlesere og webservere bruker når intercommunicating. 829 00:52:52,310 --> 00:52:54,360 Og hva dette betyr er som følger. 830 00:52:54,360 --> 00:52:56,790 Mye som i den virkelige verden, har vi disse konvensjonene 831 00:52:56,790 --> 00:53:00,140 der hvis du møter noen mennesker for første gang, hvis du ikke tankene humoring meg her, 832 00:53:00,140 --> 00:53:03,980 Jeg kan komme opp til deg og sier: "Hei, mitt navn er David." >> Hei, David. Mitt navn er Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hei, David. Mitt navn er Sammy." 834 00:53:05,770 --> 00:53:08,310 Så nå har vi bare engasjert i denne typen dum menneskelig protokoll 835 00:53:08,310 --> 00:53:12,200 hvor jeg har startet protokollen, har Sammy svarte, 836 00:53:12,200 --> 00:53:15,060 vi har håndhilst, og transaksjonen er fullført. 837 00:53:15,060 --> 00:53:18,260 HTTP er veldig lik i ånden. 838 00:53:18,260 --> 00:53:23,350 Når nettleseren forespørsler www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 hva din nettleser er virkelig gjør er å utvide sin hånd, så å si, 840 00:53:27,020 --> 00:53:29,960 til serveren, og det er å sende den en melding. 841 00:53:29,960 --> 00:53:34,220 Og at meldingen er vanligvis noe som får - hva vil du bli? - 842 00:53:34,220 --> 00:53:38,740 få meg på hjemmesiden, som er typisk merket med en enkel slash på slutten av en nettadresse. 843 00:53:38,740 --> 00:53:43,790 Og bare så du vet hvilket språk jeg snakker, jeg leseren kommer til å fortelle deg 844 00:53:43,790 --> 00:53:46,930 at jeg snakker HTTP versjon 1.1, 845 00:53:46,930 --> 00:53:51,980 Og også for godt mål, skal jeg fortelle deg at verten som jeg vil at hjemmesiden 846 00:53:51,980 --> 00:53:54,120 er facebook.com. 847 00:53:54,120 --> 00:53:57,730 Vanligvis, en nettleser, ukjent for deg, menneske, 848 00:53:57,730 --> 00:54:03,350 sender denne meldingen på Internett når du bare skrive www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Enter, inn i nettleseren din. 850 00:54:05,370 --> 00:54:07,300 Og hva svarer Facebook med? 851 00:54:07,300 --> 00:54:12,540 Den reagerer med noen lignende utseende kryptiske detaljer, men også mye mer. 852 00:54:12,540 --> 00:54:14,310 La meg gå videre til Facebook hjemmeside her. 853 00:54:14,310 --> 00:54:17,480 Dette er skjermen som de fleste av oss sannsynligvis aldri se om du fremdeles er logget inn hele tiden, 854 00:54:17,480 --> 00:54:19,830 men dette er faktisk deres hjemmeside. 855 00:54:19,830 --> 00:54:24,150 Hvis vi gjør dette i Chrome merke til at du kan trekke opp disse små hurtigmenyer. 856 00:54:24,150 --> 00:54:26,980 Bruker Chrome, enten på Mac OS, Windows, Linux, eller lignende, 857 00:54:26,980 --> 00:54:31,840 Hvis du har kontroll klikk eller venstre klikk, kan du vanligvis trekke opp en meny som ser slik ut, 858 00:54:31,840 --> 00:54:35,870 hvor noen alternativer venter, er en av dem Vis sidekilde. 859 00:54:35,870 --> 00:54:39,920 Du kan også vanligvis få til disse tingene ved å gå til Vis-menyen og poking rundt. 860 00:54:39,920 --> 00:54:42,750 For eksempel, her under visning, er Developer det samme. 861 00:54:42,750 --> 00:54:45,780 Jeg kommer til å gå videre og se på Vis sidekilde. 862 00:54:45,780 --> 00:54:50,800 Hva du vil se er HTML som Mark har skrevet for å representere facebook.com. 863 00:54:50,800 --> 00:54:55,910 Det er et komplett rot her, men vi får se at dette gjør litt mer fornuftig før lenge. 864 00:54:55,910 --> 00:54:59,840 Men det er noen mønstre her. La meg bla ned til ting som dette. 865 00:54:59,840 --> 00:55:05,730 Dette er vanskelig for et menneske å lese, men merker at det er dette mønsteret av festemateriell 866 00:55:05,730 --> 00:55:10,360 med søkeord som alternativ, søkeord som verdi, noen siterte strenger. 867 00:55:10,360 --> 00:55:15,660 Det er der, da du registrerte deg for aller første gang, spesifisert hva fødselsår er. 868 00:55:15,660 --> 00:55:19,020 At drop-down menyen for medfødte år er liksom kodet her 869 00:55:19,020 --> 00:55:23,870 i dette språket kalles HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Med andre ord, når nettleseren ber en nettside, 871 00:55:27,730 --> 00:55:30,610 det taler denne konvensjonen heter HTTP. 872 00:55:30,610 --> 00:55:35,170 Men hva svarer facebook.com til at forespørselen med? 873 00:55:35,170 --> 00:55:38,260 >> Den reagerer med noen av disse kryptiske meldinger, som vi skal se om et øyeblikk. 874 00:55:38,260 --> 00:55:43,760 Men mest av sitt svar er i form av HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Det er selve språket som en nettside er skrevet. 876 00:55:47,170 --> 00:55:52,030 Og hva en nettleser virkelig er da, ved mottak av noe som ser ut som dette, 877 00:55:52,030 --> 00:55:57,120 leser det topp til bunn, fra venstre til høyre, og hver gang den ser en av disse festemateriell 878 00:55:57,120 --> 00:56:03,370 etterfulgt av et søkeord som alternativ, viser det at markup language på en forsvarlig måte. 879 00:56:03,370 --> 00:56:06,820 I dette tilfellet ville det vise en drop-down menyen år. 880 00:56:06,820 --> 00:56:09,240 Men igjen, dette er et komplett rot å se på. 881 00:56:09,240 --> 00:56:16,630 Dette er ikke fordi Facebook utviklere manifest 0 for 5 for stil, for eksempel. 882 00:56:16,630 --> 00:56:20,190 Dette er fordi de fleste av koden som de skriver er faktisk skrevet vakkert, 883 00:56:20,190 --> 00:56:22,450 godt kommentert, pent innrykket, og lignende, 884 00:56:22,450 --> 00:56:26,080 men selvfølgelig, datamaskiner, nettlesere egentlig ikke gi en jævla 885 00:56:26,080 --> 00:56:27,890 om koden er godt stylet. 886 00:56:27,890 --> 00:56:33,100 Og faktisk, det er helt bortkastet å treffe tabulatortasten alle de gangene 887 00:56:33,100 --> 00:56:37,650 og å sette kommentarer gjennom hele koden din og velge virkelig beskrivende variabelnavn 888 00:56:37,650 --> 00:56:42,340 fordi hvis nettleseren ikke bryr seg, er alt du gjør på slutten av dagen sløse bytes. 889 00:56:42,340 --> 00:56:46,660 >> Så det viser seg hva de fleste nettsteder gjør er, selv om kildekoden for facebook.com, 890 00:56:46,660 --> 00:56:49,550 for cs50.net og alle disse andre nettstedene på Internett 891 00:56:49,550 --> 00:56:53,730 er vanligvis godt skrevet og godt kommentert og pent innrykket og lignende, 892 00:56:53,730 --> 00:56:59,270 vanligvis før nettsiden er satt på internett, er koden minified, 893 00:56:59,270 --> 00:57:02,970 der HTML og CSS - noe annet vil vi snart se - 894 00:57:02,970 --> 00:57:05,960 JavaScript-koden vil vi snart se er komprimert, 895 00:57:05,960 --> 00:57:09,250 hvorved lange variabelnavn blir X og Y og Z, 896 00:57:09,250 --> 00:57:13,900 og alle som blanktegn som gjør alt ser så lesbar er alle kastet bort, 897 00:57:13,900 --> 00:57:17,700 fordi hvis du tenker på det på denne måten, får Facebook en milliard sidevisninger per dag - 898 00:57:17,700 --> 00:57:21,670 noe sprøtt sånn - så hva hvis en programmerer bare for å være anal 899 00:57:21,670 --> 00:57:26,660 traff space bar en ekstra gang bare for å rykke litt kodelinje aldri så mye mer? 900 00:57:26,660 --> 00:57:29,500 Hva er konsekvensen hvis Facebook bevarer at whitespace 901 00:57:29,500 --> 00:57:32,880 i alle byte sender de tilbake til folk på Internett? 902 00:57:32,880 --> 00:57:36,400 Treffer plassen bar gir når du en ekstra byte i filen. 903 00:57:36,400 --> 00:57:39,730 Og hvis en milliard mennesker så fortsette å laste ned hjemmesiden den dagen, 904 00:57:39,730 --> 00:57:42,060 hvor mye mer data du har overført over Internett? 905 00:57:42,060 --> 00:57:45,200 En gigabyte for ingen god grunn. 906 00:57:45,200 --> 00:57:48,510 Og gitt, for en rekke nettsteder dette er ikke en så skalerbar problem, 907 00:57:48,510 --> 00:57:51,030 men for Facebook, for Google, for noen av de mest populære nettsteder 908 00:57:51,030 --> 00:57:54,860 det er stor oppmuntring økonomisk gjøre koden ser ut som et rot 909 00:57:54,860 --> 00:57:58,980 slik at du bruker så få bytes som mulig i tillegg til da komprimere den 910 00:57:58,980 --> 00:58:01,500 bruke noe sånt som zip, kalles en algoritme gzip, 911 00:58:01,500 --> 00:58:04,250 at nettleseren gjør for deg automatisk. Men dette er forferdelig. 912 00:58:04,250 --> 00:58:08,060 Vi vil aldri lære noe om andre menneskers nettsteder og hvordan å designe web sider 913 00:58:08,060 --> 00:58:09,680 hvis vi må se på det som dette. 914 00:58:09,680 --> 00:58:13,620 >> Så heldigvis, nettlesere som Chrome og IE og Firefox i disse dager 915 00:58:13,620 --> 00:58:16,450 vanligvis kommer med innebygd utviklerverktøy. 916 00:58:16,450 --> 00:58:21,730 Faktisk, hvis jeg går ned hit for å Inspiser Element eller hvis jeg går til Vis, Developer 917 00:58:21,730 --> 00:58:25,220 og gå til Utviklerverktøy eksplisitt, 918 00:58:25,220 --> 00:58:27,640 dette vinduet nederst på skjermen min vises nå. 919 00:58:27,640 --> 00:58:31,230 Det er litt skremmende i begynnelsen, fordi det er mye av ukjente faner her, 920 00:58:31,230 --> 00:58:34,510 men hvis jeg klikker på elementer hele veien nederst til venstre, 921 00:58:34,510 --> 00:58:38,810 Chrome er åpenbart ganske smart. Det vet hvordan man skal tolke alt dette koden. 922 00:58:38,810 --> 00:58:42,320 Og så hva Chrome gjør er det renser opp alle Facebooks HTML. 923 00:58:42,320 --> 00:58:45,680 Selv om det ikke er mellomrom der, det er ikke innrykk der, 924 00:58:45,680 --> 00:58:51,120 nå merke til at jeg kan begynne å navigere denne nettsiden desto mer hierarkisk. 925 00:58:51,120 --> 00:58:56,910 Det viser seg at hver nettside skrevet i et språk som kalles HTML5 bør starte med dette, 926 00:58:56,910 --> 00:59:03,980 Dette DOCTYPE erklæringen, så å si: 927 00:59:03,980 --> 00:59:07,840 Det er slags lys og grå der, men det er den aller første kodelinje i denne filen, 928 00:59:07,840 --> 00:59:12,080 og det forteller bare nettleseren, "Hey, her kommer noen HTML5. Her kommer en nettside." 929 00:59:12,080 --> 00:59:18,490 Den første åpne braketten utover det skjer for å være denne tingen, en åpen brakett HTML-kode, 930 00:59:18,490 --> 00:59:22,320 og hvis jeg dykke i dypere - disse pilene er helt meningsløst; 931 00:59:22,320 --> 00:59:25,140 de er bare for presentasjon skyld, de er faktisk ikke i filen - 932 00:59:25,140 --> 00:59:30,300 merke til at innsiden av Facebooks HTML-kode, noe som starter med et åpent brakett 933 00:59:30,300 --> 00:59:32,910 og da har et ord kalles en kode. 934 00:59:32,910 --> 00:59:38,610 Så inne i HTML-koden er tilsynelatende et hode-kode og en body-koden. 935 00:59:38,610 --> 00:59:41,930 Innsiden av hodet koden er nå en hel rot for Facebook 936 00:59:41,930 --> 00:59:45,620 fordi de har mye av metadata og andre ting for markedsføring og reklame. 937 00:59:45,620 --> 00:59:50,600 >> Men hvis vi bla ned, ned, ned, ned, la oss se hvor det er. Her er det. 938 00:59:50,600 --> 00:59:52,210 Dette er i det minste noe kjent. 939 00:59:52,210 --> 00:59:55,990 Tittelen på Facebook hjemmeside, hvis du noen gang ser i fanen i tittellinjen, 940 00:59:55,990 --> 00:59:59,060 er Velkommen til Facebook - logg inn, registrer deg eller lære mer. 941 00:59:59,060 --> 01:00:01,110 Det er hva du ville se i Chrome tittellinje, 942 01:00:01,110 --> 01:00:03,100 og det er hvordan det er representert i koden. 943 01:00:03,100 --> 01:00:08,090 Hvis vi ser bort alt annet i hodet, de fleste av guts av en nettside er i kroppen, 944 01:00:08,090 --> 01:00:10,940 og det viser seg at Facebooks kode kommer til å se mer komplekse 945 01:00:10,940 --> 01:00:14,540 enn de fleste ting vil vi skrive utgangspunktet bare fordi det er blitt bygget opp gjennom årene, 946 01:00:14,540 --> 01:00:17,260 men det er en hel masse skriptkodene, JavaScript-kode, 947 01:00:17,260 --> 01:00:18,870 som gjør nettstedet svært interaktive: 948 01:00:18,870 --> 01:00:22,330 se statusoppdateringer umiddelbart med språk som JavaScript. 949 01:00:22,330 --> 01:00:25,270 Det er noe som kalles en div, som er en divisjon av en side. 950 01:00:25,270 --> 01:00:27,940 Men før vi kommer til det detalj, la oss prøve å zoome ut 951 01:00:27,940 --> 01:00:31,920 og se på en enklere versjon av Facebook 1.0, så å si. 952 01:00:31,920 --> 01:00:34,740 Her er hallo, verden av websider. 953 01:00:34,740 --> 01:00:37,370 Det har den DOCTYPE deklarasjon på toppen 954 01:00:37,370 --> 01:00:40,280 som er litt forskjellig fra alt annet. 955 01:00:40,280 --> 01:00:46,130 Ingenting annet vi skriver i en nettside kommer til å starte med 01:00:48,880 og med unntak av noe som kalles kommentarer i HTML. 957 01:00:48,880 --> 01:00:53,000 Men for det meste, alt i en nettside åpen brakett, nøkkelord, nær braketten. 958 01:00:53,000 --> 01:00:56,220 >> I dette tilfellet kan du se den enkleste av websider mulig. 959 01:00:56,220 --> 01:01:00,260 HTML-koden inneholder et hode koden og den inneholder en body-koden, 960 01:01:00,260 --> 01:01:04,580 men merker at det er denne oppfatningen av start og stopp koder. 961 01:01:04,580 --> 01:01:11,360 Dette er starten tag for HTML, er dette sluttkode eller slutten tag. 962 01:01:11,360 --> 01:01:15,400 Legg merke til at de er liksom motsetninger i den forstand at den sluttkode eller slutten tag 963 01:01:15,400 --> 01:01:20,030 har dette skråstrek innsiden av seg selv. 964 01:01:20,030 --> 01:01:23,540 Samtidig er det en løs topp tag her og en nær hodet tag her. 965 01:01:23,540 --> 01:01:26,880 >> Det er en åpen tittel og en nær tittelkodeverdi her. 966 01:01:26,880 --> 01:01:29,850 Det faktum at jeg har satt tittelen på én linje, rent tilfeldig. 967 01:01:29,850 --> 01:01:33,760 Det bare så ut som det ville passe fint på en linje, så jeg ikke bry trykker Enter et par ganger. 968 01:01:33,760 --> 01:01:38,200 I mellomtiden kroppen jeg gjorde innrykk bare for å være aldri så klart. 969 01:01:38,200 --> 01:01:41,050 Legg merke til at HTML er en ganske dum språk. 970 01:01:41,050 --> 01:01:43,410 Faktisk, tilbake i dag før det var WYSIWYG redaktører 971 01:01:43,410 --> 01:01:46,770 og Microsoft Word hvor du kan si: "Gjør denne dristige, gjør dette kursiv," 972 01:01:46,770 --> 01:01:50,850 ville du faktisk skriver lite kommandoer i essays 20 + år siden 973 01:01:50,850 --> 01:01:55,740 hvor du ville si, "Start gjør denne teksten fet. Stopp gjøre denne teksten fet." 974 01:01:55,740 --> 01:01:59,010 "Begynn med å lage denne teksten kursiv. Stopp gjøre denne teksten kursiv." 975 01:01:59,010 --> 01:02:01,850 >> Det er det HTML eller noen markup språk er. 976 01:02:01,850 --> 01:02:05,530 Denne første tag sier "Hei, nettleser. Her kommer noen HTML." 977 01:02:05,530 --> 01:02:09,880 Den neste tag sier "Hei, nettleser. Her kommer hodet, overskriften på nettsiden min." 978 01:02:09,880 --> 01:02:11,650 "Hei, kommer nettleseren. Her tittelen." 979 01:02:11,650 --> 01:02:15,880 Og så over her, "Hey, nettleser. Det er det for tittelen." 980 01:02:15,880 --> 01:02:20,000 Så dette er hvordan nettleseren vet ikke lenger vise flere tegn enn hallo, verden 981 01:02:20,000 --> 01:02:21,860 i tittellinjen. 982 01:02:21,860 --> 01:02:23,640 I mellomtiden, dette sier: "Det er det for hodet." 983 01:02:23,640 --> 01:02:28,340 Dette sier: "Her kommer kroppen Her er selve kroppen." - Bokstavelig talt, ordene hallo, verden. 984 01:02:28,340 --> 01:02:33,190 Og dette sier her: "Det er det for kroppen. Det er det for HTML." 985 01:02:33,190 --> 01:02:34,640 Så nettlesere er ganske dum. 986 01:02:34,640 --> 01:02:39,920 De har nettopp lest denne ting topp til bunn, fra venstre til høyre, og gjøre akkurat hva de blir fortalt å gjøre. 987 01:02:39,920 --> 01:02:41,860 La oss faktisk gjør et lite eksempel her. 988 01:02:41,860 --> 01:02:46,240 La meg åpne opp den enkleste av programmene på min Mac her, nemlig TextEdit. 989 01:02:46,240 --> 01:02:48,220 På Windows kan du bruke Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Men dette er alt du trenger for å begynne å lage websider. 991 01:02:50,520 --> 01:02:53,730 Jeg kommer til å gå videre og bare kopiere og lime inn denne koden denne filen. 992 01:02:53,730 --> 01:02:57,210 Jeg kommer til å gå videre og lagre den på skrivebordet mitt, 993 01:02:57,210 --> 01:03:01,220 og jeg kommer til å lagre dette som hello.html, 994 01:03:01,220 --> 01:03:03,840 og nå filen heter hello.html. 995 01:03:03,840 --> 01:03:05,690 Her er det på skrivebordet mitt. 996 01:03:05,690 --> 01:03:11,130 La meg nå gå inn i en nettleser og dra filen inn i nettleseren. 997 01:03:11,130 --> 01:03:14,060 Og voila, her er min aller første nettside. 998 01:03:14,060 --> 01:03:17,340 Legg merke til at tittelen på fanen er hallo, verden som per tittelen tag, 999 01:03:17,340 --> 01:03:20,040 og merker at Hallo, er verdens kroppen min nettside, 1000 01:03:20,040 --> 01:03:22,190 og woo-hoo, jeg er på Internett. 1001 01:03:22,190 --> 01:03:24,700 >> Jeg er egentlig ikke, høyre, fordi denne filen ikke er på Internett. 1002 01:03:24,700 --> 01:03:28,330 Det skjer for å være på min lokale harddisk på det aktuelle banen. 1003 01:03:28,330 --> 01:03:32,720 Men ideen er den samme. Alt vi trenger nå er en web-server til å laste den opp. 1004 01:03:32,720 --> 01:03:37,410 Men først la oss faktisk innføre en litt mer kompleksitet og litt mer stilisering. 1005 01:03:37,410 --> 01:03:39,890 Dette er en enkel, hvis kjedelig, web side. 1006 01:03:39,890 --> 01:03:41,990 Det viser seg at det finnes andre typer koder vi kan bruke. 1007 01:03:41,990 --> 01:03:45,530 For eksempel, her i gult har jeg introdusert to nye koder. 1008 01:03:45,530 --> 01:03:49,630 Vi vil ikke spille mye med disse i dag, men merker at det link tag 1009 01:03:49,630 --> 01:03:52,520 liksom ser annerledes fra alt annet. 1010 01:03:52,520 --> 01:03:55,370 Koblingen tag tar det som kalles attributter, 1011 01:03:55,370 --> 01:03:59,770 og et attributt er noe som endrer oppførselen til en kode. 1012 01:03:59,770 --> 01:04:03,840 I dette tilfellet er ikke det beste valget av navn, lenke, fordi det er slags meningsløst, 1013 01:04:03,840 --> 01:04:11,590 men dette link tag sier, i hovedsak, er filen som heter styles.css innsiden av min nettside. 1014 01:04:11,590 --> 01:04:15,400 Du kan tenke på dette som analogt til Cs # include direktivet. 1015 01:04:15,400 --> 01:04:19,650 Styles.css refererer til et annet språk helt at vi ikke vil leke med i dag, 1016 01:04:19,650 --> 01:04:23,790 men det er for estetikk: skriftstørrelser, farger, utfylling innrykk, marginer, 1017 01:04:23,790 --> 01:04:26,040 og alle den slags estetikk detalj. 1018 01:04:26,040 --> 01:04:28,820 Samtidig er skriptmerket funksjonelt lik, 1019 01:04:28,820 --> 01:04:33,140 men snarere enn inkluderer CSS, det språket, det inkluderer et annet språk, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Så med andre ord, med disse to kodene vil jeg til slutt kunne skrive min egen nettside 1021 01:04:37,810 --> 01:04:41,490 men også trekke inn koden som jeg eller noen andre har skrevet 1022 01:04:41,490 --> 01:04:44,350 slik at vi kan stå på andres skuldre, kan vi utøve god design, 1023 01:04:44,350 --> 01:04:46,120 factoring ut felles kode. 1024 01:04:46,120 --> 01:04:49,090 Hvis jeg har 10 forskjellige nettsider, betyr dette at noen av mine estetikk 1025 01:04:49,090 --> 01:04:52,490 kan være priset ut, mye som # include, inn i en egen fil. 1026 01:04:52,490 --> 01:04:54,420 Så vi er på vei. 1027 01:04:54,420 --> 01:04:57,180 Men la oss faktisk først gjøre noe mer interessant med denne filen. 1028 01:04:57,180 --> 01:05:01,110 >> Igjen, dette er bare TextEdit. Jeg er ikke teknisk på internett ennå, men vi vil komme dit. 1029 01:05:01,110 --> 01:05:04,910 Jeg vil gjerne gjøre hallo, verden litt dristigere enn det er. 1030 01:05:04,910 --> 01:05:10,890 Så hei, la oss vilkårlig si for fet. 1031 01:05:10,890 --> 01:05:15,910 Igjen er historien den samme: Hallo, komma, begynne å gjøre denne dristige, 1032 01:05:15,910 --> 01:05:19,730 da verden blir trykket i fet skrift, og dette betyr stoppe utskriften dette i fet skrift. 1033 01:05:19,730 --> 01:05:24,020 La meg gå videre og lagre filen min, gå tilbake til Chrome, vil jeg zoome inn så vi kan se det bedre, 1034 01:05:24,020 --> 01:05:27,870 og legg, og du vil se at verden er nå i fet skrift. 1035 01:05:27,870 --> 01:05:31,810 Web handler om hyperkoblinger, så la oss gå videre og gjøre dette: 1036 01:05:31,810 --> 01:05:38,550 min favoritt nettside er, la oss si, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Lagre, laste. Okay. Det er et par problemer nå foruten den skrekkelige nettstedet. 1038 01:05:43,810 --> 01:05:47,310 1, er jeg ganske sikker på at jeg traff inn her. Og jeg gjorde. 1039 01:05:47,310 --> 01:05:51,590 Jeg ikke bare trykke Enter, jeg også rykket, praktisere det vi har forkynt om stil, 1040 01:05:51,590 --> 01:05:54,930 men min er rett ved siden av verden. 1041 01:05:54,930 --> 01:05:58,410 Så hvorfor er dette? Nettlesere bare gjøre det du ber dem om å gjøre. 1042 01:05:58,410 --> 01:06:04,010 Jeg har ikke fortalt leseren, "Break linjer her. Sett ledd pause her." 1043 01:06:04,010 --> 01:06:07,820 Så leseren, spiller det ingen rolle om jeg traff Return 30 ganger, 1044 01:06:07,820 --> 01:06:10,820 det er fortsatt kommer til å sette min rett ved siden av verden. 1045 01:06:10,820 --> 01:06:15,930 Hva jeg virkelig har å gjøre her er å si noe sånt som
, sette inn et linjeskift. 1046 01:06:15,930 --> 01:06:17,940 >> Og faktisk er et linjeskift slags merkelig ting 1047 01:06:17,940 --> 01:06:21,650 fordi du ikke kan virkelig begynne å flytte til en annen linje, så gjør noe, 1048 01:06:21,650 --> 01:06:25,380 og deretter stoppe å flytte til en ny linje. Det er slags en atom operasjon. 1049 01:06:25,380 --> 01:06:28,140 Du enten gjøre det eller gjør du ikke. Du trykker på Enter eller ikke. 1050 01:06:28,140 --> 01:06:33,390 Så br er en liten bit av en annen kode, og så jeg trenger å sortere både åpne og lukke den 1051 01:06:33,390 --> 01:06:35,230 alt på en gang. 1052 01:06:35,230 --> 01:06:37,500 Syntaksen for det er dette. 1053 01:06:37,500 --> 01:06:41,760 Teknisk, kan du gjøre noe som dette i noen versjoner av HTML, 1054 01:06:41,760 --> 01:06:45,600 men dette er bare dumt fordi det er ingen grunn til å starte og stoppe noe 1055 01:06:45,600 --> 01:06:48,420 hvis du kan i stedet gjøre alt på en gang. 1056 01:06:48,420 --> 01:06:52,310 Innse at HTML5 ikke strengt nødvendig denne skråstrek, 1057 01:06:52,310 --> 01:06:55,410 så du vil se lærebøker og elektroniske ressurser som ikke har det, 1058 01:06:55,410 --> 01:06:59,780 men for godt mål la oss øve på symmetri som vi har sett så langt. 1059 01:06:59,780 --> 01:07:02,870 Dette betyr at brikken er både åpnes og lukkes. 1060 01:07:02,870 --> 01:07:05,220 Så nå la meg lagre filen min, gå tilbake hit. 1061 01:07:05,220 --> 01:07:10,240 Ok, så det begynner å se bedre ut, bortsett fra nettet jeg vet er slags klikkbare, 1062 01:07:10,240 --> 01:07:13,610 og likevel youtube her ikke synes å føre til noe. 1063 01:07:13,610 --> 01:07:17,560 Det er fordi selv om det ser ut som en link, ikke nettleseren ikke vet at per se, 1064 01:07:17,560 --> 01:07:20,670 så jeg må fortelle leseren at dette er en kobling. 1065 01:07:20,670 --> 01:07:22,620 >> Måten å gjøre dette på er å bruke et anker tag: 1066 01:07:22,620 --> 01:07:26,770 01:07:35,900 = "Http://www.youtube.com"> 1068 01:07:35,900 --> 01:07:38,490 og la meg flytte denne til en ny linje bare så det er litt mer lesbar, 1069 01:07:38,490 --> 01:07:40,060 og jeg vil krympe skriftstørrelsen. 1070 01:07:40,060 --> 01:07:43,890 Jeg er ferdig ennå? Nei Det kommer til å bli denne motsetningen. 1071 01:07:43,890 --> 01:07:46,760 Denne taggen, ankerkoden, tar faktisk et attributt, 1072 01:07:46,760 --> 01:07:52,900 som modifiserer sin atferd, og verdien av attributtet er tilsynelatende YouTube URL. 1073 01:07:52,900 --> 01:07:56,380 Men legg merke motsetningen er at bare fordi det er nettadressen du skal, 1074 01:07:56,380 --> 01:08:01,020 det betyr ikke at må være ordet som du understreking og gjør en link. 1075 01:08:01,020 --> 01:08:03,960 Snarere kan det være noe sånt som dette. 1076 01:08:03,960 --> 01:08:10,870 Så jeg må si slutte å gjøre dette ordet en hyperkobling ved hjelp av tett ankerkoden. 1077 01:08:10,870 --> 01:08:12,650 Legg merke til jeg ikke gjør dette. 1078 01:08:12,650 --> 01:08:15,890 1, vil dette bare være en sløsing med alles tid, og det er ikke nødvendig. 1079 01:08:15,890 --> 01:08:19,290 >> For å lukke en tag, du bare nevner navnet på koden på nytt. 1080 01:08:19,290 --> 01:08:21,800 Du trenger ikke nevne noen av attributtene. 1081 01:08:21,800 --> 01:08:26,189 Så la oss lagre det, gå tilbake. Ok, voila, nå er det blå og hyperkoblet. 1082 01:08:26,189 --> 01:08:29,430 Hvis jeg klikker på den, jeg faktisk gjør gå til YouTube. 1083 01:08:29,430 --> 01:08:32,529 Så selv om min nettside er ikke på internett, er det minst HTML, 1084 01:08:32,529 --> 01:08:37,930 og hvis vi la Internett fange opp, ville vi faktisk ende opp her på youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Og jeg kan gå tilbake og her er min nettside. Men legg merke dette. 1086 01:08:40,670 --> 01:08:43,120 Hvis du noen gang har fått spam eller phishing-angrep, 1087 01:08:43,120 --> 01:08:45,850 nå har du muligheten etter bare fem minutter å gjøre det samme. 1088 01:08:45,850 --> 01:08:50,920 Vi kan gå her og gjøre noe som www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 eller hva den sketchy nettstedet er, og da kan du si bekrefte din PayPal-konto. 1090 01:08:59,319 --> 01:09:04,840 [Latter] Og nå dette kommer til å gå til badguy.com, som jeg ikke kommer til å klikke på 1091 01:09:04,840 --> 01:09:08,000 fordi jeg har ingen anelse om hvor det fører. [Latter] 1092 01:09:08,000 --> 01:09:10,859 >> Men vi har nå muligheten til å faktisk ende opp der. 1093 01:09:10,859 --> 01:09:12,640 Så vi egentlig bare begynt å skrape i overflaten. 1094 01:09:12,640 --> 01:09:15,830 Vi er ikke programmering per se, vi skriver kodespråk. 1095 01:09:15,830 --> 01:09:18,569 Men så snart vi avrunder vår vokabular i HTML, 1096 01:09:18,569 --> 01:09:21,520 vi vil introdusere PHP, en faktisk programmeringsspråk 1097 01:09:21,520 --> 01:09:26,859 som vil tillate oss å generere HTML automatisk, generere CSS automatisk, 1098 01:09:26,859 --> 01:09:29,430 slik at vi kan begynne på onsdag for å gjennomføre, sier 1099 01:09:29,430 --> 01:09:31,700 vår egen søkemotor og mer. 1100 01:09:31,700 --> 01:09:34,770 Men mer om det i et par dager. Vi vil se deg da. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]