1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Uge 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 Ok. Velkommen tilbage. Dette er CS50, og dette er begyndelsen af ​​uge 7. 5 00:00:12,280 --> 00:00:14,690 Et par små meddelelser: 6 00:00:14,690 --> 00:00:18,150 Pset5 er nu i gang, eller snart skal være, 7 00:00:18,150 --> 00:00:21,590 og lad mig sige, helt ærligt, er dette en tendens til at være blandt de mere udfordrende 8 00:00:21,590 --> 00:00:24,460 af kursets problem sæt, så lad mig nævne det nu 9 00:00:24,460 --> 00:00:28,190 således at denne uge mere end nogensinde du ikke vente, siger, onsdag aften 10 00:00:28,190 --> 00:00:29,920 eller torsdag aften at dykke i. 11 00:00:29,920 --> 00:00:32,369 Dette er absolut en interessant Pset. Vi synes, det er sjovt. 12 00:00:32,369 --> 00:00:36,110 Hvis du rent faktisk får det fuldt korrekt og kan derefter udfordre den såkaldte Big Board, 13 00:00:36,110 --> 00:00:39,830 har du mulighed for at matche kræfter med nogle af kursets personale 14 00:00:39,830 --> 00:00:41,620 og nogle af dine klassekammerater. 15 00:00:41,620 --> 00:00:44,670 Hvad The Big Board er er når du har din stavekontrol arbejde, 16 00:00:44,670 --> 00:00:48,860 vil du være i stand til at gå til cs50.net efter kører en kommando, 17 00:00:48,860 --> 00:00:52,430 rent tilmelde, og derefter mængden af ​​tid og mængden af ​​RAM og mere 18 00:00:52,430 --> 00:00:56,130 at du har brugt i din implementering vil blive udstillet her på kursets hjemmeside. 19 00:00:56,130 --> 00:00:59,740 Du vil opdage, at en hel masse af disse folk her er opført som personale 20 00:00:59,740 --> 00:01:04,220 da i løbet af weekenden, troede personalet, det ville være sjovt at prøve at overgå hinanden. 21 00:01:04,220 --> 00:01:07,390 Så indse, at målet her ikke er at overgå de ansatte. 22 00:01:07,390 --> 00:01:09,790 Selv er jeg kun her på nummer 13. 23 00:01:09,790 --> 00:01:13,790 Rent tilmelde, men det er en mulighed for at se hvor lidt RAM 24 00:01:13,790 --> 00:01:16,790 og hvor få CPU sekunder kan du bruge vis-a-vis nogle af dine klassekammerater. 25 00:01:16,790 --> 00:01:20,540 >> Og jeg vil indrømme, at Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 i øjeblikket nummer 1 position som en af ​​de TF'er, 27 00:01:23,750 --> 00:01:28,120 dette er en implementering, som vi ikke kalde mulig 28 00:01:28,120 --> 00:01:32,700 idet han bruger næsten 0 RAM og næsten 0 sekunder til ilægning. 29 00:01:32,700 --> 00:01:35,670 Så vi tager os af Kevin offline. [Latter] 30 00:01:35,670 --> 00:01:40,950 Der er visse færdigheder, som Kevin er ved at lægge til testen her. 31 00:01:40,950 --> 00:01:45,280 En af de ting, vi troede, vi ville gøre alt for nu CS50x er en uge i gang, 32 00:01:45,280 --> 00:01:49,520 og du fyre er lige så meget en del af dette eksperiment som de studerende er. 33 00:01:49,520 --> 00:01:53,720 Vi har bedt dem som en del af deres pset0, hvilket var ligeledes at indsende en Scratch projekt 34 00:01:53,720 --> 00:01:58,280 af interesse for dem - et spil, en interaktiv kunstværk, en animation eller lignende - 35 00:01:58,280 --> 00:02:03,700 en 1 - til 2-minutters video, hvis de gerne vil, siger hej til verden og hvem de egentlig er. 36 00:02:03,700 --> 00:02:06,780 Jeg tænkte jeg ville dele med jer bare et par af de videoer, der er blevet fremlagt hidtil 37 00:02:06,780 --> 00:02:10,759 fordi for os, om de ansatte i det mindste, det har virkelig været spændende 38 00:02:10,759 --> 00:02:14,220 og inspirerende at se disse folk fra hele verden - lande over hele verden - 39 00:02:14,220 --> 00:02:18,160 tuning i, af alle ting, til en computer science kursus på internettet, 40 00:02:18,160 --> 00:02:20,410 uanset om det er fordi de ønsker at fortsætte deres egne undersøgelser, 41 00:02:20,410 --> 00:02:22,300 de ønsker at tage deres karriere i en ny retning, 42 00:02:22,300 --> 00:02:24,390 de ønsker at udfylde huller i deres egen viden, 43 00:02:24,390 --> 00:02:27,190 så nogle af de samme grunde, som du fyre måske har været her. 44 00:02:27,190 --> 00:02:31,090 >> Så jeg giver dig en sådan elev her. Du kan hæve lydstyrken bare en lille smule. 45 00:02:31,090 --> 00:02:35,520 Her er en af ​​vores elevers 1-minut indlæg. 46 00:02:35,520 --> 00:02:40,380 Hej, verden. Jeg er en elev af industriel ingeniørvirksomhed her i Malaga, Spanien. 47 00:02:40,380 --> 00:02:45,840 Jeg er begejstret for dette online kursus, fordi jeg elsker datalogi, det gør jeg virkelig, 48 00:02:45,840 --> 00:02:48,880 og jeg virkelig værdsætter, at jeg får at udforske det. 49 00:02:48,880 --> 00:02:51,940 Og det faktum, at jeg kan lære det samme alle jer fyre 50 00:02:51,940 --> 00:02:57,040 men i stedet for at være i Harvard Jeg er i Malaga, er hvordan awesome det? 51 00:02:57,040 --> 00:03:02,040 Tja, jeg er Fernando, og det er CS50. Se jer. 52 00:03:02,040 --> 00:03:07,100 [Latter] En anden klip vi godt kan lide, vil du opdage, at denne gentleman-engelsk ikke er så stærk. 53 00:03:07,100 --> 00:03:11,520 Det ser ud som om han havde det maskine oversat, så oversættelserne selv er en smule ufuldkommen, 54 00:03:11,520 --> 00:03:15,790 men det var en af ​​vores favoritter hidtil så godt. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Hej, verden. [Taler i japansk] 57 00:03:32,370 --> 00:03:39,830 [Jeg er nødt til at hilse på japansk, fordi mit engelsk er meget upålidelige.] 58 00:03:39,830 --> 00:03:45,380 [Jeg har leveret budskabet til dig fra byen Gifu, Japan.] 59 00:03:45,380 --> 00:03:49,820 [Jeg kan være en elev for første gang i 20 år, som det kan ses.] 60 00:03:49,820 --> 00:03:54,640 [Jeg er meget taknemmelig for Harvard University, der gav mig denne mulighed og EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf er en guitar og min yndlings ting kører.] [Latter] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Hvorfor tror du, jeg prøvede at deltage i et cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, det er min længsel.] 65 00:04:14,990 --> 00:04:19,740 [Især hvis jeg er fjernt tilstedeværelse boede i Japan.] 66 00:04:19,740 --> 00:04:26,680 [Jeg ønskede at forsøge straks klar over eksistensen af ​​en sådan EDX hvornår.] 67 00:04:26,680 --> 00:04:32,500 [Tror du ikke, så du behøver ikke relateret til alder af læring I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 er min længsel. Mit navn er Kazu, og dette er CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [bifald og råber] 70 00:04:43,090 --> 00:04:49,220 En anden favorit vores var dette anbringende her fra nogen. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google det, hvis du ikke er fortrolig med denne meme. 72 00:04:55,380 --> 00:05:01,480 >> Og så endelig et par andre, der fik bogført at måske vinde yndig pris. 73 00:05:01,480 --> 00:05:06,820 [Studerende] Aww! >> [Malan] Vi bliver nødt til at lytte. Det er kort, så lyt nøje. 74 00:05:08,580 --> 00:05:11,150 [Kvindelig taler] Hvad er dit navn? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Kvindelig taler] Hvad er det? >> [Fniser] CS50. [Latter] 76 00:05:16,120 --> 00:05:19,510 [Malan] Han gjorde to tager, selv om. 77 00:05:19,510 --> 00:05:22,240 Her går vi, det sidste. 78 00:05:23,030 --> 00:05:26,980 Mit navn er Louie, og dette er CS50. 79 00:05:26,980 --> 00:05:30,250 [Latter] Dette er så CS50x. 80 00:05:30,250 --> 00:05:33,230 Tak til alle dem af jer, mens du følger langs derhjemme 81 00:05:33,230 --> 00:05:35,620 der har tage del hidtil. 82 00:05:35,620 --> 00:05:39,510 I dag, vi afslutter vores diskussion af datastrukturer, 83 00:05:39,510 --> 00:05:41,160 i det mindste nogle af de mest grundlæggende, 84 00:05:41,160 --> 00:05:44,760 og så fortsætter vi vores samtale om HTML og webprogrammering. 85 00:05:44,760 --> 00:05:48,520 Faktisk har vi brugt de sidste ca syv uger at se på de grundlæggende principper for 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 måske har oplevet hidtil, 88 00:05:53,050 --> 00:05:57,060 er ikke nødvendigvis den mest tilgængelige af sprog 89 00:05:57,060 --> 00:05:59,090 med til at gennemføre nogle af disse ideer. 90 00:05:59,090 --> 00:06:01,880 Og så begynder i denne uge og i næste uge og derefter den følgende, 91 00:06:01,880 --> 00:06:07,110 vi vil endelig være i stand til at skifte fra C, hvilket er almindeligt kendt som et ret lavt niveau sprog, 92 00:06:07,110 --> 00:06:11,190 til ting højere niveau, blandt dem PHP, JavaScript og lignende, 93 00:06:11,190 --> 00:06:14,850 som vi vil se trække på de samme erfaringer, som vi har lært i løbet af de sidste par uger, 94 00:06:14,850 --> 00:06:19,430 men du vil opdage, at erklære ting som arrays og hash-tabeller og søgning og sortering 95 00:06:19,430 --> 00:06:23,370 blevet så meget lettere, fordi de sprog, selv vi vil begynde at bruge 96 00:06:23,370 --> 00:06:25,290 vil blive mere kraftfuld. 97 00:06:25,290 --> 00:06:27,410 Men først en ansøgning af træer. 98 00:06:27,410 --> 00:06:30,240 Det er meget almindeligt i disse dage at nødt til at komprimere oplysninger. 99 00:06:30,240 --> 00:06:34,770 I hvilken sammenhæng ville du ønsker at komprimere en slags digital information? 100 00:06:37,190 --> 00:06:39,670 >> Yeah. >> [Studerende] Når du har brug for at sende det via internettet. 101 00:06:39,670 --> 00:06:41,450 Ja, når du ønsker at sende noget via internettet. 102 00:06:41,450 --> 00:06:44,950 Hvis du ønsker at downloade en stor fil, er det ideelt, hvis nogen på den anden ende 103 00:06:44,950 --> 00:06:48,760 har komprimeret filen ved hjælp af en zip-format eller noget i den retning 104 00:06:48,760 --> 00:06:53,760 så du sender færre bits end man ellers skal sendes. 105 00:06:53,760 --> 00:06:55,500 Så hvordan kan du komprimere information? 106 00:06:55,500 --> 00:07:00,540 Det hele kan koges ned til at bruge færre bits end der kræves som standard. 107 00:07:00,540 --> 00:07:03,220 Men det er sådan en underlig ting, fordi tænke tilbage på uge 0 og 1 108 00:07:03,220 --> 00:07:07,370 når vi talte om ASCII og binære og vi talte om ASCII især 109 00:07:07,370 --> 00:07:10,690 som bruger 8 bit til at repræsentere bogstaver i alfabetet 110 00:07:10,690 --> 00:07:16,120 således at bogstavet A er repræsenteret ved 65, små bogstaver a er antallet 97, 111 00:07:16,120 --> 00:07:21,210 og dog du repræsenterer 65 eller 97, du bruger 7 eller 8 bit. 112 00:07:21,210 --> 00:07:24,120 Men fangsten er, at der er nogle bogstaver i det engelske alfabet 113 00:07:24,120 --> 00:07:26,230 der er ikke så populære som andre. 114 00:07:26,230 --> 00:07:31,600 Z er ikke så populær, Q er ikke så populær, men A og E er super populære. 115 00:07:31,600 --> 00:07:37,280 Og dog for alle disse breve, som standard verden bruger det samme antal bit, kun 8. 116 00:07:37,280 --> 00:07:42,690 Så ville det ikke have været smartere, hvis stedet for at bruge 8 bit for hvert bogstav, 117 00:07:42,690 --> 00:07:47,440 selv de mest hyppigt anvendes som Q og Z, 118 00:07:47,440 --> 00:07:51,910 hvad nu hvis vi brugte færre bits for A og E og S og de mest populære bogstaver 119 00:07:51,910 --> 00:07:55,000 og bruges flere bits for de mindre populære bogstaver, 120 00:07:55,000 --> 00:07:57,770 Ideen er lad os optimere for den fælles sag, 121 00:07:57,770 --> 00:08:01,160 der er et tema i datalogi for at forsøge at optimere, hvad der kommer til at ske mest 122 00:08:01,160 --> 00:08:05,310 og tilbringe lidt mere tid, lidt mere plads på de ting,, yeah, kunne ske 123 00:08:05,310 --> 00:08:07,680 men ikke nødvendigvis så tit. 124 00:08:07,680 --> 00:08:09,330 Så lad os tage et eksempel. 125 00:08:09,330 --> 00:08:12,610 >> Antag, at vi ønsker at indkode information temmelig effektivt. 126 00:08:12,610 --> 00:08:15,090 Du har måske vokset op uden at kende lidt om Morse kode, 127 00:08:15,090 --> 00:08:17,450 og odds er du ikke vidste den konkrete kode 128 00:08:17,450 --> 00:08:21,750 men du kan huske, at det er mindst denne serie af prikker og streger. 129 00:08:21,750 --> 00:08:26,640 Dette er en ret effektiv kodning, og bemærk, at de mest populære bogstav - for eksempel, E - 130 00:08:26,640 --> 00:08:28,980 bruger den korteste af bip-lyde. 131 00:08:28,980 --> 00:08:31,740 Morse kode handler om bip-bip-bip-bip-bip-bip og holde toner 132 00:08:31,740 --> 00:08:34,799 enten i korte tidsrum eller længere perioder. 133 00:08:34,799 --> 00:08:40,330 E, som angivet af prik, er en super kort bip, bare bip, og det ville repræsentere E. 134 00:08:40,330 --> 00:08:43,960 Derimod vil T være en længere bip, ligesom bip [forlænger lyd], 135 00:08:43,960 --> 00:08:45,710 og der ville repræsentere T. 136 00:08:45,710 --> 00:08:48,840 Men det er stadig temmelig kort, fordi derimod hvis man ser på Z, 137 00:08:48,840 --> 00:08:52,690 at udtrykke Z du ville gå bip, bip [længere lyd], bip, bip [kortere lyd]. 138 00:08:52,690 --> 00:08:55,360 Så det er længere, fordi det er mindre udbredt. 139 00:08:55,360 --> 00:08:58,150 Men gotcha her er, at morsekode er en smule fejlbehæftet 140 00:08:58,150 --> 00:09:00,610 i, at det ikke umiddelbart kan dekodes. 141 00:09:00,610 --> 00:09:07,350 For eksempel antage, at du hører om nogle ende af tråden bip [kort], bip [lang]. 142 00:09:07,350 --> 00:09:12,480 Hvilket budskab har jeg bare modtage? En prik og en streg. Hvad betyder det for? 143 00:09:12,480 --> 00:09:15,330 [Studerende] A. >> [Malan] Måske. 144 00:09:15,330 --> 00:09:18,270 Det kunne også være E efterfulgt af T. 145 00:09:18,270 --> 00:09:23,390 Med andre ord morsekode, selvom det udnytter dette princip at optimere hjørnet tilfældet, 146 00:09:23,390 --> 00:09:26,250 det egner sig ikke til øjeblikkelig decodability. 147 00:09:26,250 --> 00:09:29,850 Det vil sige, mennesket, der hører eller modtagelsen af ​​disse prikker og streger 148 00:09:29,850 --> 00:09:34,540 har en eller anden måde finde ud af hvor pauserne er mellem bogstaver, 149 00:09:34,540 --> 00:09:39,660 fordi hvis du ikke ved, hvor disse pauser er, kan du forvirre A til ET eller omvendt. 150 00:09:39,660 --> 00:09:43,880 >> Så hvad kan du gøre? I morsekode du bare kunne pause mellem hver af bogstaverne. 151 00:09:43,880 --> 00:09:47,660 Men pause er slags modstrid med hele pointen med at fremskynde tingene op. 152 00:09:47,660 --> 00:09:52,880 Så hvad nu hvis vi i stedet kom op med en kode, hvor der ikke var denne dårlig situation 153 00:09:52,880 --> 00:09:56,570 hvor E er et præfiks for eksempel af A - 154 00:09:56,570 --> 00:10:00,020 med andre ord, hvis vi kunne sørge for, at de mønstre stadig er kort for de populære breve 155 00:10:00,020 --> 00:10:04,850 længes efter de mindre populære bogstaver, men der er ingen mulig forvirring? 156 00:10:04,850 --> 00:10:08,930 En mand ved navn Huffman år siden opfandt denne ordning kaldet Huffman kodning 157 00:10:08,930 --> 00:10:12,390 der rent faktisk udnytter en af ​​de datastrukturer vi har brugt lidt tid på at tale om 158 00:10:12,390 --> 00:10:16,560 denne sidste uge, nemlig træer, binære træer specifikt - 159 00:10:16,560 --> 00:10:19,710 et binært træ betyder, at det ikke har nogen mere end 2 børn. 160 00:10:19,710 --> 00:10:22,720 Det har måske en venstre barn, måske en ret barn, og det er det. 161 00:10:22,720 --> 00:10:26,510 Så formoder bare af hensyn til diskussion, at nogen ønsker at sende en besked 162 00:10:26,510 --> 00:10:31,270 der ser sådan ud. Det er komplet nonsens, men det er sammensat af As, Bs, Cs, Ds og Es. 163 00:10:31,270 --> 00:10:34,890 Og hvis du rent faktisk tælle op alle de As, Bs, Cs, Ds og Es 164 00:10:34,890 --> 00:10:36,870 og derefter dividere med det samlede antal bogstaver, 165 00:10:36,870 --> 00:10:42,710 denne lille diagram her siger, at 45% af brevene 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 antage, at den citerede streng der 168 00:10:47,330 --> 00:10:49,080 er blot nogle meddelelse, du vil sende. 169 00:10:49,080 --> 00:10:52,180 Det sker for at være nonsens bare så vi kan bruge så få bogstaver som muligt, 170 00:10:52,180 --> 00:10:55,220 men det er faktisk sådan, at E er fortsat det mest populære, 171 00:10:55,220 --> 00:11:01,450 og B og C er den mindst populære i det mindste af disse 5 bogstaver i alfabetet. 172 00:11:01,450 --> 00:11:04,040 Så hvordan kan vi gå om at komme op med en kodning, 173 00:11:04,040 --> 00:11:08,430 en binær kodning, et mønster af 0'er og 1-taller for hver af disse breve 174 00:11:08,430 --> 00:11:14,820 på en sådan måde, at E er en kort mønster og måske B og C er lidt længere mønstre, 175 00:11:14,820 --> 00:11:19,270 igen, Ideen er, at vi ønsker at bruge færre bits meste af tiden 176 00:11:19,270 --> 00:11:21,790 og flere bits kun én gang i et stykke tid. 177 00:11:21,790 --> 00:11:26,070 Ifølge Huffman kodning, kan du oprette en skov af træer. 178 00:11:26,070 --> 00:11:31,190 Der er en slags historie linje her, der involverer træer og også processen med at opbygge dem op. 179 00:11:31,190 --> 00:11:32,420 Lad os begynde. 180 00:11:32,420 --> 00:11:36,140 >> Jeg foreslår, at du starter med denne skov, så at sige, af 5 træer, 181 00:11:36,140 --> 00:11:38,260 som hver især er en temmelig dum træ. 182 00:11:38,260 --> 00:11:42,800 Træet består af blot en enkelt knude, som repræsenteret ved en cirkel. 183 00:11:42,800 --> 00:11:45,310 Så hver af disse ting kan være en C struct 184 00:11:45,310 --> 00:11:50,200 og indersiden af ​​C struct kan være en flyder, der repræsenterer hyppigheden 185 00:11:50,200 --> 00:11:52,510 og så måske en char repræsenterer brevet. 186 00:11:52,510 --> 00:11:56,470 Så tænk på disse knudepunkter som bare noget gammelt C struct, men for nu, højere niveau. 187 00:11:56,470 --> 00:12:01,230 Dette er en skov af 5 træer, hver af hvem kun har en enkelt node. 188 00:12:01,230 --> 00:12:06,830 Hvad Huffman foreslåede er, at vi begynder at kombinere de træer 189 00:12:06,830 --> 00:12:11,140 der har de mindste frekvens tæller i lidt større træer 190 00:12:11,140 --> 00:12:13,490 ved at forbinde dem med en ny rod node. 191 00:12:13,490 --> 00:12:17,560 Så blandt de breve her, at for nemheds jeg har sorteret dem fra venstre mod højre, 192 00:12:17,560 --> 00:12:21,420 selv om det ikke er strengt nødvendigt, og bemærk, at de mindste knudepunkter 193 00:12:21,420 --> 00:12:23,930 er i øjeblikket 10% og 10%. 194 00:12:23,930 --> 00:12:28,940 Så Huffman foreslog, at vi flette de 2 mindste knudepunkter i et nyt træ 195 00:12:28,940 --> 00:12:34,450 ved at indføre en ny forælder node og derefter give den pågældende forælder en venstre barn og en højre barn 196 00:12:34,450 --> 00:12:37,720 hvor B er vilkårligt venstre og C er vilkårligt højre. 197 00:12:37,720 --> 00:12:41,590 Og så Huffman desuden foreslået, at lad os nu bare tænke på den venstre barn 198 00:12:41,590 --> 00:12:44,790 i et af disse træer altid som værende repræsenteret ved 0 199 00:12:44,790 --> 00:12:47,890 og den rigtige barn altid som at være repræsenteret med tallet 1. 200 00:12:47,890 --> 00:12:50,680 >> Det betyder ikke noget, hvis du vende dem, så længe du er konsekvent. 201 00:12:50,680 --> 00:12:54,650 Så nu har vi fire træer i denne skov. 202 00:12:54,650 --> 00:12:58,050 Og jeg siger fire, fordi nu træet på venstre - 203 00:12:58,050 --> 00:13:00,570 og det er ikke så meget et træ i den forstand, at det vokser på denne måde, 204 00:13:00,570 --> 00:13:05,170 det er mere som et stamtræ, hvor nu 0,2 er en slags moderselskab for de to børn - 205 00:13:05,170 --> 00:13:07,930 bemærke, at i denne forælder vi har trukket 0,2. 206 00:13:07,930 --> 00:13:13,370 Vi har tilføjet de frekvensbånd tællinger af de to børn og givet den nye node den samlede sum. 207 00:13:13,370 --> 00:13:15,310 Så nu er vi bare gentage denne proces. 208 00:13:15,310 --> 00:13:19,490 Find de to mindste noder og derefter slutte sig til dem i et nyt træ 209 00:13:19,490 --> 00:13:21,380 og derefter gentage processen yderligere. 210 00:13:21,380 --> 00:13:26,390 Lige nu har vi et par kandidater, 20%, 15% og yderligere 20%. 211 00:13:26,390 --> 00:13:29,780 I dette tilfælde er vi nødt til at bryde uafgjort. Vi kan gøre det vilkårligt. 212 00:13:29,780 --> 00:13:31,540 Vi skal bare gøre det konsekvent. 213 00:13:31,540 --> 00:13:33,760 I dette tilfælde vil jeg vilkårligt gå med den til venstre, 214 00:13:33,760 --> 00:13:39,880 og jeg nu fusionere de 20% og 15% for at give mig en ny forælder kaldet 35%, 215 00:13:39,880 --> 00:13:46,310 hvis venstre barn er 0, hvis ret barn er 1, og nu har vi kun tre træer i skoven. 216 00:13:46,310 --> 00:13:47,960 Du kan måske se, hvor dette foregår. 217 00:13:47,960 --> 00:13:51,150 Hvis vi gentager dette et par gange mere, vi vil have bare en større træ, 218 00:13:51,150 --> 00:13:53,900 hvor alle kanter er mærket med 0'er og 1'ere. 219 00:13:53,900 --> 00:13:55,710 Lad os gøre det igen. 220 00:13:55,710 --> 00:14:02,600 35% er, at træets rod. 20% og 45%, så vi vil fusionere de 35% og 20%. 221 00:14:02,600 --> 00:14:05,610 Nu har vi dette træ her. Vi tilføje dem sammen, har vi 55%. 222 00:14:05,610 --> 00:14:07,910 Nu er der kun to træer i skoven. 223 00:14:07,910 --> 00:14:11,900 Vi gør dette en sidste gang, og forhåbentlig matematisk alle frekvenser tilføje op 224 00:14:11,900 --> 00:14:15,570 fordi de siden skulle vi beregnet dem fra get-go at tilføje op til 100%. 225 00:14:15,570 --> 00:14:17,960 Og nu har vi et træ. 226 00:14:17,960 --> 00:14:20,580 Så dette er en Huffman-kodning træ. 227 00:14:20,580 --> 00:14:24,400 Det slags tog lang tid at få der verbalt, men virkeligheden er med en for-løkke 228 00:14:24,400 --> 00:14:27,620 eller med en rekursiv funktion, kan du bygge denne ting op temmelig hurtigt. 229 00:14:27,620 --> 00:14:32,440 Så nu har vi en ny knude, og alle disse indre knudepunkter er blevet malloc'd, 230 00:14:32,440 --> 00:14:34,690 formodentlig undervejs. 231 00:14:34,690 --> 00:14:38,650 Så nu i toppen af ​​dette træ har vi 100%, men nu ser vi, har en sti 232 00:14:38,650 --> 00:14:43,780 fra denne nye tip-tip-oldeforældre til alle de tip-tip-oldebørn 233 00:14:43,780 --> 00:14:45,930 helt i bunden, til alle bladene. 234 00:14:45,930 --> 00:14:52,840 >> Hvad vi vil gøre nu, er foreslå, at for at repræsentere bogstavet E, 235 00:14:52,840 --> 00:14:55,670 Vi vil blot bruge nummer 1. Hvorfor? 236 00:14:55,670 --> 00:15:01,000 For hvis vi krydser dette træ fra den endelige rod ned til bladet er kendt som E, 237 00:15:01,000 --> 00:15:06,050 vi følger blot den ene kant, højre kant, og der er mærket selvfølgelig øverst til højre 1. 238 00:15:06,050 --> 00:15:11,550 Så antydes her for Huffman var, at E er kodning i binær bare skal være 1. 239 00:15:11,550 --> 00:15:14,490 Og det er pretty damn effektiv. Kan ikke rigtig få noget mindre end det. 240 00:15:14,490 --> 00:15:18,350 Derimod er en going at blive repræsenteret, hvis du følger den logik, 241 00:15:18,350 --> 00:15:21,610 ved hvilken mønster af bit i stedet? 01. 242 00:15:21,610 --> 00:15:25,500 Så for at komme til A, vi starter ved roden, og vi går til venstre og så går vi til højre, 243 00:15:25,500 --> 00:15:28,580 hvilket betyder, at vi fulgte en 0 og derefter en 1. 244 00:15:28,580 --> 00:15:32,810 Så vi repræsenterer bogstavet A med mønsteret 0 og 1. 245 00:15:32,810 --> 00:15:36,010 Og nu ser vi allerede har en egenskab af øjeblikkelig decodability 246 00:15:36,010 --> 00:15:38,090 at vi ikke havde i morsekode. 247 00:15:38,090 --> 00:15:42,840 Selv om begge disse mønstre er temmelig korte - E er 1 bit, A er 2 bits - 248 00:15:42,840 --> 00:15:45,080 bemærket, at de ikke kan forveksles ene eller den anden, 249 00:15:45,080 --> 00:15:54,870 fordi hvis du ser en 1 det har fået til at være en E, hvis du ser et 0 så en 1 det er selvfølgelig nødt til at være et A. 250 00:15:54,870 --> 00:15:58,410 Ligeledes, hvad er D? 001. 251 00:15:58,410 --> 00:16:01,440 Hvad er C? 0001. 252 00:16:01,440 --> 00:16:05,320 Og hvad er B? 0000. 253 00:16:05,320 --> 00:16:09,550 Og igen, fordi alle de breve, vi holder af, er på bladene 254 00:16:09,550 --> 00:16:13,890 og ingen af ​​dem er slags mellemmænd i vejen fra rod til blad, 255 00:16:13,890 --> 00:16:18,760 der er ingen risiko for conflating 2 bogstaver 'forskellige kodninger 256 00:16:18,760 --> 00:16:22,300 idet alle disse bitmønstre er deterministisk. 257 00:16:22,300 --> 00:16:25,280 0000 vil altid være B. 258 00:16:25,280 --> 00:16:29,480 Der er ingen knude et sted i mellem, at du kan forvirre et bogstav for den anden. 259 00:16:29,480 --> 00:16:31,150 Så hvad er konsekvenserne her? 260 00:16:31,150 --> 00:16:35,080 >> Den mest populære bogstav - i dette tilfælde E - har fået den korteste kodning, 261 00:16:35,080 --> 00:16:37,430 A har fået den næste korteste kodning, 262 00:16:37,430 --> 00:16:41,390 og B og C, som vi allerede vidste fra get-go var slags den mindst populære 263 00:16:41,390 --> 00:16:45,390 ved 10% frekvens hver, har de fået den længste kodning. 264 00:16:45,390 --> 00:16:49,410 Og så hvad det betyder nu, er, at hvis du ønsker at sende en besked, der er komprimeret 265 00:16:49,410 --> 00:16:51,950 over internettet eller i en e-mail eller lignende, 266 00:16:51,950 --> 00:16:56,730 snarere end at bruge standard ASCII, kan du sende et Huffman kodet meddelelse 267 00:16:56,730 --> 00:17:01,720 hvorved hvis du ønsker at sende brevet E, du sender bare en enkelt bit. 268 00:17:01,720 --> 00:17:05,680 Hvis du ønsker at sende en A, kan du sende 2 bit, 01, i stedet for at sende 8 bit 269 00:17:05,680 --> 00:17:10,190 efterfulgt af yderligere 8 bit efterfulgt af en anden 8 bits og så videre. 270 00:17:10,190 --> 00:17:11,940 Men der er en gotcha her. 271 00:17:11,940 --> 00:17:17,079 Det er ikke nok bare at konstruere dette træ, og derefter begynde at sende fra Alice til Bob 272 00:17:17,079 --> 00:17:20,010 den kortere bit mønster, snor fra ASCII, 273 00:17:20,010 --> 00:17:23,140 fordi Alice også underrette Bob, hvad 274 00:17:23,140 --> 00:17:26,880 hvis Bob vil være i stand til at læse hendes komprimerede besked? 275 00:17:26,880 --> 00:17:30,770 [Uhørlig student svar] >> Hvad er det? 276 00:17:30,770 --> 00:17:32,310 [Uhørlig student svar] >> Af hvad træet er. 277 00:17:32,310 --> 00:17:35,160 Eller endnu mere specifikt, hvad disse kodninger er, 278 00:17:35,160 --> 00:17:39,010 især da i løbet af denne historie har vi lavet en dom opkald på et tidspunkt. 279 00:17:39,010 --> 00:17:43,640 Husk, at vi var nødt til at plukke vilkårligt mellem de 2 forskellige 20% noder? 280 00:17:43,640 --> 00:17:49,800 Så det er ikke sådan, at Bob, modtageren, kan bare rekonstruere træet på sin egen 281 00:17:49,800 --> 00:17:53,390 fordi han måske vil skabe træet nogensinde så lidt forskelligt fra Alice. 282 00:17:53,390 --> 00:17:56,670 I øvrigt har Bob ikke engang ved, hvad den oprindelige meddelelse er 283 00:17:56,670 --> 00:18:00,770 fordi det eneste Alice sender ham, er selvfølgelig den komprimerede indlæg. 284 00:18:00,770 --> 00:18:05,900 >> Så fangsten med komprimering som dette er, at ja, kan Alice spare en hel masse bits 285 00:18:05,900 --> 00:18:09,900 ved at sende 1 for E og 01 for A og så videre, 286 00:18:09,900 --> 00:18:15,180 men hun har også til at informere Bob hvad kortlægning er mellem bogstaver og bits 287 00:18:15,180 --> 00:18:19,620 fordi de ikke kan klart påberåbe sig bare ASCII længere, hvis vi ikke bruger ASCII. 288 00:18:19,620 --> 00:18:22,200 Så hun kan enten sende ham træet eller anden måde - 289 00:18:22,200 --> 00:18:26,600 skrive det ned, gemme det som binære data eller noget i den retning - 290 00:18:26,600 --> 00:18:30,280 eller bare sende ham en lille snyde ark, en Excel-fil, der viser de kortlægninger. 291 00:18:30,280 --> 00:18:36,480 Så effektiviteten af ​​kompression virkelig antager, at de meddelelser, du sender 292 00:18:36,480 --> 00:18:40,230 er temmelig store, mindst mellemstore, 293 00:18:40,230 --> 00:18:42,180 fordi hvis du sender en super kort besked, 294 00:18:42,180 --> 00:18:45,390 hvis du blot ønsker at sende meddelelsen BAD, der sker for at være et ord, vi kan stave her, 295 00:18:45,390 --> 00:18:49,550 B-A-D, er du sandsynligvis kommer til at bruge færre bits, 296 00:18:49,550 --> 00:18:53,130 men fangsten er, hvis du også nødt til at informere Bob hvad træet er 297 00:18:53,130 --> 00:18:57,530 eller hvad disse kodninger er, er du nødt til sandsynligvis opveje alle de besparelser 298 00:18:57,530 --> 00:19:00,110 at have komprimerede ting at begynde med. 299 00:19:00,110 --> 00:19:02,210 Så det kan faktisk være sådan, at hvis du prøver at komprimere 300 00:19:02,210 --> 00:19:05,330 selv med noget lignende lynlås eller filformater, du kan være bekendt med - 301 00:19:05,330 --> 00:19:07,780 temmelig små filer, selv tomme filer - 302 00:19:07,780 --> 00:19:10,930 undertiden disse filer kan få større og ikke mindre. 303 00:19:10,930 --> 00:19:14,320 Men realistisk set, det sker kun for små filstørrelser, 304 00:19:14,320 --> 00:19:16,920 så det kommer ikke til at lave en gigabyte fil være 2 GB; 305 00:19:16,920 --> 00:19:19,480 vi virkelig taler bytes eller blot et par kilobyte. 306 00:19:19,480 --> 00:19:22,330 >> Nogle programmer som zip er smart nok til at indse, at 307 00:19:22,330 --> 00:19:24,590 "Du kommer til at tilbringe flere bits komprimere dette." 308 00:19:24,590 --> 00:19:27,460 "Lad mig ikke gider at komprimere den for dig på alle." 309 00:19:27,460 --> 00:19:30,160 Så dette er blot én måde derefter at komprimere tekst format. 310 00:19:30,160 --> 00:19:32,300 Vi kunne gennemføre noget som dette i C. 311 00:19:32,300 --> 00:19:35,370 For eksempel er her, hvordan man kan udgøre et knudepunkt i dette træ 312 00:19:35,370 --> 00:19:39,320 hvor vi har en char for symbolet, en flydende værdi for den frekvens, 313 00:19:39,320 --> 00:19:42,250 og som vi har set med vore andre datastrukturer, 2 pegepinde, 314 00:19:42,250 --> 00:19:47,080 1 til venstre barn, 1 til højre, som begge kan være nul, 315 00:19:47,080 --> 00:19:50,850 men hvis ikke, det henviser til en venstre barn og en højre barn. 316 00:19:50,850 --> 00:19:55,130 Så, det er Huffman-kodning, og det er en måde at du kan gå om at komprimere information, 317 00:19:55,130 --> 00:19:57,880 og det er helt sikkert en af ​​de mest let at implementere 318 00:19:57,880 --> 00:20:00,830 i forbindelse med, siger, sidste uges datastrukturer, 319 00:20:00,830 --> 00:20:03,250 men endnu mere sofistikerede algoritmer findes 320 00:20:03,250 --> 00:20:08,220 der kan gøre endnu mere sofistikerede mutationer af dine data. 321 00:20:08,220 --> 00:20:11,640 Eventuelle spørgsmål derefter på træer, binære træer eller komprimering af tekst? 322 00:20:11,640 --> 00:20:15,590 [Studerende] Er der nogen tvetydighed, ligesom hvis [uhørligt] opdelt i 01, 323 00:20:15,590 --> 00:20:19,160 så 011 ville være tvetydig, right? 324 00:20:19,160 --> 00:20:22,730 [Uhørlig] >> Godt spørgsmål. Tvetydighed. 325 00:20:22,730 --> 00:20:25,940 Lad mig opsummere ved at henvise til dette billede her. 326 00:20:25,940 --> 00:20:29,650 Fordi de tegn, du komprimere, de repræsentationer, 327 00:20:29,650 --> 00:20:32,850 ved definitionen af ​​denne algoritme altid forbliver bladene, 328 00:20:32,850 --> 00:20:41,870 du aldrig ved et uheld bruge det samme mønster af bits for præfikset af flere breve. 329 00:20:41,870 --> 00:20:46,740 Så med andre ord, du er bekymret, det lyder som, en tvetydighed opstår 330 00:20:46,740 --> 00:20:51,580 hvorved 001 kunne være starten på B eller starten på C eller noget lignende. 331 00:20:51,580 --> 00:20:56,780 Men det kan ikke være tilfældet, fordi bekendtgørelsen, at alle bogstaverne i alfabetet, vi koder 332 00:20:56,780 --> 00:20:58,290 er på bladene. 333 00:20:58,290 --> 00:21:01,910 >> Flertydigheden kan kun opstå, som det er tilfældet med Morse-koden, 334 00:21:01,910 --> 00:21:06,770 hvis for eksempel, var C et eller andet sted langs stien fra roden til B. 335 00:21:06,770 --> 00:21:12,290 [Studerende] Right. Så i dette tilfælde, siger A har 2 blade. >> Sig A har - Sig det igen. 336 00:21:12,290 --> 00:21:18,760 [Studerende] Sig A har 2 blade, F og G, og derefter G - >> Okay. Men det kan man ikke. 337 00:21:18,760 --> 00:21:23,230 En selv kunne ikke have blade F og G, fordi disse skrivelser F og G 338 00:21:23,230 --> 00:21:27,560 i sig selv være overlader et sted til venstre for B eller retten til E. 339 00:21:27,560 --> 00:21:28,900 Så ved definition, skal de være blade. 340 00:21:28,900 --> 00:21:32,940 Ellers er du helt rigtige, har vi ikke løst det problem, at Morse kode står over for. 341 00:21:32,940 --> 00:21:38,150 Godt spørgsmål. Andre spørgsmål? Ok. 342 00:21:38,150 --> 00:21:42,050 Denne opfattelse af bits, viser det sig, vi har haft magten hele tiden, at vi har faktisk ikke brugt 343 00:21:42,050 --> 00:21:44,200 når det kom til at manipulere disse 0'er og 1'ere. 344 00:21:44,200 --> 00:21:46,600 Vi spurgte om dette på en af ​​de tidligste problem sæt: 345 00:21:46,600 --> 00:21:52,340 nemlig, hvordan kan du gå om at konvertere store til små bogstaver eller omvendt? 346 00:21:52,340 --> 00:21:55,460 Eller mere konkret, en af ​​de første psets spurgte 347 00:21:55,460 --> 00:22:01,090 hvor mange bits du faktisk nødt til at vende for at ændre A til små bogstaver et eller vice versa? 348 00:22:01,090 --> 00:22:05,580 Her er en hurtig påmindelse om, hvad 65 og 97 ser ud i binær. 349 00:22:05,580 --> 00:22:08,060 Og selv hvis dette spørgsmål har slags falmet i din hukommelse, 350 00:22:08,060 --> 00:22:11,290 du kan se igen her, at hvor mange bits der skal vendes 351 00:22:11,290 --> 00:22:15,810 at ændre kapital A til små bogstaver a? Blot én. 352 00:22:15,810 --> 00:22:19,650 >> De adskiller sig kun på ét sted, den tredje bit fra venstre. 353 00:22:19,650 --> 00:22:24,240 Hvorimod A har en 010, lille en har en 011. 354 00:22:24,240 --> 00:22:26,250 Så en eller anden måde skal vi bare være i stand til at vende den smule, 355 00:22:26,250 --> 00:22:29,410 og vi kan så udnytte eller små bogstaver. 356 00:22:29,410 --> 00:22:32,720 Vi har gjort dette i fortiden ved faktisk at bruge, hvis forholdene 357 00:22:32,720 --> 00:22:35,930 og kontrol, hvis brevet er mellem kapital A og kapital Z, 358 00:22:35,930 --> 00:22:41,480 så udgange som A - a + 26 eller sådan noget. 359 00:22:41,480 --> 00:22:46,130 Du har sikkert gjorde et aritmetisk ændring af bogstaverne i alfabetet. 360 00:22:46,130 --> 00:22:49,270 Men hvad nu hvis vi bare kunne vende det enkelt bit? 361 00:22:49,270 --> 00:22:59,080 Hvordan kunne du gå om at tage én byte værd af bits, så 8 bit ligesom 01.000.001 og 01.100.001? 362 00:22:59,080 --> 00:23:03,170 Hvis du havde disse mønstre af bits, hvordan kan vi gå om at ændre bare en af ​​dem? 363 00:23:03,170 --> 00:23:07,610 Hvad hvis vi indfører i gult her til andet mønster af bits? 364 00:23:07,610 --> 00:23:13,420 Hvis jeg gør hele gule string 0'er bortset fra den smule, jeg ønsker at ændre 365 00:23:13,420 --> 00:23:17,900 og så vil jeg introducere en ny operatør kendt som en bitvis operatør - 366 00:23:17,900 --> 00:23:21,210 bitvise i den forstand, at den fungerer på enkelte bits, 367 00:23:21,210 --> 00:23:25,360 ikke på en hel byte eller fire bytes på én gang. 368 00:23:25,360 --> 00:23:31,170 Denne lodrette streg der i gul antyder, at det, hvis vi tager repræsentationen af ​​kapital A 369 00:23:31,170 --> 00:23:37,060 og bitvist OR den med den gule sekvens af bits? 370 00:23:37,060 --> 00:23:41,300 Med andre ord tilbage tænke på vores diskussion af boolske udtryk i Scratch og derefter i C. 371 00:23:41,300 --> 00:23:47,520 >> Gør en boolesk eller betyder, at for at være sandt, enten den første ting er at være sandt 372 00:23:47,520 --> 00:23:50,700 eller den anden ting er at være sandt, eller de begge har til at være sandt, 373 00:23:50,700 --> 00:23:53,270 og derefter blev den resulterende output er selv sandt. 374 00:23:53,270 --> 00:24:00,230 I dette tilfælde her, hvad vi får, hvis vi tager 0 "eller" ed med 0? Urigtige eller falsk? 375 00:24:00,230 --> 00:24:04,280 Det er stadig forkert, så det lille en fortsat som forventet. 376 00:24:04,280 --> 00:24:07,540 Hvad hvis vi i stedet gøre 1 eller 0? 377 00:24:07,540 --> 00:24:12,640 Det er nu op 1, men bemærk, hvad der er ved at ske her. 378 00:24:12,640 --> 00:24:18,630 Hvis vi starter med stort A, og vi fortsætter med at "eller" de enkelte bits, som vi laver her, 379 00:24:18,630 --> 00:24:25,180 0 eller den gule giver os, hvad hernede? Det giver os 1. 380 00:24:25,180 --> 00:24:35,120 Faktisk formoder, at vi ikke vidste, hvad det store version af lidt et faktisk var. 381 00:24:35,120 --> 00:24:38,270 Lad os gå gøre dette. Lad mig flytte det tilbage herovre. 382 00:24:38,270 --> 00:24:42,340 Lad os gøre det igen. 0 eller 0 giver mig 0. 383 00:24:42,340 --> 00:24:45,020 1 eller 0 giver mig 1. 384 00:24:45,020 --> 00:24:48,020 0 eller 1 giver mig 1. 385 00:24:48,020 --> 00:24:52,880 0 eller 0 giver mig 0. Det næste er 0, den næste er 0, den næste er 0. 386 00:24:52,880 --> 00:24:55,660 1 eller 0 giver mig 1. 387 00:24:55,660 --> 00:24:59,140 Og så selv om vi ikke vidste på forhånd, hvad små bogstaver et var, 388 00:24:59,140 --> 00:25:04,770 blot ved "eller" ing A med dette mønster af bits, som vi har præsenteret her i gult, 389 00:25:04,770 --> 00:25:09,400 du kan småbogstaver en kapital A ved at vende den smule. 390 00:25:09,400 --> 00:25:11,580 Vi brugte dette udtryk uger siden: flippe en smule. 391 00:25:11,580 --> 00:25:13,710 Hvordan kan du faktisk gøre det programmatisk? 392 00:25:13,710 --> 00:25:16,390 Du bruger hvad der generelt kaldes en maske, en sekvens af bits, 393 00:25:16,390 --> 00:25:19,980 at i dette tilfælde bare så sker for at ligne dette nummer her, 394 00:25:19,980 --> 00:25:22,980 og så skal du "eller" det sammen med denne nye C-operatør, 395 00:25:22,980 --> 00:25:29,940 ikke | |, du bruger en enkelt | og du vil faktisk få dette svar 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å viser det sig, at hvis du tager et stort bogstav A og bitvise ELLER det med tal 32, 398 00:25:42,280 --> 00:25:47,520 fordi det tal 32, når man ser på det som bits ser sådan ud, 399 00:25:47,520 --> 00:25:50,860 det betyder at du kan vende bit at du rent faktisk ønsker. 400 00:25:50,860 --> 00:25:52,630 Og på samme måde - og vi vil se på koden på bare et øjeblik - 401 00:25:52,630 --> 00:25:54,210 formoder vi ønsker at gå den anden vej. 402 00:25:54,210 --> 00:25:58,210 >> Hvordan kan du gå fra små en til kapital A? Hvilken bit skal ændres? 403 00:25:58,210 --> 00:25:59,820 Det er den samme. 404 00:25:59,820 --> 00:26:03,970 Vi ønsker at ændre dette tredje bit fra en 1 til en 0. 405 00:26:03,970 --> 00:26:06,310 Og hvordan kan vi gå om at gøre dette? 406 00:26:06,310 --> 00:26:10,130 Hvordan får vi slukker en smule? Med hvilken mønster af bits kunne vi slukke en smule? 407 00:26:11,580 --> 00:26:14,070 Hvad hvis vi sorterer af invertsukker masken? 408 00:26:14,070 --> 00:26:17,350 Hvor der før gjorde vi det hele gule maske 0'er 409 00:26:17,350 --> 00:26:19,930 undtagen for én bit vi ønskede at tænde, 410 00:26:19,930 --> 00:26:25,580 hvad nu hvis denne gang gør vi det hele maske 1s undtagen for lidt, at vi ønsker at slukke 411 00:26:25,580 --> 00:26:28,330 og derefter bruge hvilken operatør? 412 00:26:28,330 --> 00:26:30,560 Hvad hvis vi "og" ting? Lad os tage et kig. 413 00:26:30,560 --> 00:26:34,880 Hvis vi nu vende til dette, formoder, at jeg igen oprette en maske, der er alt 1s 414 00:26:34,880 --> 00:26:37,650 bortset fra den smule, jeg vil slå 415 00:26:37,650 --> 00:26:43,860 og derefter snarere end "eller" de hvide tal op øverst med de gule tal hernede, 416 00:26:43,860 --> 00:26:46,940 hvad nu hvis jeg i stedet "og" dem sammen? Det kaldes en bitvise og. 417 00:26:46,940 --> 00:26:49,450 Logisk set er det samme som en Boolesk og. 418 00:26:49,450 --> 00:26:55,160 Dette giver mig 0 & 1 er 0. Så falsk og sandt, er falsk. 419 00:26:55,160 --> 00:26:58,160 True og sandt, er sandt. 420 00:26:58,160 --> 00:27:04,020 Og her er det magiske: sandt og falsk er nu forkert, så vi har slukket den smule. 421 00:27:04,020 --> 00:27:06,560 Og nu resten af ​​historien er noget ligetil. 422 00:27:06,560 --> 00:27:11,970 Da resten af ​​masken er 1s, er det ligegyldigt, hvad tallene er i hvid. 423 00:27:11,970 --> 00:27:15,580 Når du "og" noget med sand, er du ikke kommer til at ændre værdien. 424 00:27:15,580 --> 00:27:20,200 Hvis det er sandt, vil det fortsat være sandt. Hvis det var falsk, vil den forblive falsk. 425 00:27:20,200 --> 00:27:23,190 >> Men magien opstår, når du tager noget, der var sandt 426 00:27:23,190 --> 00:27:25,430 og du derefter "og" det med falsk. 427 00:27:25,430 --> 00:27:30,030 Dette har den virkning at slukke denne bit. 428 00:27:30,030 --> 00:27:31,980 Så lidt kryptisk dér. 429 00:27:31,980 --> 00:27:35,390 Lad os faktisk se på noget kode, der kan faktisk se endnu mere kryptisk, 430 00:27:35,390 --> 00:27:38,220 men lad os tage et kig her på tolower. 431 00:27:38,220 --> 00:27:45,880 Hvis jeg ser på tolower, der går fra kapital A til små bogstaver a, 432 00:27:45,880 --> 00:27:47,730 lad os se, hvordan vi kan gennemføre dette program. 433 00:27:47,730 --> 00:27:51,280 Her er vigtigste, og det er ikke at tage nogen kommandolinjeargumenter. 434 00:27:51,280 --> 00:27:55,980 Jeg erklære et tegn c for det brev, som brugeren kommer til at skrive i. 435 00:27:55,980 --> 00:28:00,690 Jeg så bruge en velkendt do while-løkke blot at sørge for, at brugeren absolut giver mig et stort A 436 00:28:00,690 --> 00:28:05,010 eller B eller C. .. Z, så de giver mig noget mellem A og Z. 437 00:28:05,010 --> 00:28:08,580 Og nu, hvad laver jeg her? 438 00:28:08,580 --> 00:28:14,870 Jeg "eller" ING dette med 0x20, men det er faktisk det samme som - 439 00:28:14,870 --> 00:28:19,500 og vi vil vende tilbage til dette om et øjeblik - 32. 440 00:28:19,500 --> 00:28:24,830 Så igen, 32 er dette mønster af bits her. Hvorfor ved vi det? 441 00:28:24,830 --> 00:28:26,320 Bare tænk tilbage til uge 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å denne gule tal sker for at være 32. 444 00:28:33,470 --> 00:28:40,570 Jeg kan derefter tage et brev som den char her, bitvis "eller" det med bogstaveligt nummer 32, 445 00:28:40,570 --> 00:28:45,250 og hvad får jeg tilbage? Den lille version af denne char. 446 00:28:45,250 --> 00:28:48,830 For et øjeblik siden, selv om, jeg gav udtryk for dette i en anden base notation. 447 00:28:48,830 --> 00:28:51,370 Hvad har det repræsenterer? >> [Studerende] Hexadecimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Dette sker for at repræsentere hexadecimal. 449 00:28:53,050 --> 00:28:55,170 Vi har ikke talt om hexadecimal så meget, 450 00:28:55,170 --> 00:28:57,330 men det er faktisk praktisk i sager som denne. 451 00:28:57,330 --> 00:29:01,730 >> Selvom det ser mere kompliceret og selvom det ser ud som 20 og ikke 32, 452 00:29:01,730 --> 00:29:06,240 Det viser sig, at hexadecimal er faktisk super praktisk notation 453 00:29:06,240 --> 00:29:10,810 fordi i hexadecimal hver ciffer efter 0x - og det betyder ikke noget; 454 00:29:10,810 --> 00:29:13,960 dette er blot menneskelig konvention, der siger her kommer et hexadecimalt tal - 455 00:29:13,960 --> 00:29:18,590 hver af disse cifre, 2 og derefter i 0, kan selv være repræsenteret 456 00:29:18,590 --> 00:29:20,800 med præcis 4 bits. 457 00:29:20,800 --> 00:29:27,840 Så hvis vi gør det, så lad mig åbne en teksteditor her - weird autofuldførelse - 458 00:29:27,840 --> 00:29:35,940 hvis vi gør en lille tekst editor her er antallet 0x20 betyder her er 4 bits, her er en anden 4 bits. 459 00:29:35,940 --> 00:29:38,050 Lad os gøre det yderst til højre 4 bit først. 460 00:29:38,050 --> 00:29:44,690 0 når repræsenteret med 4 bits er hvad? Super let. Bare 0'er. 461 00:29:44,690 --> 00:29:46,780 Så 4 bit som 0'er. 462 00:29:46,780 --> 00:29:53,510 Hvordan kan du repræsenterer 2? Det er et stykke tid siden, vi gjorde dette, men det er 0100. 463 00:29:53,510 --> 00:29:57,310 Så dette er det 1s sted, er det 2s sted, og så er det ligegyldigt, hvad de andre steder er. 464 00:29:57,310 --> 00:30:00,610 Med andre ord, du i hexadecimal kan sige 0x20, 465 00:30:00,610 --> 00:30:04,340 men hvis du så tænke på, hvad er de 2 og hvordan er det repræsenteret i binær, 466 00:30:04,340 --> 00:30:07,130 hvad er 0, og hvordan er det repræsenteret i binær, 467 00:30:07,130 --> 00:30:10,440 svarene på disse spørgsmål er det og det, hhv. 468 00:30:10,440 --> 00:30:14,380 Så 0x20 sker for at repræsentere dette mønster på 8 bits, 469 00:30:14,380 --> 00:30:16,880 hvilket netop er maske, som vi ønskede. 470 00:30:16,880 --> 00:30:20,140 Så det er i øjeblikket blot en intellektuel øvelse, 471 00:30:20,140 --> 00:30:24,520 men virkeligheden er i kode, det er typisk mere almindeligt at skrive konstanter som denne 472 00:30:24,520 --> 00:30:28,360 i hexadecimal fordi så programmøren kan relativt nemt, 473 00:30:28,360 --> 00:30:32,560 selv om det kræver en vis papir og blyant, finde ud af hvad dette mønster af bits er 474 00:30:32,560 --> 00:30:35,960 fordi du ikke bare kan udtrykke 0'er og 1-taller typisk i kode. 475 00:30:35,960 --> 00:30:38,540 Du kan ikke gå 00.010 og så videre. 476 00:30:38,540 --> 00:30:42,380 >> Du er nødt til at vælge decimaler eller hexadecimal eller oktal eller andre notationer. 477 00:30:42,380 --> 00:30:47,540 De fleste mennesker har en tendens til at plukke hexadecimal simpelthen så hvert ciffer repræsenterer 4 bit 478 00:30:47,540 --> 00:30:49,320 og du kan gøre dette hurtigt math. 479 00:30:49,320 --> 00:30:54,990 Og jeg vil vinke min hånd på toupper, hvilket er næsten det samme, det ser næsten identiske. 480 00:30:54,990 --> 00:31:01,900 Toupper sker ikke at anvende eller operatøren, men snarere denne fyr og df. 481 00:31:01,900 --> 00:31:09,300 Hvad betyder df repræsenterer? df? Anyone? >> [Studerende] 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 forlade denne ene som en lille ø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 derefter hvad der kommer efter 9? 485 00:31:23,460 --> 00:31:26,510 Vi er slags ud af decimaler, men i hexadecimal hvad der kommer efter 9? 486 00:31:26,510 --> 00:31:29,510 [Studerende] a. >> Så a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Du kan regne ud derfra hvad mønster af bits d faktisk repræsenterer. 488 00:31:33,470 --> 00:31:38,850 Og hvis vi gør det math, vil vi se, at den maske, du ender med at komme tilbage er identisk med denne. 489 00:31:38,850 --> 00:31:45,580 Dette er f, 1-taller, og det er d. Så df repræsenterer den maske. Ok. 490 00:31:45,580 --> 00:31:50,980 Og endelig ikke at gøre tingene lyd super, super teknisk, 491 00:31:50,980 --> 00:31:53,840 men formoder, at vi ønskede at skrive et program, der gør dette. 492 00:31:53,840 --> 00:31:58,960 Lad mig gå videre og gøre binær, som er et program i en fil kaldet binary.c. 493 00:31:58,960 --> 00:32:02,050 Og lad mig køre binære og give mig et ikke-negativt heltal. 494 00:32:02,050 --> 00:32:03,960 Lad os starte let og skrive 0. 495 00:32:03,960 --> 00:32:09,010 Dette er nu et program, der udskriver et heltal i sin binær repræsentation. 496 00:32:09,010 --> 00:32:13,470 Så hvis jeg spiller dette spil igen og skrive på bare 1, bør jeg få en 32-bit repræsentation af 1. 497 00:32:13,470 --> 00:32:15,490 Hvis jeg gør det igen med 2, bør jeg få det. 498 00:32:15,490 --> 00:32:19,310 Hvis jeg gør 7, bør jeg få et par 1s i slutningen og så videre. 499 00:32:19,310 --> 00:32:22,740 Det viser sig, jeg nævner dette, fordi med bitvise operationer 500 00:32:22,740 --> 00:32:25,490 du kan faktisk gøre en anden ting så godt. 501 00:32:25,490 --> 00:32:29,130 Du kan oprette disse masker dynamisk. 502 00:32:29,130 --> 00:32:32,800 Tag et kig på denne ene sidste eksempel involverer bitvise operationer. 503 00:32:32,800 --> 00:32:35,490 Her er den første del af koden, bede brugeren om et tal, 504 00:32:35,490 --> 00:32:38,130 og det insisterer på, at du giver mig et ikke-negativt heltal. 505 00:32:38,130 --> 00:32:39,780 Så det er slags gamle skole ting. 506 00:32:39,780 --> 00:32:41,980 Men her er noget, der er lidt interessant. 507 00:32:41,980 --> 00:32:44,910 >> Hvordan går jeg om udskrivning af et nummer i binær? 508 00:32:44,910 --> 00:32:48,970 Jeg først iterere fra hvad til hvad? 509 00:32:48,970 --> 00:32:52,270 Hvad er størrelsen af ​​en int typisk i det mindste i apparatet? >> [Studerende] 4. 510 00:32:52,270 --> 00:32:57,130 Det er 4. Så 4 * 8 er 32 - 1 er 31. 511 00:32:57,130 --> 00:33:02,590 Så hvis jeg begynder at tælle fra 31, der repræsenterer, viser det sig, 512 00:33:02,590 --> 00:33:07,630 bare begrebsmæssigt, det 31. bit eller den højeste orden bit, hvilket er denne fyr herovre, 513 00:33:07,630 --> 00:33:09,650 dette vil være bit 0. 514 00:33:09,650 --> 00:33:12,850 Så dette er bit 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Så hvad er denne kode gør? 516 00:33:14,950 --> 00:33:20,140 Bemærk dette for-løkke, selvom det ser kryptisk, er bare iteration fra 31 ned til 0. Det er det. 517 00:33:20,140 --> 00:33:24,530 Så det interessante del nu skal være i disse 5 linier her. 518 00:33:24,530 --> 00:33:28,110 Bemærk, at i denne linje, jeg erklære en variabel kaldet maske 519 00:33:28,110 --> 00:33:30,790 at være i overensstemmelse med vores historie om disse gule numre. 520 00:33:30,790 --> 00:33:32,200 Og hvad er dette gør? 521 00:33:32,200 --> 00:33:35,720 Dette er en anden bitvis operatør har vi ikke set før, mest sandsynlige. 522 00:33:35,720 --> 00:33:38,300 Det er den venstre shift operatør. 523 00:33:38,300 --> 00:33:40,060 Denne operator gør dette. 524 00:33:40,060 --> 00:33:44,920 Her er nummer 1, og hvis du gør jeg forlod skift, venstre skift, 525 00:33:44,920 --> 00:33:49,260 hvad tror du, der har den virkning at gøre den pågældende person 1? 526 00:33:49,260 --> 00:33:51,290 Bogstaveligt talt flytte det over. 527 00:33:51,290 --> 00:33:57,540 Så hvis nummer 1 er, hvad du har på venstre og du starter med at initialisere i til 31, 528 00:33:57,540 --> 00:34:03,490 hvad der er at gøre? Det kommer til at tage dette nummer 1 og flytte det 31 pladser herovre. 529 00:34:03,490 --> 00:34:06,210 Og fordi der er naturligvis ingen andre cifre bag det, 530 00:34:06,210 --> 00:34:10,350 de vil som standard blive erstattet med 0'er. 531 00:34:10,350 --> 00:34:15,120 Så du vil starte ud med nummer 1, hvilket naturligvis ligner dette - 532 00:34:15,120 --> 00:34:18,659 og lad mig trække det over her i midten. 533 00:34:18,659 --> 00:34:22,139 Og derefter som du skifter tingene til venstre, denne fyr hovedsageligt går på denne måde. 534 00:34:22,139 --> 00:34:24,659 Men så snart du gør det, bliver et 0 udfyldt 535 00:34:24,659 --> 00:34:28,360 Hvis du skifter det en anden gang, det går på denne måde, og en anden 0 bliver fyldt i. 536 00:34:28,360 --> 00:34:31,000 >> Du flytter det igen og derefter en anden 0 bliver fyldt i. 537 00:34:31,000 --> 00:34:37,900 Så hvis du gør denne ting på 1 << I 31 steder, du ender med at få en maske 538 00:34:37,900 --> 00:34:42,550 der er 32 karakterer, den yderste venstre ene er et 1, 539 00:34:42,550 --> 00:34:45,199 hele resten af ​​dem er et 0. 540 00:34:45,199 --> 00:34:50,880 Og det viser sig, som en sidebemærkning, at flytte et nummer til venstre på denne måde 541 00:34:50,880 --> 00:34:53,530 også tilfældigt og undertiden bekvemt, 542 00:34:53,530 --> 00:34:57,520 har den virkning, at gøre hvad til dette nummer? >> [Studerende] Fordobling det. 543 00:34:57,520 --> 00:35:00,980 Fordobling det, fordi hver af søjlerne - det 1s sted, 2s sted, 4s sted, 544 00:35:00,980 --> 00:35:05,030 8s sted, 16s sted - de er alle fordobling som du går til venstre. 545 00:35:05,030 --> 00:35:09,500 Eller rettere, når du flytter 1s du vil ende med at fordoble værdien af ​​nummeret. 546 00:35:09,500 --> 00:35:12,070 Du kan ende med at gøre interessante transformationer af cifre 547 00:35:12,070 --> 00:35:15,640 ved at flytte alt over på denne måde ved potenser af 2. 548 00:35:15,640 --> 00:35:17,150 Så hvordan fungerer det? 549 00:35:17,150 --> 00:35:22,580 Dette giver så mig en maske, der er 0'er undtagen for en 1 i netop det sted, jeg vil have det, 550 00:35:22,580 --> 00:35:27,920 og så dette udtryk, som er stjålet fra toupper.c, 551 00:35:27,920 --> 00:35:31,770 er simpelthen at sige tage antallet n at brugeren indtaster, 552 00:35:31,770 --> 00:35:34,730 "Og" det med den maske, og hvad vil du få? 553 00:35:34,730 --> 00:35:39,200 Du kommer til at få en 1, hvis der er et 1 i denne maskerede sted, 554 00:35:39,200 --> 00:35:41,570 eller du kommer til at få et 0, hvis der ikke er. 555 00:35:41,570 --> 00:35:44,370 Og så alt dette program er effektivt, er det har en løkke, 556 00:35:44,370 --> 00:35:48,340 og det skaber en maske med en 1 herovre, så en 1 herovre, så en 1 herovre, 557 00:35:48,340 --> 00:35:52,950 og det bruger denne bitvise OG trick at sige, er der en 1 bit i brugerens input her? 558 00:35:52,950 --> 00:35:59,220 >> Er der en 1 bit i brugerens input her? Og hvis ja, udskrive bogstaveligt 1, ellers udskrives 0. 559 00:35:59,220 --> 00:36:03,780 Vi gør dette med int'er bare fordi det er derfor, vi laver 32 bit i stedet for 8, 560 00:36:03,780 --> 00:36:06,900 men hvad vi har introduceret så er det bitvise OG, denne bitvis OR, 561 00:36:06,900 --> 00:36:10,450 og denne venstre skift operatør, som ikke ofte frygtelig nyttige, 562 00:36:10,450 --> 00:36:12,230 men det viser sig at de kan være. 563 00:36:12,230 --> 00:36:16,560 I virkeligheden, hvis du skulle repræsentere noget som en vifte af Booleans 564 00:36:16,560 --> 00:36:21,260 bare for at repræsentere sandt eller falsk, antage, at du ønskede at holde styr på, om eller ej 565 00:36:21,260 --> 00:36:24,630 et rum fuld af 300 studerende er til stede, 566 00:36:24,630 --> 00:36:29,420 du kunne erklære en vifte af størrelsen 300 af typen bool, så du får 300 bools, 567 00:36:29,420 --> 00:36:33,090 og du kan indstille hver til sand, hvis nogen er her og falsk ellers. 568 00:36:33,090 --> 00:36:37,550 Hvorfor er det repræsentation i denne datastruktur ineffektiv? 569 00:36:39,370 --> 00:36:44,800 Hvad er dårligt om udformningen af ​​denne datastruktur, en vifte af 300 bools? 570 00:36:46,190 --> 00:36:49,600 Hvad er en bool, faktisk under hætten? 571 00:36:49,600 --> 00:36:52,310 Også dette er noget, der måske ikke være bekendt. 572 00:36:52,310 --> 00:36:53,720 Det viser sig, der ikke er bool. 573 00:36:53,720 --> 00:36:56,620 Husk vi slags skabt, med den cs50.h fil, 574 00:36:56,620 --> 00:36:58,630 som selv indeholder standard bool. 575 00:36:58,630 --> 00:37:00,930 C er en slags dum, selv om, når det kommer til bool. 576 00:37:00,930 --> 00:37:04,880 Den bruger 8 bit til at repræsentere hver bool, som er helt uøkonomisk 577 00:37:04,880 --> 00:37:09,040 fordi selvfølgelig, hvor mange bits du har brug for at repræsentere en bool? Bare 1. 578 00:37:09,040 --> 00:37:13,190 Så viser det sig, at hvis du har nu mulighed for med bitvise operatører 579 00:37:13,190 --> 00:37:17,760 at manipulere de enkelte bits selv i en char, selv i en enkelt byte, 580 00:37:17,760 --> 00:37:21,380 det viser sig, du kunne reducere den hukommelse, der kræves for at repræsentere noget dumt 581 00:37:21,380 --> 00:37:25,490 sådan deltagelse stylet datastruktur med en faktor på 8. 582 00:37:25,490 --> 00:37:29,820 I stedet for at bruge otte bits til at repræsentere sandt eller falsk, kan du bogstaveligt talt bruge en 583 00:37:29,820 --> 00:37:34,500 ved hjælp af en enkelt byte for hver otte elever i klassen 584 00:37:34,500 --> 00:37:41,990 og skifte fra 0 til 1 individuelle bits ved hjælp af disse former for lavt niveau tricks. 585 00:37:43,850 --> 00:37:49,460 Det er virkelig sat en stopper for energien. Er der nogen spørgsmål om bitvise operationer? 586 00:37:49,460 --> 00:37:52,710 >> Yeah. >> [Studerende] Er der en eksklusiv eller operatør? 587 00:37:52,710 --> 00:37:56,440 Ja. Der er en eksklusiv eller operatør, der ligner denne, ^, gulerod symbol, 588 00:37:56,440 --> 00:38:02,070 hvilket betyder, at kun den første ting eller den anden ting kan være en 1 til den produktion, at være en 1. 589 00:38:02,070 --> 00:38:07,750 Der er også en ikke, ~, som vil tillade dig at invertere en 0 til en 1 eller vice versa samt. 590 00:38:07,750 --> 00:38:11,600 Og der er også en ret skift operatør, >>, hvilket er det modsatte af det, vi så. 591 00:38:11,600 --> 00:38:13,850 Ok. Lad os tage tingene nu til et højere niveau. 592 00:38:13,850 --> 00:38:16,770 Vi startede med at tale om tekst og derefter komprimere det 593 00:38:16,770 --> 00:38:19,650 og repræsenterer teksten med færre antal bits; 594 00:38:19,650 --> 00:38:22,890 Vi snakkede lidt om, hvordan vi kan nu begynde at manipulere tingene på en bitvis niveau. 595 00:38:22,890 --> 00:38:26,640 Lad os nu ind igen op 10.000 fod til repræsentation 596 00:38:26,640 --> 00:38:29,250 af mere komplekse ting som grafik. 597 00:38:29,250 --> 00:38:32,950 Her har vi en tysk flag, her har vi en af ​​Frankrig. 598 00:38:32,950 --> 00:38:36,350 Disse kan være repræsenteret i filformater, du måske kender - GIF'er, for eksempel. 599 00:38:36,350 --> 00:38:40,030 Hvis du nogensinde har set et billede på nettet, som ender med. 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 flag her slags egner sig til kompression 602 00:38:47,530 --> 00:38:52,050 for hvad måske indlysende grund? >> [Uhørlig student svar] 603 00:38:52,050 --> 00:38:53,440 Der er en del gentagelser, right? 604 00:38:53,440 --> 00:38:57,270 For at sende Tysklands flag, så tænk på dette som et billede på skærmen 605 00:38:57,270 --> 00:38:59,030 tilbage i dine Scratch dage. 606 00:38:59,030 --> 00:39:02,380 Du husker muligvis, at der er enkelte pixel eller punkter, der udgør et billede. 607 00:39:02,380 --> 00:39:06,650 >> Der er en hel række af sorte prikker og en anden hel række af sorte prikker. 608 00:39:06,650 --> 00:39:10,110 Der er en masse af rækker af sorte prikker, som vi kunne se, om vi virkelig er zoomet ind, 609 00:39:10,110 --> 00:39:13,370 meget gerne, når vi zoomet ind på Rob ansigt i Photoshop. 610 00:39:13,370 --> 00:39:15,500 Så snart vi fik dybere og dybere og dybere ind i billedet, 611 00:39:15,500 --> 00:39:19,990 De begyndte at se pixelering, alle de firkanter, der består hans øje i denne sag. 612 00:39:19,990 --> 00:39:24,130 Samme deal her. Hvis vi zoomede ind ganske lidt, ville du se de enkelte prikker. 613 00:39:24,130 --> 00:39:27,110 Nå, det er sådan et spild af bits. 614 00:39:27,110 --> 00:39:32,120 Hvis en tredjedel af flag er sort, og en tredjedel af flag er gul og så videre, 615 00:39:32,120 --> 00:39:34,860 hvorfor kan vi ikke en eller anden måde komprimere dette flag? 616 00:39:34,860 --> 00:39:39,560 Og selv det franske flag kan komprimeres selvom mønsteret er en lille smule anderledes. 617 00:39:39,560 --> 00:39:44,120 Det viser sig, GIF-filformatet er et tabsfrit komprimeringsformat, 618 00:39:44,120 --> 00:39:48,420 hvilket betyder, at du kan tage et billede som det tyske flag her, 619 00:39:48,420 --> 00:39:53,540 du kan smide en masse af sine bits uden kompromis med kvaliteten. 620 00:39:53,540 --> 00:39:55,340 Dette er i modsætning til noget som JPEG, 621 00:39:55,340 --> 00:39:57,050 med de fleste af os er nok mere kendt. 622 00:39:57,050 --> 00:39:59,000 Facebook fotos og Flickr-billeder og lignende 623 00:39:59,000 --> 00:40:02,200 er næsten altid gemt som JPEG, når de er uploadet, 624 00:40:02,200 --> 00:40:08,100 men JPEG-billeder er en lossy - lossy - format, hvor du kan smide bits 625 00:40:08,100 --> 00:40:10,430 men du også smide kvalitet. 626 00:40:10,430 --> 00:40:13,890 Og så hvis du komprimere billeder med Photoshop eller uploade dem til Facebook 627 00:40:13,890 --> 00:40:15,580 eller tage dem på en virkelig crappy telefon, 628 00:40:15,580 --> 00:40:19,510 du ved, at billedet begynder at blive meget klattet og pixeleret, 629 00:40:19,510 --> 00:40:22,290 og det er fordi det bliver komprimeret af den computer eller telefon 630 00:40:22,290 --> 00:40:24,550 ved bogstaveligt at smide information væk. 631 00:40:24,550 --> 00:40:28,500 Men GIF er forbløffende i, at det kan bruge færre bits end det måske som standard 632 00:40:28,500 --> 00:40:30,750 uden at miste nogen oplysninger. 633 00:40:30,750 --> 00:40:32,410 >> Og det væsentlige gør det som følger. 634 00:40:32,410 --> 00:40:38,740 Snarere end butikken i en fil som en BMP ville en RGB tredobbelt for sort, sort, sort, sort, 635 00:40:38,740 --> 00:40:42,570 sort, sort, sort, sort, sort, sort, sort, sort og så videre, 636 00:40:42,570 --> 00:40:45,640 snarere er GIF-format vil sige, "Black" 637 00:40:45,640 --> 00:40:48,330 og derefter, "Gentag dette 100 gange," eller noget lignende. 638 00:40:48,330 --> 00:40:52,280 "Black, gentage dette 100 gange, sort, gentage dette 100 gange ..." 639 00:40:52,280 --> 00:40:54,530 "Yellow, gentage dette 100 gange." 640 00:40:54,530 --> 00:40:57,200 Og sådan husker det væsentlige den venstre pixel 641 00:40:57,200 --> 00:41:02,160 og derefter koder eller anden måde ideen om at gentage, at pixel igen og igen. 642 00:41:02,160 --> 00:41:06,110 Så GIF kan derefter komprimere sig selv uden at miste nogen oplysninger. 643 00:41:06,110 --> 00:41:09,510 Men hvis du var nødt til at gætte, hvis det er den algoritme, gifs brug, 644 00:41:09,510 --> 00:41:13,180 hvilke af disse flag, selvom de ser identiske i størrelse, 645 00:41:13,180 --> 00:41:19,620 vil være mindre, når de gemmes på harddisken, som et GIF? >> [Studerende] Tyskland. 646 00:41:19,620 --> 00:41:21,660 Tyskland bliver mindre? Hvorfor? 647 00:41:21,660 --> 00:41:26,620 [Studerende] Fordi du gentager det mange, mange gange vandret 648 00:41:26,620 --> 00:41:29,010 og så skal du gentage en anden gang. >> Præcis. 649 00:41:29,010 --> 00:41:32,020 Fordi de mennesker, der opfandt GIF bare lidt vilkårligt besluttet 650 00:41:32,020 --> 00:41:36,040 at gentagelsen skal understøttes horisontalt og ikke sideværts. 651 00:41:36,040 --> 00:41:40,900 Der er meget mere gentagelse lateralt her i det tyske flag end i den franske flag. 652 00:41:40,900 --> 00:41:44,430 Så hvis vi rent faktisk åbner en mappe på min harddisk, der har disse GIF, 653 00:41:44,430 --> 00:41:51,920 du kan faktisk se, at det tyske flag her er 2 kilobyte og den franske er 4 kilobytes. 654 00:41:51,920 --> 00:41:54,080 Det sker for at være en tilfældighed, at man er to gange den anden, 655 00:41:54,080 --> 00:41:57,960 men det er faktisk sådan, at den franske flag er meget større. 656 00:41:57,960 --> 00:42:01,250 >> Selvom vi taler her om grafik, kan de samme ideer for 657 00:42:01,250 --> 00:42:05,150 ikke ting som flag, men billeder, der er lidt mere kompliceret. 658 00:42:05,150 --> 00:42:08,170 Hvis du tager et billede af et æble, så mon der ikke er en masse dobbeltarbejde der, 659 00:42:08,170 --> 00:42:11,040 så vi kunne eller anden måde huske, at standard baggrunden er blå 660 00:42:11,040 --> 00:42:13,230 og ikke, som det højre billede antyder, 661 00:42:13,230 --> 00:42:16,830 skal huske farven på hver enkelt pixel i dette billede. 662 00:42:16,830 --> 00:42:21,060 Så vi kan smide bits væk der uden at miste information. 663 00:42:21,060 --> 00:42:23,340 Æblet ser stadig bare det samme. 664 00:42:23,340 --> 00:42:27,510 I dette eksempel her, kan du se, hvad der sker i en film. 665 00:42:27,510 --> 00:42:31,970 Disse repræsenterer old-school filmspoler hvorved i det øverste billede der 666 00:42:31,970 --> 00:42:36,900 du har en RV kørsel forbi et hus og et træ. 667 00:42:36,900 --> 00:42:42,130 Og som van kører forbi fra venstre til højre, hvad naturligvis ikke ændre? 668 00:42:42,130 --> 00:42:45,320 Huset er ikke går nogen steder, og træet er ikke går nogen steder. 669 00:42:45,320 --> 00:42:47,700 Det eneste, der bevæger er van i denne sag. 670 00:42:47,700 --> 00:42:51,650 Så som Background Uændret antyder, hvad du kan gøre i film 671 00:42:51,650 --> 00:42:56,530 er ligeledes bare smide oplysninger, der ikke ændre sig i mellem rammer. 672 00:42:56,530 --> 00:42:58,900 Dette er almindeligt kendt som interframe komprimering 673 00:42:58,900 --> 00:43:02,120 idet såfremt denne ramme ser næsten identisk med denne, 674 00:43:02,120 --> 00:43:05,390 lad os ikke gider lagring på disk nogen af ​​de samme oplysninger 675 00:43:05,390 --> 00:43:09,250 på disse mellemliggende frames, lad os kun bruge klippunkter en gang imellem 676 00:43:09,250 --> 00:43:13,420 der rent faktisk gemmer disse oplysninger redundant bare som en lille tilregnelighed check. 677 00:43:13,420 --> 00:43:18,620 >> Derimod er en anden metode til komprimering af video i denne anden og lavere eksempel her, 678 00:43:18,620 --> 00:43:23,970 hvor stedet butik 30 billeder, hvorfor du ikke bare gemme 15 billeder i sekundet i stedet? 679 00:43:23,970 --> 00:43:27,070 Snarere end filmen slags flyder smukt, perfekt, 680 00:43:27,070 --> 00:43:30,060 det kan se ud som det er stammen en lille smule, lidt gamle skole, 681 00:43:30,060 --> 00:43:37,190 men nettoeffekten vil være at bruge langt færre bits end ellers ville være nødvendigt. 682 00:43:37,190 --> 00:43:39,240 Så hvor kommer denne derefter forlade os? 683 00:43:39,240 --> 00:43:41,700 Det var lidt af en sidebemærkning om, hvor du ellers kan gå med kompression. 684 00:43:41,700 --> 00:43:45,140 For mere om dette, tage en klasse som CS175 her. 685 00:43:45,140 --> 00:43:46,990 Her er et andet eksempel på video. 686 00:43:46,990 --> 00:43:49,190 Hvis bi er det eneste bevægelse, 687 00:43:49,190 --> 00:43:51,790 du kan virkelig smide oplysninger i disse midterste frames 688 00:43:51,790 --> 00:43:55,260 fordi blomsten og himmel og blade ikke ændrer sig. 689 00:43:55,260 --> 00:43:57,960 Men lad os nu overveje en sidste ting. 690 00:43:57,960 --> 00:44:03,890 I de næste 5 minutter vi forlader C bag evigt i forelæsning? Ja. Ikke i psets, selvom. 691 00:44:03,890 --> 00:44:10,210 Sidste historie om C og så kommer vi til meget sexet ting 692 00:44:10,210 --> 00:44:13,870 involverer HTML og web-og woo-hoo. Ok. 693 00:44:13,870 --> 00:44:16,050 Her går vi. Det er motivationen. 694 00:44:16,050 --> 00:44:20,020 Det viser sig, al denne tid, hvor vi har skrevet programmer, vi kører Dunk. 695 00:44:20,020 --> 00:44:23,890 Og Dunk, vi har sagt, siden den første uge temmelig meget, tager kildekode 696 00:44:23,890 --> 00:44:25,740 og omdanner den til objekt kode. 697 00:44:25,740 --> 00:44:28,540 Det tager C og omdanner den til 0'er og 1'ere. 698 00:44:28,540 --> 00:44:32,150 Jeg har slags løjet for dig for et par uger, fordi det ikke er helt så simpelt er det. 699 00:44:32,150 --> 00:44:36,750 >> Der er meget mere foregår under kølerhjelmen, når du kører et program som Dunk. 700 00:44:36,750 --> 00:44:39,560 Faktisk kan processen med at udarbejde et program virkelig kan sammenfattes, 701 00:44:39,560 --> 00:44:42,210 som du måske husker fra Robs video på compilere, 702 00:44:42,210 --> 00:44:47,580 ind i disse 4 trin: forbehandling, kompilere selv, samling, og sammenkædning. 703 00:44:47,580 --> 00:44:51,950 Men vi i klassen, og de fleste mennesker i verden typisk sammenfatte alle disse trin 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 kildekode som denne, huske dette er måske den enkleste C-programmet 706 00:44:58,070 --> 00:45:03,530 vi har skrevet hidtil, huske at når kompileret det ender med at ligne dette. 707 00:45:03,530 --> 00:45:07,310 Men der er faktisk et mellemliggende skridt, og disse skridt er som følger. 708 00:45:07,310 --> 00:45:10,750 Først er der denne ting på toppen af ​​dette og de fleste af vores programmer, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Hvad betyder # include gøre for os? 711 00:45:17,210 --> 00:45:24,150 Det temmelig meget kopier og Indsætter indholdet af stdio.h ind i min fil, så hvorfor? 712 00:45:24,150 --> 00:45:27,220 Hvorfor bryder jeg mig om indholdet af stdio.h? Hvad er der derinde af interesse? 713 00:45:27,220 --> 00:45:32,310 Printf erklæring, dets prototype, så compileren så ved hvad jeg mener 714 00:45:32,310 --> 00:45:34,900 når jeg nævner denne funktion printf. 715 00:45:34,900 --> 00:45:39,390 Så trin 1 under udarbejdelse, er forbehandling, hvorved et program som Dunk 716 00:45:39,390 --> 00:45:43,450 eller nogle helper program, der Dunk kommer med læser din kode top til bund, 717 00:45:43,450 --> 00:45:47,740 venstre mod højre, og når som helst det ser en # symbol efterfulgt af et søgeord som omfatter, 718 00:45:47,740 --> 00:45:53,980 det udfører denne operation, kopiere og indsætte i dette tilfælde stdio.h ind i din fil. 719 00:45:53,980 --> 00:45:55,510 Det er trin 1. 720 00:45:55,510 --> 00:45:59,620 Så har du en meget større C-fil på grund af den enorme kopiere, indsætte job, der er bare sket. 721 00:45:59,620 --> 00:46:01,710 >> Trin 2 nu kompilering. 722 00:46:01,710 --> 00:46:04,880 Men det viser sig kompilere tager kilde kode, der ser sådan her ud 723 00:46:04,880 --> 00:46:08,160 og forvandler det til noget, der ligner denne, 724 00:46:08,160 --> 00:46:12,560 som for dem, der kender hedder? >> [Studerende] forsamling. >> Assembly sprog. 725 00:46:12,560 --> 00:46:16,700 Dette er faktisk noget, hvis du tager CS61 du dykke ned i flere detaljer. 726 00:46:16,700 --> 00:46:22,380 Det er omtrent lige så tæt som du kan komme til at skrive 0'er og 1'ere selv 727 00:46:22,380 --> 00:46:25,850 men skrive tingene på en sådan måde, at der stadig gør mindst en lille smule fornuft. 728 00:46:25,850 --> 00:46:30,760 Disse er maskininstruktioner, og hvis vi rulle ned til den vigtigste funktion her, 729 00:46:30,760 --> 00:46:35,470 bemærke, at der er denne push-instruktion, flytte undervisning, trække instruktion, 730 00:46:35,470 --> 00:46:38,550 call instruktion og så videre. 731 00:46:38,550 --> 00:46:42,930 Når du hører, at din computer har Intel indeni, 732 00:46:42,930 --> 00:46:46,180 du har en Intel CPU i din Mac eller pc, hvad betyder det? 733 00:46:46,180 --> 00:46:51,200 En CPU kommer bygget af selskaber som Intel forståelse visse instruktioner. 734 00:46:51,200 --> 00:46:55,770 De har ingen idé om, hvad funktioner som swap er eller hoved, er per se, 735 00:46:55,770 --> 00:47:00,060 men de ved, hvad meget lavt niveau instruktioner som lægge sammen, trække, skubbe, 736 00:47:00,060 --> 00:47:02,430 flytte, ring, og så videre er. 737 00:47:02,430 --> 00:47:06,170 Så når du kompilerer C kode i assembler, 738 00:47:06,170 --> 00:47:11,820 Deres meget brugervenlig udseende kode omdannes til noget, der ligner denne, 739 00:47:11,820 --> 00:47:21,670 der bogstaveligt talt bevæger byte eller 4 byte rundt i så små enheder i og ud af CPU'en. 740 00:47:21,670 --> 00:47:26,820 Men til sidst, når Dunk er klar til at tage denne repræsentation af dit program 741 00:47:26,820 --> 00:47:30,940 i 0'er og 1-taller, så trinnet kaldet samling sker, 742 00:47:30,940 --> 00:47:33,850 og dette igen hele sker i løbet af et øjeblik, når du kører Dunk. 743 00:47:33,850 --> 00:47:39,300 Vi starter her, det udlæser en fil som dette, og så er det konverterer det til disse 0'er og 1'ere. 744 00:47:39,300 --> 00:47:42,000 Og hvis du vil gå tilbage på et tidspunkt og faktisk se det i aktion, 745 00:47:42,000 --> 00:47:48,220 hvis jeg går ind i hello1.c--dette er et af de allerførste programmer vi kiggede på - 746 00:47:48,220 --> 00:47:53,710 normalt ville vi kompilere dette med Dunk hello1.c og dette ville give os a.out. 747 00:47:53,710 --> 00:47:59,890 Hvis derimod du i stedet give det-S flag, hvad du får, er hello1.s 748 00:47:59,890 --> 00:48:02,750 og du vil faktisk se assembler. 749 00:48:02,750 --> 00:48:05,750 >> Jeg gør dette for en meget kort program, men hvis du går tilbage til Scramble 750 00:48:05,750 --> 00:48:08,740 eller Recover eller ethvert program, du har skrevet, og lige ud af nysgerrighed 751 00:48:08,740 --> 00:48:13,240 ønsker at se, hvad det egentlig ser ud, hvad der rent faktisk bliver ført ind i CPU, 752 00:48:13,240 --> 00:48:15,700 kan du bruge det-S flag med Dunk. 753 00:48:15,700 --> 00:48:17,770 Men så endelig, er der stadig en Gotcha. 754 00:48:17,770 --> 00:48:21,810 Her er de 0'er og 1-taller, der repræsenterer min implementering af hej, verden. 755 00:48:21,810 --> 00:48:25,530 Men jeg brugte en andens funktion i mit program. 756 00:48:25,530 --> 00:48:28,710 Så selvom processen har været Jeg tager hello.c, 757 00:48:28,710 --> 00:48:34,280 det bliver samlet i montage kode og derefter det bliver samlet i 0'er og 1-taller, 758 00:48:34,280 --> 00:48:37,460 det eneste 0'er og 1-taller, der udsendes på nuværende tidspunkt 759 00:48:37,460 --> 00:48:40,270 er dem, der skyldes min kode. 760 00:48:40,270 --> 00:48:44,400 Men den person, der skrev printf, de kompileret deres kode for 20 år siden 761 00:48:44,400 --> 00:48:47,000 og det er nu installeret et eller andet sted på apparatet, 762 00:48:47,000 --> 00:48:51,610 så vi på en måde nødt til at fusionere hans eller hendes 0'er og 1-taller med min 0'er og 1'ere, 763 00:48:51,610 --> 00:48:56,160 og det bringer os til den 4. og sidste trin i kompilering, kendt som forbinder. 764 00:48:56,160 --> 00:48:58,680 Så på den venstre side har vi præcis samme billede som før: 765 00:48:58,680 --> 00:49:02,580 hello.c bliver forsamling kode bliver 0'er og 1'ere. 766 00:49:02,580 --> 00:49:05,960 Men husker, at jeg brugte den standard I / O-bibliotek i min kode, 767 00:49:05,960 --> 00:49:10,350 og det betyder et eller andet sted på computeren er der en fil kaldet stdio.c 768 00:49:10,350 --> 00:49:13,980 eller i det mindste den kompilerede udgave, fordi nogen nogle år siden 769 00:49:13,980 --> 00:49:18,530 kompileret stdio.c i montage kode og derefter en hel masse 0'er og 1'ere. 770 00:49:18,530 --> 00:49:21,130 Dette er, hvad der er kendt som en statisk eller en dynamisk bibliotek. 771 00:49:21,130 --> 00:49:23,350 Det er nogle fil sidder et eller andet sted i apparatet. 772 00:49:23,350 --> 00:49:28,710 >> Men endelig, jeg er nødt til at tage min 0'er og 1-taller, og den pågældende persons 0'er og 1'ere 773 00:49:28,710 --> 00:49:32,760 og på en måde linke dem sammen, bogstaveligt kombinere de 0'er og 1'ere 774 00:49:32,760 --> 00:49:37,900 i en enkelt fil kaldet a.out eller hello1 eller hvad jeg kaldte mit program 775 00:49:37,900 --> 00:49:43,320 således at det endelige resultat har alle de 1s og 0'erne, der skal komponere mit program. 776 00:49:43,320 --> 00:49:45,660 Så al den tid dette semester, hvor du har brugt Dunk 777 00:49:45,660 --> 00:49:48,750 og endnu mere for nyligt kørende gøre for at køre Dunk, 778 00:49:48,750 --> 00:49:53,580 alle disse trin er sket slags øjeblikkeligt, men meget bevidst. 779 00:49:53,580 --> 00:49:57,830 Og så hvis du fortsætter i datalogi, nemlig CS61, 780 00:49:57,830 --> 00:50:00,850 dette er det lag, som du vil fortsætte med at skrælle tilbage off der 781 00:50:00,850 --> 00:50:06,980 taler om effektivitet, sikkerhedsmæssige konsekvenser og lignende af disse lavere niveauer detaljer. 782 00:50:06,980 --> 00:50:09,220 Men med det, er vi ved at forlade C bagefter. 783 00:50:09,220 --> 00:50:11,420 Lad os gå videre og tage vores 5-minutters pause nu, 784 00:50:11,420 --> 00:50:14,190 og når vi kommer tilbage: Internettet. 785 00:50:17,280 --> 00:50:19,170 Ok. Vi er tilbage. 786 00:50:19,170 --> 00:50:23,590 Nu begynder vi vores udseende ikke bare på HTML, for som du vil se, 787 00:50:23,590 --> 00:50:26,050 HTML selv er faktisk temmelig simpel 788 00:50:26,050 --> 00:50:29,270 men virkelig ved webprogrammering mere generelt, networking mere generelt, 789 00:50:29,270 --> 00:50:31,770 og hvordan alle disse teknologier mødes 790 00:50:31,770 --> 00:50:35,400 at tillade os at skabe langt mere sofistikerede programmer oven på Internettet 791 00:50:35,400 --> 00:50:38,690 end hidtil har vi været i stand til i disse sorte og hvide vinduer. 792 00:50:38,690 --> 00:50:42,140 Faktisk på dette tidspunkt i det semester, selvom vi bruger relativt mindre tid 793 00:50:42,140 --> 00:50:46,200 på PHP, HTML, CSS, JavaScript, SQL og mere, 794 00:50:46,200 --> 00:50:48,480 de fleste studerende ender med at gøre de endelige projekter, der er web-baseret 795 00:50:48,480 --> 00:50:51,230 fordi, som du vil se, baggrunden du nu har i C 796 00:50:51,230 --> 00:50:54,450 er meget for disse højere niveau sprog. 797 00:50:54,450 --> 00:50:56,800 >> Og når du begynder at tænke over dit afsluttende projekt, 798 00:50:56,800 --> 00:50:59,940 der, ligesom Problem Set 0, du hvor blev opfordret 799 00:50:59,940 --> 00:51:02,160 at gøre de fleste noget af interesse for dig i Scratch, 800 00:51:02,160 --> 00:51:05,790 det endelige projekt er din mulighed for at tage din nyfundne viden og kyndige med C 801 00:51:05,790 --> 00:51:09,850 eller PHP eller JavaScript eller lignende ud for et spin 802 00:51:09,850 --> 00:51:12,330 og skabe din helt egen stykke software for verden at se. 803 00:51:12,330 --> 00:51:17,770 Og til frø dig med ideer, ved, at du kan gå her, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Hvert år har vi hverve ideer fra fakulteter og personale og grupper af studerende på campus 805 00:51:21,800 --> 00:51:27,330 bare for at indsende deres ideer til interessante ting, der kunne løses ved hjælp af computere, 806 00:51:27,330 --> 00:51:29,860 brug af websteder, ved hjælp af software. 807 00:51:29,860 --> 00:51:32,360 Så hvis du kæmper for at komme op med en idé om din egen, 808 00:51:32,360 --> 00:51:35,790 med alle midler rulle gennem de ideer der fra i år og sidste. 809 00:51:35,790 --> 00:51:39,990 Det er helt okay at tackle et projekt, der er blevet løst før. 810 00:51:39,990 --> 00:51:44,540 Vi har set mange apps for at se status for vasketøj på campus, 811 00:51:44,540 --> 00:51:47,000 mange apps til navigation i spisesal menuen 812 00:51:47,000 --> 00:51:49,540 mange apps til navigation i Kursuskataloget og lignende. 813 00:51:49,540 --> 00:51:53,680 Og ja, i en kommende foredrag og i fremtidige seminarer, 814 00:51:53,680 --> 00:51:57,750 vi vil introducere dig til nogle offentligt tilgængelige API'er, både kommercielt tilgængelige 815 00:51:57,750 --> 00:52:02,520 såvel som her fås fra CS50 på campus, så du har adgang til data 816 00:52:02,520 --> 00:52:04,910 og kan derefter gøre interessante ting med det. 817 00:52:04,910 --> 00:52:09,380 Så mere om afgangsprojekter i et par dage, når vi slipper specifikationen, 818 00:52:09,380 --> 00:52:12,990 men for nu, ved, at du kan arbejde solo eller med en eller to venner 819 00:52:12,990 --> 00:52:16,010 på de fleste helst projekt af interesse for dig. 820 00:52:16,010 --> 00:52:18,080 Internettet. 821 00:52:18,080 --> 00:52:22,300 Du gå videre og trække sig ud din bærbare computer, skal du gå til facebook.com for første gang, 822 00:52:22,300 --> 00:52:27,020 ikke har logget på for nylig, og tryk på Enter. Hvad der præcist sker? 823 00:52:27,020 --> 00:52:30,150 >> Når du trykker på Enter på din computer, en hel bunke af trin 824 00:52:30,150 --> 00:52:32,600 begynde slags magisk sker. 825 00:52:32,600 --> 00:52:35,960 Så du her til venstre, web server som Facebook er her til højre, 826 00:52:35,960 --> 00:52:42,500 og på en måde du bruger dette sprog kaldet HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP er ikke et programmeringssprog. Det er mere af en protokol. 828 00:52:46,770 --> 00:52:52,310 Det er et sæt af konventioner, som webbrowsere og webservere bruger, når indbyrdes forbundne. 829 00:52:52,310 --> 00:52:54,360 Og hvad det betyder er som følger. 830 00:52:54,360 --> 00:52:56,790 Meget gerne i den virkelige verden, har vi disse konventioner 831 00:52:56,790 --> 00:53:00,140 hvor, hvis du møde nogle mennesker for første gang, hvis du ikke har noget imod humoring mig her, 832 00:53:00,140 --> 00:53:03,980 Jeg kan komme op til dig, siger: "Hej, mit navn er David." >> Hej, David. Mit navn er Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hej, David. Mit navn er Sammy." 834 00:53:05,770 --> 00:53:08,310 Så nu har vi netop involveret i denne form for fjollet menneskelig protokol 835 00:53:08,310 --> 00:53:12,200 hvor jeg har indledt protokollen, har Sammy reageret, 836 00:53:12,200 --> 00:53:15,060 vi har rystet hænder, og transaktionen er gennemført. 837 00:53:15,060 --> 00:53:18,260 HTTP er meget ens i ånden. 838 00:53:18,260 --> 00:53:23,350 Når din web browser anmoder www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 hvad din browser er virkelig gør, er at udvide sin hånd, så at sige, 840 00:53:27,020 --> 00:53:29,960 til serveren, og det er at sende det en meddelelse. 841 00:53:29,960 --> 00:53:34,220 Og det budskab er typisk noget som få - hvad gør du ønsker at få? - 842 00:53:34,220 --> 00:53:38,740 få mig hjemmesiden, som typisk betegnes med en enkelt skråstreg i slutningen af ​​en webadresse. 843 00:53:38,740 --> 00:53:43,790 Og bare så du ved, hvad sprog jeg taler, jeg browseren vil fortælle dig 844 00:53:43,790 --> 00:53:46,930 at jeg taler HTTP version 1,1, 845 00:53:46,930 --> 00:53:51,980 Og også for god foranstaltning, vil jeg fortælle dig, at værten, at jeg ønsker hjemmesiden for 846 00:53:51,980 --> 00:53:54,120 er facebook.com. 847 00:53:54,120 --> 00:53:57,730 Typisk en webbrowser, ukendt for dig, det menneskelige, 848 00:53:57,730 --> 00:54:03,350 sender dette budskab via internettet, når du blot skrive www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> At indgå i din browser. 850 00:54:05,370 --> 00:54:07,300 Og hvad betyder Facebook reagere med? 851 00:54:07,300 --> 00:54:12,540 Den reagerer med nogle lignende udseende kryptiske detaljer, men også meget mere. 852 00:54:12,540 --> 00:54:14,310 Lad mig gå videre til Facebook hjemmeside her. 853 00:54:14,310 --> 00:54:17,480 Dette er skærmen som de fleste af os sandsynligvis aldrig se, hvis du forblive logget ind 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 gør det i Chrome, bemærke, at du kan trække op disse små kontekstmenuer. 856 00:54:24,150 --> 00:54:26,980 Ved hjælp af Chrome, uanset om Mac OS, Windows, Linux eller lignende, 857 00:54:26,980 --> 00:54:31,840 hvis du styre klik eller venstre klik, kan du typisk trække op en menu, der ser sådan ud, 858 00:54:31,840 --> 00:54:35,870 hvor et par muligheder afvente, hvoraf den ene er View Page Source. 859 00:54:35,870 --> 00:54:39,920 Du kan også typisk komme til disse ting ved at gå til menuen Vis og rode rundt. 860 00:54:39,920 --> 00:54:42,750 For eksempel, her under Vis Developer er det samme. 861 00:54:42,750 --> 00:54:45,780 Jeg har tænkt mig at gå videre og se på View Page Source. 862 00:54:45,780 --> 00:54:50,800 Hvad du ser, er den HTML, som Mark har skrevet at repræsentere facebook.com. 863 00:54:50,800 --> 00:54:55,910 Det er en komplet rod her, men vi vil se, at det gør lidt mere mening inden længe. 864 00:54:55,910 --> 00:54:59,840 Men der er nogle mønstre her. Lad mig scroll ned til ting som dette. 865 00:54:59,840 --> 00:55:05,730 Det er svært for et menneske at læse, men bemærker, at der er dette mønster af vinklede beslag 866 00:55:05,730 --> 00:55:10,360 med nøgleord som option, søgeord som værdi, nogle citerede strenge. 867 00:55:10,360 --> 00:55:15,660 Det er her, da du tilmeldte dig for allerførste gang, specificeret, hvad dit fødselsår er. 868 00:55:15,660 --> 00:55:19,020 Denne drop-down menu med årgange eller anden måde er kodet her 869 00:55:19,020 --> 00:55:23,870 på dette sprog kaldet HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Med andre ord, når din browser anmoder om en webside 871 00:55:27,730 --> 00:55:30,610 det taler denne konvention kaldet HTTP. 872 00:55:30,610 --> 00:55:35,170 Men hvad betyder facebook.com svaret på denne opfordring med? 873 00:55:35,170 --> 00:55:38,260 >> Den reagerer med nogle af disse kryptiske beskeder, som vi vil se i et øjeblik. 874 00:55:38,260 --> 00:55:43,760 Men de fleste af dens reaktion er i form af HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Det er den faktiske sprog, som en webside er skrevet. 876 00:55:47,170 --> 00:55:52,030 Og hvad en webbrowser virkelig så er, ved modtagelsen af ​​noget, der ligner denne, 877 00:55:52,030 --> 00:55:57,120 læser det top til bund, venstre til højre, og når som helst det ser en af ​​disse vinklede beslag 878 00:55:57,120 --> 00:56:03,370 efterfulgt af et søgeord som option, viser, at kodesprog på passende måde. 879 00:56:03,370 --> 00:56:06,820 I dette tilfælde ville det vise en drop-down menu år. 880 00:56:06,820 --> 00:56:09,240 Men igen, dette er en komplet rod at se på. 881 00:56:09,240 --> 00:56:16,630 Det er ikke fordi Facebook udviklere manifestere 0 for 5 for stil, for eksempel. 882 00:56:16,630 --> 00:56:20,190 Dette er fordi de fleste af den kode, de skriver, er i virkeligheden skrevet smukt, 883 00:56:20,190 --> 00:56:22,450 kommenteret, pænt indrykket, og lignende, 884 00:56:22,450 --> 00:56:26,080 men selvfølgelig maskiner, computere, browsere virkelig ikke en døjt 885 00:56:26,080 --> 00:56:27,890 om din kode er godt stylet. 886 00:56:27,890 --> 00:56:33,100 Og i virkeligheden er det fuldstændig spild at ramme tabulatortasten alle de gange 887 00:56:33,100 --> 00:56:37,650 og til at sætte kommentarer alle i hele din kode og til at vælge virkelig beskrivende variabelnavne 888 00:56:37,650 --> 00:56:42,340 fordi hvis browseren er ligeglad, alt hvad du laver i slutningen af ​​dagen spilde bytes. 889 00:56:42,340 --> 00:56:46,660 >> Så viser det sig, hvad de fleste hjemmesider gør, er, selv om kildekoden til facebook.com, 890 00:56:46,660 --> 00:56:49,550 for cs50.net og alle disse andre hjemmesider på internettet 891 00:56:49,550 --> 00:56:53,730 typisk velskrevet og godt kommenteret og pænt indrykket og lignende, 892 00:56:53,730 --> 00:56:59,270 typisk før hjemmesiden er sat på internettet, er koden minified, 893 00:56:59,270 --> 00:57:02,970 hvorved HTML og CSS - noget andet, vi vil snart se - 894 00:57:02,970 --> 00:57:05,960 JavaScript-kode, vi snart får at se er komprimeret, 895 00:57:05,960 --> 00:57:09,250 hvorved lange variabelnavne bliver X-og Y og Z, 896 00:57:09,250 --> 00:57:13,900 og alt dette blanke, der gør alting ser så læsbar er alle smidt væk, 897 00:57:13,900 --> 00:57:17,700 fordi hvis du tænker over det på denne måde, Facebook får en milliard side hits om dagen - 898 00:57:17,700 --> 00:57:21,670 noget vanvittigt sådan - og hvad så hvis en programmør bare for at være anal 899 00:57:21,670 --> 00:57:26,660 tryk på mellemrumstasten en ekstra gang bare for at indrykke nogle kodelinje nogensinde så meget mere? 900 00:57:26,660 --> 00:57:29,500 Hvad er konsekvenserne, hvis Facebook bevarer at whitespace 901 00:57:29,500 --> 00:57:32,880 i alle de bytes, de sender tilbage til folk på internettet? 902 00:57:32,880 --> 00:57:36,400 Rammer den plads bar engang giver dig en ekstra byte i din fil. 903 00:57:36,400 --> 00:57:39,730 Og hvis en milliard mennesker derefter gå til at downloade hjemmesiden den dag, 904 00:57:39,730 --> 00:57:42,060 hvor meget mere data har du sendes over internettet? 905 00:57:42,060 --> 00:57:45,200 En gigabyte uden god grund. 906 00:57:45,200 --> 00:57:48,510 Og indrømmet, for en masse hjemmesider dette er ikke sådan en skalerbar emne, 907 00:57:48,510 --> 00:57:51,030 men for Facebook, Google, for nogle af de mest populære hjemmesider 908 00:57:51,030 --> 00:57:54,860 Der er stort incitament økonomisk for at gøre din kode til at ligne en rod 909 00:57:54,860 --> 00:57:58,980 så at du bruger så få bytes som muligt udover derefter komprimere det 910 00:57:58,980 --> 00:58:01,500 bruge noget lignende lynlås, en algoritme kaldet gzip, 911 00:58:01,500 --> 00:58:04,250 at browseren gør for dig automatisk. Men det er forfærdelige. 912 00:58:04,250 --> 00:58:08,060 Vi vil aldrig lære noget om andre folks hjemmesider og hvordan man designer websider 913 00:58:08,060 --> 00:58:09,680 hvis vi er nødt til at se på det på denne måde. 914 00:58:09,680 --> 00:58:13,620 >> Så heldigvis, browsere som Chrome og IE og Firefox disse dage 915 00:58:13,620 --> 00:58:16,450 typisk kommer med indbygget udviklerværktøjer. 916 00:58:16,450 --> 00:58:21,730 Faktisk, jeg hvis jeg går ned her til Inspect Element, eller hvis gå til Vis, Developer 917 00:58:21,730 --> 00:58:25,220 og gå til Developer Tools eksplicit, 918 00:58:25,220 --> 00:58:27,640 dette vindue nederst på min skærm nu popper op. 919 00:58:27,640 --> 00:58:31,230 Det er lidt skræmmende i starten, fordi der er en masse ukendte faner her, 920 00:58:31,230 --> 00:58:34,510 men hvis jeg klikker på Elements hele vejen nederst til venstre, 921 00:58:34,510 --> 00:58:38,810 Chrome er naturligvis temmelig smart. Den ved, hvordan man skal fortolke alt dette kodeks. 922 00:58:38,810 --> 00:58:42,320 Og så hvad Chrome gør, er det renser op alle Facebooks HTML. 923 00:58:42,320 --> 00:58:45,680 Selv om der ikke er whitespace der, der er ikke indrykning der, 924 00:58:45,680 --> 00:58:51,120 nu mærke til, at jeg kan begynde at navigere denne webside desto mere hierarkisk. 925 00:58:51,120 --> 00:58:56,910 Det viser sig, at hver webside skrevet i et sprog, der kaldes HTML5 bør begynde med dette, 926 00:58:56,910 --> 00:59:03,980 denne DOCTYPE erklæring, så at sige: 927 00:59:03,980 --> 00:59:07,840 Det er slags lys og grå der, men det er den allerførste linje kode i denne fil, 928 00:59:07,840 --> 00:59:12,080 og at kun fortæller browseren, "Hey, her kommer nogle HTML5. Her kommer en webside." 929 00:59:12,080 --> 00:59:18,490 Den første åbne beslag ud over hvad der sker for at være den ting, en åben konsol HTML-tag, 930 00:59:18,490 --> 00:59:22,320 og derefter, hvis jeg dykke dybere - disse pile er helt meningsløs; 931 00:59:22,320 --> 00:59:25,140 de er bare for præsentation skyld, er de faktisk ikke i filen - 932 00:59:25,140 --> 00:59:30,300 bemærke, at indersiden af ​​Facebooks HTML-kode, noget, der starter med en åben konsol 933 00:59:30,300 --> 00:59:32,910 og derefter har et ord kaldes en tag. 934 00:59:32,910 --> 00:59:38,610 Så inde i HTML-tag er tilsyneladende et hoved-tag og et organ tag. 935 00:59:38,610 --> 00:59:41,930 Inde i hovedet tag nu er en hel rod for Facebook 936 00:59:41,930 --> 00:59:45,620 fordi de har en masse metadata og andre ting til markedsføring og reklame. 937 00:59:45,620 --> 00:59:50,600 >> Men hvis vi rulle ned, ned, ned, ned, lad os se hvor det er. Her er det. 938 00:59:50,600 --> 00:59:52,210 Denne her er i det mindste lidt fortrolig. 939 00:59:52,210 --> 00:59:55,990 Titlen på Facebook hjemmeside, hvis du nogensinde ser i fanen i din titel bar, 940 00:59:55,990 --> 00:59:59,060 er Velkommen til Facebook - log ind, tilmeld dig eller få mere. 941 00:59:59,060 --> 01:00:01,110 Det er, hvad du vil se i Chrome titellinje, 942 01:00:01,110 --> 01:00:03,100 og det er, hvordan det er repræsenteret i kode. 943 01:00:03,100 --> 01:00:08,090 Hvis vi ignorerer alt andet i hovedet, de fleste af tarme af en webside er i kroppen, 944 01:00:08,090 --> 01:00:10,940 og det viser sig, at Facebooks kodeks kommer til at se mere kompleks 945 01:00:10,940 --> 01:00:14,540 end de fleste ting, vi vil skrive i første omgang bare fordi det er blevet bygget op gennem årene, 946 01:00:14,540 --> 01:00:17,260 men der er en hel masse scripttags, JavaScript-kode, 947 01:00:17,260 --> 01:00:18,870 der gør hjemmesiden meget interaktiv: 948 01:00:18,870 --> 01:00:22,330 se statusopdateringer øjeblikkeligt ved hjælp af sprog som JavaScript. 949 01:00:22,330 --> 01:00:25,270 Der er noget, der hedder en div, som er en division af en side. 950 01:00:25,270 --> 01:00:27,940 Men før vi kommer til at detalje, lad os prøve at zoome ud 951 01:00:27,940 --> 01:00:31,920 og se på en enklere version af Facebook 1,0, så at sige. 952 01:00:31,920 --> 01:00:34,740 Her er det hej, verden af ​​websider. 953 01:00:34,740 --> 01:00:37,370 Det har at DOCTYPE erklæring øverst 954 01:00:37,370 --> 01:00:40,280 som er lidt anderledes end alt andet. 955 01:00:40,280 --> 01:00:46,130 Intet andet, vi skriver på en webside kommer til at starte med 01:00:48,880 og undtagen for noget, der hedder kommentarer i HTML. 957 01:00:48,880 --> 01:00:53,000 Men for det meste, er alt i en webside åben beslag, søgeord, tæt konsol. 958 01:00:53,000 --> 01:00:56,220 >> I dette tilfælde kan du se den enkleste af websider muligt. 959 01:00:56,220 --> 01:01:00,260 HTML-tag indeholder et hoved-tag, og den indeholder et body-tagget, 960 01:01:00,260 --> 01:01:04,580 men bemærker, at der er denne forestilling om at starte og stoppe tags. 961 01:01:04,580 --> 01:01:11,360 Dette er starten tag for HTML, dette er den tætte tag eller slutkode. 962 01:01:11,360 --> 01:01:15,400 Bemærk, at de er en slags modsætninger i den forstand, at det tætte tag eller slutkode 963 01:01:15,400 --> 01:01:20,030 har dette skråstreg inde i sig selv. 964 01:01:20,030 --> 01:01:23,540 I mellemtiden er der en åben hoved tag her og en tæt hoved tag her. 965 01:01:23,540 --> 01:01:26,880 >> Der er en åben titel og en tæt titel-tag her. 966 01:01:26,880 --> 01:01:29,850 Det faktum, at jeg har lagt titlen på én linje, rent vilkårlig. 967 01:01:29,850 --> 01:01:33,760 Det bare lignede det ville passe pænt på én linje, så jeg ikke gider at trykke Enter et par gange. 968 01:01:33,760 --> 01:01:38,200 I mellemtiden, kroppen gjorde jeg led bare at være nok så klart. 969 01:01:38,200 --> 01:01:41,050 Bemærk, at HTML er et temmelig dum sprog. 970 01:01:41,050 --> 01:01:43,410 Faktisk før tilbage i dag var der WYSIWYG editorer 971 01:01:43,410 --> 01:01:46,770 og Microsoft Word, hvor du kan sige, "Gør dette fed, gør dette kursiv," 972 01:01:46,770 --> 01:01:50,850 du rent faktisk ville skrive lidt kommandoer i essays 20 + år siden 973 01:01:50,850 --> 01:01:55,740 hvor du ville sige, "Start med at lave denne tekst fed. Stoppe med at lave denne tekst fed." 974 01:01:55,740 --> 01:01:59,010 "Start med at lave denne tekst kursiv. Stoppe med at lave denne tekst kursiv." 975 01:01:59,010 --> 01:02:01,850 >> Det er, hvad HTML eller et markup sprog er. 976 01:02:01,850 --> 01:02:05,530 Denne første tag siger: "Hey, browser. Her kommer nogle HTML." 977 01:02:05,530 --> 01:02:09,880 Den næste tag siger: "Hey, browser. Her kommer hovedet, overskriften på min webside." 978 01:02:09,880 --> 01:02:11,650 "Hey, browser. Her kommer titlen." 979 01:02:11,650 --> 01:02:15,880 Og så herovre, "Hey, browser. Det var det for titlen." 980 01:02:15,880 --> 01:02:20,000 Så det er sådan browseren kender ikke længere at vise flere tegn end hej, verden 981 01:02:20,000 --> 01:02:21,860 i titellinjen. 982 01:02:21,860 --> 01:02:23,640 I mellemtiden, siger dette: "Det er det for hovedet." 983 01:02:23,640 --> 01:02:28,340 Det siger, "Her kommer kroppen Her er den faktiske krop." - Bogstaveligt talt, ordene hej, verden. 984 01:02:28,340 --> 01:02:33,190 Og det siger her: "Det er det for kroppen. Det var det for HTML." 985 01:02:33,190 --> 01:02:34,640 Så browsere er temmelig dum. 986 01:02:34,640 --> 01:02:39,920 De har lige læst det her top til bund, venstre til højre, og gøre præcis, hvad de får besked på at gøre. 987 01:02:39,920 --> 01:02:41,860 Lad os rent faktisk gør en lille eksempel her. 988 01:02:41,860 --> 01:02:46,240 Lad mig åbne den enkleste af programmer på min Mac her, nemlig TextEdit. 989 01:02:46,240 --> 01:02:48,220 I Windows kan du bruge Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Men det er alt du behøver at begynde at tjene websider. 991 01:02:50,520 --> 01:02:53,730 Jeg har tænkt mig at gå videre og blot kopiere og indsætte denne kode i denne fil. 992 01:02:53,730 --> 01:02:57,210 Jeg har tænkt mig at gå videre og gemme den på mit skrivebord, 993 01:02:57,210 --> 01:03:01,220 og jeg har tænkt mig at gemme dette som hello.html, 994 01:03:01,220 --> 01:03:03,840 og nu filen hedder hello.html. 995 01:03:03,840 --> 01:03:05,690 Her er det på mit skrivebord. 996 01:03:05,690 --> 01:03:11,130 Lad mig nu gå ind i en browser og trække filen ind i browseren. 997 01:03:11,130 --> 01:03:14,060 Og voila, her er min allerførste webside. 998 01:03:14,060 --> 01:03:17,340 Bemærk, at titlen på fanebladet er hej, verden som pr titlen tag, 999 01:03:17,340 --> 01:03:20,040 og bemærk, at hej, verden er liget af min webside, 1000 01:03:20,040 --> 01:03:22,190 og woo-hoo, jeg er på internettet. 1001 01:03:22,190 --> 01:03:24,700 >> Jeg er ikke rigtig, højre, fordi denne fil ikke er på internettet. 1002 01:03:24,700 --> 01:03:28,330 Det sker for at være på min lokale harddisk på det pågældende sti. 1003 01:03:28,330 --> 01:03:32,720 Men ideen er den samme. Alt, hvad vi nu har brug for er en web-server, som at uploade den. 1004 01:03:32,720 --> 01:03:37,410 Men lad os først faktisk indføre en lidt mere kompliceret og lidt mere stilisering. 1005 01:03:37,410 --> 01:03:39,890 Dette er en simpel, hvis boring, webside. 1006 01:03:39,890 --> 01:03:41,990 Det viser sig, at der er andre typer af tags, vi kan bruge. 1007 01:03:41,990 --> 01:03:45,530 For eksempel i gult her jeg har introduceret 2 nye tags. 1008 01:03:45,530 --> 01:03:49,630 Vi vil ikke spille meget med disse i dag, men bemærke, at link tag 1009 01:03:49,630 --> 01:03:52,520 en eller anden måde ser anderledes fra alt andet. 1010 01:03:52,520 --> 01:03:55,370 Linket tag tager det, der kaldes attributter, 1011 01:03:55,370 --> 01:03:59,770 og en attribut er noget, der modificerer opførslen af ​​et tag. 1012 01:03:59,770 --> 01:04:03,840 I dette tilfælde er det ikke det bedste valg af navne, link, fordi det er lidt meningsløst, 1013 01:04:03,840 --> 01:04:11,590 men dette link tag siger det væsentlige omfatter fil kaldet styles.css indersiden af ​​min webside. 1014 01:04:11,590 --> 01:04:15,400 Du kan tænke på det som svarer til C 's # include direktivet. 1015 01:04:15,400 --> 01:04:19,650 Styles.css refererer til et andet sprog helt, at vi ikke vil lege med i dag, 1016 01:04:19,650 --> 01:04:23,790 men det er for æstetik: skriftstørrelser, farver, polstring, indrykning, margener, 1017 01:04:23,790 --> 01:04:26,040 og alle den slags æstetik detaljer. 1018 01:04:26,040 --> 01:04:28,820 I mellemtiden script tag er funktionelt tilsvarende, 1019 01:04:28,820 --> 01:04:33,140 men i stedet omfatter CSS, at sproget, det omfatter et andet sprog, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Så med andre ord, med disse 2 tags jeg vil med tiden være i stand til at skrive min egen webside 1021 01:04:37,810 --> 01:04:41,490 men også trække i kode, som jeg eller nogen andre har skrevet 1022 01:04:41,490 --> 01:04:44,350 så vi kan stå på andres skuldre, kan vi praktisere god design, 1023 01:04:44,350 --> 01:04:46,120 factoring ud fælles kodeks. 1024 01:04:46,120 --> 01:04:49,090 Hvis jeg har 10 forskellige websider, betyder det, at nogle af mine æstetik 1025 01:04:49,090 --> 01:04:52,490 kan indregnes ud, meget gerne # include, i en separat fil. 1026 01:04:52,490 --> 01:04:54,420 Så vi får der. 1027 01:04:54,420 --> 01:04:57,180 Men lad os faktisk først gøre noget mere interessant med denne fil. 1028 01:04:57,180 --> 01:05:01,110 >> Igen, dette er bare TextEdit. Jeg er ikke teknisk på internettet endnu, men vi vil komme der. 1029 01:05:01,110 --> 01:05:04,910 Jeg vil gerne gøre hej, verden lidt modigere end det er. 1030 01:05:04,910 --> 01:05:10,890 Så hej, lad os vilkårligt sige for fed. 1031 01:05:10,890 --> 01:05:15,910 Igen, historien er den samme: hej, komma, begynde at gøre denne dristige, 1032 01:05:15,910 --> 01:05:19,730 så verden bliver fremhævet med fed skrift, og det betyder stoppe udskrivning dette med fed skrift. 1033 01:05:19,730 --> 01:05:24,020 Lad mig gå videre og redde min fil, skal du gå tilbage til Chrome, vil jeg zoome ind bare så vi kan se det bedre, 1034 01:05:24,020 --> 01:05:27,870 og genindlæs, og du vil se, at verden er nu med fed skrift. 1035 01:05:27,870 --> 01:05:31,810 Web handler om hyperlinks, så lad os gå videre og gøre dette: 1036 01:05:31,810 --> 01:05:38,550 min favorit hjemmeside er, lad os sige, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Gem, genindlæse. Okay. Der er et par problemer nu udover hæslighed af hjemmesiden. 1038 01:05:43,810 --> 01:05:47,310 1, jeg er temmelig sikker på, jeg trykker på Enter her. Og jeg gjorde. 1039 01:05:47,310 --> 01:05:51,590 Jeg ikke kun ramt Enter, jeg også indrykket, praktiserende hvad vi har prædiket om stil, 1040 01:05:51,590 --> 01:05:54,930 men min er lige ved siden af ​​verden. 1041 01:05:54,930 --> 01:05:58,410 Så hvorfor er dette? Browsere kun gøre, hvad du fortæller dem at gøre. 1042 01:05:58,410 --> 01:06:04,010 Jeg har ikke fortalt browseren, "Break linjer her. Indsæt afsnit pause her." 1043 01:06:04,010 --> 01:06:07,820 Så browseren, betyder det ikke noget, hvis jeg ramte Return 30 gange, 1044 01:06:07,820 --> 01:06:10,820 det er stadig kommer til at sætte min højre ud for verden. 1045 01:06:10,820 --> 01:06:15,930 Hvad jeg virkelig nødt til at gøre her, er at sige noget
, indsætter et linjeskift. 1046 01:06:15,930 --> 01:06:17,940 >> Og faktisk et linjeskift er lidt af en underlig ting 1047 01:06:17,940 --> 01:06:21,650 fordi du ikke kan virkelig begynde at flytte til en anden linje, så gør noget, 1048 01:06:21,650 --> 01:06:25,380 og derefter stoppe flytter til en ny linje. Det er sådan en atomar operation. 1049 01:06:25,380 --> 01:06:28,140 Du enten gøre det, eller du ikke. Du ramte Enter eller du ikke. 1050 01:06:28,140 --> 01:06:33,390 Så br er en lille smule af et andet mærke, og så jeg er nødt til at sortere i både åbne og lukke det 1051 01:06:33,390 --> 01:06:35,230 på én gang. 1052 01:06:35,230 --> 01:06:37,500 Syntaksen for det er det. 1053 01:06:37,500 --> 01:06:41,760 Teknisk set kan man gøre sådan noget i nogle versioner af HTML, 1054 01:06:41,760 --> 01:06:45,600 men det er bare dumt, fordi der er ingen grund til at starte og stoppe noget 1055 01:06:45,600 --> 01:06:48,420 hvis man i stedet kan gøre det hele på én gang. 1056 01:06:48,420 --> 01:06:52,310 Indser, at HTML5 ikke strengt nødvendigt denne skråstreg, 1057 01:06:52,310 --> 01:06:55,410 så vil du se lærebøger og online ressourcer, der ikke har det, 1058 01:06:55,410 --> 01:06:59,780 men for god foranstaltning lad os øve symmetri, som vi har set hidtil. 1059 01:06:59,780 --> 01:07:02,870 Dette betyder, at mærket er både åbnes og lukkes. 1060 01:07:02,870 --> 01:07:05,220 Så nu lad mig gemme min fil, gå tilbage her. 1061 01:07:05,220 --> 01:07:10,240 Okay, så det er begyndt at se bedre ud, undtagen nettet jeg kender er lidt klikbare, 1062 01:07:10,240 --> 01:07:13,610 og alligevel youtube her synes ikke at føre til noget. 1063 01:07:13,610 --> 01:07:17,560 Det er fordi selvom det ligner et link, er browseren ikke vide, at i sig selv, 1064 01:07:17,560 --> 01:07:20,670 så jeg er nødt til at fortælle browseren, at dette er et link. 1065 01:07:20,670 --> 01:07:22,620 >> Måden at gøre dette på er at bruge 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 lad mig flytte dette til en ny linje bare så det er lidt lettere at læse, 1069 01:07:38,490 --> 01:07:40,060 og jeg vil skrumpe skriftstørrelsen. 1070 01:07:40,060 --> 01:07:43,890 Er jeg færdig? Nej, der kommer til at være denne tvedeling. 1071 01:07:43,890 --> 01:07:46,760 Dette tag, anker tag, faktisk tage en attribut, 1072 01:07:46,760 --> 01:07:52,900 som ændrer sin opførsel, og værdien af ​​denne attribut er tilsyneladende YouTubes URL. 1073 01:07:52,900 --> 01:07:56,380 Men bemærk dikotomi er, at bare fordi det er den webadresse, du vil, 1074 01:07:56,380 --> 01:08:01,020 det betyder ikke, det må være det ord, du understregning og gøre et link. 1075 01:08:01,020 --> 01:08:03,960 Tværtimod kan der være noget som dette. 1076 01:08:03,960 --> 01:08:10,870 Så jeg er nødt til at sige stoppe med at lave dette ord et hyperlink ved hjælp af den tætte anker tag. 1077 01:08:10,870 --> 01:08:12,650 Bemærk jeg ikke gøre dette. 1078 01:08:12,650 --> 01:08:15,890 1, ville dette blot være spild af alles tid og det er ikke nødvendigt. 1079 01:08:15,890 --> 01:08:19,290 >> For at lukke et tag, du kun nævne navnet på mærket igen. 1080 01:08:19,290 --> 01:08:21,800 Du behøver ikke nævne nogen af ​​de attributter. 1081 01:08:21,800 --> 01:08:26,189 Så lad os gemme det, gå tilbage. Okay, voila, nu er det blå og hyperlinks. 1082 01:08:26,189 --> 01:08:29,430 Hvis jeg klikker på det, jeg rent faktisk gør gå til YouTube. 1083 01:08:29,430 --> 01:08:32,529 Så selvom min webside ikke er på internettet, er det mindst HTML, 1084 01:08:32,529 --> 01:08:37,930 og hvis vi lader Internet indhente, ville vi rent faktisk ender her på youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Og jeg kan gå tilbage og her er min webside. Men læg mærke til dette. 1086 01:08:40,670 --> 01:08:43,120 Hvis du nogensinde har fået spam eller et phishing-angreb, 1087 01:08:43,120 --> 01:08:45,850 Nu har du mulighed for efter blot fem minutter at gøre det samme. 1088 01:08:45,850 --> 01:08:50,920 Vi kan gå her og gøre noget lignende www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 eller hvad det sketchy hjemmeside er, og så kan du sige bekræfte din PayPal-konto. 1090 01:08:59,319 --> 01:09:04,840 [Latter] Og nu dette kommer til at gå til badguy.com, som jeg har ikke tænkt mig at klikke på 1091 01:09:04,840 --> 01:09:08,000 fordi jeg har ingen idé om, hvor det fører hen. [Latter] 1092 01:09:08,000 --> 01:09:10,859 >> Men vi har nu evnen til rent faktisk ender der. 1093 01:09:10,859 --> 01:09:12,640 Så vi er virkelig lige begyndt at ridse overfladen. 1094 01:09:12,640 --> 01:09:15,830 Vi er ikke programmering som sådan, vi er ved at skrive kodesprog. 1095 01:09:15,830 --> 01:09:18,569 Men så snart vi afrunde vores ordforråd i HTML, 1096 01:09:18,569 --> 01:09:21,520 introducerer vi PHP, et virkeligt programmeringssprog 1097 01:09:21,520 --> 01:09:26,859 der vil give os mulighed for at generere HTML automatisk generere CSS automatisk, 1098 01:09:26,859 --> 01:09:29,430 så vi kan begynde på onsdag til at gennemføre, siger, 1099 01:09:29,430 --> 01:09:31,700 vores egen søgemaskine og mere. 1100 01:09:31,700 --> 01:09:34,770 Men mere om det i et par dage. Vi vil se dig dengang. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]