1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Week 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Dit is CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Oke. Welkom terug. Dit is CS50, en dit is het begin van week 7. 5 00:00:12,280 --> 00:00:14,690 Een paar kleine aankondigingen: 6 00:00:14,690 --> 00:00:18,150 Pset5 is nu aan de gang, of binnenkort zal, 7 00:00:18,150 --> 00:00:21,590 en laat ik zeggen, eerlijk gezegd, is dit de neiging om als een van de meer uitdagende 8 00:00:21,590 --> 00:00:24,460 van het probleem van de cursus sets, dus laat me noemen dit nu 9 00:00:24,460 --> 00:00:28,190 zodat deze week meer dan ooit je niet wachten tot, laten we zeggen, woensdagavond 10 00:00:28,190 --> 00:00:29,920 of donderdagavond te duiken inch 11 00:00:29,920 --> 00:00:32,369 Dit is zeker een interessante PSET. We denken dat het is leuk. 12 00:00:32,369 --> 00:00:36,110 Als je daadwerkelijk krijgt het volledig correct is en kan dan tegen de zogenaamde Big Board, 13 00:00:36,110 --> 00:00:39,830 heb je een kans om verstand overeenkomen met een aantal van het personeel van de cursus 14 00:00:39,830 --> 00:00:41,620 en een aantal van je klasgenoten. 15 00:00:41,620 --> 00:00:44,670 Wat The Big Board is is als je eenmaal je spellingcontrole werken hebben, 16 00:00:44,670 --> 00:00:48,860 je zult in staat zijn om te cs50.net te gaan na het uitvoeren van een opdracht, 17 00:00:48,860 --> 00:00:52,430 zuiver kiezen, en dan de tijd en de hoeveelheid RAM en 18 00:00:52,430 --> 00:00:56,130 die u hebt gebruikt in uw toepassing worden hier tentoongesteld op de homepage van de cursus pagina. 19 00:00:56,130 --> 00:00:59,740 U zult merken dat een hele hoop van deze mensen hier zijn opgenomen als personeelskosten 20 00:00:59,740 --> 00:01:04,220 omdat in het weekend, het personeel dacht dat het leuk zou zijn om te proberen elkaar te overtreffen. 21 00:01:04,220 --> 00:01:07,390 Dus beseffen dat het doel hier niet is te overtreffen het personeel. 22 00:01:07,390 --> 00:01:09,790 Zelfs ik ben alleen hier op nummer 13. 23 00:01:09,790 --> 00:01:13,790 Puur opt-in, maar het is een kans om te zien hoe weinig RAM-geheugen 24 00:01:13,790 --> 00:01:16,790 en hoe weinig CPU seconden kunt u gebruik maken van vis-a-vis een aantal van je klasgenoten. 25 00:01:16,790 --> 00:01:20,540 >> En ik geef toe dat Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 momenteel nummer 1 positie als een van de TFS, 27 00:01:23,750 --> 00:01:28,120 Dit is een implementatie die wij noemen niet mogelijk 28 00:01:28,120 --> 00:01:32,700 gezien het feit dat hij bijna 0 RAM-geheugen en bijna 0 seconden met voor het laden. 29 00:01:32,700 --> 00:01:35,670 Dus we zullen zorgen voor Kevin offline. [Gelach] 30 00:01:35,670 --> 00:01:40,950 Er zijn bepaalde vaardigheden die Kevin zet hier op de proef. 31 00:01:40,950 --> 00:01:45,280 Een van de dingen die we dachten dat we zouden doen, is nu ook CS50x is een week aan de gang, 32 00:01:45,280 --> 00:01:49,520 en jullie zijn net zo goed een onderdeel van dit experiment als die studenten zijn. 33 00:01:49,520 --> 00:01:53,720 We hebben hen gevraagd als onderdeel van hun pset0, die eveneens was om een ​​Scratch project in te dienen 34 00:01:53,720 --> 00:01:58,280 voor hen van belang - een spel, een interactief kunstwerk, een animatie en dergelijke - 35 00:01:58,280 --> 00:02:03,700 een 1 - tot 2-minuten durende video, als ze willen, zeggen hallo tegen de wereld en wie ze in werkelijkheid zijn. 36 00:02:03,700 --> 00:02:06,780 Ik dacht dat ik met u delen een paar van de video's die zijn tot nu toe ingediende 37 00:02:06,780 --> 00:02:10,759 want voor ons, op het personeel in ieder geval, het is echt spannend geweest 38 00:02:10,759 --> 00:02:14,220 en inspirerend om deze mensen te zien uit de hele wereld - landen over de hele wereld - 39 00:02:14,220 --> 00:02:18,160 afstemmen, van alle dingen, naar een informatica cursus over het internet, 40 00:02:18,160 --> 00:02:20,410 of het nu is omdat ze willen hun eigen studie voort te zetten, 41 00:02:20,410 --> 00:02:22,300 ze willen hun carrière te nemen in een nieuwe richting, 42 00:02:22,300 --> 00:02:24,390 ze willen vullen hiaten in hun eigen kennis, 43 00:02:24,390 --> 00:02:27,190 zodat een aantal van dezelfde redenen dat jullie misschien hier zijn geweest. 44 00:02:27,190 --> 00:02:31,090 >> Dus ik geef je een dergelijke student hier. Je kon het volume te verhogen gewoon een beetje. 45 00:02:31,090 --> 00:02:35,520 Hier is een van 1-minuut onze student inzendingen. 46 00:02:35,520 --> 00:02:40,380 Hallo, wereld. Ik ben een student van industrieel ingenieur hier in Malaga, Spanje. 47 00:02:40,380 --> 00:02:45,840 Ik ben enthousiast over deze online cursus, omdat ik hou van de informatica, echt waar, 48 00:02:45,840 --> 00:02:48,880 en ik echt waarderen dat ik om het te verkennen. 49 00:02:48,880 --> 00:02:51,940 En het feit dat ik hetzelfde kan jullie allemaal doen leren 50 00:02:51,940 --> 00:02:57,040 maar in plaats van in Harvard Ik ben in Malaga, hoe geweldig is dat? 51 00:02:57,040 --> 00:03:02,040 Nou, ik ben Fernando, en dit is CS50. Ik zie jullie. 52 00:03:02,040 --> 00:03:07,100 [Gelach] Een andere clip die we vooral willen, je zult zien dat deze gentleman's Engels niet zo sterk is. 53 00:03:07,100 --> 00:03:11,520 Het lijkt erop dat hij het had machine vertaalde, zodat de vertalingen zelf zijn een beetje onvolmaakt, 54 00:03:11,520 --> 00:03:15,790 maar dit was een van onze favorieten tot nu toe ook. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Hallo, wereld. [Spreken in het Japans] 57 00:03:32,370 --> 00:03:39,830 [Ik moet begroeten in het Japans, want mijn Engels is zeer onbetrouwbaar.] 58 00:03:39,830 --> 00:03:45,380 [Ik heb de boodschap aan u van de stad Gifu, Japan.] 59 00:03:45,380 --> 00:03:49,820 [I kan een student voor de eerste keer in 20 jaar, zoals te zien.] 60 00:03:49,820 --> 00:03:54,640 [Ik ben erg dankbaar voor de universiteit van Harvard, die gaf me deze kans en EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf is een gitaar en mijn favoriete ding draait.] [Gelach] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Waarom denk je dat ik probeerde een cs50x bij te wonen.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, het is mijn verlangen.] 65 00:04:14,990 --> 00:04:19,740 [Vooral als ik ver aanwezigheid in Japan gewoond.] 66 00:04:19,740 --> 00:04:26,680 [Ik wilde proberen onmiddellijk bewust van het bestaan ​​van dergelijke EDX wanneer.] 67 00:04:26,680 --> 00:04:32,500 [Denk je niet dat, zodat je niet in verband met de leeftijd van het leren I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 is mijn verlangen. Mijn naam is Kazu, en dit is CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [applaus en gejuich] 70 00:04:43,090 --> 00:04:49,220 Een andere favoriet van ons was dit middel hier van iemand. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google als je niet bekend bent met deze meme. 72 00:04:55,380 --> 00:05:01,480 >> En dan tot slot, een paar anderen die werd gepost dat misschien de schattige award te winnen. 73 00:05:01,480 --> 00:05:06,820 [Studenten] Aww! >> [Malan] We zullen moeten luisteren. Dit is kort, zo nauw luisteren. 74 00:05:08,580 --> 00:05:11,150 [Vrouwelijke spreker] Wat is je naam? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Vrouwelijke spreker] Wat is dit? >> [Giechelt] CS50. [Gelach] 76 00:05:16,120 --> 00:05:19,510 [Malan] Hij heeft twee takes, dat wel. 77 00:05:19,510 --> 00:05:22,240 Daar gaan we, de laatste. 78 00:05:23,030 --> 00:05:26,980 Mijn naam is Louie, en dit is CS50. 79 00:05:26,980 --> 00:05:30,250 [Gelach] Dit is dan CS50x. 80 00:05:30,250 --> 00:05:33,230 Hartelijk dank aan al diegenen onder u, terwijl na langs thuis 81 00:05:33,230 --> 00:05:35,620 die zijn tot nu toe deel te nemen. 82 00:05:35,620 --> 00:05:39,510 Vandaag hebben we sluiten onze bespreking van data structuren, 83 00:05:39,510 --> 00:05:41,160 ten minste enkele van de meest fundamentele 84 00:05:41,160 --> 00:05:44,760 en dan gaan we verder met onze discussie over HTML en web programmeren. 85 00:05:44,760 --> 00:05:48,520 Inderdaad, we hebben doorgebracht de afgelopen paar zeven weken te kijken naar de fundamenten van de programmering - 86 00:05:48,520 --> 00:05:50,450 algoritmen, datastructuren en dergelijke - 87 00:05:50,450 --> 00:05:53,050 en C, zoals u wellicht tot nu toe hebben ervaren, 88 00:05:53,050 --> 00:05:57,060 is niet noodzakelijkerwijs de meest toegankelijke van de talen 89 00:05:57,060 --> 00:05:59,090 waarmee sommige van deze ideeën te implementeren. 90 00:05:59,090 --> 00:06:01,880 En zo begint deze week en volgende week en dan de volgende, 91 00:06:01,880 --> 00:06:07,110 zullen we uiteindelijk in staat om de overgang te zijn van C, die over het algemeen bekend staat als een vrij low-level taal, 92 00:06:07,110 --> 00:06:11,190 om dingen hoger niveau, waaronder PHP, JavaScript, en dergelijke, 93 00:06:11,190 --> 00:06:14,850 die we zullen zien een beroep doen op dezelfde lessen die we hebben geleerd van de afgelopen paar weken, 94 00:06:14,850 --> 00:06:19,430 maar je zult zien dat te verklaren dingen zoals arrays en hash tabellen en zoeken en sorteren 95 00:06:19,430 --> 00:06:23,370 worden zo veel makkelijker omdat de talen zelf beginnen we met behulp van 96 00:06:23,370 --> 00:06:25,290 zal worden krachtiger. 97 00:06:25,290 --> 00:06:27,410 Maar eerst, een toepassing van bomen. 98 00:06:27,410 --> 00:06:30,240 Het is zeer vaak deze dagen nodig hebben om informatie te comprimeren. 99 00:06:30,240 --> 00:06:34,770 In welke context zou je willen een soort van digitale informatie te comprimeren? 100 00:06:37,190 --> 00:06:39,670 >> Ja. >> [Student] Wanneer u het te verzenden via het web. 101 00:06:39,670 --> 00:06:41,450 Ja, als je iets wilt sturen via het web. 102 00:06:41,450 --> 00:06:44,950 Als u een groot bestand te downloaden, is het ideaal als iemand aan de andere kant 103 00:06:44,950 --> 00:06:48,760 heeft gecomprimeerd dat bestand met behulp van een zip-formaat of iets dergelijks 104 00:06:48,760 --> 00:06:53,760 zodat u verzendt minder bits dan anders worden overgedragen. 105 00:06:53,760 --> 00:06:55,500 Dus hoe ga je comprimeren informatie? 106 00:06:55,500 --> 00:07:00,540 Het komt allemaal neer op met minder bits dan vereist is volgens standaard. 107 00:07:00,540 --> 00:07:03,220 Maar dit is een soort van een merkwaardig ding, want denk terug aan week 0 en 1 108 00:07:03,220 --> 00:07:07,370 toen we spraken over ASCII-en binaire en we hadden het over ASCII in het bijzonder 109 00:07:07,370 --> 00:07:10,690 als het gebruik van 8 bits om letters van het alfabet vertegenwoordigen 110 00:07:10,690 --> 00:07:16,120 zodat de letter A wordt vertegenwoordigd door 65 kleine letter a is het nummer 97, 111 00:07:16,120 --> 00:07:21,210 en hoe u vertegenwoordigt de 65 of 97, je bent 7 of 8 bits gebruikt. 112 00:07:21,210 --> 00:07:24,120 Maar de vangst is dat er een aantal letters in het Engels alfabet 113 00:07:24,120 --> 00:07:26,230 die niet zo populair als andere. 114 00:07:26,230 --> 00:07:31,600 Z is niet zo populair, Q is niet zo populair, maar A en E zijn super populair. 115 00:07:31,600 --> 00:07:37,280 En toch voor al deze brieven, standaard de wereld maakt gebruik van hetzelfde aantal bits, slechts 8. 116 00:07:37,280 --> 00:07:42,690 Dus zou het niet geweest zijn slimmer als in plaats van het gebruik van 8 bits voor elke letter, 117 00:07:42,690 --> 00:07:47,440 zelfs de meest zelden gebruikt als Q en Z, 118 00:07:47,440 --> 00:07:51,910 wat als we minder bits gebruikt voor A en E en S en de meest populaire letters 119 00:07:51,910 --> 00:07:55,000 en meer bits gebruikt voor de minder populaire letters, 120 00:07:55,000 --> 00:07:57,770 het idee is laten we optimaliseren voor de gemeenschappelijke zaak, 121 00:07:57,770 --> 00:08:01,160 dat is een thema in de informatica van het proberen te optimaliseren wat er gaat gebeuren de meest 122 00:08:01,160 --> 00:08:05,310 en breng een beetje meer tijd, een beetje meer ruimte op de dingen die, ja, er zou kunnen gebeuren 123 00:08:05,310 --> 00:08:07,680 maar niet per se zo vaak. 124 00:08:07,680 --> 00:08:09,330 Dus laten we eens een voorbeeld. 125 00:08:09,330 --> 00:08:12,610 >> Stel dat we willen informatie te coderen redelijk efficiënt. 126 00:08:12,610 --> 00:08:15,090 Je zou zijn opgegroeid een beetje iets over Morse code, 127 00:08:15,090 --> 00:08:17,450 en de kans is dat je niet de eigenlijke code te kennen, 128 00:08:17,450 --> 00:08:21,750 maar je zou herinneren dat het in ieder geval deze reeks van punten en strepen. 129 00:08:21,750 --> 00:08:26,640 Dit is een vrij efficiënte codering, en merk op dat de meest populaire brief - bijvoorbeeld, E - 130 00:08:26,640 --> 00:08:28,980 maakt gebruik van de kortste van de pieptonen. 131 00:08:28,980 --> 00:08:31,740 Morse code is alles over piep-piep-piep-piep-piep-piep en houden tonen 132 00:08:31,740 --> 00:08:34,799 zowel korte tijd of lange tijd. 133 00:08:34,799 --> 00:08:40,330 E, zoals aangegeven door de stip, is een super korte pieptoon, alleen piep, en dat zou vertegenwoordigen E. 134 00:08:40,330 --> 00:08:43,960 Daarentegen zou T een langere piep, piep, zoals [verlengt geluid], 135 00:08:43,960 --> 00:08:45,710 en dat zou vertegenwoordigen T. 136 00:08:45,710 --> 00:08:48,840 Maar dat is nog steeds vrij kort omdat, in tegenstelling, als je kijkt naar Z, 137 00:08:48,840 --> 00:08:52,690 tot Z drukken zou je piep, piep [meer geluid], piep, piep [kortere geluid] te gaan. 138 00:08:52,690 --> 00:08:55,360 Dus het is meer omdat het minder vaak voor. 139 00:08:55,360 --> 00:08:58,150 Maar de gotcha hier is dat Morse code is een beetje gebrekkig 140 00:08:58,150 --> 00:09:00,610 in dat het niet meteen decodeerbaar. 141 00:09:00,610 --> 00:09:07,350 Bijvoorbeeld, stel dat je hoort op sommige uiteinde van de draad piep [korte], piep [lang]. 142 00:09:07,350 --> 00:09:12,480 Welke boodschap heb ik net ontvangen? Een punt en een streepje. Wat betekent dat voor? 143 00:09:12,480 --> 00:09:15,330 [Student] A. >> [Malan] Misschien. 144 00:09:15,330 --> 00:09:18,270 Het kan ook E gevolgd door T. 145 00:09:18,270 --> 00:09:23,390 Met andere woorden, Morse code, maar het maakt gebruik van dit principe optimale hoek zaak 146 00:09:23,390 --> 00:09:26,250 Het leent zich niet tot onmiddellijke decodability. 147 00:09:26,250 --> 00:09:29,850 Dat wil zeggen, de mens die hoort of het ontvangen van deze punten en strepen 148 00:09:29,850 --> 00:09:34,540 moet een of andere manier erachter te komen waar de pauzes zijn tussen letters, 149 00:09:34,540 --> 00:09:39,660 want als je niet weet waar die pauzes zijn, kun je verwarren A voor ET of vice versa. 150 00:09:39,660 --> 00:09:43,880 >> Dus wat zou je doen? In Morse code kon je gewoon pauze tussen elk van de letters. 151 00:09:43,880 --> 00:09:47,660 Maar pauzeren is een soort van strijd met het hele punt van versnellen dingen. 152 00:09:47,660 --> 00:09:52,880 Dus wat als we in plaats daarvan kwam met een code waar er was niet deze slechte situatie 153 00:09:52,880 --> 00:09:56,570 waarbij E een prefix, bijvoorbeeld van A - 154 00:09:56,570 --> 00:10:00,020 met andere woorden, als we ervoor zorgen dat de patronen nog kort zijn voor de populaire letters 155 00:10:00,020 --> 00:10:04,850 lang voor de minder populaire letters, maar er is geen verwarring mogelijk is? 156 00:10:04,850 --> 00:10:08,930 Een man met de naam van de Huffman jaar geleden uitgevonden deze actie onder de naam Huffman-codering 157 00:10:08,930 --> 00:10:12,390 dat maakt gebruik eigenlijk een van de gegevensstructuren die we hebben doorgebracht een beetje tijd aan het praten over 158 00:10:12,390 --> 00:10:16,560 de afgelopen week, die van bomen, binaire bomen met name - 159 00:10:16,560 --> 00:10:19,710 een binaire boom betekent dat het niet meer dan 2 kinderen. 160 00:10:19,710 --> 00:10:22,720 Het heeft misschien een linker kind, misschien een goede kind terug, en dat is het. 161 00:10:22,720 --> 00:10:26,510 Dus stel alleen maar omwille van de discussie dat iemand wil sturen een bericht 162 00:10:26,510 --> 00:10:31,270 dat ziet er zo uit. Het is complete onzin, maar het is samengesteld uit As, B, C's, D's, en Es. 163 00:10:31,270 --> 00:10:34,890 En als je echt tellen alle van de As, B, C's, D's, en Es 164 00:10:34,890 --> 00:10:36,870 en vervolgens delen door het totale aantal letters, 165 00:10:36,870 --> 00:10:42,710 deze kleine grafiek hier zegt dat 45% van de brieven Es zijn, 20% As, 166 00:10:42,710 --> 00:10:45,010 10% B, enzovoort. 167 00:10:45,010 --> 00:10:47,330 Met andere woorden, aan dat de string, daar 168 00:10:47,330 --> 00:10:49,080 is slechts enkele bericht dat u wilt verzenden. 169 00:10:49,080 --> 00:10:52,180 Het gebeurt te zijn onzin zodat we kunnen gebruiken als een paar letters mogelijk, 170 00:10:52,180 --> 00:10:55,220 maar het is inderdaad zo dat E blijft de meest populaire, 171 00:10:55,220 --> 00:11:01,450 en B en C het minst populair, althans van deze 5 letters van het alfabet. 172 00:11:01,450 --> 00:11:04,040 Dus hoe kunnen we gaan over het bedenken van een codering, 173 00:11:04,040 --> 00:11:08,430 een binaire codering, een patroon van 0 en 1 voor elk van deze letters 174 00:11:08,430 --> 00:11:14,820 zodanig dat E een kort model en misschien B en C zijn iets langer patronen 175 00:11:14,820 --> 00:11:19,270 nogmaals, het idee is dat we willen gebruiken minder bits meeste van de tijd 176 00:11:19,270 --> 00:11:21,790 en meer bits slechts af en toe. 177 00:11:21,790 --> 00:11:26,070 Volgens Huffman codering, kunt u een bos van bomen. 178 00:11:26,070 --> 00:11:31,190 Er is een soort van een verhaallijn hier die inhoudt dat bomen en ook het proces van het bouwen van ze op. 179 00:11:31,190 --> 00:11:32,420 Laten we beginnen. 180 00:11:32,420 --> 00:11:36,140 >> Ik stel voor dat je begint met dit bos, om zo te zeggen van 5 bomen, 181 00:11:36,140 --> 00:11:38,260 die elk een behoorlijk stom boom. 182 00:11:38,260 --> 00:11:42,800 De boom bestaat uit slechts een knooppunt, zoals hier weergegeven door een cirkel. 183 00:11:42,800 --> 00:11:45,310 Dus elk van deze dingen zou een C struct zijn 184 00:11:45,310 --> 00:11:50,200 en in de C struct kan een vlotter die de frequentie telling 185 00:11:50,200 --> 00:11:52,510 en dan misschien een char die de brief. 186 00:11:52,510 --> 00:11:56,470 Dus denk van deze knooppunten als zomaar een C struct, maar voor nu, hoger niveau. 187 00:11:56,470 --> 00:12:01,230 Dit is een bos van 5 bomen, elk van die alleen een enkel knooppunt. 188 00:12:01,230 --> 00:12:06,830 Wat Huffman voorgestelde is dat we beginnen met die bomen te combineren 189 00:12:06,830 --> 00:12:11,140 dat de kleinste frequentie telt hebben in iets grotere bomen 190 00:12:11,140 --> 00:12:13,490 door ze te verbinden met een nieuwe root node. 191 00:12:13,490 --> 00:12:17,560 Dus onder de letters hier, merken dat voor het gemak heb ik ze gesorteerd van links naar rechts, 192 00:12:17,560 --> 00:12:21,420 maar dat is niet strikt noodzakelijk, en merk op dat de kleinste knooppunten 193 00:12:21,420 --> 00:12:23,930 momenteel 10% en 10%. 194 00:12:23,930 --> 00:12:28,940 Dus Huffman Wij stellen u voor de 2 kleinste knooppunten samen te voegen tot een nieuwe boom 195 00:12:28,940 --> 00:12:34,450 door de invoering van een nieuwe bovenliggende node en geef die ouder een linker kind en een rechter kind 196 00:12:34,450 --> 00:12:37,720 waarbij B willekeurig de linker en C willekeurig rechts. 197 00:12:37,720 --> 00:12:41,590 En dan Huffman verder voorgesteld dat laten we maar denken nu aan de linker kind 198 00:12:41,590 --> 00:12:44,790 in een van deze bomen altijd zo worden voorgesteld door 0 199 00:12:44,790 --> 00:12:47,890 en het rechter kind altijd zo worden weergegeven door het getal 1. 200 00:12:47,890 --> 00:12:50,680 >> Het maakt niet uit of je spiegelen ze zo lang als je consequent bent. 201 00:12:50,680 --> 00:12:54,650 Dus nu hebben we vier bomen in dit bos. 202 00:12:54,650 --> 00:12:58,050 En ik zeg vier, omdat nu de boom aan de linker - 203 00:12:58,050 --> 00:13:00,570 en het is niet zozeer een boom in de zin dat het op deze manier groeit, 204 00:13:00,570 --> 00:13:05,170 het is meer als een stamboom waar nu de 0,2 is een soort van de ouder van de twee kinderen - 205 00:13:05,170 --> 00:13:07,930 merken dat in die ouder we 0,2 getekend. 206 00:13:07,930 --> 00:13:13,370 We hebben toegevoegd de frequentie graven van de twee kinderen en de nieuwe knooppunt de totale som. 207 00:13:13,370 --> 00:13:15,310 Dus nu we dit proces herhalen. 208 00:13:15,310 --> 00:13:19,490 Zoek de twee kleinste knooppunten en ze vervolgens samen te voegen tot een nieuwe boom 209 00:13:19,490 --> 00:13:21,380 en herhaal het proces verder. 210 00:13:21,380 --> 00:13:26,390 Op dit moment hebben we een paar kandidaten, 20%, 15%, en nog eens 20%. 211 00:13:26,390 --> 00:13:29,780 In dit geval moeten we de winnaar te bepalen. We kunnen het willekeurig. 212 00:13:29,780 --> 00:13:31,540 We moeten gewoon consequent doen. 213 00:13:31,540 --> 00:13:33,760 In dit geval, zal ik willekeurig gaan met de een aan de linkerkant, 214 00:13:33,760 --> 00:13:39,880 en ik nu samen te voegen de 20% en de 15% om mij een nieuwe ouder genaamd 35%, 215 00:13:39,880 --> 00:13:46,310 waarvan de linkerborst kind is 0, wiens recht kind is 1, en nu hebben we slechts drie bomen in het bos. 216 00:13:46,310 --> 00:13:47,960 Je kunt misschien wel zien waar dit naartoe gaat. 217 00:13:47,960 --> 00:13:51,150 Als we herhalen dit nog een paar keer, we gaan maar een grotere boom hebben, 218 00:13:51,150 --> 00:13:53,900 waarvan alle randen zijn voorzien van 0s en 1s. 219 00:13:53,900 --> 00:13:55,710 Laten we het nog een keer doen. 220 00:13:55,710 --> 00:14:02,600 35% is dat de boom wortel. 20% en 45%, dus we gaan naar de 35% en 20% samen te voegen. 221 00:14:02,600 --> 00:14:05,610 Nu hebben we deze boom hier. We voegen deze samen, we hebben 55%. 222 00:14:05,610 --> 00:14:07,910 Nu is er maar twee bomen in het bos. 223 00:14:07,910 --> 00:14:11,900 We doen dit nog een laatste keer, en hopelijk wiskundig alle frequenties optellen 224 00:14:11,900 --> 00:14:15,570 omdat ze moeten omdat we berekend ze uit de get-go optellen tot 100%. 225 00:14:15,570 --> 00:14:17,960 En nu hebben we een boom. 226 00:14:17,960 --> 00:14:20,580 Dit is dus een Huffman codering boom. 227 00:14:20,580 --> 00:14:24,400 Het soort duurde een tijdje om daar mondeling te komen, maar de realiteit is met een for-lus 228 00:14:24,400 --> 00:14:27,620 of met een recursieve functie, kunt u bouwen dit ding vrij snel. 229 00:14:27,620 --> 00:14:32,440 Dus nu hebben we een nieuw knooppunt, en al deze interne knopen zijn malloc'd, 230 00:14:32,440 --> 00:14:34,690 vermoedelijk, langs de weg. 231 00:14:34,690 --> 00:14:38,650 Nu de top van de boom we 100%, maar nu zien we een pad 232 00:14:38,650 --> 00:14:43,780 van deze nieuwe over-over-overgrootouders om alle groot-groot-groot-kleinkinderen 233 00:14:43,780 --> 00:14:45,930 helemaal onderaan aan alle bladeren. 234 00:14:45,930 --> 00:14:52,840 >> Wat we nu doen is voor te stellen dat om de letter E te vertegenwoordigen, 235 00:14:52,840 --> 00:14:55,670 zullen we gewoon gebruik maken van het getal 1. Waarom? 236 00:14:55,670 --> 00:15:01,000 Want als we deze boom naar beneden doorkruisen van de laatste wortel naar het blad bekend als E, 237 00:15:01,000 --> 00:15:06,050 volgen we slechts een kant, de rechterkant, en dat is het label natuurlijk bovenaan rechts 1. 238 00:15:06,050 --> 00:15:11,550 De implicatie hier voor Huffman was dat E's coderen in binaire gewoon gelijk aan 1. 239 00:15:11,550 --> 00:15:14,490 En dat is verdomd efficiënt. Ik kan niet echt veel kleiner dan dat. 240 00:15:14,490 --> 00:15:18,350 Daarentegen wordt een zal worden vertegenwoordigd, als je de logica, 241 00:15:18,350 --> 00:15:21,610 door welk patroon van bits in plaats daarvan? 01. 242 00:15:21,610 --> 00:15:25,500 Dus om naar A, we beginnen bij de wortel en gaan we links en dan gaan we rechts, 243 00:15:25,500 --> 00:15:28,580 wat betekent dat we volgden een 0 en dan een 1. 244 00:15:28,580 --> 00:15:32,810 Dus vertegenwoordigt de letter A met het patroon 0 en 1. 245 00:15:32,810 --> 00:15:36,010 En nu merken dat we al een eigenschap van onmiddellijke decodability hebben 246 00:15:36,010 --> 00:15:38,090 dat we niet in Morse-code. 247 00:15:38,090 --> 00:15:42,840 Hoewel beide van deze patronen zijn vrij kort - E is 1 bit, A is 2 bits - 248 00:15:42,840 --> 00:15:45,080 merken dat ze niet kunnen een of het ander worden verward, 249 00:15:45,080 --> 00:15:54,870 want als je een 1 het moet een E zijn, als je een 0, dan een 1 het duidelijk moet toch een A. zijn 250 00:15:54,870 --> 00:15:58,410 Ook, wat is d? 001. 251 00:15:58,410 --> 00:16:01,440 Wat C? 0001. 252 00:16:01,440 --> 00:16:05,320 En wat is B? 0000. 253 00:16:05,320 --> 00:16:09,550 En nogmaals, omdat alle brieven die we de zorg over zijn op de bladeren 254 00:16:09,550 --> 00:16:13,890 en geen van hen zijn soort tussenpersonen in het pad van wortel tot blad, 255 00:16:13,890 --> 00:16:18,760 er is geen gevaar voor elkaar gehaald 2 letters 'verschillende coderingen 256 00:16:18,760 --> 00:16:22,300 omdat al deze bitpatronen zijn deterministisch. 257 00:16:22,300 --> 00:16:25,280 0000 zal altijd B. 258 00:16:25,280 --> 00:16:29,480 Er is geen knooppunt ergens tussen dat je misschien een letter voor de andere te verwarren. 259 00:16:29,480 --> 00:16:31,150 Dus wat is de implicatie hier? 260 00:16:31,150 --> 00:16:35,080 >> De meest populaire letter - in dit geval E - heeft gekregen van de kortste codering 261 00:16:35,080 --> 00:16:37,430 A heeft gekregen van de volgende kortste codering, 262 00:16:37,430 --> 00:16:41,390 en B en C, die we al kenden van de get-go waren zo vriendelijk van de minst populaire 263 00:16:41,390 --> 00:16:45,390 Bij 10% frequentie elk zijn ze weer de langste codering. 264 00:16:45,390 --> 00:16:49,410 En dus wat dit betekent nu is dat als je een bericht wilt dat is gecomprimeerd versturen 265 00:16:49,410 --> 00:16:51,950 via het internet of in een e-mail of iets dergelijks, 266 00:16:51,950 --> 00:16:56,730 in plaats van met behulp van standaard ASCII, kunt u een Huffman gecodeerde boodschap 267 00:16:56,730 --> 00:17:01,720 waarbij als je wilt de letter E te sturen, stuurt u gewoon een enkele bit. 268 00:17:01,720 --> 00:17:05,680 Als u wilt een A te sturen, stuurt u 2 bits, 01, in plaats van het verzenden van 8 bits 269 00:17:05,680 --> 00:17:10,190 gevolgd door een 8 bits gevolgd door een 8 bits enzovoort. 270 00:17:10,190 --> 00:17:11,940 Maar er is een gotcha hier. 271 00:17:11,940 --> 00:17:17,079 Het is niet voldoende om alleen te bouwen deze boom en dan het verzenden van Alice naar Bob te beginnen 272 00:17:17,079 --> 00:17:20,010 de kortere bitpatroon, een string van ASCII, 273 00:17:20,010 --> 00:17:23,140 want Alice heeft ook aan Bob op de hoogte van wat 274 00:17:23,140 --> 00:17:26,880 Als Bob gaat worden staat zijn om haar gecomprimeerde bericht te lezen? 275 00:17:26,880 --> 00:17:30,770 [Onverstaanbaar student reactie] >> Wat is dat? 276 00:17:30,770 --> 00:17:32,310 [Onverstaanbaar student reactie] >> Van wat de boom is. 277 00:17:32,310 --> 00:17:35,160 Of nog specifieker, wat die coderingen zijn, 278 00:17:35,160 --> 00:17:39,010 vooral omdat tijdens dit verhaal hebben we een beslissing te nemen op een punt. 279 00:17:39,010 --> 00:17:43,640 Vergeet niet dat we moesten willekeurig kiezen tussen de 2 verschillende 20% nodes? 280 00:17:43,640 --> 00:17:49,800 Dus het is niet zo dat Bob, de ontvanger, kan het gewoon reconstrueren de boom op zijn eigen 281 00:17:49,800 --> 00:17:53,390 want misschien is hij creëert de boom ooit zo iets anders dan Alice. 282 00:17:53,390 --> 00:17:56,670 Bovendien is Bob niet eens wat het oorspronkelijke bericht is 283 00:17:56,670 --> 00:18:00,770 omdat het enige wat Alice stuurt hem uiteraard de gecomprimeerde boodschap. 284 00:18:00,770 --> 00:18:05,900 >> Dus de vangst met compressie als dit is dat, ja, kan Alice besparen een hele hoop stukjes 285 00:18:05,900 --> 00:18:09,900 door het sturen 1 voor E en 01 voor A enzovoort, 286 00:18:09,900 --> 00:18:15,180 maar ze moet ook Bob informeren wat de mapping is tussen letters en bits 287 00:18:15,180 --> 00:18:19,620 omdat ze niet duidelijk rekenen op net ASCII meer als we niet met behulp van ASCII. 288 00:18:19,620 --> 00:18:22,200 Dus ze kan sturen hem de boom een ​​of andere manier - 289 00:18:22,200 --> 00:18:26,600 schrijf het op, bewaar het als binaire gegevens of iets dergelijks - 290 00:18:26,600 --> 00:18:30,280 of stuur hem een ​​beetje spiekbriefje, een Excel-bestand, dat de toewijzingen toont. 291 00:18:30,280 --> 00:18:36,480 Dus de effectiviteit van compressie neemt echt dat de berichten die u verzendt 292 00:18:36,480 --> 00:18:40,230 zijn vrij groot, in ieder geval middelgrote, 293 00:18:40,230 --> 00:18:42,180 want als je het verzenden van een super kort bericht, 294 00:18:42,180 --> 00:18:45,390 als je gewoon wilt om het bericht te verzenden BAD, die toevallig ook een woord dat we hier te spellen, 295 00:18:45,390 --> 00:18:49,550 B-A-D, ben je waarschijnlijk gaat minder bits te gebruiken, 296 00:18:49,550 --> 00:18:53,130 maar de vangst is als je ook nog Bob informeren wat de boom is 297 00:18:53,130 --> 00:18:57,530 of wat die coderingen zijn, zul je waarschijnlijk opwegen tegen alle van de besparingen 298 00:18:57,530 --> 00:19:00,110 van het hebben van gecomprimeerde dingen om mee te beginnen. 299 00:19:00,110 --> 00:19:02,210 Dus het kan eigenlijk zo zijn dat als je probeert te comprimeren 300 00:19:02,210 --> 00:19:05,330 zelfs met iets als zip of bestandsformaten u misschien wel vertrouwd met - 301 00:19:05,330 --> 00:19:07,780 vrij kleine bestanden, zelfs lege bestanden - 302 00:19:07,780 --> 00:19:10,930 soms zijn die bestanden kunnen groter en niet kleiner. 303 00:19:10,930 --> 00:19:14,320 Maar realistisch, dat gebeurt alleen voor kleine bestandsgrootte, 304 00:19:14,320 --> 00:19:16,920 dus het is niet van plan om een ​​gigabyte bestand zijn 2 gigabyte; 305 00:19:16,920 --> 00:19:19,480 we echt praten bytes of slechts een paar kilobytes. 306 00:19:19,480 --> 00:19:22,330 >> Sommige programma's zoals zip zijn slim genoeg om dat te realiseren, 307 00:19:22,330 --> 00:19:24,590 "Je gaat meer bits comprimeren deze door te brengen." 308 00:19:24,590 --> 00:19:27,460 "Laat me niet de moeite het te comprimeren voor u allen." 309 00:19:27,460 --> 00:19:30,160 Dus dit is gewoon een manier dan comprimeren tekstformaat. 310 00:19:30,160 --> 00:19:32,300 We konden implementeren iets als dit in C. 311 00:19:32,300 --> 00:19:35,370 Zo, hier is hoe we een knooppunt te vertegenwoordigen in deze boom 312 00:19:35,370 --> 00:19:39,320 waar we een char voor het symbool, een zwevende waarde voor de frequentie, 313 00:19:39,320 --> 00:19:42,250 en zoals we hebben gezien met onze andere datastructuren, 2 pointers, 314 00:19:42,250 --> 00:19:47,080 1 links kind 1 rechts, die beide kunnen worden NULL, 315 00:19:47,080 --> 00:19:50,850 maar zo niet, het verwijst naar een linker kind en een rechter kind. 316 00:19:50,850 --> 00:19:55,130 Dus dit is dan Huffman codering, en het is een manier waarop je kunt gaan over het comprimeren van informatie, 317 00:19:55,130 --> 00:19:57,880 en het is zeker een van de meest eenvoudig te implementeren 318 00:19:57,880 --> 00:20:00,830 in het kader van bijvoorbeeld de gegevens van vorige week structuren, 319 00:20:00,830 --> 00:20:03,250 hoewel zelfs meer verfijnde algoritmen bestaan 320 00:20:03,250 --> 00:20:08,220 dat kan nog meer verfijnde mutaties van uw gegevens. 321 00:20:08,220 --> 00:20:11,640 Hebt u vragen dan aan de bomen, binaire bomen of compressie van tekst? 322 00:20:11,640 --> 00:20:15,590 [Student] Is er enige onduidelijkheid, alsof [onverstaanbaar] gesplitst in 01, 323 00:20:15,590 --> 00:20:19,160 dan 011 zou zijn dubbelzinnig, toch? 324 00:20:19,160 --> 00:20:22,730 [Onverstaanbaar] >> Goede vraag. Dubbelzinnigheid. 325 00:20:22,730 --> 00:20:25,940 Laat ik samenvatten door te verwijzen naar deze foto hier. 326 00:20:25,940 --> 00:20:29,650 Omdat de tekens die u comprimeert, de voorstellingen van, 327 00:20:29,650 --> 00:20:32,850 per definitie van dit algoritme altijd de bladeren, 328 00:20:32,850 --> 00:20:41,870 je zult nooit per ongeluk gebruiken hetzelfde patroon van bits voor het voorvoegsel van meerdere letters. 329 00:20:41,870 --> 00:20:46,740 Dus met andere woorden, je bent bezorgd over, het klinkt als een dubbelzinnigheid die voortvloeien 330 00:20:46,740 --> 00:20:51,580 waarbij 001 kan de start van B of begin C of iets dergelijks. 331 00:20:51,580 --> 00:20:56,780 Maar dat kan niet het geval zijn, omdat merken dat alle letters van het alfabet dat we coderen 332 00:20:56,780 --> 00:20:58,290 zijn op de bladeren. 333 00:20:58,290 --> 00:21:01,910 >> De dubbelzinnigheid kan alleen ontstaan ​​bij Morse code, 334 00:21:01,910 --> 00:21:06,770 Als bijvoorbeeld C was ergens langs het pad van de wortel naar B. 335 00:21:06,770 --> 00:21:12,290 [Student] Juist. Dus in dat geval bijvoorbeeld A heeft twee bladeren. >> Say A heeft - Zeg dat nog eens. 336 00:21:12,290 --> 00:21:18,760 [Student] Say A heeft 2 bladeren, F en G, en dan G - >> Oke. Maar het kan niet. 337 00:21:18,760 --> 00:21:23,230 Een zelf kon niet hebben vanwege hun blad F en G omdat die brieven F en G 338 00:21:23,230 --> 00:21:27,560 zouden zelf laat ergens links van B of rechts van E. 339 00:21:27,560 --> 00:21:28,900 Dus per definitie, moeten deze bladeren. 340 00:21:28,900 --> 00:21:32,940 Anders ben je precies goed, we hebben niet het probleem opgelost dat Morse code wordt geconfronteerd. 341 00:21:32,940 --> 00:21:38,150 Goede vraag. Andere vragen? Oke. 342 00:21:38,150 --> 00:21:42,050 Dit begrip van bits, het blijkt dat we hebben gehad kracht de hele tijd dat we niet hebben daadwerkelijk wordt gebruikt 343 00:21:42,050 --> 00:21:44,200 als het ging om het manipuleren van deze 0s en 1s. 344 00:21:44,200 --> 00:21:46,600 We hebben gevraagd om dit op een van de vroegste probleem sets: 345 00:21:46,600 --> 00:21:52,340 namelijk je hoe gaan over het omzetten van hoofdletters naar kleine letters of vice versa? 346 00:21:52,340 --> 00:21:55,460 Of, meer concreet, een van die eerste psets gevraagd 347 00:21:55,460 --> 00:22:01,090 hoeveel bits heb je eigenlijk over moet halen om een ​​wijziging in een of vice versa kleine letters? 348 00:22:01,090 --> 00:22:05,580 Hier is een snelle herinnering aan wat 65 en 97 lijken in binaire. 349 00:22:05,580 --> 00:22:08,060 En zelfs als die vraag is soort van vage in uw geheugen, 350 00:22:08,060 --> 00:22:11,290 kun je hier weer te zien dat hoeveel bits moeten worden omgedraaid 351 00:22:11,290 --> 00:22:15,810 om kapitaal te veranderen A naar een kleine letter? Eentje maar. 352 00:22:15,810 --> 00:22:19,650 >> Ze verschillen alleen in een locatie, de derde bit van links. 353 00:22:19,650 --> 00:22:24,240 Overwegende A heeft een 010, wat een heeft een 011. 354 00:22:24,240 --> 00:22:26,250 Dus een of andere manier moeten we gewoon in staat zijn om dat beetje omdraaien, 355 00:22:26,250 --> 00:22:29,410 en we kunnen dan profiteren of kleine letters. 356 00:22:29,410 --> 00:22:32,720 We hebben dit gedaan in het verleden door feitelijk gebruik als de omstandigheden 357 00:22:32,720 --> 00:22:35,930 en te controleren of de brief is tussen kapitaal A en kapitaal Z, 358 00:22:35,930 --> 00:22:41,480 Vervolgens uitgangen zoals A - een + 26 of iets dergelijks. 359 00:22:41,480 --> 00:22:46,130 Je hebt waarschijnlijk wel een rekenkundige wijziging van de letters van het alfabet. 360 00:22:46,130 --> 00:22:49,270 Maar wat als we gewoon omdraaien, dat enkele bit? 361 00:22:49,270 --> 00:22:59,080 Hoe kon je gaan over het nemen van een byte ter waarde van bits, dus 8 bits als 01000001 en 01100001? 362 00:22:59,080 --> 00:23:03,170 Als je had die patronen van bits, kunnen we wat gaan over het veranderen van slechts een van hen? 363 00:23:03,170 --> 00:23:07,610 Wat als we hier introduceren in het geel die andere patroon van bits? 364 00:23:07,610 --> 00:23:13,420 Als ik de hele geel koord 0s, behalve voor degene beetje dat ik wil veranderen 365 00:23:13,420 --> 00:23:17,900 en dan introduceer ik een nieuwe exploitant bekend als een logische bewerking - 366 00:23:17,900 --> 00:23:21,210 bitsgewijs in die zin dat op een individuele bits, 367 00:23:21,210 --> 00:23:25,360 niet op een hele byte of vier bytes tegelijk. 368 00:23:25,360 --> 00:23:31,170 Deze verticale balk daar in geel geeft aan, dat als we de vertegenwoordiging van het kapitaal A 369 00:23:31,170 --> 00:23:37,060 en bitwise OR dan met het gele opeenvolging van bits? 370 00:23:37,060 --> 00:23:41,300 Met andere woorden, denk terug aan onze bespreking van Booleaanse uitdrukkingen in Scratch en vervolgens in C. 371 00:23:41,300 --> 00:23:47,520 >> Het doen van een Booleaanse of betekent dat dat waar is, ofwel de eerste ding heeft om waar te zijn 372 00:23:47,520 --> 00:23:50,700 of de tweede ding heeft om waar te zijn of ze hebben allebei om waar te zijn, 373 00:23:50,700 --> 00:23:53,270 en de resulterende output zelf waar. 374 00:23:53,270 --> 00:24:00,230 In dit geval hier, we wat krijgen als we 0 "of" ed met 0? Valse of niet waar? 375 00:24:00,230 --> 00:24:04,280 Het is nog steeds vals, dus de kleine letters a blijft zoals verwacht. 376 00:24:04,280 --> 00:24:07,540 Wat als we in plaats daarvan 1 of 0 te doen? 377 00:24:07,540 --> 00:24:12,640 Dit blijft nu 1, maar let op wat er gaat hier gebeuren. 378 00:24:12,640 --> 00:24:18,630 Als we beginnen met hoofdletter A en we blijven "of" de individuele bits als we hier doen, 379 00:24:18,630 --> 00:24:25,180 0 of de gele geeft ons wat hier beneden? Dit geeft ons 1. 380 00:24:25,180 --> 00:24:35,120 In feite, denk dat we niet weten wat de hoofdletters versie van weinig eigenlijk een was. 381 00:24:35,120 --> 00:24:38,270 Laten we gaan dit doen. Laat me dit terug te gaan hier. 382 00:24:38,270 --> 00:24:42,340 Laten we dit weer. 0 of 0 geeft me 0. 383 00:24:42,340 --> 00:24:45,020 1 of 0 geeft me 1. 384 00:24:45,020 --> 00:24:48,020 0 of 1 geeft me 1. 385 00:24:48,020 --> 00:24:52,880 0 of 0 geeft me 0. Het volgende is 0, de volgende is 0, de volgende is 0. 386 00:24:52,880 --> 00:24:55,660 1 of 0 geeft me 1. 387 00:24:55,660 --> 00:24:59,140 En dus zelfs als we niet weten van tevoren wat kleine letter a was, 388 00:24:59,140 --> 00:25:04,770 gewoon door "of" ing A met dit patroon van bits die we hier hebben gepresenteerd in het geel, 389 00:25:04,770 --> 00:25:09,400 kunt u kleine letters een hoofdletter A door het opgooien van dat beetje. 390 00:25:09,400 --> 00:25:11,580 We gebruikten deze uitdrukking weken geleden: het opgooien van een beetje. 391 00:25:11,580 --> 00:25:13,710 Hoe doe je dat eigenlijk doen programmatisch? 392 00:25:13,710 --> 00:25:16,390 U wat algemeen een masker, een reeks bits genoemd, 393 00:25:16,390 --> 00:25:19,980 in dit geval toevallig hier uitzien nummer 394 00:25:19,980 --> 00:25:22,980 en dan moet je 'of' het samen met deze nieuwe C-operator, 395 00:25:22,980 --> 00:25:29,940 niet | |, gebruikt u een | en je zou eigenlijk hier dit antwoord want waarom krijgen? 396 00:25:29,940 --> 00:25:35,120 Dit is de 1s plaats, 2s plaats, 4s, 8s, 16s, 32s. 397 00:25:35,120 --> 00:25:42,280 Dus het blijkt dat als je een hoofdletter A en bitwise OR met de integer 32, 398 00:25:42,280 --> 00:25:47,520 omdat het gehele getal 32, als je kijkt naar het als bits, ziet er als volgt, 399 00:25:47,520 --> 00:25:50,860 dat betekent dat je kunt bladeren het beetje dat je eigenlijk wilt. 400 00:25:50,860 --> 00:25:52,630 En evenzo - en we zullen op code er in slechts een moment - 401 00:25:52,630 --> 00:25:54,210 stel dat we willen de andere richting te gaan. 402 00:25:54,210 --> 00:25:58,210 >> Hoe ga je van kleine letters a tot en met hoofdletter A? Welke beetje moet veranderen? 403 00:25:58,210 --> 00:25:59,820 Het is dezelfde. 404 00:25:59,820 --> 00:26:03,970 We willen dat derde bit veranderen van een 1 op 0. 405 00:26:03,970 --> 00:26:06,310 En hoe kunnen we dat doen? 406 00:26:06,310 --> 00:26:10,130 Hoe zetten we een beetje af? Met welk patroon van bits kunnen we weer een beetje af? 407 00:26:11,580 --> 00:26:14,070 Wat als we sorteren van invertsuiker het masker? 408 00:26:14,070 --> 00:26:17,350 Waar voorheen, hebben we de hele gele masker 0s 409 00:26:17,350 --> 00:26:19,930 behalve degene bit we wilden zetten, 410 00:26:19,930 --> 00:26:25,580 wat als deze keer, maken we het hele masker 1s met uitzondering van het beetje dat we willen uitschakelen 411 00:26:25,580 --> 00:26:28,330 en gebruik vervolgens wat operator? 412 00:26:28,330 --> 00:26:30,560 Wat als wij "en" dingen? Laten we eens een kijkje nemen. 413 00:26:30,560 --> 00:26:34,880 Als we nu spiegelen aan deze, stel dat ik weer een masker dat is alles 1s creëren 414 00:26:34,880 --> 00:26:37,650 behalve voor de een bit die ik wil uitschakelen 415 00:26:37,650 --> 00:26:43,860 en dan in plaats van "of" de witte getallen tot top met de gele nummers hier beneden, 416 00:26:43,860 --> 00:26:46,940 wat als ik in plaats daarvan "en" hen samen? Het heet een bitwise en. 417 00:26:46,940 --> 00:26:49,450 Logisch, het is hetzelfde als een Boolean-en. 418 00:26:49,450 --> 00:26:55,160 Dit geeft me 0 & 1 is 0. Dus vals en waar is onwaar. 419 00:26:55,160 --> 00:26:58,160 Waar en waar is waar. 420 00:26:58,160 --> 00:27:04,020 En hier is de magie: Ware en valse is nu vals, dus we hebben uitgezet dat beetje. 421 00:27:04,020 --> 00:27:06,560 En nu is de rest van het verhaal is enigszins eenvoudig. 422 00:27:06,560 --> 00:27:11,970 Omdat de rest van het masker 1s, maakt het niet uit welke nummers in wit. 423 00:27:11,970 --> 00:27:15,580 Wanneer u "en" iets met echte, je niet gaat om de waarde te veranderen. 424 00:27:15,580 --> 00:27:20,200 Als het waar is, blijft waar. Als het vals was, blijft deze valse. 425 00:27:20,200 --> 00:27:23,190 >> Maar de magie gebeurt er als je iets dat waar was 426 00:27:23,190 --> 00:27:25,430 en je dan "en" het met vals. 427 00:27:25,430 --> 00:27:30,030 Dit heeft het effect van het uitschakelen van dat bit. 428 00:27:30,030 --> 00:27:31,980 Dus een beetje cryptisch daar. 429 00:27:31,980 --> 00:27:35,390 Laten we eigenlijk kijken naar een aantal code, die eigenlijk zou er nog meer cryptische, 430 00:27:35,390 --> 00:27:38,220 maar laten we een kijkje nemen hier bij tolower. 431 00:27:38,220 --> 00:27:45,880 Als ik kijk naar tolower, gaande van het kapitaal A naar een kleine letters, 432 00:27:45,880 --> 00:27:47,730 laten we eens kijken hoe we dit programma uit te voeren. 433 00:27:47,730 --> 00:27:51,280 Hier is de belangrijkste, en het is niet het nemen van command-line argumenten. 434 00:27:51,280 --> 00:27:55,980 Ik verklaar een teken c voor de brief die de gebruiker gaat typen inch 435 00:27:55,980 --> 00:28:00,690 Ik gebruik dan een vertrouwde do while lus om gewoon ervoor zorgen dat de gebruiker zeker geeft me een hoofdletter A 436 00:28:00,690 --> 00:28:05,010 of B of C. .. Z, dus ze geven me iets tussen A en Z. 437 00:28:05,010 --> 00:28:08,580 En nu, wat doe ik hier? 438 00:28:08,580 --> 00:28:14,870 Ik ben "of" ing dit met 0x20, maar dat is eigenlijk hetzelfde als - 439 00:28:14,870 --> 00:28:19,500 en we zullen terugkeren naar dit in een moment - 32. 440 00:28:19,500 --> 00:28:24,830 Dus nogmaals, 32 is dit patroon van bits hier. Hoe weten we dat? 441 00:28:24,830 --> 00:28:26,320 Denk eens terug aan week 0. 442 00:28:26,320 --> 00:28:31,010 Dit is de 1s plaats, 2s plaats, 4s, 8s, 16s, 32s plaats. 443 00:28:31,010 --> 00:28:33,470 Dus dit geel nummer toevallig 32. 444 00:28:33,470 --> 00:28:40,570 Ik kan dan hier nemen een brief als de char, bitsgewijze "of" met letterlijk de nummer 32, 445 00:28:40,570 --> 00:28:45,250 en wat krijg ik terug? De kleine versie van die char. 446 00:28:45,250 --> 00:28:48,830 Een moment geleden, hoewel, ik drukte dit in een ander basisstation notatie. 447 00:28:48,830 --> 00:28:51,370 Wat heeft dit voor? >> [Student] Hexadecimaal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Dit gebeurt te vertegenwoordigen hexadecimaal. 449 00:28:53,050 --> 00:28:55,170 We hebben nog niet gesproken over hexadecimale zo heel veel, 450 00:28:55,170 --> 00:28:57,330 maar het is eigenlijk handig in gevallen als deze. 451 00:28:57,330 --> 00:29:01,730 >> Ook al ziet het er meer complexe en hoewel het lijkt erop dat de 20 en niet 32, 452 00:29:01,730 --> 00:29:06,240 het blijkt dat hexadecimale eigenlijk is super handig notatie 453 00:29:06,240 --> 00:29:10,810 want in hexadecimale elk cijfer achter de 0x - en dit betekent niets; 454 00:29:10,810 --> 00:29:13,960 dit is gewoon de menselijke conventie die zegt dat hier komt een hexadecimaal getal - 455 00:29:13,960 --> 00:29:18,590 elk van deze cijfers de 2 en de 0 kan zelf worden vertegenwoordigd 456 00:29:18,590 --> 00:29:20,800 met precies 4 bits. 457 00:29:20,800 --> 00:29:27,840 Dus als we dit doen, laat me open te stellen hier een tekst-editor - raar autocomplete - 458 00:29:27,840 --> 00:29:35,940 als we een beetje teksteditor hier, het aantal 0x20 betekent hier is 4 bits, hier is nog een 4 bits. 459 00:29:35,940 --> 00:29:38,050 Laten we het meest rechtse 4 bits eerst. 460 00:29:38,050 --> 00:29:44,690 0 wanneer vertegenwoordigd met 4 bits is wat? Super makkelijk. Gewoon alle 0s. 461 00:29:44,690 --> 00:29:46,780 Dus 4 bits als 0s. 462 00:29:46,780 --> 00:29:53,510 Hoe Vertegenwoordigt u 2? Het is alweer een tijdje geleden dat we dit deden, maar het is 0100. 463 00:29:53,510 --> 00:29:57,310 Dus dit is de 1s plaats, dit is de 2s plaats, en dan maakt het niet uit wat de andere plaatsen zijn. 464 00:29:57,310 --> 00:30:00,610 Met andere woorden, in hexadecimale zou je kunnen zeggen 0x20, 465 00:30:00,610 --> 00:30:04,340 maar als je dan na te denken over wat er de 2 en hoe wordt het vertegenwoordigd in binaire, 466 00:30:04,340 --> 00:30:07,130 wat is de 0 en hoe wordt het vertegenwoordigd in binaire, 467 00:30:07,130 --> 00:30:10,440 de antwoorden op deze vragen zijn dit en dit, respectievelijk. 468 00:30:10,440 --> 00:30:14,380 Dus 0x20 gebeurt te vertegenwoordigen dit patroon van 8 bits, 469 00:30:14,380 --> 00:30:16,880 dat is precies het masker dat we wilden. 470 00:30:16,880 --> 00:30:20,140 Dit is dus voor het moment alleen maar een intellectuele oefening, 471 00:30:20,140 --> 00:30:24,520 maar de realiteit is in de code het typisch is vaker te schrijven constanten als dit 472 00:30:24,520 --> 00:30:28,360 in hexadecimale omdat dan de programmeur kan relatief gemakkelijk 473 00:30:28,360 --> 00:30:32,560 zelfs als het vereist enige papier en potlood, erachter te komen wat dat patroon van bits is 474 00:30:32,560 --> 00:30:35,960 want je kunt niet zomaar meestal uiten 0s en 1s in code. 475 00:30:35,960 --> 00:30:38,540 Je kunt niet naar 00010, enzovoort. 476 00:30:38,540 --> 00:30:42,380 >> Je moet decimaal of hexadecimaal of octaal of andere notaties kiezen. 477 00:30:42,380 --> 00:30:47,540 De meeste mensen hebben de neiging om hexadecimale halen gewoon zo dat elk getal 4 bits vertegenwoordigt 478 00:30:47,540 --> 00:30:49,320 en u kunt dit doen snel wiskunde. 479 00:30:49,320 --> 00:30:54,990 En ik zal zwaaien mijn hand op toupper, die bijna hetzelfde is, het ziet er bijna identiek. 480 00:30:54,990 --> 00:31:01,900 Toupper gebeurt er met het gebruik niet de of operator, maar deze man en df. 481 00:31:01,900 --> 00:31:09,300 Wat betekent df voor? df? Iedereen? >> [Student] 255. 482 00:31:09,300 --> 00:31:12,780 255? Niet 255. Dat zou ff. 483 00:31:12,780 --> 00:31:15,210 We laten dit als een kleine oefening. 484 00:31:15,210 --> 00:31:23,460 Maar als je van 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 en wat er na 9? 485 00:31:23,460 --> 00:31:26,510 We zijn soort uit decimale cijfers, maar in hexadecimale wat komt er na 9? 486 00:31:26,510 --> 00:31:29,510 [Student] een. Dus >> a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 U kunt daar uit welk patroon van bits d daadwerkelijk vertegenwoordigt. 488 00:31:33,470 --> 00:31:38,850 En als we dat doen de wiskunde, zullen we zien dat het masker je uiteindelijk krijgt terug is identiek aan deze. 489 00:31:38,850 --> 00:31:45,580 Dit is f, alle 1s, en is d. Dus df vertegenwoordigt dat masker. Oke. 490 00:31:45,580 --> 00:31:50,980 En tot slot, om geen dingen geluid super, super technisch, 491 00:31:50,980 --> 00:31:53,840 maar stel dat we wilden een programma dat dit doet schrijven. 492 00:31:53,840 --> 00:31:58,960 Laat me gaan en maak binaire, dat is een programma in een bestand met de naam binary.c. 493 00:31:58,960 --> 00:32:02,050 En nu laat ik lopen binaire en geef me een niet-negatief geheel getal. 494 00:32:02,050 --> 00:32:03,960 Laten we beginnen makkelijk en typ 0. 495 00:32:03,960 --> 00:32:09,010 Dit is nu een programma dat drukt een geheel getal in het binaire representatie. 496 00:32:09,010 --> 00:32:13,470 Dus als ik speel dit spel opnieuw en typ in slechts 1, moet ik een 32-bits representatie van 1. 497 00:32:13,470 --> 00:32:15,490 Als ik dit doe opnieuw met 2, moet ik dat. 498 00:32:15,490 --> 00:32:19,310 Als ik dat doe 7, moet ik een paar 1s te krijgen aan het eind enzovoort. 499 00:32:19,310 --> 00:32:22,740 Het blijkt dat ik dit te vermelden, want met bitwise operaties 500 00:32:22,740 --> 00:32:25,490 je kunt eigenlijk doen een ander ding ook. 501 00:32:25,490 --> 00:32:29,130 U kunt dynamisch te maken van deze maskers. 502 00:32:29,130 --> 00:32:32,800 Neem een ​​kijkje op deze laatste voorbeeld waarbij bitwise operaties. 503 00:32:32,800 --> 00:32:35,490 Hier is het eerste deel van de code, wordt de gebruiker gevraagd een nummer, 504 00:32:35,490 --> 00:32:38,130 en het dringt erop aan dat u mij een niet-negatief geheel getal. 505 00:32:38,130 --> 00:32:39,780 Dus dat is een soort van oude school spullen. 506 00:32:39,780 --> 00:32:41,980 Maar hier is iets dat is interessant. 507 00:32:41,980 --> 00:32:44,910 >> Hoe ga ik over het afdrukken van een aantal in binaire? 508 00:32:44,910 --> 00:32:48,970 Ik voor het eerst herhalen van wat naar wat? 509 00:32:48,970 --> 00:32:52,270 Wat is de grootte van een int algemeen, althans in het apparaat? >> [Student] 4. 510 00:32:52,270 --> 00:32:57,130 Het is 4. Dus 4 * 8 is 32 - 1 is 31. 511 00:32:57,130 --> 00:33:02,590 Dus als ik begin te tellen vanaf 31, dat staat, zo blijkt, 512 00:33:02,590 --> 00:33:07,630 net conceptueel, de 31e bit of de hoogste orde bit, wat is deze man hier, 513 00:33:07,630 --> 00:33:09,650 overwegende dat dit gaat worden bit 0. 514 00:33:09,650 --> 00:33:12,850 Dus dit is wat 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Dus wat is deze code aan het doen? 516 00:33:14,950 --> 00:33:20,140 Let op deze for-lus, ook al is het cryptisch lijkt, is gewoon itereren van 31 tot 0. Dat is het. 517 00:33:20,140 --> 00:33:24,530 Dus het interessante deel nu moet in deze 5 regels hier. 518 00:33:24,530 --> 00:33:28,110 Merk op dat in deze lijn ben ik een variabele genaamd masker te verklaren 519 00:33:28,110 --> 00:33:30,790 overeenstemming te zijn met ons verhaal van deze gele nummers. 520 00:33:30,790 --> 00:33:32,200 En wat dit doet? 521 00:33:32,200 --> 00:33:35,720 Dit is een andere logische bewerking we niet eerder gezien, het meest waarschijnlijk. 522 00:33:35,720 --> 00:33:38,300 Het is de linker shift operator. 523 00:33:38,300 --> 00:33:40,060 Deze operator doet dit. 524 00:33:40,060 --> 00:33:44,920 Hier is het nummer 1, en als je dat doet i left shift, verschuiving naar links, 525 00:33:44,920 --> 00:33:49,260 wat denk je dat heeft het effect van het doen van aan die persoon 1? 526 00:33:49,260 --> 00:33:51,290 Letterlijk verschuiven het over. 527 00:33:51,290 --> 00:33:57,540 Dus als de nummer 1 is wat je hebt aan de linkerkant en je begint met het initialiseren van i tot 31, 528 00:33:57,540 --> 00:34:03,490 wat is dat dan doen? Het gaat om dit nummer 1 te nemen en het verschuiven 31 plaatsen hier. 529 00:34:03,490 --> 00:34:06,210 En omdat er kennelijk geen andere cijfers achter de rug, 530 00:34:06,210 --> 00:34:10,350 die zal standaard worden vervangen door 0s. 531 00:34:10,350 --> 00:34:15,120 Dus je zult beginnen met het cijfer 1, die natuurlijk ziet er zo uit - 532 00:34:15,120 --> 00:34:18,659 en laat mij trekken hier meer dan in het centrum. 533 00:34:18,659 --> 00:34:22,139 En dan als je dingen naar links, deze man gaat in wezen op deze manier. 534 00:34:22,139 --> 00:34:24,659 Maar zodra je dat doet, krijgt een 0 ingevuld inch 535 00:34:24,659 --> 00:34:28,360 Als u verschuift het een tweede keer, het gaat op deze manier en een andere 0 wordt gevuld inch 536 00:34:28,360 --> 00:34:31,000 >> Je verschuiven het weer en dan nog een 0 wordt gevuld inch 537 00:34:31,000 --> 00:34:37,900 Dus als je dit ding van 1 << i 31 plaatsen, je uiteindelijk krijgt een masker 538 00:34:37,900 --> 00:34:42,550 dat is 32 tekens, de meest linkse waarvan een 1, 539 00:34:42,550 --> 00:34:45,199 alle overige die een 0. 540 00:34:45,199 --> 00:34:50,880 En het blijkt, als een terzijde, de verschuiving van een nummer aan de linkerkant als deze 541 00:34:50,880 --> 00:34:53,530 ook toevallig, en soms handig, 542 00:34:53,530 --> 00:34:57,520 heeft het effect van te doen wat naar dat nummer? >> [Student] Verdubbeling van het. 543 00:34:57,520 --> 00:35:00,980 Verdubbeling omdat elk van de kolommen - de 1s plaats, 2s plaats, 4s plaats, 544 00:35:00,980 --> 00:35:05,030 8s plaats, 16s plaats - ze zijn allemaal verdubbeling als je gaat naar links. 545 00:35:05,030 --> 00:35:09,500 Of beter gezegd, als je de 1s verschuift je gaat uiteindelijk een verdubbeling van de waarde van het getal. 546 00:35:09,500 --> 00:35:12,070 U kunt uiteindelijk doen interessante transformaties van cijfers 547 00:35:12,070 --> 00:35:15,640 door het verschuiven van alles over op deze manier door machten van 2. 548 00:35:15,640 --> 00:35:17,150 Dus hoe werkt dit? 549 00:35:17,150 --> 00:35:22,580 Dit geeft me dan een masker dat is alles 0s met uitzondering van een 1 op precies de plaats waar ik wil, 550 00:35:22,580 --> 00:35:27,920 en dan deze uitdrukking, die is gestolen van toupper.c, 551 00:35:27,920 --> 00:35:31,770 is gewoon te zeggen neem het getal n dat de gebruiker heeft ingevoerd in, 552 00:35:31,770 --> 00:35:34,730 "En" het met dat masker, en wat ga je krijgen? 553 00:35:34,730 --> 00:35:39,200 Je gaat een 1 te krijgen als er een 1 in die gemaskerde locatie, 554 00:35:39,200 --> 00:35:41,570 of je gaat naar een 0 te krijgen als er niet. 555 00:35:41,570 --> 00:35:44,370 En alzo zal geheel van dit programma verleent effectief is het een lus, 556 00:35:44,370 --> 00:35:48,340 en creëert een masker met een hier vervolgens een 1 hier dan een 1 hier, 557 00:35:48,340 --> 00:35:52,950 en maakt gebruik van deze bitwise AND truc om te zeggen is er een 1 bit in input van de gebruiker hier? 558 00:35:52,950 --> 00:35:59,220 >> Is er een 1 bit in de input van de gebruiker hier? En zo ja, letterlijk af te drukken 1, anders af te drukken 0. 559 00:35:59,220 --> 00:36:03,780 We doen dit met ints, alleen maar omdat dat is waarom we het doen bent 32 bits in plaats van 8, 560 00:36:03,780 --> 00:36:06,900 maar wat we hebben vervolgens geïntroduceerd is dit bitwise AND, deze bitwise OR, 561 00:36:06,900 --> 00:36:10,450 en dit naar links verplaatsen gebruikt, die niet vaak erg nuttig, 562 00:36:10,450 --> 00:36:12,230 maar het blijkt dat ze kan zijn. 563 00:36:12,230 --> 00:36:16,560 In feite, als je naar iets als een array van Booleans vertegenwoordigen 564 00:36:16,560 --> 00:36:21,260 gewoon te vertegenwoordigen waar of onwaar, stel dat je wilde om bij te houden van al dan niet 565 00:36:21,260 --> 00:36:24,630 een kamer vol met 300 studenten aanwezig is, 566 00:36:24,630 --> 00:36:29,420 je zou kunnen verklaren een array van grootte 300 van type bool, zodat je 300 bools, 567 00:36:29,420 --> 00:36:33,090 en kunt u elke op true als iemand hier en anders false. 568 00:36:33,090 --> 00:36:37,550 Waarom is dat vertegenwoordiging op dit datastructuur inefficiënt? 569 00:36:39,370 --> 00:36:44,800 Wat is er slecht over het ontwerp van deze gegevens structuur, een reeks van 300 bools? 570 00:36:46,190 --> 00:36:49,600 Wat een bool in feite onder de motorkap? 571 00:36:49,600 --> 00:36:52,310 Ook dit is iets dat niet kan worden vertrouwd. 572 00:36:52,310 --> 00:36:53,720 Het blijkt dat er geen bool. 573 00:36:53,720 --> 00:36:56,620 Denk eraan dat we soort van gemaakt dat met de cs50.h bestand, 574 00:36:56,620 --> 00:36:58,630 die zelf ook standaard bool. 575 00:36:58,630 --> 00:37:00,930 C is een beetje dom, hoewel, als het gaat om bool. 576 00:37:00,930 --> 00:37:04,880 Het gebruikt 8 bits te vertegenwoordigen elk bool, dat volledig verspilling 577 00:37:04,880 --> 00:37:09,040 want uiteraard moet je hoeveel bits je nodig hebt om een ​​bool vertegenwoordigen? Slechts 1. 578 00:37:09,040 --> 00:37:13,190 Dus het blijkt dat als je nu de mogelijkheid met bitwise operators 579 00:37:13,190 --> 00:37:17,760 individuele bits even in een char, zelfs in een byte manipuleren, 580 00:37:17,760 --> 00:37:21,380 het blijkt dat je zou kunnen verminderen het geheugen nodig is om iets stoms te vertegenwoordigen 581 00:37:21,380 --> 00:37:25,490 zo vormgegeven aanwezigheid gegevensstructuur met een factor 8. 582 00:37:25,490 --> 00:37:29,820 In plaats van acht bits op true of false vertegenwoordigen, kon je letterlijk gebruik maken van een 583 00:37:29,820 --> 00:37:34,500 met behulp van een enkele byte voor elke acht leerlingen in de klas 584 00:37:34,500 --> 00:37:41,990 en schakelen 0-1 individuele bits door dit soort lage tricks. 585 00:37:43,850 --> 00:37:49,460 Dat is echt een einde maken aan de energie. Zijn er nog vragen over bitwise operaties? 586 00:37:49,460 --> 00:37:52,710 >> Ja. >> [Student] Is er een exclusieve of operator? 587 00:37:52,710 --> 00:37:56,440 Ja. Er is een exclusieve of operator die er zo uitziet, ^, de wortel symbool, 588 00:37:56,440 --> 00:38:02,070 wat betekent dat alleen de eerste ding of het tweede ding kan een 1 voor de uitgang om een ​​1. 589 00:38:02,070 --> 00:38:07,750 Er is ook een niet ~, waardoor u 0 naar 1 of vice versa en omkeren. 590 00:38:07,750 --> 00:38:11,600 En er is ook een rechtse shift operator, >>, dat is het tegenovergestelde van degene die we zagen. 591 00:38:11,600 --> 00:38:13,850 Oke. Laten we nu dingen naar een hoger niveau. 592 00:38:13,850 --> 00:38:16,770 We zijn begonnen met praten over de tekst en vervolgens te comprimeren 593 00:38:16,770 --> 00:38:19,650 en die de tekst met minder aantallen bits; 594 00:38:19,650 --> 00:38:22,890 spraken we een beetje over hoe we kunnen nu beginnen te manipuleren dingen op een bitwise niveau. 595 00:38:22,890 --> 00:38:26,640 Laten we nu van Z weer 10.000 voet naar vertegenwoordiging 596 00:38:26,640 --> 00:38:29,250 van meer complexe zaken als graphics. 597 00:38:29,250 --> 00:38:32,950 Hier hebben we een vlag van Duitsland hebben, hier hebben we een van Frankrijk. 598 00:38:32,950 --> 00:38:36,350 Deze kunnen worden vertegenwoordigd in bestandsformaten u wellicht weet - GIF, bijvoorbeeld. 599 00:38:36,350 --> 00:38:40,030 Als je ooit hebt gezien een afbeelding op het web die eindigt op. Gif, 600 00:38:40,030 --> 00:38:43,000 Dit is een Graphics Interchange Format. 601 00:38:43,000 --> 00:38:47,530 Deze twee vlaggen hier soort van lenen zich voor compressie 602 00:38:47,530 --> 00:38:52,050 voor wat misschien voor de hand liggende reden? >> [Onverstaanbaar student reactie] 603 00:38:52,050 --> 00:38:53,440 Er is veel herhaling, toch? 604 00:38:53,440 --> 00:38:57,270 Met het oog op de Duitse vlag te sturen, denk aan dit als een beeld op het scherm 605 00:38:57,270 --> 00:38:59,030 terug in uw Scratch dagen. 606 00:38:59,030 --> 00:39:02,380 Je zou kunnen herinneren dat er afzonderlijke pixels of puntjes bevatten die een beeld samen te stellen. 607 00:39:02,380 --> 00:39:06,650 >> Er is een hele rij van zwarte stippen en een andere hele rij van zwarte stippen. 608 00:39:06,650 --> 00:39:10,110 Er is een heleboel rijen zwarte stippen dat we konden zien of we echt ingezoomd, 609 00:39:10,110 --> 00:39:13,370 veel als toen we ingezoomd op het gezicht van Rob in Photoshop. 610 00:39:13,370 --> 00:39:15,500 Zodra we dieper en dieper en dieper in het beeld, 611 00:39:15,500 --> 00:39:19,990 je begon het zien van de pixelation, alle van de vierkantjes die zijn oog gecomponeerd in dat geval. 612 00:39:19,990 --> 00:39:24,130 Zelfde deal hier. Als we ingezoomd nogal wat, zou je zien afzonderlijke punten. 613 00:39:24,130 --> 00:39:27,110 Nou, dit is een soort van een verspilling van bits. 614 00:39:27,110 --> 00:39:32,120 Indien een derde van de vlag is zwart en een derde van de vlag is geel enzovoort, 615 00:39:32,120 --> 00:39:34,860 waarom kunnen we een of andere manier comprimeren deze vlag? 616 00:39:34,860 --> 00:39:39,560 En zelfs de Franse vlag kunnen worden gecomprimeerd, hoewel het patroon is een beetje anders. 617 00:39:39,560 --> 00:39:44,120 Het blijkt dat de GIF-bestandsindeling is een gecomprimeerde lossless format 618 00:39:44,120 --> 00:39:48,420 wat betekent dat u een beeld zoals de Duitse vlag hier te nemen, 619 00:39:48,420 --> 00:39:53,540 kun je een heleboel weggooien van de stukjes, zonder concessies aan de kwaliteit. 620 00:39:53,540 --> 00:39:55,340 Dit in tegenstelling tot iets als JPEG, 621 00:39:55,340 --> 00:39:57,050 waarmee de meeste van ons zijn waarschijnlijk meer vertrouwd. 622 00:39:57,050 --> 00:39:59,000 Facebook-foto's en Flickr foto's en dergelijke 623 00:39:59,000 --> 00:40:02,200 zijn bijna altijd opgeslagen als JPEG-bestanden als ze geüpload, 624 00:40:02,200 --> 00:40:08,100 maar JPEG is een lossy - lossy - formaat waarbij je hoeft weg te gooien stukjes 625 00:40:08,100 --> 00:40:10,430 maar je hebt ook weggooien kwaliteit. 626 00:40:10,430 --> 00:40:13,890 En dus als je comprimeren van foto's met Photoshop of upload ze naar Facebook 627 00:40:13,890 --> 00:40:15,580 of neem ze op een echt crappy telefoon, 628 00:40:15,580 --> 00:40:19,510 je weet dat het beeld begint te worden zeer vlekkerig en korrelig, 629 00:40:19,510 --> 00:40:22,290 en dat komt omdat het wordt gecomprimeerd door de computer of telefoon 630 00:40:22,290 --> 00:40:24,550 door letterlijk gooien informatie weg. 631 00:40:24,550 --> 00:40:28,500 Maar GIF is verbazingwekkend in dat het kan minder bits gebruiken dan het misschien standaard 632 00:40:28,500 --> 00:40:30,750 zonder informatie te verliezen. 633 00:40:30,750 --> 00:40:32,410 >> En doet wezen dat als volgt. 634 00:40:32,410 --> 00:40:38,740 In plaats van op te slaan in een bestand als een BMP zou een RGB-triple voor zwart, zwart, zwart, zwart, 635 00:40:38,740 --> 00:40:42,570 zwart, zwart, zwart, zwart, zwart, zwart, zwart, zwart, enzovoort, 636 00:40:42,570 --> 00:40:45,640 veeleer is het GIF-formaat gaan zeggen, "Black", 637 00:40:45,640 --> 00:40:48,330 en dan, "Herhaal dit 100 keer," of iets dergelijks. 638 00:40:48,330 --> 00:40:52,280 "Zwart, herhaal dit 100 keer, zwart, herhaal dit 100 keer ..." 639 00:40:52,280 --> 00:40:54,530 "Yellow, herhaal dit 100 keer." 640 00:40:54,530 --> 00:40:57,200 En zo herinnert, in wezen, de meest linkse pixel 641 00:40:57,200 --> 00:41:02,160 en dan codeert een of andere manier het idee van het herhalen van die pixel opnieuw en opnieuw. 642 00:41:02,160 --> 00:41:06,110 Dus GIF kan dan comprimeren zelf, zonder enige informatie te verliezen. 643 00:41:06,110 --> 00:41:09,510 Maar als je moest raden, als dat het algoritme dat gifs gebruik, 644 00:41:09,510 --> 00:41:13,180 welke van deze vlaggen, hoewel ze grootte identiek lijken, 645 00:41:13,180 --> 00:41:19,620 zal kleiner zijn wanneer ze worden opgeslagen op de harde schijf als een GIF? >> [Student] Duitsland. 646 00:41:19,620 --> 00:41:21,660 Duitsland zal kleiner? Waarom? 647 00:41:21,660 --> 00:41:26,620 [Student] Omdat je het te herhalen vele, vele malen horizontaal 648 00:41:26,620 --> 00:41:29,010 en dan herhaal je nog een keer. >> Precies. 649 00:41:29,010 --> 00:41:32,020 Omdat de mensen die het bedacht GIF gewoon een soort van willekeurig gekozen 650 00:41:32,020 --> 00:41:36,040 dat de herhaling zal horizontaal en niet zijdelings worden benut. 651 00:41:36,040 --> 00:41:40,900 Er is veel meer herhaling lateraal hier in de Duitse vlag dan in de Franse vlag. 652 00:41:40,900 --> 00:41:44,430 Dus als we daadwerkelijk openen van een map op mijn harde schijf dat deze GIF heeft, 653 00:41:44,430 --> 00:41:51,920 kun je eigenlijk zien dat de Duitse vlag hier is 2 kilobytes en de Franse een is 4 kilobytes. 654 00:41:51,920 --> 00:41:54,080 Het is nu eenmaal een toeval dat een is twee keer de andere, 655 00:41:54,080 --> 00:41:57,960 maar het is in feite het geval dat de Franse vlag is veel groter. 656 00:41:57,960 --> 00:42:01,250 >> Hoewel we hebben het hier over graphics, kan dezelfde ideeën van toepassing zijn op 657 00:42:01,250 --> 00:42:05,150 niet dingen zoals vlaggen, maar beelden die een beetje ingewikkelder. 658 00:42:05,150 --> 00:42:08,170 Als u een foto van een appel, dus er is een hoop dubbel werk daar, 659 00:42:08,170 --> 00:42:11,040 dus we konden een of andere manier vergeten dat de standaard achtergrond blauw is 660 00:42:11,040 --> 00:42:13,230 en niet, zoals het rechterbeeld suggereert 661 00:42:13,230 --> 00:42:16,830 moet de kleur van elke pixel in deze afbeelding herinneren. 662 00:42:16,830 --> 00:42:21,060 Dus we kunnen weggooien stukjes er zonder informatie te verliezen. 663 00:42:21,060 --> 00:42:23,340 De appel ziet er nog steeds precies hetzelfde. 664 00:42:23,340 --> 00:42:27,510 In dit voorbeeld hier, kunt u zien wat er gebeurt in een film. 665 00:42:27,510 --> 00:42:31,970 Deze vertegenwoordigen old-school filmspoelen, waarbij in de bovenste afbeelding is er 666 00:42:31,970 --> 00:42:36,900 heb je een camper rijden langs een huis en een boom. 667 00:42:36,900 --> 00:42:42,130 En als die van verleden rijdt van links naar rechts, wat natuurlijk niet veranderen? 668 00:42:42,130 --> 00:42:45,320 Het huis is nergens heen, en de boom gaat nergens heen. 669 00:42:45,320 --> 00:42:47,700 Het enige dat beweegt is de bestelwagen in dit geval. 670 00:42:47,700 --> 00:42:51,650 Dus als achtergrond Ongewijzigd suggereert u, wat kan doen in films 671 00:42:51,650 --> 00:42:56,530 wordt op dezelfde wijze gewoon weggooien informatie die niet verandert in tussen de frames. 672 00:42:56,530 --> 00:42:58,900 Dit is algemeen bekend als interframecompressie 673 00:42:58,900 --> 00:43:02,120 waarbij indien dit frame ziet er bijna identiek is aan deze, 674 00:43:02,120 --> 00:43:05,390 Laten we niet de moeite te slaan op de harde schijf van een van de identieke informatie 675 00:43:05,390 --> 00:43:09,250 op deze tussenliggende frames, laten we slechts keyframes een keer gebruiken in de zoveel tijd 676 00:43:09,250 --> 00:43:13,420 die daadwerkelijk op te slaan die informatie redundant net als een klein geestelijke gezondheid te controleren. 677 00:43:13,420 --> 00:43:18,620 >> Daarentegen andere benadering voor het comprimeren van video in deze tweede en lagere voorbeeld, 678 00:43:18,620 --> 00:43:23,970 waar in plaats van te slaan 30 frames, waarom ga je niet gewoon in plaats bewaren 15 beelden per seconde? 679 00:43:23,970 --> 00:43:27,070 In plaats van de film soort van stromende prachtig, perfect, 680 00:43:27,070 --> 00:43:30,060 Het zou kunnen kijken alsof het stotteren een beetje, een beetje oude school, 681 00:43:30,060 --> 00:43:37,190 maar het netto effect zal zijn veel minder bits dan anders noodzakelijk gebruiken. 682 00:43:37,190 --> 00:43:39,240 Dus waar komt dit dan voor ons? 683 00:43:39,240 --> 00:43:41,700 Dat was een beetje een terzijde van waar anders kun je gaan met compressie. 684 00:43:41,700 --> 00:43:45,140 Voor meer informatie over deze, neem dan een klasse als CS175 hier. 685 00:43:45,140 --> 00:43:46,990 Hier is een ander voorbeeld binnen video. 686 00:43:46,990 --> 00:43:49,190 Als de bijen is het enige bewegende, 687 00:43:49,190 --> 00:43:51,790 je kunt echt weggooien informatie in die midden frames 688 00:43:51,790 --> 00:43:55,260 omdat de bloem en de hemel en de bladeren zijn niet veranderen. 689 00:43:55,260 --> 00:43:57,960 Maar laten we nu nog een ding te overwegen. 690 00:43:57,960 --> 00:44:03,890 In de volgende 5 minuten laten we C achter voor altijd in college? Ja. Niet in de psets, dat wel. 691 00:44:03,890 --> 00:44:10,210 Laatste verhaal over C en dan krijgen we een zeer sexy stuff 692 00:44:10,210 --> 00:44:13,870 met betrekking tot HTML en web-en woo-hoo. Oke. 693 00:44:13,870 --> 00:44:16,050 Daar gaan we. Dat is de motivatie. 694 00:44:16,050 --> 00:44:20,020 Het blijkt al die tijd dat we hebben programma's lopen we Clang schrijven. 695 00:44:20,020 --> 00:44:23,890 En Clang, we hebben gezegd sinds de eerste week vrij veel, neemt broncode 696 00:44:23,890 --> 00:44:25,740 en zet deze om in object code. 697 00:44:25,740 --> 00:44:28,540 Het duurt C en zet het om in 0s en 1s. 698 00:44:28,540 --> 00:44:32,150 Ik heb soort van tegen je gelogen voor een paar weken, want het is niet zo simpel als dat. 699 00:44:32,150 --> 00:44:36,750 >> Er is veel meer aan de hand onder de kap wanneer u een programma als Clang. 700 00:44:36,750 --> 00:44:39,560 In feite, kan het proces van het samenstellen van een programma echt worden samengevat, 701 00:44:39,560 --> 00:44:42,210 zoals je misschien herinnert uit video Rob's op compilers, 702 00:44:42,210 --> 00:44:47,580 in deze 4 stappen: pre-processing, compileren zelf, montage, en het koppelen van. 703 00:44:47,580 --> 00:44:51,950 Maar we in de klas en de meeste mensen in de wereld doorgaans samen te vatten al deze stappen 704 00:44:51,950 --> 00:44:54,410 als gewoon "samenstellen." 705 00:44:54,410 --> 00:44:58,070 Maar als we beginnen met broncode als dit, herinneren is dit misschien wel de eenvoudigste C-programma 706 00:44:58,070 --> 00:45:03,530 we hebben tot nu toe geschreven, herinneren dat toen gecompileerd het eindigt uitziet. 707 00:45:03,530 --> 00:45:07,310 Maar er is eigenlijk een tussenstap, en deze stappen zijn als volgt. 708 00:45:07,310 --> 00:45:10,750 Eerst is er dit ding aan de top van deze en de meeste van onze programma's, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Wat doet # er zijn voor ons? 711 00:45:17,210 --> 00:45:24,150 Het vrij veel kopieert en plakt de inhoud van stdio.h in mijn bestand, zodat waarom? 712 00:45:24,150 --> 00:45:27,220 Waarom moet ik de zorg over de inhoud van stdio.h? Wat is daar van belang? 713 00:45:27,220 --> 00:45:32,310 Printf verklaring, het prototype, zodat de compiler weet dan wat ik bedoel 714 00:45:32,310 --> 00:45:34,900 toen ik deze functie printf noemen. 715 00:45:34,900 --> 00:45:39,390 Dus stap 1 bij het samenstellen van is pre-processing, waarbij een programma als Clang 716 00:45:39,390 --> 00:45:43,450 of een helper programma dat Clang wordt geleverd met leest uw code boven naar beneden, 717 00:45:43,450 --> 00:45:47,740 van links naar rechts, en elke keer dat hij ziet een # symbool, gevolgd door een zoekwoord als omvatten, 718 00:45:47,740 --> 00:45:53,980 voert die operatie, kopiëren en plakken in dit geval stdio.h in uw bestand. 719 00:45:53,980 --> 00:45:55,510 Dat is stap 1. 720 00:45:55,510 --> 00:45:59,620 Dan heb je een veel grotere C-bestand als gevolg van de enorme kopiëren, plakken job die net is gebeurd. 721 00:45:59,620 --> 00:46:01,710 >> Stap 2 is nu het compileren. 722 00:46:01,710 --> 00:46:04,880 Maar het blijkt compileren duurt source code die er als volgt uitziet 723 00:46:04,880 --> 00:46:08,160 en verandert het in iets dat er zo uitziet, 724 00:46:08,160 --> 00:46:12,560 die voor degenen die bekend zijn wordt genoemd? >> [Student] Vergadering. >> Assembler. 725 00:46:12,560 --> 00:46:16,700 Dit is eigenlijk iets wat als je CS61 je in duiken in meer detail. 726 00:46:16,700 --> 00:46:22,380 Dit is ongeveer net zo dicht als je kunt krijgen aan het schrijven van 0s en 1s jezelf 727 00:46:22,380 --> 00:46:25,850 maar het schrijven van dingen op een zodanige wijze dat maakt nog steeds op zijn minst een beetje zin. 728 00:46:25,850 --> 00:46:30,760 Dit zijn machine-instructies, en als we naar beneden scrollen naar de belangrijkste functie hier, 729 00:46:30,760 --> 00:46:35,470 merken dat er deze push instructie, bewegen instructie, aftrekken instructie, 730 00:46:35,470 --> 00:46:38,550 bel instructie, enzovoort. 731 00:46:38,550 --> 00:46:42,930 Als je hoort dat uw computer Intel inside heeft, 732 00:46:42,930 --> 00:46:46,180 heb je een Intel CPU in je Mac of pc, wat betekent dat? 733 00:46:46,180 --> 00:46:51,200 Een CPU is ingebouwd door bedrijven als Intel begrijpen van bepaalde instructies. 734 00:46:51,200 --> 00:46:55,770 Ze hebben geen idee wat functies zoals swap zijn of belangrijkste zijn per se, 735 00:46:55,770 --> 00:47:00,060 maar ze weten wel wat een zeer laag niveau instructies zoals het optellen, aftrekken, duwen, 736 00:47:00,060 --> 00:47:02,430 verplaatsen, te bellen, enzovoort zijn. 737 00:47:02,430 --> 00:47:06,170 Dus als je C-code compileren naar assembleertaal, 738 00:47:06,170 --> 00:47:11,820 uw zeer gebruiksvriendelijk uitziende code wordt omgezet in iets dat er zo uitziet, 739 00:47:11,820 --> 00:47:21,670 die beweegt letterlijk bytes of 4 bytes in deze in kleine eenheden in en uit de CPU. 740 00:47:21,670 --> 00:47:26,820 Maar uiteindelijk, als Clang is klaar om deze voorstelling van uw programma te nemen 741 00:47:26,820 --> 00:47:30,940 in 0 en 1, vervolgens de stap genoemd montage gebeurt 742 00:47:30,940 --> 00:47:33,850 en dit weer allemaal gebeurt in het knipperen van een oog bij het uitvoeren van Clang. 743 00:47:33,850 --> 00:47:39,300 We beginnen hier, het systeem voert een bestand als deze, en dan zet het om in deze 0s en 1s. 744 00:47:39,300 --> 00:47:42,000 En als je wilt om terug te gaan op een bepaald punt en eigenlijk is dit in actie te zien, 745 00:47:42,000 --> 00:47:48,220 Als ik in hello1.c--dit is een van de eerste programma's die we bekeken - 746 00:47:48,220 --> 00:47:53,710 Normaal gesproken zouden we samen te stellen dit met Clang hello1.c en dit zou ons a.out. 747 00:47:53,710 --> 00:47:59,890 Indien daarentegen u in plaats daarvan geven de vlag-S, wat je krijgt is hello1.s 748 00:47:59,890 --> 00:48:02,750 en je zult echt zien de assembler. 749 00:48:02,750 --> 00:48:05,750 >> Ik doe dit voor een zeer korte programma, maar als je terug voor Scramble 750 00:48:05,750 --> 00:48:08,740 of herstellen of een programma dat u hebt geschreven en gewoon uit nieuwsgierigheid 751 00:48:08,740 --> 00:48:13,240 willen zien hoe het er daadwerkelijk uitziet, wat er daadwerkelijk wordt ingevoerd in de CPU, 752 00:48:13,240 --> 00:48:15,700 kunt u dat-S vlag met Clang. 753 00:48:15,700 --> 00:48:17,770 Maar dan ten slotte, is er nog steeds een gotcha. 754 00:48:17,770 --> 00:48:21,810 Hier zijn de 0s en 1s dat mijn uitvoering van hello, wereld vertegenwoordigen. 755 00:48:21,810 --> 00:48:25,530 Maar ik gebruikte een ander functie in mijn programma. 756 00:48:25,530 --> 00:48:28,710 Dus ook al is het proces is neem ik hello.c, 757 00:48:28,710 --> 00:48:34,280 het wordt gecompileerd in assembly code, en dan wordt geassembleerd in 0s en 1s, 758 00:48:34,280 --> 00:48:37,460 de enige 0s en 1s die uitgevoerd op dit punt in de tijd 759 00:48:37,460 --> 00:48:40,270 zijn degenen die resulteren uit mijn code. 760 00:48:40,270 --> 00:48:44,400 Maar de persoon die schreef printf stelden ze hun code 20 jaar geleden 761 00:48:44,400 --> 00:48:47,000 en het is nu ergens geïnstalleerd op het apparaat, 762 00:48:47,000 --> 00:48:51,610 dus we een of andere manier hebben om zijn of haar 0s en 1s samen te voegen met mijn 0s en 1s, 763 00:48:51,610 --> 00:48:56,160 en dat brengt ons bij de 4e en laatste stap van het samenstellen, die bekend staat als het koppelen. 764 00:48:56,160 --> 00:48:58,680 Dus op de linker kant hebben we exact hetzelfde beeld als voorheen: 765 00:48:58,680 --> 00:49:02,580 hello.c wordt assembly code wordt 0s en 1s. 766 00:49:02,580 --> 00:49:05,960 Maar herinneren dat ik de standaard I / O library gebruikt in mijn code, 767 00:49:05,960 --> 00:49:10,350 en dat betekent dat ergens op de computer is er een bestand met de naam stdio.c 768 00:49:10,350 --> 00:49:13,980 althans de gecompileerde versie daarvan omdat iemand enkele jaren geleden 769 00:49:13,980 --> 00:49:18,530 stdio.c gecompileerd in assembly code en dan een hele hoop van 0s en 1s. 770 00:49:18,530 --> 00:49:21,130 Dit is wat bekend staat als een statische of een dynamische bibliotheek. 771 00:49:21,130 --> 00:49:23,350 Het is een bestand zit ergens in het apparaat. 772 00:49:23,350 --> 00:49:28,710 >> Maar ten slotte, ik moet mijn 0s en 1s te nemen en die persoon 0s en 1s 773 00:49:28,710 --> 00:49:32,760 en een of andere manier verbinden ze samen, letterlijk combineren deze 0s en 1s 774 00:49:32,760 --> 00:49:37,900 in een bestand genaamd a.out of hello1 of wat dan ook belde ik mijn programma 775 00:49:37,900 --> 00:49:43,320 zodat het eindresultaat heeft alle 1s en 0s dat mijn programma samen te stellen. 776 00:49:43,320 --> 00:49:45,660 Dus al die tijd dit semester als je al Clang met behulp van 777 00:49:45,660 --> 00:49:48,750 en nog meer recent uitgevoerde maken om Clang lopen, 778 00:49:48,750 --> 00:49:53,580 al deze stappen zijn er soort van direct, maar zeer bewust. 779 00:49:53,580 --> 00:49:57,830 En dus als je verder in de informatica, namelijk CS61, 780 00:49:57,830 --> 00:50:00,850 dit is de laag die je verder te schillen terug uit er 781 00:50:00,850 --> 00:50:06,980 praten over efficiency, gevolgen voor de beveiliging, en dergelijke van deze lagere niveau details. 782 00:50:06,980 --> 00:50:09,220 Maar daarmee zijn we op het punt om achter te laten C. 783 00:50:09,220 --> 00:50:11,420 Laten we verder gaan en nu nemen onze 5-minuten pauze, 784 00:50:11,420 --> 00:50:14,190 en als we terug te komen: het internet. 785 00:50:17,280 --> 00:50:19,170 Oke. We zijn weer terug. 786 00:50:19,170 --> 00:50:23,590 Nu beginnen we onze blik niet alleen op HTML, omdat, zoals u zult zien, 787 00:50:23,590 --> 00:50:26,050 HTML zelf is eigenlijk vrij eenvoudig 788 00:50:26,050 --> 00:50:29,270 maar echt op web programmeren meer in het algemeen, netwerken meer in het algemeen, 789 00:50:29,270 --> 00:50:31,770 en hoe al deze technologieën samenkomen 790 00:50:31,770 --> 00:50:35,400 zodat we veel meer geavanceerde programma's te maken boven op het internet 791 00:50:35,400 --> 00:50:38,690 dan tot nu toe hebben we in staat geweest om in deze zwart-wit ramen. 792 00:50:38,690 --> 00:50:42,140 Inderdaad, op dit punt in het semester ook al zullen we besteden relatief minder tijd 793 00:50:42,140 --> 00:50:46,200 op PHP, HTML, CSS, JavaScript, SQL en meer, 794 00:50:46,200 --> 00:50:48,480 de meeste studenten doen uiteindelijk doet laatste projecten die zijn web-based 795 00:50:48,480 --> 00:50:51,230 want zoals u zult zien, de achtergrond heb je nu in C 796 00:50:51,230 --> 00:50:54,450 is zeer van toepassing op deze hogere talen. 797 00:50:54,450 --> 00:50:56,800 >> En als je begint te denken over je afstudeerproject, 798 00:50:56,800 --> 00:50:59,940 die, net als Problem Set 0, waar u werden aangemoedigd 799 00:50:59,940 --> 00:51:02,160 voor de meeste iets van belang doen om u in Scratch, 800 00:51:02,160 --> 00:51:05,790 het laatste project is uw kans om uw pas ontdekte kennis en savvy te nemen met C 801 00:51:05,790 --> 00:51:09,850 of PHP of JavaScript of het uit als voor een spin 802 00:51:09,850 --> 00:51:12,330 en maak je eigen stukje software voor de wereld om te zien. 803 00:51:12,330 --> 00:51:17,770 En om zaadje dat je met ideeën, weet dat je hier kunt hoofd, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Elk jaar hebben we vragen ideeën van docenten en personeel en groepen studenten op de campus 805 00:51:21,800 --> 00:51:27,330 alleen maar om hun ideeën in te dienen voor interessante dingen die kunnen worden opgelost met behulp van computers, 806 00:51:27,330 --> 00:51:29,860 met behulp van websites, met behulp van software. 807 00:51:29,860 --> 00:51:32,360 Dus als je moeite hebt om te komen met een idee van uw eigen, 808 00:51:32,360 --> 00:51:35,790 met alle middelen om door de ideeën er van dit jaar en de laatste. 809 00:51:35,790 --> 00:51:39,990 Het is prima om een ​​project dat al eerder is aangepakt aan te pakken. 810 00:51:39,990 --> 00:51:44,540 We hebben gezien veel apps voor het zien van de status van wasgoed op de campus, 811 00:51:44,540 --> 00:51:47,000 veel apps voor het navigeren de eetzaal menu, 812 00:51:47,000 --> 00:51:49,540 veel apps voor het navigeren in de studiegids en dergelijke. 813 00:51:49,540 --> 00:51:53,680 En inderdaad, in een toekomst lezing en in de toekomst seminars, 814 00:51:53,680 --> 00:51:57,750 wij u kennismaken met een aantal publiek beschikbare API's, zowel in de handel verkrijgbare 815 00:51:57,750 --> 00:52:02,520 alsook hier verkrijgbaar bij CS50 op de campus, zodat u toegang tot de gegevens 816 00:52:02,520 --> 00:52:04,910 en kan dan doen interessante dingen mee. 817 00:52:04,910 --> 00:52:09,380 Dus meer over de definitieve projecten in een paar dagen als we de specificaties vrij te geven, 818 00:52:09,380 --> 00:52:12,990 maar voor nu, weet dat je kunt solo werken of met een of twee vrienden 819 00:52:12,990 --> 00:52:16,010 op de meeste elk project voor u van belang. 820 00:52:16,010 --> 00:52:18,080 The Internet. 821 00:52:18,080 --> 00:52:22,300 Ga je gang en trek je laptop, ga je naar facebook.com voor de eerste keer, 822 00:52:22,300 --> 00:52:27,020 niet hebben aangemeld voor kort en druk op Enter. Wat gebeurt er precies? 823 00:52:27,020 --> 00:52:30,150 >> Wanneer u op Enter hit op uw computer, een hele hoop stappen 824 00:52:30,150 --> 00:52:32,600 begint soort van magische wijze gebeurt. 825 00:52:32,600 --> 00:52:35,960 Dus u hier aan de linkerkant, webserver zoals Facebook is hier aan de rechterkant, 826 00:52:35,960 --> 00:52:42,500 en een of andere manier u gebruikt deze taal genaamd HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP is geen programmeertaal. Het is meer van een protocol. 828 00:52:46,770 --> 00:52:52,310 Het is een set van conventies die webbrowsers en webservers gebruiken bij interne verbinding tussen. 829 00:52:52,310 --> 00:52:54,360 En wat dit betekent is als volgt. 830 00:52:54,360 --> 00:52:56,790 Heel erg zoals in de echte wereld, hebben we deze verdragen 831 00:52:56,790 --> 00:53:00,140 waar als je voldoen aan een aantal menselijke voor de eerste keer, als je het niet erg humoring me hier, 832 00:53:00,140 --> 00:53:03,980 Ik zou naar je toe komen en zeggen: "Hallo, mijn naam is David." >> Hoi, David. Mijn naam is Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hallo, David. Mijn naam is Sammy." 834 00:53:05,770 --> 00:53:08,310 Dus nu we net bezig met dit soort domme menselijke protocol 835 00:53:08,310 --> 00:53:12,200 waar ik het protocol werd opgezet, heeft Sammy gereageerd, 836 00:53:12,200 --> 00:53:15,060 We hebben handen geschud, en de transactie is voltooid. 837 00:53:15,060 --> 00:53:18,260 HTTP is zeer vergelijkbaar in de geest. 838 00:53:18,260 --> 00:53:23,350 Als uw web browser vraagt ​​www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 wat uw browser is eigenlijk doet is de uitbreiding van haar hand, om zo te zeggen, 840 00:53:27,020 --> 00:53:29,960 naar de server en het is te sturen een bericht. 841 00:53:29,960 --> 00:53:34,220 En die boodschap is meestal iets als word - wat wil je krijgen? - 842 00:53:34,220 --> 00:53:38,740 Begrijp me de home page, die doorgaans wordt aangeduid met een enkele schuine streep aan het einde van een URL. 843 00:53:38,740 --> 00:53:43,790 En net zodat je weet welke taal ik spreek, ben ik de browser zal u vertellen 844 00:53:43,790 --> 00:53:46,930 dat ik spreek HTTP versie 1.1, 845 00:53:46,930 --> 00:53:51,980 En ook voor een goede maatregel, ik ga u vertellen dat de host die ik wil dat de home page van 846 00:53:51,980 --> 00:53:54,120 is facebook.com. 847 00:53:54,120 --> 00:53:57,730 Typisch, een webbrowser, buiten het medeweten van u, de mens, 848 00:53:57,730 --> 00:54:03,350 stuurt dit bericht via het Internet wanneer u typt www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Voer, in uw browser. 850 00:54:05,370 --> 00:54:07,300 En wat betekent Facebook reageren met? 851 00:54:07,300 --> 00:54:12,540 Het reageert met een aantal soortgelijke uitziende cryptische gegevens, maar ook nog veel meer. 852 00:54:12,540 --> 00:54:14,310 Laat me verder gaan hier naar huis Facebook pagina. 853 00:54:14,310 --> 00:54:17,480 Dit is het scherm dat de meeste van ons waarschijnlijk nooit zien als je ingelogd blijven de hele tijd, 854 00:54:17,480 --> 00:54:19,830 maar dit is inderdaad hun home page. 855 00:54:19,830 --> 00:54:24,150 Als we dit doen in Chrome, merk je dat je kunt trekken van deze kleine context menu's. 856 00:54:24,150 --> 00:54:26,980 Met behulp van Chrome, of op Mac OS, Windows, Linux, of iets dergelijks, 857 00:54:26,980 --> 00:54:31,840 Als u Controle klikken of links te klikken, kunt u meestal trek een menu dat er zo uitziet, 858 00:54:31,840 --> 00:54:35,870 waar een paar opties af te wachten, waarvan er een is van View Page Source. 859 00:54:35,870 --> 00:54:39,920 U kunt ook meestal krijgen om deze dingen door te gaan naar het menu Beeld en rondneuzen. 860 00:54:39,920 --> 00:54:42,750 Bijvoorbeeld, hier onder View, Developer is hetzelfde. 861 00:54:42,750 --> 00:54:45,780 Ik ga om verder te gaan en op View Page Source kijken. 862 00:54:45,780 --> 00:54:50,800 Wat je ziet is de HTML die Mark heeft geschreven aan facebook.com vertegenwoordigen. 863 00:54:50,800 --> 00:54:55,910 Het is een complete puinhoop hier, maar we zullen zien dat dit een beetje meer zin heeft het duurde niet lang. 864 00:54:55,910 --> 00:54:59,840 Maar er zijn sommige patronen hier. Laat me Scroll naar beneden voor dit soort dingen. 865 00:54:59,840 --> 00:55:05,730 Dit is moeilijk voor een mens om te lezen, maar merkt dat er dit patroon van haakjes 866 00:55:05,730 --> 00:55:10,360 met zoekwoorden als optie, zoekwoorden, zoals waarde, sommige aanhalingstekens. 867 00:55:10,360 --> 00:55:15,660 Dit is waar, toen u zich aanmeldde voor de allereerste keer, aangegeven wat uw geboortejaar is. 868 00:55:15,660 --> 00:55:19,020 Dat drop-down menu van geboorte jaar een of andere manier hier gecodeerd 869 00:55:19,020 --> 00:55:23,870 in deze taal genaamd HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Met andere woorden, wanneer uw browser een webpagina aanvraagt, 871 00:55:27,730 --> 00:55:30,610 het spreekt deze conventie genaamd HTTP. 872 00:55:30,610 --> 00:55:35,170 Maar wat betekent facebook.com reageren op dat verzoek? 873 00:55:35,170 --> 00:55:38,260 >> Het reageert met sommige van deze cryptische boodschappen, zoals we zullen zien in een moment. 874 00:55:38,260 --> 00:55:43,760 Maar de meeste van haar reactie in de vorm van HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Dat is de werkelijke taal waarin een webpagina is geschreven. 876 00:55:47,170 --> 00:55:52,030 En wat een webbrowser is echt dan is, na ontvangst van iets dat er zo uitziet, 877 00:55:52,030 --> 00:55:57,120 leest het van boven naar beneden, van links naar rechts, en elke keer dat hij ziet een van deze haakjes 878 00:55:57,120 --> 00:56:03,370 gevolgd door een zoekwoord als optie, geeft dat opmaaktaal op de juiste manier. 879 00:56:03,370 --> 00:56:06,820 In dit geval toont het een drop-down menu jaren. 880 00:56:06,820 --> 00:56:09,240 Maar nogmaals, dit is een grote puinhoop om naar te kijken. 881 00:56:09,240 --> 00:56:16,630 Dit is niet omdat Facebook ontwikkelaars manifesteren 0 voor 5 voor stijl, bijvoorbeeld. 882 00:56:16,630 --> 00:56:20,190 Dit is omdat de meeste van de code die ze schrijven, in feite, prachtig geschreven, 883 00:56:20,190 --> 00:56:22,450 goed commentaar, mooi ingesprongen, en dergelijke, 884 00:56:22,450 --> 00:56:26,080 maar natuurlijk machines, computers, browsers echt niet schelen 885 00:56:26,080 --> 00:56:27,890 of uw code is goed ingericht. 886 00:56:27,890 --> 00:56:33,100 En in feite, het is volledig verspilling van de tab-toets raken al die keren 887 00:56:33,100 --> 00:56:37,650 en om een ​​reactie te plaatsen door heel uw code in en om echt beschrijvende variabele namen te kiezen 888 00:56:37,650 --> 00:56:42,340 want als de browser maakt het niet uit, alles wat je aan het doen bent op het einde van de dag verspillen bytes. 889 00:56:42,340 --> 00:56:46,660 >> Zo blijkt wat de meeste websites doen is ook al is de broncode voor facebook.com, 890 00:56:46,660 --> 00:56:49,550 voor cs50.net en al die andere websites op het internet 891 00:56:49,550 --> 00:56:53,730 zijn meestal goed geschreven en goed commentaar en mooi ingesprongen en dergelijke, 892 00:56:53,730 --> 00:56:59,270 meestal voordat de website wordt geplaatst op het internet, wordt de code minified, 893 00:56:59,270 --> 00:57:02,970 waarbij de HTML en de CSS - iets anders zullen we snel zien - 894 00:57:02,970 --> 00:57:05,960 de JavaScript-code zullen we binnenkort wordt gecomprimeerd, 895 00:57:05,960 --> 00:57:09,250 waarbij lange variabelenamen worden X en Y en Z, 896 00:57:09,250 --> 00:57:13,900 en dat alles witruimte dat maakt alles ziet er zo leesbaar is allemaal weggegooid, 897 00:57:13,900 --> 00:57:17,700 want als je erover nadenkt deze manier, Facebook krijgt een miljard page hits per dag - 898 00:57:17,700 --> 00:57:21,670 iets geks als dat - dus wat als een programmeur alleen maar om anale 899 00:57:21,670 --> 00:57:26,660 druk op de spatiebalk een extra tijd alleen maar laten inspringen enkele regel code nog zo veel meer? 900 00:57:26,660 --> 00:57:29,500 Wat is de implicatie als Facebook behoudt dat witruimte 901 00:57:29,500 --> 00:57:32,880 in alle bytes ze terug te sturen naar mensen op het internet? 902 00:57:32,880 --> 00:57:36,400 Het raken van de spatiebalk een keer geeft u een extra byte in uw bestand. 903 00:57:36,400 --> 00:57:39,730 En als een miljard mensen ga dan naar de home pagina te downloaden die dag, 904 00:57:39,730 --> 00:57:42,060 hoeveel meer gegevens heb je via het internet? 905 00:57:42,060 --> 00:57:45,200 Een gigabyte zonder goede reden. 906 00:57:45,200 --> 00:57:48,510 En verleend, voor veel websites is dit niet zo'n probleem schaalbaar, 907 00:57:48,510 --> 00:57:51,030 maar voor Facebook, voor Google, voor een aantal van de meest populaire websites 908 00:57:51,030 --> 00:57:54,860 er is grote stimulans financieel om uw code ziet eruit als een puinhoop 909 00:57:54,860 --> 00:57:58,980 zodat u met zo weinig bytes mogelijk in aanvulling op dan het te comprimeren 910 00:57:58,980 --> 00:58:01,500 met behulp van iets als zip, een algoritme genaamd gzip, 911 00:58:01,500 --> 00:58:04,250 dat de browser voor je doet automatisch. Maar dit is verschrikkelijk. 912 00:58:04,250 --> 00:58:08,060 We zullen nooit iets leren over andere mensen websites en hoe je webpagina's te ontwerpen 913 00:58:08,060 --> 00:58:09,680 als we ernaar uitzien. 914 00:58:09,680 --> 00:58:13,620 >> Dus gelukkig, browsers zoals Chrome en IE en Firefox deze dagen 915 00:58:13,620 --> 00:58:16,450 meestal geleverd met ingebouwde ontwikkeltools. 916 00:58:16,450 --> 00:58:21,730 In feite, als ik naar beneden gaan hier naar Element of als Inspecteer ik ga naar Beeld, Developer, 917 00:58:21,730 --> 00:58:25,220 en expliciet naar Developer Tools, 918 00:58:25,220 --> 00:58:27,640 dit venster aan de onderkant van mijn scherm verschijnt nu. 919 00:58:27,640 --> 00:58:31,230 Het is een beetje intimiderend op het eerste, want er is een heleboel onbekende tabs hier, 920 00:58:31,230 --> 00:58:34,510 maar als ik klik op elementen helemaal links onderaan, 921 00:58:34,510 --> 00:58:38,810 Chrome is natuurlijk behoorlijk slim. Het weet hoe te interpreteren van deze code. 922 00:58:38,810 --> 00:58:42,320 En dus wat Chrome doet is het reinigt alle HTML van Facebook. 923 00:58:42,320 --> 00:58:45,680 Ook al is er geen witruimte is er, er is niet inspringen daar, 924 00:58:45,680 --> 00:58:51,120 nu merk dat ik kan beginnen met deze webpagina navigeren des te meer hiërarchisch. 925 00:58:51,120 --> 00:58:56,910 Het blijkt dat elke webpagina geschreven in een taal genaamd HTML5 moet beginnen met deze, 926 00:58:56,910 --> 00:59:03,980 deze DOCTYPE-declaratie, bij wijze van spreken: 927 00:59:03,980 --> 00:59:07,840 Het is een soort van licht en grijze daar, maar dat is de allereerste regel van de code in dit bestand, 928 00:59:07,840 --> 00:59:12,080 en dat vertelt alleen de browser, "He, hier enkele HTML5 komt. Hier komt een webpagina." 929 00:59:12,080 --> 00:59:18,490 De eerste open beugel voorbij dat toevallig dit ding, een open beugel HTML-tag, 930 00:59:18,490 --> 00:59:22,320 en dan als ik duiken in dieper - deze pijlen zijn volledig zinloos; 931 00:59:22,320 --> 00:59:25,140 ze gewoon omwille presentatie, ze zijn niet echt in dossier - 932 00:59:25,140 --> 00:59:30,300 merken dat de binnenkant van HTML-tag van Facebook, iets dat begint met een open beugel 933 00:59:30,300 --> 00:59:32,910 en heeft een woord wordt een tag. 934 00:59:32,910 --> 00:59:38,610 Dus in de HTML-tag is blijkbaar een hoofd-tag en een body-tag. 935 00:59:38,610 --> 00:59:41,930 Binnenkant van het hoofd tag is nu een puinhoop voor Facebook 936 00:59:41,930 --> 00:59:45,620 omdat ze een veel metadata en andere dingen voor marketing en reclame. 937 00:59:45,620 --> 00:59:50,600 >> Maar als we naar beneden scrollen, omlaag, omlaag, omlaag, laten we eens kijken waar het is. Hier is. 938 00:59:50,600 --> 00:59:52,210 Dit is ten minste enigszins vertrouwd. 939 00:59:52,210 --> 00:59:55,990 De titel van thuis Facebook pagina, als je ooit kijken in het tabblad in uw titel bar, 940 00:59:55,990 --> 00:59:59,060 is Welcome to Facebook - Log In, Aanmelden of meer informatie. 941 00:59:59,060 --> 01:00:01,110 Dat is wat je zou zien in de titel van Chrome bar, 942 01:00:01,110 --> 01:00:03,100 en dat is hoe het is vertegenwoordigd in de code. 943 01:00:03,100 --> 01:00:08,090 Als we negeren al het andere in het hoofd, het grootste deel van de ingewanden van een webpagina zijn in het lichaam, 944 01:00:08,090 --> 01:00:10,940 en het blijkt dat Facebook de code er uit gaat zien meer complexe 945 01:00:10,940 --> 01:00:14,540 dan de meeste dingen die we in eerste instantie schrijven, alleen maar omdat het is opgebouwd door de jaren heen, 946 01:00:14,540 --> 01:00:17,260 maar er is een heleboel script tags, JavaScript-code, 947 01:00:17,260 --> 01:00:18,870 dat maakt de website zeer interactief: 948 01:00:18,870 --> 01:00:22,330 het zien van status updates direct met behulp van talen zoals JavaScript. 949 01:00:22,330 --> 01:00:25,270 Er is zoiets als een div, dat is een divisie van een pagina. 950 01:00:25,270 --> 01:00:27,940 Maar voordat we dat detail, laten we proberen om uit te zoomen 951 01:00:27,940 --> 01:00:31,920 en kijken naar een eenvoudiger versie van Facebook 1.0, bij wijze van spreken. 952 01:00:31,920 --> 01:00:34,740 Hier is de hello, wereld van de webpagina's. 953 01:00:34,740 --> 01:00:37,370 Het heeft dat DOCTYPE-declaratie op de top 954 01:00:37,370 --> 01:00:40,280 dat is een beetje anders dan al het andere. 955 01:00:40,280 --> 01:00:46,130 Niets anders schrijven we in een webpagina gaat om te beginnen met 01:00:48,880 en met uitzondering van een zogenaamde commentaar in HTML. 957 01:00:48,880 --> 01:00:53,000 Maar voor het grootste deel, alles in een webpagina is geopend beugel, trefwoord, in de buurt beugel. 958 01:00:53,000 --> 01:00:56,220 >> In dit geval kunt u de eenvoudigste van webpagina's mogelijk te maken. 959 01:00:56,220 --> 01:01:00,260 De HTML-tag bevat een hoofd-tag en het bevat een body-tag, 960 01:01:00,260 --> 01:01:04,580 maar merkt dat er is dit idee van het starten en stoppen tags. 961 01:01:04,580 --> 01:01:11,360 Dit is het begin-tag voor HTML, dit is de nauwe tag of eind-tag. 962 01:01:11,360 --> 01:01:15,400 Merk op dat ze soort van tegenstellingen in de zin dat de nauwe tag of eind-tag 963 01:01:15,400 --> 01:01:20,030 heeft deze slash binnenkant van zichzelf. 964 01:01:20,030 --> 01:01:23,540 Ondertussen is er een open kop tag hier en een close hoofd tag hier. 965 01:01:23,540 --> 01:01:26,880 >> Er is een open titel en een nauwe title tag hier. 966 01:01:26,880 --> 01:01:29,850 Het feit dat ik de titel op een regel, puur willekeurig. 967 01:01:29,850 --> 01:01:33,760 Het zag eruit alsof het zou mooi passen op een lijn, dus ik heb niet de moeite het raken van een paar keer op Enter. 968 01:01:33,760 --> 01:01:38,200 Ondertussen, het lichaam heb ik streepje alleen maar om nog zo duidelijk zijn. 969 01:01:38,200 --> 01:01:41,050 Merk op dat HTML is een vrij domme taal. 970 01:01:41,050 --> 01:01:43,410 In feite, terug in de dag voordat er WYSIWYG-editors 971 01:01:43,410 --> 01:01:46,770 en Microsoft Word, waar u kunt zeggen: "Maak deze gewaagde, maken deze cursief," 972 01:01:46,770 --> 01:01:50,850 je zou eigenlijk typen kleine opdrachten in essays 20 + jaar geleden 973 01:01:50,850 --> 01:01:55,740 waarbij je zou zeggen: "Begin met het maken deze tekst vet weergegeven. Stop het maken van deze tekst vet." 974 01:01:55,740 --> 01:01:59,010 "Begin met het maken deze tekst cursief weergegeven. Stop het maken van deze tekst cursief weergegeven." 975 01:01:59,010 --> 01:02:01,850 >> Dat is wat HTML of een markup taal is. 976 01:02:01,850 --> 01:02:05,530 Deze eerste tag zegt: "He, hier browser. Sommige HTML komt." 977 01:02:05,530 --> 01:02:09,880 De volgende tag zegt: "He, hier browser. Het hoofd, de kop van mijn webpagina komt." 978 01:02:09,880 --> 01:02:11,650 "He, browser. Hier komt de titel." 979 01:02:11,650 --> 01:02:15,880 En dan hier, "Hey, browser. Dat is het voor de titel." 980 01:02:15,880 --> 01:02:20,000 Dus dit is hoe de browser weet niet meer meer tekens weer te geven dan hello, world 981 01:02:20,000 --> 01:02:21,860 in de titelbalk. 982 01:02:21,860 --> 01:02:23,640 Ondertussen, dit zegt: "Dat is het voor het hoofd." 983 01:02:23,640 --> 01:02:28,340 Deze zegt: "Hier komt het lichaam Hier is de eigenlijke lichaam." - Letterlijk de woorden hello, wereld. 984 01:02:28,340 --> 01:02:33,190 En dit zegt hier: "Dat is het voor het lichaam. Dat is het voor de HTML." 985 01:02:33,190 --> 01:02:34,640 Dus browsers zijn behoorlijk dom. 986 01:02:34,640 --> 01:02:39,920 Ze las net dit soort dingen boven naar beneden, van links naar rechts, en doe precies wat ze verteld om te doen. 987 01:02:39,920 --> 01:02:41,860 Laten we eigenlijk een klein voorbeeld hier. 988 01:02:41,860 --> 01:02:46,240 Laat me open te stellen hier de eenvoudigste programma's op mijn Mac, namelijk TextEdit. 989 01:02:46,240 --> 01:02:48,220 Op Windows kun je gebruik maken van Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Maar dit is alles wat je nodig hebt om te beginnen met het maken van webpagina's. 991 01:02:50,520 --> 01:02:53,730 Ik ga om verder te gaan en gewoon kopiëren en plak deze code in dit bestand. 992 01:02:53,730 --> 01:02:57,210 Ik ga om verder te gaan en op te slaan op mijn bureaublad, 993 01:02:57,210 --> 01:03:01,220 en ik ga dit op te slaan als hello.html, 994 01:03:01,220 --> 01:03:03,840 en nu het bestand met de naam hello.html. 995 01:03:03,840 --> 01:03:05,690 Hier is het op mijn bureaublad. 996 01:03:05,690 --> 01:03:11,130 Laat me nu gaan in een browser en sleep het bestand in de browser. 997 01:03:11,130 --> 01:03:14,060 En voila, hier is mijn allereerste webpagina. 998 01:03:14,060 --> 01:03:17,340 Merk op dat de titel van het tabblad hallo is, wereld volgens de title-tag, 999 01:03:17,340 --> 01:03:20,040 en merken dat hello, world is het lichaam van mijn webpagina, 1000 01:03:20,040 --> 01:03:22,190 en woo-hoo, ik ben op het internet. 1001 01:03:22,190 --> 01:03:24,700 >> Ik ben niet echt, recht, want dit bestand niet op het internet. 1002 01:03:24,700 --> 01:03:28,330 Het gebeurt te zijn op mijn lokale harde schijf op dat pad. 1003 01:03:28,330 --> 01:03:32,720 Maar het idee is hetzelfde. Het enige wat we nu nodig hebben is een web server waar om het te uploaden. 1004 01:03:32,720 --> 01:03:37,410 Maar eerst laten we eigenlijk een beetje meer complexiteit en een beetje meer stilering introduceren. 1005 01:03:37,410 --> 01:03:39,890 Dit is een eenvoudige, indien saai, webpagina. 1006 01:03:39,890 --> 01:03:41,990 Het blijkt dat er nog andere soorten tags die we kunnen gebruiken. 1007 01:03:41,990 --> 01:03:45,530 Bijvoorbeeld, hier in het geel Ik heb 2 nieuwe tags. 1008 01:03:45,530 --> 01:03:49,630 We zullen niet spelen veel met deze vandaag, maar merken dat de link tag 1009 01:03:49,630 --> 01:03:52,520 een of andere manier ziet er anders uit al het andere. 1010 01:03:52,520 --> 01:03:55,370 De link tag neemt wat worden attributen genoemd, 1011 01:03:55,370 --> 01:03:59,770 en een attribuut is iets dat het gedrag van een tag wijzigt. 1012 01:03:59,770 --> 01:04:03,840 In dit geval is dit niet de beste keuze van namen, link, want het is een soort van betekenis, 1013 01:04:03,840 --> 01:04:11,590 maar deze link tag zegt, in wezen, ook de bestand met de naam styles.css binnenkant van mijn webpagina. 1014 01:04:11,590 --> 01:04:15,400 U kunt denken aan dit als analoog aan C's # include. 1015 01:04:15,400 --> 01:04:19,650 Styles.css verwijst naar een andere taal helemaal dat we niet spelen met vandaag, 1016 01:04:19,650 --> 01:04:23,790 maar het is voor esthetiek: lettergroottes, kleuren, padding, inspringing, marges, 1017 01:04:23,790 --> 01:04:26,040 en al dat soort esthetiek detail. 1018 01:04:26,040 --> 01:04:28,820 Intussen is de script tag functioneel gelijk is, 1019 01:04:28,820 --> 01:04:33,140 maar in plaats van zijn onder CSS, die taal, omvat het een andere taal, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Dus met andere woorden, met deze 2 tags die ik zal uiteindelijk in staat zijn om mijn eigen web pagina te schrijven 1021 01:04:37,810 --> 01:04:41,490 maar ook trek in code dat ik of iemand anders heeft geschreven 1022 01:04:41,490 --> 01:04:44,350 zodat wij staan ​​op andermans schouders, kunnen we oefenen een goed ontwerp, 1023 01:04:44,350 --> 01:04:46,120 factoring van gemeenschappelijke code. 1024 01:04:46,120 --> 01:04:49,090 Als ik heb 10 verschillende webpagina's, betekent dit dat een aantal van mijn esthetiek 1025 01:04:49,090 --> 01:04:52,490 kan meegenomen uit zijn, net als #, op te nemen in een apart bestand. 1026 01:04:52,490 --> 01:04:54,420 Dus we komen er wel. 1027 01:04:54,420 --> 01:04:57,180 Maar laten we eigenlijk eerst iets interessanter met dit bestand doen. 1028 01:04:57,180 --> 01:05:01,110 >> Nogmaals, dit is gewoon TextEdit. Ik ben niet technisch op het internet, maar we komen er wel. 1029 01:05:01,110 --> 01:05:04,910 Ik wil graag hello, wereld een beetje brutaler dan het is. 1030 01:05:04,910 --> 01:05:10,890 Dus hallo, laten we willekeurig zeggen voor vet. 1031 01:05:10,890 --> 01:05:15,910 Nogmaals, het verhaal is hetzelfde: hello, komma, beginnen met het maken van dit vet, 1032 01:05:15,910 --> 01:05:19,730 Vervolgens wereld wordt vetgedrukt, en dit betekent meer wilt afdrukken deze in het vet. 1033 01:05:19,730 --> 01:05:24,020 Laat me ga je gang en sla mijn dossier, ga terug naar Chrome, zal ik inzoomen zodat we kunnen zien het beter, 1034 01:05:24,020 --> 01:05:27,870 en herladen, en je zult zien dat wereld is nu in het vet. 1035 01:05:27,870 --> 01:05:31,810 Het web is alles over hyperlinks, dus laten we verder gaan en doe je dit: 1036 01:05:31,810 --> 01:05:38,550 mijn favoriete website is, laten we zeggen, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Opslaan, herladen. Oke. Er zijn een paar problemen nu naast de afzichtelijkheid van de website. 1038 01:05:43,810 --> 01:05:47,310 1, ik ben er vrij zeker van dat ik geraakt Voer hier. En dat deed ik. 1039 01:05:47,310 --> 01:05:51,590 Ik heb niet alleen druk op Enter, ik ook ingesprongen, het beoefenen van wat we hebben gepredikt over stijl, 1040 01:05:51,590 --> 01:05:54,930 maar mijn ligt direct naast wereld. 1041 01:05:54,930 --> 01:05:58,410 Dus waarom is dit? Browsers alleen doen wat je ze vertelt te doen. 1042 01:05:58,410 --> 01:06:04,010 Ik heb nog niet verteld de browser, "Break lijnen hier. Steek paragraaf hier te breken." 1043 01:06:04,010 --> 01:06:07,820 Dus de browser, maakt het niet uit of ik druk op Return 30 keer, 1044 01:06:07,820 --> 01:06:10,820 het is nog steeds om mijn recht te zetten naast wereld. 1045 01:06:10,820 --> 01:06:15,930 Wat ik echt moet doen, is iets als zeggen
, voegt u een regeleinde. 1046 01:06:15,930 --> 01:06:17,940 >> En eigenlijk, een regeleinde is een soort van raar ding 1047 01:06:17,940 --> 01:06:21,650 want je kunt niet echt in beweging naar een andere regel dan iets doen, 1048 01:06:21,650 --> 01:06:25,380 en dan stoppen met bewegen om een ​​nieuwe regel. Het is een soort van een atomaire operatie. 1049 01:06:25,380 --> 01:06:28,140 Je doet het of je doet het niet. Je druk op Enter of je doet het niet. 1050 01:06:28,140 --> 01:06:33,390 Dus br is een beetje van een andere tag, en dus ik moet sorteren van zowel open en te sluiten 1051 01:06:33,390 --> 01:06:35,230 tegelijk. 1052 01:06:35,230 --> 01:06:37,500 De syntaxis voor dat is dit. 1053 01:06:37,500 --> 01:06:41,760 Technisch gezien kun je zoiets als dit doen in sommige versies van HTML, 1054 01:06:41,760 --> 01:06:45,600 maar dit is gewoon dom omdat er geen reden om te starten en te stoppen iets 1055 01:06:45,600 --> 01:06:48,420 als je in plaats daarvan het allemaal in een keer. 1056 01:06:48,420 --> 01:06:52,310 Realiseer je dat HTML5 niet strikt dit niet slash vereisen, 1057 01:06:52,310 --> 01:06:55,410 dus je ziet studieboeken en online bronnen die niet beschikken over het, 1058 01:06:55,410 --> 01:06:59,780 maar laten we voor een goede maatregel de praktijk van de symmetrie die we tot nu toe gezien. 1059 01:06:59,780 --> 01:07:02,870 Dit betekent dat de tag zowel geopend en gesloten. 1060 01:07:02,870 --> 01:07:05,220 Dus nu laat ik bewaar mijn bestand, hier terug. 1061 01:07:05,220 --> 01:07:10,240 Oke, dus het begint er beter uitzien, met uitzondering van het web Ik weet dat is een soort van aanklikbaar, 1062 01:07:10,240 --> 01:07:13,610 en toch youtube hier lijkt niet te leiden tot niets. 1063 01:07:13,610 --> 01:07:17,560 Dat komt omdat, hoewel het lijkt op een link, wordt de browser niet dat per se, 1064 01:07:17,560 --> 01:07:20,670 dus ik moet de browser te vertellen dat dit is een link. 1065 01:07:20,670 --> 01:07:22,620 >> De manier om dit te doen is het gebruik van een 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 en laat me dit verplaatsen naar een nieuwe lijn net dus het is een beetje beter leesbaar, 1069 01:07:38,490 --> 01:07:40,060 en ik zal krimpen de lettergrootte. 1070 01:07:40,060 --> 01:07:43,890 Ben ik al klaar? Nee, er gaat deze tweedeling te zijn. 1071 01:07:43,890 --> 01:07:46,760 Deze tag, het anker tag, inderdaad neemt een attribuut, 1072 01:07:46,760 --> 01:07:52,900 die wijzigt haar gedrag, en de waarde van dit attribuut is blijkbaar van YouTube URL. 1073 01:07:52,900 --> 01:07:56,380 Maar let op de tweedeling is dat alleen maar omdat dat is de URL die je gaat, 1074 01:07:56,380 --> 01:08:01,020 dat wil niet zeggen dat is toch wel het woord dat je onderstrepen en het maken van een link. 1075 01:08:01,020 --> 01:08:03,960 Integendeel, kan dat iets als dit. 1076 01:08:03,960 --> 01:08:10,870 Dus ik moet zeggen het maken van dit woord een hyperlink met behulp van de nauwe ankertag stoppen. 1077 01:08:10,870 --> 01:08:12,650 Merk op dat ik doe dit niet. 1078 01:08:12,650 --> 01:08:15,890 1, zou dit gewoon een verspilling van ieders tijd en het is niet nodig. 1079 01:08:15,890 --> 01:08:19,290 >> Om een ​​tag te sluiten, kunt u pas weer vermelding van de naam van de tag. 1080 01:08:19,290 --> 01:08:21,800 U hoeft geen melding van een van de attributen. 1081 01:08:21,800 --> 01:08:26,189 Dus laten we met dien verstande dat, ga terug. Oke, voila, nu is het blauw en hyperlinks. 1082 01:08:26,189 --> 01:08:29,430 Als ik erop klik, ik eigenlijk wel naar YouTube. 1083 01:08:29,430 --> 01:08:32,529 Dus ook al mijn web pagina is niet op het internet, is het op zijn minst HTML, 1084 01:08:32,529 --> 01:08:37,930 en als we het internet halen, zouden we eigenlijk hier belanden op youtube.com. 1085 01:08:37,930 --> 01:08:40,670 En ik kan terug te gaan en hier is mijn webpagina. Maar merken. 1086 01:08:40,670 --> 01:08:43,120 Als je ooit hebt gekregen spam of een phishing-aanval, 1087 01:08:43,120 --> 01:08:45,850 nu heb je de mogelijkheid al na vijf minuten om hetzelfde te doen. 1088 01:08:45,850 --> 01:08:50,920 We kunnen hier te gaan en iets doen als www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 of wat dan ook de schetsmatige website is, en dan kun je zeggen: Controleer uw PayPal-rekening. 1090 01:08:59,319 --> 01:09:04,840 [Gelach] En nu dit gaat naar badguy.com, die ik ben niet van plan om te klikken op 1091 01:09:04,840 --> 01:09:08,000 want ik heb geen idee waar dat toe leidt. [Gelach] 1092 01:09:08,000 --> 01:09:10,859 >> Maar we hebben nu de mogelijkheid om daadwerkelijk daar terecht. 1093 01:09:10,859 --> 01:09:12,640 Dus we zijn echt net beginnen te krassen op het oppervlak. 1094 01:09:12,640 --> 01:09:15,830 We zijn niet het programmeren op zich, we schrijven bent opmaaktaal. 1095 01:09:15,830 --> 01:09:18,569 Maar zodra we rond onze woordenschat in HTML, 1096 01:09:18,569 --> 01:09:21,520 introduceren we PHP, een echte programmeertaal 1097 01:09:21,520 --> 01:09:26,859 die ons in staat om automatisch HTML, automatisch genereren van CSS, 1098 01:09:26,859 --> 01:09:29,430 zodat we kunnen beginnen op woensdag te implementeren, te zeggen, 1099 01:09:29,430 --> 01:09:31,700 onze eigen zoekmachine en nog veel meer. 1100 01:09:31,700 --> 01:09:34,770 Maar meer daarover in een paar dagen. We zien je dan. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]