1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Vecka 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Detta är CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Okej. Välkommen tillbaka. Detta är CS50, och detta är början av vecka 7. 5 00:00:12,280 --> 00:00:14,690 Ett par små meddelanden: 6 00:00:14,690 --> 00:00:18,150 Pset5 pågår nu, eller snart ska, 7 00:00:18,150 --> 00:00:21,590 och låt mig säga, helt ärligt, denna tenderar att vara bland de mer utmanande 8 00:00:21,590 --> 00:00:24,460 av kursens problemet apparater, så låt mig nämna detta nu 9 00:00:24,460 --> 00:00:28,190 så att denna vecka mer än någonsin att du inte vänta tills, säg, onsdag kväll 10 00:00:28,190 --> 00:00:29,920 eller torsdag kväll att dyka i. 11 00:00:29,920 --> 00:00:32,369 Detta är definitivt en intressant pset. Vi tycker att det är kul. 12 00:00:32,369 --> 00:00:36,110 Om du faktiskt få det helt korrekt och kan då utmana den så kallade Big styrelsen, 13 00:00:36,110 --> 00:00:39,830 har du möjlighet att matcha Hardwood med några av kursens personal 14 00:00:39,830 --> 00:00:41,620 och några av dina klasskamrater. 15 00:00:41,620 --> 00:00:44,670 Vad Big styrelsen är är när du har din stavningskontroll fungerar, 16 00:00:44,670 --> 00:00:48,860 kommer du att kunna gå till cs50.net efter att ha kört ett kommando, 17 00:00:48,860 --> 00:00:52,430 rent väljer in, och sedan den tid och mängden RAM och mer 18 00:00:52,430 --> 00:00:56,130 som du har använt i din implementering kommer att visas här på kursens hemsida. 19 00:00:56,130 --> 00:00:59,740 Du kommer att märka att en massa av dessa folk här listas som personal 20 00:00:59,740 --> 00:01:04,220 eftersom helgen, trodde personalen att det skulle vara kul att försöka överträffa varandra. 21 00:01:04,220 --> 00:01:07,390 Så inser att målet här är inte att vinna i personalen. 22 00:01:07,390 --> 00:01:09,790 Även jag är bara här på nummer 13. 23 00:01:09,790 --> 00:01:13,790 Rent väljer i, men det är en möjlighet att se hur lite RAM 24 00:01:13,790 --> 00:01:16,790 och hur få CPU sekunder kan du använda vis-a-vis några av dina klasskamrater. 25 00:01:16,790 --> 00:01:20,540 >> Och jag ska erkänna att Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 närvarande nummer 1 position som en av de TF, 27 00:01:23,750 --> 00:01:28,120 Detta är en implementering som vi kallar inte 28 00:01:28,120 --> 00:01:32,700 med tanke på att han använder nästan 0 RAM och nästan 0 sekunder för lastning. 29 00:01:32,700 --> 00:01:35,670 Så vi tar hand om Kevin offline. [Skratt] 30 00:01:35,670 --> 00:01:40,950 Det finns vissa färdigheter som Kevin sätter på prov här. 31 00:01:40,950 --> 00:01:45,280 En av de saker som vi trodde vi skulle göra alltför nu CS50x är en vecka pågår, 32 00:01:45,280 --> 00:01:49,520 och ni är lika mycket en del av detta experiment som dessa studenter. 33 00:01:49,520 --> 00:01:53,720 Vi har frågat dem som en del av pset0, som var på samma sätt att lämna in en Scratch projekt 34 00:01:53,720 --> 00:01:58,280 av intresse för dem - ett spel, en interaktiv konstverk, en animering eller liknande - 35 00:01:58,280 --> 00:02:03,700 en 1 - till 2-minuters video, om de skulle vilja, säga hej till världen och vilka de är faktiskt. 36 00:02:03,700 --> 00:02:06,780 Jag trodde att jag skulle dela med dig bara ett par av de videor som har lämnats hittills 37 00:02:06,780 --> 00:02:10,759 eftersom för oss, på personalen åtminstone det verkligen har varit spännande 38 00:02:10,759 --> 00:02:14,220 och inspirerande att se dessa människor från hela världen - länder över hela världen - 39 00:02:14,220 --> 00:02:18,160 du ställer in, av alla saker, en datavetenskap kurs på Internet, 40 00:02:18,160 --> 00:02:20,410 oavsett om det är för att de vill fortsätta sina studier, 41 00:02:20,410 --> 00:02:22,300 de vill ta sin karriär i en ny riktning, 42 00:02:22,300 --> 00:02:24,390 de vill fylla luckor i sina kunskaper, 43 00:02:24,390 --> 00:02:27,190 så några av samma skäl som ni kanske har varit här. 44 00:02:27,190 --> 00:02:31,090 >> Så jag ger dig en sådan elev här. Du kan höja volymen bara lite. 45 00:02:31,090 --> 00:02:35,520 Här är en av våra studerandes 1-minut inlagor. 46 00:02:35,520 --> 00:02:40,380 Hej, världen. Jag är en student för industriell teknik här i Malaga, Spanien. 47 00:02:40,380 --> 00:02:45,840 Jag är mycket glad över detta online-kurs eftersom jag älskar datavetenskap, jag verkligen, 48 00:02:45,840 --> 00:02:48,880 och jag uppskattar verkligen att jag får utforska den. 49 00:02:48,880 --> 00:02:51,940 Och det faktum att jag kan lära samma alla ni gör 50 00:02:51,940 --> 00:02:57,040 men istället för att vara i Harvard jag i Malaga, hur häftigt är inte det? 51 00:02:57,040 --> 00:03:02,040 Tja, jag är Fernando, och detta är CS50. Se er. 52 00:03:02,040 --> 00:03:07,100 [Skratt] annat klipp som vi särskilt vill, ser du att den här herrn engelska är inte så stark. 53 00:03:07,100 --> 00:03:11,520 Det ser ut som att han hade maskin översatt, så översättningarna själva är lite ofullständig, 54 00:03:11,520 --> 00:03:15,790 men detta var en av våra Favoriter hittills också. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Hej, världen. [Tala på japanska] 57 00:03:32,370 --> 00:03:39,830 [Jag måste hälsa på japanska eftersom min engelska är mycket otillförlitliga.] 58 00:03:39,830 --> 00:03:45,380 [Jag har levererat budskapet till dig från staden Gifu, Japan.] 59 00:03:45,380 --> 00:03:49,820 [Jag kan vara en student för första gången på 20 år, vilket kan ses.] 60 00:03:49,820 --> 00:03:54,640 [Jag är mycket tacksam mot Harvard University som gav mig denna möjlighet och EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf är en gitarr och min favorit sak igång.] [Skratt] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Varför tror du jag försökte delta i en cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Harvard University, är det min längtan.] 65 00:04:14,990 --> 00:04:19,740 [Speciellt om jag långt närvaro bodde i Japan.] 66 00:04:19,740 --> 00:04:26,680 [Jag ville prova omedelbart medvetna om förekomsten av en sådan EDX när.] 67 00:04:26,680 --> 00:04:32,500 [Tror du inte att du inte relaterade till ålder lära I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 är min längtan. Mitt namn är Kazu, och detta är CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [applåder och jublande] 70 00:04:43,090 --> 00:04:49,220 En annan favorit vårt var underkastelse hit från någon. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google om du inte är bekant med denna meme. 72 00:04:55,380 --> 00:05:01,480 >> Och sedan slutligen ett par andra som fick postat att det kanske vinna bedårande utmärkelsen. 73 00:05:01,480 --> 00:05:06,820 [Studenter] Aww! >> [Malan] Vi får lyssna. Det är kort, så lyssna noga. 74 00:05:08,580 --> 00:05:11,150 [Kvinnlig talare] Vad heter du? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Kvinnlig talare] Vad är detta? >> [Fnittrar] CS50. [Skratt] 76 00:05:16,120 --> 00:05:19,510 [Malan] Han gjorde två tagningar, dock. 77 00:05:19,510 --> 00:05:22,240 Nu kör vi, det sista. 78 00:05:23,030 --> 00:05:26,980 Mitt namn är Louie, och detta är CS50. 79 00:05:26,980 --> 00:05:30,250 [Skratt] Detta är då CS50x. 80 00:05:30,250 --> 00:05:33,230 Tack till alla er när den följer tillsammans hemma 81 00:05:33,230 --> 00:05:35,620 som har ta del hittills. 82 00:05:35,620 --> 00:05:39,510 Idag avslutar vi vår diskussion om datastrukturer, 83 00:05:39,510 --> 00:05:41,160 åtminstone några av de mest grundläggande, 84 00:05:41,160 --> 00:05:44,760 och sedan fortsätter vi vårt samtal om HTML och webbprogrammering. 85 00:05:44,760 --> 00:05:48,520 I själva verket har vi tillbringat förbi några sju veckor att titta på grunderna i programmering - 86 00:05:48,520 --> 00:05:50,450 algoritmer, datastrukturer och liknande - 87 00:05:50,450 --> 00:05:53,050 och C, som ni kanske har upplevt hittills, 88 00:05:53,050 --> 00:05:57,060 är inte nödvändigtvis den mest tillgängliga språk 89 00:05:57,060 --> 00:05:59,090 som att genomföra några av dessa idéer. 90 00:05:59,090 --> 00:06:01,880 Och så börjar denna vecka och nästa vecka och därefter följande, 91 00:06:01,880 --> 00:06:07,110 vi kommer slutligen kunna övergången från C, som i allmänhet är känd som en ganska låg nivå språk, 92 00:06:07,110 --> 00:06:11,190 till saker högre nivå, bland dem PHP, JavaScript och liknande, 93 00:06:11,190 --> 00:06:14,850 som vi får se utnyttja samma lärdomar som vi har lärt oss under de senaste veckorna, 94 00:06:14,850 --> 00:06:19,430 men du kommer att upptäcka att förklara saker som arrayer och hashtabeller och söka och sortering 95 00:06:19,430 --> 00:06:23,370 blivit så mycket lättare eftersom de språk själva vi börja använda 96 00:06:23,370 --> 00:06:25,290 kommer att bli mer kraftfull. 97 00:06:25,290 --> 00:06:27,410 Men först, en tillämpning av träd. 98 00:06:27,410 --> 00:06:30,240 Det är mycket vanligt i dessa dagar för att behöva komprimera informationen. 99 00:06:30,240 --> 00:06:34,770 I vilket sammanhang skulle du vill komprimera någon form av digital information? 100 00:06:37,190 --> 00:06:39,670 >> Ja. >> [Eleven] När du behöver skicka den via webben. 101 00:06:39,670 --> 00:06:41,450 Ja, när du vill skicka något över webben. 102 00:06:41,450 --> 00:06:44,950 Om du vill ladda ner en stor fil, det är perfekt om någon i andra änden 103 00:06:44,950 --> 00:06:48,760 har komprimerat filen med hjälp av en zip-format eller något liknande 104 00:06:48,760 --> 00:06:53,760 så att du skickar färre bitar än vad som annars skulle överföras. 105 00:06:53,760 --> 00:06:55,500 Så hur komprimera du information? 106 00:06:55,500 --> 00:07:00,540 Det hela handlar om att använda färre bitar än vad som krävs som standard. 107 00:07:00,540 --> 00:07:03,220 Men det är lite av en nyfiken sak eftersom tänker tillbaka på veckor 0 och 1 108 00:07:03,220 --> 00:07:07,370 När vi talade om ASCII och binära och vi pratade om ASCII särskilt 109 00:07:07,370 --> 00:07:10,690 som att använda 8 bitar för att representera bokstäverna i alfabetet 110 00:07:10,690 --> 00:07:16,120 så att bokstaven A representeras av 65, gemener ett är antalet 97, 111 00:07:16,120 --> 00:07:21,210 och hur du representerar 65 eller 97, du använder 7 eller 8 bitar. 112 00:07:21,210 --> 00:07:24,120 Men kruxet är att det finns några bokstäver i det engelska alfabetet 113 00:07:24,120 --> 00:07:26,230 som inte är lika populära som andra. 114 00:07:26,230 --> 00:07:31,600 Z är inte så populärt, Q är inte så populärt, men A och E är super populär. 115 00:07:31,600 --> 00:07:37,280 Och ändå för alla dessa brev, som standard världen använder samma antal bitar, bara 8. 116 00:07:37,280 --> 00:07:42,690 Så skulle det inte ha varit smartare om istället för att använda 8 bitar för varje bokstav, 117 00:07:42,690 --> 00:07:47,440 även de mest sällan används som Q och Z, 118 00:07:47,440 --> 00:07:51,910 tänk om vi använde färre bitar för A och E och S och de mest populära bokstäverna 119 00:07:51,910 --> 00:07:55,000 och används fler bitar för de mindre populära bokstäver, 120 00:07:55,000 --> 00:07:57,770 Tanken är låt oss optimera för det gemensamma målet, 121 00:07:57,770 --> 00:08:01,160 vilket är ett tema i datavetenskap för att försöka optimera vad som kommer att hända de mest 122 00:08:01,160 --> 00:08:05,310 och spendera lite mer tid, lite mer utrymme på de saker som, ja, kan hända 123 00:08:05,310 --> 00:08:07,680 men inte nödvändigtvis lika ofta. 124 00:08:07,680 --> 00:08:09,330 Så låt oss ta ett exempel. 125 00:08:09,330 --> 00:08:12,610 >> Antag att vi vill koda information ganska effektivt. 126 00:08:12,610 --> 00:08:15,090 Du kanske har vuxit upp med vetskapen lite om morsekod, 127 00:08:15,090 --> 00:08:17,450 och oddsen är du inte visste själva koden, 128 00:08:17,450 --> 00:08:21,750 men du kanske kommer ihåg att det är minst denna serie av punkter och streck. 129 00:08:21,750 --> 00:08:26,640 Detta är en ganska effektiv kodning, och märker att de mest populära brev - till exempel e - 130 00:08:26,640 --> 00:08:28,980 använder den kortaste av pip. 131 00:08:28,980 --> 00:08:31,740 Morsekod handlar om beep-beep-beep-beep-beep-beep och hålla toner 132 00:08:31,740 --> 00:08:34,799 antingen för korta tidsperioder eller långa tidsperioder. 133 00:08:34,799 --> 00:08:40,330 E, som betecknas med punkten, är en super kort pip, bara pip, och det skulle innebära E. 134 00:08:40,330 --> 00:08:43,960 Däremot skulle T vara en längre pip, som pip [förlänger ljud] 135 00:08:43,960 --> 00:08:45,710 och som skulle representera T 136 00:08:45,710 --> 00:08:48,840 Men det är fortfarande ganska kort eftersom däremot om man tittar på Z, 137 00:08:48,840 --> 00:08:52,690 att uttrycka Z du skulle gå pip, pip [längre ljud], pip, pip [kortare ljud]. 138 00:08:52,690 --> 00:08:55,360 Så det är längre eftersom det är mindre vanligt. 139 00:08:55,360 --> 00:08:58,150 Men gotcha här är att morsekod är lite bristfällig 140 00:08:58,150 --> 00:09:00,610 att det inte är direkt avkodningsbara. 141 00:09:00,610 --> 00:09:07,350 Till exempel antar att du hör på vissa änden av kabeln pip [kort], pip [länge]. 142 00:09:07,350 --> 00:09:12,480 Vilket budskap fick jag bara? En punkt och ett streck. Vad representerar det? 143 00:09:12,480 --> 00:09:15,330 [Eleven] A. >> [Malan] Kanske. 144 00:09:15,330 --> 00:09:18,270 Det kan också vara E följt av T. 145 00:09:18,270 --> 00:09:23,390 Med andra ord, morsekod, även om det utnyttjar denna princip att optimera hörnet fallet, 146 00:09:23,390 --> 00:09:26,250 Det lämpar sig inte för omedelbar decodability. 147 00:09:26,250 --> 00:09:29,850 Det är, den människa som hör eller tar emot dessa punkter och streck 148 00:09:29,850 --> 00:09:34,540 måste på något sätt räkna ut där pauserna är mellan bokstäver, 149 00:09:34,540 --> 00:09:39,660 för om du inte vet var dessa pauser är, kan du förväxla A för ET eller vice versa. 150 00:09:39,660 --> 00:09:43,880 >> Så vad kan du göra? I morsekod du kan bara paus mellan varje brev. 151 00:09:43,880 --> 00:09:47,660 Men paus är typ av mot hela poängen med snabba upp saker. 152 00:09:47,660 --> 00:09:52,880 Så vad händer om vi istället kom upp med en kod där det inte fanns denna dålig situation 153 00:09:52,880 --> 00:09:56,570 där E är ett prefix, till exempel av A - 154 00:09:56,570 --> 00:10:00,020 Med andra ord, om vi kunde se till att mönstren fortfarande kort för de populära bokstäverna 155 00:10:00,020 --> 00:10:04,850 lång för de mindre populära bokstäver, men det finns ingen förväxling? 156 00:10:04,850 --> 00:10:08,930 En man vid namn Huffman år sedan uppfann detta system kallas Huffmankodning 157 00:10:08,930 --> 00:10:12,390 som utnyttjar faktiskt en av de datastrukturer som vi har tillbringat lite tid att tala om 158 00:10:12,390 --> 00:10:16,560 den senaste veckan, nämligen träd, binära träd särskilt - 159 00:10:16,560 --> 00:10:19,710 ett binärt träd vilket betyder att det inte har mer än 2 barn. 160 00:10:19,710 --> 00:10:22,720 Den har kanske en vänster barn, kanske en rätt barn, och det är det. 161 00:10:22,720 --> 00:10:26,510 Så antar bara för diskussionens skull att någon vill skicka ett meddelande 162 00:10:26,510 --> 00:10:31,270 som ser ut så här. Det är fullständigt nonsens, men det är sammansatt av As, B, Cs, Ds, och Es. 163 00:10:31,270 --> 00:10:34,890 Och om man räknar faktiskt upp alla som, B, Cs, Ds, och Es 164 00:10:34,890 --> 00:10:36,870 och sedan dividera med det totala antalet bokstäver, 165 00:10:36,870 --> 00:10:42,710 denna lilla diagram här säger att 45% av bokstäverna är Es, 20% är As, 166 00:10:42,710 --> 00:10:45,010 10% B, och så vidare. 167 00:10:45,010 --> 00:10:47,330 Så med andra ord, anta att den citerade strängen där 168 00:10:47,330 --> 00:10:49,080 är bara några meddelande som du vill skicka. 169 00:10:49,080 --> 00:10:52,180 Det råkar vara nonsens bara så vi kan använda så få bokstäver som möjligt, 170 00:10:52,180 --> 00:10:55,220 men det är faktiskt så att E fortfarande den mest populära, 171 00:10:55,220 --> 00:11:01,450 och B och C är den minst populära, åtminstone av dessa 5 bokstäver i alfabetet. 172 00:11:01,450 --> 00:11:04,040 Så hur kan vi gå komma med en kodning, 173 00:11:04,040 --> 00:11:08,430 en binär kodning, ett mönster av 0 och 1 för varje av dessa bokstäver 174 00:11:08,430 --> 00:11:14,820 på ett sådant sätt att E är en kort mönster och kanske B och C är något längre mönster, 175 00:11:14,820 --> 00:11:19,270 igen, tanken är att vi vill använda färre bitar för det mesta 176 00:11:19,270 --> 00:11:21,790 och fler bitar endast en gång på ett tag. 177 00:11:21,790 --> 00:11:26,070 Enligt Huffmankodning kan du skapa en skog av träd. 178 00:11:26,070 --> 00:11:31,190 Det blir liksom en story här som involverar träd och även arbetet med att bygga upp dem. 179 00:11:31,190 --> 00:11:32,420 Låt oss börja. 180 00:11:32,420 --> 00:11:36,140 >> Jag föreslår att du börjar med den här skogen, så att säga, av 5 träd, 181 00:11:36,140 --> 00:11:38,260 var och en är en ganska dum träd. 182 00:11:38,260 --> 00:11:42,800 Trädet består av bara en enda nod, som representeras här av en cirkel. 183 00:11:42,800 --> 00:11:45,310 Så alla dessa saker kan vara en C struktur 184 00:11:45,310 --> 00:11:50,200 och insidan av C-struct kan vara en flottör som representerar frekvensen antalet 185 00:11:50,200 --> 00:11:52,510 och sedan kanske en röding representerar brevet. 186 00:11:52,510 --> 00:11:56,470 Så tänk på dessa noder som bara några gamla C-struct, men för nu, högre nivå. 187 00:11:56,470 --> 00:12:01,230 Detta är en skog av 5 träd, vardera som bara har en enda nod. 188 00:12:01,230 --> 00:12:06,830 Vad Huffman föreslås är att vi börjar att kombinera dessa träd 189 00:12:06,830 --> 00:12:11,140 som har de minsta frekvens räknas till något större träd 190 00:12:11,140 --> 00:12:13,490 genom att ansluta dem med en ny rotnod. 191 00:12:13,490 --> 00:12:17,560 Så bland bokstäverna här, märker att för enkelhetens jag har sorterat dem från vänster till höger, 192 00:12:17,560 --> 00:12:21,420 även om det inte är absolut nödvändigt, och märker att de minsta noderna 193 00:12:21,420 --> 00:12:23,930 är för närvarande 10% och 10%. 194 00:12:23,930 --> 00:12:28,940 Så Huffman föreslog att vi går samman de 2 minsta noder i ett nytt träd 195 00:12:28,940 --> 00:12:34,450 genom att införa en ny förälder nod och sedan ge den föräldern en vänster barn och en höger barn 196 00:12:34,450 --> 00:12:37,720 där B är godtyckligt vänster och C är godtyckligt rätt. 197 00:12:37,720 --> 00:12:41,590 Och sedan Huffman föreslog vidare att låt oss nu bara tänka på vänstra barnet 198 00:12:41,590 --> 00:12:44,790 i ett av dessa träd alltid som representeras av 0 199 00:12:44,790 --> 00:12:47,890 och rätt barnet alltid som representeras av siffran 1. 200 00:12:47,890 --> 00:12:50,680 >> Det spelar ingen roll om du vänder dem så länge du är konsekvent. 201 00:12:50,680 --> 00:12:54,650 Så nu har vi fyra träd i den här skogen. 202 00:12:54,650 --> 00:12:58,050 Och jag säger fyra för nu trädet till vänster - 203 00:12:58,050 --> 00:13:00,570 och det är inte så mycket ett träd i den meningen att det växer på detta sätt, 204 00:13:00,570 --> 00:13:05,170 det är mer som ett släktträd där nu 0,2 är typ av förälder till de två barn - 205 00:13:05,170 --> 00:13:07,930 märker att i den föräldern vi har ritat 0,2. 206 00:13:07,930 --> 00:13:13,370 Vi har lagt frekvensen räknas de två barnen och med tanke på nya noden summan. 207 00:13:13,370 --> 00:13:15,310 Så nu upprepar vi bara denna process. 208 00:13:15,310 --> 00:13:19,490 Hitta de två minsta noderna och sedan gå med dem till ett nytt träd 209 00:13:19,490 --> 00:13:21,380 och sedan upprepa processen ytterligare. 210 00:13:21,380 --> 00:13:26,390 Just nu har vi några kandidater, 20%, 15%, och ytterligare 20%. 211 00:13:26,390 --> 00:13:29,780 I det här fallet måste vi bryta slips. Vi kan göra det godtyckligt. 212 00:13:29,780 --> 00:13:31,540 Vi borde bara göra det konsekvent. 213 00:13:31,540 --> 00:13:33,760 I det här fallet, ska jag gå godtyckligt med en till vänster, 214 00:13:33,760 --> 00:13:39,880 och jag samman nu 20% och 15% för att ge mig en ny förälder som kallas 35%, 215 00:13:39,880 --> 00:13:46,310 vars vänstra barn 0, vars rätt barn är 1, och nu har vi bara tre träd i skogen. 216 00:13:46,310 --> 00:13:47,960 Du kan kanske se vart det är på väg. 217 00:13:47,960 --> 00:13:51,150 Om vi ​​upprepar detta ett par gånger, vi kommer att ha bara en större träd, 218 00:13:51,150 --> 00:13:53,900 alla vars kanter är märkta med 0 och 1. 219 00:13:53,900 --> 00:13:55,710 Låt oss göra det igen. 220 00:13:55,710 --> 00:14:02,600 35% är att trädets rot. 20% och 45%, så vi kommer att slå samman 35% och 20%. 221 00:14:02,600 --> 00:14:05,610 Nu har vi detta träd här. Vi lägger dem tillsammans, vi har 55%. 222 00:14:05,610 --> 00:14:07,910 Nu finns det bara två träd i skogen. 223 00:14:07,910 --> 00:14:11,900 Vi gör detta en sista gång, och förhoppningsvis matematiskt alla frekvenser lägga upp 224 00:14:11,900 --> 00:14:15,570 eftersom de bör eftersom vi beräknas dem från get-go för att lägga till upp till 100%. 225 00:14:15,570 --> 00:14:17,960 Och nu har vi en träd. 226 00:14:17,960 --> 00:14:20,580 Så detta är en Huffmankodning träd. 227 00:14:20,580 --> 00:14:24,400 Det slags tog ett tag att komma dit verbalt, men verkligheten är en for-loop 228 00:14:24,400 --> 00:14:27,620 eller med en rekursiv funktion, kan du bygga denna sak upp ganska snabbt. 229 00:14:27,620 --> 00:14:32,440 Så nu har vi ett nytt nod, och alla dessa inre noder har malloc'd, 230 00:14:32,440 --> 00:14:34,690 förmodligen längs vägen. 231 00:14:34,690 --> 00:14:38,650 Så nu på toppen av detta träd har vi 100%, men nu märker vi en stig 232 00:14:38,650 --> 00:14:43,780 från denna nya store-store-store-morförälder till alla stora-store-store-barnbarn 233 00:14:43,780 --> 00:14:45,930 hela vägen vid botten, till alla bladen. 234 00:14:45,930 --> 00:14:52,840 >> Vad vi ska göra nu är att föreslå att för att representera bokstaven E, 235 00:14:52,840 --> 00:14:55,670 Vi kommer helt enkelt att använda siffran 1. Varför? 236 00:14:55,670 --> 00:15:01,000 För om vi korsar detta träd från den slutliga roten ner till bladet som kallas E, 237 00:15:01,000 --> 00:15:06,050 Vi följer bara en kant, den högra kanten, och det är märkt naturligtvis uppe till höger 1. 238 00:15:06,050 --> 00:15:11,550 Så konsekvenserna här Huffman var att E: s kodning i binär bara skall vara 1. 239 00:15:11,550 --> 00:15:14,490 Och det är jäkligt effektivt. Kan inte riktigt få något mindre än så. 240 00:15:14,490 --> 00:15:18,350 Däremot är en kommer att vara representerade, om du följer logiken, 241 00:15:18,350 --> 00:15:21,610 genom vilket mönster av bitar istället? 01. 242 00:15:21,610 --> 00:15:25,500 Så för att komma till en, börjar vi vid roten och vi går till vänster och sedan går vi rätt, 243 00:15:25,500 --> 00:15:28,580 vilket innebär att vi följde en 0 och sedan en 1. 244 00:15:28,580 --> 00:15:32,810 Så vi skall företräda bokstaven A med mönstret 0 och 1. 245 00:15:32,810 --> 00:15:36,010 Och nu märker vi redan har en egenskap av omedelbar decodability 246 00:15:36,010 --> 00:15:38,090 att vi inte har i morsekod. 247 00:15:38,090 --> 00:15:42,840 Även om båda dessa mönster är ganska kort - E är 1 bit, A 2 bitar - 248 00:15:42,840 --> 00:15:45,080 märker att de inte kan förväxlas ena eller det andra, 249 00:15:45,080 --> 00:15:54,870 för om du ser en 1 det måste vara ett E, om du ser en 0 sedan en 1 Det är uppenbarligen fått vara ett A. 250 00:15:54,870 --> 00:15:58,410 Likaså, vad är D? 001. 251 00:15:58,410 --> 00:16:01,440 Vad är C? 0001. 252 00:16:01,440 --> 00:16:05,320 Och vad är B? 0000. 253 00:16:05,320 --> 00:16:09,550 Och återigen, eftersom alla brev vi bryr oss om är i bladen 254 00:16:09,550 --> 00:16:13,890 och ingen av dem är typ av mellanhänder på vägen från rot till blad, 255 00:16:13,890 --> 00:16:18,760 det finns ingen risk för att conflating 2 bokstäver "olika kodningar 256 00:16:18,760 --> 00:16:22,300 eftersom alla dessa bitmönster är deterministiska. 257 00:16:22,300 --> 00:16:25,280 0000 kommer alltid att vara B. 258 00:16:25,280 --> 00:16:29,480 Det finns ingen nod någonstans mellan att du kan förvirra en bokstav för den andra. 259 00:16:29,480 --> 00:16:31,150 Så vad är innebörden här? 260 00:16:31,150 --> 00:16:35,080 >> Den mest populära brev - i detta fall E - har fått den kortaste kodning, 261 00:16:35,080 --> 00:16:37,430 A har fått nästa kortaste kodning, 262 00:16:37,430 --> 00:16:41,390 och B och C, som vi redan visste från get-go var typ av de minst populära 263 00:16:41,390 --> 00:16:45,390 vid 10% frekvens vardera har de fått den längsta kodning. 264 00:16:45,390 --> 00:16:49,410 Och så vad detta betyder nu är att om du vill skicka ett meddelande som är komprimerad 265 00:16:49,410 --> 00:16:51,950 via Internet eller i ett e-postmeddelande eller liknande, 266 00:16:51,950 --> 00:16:56,730 snarare än att använda vanlig ASCII, kan du skicka ett Huffman kodat meddelande 267 00:16:56,730 --> 00:17:01,720 där om du vill skicka bokstaven E, skickar du bara en enda bit. 268 00:17:01,720 --> 00:17:05,680 Om du vill skicka ett A, skickar du 2 bitar, 01, istället för att skicka 8 bitar 269 00:17:05,680 --> 00:17:10,190 följt av ytterligare 8 bitar följt av ytterligare 8 bitar och så vidare. 270 00:17:10,190 --> 00:17:11,940 Men det finns en gotcha här. 271 00:17:11,940 --> 00:17:17,079 Det är inte tillräckligt att bara bygga detta träd och sedan börja skicka från Alice till Bob 272 00:17:17,079 --> 00:17:20,010 den kortare bitmönster, sträng från ASCII, 273 00:17:20,010 --> 00:17:23,140 eftersom Alice har också informera Bob vad 274 00:17:23,140 --> 00:17:26,880 Om Bob kommer att kunna läsa hennes komprimerade budskap? 275 00:17:26,880 --> 00:17:30,770 [Ohörbart elev svar] >> Vad är det? 276 00:17:30,770 --> 00:17:32,310 [Ohörbart elev svar] >> av vad trädet är. 277 00:17:32,310 --> 00:17:35,160 Eller ännu mer specifikt, vad dessa kodningar är, 278 00:17:35,160 --> 00:17:39,010 särskilt eftersom under denna berättelse vi gjort en bedömning samtal vid ett tillfälle. 279 00:17:39,010 --> 00:17:43,640 Kom ihåg att vi var tvungna att välja godtyckligt mellan de 2 olika 20% noder? 280 00:17:43,640 --> 00:17:49,800 Så det är inte så att Bob, mottagaren, kan bara rekonstruera trädet på sin egen 281 00:17:49,800 --> 00:17:53,390 eftersom han kanske kommer att skapa trädet någonsin så lite annorlunda från Alice. 282 00:17:53,390 --> 00:17:56,670 Heller Bob inte ens vet vad det ursprungliga meddelandet är 283 00:17:56,670 --> 00:18:00,770 eftersom det enda Alice skickar honom, naturligtvis, är den komprimerade budskap. 284 00:18:00,770 --> 00:18:05,900 >> Så fångsten med kompression som detta är att, ja, kan Alice spara en hel del bitar 285 00:18:05,900 --> 00:18:09,900 genom att sända 1 för E och 01 för A och så vidare, 286 00:18:09,900 --> 00:18:15,180 men hon har också informera Bob vad mappningen mellan bokstäver och bitar 287 00:18:15,180 --> 00:18:19,620 eftersom de inte kan tydligt lita på bara ASCII längre om vi inte använder ASCII. 288 00:18:19,620 --> 00:18:22,200 Så hon kan antingen skicka honom trädet på något sätt - 289 00:18:22,200 --> 00:18:26,600 skriva ner det, lagra den som binära data eller något liknande - 290 00:18:26,600 --> 00:18:30,280 eller bara skicka honom en liten lathund, en Excel-fil, som visar avbildningar. 291 00:18:30,280 --> 00:18:36,480 Så effektiviteten i kompressionen förutsätter verkligen att de meddelanden som du skickar 292 00:18:36,480 --> 00:18:40,230 är ganska stora, åtminstone medelstora, 293 00:18:40,230 --> 00:18:42,180 för om du skickar en super kort meddelande, 294 00:18:42,180 --> 00:18:45,390 Om du bara vill skicka meddelandet BAD händer som att vara ett ord som vi kan stava här, 295 00:18:45,390 --> 00:18:49,550 B-A-D, är du förmodligen kommer att använda färre bitar, 296 00:18:49,550 --> 00:18:53,130 men kruxet är om du även måste informera Bob vad trädet är 297 00:18:53,130 --> 00:18:57,530 eller vad dessa kodningar är, du kommer att förmodligen uppväger alla de besparingar 298 00:18:57,530 --> 00:19:00,110 att ha komprimerade saker till att börja med. 299 00:19:00,110 --> 00:19:02,210 Så det kan faktiskt vara så att om du försöker komprimera 300 00:19:02,210 --> 00:19:05,330 även med något som zip eller filformat du kan känna - 301 00:19:05,330 --> 00:19:07,780 ganska små filer, även tomma filer - 302 00:19:07,780 --> 00:19:10,930 ibland dessa filer kan bli större och inte mindre. 303 00:19:10,930 --> 00:19:14,320 Men realistiskt, händer det bara för små filstorlekar, 304 00:19:14,320 --> 00:19:16,920 så det kommer inte att göra en gigabyte filen 2 gigabyte; 305 00:19:16,920 --> 00:19:19,480 vi verkligen pratar byte eller bara en kilobyte par. 306 00:19:19,480 --> 00:19:22,330 >> Vissa program som zip är smart nog att inse att, 307 00:19:22,330 --> 00:19:24,590 "Du kommer att spendera fler bitar komprimera detta." 308 00:19:24,590 --> 00:19:27,460 "Låt mig inte bry komprimera det för dig alls." 309 00:19:27,460 --> 00:19:30,160 Så det här är bara ett sätt och sedan att komprimera textformat. 310 00:19:30,160 --> 00:19:32,300 Vi kunde genomföra något liknande i C. 311 00:19:32,300 --> 00:19:35,370 Till exempel, här är hur vi kan representera en nod i detta träd 312 00:19:35,370 --> 00:19:39,320 där vi har en röding på symbolen, en flytande värde för frekvensen, 313 00:19:39,320 --> 00:19:42,250 och som vi har sett med våra andra datastrukturer, 2 pekare, 314 00:19:42,250 --> 00:19:47,080 1 till vänster barnet, 1 till höger, vilket i båda fallen kan vara NULL, 315 00:19:47,080 --> 00:19:50,850 men om inte, hänvisat till en vänster barn och en höger barn. 316 00:19:50,850 --> 00:19:55,130 Så detta är då Huffmankodning, och det är ett sätt som du kan gå om att komprimera information, 317 00:19:55,130 --> 00:19:57,880 och det är verkligen en av de mest lätt att genomföra 318 00:19:57,880 --> 00:20:00,830 i samband med exempelvis förra veckans datastrukturer, 319 00:20:00,830 --> 00:20:03,250 men ännu mer sofistikerade algoritmer finns 320 00:20:03,250 --> 00:20:08,220 som kan göra ännu mer sofistikerade mutationer av dina data. 321 00:20:08,220 --> 00:20:11,640 Eventuella frågor sedan på träd, träd binära eller komprimering av text? 322 00:20:11,640 --> 00:20:15,590 [Elev] Finns det någon tvetydighet, som om [ohörbart] delas upp i 01, 323 00:20:15,590 --> 00:20:19,160 då 011 vara tvetydig, eller hur? 324 00:20:19,160 --> 00:20:22,730 [Ohörbart] >> Bra fråga. Tvetydighet. 325 00:20:22,730 --> 00:20:25,940 Låt mig sammanfatta genom att hänvisa till den här bilden här. 326 00:20:25,940 --> 00:20:29,650 Eftersom de tecken du komprimerar, representationer, 327 00:20:29,650 --> 00:20:32,850 genom definitionen av denna algoritm alltid förblir bladen, 328 00:20:32,850 --> 00:20:41,870 du aldrig misstag använder samma mönster av bitar för prefixet av flera bokstäver. 329 00:20:41,870 --> 00:20:46,740 Så med andra ord, du är orolig, det låter som, en tvetydighet som uppstår 330 00:20:46,740 --> 00:20:51,580 varigenom 001 kan vara början på B eller början på C eller något liknande. 331 00:20:51,580 --> 00:20:56,780 Men det kan inte vara fallet eftersom märker att alla bokstäver i alfabetet vi kodning 332 00:20:56,780 --> 00:20:58,290 är på bladen. 333 00:20:58,290 --> 00:21:01,910 >> Den tvetydighet kan bara uppstå, såsom i fallet med morsekod, 334 00:21:01,910 --> 00:21:06,770 Om, till exempel, var C någonstans på vägen från roten till B. 335 00:21:06,770 --> 00:21:12,290 [Elev] Rätt. Så i det fallet, säger A har 2 blad. >> Säg A har - Säg det igen. 336 00:21:12,290 --> 00:21:18,760 [Elev] Säg A har 2 blad, F och G, och sedan G - >> Okej. Men det går inte. 337 00:21:18,760 --> 00:21:23,230 En själv inte kunde ha blad F och G eftersom dessa bokstäver F och G 338 00:21:23,230 --> 00:21:27,560 skulle själva vara lämnar någonstans till vänster om B eller rätten av E. 339 00:21:27,560 --> 00:21:28,900 Så per definition, måste de vara löv. 340 00:21:28,900 --> 00:21:32,940 Annars är du precis rätt, vi har inte löst problemet med att morsekod står inför. 341 00:21:32,940 --> 00:21:38,150 Bra fråga. Övriga frågor? Okej. 342 00:21:38,150 --> 00:21:42,050 Denna föreställning om bitar, visar det sig att vi har haft makten hela tiden att vi faktiskt inte har använt 343 00:21:42,050 --> 00:21:44,200 när det gällde att manipulera dessa 0 och 1. 344 00:21:44,200 --> 00:21:46,600 Vi frågade om detta på ett av de tidigaste problemet set: 345 00:21:46,600 --> 00:21:52,340 nämligen hur du går om att konvertera versaler till gemener eller tvärtom? 346 00:21:52,340 --> 00:21:55,460 Eller mer konkret, frågade en av de första psets 347 00:21:55,460 --> 00:22:01,090 hur många bitar behöver du faktiskt vända för att ändra en till gemener en eller tvärtom? 348 00:22:01,090 --> 00:22:05,580 Här är en snabb påminnelse om vad 65 och 97 ser ut i binärt. 349 00:22:05,580 --> 00:22:08,060 Och även om den frågan har typ av bleknat i minnet, 350 00:22:08,060 --> 00:22:11,290 Du kan se igen här att hur många bitar måste vändas 351 00:22:11,290 --> 00:22:15,810 att ändra kapitalet A till gemener en? Bara en. 352 00:22:15,810 --> 00:22:19,650 >> De skiljer sig endast på ett ställe, den tredje biten från vänster. 353 00:22:19,650 --> 00:22:24,240 Medan A har en 010, lite en har 011. 354 00:22:24,240 --> 00:22:26,250 Så på något sätt måste vi bara kunna vända den biten, 355 00:22:26,250 --> 00:22:29,410 och vi kan då dra nytta eller gemener. 356 00:22:29,410 --> 00:22:32,720 Vi har gjort detta tidigare genom att faktiskt använda om villkor 357 00:22:32,720 --> 00:22:35,930 och kontrollera om brevet är mellan kapitalet A och kapital Z, 358 00:22:35,930 --> 00:22:41,480 sedan utgångar som A - a + 26 eller nåt sånt. 359 00:22:41,480 --> 00:22:46,130 Du gjorde förmodligen en aritmetisk ändring av bokstäverna i alfabetet. 360 00:22:46,130 --> 00:22:49,270 Men tänk om vi bara kunde vända det enda bit? 361 00:22:49,270 --> 00:22:59,080 Hur kan du gå om att ta ett byte värde av bitar, så 8 bitar som 01.000.001 och 01.100.001? 362 00:22:59,080 --> 00:23:03,170 Om du hade dessa mönster av bitar, hur kan vi gå om att ändra bara en av dem? 363 00:23:03,170 --> 00:23:07,610 Tänk om vi introducerar i gult här i andra mönster av bitar? 364 00:23:07,610 --> 00:23:13,420 Om jag gör hela gula sträng 0s undantag för en bit som jag vill ändra 365 00:23:13,420 --> 00:23:17,900 och då jag införa en ny aktör som kallas en bitvis operatör - 366 00:23:17,900 --> 00:23:21,210 bitvis i den meningen att den arbetar på enskilda bitar, 367 00:23:21,210 --> 00:23:25,360 inte på en hel bitgrupp eller fyra byte på en gång. 368 00:23:25,360 --> 00:23:31,170 Denna lodrätt streck där i gult tyder på att vad händer om vi tar representationen av kapitalet A 369 00:23:31,170 --> 00:23:37,060 och bitvis ELLER den med den gula bitsekvens? 370 00:23:37,060 --> 00:23:41,300 Med andra ord, tänker tillbaka till vår diskussion om booleska uttryck i Scratch och sedan i C. 371 00:23:41,300 --> 00:23:47,520 >> Att göra en boolesk eller innebär att vara sant, antingen den första måste vara sant 372 00:23:47,520 --> 00:23:50,700 eller den andra saken måste vara sann eller de båda har för att vara sant, 373 00:23:50,700 --> 00:23:53,270 och sedan den resulterande utsignalen är själv sant. 374 00:23:53,270 --> 00:24:00,230 I detta fallet här, vad vi får om vi tar 0 "eller" ed med 0? Falska eller falskt? 375 00:24:00,230 --> 00:24:04,280 Det är fortfarande falskt, så små en är som förväntat. 376 00:24:04,280 --> 00:24:07,540 Tänk om vi istället gör 1 eller 0? 377 00:24:07,540 --> 00:24:12,640 Detta återstår nu 1, men märker vad att hända här. 378 00:24:12,640 --> 00:24:18,630 Om vi ​​börjar med kapital A och vi fortsätter att "eller" dess enskilda bitar som vi gör här, 379 00:24:18,630 --> 00:24:25,180 0 eller den gula en ger oss vad här nere? Det ger oss 1. 380 00:24:25,180 --> 00:24:35,120 I själva verket, antar att vi inte visste vad det versaler versionen av lite en faktiskt var. 381 00:24:35,120 --> 00:24:38,270 Låt oss gå göra detta. Låt mig flytta tillbaka hit. 382 00:24:38,270 --> 00:24:42,340 Låt oss göra det igen. 0 eller 0 ger mig 0. 383 00:24:42,340 --> 00:24:45,020 1 eller 0 ger mig 1. 384 00:24:45,020 --> 00:24:48,020 0 eller 1 ger mig 1. 385 00:24:48,020 --> 00:24:52,880 0 eller 0 ger mig 0. Nästa gång det är 0, nästa är 0, är ​​nästa en 0. 386 00:24:52,880 --> 00:24:55,660 1 eller 0 ger mig 1. 387 00:24:55,660 --> 00:24:59,140 Och så även om vi inte visste i förväg vad gemener en var, 388 00:24:59,140 --> 00:25:04,770 helt enkelt genom "eller" ing A med detta mönster av bitar som vi har presenteras här i gult, 389 00:25:04,770 --> 00:25:09,400 Du kan gemener ett kapital A genom att bläddra den biten. 390 00:25:09,400 --> 00:25:11,580 Vi använde detta uttryck veckor sedan: bläddra lite. 391 00:25:11,580 --> 00:25:13,710 Hur gör du faktiskt göra det programmatiskt? 392 00:25:13,710 --> 00:25:16,390 Du använder vad som allmänt kallas en mask, en sekvens av bitar, 393 00:25:16,390 --> 00:25:19,980 att i detta fall råkar vara så att se ut så här numret här, 394 00:25:19,980 --> 00:25:22,980 och sedan "eller" det tillsammans med den nya C-operatör, 395 00:25:22,980 --> 00:25:29,940 inte | | du använder en enda | och du skulle faktiskt få detta svar här eftersom varför? 396 00:25:29,940 --> 00:25:35,120 Detta är den plats 1s, 2s plats, 4S, 8S, 16s, 32s. 397 00:25:35,120 --> 00:25:42,280 Så det visar sig att om du tar en bokstav A och bitvis ELLER den med heltalet 32, 398 00:25:42,280 --> 00:25:47,520 eftersom heltalet 32, när man tittar på det som bitar, ser ut så här, 399 00:25:47,520 --> 00:25:50,860 som innebär att du kan vända den bit som du verkligen vill. 400 00:25:50,860 --> 00:25:52,630 Och på samma sätt - och vi titta på kod på bara ett ögonblick - 401 00:25:52,630 --> 00:25:54,210 antar att vi vill gå åt andra hållet. 402 00:25:54,210 --> 00:25:58,210 >> Hur går du från gemena en till kapital A? Vilken bit måste förändras? 403 00:25:58,210 --> 00:25:59,820 Det är samma en. 404 00:25:59,820 --> 00:26:03,970 Vi vill ändra på det tredje biten från 1 till 0. 405 00:26:03,970 --> 00:26:06,310 Och hur kan vi gå om att göra detta? 406 00:26:06,310 --> 00:26:10,130 Hur stänger vi av lite? Med vilken mönster av bitar kan vi stänga lite? 407 00:26:11,580 --> 00:26:14,070 Tänk om vi sorterar av invertsocker masken? 408 00:26:14,070 --> 00:26:17,350 Medan tidigare gjorde vi hela gula masken 0s 409 00:26:17,350 --> 00:26:19,930 utom för en bit vi ville vända på, 410 00:26:19,930 --> 00:26:25,580 tänk om denna tid gör vi hela masken 1s förutom den bit som vi vill stänga 411 00:26:25,580 --> 00:26:28,330 och sedan använda det operatör? 412 00:26:28,330 --> 00:26:30,560 Tänk om vi "och" saker? Låt oss ta en titt. 413 00:26:30,560 --> 00:26:34,880 Om vi ​​nu vänder på detta, anta att jag återigen skapa en mask som är allt 1s 414 00:26:34,880 --> 00:26:37,650 med undantag för en bit som jag vill stänga 415 00:26:37,650 --> 00:26:43,860 och sedan snarare än "eller" de vita siffror upp toppen med de gula siffrorna här nere, 416 00:26:43,860 --> 00:26:46,940 Vad händer om jag istället "och" dem tillsammans? Det kallas en bitvis och. 417 00:26:46,940 --> 00:26:49,450 Logiskt sett är det samma sak som ett booleskt och. 418 00:26:49,450 --> 00:26:55,160 Det ger mig 0 och 1 är 0. Så falsk och sant är falskt. 419 00:26:55,160 --> 00:26:58,160 Sann och sant är sant. 420 00:26:58,160 --> 00:27:04,020 Och här är den magiska: sant och falskt är nu falskt, så vi har stängt av den biten. 421 00:27:04,020 --> 00:27:06,560 Och nu resten av historien är något enkelt. 422 00:27:06,560 --> 00:27:11,970 Eftersom resten av masken är 1s, spelar det ingen roll vad siffrorna är i vitt. 423 00:27:11,970 --> 00:27:15,580 När du "och" något med sant, du kommer inte att ändra dess värde. 424 00:27:15,580 --> 00:27:20,200 Om det är sant, kommer det att förbli trogna. Om det var falskt, kommer den att förbli falsk. 425 00:27:20,200 --> 00:27:23,190 >> Men det magiska händer när du tar något som var sant 426 00:27:23,190 --> 00:27:25,430 och du sedan "och" den med falskt. 427 00:27:25,430 --> 00:27:30,030 Detta har effekten att stänga av den biten. 428 00:27:30,030 --> 00:27:31,980 Så lite kryptisk där. 429 00:27:31,980 --> 00:27:35,390 Låt oss verkligen titta på några kod, som faktiskt kan se ännu mer kryptiskt, 430 00:27:35,390 --> 00:27:38,220 men låt oss ta en titt här på tolower. 431 00:27:38,220 --> 00:27:45,880 Om jag tittar på tolower, från kapital A till gemener en, 432 00:27:45,880 --> 00:27:47,730 låt oss se hur vi kan genomföra detta program. 433 00:27:47,730 --> 00:27:51,280 Här är viktigaste, och det är inte ta några kommandoradsargument. 434 00:27:51,280 --> 00:27:55,980 Jag förklarar ett tecken c för det brev som användaren ska skriva i. 435 00:27:55,980 --> 00:28:00,690 Jag använder sedan en bekant göra medan slinga för att bara se till att användaren definitivt ger mig ett kapital A 436 00:28:00,690 --> 00:28:05,010 eller B eller C. .. Z, så de ger mig något mellan A och Z. 437 00:28:05,010 --> 00:28:08,580 Och nu vad gör jag här? 438 00:28:08,580 --> 00:28:14,870 Jag är "eller" ing detta med 0x20, men det är faktiskt samma som - 439 00:28:14,870 --> 00:28:19,500 och vi kommer att återkomma till detta i ett ögonblick - 32. 440 00:28:19,500 --> 00:28:24,830 Så återigen, är 32 detta mönster av bitar här. Varför vet vi det? 441 00:28:24,830 --> 00:28:26,320 Tänk tillbaka till vecka 0. 442 00:28:26,320 --> 00:28:31,010 Detta är den plats 1s, 2s plats, 4S, 8S, 16s, 32S plats. 443 00:28:31,010 --> 00:28:33,470 Så denna gula nummer råkar vara 32. 444 00:28:33,470 --> 00:28:40,570 Jag kan sedan ta en bokstav som röding här bitvis "eller" det med bokstavligen numret 32, 445 00:28:40,570 --> 00:28:45,250 och vad får jag tillbaka? Den gemena versionen av röding. 446 00:28:45,250 --> 00:28:48,830 För en stund sedan, men uttryckte jag detta i en annan bas notation. 447 00:28:48,830 --> 00:28:51,370 Vad har detta för? >> [Elev] Hexadecimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Detta händer att representera hexadecimalt. 449 00:28:53,050 --> 00:28:55,170 Vi har inte pratat om hexadecimalt så mycket, 450 00:28:55,170 --> 00:28:57,330 men det är faktiskt bekvämt i fall som detta. 451 00:28:57,330 --> 00:29:01,730 >> Även om det ser mer komplex och även om det ser ut som 20 och inte 32, 452 00:29:01,730 --> 00:29:06,240 det visar sig att hexadecimala faktiskt super bekvämt notation 453 00:29:06,240 --> 00:29:10,810 eftersom hexadecimala varje siffran efter 0x - och det betyder ingenting; 454 00:29:10,810 --> 00:29:13,960 detta är bara mänskligt konvention som säger här kommer ett hexadecimalt tal - 455 00:29:13,960 --> 00:29:18,590 vart och ett av dessa siffror, 2 och sedan 0 kan själva representeras 456 00:29:18,590 --> 00:29:20,800 med exakt 4 bitar. 457 00:29:20,800 --> 00:29:27,840 Så om vi gör det, låt mig öppna upp en textredigerare här - konstig Komplettera automatiskt - 458 00:29:27,840 --> 00:29:35,940 om vi gör en liten textredigerare här innebär att antalet 0x20 här är 4 bitar, här ytterligare 4 bitar. 459 00:29:35,940 --> 00:29:38,050 Låt oss göra det längst till höger 4 bitar först. 460 00:29:38,050 --> 00:29:44,690 0 när representerat med 4 bitar är vad? Super lätt. Bara alla 0s. 461 00:29:44,690 --> 00:29:46,780 Så 4 bitar som 0s. 462 00:29:46,780 --> 00:29:53,510 Hur står ni 2? Det var ett tag sedan vi gjorde detta, men det är 0100. 463 00:29:53,510 --> 00:29:57,310 Så detta är den 1s plats, är detta 2s plats, och sedan det spelar ingen roll vad de andra platserna är. 464 00:29:57,310 --> 00:30:00,610 Med andra ord, i hexadecimal du kan säga 0x20, 465 00:30:00,610 --> 00:30:04,340 men om du sedan tänker på vad är 2 och hur det representeras i binär, 466 00:30:04,340 --> 00:30:07,130 vad är 0 och hur det representeras i binär, 467 00:30:07,130 --> 00:30:10,440 svaren på dessa frågor är det och det, respektive. 468 00:30:10,440 --> 00:30:14,380 Så 0x20 råkar representera detta mönster av 8 bitar, 469 00:30:14,380 --> 00:30:16,880 vilket är just den mask som vi ville ha. 470 00:30:16,880 --> 00:30:20,140 Så det här är för tillfället bara en intellektuell övning, 471 00:30:20,140 --> 00:30:24,520 men verkligheten är i kod det oftast vanligare att skriva konstanter som denna 472 00:30:24,520 --> 00:30:28,360 i hexadecimal för då programmeraren kan relativt enkelt, 473 00:30:28,360 --> 00:30:32,560 även om det kräver lite papper och penna, räkna ut vad det mönster av bitar är 474 00:30:32,560 --> 00:30:35,960 eftersom du inte kan bara uttrycka 0 och 1 vanligtvis i koden. 475 00:30:35,960 --> 00:30:38,540 Du kan inte gå 00.010 och så vidare. 476 00:30:38,540 --> 00:30:42,380 >> Du måste välja decimala eller hexadecimala eller oktala eller andra beteckningar. 477 00:30:42,380 --> 00:30:47,540 De flesta människor tenderar att plocka hexadecimala helt enkelt så att varje siffra representerar 4 bitar 478 00:30:47,540 --> 00:30:49,320 och du kan göra detta snabbt matematik. 479 00:30:49,320 --> 00:30:54,990 Och jag vinkar min hand på toupper, vilket är nästan samma, det ser nästan identiska. 480 00:30:54,990 --> 00:31:01,900 Toupper råkar inte använda eller operatören utan den här killen och DF. 481 00:31:01,900 --> 00:31:09,300 Vad representerar df? df? Någon? >> [Elev] 255. 482 00:31:09,300 --> 00:31:12,780 255? Inte 255. Det skulle vara ff. 483 00:31:12,780 --> 00:31:15,210 Vi lämnar det här en som en liten övning. 484 00:31:15,210 --> 00:31:23,460 Men om du går från 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 och vad kommer efter 9? 485 00:31:23,460 --> 00:31:26,510 Vi är typ av ur decimaler, men i hexadecimal vad som kommer efter 9? 486 00:31:26,510 --> 00:31:29,510 [Elev] en. >> Så a, b, c, d.. 487 00:31:29,510 --> 00:31:33,470 Du kan räkna ut därifrån vilket mönster av bitar d. faktiskt representerar. 488 00:31:33,470 --> 00:31:38,850 Och om vi gör matten, vi får se till att masken du i slutändan får tillbaka är identisk med denna. 489 00:31:38,850 --> 00:31:45,580 Detta är f, alla 1s, och detta är d. Så df representerar den masken. Okej. 490 00:31:45,580 --> 00:31:50,980 Och slutligen, inte göra saker och ting bra super, super tekniska, 491 00:31:50,980 --> 00:31:53,840 men antar vi ville skriva ett program som gör detta. 492 00:31:53,840 --> 00:31:58,960 Låt mig gå vidare och göra binära, som är ett program i en fil som heter Skrivning. 493 00:31:58,960 --> 00:32:02,050 Och låt mig nu kör binär och ge mig en icke-negativt heltal. 494 00:32:02,050 --> 00:32:03,960 Låt oss börja enkelt och skriv in 0. 495 00:32:03,960 --> 00:32:09,010 Detta är nu ett program som skriver ut ett heltal i binär representation. 496 00:32:09,010 --> 00:32:13,470 Så om jag spelar detta spel igen och skriva in bara 1 skulle jag få en 32-bitars representation av 1. 497 00:32:13,470 --> 00:32:15,490 Om jag gör det igen med 2, ska jag få det. 498 00:32:15,490 --> 00:32:19,310 Om jag gör 7 skulle jag få ett par 1s i slutet och så vidare. 499 00:32:19,310 --> 00:32:22,740 Det visar sig att jag nämner detta eftersom med bitvisa operationer 500 00:32:22,740 --> 00:32:25,490 Du kan faktiskt göra en annan sak också. 501 00:32:25,490 --> 00:32:29,130 Du kan skapa dessa masker dynamiskt. 502 00:32:29,130 --> 00:32:32,800 Ta en titt på detta ett sista exempel där bitvisa operationer. 503 00:32:32,800 --> 00:32:35,490 Här är den första delen av koden, fråga användaren efter ett nummer 504 00:32:35,490 --> 00:32:38,130 och det insisterar på att du ger mig en icke-negativt heltal. 505 00:32:38,130 --> 00:32:39,780 Så det är typ av gamla skolan grejer. 506 00:32:39,780 --> 00:32:41,980 Men här är något som är ganska intressant. 507 00:32:41,980 --> 00:32:44,910 >> Hur gör jag för att skriva ut en rad i binär? 508 00:32:44,910 --> 00:32:48,970 Jag iterera först från vad till vad? 509 00:32:48,970 --> 00:32:52,270 Vad är storleken på en int typiskt, åtminstone i apparaten? >> [Elev] 4. 510 00:32:52,270 --> 00:32:57,130 Det är 4. Så 4 * 8 är 32 till 1 är 31. 511 00:32:57,130 --> 00:33:02,590 Så om jag börjar att räkna från 31, representerar att det visar sig, 512 00:33:02,590 --> 00:33:07,630 bara begreppsmässigt, den 31 bitar eller den högsta ordning lite, vilket är den här killen här, 513 00:33:07,630 --> 00:33:09,650 Detta kommer att vara lite 0. 514 00:33:09,650 --> 00:33:12,850 Så det här är lite 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Så vad är denna kod gör? 516 00:33:14,950 --> 00:33:20,140 Notera detta för slinga, även om det ser kryptisk, är bara iterera från 31 ner till 0. Det var allt. 517 00:33:20,140 --> 00:33:24,530 Så den intressanta delen nu måste i dessa 5 rader här. 518 00:33:24,530 --> 00:33:28,110 Observera att i denna linje jag förklara en variabel som heter mask 519 00:33:28,110 --> 00:33:30,790 att vara konsekvent med vår berättelse dessa gula siffror. 520 00:33:30,790 --> 00:33:32,200 Och vad är detta gör? 521 00:33:32,200 --> 00:33:35,720 Detta är en annan bitvis vi inte sett förut, troligen. 522 00:33:35,720 --> 00:33:38,300 Det är den vänstra shift operatör. 523 00:33:38,300 --> 00:33:40,060 Denna operatör gör detta. 524 00:33:40,060 --> 00:33:44,920 Här är antalet 1, och om du gör jag lämnade skift, vänster shift, 525 00:33:44,920 --> 00:33:49,260 vad tror du som har effekten att göra med att enskilda 1? 526 00:33:49,260 --> 00:33:51,290 Bokstavligen flytta den. 527 00:33:51,290 --> 00:33:57,540 Så om antalet 1 är vad du har till vänster och du börjar med att initiera i till 31, 528 00:33:57,540 --> 00:34:03,490 vad är det göra? Det kommer att ta nummer 1 och flytta den 31 platser här. 529 00:34:03,490 --> 00:34:06,210 Och eftersom det finns uppenbarligen inga andra siffror bakom sig, 530 00:34:06,210 --> 00:34:10,350 de kommer som standard att ersättas med 0s. 531 00:34:10,350 --> 00:34:15,120 Så du börjar med nummer 1, vilket naturligtvis ser ut så här - 532 00:34:15,120 --> 00:34:18,659 och låt mig rita den hit i mitten. 533 00:34:18,659 --> 00:34:22,139 Och sedan när du flytta saker till vänster, går den här killen i huvudsak på detta sätt. 534 00:34:22,139 --> 00:34:24,659 Men så fort du gör det, blir en 0 fyllas i. 535 00:34:24,659 --> 00:34:28,360 Om du flyttar den en andra gång, går det så här och en annan 0 fylls i. 536 00:34:28,360 --> 00:34:31,000 >> Du flytta det igen och sedan en annan 0 fylls i. 537 00:34:31,000 --> 00:34:37,900 Så om du gör det här av 1 << I 31 platser, slut dig att få en mask 538 00:34:37,900 --> 00:34:42,550 som är 32 tecken långt, längst till vänster av vilka en är en 1, 539 00:34:42,550 --> 00:34:45,199 alla övriga som är en 0. 540 00:34:45,199 --> 00:34:50,880 Och det visar sig, som en sidoreplik, flytta ett nummer till vänster så här 541 00:34:50,880 --> 00:34:53,530 också tillfällighet, och ibland bekvämt, 542 00:34:53,530 --> 00:34:57,520 har effekten att göra vad den siffran? >> [Elev] Fördubbling det. 543 00:34:57,520 --> 00:35:00,980 Fördubbling det eftersom varje kolumn - de 1s plats, 2s plats, 4s plats, 544 00:35:00,980 --> 00:35:05,030 8s plats 16s plats - de är alla fördubbling som du går till vänster. 545 00:35:05,030 --> 00:35:09,500 Eller snarare, när du ändrar 1s du kommer att hamna fördubbla värdet av numret. 546 00:35:09,500 --> 00:35:12,070 Du kan sluta göra intressanta omvandlingar av siffror 547 00:35:12,070 --> 00:35:15,640 genom att flytta allt över på detta sätt genom befogenheter 2. 548 00:35:15,640 --> 00:35:17,150 Så hur fungerar det? 549 00:35:17,150 --> 00:35:22,580 Detta ger mig sedan en mask som är allt 0s utom en 1 i exakt den plats som jag vill ha det, 550 00:35:22,580 --> 00:35:27,920 och sedan detta uttryck, som stulits från toupper.c, 551 00:35:27,920 --> 00:35:31,770 är helt enkelt säger ta talet n som användaren skrivit in, 552 00:35:31,770 --> 00:35:34,730 "Och" den med den masken, och vad ska du bli? 553 00:35:34,730 --> 00:35:39,200 Du kommer att få en 1 om det finns en 1 i den maskerade plats, 554 00:35:39,200 --> 00:35:41,570 eller du kommer att få en 0 om det inte finns. 555 00:35:41,570 --> 00:35:44,370 Och så allt det här programmet gör effektivt är att den har en slinga, 556 00:35:44,370 --> 00:35:48,340 och det skapar en mask med en 1 hit, sedan en 1 hit, sedan en 1 hit, 557 00:35:48,340 --> 00:35:52,950 och den använder denna bitvis OCH knep att säga är det en 1 bit i användarens input här? 558 00:35:52,950 --> 00:35:59,220 >> Finns det en 1 bit i användarens input här? Och i så fall bokstavligen ut 1, annars ut 0. 559 00:35:59,220 --> 00:36:03,780 Vi gör detta med Ints bara för att det är därför vi gör 32 bitar i stället för 8, 560 00:36:03,780 --> 00:36:06,900 men vad vi har infört är då denna bitvis AND, denna bitvis OR, 561 00:36:06,900 --> 00:36:10,450 och denna vänster shift operatör, som inte ofta fruktansvärt bra, 562 00:36:10,450 --> 00:36:12,230 men det visar sig att de kan vara. 563 00:36:12,230 --> 00:36:16,560 Faktum är att om du skulle representera något som en rad Booleans 564 00:36:16,560 --> 00:36:21,260 bara för att representera sant eller falskt Anta att du vill hålla koll på huruvida 565 00:36:21,260 --> 00:36:24,630 ett rum fullt av 300 elever är närvarande, 566 00:36:24,630 --> 00:36:29,420 kan du förklara en rad storlek 300 av typ bool så att du får 300 bools, 567 00:36:29,420 --> 00:36:33,090 och du kan ställa in varje till true om någon är här och i annat fall false. 568 00:36:33,090 --> 00:36:37,550 Varför är det representationen i den datastruktur ineffektiv? 569 00:36:39,370 --> 00:36:44,800 Vad är dåligt om utformningen av den datastruktur, en uppsättning av 300 bools? 570 00:36:46,190 --> 00:36:49,600 Vad är en bool, faktiskt, under huven? 571 00:36:49,600 --> 00:36:52,310 Även detta är något som kanske inte känner till. 572 00:36:52,310 --> 00:36:53,720 Det visar sig att det inte finns någon bool. 573 00:36:53,720 --> 00:36:56,620 Kom ihåg att vi sorts skapas som med cs50.h filen, 574 00:36:56,620 --> 00:36:58,630 som i sin tur innehåller standarden bool. 575 00:36:58,630 --> 00:37:00,930 C är typ av dum, men när det kommer till bool. 576 00:37:00,930 --> 00:37:04,880 Den använder 8 bitar för att representera varje bool, vilket är helt slöseri 577 00:37:04,880 --> 00:37:09,040 eftersom det självklart, hur många bitar du behöver för att representera en bool? Bara 1. 578 00:37:09,040 --> 00:37:13,190 Så det visar sig att om du har nu möjlighet med bitvisa operatörer 579 00:37:13,190 --> 00:37:17,760 att manipulera enskilda bitar även i en röding, även i en enda byte, 580 00:37:17,760 --> 00:37:21,380 det visar sig att du kan minska det minne som krävs för att representera något dumt 581 00:37:21,380 --> 00:37:25,490 som att närvaro stylad datastruktur med en faktor 8. 582 00:37:25,490 --> 00:37:29,820 Istället för att använda åtta bitar för att representera sant eller falskt, kan du använda bokstavligen en 583 00:37:29,820 --> 00:37:34,500 genom att använda en enda byte för varje åtta elever i klassen 584 00:37:34,500 --> 00:37:41,990 och växla från 0 till 1 individuella bitar genom att använda dessa typer av lågaktivt trick. 585 00:37:43,850 --> 00:37:49,460 Det är verkligen sätta stopp för energin. Finns det några frågor om bitvisa operationer? 586 00:37:49,460 --> 00:37:52,710 >> Ja. >> [Elev] Finns det en exklusiv eller operatör? 587 00:37:52,710 --> 00:37:56,440 Ja. Det är en exklusiv eller operatör som ser ut så här, ^, morot symbolen, 588 00:37:56,440 --> 00:38:02,070 vilket betyder bara det första eller det andra sak kan vara en 1 för utgången att vara en 1. 589 00:38:02,070 --> 00:38:07,750 Det finns också en inte ~ som gör att du kan invertera en 0 till en 1 eller vice versa samt. 590 00:38:07,750 --> 00:38:11,600 Och det finns också en rätt skift operatör, >>, vilket är motsatsen till den vi såg. 591 00:38:11,600 --> 00:38:13,850 Okej. Låt oss ta saker nu till en högre nivå. 592 00:38:13,850 --> 00:38:16,770 Vi började med att tala om text och sedan komprimera den 593 00:38:16,770 --> 00:38:19,650 och representerar texten med färre antal bitar, 594 00:38:19,650 --> 00:38:22,890 Vi pratade lite om hur vi kan nu börja manipulera saker på en bitvis nivå. 595 00:38:22,890 --> 00:38:26,640 Låt oss zooma nu tillbaka 10.000 fot till representation 596 00:38:26,640 --> 00:38:29,250 av mer komplexa saker som grafik. 597 00:38:29,250 --> 00:38:32,950 Här har vi en tysk flagg, här har vi en av Frankrike. 598 00:38:32,950 --> 00:38:36,350 Dessa kan representeras i filformat du kanske vet - GIF, till exempel. 599 00:38:36,350 --> 00:38:40,030 Om du någonsin sett en bild på webben som slutar på. Gif, 600 00:38:40,030 --> 00:38:43,000 detta är en Graphics Interchange Format. 601 00:38:43,000 --> 00:38:47,530 Dessa två flaggor här sortens lämpar sig för komprimering 602 00:38:47,530 --> 00:38:52,050 för vad kanske uppenbar anledning? >> [Ohörbart elev svar] 603 00:38:52,050 --> 00:38:53,440 Det finns en hel del upprepning, eller hur? 604 00:38:53,440 --> 00:38:57,270 För att skicka Tysklands flagga, tänk på detta som en bild på skärmen 605 00:38:57,270 --> 00:38:59,030 tillbaka i dina Scratch dagar. 606 00:38:59,030 --> 00:39:02,380 Du kanske kommer ihåg att det finns enstaka bildpunkter eller prickar som utgör en bild. 607 00:39:02,380 --> 00:39:06,650 >> Det finns en hel rad av svarta prickar och en annan hel rad av svarta prickar. 608 00:39:06,650 --> 00:39:10,110 Det finns en massa rader av svarta prickar som vi kunde se om vi verkligen har zoomat in, 609 00:39:10,110 --> 00:39:13,370 ungefär som när vi zoomat in på Rob ansikte i Photoshop. 610 00:39:13,370 --> 00:39:15,500 Så snart vi fick djupare och djupare och djupare in i bilden, 611 00:39:15,500 --> 00:39:19,990 du började se pixelering, alla rutor som består hans öga i det fallet. 612 00:39:19,990 --> 00:39:24,130 Samma affär här. Om vi ​​zoomat in ganska lite, skulle du se enskilda punkter. 613 00:39:24,130 --> 00:39:27,110 Nåväl, är denna typ av slöseri bitar. 614 00:39:27,110 --> 00:39:32,120 Om en tredjedel av flaggan är svart och en tredjedel av flaggan är gul och så vidare, 615 00:39:32,120 --> 00:39:34,860 varför kan vi inte komprimera något denna flagga? 616 00:39:34,860 --> 00:39:39,560 Och även den franska flaggan kan komprimeras även om mönstret är lite annorlunda. 617 00:39:39,560 --> 00:39:44,120 Det visar sig GIF filformatet är ett förlustfritt komprimeringsformat, 618 00:39:44,120 --> 00:39:48,420 vilket innebär att du kan ta en bild som den tyska flaggan här, 619 00:39:48,420 --> 00:39:53,540 Du kan kasta bort en massa av sina bitar utan avkall på kvaliteten. 620 00:39:53,540 --> 00:39:55,340 Detta står i motsats till något liknande JPEG, 621 00:39:55,340 --> 00:39:57,050 som de flesta av oss är förmodligen mer bekant. 622 00:39:57,050 --> 00:39:59,000 Facebook bilder och Flickr foton och liknande 623 00:39:59,000 --> 00:40:02,200 är nästan alltid sparas som JPEG när de är uppladdade, 624 00:40:02,200 --> 00:40:08,100 men JPEG är en förstörande - förstörande - format där du kastar bitar 625 00:40:08,100 --> 00:40:10,430 men du kastar också bort kvalitet. 626 00:40:10,430 --> 00:40:13,890 Och så om du komprimera bilder med Photoshop eller ladda upp dem till Facebook 627 00:40:13,890 --> 00:40:15,580 eller ta dem på en riktigt skit telefon, 628 00:40:15,580 --> 00:40:19,510 du vet att bilden börjar bli mycket fläckiga och pixelated, 629 00:40:19,510 --> 00:40:22,290 och det är för att det är som komprimeras av datorn eller telefonen 630 00:40:22,290 --> 00:40:24,550 genom att bokstavligen kasta informationen bort. 631 00:40:24,550 --> 00:40:28,500 Men GIF är fantastiskt att det kan använda färre bitar än det kanske som standard 632 00:40:28,500 --> 00:40:30,750 utan att förlora någon information. 633 00:40:30,750 --> 00:40:32,410 >> Och det gör i huvudsak så som följer. 634 00:40:32,410 --> 00:40:38,740 I stället för butik i en fil som en BMP skulle en RGB trippel för svart, svart, svart, svart, 635 00:40:38,740 --> 00:40:42,570 svart, svart, svart, svart, svart, svart, svart, svart och så vidare, 636 00:40:42,570 --> 00:40:45,640 snarare är GIF kommer att säga, "Black" 637 00:40:45,640 --> 00:40:48,330 och sedan "Upprepa detta 100 gånger", eller något liknande. 638 00:40:48,330 --> 00:40:52,280 "Svart, upprepa detta 100 gånger, svart, upprepa detta 100 gånger ..." 639 00:40:52,280 --> 00:40:54,530 "Gul, upprepa detta 100 gånger." 640 00:40:54,530 --> 00:40:57,200 Och så minns i huvudsak längst till vänster pixel 641 00:40:57,200 --> 00:41:02,160 och sedan kodar något sätt begreppet upprepa denna pixel och om igen. 642 00:41:02,160 --> 00:41:06,110 Så GIF kan sedan komprimera sig utan att förlora någon information. 643 00:41:06,110 --> 00:41:09,510 Men om du skulle gissa, om det är den algoritm som GIF användning, 644 00:41:09,510 --> 00:41:13,180 vilka av dessa flaggor, även om de ser identiska i storlek, 645 00:41:13,180 --> 00:41:19,620 kommer att bli mindre när de sparas på disk som en GIF? >> [Eleven] Tyskland. 646 00:41:19,620 --> 00:41:21,660 Tyskland kommer att bli mindre? Varför? 647 00:41:21,660 --> 00:41:26,620 [Studerande] Eftersom du upprepa det många, många gånger horisontellt 648 00:41:26,620 --> 00:41:29,010 och sedan upprepa en annan tid. >> Exakt. 649 00:41:29,010 --> 00:41:32,020 Eftersom de människor som uppfann GIF bara typ av beslut godtyckligt 650 00:41:32,020 --> 00:41:36,040 att upprepningen ska överföras horisontellt och inte i sidled. 651 00:41:36,040 --> 00:41:40,900 Det finns mycket mer upprepning sidled här i den tyska flaggan än i den franska flaggan. 652 00:41:40,900 --> 00:41:44,430 Så om vi faktiskt öppnar en mapp på min hårddisk som har dessa GIF, 653 00:41:44,430 --> 00:41:51,920 Du kan faktiskt se att den tyska flaggan här är 2 kilobyte och den franska en är 4 kilobyte. 654 00:41:51,920 --> 00:41:54,080 Det råkar vara en tillfällighet att en är dubbelt den andra, 655 00:41:54,080 --> 00:41:57,960 men det är i själva verket så att den franska flaggan är mycket större. 656 00:41:57,960 --> 00:42:01,250 >> Även om vi pratar om här grafik kan samma idéer gäller 657 00:42:01,250 --> 00:42:05,150 inte saker som flaggor, men bilder som är lite mer komplicerat. 658 00:42:05,150 --> 00:42:08,170 Om du tar en bild av ett äpple, säkert finns det en hel del dubbelarbete där, 659 00:42:08,170 --> 00:42:11,040 så vi på något sätt kunde komma ihåg att standard bakgrunden är blå 660 00:42:11,040 --> 00:42:13,230 och inte, som den högra bilden visar, 661 00:42:13,230 --> 00:42:16,830 måste komma ihåg färgen på varje pixel i bilden. 662 00:42:16,830 --> 00:42:21,060 Så vi kan kasta bitar bort det utan att förlora information. 663 00:42:21,060 --> 00:42:23,340 Äpplet ser fortfarande likadant. 664 00:42:23,340 --> 00:42:27,510 I det här exemplet här, kan du se vad som händer i en film. 665 00:42:27,510 --> 00:42:31,970 Dessa representerar gamla skolan film rullar varvid i övre bilden där 666 00:42:31,970 --> 00:42:36,900 du har en RV kör förbi ett hus och ett träd. 667 00:42:36,900 --> 00:42:42,130 Och som van kör förbi från vänster till höger, vad uppenbarligen inte förändras? 668 00:42:42,130 --> 00:42:45,320 Huset kommer inte någonstans, och trädet kommer inte någonstans. 669 00:42:45,320 --> 00:42:47,700 Det enda som rör sig är van i detta fall. 670 00:42:47,700 --> 00:42:51,650 Så som bakgrund Oförändrad antyder, vad du kan göra i filmer 671 00:42:51,650 --> 00:42:56,530 är kasta liknande bara bort information som inte förändras mellan ramar. 672 00:42:56,530 --> 00:42:58,900 Detta är allmänt känt som interframe komprimering 673 00:42:58,900 --> 00:43:02,120 varigenom om denna ram ser nästan identisk med den här, 674 00:43:02,120 --> 00:43:05,390 låt oss inte fundera lagring på hårddisk någon av samma information 675 00:43:05,390 --> 00:43:09,250 på dessa mellanliggande bildrutor, låt oss bara använda nyckelbildrutor då och då 676 00:43:09,250 --> 00:43:13,420 att lagra faktiskt att informationen redundant precis som en liten sanity check. 677 00:43:13,420 --> 00:43:18,620 >> Däremot är ett annat sätt att komprimera video i detta andra och lägre exempel här, 678 00:43:18,620 --> 00:43:23,970 där i stället lagra 30 bilder, varför inte du lagrar bara 15 bildrutor per sekund i stället? 679 00:43:23,970 --> 00:43:27,070 Snarare än filmen typ av flytande vackert, perfekt, 680 00:43:27,070 --> 00:43:30,060 kan det se ut som det stamning lite, lite old school, 681 00:43:30,060 --> 00:43:37,190 men nettoeffekten är att använda mycket färre bitar än vad som annars skulle vara nödvändigt. 682 00:43:37,190 --> 00:43:39,240 Så var lämnar det då oss? 683 00:43:39,240 --> 00:43:41,700 Det var lite av en åt sidan på var annars kan du gå med kompression. 684 00:43:41,700 --> 00:43:45,140 För mer information om detta, ta en klass som CS175 här. 685 00:43:45,140 --> 00:43:46,990 Här är ett annat exempel inom video. 686 00:43:46,990 --> 00:43:49,190 Om biet är det enda röra, 687 00:43:49,190 --> 00:43:51,790 du kan verkligen kasta bort informationen i dessa mitten ramar 688 00:43:51,790 --> 00:43:55,260 eftersom blomman och himlen och lämnar inte förändras. 689 00:43:55,260 --> 00:43:57,960 Men låt oss nu betrakta en sista sak. 690 00:43:57,960 --> 00:44:03,890 Under de närmaste 5 minuter lämnar vi C efter evigt i föreläsning? Ja. Inte i psets, dock. 691 00:44:03,890 --> 00:44:10,210 Senaste berättelse om C och sedan får vi mycket sexig Stuff 692 00:44:10,210 --> 00:44:13,870 där HTML och webb-och woo-hoo. Okej. 693 00:44:13,870 --> 00:44:16,050 Nu kör vi. Det är motivationen. 694 00:44:16,050 --> 00:44:20,020 Det visar sig hela tiden när vi har skrivit program vi kör klang. 695 00:44:20,020 --> 00:44:23,890 Och klang, vi har sagt sedan den första veckan ganska mycket tar källkod 696 00:44:23,890 --> 00:44:25,740 och omvandlar den till objektkod. 697 00:44:25,740 --> 00:44:28,540 Det tar C och omvandlar den till 0 och 1. 698 00:44:28,540 --> 00:44:32,150 Jag har typ av ljugit för dig för några veckor eftersom det inte är riktigt så enkelt är det. 699 00:44:32,150 --> 00:44:36,750 >> Det finns mycket mer som händer under huven när du kör ett program som klang. 700 00:44:36,750 --> 00:44:39,560 I själva verket kan processen att sammanställa ett program verkligen sammanfattas, 701 00:44:39,560 --> 00:44:42,210 som ni kanske minns från Rob video på kompilatorer, 702 00:44:42,210 --> 00:44:47,580 i dessa 4 steg: förbehandling, sammanställa själv, montering och länkning. 703 00:44:47,580 --> 00:44:51,950 Men vi i klassen och de flesta människor i världen sammanfatta typiskt alla dessa steg 704 00:44:51,950 --> 00:44:54,410 som bara "kompilering." 705 00:44:54,410 --> 00:44:58,070 Men om vi börjar med källkod så här, minns det är kanske det enklaste C-program 706 00:44:58,070 --> 00:45:03,530 Vi har skrivit hittills, minns att när sammanställt det hamnar ser ut så här. 707 00:45:03,530 --> 00:45:07,310 Men det finns faktiskt ett mellansteg, och dessa åtgärder är följande. 708 00:45:07,310 --> 00:45:10,750 Först finns det här högst upp i detta och de flesta av våra program, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Vad ingår # göra för oss? 711 00:45:17,210 --> 00:45:24,150 Det ganska mycket kopior och pastor innehållet i stdio.h i min fil som så varför? 712 00:45:24,150 --> 00:45:27,220 Varför bryr jag mig om innehållet i stdio.h? Vad finns där av intresse? 713 00:45:27,220 --> 00:45:32,310 Printf förklaring, dess prototyp, så att kompilatorn sedan vet vad jag menar 714 00:45:32,310 --> 00:45:34,900 När jag nämner denna funktion printf. 715 00:45:34,900 --> 00:45:39,390 Så steg 1 i sammanställningen är förbehandling, där ett program som klang 716 00:45:39,390 --> 00:45:43,450 eller något hjälpprogram som klang levereras med läser din kod topp till botten, 717 00:45:43,450 --> 00:45:47,740 vänster till höger, och varje gång det ser en # symbol följs av ett sökord som inkluderar, 718 00:45:47,740 --> 00:45:53,980 den utför den operationen, kopiera och klistra in i detta fall stdio.h i filen. 719 00:45:53,980 --> 00:45:55,510 Det är steg 1. 720 00:45:55,510 --> 00:45:59,620 Då har du en mycket större C-fil på grund av den enorma kopiera, klistra in jobb som bara har hänt. 721 00:45:59,620 --> 00:46:01,710 >> Steg 2 nu sammanställer. 722 00:46:01,710 --> 00:46:04,880 Men det visar sig att sammanställa tar källkod som ser ut så här 723 00:46:04,880 --> 00:46:08,160 och omvandlar den till något som ser ut så här, 724 00:46:08,160 --> 00:46:12,560 som för dem som är bekanta heter? >> [Elev] församling. >> Assembler. 725 00:46:12,560 --> 00:46:16,700 Detta är faktiskt något om du tar CS61 du dyka in mer i detalj. 726 00:46:16,700 --> 00:46:22,380 Detta är bara ungefär så nära som du kan komma att skriva 0 och 1 själv 727 00:46:22,380 --> 00:46:25,850 men skriver saker på ett sätt som fortfarande gör åtminstone lite förnuft. 728 00:46:25,850 --> 00:46:30,760 Dessa är maskininstruktioner, och om vi bläddra ner till huvudfunktionen här, 729 00:46:30,760 --> 00:46:35,470 märker att det är denna push-instruktion, flytta instruktion, subtrahera instruktion, 730 00:46:35,470 --> 00:46:38,550 call instruktion, och så vidare. 731 00:46:38,550 --> 00:46:42,930 När du hör att datorn har Intel Inside, 732 00:46:42,930 --> 00:46:46,180 du har en Intel CPU i din Mac eller PC, vad betyder det? 733 00:46:46,180 --> 00:46:51,200 En CPU levereras byggd av företag som Intel förstå vissa instruktioner. 734 00:46:51,200 --> 00:46:55,770 De har ingen aning om vad funktioner som swap är eller huvudsakliga är i sig, 735 00:46:55,770 --> 00:47:00,060 men de vet vad mycket låg nivå instruktioner som addera, subtrahera, trycka, 736 00:47:00,060 --> 00:47:02,430 flytta, ring och så vidare är. 737 00:47:02,430 --> 00:47:06,170 Så när du kompilerar C-kod till assembler, 738 00:47:06,170 --> 00:47:11,820 din mycket användarvänlig utseende kod omvandlas till något som ser ut så här, 739 00:47:11,820 --> 00:47:21,670 som rör sig bokstavligen byte eller 4 byte runt i sådana små enheter i och ut av CPU. 740 00:47:21,670 --> 00:47:26,820 Men till slut, när klang är redo att ta denna representation av ditt program 741 00:47:26,820 --> 00:47:30,940 till 0 och 1, då steget kallas montering händer, 742 00:47:30,940 --> 00:47:33,850 och detta igen alla händer i ett ögonblick när du kör klang. 743 00:47:33,850 --> 00:47:39,300 Vi börjar här, matar den ut en fil som denna, och sedan omvandlar den till dessa 0 och 1. 744 00:47:39,300 --> 00:47:42,000 Och om du vill gå tillbaka någon gång och faktiskt se detta i handling, 745 00:47:42,000 --> 00:47:48,220 Om jag går in hello1.c--detta är en av de allra första programmen som vi tittat på - 746 00:47:48,220 --> 00:47:53,710 Normalt skulle vi sammanställa detta med klang hello1.c och detta skulle ge oss a.out. 747 00:47:53,710 --> 00:47:59,890 Om däremot du istället ge den-S flaggan, vad du får är hello1.s 748 00:47:59,890 --> 00:48:02,750 och du kommer faktiskt se assembler. 749 00:48:02,750 --> 00:48:05,750 >> Jag gör det här för en mycket kort program, men om du går tillbaka till Scramble 750 00:48:05,750 --> 00:48:08,740 eller återvinna eller något program som du har skrivit och bara av nyfikenhet 751 00:48:08,740 --> 00:48:13,240 vill se hur det faktiskt ser ut, vad som faktiskt matas in i processorn, 752 00:48:13,240 --> 00:48:15,700 Du kan använda den-S flaggan med klang. 753 00:48:15,700 --> 00:48:17,770 Men sedan slutligen, det finns fortfarande en gotcha. 754 00:48:17,770 --> 00:48:21,810 Här är de 0 och 1 som representerar min genomförandet av hej, värld. 755 00:48:21,810 --> 00:48:25,530 Men jag använde någon annans funktion i mitt program. 756 00:48:25,530 --> 00:48:28,710 Så även om processen har varit jag tar hej.c, 757 00:48:28,710 --> 00:48:34,280 det blir kompileras till assemblerkod, och sedan blir samman till 0 och 1, 758 00:48:34,280 --> 00:48:37,460 den enda 0 och 1 som matas ut vid denna tidpunkt 759 00:48:37,460 --> 00:48:40,270 är de som följer av min kod. 760 00:48:40,270 --> 00:48:44,400 Men den person som skrev printf, sammanställt de sin kod för 20 år sedan 761 00:48:44,400 --> 00:48:47,000 och det är nu installerad någonstans på apparaten, 762 00:48:47,000 --> 00:48:51,610 så vi har något att slå ihop sina 0 och 1 med min 0 och 1, 763 00:48:51,610 --> 00:48:56,160 och som leder oss till den 4: e och sista steget att sammanställa, så kallad länkning. 764 00:48:56,160 --> 00:48:58,680 Så på vänster sida har vi exakt samma bild som tidigare: 765 00:48:58,680 --> 00:49:02,580 hej.c blir assemblerkod blir 0 och 1. 766 00:49:02,580 --> 00:49:05,960 Men minns att jag använde standard I / O-bibliotek i min kod, 767 00:49:05,960 --> 00:49:10,350 och det innebär någonstans på datorn finns en fil som heter stdio.c 768 00:49:10,350 --> 00:49:13,980 eller åtminstone den kompilerade versionen eftersom detta någon några år sedan 769 00:49:13,980 --> 00:49:18,530 sammanställt stdio.c i assemblerkod och sedan en hel drös av 0 och 1. 770 00:49:18,530 --> 00:49:21,130 Detta är vad som kallas en statisk eller en dynamisk bibliotek. 771 00:49:21,130 --> 00:49:23,350 Det är lite fil sitter någonstans i apparaten. 772 00:49:23,350 --> 00:49:28,710 >> Men slutligen måste jag ta min 0 och 1 samt den personens 0 och 1 773 00:49:28,710 --> 00:49:32,760 och på något sätt koppla ihop dem, kombinera bokstavligen de 0s och 1s 774 00:49:32,760 --> 00:49:37,900 till en enda fil som heter a.out eller hello1 eller vad jag heter mitt program 775 00:49:37,900 --> 00:49:43,320 så att slutresultatet har alla 1: or och 0: or som ska komponera mitt program. 776 00:49:43,320 --> 00:49:45,660 Så hela den här tiden denna termin när du har använt klang 777 00:49:45,660 --> 00:49:48,750 och ännu mer nyligen igång göra för att köra klang, 778 00:49:48,750 --> 00:49:53,580 alla dessa steg har hänt sorts omedelbart men mycket medvetet. 779 00:49:53,580 --> 00:49:57,830 Och så om du fortsätter i datavetenskap, nämligen CS61, 780 00:49:57,830 --> 00:50:00,850 Detta är det lager som du kommer att fortsätta att skala tillbaka utanför där 781 00:50:00,850 --> 00:50:06,980 talar om effektivitet, konsekvenser säkerhet och liknande av dessa lägre nivå detaljer. 782 00:50:06,980 --> 00:50:09,220 Men med det, är vi på väg att lämna C bakom. 783 00:50:09,220 --> 00:50:11,420 Låt oss gå vidare och ta vår 5-minuters paus nu, 784 00:50:11,420 --> 00:50:14,190 och när vi kommer tillbaka: Internet. 785 00:50:17,280 --> 00:50:19,170 Okej. Vi är tillbaka. 786 00:50:19,170 --> 00:50:23,590 Nu börjar vi vår blick inte bara på HTML eftersom, som ni kommer att se, 787 00:50:23,590 --> 00:50:26,050 HTML sig är faktiskt ganska enkelt 788 00:50:26,050 --> 00:50:29,270 men egentligen på webbprogrammering mer allmänt nätverk mer allmänt, 789 00:50:29,270 --> 00:50:31,770 och hur alla dessa tekniker kommer tillsammans 790 00:50:31,770 --> 00:50:35,400 att tillåta oss att skapa mer avancerade program ovanpå Internet 791 00:50:35,400 --> 00:50:38,690 än hittills har vi kunnat under dessa svarta och vita fönster. 792 00:50:38,690 --> 00:50:42,140 Faktum är att vid denna punkt i terminen trots att vi kommer att spendera relativt sett mindre tid 793 00:50:42,140 --> 00:50:46,200 på PHP, HTML, CSS, JavaScript, SQL och mer, 794 00:50:46,200 --> 00:50:48,480 de flesta studenter gör sluta göra de slutliga projekt som är webbaserat 795 00:50:48,480 --> 00:50:51,230 för som du ser, den bakgrund du har nu i C 796 00:50:51,230 --> 00:50:54,450 är mycket för dessa högre nivå språk. 797 00:50:54,450 --> 00:50:56,800 >> Och när du börjar tänka på din slutliga projektet, 798 00:50:56,800 --> 00:50:59,940 som, ungefär som problembild 0, där du uppmuntrades 799 00:50:59,940 --> 00:51:02,160 att göra de flesta något av intresse för dig i Scratch, 800 00:51:02,160 --> 00:51:05,790 den slutgiltiga projektet är din chans att ta din nyfunna kunskap och kunniga med C 801 00:51:05,790 --> 00:51:09,850 eller PHP eller JavaScript eller liknande ut för en spin 802 00:51:09,850 --> 00:51:12,330 och skapa din egen mjukvara för världen att se. 803 00:51:12,330 --> 00:51:17,770 Och till utsäde dig med idéer, vet att du kan gå här, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Varje år, värva vi idéer från lärare och personal och grupper studerande på campus 805 00:51:21,800 --> 00:51:27,330 bara för att lämna in sina idéer för intressanta saker som kan lösas med hjälp av datorer, 806 00:51:27,330 --> 00:51:29,860 använda webbplatser, med hjälp av programvara. 807 00:51:29,860 --> 00:51:32,360 Så om du kämpar för att komma med en idé av dina egna, 808 00:51:32,360 --> 00:51:35,790 med alla medel bläddra igenom de idéer där från detta år och sista. 809 00:51:35,790 --> 00:51:39,990 Det är helt okej att ta itu med ett projekt som har tagits upp tidigare. 810 00:51:39,990 --> 00:51:44,540 Vi har sett många apps för att se status för tvätt på campus, 811 00:51:44,540 --> 00:51:47,000 många apps för att navigera i menyn matsal, 812 00:51:47,000 --> 00:51:49,540 många apps för att navigera i kurskatalogen och liknande. 813 00:51:49,540 --> 00:51:53,680 Och faktiskt, i en framtida föreläsning och i framtida seminarier, 814 00:51:53,680 --> 00:51:57,750 Vi kommer att introducera dig till några allmänt tillgängliga API: er, både kommersiellt tillgängliga 815 00:51:57,750 --> 00:52:02,520 liksom här tillgängligt från CS50 på campus så att du har tillgång till data 816 00:52:02,520 --> 00:52:04,910 och kan sedan göra intressanta saker med det. 817 00:52:04,910 --> 00:52:09,380 Så mer om slutliga projekt i ett par dagar när vi släpper specifikationen, 818 00:52:09,380 --> 00:52:12,990 men nu, vet att du kan arbeta ensam eller med en eller två vänner 819 00:52:12,990 --> 00:52:16,010 på de flesta varje projekt av intresse för dig. 820 00:52:16,010 --> 00:52:18,080 Internet. 821 00:52:18,080 --> 00:52:22,300 Du går vidare och dra ut din bärbara dator, går du till facebook.com för första gången, 822 00:52:22,300 --> 00:52:27,020 inte ha loggat in nyligen, och tryck på Enter. Vad händer egentligen? 823 00:52:27,020 --> 00:52:30,150 >> När du trycker Enter på datorn, ett helt gäng steg 824 00:52:30,150 --> 00:52:32,600 start slags magiskt händer. 825 00:52:32,600 --> 00:52:35,960 Så du här till vänster, webbserver som Facebook är här till höger, 826 00:52:35,960 --> 00:52:42,500 och på något sätt du använder detta språk som kallas HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP är inte ett programmeringsspråk. Det är mer av ett protokoll. 828 00:52:46,770 --> 00:52:52,310 Det är en uppsättning konventioner som webbläsare och webbservrar använda när förbindelse med varandra. 829 00:52:52,310 --> 00:52:54,360 Och vad det innebär är följande. 830 00:52:54,360 --> 00:52:56,790 Ungefär som i den verkliga världen, har vi dessa konventioner 831 00:52:56,790 --> 00:53:00,140 där om du uppfyller vissa människa för första gången, om du inte har något emot humoring mig här, 832 00:53:00,140 --> 00:53:03,980 Jag kanske kommer upp till dig, säg, "Hej, mitt namn är David." >> Hej, David. Mitt namn är Sammy. 833 00:53:03,980 --> 00:53:05,770 "Hej, David. Mitt namn är Sammy." 834 00:53:05,770 --> 00:53:08,310 Så nu har vi precis engagerade i denna typ av fåniga människor protokoll 835 00:53:08,310 --> 00:53:12,200 där jag har inlett protokollet har Sammy svarat, 836 00:53:12,200 --> 00:53:15,060 Vi har skakat hand, och transaktionen är klar. 837 00:53:15,060 --> 00:53:18,260 HTTP är mycket likartad i anden. 838 00:53:18,260 --> 00:53:23,350 När din webbläsare förfrågningar www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 vad din webbläsare verkligen gör är att utvidga sin hand, så att säga, 840 00:53:27,020 --> 00:53:29,960 till servern och det är skickar det ett meddelande. 841 00:53:29,960 --> 00:53:34,220 Och det budskapet är typiskt något som få - vad vill du få? - 842 00:53:34,220 --> 00:53:38,740 få mig hemsidan, som normalt betecknas med ett snedstreck i slutet av en webbadress. 843 00:53:38,740 --> 00:53:43,790 Och bara så du vet vilket språk jag talar, jag webbläsaren ska berätta 844 00:53:43,790 --> 00:53:46,930 att jag talar HTTP version 1,1, 845 00:53:46,930 --> 00:53:51,980 Och även för bra åtgärd, jag ska berätta för er att värden som jag vill hemsidan för 846 00:53:51,980 --> 00:53:54,120 är facebook.com. 847 00:53:54,120 --> 00:53:57,730 Vanligtvis en webbläsare, ovetande dig, människa, 848 00:53:57,730 --> 00:54:03,350 skickar detta meddelande över Internet när du helt enkelt skriva www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Enter, i din webbläsare. 850 00:54:05,370 --> 00:54:07,300 Och vad svarar Facebook med? 851 00:54:07,300 --> 00:54:12,540 Den svarar med något liknande som ser kryptiska detaljer men också mycket mer. 852 00:54:12,540 --> 00:54:14,310 Låt mig gå vidare till Facebooks hemsida här. 853 00:54:14,310 --> 00:54:17,480 Detta är den skärm som de flesta av oss förmodligen aldrig se om du förbli inloggad hela tiden, 854 00:54:17,480 --> 00:54:19,830 men detta är verkligen deras hemsida. 855 00:54:19,830 --> 00:54:24,150 Om vi ​​gör detta i Chrome märker att du kan dra upp dessa små snabbmenyer. 856 00:54:24,150 --> 00:54:26,980 Med hjälp av Chrome, antingen i Mac OS, Windows, Linux, eller liknande, 857 00:54:26,980 --> 00:54:31,840 Om du styr klick eller vänster klick kan du dra vanligtvis upp en meny som ser ut så här, 858 00:54:31,840 --> 00:54:35,870 där några alternativ väntar, är en av dessa View Page Source. 859 00:54:35,870 --> 00:54:39,920 Du kan också vanligtvis få dessa saker genom att gå till Visa-menyn och peta runt. 860 00:54:39,920 --> 00:54:42,750 Till exempel, här under Visa är utvecklare samma sak. 861 00:54:42,750 --> 00:54:45,780 Jag ska gå vidare och titta på View Page Source. 862 00:54:45,780 --> 00:54:50,800 Vad du ser är HTML att Mark har skrivit att representera facebook.com. 863 00:54:50,800 --> 00:54:55,910 Det är en fullständig röra här, men vi får se att detta gör lite mer känsla snart. 864 00:54:55,910 --> 00:54:59,840 Men det finns några mönster här. Låt mig rulla ner till sånt här. 865 00:54:59,840 --> 00:55:05,730 Det är svårt för en människa att läsa, men märker att det finns detta mönster av vinkelparenteser 866 00:55:05,730 --> 00:55:10,360 med sökord som alternativ sökord som värde, några noterade strängar. 867 00:55:10,360 --> 00:55:15,660 Det är där, när du registrerade dig för första gången, anges vad ditt födelseår är. 868 00:55:15,660 --> 00:55:19,020 Det rullgardinsmenyn för födelse år på något sätt kodas här 869 00:55:19,020 --> 00:55:23,870 i detta språk som kallas HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Med andra ord, när webbläsaren begär en webbsida, 871 00:55:27,730 --> 00:55:30,610 det talar denna konvention kallas HTTP. 872 00:55:30,610 --> 00:55:35,170 Men vad svarar facebook.com på denna begäran med? 873 00:55:35,170 --> 00:55:38,260 >> Den svarar med några av dessa kryptiska meddelanden, som vi ser i ett ögonblick. 874 00:55:38,260 --> 00:55:43,760 Men de flesta av dess svar är i form av HTML, HyperText Markup Language. 875 00:55:43,760 --> 00:55:47,170 Det är den faktiska språk som en webbsida skrivs. 876 00:55:47,170 --> 00:55:52,030 Och vad en webbläsare verkligen är då, vid mottagandet av något som ser ut så här, 877 00:55:52,030 --> 00:55:57,120 läser den uppifrån och ned, från vänster till höger, och varje gång det ser en av dessa vinkelparenteser 878 00:55:57,120 --> 00:56:03,370 följt av ett nyckelord som alternativ visar det sig att märkningsspråk på lämpligt sätt. 879 00:56:03,370 --> 00:56:06,820 I det här fallet skulle det visa en rullgardinsmeny år. 880 00:56:06,820 --> 00:56:09,240 Men återigen, detta är en fullständig röra att titta på. 881 00:56:09,240 --> 00:56:16,630 Detta beror inte på Facebook utvecklare manifesterar 0 för 5 för stil, till exempel. 882 00:56:16,630 --> 00:56:20,190 Detta eftersom de flesta av koden som de skriver är i själva verket skriven vackert, 883 00:56:20,190 --> 00:56:22,450 väl kommenterade, snyggt indragen, och liknande, 884 00:56:22,450 --> 00:56:26,080 men naturligtvis, datorer, webbläsare verkligen inte ge ett dugg 885 00:56:26,080 --> 00:56:27,890 om din kod är väl stil. 886 00:56:27,890 --> 00:56:33,100 Och i själva verket är det helt slöseri att träffa tabbtangenten alla dessa tider 887 00:56:33,100 --> 00:56:37,650 och att sätta kommentarer alla i hela din kod och välja riktigt beskrivande variabelnamn 888 00:56:37,650 --> 00:56:42,340 för om webbläsaren inte bryr, allt du gör i slutet av dagen slösa byte. 889 00:56:42,340 --> 00:56:46,660 >> Så det visar sig vad de flesta webbplatser gör är trots att källkoden för facebook.com, 890 00:56:46,660 --> 00:56:49,550 för cs50.net och alla dessa andra webbplatser på Internet 891 00:56:49,550 --> 00:56:53,730 vanligtvis välskrivet och väl kommenterade och snyggt indragen och liknande, 892 00:56:53,730 --> 00:56:59,270 vanligtvis innan webbplatsen läggs ut på Internet, är koden minified, 893 00:56:59,270 --> 00:57:02,970 varigenom HTML och CSS - något annat vi snart se - 894 00:57:02,970 --> 00:57:05,960 JavaScript-koden kommer vi snart att se komprimeras, 895 00:57:05,960 --> 00:57:09,250 varigenom långa variabelnamn blir X och Y och Z, 896 00:57:09,250 --> 00:57:13,900 och allt detta blanktecken som gör allt ser så läsbar som alla kastas bort, 897 00:57:13,900 --> 00:57:17,700 för om man tänker på det här sättet, får Facebook en miljard sida träffar en dag - 898 00:57:17,700 --> 00:57:21,670 något galet som det - så tänk om en programmerare bara för att vara anal 899 00:57:21,670 --> 00:57:26,660 slå på mellanslag en extra tid bara för att strecksatsen någon kodrad någonsin så mycket mer? 900 00:57:26,660 --> 00:57:29,500 Vad är innebörden om Facebook bevarar att whitespace 901 00:57:29,500 --> 00:57:32,880 i alla byte de skickar tillbaka till människor på Internet? 902 00:57:32,880 --> 00:57:36,400 Att slå mellanslagstangenten när ger dig en extra byte i filen. 903 00:57:36,400 --> 00:57:39,730 Och om en miljard människor går sedan att ladda hemsidan den dagen, 904 00:57:39,730 --> 00:57:42,060 hur mycket mer data har du överförs via Internet? 905 00:57:42,060 --> 00:57:45,200 En gigabyte utan anledning. 906 00:57:45,200 --> 00:57:48,510 Och beviljas för en hel del webbplatser är detta inte en så skalbar fråga, 907 00:57:48,510 --> 00:57:51,030 men för Facebook, för Google, för några av de mest populära webbplatserna 908 00:57:51,030 --> 00:57:54,860 Det finns bra incitament ekonomiskt att göra din kod ser ut som en enda röra 909 00:57:54,860 --> 00:57:58,980 så att du använder så få byte som möjligt förutom att sedan pressas det 910 00:57:58,980 --> 00:58:01,500 med något som zip, som kallas en algoritm gzip, 911 00:58:01,500 --> 00:58:04,250 att webbläsaren gör för dig automatiskt. Men detta är hemskt. 912 00:58:04,250 --> 00:58:08,060 Vi kommer aldrig lära sig något om andra människors hemsidor och hur man designar webbsidor 913 00:58:08,060 --> 00:58:09,680 om vi måste titta på det så här. 914 00:58:09,680 --> 00:58:13,620 >> Så lyckligtvis webbläsare som Chrome och IE och Firefox dessa dagar 915 00:58:13,620 --> 00:58:16,450 vanligtvis kommer med inbyggd utvecklingsverktyg. 916 00:58:16,450 --> 00:58:21,730 Faktum är att om jag går ner hit för att inspektera Element eller om jag går till Visa, utvecklare, 917 00:58:21,730 --> 00:58:25,220 och gå till Utvecklarverktyg uttryckligen, 918 00:58:25,220 --> 00:58:27,640 detta fönster längst ned på min skärm dyker nu upp. 919 00:58:27,640 --> 00:58:31,230 Det är lite skrämmande i början eftersom det finns en hel del obekanta flikar här, 920 00:58:31,230 --> 00:58:34,510 men om jag klickar på Elements hela vägen längst ned till vänster, 921 00:58:34,510 --> 00:58:38,810 Krom är uppenbarligen ganska smart. Den vet hur man ska tolka allt detta kod. 922 00:58:38,810 --> 00:58:42,320 Och så vad Chrome gör det rensar upp alla Facebook HTML. 923 00:58:42,320 --> 00:58:45,680 Även om det inte finns blanksteg där, det finns inte indrag där, 924 00:58:45,680 --> 00:58:51,120 Nu märker att jag kan börja navigera denna webbsida desto mer hierarkiskt. 925 00:58:51,120 --> 00:58:56,910 Det visar sig att varje webbsida skriven på ett språk som kallas HTML5 bör börja med detta, 926 00:58:56,910 --> 00:59:03,980 denna DOCTYPE-deklaration, så att säga: 927 00:59:03,980 --> 00:59:07,840 Det är typ av ljus och grå där, men det är den allra första kodrad i den här filen, 928 00:59:07,840 --> 00:59:12,080 och det säger bara webbläsaren, "Hej, här kommer lite HTML5. Här kommer en webbsida." 929 00:59:12,080 --> 00:59:18,490 Den första öppna konsolen utöver det råkar vara här, en öppen konsol HTML-tagg, 930 00:59:18,490 --> 00:59:22,320 och sedan om jag dyka i djupare - dessa pilar är helt meningslös; 931 00:59:22,320 --> 00:59:25,140 de bara för presentation skull, de är faktiskt inte i filen - 932 00:59:25,140 --> 00:59:30,300 märka att insidan av Facebooks HTML-tagg, något som börjar med en öppen konsol 933 00:59:30,300 --> 00:59:32,910 och sedan har ett ord kallas en tagg. 934 00:59:32,910 --> 00:59:38,610 Så inne i HTML-taggen är tydligen ett huvud tagg och en body-taggen. 935 00:59:38,610 --> 00:59:41,930 Inuti huvudet taggen är nu en hel röra för Facebook 936 00:59:41,930 --> 00:59:45,620 eftersom de har en hel del metadata och andra saker för marknadsföring och reklam. 937 00:59:45,620 --> 00:59:50,600 >> Men om vi bläddra ner, ner, ner, ner, låt oss se var den är. Här är det. 938 00:59:50,600 --> 00:59:52,210 Detta är åtminstone något bekant. 939 00:59:52,210 --> 00:59:55,990 Titeln på Facebooks hemsida, om du någonsin tittar i fliken i din namnlisten, 940 00:59:55,990 --> 00:59:59,060 är Välkommen till Facebook - Logga in, Registrera dig eller Läs mer. 941 00:59:59,060 --> 01:00:01,110 Det är vad du skulle se i Chrome namnlist, 942 01:00:01,110 --> 01:00:03,100 och det är hur det representeras i koden. 943 01:00:03,100 --> 01:00:08,090 Om vi ​​struntar i allting annat i huvudet, de flesta av tarmar av en webbsida är i kroppen, 944 01:00:08,090 --> 01:00:10,940 och det visar sig att Facebook kod kommer att se mer komplexa 945 01:00:10,940 --> 01:00:14,540 än de flesta saker vi ska skriva en början bara för att det är byggts upp under årens lopp, 946 01:00:14,540 --> 01:00:17,260 men det finns en hel del script-taggar, JavaScript-kod, 947 01:00:17,260 --> 01:00:18,870 som gör webbplatsen mycket interaktiv: 948 01:00:18,870 --> 01:00:22,330 se statusuppdateringar omedelbart med språk som JavaScript. 949 01:00:22,330 --> 01:00:25,270 Det är något som kallas en div, som är en division av en sida. 950 01:00:25,270 --> 01:00:27,940 Men innan vi kommer till den detaljen, låt oss försöka att zooma ut 951 01:00:27,940 --> 01:00:31,920 och titta på en enklare version av Facebook 1,0, så att säga. 952 01:00:31,920 --> 01:00:34,740 Här är det hej, värld av webbsidor. 953 01:00:34,740 --> 01:00:37,370 Det har att DOCTYPE-deklaration högst upp 954 01:00:37,370 --> 01:00:40,280 som är lite annorlunda från allt annat. 955 01:00:40,280 --> 01:00:46,130 Inget annat vi skriver på en webbsida kommer att börja med 01:00:48,880 och med undantag för något som kallas kommentarer i HTML. 957 01:00:48,880 --> 01:00:53,000 Men för det mesta, allt på en webbsida öppen konsol, sökord, nära fästet. 958 01:00:53,000 --> 01:00:56,220 >> I det här fallet kan du se den enklaste av webbsidor möjligt. 959 01:00:56,220 --> 01:01:00,260 HTML-taggen innehåller ett huvud-tagg och den innehåller en body-taggen, 960 01:01:00,260 --> 01:01:04,580 men märker att det finns denna föreställning om att starta och stoppa taggar. 961 01:01:04,580 --> 01:01:11,360 Detta är starttaggen för HTML, är detta nära taggen eller sluttagg. 962 01:01:11,360 --> 01:01:15,400 Lägg märke till att de är typ av motsatser i den meningen att den nära taggen eller sluttagg 963 01:01:15,400 --> 01:01:20,030 har slash fram detta inuti sig själv. 964 01:01:20,030 --> 01:01:23,540 Samtidigt finns det en öppen huvud tagg här och en nära huvudet tagg här. 965 01:01:23,540 --> 01:01:26,880 >> Det finns en öppen titel och en nära titel tagg här. 966 01:01:26,880 --> 01:01:29,850 Det faktum att jag har lagt titeln på en rad, helt godtyckligt. 967 01:01:29,850 --> 01:01:33,760 Det såg ut precis som det skulle passa fint på en linje, så jag inte bry slå in ett par gånger. 968 01:01:33,760 --> 01:01:38,200 Under tiden kroppen jag strecksats bara vara aldrig så klart. 969 01:01:38,200 --> 01:01:41,050 Observera att HTML är en ganska dum språk. 970 01:01:41,050 --> 01:01:43,410 Faktum tillbaka i dag innan det fanns WYSIWYG-redigerare 971 01:01:43,410 --> 01:01:46,770 och Microsoft Word där du kan säga, "Gör detta djärva, gör detta kursiv," 972 01:01:46,770 --> 01:01:50,850 skulle du faktiskt skriver lite kommandon i essäer 20 + år sedan 973 01:01:50,850 --> 01:01:55,740 där du skulle säga, "Börja göra denna text fet. Sluta göra denna text fet." 974 01:01:55,740 --> 01:01:59,010 "Börja göra denna text kursiv stil. Sluta göra denna text kursiv stil." 975 01:01:59,010 --> 01:02:01,850 >> Det är vad HTML eller något Markup Language är. 976 01:02:01,850 --> 01:02:05,530 Denna första taggen säger, "Hej, webbläsare. Här kommer lite HTML." 977 01:02:05,530 --> 01:02:09,880 Nästa taggen säger: "Hej, webbläsare. Här kommer huvudet, huvudet på min hemsida." 978 01:02:09,880 --> 01:02:11,650 "Hej, kommer webbläsaren. Här titeln." 979 01:02:11,650 --> 01:02:15,880 Och sedan över här, "Hej, webbläsare. Det var allt för titeln." 980 01:02:15,880 --> 01:02:20,000 Så detta är hur webbläsare känner inte längre visa fler tecken än hej, värld 981 01:02:20,000 --> 01:02:21,860 i namnlisten. 982 01:02:21,860 --> 01:02:23,640 Samtidigt detta säger: "Det är det för huvudet." 983 01:02:23,640 --> 01:02:28,340 Det säger, "Här kommer kroppen Här är själva kroppen." - Bokstavligen, orden hej, världen. 984 01:02:28,340 --> 01:02:33,190 Och detta säger här: "Det är det för kroppen. Det var allt för HTML." 985 01:02:33,190 --> 01:02:34,640 Så webbläsare är ganska dumt. 986 01:02:34,640 --> 01:02:39,920 De läser bara det här uppifrån och ned, från vänster till höger, och göra precis vad de blir tillsagda att göra. 987 01:02:39,920 --> 01:02:41,860 Låt oss faktiskt göra lite exempel här. 988 01:02:41,860 --> 01:02:46,240 Låt mig öppna upp den enklaste av program på min Mac här, nämligen Textredigerare. 989 01:02:46,240 --> 01:02:48,220 I Windows kan du använda Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Men detta är allt du behöver för att börja göra webbsidor. 991 01:02:50,520 --> 01:02:53,730 Jag ska gå vidare och bara kopiera och klistra in den här koden i denna fil. 992 01:02:53,730 --> 01:02:57,210 Jag ska gå vidare och spara den på skrivbordet, 993 01:02:57,210 --> 01:03:01,220 och jag kommer att spara som hello.html, 994 01:03:01,220 --> 01:03:03,840 och nu filen heter hello.html. 995 01:03:03,840 --> 01:03:05,690 Här är det på mitt skrivbord. 996 01:03:05,690 --> 01:03:11,130 Låt mig nu gå in i en webbläsare och dra filen i webbläsaren. 997 01:03:11,130 --> 01:03:14,060 Och voila, här är min allra första hemsida. 998 01:03:14,060 --> 01:03:17,340 Observera att titeln på fliken hej, världen enligt rubriktaggen, 999 01:03:17,340 --> 01:03:20,040 och märker att hej, är världens i huvudtexten på min webbsida, 1000 01:03:20,040 --> 01:03:22,190 och woo-hoo, jag på Internet. 1001 01:03:22,190 --> 01:03:24,700 >> Jag är inte riktigt, rätt, för den här filen är inte på Internet. 1002 01:03:24,700 --> 01:03:28,330 Det råkar vara på min lokala hårddisk på just vägen. 1003 01:03:28,330 --> 01:03:32,720 Men tanken är densamma. Allt vi behöver nu är en webbserver som att ladda upp den. 1004 01:03:32,720 --> 01:03:37,410 Men först ska vi faktiskt införa lite mer komplexitet och lite mer stilisering. 1005 01:03:37,410 --> 01:03:39,890 Detta är en enkel, om tråkig, webbsida. 1006 01:03:39,890 --> 01:03:41,990 Det visar sig att det finns andra typer av taggar vi kan använda. 1007 01:03:41,990 --> 01:03:45,530 Till exempel, här i gult har jag infört 2 nya taggar. 1008 01:03:45,530 --> 01:03:49,630 Vi kommer inte att spela mycket med dessa idag, men märker att länken taggen 1009 01:03:49,630 --> 01:03:52,520 på något sätt ser annorlunda från allt annat. 1010 01:03:52,520 --> 01:03:55,370 Länken Taggen tar så kallade attribut, 1011 01:03:55,370 --> 01:03:59,770 och ett attribut är något som förändrar beteendet hos en tagg. 1012 01:03:59,770 --> 01:04:03,840 I det här fallet är inte det bästa valet av namn, länk, eftersom det är typ av meningslöst, 1013 01:04:03,840 --> 01:04:11,590 men den här länken tagg säger i huvudsak inkludera filen som heter styles.css insidan av min hemsida. 1014 01:04:11,590 --> 01:04:15,400 Du kan tänka på detta som analogt med C: s direktivet # include. 1015 01:04:15,400 --> 01:04:19,650 Styles.css hänvisar till ett annat språk helt och hållet att vi inte kommer att spela med i dag, 1016 01:04:19,650 --> 01:04:23,790 men det är för estetik: teckenstorlekar, färger, stoppning, indrag, marginaler, 1017 01:04:23,790 --> 01:04:26,040 och alla den typen av estetik detaljer. 1018 01:04:26,040 --> 01:04:28,820 Samtidigt är skripttagg funktionellt likartade, 1019 01:04:28,820 --> 01:04:33,140 men i stället inkluderar CSS att språket innehåller den ett annat språk, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Så med andra ord, med dessa 2 taggar jag kommer så småningom att kunna skriva min egen hemsida 1021 01:04:37,810 --> 01:04:41,490 men också dra in kod som jag eller någon annan har skrivit 1022 01:04:41,490 --> 01:04:44,350 så att vi kan stå på andras axlar, kan vi öva god design, 1023 01:04:44,350 --> 01:04:46,120 factoring ut gemensam kod. 1024 01:04:46,120 --> 01:04:49,090 Om jag har 10 olika webbsidor, innebär detta att en del av mina estetik 1025 01:04:49,090 --> 01:04:52,490 kan vägas ut, ungefär som # include, i en separat fil. 1026 01:04:52,490 --> 01:04:54,420 Så vi komma dit. 1027 01:04:54,420 --> 01:04:57,180 Men låt oss faktiskt först göra något mer intressant med denna fil. 1028 01:04:57,180 --> 01:05:01,110 >> Återigen, detta är bara Textredigeraren. Jag är inte tekniskt på internet ännu, men vi kommer dit. 1029 01:05:01,110 --> 01:05:04,910 Jag skulle vilja göra hej, världen lite djärvare än det är. 1030 01:05:04,910 --> 01:05:10,890 Så hej, låt oss godtyckligt säga för fet. 1031 01:05:10,890 --> 01:05:15,910 Återigen är historien densamma: hej, komma, börja göra denna djärva, 1032 01:05:15,910 --> 01:05:19,730 då världen blir tryckt i fetstil, och detta innebär inte vill skriva ut detta i fetstil. 1033 01:05:19,730 --> 01:05:24,020 Låt mig gå vidare och spara min fil, gå tillbaka till Chrome, jag zooma in bara så vi kan se det bättre, 1034 01:05:24,020 --> 01:05:27,870 och ladda, och du kommer att se att världen är nu i fetstil. 1035 01:05:27,870 --> 01:05:31,810 Webben handlar om hyperlänkar, så låt oss gå vidare och göra detta: 1036 01:05:31,810 --> 01:05:38,550 Min favorit hemsida är, låt oss säga, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Spara, ladda om. Okej. Det finns ett par problem nu förutom OHYGGLIGHET av webbplatsen. 1038 01:05:43,810 --> 01:05:47,310 1, jag är ganska säker på att jag slog in här. Och det gjorde jag. 1039 01:05:47,310 --> 01:05:51,590 Jag inte bara trycka Enter, jag också indragen, öva vad vi har predikat om stil, 1040 01:05:51,590 --> 01:05:54,930 men min är rätt bredvid värld. 1041 01:05:54,930 --> 01:05:58,410 Så varför är det här? Webbläsare gör bara vad du säger till dem att göra. 1042 01:05:58,410 --> 01:06:04,010 Jag har inte berättat webbläsaren "Break linjer här. Sätt punkt paus här." 1043 01:06:04,010 --> 01:06:07,820 Så webbläsaren spelar det ingen roll om jag slår tillbaka 30 gånger, 1044 01:06:07,820 --> 01:06:10,820 det fortfarande kommer att sätta min rätt bredvid värld. 1045 01:06:10,820 --> 01:06:15,930 Vad jag verkligen måste göra här är att säga något i stil med
, infoga en radbrytning. 1046 01:06:15,930 --> 01:06:17,940 >> Och faktiskt är en radbrytning slags konstig sak 1047 01:06:17,940 --> 01:06:21,650 eftersom du inte kan verkligen börja flytta till en annan linje, och sedan göra något, 1048 01:06:21,650 --> 01:06:25,380 och sedan sluta flytta till en ny rad. Det är typ av en atomär operation. 1049 01:06:25,380 --> 01:06:28,140 Du antingen göra det eller inte. Du trycker på Retur eller inte. 1050 01:06:28,140 --> 01:06:33,390 Så br är lite av en annan etikett, så jag behöver sortera i både öppna och stänga den 1051 01:06:33,390 --> 01:06:35,230 allt på en gång. 1052 01:06:35,230 --> 01:06:37,500 Syntaxen för det är det. 1053 01:06:37,500 --> 01:06:41,760 Tekniskt sett kan du göra något liknande i vissa versioner av HTML, 1054 01:06:41,760 --> 01:06:45,600 men detta är bara dumt eftersom det finns ingen anledning att starta och stoppa något 1055 01:06:45,600 --> 01:06:48,420 om du kan istället göra allt på en gång. 1056 01:06:48,420 --> 01:06:52,310 Inse att HTML5 inte strikt kräver detta snedstreck, 1057 01:06:52,310 --> 01:06:55,410 så kommer du att se läroböcker och onlinematerial som inte har det, 1058 01:06:55,410 --> 01:06:59,780 men för bra åtgärd vi öva symmetri som vi har sett hittills. 1059 01:06:59,780 --> 01:07:02,870 Detta innebär att etiketten är både öppnas och stängs. 1060 01:07:02,870 --> 01:07:05,220 Så nu vill jag spara min fil, gå tillbaka hit. 1061 01:07:05,220 --> 01:07:10,240 Okej, så det börjar se bättre ut, förutom på webben jag känner är typ av klickbar, 1062 01:07:10,240 --> 01:07:13,610 och ändå youtube här verkar inte leda till någonting. 1063 01:07:13,610 --> 01:07:17,560 Det beror även om det ser ut som en länk, vet webbläsaren inte att i sig, 1064 01:07:17,560 --> 01:07:20,670 så jag måste tala om för webbläsaren att detta är en länk. 1065 01:07:20,670 --> 01:07:22,620 >> Sättet att göra detta är att använda ett ankare 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 och låt mig flytta till en ny linje bara så det är lite mer lättläst, 1069 01:07:38,490 --> 01:07:40,060 och jag ska krympa teckenstorlek. 1070 01:07:40,060 --> 01:07:43,890 Jag gjort ännu? Nej, det kommer att bli denna dikotomi. 1071 01:07:43,890 --> 01:07:46,760 Denna tagg, ankaret taggen, tar verkligen ett attribut, 1072 01:07:46,760 --> 01:07:52,900 som modifierar sitt beteende och värdet av detta attribut är tydligen YouTube URL. 1073 01:07:52,900 --> 01:07:56,380 Men märker dikotomin är att bara för att det är den URL som du ska, 1074 01:07:56,380 --> 01:08:01,020 det betyder inte det måste vara det ord som du understryker och göra en länk. 1075 01:08:01,020 --> 01:08:03,960 Snarare kan det vara något sånt här. 1076 01:08:03,960 --> 01:08:10,870 Så jag måste säga sluta göra detta ord en hyperlänk med hjälp av nära ankartaggen. 1077 01:08:10,870 --> 01:08:12,650 Notera att jag inte gör det här. 1078 01:08:12,650 --> 01:08:15,890 1, skulle detta vara bara ett slöseri med allas tid och det är inte nödvändigt. 1079 01:08:15,890 --> 01:08:19,290 >> För att stänga en tagg, nämner du bara namnet på taggen igen. 1080 01:08:19,290 --> 01:08:21,800 Du nämner inte något av de attribut. 1081 01:08:21,800 --> 01:08:26,189 Så låt oss rädda, gå tillbaka. Okej, voila, nu är det blå och hyperlänkad. 1082 01:08:26,189 --> 01:08:29,430 Om jag klickar på den, jag faktiskt gå till YouTube. 1083 01:08:29,430 --> 01:08:32,529 Så även om min webbsida är inte på Internet, är det minst HTML, 1084 01:08:32,529 --> 01:08:37,930 och om vi låter Internet ikapp, skulle vi hamna faktiskt upp här på youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Och jag kan gå tillbaka och här är min hemsida. Men märker detta. 1086 01:08:40,670 --> 01:08:43,120 Om du någonsin fått skräppost eller lösenordsfiske, 1087 01:08:43,120 --> 01:08:45,850 nu har du möjlighet efter bara fem minuter att göra detsamma. 1088 01:08:45,850 --> 01:08:50,920 Vi kan gå hit och göra något liknande www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 eller vad det skissartade webbplats är, och sedan kan du säga verifiera ditt PayPal-konto. 1090 01:08:59,319 --> 01:09:04,840 [Skratt] Och nu detta kommer att gå till badguy.com, som jag inte tänker klicka på 1091 01:09:04,840 --> 01:09:08,000 eftersom jag har ingen aning om var det leder. [Skratt] 1092 01:09:08,000 --> 01:09:10,859 >> Men vi har nu möjlighet att faktiskt hamna där. 1093 01:09:10,859 --> 01:09:12,640 Så vi egentligen bara börjat skrapa på ytan. 1094 01:09:12,640 --> 01:09:15,830 Vi är inte programmering i sig, vi skriver märkspråk. 1095 01:09:15,830 --> 01:09:18,569 Men så snart vi spetsa vårt ordförråd i HTML, 1096 01:09:18,569 --> 01:09:21,520 Vi ska presentera PHP, en verklig programmeringsspråk 1097 01:09:21,520 --> 01:09:26,859 som ger oss möjlighet att generera HTML automatiskt generera CSS automatiskt, 1098 01:09:26,859 --> 01:09:29,430 så att vi kan börja på onsdag för att genomföra, säger 1099 01:09:29,430 --> 01:09:31,700 vår egen sökmotor och mycket mer. 1100 01:09:31,700 --> 01:09:34,770 Men mer om det i ett par dagar. Vi ses då. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]