1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Semana 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Harvard University] 3 00:00:04,730 --> 00:00:07,490 [Esta é CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Todo ben. Benvido de volta. Este é CS50, e este é o inicio da semana 7. 5 00:00:12,280 --> 00:00:14,690 Un par de pequenos anuncios: 6 00:00:14,690 --> 00:00:18,150 Pset5 está en marcha, ou en breve será, 7 00:00:18,150 --> 00:00:21,590 e deixe-me dicir, moi sincero, este tende a estar entre os máis reto 8 00:00:21,590 --> 00:00:24,460 de conxuntos do curso de problema, entón deixe-me falar iso agora 9 00:00:24,460 --> 00:00:28,190 de xeito que esta semana máis que nunca que non espera ata que, digamos, na noite do mércores 10 00:00:28,190 --> 00:00:29,920 ou xoves á noite para mergullo dentro 11 00:00:29,920 --> 00:00:32,369 Esta é sempre unha pset interesante. Nós pensamos que é divertido. 12 00:00:32,369 --> 00:00:36,110 Se realmente obtelo totalmente correcta e pode, entón, desafiar o Consello chamados grandes, 13 00:00:36,110 --> 00:00:39,830 vai ter a oportunidade de combinar intelixencia con algúns dos funcionarios do curso 14 00:00:39,830 --> 00:00:41,620 e algúns dos seus compañeiros de clase. 15 00:00:41,620 --> 00:00:44,670 O que o Big Board, é unha vez que ten o seu traballo corrector ortográfico, 16 00:00:44,670 --> 00:00:48,860 será capaz de ir cs50.net despois da execución dun comando, 17 00:00:48,860 --> 00:00:52,430 puramente optar, a continuación, a cantidade de tempo e cantidade de RAM e máis 18 00:00:52,430 --> 00:00:56,130 que usou na súa implementación serán expostos aquí na páxina do curso casa. 19 00:00:56,130 --> 00:00:59,740 Vostede vai entender que unha morea desas persoas aquí están listados como equipo 20 00:00:59,740 --> 00:01:04,220 desde o fin de semana, o equipo penso que sería divertido tentar superar uns ós outros. 21 00:01:04,220 --> 00:01:07,390 Entón entender que o obxectivo aquí non é superar o persoal. 22 00:01:07,390 --> 00:01:09,790 Aínda que eu só estou aquí, no número 13. 23 00:01:09,790 --> 00:01:13,790 Puramente optar, pero é unha oportunidade para ver o quão pouca memoria RAM 24 00:01:13,790 --> 00:01:16,790 e como algúns segundos de CPU pode usar vis-a-vis algúns dos seus compañeiros de clase. 25 00:01:16,790 --> 00:01:20,540 >> E eu vou admitir que Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 actualmente na posición número 1 como un dos TFS, 27 00:01:23,750 --> 00:01:28,120 Esta é unha implementación que non chaman posible 28 00:01:28,120 --> 00:01:32,700 unha vez que está a usar case 0 RAM e case 0 segundo a carga. 29 00:01:32,700 --> 00:01:35,670 Entón, imos coidar de Kevin desactivada. [Risas] 30 00:01:35,670 --> 00:01:40,950 Hai certas habilidades que Kevin está poñendo a proba aquí. 31 00:01:40,950 --> 00:01:45,280 Unha das cousas que nós pensamos en facer tamén é agora CS50x é unha semana en curso, 32 00:01:45,280 --> 00:01:49,520 e vostedes son tanto unha parte dese experimento como estes estudantes son. 33 00:01:49,520 --> 00:01:53,720 Pedimo lles como parte da súa pset0, que foi tamén a presentar un proxecto Scratch 34 00:01:53,720 --> 00:01:58,280 de interese para eles - un xogo, unha peza interactiva de arte, unha animación ou similar - 35 00:01:58,280 --> 00:02:03,700 1 - vídeo de dous minutos, se quere, dicindo Hola para o mundo e que elas realmente son. 36 00:02:03,700 --> 00:02:06,780 Eu penso que eu ía compartir con vostede só un par de vídeos que foron presentados ata agora 37 00:02:06,780 --> 00:02:10,759 porque para nós, no equipo, polo menos, realmente foi emocionante 38 00:02:10,759 --> 00:02:14,220 e inspirado ver estas persoas de todo o mundo - países de todo o mundo - 39 00:02:14,220 --> 00:02:18,160 acorde, de todas as cousas, para un curso de ciencia da computación na Internet, 40 00:02:18,160 --> 00:02:20,410 se é porque eles queren continuar os seus estudos, 41 00:02:20,410 --> 00:02:22,300 eles queren tomar as súas carreiras nunha nova dirección, 42 00:02:22,300 --> 00:02:24,390 eles queren cubrir as lagoas no seu coñecemento, 43 00:02:24,390 --> 00:02:27,190 polo tanto, algunhas das mesmas razóns que vostedes quizais teñan sido aquí. 44 00:02:27,190 --> 00:02:31,090 >> Entón, eu darlle un tal estudante aquí. Vostede podería aumentar o volume un pouco. 45 00:02:31,090 --> 00:02:35,520 Aquí está un dos nosos alumnos de 1 minuto submissões. 46 00:02:35,520 --> 00:02:40,380 Ola, mundo. Eu son un estudante de enxeñería industrial aquí en Málaga, España. 47 00:02:40,380 --> 00:02:45,840 Estou animado con este curso en liña, porque eu amo a ciencia da computación, realmente facer, 48 00:02:45,840 --> 00:02:48,880 e eu realmente aprecio que eu comezar a explorar lo. 49 00:02:48,880 --> 00:02:51,940 E o feito de que eu poida aprender o mesmo de todos vostedes fan 50 00:02:51,940 --> 00:02:57,040 pero, en vez de estar en Harvard estou en Málaga, como impresionante é isto? 51 00:02:57,040 --> 00:03:02,040 Ben, eu son Fernando, e este é o CS50. Vexo vostedes. 52 00:03:02,040 --> 00:03:07,100 [Risas] Outro clip que nos gusta moito, vai considerar que este cabaleiro inglés non é tan forte. 53 00:03:07,100 --> 00:03:11,520 Parece que tiña unha tradución automática, polo que as traducións son un pouco imperfecto, 54 00:03:11,520 --> 00:03:15,790 pero este foi un dos nosos favoritos ata agora, tamén. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Ola, mundo. [Falando en xaponés] 57 00:03:32,370 --> 00:03:39,830 [Eu teño que cumprimentar en xaponés, porque o meu inglés é moi fiable.] 58 00:03:39,830 --> 00:03:45,380 [Eu entreguei a mensaxe para ti da cidade de Gifu, no Xapón]. 59 00:03:45,380 --> 00:03:49,820 [I pode ser un estudante, por primeira vez en 20 anos, como se pode ver.] 60 00:03:49,820 --> 00:03:54,640 [Eu son moi grata a Universidade de Harvard, que me deu a oportunidade e EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf é un guitarra e miña cousa favorita en execución.] [Risas] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Por que pensas que eu estaba tentando asistir a unha cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Universidade de Harvard, é o meu desexo.] 65 00:04:14,990 --> 00:04:19,740 [Especialmente se son presenza distante viviu no Xapón]. 66 00:04:19,740 --> 00:04:26,680 [Eu quería probar de inmediato coñecemento da existencia de tal cando EDX.] 67 00:04:26,680 --> 00:04:32,500 [Non pensa que non relacionado coa idade do aprendizaxe I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 é o meu desexo. O meu nome é Kazu, e este é o CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [aplausos e aplausos] 70 00:04:43,090 --> 00:04:49,220 Outro favorito do noso foi esta submisión aquí de alguén. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google se non estás familiarizado con ese meme. 72 00:04:55,380 --> 00:05:01,480 >> E entón, finalmente, un par de outros que foi publicado que, quizais, gañar o premio encantador. 73 00:05:01,480 --> 00:05:06,820 [Estudantes] Aww! >> [Malan] Nós imos ter que escoitar. Esta é curto, para escoitar de preto. 74 00:05:08,580 --> 00:05:11,150 [Orador feminino] Cal é o seu nome? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Orador feminino] O que é isto? >> [Risas] CS50. [Risas] 76 00:05:16,120 --> 00:05:19,510 [Malan] El fixo dous takes, con todo. 77 00:05:19,510 --> 00:05:22,240 Aquí imos nós, última. 78 00:05:23,030 --> 00:05:26,980 O meu nome é Louie, e este é o CS50. 79 00:05:26,980 --> 00:05:30,250 [Risas] Iso, entón, é CS50x. 80 00:05:30,250 --> 00:05:33,230 Grazas a todos os que a continuación xunto na casa 81 00:05:33,230 --> 00:05:35,620 que foron, ata agora, que participa. 82 00:05:35,620 --> 00:05:39,510 Hoxe, podemos concluír nosa discusión de estruturas de datos, 83 00:05:39,510 --> 00:05:41,160 polo menos, algúns dos máis fundamental, 84 00:05:41,160 --> 00:05:44,760 e despois seguimos a nosa conversa sobre HTML e programación web. 85 00:05:44,760 --> 00:05:48,520 En realidade, pasamos o pasado preto de sete semanas buscando nos fundamentos da programación - 86 00:05:48,520 --> 00:05:50,450 algoritmos, estruturas de datos, e outros semellantes - 87 00:05:50,450 --> 00:05:53,050 e C, como pode ter probado ata agora, 88 00:05:53,050 --> 00:05:57,060 non é necesariamente o máis accesible de linguas 89 00:05:57,060 --> 00:05:59,090 que a execución de algunhas desas ideas. 90 00:05:59,090 --> 00:06:01,880 E así dende esta semana e na próxima semana e entón o seguinte, 91 00:06:01,880 --> 00:06:07,110 imos finalmente ser capaz de transición a partir de C, a cal é xeralmente coñecida como unha lingua relativamente baixo nivel, 92 00:06:07,110 --> 00:06:11,190 para cousas de máis alto nivel, entre eles PHP, Javascript, e similares, 93 00:06:11,190 --> 00:06:14,850 que veremos aproveitar as mesmas leccións que aprendemos ao longo das últimas semanas, 94 00:06:14,850 --> 00:06:19,430 pero vai descubrir que declarar as cousas como matrices e táboas hash e investigación e clasificación 95 00:06:19,430 --> 00:06:23,370 tornar-se moito máis fácil, porque os idiomas propios imos comezar a usar 96 00:06:23,370 --> 00:06:25,290 vai facer máis poderoso. 97 00:06:25,290 --> 00:06:27,410 Pero, primeiro, unha proposta de árbores. 98 00:06:27,410 --> 00:06:30,240 É moi común nos días de hoxe a necesidade de comprimir información. 99 00:06:30,240 --> 00:06:34,770 En que contexto queres comprimir algún tipo de información dixital? 100 00:06:37,190 --> 00:06:39,670 >> Si >> [Alumno] Cando precisa envialo a través de Internet. 101 00:06:39,670 --> 00:06:41,450 Si, cando quere enviar algo a web. 102 00:06:41,450 --> 00:06:44,950 Se desexa facer a descarga dun arquivo grande, é ideal se alguén do outro lado 103 00:06:44,950 --> 00:06:48,760 comprimiu o ficheiro usando un formato zip ou algo parecido 104 00:06:48,760 --> 00:06:53,760 de xeito que está enviando menos bits do que podería ser transmitidos. 105 00:06:53,760 --> 00:06:55,500 Así como comprimir información? 106 00:06:55,500 --> 00:07:00,540 Todo se reduce a usar menos bits que son esixidos por defecto. 107 00:07:00,540 --> 00:07:03,220 Pero este é un tipo de cousa curiosa, porque pensa que volve a 0 e 1 semana 108 00:07:03,220 --> 00:07:07,370 Cando falamos sobre ASCII e binario e nós conversas sobre ASCII en particular 109 00:07:07,370 --> 00:07:10,690 como a utilización de 8 bits para representar as letras do alfabeto 110 00:07:10,690 --> 00:07:16,120 de xeito que a letra A está representada por 65, minúsculas a é o número 97, 111 00:07:16,120 --> 00:07:21,210 e con todo vostede representar o 65 ou 97, está a usar 7 ou 8 bits. 112 00:07:21,210 --> 00:07:24,120 Pero o problema é que hai algunhas letras no alfabeto inglés 113 00:07:24,120 --> 00:07:26,230 que non son tan populares como os outros. 114 00:07:26,230 --> 00:07:31,600 Z non é todo o que popular, Q non é todo o que popular, pero A e E son super popular. 115 00:07:31,600 --> 00:07:37,280 E aínda para todas estas cartas, por defecto, o mundo usa o mesmo número de bits, de só 8. 116 00:07:37,280 --> 00:07:42,690 Polo tanto, non sería máis intelixente, en vez de usar 8 bits para cada letra, 117 00:07:42,690 --> 00:07:47,440 mesmo o máis pouco usado como Q e Z, 118 00:07:47,440 --> 00:07:51,910 o que se usássemos menos bits para A e E e S e as letras máis populares 119 00:07:51,910 --> 00:07:55,000 e usados ​​máis bits para as letras menos populares, 120 00:07:55,000 --> 00:07:57,770 a idea é optimizar imos para o caso común, 121 00:07:57,770 --> 00:08:01,160 que é un tema en ciencia da computación de intentar optimizar o que vai ocorrer máis 122 00:08:01,160 --> 00:08:05,310 e pasar un pouco máis de tempo, un pouco máis de espazo para as cousas que, si, pode ocorrer 123 00:08:05,310 --> 00:08:07,680 pero non necesariamente con tanta frecuencia. 124 00:08:07,680 --> 00:08:09,330 Entón, imos dar un exemplo. 125 00:08:09,330 --> 00:08:12,610 >> Supoña que queremos codificar a información bastante eficiente. 126 00:08:12,610 --> 00:08:15,090 Pode crecer sabendo un pouco sobre o código Morse, 127 00:08:15,090 --> 00:08:17,450 e as probabilidades son que non sabía o código real, 128 00:08:17,450 --> 00:08:21,750 pero ten que se lembrar que é, polo menos, esta serie de puntos e trazos. 129 00:08:21,750 --> 00:08:26,640 Esta é unha codificación moi eficiente, e observe que a carta do máis popular - por exemplo, e - 130 00:08:26,640 --> 00:08:28,980 utiliza a máis curta de sinais sonoros. 131 00:08:28,980 --> 00:08:31,740 O código Morse é todo sobre bip-bip-bip-bip-bip-bip e seguro tons 132 00:08:31,740 --> 00:08:34,799 ou por curtos períodos de tempo, ou períodos de tempo longos. 133 00:08:34,799 --> 00:08:40,330 E, tal como indica o punto, é un sinal de super curta, só bip, e iso representaría E. 134 00:08:40,330 --> 00:08:43,960 En contraste, T sería un bip longo, como bip [prolóngase son] 135 00:08:43,960 --> 00:08:45,710 e que representaría T. 136 00:08:45,710 --> 00:08:48,840 Pero iso aínda é moi curto, porque, por outra banda, se ollar para Z, 137 00:08:48,840 --> 00:08:52,690 para expresar Z ía beep, beep [máis son], beep, beep [son máis curta]. 138 00:08:52,690 --> 00:08:55,360 Entón, é máis porque é menos común. 139 00:08:55,360 --> 00:08:58,150 Pero a pegadinha aquí é que o código Morse é un pouco fallou 140 00:08:58,150 --> 00:09:00,610 en que non é inmediatamente decodable. 141 00:09:00,610 --> 00:09:07,350 Por exemplo, supoñamos que oe algún fin do bip fío [curto] beep [longa]. 142 00:09:07,350 --> 00:09:12,480 Cal é a mensaxe que eu acaba de recibir? Un punto e un guión. O que isto supón? 143 00:09:12,480 --> 00:09:15,330 [Estudante] A. >> [Malan] Quizais. 144 00:09:15,330 --> 00:09:18,270 Tamén podería ser seguido por T. 145 00:09:18,270 --> 00:09:23,390 Noutras palabras, o código Morse, aínda aproveita este principio de optimizar o proceso de canto, 146 00:09:23,390 --> 00:09:26,250 non se presta a desencriptación inmediato. 147 00:09:26,250 --> 00:09:29,850 É dicir, o ser humano que está escoitando ou recibir estes puntos e trazos 148 00:09:29,850 --> 00:09:34,540 ten de algunha maneira descubrir onde os intervalos son entre as letras, 149 00:09:34,540 --> 00:09:39,660 porque se non sabe onde as quebras son, pode confundir un para ET ou viceversa. 150 00:09:39,660 --> 00:09:43,880 >> Entón, o que podería facer? En código Morse que podería só facer unha pausa entre cada unha das letras. 151 00:09:43,880 --> 00:09:47,660 Pero a pausa é unha especie de contador para o punto de acelerar as cousas. 152 00:09:47,660 --> 00:09:52,880 Entón, o que en vez diso, veu con un código onde non había esa situación malo 153 00:09:52,880 --> 00:09:56,570 en que E é un prefixo, por exemplo, de A - 154 00:09:56,570 --> 00:10:00,020 noutras palabras, se puidésemos estar seguro de que os patróns son aínda pouco para as letras populares 155 00:10:00,020 --> 00:10:04,850 tempo para as letras menos populares, pero non hai confusión posible? 156 00:10:04,850 --> 00:10:08,930 Un home co nome de Huffman anos inventou ese esquema chamado de código de Huffman 157 00:10:08,930 --> 00:10:12,390 que realmente aproveita unha das estruturas de datos que pasamos un pouco de tempo a falar sobre 158 00:10:12,390 --> 00:10:16,560 a semana pasada, que de árbores, árbores binarias especificamente - 159 00:10:16,560 --> 00:10:19,710 un significado árbore binaria que non ten máis que dous nenos. 160 00:10:19,710 --> 00:10:22,720 Ten quizais un fillo esquerdo, quizais un neno dereita, e é iso. 161 00:10:22,720 --> 00:10:26,510 Entón supoño que só por unha cuestión de debate que alguén queira enviar unha mensaxe 162 00:10:26,510 --> 00:10:31,270 que se parece con isto. É un completo disparate, pero é composto de As, BS, CS, DS e es. 163 00:10:31,270 --> 00:10:34,890 E se realmente contar a todos os As, BS, CS, DS e Es 164 00:10:34,890 --> 00:10:36,870 e despois dividir polo número total de letras, 165 00:10:36,870 --> 00:10:42,710 este cadro pouco aquí di que o 45% das cartas son Es, o 20% son como, 166 00:10:42,710 --> 00:10:45,010 10% BS, e así por diante. 167 00:10:45,010 --> 00:10:47,330 Polo tanto, noutras palabras, asumir que a cadea alí 168 00:10:47,330 --> 00:10:49,080 é só unha mensaxe que quere enviar. 169 00:10:49,080 --> 00:10:52,180 El pasa a ser un disparate só así podemos utilizar como letras como sexa posible, 170 00:10:52,180 --> 00:10:55,220 pero é verdade que permanece é o máis popular, 171 00:10:55,220 --> 00:11:01,450 e B e C son as menos populares, polo menos, unha destas 5 letras do alfabeto. 172 00:11:01,450 --> 00:11:04,040 Entón, como podemos ir en chegar cunha codificación, 173 00:11:04,040 --> 00:11:08,430 unha codificación binaria, un patrón de 0 e 1 para cada unha desas cartas 174 00:11:08,430 --> 00:11:14,820 de tal xeito que E é un estándar de curto e quizais B e C son patróns lixeiramente máis longos, 175 00:11:14,820 --> 00:11:19,270 de novo, a idea de que queremos usar menos bits maior parte do tempo 176 00:11:19,270 --> 00:11:21,790 e máis bits só de cando en vez. 177 00:11:21,790 --> 00:11:26,070 De acordo co código de Huffman, podes crear un bosque de árbores. 178 00:11:26,070 --> 00:11:31,190 Hai unha especie de unha historia aquí que implica árbores e tamén o proceso de construción de los. 179 00:11:31,190 --> 00:11:32,420 Imos comezar. 180 00:11:32,420 --> 00:11:36,140 >> Propoño que comece con esta fraga, por así dicir, de 5 árbores, 181 00:11:36,140 --> 00:11:38,260 cada un dos cales é unha árbore moi estúpido. 182 00:11:38,260 --> 00:11:42,800 A árbore está composto por só un único nodo, coma representado aquí por un círculo. 183 00:11:42,800 --> 00:11:45,310 Así, cada unha desas cousas pode ser un struct C 184 00:11:45,310 --> 00:11:50,200 e dentro da estrutura C pode ser un float representando a conta de frecuencia 185 00:11:50,200 --> 00:11:52,510 e despois quizais un char que representa a letra. 186 00:11:52,510 --> 00:11:56,470 Entón, creo que un deses nós como só struct C calquera idade, pero, por agora, de nivel superior. 187 00:11:56,470 --> 00:12:01,230 Esta é unha selva de 5 árbores, cada un dos que só teñen un único nodo. 188 00:12:01,230 --> 00:12:06,830 O Huffman proposta é que comezamos a combinar esas árbores 189 00:12:06,830 --> 00:12:11,140 que teñen as menores contas de frecuencia un pouco maior en árbores 190 00:12:11,140 --> 00:12:13,490 ligando-os con un nodo raíz nova. 191 00:12:13,490 --> 00:12:17,560 Así, entre as letras aquí, observe que, por conveniencia eu clasificados los de esquerda a dereita, 192 00:12:17,560 --> 00:12:21,420 a pesar de que non é estrictamente necesario, e observe que os menores nós 193 00:12:21,420 --> 00:12:23,930 son actualmente o 10% e 10%. 194 00:12:23,930 --> 00:12:28,940 Entón Huffman propuxo que mesturar estas dúas menores nós nunha nova árbore 195 00:12:28,940 --> 00:12:34,450 pola introdución dun novo nodo pai e despois dar ese pai dun neno esquerdo e un dereito do neno 196 00:12:34,450 --> 00:12:37,720 onde B é arbitrariamente a esquerda e C é arbitrariamente a dereita. 197 00:12:37,720 --> 00:12:41,590 E entón Huffman aínda proposto que imos agora só de pensar no fillo esquerdo 198 00:12:41,590 --> 00:12:44,790 nunha desas árbores sempre como representado por 0 199 00:12:44,790 --> 00:12:47,890 e do dereito do neno sempre como representado polo número 1. 200 00:12:47,890 --> 00:12:50,680 >> Non importa se lanza-los, sempre que é consistente. 201 00:12:50,680 --> 00:12:54,650 Polo tanto, agora temos catro árbores no bosque. 202 00:12:54,650 --> 00:12:58,050 E digo catro porque agora a árbore á esquerda - 203 00:12:58,050 --> 00:13:00,570 e non é tanto unha árbore no sentido de que ela medra deste xeito, 204 00:13:00,570 --> 00:13:05,170 é máis como unha árbore de familia onde agora o 0.2 é unha especie de pai dos dous fillos - 205 00:13:05,170 --> 00:13:07,930 conta que, no que pai temos deseñado 0,2. 206 00:13:07,930 --> 00:13:13,370 Nós engadimos a conta de frecuencia dos dous fillos e dado o novo nodo a suma total. 207 00:13:13,370 --> 00:13:15,310 Entón agora só repetir ese proceso. 208 00:13:15,310 --> 00:13:19,490 Atopar as dúas menores nós e despois uni-los nunha nova árbore 209 00:13:19,490 --> 00:13:21,380 e repita o proceso aínda máis. 210 00:13:21,380 --> 00:13:26,390 Agora temos algúns candidatos, 20%, 15%, e outros 20%. 211 00:13:26,390 --> 00:13:29,780 Neste caso, temos que romper o empate. Podemos facelo de forma arbitraria. 212 00:13:29,780 --> 00:13:31,540 Debemos facelo só de forma consistente. 213 00:13:31,540 --> 00:13:33,760 Neste caso, eu vou arbitrariamente ir co outro á esquerda, 214 00:13:33,760 --> 00:13:39,880 e eu agora fusionar o 20% e os 15% para me dar un novo pai chamou 35%, 215 00:13:39,880 --> 00:13:46,310 cuxo esquerda neno é 0, cuxo dereito é un neno, e agora temos tres árbores no bosque. 216 00:13:46,310 --> 00:13:47,960 Podes, se cadra, ver onde iso vai dar. 217 00:13:47,960 --> 00:13:51,150 Se repetirmos esta máis algunhas veces, nós imos ter só unha árbore grande, 218 00:13:51,150 --> 00:13:53,900 todos cuxas beiras están rotulados coa 0s e 1s. 219 00:13:53,900 --> 00:13:55,710 Imos facelo de novo. 220 00:13:55,710 --> 00:14:02,600 35% é a raíz que árbore. 20% e 45%, polo que estamos indo a mesturar a 35% e 20%. 221 00:14:02,600 --> 00:14:05,610 Agora temos esa árbore aquí. Nós engadimos os xuntos, temos 55%. 222 00:14:05,610 --> 00:14:07,910 Agora só hai dúas árbores no bosque. 223 00:14:07,910 --> 00:14:11,900 Facemos isto unha última vez, e espero que matematicamente todas as frecuencias suman 224 00:14:11,900 --> 00:14:15,570 porque eles deben xa que calculados a partir da-go de sumar o 100%. 225 00:14:15,570 --> 00:14:17,960 E agora temos unha árbore. 226 00:14:17,960 --> 00:14:20,580 Polo tanto, esta é unha árbore de Huffman codificación. 227 00:14:20,580 --> 00:14:24,400 É o tipo de tardou un pouco para chegar alí verbalmente, pero a realidade é un loop 228 00:14:24,400 --> 00:14:27,620 ou cunha función recursiva, pode construír esta cousa moi rápido. 229 00:14:27,620 --> 00:14:32,440 Polo tanto, agora temos un novo nodo, e todos estes nós internos foron malloc'd, 230 00:14:32,440 --> 00:14:34,690 presuntamente, ao longo do camiño. 231 00:14:34,690 --> 00:14:38,650 Entón agora, na parte superior desta árbore temos o 100%, pero agora conta que temos un camiño 232 00:14:38,650 --> 00:14:43,780 desta nova gran-gran-gran-avó para todas as gran-gran-gran-netos 233 00:14:43,780 --> 00:14:45,930 todo o camiño para o fondo, para todas as follas. 234 00:14:45,930 --> 00:14:52,840 >> O que imos facer agora é propoñer que, a fin de representar a letra E, 235 00:14:52,840 --> 00:14:55,670 simplemente usar o número 1. Por que? 236 00:14:55,670 --> 00:15:01,000 Porque se cruzar esta árbore a partir da raíz final ata a folla coñecido como E, 237 00:15:01,000 --> 00:15:06,050 seguimos só a punta, a bordo da dereita, e que é rotulado de curso superior en dereito 1. 238 00:15:06,050 --> 00:15:11,550 Así, a implicación aquí para Huffman foi que a codificación e en binario debe ser só unha. 239 00:15:11,550 --> 00:15:14,490 E iso é moi moi eficiente. Non pode realmente ficar menor do que iso. 240 00:15:14,490 --> 00:15:18,350 En cambio, un vai ser representado, se seguir a lóxica, 241 00:15:18,350 --> 00:15:21,610 por que patrón de bits en vez? 01. 242 00:15:21,610 --> 00:15:25,500 Así, para obter a A, comezamos na raíz e vaia á esquerda e despois vaia á dereita, 243 00:15:25,500 --> 00:15:28,580 o que significa que seguiu a 0 e, a continuación, un 1. 244 00:15:28,580 --> 00:15:32,810 Así, deberán representar a letra A co estándar 0 e 1. 245 00:15:32,810 --> 00:15:36,010 E agora entende que xa temos unha propiedade de desencriptación inmediata 246 00:15:36,010 --> 00:15:38,090 que nós non temos en código Morse. 247 00:15:38,090 --> 00:15:42,840 Aínda que ambos os estándares son bastante curto - E un pouco, un é de 2 bits - 248 00:15:42,840 --> 00:15:45,080 conta que non poden ser confundidas un ou o outro, 249 00:15:45,080 --> 00:15:54,870 porque se ve un un que ten que ser un E, se ves un 0, un 1 é, obviamente, ten que ser un A. 250 00:15:54,870 --> 00:15:58,410 Do mesmo xeito, o que hai de D? 001. 251 00:15:58,410 --> 00:16:01,440 ¿Que é C? 0001. 252 00:16:01,440 --> 00:16:05,320 E o que é B? 0000. 253 00:16:05,320 --> 00:16:09,550 E, de novo, porque todas as cartas que preocupan son as follas 254 00:16:09,550 --> 00:16:13,890 e ningún deles son unha especie de intermediarios no camiño da raíz ata a folla, 255 00:16:13,890 --> 00:16:18,760 non hai risco de confundir codificacións dúas letras 'diferentes 256 00:16:18,760 --> 00:16:22,300 porque todos eses patróns de bits son deterministas. 257 00:16:22,300 --> 00:16:25,280 0000 será sempre B. 258 00:16:25,280 --> 00:16:29,480 Non hai no nalgún lugar entre o que pode confundir unha carta para o outro. 259 00:16:29,480 --> 00:16:31,150 Entón, cal é a implicación aquí? 260 00:16:31,150 --> 00:16:35,080 >> A carta máis popular - neste caso é - quedou máis curto de codificación, 261 00:16:35,080 --> 00:16:37,430 Un quedou a codificación máis baixo seguinte, 262 00:16:37,430 --> 00:16:41,390 e B e C, que xa sabía do tipo get-go foron dos menos populares 263 00:16:41,390 --> 00:16:45,390 a frecuencia do 10% cada un, eles obtiveron o maior codificación. 264 00:16:45,390 --> 00:16:49,410 E entón o que isto significa que agora é que se quere enviar unha mensaxe de que é comprimido 265 00:16:49,410 --> 00:16:51,950 a través de Internet ou por correo electrónico ou semellante, 266 00:16:51,950 --> 00:16:56,730 en vez de usar ASCII estándar, pode enviar unha mensaxe codificada Huffman 267 00:16:56,730 --> 00:17:01,720 a través do cal se pretende enviar a letra E, envía un único bit. 268 00:17:01,720 --> 00:17:05,680 Se queres enviar un A, envía 2 bits, 01, en vez de enviar 8 bits 269 00:17:05,680 --> 00:17:10,190 seguidos de máis 8 bits seguidos por máis 8 bits e así por diante. 270 00:17:10,190 --> 00:17:11,940 Pero hai unha pegadinha aquí. 271 00:17:11,940 --> 00:17:17,079 Non é suficiente só para construír esta árbore e, a continuación, iniciar o envío de Alicia para Bob 272 00:17:17,079 --> 00:17:20,010 o estándar máis curto pouco, cadea de ASCII, 273 00:17:20,010 --> 00:17:23,140 Alicia tamén porque ten que saber Bob daquilo 274 00:17:23,140 --> 00:17:26,880 Bob vai ser capaz de ler a súa mensaxe comprimido? 275 00:17:26,880 --> 00:17:30,770 [Resposta do alumno inaudível] >> ¿Que é iso? 276 00:17:30,770 --> 00:17:32,310 [Resposta do alumno inaudível] >> de que a árbore é. 277 00:17:32,310 --> 00:17:35,160 Ou aínda máis especificamente, o que estas codificacións son, 278 00:17:35,160 --> 00:17:39,010 especialmente porque durante esta historia que fixo un xuízo nun punto. 279 00:17:39,010 --> 00:17:43,640 Lembre que tivemos que elixir arbitrariamente entre os dous diferentes nós do 20%? 280 00:17:43,640 --> 00:17:49,800 Polo tanto, non é o caso de que Bob, o destinatario, pode só reconstruír a árbore na súa propia 281 00:17:49,800 --> 00:17:53,390 porque quizais el vai crear a árbore levemente diferente de Alicia. 282 00:17:53,390 --> 00:17:56,670 Ademais, Bob aínda non sabe o que a mensaxe orixinal é 283 00:17:56,670 --> 00:18:00,770 porque o único que Alicia está enviándolle, por suposto, é a mensaxe de comprimidos. 284 00:18:00,770 --> 00:18:05,900 >> Así, a captura con compresión coma este é que, si, Alicia pode gardar un monte de bits 285 00:18:05,900 --> 00:18:09,900 enviando 1 a E e 01 para A e así por diante, 286 00:18:09,900 --> 00:18:15,180 pero ela tamén ten que saber o que Bob é o mapeamento entre as letras e os bits 287 00:18:15,180 --> 00:18:19,620 porque non pode confiar en só claramente ASCII máis se non estamos usando ASCII. 288 00:18:19,620 --> 00:18:22,200 Entón, ela pode enviarlle a árbore de algunha maneira - 289 00:18:22,200 --> 00:18:26,600 anota-la, garde-como datos binarios, ou algo así - 290 00:18:26,600 --> 00:18:30,280 ou só enviar-lle unha folla de fraude pouco, un arquivo de Excel, que mostra os mapeamento. 291 00:18:30,280 --> 00:18:36,480 Así, a eficacia de compresión realmente asume que as mensaxes que está enviando 292 00:18:36,480 --> 00:18:40,230 son moi grandes, polo menos, de medio porte, 293 00:18:40,230 --> 00:18:42,180 porque se está enviando unha mensaxe super curto, 294 00:18:42,180 --> 00:18:45,390 se quere só para enviar a mensaxe BAD, que pasa a ser unha palabra que pode significar aquí, 295 00:18:45,390 --> 00:18:49,550 B-A-D, probablemente vai usar menos bits, 296 00:18:49,550 --> 00:18:53,130 pero o problema é se tamén ten que saber Bob o que a árbore é 297 00:18:53,130 --> 00:18:57,530 ou o que estas codificacións son, vai probablemente superan todas as economías 298 00:18:57,530 --> 00:19:00,110 de ter as cousas comprimido para comezar. 299 00:19:00,110 --> 00:19:02,210 Entón pode realmente ser o caso de que se tentar comprimir 300 00:19:02,210 --> 00:19:05,330 mesmo con algo formatos zip ou arquivo que pode estar familiarizado co - 301 00:19:05,330 --> 00:19:07,780 arquivos moi pequenos, incluso arquivos baleiros - 302 00:19:07,780 --> 00:19:10,930 ás veces, estes arquivos poden ser maior e non menor. 303 00:19:10,930 --> 00:19:14,320 Pero, realista, o que pasa só para arquivos pequenos, 304 00:19:14,320 --> 00:19:16,920 por iso non vai facer que un arquivo Gigabyte ser de 2 gigabytes; 305 00:19:16,920 --> 00:19:19,480 estamos realmente fala máis ou só un par de kilobytes. 306 00:19:19,480 --> 00:19:22,330 >> Algúns programas como zip son intelixentes o suficiente para entender que, 307 00:19:22,330 --> 00:19:24,590 "Vai gastar máis bits comprimir iso." 308 00:19:24,590 --> 00:19:27,460 "Deixe-me incomoda comprimi-lo para ti en todo." 309 00:19:27,460 --> 00:19:30,160 Polo tanto, esta é só unha forma de comprimir a continuación, formato de texto. 310 00:19:30,160 --> 00:19:32,300 Nós poderiamos aplicar algo así en C. 311 00:19:32,300 --> 00:19:35,370 Por exemplo, aquí é como podemos representar un nó na árbore 312 00:19:35,370 --> 00:19:39,320 onde temos un char para o símbolo, un valor flotante para a frecuencia, 313 00:19:39,320 --> 00:19:42,250 e, como vimos cos nosos estruturas de datos, outros dous punteiros, 314 00:19:42,250 --> 00:19:47,080 1 para o fillo esquerdo, un á dereita, sendo que ambos poden ser NULL, 315 00:19:47,080 --> 00:19:50,850 pero se non, el se refire a un neno esquerdo e un dereito do neno. 316 00:19:50,850 --> 00:19:55,130 Polo tanto, este é, entón, Huffman, e é unha maneira que pode ir sobre a comprimir información, 317 00:19:55,130 --> 00:19:57,880 e é certamente un dos máis fáciles de aplicar 318 00:19:57,880 --> 00:20:00,830 no contexto, por exemplo, as estruturas de datos da última semana, 319 00:20:00,830 --> 00:20:03,250 aínda mesmo algoritmos máis sofisticados existir 320 00:20:03,250 --> 00:20:08,220 que poden facer mutacións aínda máis sofisticadas dos seus datos. 321 00:20:08,220 --> 00:20:11,640 Algunha preguntas, entón en árbores, árbores binarias, ou compresión de texto? 322 00:20:11,640 --> 00:20:15,590 [Estudante] Existe algunha ambigüidade, como dividir [inaudível] o 01, 323 00:20:15,590 --> 00:20:19,160 entón 011 sería ambiguo, non? 324 00:20:19,160 --> 00:20:22,730 [Inaudível] >> Boa pregunta. Ambigüidade. 325 00:20:22,730 --> 00:20:25,940 Deixe-me resumir referíndose a este cadro aquí. 326 00:20:25,940 --> 00:20:29,650 Como os caracteres que está comprimindo, as representacións de, 327 00:20:29,650 --> 00:20:32,850 por definición deste algoritmo permanecer sempre as follas, 328 00:20:32,850 --> 00:20:41,870 nunca vai utilizar accidentalmente o mesmo patrón de bits para o prefixo de varias letras. 329 00:20:41,870 --> 00:20:46,740 Polo tanto, noutras palabras, está preocupado, parece que, dunha ambigüidade que proviña 330 00:20:46,740 --> 00:20:51,580 en que 001 pode ser o inicio de B ou o inicio de C ou algo así. 331 00:20:51,580 --> 00:20:56,780 Pero iso non pode ser o caso porque aviso de que todas as letras do alfabeto que está codificando 332 00:20:56,780 --> 00:20:58,290 son as follas. 333 00:20:58,290 --> 00:21:01,910 >> A ambigüidade só pode xurdir, como no caso do código Morse, 334 00:21:01,910 --> 00:21:06,770 se, por exemplo, C estaba en algún lugar ao longo do camiño da raíz ata B. 335 00:21:06,770 --> 00:21:12,290 [Estudante] Dereito. Así, neste caso, por exemplo un ten 2 follas. Diga >> A ten - Indicar iso de novo. 336 00:21:12,290 --> 00:21:18,760 [Estudante] Indicar A ten dúas follas, F e G, e entón g - >> Certo. Pero non pode. 337 00:21:18,760 --> 00:21:23,230 A ti non podería ter follas F e G, porque esas letras F e G 338 00:21:23,230 --> 00:21:27,560 elas propias ser deixa lugar á esquerda ou á dereita B de E. 339 00:21:27,560 --> 00:21:28,900 Así, por definición, estes deben ser follas. 340 00:21:28,900 --> 00:21:32,940 Se non, está absolutamente correcto, non resolvemos o problema que enfronta o código Morse. 341 00:21:32,940 --> 00:21:38,150 Boa pregunta. Outras preguntas? Todo ben. 342 00:21:38,150 --> 00:21:42,050 Esta noción de bits, verifícase que xa tiña poder todo o tempo que non temos realmente usado 343 00:21:42,050 --> 00:21:44,200 cando se trataba de manipular eses 0s e 1s. 344 00:21:44,200 --> 00:21:46,600 Preguntas sobre iso nun dos conxuntos máis antigos problemas: 345 00:21:46,600 --> 00:21:52,340 ou sexa, como vai facer sobre a conversión de maiúsculas a minúsculas e viceversa? 346 00:21:52,340 --> 00:21:55,460 Ou, máis concretamente, un deses serie de exercicios primeiro preguntou 347 00:21:55,460 --> 00:22:01,090 cantos bits realmente ten que virar a fin de cambiar un en minúscula unha ou viceversa? 348 00:22:01,090 --> 00:22:05,580 Aquí está un recordatorio rápido que 65 e 97 parece en binario. 349 00:22:05,580 --> 00:22:08,060 E aínda que esa pregunta ten a sorte de desvaneceu na súa memoria, 350 00:22:08,060 --> 00:22:11,290 podes ver de novo aquí que cantos bits ten que ser invertida 351 00:22:11,290 --> 00:22:15,810 para cambiar maiúsculo para minúsculas unha? Só un. 352 00:22:15,810 --> 00:22:19,650 >> Eles só difiren nun único lugar, o terceiro bit desde a esquerda. 353 00:22:19,650 --> 00:22:24,240 Considerando a ten un 010, un pouco un 011. 354 00:22:24,240 --> 00:22:26,250 Entón, dalgunha forma, necesitamos só ser capaz de virar ese bocado, 355 00:22:26,250 --> 00:22:29,410 e entón podemos capitalizar ou minúsculas. 356 00:22:29,410 --> 00:22:32,720 Nós fixemos iso no pasado usando efectivamente, se as condicións 357 00:22:32,720 --> 00:22:35,930 e comprobar que a letra está entre capitais A e Z capital, 358 00:22:35,930 --> 00:22:41,480 a continuación, saídas como a - a + 26 ou algo así. 359 00:22:41,480 --> 00:22:46,130 Probablemente fixo un cambio de aritmética para as letras do alfabeto. 360 00:22:46,130 --> 00:22:49,270 Pero o que si puidésemos virar que un único bit? 361 00:22:49,270 --> 00:22:59,080 Como podería ir sobre a toma de vale un byte de 8 bits, así como anacos 01000001 e 01100001? 362 00:22:59,080 --> 00:23:03,170 Se tivese os patróns de bits, como podemos ir sobre o cambio de só un deles? 363 00:23:03,170 --> 00:23:07,610 O que se presentar en amarelo Velaí outro patrón de bits? 364 00:23:07,610 --> 00:23:13,420 Se eu fai toda a 0s cordas amarela excepto para o pouco que quero cambiar 365 00:23:13,420 --> 00:23:17,900 e entón eu introducir un novo operador coñecido como un operador bit a bit - 366 00:23:17,900 --> 00:23:21,210 bit a bit, no sentido de que opera en anacos individuais, 367 00:23:21,210 --> 00:23:25,360 non sobre un byte completo ou catro bytes dunha soa vez. 368 00:23:25,360 --> 00:23:31,170 Esta barra vertical alí en amarelo suxire que o que se tomamos a representación do capital dunha 369 00:23:31,170 --> 00:23:37,060 e bits a bit OR-lo con a secuencia de bits amarelo? 370 00:23:37,060 --> 00:23:41,300 Noutras palabras, creo que volver á nosa discusión de expresións booleanas en scratch e despois en C. 371 00:23:41,300 --> 00:23:47,520 >> Facendo un booleano ou significa que, para ser certo, ou o primeiro que ten que ser feito 372 00:23:47,520 --> 00:23:50,700 ou a segunda cousa que ten que ser certo ou ambos teñen que ser verdade, 373 00:23:50,700 --> 00:23:53,270 e, a continuación, o produto resultante é, en si certa. 374 00:23:53,270 --> 00:24:00,230 Neste caso aquí, que é o que imos chegar, se tomamos 0 "ou" ed con 0? Falsa ou falsa? 375 00:24:00,230 --> 00:24:04,280 Aínda é falso, entón a unha minúscula permanece como o esperado. 376 00:24:04,280 --> 00:24:07,540 E se en vez diso, facer 1 ou 0? 377 00:24:07,540 --> 00:24:12,640 Este agora queda 1, pero entender o que está a ocorrer aquí. 378 00:24:12,640 --> 00:24:18,630 Se comezar con A maiúsculo e seguimos a "ou" os seus bits individuais como estamos facendo aquí, 379 00:24:18,630 --> 00:24:25,180 0 ou amarelo nos dá o que aquí? Isto dá-nos unha. 380 00:24:25,180 --> 00:24:35,120 De feito, supoña que non sabía o que a versión en maiúsculas pouco un realmente era. 381 00:24:35,120 --> 00:24:38,270 Imos facelo. Deixe-me pasar esta de volta aquí. 382 00:24:38,270 --> 00:24:42,340 Imos facer iso de novo. 0 ou 0 dáme 0. 383 00:24:42,340 --> 00:24:45,020 1 ou 0 dáme un. 384 00:24:45,020 --> 00:24:48,020 0 ou 1 me dá 1. 385 00:24:48,020 --> 00:24:52,880 0 ou 0 dáme 0. O seguinte é 0, a próxima é de 0, o seguinte é 0. 386 00:24:52,880 --> 00:24:55,660 1 ou 0 dáme un. 387 00:24:55,660 --> 00:24:59,140 E por iso mesmo que nós non sabiamos de antemán o que era un minúsculas, 388 00:24:59,140 --> 00:25:04,770 simplemente por "ou" ing A este patrón de bits que temos aquí presentados en amarelo, 389 00:25:04,770 --> 00:25:09,400 pode minúsculas un capital Un virando o bit. 390 00:25:09,400 --> 00:25:11,580 Usan esta expresión semanas: apertar un pouco. 391 00:25:11,580 --> 00:25:13,710 Como realmente facer iso programaticamente? 392 00:25:13,710 --> 00:25:16,390 Vostede usa o que é xeralmente chamado de máscara, unha secuencia de bits, 393 00:25:16,390 --> 00:25:19,980 que neste caso só acontece a ollar como este número aquí, 394 00:25:19,980 --> 00:25:22,980 e entón "ou" iso en conxunto, utilizando este operador C nova, 395 00:25:22,980 --> 00:25:29,940 non | |, usa un único | e realmente obter esa resposta aquí por que? 396 00:25:29,940 --> 00:25:35,120 Este é o lugar 1s, 2s lugar, 16S 4s, 8s, 32s. 397 00:25:35,120 --> 00:25:42,280 Así, verifícase que se aproveitar unha letra maiúscula A e OU bit a bit co 32 enteiro, 398 00:25:42,280 --> 00:25:47,520 porque o 32 enteiro, cando mira para el como bits, mira como este, 399 00:25:47,520 --> 00:25:50,860 Isto significa que pode virar o pouco que realmente quere. 400 00:25:50,860 --> 00:25:52,630 E do mesmo xeito - e nós imos ollar para o código en só un momento - 401 00:25:52,630 --> 00:25:54,210 Supoña que queremos ir na outra dirección. 402 00:25:54,210 --> 00:25:58,210 >> Como vai de capital dunha minúscula para a? Que pouco ten que cambiar? 403 00:25:58,210 --> 00:25:59,820 É o mesmo. 404 00:25:59,820 --> 00:26:03,970 Queremos cambiar isto a partir dun terceiro bit 1 a 0. 405 00:26:03,970 --> 00:26:06,310 E como podemos facer sobre iso? 406 00:26:06,310 --> 00:26:10,130 Como podemos apagar un pouco? Co estándar de bits pode desactivar un pouco? 407 00:26:11,580 --> 00:26:14,070 E se a xente medio que inverta a máscara? 408 00:26:14,070 --> 00:26:17,350 Considerando que, antes, fixemos os 0s máscara toda amarela 409 00:26:17,350 --> 00:26:19,930 excepto para o pouco que queriamos conectar, 410 00:26:19,930 --> 00:26:25,580 E desta vez, nós facemos o 1s máscara enteira, excepto para o pouco que queremos para desactivar 411 00:26:25,580 --> 00:26:28,330 e, a continuación, usar o que operador? 412 00:26:28,330 --> 00:26:30,560 E se nós "e" as cousas? Imos dar un ollo. 413 00:26:30,560 --> 00:26:34,880 Agora virar para iso, supoña que de novo eu crear unha máscara que é todo 1s 414 00:26:34,880 --> 00:26:37,650 excepto para o pouco que eu queira desactivar 415 00:26:37,650 --> 00:26:43,860 e despois, no canto de "ou" os números brancos enriba cos números amarelos ata aquí, 416 00:26:43,860 --> 00:26:46,940 e eu, en vez "e" eles xuntos? É chamado un bit a bit e. 417 00:26:46,940 --> 00:26:49,450 Loxicamente, é a mesma cousa que un Boolean e. 418 00:26:49,450 --> 00:26:55,160 Isto dáme 0 e 1 e 0. Tan falso e certo é falso. 419 00:26:55,160 --> 00:26:58,160 Certa e verdadeira é certo. 420 00:26:58,160 --> 00:27:04,020 E aquí está a máxica: o verdadeiro eo falso agora falso, polo que temos que apagado pouco. 421 00:27:04,020 --> 00:27:06,560 E agora o resto da historia é un pouco simple. 422 00:27:06,560 --> 00:27:11,970 Unha vez que o resto da máscara está 1s, non importa cal os números están en branco. 423 00:27:11,970 --> 00:27:15,580 Cando "e" algo certo, non vai cambiar o seu valor. 424 00:27:15,580 --> 00:27:20,200 Se é verdade, permanecerá certo. Se era falsa, permanecerá falsa. 425 00:27:20,200 --> 00:27:23,190 >> Pero a maxia acontece cando toma algo que era certo 426 00:27:23,190 --> 00:27:25,430 e entón "e" con teito. 427 00:27:25,430 --> 00:27:30,030 Isto ten o efecto de que o bit de apagar. 428 00:27:30,030 --> 00:27:31,980 Así, unha enigmática pouco alí. 429 00:27:31,980 --> 00:27:35,390 Imos realmente ollar para un código, o que realmente pode ollar aínda máis enigmático, 430 00:27:35,390 --> 00:27:38,220 pero imos dar un ollo aquí tolower. 431 00:27:38,220 --> 00:27:45,880 Se eu ollar para tolower, pasando de capital dun para letras minúsculas a, 432 00:27:45,880 --> 00:27:47,730 imos ver como podemos aplicar este programa. 433 00:27:47,730 --> 00:27:51,280 Aquí está o principal, e non está tomando calquera argumentos de liña de comandos. 434 00:27:51,280 --> 00:27:55,980 Estou declarando un carácter C para a letra que o usuario vai escribir dentro 435 00:27:55,980 --> 00:28:00,690 Eu, entón, usar un do lazo familiar mentres só para asegurarse de que o usuario sempre me dá un A maiúsculo 436 00:28:00,690 --> 00:28:05,010 ou B ou C. .. Z, de xeito que me dea algo entre A e Z. 437 00:28:05,010 --> 00:28:08,580 E agora o que eu estou facendo aquí? 438 00:28:08,580 --> 00:28:14,870 Eu son "ou" ing iso con 0x20, pero que en realidade é o mesmo que - 439 00:28:14,870 --> 00:28:19,500 e imos voltar a iso nun momento - 32. 440 00:28:19,500 --> 00:28:24,830 Entón, de novo, 32 e este patrón de bits aquí. Por que saber iso? 441 00:28:24,830 --> 00:28:26,320 Basta pensar de volta para semana 0. 442 00:28:26,320 --> 00:28:31,010 Este é o lugar 1s, 2s lugar, 4s, 8s, 16S, 32s lugar. 443 00:28:31,010 --> 00:28:33,470 Polo tanto, este número amarelo pasa a ser 32. 444 00:28:33,470 --> 00:28:40,570 Podo, entón, tomar unha carta como char aquí, bit a bit "ou" iso literalmente co número 32, 445 00:28:40,570 --> 00:28:45,250 eo que podo volver? A versión minúscula que char. 446 00:28:45,250 --> 00:28:48,830 Hai intres, porén, eu expresei iso nunha notación de base diferente. 447 00:28:48,830 --> 00:28:51,370 O que isto supón? >> [Alumno] hexadecimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Isto acontece para representar hexadecimal. 449 00:28:53,050 --> 00:28:55,170 Nós non falamos sobre hexadecimal tanto así, 450 00:28:55,170 --> 00:28:57,330 pero é realmente cómodo en casos como este. 451 00:28:57,330 --> 00:29:01,730 >> Aínda que parece máis complexo e, aínda que parece que o 20 e non 32, 452 00:29:01,730 --> 00:29:06,240 verifícase que é na verdade a notación hexadecimal super cómodo 453 00:29:06,240 --> 00:29:10,810 porque en hexadecimal todos os díxitos despois do 0x - e iso non significa nada; 454 00:29:10,810 --> 00:29:13,960 iso é só unha convención humana que di que aquí vén un número hexadecimal - 455 00:29:13,960 --> 00:29:18,590 cada un destes díxitos, a 2 e, a continuación, a 0, en si poden ser representados 456 00:29:18,590 --> 00:29:20,800 con exactamente 4 bits. 457 00:29:20,800 --> 00:29:27,840 Entón, se facemos iso, deixe-me abrir un editor de texto aquí - raro autocomplete - 458 00:29:27,840 --> 00:29:35,940 Se facemos un editor de texto pouco aquí, o 0x20 número significa aquí é de 4 bits, aquí está máis 4 bits. 459 00:29:35,940 --> 00:29:38,050 Imos facer os 4 bits máis á dereita en primeiro lugar. 460 00:29:38,050 --> 00:29:44,690 0 cando representado con 4 bits é o que? Super doado. Só 0s todos. 461 00:29:44,690 --> 00:29:46,780 Entón 4 bits como 0s. 462 00:29:46,780 --> 00:29:53,510 Como representar 2? Foi un tempo dende que fixen iso, pero é 0100. 463 00:29:53,510 --> 00:29:57,310 Polo tanto, este é o lugar 1s, este é o lugar 2s, e entón non importa o que os outros lugares son. 464 00:29:57,310 --> 00:30:00,610 Noutras palabras, en hexadecimal pode dicir 0x20, 465 00:30:00,610 --> 00:30:04,340 pero se pensar entón sobre o que é a 2 e como é representado en binario, 466 00:30:04,340 --> 00:30:07,130 cal é a 0 e como é representado en binario, 467 00:30:07,130 --> 00:30:10,440 as respostas a estas preguntas son este e este, respectivamente. 468 00:30:10,440 --> 00:30:14,380 Entón 0x20 acontece para representar ese patrón de 8 bits, 469 00:30:14,380 --> 00:30:16,880 que é precisamente a máscara que queriamos. 470 00:30:16,880 --> 00:30:20,140 Polo tanto, este é o momento só un exercicio intelectual, 471 00:30:20,140 --> 00:30:24,520 pero a realidade está no código é tipicamente máis común para escribir constantes como esta 472 00:30:24,520 --> 00:30:28,360 en hexadecimal, a continuación, xa que o programador pode de xeito relativamente doado, 473 00:30:28,360 --> 00:30:32,560 aínda que se esixe un pouco de papel e lapis, descubrir o que o patrón de bits é 474 00:30:32,560 --> 00:30:35,960 porque non pode simplemente expresar 0s e 1s normalmente no código. 475 00:30:35,960 --> 00:30:38,540 Vostede non pode ir 00010 e así por diante. 476 00:30:38,540 --> 00:30:42,380 >> Ten que escoller notacións decimal ou hexadecimal ou octal ou outro. 477 00:30:42,380 --> 00:30:47,540 A maioría das persoas tenden a elixir hexadecimal simplemente para que cada díxito representa 4 bits 478 00:30:47,540 --> 00:30:49,320 e pode facer esa matemática rápida. 479 00:30:49,320 --> 00:30:54,990 E eu vou acenar a miña man a toupper, que é case o mesmo, parece case idéntico. 480 00:30:54,990 --> 00:31:01,900 Toupper pasa de usar non o operador ou mais este cara e DF. 481 00:31:01,900 --> 00:31:09,300 O que representan DF? DF? Alguén? >> [Alumno] 255. 482 00:31:09,300 --> 00:31:12,780 255? 255 non. Iso sería ss. 483 00:31:12,780 --> 00:31:15,210 Imos deixar este como un pouco de exercicio. 484 00:31:15,210 --> 00:31:23,460 Pero se vai de 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 e entón o que vén despois de 9? 485 00:31:23,460 --> 00:31:26,510 Somos o tipo de fóra de díxitos decimais, pero en hexadecimal o que vén despois de 9? 486 00:31:26,510 --> 00:31:29,510 [Estudante] a. Entón >> a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Pode descubrir a partir de aí o patrón de bits d realmente representa. 488 00:31:33,470 --> 00:31:38,850 E se facemos as contas, veremos que a máscara que acabar quedando atrás é idéntico a este. 489 00:31:38,850 --> 00:31:45,580 Trátase de f, todos 1s, e este é d. Entón DF representa a máscara. Todo ben. 490 00:31:45,580 --> 00:31:50,980 E, por último, para non facer as cousas de son super, super técnica, 491 00:31:50,980 --> 00:31:53,840 Pero supoña que quería escribir un programa que fai isto. 492 00:31:53,840 --> 00:31:58,960 Deixe-me ir adiante e facer binario, que é un programa nun arquivo chamado binary.c. 493 00:31:58,960 --> 00:32:02,050 E agora déixeme executar binarios e me dar un número enteiro non negativo. 494 00:32:02,050 --> 00:32:03,960 Imos comezar fácil e escriba 0. 495 00:32:03,960 --> 00:32:09,010 Isto agora é un programa que imprime un enteiro na súa representación binaria. 496 00:32:09,010 --> 00:32:13,470 Entón, se eu xogar este xogo de novo e escriba en só unha, eu debería ter unha representación de 32 bits do 1. 497 00:32:13,470 --> 00:32:15,490 Se eu fai iso de novo con dous, eu entendo iso. 498 00:32:15,490 --> 00:32:19,310 Se eu fai 7, eu debería ter un 1s poucos ao final, e así por diante. 499 00:32:19,310 --> 00:32:22,740 Acontece Digo isto porque, con operacións bit a bit 500 00:32:22,740 --> 00:32:25,490 pode realmente facer outra cousa tamén. 501 00:32:25,490 --> 00:32:29,130 Pode crear esas máscaras dinamicamente. 502 00:32:29,130 --> 00:32:32,800 Bótalle un ollo neste exemplo unha final inclúen operacións bit a bit. 503 00:32:32,800 --> 00:32:35,490 Aquí está a primeira parte do código, solicitar ó usuario un número, 504 00:32:35,490 --> 00:32:38,130 e insiste en que me dea un número enteiro non negativo. 505 00:32:38,130 --> 00:32:39,780 Entón ese é tipo de cousas vella escola. 506 00:32:39,780 --> 00:32:41,980 Pero aquí é algo que é ben interesante. 507 00:32:41,980 --> 00:32:44,910 >> ¿Como ir sobre a impresión de un número en binario? 508 00:32:44,910 --> 00:32:48,970 A primeira iteração de que para que? 509 00:32:48,970 --> 00:32:52,270 Que é o tamaño dun int tipicamente, polo menos, no interior do aparello? >> [Alumno] 4. 510 00:32:52,270 --> 00:32:57,130 E 4. Entón, 4 * 8 é de 32 - 1 é 31. 511 00:32:57,130 --> 00:33:02,590 Entón, se eu estou empezando a contar a partir de 31, que representa, ao parecer, 512 00:33:02,590 --> 00:33:07,630 só conceptualmente, o bit 31 ou pouco máis alta orde, que é este cara aquí, 513 00:33:07,630 --> 00:33:09,650 Considerando que este vai ser 0 bits. 514 00:33:09,650 --> 00:33:12,850 Polo tanto, esta é pouco 01 ... 31 bits. 515 00:33:12,850 --> 00:33:14,950 Entón o que está facendo este código? 516 00:33:14,950 --> 00:33:20,140 Teña en conta que este lazo for, aínda que pareza enigmático, é só a iteração de 31 a 0. É iso aí. 517 00:33:20,140 --> 00:33:24,530 Así, a parte interesante agora debe estar neses cinco liñas aquí. 518 00:33:24,530 --> 00:33:28,110 Teña en conta que nesa liña que eu estou declarando unha máscara variable chamada 519 00:33:28,110 --> 00:33:30,790 para ser coherente coa nosa historia deses números amarelos. 520 00:33:30,790 --> 00:33:32,200 E entón que é o que está facendo? 521 00:33:32,200 --> 00:33:35,720 Este é outro operador bit a bit non vimos antes, o máis probable. 522 00:33:35,720 --> 00:33:38,300 É o operador de desprazamento cara á esquerda. 523 00:33:38,300 --> 00:33:40,060 Este operador fai iso. 524 00:33:40,060 --> 00:33:44,920 Aquí está o número 1, e se fai eu deixei cambio, desvío á esquerda, 525 00:33:44,920 --> 00:33:49,260 ¿Que pensas que ten o efecto de facer que un individuo? 526 00:33:49,260 --> 00:33:51,290 Literalmente desprazándose o. 527 00:33:51,290 --> 00:33:57,540 Entón, se o número 1 é o que ten na esquerda e comeza por arrincar I a 31, 528 00:33:57,540 --> 00:34:03,490 que é o que vai facer? El vai levar este número 1 e cambie-31 lugares por aquí. 529 00:34:03,490 --> 00:34:06,210 E porque non hai, obviamente, non os outros díxitos detrás del, 530 00:34:06,210 --> 00:34:10,350 aqueles por defecto será substituído con 0s. 531 00:34:10,350 --> 00:34:15,120 Entón vai comezar co número 1, o que naturalmente se parece iso - 532 00:34:15,120 --> 00:34:18,659 e deixe-me aproveitar iso aquí no centro. 533 00:34:18,659 --> 00:34:22,139 E entón, como cambia as cousas para a esquerda, este cara vai esencialmente desa forma. 534 00:34:22,139 --> 00:34:24,659 Pero así que fai iso, un 0 é cuberto dentro 535 00:34:24,659 --> 00:34:28,360 Se transferir-lo unha segunda vez, que vai para un lado e outro 0 é cuberto dentro 536 00:34:28,360 --> 00:34:31,000 >> Cambia de novo e despois outro 0 é cuberto dentro 537 00:34:31,000 --> 00:34:37,900 Entón, se fai esa cousa de 1 << i 31 prazas, que acaban recibindo unha máscara 538 00:34:37,900 --> 00:34:42,550 que é de 32 carácteres, o que máis á esquerda do que é o 1, 539 00:34:42,550 --> 00:34:45,199 todo o resto dos cales son un 0. 540 00:34:45,199 --> 00:34:50,880 E non é que, como un aparte, cambiando un número para a esquerda como esta 541 00:34:50,880 --> 00:34:53,530 tamén casualmente, e por veces conveniente, 542 00:34:53,530 --> 00:34:57,520 ten o efecto de facer o que para ese número? >> [Alumno] dobrando-lo. 543 00:34:57,520 --> 00:35:00,980 Dobrar porque cada unha das columnas - o lugar 1s, 2s lugar, lugar 4s, 544 00:35:00,980 --> 00:35:05,030 Lugar 8s, 16S lugar - eles están todos de duplicación que vaia á esquerda. 545 00:35:05,030 --> 00:35:09,500 Ou mellor, cando cambiar a 1s vai acabar dobrando o valor do número. 546 00:35:09,500 --> 00:35:12,070 Pode acabar facendo transformacións interesantes de díxitos 547 00:35:12,070 --> 00:35:15,640 cambiando todo máis desta forma por potencias de 2. 548 00:35:15,640 --> 00:35:17,150 Entón, como funciona isto? 549 00:35:17,150 --> 00:35:22,580 Iso, entón, dáme unha máscara que é todo 0s excepto por un 1 en lugar precisamente o que quero, 550 00:35:22,580 --> 00:35:27,920 e entón esta expresión, que é roubado de toupper.c, 551 00:35:27,920 --> 00:35:31,770 está simplemente dicindo que o número n que o usuario introduciu, 552 00:35:31,770 --> 00:35:34,730 "E" é con esa máscara, eo que é o que vai conseguir? 553 00:35:34,730 --> 00:35:39,200 Está indo para obter un 1 se hai un 1 no que a situación enmascarado, 554 00:35:39,200 --> 00:35:41,570 ou está indo para obter un 0 se non hai. 555 00:35:41,570 --> 00:35:44,370 E así todo o programa este que efectivamente é que ten un loop, 556 00:35:44,370 --> 00:35:48,340 e crea unha máscara cun 1 por aquí, entón a 1 para acá, entón a 1 para acá, 557 00:35:48,340 --> 00:35:52,950 e el utiliza este bit a bit e truco para dicir que hai un bit 1 na entrada do usuario aquí? 558 00:35:52,950 --> 00:35:59,220 >> Existe un bit 1 na entrada do usuario aquí? E se é así, literalmente imprimir un, senón imprimir 0. 559 00:35:59,220 --> 00:36:03,780 Estamos facendo iso con ints só porque é por iso que nós estamos facendo 32 bits en lugar de 8, 560 00:36:03,780 --> 00:36:06,900 pero o que nós introducimos é este bit a bit e, este bit a bit OR, 561 00:36:06,900 --> 00:36:10,450 e este desvío á esquerda do operador, o que moitas veces non son moi útiles, 562 00:36:10,450 --> 00:36:12,230 pero acontece que poden ser. 563 00:36:12,230 --> 00:36:16,560 En realidade, se fose a representar algo así como un array de booleanos 564 00:36:16,560 --> 00:36:21,260 só para representar verdadeiro ou falso, supoña que queira seguir ou non 565 00:36:21,260 --> 00:36:24,630 unha sala chea de 300 alumnos está presente, 566 00:36:24,630 --> 00:36:29,420 pode declarar unha matriz de tamaño 300 do tipo bool para que obteña 300 bools, 567 00:36:29,420 --> 00:36:33,090 e pode definir cada cara true se alguén está aquí e falso en caso contrario. 568 00:36:33,090 --> 00:36:37,550 Por que a representación en que a estrutura de datos ineficiente? 569 00:36:39,370 --> 00:36:44,800 O que é malo sobre o proxecto de que a estrutura de datos, un conxunto de 300 bools? 570 00:36:46,190 --> 00:36:49,600 ¿Que é un bool, en realidade, por baixo do capuz? 571 00:36:49,600 --> 00:36:52,310 Isto, tamén, é algo que pode non estar familiarizado. 572 00:36:52,310 --> 00:36:53,720 Acontece que non hai bool. 573 00:36:53,720 --> 00:36:56,620 Lembre que tipo de creada que co arquivo cs50.h, 574 00:36:56,620 --> 00:36:58,630 que á súa vez inclúe bool estándar. 575 00:36:58,630 --> 00:37:00,930 C é o tipo de muda, pero cando se trata de bool. 576 00:37:00,930 --> 00:37:04,880 El usa 8 bits para representar todos os bool, que é completamente inútil 577 00:37:04,880 --> 00:37:09,040 porque, obviamente, cantos bits que precisa para representar un bool? Só 1. 578 00:37:09,040 --> 00:37:13,190 Así, verifícase que se agora ten a habilidade cos operadores bit a bit 579 00:37:13,190 --> 00:37:17,760 para manipular bits individuais, mesmo nun char, mesmo en un único byte, 580 00:37:17,760 --> 00:37:21,380 non é que pode diminuír a memoria necesaria para representar algo estúpido 581 00:37:21,380 --> 00:37:25,490 así a estrutura de datos denominada frecuencia por un factor de 8. 582 00:37:25,490 --> 00:37:29,820 En vez de usar oito bits para representar verdadeiro ou falso, podería literalmente usar un 583 00:37:29,820 --> 00:37:34,500 usando un único byte para cada oito alumnos da clase 584 00:37:34,500 --> 00:37:41,990 e cambiar 0-1 bits individuais usando estes tipos de baixo nivel trucos. 585 00:37:43,850 --> 00:37:49,460 Isto realmente pór fin á enerxía. Hai dúbidas sobre as operacións bit a bit? 586 00:37:49,460 --> 00:37:52,710 >> Si >> [Alumno] Existe un operador exclusiva ou? 587 00:37:52,710 --> 00:37:56,440 Si Existe un operador exclusiva ou parecida con esta, ^, o símbolo de cenoria, 588 00:37:56,440 --> 00:38:02,070 o que significa que a única cousa que o primeiro ou o segundo aspecto pode ser un 1 para a saída para ser un 1. 589 00:38:02,070 --> 00:38:07,750 Hai tamén un non, ~, o que lle permitirá inverter a 0 a 1, ou viceversa, así. 590 00:38:07,750 --> 00:38:11,600 E hai tamén un operador de desprazamento cara á dereita, >>, que é o oposto do que vimos. 591 00:38:11,600 --> 00:38:13,850 Todo ben. Imos levar as cousas agora a un nivel superior. 592 00:38:13,850 --> 00:38:16,770 Comezamos por falar de texto e, a continuación, comprimi-lo 593 00:38:16,770 --> 00:38:19,650 e representando o texto cun número menor de bits; 594 00:38:19,650 --> 00:38:22,890 nós falamos un pouco sobre como podemos agora comezar a manipular as cousas nun nivel bit a bit. 595 00:38:22,890 --> 00:38:26,640 Imos agora zoom ata 10 mil pés de representación 596 00:38:26,640 --> 00:38:29,250 das cousas máis complexas, como gráficos. 597 00:38:29,250 --> 00:38:32,950 Aquí temos unha bandeira de Alemaña, aquí temos un de Francia. 598 00:38:32,950 --> 00:38:36,350 Estes poden ser representados en formatos de ficheiro que pode saber - GIFs, por exemplo. 599 00:38:36,350 --> 00:38:40,030 Se xa viu unha imaxe na web que remata en. GIF, 600 00:38:40,030 --> 00:38:43,000 este é un formato de intercambio de gráficos. 601 00:38:43,000 --> 00:38:47,530 Estas dúas bandeiras aquí tipo de prestar-se a compresión 602 00:38:47,530 --> 00:38:52,050 para o que quizais sexa obvio motivo? >> [Resposta do alumno inaudível] 603 00:38:52,050 --> 00:38:53,440 Hai unha morea de repetición, non? 604 00:38:53,440 --> 00:38:57,270 Para enviar bandeira de Alemaña, pense nisto como unha imaxe na pantalla 605 00:38:57,270 --> 00:38:59,030 atrás os seus días de scratch. 606 00:38:59,030 --> 00:39:02,380 Podes lembrar que non hai píxeles individuais ou puntos que compoñen unha imaxe. 607 00:39:02,380 --> 00:39:06,650 >> Hai toda unha liña de puntos negros e outra liña enteira de puntos negros. 608 00:39:06,650 --> 00:39:10,110 Hai unha morea de liñas de puntos negros que se poida ver se realmente o zoom, 609 00:39:10,110 --> 00:39:13,370 así como cando zoom no rostro de Rob en Photoshop. 610 00:39:13,370 --> 00:39:15,500 Así como temos máis, máis e máis fondo na imaxe, 611 00:39:15,500 --> 00:39:19,990 comezou a ver a pixelização, todas as prazas que compoñen o seu ollo nese caso. 612 00:39:19,990 --> 00:39:24,130 Mesmo aquí. Se o zoom un pouco, vería puntos individuais. 613 00:39:24,130 --> 00:39:27,110 Ben, este é un tipo de desperdicio de bits. 614 00:39:27,110 --> 00:39:32,120 Un terzo do pavillón é negro e un terzo do pavillón é amarelo e así por diante, 615 00:39:32,120 --> 00:39:34,860 por que non podemos dalgún xeito comprimir esta bandeira? 616 00:39:34,860 --> 00:39:39,560 E mesmo a bandeira francesa pode ser comprimido, aínda que o estándar é un pouco diferente. 617 00:39:39,560 --> 00:39:44,120 Acontece que o formato de ficheiro GIF é un formato de compresión sen perdas, 618 00:39:44,120 --> 00:39:48,420 o que significa que pode ter unha imaxe como a bandeira alemá aquí, 619 00:39:48,420 --> 00:39:53,540 pode tirar unha morea de seus bits sen sacrificar a calidade. 620 00:39:53,540 --> 00:39:55,340 Isto está en contraste con algo como JPEG, 621 00:39:55,340 --> 00:39:57,050 coa que a maioría de nós probablemente está máis familiarizado. 622 00:39:57,050 --> 00:39:59,000 Facebook fotos e fotos de Flickr e afíns 623 00:39:59,000 --> 00:40:02,200 case sempre son gardadas coma JPEGs cando está cargado, 624 00:40:02,200 --> 00:40:08,100 pero JPEGs é unha perda - formato en que xogue fóra bits - con perdas 625 00:40:08,100 --> 00:40:10,430 pero tamén xoga fóra de calidade. 626 00:40:10,430 --> 00:40:13,890 E por iso, se comprimir imaxes con Photoshop ou envialos a Facebook 627 00:40:13,890 --> 00:40:15,580 ou leva-los en un teléfono realmente malo, 628 00:40:15,580 --> 00:40:19,510 vostede sabe que o cadro comeza a estar moi manchado e pixelizada, 629 00:40:19,510 --> 00:40:22,290 e iso é porque está sendo comprimido polo ordenador ou teléfono 630 00:40:22,290 --> 00:40:24,550 por, literalmente, xogando información de distancia. 631 00:40:24,550 --> 00:40:28,500 Pero GIF é sorprendente na medida en que pode usar menos bits que podería por defecto 632 00:40:28,500 --> 00:40:30,750 sen perder ningunha información. 633 00:40:30,750 --> 00:40:32,410 >> E é, esencialmente, faio da seguinte maneira. 634 00:40:32,410 --> 00:40:38,740 En vez de almacenar nun ficheiro como un BMP sería un triplo RGB para negro, negro, branco, negro, 635 00:40:38,740 --> 00:40:42,570 negro, branco, negro, branco, negro, branco, negro, branco e así por diante, 636 00:40:42,570 --> 00:40:45,640 en vez diso, o formato GIF é que vai dicir, "Black", 637 00:40:45,640 --> 00:40:48,330 e, a continuación, "Repita iso 100 veces", ou algo así. 638 00:40:48,330 --> 00:40:52,280 "Negro, repita este 100 veces, negro, repita este 100 veces ..." 639 00:40:52,280 --> 00:40:54,530 "Amarelo, repita este 100 veces." 640 00:40:54,530 --> 00:40:57,200 E así el se lembra de, esencialmente, o pixel máis á esquerda 641 00:40:57,200 --> 00:41:02,160 e despois de algunha maneira codifica a noción de repetir que o pixel de novo e de novo. 642 00:41:02,160 --> 00:41:06,110 Entón GIFs pode comprimir-se sen perder ningunha información. 643 00:41:06,110 --> 00:41:09,510 Pero se tivese que adiviñar, se ese é o algoritmo que GIFs uso, 644 00:41:09,510 --> 00:41:13,180 cal destas bandeiras, aínda que eles parecen idénticos en tamaño, 645 00:41:13,180 --> 00:41:19,620 vai ser menor cando gardados no disco como un GIF? >> [Alumno] Alemaña. 646 00:41:19,620 --> 00:41:21,660 Alemaña vai ser menor? Por que? 647 00:41:21,660 --> 00:41:26,620 [Alumno] Porque repetir iso moitas e moitas veces na horizontal 648 00:41:26,620 --> 00:41:29,010 e entón repetir outra vez. >> Exactamente. 649 00:41:29,010 --> 00:41:32,020 Porque as persoas que inventaron GIF só un tipo de arbitrariamente decide 650 00:41:32,020 --> 00:41:36,040 que a repetición será alavancado horizontal, e non lateralmente. 651 00:41:36,040 --> 00:41:40,900 Hai unha repetición máis lateralmente aquí no pavillón alemán que na bandeira francesa. 652 00:41:40,900 --> 00:41:44,430 Entón, se nós realmente abrir un cartafol no meu disco duro que ten eses GIFs, 653 00:41:44,430 --> 00:41:51,920 realmente pode ver que a bandeira alemá aquí é de 2 kilobytes ea francesa é de 4 kilobytes. 654 00:41:51,920 --> 00:41:54,080 El pasa a ser unha coincidencia que un é o dobre do outro, 655 00:41:54,080 --> 00:41:57,960 pero é, de feito, o caso de que a bandeira francesa é moito maior. 656 00:41:57,960 --> 00:42:01,250 >> Aínda que nós estamos falando aquí sobre os gráficos, as mesmas ideas poden ser aplicadas a 657 00:42:01,250 --> 00:42:05,150 non cousas como bandeiras, pero imaxes que son un pouco máis complexo. 658 00:42:05,150 --> 00:42:08,170 Se sacar unha foto dunha mazá, seguramente hai unha morea de duplicación alí, 659 00:42:08,170 --> 00:42:11,040 para que pudéssemos de algunha maneira, lembre que o fondo de pantalla é azul 660 00:42:11,040 --> 00:42:13,230 e non, como a imaxe da dereita indica, 661 00:42:13,230 --> 00:42:16,830 ten que lembrar a cor de cada pixel nesta foto. 662 00:42:16,830 --> 00:42:21,060 Así, podemos tirar anacos alí sen perda de información. 663 00:42:21,060 --> 00:42:23,340 A mazá aínda parece a mesma cousa. 664 00:42:23,340 --> 00:42:27,510 Neste exemplo aquí, pode ver o que pasa nun filme. 665 00:42:27,510 --> 00:42:31,970 Estes representan bobinas vella escola de cine en que na imaxe de arriba hai 666 00:42:31,970 --> 00:42:36,900 ten unha condución RV pasado unha casa e unha árbore. 667 00:42:36,900 --> 00:42:42,130 E, como que van drives pasado de esquerda a dereita, o que, obviamente, non cambiando? 668 00:42:42,130 --> 00:42:45,320 A casa non vai a sitio ningún, e que a árbore non vai a sitio ningún. 669 00:42:45,320 --> 00:42:47,700 O único que se está movendo é a van neste caso. 670 00:42:47,700 --> 00:42:51,650 Así como fondo inalteradas suxire, o que pode facer en filmes 671 00:42:51,650 --> 00:42:56,530 é igualmente só tirar a información que non cambia entre cadros. 672 00:42:56,530 --> 00:42:58,900 Isto é xeralmente coñecida como a compresión interframe 673 00:42:58,900 --> 00:43:02,120 través do cal se este cadro é case idéntica a esta, 674 00:43:02,120 --> 00:43:05,390 non imos preocupar almacenado no disco ningunha información idéntica 675 00:43:05,390 --> 00:43:09,250 sobre eses cadros intermedios, imos usar só cadros principais de cando en vez 676 00:43:09,250 --> 00:43:13,420 que, en realidade, almacenar esta información de forma redundante só como un pouco de sanidade comprobar. 677 00:43:13,420 --> 00:43:18,620 >> Por outra banda, outra visión para a compresión de vídeo, neste segundo exemplo e inferior aquí, 678 00:43:18,620 --> 00:43:23,970 onde, en vez de almacenar 30 cadros, por que non só almacenar 15 cadros por segundo en vez diso? 679 00:43:23,970 --> 00:43:27,070 Ao contrario do que o tipo de película que flúe fermoso, perfectamente, 680 00:43:27,070 --> 00:43:30,060 el pode ollar como está falar un pouco, nunha pequena escola de idade, 681 00:43:30,060 --> 00:43:37,190 pero o efecto neto será a de usar moito menos bits que doutra forma sería necesaria. 682 00:43:37,190 --> 00:43:39,240 Entón onde é que iso, entón iso nos deixa? 683 00:43:39,240 --> 00:43:41,700 Isto foi un pouco de un lado sobre onde máis pode ir a compresión. 684 00:43:41,700 --> 00:43:45,140 Para saber máis sobre iso, ter unha aula de como CS175 aquí. 685 00:43:45,140 --> 00:43:46,990 Aquí está outro exemplo dentro de vídeo. 686 00:43:46,990 --> 00:43:49,190 A abella é a única cousa en movemento, 687 00:43:49,190 --> 00:43:51,790 realmente pode tirar información nestes cadros medios 688 00:43:51,790 --> 00:43:55,260 porque a flor e do ceo e as follas non están cambiando. 689 00:43:55,260 --> 00:43:57,960 Pero imos agora considerar unha última cousa. 690 00:43:57,960 --> 00:44:03,890 Nos próximos cinco minutos que deixamos C atrás para sempre na clase? Si Non nos serie de exercicios, no entanto. 691 00:44:03,890 --> 00:44:10,210 Última historia sobre C e, entón, chegar a cousas moi sexy 692 00:44:10,210 --> 00:44:13,870 envolvendo HTML e Web e Woo-Hoo. Todo ben. 693 00:44:13,870 --> 00:44:16,050 Aquí imos nós. Esa é a motivación. 694 00:44:16,050 --> 00:44:20,020 Acontece que todo ese tempo en que teñen escrito programas que rodan Clang. 695 00:44:20,020 --> 00:44:23,890 E Clang, dixemos desde a primeira semana moi bonito, ten código fonte 696 00:44:23,890 --> 00:44:25,740 e convérteo en código obxecto. 697 00:44:25,740 --> 00:44:28,540 Leva C e convertelo en 0s e 1s. 698 00:44:28,540 --> 00:44:32,150 Eu tipo de mentiras para ti por algunhas semanas, porque non é tan sinxelo coma iso. 699 00:44:32,150 --> 00:44:36,750 >> Hai moito máis a suceder debaixo do capó cando executar un programa como o Clang. 700 00:44:36,750 --> 00:44:39,560 En realidade, o proceso de compilación dun programa realmente pode ser resumido, 701 00:44:39,560 --> 00:44:42,210 como pode se lembrar de vídeo de Rob sobre compiladores, 702 00:44:42,210 --> 00:44:47,580 para estes catro pasos: pre-procesamento, compilación en si, montaxe e conexión. 703 00:44:47,580 --> 00:44:51,950 Pero na aula ea maioría das persoas do mundo tipicamente resumir todas estas etapas 704 00:44:51,950 --> 00:44:54,410 só como "compilación". 705 00:44:54,410 --> 00:44:58,070 Pero se comezar co código fonte como esta, recordo este é quizais o máis simple programa en C 706 00:44:58,070 --> 00:45:03,530 temos escrito ata agora, lembro que cando compilado acaba dese xeito. 707 00:45:03,530 --> 00:45:07,310 Pero hai, en realidade, un paso intermedio, e os pasos son como segue. 708 00:45:07,310 --> 00:45:10,750 Primeiro hai esa cousa na parte superior deste e máis dos nosos programas, 709 00:45:10,750 --> 00:45:13,550 # Incluír 710 00:45:13,550 --> 00:45:17,210 O que o # include facer por nós? 711 00:45:17,210 --> 00:45:24,150 El copia moi fermoso e cementoso o contido da stdio.h no meu arquivo de xeito que por que? 712 00:45:24,150 --> 00:45:27,220 Por que me preocupe co contido de stdio.h? O que hai alí de interese? 713 00:45:27,220 --> 00:45:32,310 Printf da declaración, o seu prototipo, de xeito que o compilador, entón, sabe o que quero dicir 714 00:45:32,310 --> 00:45:34,900 cando mencionar esa función printf. 715 00:45:34,900 --> 00:45:39,390 Entón, paso 1 na compilación é o pre-procesamento, en que un programa como o Clang 716 00:45:39,390 --> 00:45:43,450 ou algún programa de axuda que vén con Clang le o código de arriba para a base, 717 00:45:43,450 --> 00:45:47,740 esquerda a dereita, ea calquera momento ve un símbolo # seguido dunha palabra clave como include, 718 00:45:47,740 --> 00:45:53,980 el executa esta operación, copiar e pegar neste caso stdio.h no seu arquivo. 719 00:45:53,980 --> 00:45:55,510 Isto é o paso 1. 720 00:45:55,510 --> 00:45:59,620 Entón tes un arquivo moi grande C por mor da copia enorme, pegue traballo que só aconteceu. 721 00:45:59,620 --> 00:46:01,710 >> 2 paso agora é compilar. 722 00:46:01,710 --> 00:46:04,880 Pero acontece que a compilación ten código fonte que se parece iso 723 00:46:04,880 --> 00:46:08,160 e transformalo en algo que se parece iso, 724 00:46:08,160 --> 00:46:12,560 que para aqueles familiarizados se chama? >> [Alumno] Asemblea. Lingua >> Asemblea. 725 00:46:12,560 --> 00:46:16,700 Esta é realmente unha cousa se tomar CS61 vai mergullo en máis detalles. 726 00:46:16,700 --> 00:46:22,380 Este é só o máis próximo que pode comezar a escribir 0s e 1s se 727 00:46:22,380 --> 00:46:25,850 pero escribir as cousas de tal forma que aínda fai, polo menos, un pouco de sentido. 728 00:46:25,850 --> 00:46:30,760 Estas son instrucións de máquina, e desprácese á función principal aquí, 729 00:46:30,760 --> 00:46:35,470 entender que existe esta instrución push, mover instrución, restar instrución, 730 00:46:35,470 --> 00:46:38,550 chamar a instrución, e así por diante. 731 00:46:38,550 --> 00:46:42,930 Cando escoita que o seu ordenador ten procesador Intel dentro, 732 00:46:42,930 --> 00:46:46,180 ten unha CPU Intel no seu Mac ou PC, o que significa isto? 733 00:46:46,180 --> 00:46:51,200 Unha CPU vén construído por empresas como Intel comprender certas instrucións. 734 00:46:51,200 --> 00:46:55,770 Eles non teñen idea do que funciona como intercambio son ou principal son, por si só, 735 00:46:55,770 --> 00:47:00,060 pero eles saben o que moito instrucións de baixo nivel, como engadir, subtrair, empurrar, 736 00:47:00,060 --> 00:47:02,430 mover, chamar, e así por diante son. 737 00:47:02,430 --> 00:47:06,170 Entón, cando compilar o código C en linguaxe de montaxe, 738 00:47:06,170 --> 00:47:11,820 seu propio código de usuario agradable para o futuro é convertido en algo que se parece iso, 739 00:47:11,820 --> 00:47:21,670 que, literalmente, móvese máis ou 4 bytes en torno a tales pequenas unidades dentro e fóra da CPU. 740 00:47:21,670 --> 00:47:26,820 Pero, finalmente, cando Clang está preparado para asumir esa representación do seu programa 741 00:47:26,820 --> 00:47:30,940 en 0s e 1s, a continuación, a etapa denominada montaxe acontece, 742 00:47:30,940 --> 00:47:33,850 e isto todo acontece de novo nun palpebrar de ollos ao executar Clang. 743 00:47:33,850 --> 00:47:39,300 Nós comezamos aquí, el xera un ficheiro coma este, e despois convértese para estes 0s e 1s. 744 00:47:39,300 --> 00:47:42,000 E se quere ir cara atrás nalgún punto e realmente ver iso en acción, 745 00:47:42,000 --> 00:47:48,220 se eu entrar en hello1.c-este é un dos programas primeiros que vimos - 746 00:47:48,220 --> 00:47:53,710 Normalmente nós compilar este con hello1.c Clang e iso nos daría a.out. 747 00:47:53,710 --> 00:47:59,890 Se, pola contra ti en vez dar o S-bandeira, o que vai conseguir é hello1.s 748 00:47:59,890 --> 00:48:02,750 e vai realmente ver a linguaxe assembly. 749 00:48:02,750 --> 00:48:05,750 >> Estou facendo isto para un programa moi curto, pero se volver para Scramble 750 00:48:05,750 --> 00:48:08,740 ou recuperar ou calquera outro programa que escribiu e só por curiosidade 751 00:48:08,740 --> 00:48:13,240 quero ver o que realmente parece, o que está realmente a ser alimentado na CPU, 752 00:48:13,240 --> 00:48:15,700 pode usar este S-bandeira coa Clang. 753 00:48:15,700 --> 00:48:17,770 Pero, entón, por fin, aínda hai unha pegadinha. 754 00:48:17,770 --> 00:48:21,810 Aquí están os 0s e 1s que representan miña implementación do Ola mundo. 755 00:48:21,810 --> 00:48:25,530 Pero eu usei a función de alguén no meu programa. 756 00:48:25,530 --> 00:48:28,710 Así, aínda que o proceso fose eu tomar hello.c, 757 00:48:28,710 --> 00:48:34,280 é feita en código de montaxe, e despois queda montado 0s e 1s, 758 00:48:34,280 --> 00:48:37,460 a única 0s e 1s que son emitidas neste momento no tempo 759 00:48:37,460 --> 00:48:40,270 son os que resultan do meu código. 760 00:48:40,270 --> 00:48:44,400 Pero a persoa que escribiu printf, que compilou o código 20 anos 761 00:48:44,400 --> 00:48:47,000 e agora está instalado nalgún lugar do aparello, 762 00:48:47,000 --> 00:48:51,610 para que de algunha maneira ten que mesturar os seus 0s e 1s co meu 0s e 1s, 763 00:48:51,610 --> 00:48:56,160 e que nos leva ao paso 4 e final de elaboración, coñecido como conexión. 764 00:48:56,160 --> 00:48:58,680 Así, no lado esquerdo, temos o cadro exactamente como antes: 765 00:48:58,680 --> 00:49:02,580 hello.c torna-se un código de montaxe torna-se 0s e 1s. 766 00:49:02,580 --> 00:49:05,960 Pero lembre que eu usei a biblioteca de E / S por defecto no meu código, 767 00:49:05,960 --> 00:49:10,350 e iso significa que en algún lugar no seu ordenador hai un ficheiro chamado stdio.c 768 00:49:10,350 --> 00:49:13,980 ou, polo menos, a mesma versión compilada porque alguén fai uns anos 769 00:49:13,980 --> 00:49:18,530 compilado en código stdio.c montaxe e despois unha morea de 0s e 1s. 770 00:49:18,530 --> 00:49:21,130 Iso é o que se coñece como estático ou unha biblioteca dinámica. 771 00:49:21,130 --> 00:49:23,350 É un arquivo sentado nalgún lugar do aparello. 772 00:49:23,350 --> 00:49:28,710 >> Pero, finalmente, eu teño que tomar a miña 0s e 1s e desa persoa 0s e 1s 773 00:49:28,710 --> 00:49:32,760 e dalgún modo vincular-los xuntos, literalmente combinar os 0s e 1s 774 00:49:32,760 --> 00:49:37,900 nun único arquivo chamado a.out ou hello1 ou o que eu chamei o meu programa 775 00:49:37,900 --> 00:49:43,320 de xeito que o resultado final ten todos os 1s e 0s que deben compoñer o meu programa. 776 00:49:43,320 --> 00:49:45,660 Entón todo este tempo neste semestre, cando está usando Clang 777 00:49:45,660 --> 00:49:48,750 e mesmo, máis recentemente, de executar o make, a fin de realizar Clang, 778 00:49:48,750 --> 00:49:53,580 todas esas etapas foron a suceder tipo de instantaneamente, pero moi deliberadamente. 779 00:49:53,580 --> 00:49:57,830 E se seguir en ciencia da computación, ou sexa, CS61, 780 00:49:57,830 --> 00:50:00,850 Esta é a capa que vai continuar a pelar aí fóra 781 00:50:00,850 --> 00:50:06,980 fala de eficiencia, implicacións de seguridade, e outros deses detalles de nivel inferior. 782 00:50:06,980 --> 00:50:09,220 Pero, con iso, que estamos a piques de deixar C atrás. 783 00:50:09,220 --> 00:50:11,420 Imos adiante e tomar o noso intervalo de 5 minutos, agora, 784 00:50:11,420 --> 00:50:14,190 e cando volten: a Internet. 785 00:50:17,280 --> 00:50:19,170 Todo ben. Estamos de volta. 786 00:50:19,170 --> 00:50:23,590 Agora imos comezar a nosa mirada non só en HTML, porque, como podes ver, 787 00:50:23,590 --> 00:50:26,050 HTML en si é realmente moi simple 788 00:50:26,050 --> 00:50:29,270 pero realmente programación web en xeral, en rede de xeito máis xeral, 789 00:50:29,270 --> 00:50:31,770 e como todas estas tecnoloxías se reúnen 790 00:50:31,770 --> 00:50:35,400 para permitir crear programas máis sofisticados enriba da Internet 791 00:50:35,400 --> 00:50:38,690 que ata agora temos sido capaces de nos estas fiestras branco e negro. 792 00:50:38,690 --> 00:50:42,140 En realidade, neste momento, no semestre aínda que vai pasar un tempo relativamente menos 793 00:50:42,140 --> 00:50:46,200 en PHP, HTML, CSS, JavaScript, SQL e máis, 794 00:50:46,200 --> 00:50:48,480 a maioría dos estudantes do final para facer proxectos finais, que están baseados na web 795 00:50:48,480 --> 00:50:51,230 porque como podes ver, o fondo que ten agora en C 796 00:50:51,230 --> 00:50:54,450 é moi aplicable a estas linguaxes de alto-nivel. 797 00:50:54,450 --> 00:50:56,800 >> E como comezar a pensar sobre o seu proxecto final, 798 00:50:56,800 --> 00:50:59,940 que, como conxunto de problemas 0, onde foron encoraxados 799 00:50:59,940 --> 00:51:02,160 de facer máis nada do seu interese en scratch, 800 00:51:02,160 --> 00:51:05,790 O proxecto final é a súa oportunidade de ter o seu novo coñecemento e habilidade con C 801 00:51:05,790 --> 00:51:09,850 ou PHP ou JavaScript ou similar, para un xiro 802 00:51:09,850 --> 00:51:12,330 e crear o seu propio anaco de software para o mundo ver. 803 00:51:12,330 --> 00:51:17,770 E a semente que con ideas, sabe que pode dirixirse aquí, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Todos os anos, solicitar ideas de profesores e funcionarios e grupos de estudantes no campus 805 00:51:21,800 --> 00:51:27,330 só para presentar as súas ideas para cousas interesantes que poderían ser resoltos usando ordenadores, 806 00:51:27,330 --> 00:51:29,860 usando sitios, usando o software. 807 00:51:29,860 --> 00:51:32,360 Entón, se está loitando para chegar a unha idea do seu propio país, 808 00:51:32,360 --> 00:51:35,790 por todos os medios percorrer as ideas a partir deste ano eo último. 809 00:51:35,790 --> 00:51:39,990 É perfectamente ben para afrontar un proxecto que foi abordado antes. 810 00:51:39,990 --> 00:51:44,540 Vimos moitas aplicacións para ver o estado de roupa no campus, 811 00:51:44,540 --> 00:51:47,000 moitas aplicacións para navegar no menú comedor, 812 00:51:47,000 --> 00:51:49,540 moitas aplicacións para navegar o catálogo de cursos e afíns. 813 00:51:49,540 --> 00:51:53,680 E, de feito, nunha charla futuro e futuros seminarios, 814 00:51:53,680 --> 00:51:57,750 imos presenta-lo a algunhas APIs dispoñibles ao público, ambos dispoñibles no mercado 815 00:51:57,750 --> 00:52:02,520 , Así como aquí dispoñible CS50 no campus para que teña acceso a datos 816 00:52:02,520 --> 00:52:04,910 e pode, entón, facer cousas interesantes con ela. 817 00:52:04,910 --> 00:52:09,380 Entón, máis en proxectos finais algúns días, cando liberamos a especificación, 818 00:52:09,380 --> 00:52:12,990 pero por agora, sei que pode traballar só ou con un ou dous amigos 819 00:52:12,990 --> 00:52:16,010 en máis calquera proxecto de interese para vostede. 820 00:52:16,010 --> 00:52:18,080 Internet. 821 00:52:18,080 --> 00:52:22,300 Dalle puxe o seu portátil, vai para facebook.com por primeira vez, 822 00:52:22,300 --> 00:52:27,020 non conectado recentemente, e prema Intro. O que ocorre exactamente? 823 00:52:27,020 --> 00:52:30,150 >> Cando prema Intro no seu computador, monte un conxunto de pasos 824 00:52:30,150 --> 00:52:32,600 comezar especie de pase de máxica ocorrer. 825 00:52:32,600 --> 00:52:35,960 Entón aquí no servidor, web esquerda como Facebook está aquí á dereita, 826 00:52:35,960 --> 00:52:42,500 e dalgunha forma está a usar esta linguaxe chamada HTTP, formato Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP non é unha linguaxe de programación. É máis dun protocolo. 828 00:52:46,770 --> 00:52:52,310 É un conxunto de convencións que os navegadores e servidores web empregan cando intercomunicación. 829 00:52:52,310 --> 00:52:54,360 E o que iso significa é o seguinte. 830 00:52:54,360 --> 00:52:56,790 Así como no mundo real, temos estas convencións 831 00:52:56,790 --> 00:53:00,140 onde se atopa algún ser humano por primeira vez, se non lle importa xogar comigo aquí, 832 00:53:00,140 --> 00:53:03,980 Eu podería vir ata ti, diga: "Ola, meu nome é David." >> Ola, David. O meu nome é Sammy. 833 00:53:03,980 --> 00:53:05,770 "Ola, David. Meu nome é Sammy." 834 00:53:05,770 --> 00:53:08,310 Entón, agora temos só implicados neste tipo de protocolo humano parvo 835 00:53:08,310 --> 00:53:12,200 onde iniciar o protocolo, Sammy respondeu, 836 00:53:12,200 --> 00:53:15,060 temos aperto de mans e a transacción sexa rematada. 837 00:53:15,060 --> 00:53:18,260 HTTP é moi semellante en espírito. 838 00:53:18,260 --> 00:53:23,350 Cando os seus pedidos navegador www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 que o seu navegador está realmente facendo está estendendo a súa man, por así dicir, 840 00:53:27,020 --> 00:53:29,960 ao servidor e está enviándolle unha mensaxe. 841 00:53:29,960 --> 00:53:34,220 E esa mensaxe é tipicamente algo como - o que quere chegar? - 842 00:53:34,220 --> 00:53:38,740 me á páxina de inicio, que normalmente é indicado por unha única barra ao final dunha URL. 843 00:53:38,740 --> 00:53:43,790 E só así vostede sabe que lingua estou falando, eu o navegador vou dicir a vostede 844 00:53:43,790 --> 00:53:46,930 que eu estou falando HTTP versión 1.1, 845 00:53:46,930 --> 00:53:51,980 E tamén para a boa medida, eu vou dicir a vostede que o servidor que quero a páxina de inicio do 846 00:53:51,980 --> 00:53:54,120 é facebook.com. 847 00:53:54,120 --> 00:53:57,730 Normalmente, un navegador web, sen saber, o ser humano, 848 00:53:57,730 --> 00:54:03,350 envía a mensaxe a través de Internet cando simplemente teclea www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Entrar no seu navegador. 850 00:54:05,370 --> 00:54:07,300 E o que Facebook responder con? 851 00:54:07,300 --> 00:54:12,540 El responde con algúns detalles de aparencia semellante enigmáticas, pero tamén moito máis. 852 00:54:12,540 --> 00:54:14,310 Deixe-me ir á fronte da páxina de Facebook casa aquí. 853 00:54:14,310 --> 00:54:17,480 Esta é a pantalla que a maioría de nós probablemente nunca ver se estar conectado todo o tempo, 854 00:54:17,480 --> 00:54:19,830 pero esta é de feito a súa páxina principal. 855 00:54:19,830 --> 00:54:24,150 Se facemos isto no Chrome, entender que pode puxar arriba os menús de contexto pouco. 856 00:54:24,150 --> 00:54:26,980 Usando o Chrome, sexa en Mac OS, Windows, Linux, ou similar, 857 00:54:26,980 --> 00:54:31,840 Se controlar clic ou prema esquerdo, normalmente pode tirar un menú que se parece iso, 858 00:54:31,840 --> 00:54:35,870 onde algunhas opcións esperan, un dos cales é View Page Source. 859 00:54:35,870 --> 00:54:39,920 Tamén pode normalmente obter a estas cousas, indo ao menú Ver e bisbilhotando. 860 00:54:39,920 --> 00:54:42,750 Por exemplo, aquí en Ver, creador é a mesma cousa. 861 00:54:42,750 --> 00:54:45,780 Eu estou indo a ir adiante e ollar para View Page Source. 862 00:54:45,780 --> 00:54:50,800 O que vai ver é o código HTML que Mark escribiu para representar facebook.com. 863 00:54:50,800 --> 00:54:55,910 É unha desorde completa aquí, pero imos ver que iso ten sentido un pouco máis antes de tempo. 864 00:54:55,910 --> 00:54:59,840 Pero hai algúns patróns aquí. Deixe-me rolar para cousas como esta. 865 00:54:59,840 --> 00:55:05,730 Isto é difícil para un ser humano para ler, pero entende que non hai ese nivel de corchetes angulares 866 00:55:05,730 --> 00:55:10,360 con palabras clave como opción, palabras clave como valor, algunhas cordas citadas. 867 00:55:10,360 --> 00:55:15,660 Este é o lugar onde, cando se inscribiu por primeira vez, especificado que o seu ano de nacemento é. 868 00:55:15,660 --> 00:55:19,020 Este menú desplegable de anos de nacemento é de algunha maneira codificada aquí 869 00:55:19,020 --> 00:55:23,870 nesta linguaxe chamada HTML, formato Markup Language. 870 00:55:23,870 --> 00:55:27,730 Noutras palabras, cando o navegador solicita unha páxina web, 871 00:55:27,730 --> 00:55:30,610 fala esta convención chamado HTTP. 872 00:55:30,610 --> 00:55:35,170 Pero o que é facebook.com responder a esa petición con? 873 00:55:35,170 --> 00:55:38,260 >> El responde con algunhas destas mensaxes crípticas, como veremos nun momento. 874 00:55:38,260 --> 00:55:43,760 Pero a maior parte da súa resposta en forma de HTML, linguaxe de marcado de hipertexto. 875 00:55:43,760 --> 00:55:47,170 Esa é a linguaxe real en que unha páxina está escrita. 876 00:55:47,170 --> 00:55:52,030 E o que é un navegador realmente é, entón, despois do recibimento de algo que se parece iso, 877 00:55:52,030 --> 00:55:57,120 le-lo de arriba para abaixo, de esquerda a dereita, e calquera vez que ve un deses soportes angulares 878 00:55:57,120 --> 00:56:03,370 seguido por unha palabra clave como opción, el exhibe que a linguaxe de marcado de forma adecuada. 879 00:56:03,370 --> 00:56:06,820 Neste caso, sería amosar un menú de lista despregable de anos. 880 00:56:06,820 --> 00:56:09,240 Pero, de novo, iso é unha desorde completa para ollar. 881 00:56:09,240 --> 00:56:16,630 Isto non é porque os desenvolvedores de Facebook manifestan 0 a 5 de estilo, por exemplo. 882 00:56:16,630 --> 00:56:20,190 Isto é porque a maioría do código que escribir é, de feito, escribiu fermoso, 883 00:56:20,190 --> 00:56:22,450 ben comentado, así recuado, e similares, 884 00:56:22,450 --> 00:56:26,080 pero de máquinas de curso, ordenadores, navegadores realmente non dou a mínima 885 00:56:26,080 --> 00:56:27,890 se o seu código é ben estilo. 886 00:56:27,890 --> 00:56:33,100 E, en realidade, é completamente inútil para bater a tecla tab todas as veces 887 00:56:33,100 --> 00:56:37,650 e para enviar comentarios durante todo o seu código e escoller realmente descritivos nomes de variables 888 00:56:37,650 --> 00:56:42,340 porque o seu navegador non importa, todo o que está facendo ao final do día é perder máis. 889 00:56:42,340 --> 00:56:46,660 >> Así, verifícase que a maioría dos sitios de facer é mesmo que o código fonte para facebook.com, 890 00:56:46,660 --> 00:56:49,550 para cs50.net e todos eses outros sitios en Internet 891 00:56:49,550 --> 00:56:53,730 son tipicamente ben escrita e ben comentado e ben recuado e similares, 892 00:56:53,730 --> 00:56:59,270 normalmente antes do web e colocar en Internet, o código é minified, 893 00:56:59,270 --> 00:57:02,970 que o código HTML e CSS - algo que imos ver en breve - 894 00:57:02,970 --> 00:57:05,960 o código JavaScript que imos ver en breve é ​​comprimido, 895 00:57:05,960 --> 00:57:09,250 a través do cal os nomes de variables longos fan-se X e Y e Z, 896 00:57:09,250 --> 00:57:13,900 e todos os que os espazos en branco que fai todo parecer tan lexible é todo xogado fóra, 897 00:57:13,900 --> 00:57:17,700 porque se pensar sobre iso dese xeito, Facebook recibe unha páxina de millóns de accesos por día - 898 00:57:17,700 --> 00:57:21,670 unha cousa tola como esta - de xeito que un programador só para ser anal 899 00:57:21,670 --> 00:57:26,660 bateu a barra de espazo xa extra só para guión algunha liña de código sempre moito máis? 900 00:57:26,660 --> 00:57:29,500 Cal é a implicación o Facebook que preserva os espazos en branco 901 00:57:29,500 --> 00:57:32,880 en todos os bytes que enviar de volta para as persoas na internet? 902 00:57:32,880 --> 00:57:36,400 Bater a barra de espazo xa que lle dá un byte extra no seu arquivo. 903 00:57:36,400 --> 00:57:39,730 E se mil millóns de persoas, a continuación, proceder ao descargar da páxina de inicio dese día, 904 00:57:39,730 --> 00:57:42,060 canto máis datos se transmiten a través de Internet? 905 00:57:42,060 --> 00:57:45,200 Un Gigabyte por ningunha boa razón. 906 00:57:45,200 --> 00:57:48,510 E concedido por unha morea de sitios non é unha cuestión tan scalable, 907 00:57:48,510 --> 00:57:51,030 pero para o Facebook, a Google, para algúns dos sitios máis populares 908 00:57:51,030 --> 00:57:54,860 hai gran impulso financeiro para facer o seu código ollar como unha confusión 909 00:57:54,860 --> 00:57:58,980 de xeito que está a usar como algúns bytes posible, ademais de, a continuación, comprimi-lo 910 00:57:58,980 --> 00:58:01,500 usar algo como zip, un algoritmo chamado gzip, 911 00:58:01,500 --> 00:58:04,250 que o navegador fai automaticamente para ti. Pero iso é terrible. 912 00:58:04,250 --> 00:58:08,060 Nós nunca imos aprender algo sobre sitios de outras persoas e crear páxinas web 913 00:58:08,060 --> 00:58:09,680 se temos de mirar para el como este. 914 00:58:09,680 --> 00:58:13,620 >> Entón, por sorte, navegadores como Chrome e IE e Firefox estes días 915 00:58:13,620 --> 00:58:16,450 normalmente veñen con ferramentas embutidas creador. 916 00:58:16,450 --> 00:58:21,730 En realidade, se eu baixar aquí para inspeccionar elemento ou se eu for a ver, Developer 917 00:58:21,730 --> 00:58:25,220 e vaia Ferramentas de Desenvolvemento explicitamente, 918 00:58:25,220 --> 00:58:27,640 Nesta ventá, na parte inferior da pantalla do meu agora aparece. 919 00:58:27,640 --> 00:58:31,230 É un pouco intimidante no principio, porque hai unha morea de pestanas descoñecidas aquí, 920 00:58:31,230 --> 00:58:34,510 pero se eu premer en elementos todo o camiño na parte inferior esquerda, 921 00:58:34,510 --> 00:58:38,810 Chrome é, obviamente, moi intelixente. El sabe como interpretar todo este código. 922 00:58:38,810 --> 00:58:42,320 E así Chrome fai é que limpa todo HTML Facebook. 923 00:58:42,320 --> 00:58:45,680 Aínda que non hai espazo en branco alí, non hai retirada alí, 924 00:58:45,680 --> 00:58:51,120 Agora, observe que eu poida comezar a navegar nesta páxina web aínda máis xerarquicamente. 925 00:58:51,120 --> 00:58:56,910 Acontece que cada páxina web escrito nunha linguaxe chamada HTML5 debe comezar con iso, 926 00:58:56,910 --> 00:59:03,980 esta declaración DOCTYPE, por así dicir: 927 00:59:03,980 --> 00:59:07,840 É unha especie de luz e gris alí, pero esta é a primeira liña de código neste ficheiro, 928 00:59:07,840 --> 00:59:12,080 e que só di o navegador, "Ei, aquí vén algún HTML5. Aí vén unha páxina web." 929 00:59:12,080 --> 00:59:18,490 O primeiro soporte aberto alén do que vén a ser esa cousa, un soporte aberto tag HTML, 930 00:59:18,490 --> 00:59:22,320 e entón eu mergullo no máis profundo - esas frechas son completamente sen sentido; 931 00:59:22,320 --> 00:59:25,140 son só por mor da presentación, eles non están realmente no arquivo - 932 00:59:25,140 --> 00:59:30,300 entenderá que dentro de etiquetas HTML Facebook, calquera cousa que comeza cun soporte aberto 933 00:59:30,300 --> 00:59:32,910 e despois ten unha palabra é chamado de etiqueta. 934 00:59:32,910 --> 00:59:38,610 Entón, dentro da etiqueta HTML é aparentemente unha marca de cabeza e unha marca de corpo. 935 00:59:38,610 --> 00:59:41,930 Dentro da marca de cabeza agora é unha desorde toda a Facebook 936 00:59:41,930 --> 00:59:45,620 porque eles teñen unha morea de metadatos e outras cousas para o marketing e publicidade. 937 00:59:45,620 --> 00:59:50,600 >> Pero se rolar para abaixo, abaixo, abaixo, abaixo, imos ver onde está. Aquí está. 938 00:59:50,600 --> 00:59:52,210 Este é polo menos un pouco familiarizado. 939 00:59:52,210 --> 00:59:55,990 O título da páxina de Facebook de casa, se ollar na guía na súa barra de título, 940 00:59:55,990 --> 00:59:59,060 é Benvido ao Facebook - Log In, Registre-se ou saber máis. 941 00:59:59,060 --> 01:00:01,110 Isto é o que ve na barra de Chrome título, 942 01:00:01,110 --> 01:00:03,100 e é así que é representado no código. 943 01:00:03,100 --> 01:00:08,090 Se ignorar todo na cabeza, a maior parte das entrañas dunha páxina web están no corpo, 944 01:00:08,090 --> 01:00:10,940 e verifícase que o código de Facebook vai mirar máis complexo 945 01:00:10,940 --> 01:00:14,540 que a maioría das cousas que vou escribir inicialmente só porque foi construído ao longo dos anos, 946 01:00:14,540 --> 01:00:17,260 pero hai unha morea de marcas de script, o código JavaScript, 947 01:00:17,260 --> 01:00:18,870 que fai o sitio moi interactivo: 948 01:00:18,870 --> 01:00:22,330 ver actualizacións de estado instantáneamente utilizando linguaxes como JavaScript. 949 01:00:22,330 --> 01:00:25,270 Hai unha cousa chamada div, que é unha división dunha páxina. 950 01:00:25,270 --> 01:00:27,940 Pero antes de chegar a ese detalle, imos tentar diminuír o zoom 951 01:00:27,940 --> 01:00:31,920 e ollar para a versión máis sinxela de Facebook 1.0, por así dicir. 952 01:00:31,920 --> 01:00:34,740 Aquí está o mundo, Ola de páxinas web. 953 01:00:34,740 --> 01:00:37,370 El ten esa declaración DOCTYPE arriba 954 01:00:37,370 --> 01:00:40,280 que é un pouco diferente de todo o resto. 955 01:00:40,280 --> 01:00:46,130 Nada máis que escribir nunha páxina web vai comezar con 01:00:48,880 e excepto por unha cousa chamada comentarios HTML. 957 01:00:48,880 --> 01:00:53,000 Pero para a maior parte, todo nunha páxina web está aberta soporte, soporte clave, preto. 958 01:00:53,000 --> 01:00:56,220 >> Neste caso, podes ver a máis simple das páxinas web posíbeis. 959 01:00:56,220 --> 01:01:00,260 A etiqueta HTML contén unha marca de cabeza e que contén unha etiqueta corpo, 960 01:01:00,260 --> 01:01:04,580 de notar que non hai esa noción de partida e parada etiquetas. 961 01:01:04,580 --> 01:01:11,360 Esta é a marca de inicio para HTML, esta é a etiqueta de peche ou a etiqueta final. 962 01:01:11,360 --> 01:01:15,400 Repare que son unha especie de opostos no sentido de que a etiqueta preto ou etiqueta final 963 01:01:15,400 --> 01:01:20,030 ten esa barra dentro de si. 964 01:01:20,030 --> 01:01:23,540 Mentres tanto, hai unha marca de cabeza aberta aquí e unha marca de cabeza preto aquí. 965 01:01:23,540 --> 01:01:26,880 >> Hai un título aberto e un título de tag preto aquí. 966 01:01:26,880 --> 01:01:29,850 O feito de ter colocado o título nunha liña, puramente arbitraria. 967 01:01:29,850 --> 01:01:33,760 El só parecía que ía encaixar moi ben nunha soa liña, entón eu non me incomodei premer Intro algunhas veces. 968 01:01:33,760 --> 01:01:38,200 Mentres tanto, o corpo que eu fixen guión só para estar sempre tan clara. 969 01:01:38,200 --> 01:01:41,050 Teña en conta que o HTML é unha linguaxe moi burro. 970 01:01:41,050 --> 01:01:43,410 De feito, volve o día anterior había editores WYSIWYG 971 01:01:43,410 --> 01:01:46,770 e Microsoft Word onde podes dicir: "Faino resaltado, en cursiva facer este", 972 01:01:46,770 --> 01:01:50,850 realmente escribir ordes pequenos ensaios en 20 + anos 973 01:01:50,850 --> 01:01:55,740 en que diría, "Comezar a facer este texto en negra. Pare de facer este texto en negra." 974 01:01:55,740 --> 01:01:59,010 "Comezar a facer este texto en cursiva. Pare de facelo cursiva texto." 975 01:01:59,010 --> 01:02:01,850 >> Isto é o que HTML ou calquera linguaxe de marcado é. 976 01:02:01,850 --> 01:02:05,530 Esta primeira marca di: "Ei, navegador. Aí vén un pouco de HTML." 977 01:02:05,530 --> 01:02:09,880 A próxima marca di: "Ei, navegador. Aí vén a cabeza, a cabeceira da miña páxina web." 978 01:02:09,880 --> 01:02:11,650 "Ei, navegador. Aquí vén o título." 979 01:02:11,650 --> 01:02:15,880 E entón, por aquí, "Ei, navegador. Isto é todo para o título." 980 01:02:15,880 --> 01:02:20,000 Entón é así que o navegador saiba non amosar máis caracteres que Ola, mundo 981 01:02:20,000 --> 01:02:21,860 na barra de título. 982 01:02:21,860 --> 01:02:23,640 Mentres tanto, este di: "Isto é todo para a cabeza." 983 01:02:23,640 --> 01:02:28,340 Este di: "Aquí vén o corpo Aquí está o corpo real." - Literalmente, as palabras Ola mundo. 984 01:02:28,340 --> 01:02:33,190 E isto di aquí: "Isto é todo para o corpo. Isto é todo o código HTML." 985 01:02:33,190 --> 01:02:34,640 Así, os navegadores son moi burro. 986 01:02:34,640 --> 01:02:39,920 Eles só ler estas cousas de arriba para abaixo, de esquerda a dereita, e facer exactamente o que eles din que facer. 987 01:02:39,920 --> 01:02:41,860 Imos realmente facer un pequeno exemplo aquí. 988 01:02:41,860 --> 01:02:46,240 Deixe-me abrir o máis simple dos programas no meu Mac aquí, ou sexa, TextEdit. 989 01:02:46,240 --> 01:02:48,220 En Windows, podes usar Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Pero iso é todo o que precisas para comezar a facer páxinas web. 991 01:02:50,520 --> 01:02:53,730 Eu estou indo a ir adiante e só copiar e pegar este código neste arquivo. 992 01:02:53,730 --> 01:02:57,210 Eu estou indo a ir adiante e salva-o no meu escritorio, 993 01:02:57,210 --> 01:03:01,220 e eu vou gardar como hello.html, 994 01:03:01,220 --> 01:03:03,840 e agora o ficheiro chámase hello.html. 995 01:03:03,840 --> 01:03:05,690 Aquí é a miña zona de traballo. 996 01:03:05,690 --> 01:03:11,130 Déixame ir nun navegador e arrastrar o ficheiro para o navegador. 997 01:03:11,130 --> 01:03:14,060 E listo, aquí está a miña páxina web primeiro. 998 01:03:14,060 --> 01:03:17,340 Teña en conta que o título da guía é Ola, mundo de acordo coa tag título, 999 01:03:17,340 --> 01:03:20,040 e observe que Ola, mundo é o corpo da miña páxina web, 1000 01:03:20,040 --> 01:03:22,190 e Woo-Hoo, eu estou en internet. 1001 01:03:22,190 --> 01:03:24,700 >> Eu non son realmente, non, porque este ficheiro non está en Internet. 1002 01:03:24,700 --> 01:03:28,330 El pasa a ser no meu disco duro local en que determinado camiño. 1003 01:03:28,330 --> 01:03:32,720 Pero a idea é a mesma. Todo o que necesitamos agora é un servidor web para que cargalo. 1004 01:03:32,720 --> 01:03:37,410 Pero primeiro imos realmente introducir complexidade un pouco máis e un pouco máis de estilización. 1005 01:03:37,410 --> 01:03:39,890 Este é un simple, se aburrido páxina web. 1006 01:03:39,890 --> 01:03:41,990 Acontece que hai outros tipos de marcas que podemos utilizar. 1007 01:03:41,990 --> 01:03:45,530 Por exemplo, aquí en amarelo eu introducín dúas novas etiquetas. 1008 01:03:45,530 --> 01:03:49,630 Non imos xogar moito con eses de hoxe, pero entender que a etiqueta ligazón 1009 01:03:49,630 --> 01:03:52,520 de algunha maneira, parece diferente de todo o resto. 1010 01:03:52,520 --> 01:03:55,370 A etiqueta enlace leva o que son chamados de atributos, 1011 01:03:55,370 --> 01:03:59,770 é un atributo é algo que modifica o comportamento dunha etiqueta. 1012 01:03:59,770 --> 01:04:03,840 Neste caso, esta non é a mellor opción de nomes, enlace, porque é unha especie de sentido, 1013 01:04:03,840 --> 01:04:11,590 pero esta etiqueta ligazón di, esencialmente, incluír o arquivo chamado styles.css dentro da miña páxina web. 1014 01:04:11,590 --> 01:04:15,400 Podes pensar niso como análogo ao C # include Directiva. 1015 01:04:15,400 --> 01:04:19,650 Styles.css está referíndose a unha linguaxe totalmente diferente que non imos xogar hoxe, 1016 01:04:19,650 --> 01:04:23,790 pero é a estética: os tamaños de fonte, cor, recheo de retirada, marxes, 1017 01:04:23,790 --> 01:04:26,040 e de todos os que tipo de detalle a estética. 1018 01:04:26,040 --> 01:04:28,820 Mentres tanto, a marca de script é funcionalmente semellante, 1019 01:04:28,820 --> 01:04:33,140 pero en vez de include CSS, que a linguaxe, que inclúe outro idioma, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Polo tanto, noutras palabras, con estas dúas marcas que eu, finalmente, ser capaz de escribir a miña propia páxina web 1021 01:04:37,810 --> 01:04:41,490 pero tamén puxar o código que ou calquera outra persoa que teña escrito 1022 01:04:41,490 --> 01:04:44,350 para que poidamos estar nos ombros de outras persoas, podemos practicar un bo deseño, 1023 01:04:44,350 --> 01:04:46,120 fatorar código común. 1024 01:04:46,120 --> 01:04:49,090 Se eu teño 10 páxinas web diferentes, isto significa que algúns dos meus estética 1025 01:04:49,090 --> 01:04:52,490 pode ser fatorada, así como # include, nun ficheiro separado. 1026 01:04:52,490 --> 01:04:54,420 Entón, nós estamos chegando alí. 1027 01:04:54,420 --> 01:04:57,180 Pero primeiro imos realmente facer algo máis interesante con este ficheiro. 1028 01:04:57,180 --> 01:05:01,110 >> Unha vez máis, este é só o TextEdit. Eu non son tecnicamente en internet aínda, pero nós imos chegar alí. 1029 01:05:01,110 --> 01:05:04,910 Gustaríame facer Ola, mundo un pouco máis ousado que é. 1030 01:05:04,910 --> 01:05:10,890 Así Ola, imos dicir arbitrariamente para negriña. 1031 01:05:10,890 --> 01:05:15,910 Unha vez máis, a historia é a mesma: Ola, coma, comezar a facelo en negra, 1032 01:05:15,910 --> 01:05:19,730 entón o mundo está impreso en negriña, e iso significa deixar de imprimir esta en negra. 1033 01:05:19,730 --> 01:05:24,020 Deixe-me ir adiante e gardar o meu arquivo, volva para o Chrome, eu vou aumentar o zoom só para que poidamos velo mellor, 1034 01:05:24,020 --> 01:05:27,870 e recargar, e vai ver que o mundo está agora en negra. 1035 01:05:27,870 --> 01:05:31,810 A web é todo sobre hiperlinks, entón imos seguir adiante e facelo: 1036 01:05:31,810 --> 01:05:38,550 o meu sitio favorito é, imos dicir, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Gardar, recargar. Okay. Hai algúns problemas agora ademais da hediondez do sitio web. 1038 01:05:43,810 --> 01:05:47,310 1, eu estou seguro que eu prema Intro aquí. E eu fixen. 1039 01:05:47,310 --> 01:05:51,590 Non só prema Intro, eu tamén recuado, practicando o que estamos predicando sobre o estilo, 1040 01:05:51,590 --> 01:05:54,930 pero a miña é ben próximo ao mundo. 1041 01:05:54,930 --> 01:05:58,410 Entón, por que é isto? Navegadores só facer o que lles din que facer. 1042 01:05:58,410 --> 01:06:04,010 Eu non dixo o navegador, "liñas de romper aquí. Introduza parágrafo romper aquí." 1043 01:06:04,010 --> 01:06:07,820 Así, o navegador, non importa se eu acertar retorno de 30 veces, 1044 01:06:07,820 --> 01:06:10,820 ela aínda vai poñer o meu xunto mundo. 1045 01:06:10,820 --> 01:06:15,930 O que eu realmente teño que facer aquí é dicir algo así como
, insira unha quebra de liña. 1046 01:06:15,930 --> 01:06:17,940 >> E, de feito, un salto de liña é un tipo de cousa estraña 1047 01:06:17,940 --> 01:06:21,650 porque non pode realmente comezar a moverse para outra liña, a continuación, facer algo, 1048 01:06:21,650 --> 01:06:25,380 e, a continuación, deixar de se mover para unha nova liña. É unha especie de unha operación atómica. 1049 01:06:25,380 --> 01:06:28,140 Queres facelo ou non. Vostede escriba Intro ou non. 1050 01:06:28,140 --> 01:06:33,390 Entón br é un pouco dunha marca diferente, e por iso eu teño para clasificar tanto abrir e pechar 1051 01:06:33,390 --> 01:06:35,230 dunha soa vez. 1052 01:06:35,230 --> 01:06:37,500 A sintaxe para iso. 1053 01:06:37,500 --> 01:06:41,760 Tecnicamente, podería facer algo así en algunhas versións de HTML, 1054 01:06:41,760 --> 01:06:45,600 pero iso é unha estupidez, porque non hai ningunha razón para iniciar e deter algo 1055 01:06:45,600 --> 01:06:48,420 se pode facelo, en vez de unha soa vez. 1056 01:06:48,420 --> 01:06:52,310 Entenda que o HTML5 non estrictamente esixe esa barra, 1057 01:06:52,310 --> 01:06:55,410 así vai ver libros de texto e recursos en liña que non o posúen, 1058 01:06:55,410 --> 01:06:59,780 pero para unha boa medida imos practicar a simetría que vimos ata agora. 1059 01:06:59,780 --> 01:07:02,870 Isto significa que a etiqueta é tamén aberto e pechado. 1060 01:07:02,870 --> 01:07:05,220 Entón, agora déixeme gardar o meu arquivo, volva aquí. 1061 01:07:05,220 --> 01:07:10,240 Ok, iso está comezando a parecer mellor, excepto a web que sei é tipo de previsión, 1062 01:07:10,240 --> 01:07:13,610 e aínda youtube aquí non parece levar a nada. 1063 01:07:13,610 --> 01:07:17,560 Isto porque aínda que el se parece con unha ligazón, o seu navegador non sabe que, por si só, 1064 01:07:17,560 --> 01:07:20,670 entón eu teño que dicir ao navegador que este é un enlace. 1065 01:07:20,670 --> 01:07:22,620 >> A forma de facelo é empregar unha marca de referencia: 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 e deixe-me pasar isto para unha nova liña só por iso é un pouco máis lexible, 1069 01:07:38,490 --> 01:07:40,060 e eu vou diminuír o tamaño da fonte. 1070 01:07:40,060 --> 01:07:43,890 Estou feito aínda? Non Non vai ser esta dicotomía. 1071 01:07:43,890 --> 01:07:46,760 Esta marca, a marca de referencia, de feito, tomar un atributo, 1072 01:07:46,760 --> 01:07:52,900 que modifica o seu comportamento, eo valor deste atributo é aparentemente URL de YouTube. 1073 01:07:52,900 --> 01:07:56,380 Pero teña en conta a dicotomía é que só porque esa é a URL que está indo, 1074 01:07:56,380 --> 01:08:01,020 iso non significa que ten que ser a palabra que está destacando e facendo unha ligazón. 1075 01:08:01,020 --> 01:08:03,960 En vez diso, que pode ser algo como isto. 1076 01:08:03,960 --> 01:08:10,870 Entón, eu teño que dicir que deixar de facer esa palabra un hipervínculo a usar a etiqueta referencia preto. 1077 01:08:10,870 --> 01:08:12,650 Repare que eu non estou facendo iso. 1078 01:08:12,650 --> 01:08:15,890 1, este sería só un desperdicio de tempo de todos e que non é necesario. 1079 01:08:15,890 --> 01:08:19,290 >> Para pechar unha etiqueta, só mencionar o nome da marca de novo. 1080 01:08:19,290 --> 01:08:21,800 Non menciona calquera dos atributos. 1081 01:08:21,800 --> 01:08:26,189 Entón, imos gardar este, volver. Ok, preparado, agora é azul e hiperenlace. 1082 01:08:26,189 --> 01:08:29,430 Se eu premer nel, realmente ir ao YouTube. 1083 01:08:29,430 --> 01:08:32,529 Así, aínda que a miña páxina web non está en Internet, é, como mínimo, HTML, 1084 01:08:32,529 --> 01:08:37,930 e deixamos a Internet incorporarse, nós realmente acabar aquí no youtube.com. 1085 01:08:37,930 --> 01:08:40,670 E podo volver e aquí está a miña páxina web. Pero entender iso. 1086 01:08:40,670 --> 01:08:43,120 Se xa cheguei de spam ou dun ataque de phishing, 1087 01:08:43,120 --> 01:08:45,850 agora ten a capacidade despois de só cinco minutos para facer o mesmo. 1088 01:08:45,850 --> 01:08:50,920 Podemos ir aquí e facer algo como www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 ou o que o sitio é esbozado, e entón pode dicir comprobar a súa conta PayPal 1090 01:08:59,319 --> 01:09:04,840 [Risas] E agora iso está indo a ir a badguy.com, que eu non estou indo a premer en 1091 01:09:04,840 --> 01:09:08,000 porque eu non teño idea de onde que leva. [Risas] 1092 01:09:08,000 --> 01:09:10,859 >> Pero agora temos a capacidade de realmente acabar alí. 1093 01:09:10,859 --> 01:09:12,640 Entón, nós estamos realmente empezando a rabuñar a superficie. 1094 01:09:12,640 --> 01:09:15,830 Non estamos a programación por si só, estamos escribindo linguaxe de marcado. 1095 01:09:15,830 --> 01:09:18,569 Pero así que completar o noso vocabulario en HTML, 1096 01:09:18,569 --> 01:09:21,520 imos introducir PHP, unha linguaxe de programación real 1097 01:09:21,520 --> 01:09:26,859 que nos permitirá xerar HTML automaticamente xerar CSS automaticamente 1098 01:09:26,859 --> 01:09:29,430 para que poidamos comezar o mércores para aplicar, por exemplo, 1099 01:09:29,430 --> 01:09:31,700 o noso propio motor de procura e moito máis. 1100 01:09:31,700 --> 01:09:34,770 Pero, máis que nun par de días. Imos ver entón. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]