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 Tudo bem. Bem-vindo de volta. Este é CS50, e este é o início da semana 7. 5 00:00:12,280 --> 00:00:14,690 Um par de pequenos anúncios: 6 00:00:14,690 --> 00:00:18,150 Pset5 está em andamento, ou em breve será, 7 00:00:18,150 --> 00:00:21,590 e deixe-me dizer, muito sinceramente, este tende a estar entre os mais desafiador 8 00:00:21,590 --> 00:00:24,460 de conjuntos do curso de problema, então deixe-me falar isso agora 9 00:00:24,460 --> 00:00:28,190 de modo que esta semana mais do que nunca que você não espere até que, digamos, na noite de quarta 10 00:00:28,190 --> 00:00:29,920 ou quinta à noite para mergulhar dentro 11 00:00:29,920 --> 00:00:32,369 Esta é definitivamente uma pset interessante. Nós pensamos que é divertido. 12 00:00:32,369 --> 00:00:36,110 Se você realmente obtê-lo totalmente correta e pode, então, desafiar o Conselho chamados grandes, 13 00:00:36,110 --> 00:00:39,830 você vai ter a oportunidade de combinar inteligência com alguns dos funcionários do curso 14 00:00:39,830 --> 00:00:41,620 e alguns de seus colegas de classe. 15 00:00:41,620 --> 00:00:44,670 O que o Big Board é, é uma vez que você tem o seu trabalho corretor ortográfico, 16 00:00:44,670 --> 00:00:48,860 você será capaz de ir para cs50.net após a execução de um comando, 17 00:00:48,860 --> 00:00:52,430 puramente optar, em seguida, a quantidade de tempo e a quantidade de RAM e mais 18 00:00:52,430 --> 00:00:56,130 que você usou em sua implementação serão expostos aqui na página do curso casa. 19 00:00:56,130 --> 00:00:59,740 Você vai perceber que um monte dessas pessoas aqui são listados como equipe 20 00:00:59,740 --> 00:01:04,220 desde o fim de semana, a equipe pensou que seria divertido tentar superar uns aos outros. 21 00:01:04,220 --> 00:01:07,390 Então percebe que o objetivo aqui não é superar o pessoal. 22 00:01:07,390 --> 00:01:09,790 Mesmo que eu só estou aqui, no número 13. 23 00:01:09,790 --> 00:01:13,790 Puramente optar, mas é uma oportunidade para ver o quão pouca memória RAM 24 00:01:13,790 --> 00:01:16,790 e como alguns segundos de CPU você pode usar vis-a-vis alguns de seus colegas de classe. 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 posição número 1 como um dos TFs, 27 00:01:23,750 --> 00:01:28,120 Esta é uma implementação que não chamam possível 28 00:01:28,120 --> 00:01:32,700 uma vez que ele está usando quase 0 RAM e quase 0 segundo para o carregamento. 29 00:01:32,700 --> 00:01:35,670 Então, vamos cuidar de Kevin desligada. [Risos] 30 00:01:35,670 --> 00:01:40,950 Há certas habilidades que Kevin está colocando à prova aqui. 31 00:01:40,950 --> 00:01:45,280 Uma das coisas que nós pensamos em fazer também é agora CS50x é uma semana em curso, 32 00:01:45,280 --> 00:01:49,520 e vocês são tanto uma parte desse experimento como esses estudantes são. 33 00:01:49,520 --> 00:01:53,720 Pedimo-lhes como parte de sua pset0, que foi igualmente a apresentar um projecto Scratch 34 00:01:53,720 --> 00:01:58,280 de interesse para eles - um jogo, uma peça interativa de arte, uma animação, ou similar - 35 00:01:58,280 --> 00:02:03,700 a 1 - vídeo de dois minutos, se eles gostariam, dizendo Olá para o mundo e que elas realmente são. 36 00:02:03,700 --> 00:02:06,780 Eu pensei que eu iria compartilhar com você apenas um par de vídeos que foram apresentados até agora 37 00:02:06,780 --> 00:02:10,759 porque para nós, na equipe, pelo menos, ele realmente foi emocionante 38 00:02:10,759 --> 00:02:14,220 e inspirador ver essas pessoas de todo o mundo - países de todo o mundo - 39 00:02:14,220 --> 00:02:18,160 em sintonia, de todas as coisas, para um curso de ciência da computação na Internet, 40 00:02:18,160 --> 00:02:20,410 se é porque eles querem continuar seus estudos, 41 00:02:20,410 --> 00:02:22,300 eles querem tomar suas carreiras em uma nova direção, 42 00:02:22,300 --> 00:02:24,390 eles querem preencher as lacunas em seu conhecimento, 43 00:02:24,390 --> 00:02:27,190 portanto, algumas das mesmas razões que vocês talvez tenham sido aqui. 44 00:02:27,190 --> 00:02:31,090 >> Então, eu dar-lhe um tal estudante aqui. Você poderia aumentar o volume um pouco. 45 00:02:31,090 --> 00:02:35,520 Aqui está um dos nossos alunos de 1 minuto submissões. 46 00:02:35,520 --> 00:02:40,380 Olá, mundo. Eu sou um estudante de engenharia industrial aqui em Málaga, Espanha. 47 00:02:40,380 --> 00:02:45,840 Estou animado com este curso on-line, porque eu amo a ciência da computação, eu realmente fazer, 48 00:02:45,840 --> 00:02:48,880 e eu realmente aprecio que eu começar a explorá-lo. 49 00:02:48,880 --> 00:02:51,940 E o fato de que eu possa aprender o mesmo de todos vocês fazem 50 00:02:51,940 --> 00:02:57,040 mas, em vez de estar em Harvard estou em Málaga, como impressionante é isso? 51 00:02:57,040 --> 00:03:02,040 Bem, eu sou Fernando, e este é o CS50. Vejo vocês. 52 00:03:02,040 --> 00:03:07,100 [Risos] Outro clipe que gostamos muito, você vai achar que este cavalheiro Inglês não é tão forte. 53 00:03:07,100 --> 00:03:11,520 Parece que ele tinha uma tradução automática, assim que as traduções são um pouco imperfeito, 54 00:03:11,520 --> 00:03:15,790 mas este foi um dos nossos favoritos, até agora, também. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Olá, mundo. [Falando em japonês] 57 00:03:32,370 --> 00:03:39,830 [Eu tenho que cumprimentar em japonês, porque o meu Inglês é muito confiável.] 58 00:03:39,830 --> 00:03:45,380 [Eu entreguei a mensagem para você da cidade de Gifu, no Japão]. 59 00:03:45,380 --> 00:03:49,820 [I pode ser um estudante, pela primeira vez em 20 anos, como pode ser visto.] 60 00:03:49,820 --> 00:03:54,640 [Eu sou muito grato a Universidade de Harvard, que me deu esta oportunidade e EDX.] 61 00:03:54,640 --> 00:04:01,510 [Golf é um violão e minha coisa favorita em execução.] [Risos] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Por que você acha que eu estava tentando assistir a uma cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Universidade de Harvard, é o meu desejo.] 65 00:04:14,990 --> 00:04:19,740 [Especialmente se eu sou presença distante viveu no Japão]. 66 00:04:19,740 --> 00:04:26,680 [Eu queria tentar de imediato conhecimento da existência de tal quando EDX.] 67 00:04:26,680 --> 00:04:32,500 [Você não acha que você não relacionado com a idade do aprendizado I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 é o meu desejo. 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 de nosso foi esta submissão aqui de alguém. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google se você não estiver familiarizado com esse meme. 72 00:04:55,380 --> 00:05:01,480 >> E então, finalmente, um par de outros que foi publicado que, talvez, ganhar o prêmio adorável. 73 00:05:01,480 --> 00:05:06,820 [Estudantes] Aww! >> [Malan] Nós vamos ter que ouvir. Esta é curto, para ouvir de perto. 74 00:05:08,580 --> 00:05:11,150 [Orador feminino] Qual é o seu nome? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Orador feminino] O que é isso? >> [Risos] CS50. [Risos] 76 00:05:16,120 --> 00:05:19,510 [Malan] Ele fez dois takes, no entanto. 77 00:05:19,510 --> 00:05:22,240 Aqui vamos nós, a última. 78 00:05:23,030 --> 00:05:26,980 Meu nome é Louie, e este é o CS50. 79 00:05:26,980 --> 00:05:30,250 [Risos] Isso, então, é CS50x. 80 00:05:30,250 --> 00:05:33,230 Obrigado a todos aqueles que ao seguir junto em casa 81 00:05:33,230 --> 00:05:35,620 que têm sido, até agora, que participa. 82 00:05:35,620 --> 00:05:39,510 Hoje, podemos concluir nossa discussão de estruturas de dados, 83 00:05:39,510 --> 00:05:41,160 pelo menos, alguns dos mais fundamental, 84 00:05:41,160 --> 00:05:44,760 e depois continuamos nossa conversa sobre HTML e programação web. 85 00:05:44,760 --> 00:05:48,520 Na verdade, passamos o passado cerca de sete semanas procurando nos fundamentos da programação - 86 00:05:48,520 --> 00:05:50,450 algoritmos, estruturas de dados, e outros semelhantes - 87 00:05:50,450 --> 00:05:53,050 e C, como você pode ter experimentado até agora, 88 00:05:53,050 --> 00:05:57,060 não é necessariamente o mais acessível de línguas 89 00:05:57,060 --> 00:05:59,090 com que a execução de algumas dessas idéias. 90 00:05:59,090 --> 00:06:01,880 E assim a partir desta semana e na próxima semana e então o seguinte, 91 00:06:01,880 --> 00:06:07,110 vamos finalmente ser capaz de transição a partir de C, a qual é geralmente conhecida como uma língua relativamente baixo nível, 92 00:06:07,110 --> 00:06:11,190 para coisas de mais alto nível, entre eles PHP, JavaScript, e similares, 93 00:06:11,190 --> 00:06:14,850 que veremos aproveitar as mesmas lições que aprendemos ao longo das últimas semanas, 94 00:06:14,850 --> 00:06:19,430 mas você vai descobrir que declarar as coisas como matrizes e tabelas hash e pesquisa e classificação 95 00:06:19,430 --> 00:06:23,370 tornar-se muito mais fácil, porque os idiomas próprios vamos começar a usar 96 00:06:23,370 --> 00:06:25,290 vai se tornar mais poderoso. 97 00:06:25,290 --> 00:06:27,410 Mas, primeiro, um pedido de árvores. 98 00:06:27,410 --> 00:06:30,240 É muito comum nos dias de hoje a necessidade de comprimir informações. 99 00:06:30,240 --> 00:06:34,770 Em que contexto você quer comprimir algum tipo de informação digital? 100 00:06:37,190 --> 00:06:39,670 >> Sim. >> [Aluno] Quando você precisa enviá-lo através da Internet. 101 00:06:39,670 --> 00:06:41,450 Sim, quando você quer enviar alguma coisa pela web. 102 00:06:41,450 --> 00:06:44,950 Se você deseja fazer o download de um arquivo grande, é ideal se alguém do outro lado 103 00:06:44,950 --> 00:06:48,760 comprimiu o arquivo usando um formato zip ou algo parecido 104 00:06:48,760 --> 00:06:53,760 de modo que você está enviando menos bits do que poderia ser transmitidos. 105 00:06:53,760 --> 00:06:55,500 Assim como você comprimir informação? 106 00:06:55,500 --> 00:07:00,540 Tudo se resume a usar menos bits do que são exigidos por padrão. 107 00:07:00,540 --> 00:07:03,220 Mas este é um tipo de coisa curiosa, porque acha que volta para 0 e 1 semana 108 00:07:03,220 --> 00:07:07,370 quando falamos sobre ASCII e binário e nós conversamos sobre ASCII em particular 109 00:07:07,370 --> 00:07:10,690 como a utilização de 8 bits para representar as letras do alfabeto 110 00:07:10,690 --> 00:07:16,120 de modo que a letra A é representada por 65, minúsculas a é o número 97, 111 00:07:16,120 --> 00:07:21,210 e no entanto você representar o 65 ou 97, você está usando 7 ou 8 bits. 112 00:07:21,210 --> 00:07:24,120 Mas o problema é que há algumas letras no alfabeto Inglês 113 00:07:24,120 --> 00:07:26,230 que não são tão populares quanto os outros. 114 00:07:26,230 --> 00:07:31,600 Z não é tudo o que popular, Q não é tudo o que popular, mas A e E são super popular. 115 00:07:31,600 --> 00:07:37,280 E ainda para todas estas cartas, por padrão, o mundo usa o mesmo número de bits, de apenas 8. 116 00:07:37,280 --> 00:07:42,690 Portanto, não teria sido mais inteligente se, em vez de usar 8 bits para cada letra, 117 00:07:42,690 --> 00:07:47,440 mesmo o mais 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 mais populares 119 00:07:51,910 --> 00:07:55,000 e usados ​​mais bits para as letras menos populares, 120 00:07:55,000 --> 00:07:57,770 a idéia é otimizar vamos para o caso comum, 121 00:07:57,770 --> 00:08:01,160 que é um tema em ciência da computação de tentar otimizar o que vai acontecer mais 122 00:08:01,160 --> 00:08:05,310 e passar um pouco mais de tempo, um pouco mais de espaço para as coisas que, sim, pode acontecer 123 00:08:05,310 --> 00:08:07,680 mas não necessariamente com tanta freqüência. 124 00:08:07,680 --> 00:08:09,330 Então, vamos dar um exemplo. 125 00:08:09,330 --> 00:08:12,610 >> Suponha que queremos codificar a informação bastante eficiente. 126 00:08:12,610 --> 00:08:15,090 Você pode ter crescido sabendo um pouco sobre o código Morse, 127 00:08:15,090 --> 00:08:17,450 e as probabilidades são que você não sabia o código real, 128 00:08:17,450 --> 00:08:21,750 mas você deve se lembrar que ele é, pelo menos, esta série de pontos e traços. 129 00:08:21,750 --> 00:08:26,640 Esta é uma codificação bastante eficiente, e observe que a carta do mais popular - por exemplo, E - 130 00:08:26,640 --> 00:08:28,980 usa a mais curta de sinais sonoros. 131 00:08:28,980 --> 00:08:31,740 O código Morse é tudo sobre bip-bip-bip-bip-bip-bip e segurando 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 indicado pelo ponto, é um sinal de super curta, apenas bip, e isso representaria E. 134 00:08:40,330 --> 00:08:43,960 Em contraste, T seria um bip longo, como bip [prolonga som], 135 00:08:43,960 --> 00:08:45,710 e que representaria T. 136 00:08:45,710 --> 00:08:48,840 Mas isso ainda é muito curto, porque, por outro lado, se você olhar para Z, 137 00:08:48,840 --> 00:08:52,690 para expressar Z você iria beep, beep [mais som], beep, beep [som mais curta]. 138 00:08:52,690 --> 00:08:55,360 Então, é mais porque é menos comum. 139 00:08:55,360 --> 00:08:58,150 Mas a pegadinha aqui é que o código Morse é um pouco falho 140 00:08:58,150 --> 00:09:00,610 em que não é imediatamente decodable. 141 00:09:00,610 --> 00:09:07,350 Por exemplo, suponha que você ouve em algum fim do bip fio [curto], beep [longa]. 142 00:09:07,350 --> 00:09:12,480 Qual a mensagem que eu acabei de receber? Um ponto e um traço. O que isso representa? 143 00:09:12,480 --> 00:09:15,330 [Estudante] A. >> [Malan] Talvez. 144 00:09:15,330 --> 00:09:18,270 Também poderia ser E seguido por T. 145 00:09:18,270 --> 00:09:23,390 Em outras palavras, o código Morse, embora aproveita este princípio de optimizar o processo de canto, 146 00:09:23,390 --> 00:09:26,250 não se presta a Decodificação imediato. 147 00:09:26,250 --> 00:09:29,850 Isto é, o ser humano que está ouvindo ou receber esses pontos e traços 148 00:09:29,850 --> 00:09:34,540 tem de alguma forma descobrir onde os intervalos são entre as letras, 149 00:09:34,540 --> 00:09:39,660 porque se você não sabe onde as quebras são, você pode confundir um para ET ou vice-versa. 150 00:09:39,660 --> 00:09:43,880 >> Então, o que você poderia fazer? Em código Morse que você poderia apenas fazer uma pausa entre cada uma das letras. 151 00:09:43,880 --> 00:09:47,660 Mas a pausa é uma espécie de contador para o ponto de acelerar as coisas. 152 00:09:47,660 --> 00:09:52,880 Então, o que se em vez disso, veio com um código onde não havia essa situação ruim 153 00:09:52,880 --> 00:09:56,570 em que E é um prefixo, por exemplo, de A - 154 00:09:56,570 --> 00:10:00,020 em outras palavras, se pudéssemos ter certeza de que os padrões são ainda curto para as letras populares 155 00:10:00,020 --> 00:10:04,850 tempo para as letras menos populares, mas não há confusão possível? 156 00:10:04,850 --> 00:10:08,930 Um homem com o nome de Huffman anos atrás inventou esse esquema chamado de código de Huffman 157 00:10:08,930 --> 00:10:12,390 que realmente aproveita uma das estruturas de dados que passamos um pouco de tempo falando sobre 158 00:10:12,390 --> 00:10:16,560 na semana passada, que de árvores, árvores binárias especificamente - 159 00:10:16,560 --> 00:10:19,710 um significado árvore binária que não tem mais do que duas crianças. 160 00:10:19,710 --> 00:10:22,720 Tem talvez um filho esquerdo, talvez uma criança direita, e é isso. 161 00:10:22,720 --> 00:10:26,510 Então suponho que apenas por uma questão de discussão que alguém queira enviar uma mensagem 162 00:10:26,510 --> 00:10:31,270 que se parece com isso. É um completo disparate, mas é composto de As, Bs, Cs, Ds e Es. 163 00:10:31,270 --> 00:10:34,890 E se você realmente contar-se todos os As, Bs, Cs, Ds e Es 164 00:10:34,890 --> 00:10:36,870 e depois dividir pelo número total de letras, 165 00:10:36,870 --> 00:10:42,710 este quadro pouco aqui diz que 45% das cartas são Es, 20% são como, 166 00:10:42,710 --> 00:10:45,010 10% Bs, e assim por diante. 167 00:10:45,010 --> 00:10:47,330 Portanto, em outras palavras, assumir que a string lá 168 00:10:47,330 --> 00:10:49,080 é apenas uma mensagem que você quer enviar. 169 00:10:49,080 --> 00:10:52,180 Ele passa a ser um disparate só assim podemos usar como letras quanto possível, 170 00:10:52,180 --> 00:10:55,220 mas é verdade que permanece E o mais popular, 171 00:10:55,220 --> 00:11:01,450 e B e C são as menos populares, pelo menos, uma dessas 5 letras do alfabeto. 172 00:11:01,450 --> 00:11:04,040 Então, como podemos ir em chegar com uma codificação, 173 00:11:04,040 --> 00:11:08,430 uma codificação binária, um padrão de 0 e 1 para cada uma dessas cartas 174 00:11:08,430 --> 00:11:14,820 de tal modo que E é um padrão de curto e talvez B e C são padrões ligeiramente mais longos, 175 00:11:14,820 --> 00:11:19,270 novamente, a idéia de que nós queremos usar menos bits maior parte do tempo 176 00:11:19,270 --> 00:11:21,790 e mais bits só de vez em quando. 177 00:11:21,790 --> 00:11:26,070 De acordo com o código de Huffman, você pode criar uma floresta de árvores. 178 00:11:26,070 --> 00:11:31,190 Há uma espécie de uma história aqui que envolve árvores e também o processo de construção de-los. 179 00:11:31,190 --> 00:11:32,420 Vamos começar. 180 00:11:32,420 --> 00:11:36,140 >> Proponho que você comece com essa floresta, por assim dizer, de 5 árvores, 181 00:11:36,140 --> 00:11:38,260 cada um dos quais é uma árvore muito estúpido. 182 00:11:38,260 --> 00:11:42,800 A árvore é composto por apenas um único nó, como representado aqui por um círculo. 183 00:11:42,800 --> 00:11:45,310 Assim, cada uma dessas coisas pode ser um struct C 184 00:11:45,310 --> 00:11:50,200 e dentro da estrutura C pode ser um float representando a contagem de freqüência 185 00:11:50,200 --> 00:11:52,510 e depois talvez um char que representa a letra. 186 00:11:52,510 --> 00:11:56,470 Então, acho que um desses nós como apenas struct C qualquer idade, mas, por agora, de nível superior. 187 00:11:56,470 --> 00:12:01,230 Esta é uma floresta de 5 árvores, cada um dos que só têm um único nó. 188 00:12:01,230 --> 00:12:06,830 O Huffman proposta é que começamos a combinar essas árvores 189 00:12:06,830 --> 00:12:11,140 que têm as menores contagens de freqüência um pouco maior em árvores 190 00:12:11,140 --> 00:12:13,490 ligando-os com um nó raiz nova. 191 00:12:13,490 --> 00:12:17,560 Assim, entre as letras aqui, observe que, por conveniência eu classificados los da esquerda para a direita, 192 00:12:17,560 --> 00:12:21,420 apesar de que não é estritamente necessário, e observe que os menores nós 193 00:12:21,420 --> 00:12:23,930 são actualmente 10% e 10%. 194 00:12:23,930 --> 00:12:28,940 Então Huffman propôs que mesclar essas duas menores nós em uma nova árvore 195 00:12:28,940 --> 00:12:34,450 pela introdução de um novo nó pai e depois dar esse pai de uma criança esquerdo e um direito da criança 196 00:12:34,450 --> 00:12:37,720 onde B é arbitrariamente a esquerda e C é arbitrariamente a direita. 197 00:12:37,720 --> 00:12:41,590 E então Huffman ainda proposto que vamos agora apenas de pensar no filho esquerdo 198 00:12:41,590 --> 00:12:44,790 em uma dessas árvores sempre como sendo representado por 0 199 00:12:44,790 --> 00:12:47,890 e do direito da criança sempre como sendo representado pelo número 1. 200 00:12:47,890 --> 00:12:50,680 >> Não importa se você lançá-los, desde que você é consistente. 201 00:12:50,680 --> 00:12:54,650 Portanto, agora temos quatro árvores na floresta. 202 00:12:54,650 --> 00:12:58,050 E eu digo quatro porque agora a árvore à esquerda - 203 00:12:58,050 --> 00:13:00,570 e não é tanto uma árvore no sentido de que ela cresce dessa forma, 204 00:13:00,570 --> 00:13:05,170 é mais como uma árvore de família onde agora o 0.2 é uma espécie de pai dos dois filhos - 205 00:13:05,170 --> 00:13:07,930 notar que, em que pai temos desenhado 0,2. 206 00:13:07,930 --> 00:13:13,370 Nós adicionamos a contagem de freqüência dos dois filhos e dado o novo nó a soma total. 207 00:13:13,370 --> 00:13:15,310 Então agora só repetir esse processo. 208 00:13:15,310 --> 00:13:19,490 Encontre as duas menores nós e depois uni-los em uma nova árvore 209 00:13:19,490 --> 00:13:21,380 e repita o processo ainda mais. 210 00:13:21,380 --> 00:13:26,390 Agora temos alguns candidatos, 20%, 15%, e outros 20%. 211 00:13:26,390 --> 00:13:29,780 Neste caso, temos que quebrar o empate. Nós podemos fazê-lo de forma arbitrária. 212 00:13:29,780 --> 00:13:31,540 Devemos fazê-lo apenas de forma consistente. 213 00:13:31,540 --> 00:13:33,760 Neste caso, eu vou arbitrariamente ir com o outro à esquerda, 214 00:13:33,760 --> 00:13:39,880 e eu agora fundir os 20% e os 15% para me dar um novo pai chamou 35%, 215 00:13:39,880 --> 00:13:46,310 cujo esquerda criança é 0, cujo direito é uma criança, e agora nós temos apenas três árvores na floresta. 216 00:13:46,310 --> 00:13:47,960 Você pode, talvez, ver onde isso vai dar. 217 00:13:47,960 --> 00:13:51,150 Se repetirmos esta mais algumas vezes, nós vamos ter apenas uma árvore maior, 218 00:13:51,150 --> 00:13:53,900 todos cujas bordas são rotulados com 0s e 1s. 219 00:13:53,900 --> 00:13:55,710 Vamos fazê-lo novamente. 220 00:13:55,710 --> 00:14:02,600 35% é a raiz que árvore. 20% e 45%, por isso estamos indo para mesclar a 35% e 20%. 221 00:14:02,600 --> 00:14:05,610 Agora temos essa árvore aqui. Nós adicionamos os juntos, temos 55%. 222 00:14:05,610 --> 00:14:07,910 Agora só há duas árvores na floresta. 223 00:14:07,910 --> 00:14:11,900 Fazemos isso uma última vez, e espero que matematicamente todas as freqüências somam 224 00:14:11,900 --> 00:14:15,570 porque eles devem já que eles calculados a partir de a-go de somar 100%. 225 00:14:15,570 --> 00:14:17,960 E agora temos uma árvore. 226 00:14:17,960 --> 00:14:20,580 Portanto, esta é uma árvore de Huffman codificação. 227 00:14:20,580 --> 00:14:24,400 É o tipo de demorou um pouco para chegar lá verbalmente, mas a realidade é com um loop 228 00:14:24,400 --> 00:14:27,620 ou com uma função recursiva, você poderia construir esta coisa muito rápido. 229 00:14:27,620 --> 00:14:32,440 Portanto, agora temos um novo nó, e todos estes nós internos foram malloc'd, 230 00:14:32,440 --> 00:14:34,690 presumivelmente, ao longo do caminho. 231 00:14:34,690 --> 00:14:38,650 Então agora, na parte superior desta árvore temos 100%, mas agora notar que temos um caminho 232 00:14:38,650 --> 00:14:43,780 desta nova grande-grande-grande-avô para todas as grande-grande-grande-netos 233 00:14:43,780 --> 00:14:45,930 todo o caminho para o fundo, para todas as folhas. 234 00:14:45,930 --> 00:14:52,840 >> O que vamos fazer agora é propor que, a fim de representar a letra E, 235 00:14:52,840 --> 00:14:55,670 nós simplesmente usar o número 1. Por quê? 236 00:14:55,670 --> 00:15:01,000 Porque se atravessar esta árvore a partir da raiz final até a folha conhecido como E, 237 00:15:01,000 --> 00:15:06,050 seguimos apenas a ponta, a borda da direita, e que é rotulado de curso superior em direito 1. 238 00:15:06,050 --> 00:15:11,550 Assim, a implicação aqui para Huffman foi que a codificação E em binário deve ser apenas uma. 239 00:15:11,550 --> 00:15:14,490 E isso é muito muito eficiente. Não pode realmente ficar menor do que isso. 240 00:15:14,490 --> 00:15:18,350 Em contrapartida, um vai ser representado, se você seguir a lógica, 241 00:15:18,350 --> 00:15:21,610 por que padrão de bits em vez? 01. 242 00:15:21,610 --> 00:15:25,500 Assim, para obter a A, começamos na raiz e vá para a esquerda e depois vá para a direita, 243 00:15:25,500 --> 00:15:28,580 o que significa que seguiu a 0 e, em seguida, um 1. 244 00:15:28,580 --> 00:15:32,810 Assim, devem representar a letra A com o padrão 0 e 1. 245 00:15:32,810 --> 00:15:36,010 E agora percebe que já temos uma propriedade de Decodificação imediata 246 00:15:36,010 --> 00:15:38,090 que nós não temos em código Morse. 247 00:15:38,090 --> 00:15:42,840 Mesmo que ambos os padrões são bastante curto - E é um pouco, um é de 2 bits - 248 00:15:42,840 --> 00:15:45,080 notar que eles não podem ser confundidas um ou o outro, 249 00:15:45,080 --> 00:15:54,870 porque se você ver um um que tem que ser um E, se você ver um 0, um 1 é, obviamente, tem que ser um A. 250 00:15:54,870 --> 00:15:58,410 Da mesma forma, o que há de D? 001. 251 00:15:58,410 --> 00:16:01,440 O 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, novamente, porque todas as cartas que preocupam são as folhas 254 00:16:09,550 --> 00:16:13,890 e nenhum deles são uma espécie de intermediários no caminho da raiz até a folha, 255 00:16:13,890 --> 00:16:18,760 não há risco de confundir codificações duas letras 'diferentes 256 00:16:18,760 --> 00:16:22,300 porque todos esses padrões de bits são deterministas. 257 00:16:22,300 --> 00:16:25,280 0000 será sempre B. 258 00:16:25,280 --> 00:16:29,480 Não há nó em algum lugar entre o que você pode confundir uma carta para o outro. 259 00:16:29,480 --> 00:16:31,150 Então, qual é a implicação aqui? 260 00:16:31,150 --> 00:16:35,080 >> A carta mais popular - neste caso E - ficou mais curto de codificação, 261 00:16:35,080 --> 00:16:37,430 Um ficou a codificação mais baixo seguinte, 262 00:16:37,430 --> 00:16:41,390 e B e C, que já sabia do tipo get-go foram dos menos populares 263 00:16:41,390 --> 00:16:45,390 a freqüência de 10% cada um, eles têm obtido o maior codificação. 264 00:16:45,390 --> 00:16:49,410 E então o que isto significa que agora é que se você quiser enviar uma mensagem de que é comprimido 265 00:16:49,410 --> 00:16:51,950 através da Internet ou por e-mail ou semelhante, 266 00:16:51,950 --> 00:16:56,730 em vez de usar ASCII padrão, você pode enviar uma mensagem codificada Huffman 267 00:16:56,730 --> 00:17:01,720 através do qual se pretende enviar a letra E, você envia um único bit. 268 00:17:01,720 --> 00:17:05,680 Se você quiser enviar um A, você envia 2 bits, 01, em vez de enviar 8 bits 269 00:17:05,680 --> 00:17:10,190 seguidos de mais 8 bits seguidos por mais 8 bits e assim por diante. 270 00:17:10,190 --> 00:17:11,940 Mas há uma pegadinha aqui. 271 00:17:11,940 --> 00:17:17,079 Não é suficiente apenas para construir esta árvore e, em seguida, iniciar o envio de Alice para Bob 272 00:17:17,079 --> 00:17:20,010 o padrão mais curto pouco, string de ASCII, 273 00:17:20,010 --> 00:17:23,140 Alice também porque tem de informar Bob daquilo 274 00:17:23,140 --> 00:17:26,880 Bob se vai ser capaz de ler sua mensagem comprimido? 275 00:17:26,880 --> 00:17:30,770 [Resposta do aluno inaudível] >> O que é isso? 276 00:17:30,770 --> 00:17:32,310 [Resposta do aluno inaudível] >> De que a árvore é. 277 00:17:32,310 --> 00:17:35,160 Ou ainda mais especificamente, o que essas codificações são, 278 00:17:35,160 --> 00:17:39,010 especialmente porque durante esta história que fez um julgamento em um ponto. 279 00:17:39,010 --> 00:17:43,640 Lembre-se que tivemos de escolher arbitrariamente entre os dois diferentes nós de 20%? 280 00:17:43,640 --> 00:17:49,800 Portanto, não é o caso de que Bob, o destinatário, pode apenas reconstruir a árvore em sua própria 281 00:17:49,800 --> 00:17:53,390 porque talvez ele vai criar a árvore levemente diferente de Alice. 282 00:17:53,390 --> 00:17:56,670 Além disso, Bob ainda não sabe o que a mensagem original é 283 00:17:56,670 --> 00:18:00,770 porque a única coisa que Alice está enviando-lhe, é claro, é a mensagem de comprimido. 284 00:18:00,770 --> 00:18:05,900 >> Assim, a captura com compressão como este é que, sim, Alice pode salvar um monte de bits 285 00:18:05,900 --> 00:18:09,900 enviando 1 para E e 01 para A e assim por diante, 286 00:18:09,900 --> 00:18:15,180 mas ela também tem de informar o que Bob é o mapeamento entre as letras e os bits 287 00:18:15,180 --> 00:18:19,620 porque não pode confiar em apenas claramente ASCII mais se nós não estamos usando ASCII. 288 00:18:19,620 --> 00:18:22,200 Então, ela pode enviar-lhe a árvore de alguma forma - 289 00:18:22,200 --> 00:18:26,600 anotá-la, guarde-a como dados binários, ou algo assim - 290 00:18:26,600 --> 00:18:30,280 ou apenas enviar-lhe uma folha de fraude pouco, um arquivo do Excel, que mostra os mapeamentos. 291 00:18:30,280 --> 00:18:36,480 Assim, a eficácia de compressão realmente assume que as mensagens que você está enviando 292 00:18:36,480 --> 00:18:40,230 são muito grandes, pelo menos, de médio porte, 293 00:18:40,230 --> 00:18:42,180 porque se você está enviando uma mensagem super curto, 294 00:18:42,180 --> 00:18:45,390 se você quiser apenas para enviar a mensagem BAD, que passa a ser uma palavra que pode significar aqui, 295 00:18:45,390 --> 00:18:49,550 B-A-D, você provavelmente vai usar menos bits, 296 00:18:49,550 --> 00:18:53,130 mas o problema é se você também tem que informar Bob o que a árvore é 297 00:18:53,130 --> 00:18:57,530 ou o que essas codificações são, você vai provavelmente superam todas as economias 298 00:18:57,530 --> 00:19:00,110 de ter as coisas comprimido para começar. 299 00:19:00,110 --> 00:19:02,210 Então ele pode realmente ser o caso de que se você tentar comprimir 300 00:19:02,210 --> 00:19:05,330 mesmo com algo como formatos zip ou arquivo que você pode estar familiarizado com - 301 00:19:05,330 --> 00:19:07,780 arquivos muito pequenos, até mesmo arquivos vazios - 302 00:19:07,780 --> 00:19:10,930 às vezes, esses arquivos podem ficar maior e não menor. 303 00:19:10,930 --> 00:19:14,320 Mas, realisticamente, o que acontece apenas para arquivos pequenos, 304 00:19:14,320 --> 00:19:16,920 por isso não vai fazer com que um arquivo gigabyte ser de 2 gigabytes; 305 00:19:16,920 --> 00:19:19,480 estamos realmente falando bytes ou apenas um par de kilobytes. 306 00:19:19,480 --> 00:19:22,330 >> Alguns programas como o zip são inteligentes o suficiente para perceber que, 307 00:19:22,330 --> 00:19:24,590 "Você vai gastar mais bits comprimir isso." 308 00:19:24,590 --> 00:19:27,460 "Deixe-me não incomoda comprimi-lo para você em tudo." 309 00:19:27,460 --> 00:19:30,160 Portanto, esta é apenas uma forma de comprimir em seguida, formato de texto. 310 00:19:30,160 --> 00:19:32,300 Nós poderíamos implementar algo assim em C. 311 00:19:32,300 --> 00:19:35,370 Por exemplo, aqui é como podemos representar um nó na árvore 312 00:19:35,370 --> 00:19:39,320 onde temos um char para o símbolo, um valor flutuante para a freqüência, 313 00:19:39,320 --> 00:19:42,250 e, como vimos com os nossos estruturas de dados, outros dois ponteiros, 314 00:19:42,250 --> 00:19:47,080 1 para o filho esquerdo, um para a direita, sendo que ambos podem ser NULL, 315 00:19:47,080 --> 00:19:50,850 mas se não, ele se refere a uma criança esquerdo e um direito da criança. 316 00:19:50,850 --> 00:19:55,130 Portanto, este é, então, Huffman, e é uma maneira que você pode ir sobre a comprimir informações, 317 00:19:55,130 --> 00:19:57,880 e é certamente um dos mais fáceis de implementar 318 00:19:57,880 --> 00:20:00,830 no contexto de, por exemplo, as estruturas de dados da última semana, 319 00:20:00,830 --> 00:20:03,250 embora mesmo algoritmos mais sofisticados existir 320 00:20:03,250 --> 00:20:08,220 que podem fazer mutações ainda mais sofisticadas de seus dados. 321 00:20:08,220 --> 00:20:11,640 Quaisquer perguntas, então em árvores, árvores binárias, ou compressão de texto? 322 00:20:11,640 --> 00:20:15,590 [Estudante] Existe alguma ambiguidade, como se dividir [inaudível] em 01, 323 00:20:15,590 --> 00:20:19,160 então 011 seria ambíguo, certo? 324 00:20:19,160 --> 00:20:22,730 [Inaudível] >> Boa pergunta. Ambigüidade. 325 00:20:22,730 --> 00:20:25,940 Deixe-me resumir referindo-se a este quadro aqui. 326 00:20:25,940 --> 00:20:29,650 Como os caracteres que você está comprimindo, as representações de, 327 00:20:29,650 --> 00:20:32,850 por definição deste algoritmo permanecer sempre as folhas, 328 00:20:32,850 --> 00:20:41,870 você nunca vai usar acidentalmente o mesmo padrão de bits para o prefixo de várias letras. 329 00:20:41,870 --> 00:20:46,740 Portanto, em outras palavras, você está preocupado, parece que, de uma ambigüidade decorrente 330 00:20:46,740 --> 00:20:51,580 em que 001 pode ser o início de B ou o início de C ou algo assim. 331 00:20:51,580 --> 00:20:56,780 Mas isso não 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 são as folhas. 333 00:20:58,290 --> 00:21:01,910 >> A ambiguidade só pode surgir, como no caso do código Morse, 334 00:21:01,910 --> 00:21:06,770 se, por exemplo, C estava em algum lugar ao longo do caminho da raiz até B. 335 00:21:06,770 --> 00:21:12,290 [Estudante] Direito. Assim, neste caso, por exemplo um tem 2 folhas. Diga >> A tem - Diga isso de novo. 336 00:21:12,290 --> 00:21:18,760 [Estudante] Diga A tem duas folhas, F e G, e então g - >> Certo. Mas não pode. 337 00:21:18,760 --> 00:21:23,230 A si não poderia ter folhas F e G, porque essas letras F e G 338 00:21:23,230 --> 00:21:27,560 elas próprias ser deixa lugar à esquerda ou à direita B de E. 339 00:21:27,560 --> 00:21:28,900 Assim, por definição, estes devem ser folhas. 340 00:21:28,900 --> 00:21:32,940 Caso contrário, você está absolutamente certo, nós não resolvemos o problema que enfrenta o código Morse. 341 00:21:32,940 --> 00:21:38,150 Boa pergunta. Outras perguntas? Tudo bem. 342 00:21:38,150 --> 00:21:42,050 Esta noção de bits, verifica-se que já tinha poder o tempo todo que não temos realmente usado 343 00:21:42,050 --> 00:21:44,200 quando se tratava de manipular esses 0s e 1s. 344 00:21:44,200 --> 00:21:46,600 Perguntamos sobre isso em um dos conjuntos mais antigos problemas: 345 00:21:46,600 --> 00:21:52,340 ou seja, como você vai fazer sobre a conversão de maiúsculas para minúsculas ou vice-versa? 346 00:21:52,340 --> 00:21:55,460 Ou, mais concretamente, um desses Série de Exercícios primeiro perguntou 347 00:21:55,460 --> 00:22:01,090 quantos bits você realmente tem que virar a fim de mudar Um para minúsculas uma ou vice-versa? 348 00:22:01,090 --> 00:22:05,580 Aqui está um lembrete rápido do que 65 e 97 parece em binário. 349 00:22:05,580 --> 00:22:08,060 E mesmo que essa pergunta tem a sorte de se desvaneceu em sua memória, 350 00:22:08,060 --> 00:22:11,290 você pode ver novamente aqui que quantos bits precisa ser invertida 351 00:22:11,290 --> 00:22:15,810 para mudar maiúsculo para minúsculas uma? Apenas um. 352 00:22:15,810 --> 00:22:19,650 >> Eles só diferem em um único local, o terceiro bit a partir da esquerda. 353 00:22:19,650 --> 00:22:24,240 Considerando A tem um 010, um pouco tem um 011. 354 00:22:24,240 --> 00:22:26,250 Então, de alguma forma, precisamos apenas ser capaz de virar esse bocado, 355 00:22:26,250 --> 00:22:29,410 e então podemos capitalizar ou letras minúsculas. 356 00:22:29,410 --> 00:22:32,720 Nós fizemos isso no passado usando efetivamente, se as condições 357 00:22:32,720 --> 00:22:35,930 e verificar se a letra está entre capitais A e Z capital, 358 00:22:35,930 --> 00:22:41,480 em seguida, saídas como a - a + 26 ou algo assim. 359 00:22:41,480 --> 00:22:46,130 Você provavelmente fez uma mudança de aritmética para as letras do alfabeto. 360 00:22:46,130 --> 00:22:49,270 Mas o que se pudéssemos virar que um único bit? 361 00:22:49,270 --> 00:22:59,080 Como você poderia ir sobre a tomada de vale um byte de 8 bits, assim como pedaços 01000001 e 01100001? 362 00:22:59,080 --> 00:23:03,170 Se você tivesse os padrões de bits, como podemos ir sobre a mudança de apenas um deles? 363 00:23:03,170 --> 00:23:07,610 O que se apresentar em amarelo aqui esta outro padrão de bits? 364 00:23:07,610 --> 00:23:13,420 Se eu fizer toda a 0s cordas amarelas exceto para o pouco que eu quero mudar 365 00:23:13,420 --> 00:23:17,900 e então eu introduzir um novo operador conhecido como um operador bit a bit - 366 00:23:17,900 --> 00:23:21,210 bit a bit, no sentido de que opera em pedaços individuais, 367 00:23:21,210 --> 00:23:25,360 não sobre um byte inteiro ou quatro bytes de uma só vez. 368 00:23:25,360 --> 00:23:31,170 Esta barra vertical lá em amarelo sugere que o que se tomarmos a representação do capital de uma 369 00:23:31,170 --> 00:23:37,060 e bit a bit OR-lo com a seqüência de bits amarelo? 370 00:23:37,060 --> 00:23:41,300 Em outras palavras, acho que voltar à nossa discussão de expressões booleanas em Scratch e depois em C. 371 00:23:41,300 --> 00:23:47,520 >> Fazendo um booleano ou significa que, para ser verdadeiro, ou a primeira coisa que tem que ser verdade 372 00:23:47,520 --> 00:23:50,700 ou a segunda coisa que tem que ser verdadeiro ou ambos têm de ser verdade, 373 00:23:50,700 --> 00:23:53,270 e, em seguida, o produto resultante é, em si verdadeira. 374 00:23:53,270 --> 00:24:00,230 Neste caso aqui, o que é que vamos chegar, se tomarmos 0 "ou" ed com 0? Falsa ou falsa? 375 00:24:00,230 --> 00:24:04,280 Ainda é falso, então a uma minúscula permanece como o esperado. 376 00:24:04,280 --> 00:24:07,540 E se em vez disso, fazer 1 ou 0? 377 00:24:07,540 --> 00:24:12,640 Este agora resta 1, mas perceber o que está para acontecer aqui. 378 00:24:12,640 --> 00:24:18,630 Se começarmos com A maiúsculo e continuamos a "ou" seus bits individuais como estamos fazendo aqui, 379 00:24:18,630 --> 00:24:25,180 0 ou o amarelo nos dá o que aqui? Isto dá-nos uma. 380 00:24:25,180 --> 00:24:35,120 De fato, suponha que não sabia o que a versão em maiúsculas pouco um realmente era. 381 00:24:35,120 --> 00:24:38,270 Vamos fazer isso. Deixe-me passar esta de volta aqui. 382 00:24:38,270 --> 00:24:42,340 Vamos fazer isso de novo. 0 ou 0 dá-me 0. 383 00:24:42,340 --> 00:24:45,020 1 ou 0 dá-me um. 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 próximo é 0, a próxima é de 0, o próximo é 0. 386 00:24:52,880 --> 00:24:55,660 1 ou 0 dá-me um. 387 00:24:55,660 --> 00:24:59,140 E por isso mesmo que nós não sabíamos de antemão o que era um minúsculas, 388 00:24:59,140 --> 00:25:04,770 simplesmente por "ou" ing A com este padrão de bits que temos aqui apresentados em amarelo, 389 00:25:04,770 --> 00:25:09,400 você pode minúsculas um capital Um virando o bit. 390 00:25:09,400 --> 00:25:11,580 Usamos esta expressão semanas atrás: apertar um pouco. 391 00:25:11,580 --> 00:25:13,710 Como você realmente fazer isso programaticamente? 392 00:25:13,710 --> 00:25:16,390 Você usa o que é geralmente chamado de máscara, uma seqüência de bits, 393 00:25:16,390 --> 00:25:19,980 que neste caso só acontece a olhar como este número aqui, 394 00:25:19,980 --> 00:25:22,980 e então você "ou" isso em conjunto, utilizando este operador C novo, 395 00:25:22,980 --> 00:25:29,940 não | |, você usa um único | e você realmente obter essa resposta aqui 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 Assim, verifica-se que se você tirar uma letra maiúscula A e OR bit a bit com o 32 inteiro, 398 00:25:42,280 --> 00:25:47,520 porque o 32 inteiro, quando você olha para ele como bits, olha como este, 399 00:25:47,520 --> 00:25:50,860 isso significa que você pode virar o pouco que você realmente quer. 400 00:25:50,860 --> 00:25:52,630 E da mesma forma - e nós vamos olhar para o código em apenas um momento - 401 00:25:52,630 --> 00:25:54,210 suponha que queremos ir na outra direção. 402 00:25:54,210 --> 00:25:58,210 >> Como você vai de capital de uma minúscula para A? Que pouco precisa mudar? 403 00:25:58,210 --> 00:25:59,820 É o mesmo. 404 00:25:59,820 --> 00:26:03,970 Queremos mudar isso a partir de um terceiro bit 1 a 0. 405 00:26:03,970 --> 00:26:06,310 E como podemos fazer sobre isso? 406 00:26:06,310 --> 00:26:10,130 Como podemos desligar um pouco? Com o padrão de bits podemos desligar um pouco? 407 00:26:11,580 --> 00:26:14,070 E se a gente meio que inverta a máscara? 408 00:26:14,070 --> 00:26:17,350 Considerando que, antes, fizemos os 0s máscara toda amarela 409 00:26:17,350 --> 00:26:19,930 exceto para o pouco que queríamos ligar, 410 00:26:19,930 --> 00:26:25,580 E se desta vez, nós fazemos o 1s máscara inteira, exceto para o pouco que nós queremos para desligar 411 00:26:25,580 --> 00:26:28,330 e, em seguida, usar o que operador? 412 00:26:28,330 --> 00:26:30,560 E se nós "e" as coisas? Vamos dar uma olhada. 413 00:26:30,560 --> 00:26:34,880 Se agora virar para isso, suponha que novamente eu criar uma máscara que é tudo 1s 414 00:26:34,880 --> 00:26:37,650 exceto para o pouco que eu quiser desligar 415 00:26:37,650 --> 00:26:43,860 e depois, em vez de "ou" os números brancos em cima com os números amarelos até aqui, 416 00:26:43,860 --> 00:26:46,940 e se eu, em vez "e" eles juntos? É chamado um bit a bit e. 417 00:26:46,940 --> 00:26:49,450 Logicamente, é a mesma coisa que um Boolean e. 418 00:26:49,450 --> 00:26:55,160 Isto dá-me 0 e 1 é 0. Tão falso e verdadeiro é falso. 419 00:26:55,160 --> 00:26:58,160 Verdadeira e verdadeira é verdadeiro. 420 00:26:58,160 --> 00:27:04,020 E aqui está a mágica: o verdadeiro eo falso é agora falso, por isso temos que desligado pouco. 421 00:27:04,020 --> 00:27:06,560 E agora o resto da história é um pouco simples. 422 00:27:06,560 --> 00:27:11,970 Uma vez que o resto da máscara está 1s, não importa qual os números estão em branco. 423 00:27:11,970 --> 00:27:15,580 Quando você "e" algo com verdade, você não vai mudar o seu valor. 424 00:27:15,580 --> 00:27:20,200 Se é verdade, ele permanecerá verdadeiro. Se era falsa, ele permanecerá falsa. 425 00:27:20,200 --> 00:27:23,190 >> Mas a mágica acontece quando você toma algo que era verdade 426 00:27:23,190 --> 00:27:25,430 e então você "e" com falso. 427 00:27:25,430 --> 00:27:30,030 Isto tem o efeito de que o bit de desligar. 428 00:27:30,030 --> 00:27:31,980 Assim, uma enigmática pouco ali. 429 00:27:31,980 --> 00:27:35,390 Vamos realmente olhar para algum código, o que pode realmente olhar ainda mais enigmático, 430 00:27:35,390 --> 00:27:38,220 mas vamos dar uma olhada aqui tolower. 431 00:27:38,220 --> 00:27:45,880 Se eu olhar para tolower, passando de capital de um para letras minúsculas a, 432 00:27:45,880 --> 00:27:47,730 vamos ver como podemos implementar este programa. 433 00:27:47,730 --> 00:27:51,280 Aqui está o principal, e não está tomando quaisquer argumentos de linha de comando. 434 00:27:51,280 --> 00:27:55,980 Estou declarando um caractere c para a letra que o usuário vai digitar dentro 435 00:27:55,980 --> 00:28:00,690 Eu, então, usar um do laço familiar enquanto apenas para se certificar de que o usuário definitivamente me dá um A maiúsculo 436 00:28:00,690 --> 00:28:05,010 ou B ou C. .. Z, de modo que me dê algo entre A e Z. 437 00:28:05,010 --> 00:28:08,580 E agora o que eu estou fazendo aqui? 438 00:28:08,580 --> 00:28:14,870 Eu sou "ou" ing isso com 0x20, mas que na verdade é o mesmo que - 439 00:28:14,870 --> 00:28:19,500 e vamos voltar a isso em um momento - 32. 440 00:28:19,500 --> 00:28:24,830 Então, novamente, 32 é este padrão de bits aqui. Por que saber isso? 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 Portanto, este número amarelo passa a ser 32. 444 00:28:33,470 --> 00:28:40,570 Posso, então, tomar uma carta como o char aqui, bit a bit "ou" isso literalmente com o número 32, 445 00:28:40,570 --> 00:28:45,250 eo que posso voltar? A versão minúscula que char. 446 00:28:45,250 --> 00:28:48,830 Há instantes, porém, eu expressei isso em uma notação de base diferente. 447 00:28:48,830 --> 00:28:51,370 O que isso representa? >> [Aluno] Hexadecimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Isso acontece para representar hexadecimal. 449 00:28:53,050 --> 00:28:55,170 Nós não falamos sobre hexadecimal tanto assim, 450 00:28:55,170 --> 00:28:57,330 mas é realmente conveniente em casos como este. 451 00:28:57,330 --> 00:29:01,730 >> Mesmo que parece mais complexo e, embora parece que 20 e não 32, 452 00:29:01,730 --> 00:29:06,240 verifica-se que é na verdade a notação hexadecimal super conveniente 453 00:29:06,240 --> 00:29:10,810 porque em hexadecimal todos os dígitos após o 0x - e isso não significa nada; 454 00:29:10,810 --> 00:29:13,960 isso é apenas uma convenção humana que diz que aqui vem um número hexadecimal - 455 00:29:13,960 --> 00:29:18,590 cada um destes dígitos, a 2 e, em seguida, a 0, em si podem ser representados 456 00:29:18,590 --> 00:29:20,800 com exatamente 4 bits. 457 00:29:20,800 --> 00:29:27,840 Então, se fizermos isso, deixe-me abrir um editor de texto aqui - estranho autocomplete - 458 00:29:27,840 --> 00:29:35,940 se fizermos um editor de texto pouco aqui, o 0x20 número significa aqui é de 4 bits, aqui está mais 4 bits. 459 00:29:35,940 --> 00:29:38,050 Vamos fazer os 4 bits mais à direita em primeiro lugar. 460 00:29:38,050 --> 00:29:44,690 0 quando representado com 4 bits é o que? Super fácil. Apenas 0s todos. 461 00:29:44,690 --> 00:29:46,780 Então 4 bits como 0s. 462 00:29:46,780 --> 00:29:53,510 Como você representar 2? Tem sido um tempo desde que fiz isso, mas é 0100. 463 00:29:53,510 --> 00:29:57,310 Portanto, este é o lugar 1s, este é o lugar 2s, e então não importa o que os outros lugares são. 464 00:29:57,310 --> 00:30:00,610 Em outras palavras, em hexadecimal você pode dizer 0x20, 465 00:30:00,610 --> 00:30:04,340 mas se você pensar então sobre o que é a 2 e como ele é representado em binário, 466 00:30:04,340 --> 00:30:07,130 qual é a 0 e como é representado em binário, 467 00:30:07,130 --> 00:30:10,440 as respostas a essas perguntas são este e este, respectivamente. 468 00:30:10,440 --> 00:30:14,380 Então 0x20 acontece para representar esse padrão de 8 bits, 469 00:30:14,380 --> 00:30:16,880 que é precisamente a máscara que nós queríamos. 470 00:30:16,880 --> 00:30:20,140 Portanto, este é o momento apenas um exercício intelectual, 471 00:30:20,140 --> 00:30:24,520 mas a realidade está no código é tipicamente mais comum para escrever constantes como esta 472 00:30:24,520 --> 00:30:28,360 em hexadecimal, em seguida, porque o programador pode de maneira relativamente fácil, 473 00:30:28,360 --> 00:30:32,560 mesmo que se exige um pouco de papel e lápis, descobrir o que o padrão de bits é 474 00:30:32,560 --> 00:30:35,960 porque você não pode simplesmente expressar 0s e 1s normalmente no código. 475 00:30:35,960 --> 00:30:38,540 Você não pode ir 00010 e assim por diante. 476 00:30:38,540 --> 00:30:42,380 >> Você tem que escolher notações decimal ou hexadecimal ou octal ou outro. 477 00:30:42,380 --> 00:30:47,540 A maioria das pessoas tendem a escolher hexadecimal simplesmente para que cada dígito representa 4 bits 478 00:30:47,540 --> 00:30:49,320 e você pode fazer essa matemática rápida. 479 00:30:49,320 --> 00:30:54,990 E eu vou acenar a minha mão a toupper, que é quase o mesmo, parece quase idêntico. 480 00:30:54,990 --> 00:31:01,900 Toupper acontece de usar não o operador ou mas esse cara e df. 481 00:31:01,900 --> 00:31:09,300 O que representam df? df? Alguém? >> [Aluno] 255. 482 00:31:09,300 --> 00:31:12,780 255? 255 não. Isso seria ss. 483 00:31:12,780 --> 00:31:15,210 Vamos deixar este como um pouco de exercício. 484 00:31:15,210 --> 00:31:23,460 Mas se você vai de 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 e então o que vem depois de 9? 485 00:31:23,460 --> 00:31:26,510 Nós somos o tipo de fora de dígitos decimais, mas em hexadecimal o que vem depois de 9? 486 00:31:26,510 --> 00:31:29,510 [Estudante] a. Então >> a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Você pode descobrir a partir daí o padrão de bits d realmente representa. 488 00:31:33,470 --> 00:31:38,850 E se fizermos as contas, veremos que a máscara que você acabar ficando para trás é idêntico a este. 489 00:31:38,850 --> 00:31:45,580 Trata-se de f, todos 1s, e este é d. Então df representa a máscara. Tudo bem. 490 00:31:45,580 --> 00:31:50,980 E, por último, para não fazer as coisas de som super, super técnico, 491 00:31:50,980 --> 00:31:53,840 Mas suponha que queria escrever um programa que faz isso. 492 00:31:53,840 --> 00:31:58,960 Deixe-me ir em frente e fazer binário, que é um programa em um arquivo chamado binary.c. 493 00:31:58,960 --> 00:32:02,050 E agora deixe-me correr binário e me dar um número inteiro não negativo. 494 00:32:02,050 --> 00:32:03,960 Vamos começar fácil e digite 0. 495 00:32:03,960 --> 00:32:09,010 Isto agora é um programa que imprime um inteiro em sua representação binária. 496 00:32:09,010 --> 00:32:13,470 Então, se eu jogar este jogo novamente e digite em apenas uma, eu deveria ter uma representação de 32 bits do 1. 497 00:32:13,470 --> 00:32:15,490 Se eu fizer isso de novo com dois, eu entendo isso. 498 00:32:15,490 --> 00:32:19,310 Se eu fizer 7, eu deveria ter um 1s poucos no final, e assim por diante. 499 00:32:19,310 --> 00:32:22,740 Acontece Digo isso porque, com operações bit a bit 500 00:32:22,740 --> 00:32:25,490 você pode realmente fazer uma outra coisa também. 501 00:32:25,490 --> 00:32:29,130 Você pode criar essas máscaras dinamicamente. 502 00:32:29,130 --> 00:32:32,800 Dê uma olhada neste exemplo uma final envolvendo operações bit a bit. 503 00:32:32,800 --> 00:32:35,490 Aqui está a primeira parte do código, solicitar ao usuário um número, 504 00:32:35,490 --> 00:32:38,130 e insiste em que você me dê um número inteiro não negativo. 505 00:32:38,130 --> 00:32:39,780 Então esse é tipo de coisa velha escola. 506 00:32:39,780 --> 00:32:41,980 Mas aqui é algo que é bem interessante. 507 00:32:41,980 --> 00:32:44,910 >> Como faço para ir sobre a impressão de um número em binário? 508 00:32:44,910 --> 00:32:48,970 A primeira iteração de que para quê? 509 00:32:48,970 --> 00:32:52,270 O que é o tamanho de um int tipicamente, pelo menos, no interior do aparelho? >> [Aluno] 4. 510 00:32:52,270 --> 00:32:57,130 É 4. Então, 4 * 8 é de 32 - 1 é 31. 511 00:32:57,130 --> 00:33:02,590 Então, se eu estou começando a contar a partir de 31, que representa, ao que parece, 512 00:33:02,590 --> 00:33:07,630 apenas conceitualmente, o bit 31 ou pouco mais alta ordem, que é esse cara aqui, 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 Portanto, esta é pouco 01 ... 31 bits. 515 00:33:12,850 --> 00:33:14,950 Então o que está fazendo esse código? 516 00:33:14,950 --> 00:33:20,140 Observe que este laço for, mesmo que pareça enigmático, é apenas a iteração de 31 a 0. É isso aí. 517 00:33:20,140 --> 00:33:24,530 Assim, a parte interessante agora deve estar nesses cinco linhas aqui. 518 00:33:24,530 --> 00:33:28,110 Observe que nessa linha que eu estou declarando uma máscara variável chamada 519 00:33:28,110 --> 00:33:30,790 para ser coerente com a nossa história desses números amarelos. 520 00:33:30,790 --> 00:33:32,200 E então o que é que esta fazendo? 521 00:33:32,200 --> 00:33:35,720 Este é um outro operador bit a bit não vimos antes, o mais provável. 522 00:33:35,720 --> 00:33:38,300 É o operador de deslocamento para a esquerda. 523 00:33:38,300 --> 00:33:40,060 Este operador faz isso. 524 00:33:40,060 --> 00:33:44,920 Aqui está o número 1, e se você fizer eu deixei mudança, desvio à esquerda, 525 00:33:44,920 --> 00:33:49,260 o que você acha que tem o efeito de fazer com que um indivíduo? 526 00:33:49,260 --> 00:33:51,290 Literalmente deslocando-o. 527 00:33:51,290 --> 00:33:57,540 Então, se o número 1 é o que você tem na esquerda e você começa por inicializar i a 31, 528 00:33:57,540 --> 00:34:03,490 o que é que vai fazer? Ele vai levar este número 1 e mude-31 lugares por aqui. 529 00:34:03,490 --> 00:34:06,210 E porque não há, obviamente, não os outros dígitos por trás dele, 530 00:34:06,210 --> 00:34:10,350 aqueles por padrão será substituído com 0s. 531 00:34:10,350 --> 00:34:15,120 Então você vai começar com o número 1, o que naturalmente se parece com isso - 532 00:34:15,120 --> 00:34:18,659 e deixe-me tirar isso aqui no centro. 533 00:34:18,659 --> 00:34:22,139 E então, como você muda as coisas para a esquerda, esse cara vai essencialmente dessa forma. 534 00:34:22,139 --> 00:34:24,659 Mas assim que você fizer isso, um 0 é preenchido dentro 535 00:34:24,659 --> 00:34:28,360 Se você transferi-lo uma segunda vez, ele vai para um lado e outro 0 é preenchido dentro 536 00:34:28,360 --> 00:34:31,000 >> Você muda de novo e depois outro 0 é preenchido dentro 537 00:34:31,000 --> 00:34:37,900 Então, se você faz essa coisa de 1 << i 31 lugares, que acabam recebendo uma máscara 538 00:34:37,900 --> 00:34:42,550 que é de 32 caracteres, o que mais à esquerda do que é o 1, 539 00:34:42,550 --> 00:34:45,199 todo o resto dos quais são um 0. 540 00:34:45,199 --> 00:34:50,880 E não é que, como um aparte, mudando um número para a esquerda como esta 541 00:34:50,880 --> 00:34:53,530 também coincidentemente, e por vezes conveniente, 542 00:34:53,530 --> 00:34:57,520 tem o efeito de fazer o que para esse número? >> [Aluno] Dobrando-lo. 543 00:34:57,520 --> 00:35:00,980 Dobrar porque cada uma das colunas - o lugar 1s, 2s lugar, lugar 4s, 544 00:35:00,980 --> 00:35:05,030 Lugar 8s, 16s lugar - eles estão todos de duplicação que você vá para a esquerda. 545 00:35:05,030 --> 00:35:09,500 Ou melhor, quando você mudar a 1s você vai acabar dobrando o valor do número. 546 00:35:09,500 --> 00:35:12,070 Você pode acabar fazendo transformações interessantes de dígitos 547 00:35:12,070 --> 00:35:15,640 mudando tudo mais desta forma por potências de 2. 548 00:35:15,640 --> 00:35:17,150 Então, como isso funciona? 549 00:35:17,150 --> 00:35:22,580 Isso, então, dá-me uma máscara que é tudo 0s exceto por um 1 em lugar precisamente o que eu quero, 550 00:35:22,580 --> 00:35:27,920 e então esta expressão, que é roubado de toupper.c, 551 00:35:27,920 --> 00:35:31,770 está simplesmente dizendo ter o número n que o usuário digitou, 552 00:35:31,770 --> 00:35:34,730 "E" é com essa máscara, eo que é que você vai conseguir? 553 00:35:34,730 --> 00:35:39,200 Você está indo para obter um 1 se há um 1 em que a localização mascarado, 554 00:35:39,200 --> 00:35:41,570 ou você está indo para obter um 0 se não há. 555 00:35:41,570 --> 00:35:44,370 E assim todo o programa este que efetivamente é que tem um loop, 556 00:35:44,370 --> 00:35:48,340 e cria uma máscara com um 1 por aqui, então a 1 para cá, então a 1 para cá, 557 00:35:48,340 --> 00:35:52,950 e ele usa este bit a bit E truque para dizer é que há um bit 1 na entrada do usuário aqui? 558 00:35:52,950 --> 00:35:59,220 >> Existe um bit 1 na entrada do usuário aqui? E se assim for, literalmente imprimir um, senão imprimir 0. 559 00:35:59,220 --> 00:36:03,780 Estamos fazendo isso com ints só porque é por isso que nós estamos fazendo 32 bits em vez de 8, 560 00:36:03,780 --> 00:36:06,900 mas o que nós introduzimos é este bit a bit E, este bit a bit OR, 561 00:36:06,900 --> 00:36:10,450 e este desvio para a esquerda do operador, o que muitas vezes não são muito úteis, 562 00:36:10,450 --> 00:36:12,230 mas acontece que eles podem ser. 563 00:36:12,230 --> 00:36:16,560 Na verdade, se você fosse a representar algo como um array de booleanos 564 00:36:16,560 --> 00:36:21,260 só para representar verdadeiro ou falso, suponha que você queira acompanhar ou não 565 00:36:21,260 --> 00:36:24,630 uma sala cheia de 300 alunos está presente, 566 00:36:24,630 --> 00:36:29,420 você pode declarar uma matriz de tamanho 300 do tipo bool para que você obtenha 300 bools, 567 00:36:29,420 --> 00:36:33,090 e você pode definir cada para true se alguém está aqui e falso caso contrário. 568 00:36:33,090 --> 00:36:37,550 Por que é que a representação em que a estrutura de dados ineficiente? 569 00:36:39,370 --> 00:36:44,800 O que é ruim sobre o projeto de que a estrutura de dados, um conjunto de 300 bools? 570 00:36:46,190 --> 00:36:49,600 O que é um bool, na verdade, por baixo do capuz? 571 00:36:49,600 --> 00:36:52,310 Isto, também, é algo que pode não estar familiarizado. 572 00:36:52,310 --> 00:36:53,720 Acontece que não há bool. 573 00:36:53,720 --> 00:36:56,620 Lembre-se que tipo de criada que com o arquivo cs50.h, 574 00:36:56,620 --> 00:36:58,630 que por sua vez inclui bool padrão. 575 00:36:58,630 --> 00:37:00,930 C é o tipo de muda, porém, quando se trata de bool. 576 00:37:00,930 --> 00:37:04,880 Ele usa 8 bits para representar todos os bool, que é completamente inútil 577 00:37:04,880 --> 00:37:09,040 porque, obviamente, quantos bits que você precisa para representar um bool? Apenas 1. 578 00:37:09,040 --> 00:37:13,190 Assim, verifica-se que se você agora tem a habilidade com os operadores bit a bit 579 00:37:13,190 --> 00:37:17,760 para manipular bits individuais, mesmo em um char, mesmo em um único byte, 580 00:37:17,760 --> 00:37:21,380 não é que você pode diminuir a memória necessária para representar algo estúpido 581 00:37:21,380 --> 00:37:25,490 assim a estrutura de dados denominada frequência por um factor de 8. 582 00:37:25,490 --> 00:37:29,820 Em vez de usar oito bits para representar verdadeiro ou falso, você poderia literalmente usar um 583 00:37:29,820 --> 00:37:34,500 usando um único byte para cada oito alunos da turma 584 00:37:34,500 --> 00:37:41,990 e alternar 0-1 bits individuais usando esses tipos de baixo nível truques. 585 00:37:43,850 --> 00:37:49,460 Isso realmente pôr fim à energia. Há dúvidas sobre as operações bit a bit? 586 00:37:49,460 --> 00:37:52,710 >> Sim. >> [Aluno] Existe um operador exclusivo ou? 587 00:37:52,710 --> 00:37:56,440 Sim. Existe um operador exclusivo ou parecida com esta, ^, o símbolo de cenoura, 588 00:37:56,440 --> 00:38:02,070 o que significa que a única coisa que o primeiro ou o segundo aspecto pode ser um 1 para a saída para ser um 1. 589 00:38:02,070 --> 00:38:07,750 Há também um não, ~, o que lhe permitirá inverter a 0 para 1, ou vice-versa, bem. 590 00:38:07,750 --> 00:38:11,600 E há também um operador de deslocamento para a direita, >>, que é o oposto do que vimos. 591 00:38:11,600 --> 00:38:13,850 Tudo bem. Vamos levar as coisas agora para um nível superior. 592 00:38:13,850 --> 00:38:16,770 Começamos por falar de texto e, em seguida, comprimi-lo 593 00:38:16,770 --> 00:38:19,650 e representando o texto com um número menor de bits; 594 00:38:19,650 --> 00:38:22,890 nós conversamos um pouco sobre como nós podemos agora começar a manipular as coisas em um nível bit a bit. 595 00:38:22,890 --> 00:38:26,640 Vamos agora zoom até 10 mil pés de representação 596 00:38:26,640 --> 00:38:29,250 das coisas mais complexas, como gráficos. 597 00:38:29,250 --> 00:38:32,950 Aqui temos uma bandeira da Alemanha, aqui nós temos um da França. 598 00:38:32,950 --> 00:38:36,350 Estes podem ser representados em formatos de arquivo que você pode saber - GIFs, por exemplo. 599 00:38:36,350 --> 00:38:40,030 Se você já viu uma imagem na Web que termina em. Gif, 600 00:38:40,030 --> 00:38:43,000 este é um formato de intercâmbio de gráficos. 601 00:38:43,000 --> 00:38:47,530 Estas duas bandeiras aqui tipo de prestar-se a compressão 602 00:38:47,530 --> 00:38:52,050 para o que talvez seja óbvio motivo? >> [Resposta do aluno inaudível] 603 00:38:52,050 --> 00:38:53,440 Há um monte de repetição, certo? 604 00:38:53,440 --> 00:38:57,270 Para enviar bandeira da Alemanha, pense nisso como sendo uma imagem na tela 605 00:38:57,270 --> 00:38:59,030 trás em seus dias de Scratch. 606 00:38:59,030 --> 00:39:02,380 Você pode se lembrar que não há pixels individuais ou pontos que compõem uma imagem. 607 00:39:02,380 --> 00:39:06,650 >> Há toda uma linha de pontos pretos e outra linha inteira de pontos pretos. 608 00:39:06,650 --> 00:39:10,110 Há um monte de linhas de pontos pretos que se possa ver se realmente o zoom, 609 00:39:10,110 --> 00:39:13,370 bem como quando nós zoom no rosto de Rob no Photoshop. 610 00:39:13,370 --> 00:39:15,500 Assim como nós temos mais, mais e mais fundo na imagem, 611 00:39:15,500 --> 00:39:19,990 você começou a ver a pixelização, todas as praças que compõem seu olho nesse caso. 612 00:39:19,990 --> 00:39:24,130 Mesma coisa aqui. Se o zoom um pouco, você veria pontos individuais. 613 00:39:24,130 --> 00:39:27,110 Bem, este é um tipo de desperdício de bits. 614 00:39:27,110 --> 00:39:32,120 Se um terço do pavilhão é preto e um terço do pavilhão é amarelo e assim por diante, 615 00:39:32,120 --> 00:39:34,860 por que não podemos de alguma forma comprimir esta bandeira? 616 00:39:34,860 --> 00:39:39,560 E mesmo a bandeira francesa pode ser comprimido, embora o padrão é um pouco diferente. 617 00:39:39,560 --> 00:39:44,120 Acontece que o formato de arquivo GIF é um formato de compressão sem perdas, 618 00:39:44,120 --> 00:39:48,420 o que significa que você pode ter uma imagem como a bandeira alemã aqui, 619 00:39:48,420 --> 00:39:53,540 você pode jogar fora um monte de seus bits sem sacrificar a qualidade. 620 00:39:53,540 --> 00:39:55,340 Isto está em contraste com algo como JPEG, 621 00:39:55,340 --> 00:39:57,050 com a qual a maioria de nós provavelmente está mais familiarizado. 622 00:39:57,050 --> 00:39:59,000 Facebook fotos e fotos do Flickr e afins 623 00:39:59,000 --> 00:40:02,200 quase sempre são salvos como JPEGs quando está carregado, 624 00:40:02,200 --> 00:40:08,100 mas JPEGs é uma perdas - formato em que você jogue fora bits - com perdas 625 00:40:08,100 --> 00:40:10,430 mas você também joga fora de qualidade. 626 00:40:10,430 --> 00:40:13,890 E por isso, se você compactar fotos com Photoshop ou enviá-los para o Facebook 627 00:40:13,890 --> 00:40:15,580 ou levá-los em um telefone realmente ruim, 628 00:40:15,580 --> 00:40:19,510 você sabe que o quadro começa a ficar muito manchado e pixelizada, 629 00:40:19,510 --> 00:40:22,290 e isso é porque ele está sendo comprimido pelo computador ou telefone 630 00:40:22,290 --> 00:40:24,550 por, literalmente, jogando informações de distância. 631 00:40:24,550 --> 00:40:28,500 Mas GIF é surpreendente na medida em que pode usar menos bits do que poderia por padrão 632 00:40:28,500 --> 00:40:30,750 sem perder nenhuma informação. 633 00:40:30,750 --> 00:40:32,410 >> E é, essencialmente, fá-lo da seguinte maneira. 634 00:40:32,410 --> 00:40:38,740 Em vez de armazenar em um arquivo como um BMP seria um triplo RGB para preto, preto, preto, preto, 635 00:40:38,740 --> 00:40:42,570 preto, preto, preto, preto, preto, preto, preto, preto e assim por diante, 636 00:40:42,570 --> 00:40:45,640 em vez disso, o formato GIF é que vai dizer, "Black", 637 00:40:45,640 --> 00:40:48,330 e, em seguida, "Repita isso 100 vezes", ou algo assim. 638 00:40:48,330 --> 00:40:52,280 "Preto, repita este 100 vezes, preto, repita este 100 vezes ..." 639 00:40:52,280 --> 00:40:54,530 "Amarelo, repita este 100 vezes." 640 00:40:54,530 --> 00:40:57,200 E assim ele se lembra de, essencialmente, o pixel mais à esquerda 641 00:40:57,200 --> 00:41:02,160 e depois de alguma forma codifica a noção de repetir que o pixel de novo e de novo. 642 00:41:02,160 --> 00:41:06,110 Então GIFs pode comprimir-se sem perder nenhuma informação. 643 00:41:06,110 --> 00:41:09,510 Mas se você tivesse que adivinhar, se esse é o algoritmo que GIFs uso, 644 00:41:09,510 --> 00:41:13,180 qual destas bandeiras, mesmo que eles parecem idênticos em tamanho, 645 00:41:13,180 --> 00:41:19,620 vai ser menor quando salvos no disco como um GIF? >> [Aluno] Alemanha. 646 00:41:19,620 --> 00:41:21,660 Alemanha vai ser menor? Por quê? 647 00:41:21,660 --> 00:41:26,620 [Aluno] Porque você repetir isso muitas e muitas vezes na horizontal 648 00:41:26,620 --> 00:41:29,010 e então você repetir outra vez. >> Exatamente. 649 00:41:29,010 --> 00:41:32,020 Porque as pessoas que inventaram GIF apenas um tipo de arbitrariamente decidiu 650 00:41:32,020 --> 00:41:36,040 que a repetição será alavancado horizontalmente, e não lateralmente. 651 00:41:36,040 --> 00:41:40,900 Há uma repetição muito mais lateralmente aqui no pavilhão alemão do que na bandeira francesa. 652 00:41:40,900 --> 00:41:44,430 Então, se nós realmente abrir uma pasta no meu disco rígido que tem esses GIFs, 653 00:41:44,430 --> 00:41:51,920 você pode realmente ver que a bandeira alemã aqui é de 2 kilobytes e a francesa é de 4 kilobytes. 654 00:41:51,920 --> 00:41:54,080 Ele passa a ser uma coincidência que um é o dobro do outro, 655 00:41:54,080 --> 00:41:57,960 mas é, de facto, o caso em que a bandeira francesa é muito maior. 656 00:41:57,960 --> 00:42:01,250 >> Mesmo que nós estamos falando aqui sobre os gráficos, as mesmas idéias podem ser aplicadas a 657 00:42:01,250 --> 00:42:05,150 não coisas como bandeiras, mas imagens que são um pouco mais complexo. 658 00:42:05,150 --> 00:42:08,170 Se você tirar uma foto de uma maçã, certamente há um monte de duplicação lá, 659 00:42:08,170 --> 00:42:11,040 para que pudéssemos de alguma forma, lembre-se que o padrão de fundo é azul 660 00:42:11,040 --> 00:42:13,230 e não, como a imagem da direita sugere, 661 00:42:13,230 --> 00:42:16,830 tem que lembrar a cor de cada pixel nesta foto. 662 00:42:16,830 --> 00:42:21,060 Assim, podemos jogar fora pedaços lá sem perda de informações. 663 00:42:21,060 --> 00:42:23,340 A maçã ainda parece a mesma coisa. 664 00:42:23,340 --> 00:42:27,510 Neste exemplo aqui, você pode ver o que acontece em um filme. 665 00:42:27,510 --> 00:42:31,970 Estes representam bobinas velha escola de cinema em que na imagem de cima há 666 00:42:31,970 --> 00:42:36,900 você tem uma condução RV passado uma casa e uma árvore. 667 00:42:36,900 --> 00:42:42,130 E, como que van drives passado da esquerda para a direita, o que, obviamente, não mudando? 668 00:42:42,130 --> 00:42:45,320 A casa não vai a lugar nenhum, e que a árvore não vai a lugar nenhum. 669 00:42:45,320 --> 00:42:47,700 A única coisa que está se movendo é a van neste caso. 670 00:42:47,700 --> 00:42:51,650 Assim como fundo inalteradas sugere, o que você pode fazer em filmes 671 00:42:51,650 --> 00:42:56,530 é igualmente apenas jogar fora a informação que não muda entre quadros. 672 00:42:56,530 --> 00:42:58,900 Isto é geralmente conhecida como a compressão interframe 673 00:42:58,900 --> 00:43:02,120 através do qual se este quadro é quase idêntica a esta, 674 00:43:02,120 --> 00:43:05,390 não vamos nos preocupar armazenado em disco qualquer informação idêntica 675 00:43:05,390 --> 00:43:09,250 sobre esses quadros intermediários, vamos usar apenas quadros principais de vez em quando 676 00:43:09,250 --> 00:43:13,420 que, na verdade, armazenar essas informações de forma redundante apenas como um pouco de sanidade verificar. 677 00:43:13,420 --> 00:43:18,620 >> Por outro lado, uma outra abordagem para a compressão de vídeo é, neste segundo exemplo e inferior aqui, 678 00:43:18,620 --> 00:43:23,970 onde, em vez de armazenar 30 quadros, por que você não apenas armazenar 15 quadros por segundo em vez disso? 679 00:43:23,970 --> 00:43:27,070 Ao contrário do que o tipo de filme que flui lindamente, perfeitamente, 680 00:43:27,070 --> 00:43:30,060 ele pode olhar como está gagueira um pouco, uma pequena escola de idade, 681 00:43:30,060 --> 00:43:37,190 mas o efeito líquido será a de usar muito menos bits do que de outra forma seria necessária. 682 00:43:37,190 --> 00:43:39,240 Então onde é que isso, então isso nos deixa? 683 00:43:39,240 --> 00:43:41,700 Isso foi um pouco de um lado sobre onde mais você pode ir com a compressão. 684 00:43:41,700 --> 00:43:45,140 Para saber mais sobre isso, ter uma aula de como CS175 aqui. 685 00:43:45,140 --> 00:43:46,990 Aqui está outro exemplo dentro de vídeo. 686 00:43:46,990 --> 00:43:49,190 Se a abelha é a única coisa em movimento, 687 00:43:49,190 --> 00:43:51,790 você pode realmente jogar fora informações nesses quadros médios 688 00:43:51,790 --> 00:43:55,260 porque a flor e do céu e as folhas não estão mudando. 689 00:43:55,260 --> 00:43:57,960 Mas vamos agora considerar uma última coisa. 690 00:43:57,960 --> 00:44:03,890 Nos próximos cinco minutos que deixamos C para trás para sempre na aula? Sim. Não nos Série de Exercícios, no entanto. 691 00:44:03,890 --> 00:44:10,210 Última história sobre C e, então, chegar a coisas muito sexy 692 00:44:10,210 --> 00:44:13,870 envolvendo HTML e Web e woo-hoo. Tudo bem. 693 00:44:13,870 --> 00:44:16,050 Aqui vamos nós. Essa é a motivação. 694 00:44:16,050 --> 00:44:20,020 Acontece que todo esse tempo em que têm escrito programas que rodam Clang. 695 00:44:20,020 --> 00:44:23,890 E Clang, temos dito desde a primeira semana muito bonito, tem código fonte 696 00:44:23,890 --> 00:44:25,740 eo converte em código objeto. 697 00:44:25,740 --> 00:44:28,540 Leva C e converte-lo em 0s e 1s. 698 00:44:28,540 --> 00:44:32,150 Eu tipo de mentindo para você por algumas semanas, porque não é tão simples como isso. 699 00:44:32,150 --> 00:44:36,750 >> Há muito mais acontecendo debaixo do capô quando você executar um programa como o Clang. 700 00:44:36,750 --> 00:44:39,560 Na verdade, o processo de compilação de um programa realmente pode ser resumido, 701 00:44:39,560 --> 00:44:42,210 como você pode se lembrar de vídeo de Rob sobre compiladores, 702 00:44:42,210 --> 00:44:47,580 para estes quatro passos: pré-processamento, compilação em si, montagem e ligação. 703 00:44:47,580 --> 00:44:51,950 Mas na sala de aula ea maioria das pessoas do mundo tipicamente resumir todas essas etapas 704 00:44:51,950 --> 00:44:54,410 apenas como "compilação". 705 00:44:54,410 --> 00:44:58,070 Mas se começarmos com o código fonte como este, recordo este é talvez o mais simples programa em C 706 00:44:58,070 --> 00:45:03,530 temos escrito até agora, lembro que quando compilado acaba desse jeito. 707 00:45:03,530 --> 00:45:07,310 Mas há, na verdade, um passo intermediário, e os passos são como se segue. 708 00:45:07,310 --> 00:45:10,750 Primeiro há essa coisa no topo deste e mais dos nossos programas, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 O que o # include fazer por nós? 711 00:45:17,210 --> 00:45:24,150 Ele copia muito bonito e cola o conteúdo da stdio.h em meu arquivo de modo que por quê? 712 00:45:24,150 --> 00:45:27,220 Por que eu me preocupo com o conteúdo de stdio.h? O que há lá de interesse? 713 00:45:27,220 --> 00:45:32,310 Printf da declaração, o seu protótipo, de modo que o compilador, então, sabe o que quero dizer 714 00:45:32,310 --> 00:45:34,900 quando eu menciono essa função printf. 715 00:45:34,900 --> 00:45:39,390 Então, passo 1 na compilação é o pré-processamento, em que um programa como o Clang 716 00:45:39,390 --> 00:45:43,450 ou algum programa de ajuda que vem com Clang lê o código de topo para a base, 717 00:45:43,450 --> 00:45:47,740 esquerda para a direita, ea qualquer momento ele vê um símbolo # seguido de uma palavra-chave como include, 718 00:45:47,740 --> 00:45:53,980 ele executa essa operação, copiar e colar neste caso stdio.h em seu arquivo. 719 00:45:53,980 --> 00:45:55,510 Isso é o passo 1. 720 00:45:55,510 --> 00:45:59,620 Então você tem um arquivo muito maior C por causa da cópia enorme, cole trabalho que está apenas aconteceu. 721 00:45:59,620 --> 00:46:01,710 >> 2 passo agora é compilar. 722 00:46:01,710 --> 00:46:04,880 Mas acontece que a compilação tem código fonte que se parece com isso 723 00:46:04,880 --> 00:46:08,160 e transforma-lo em algo que se parece com isso, 724 00:46:08,160 --> 00:46:12,560 que para aqueles familiarizados é chamado? >> [Aluno] Assembléia. Língua >> Assembleia. 725 00:46:12,560 --> 00:46:16,700 Esta é realmente uma coisa se você tomar CS61 você vai mergulhar em mais detalhes. 726 00:46:16,700 --> 00:46:22,380 Este é apenas o mais próximo que você pode começar a escrever 0s e 1s-se 727 00:46:22,380 --> 00:46:25,850 mas escrever as coisas de tal forma que ainda faz, pelo menos, um pouco de sentido. 728 00:46:25,850 --> 00:46:30,760 Essas são instruções de máquina, e se desloque para a função principal aqui, 729 00:46:30,760 --> 00:46:35,470 perceber que existe esta instrução push, mover instrução, subtrair instrução, 730 00:46:35,470 --> 00:46:38,550 chamar a instrução, e assim por diante. 731 00:46:38,550 --> 00:46:42,930 Quando você ouve que o seu computador tem processador Intel dentro, 732 00:46:42,930 --> 00:46:46,180 você tem uma CPU Intel em seu Mac ou PC, o que significa isso? 733 00:46:46,180 --> 00:46:51,200 Uma CPU vem construído por empresas como a Intel compreender certas instruções. 734 00:46:51,200 --> 00:46:55,770 Eles não têm idéia do que funciona como swap são ou principal são, por si só, 735 00:46:55,770 --> 00:47:00,060 mas eles sabem o que muito instruções de baixo nível, como adicionar, subtrair, empurrar, 736 00:47:00,060 --> 00:47:02,430 mover, chamar, e assim por diante são. 737 00:47:02,430 --> 00:47:06,170 Então, quando você compilar o código C em linguagem de montagem, 738 00:47:06,170 --> 00:47:11,820 seu próprio código de usuário amigável para o futuro é convertido em algo que se parece com isso, 739 00:47:11,820 --> 00:47:21,670 que, literalmente, se move bytes ou 4 bytes em torno de tais pequenas unidades dentro e fora da CPU. 740 00:47:21,670 --> 00:47:26,820 Mas, finalmente, quando Clang está pronto para assumir essa representação de seu programa 741 00:47:26,820 --> 00:47:30,940 em 0s e 1s, em seguida, a etapa denominada montagem acontece, 742 00:47:30,940 --> 00:47:33,850 e isto tudo acontece de novo em um piscar de olhos ao executar Clang. 743 00:47:33,850 --> 00:47:39,300 Nós começamos aqui, ele gera um arquivo como este, e depois converte-lo para estes 0s e 1s. 744 00:47:39,300 --> 00:47:42,000 E se você quiser ir para trás em algum ponto e realmente ver isso em ação, 745 00:47:42,000 --> 00:47:48,220 se eu entrar em hello1.c-este é um dos programas primeiros que vimos - 746 00:47:48,220 --> 00:47:53,710 normalmente nós compilar este com hello1.c Clang e isso nos daria a.out. 747 00:47:53,710 --> 00:47:59,890 Se, pelo contrário você em vez dar o S-bandeira, o que você vai conseguir é hello1.s 748 00:47:59,890 --> 00:48:02,750 e você vai realmente ver a linguagem assembly. 749 00:48:02,750 --> 00:48:05,750 >> Estou fazendo isso para um programa muito curto, mas se você voltar para Scramble 750 00:48:05,750 --> 00:48:08,740 ou recuperar ou qualquer outro programa que você escreveu e só por curiosidade 751 00:48:08,740 --> 00:48:13,240 quero ver o que ele realmente parece, o que está realmente a ser alimentado na CPU, 752 00:48:13,240 --> 00:48:15,700 você pode usar esse S-bandeira com Clang. 753 00:48:15,700 --> 00:48:17,770 Mas, então, por fim, ainda há uma pegadinha. 754 00:48:17,770 --> 00:48:21,810 Aqui estão os 0s e 1s que representam minha implementação do Olá mundo. 755 00:48:21,810 --> 00:48:25,530 Mas eu usei a função de alguém no meu programa. 756 00:48:25,530 --> 00:48:28,710 Assim, mesmo que o processo tenha sido eu tomar hello.c, 757 00:48:28,710 --> 00:48:34,280 ele é compilado em código de montagem, e depois ele fica montado em 0s e 1s, 758 00:48:34,280 --> 00:48:37,460 a única 0s e 1s que são emitidas neste momento no tempo 759 00:48:37,460 --> 00:48:40,270 são os que resultam do meu código. 760 00:48:40,270 --> 00:48:44,400 Mas a pessoa que escreveu printf, que compilou o código 20 anos atrás 761 00:48:44,400 --> 00:48:47,000 e agora ele é instalado em algum lugar do aparelho, 762 00:48:47,000 --> 00:48:51,610 para que de alguma forma tem que mesclar suas 0s e 1s com meu 0s e 1s, 763 00:48:51,610 --> 00:48:56,160 e que nos leva ao passo 4 e final de elaboração, conhecido como ligação. 764 00:48:56,160 --> 00:48:58,680 Assim, no lado esquerdo, temos o quadro exatamente como antes: 765 00:48:58,680 --> 00:49:02,580 hello.c torna-se código de montagem torna-se 0s e 1s. 766 00:49:02,580 --> 00:49:05,960 Mas lembre-se que eu usei a biblioteca de I / O padrão no meu código, 767 00:49:05,960 --> 00:49:10,350 e isso significa que em algum lugar no computador há um arquivo chamado stdio.c 768 00:49:10,350 --> 00:49:13,980 ou, pelo menos, a mesma versão compilada porque alguém há alguns anos 769 00:49:13,980 --> 00:49:18,530 compilado em código stdio.c montagem e depois um monte de 0s e 1s. 770 00:49:18,530 --> 00:49:21,130 Isso é o que é conhecido como estático ou uma biblioteca dinâmica. 771 00:49:21,130 --> 00:49:23,350 É algum arquivo sentado em algum lugar do aparelho. 772 00:49:23,350 --> 00:49:28,710 >> Mas, finalmente, eu tenho que tomar minha 0s e 1s e dessa pessoa 0s e 1s 773 00:49:28,710 --> 00:49:32,760 e de algum modo vincular-los juntos, literalmente combinar os 0s e 1s 774 00:49:32,760 --> 00:49:37,900 em um único arquivo chamado a.out ou hello1 ou o que eu chamei meu programa 775 00:49:37,900 --> 00:49:43,320 de modo que o resultado final tem todos os 1s e 0s que devem compor o meu programa. 776 00:49:43,320 --> 00:49:45,660 Então todo esse tempo neste semestre, quando você estiver usando Clang 777 00:49:45,660 --> 00:49:48,750 e até mesmo, mais recentemente, de executar o make, a fim de executar Clang, 778 00:49:48,750 --> 00:49:53,580 todas essas etapas foram acontecendo tipo de instantaneamente, mas muito deliberadamente. 779 00:49:53,580 --> 00:49:57,830 E se você continuar em ciência da computação, ou seja, CS61, 780 00:49:57,830 --> 00:50:00,850 esta é a camada que você vai continuar a descascar lá fora 781 00:50:00,850 --> 00:50:06,980 falando sobre eficiência, implicações de segurança, e outros desses detalhes de nível inferior. 782 00:50:06,980 --> 00:50:09,220 Mas, com isso, que estamos prestes a deixar C para trás. 783 00:50:09,220 --> 00:50:11,420 Vamos em frente e tomar o nosso intervalo de 5 minutos, agora, 784 00:50:11,420 --> 00:50:14,190 e quando voltar: a Internet. 785 00:50:17,280 --> 00:50:19,170 Tudo bem. Estamos de volta. 786 00:50:19,170 --> 00:50:23,590 Agora vamos começar o nosso olhar não apenas em HTML, porque, como você vai ver, 787 00:50:23,590 --> 00:50:26,050 HTML em si é realmente muito simples 788 00:50:26,050 --> 00:50:29,270 mas realmente em programação web em geral, em rede de modo mais geral, 789 00:50:29,270 --> 00:50:31,770 e como todas essas tecnologias se reúnem 790 00:50:31,770 --> 00:50:35,400 para nos permitir criar programas muito mais sofisticados em cima da Internet 791 00:50:35,400 --> 00:50:38,690 do que até agora temos sido capazes de nos estas janelas preto e branco. 792 00:50:38,690 --> 00:50:42,140 Na verdade, neste momento, no semestre mesmo que vai passar um tempo relativamente menos 793 00:50:42,140 --> 00:50:46,200 em PHP, HTML, CSS, JavaScript, SQL e mais, 794 00:50:46,200 --> 00:50:48,480 a maioria dos estudantes do final para fazer projetos finais, que são baseados na web 795 00:50:48,480 --> 00:50:51,230 porque como você vai ver, o fundo que você tem agora em C 796 00:50:51,230 --> 00:50:54,450 é muito aplicável a estas linguagens de alto-nível. 797 00:50:54,450 --> 00:50:56,800 >> E como você começar a pensar sobre o seu projeto final, 798 00:50:56,800 --> 00:50:59,940 que, assim como Conjunto de Problemas 0, onde foram encorajados 799 00:50:59,940 --> 00:51:02,160 de fazer mais qualquer coisa do seu interesse em Scratch, 800 00:51:02,160 --> 00:51:05,790 O projeto final é a sua oportunidade de ter o seu novo conhecimento e habilidade com C 801 00:51:05,790 --> 00:51:09,850 ou PHP ou JavaScript ou similar, para um giro 802 00:51:09,850 --> 00:51:12,330 e criar o seu próprio pedaço de software para o mundo ver. 803 00:51:12,330 --> 00:51:17,770 E a semente que com idéias, saiba que você pode dirigir aqui, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Todos os anos, solicitar idéias de professores e funcionários e grupos de estudantes no campus 805 00:51:21,800 --> 00:51:27,330 apenas para apresentar as suas ideias para coisas interessantes que poderiam ser resolvidos usando computadores, 806 00:51:27,330 --> 00:51:29,860 usando sites, usando o software. 807 00:51:29,860 --> 00:51:32,360 Então, se você está lutando para chegar a uma idéia de seu próprio país, 808 00:51:32,360 --> 00:51:35,790 por todos os meios percorrer as idéias lá a partir deste ano eo último. 809 00:51:35,790 --> 00:51:39,990 É perfeitamente bem para enfrentar um projecto que tem sido abordado antes. 810 00:51:39,990 --> 00:51:44,540 Temos visto muitos aplicativos para ver o status de roupa no campus, 811 00:51:44,540 --> 00:51:47,000 muitos aplicativos para navegar no menu sala de jantar, 812 00:51:47,000 --> 00:51:49,540 muitos aplicativos para navegar o catálogo de cursos e afins. 813 00:51:49,540 --> 00:51:53,680 E, de fato, em uma palestra futuro e em futuros seminários, 814 00:51:53,680 --> 00:51:57,750 vamos apresentá-lo a algumas APIs disponíveis ao público, ambos disponíveis no mercado 815 00:51:57,750 --> 00:52:02,520 , assim como aqui disponível CS50 no campus para que você tenha acesso a dados 816 00:52:02,520 --> 00:52:04,910 e pode, então, fazer coisas interessantes com ela. 817 00:52:04,910 --> 00:52:09,380 Então, mais em projetos finais em alguns dias, quando nós liberamos a especificação, 818 00:52:09,380 --> 00:52:12,990 mas por agora, sei que você pode trabalhar sozinho ou com um ou dois amigos 819 00:52:12,990 --> 00:52:16,010 em mais qualquer projeto de interesse para você. 820 00:52:16,010 --> 00:52:18,080 A Internet. 821 00:52:18,080 --> 00:52:22,300 Vá em frente e puxe o seu laptop, você vai para facebook.com pela primeira vez, 822 00:52:22,300 --> 00:52:27,020 não ter conectado recentemente, e pressione Enter. O que acontece exatamente? 823 00:52:27,020 --> 00:52:30,150 >> Quando você pressione Enter em seu computador, monte um conjunto de passos 824 00:52:30,150 --> 00:52:32,600 começar espécie de passe de mágica acontecer. 825 00:52:32,600 --> 00:52:35,960 Então você aqui no servidor, web esquerda como o Facebook está aqui à direita, 826 00:52:35,960 --> 00:52:42,500 e de alguma forma você está usando esta linguagem chamada HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP não é uma linguagem de programação. É mais de um protocolo. 828 00:52:46,770 --> 00:52:52,310 É um conjunto de convenções que os navegadores e servidores Web usam quando intercomunicação. 829 00:52:52,310 --> 00:52:54,360 E o que isso significa é o seguinte. 830 00:52:54,360 --> 00:52:56,790 Assim como no mundo real, temos estas convenções 831 00:52:56,790 --> 00:53:00,140 onde se você encontrar algum ser humano pela primeira vez, se você não se importa brincando comigo aqui, 832 00:53:00,140 --> 00:53:03,980 Eu poderia vir até você, diga: "Oi, meu nome é David." >> Olá, David. Meu nome é Sammy. 833 00:53:03,980 --> 00:53:05,770 "Oi, David. Meu nome é Sammy." 834 00:53:05,770 --> 00:53:08,310 Então, agora temos apenas envolvidos neste tipo de protocolo humano bobo 835 00:53:08,310 --> 00:53:12,200 onde eu ter iniciado o protocolo, Sammy respondeu, 836 00:53:12,200 --> 00:53:15,060 temos aperto de mãos e a transação seja concluída. 837 00:53:15,060 --> 00:53:18,260 HTTP é muito semelhante em espírito. 838 00:53:18,260 --> 00:53:23,350 Quando seus pedidos navegador web www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 que o seu navegador está realmente fazendo está estendendo sua mão, por assim dizer, 840 00:53:27,020 --> 00:53:29,960 para o servidor e ele está enviando-lhe uma mensagem. 841 00:53:29,960 --> 00:53:34,220 E essa mensagem é tipicamente algo como se - o que você quer chegar? - 842 00:53:34,220 --> 00:53:38,740 me a página inicial, que normalmente é indicado por uma única barra no final de uma URL. 843 00:53:38,740 --> 00:53:43,790 E só assim você sabe que língua eu estou falando, eu o navegador vou dizer a você 844 00:53:43,790 --> 00:53:46,930 que eu estou falando HTTP versão 1.1, 845 00:53:46,930 --> 00:53:51,980 E também para a boa medida, eu vou dizer a você que o host que eu quero a página inicial do 846 00:53:51,980 --> 00:53:54,120 é facebook.com. 847 00:53:54,120 --> 00:53:57,730 Normalmente, um navegador web, sem saber, o ser humano, 848 00:53:57,730 --> 00:54:03,350 envia esta mensagem através da Internet quando você simplesmente digita www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Entrar, em seu navegador. 850 00:54:05,370 --> 00:54:07,300 E o que o Facebook responder com? 851 00:54:07,300 --> 00:54:12,540 Ele responde com alguns detalhes de aparência semelhante enigmáticas, mas também muito mais. 852 00:54:12,540 --> 00:54:14,310 Deixe-me ir à frente para a página do Facebook casa aqui. 853 00:54:14,310 --> 00:54:17,480 Esta é a tela que a maioria de nós provavelmente nunca ver se você ficar conectado o tempo todo, 854 00:54:17,480 --> 00:54:19,830 mas esta é de fato sua home page. 855 00:54:19,830 --> 00:54:24,150 Se fizermos isso no Chrome, perceber que você pode puxar para cima os menus de contexto pouco. 856 00:54:24,150 --> 00:54:26,980 Usando o Chrome, seja no Mac OS, Windows, Linux, ou similar, 857 00:54:26,980 --> 00:54:31,840 Se você controlar clique ou clique esquerdo, normalmente você pode puxar um menu que se parece com isso, 858 00:54:31,840 --> 00:54:35,870 onde algumas opções esperam, um dos quais é View Page Source. 859 00:54:35,870 --> 00:54:39,920 Você também pode normalmente obter a estas coisas, indo para o menu Exibir e bisbilhotando. 860 00:54:39,920 --> 00:54:42,750 Por exemplo, aqui em Exibir, desenvolvedor é a mesma coisa. 861 00:54:42,750 --> 00:54:45,780 Eu estou indo para ir em frente e olhar para View Page Source. 862 00:54:45,780 --> 00:54:50,800 O que você vai ver é o código HTML que Mark escreveu para representar facebook.com. 863 00:54:50,800 --> 00:54:55,910 É uma bagunça completa aqui, mas vamos ver que isso faz sentido um pouco mais antes de tempo. 864 00:54:55,910 --> 00:54:59,840 Mas existem alguns padrões aqui. Deixe-me rolar para coisas como esta. 865 00:54:59,840 --> 00:55:05,730 Isso é difícil para um ser humano para ler, mas percebe que não há esse padrão de colchetes angulares 866 00:55:05,730 --> 00:55:10,360 com palavras-chave como opção, palavras-chave como valor, algumas cordas citadas. 867 00:55:10,360 --> 00:55:15,660 Este é o lugar onde, quando você se inscreveu para a primeira vez, especificado o que o seu ano de nascimento é. 868 00:55:15,660 --> 00:55:19,020 Esse menu drop-down de anos de nascimento é de alguma forma codificada aqui 869 00:55:19,020 --> 00:55:23,870 nesta linguagem chamada HTML, HyperText Markup Language. 870 00:55:23,870 --> 00:55:27,730 Em outras palavras, quando o navegador solicita uma página web, 871 00:55:27,730 --> 00:55:30,610 fala esta convenção chamado HTTP. 872 00:55:30,610 --> 00:55:35,170 Mas o que é facebook.com responder a esse pedido com? 873 00:55:35,170 --> 00:55:38,260 >> Ele responde com algumas dessas mensagens crípticas, como veremos em um momento. 874 00:55:38,260 --> 00:55:43,760 Mas a maior parte da sua resposta está na forma de HTML, linguagem de marcação de hipertexto. 875 00:55:43,760 --> 00:55:47,170 Essa é a linguagem real em que uma página é escrita. 876 00:55:47,170 --> 00:55:52,030 E o que é um navegador realmente é, então, após o recebimento de algo que se parece com isso, 877 00:55:52,030 --> 00:55:57,120 lê-lo de cima para baixo, da esquerda para a direita, e qualquer vez que vê um desses suportes angulares 878 00:55:57,120 --> 00:56:03,370 seguido por uma palavra-chave como opção, ele exibe que a linguagem de marcação de forma adequada. 879 00:56:03,370 --> 00:56:06,820 Neste caso, seria exibir um menu de lista pendente de anos. 880 00:56:06,820 --> 00:56:09,240 Mas, novamente, isso é uma bagunça completa para olhar. 881 00:56:09,240 --> 00:56:16,630 Isso não é porque os desenvolvedores do Facebook manifestam 0 para 5 de estilo, por exemplo. 882 00:56:16,630 --> 00:56:20,190 Isto é porque a maioria do código que escrever é, de fato, escreveu lindamente, 883 00:56:20,190 --> 00:56:22,450 bem comentado, bem recuado, e similares, 884 00:56:22,450 --> 00:56:26,080 mas de máquinas de curso, computadores, navegadores realmente não dou a mínima 885 00:56:26,080 --> 00:56:27,890 se seu código é bem estilo. 886 00:56:27,890 --> 00:56:33,100 E, na verdade, é completamente inútil para bater a tecla tab todas as vezes 887 00:56:33,100 --> 00:56:37,650 e para colocar comentários durante todo o seu código e escolher realmente descritivos nomes de variáveis 888 00:56:37,650 --> 00:56:42,340 porque se o navegador não se importa, tudo que você está fazendo no final do dia é desperdiçar bytes. 889 00:56:42,340 --> 00:56:46,660 >> Assim, verifica-se que a maioria dos sites de fazer é mesmo que o código fonte para facebook.com, 890 00:56:46,660 --> 00:56:49,550 para cs50.net e todos esses outros sites na Internet 891 00:56:49,550 --> 00:56:53,730 são tipicamente bem escrita e bem comentado e bem recuado e semelhantes, 892 00:56:53,730 --> 00:56:59,270 normalmente antes do website é colocado na Internet, o código é minified, 893 00:56:59,270 --> 00:57:02,970 qual o código HTML e CSS - algo que vamos ver em breve - 894 00:57:02,970 --> 00:57:05,960 o código JavaScript que vamos ver em breve é ​​comprimido, 895 00:57:05,960 --> 00:57:09,250 através do qual nomes de variáveis ​​longos tornam-se X e Y e Z, 896 00:57:09,250 --> 00:57:13,900 e todos os que os espaços em branco que faz tudo parecer tão legível é tudo jogado fora, 897 00:57:13,900 --> 00:57:17,700 porque se você pensar sobre isso dessa maneira, Facebook recebe uma página de bilhões de acessos por dia - 898 00:57:17,700 --> 00:57:21,670 uma coisa louca como essa - de modo que se um programador apenas para ser anal 899 00:57:21,670 --> 00:57:26,660 bateu a barra de espaço uma vez extra apenas para travessão alguma linha de código sempre muito mais? 900 00:57:26,660 --> 00:57:29,500 Qual é a implicação se o Facebook que preserva os espaços em branco 901 00:57:29,500 --> 00:57:32,880 em todos os bytes que enviar de volta para as pessoas na internet? 902 00:57:32,880 --> 00:57:36,400 Bater a barra de espaço uma vez que lhe dá um byte extra em seu arquivo. 903 00:57:36,400 --> 00:57:39,730 E se um bilhão de pessoas, em seguida, proceder ao download da página inicial desse dia, 904 00:57:39,730 --> 00:57:42,060 quanto mais dados você transmitidos através da Internet? 905 00:57:42,060 --> 00:57:45,200 Um gigabyte por nenhuma boa razão. 906 00:57:45,200 --> 00:57:48,510 E concedido, por um monte de sites não é uma questão tão escalável, 907 00:57:48,510 --> 00:57:51,030 mas para o Facebook, para o Google, para alguns dos sites mais populares 908 00:57:51,030 --> 00:57:54,860 há grande incentivo financeiro para tornar seu código olhar como uma confusão 909 00:57:54,860 --> 00:57:58,980 de modo que você está usando como alguns bytes possível, além de, em seguida, comprimi-lo 910 00:57:58,980 --> 00:58:01,500 usando algo como zip, um algoritmo chamado gzip, 911 00:58:01,500 --> 00:58:04,250 que o navegador faz automaticamente para você. Mas isso é terrível. 912 00:58:04,250 --> 00:58:08,060 Nós nunca vamos aprender alguma coisa sobre sites de outras pessoas e como criar páginas web 913 00:58:08,060 --> 00:58:09,680 se temos de olhar para ele como este. 914 00:58:09,680 --> 00:58:13,620 >> Então, felizmente, navegadores como o Chrome e IE e Firefox estes dias 915 00:58:13,620 --> 00:58:16,450 normalmente vêm com ferramentas embutidas desenvolvedor. 916 00:58:16,450 --> 00:58:21,730 Na verdade, se eu descer aqui para inspecionar Elemento ou se eu for para Ver, Developer 917 00:58:21,730 --> 00:58:25,220 e vá para Ferramentas de Desenvolvimento explicitamente, 918 00:58:25,220 --> 00:58:27,640 Nesta janela, na parte inferior da tela do meu agora aparece. 919 00:58:27,640 --> 00:58:31,230 É um pouco intimidante no início, porque há um monte de abas desconhecidas aqui, 920 00:58:31,230 --> 00:58:34,510 mas se eu clicar em Elementos todo o caminho na parte inferior esquerda, 921 00:58:34,510 --> 00:58:38,810 Chrome é, obviamente, muito inteligente. Ele sabe como interpretar todo este código. 922 00:58:38,810 --> 00:58:42,320 E assim o Chrome faz é que limpa tudo de HTML do Facebook. 923 00:58:42,320 --> 00:58:45,680 Mesmo que não há espaço em branco lá, não há recuo lá, 924 00:58:45,680 --> 00:58:51,120 Agora, observe que eu possa começar a navegar nesta página web ainda mais hierarquicamente. 925 00:58:51,120 --> 00:58:56,910 Acontece que cada página da web escrito em uma linguagem chamada HTML5 deve começar com isso, 926 00:58:56,910 --> 00:59:03,980 esta declaração DOCTYPE, por assim dizer: 927 00:59:03,980 --> 00:59:07,840 É uma espécie de luz e cinza lá, mas essa é a primeira linha de código neste arquivo, 928 00:59:07,840 --> 00:59:12,080 e que apenas diz o navegador, "Ei, aqui vem algum HTML5. Aí vem uma página web." 929 00:59:12,080 --> 00:59:18,490 O primeiro suporte aberto além do que vem a ser essa coisa, um suporte aberto tag HTML, 930 00:59:18,490 --> 00:59:22,320 e então se eu mergulhar no mais profundo - essas setas são completamente sem sentido; 931 00:59:22,320 --> 00:59:25,140 eles são apenas por causa da apresentação, eles não estão realmente no arquivo - 932 00:59:25,140 --> 00:59:30,300 perceberá que dentro de tag HTML do Facebook, qualquer coisa que começa com um suporte aberto 933 00:59:30,300 --> 00:59:32,910 e depois tem uma palavra é chamado de tag. 934 00:59:32,910 --> 00:59:38,610 Então, dentro da tag HTML é aparentemente uma marca de cabeça e uma marca de corpo. 935 00:59:38,610 --> 00:59:41,930 Dentro da marca de cabeça agora é uma bagunça toda para o Facebook 936 00:59:41,930 --> 00:59:45,620 porque eles têm um monte de metadados e outras coisas para o marketing e publicidade. 937 00:59:45,620 --> 00:59:50,600 >> Mas se rolar para baixo, para baixo, para baixo, para baixo, vamos ver onde ele está. Aqui está. 938 00:59:50,600 --> 00:59:52,210 Este é pelo menos um pouco familiarizado. 939 00:59:52,210 --> 00:59:55,990 O título da página do Facebook de casa, se você olhar no guia em sua barra de título, 940 00:59:55,990 --> 00:59:59,060 é Bem-vindo ao Facebook - Log In, Registre-se ou Saber Mais. 941 00:59:59,060 --> 01:00:01,110 Isso é o que você vê na barra do Chrome título, 942 01:00:01,110 --> 01:00:03,100 e é assim que ele é representado no código. 943 01:00:03,100 --> 01:00:08,090 Se ignorar tudo na cabeça, a maior parte das entranhas de uma página web estão no corpo, 944 01:00:08,090 --> 01:00:10,940 e verifica-se que o código do Facebook vai olhar mais complexo 945 01:00:10,940 --> 01:00:14,540 que a maioria das coisas que vou escrever inicialmente apenas porque foi construído ao longo dos anos, 946 01:00:14,540 --> 01:00:17,260 mas há um monte de marcas de script, o código JavaScript, 947 01:00:17,260 --> 01:00:18,870 que torna o site muito interativo: 948 01:00:18,870 --> 01:00:22,330 ver atualizações de status instantaneamente usando linguagens como JavaScript. 949 01:00:22,330 --> 01:00:25,270 Há uma coisa chamada div, que é uma divisão de uma página. 950 01:00:25,270 --> 01:00:27,940 Mas, antes de chegar a esse detalhe, vamos tentar diminuir o zoom 951 01:00:27,940 --> 01:00:31,920 e olhar para uma versão mais simples do Facebook 1.0, por assim dizer. 952 01:00:31,920 --> 01:00:34,740 Aqui está o mundo, Olá de páginas web. 953 01:00:34,740 --> 01:00:37,370 Ele tem essa declaração DOCTYPE no topo 954 01:00:37,370 --> 01:00:40,280 que é um pouco diferente de tudo o resto. 955 01:00:40,280 --> 01:00:46,130 Nada mais que escrever em uma página web vai começar com 01:00:48,880 e exceto por uma coisa chamada comentários em HTML. 957 01:00:48,880 --> 01:00:53,000 Mas para a maior parte, tudo em uma página web é aberta suporte, suporte chave, perto. 958 01:00:53,000 --> 01:00:56,220 >> Neste caso, você pode ver a mais simples das páginas da web possíveis. 959 01:00:56,220 --> 01:01:00,260 A tag HTML contém uma marca de cabeça e que contém uma tag corpo, 960 01:01:00,260 --> 01:01:04,580 de notar que não há essa noção de partida e parada tags. 961 01:01:04,580 --> 01:01:11,360 Esta é a marca de início para HTML, esta é a tag de fechamento ou a tag final. 962 01:01:11,360 --> 01:01:15,400 Repare que eles são uma espécie de opostos no sentido de que a tag perto ou tag final 963 01:01:15,400 --> 01:01:20,030 tem essa barra dentro de si. 964 01:01:20,030 --> 01:01:23,540 Enquanto isso, há uma marca de cabeça aberta aqui e uma marca de cabeça perto aqui. 965 01:01:23,540 --> 01:01:26,880 >> Há um título aberto e um título de tag perto aqui. 966 01:01:26,880 --> 01:01:29,850 O fato de eu ter colocado o título em uma linha, puramente arbitrária. 967 01:01:29,850 --> 01:01:33,760 Ele só parecia que iria encaixar muito bem em uma única linha, então eu não me incomodei pressionar Enter algumas vezes. 968 01:01:33,760 --> 01:01:38,200 Enquanto isso, o corpo que eu fiz travessão só para estar sempre tão clara. 969 01:01:38,200 --> 01:01:41,050 Note que o HTML é uma linguagem muito burro. 970 01:01:41,050 --> 01:01:43,410 De fato, volta no dia anterior havia editores WYSIWYG 971 01:01:43,410 --> 01:01:46,770 e Microsoft Word onde você pode dizer: "Faça isso em negrito, itálico fazer este", 972 01:01:46,770 --> 01:01:50,850 você realmente digitar comandos pequenos ensaios em 20 + anos atrás 973 01:01:50,850 --> 01:01:55,740 em que você diria, "Comece a fazer este texto em negrito. Pare de fazer este texto em negrito." 974 01:01:55,740 --> 01:01:59,010 "Comece a fazer este texto itálico. Pare de fazer isso itálico texto." 975 01:01:59,010 --> 01:02:01,850 >> Isso é o que HTML ou qualquer linguagem de marcação é. 976 01:02:01,850 --> 01:02:05,530 Esta primeira marca diz: "Ei, navegador. Aí vem um pouco de HTML." 977 01:02:05,530 --> 01:02:09,880 A próxima marca diz: "Ei, navegador. Aí vem a cabeça, o cabeçalho da minha página web." 978 01:02:09,880 --> 01:02:11,650 "Ei, navegador. Aqui vem o título." 979 01:02:11,650 --> 01:02:15,880 E então, por aqui, "Ei, navegador. Isso é tudo para o título." 980 01:02:15,880 --> 01:02:20,000 Então é assim que o navegador saiba não exibir mais caracteres que Olá, mundo 981 01:02:20,000 --> 01:02:21,860 na barra de título. 982 01:02:21,860 --> 01:02:23,640 Enquanto isso, este diz: "Isso é tudo para a cabeça." 983 01:02:23,640 --> 01:02:28,340 Este diz: "Aqui vem o corpo Aqui está o corpo real." - Literalmente, as palavras Olá mundo. 984 01:02:28,340 --> 01:02:33,190 E isto diz aqui: "Isso é tudo para o corpo. Isso é tudo para o código HTML." 985 01:02:33,190 --> 01:02:34,640 Assim, os navegadores são muito burro. 986 01:02:34,640 --> 01:02:39,920 Eles apenas ler estas coisas de cima para baixo, da esquerda para a direita, e fazer exatamente o que eles dizem para fazer. 987 01:02:39,920 --> 01:02:41,860 Vamos realmente fazer um pequeno exemplo aqui. 988 01:02:41,860 --> 01:02:46,240 Deixe-me abrir o mais simples dos programas no meu Mac aqui, ou seja, TextEdit. 989 01:02:46,240 --> 01:02:48,220 No Windows, você pode usar Notepad.exe. 990 01:02:48,220 --> 01:02:50,520 Mas isso é tudo que você precisa para começar a fazer páginas da web. 991 01:02:50,520 --> 01:02:53,730 Eu estou indo para ir em frente e só copiar e colar este código neste arquivo. 992 01:02:53,730 --> 01:02:57,210 Eu estou indo para ir em frente e salve-o no meu desktop, 993 01:02:57,210 --> 01:03:01,220 e eu vou guardar como hello.html, 994 01:03:01,220 --> 01:03:03,840 e agora o arquivo é chamado hello.html. 995 01:03:03,840 --> 01:03:05,690 Aqui é a minha área de trabalho. 996 01:03:05,690 --> 01:03:11,130 Deixa-me ir em um navegador e arrastar o arquivo para o navegador. 997 01:03:11,130 --> 01:03:14,060 E pronto, aqui está a minha página da web primeiro. 998 01:03:14,060 --> 01:03:17,340 Observe que o título da guia é Olá, mundo de acordo com a tag título, 999 01:03:17,340 --> 01:03:20,040 e observe que Olá, mundo é o corpo de minha página web, 1000 01:03:20,040 --> 01:03:22,190 e woo-hoo, eu estou na internet. 1001 01:03:22,190 --> 01:03:24,700 >> Eu não sou realmente, certo, porque esse arquivo não está na Internet. 1002 01:03:24,700 --> 01:03:28,330 Ele passa a ser no meu disco rígido local em que determinado caminho. 1003 01:03:28,330 --> 01:03:32,720 Mas a idéia é a mesma. Tudo o que precisamos agora é um servidor web para que carregá-lo. 1004 01:03:32,720 --> 01:03:37,410 Mas primeiro vamos realmente introduzir complexidade um pouco mais e um pouco mais de estilização. 1005 01:03:37,410 --> 01:03:39,890 Este é um simples, se chato página web. 1006 01:03:39,890 --> 01:03:41,990 Acontece que há outros tipos de marcas que podemos usar. 1007 01:03:41,990 --> 01:03:45,530 Por exemplo, aqui em amarelo eu introduzi duas novas tags. 1008 01:03:45,530 --> 01:03:49,630 Nós não vamos jogar muito com esses de hoje, mas perceber que a tag link 1009 01:03:49,630 --> 01:03:52,520 de alguma forma, parece diferente de tudo o resto. 1010 01:03:52,520 --> 01:03:55,370 A tag link leva o que são chamados de atributos, 1011 01:03:55,370 --> 01:03:59,770 e um atributo é algo que modifica o comportamento de uma etiqueta. 1012 01:03:59,770 --> 01:04:03,840 Neste caso, esta não é a melhor escolha de nomes, link, porque é uma espécie de sentido, 1013 01:04:03,840 --> 01:04:11,590 mas esta tag link diz, essencialmente, incluir o arquivo chamado styles.css dentro da minha página web. 1014 01:04:11,590 --> 01:04:15,400 Você pode pensar nisso como análogo ao C # include directiva. 1015 01:04:15,400 --> 01:04:19,650 Styles.css está se referindo a uma linguagem totalmente diferente que não vamos brincar hoje, 1016 01:04:19,650 --> 01:04:23,790 mas é a estética: os tamanhos de fonte, cores, preenchimento de recuo, margens, 1017 01:04:23,790 --> 01:04:26,040 e de todos que tipo de detalhe a estética. 1018 01:04:26,040 --> 01:04:28,820 Enquanto isso, a marca de script é funcionalmente semelhante, 1019 01:04:28,820 --> 01:04:33,140 mas ao invés de include CSS, que a linguagem, que inclui outro idioma, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Portanto, em outras palavras, com estas duas marcas que eu, eventualmente, ser capaz de escrever a minha própria página web 1021 01:04:37,810 --> 01:04:41,490 mas também puxar o código que eu ou qualquer outra pessoa tenha escrito 1022 01:04:41,490 --> 01:04:44,350 para que possamos estar nos ombros de outras pessoas, podemos praticar um bom design, 1023 01:04:44,350 --> 01:04:46,120 fatorar código comum. 1024 01:04:46,120 --> 01:04:49,090 Se eu tenho 10 páginas web diferentes, isso significa que alguns dos meus estética 1025 01:04:49,090 --> 01:04:52,490 pode ser fatorada, bem como # include, em um arquivo separado. 1026 01:04:52,490 --> 01:04:54,420 Então, nós estamos chegando lá. 1027 01:04:54,420 --> 01:04:57,180 Mas primeiro vamos realmente fazer algo mais interessante com este arquivo. 1028 01:04:57,180 --> 01:05:01,110 >> Mais uma vez, este é apenas o TextEdit. Eu não sou tecnicamente na internet ainda, mas nós vamos chegar lá. 1029 01:05:01,110 --> 01:05:04,910 Eu gostaria de fazer Olá, mundo um pouco mais ousado do que é. 1030 01:05:04,910 --> 01:05:10,890 Assim Olá, vamos dizer arbitrariamente para negrito. 1031 01:05:10,890 --> 01:05:15,910 Mais uma vez, a história é a mesma: Olá, vírgula, começar a fazer isso em negrito, 1032 01:05:15,910 --> 01:05:19,730 então mundo fica impresso em negrito, e isso significa parar de imprimir esta em negrito. 1033 01:05:19,730 --> 01:05:24,020 Deixe-me ir em frente e salvar o meu arquivo, volte para o Chrome, eu vou aumentar o zoom apenas para que possamos vê-lo melhor, 1034 01:05:24,020 --> 01:05:27,870 e recarregar, e você vai ver que o mundo está agora em negrito. 1035 01:05:27,870 --> 01:05:31,810 A Web é tudo sobre hiperlinks, então vamos seguir em frente e fazer isso: 1036 01:05:31,810 --> 01:05:38,550 o meu site favorito é, vamos dizer, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Salvar, recarregar. Okay. Há alguns problemas agora além da hediondez do site. 1038 01:05:43,810 --> 01:05:47,310 1, eu tenho certeza que eu pressione Enter aqui. E eu fiz. 1039 01:05:47,310 --> 01:05:51,590 Eu não apenas pressione Enter, eu também recuado, praticando o que estamos pregando sobre o estilo, 1040 01:05:51,590 --> 01:05:54,930 mas a minha é bem próximo ao mundo. 1041 01:05:54,930 --> 01:05:58,410 Então, por que é isso? Navegadores só fazer o que lhes dizem para fazer. 1042 01:05:58,410 --> 01:06:04,010 Eu não disse o navegador, "linhas de quebrar aqui. Insira parágrafo quebrar aqui." 1043 01:06:04,010 --> 01:06:07,820 Assim, o navegador, não importa se eu acertar retorno de 30 vezes, 1044 01:06:07,820 --> 01:06:10,820 ela ainda vai colocar o meu ao lado mundo. 1045 01:06:10,820 --> 01:06:15,930 O que eu realmente tenho que fazer aqui é dizer algo como
, insira uma quebra de linha. 1046 01:06:15,930 --> 01:06:17,940 >> E, na verdade, uma quebra de linha é um tipo de coisa estranha 1047 01:06:17,940 --> 01:06:21,650 porque você não pode realmente começar a se mover para outra linha, em seguida, fazer alguma coisa, 1048 01:06:21,650 --> 01:06:25,380 e, em seguida, parar de se mover para uma nova linha. É uma espécie de uma operação atômica. 1049 01:06:25,380 --> 01:06:28,140 Você quer fazer isso ou não. Você tecle Enter ou não. 1050 01:06:28,140 --> 01:06:33,390 Então br é um pouco de uma marca diferente, e por isso eu preciso para classificar tanto abrir e fechar 1051 01:06:33,390 --> 01:06:35,230 de uma só vez. 1052 01:06:35,230 --> 01:06:37,500 A sintaxe para que é isso. 1053 01:06:37,500 --> 01:06:41,760 Tecnicamente, você poderia fazer algo assim em algumas versões do HTML, 1054 01:06:41,760 --> 01:06:45,600 mas isso é uma estupidez, porque não há nenhuma razão para iniciar e parar algo 1055 01:06:45,600 --> 01:06:48,420 se você pode fazê-lo, em vez de uma só vez. 1056 01:06:48,420 --> 01:06:52,310 Perceba que o HTML5 não estritamente exigir essa barra, 1057 01:06:52,310 --> 01:06:55,410 assim você vai ver livros didáticos e recursos on-line que não o possuem, 1058 01:06:55,410 --> 01:06:59,780 mas para uma boa medida vamos praticar a simetria que temos visto até agora. 1059 01:06:59,780 --> 01:07:02,870 Isto significa que a etiqueta é simultaneamente aberto e fechado. 1060 01:07:02,870 --> 01:07:05,220 Então, agora deixe-me salvar o meu arquivo, volte aqui. 1061 01:07:05,220 --> 01:07:10,240 Ok, isso está começando a parecer melhor, exceto a Web que eu sei é tipo de clicável, 1062 01:07:10,240 --> 01:07:13,610 e ainda youtube aqui não parece levar a nada. 1063 01:07:13,610 --> 01:07:17,560 Isso porque mesmo que ele se parece com um link, o navegador não sabe que, por si só, 1064 01:07:17,560 --> 01:07:20,670 então eu tenho que dizer ao navegador que este é um link. 1065 01:07:20,670 --> 01:07:22,620 >> A maneira de fazer isso é usar uma marca de âncora: 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 passar isso para uma nova linha apenas por isso é um pouco mais legível, 1069 01:07:38,490 --> 01:07:40,060 e eu vou diminuir o tamanho da fonte. 1070 01:07:40,060 --> 01:07:43,890 Estou feito ainda? Não. Não vai ser essa dicotomia. 1071 01:07:43,890 --> 01:07:46,760 Essa marca, a marca de âncora, de fato, tomar um atributo, 1072 01:07:46,760 --> 01:07:52,900 que modifica seu comportamento, eo valor desse atributo é aparentemente URL do YouTube. 1073 01:07:52,900 --> 01:07:56,380 Mas note a dicotomia é que só porque essa é a URL que você está indo, 1074 01:07:56,380 --> 01:08:01,020 isso não significa que tem de ser a palavra que você está destacando e fazendo um link. 1075 01:08:01,020 --> 01:08:03,960 Em vez disso, que pode ser algo como isto. 1076 01:08:03,960 --> 01:08:10,870 Então, eu tenho que dizer que parar de fazer essa palavra um hiperlink usando a tag âncora perto. 1077 01:08:10,870 --> 01:08:12,650 Repare que eu não estou fazendo isso. 1078 01:08:12,650 --> 01:08:15,890 1, este seria apenas um desperdício de tempo de todos e que não é necessário. 1079 01:08:15,890 --> 01:08:19,290 >> Para fechar uma tag, você só mencionar o nome da marca novamente. 1080 01:08:19,290 --> 01:08:21,800 Você não menciona qualquer um dos atributos. 1081 01:08:21,800 --> 01:08:26,189 Então, vamos guardar esse, voltar. Ok, pronto, agora é azul e hiperlink. 1082 01:08:26,189 --> 01:08:29,430 Se eu clicar nele, eu realmente ir ao YouTube. 1083 01:08:29,430 --> 01:08:32,529 Assim, mesmo que a minha página da web não está na Internet, é, no mínimo, HTML, 1084 01:08:32,529 --> 01:08:37,930 e se deixarmos a Internet pegar, nós realmente acabar aqui no youtube.com. 1085 01:08:37,930 --> 01:08:40,670 E eu posso voltar e aqui está a minha página da web. Mas perceber isso. 1086 01:08:40,670 --> 01:08:43,120 Se você já cheguei de spam ou de um ataque de phishing, 1087 01:08:43,120 --> 01:08:45,850 agora você tem a capacidade depois de apenas cinco minutos para fazer o mesmo. 1088 01:08:45,850 --> 01:08:50,920 Podemos ir aqui e fazer algo como www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 ou o que o site é esboçado, e então você pode dizer verificar a sua conta PayPal. 1090 01:08:59,319 --> 01:09:04,840 [Risos] E agora isso está indo para ir para badguy.com, que eu não estou indo para clicar em 1091 01:09:04,840 --> 01:09:08,000 porque eu não tenho idéia de onde que leva. [Risos] 1092 01:09:08,000 --> 01:09:10,859 >> Mas agora temos a capacidade de realmente acabar ali. 1093 01:09:10,859 --> 01:09:12,640 Então, nós estamos realmente começando a arranhar a superfície. 1094 01:09:12,640 --> 01:09:15,830 Nós não estamos a programação por si só, estamos escrevendo linguagem de marcação. 1095 01:09:15,830 --> 01:09:18,569 Mas assim que completar nosso vocabulário em HTML, 1096 01:09:18,569 --> 01:09:21,520 vamos introduzir PHP, uma linguagem de programação real 1097 01:09:21,520 --> 01:09:26,859 que nos permitirá gerar HTML automaticamente, gerar CSS automaticamente, 1098 01:09:26,859 --> 01:09:29,430 para que possamos começar na quarta-feira para implementar, por exemplo, 1099 01:09:29,430 --> 01:09:31,700 o nosso próprio motor de busca e muito mais. 1100 01:09:31,700 --> 01:09:34,770 Mas, mais do que em um par de dias. Vamos ver então. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]