1 00:00:00,000 --> 00:00:02,440 [Powered by Google Translate] [Semaine 7] 2 00:00:02,440 --> 00:00:04,730 [David J. Malan - Université de Harvard] 3 00:00:04,730 --> 00:00:07,490 [C'est CS50. - CS50.TV] 4 00:00:07,490 --> 00:00:12,280 Très bien. Bienvenue à nouveau. C'est CS50, et c'est le début de la semaine 7. 5 00:00:12,280 --> 00:00:14,690 Un couple de petits annonces: 6 00:00:14,690 --> 00:00:18,150 Pset5 est maintenant en cours, ou sera bientôt, 7 00:00:18,150 --> 00:00:21,590 et laissez-moi vous dire, en toute honnêteté, cela ne tendent à être parmi les plus difficiles 8 00:00:21,590 --> 00:00:24,460 des ensembles de problèmes du cours, alors laissez-moi mentionner maintenant 9 00:00:24,460 --> 00:00:28,190 de sorte que cette semaine, plus que jamais, vous n'attendez pas, disons, mercredi soir 10 00:00:28,190 --> 00:00:29,920 ou jeudi soir à plonger po 11 00:00:29,920 --> 00:00:32,369 C'est vraiment un pset intéressant. Nous pensons que c'est amusant. 12 00:00:32,369 --> 00:00:36,110 Si vous avez réellement le faire tout à fait correcte et peut alors contester le Conseil soi-disant Big, 13 00:00:36,110 --> 00:00:39,830 vous aurez l'occasion de s'affronter avec une partie du personnel du cours 14 00:00:39,830 --> 00:00:41,620 et certains de vos camarades de classe. 15 00:00:41,620 --> 00:00:44,670 Quel est le grand tableau est une fois que vous avez votre correcteur orthographique de travail, 16 00:00:44,670 --> 00:00:48,860 vous serez en mesure d'aller à cs50.net après l'exécution d'une commande, 17 00:00:48,860 --> 00:00:52,430 purement participer au programme, puis la quantité de temps et la quantité de RAM et plus 18 00:00:52,430 --> 00:00:56,130 que vous avez utilisé dans votre mise en œuvre sera exposée ici sur la page d'accueil du cours. 19 00:00:56,130 --> 00:00:59,740 Vous remarquerez que tout un tas de ces gens ici sont répertoriés comme personnel 20 00:00:59,740 --> 00:01:04,220 depuis ce week-end, le personnel pensait que ce serait amusant d'essayer de se surpasser les uns les autres. 21 00:01:04,220 --> 00:01:07,390 Ainsi se rendre compte que le but ici n'est pas de surpasser le personnel. 22 00:01:07,390 --> 00:01:09,790 Même moi, je ne suis ici au numéro 13. 23 00:01:09,790 --> 00:01:13,790 Purement participer au programme, mais c'est l'occasion de voir à quel point peu de RAM 24 00:01:13,790 --> 00:01:16,790 et combien peu de secondes CPU, vous pouvez utiliser vis-à-vis de certains de vos camarades de classe. 25 00:01:16,790 --> 00:01:20,540 >> Et je dois admettre que Kevin Michael Schmid, 26 00:01:20,540 --> 00:01:23,750 actuellement en position numéro 1 comme l'un des facteurs de transcription, 27 00:01:23,750 --> 00:01:28,120 il s'agit d'une mise en œuvre que nous appelons pas possible 28 00:01:28,120 --> 00:01:32,700 étant donné qu'il utilise près de 0 RAM et près de 0 secondes pour le chargement. 29 00:01:32,700 --> 00:01:35,670 Donc, nous allons prendre soin de Kevin déconnecté. [Rires] 30 00:01:35,670 --> 00:01:40,950 Il ya certaines compétences que Kevin est mise à l'épreuve ici. 31 00:01:40,950 --> 00:01:45,280 Une des choses que nous avons pensé que nous ferions aujourd'hui est trop CS50x est une semaine en cours, 32 00:01:45,280 --> 00:01:49,520 et vous les gars font tout autant partie de cette expérience que ces étudiants sont. 33 00:01:49,520 --> 00:01:53,720 Nous leur avons demandé dans le cadre de leur PSET0, qui était également de présenter un projet Scratch 34 00:01:53,720 --> 00:01:58,280 d'intérêt pour eux - un jeu, une pièce d'art interactive, une animation, ou autre - 35 00:01:58,280 --> 00:02:03,700 un 1 - vidéo 2-minute, si ils le souhaitent, dire bonjour au monde et qui ils sont réellement. 36 00:02:03,700 --> 00:02:06,780 J'ai pensé que je partagerais avec vous juste un couple des vidéos qui ont été soumis à ce jour 37 00:02:06,780 --> 00:02:10,759 parce que pour nous, le personnel au moins, il a vraiment été passionnante 38 00:02:10,759 --> 00:02:14,220 et inspirant de voir ces gens de partout dans le monde - les pays du monde entier - 39 00:02:14,220 --> 00:02:18,160 tuning, de toutes choses, à un cours d'informatique sur Internet, 40 00:02:18,160 --> 00:02:20,410 si c'est parce qu'ils veulent continuer leurs études, 41 00:02:20,410 --> 00:02:22,300 ils veulent prendre leur carrière dans une nouvelle direction, 42 00:02:22,300 --> 00:02:24,390 ils veulent combler les lacunes dans leurs connaissances, 43 00:02:24,390 --> 00:02:27,190 de sorte que certaines des mêmes raisons que vous les gars ont été peut-être ici. 44 00:02:27,190 --> 00:02:31,090 >> Donc, je vous donne un tel étudiant ici. Vous pouvez augmenter le volume un peu. 45 00:02:31,090 --> 00:02:35,520 Voici un de 1 minute de nos étudiants soumissions. 46 00:02:35,520 --> 00:02:40,380 Bonjour tout le monde. Je suis un étudiant en génie industriel ici, à Malaga, en Espagne. 47 00:02:40,380 --> 00:02:45,840 Je suis très enthousiaste à propos de ce cours en ligne parce que j'aime l'informatique, je le pense vraiment, 48 00:02:45,840 --> 00:02:48,880 et j'apprécie vraiment que je reçois à l'explorer. 49 00:02:48,880 --> 00:02:51,940 Et le fait que je peux apprendre la même chose tous vous les gars 50 00:02:51,940 --> 00:02:57,040 mais au lieu d'être à Harvard, je suis à Malaga, comment impressionnant est ce? 51 00:02:57,040 --> 00:03:02,040 Eh bien, je suis Fernando, et c'est CS50. Vous voir. 52 00:03:02,040 --> 00:03:07,100 [Rires] Un autre clip que nous aimons particulièrement, vous vous rendrez compte que ce monsieur anglais n'est pas si forte. 53 00:03:07,100 --> 00:03:11,520 On dirait qu'il l'avait traduit la machine, de sorte que les traductions elles-mêmes sont un peu imparfaite, 54 00:03:11,520 --> 00:03:15,790 mais c'était l'un de nos favoris jusqu'ici ainsi. 55 00:03:25,080 --> 00:03:29,980 [♪ ♪] 56 00:03:29,980 --> 00:03:32,370 Bonjour tout le monde. [Parler en japonais] 57 00:03:32,370 --> 00:03:39,830 [Je dois saluer en japonais parce que mon anglais est très peu fiable.] 58 00:03:39,830 --> 00:03:45,380 [J'ai livré le message pour vous de la ville de Gifu, au Japon.] 59 00:03:45,380 --> 00:03:49,820 [Je peux être un étudiant pour la première fois en 20 ans, comme on peut le voir.] 60 00:03:49,820 --> 00:03:54,640 [Je suis très reconnaissant à l'Université de Harvard qui m'a donné cette opportunité et EDX.] 61 00:03:54,640 --> 00:04:01,510 [Le golf est une guitare et je préfère courir.] [Rires] 62 00:04:01,510 --> 00:04:05,750 [♪ ♪] 63 00:04:05,750 --> 00:04:10,790 [Pourquoi pensez-vous que je tentais d'assister à une cs50x.] 64 00:04:10,790 --> 00:04:14,990 [Université de Harvard, il est mon désir.] 65 00:04:14,990 --> 00:04:19,740 [Surtout si je suis présence lointaine vécu au Japon.] 66 00:04:19,740 --> 00:04:26,680 [Je voulais essayer immédiatement au courant de l'existence d'un tel EDX quand.] 67 00:04:26,680 --> 00:04:32,500 [Tu ne crois pas si vous n'avez pas lié à l'âge de l'apprentissage I.] 68 00:04:32,500 --> 00:04:38,350 [CS50 est mon désir. Mon nom est Kazu, et c'est CS50.] 69 00:04:38,350 --> 00:04:43,090 [♪ ♪] [applaudissements et des acclamations] 70 00:04:43,090 --> 00:04:49,220 Un autre favori de la nôtre était cette présentation ici de quelqu'un. 71 00:04:51,070 --> 00:04:55,380 [♪ ♪] [Malan] Google il si vous n'êtes pas familier avec ce mème. 72 00:04:55,380 --> 00:05:01,480 >> Et puis enfin, quelques autres qui se sont affichés que peut-être remporter le prix adorable. 73 00:05:01,480 --> 00:05:06,820 [Étudiants] Aww! >> [Malan] Nous allons être à l'écoute. C'est court, alors écoutez attentivement. 74 00:05:08,580 --> 00:05:11,150 [Locutrice] Quel est votre nom? >> Louie. 75 00:05:11,150 --> 00:05:16,120 [Locutrice] Qu'est-ce? [Rires >>] CS50. [Rires] 76 00:05:16,120 --> 00:05:19,510 [Malan] Il n'a deux prises, cependant. 77 00:05:19,510 --> 00:05:22,240 Here we go, le dernier. 78 00:05:23,030 --> 00:05:26,980 Mon nom est Louie, et c'est CS50. 79 00:05:26,980 --> 00:05:30,250 [Rires] C'est alors CS50x. 80 00:05:30,250 --> 00:05:33,230 Merci à tous ceux d'entre vous tout en suivant le long à la maison 81 00:05:33,230 --> 00:05:35,620 qui ont été prenant part à ce jour. 82 00:05:35,620 --> 00:05:39,510 Aujourd'hui, nous concluons notre discussion sur les structures de données, 83 00:05:39,510 --> 00:05:41,160 au moins une partie du plus fondamental, 84 00:05:41,160 --> 00:05:44,760 et puis nous continuons notre conversation sur le langage HTML et la programmation web. 85 00:05:44,760 --> 00:05:48,520 En effet, nous avons passé le passé environ sept semaines à chercher dans les fondamentaux de la programmation - 86 00:05:48,520 --> 00:05:50,450 algorithmes, des structures de données, et analogues - 87 00:05:50,450 --> 00:05:53,050 et C, que vous pouvez avoir connu à ce jour, 88 00:05:53,050 --> 00:05:57,060 n'est pas nécessairement le plus accessible des langues 89 00:05:57,060 --> 00:05:59,090 avec laquelle mettre en œuvre certaines de ces idées. 90 00:05:59,090 --> 00:06:01,880 Et donc à partir de cette semaine et la semaine prochaine, puis la suivante, 91 00:06:01,880 --> 00:06:07,110 nous allons enfin pouvoir faire la transition de C, ce qui est généralement connu comme un langage assez bas niveau, 92 00:06:07,110 --> 00:06:11,190 aux choses de plus haut niveau, parmi lesquels PHP, JavaScript, etc, 93 00:06:11,190 --> 00:06:14,850 que nous verrons tirer les leçons mêmes que nous avons apprises au cours des dernières semaines, 94 00:06:14,850 --> 00:06:19,430 mais vous verrez que déclarer des choses comme les tableaux et les tables de hachage et de recherche et de tri 95 00:06:19,430 --> 00:06:23,370 devenu tellement plus facile parce que les langues elles-mêmes, nous allons commencer à utiliser 96 00:06:23,370 --> 00:06:25,290 deviendra plus puissant. 97 00:06:25,290 --> 00:06:27,410 Mais d'abord, une demande d'arbres. 98 00:06:27,410 --> 00:06:30,240 Il est très fréquent de nos jours d'avoir besoin de comprimer l'information. 99 00:06:30,240 --> 00:06:34,770 Dans quel contexte vous voulez compresser certains types d'informations numériques? 100 00:06:37,190 --> 00:06:39,670 >> Ouais. >> [L'élève] Lorsque vous avez besoin de l'envoyer sur le Web. 101 00:06:39,670 --> 00:06:41,450 Oui, quand vous voulez envoyer quelque chose sur le Web. 102 00:06:41,450 --> 00:06:44,950 Si vous voulez télécharger un gros fichier, il est idéal si quelqu'un à l'autre bout 103 00:06:44,950 --> 00:06:48,760 a comprimé ce fichier en utilisant un format zip ou quelque chose comme ça 104 00:06:48,760 --> 00:06:53,760 de sorte que vous envoyez moins de bits que l'on pourrait autrement être transmises. 105 00:06:53,760 --> 00:06:55,500 Alors, comment voulez-vous comprimer l'information? 106 00:06:55,500 --> 00:07:00,540 Tout se résume à l'utilisation de moins de bits que requis par défaut. 107 00:07:00,540 --> 00:07:03,220 Mais c'est un peu une chose curieuse parce repense aux semaines 0 et 1 108 00:07:03,220 --> 00:07:07,370 quand nous avons parlé ASCII et binaires et nous avons parlé ASCII en particulier 109 00:07:07,370 --> 00:07:10,690 comme utilisant 8 bits pour représenter les lettres de l'alphabet 110 00:07:10,690 --> 00:07:16,120 de sorte que la lettre A est représentée par 65, un minuscule est le numéro 97, 111 00:07:16,120 --> 00:07:21,210 et cependant vous représentez les 65 ou 97, vous utilisez 7 ou 8 bits. 112 00:07:21,210 --> 00:07:24,120 Mais le hic, c'est qu'il ya des lettres de l'alphabet anglais 113 00:07:24,120 --> 00:07:26,230 qui ne sont pas aussi populaires que d'autres. 114 00:07:26,230 --> 00:07:31,600 Z est pas du tout populaire, Q n'est pas du tout populaire, mais A et E sont super populaire. 115 00:07:31,600 --> 00:07:37,280 Et pourtant, pendant toutes ces lettres, par défaut le monde utilise le même nombre de bits, à seulement 8. 116 00:07:37,280 --> 00:07:42,690 Donc, n'aurait-il pas été plus intelligent, si au lieu d'utiliser 8 bits pour chaque lettre, 117 00:07:42,690 --> 00:07:47,440 même les plus souvent utilisées comme Q et Z, 118 00:07:47,440 --> 00:07:51,910 Et si nous avons utilisé moins de bits pour A et E et S et les lettres les plus populaires 119 00:07:51,910 --> 00:07:55,000 et plus de bits utilisés pour les lettres de moins populaires, 120 00:07:55,000 --> 00:07:57,770 l'idée étant d'optimiser let pour le cas le plus courant, 121 00:07:57,770 --> 00:08:01,160 qui est un thème en informatique d'essayer d'optimiser ce qui va se passer le plus 122 00:08:01,160 --> 00:08:05,310 et de passer un peu plus de temps, un peu plus d'espace sur les choses qui, ouais, pourraient se produire 123 00:08:05,310 --> 00:08:07,680 mais pas nécessairement aussi souvent. 124 00:08:07,680 --> 00:08:09,330 Alors prenons un exemple. 125 00:08:09,330 --> 00:08:12,610 >> Supposons que nous voulons pour coder les informations de façon assez efficace. 126 00:08:12,610 --> 00:08:15,090 Vous pourriez avoir grandi en ne connaissant un petit quelque chose sur le code Morse, 127 00:08:15,090 --> 00:08:17,450 et les chances sont que vous ne connaissez pas le code réel, 128 00:08:17,450 --> 00:08:21,750 mais vous rappelez peut-être que c'est au moins cette série de points et de tirets. 129 00:08:21,750 --> 00:08:26,640 Il s'agit d'un codage assez efficaces, et notez que la lettre la plus populaire - par exemple, E - 130 00:08:26,640 --> 00:08:28,980 utilise le plus court de bips. 131 00:08:28,980 --> 00:08:31,740 Le code Morse est tout au sujet bip-bip-bip-bip-bip-bip et la tenue des tons 132 00:08:31,740 --> 00:08:34,799 que ce soit pour de courtes périodes de temps ou de longues périodes de temps. 133 00:08:34,799 --> 00:08:40,330 E, comme indiqué par le point, un bip est super court, juste un bip, et qui représentent E. 134 00:08:40,330 --> 00:08:43,960 En revanche, T serait un long bip, bip, comme [prolonge son], 135 00:08:43,960 --> 00:08:45,710 et qui représentent T. 136 00:08:45,710 --> 00:08:48,840 Mais c'est quand même assez court parce que, en revanche, si vous regardez Z, 137 00:08:48,840 --> 00:08:52,690 d'exprimer Z vous iriez bip, bip [plus sonore], bip, bip [son court]. 138 00:08:52,690 --> 00:08:55,360 Donc, c'est plus parce que c'est moins commun. 139 00:08:55,360 --> 00:08:58,150 Mais la chasse aux sorcières, c'est que le code Morse est un peu défectueux 140 00:08:58,150 --> 00:09:00,610 en ce sens qu'elle n'est pas immédiatement décodable. 141 00:09:00,610 --> 00:09:07,350 Par exemple, supposons que vous entendez sur une fin du bip fil [abrégé], bip [longue]. 142 00:09:07,350 --> 00:09:12,480 Quel est le message que je viens de recevoir? Un point et un tiret. Qu'est-ce que ça représente? 143 00:09:12,480 --> 00:09:15,330 [L'élève] A. >> [Malan] Peut-être. 144 00:09:15,330 --> 00:09:18,270 Il pourrait également être suivie par T. E 145 00:09:18,270 --> 00:09:23,390 En d'autres termes, le code Morse, même si elle s'appuie sur ce principe d'optimisation le cas coin, 146 00:09:23,390 --> 00:09:26,250 il ne se prête pas à décodabilité immédiate. 147 00:09:26,250 --> 00:09:29,850 Autrement dit, l'homme qui entend ou reçoit ces points et de tirets 148 00:09:29,850 --> 00:09:34,540 a en quelque sorte de savoir où les pauses sont entre les lettres, 149 00:09:34,540 --> 00:09:39,660 parce que si vous ne savez pas où ces pauses sont, vous pourriez confondre A pour HE, ou vice versa. 150 00:09:39,660 --> 00:09:43,880 >> Alors, que pouvez-vous faire? Dans le code Morse vous pouviez juste une pause entre chacune des lettres. 151 00:09:43,880 --> 00:09:47,660 Mais la pause est un peu à l'encontre de toute la question des accélère les choses. 152 00:09:47,660 --> 00:09:52,880 Alors que faire si au lieu nous sommes arrivés avec un code dans lequel il n'y avait pas cette mauvaise situation 153 00:09:52,880 --> 00:09:56,570 où E est un préfixe, par exemple, de A - 154 00:09:56,570 --> 00:10:00,020 en d'autres termes, si nous pouvions faire en sorte que les motifs sont encore en deçà des lettres populaires 155 00:10:00,020 --> 00:10:04,850 long pour les lettres de moins populaires, mais il n'y a pas de confusion possible? 156 00:10:04,850 --> 00:10:08,930 Un homme du nom de Huffman ans a inventé ce système appelé codage de Huffman 157 00:10:08,930 --> 00:10:12,390 qui exploite en fait l'une des structures de données que nous avons passé un peu de temps à parler de 158 00:10:12,390 --> 00:10:16,560 la semaine dernière, que des arbres, des arbres binaires en particulier - 159 00:10:16,560 --> 00:10:19,710 un arbre binaire sens qu'il n'a pas plus de 2 enfants. 160 00:10:19,710 --> 00:10:22,720 Il a peut-être un enfant de gauche, peut-être un enfant à droite, et c'est tout. 161 00:10:22,720 --> 00:10:26,510 Supposons donc juste pour le plaisir de la discussion que quelqu'un veut envoyer un message 162 00:10:26,510 --> 00:10:31,270 qui ressemble à ceci. C'est complètement absurde, mais il est composé de As, Bs, Cs, Ds et Es. 163 00:10:31,270 --> 00:10:34,890 Et si vous avez réellement compter la totalité de l'As, Bs, Cs, Ds et Es 164 00:10:34,890 --> 00:10:36,870 puis diviser par le nombre total de lettres, 165 00:10:36,870 --> 00:10:42,710 ce petit tableau ici dit que 45% des lettres sont Es, 20% sont des As, 166 00:10:42,710 --> 00:10:45,010 10% B, et ainsi de suite. 167 00:10:45,010 --> 00:10:47,330 Donc, en d'autres termes, supposons que la chaîne entre guillemets il 168 00:10:47,330 --> 00:10:49,080 est juste un message que vous souhaitez envoyer. 169 00:10:49,080 --> 00:10:52,180 Il arrive à un non-sens afin que nous puissions l'utiliser comme quelques lettres que possible, 170 00:10:52,180 --> 00:10:55,220 mais c'est effectivement le cas que E reste le plus populaire, 171 00:10:55,220 --> 00:11:01,450 et B et C sont les moins populaires, au moins 5 de ces lettres de l'alphabet. 172 00:11:01,450 --> 00:11:04,040 Alors, comment pouvons-nous prendre pour venir avec un codage, 173 00:11:04,040 --> 00:11:08,430 un codage binaire, un motif de 0 et de 1 pour chacun de ces lettres 174 00:11:08,430 --> 00:11:14,820 de telle sorte que E est un modèle court et peut-être B et C sont des motifs légèrement plus longues, 175 00:11:14,820 --> 00:11:19,270 encore une fois, l'idée étant que nous voulons utiliser moins de bits la plupart du temps 176 00:11:19,270 --> 00:11:21,790 et plus de bits que de temps en temps. 177 00:11:21,790 --> 00:11:26,070 Selon le codage de Huffman, vous pouvez créer une forêt d'arbres. 178 00:11:26,070 --> 00:11:31,190 Il ya une sorte de ligne de l'histoire ici qui implique des arbres et aussi le processus de leur mise en place. 179 00:11:31,190 --> 00:11:32,420 Commençons. 180 00:11:32,420 --> 00:11:36,140 >> Je vous propose de commencer par cette forêt, pour ainsi dire, de 5 arbres, 181 00:11:36,140 --> 00:11:38,260 dont chacun est un arbre assez stupide. 182 00:11:38,260 --> 00:11:42,800 L'arbre est composé de seulement un seul nœud, représenté ici par un cercle. 183 00:11:42,800 --> 00:11:45,310 Ainsi, chacune de ces choses pourrait être une struct C 184 00:11:45,310 --> 00:11:50,200 et à l'intérieur de la structure C peut être un flotteur qui représente le nombre de fréquences 185 00:11:50,200 --> 00:11:52,510 et puis peut-être un char représentant la lettre. 186 00:11:52,510 --> 00:11:56,470 Alors, pensez à ces nœuds comme n'importe quelle ancienne struct C, mais, pour l'instant, niveau supérieur. 187 00:11:56,470 --> 00:12:01,230 Il s'agit d'une forêt de 5 arbres, chacun qui n'ont qu'un seul nœud. 188 00:12:01,230 --> 00:12:06,830 Qu'est-ce Huffman proposée est que nous commençons à combiner ces arbres 189 00:12:06,830 --> 00:12:11,140 qui ont les plus petits comptes de fréquence dans les arbres un peu plus grandes 190 00:12:11,140 --> 00:12:13,490 en les reliant avec un nœud racine. 191 00:12:13,490 --> 00:12:17,560 Ainsi, parmi les lettres ici, notez que pour plus de commodité, je les ai classés de gauche à droite, 192 00:12:17,560 --> 00:12:21,420 même si ce n'est pas strictement nécessaire, et notez que les petits nœuds 193 00:12:21,420 --> 00:12:23,930 actuellement 10% et 10%. 194 00:12:23,930 --> 00:12:28,940 Donc Huffman a proposé que nous fusionnons ces 2 petits noeuds dans un nouvel arbre 195 00:12:28,940 --> 00:12:34,450 en introduisant un nouveau nœud parent et de donner ensuite que parent d'un enfant gauche et droit d'un enfant 196 00:12:34,450 --> 00:12:37,720 où B est arbitrairement la gauche et C est arbitrairement la droite. 197 00:12:37,720 --> 00:12:41,590 Et puis Huffman en outre proposé que nous allons maintenant il suffit de penser à l'enfant gauche 198 00:12:41,590 --> 00:12:44,790 dans l'un de ces arbres toujours comme étant représentée par 0 199 00:12:44,790 --> 00:12:47,890 et l'enfant droit comme étant toujours représenté par le chiffre 1. 200 00:12:47,890 --> 00:12:50,680 >> Ce n'est pas grave si vous les retourner aussi longtemps que vous êtes cohérent. 201 00:12:50,680 --> 00:12:54,650 Alors maintenant, nous avons quatre arbres de cette forêt. 202 00:12:54,650 --> 00:12:58,050 Et je dis quatre, car maintenant l'arbre sur la gauche - 203 00:12:58,050 --> 00:13:00,570 et ce n'est pas tellement un arbre dans le sens où il pousse cette façon, 204 00:13:00,570 --> 00:13:05,170 ça ressemble plus à un arbre généalogique où maintenant la 0.2 est en quelque sorte la mère des deux enfants - 205 00:13:05,170 --> 00:13:07,930 remarquer que dans ce parent que nous avons établi à 0,2. 206 00:13:07,930 --> 00:13:13,370 Nous avons ajouté les comptes de fréquence des deux enfants et compte tenu du nouveau nœud de la somme totale. 207 00:13:13,370 --> 00:13:15,310 Alors maintenant, nous venons de répéter ce processus. 208 00:13:15,310 --> 00:13:19,490 Trouvez les deux plus petits nœuds, puis de les assembler au sein d'un nouvel arbre 209 00:13:19,490 --> 00:13:21,380 puis répétez le processus. 210 00:13:21,380 --> 00:13:26,390 En ce moment nous avons quelques candidats, 20%, 15% et 20%. 211 00:13:26,390 --> 00:13:29,780 Dans ce cas, nous devons briser l'égalité. Nous pouvons le faire de façon arbitraire. 212 00:13:29,780 --> 00:13:31,540 Nous devons juste le faire de manière cohérente. 213 00:13:31,540 --> 00:13:33,760 Dans ce cas, je vais arbitrairement aller avec celui sur la gauche, 214 00:13:33,760 --> 00:13:39,880 et j'ai maintenant fusionner les 20% et 15% pour me donner un nouveau parent appelé 35%, 215 00:13:39,880 --> 00:13:46,310 dont l'enfant est à gauche 0, dont le droit de l'enfant est de 1, et maintenant nous avons seulement trois arbres dans la forêt. 216 00:13:46,310 --> 00:13:47,960 Vous pouvez peut-être voir où cela va. 217 00:13:47,960 --> 00:13:51,150 Si l'on répète cette fois un couple de plus, nous allons avoir un seul grand arbre, 218 00:13:51,150 --> 00:13:53,900 dont toutes les arêtes sont marquées avec des 0 et des 1. 219 00:13:53,900 --> 00:13:55,710 Faisons-le à nouveau. 220 00:13:55,710 --> 00:14:02,600 35% est la racine de cet arbre est. 20% et 45%, de sorte que nous allons fusionner les 35% et 20%. 221 00:14:02,600 --> 00:14:05,610 Maintenant, nous avons cet arbre ici. Nous ajoutons ceux ensemble, nous avons 55%. 222 00:14:05,610 --> 00:14:07,910 Maintenant, il ya seulement deux arbres de la forêt. 223 00:14:07,910 --> 00:14:11,900 Nous faisons cette fois-ci définitive, et j'espère que mathématiquement toutes les fréquences ajouter jusqu'à 224 00:14:11,900 --> 00:14:15,570 parce qu'ils doivent depuis que nous avons calculée à partir de leur l'obtenir-aller d'ajouter jusqu'à 100%. 225 00:14:15,570 --> 00:14:17,960 Et maintenant nous avons un arbre. 226 00:14:17,960 --> 00:14:20,580 Il s'agit donc d'un arbre de Huffman codage. 227 00:14:20,580 --> 00:14:24,400 Il a pris une sorte de temps pour y arriver verbalement, mais la réalité est avec une boucle for 228 00:14:24,400 --> 00:14:27,620 ou avec une fonction récursive, on pourrait construire cette chose assez vite. 229 00:14:27,620 --> 00:14:32,440 Alors maintenant, nous avons un nouveau noeud, et tous ces noeuds internes ont été malloc, 230 00:14:32,440 --> 00:14:34,690 sans doute, le long du chemin. 231 00:14:34,690 --> 00:14:38,650 Alors maintenant, au sommet de cet arbre, nous avons 100%, mais maintenant, nous avons remarqué un chemin 232 00:14:38,650 --> 00:14:43,780 à partir de ce nouveau grand-grand-grand-grand-parent de tous les arrière-arrière-petits-enfants 233 00:14:43,780 --> 00:14:45,930 tout le chemin vers le bas, pour toutes les feuilles. 234 00:14:45,930 --> 00:14:52,840 >> Ce que nous allons faire maintenant, c'est de proposer que, pour représenter la lettre E, 235 00:14:52,840 --> 00:14:55,670 nous utiliserons simplement le numéro 1. Pourquoi? 236 00:14:55,670 --> 00:15:01,000 Parce que si nous parcourons cet arbre depuis la racine finale jusqu'à la feuille connue sous le nom E, 237 00:15:01,000 --> 00:15:06,050 nous suivons un seul bord, le bord droit, et qui est marqué du cours en haut droite 1. 238 00:15:06,050 --> 00:15:11,550 Ainsi, l'implication ici pour Huffman était que l'encodage binaire de E dans doit juste être 1. 239 00:15:11,550 --> 00:15:14,490 Et c'est sacrément efficace. Ne peut pas vraiment tout petit que cela. 240 00:15:14,490 --> 00:15:18,350 En revanche, A va être représenté, si vous suivez la logique, 241 00:15:18,350 --> 00:15:21,610 par ce motif de bits à la place? 01. 242 00:15:21,610 --> 00:15:25,500 Donc, pour obtenir à A, on commence à la racine et nous allons à gauche et puis nous allons à droite, 243 00:15:25,500 --> 00:15:28,580 ce qui signifie que nous avons suivi un 0 et un 1. 244 00:15:28,580 --> 00:15:32,810 Donc, nous allons représenter la lettre A avec le motif de 0 et 1. 245 00:15:32,810 --> 00:15:36,010 Et remarquez maintenant que nous avons déjà une propriété de décodabilité immédiate 246 00:15:36,010 --> 00:15:38,090 que nous n'avions pas dans le code Morse. 247 00:15:38,090 --> 00:15:42,840 Même si ces deux modèles sont assez courts - E est de 1 bit, 2 bits A est - 248 00:15:42,840 --> 00:15:45,080 remarquerez qu'ils ne peuvent pas être confondu un ou l'autre, 249 00:15:45,080 --> 00:15:54,870 parce que si vous voyez un 1, il faut que ce soit un E, si vous voyez un 0 puis un 1, il est évidemment obtenu d'être un A. 250 00:15:54,870 --> 00:15:58,410 De la même façon, ce qui est d? 001. 251 00:15:58,410 --> 00:16:01,440 Qu'est-ce que C? 0001. 252 00:16:01,440 --> 00:16:05,320 Et ce qui est B? 0000. 253 00:16:05,320 --> 00:16:09,550 Et encore une fois, parce que toutes les lettres qui nous intéressent sont les feuilles 254 00:16:09,550 --> 00:16:13,890 et aucun d'entre eux sont des sortes d'intermédiaires dans le chemin de la racine à la feuille, 255 00:16:13,890 --> 00:16:18,760 il n'y a pas de risque de amalgamant encodages 2 lettres différentes » 256 00:16:18,760 --> 00:16:22,300 parce que toutes ces configurations binaires sont déterministes. 257 00:16:22,300 --> 00:16:25,280 0000 sera toujours B. 258 00:16:25,280 --> 00:16:29,480 Il n'y a aucun nœud quelque part entre ce que vous pourriez confondre une lettre à l'autre. 259 00:16:29,480 --> 00:16:31,150 Alors, quelle est l'implication ici? 260 00:16:31,150 --> 00:16:35,080 >> La lettre la plus populaire - dans ce cas E - a obtenu le plus court d'encodage, 261 00:16:35,080 --> 00:16:37,430 Un a obtenu l'encodage le plus court suivant, 262 00:16:37,430 --> 00:16:41,390 et B et C, que nous connaissions déjà de la sorte obtenir-aller étaient des moins populaires 263 00:16:41,390 --> 00:16:45,390 à la fréquence de 10% chacun, ils ont obtenu la plus longue encodage. 264 00:16:45,390 --> 00:16:49,410 Et donc ce que cela signifie maintenant, c'est que si vous voulez envoyer un message qui est compressé 265 00:16:49,410 --> 00:16:51,950 sur Internet ou dans un e-mail ou similaires, 266 00:16:51,950 --> 00:16:56,730 plutôt que d'utiliser ASCII standard, vous pouvez envoyer un message codé Huffman 267 00:16:56,730 --> 00:17:01,720 de sorte que si vous voulez envoyer la lettre E, vous envoyez juste un peu seule. 268 00:17:01,720 --> 00:17:05,680 Si vous voulez envoyer un A, vous envoyez 2 bits, 01, au lieu d'envoyer 8 bits 269 00:17:05,680 --> 00:17:10,190 suivie d'une autre de 8 bits suivie d'une autre de 8 bits et ainsi de suite. 270 00:17:10,190 --> 00:17:11,940 Mais il ya un piège là. 271 00:17:11,940 --> 00:17:17,079 Il n'est pas suffisant de simplement construire cet arbre, puis commencer à envoyer d'Alice à Bob 272 00:17:17,079 --> 00:17:20,010 le modèle plus court bits, chaîne de l'ASCII, 273 00:17:20,010 --> 00:17:23,140 car Alice doit également informer de ce que Bob 274 00:17:23,140 --> 00:17:26,880 si Bob va être en mesure de lire son message compressé? 275 00:17:26,880 --> 00:17:30,770 [Réponse de l'élève inaudible] >> Qu'est-ce que c'est? 276 00:17:30,770 --> 00:17:32,310 [Réponse de l'élève inaudible] >> De quoi l'arbre est. 277 00:17:32,310 --> 00:17:35,160 Ou plus précisément encore, ce sont ces codages, 278 00:17:35,160 --> 00:17:39,010 d'autant plus que durant cette histoire, nous avons fait un appel de jugement à un moment donné. 279 00:17:39,010 --> 00:17:43,640 Rappelez-vous que nous devions choisir arbitrairement entre les 2 différents nœuds 20%? 280 00:17:43,640 --> 00:17:49,800 Donc ce n'est pas le cas de Bob, le destinataire, peut seulement reconstruire l'arbre sur son propre 281 00:17:49,800 --> 00:17:53,390 parce que peut-être il va créer l'arbre tant soit peu différente de Alice. 282 00:17:53,390 --> 00:17:56,670 De plus, Bob ne sait même pas ce que le message d'origine est 283 00:17:56,670 --> 00:18:00,770 parce que la seule chose que Alice est l'envoyant, bien sûr, est le message compressé. 284 00:18:00,770 --> 00:18:05,900 >> Ainsi, la prise en compression comme ceci, c'est que, oui, Alice peut sauver tout un tas de bits 285 00:18:05,900 --> 00:18:09,900 par l'envoi d'E 1 et 01 pour A et ainsi de suite, 286 00:18:09,900 --> 00:18:15,180 mais elle doit également informer Bob ce que la cartographie est entre les lettres et les bits 287 00:18:15,180 --> 00:18:19,620 parce qu'ils ne peuvent compter que sur bien ASCII plus si nous n'utilisons pas ASCII. 288 00:18:19,620 --> 00:18:22,200 Ainsi, elle peut soit lui envoyer l'arbre en quelque sorte - 289 00:18:22,200 --> 00:18:26,600 notez-le, rangez-le sous forme de données binaires ou quelque chose comme ça - 290 00:18:26,600 --> 00:18:30,280 ou tout simplement lui envoyer une petite antisèche, un fichier Excel, qui montre les mappages. 291 00:18:30,280 --> 00:18:36,480 Ainsi, l'efficacité de la compression prend vraiment que les messages que vous envoyez 292 00:18:36,480 --> 00:18:40,230 sont assez grandes, au moins moyennes entreprises, 293 00:18:40,230 --> 00:18:42,180 parce que si vous voulez envoyer un message super court, 294 00:18:42,180 --> 00:18:45,390 si vous voulez simplement envoyer le message BAD, qui se trouve être un mot, nous pouvons énoncer ici, 295 00:18:45,390 --> 00:18:49,550 B-A-D, vous allez probablement utiliser moins de bits, 296 00:18:49,550 --> 00:18:53,130 mais le hic, c'est si vous avez aussi d'informer Bob ce que l'arbre est 297 00:18:53,130 --> 00:18:57,530 ou ce que ces codages sont, vous allez sans doute l'emportent sur toutes les économies 298 00:18:57,530 --> 00:19:00,110 d'avoir des choses comprimé pour commencer. 299 00:19:00,110 --> 00:19:02,210 Ainsi, il peut effectivement être le cas que si vous essayez de compression 300 00:19:02,210 --> 00:19:05,330 même avec quelque chose comme formats zip ou un fichier que vous connaissez peut-être - 301 00:19:05,330 --> 00:19:07,780 fichiers assez petits, même des fichiers vides - 302 00:19:07,780 --> 00:19:10,930 parfois, ces fichiers peuvent devenir de plus en plus petit pas. 303 00:19:10,930 --> 00:19:14,320 Mais, en réalité, ce qui se passe seulement pour fichiers de petite taille, 304 00:19:14,320 --> 00:19:16,920 si ça ne va pas faire un fichier gigaoctet être 2 gigaoctets; 305 00:19:16,920 --> 00:19:19,480 nous parlons vraiment octets ou quelques kilo-octets couple. 306 00:19:19,480 --> 00:19:22,330 >> Certains programmes comme zip sont assez intelligents pour se rendre compte que, 307 00:19:22,330 --> 00:19:24,590 "Vous allez passer plus de bits de compression cela." 308 00:19:24,590 --> 00:19:27,460 "Permettez-moi pas la peine de le comprimer pour vous à tous." 309 00:19:27,460 --> 00:19:30,160 Donc, c'est juste une façon, puis de compresser au format texte. 310 00:19:30,160 --> 00:19:32,300 Nous avons pu mettre quelque chose comme ça en C. 311 00:19:32,300 --> 00:19:35,370 Par exemple, voici comment nous pourrions représenter un nœud dans cette arborescence 312 00:19:35,370 --> 00:19:39,320 où nous avons un char pour le symbole, une valeur flottante pour la fréquence, 313 00:19:39,320 --> 00:19:42,250 et comme nous l'avons vu de nos autres structures de données, 2 pointeurs, 314 00:19:42,250 --> 00:19:47,080 1 à l'enfant à gauche, 1 à droite, soit de ce qui peut être NULL, 315 00:19:47,080 --> 00:19:50,850 mais sinon, il se réfère à un enfant gauche et droit d'un enfant. 316 00:19:50,850 --> 00:19:55,130 Donc, c'est alors le codage de Huffman, et c'est une des façons dont vous pouvez aller sur la compression d'information, 317 00:19:55,130 --> 00:19:57,880 et c'est certainement l'un des plus faciles à mettre en œuvre 318 00:19:57,880 --> 00:20:00,830 dans le contexte, disons, de structures de données de la semaine dernière, 319 00:20:00,830 --> 00:20:03,250 si même les algorithmes plus sophistiqués existent 320 00:20:03,250 --> 00:20:08,220 qui peut faire des mutations encore plus sophistiqués de vos données. 321 00:20:08,220 --> 00:20:11,640 Toutes les questions, puis sur les arbres, arbres binaires, ou la compression de texte? 322 00:20:11,640 --> 00:20:15,590 [L'élève] Y at-il une certaine ambiguïté, comme si la division [inaudible] dans 01, 323 00:20:15,590 --> 00:20:19,160 puis 011 serait ambigu, non? 324 00:20:19,160 --> 00:20:22,730 [Inaudible] >> Bonne question. L'ambiguïté. 325 00:20:22,730 --> 00:20:25,940 Permettez-moi de résumer en se référant à ce tableau ici. 326 00:20:25,940 --> 00:20:29,650 Parce que les caractères sont de compression, les représentations, 327 00:20:29,650 --> 00:20:32,850 par définition de cet algorithme toujours les feuilles, 328 00:20:32,850 --> 00:20:41,870 vous ne serez jamais accidentellement utiliser le même modèle de bits pour le préfixe de plusieurs lettres. 329 00:20:41,870 --> 00:20:46,740 Donc, en d'autres termes, vous êtes préoccupé, il semble que, d'une ambiguïté qui se dégage 330 00:20:46,740 --> 00:20:51,580 où 001 pourrait être le début de B ou le début de C ou quelque chose comme ça. 331 00:20:51,580 --> 00:20:56,780 Mais cela ne peut pas être le cas puisque l'avis que toutes les lettres de l'alphabet, nous vous encodez 332 00:20:56,780 --> 00:20:58,290 sont les feuilles. 333 00:20:58,290 --> 00:21:01,910 >> L'ambiguïté ne peut se produire, comme dans le cas du code Morse, 334 00:21:01,910 --> 00:21:06,770 si, par exemple, C est quelque part le long du chemin de la racine à B. 335 00:21:06,770 --> 00:21:12,290 [L'élève] Droit. Donc, dans ce cas, par exemple A a 2 feuilles. Say A >> a - Répète un peu. 336 00:21:12,290 --> 00:21:18,760 [L'élève] Say A dispose de 2 feuilles, F et G, puis G - >> Okay. Mais il ne peut pas. 337 00:21:18,760 --> 00:21:23,230 A lui-même ne pouvait pas avoir les feuilles F et G, car ces lettres F et G 338 00:21:23,230 --> 00:21:27,560 seraient eux-mêmes laisse quelque part sur la gauche de B ou le droit de E. 339 00:21:27,560 --> 00:21:28,900 Donc, par définition, ils doivent être des feuilles. 340 00:21:28,900 --> 00:21:32,940 Dans le cas contraire, vous avez parfaitement raison, nous n'avons pas résolu le problème que le code Morse est confrontée. 341 00:21:32,940 --> 00:21:38,150 Bonne question. D'autres questions? Très bien. 342 00:21:38,150 --> 00:21:42,050 Cette notion de bits, il s'avère que nous avons eu tout au long de la puissance que nous n'avons pas réellement utilisé 343 00:21:42,050 --> 00:21:44,200 quand il est venu à la manipulation de ces 0 et de 1. 344 00:21:44,200 --> 00:21:46,600 Nous avons demandé à ce sujet sur l'un des jeux plus anciens problèmes: 345 00:21:46,600 --> 00:21:52,340 à savoir, comment allez-vous sur la conversion des majuscules en minuscules ou vice-versa? 346 00:21:52,340 --> 00:21:55,460 Ou, plus concrètement, l'un de ces psets d'abord demandé 347 00:21:55,460 --> 00:22:01,090 le nombre de bits que vous avez réellement à retourner pour changer A en minuscules ou vice-versa, un? 348 00:22:01,090 --> 00:22:05,580 Voici un petit rappel de ce que 65 et 97 ressemblent en binaire. 349 00:22:05,580 --> 00:22:08,060 Et même si cette question n'a sorte de fané dans votre mémoire, 350 00:22:08,060 --> 00:22:11,290 vous pouvez voir à nouveau ici que le nombre de bits doivent être retournées 351 00:22:11,290 --> 00:22:15,810 de changer majuscule en minuscule un? Juste un. 352 00:22:15,810 --> 00:22:19,650 >> Ils ne diffèrent que par un seul endroit, le troisième bit de la gauche. 353 00:22:19,650 --> 00:22:24,240 Tandis que A a un 010, un peu a un 011. 354 00:22:24,240 --> 00:22:26,250 Donc, en quelque sorte, nous devons simplement être en mesure de retourner ce bit, 355 00:22:26,250 --> 00:22:29,410 et on peut alors capitaliser ou minuscules. 356 00:22:29,410 --> 00:22:32,720 Nous avons fait cela dans le passé de votre utilisation effective si les conditions 357 00:22:32,720 --> 00:22:35,930 et de vérifier si la lettre est entre le capital et le capital A Z, 358 00:22:35,930 --> 00:22:41,480 alors les sorties comme A - a + 26 ou quelque chose comme ça. 359 00:22:41,480 --> 00:22:46,130 Vous avez probablement fait un changement arithmétique aux lettres de l'alphabet. 360 00:22:46,130 --> 00:22:49,270 Mais que faire si nous pouvions retourner que d'un seul bit? 361 00:22:49,270 --> 00:22:59,080 Comment pourriez-vous de prendre une valeur d'un octet de bits, 8 bits de sorte 01000001 et 01100001 comme? 362 00:22:59,080 --> 00:23:03,170 Si vous avez eu ces schémas de bits, comment pouvons-nous faire pour changer un seul d'entre eux? 363 00:23:03,170 --> 00:23:07,610 Que si l'on introduit en jaune ici cette autre motif de bits? 364 00:23:07,610 --> 00:23:13,420 Si je fais les 0 chaînes entières jaunes, sauf pour le bit que je veux changer 365 00:23:13,420 --> 00:23:17,900 puis-je introduire un nouvel opérateur connu comme un opérateur binaire - 366 00:23:17,900 --> 00:23:21,210 utiliser l'opérateur dans le sens où il opère sur des bits individuels, 367 00:23:21,210 --> 00:23:25,360 pas sur un octet entier ou quatre octets à la fois. 368 00:23:25,360 --> 00:23:31,170 Cette barre verticale en jaune il suggère que si nous prenons la représentation du capital A 369 00:23:31,170 --> 00:23:37,060 OU bit à bit et c'est avec la séquence de bits jaune? 370 00:23:37,060 --> 00:23:41,300 En d'autres termes, pensez à notre discussion sur les expressions booléennes dans Scratch, puis en C. 371 00:23:41,300 --> 00:23:47,520 >> Faire un booléen ou signifie que pour être vrai, que ce soit la première chose que doit être vrai 372 00:23:47,520 --> 00:23:50,700 ou la deuxième chose doit être vraie ou ils ont tous deux pour être vrai, 373 00:23:50,700 --> 00:23:53,270 puis le résultat obtenu est lui-même vrai. 374 00:23:53,270 --> 00:24:00,230 Dans ce cas là, qu'est-ce que nous obtenons si nous prenons 0 "ou" ed avec 0? Faux ou faux? 375 00:24:00,230 --> 00:24:04,280 C'est encore faux, de sorte que le reste a minuscule comme prévu. 376 00:24:04,280 --> 00:24:07,540 Et si au lieu que nous faisons 1 ou 0? 377 00:24:07,540 --> 00:24:12,640 Cela reste maintenant 1, mais remarquez ce qui va se passer ici. 378 00:24:12,640 --> 00:24:18,630 Si nous commençons avec un capital A et nous continuons à »ou« ses bits individuels comme nous le faisons ici, 379 00:24:18,630 --> 00:24:25,180 0 ou le jaune donne ce que nous ici? Cela nous donne 1. 380 00:24:25,180 --> 00:24:35,120 En effet, supposons que nous ne savions pas ce que la version majuscule d'un peu en réalité. 381 00:24:35,120 --> 00:24:38,270 Allons faire. Permettez-moi de passer ce retour ici. 382 00:24:38,270 --> 00:24:42,340 Faisons-le à nouveau. 0 ou 0 me donne 0. 383 00:24:42,340 --> 00:24:45,020 1 ou 0 me donne 1. 384 00:24:45,020 --> 00:24:48,020 0 ou 1 me donne 1. 385 00:24:48,020 --> 00:24:52,880 0 ou 0 me donne 0. Le prochain est 0, la suivante est 0, la suivante est 0. 386 00:24:52,880 --> 00:24:55,660 1 ou 0 me donne 1. 387 00:24:55,660 --> 00:24:59,140 Et même si nous ne savions pas à l'avance ce qui était une minuscule, 388 00:24:59,140 --> 00:25:04,770 par un simple "ou" ing A avec ce modèle de bits que nous avons présentées ici en jaune, 389 00:25:04,770 --> 00:25:09,400 vous pouvez minuscules un A majuscule en feuilletant ce bit. 390 00:25:09,400 --> 00:25:11,580 Nous avons utilisé cette expression semaine il ya: en feuilletant un peu. 391 00:25:11,580 --> 00:25:13,710 Comment faites-vous le faire par programmation? 392 00:25:13,710 --> 00:25:16,390 Vous pouvez utiliser ce qui est généralement appelé un masque, une séquence de bits, 393 00:25:16,390 --> 00:25:19,980 que dans ce cas se trouve juste à ressembler à ce nombre ici, 394 00:25:19,980 --> 00:25:22,980 et puis vous "ou" c'est ainsi que l'utilisation de ce nouvel opérateur C, 395 00:25:22,980 --> 00:25:29,940 pas | |, vous utilisez un seul | et vous voulez réellement obtenir cette réponse ici parce que pourquoi? 396 00:25:29,940 --> 00:25:35,120 C'est l'endroit 1s, 2s lieu, 16s 4s, 8s,, 32s. 397 00:25:35,120 --> 00:25:42,280 Ainsi, il s'avère que si vous prenez une lettre majuscule et un OU binaire avec elle l'entier 32, 398 00:25:42,280 --> 00:25:47,520 parce que l'entier 32, lorsque vous le regardez comme bits, ressemble à ceci, 399 00:25:47,520 --> 00:25:50,860 cela signifie que vous pouvez retourner le bit que vous voulez vraiment. 400 00:25:50,860 --> 00:25:52,630 Et de même - et nous allons regarder le code dans un instant - 401 00:25:52,630 --> 00:25:54,210 supposons que nous voulions aller l'autre sens. 402 00:25:54,210 --> 00:25:58,210 >> Comment allez-vous de minuscule d'un capital à A? Le bit qui doit changer? 403 00:25:58,210 --> 00:25:59,820 C'est le même. 404 00:25:59,820 --> 00:26:03,970 Nous voulons changer cette troisième bit à partir d'un 1 à 0. 405 00:26:03,970 --> 00:26:06,310 Et comment pourrions-nous le faire de manière? 406 00:26:06,310 --> 00:26:10,130 Comment pouvons-nous arrêter un peu? Avec ce modèle de bits pourrions-nous arrêter un peu? 407 00:26:11,580 --> 00:26:14,070 Et si nous trions inverti, le masque? 408 00:26:14,070 --> 00:26:17,350 Alors qu'avant, nous avons fait le 0s masque tout entier jaune 409 00:26:17,350 --> 00:26:19,930 sauf pour le bit nous avons voulu mettre en marche, 410 00:26:19,930 --> 00:26:25,580 Et si cette fois, nous faisons le 1s masque tout entier, sauf pour le bit que nous voulons pour éteindre 411 00:26:25,580 --> 00:26:28,330 puis utilisez quel opérateur? 412 00:26:28,330 --> 00:26:30,560 Que faire si nous »et« les choses? Jetons un coup d'oeil. 413 00:26:30,560 --> 00:26:34,880 Si maintenant nous retourner ce, supposons que je crée un nouveau masque c'est tout ce que 1s 414 00:26:34,880 --> 00:26:37,650 sauf pour le bit celui que je veux pour éteindre 415 00:26:37,650 --> 00:26:43,860 et puis au lieu de "ou" les chiffres blancs là-haut avec les chiffres jaunes ici-bas, 416 00:26:43,860 --> 00:26:46,940 si je place "et" ensemble? C'est ce qu'on appelle une opération de bits et. 417 00:26:46,940 --> 00:26:49,450 Logiquement, c'est la même chose que une valeur booléenne et. 418 00:26:49,450 --> 00:26:55,160 Cela me donne 0 et 1 est 0. Donc, faux et vrai est faux. 419 00:26:55,160 --> 00:26:58,160 Vrai et vrai est vrai. 420 00:26:58,160 --> 00:27:04,020 Et voici la magie: Vrai et faux est maintenant faux, nous avons donc éteint ce bit. 421 00:27:04,020 --> 00:27:06,560 Et maintenant, le reste de l'histoire est un peu simple. 422 00:27:06,560 --> 00:27:11,970 Parce que le reste du masque est 1s, ce n'est pas grave ce que les chiffres sont en blanc. 423 00:27:11,970 --> 00:27:15,580 Lorsque vous »et« quelque chose avec vrai, tu ne vas pas changer sa valeur. 424 00:27:15,580 --> 00:27:20,200 Si c'est vrai, il restera fidèle. Si c'était faux, il restera faux. 425 00:27:20,200 --> 00:27:23,190 >> Mais la magie opère quand vous prenez quelque chose qui était vrai 426 00:27:23,190 --> 00:27:25,430 et que vous "et" avec fausse. 427 00:27:25,430 --> 00:27:30,030 Cela a pour effet d'éteindre ce bit. 428 00:27:30,030 --> 00:27:31,980 Ainsi, un peu cryptique là. 429 00:27:31,980 --> 00:27:35,390 Nous allons effectivement regarder un peu de code, ce qui peut effectivement paraître encore plus énigmatique, 430 00:27:35,390 --> 00:27:38,220 mais nous allons jeter un coup d'oeil ici à tolower. 431 00:27:38,220 --> 00:27:45,880 Si je regarde tolower, passant de majuscule en minuscule a, 432 00:27:45,880 --> 00:27:47,730 nous allons voir comment nous pourrions mettre en œuvre ce programme. 433 00:27:47,730 --> 00:27:51,280 Voici principale, et ce n'est pas en prenant des arguments de ligne de commande. 434 00:27:51,280 --> 00:27:55,980 Je déclare un caractère c pour la lettre que l'utilisateur va taper po 435 00:27:55,980 --> 00:28:00,690 J'utilise ensuite un do while pour connaître assurez-vous que l'utilisateur donne certainement moi un grand A 436 00:28:00,690 --> 00:28:05,010 ou B ou C. .. Z, alors ils me donner quelque chose entre A et Z. 437 00:28:05,010 --> 00:28:08,580 Et maintenant ce que je fais ici? 438 00:28:08,580 --> 00:28:14,870 Je suis "ou" ing cela avec 0x20, mais c'est en fait le même que celui - 439 00:28:14,870 --> 00:28:19,500 et nous y reviendrons dans un instant - 32. 440 00:28:19,500 --> 00:28:24,830 Encore une fois, ce modèle 32 est ici de bits. Pourquoi ne savons-nous? 441 00:28:24,830 --> 00:28:26,320 Il suffit de penser à la semaine 0. 442 00:28:26,320 --> 00:28:31,010 C'est l'endroit 1s, 2s lieu, 4s, 8s, 16s, 32s lieu. 443 00:28:31,010 --> 00:28:33,470 Donc, ce nombre jaune se trouve être 32. 444 00:28:33,470 --> 00:28:40,570 Je peux alors prendre une lettre comme le char ici, bit à bit "ou" c'est littéralement avec le numéro 32, 445 00:28:40,570 --> 00:28:45,250 et que dois-je le récupérer? La version minuscule de ce char. 446 00:28:45,250 --> 00:28:48,830 Il ya un moment, cependant, je l'exprime dans une note de base différente. 447 00:28:48,830 --> 00:28:51,370 Qu'est-ce que cela représente? >> [L'élève] Hexadécimal. 448 00:28:51,370 --> 00:28:53,050 [Malan] Ce qui se passe à représenter hexadécimal. 449 00:28:53,050 --> 00:28:55,170 Nous n'avons pas parlé hexadécimal tant que ça, 450 00:28:55,170 --> 00:28:57,330 mais c'est en fait pratique dans des cas comme celui-ci. 451 00:28:57,330 --> 00:29:01,730 >> Même s'il semble plus complexe et même si elle ressemble à 20 et non 32, 452 00:29:01,730 --> 00:29:06,240 il s'avère que hexadécimale est réellement superbe notation pratique 453 00:29:06,240 --> 00:29:10,810 car en hexadécimal tous les chiffres après la 0x - et cela ne signifie rien; 454 00:29:10,810 --> 00:29:13,960 ce n'est que convention humaine qui dit voici un nombre hexadécimal - 455 00:29:13,960 --> 00:29:18,590 chacun de ces chiffres, le 2, puis le 0, eux-mêmes peuvent être représentés 456 00:29:18,590 --> 00:29:20,800 avec exactement 4 bits. 457 00:29:20,800 --> 00:29:27,840 Donc, si nous faisons cela, permettez-moi d'ouvrir un éditeur de texte ici - bizarre saisie semi-automatique - 458 00:29:27,840 --> 00:29:35,940 si nous faisons un petit éditeur de texte ici, le nombre 0x20 signifie ici est de 4 bits, voici encore 4 bits. 459 00:29:35,940 --> 00:29:38,050 Faisons les 4 premiers bits les plus à droite. 460 00:29:38,050 --> 00:29:44,690 0 lorsque représenté avec 4 bits, c'est quoi? Super facile. Juste tous les 0. 461 00:29:44,690 --> 00:29:46,780 Alors que les 4 bits 0. 462 00:29:46,780 --> 00:29:53,510 Comment représentez-vous 2? Il a été un moment depuis que nous avons fait cela, mais c'est 0100. 463 00:29:53,510 --> 00:29:57,310 Donc, c'est l'endroit 1s, c'est l'endroit 2s, puis ce n'est pas grave ce que les autres endroits sont. 464 00:29:57,310 --> 00:30:00,610 En d'autres termes, en hexadécimal 0x20 pourrait-on dire, 465 00:30:00,610 --> 00:30:04,340 mais si vous pensez alors à ce qui est le 2 et comment est-il représenté en binaire, 466 00:30:04,340 --> 00:30:07,130 quel est le 0 et comment est-il représenté en binaire, 467 00:30:07,130 --> 00:30:10,440 les réponses à ces questions sont ceci et cela, respectivement. 468 00:30:10,440 --> 00:30:14,380 Alors 0x20 arrive à représenter ce modèle de 8 bits, 469 00:30:14,380 --> 00:30:16,880 ce qui est précisément le masque que nous voulions. 470 00:30:16,880 --> 00:30:20,140 Il s'agit donc pour le moment seulement un exercice intellectuel, 471 00:30:20,140 --> 00:30:24,520 mais la réalité est dans le code il est généralement plus fréquente pour écrire des constantes comme celui-ci 472 00:30:24,520 --> 00:30:28,360 en hexadécimal, car alors le programmeur peut relativement facilement, 473 00:30:28,360 --> 00:30:32,560 même si cela nécessite un peu de papier et un crayon, comprendre ce que ce modèle de bits est 474 00:30:32,560 --> 00:30:35,960 parce que vous ne pouvez pas exprimer 0s et 1s généralement dans le code. 475 00:30:35,960 --> 00:30:38,540 Vous ne pouvez pas aller 00010 et ainsi de suite. 476 00:30:38,540 --> 00:30:42,380 >> Vous devez choisir notations décimales ou hexadécimale ou octale ou autre. 477 00:30:42,380 --> 00:30:47,540 La plupart des gens ont tendance à choisir hexadécimal simplement pour que chaque chiffre représente 4 bits 478 00:30:47,540 --> 00:30:49,320 et vous pouvez faire ce calcul rapide. 479 00:30:49,320 --> 00:30:54,990 Et je vais agiter ma main à toupper, ce qui est presque la même, elle est presque identique. 480 00:30:54,990 --> 00:31:01,900 Toupper arrive de ne pas utiliser l'opérateur ou plutôt cet homme et df. 481 00:31:01,900 --> 00:31:09,300 Qu'est-ce que df représentent-ils? df? N'importe qui? >> [L'élève] 255. 482 00:31:09,300 --> 00:31:12,780 255? Non 255. Ce serait ff. 483 00:31:12,780 --> 00:31:15,210 Nous allons laisser celui-ci comme un peu d'exercice. 484 00:31:15,210 --> 00:31:23,460 Mais si vous passez de 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 et ce qui vient après 9? 485 00:31:23,460 --> 00:31:26,510 Nous sommes en quelque sorte en dehors de chiffres après la virgule, mais en hexadécimal ce qui vient après 9? 486 00:31:26,510 --> 00:31:29,510 [L'élève] a. Alors >> a, b, c, d. 487 00:31:29,510 --> 00:31:33,470 Vous pouvez imaginer à partir de là ce modèle de bits d représente réellement. 488 00:31:33,470 --> 00:31:38,850 Et si on fait le calcul, nous allons voir que le masque que vous finissez par être de retour est identique à cela. 489 00:31:38,850 --> 00:31:45,580 C'est f, tous les 1, et c'est d. Donc df représente ce masque. Très bien. 490 00:31:45,580 --> 00:31:50,980 Et enfin, ne pas faire de bruit choses super, super technique, 491 00:31:50,980 --> 00:31:53,840 mais supposons que nous voulions écrire un programme qui fait ça. 492 00:31:53,840 --> 00:31:58,960 Permettez-moi aller de l'avant et de faire binaire, qui est un programme dans un fichier appelé binary.c. 493 00:31:58,960 --> 00:32:02,050 Et maintenant, laissez-moi courir binaire et me donner un entier non négatif. 494 00:32:02,050 --> 00:32:03,960 Commençons facile et tapez 0. 495 00:32:03,960 --> 00:32:09,010 C'est maintenant un programme qui affiche un nombre entier dans sa représentation binaire. 496 00:32:09,010 --> 00:32:13,470 Donc, si je joue ce jeu à nouveau et tapez en 1, je devrais obtenir une représentation 32-bit sur 1. 497 00:32:13,470 --> 00:32:15,490 Si je fais ça encore une fois avec 2, je devrais obtenir cela. 498 00:32:15,490 --> 00:32:19,310 Si je fais 7, je devrais obtenir un peu de 1s à la fin et ainsi de suite. 499 00:32:19,310 --> 00:32:22,740 Il s'avère que je mentionne cela parce que des opérations binaires 500 00:32:22,740 --> 00:32:25,490 vous pouvez réellement faire autre chose aussi. 501 00:32:25,490 --> 00:32:29,130 Vous pouvez créer ces masques dynamiquement. 502 00:32:29,130 --> 00:32:32,800 Jetez un oeil à cet exemple une finale impliquant des opérations binaires. 503 00:32:32,800 --> 00:32:35,490 Voici la première partie du code, demander à l'utilisateur un certain nombre, 504 00:32:35,490 --> 00:32:38,130 et il insiste sur le fait que vous me donnez un entier non négatif. 505 00:32:38,130 --> 00:32:39,780 Donc, c'est une sorte de trucs old school. 506 00:32:39,780 --> 00:32:41,980 Mais voici quelque chose qui est assez intéressant. 507 00:32:41,980 --> 00:32:44,910 >> Comment puis-je faire pour imprimer un nombre en binaire? 508 00:32:44,910 --> 00:32:48,970 J'ai d'abord effectuer une itération de quoi à quoi? 509 00:32:48,970 --> 00:32:52,270 Quelle est la taille d'un int en général, au moins dans l'appareil? >> [L'élève] 4. 510 00:32:52,270 --> 00:32:57,130 Il est 4. Donc 4 * 8 est de 32 - 1 est 31. 511 00:32:57,130 --> 00:33:02,590 Donc, si je commence à compter à partir de 31, qui représente, il s'avère, 512 00:33:02,590 --> 00:33:07,630 seulement conceptuellement, le bit 31ème ou le bit de premier ordre, qui est ce gars là-bas, 513 00:33:07,630 --> 00:33:09,650 considérant que cela va être le bit 0. 514 00:33:09,650 --> 00:33:12,850 C'est donc le bit 01 ... bit 31. 515 00:33:12,850 --> 00:33:14,950 Donc ce qui est de ce code fait? 516 00:33:14,950 --> 00:33:20,140 Notez que cette boucle for, même s'il semble énigmatique, est tout simplement une itération de 31 à 0. C'est tout. 517 00:33:20,140 --> 00:33:24,530 Donc, maintenant la partie intéressante doit être dans ces 5 lignes ici. 518 00:33:24,530 --> 00:33:28,110 Notez que dans cette ligne, je suis déclarant un masque variable appelée 519 00:33:28,110 --> 00:33:30,790 d'être cohérent avec notre histoire de ces chiffres jaunes. 520 00:33:30,790 --> 00:33:32,200 Et puis, ce qui est ce que ça fait? 521 00:33:32,200 --> 00:33:35,720 C'est un autre opérateur de bits que nous avons jamais vu auparavant, le plus probable. 522 00:33:35,720 --> 00:33:38,300 C'est l'opérateur de décalage à gauche. 523 00:33:38,300 --> 00:33:40,060 Cet opérateur fait cela. 524 00:33:40,060 --> 00:33:44,920 Voici le numéro 1, et si vous le faites, j'ai laissé déplacement, décalage vers la gauche, 525 00:33:44,920 --> 00:33:49,260 que pensez-vous qui a pour effet de faire pour que 1 individu? 526 00:33:49,260 --> 00:33:51,290 Littéralement, il évolué au cours de. 527 00:33:51,290 --> 00:33:57,540 Donc, si le nombre 1 est ce que vous avez sur la gauche et vous commencez par initialiser i à 31, 528 00:33:57,540 --> 00:34:03,490 ce qui est ce que cela va faire? Il va prendre ce numéro 1 et décaler il 31 places ici. 529 00:34:03,490 --> 00:34:06,210 Et parce qu'il n'y a évidemment pas d'autres chiffres derrière elle, 530 00:34:06,210 --> 00:34:10,350 ceux qui, par défaut, être remplacés par des 0. 531 00:34:10,350 --> 00:34:15,120 Ainsi, vous aurez commencer par le numéro 1, ce qui bien sûr ressemble à ceci - 532 00:34:15,120 --> 00:34:18,659 et permettez-moi de le dessiner ici dans le centre. 533 00:34:18,659 --> 00:34:22,139 Et puis vous passez les choses vers la gauche, ce gars va essentiellement de cette façon. 534 00:34:22,139 --> 00:34:24,659 Mais dès que vous le faites, un 0 est rempli po 535 00:34:24,659 --> 00:34:28,360 Si vous passez une seconde fois, il va de cette façon et un autre 0 est rempli po 536 00:34:28,360 --> 00:34:31,000 >> Vous le déplacer à nouveau, puis un autre 0 est rempli po 537 00:34:31,000 --> 00:34:37,900 Donc, si vous faites cette chose de 1 << i 31 places, vous finissez par avoir un masque 538 00:34:37,900 --> 00:34:42,550 qui est de 32 caractères de long, le plus à gauche de une, qui est un 1, 539 00:34:42,550 --> 00:34:45,199 tous les autres qui sont 0. 540 00:34:45,199 --> 00:34:50,880 Et il se trouve, soit dit en passant, le déplacement d'un nombre à gauche comme ceci 541 00:34:50,880 --> 00:34:53,530 également par hasard, et parfois commode, 542 00:34:53,530 --> 00:34:57,520 a pour effet de faire quoi ce numéro? >> [L'élève] il Doublement. 543 00:34:57,520 --> 00:35:00,980 Le doubler, car chacune des colonnes - le lieu 1s, 2s lieu, le lieu 4s, 544 00:35:00,980 --> 00:35:05,030 Lieu 8s, 16s endroit - ils sont tous doublement que vous allez à gauche. 545 00:35:05,030 --> 00:35:09,500 Ou plutôt, quand vous déplacez le 1s vous allez finir par doubler la valeur du nombre. 546 00:35:09,500 --> 00:35:12,070 Vous pouvez finir par faire des transformations intéressantes des chiffres 547 00:35:12,070 --> 00:35:15,640 en déplaçant tout au cours de cette façon par des puissances de 2. 548 00:35:15,640 --> 00:35:17,150 Alors, comment ça marche? 549 00:35:17,150 --> 00:35:22,580 On obtient alors un masque moi c'est tous des 0 sauf pour un 1 dans précisément l'endroit où je le veux, 550 00:35:22,580 --> 00:35:27,920 et puis cette expression, qui est volé toupper.c, 551 00:35:27,920 --> 00:35:31,770 dit simplement prendre le nombre n que l'utilisateur a tapé dans, 552 00:35:31,770 --> 00:35:34,730 "Et" avec ce masque, et qu'allez-vous obtenir? 553 00:35:34,730 --> 00:35:39,200 Vous allez obtenir un 1 s'il ya un 1 dans cet endroit masqué, 554 00:35:39,200 --> 00:35:41,570 ou vous allez obtenir un 0 s'il n'y est pas. 555 00:35:41,570 --> 00:35:44,370 Et si tout ce programme ne soit effectivement il a une boucle, 556 00:35:44,370 --> 00:35:48,340 et il crée un masque avec un 1 ici, puis un 1 ici, puis un 1 ici, 557 00:35:48,340 --> 00:35:52,950 et il utilise cette astuce ET bit à bit-à-dire est-il un bit 1 dans l'entrée utilisateur ici? 558 00:35:52,950 --> 00:35:59,220 >> Y at-il un bit 1 dans l'entrée utilisateur ici? Et si oui, littéralement imprimer 1, else print 0. 559 00:35:59,220 --> 00:36:03,780 Nous faisons cela avec ints juste parce que c'est pour cela que nous faisons 32 bits au lieu de 8, 560 00:36:03,780 --> 00:36:06,900 mais ce que nous avons mis en place est donc cette opération AND binaire, ce bit à bit OU, 561 00:36:06,900 --> 00:36:10,450 et cet opérateur de décalage à gauche, qui ne sont pas souvent terriblement utile, 562 00:36:10,450 --> 00:36:12,230 mais il s'avère qu'ils peuvent être. 563 00:36:12,230 --> 00:36:16,560 En fait, si vous étiez à représenter quelque chose comme un tableau de booléens 564 00:36:16,560 --> 00:36:21,260 juste pour représenter vrai ou faux, supposons que vous vouliez garder la trace de si oui ou non 565 00:36:21,260 --> 00:36:24,630 une salle pleine de 300 élèves est présente, 566 00:36:24,630 --> 00:36:29,420 vous pouvez déclarer un tableau de taille 300 de type bool sorte que vous obtenez 300 bools, 567 00:36:29,420 --> 00:36:33,090 et vous pouvez régler chaque valeur true si quelqu'un est là et false sinon. 568 00:36:33,090 --> 00:36:37,550 Pourquoi est-ce que la représentation de cette structure de données efficace? 569 00:36:39,370 --> 00:36:44,800 Ce qui est mauvais à propos de la conception de cette structure de données, un tableau de 300 bools? 570 00:36:46,190 --> 00:36:49,600 Qu'est-ce qu'un bool, en effet, sous le capot? 571 00:36:49,600 --> 00:36:52,310 Cela aussi, c'est quelque chose qui pourrait ne pas être familier. 572 00:36:52,310 --> 00:36:53,720 Il s'avère qu'il ya pas de bool. 573 00:36:53,720 --> 00:36:56,620 N'oubliez pas que nous sorte de création que le fichier cs50.h, 574 00:36:56,620 --> 00:36:58,630 qui se comporte en standard un bool. 575 00:36:58,630 --> 00:37:00,930 C est un peu idiot, mais, quand il s'agit de bool. 576 00:37:00,930 --> 00:37:04,880 Il utilise 8 bits pour représenter chaque bool, ce qui est tout à fait inutile 577 00:37:04,880 --> 00:37:09,040 car il est évident, combien de bits devez-vous représenter un bool? Juste 1. 578 00:37:09,040 --> 00:37:13,190 Ainsi, il s'avère que si vous avez maintenant la possibilité avec les opérateurs bit à bit 579 00:37:13,190 --> 00:37:17,760 pour manipuler les bits individuels, même dans un char, même dans un seul octet, 580 00:37:17,760 --> 00:37:21,380 il s'avère que vous pourrait diminuer la mémoire nécessaire pour représenter quelque chose de stupide 581 00:37:21,380 --> 00:37:25,490 comme cette structure de données présents style d'un facteur 8. 582 00:37:25,490 --> 00:37:29,820 Au lieu d'utiliser huit bits pour représenter vrai ou faux, vous pouvez littéralement utiliser un 583 00:37:29,820 --> 00:37:34,500 en utilisant un seul octet pour huit élèves dans la classe 584 00:37:34,500 --> 00:37:41,990 et de basculer de 0 à 1 des bits individuels en utilisant ce genre de trucs de bas niveau. 585 00:37:43,850 --> 00:37:49,460 C'est vraiment mettre un terme à l'énergie. Y at-il des questions au sujet des opérations binaires? 586 00:37:49,460 --> 00:37:52,710 >> Ouais. >> [L'élève] Y at-il un opérateur ou exclusif? 587 00:37:52,710 --> 00:37:56,440 Oui. Il est un opérateur exclusif ou qui ressemble à ceci, ^, le symbole carotte, 588 00:37:56,440 --> 00:38:02,070 ce qui signifie que la première chose ou le deuxième élément peut être un 1 pour la production d'un 1. 589 00:38:02,070 --> 00:38:07,750 Il ya aussi un pas, ~, ce qui vous permettra d'inverser une 0 à 1 ou vice versa ainsi. 590 00:38:07,750 --> 00:38:11,600 Et il ya aussi un opérateur de décalage vers la droite, >>, qui est à l'opposé de celui que nous avons vu. 591 00:38:11,600 --> 00:38:13,850 Très bien. Prenons les choses maintenant à un niveau supérieur. 592 00:38:13,850 --> 00:38:16,770 Nous avons commencé par parler du texte, puis en le comprimant 593 00:38:16,770 --> 00:38:19,650 et qui représente le texte avec un nombre réduit de bits; 594 00:38:19,650 --> 00:38:22,890 nous avons un peu parlé de la façon dont nous pouvons maintenant commencer à manipuler les choses à un niveau binaire. 595 00:38:22,890 --> 00:38:26,640 Nous allons maintenant faire un zoom avant jusqu'à 10.000 pieds à la représentation 596 00:38:26,640 --> 00:38:29,250 des choses plus complexes comme les graphiques. 597 00:38:29,250 --> 00:38:32,950 Ici, nous avons un drapeau de l'Allemagne, nous avons ici celui de la France. 598 00:38:32,950 --> 00:38:36,350 Celles-ci peuvent être représentés dans des formats de fichiers que vous connaissez peut-être - GIF, par exemple. 599 00:38:36,350 --> 00:38:40,030 Si vous avez déjà vu une image sur le Web se terminant par. Gif, 600 00:38:40,030 --> 00:38:43,000 il s'agit d'un format d'échange de graphiques. 601 00:38:43,000 --> 00:38:47,530 Ces deux drapeaux sorte d'ici se prêtent à la compression 602 00:38:47,530 --> 00:38:52,050 pour ce que peut-être évident pourquoi? >> [Réponse de l'élève inaudible] 603 00:38:52,050 --> 00:38:53,440 Il ya beaucoup de répétitions, non? 604 00:38:53,440 --> 00:38:57,270 Pour envoyer drapeau de l'Allemagne, penser à cela comme étant une image sur l'écran 605 00:38:57,270 --> 00:38:59,030 sauvegarder dans vos journées à gratter. 606 00:38:59,030 --> 00:39:02,380 Vous vous rappelez peut qu'il y ait des pixels individuels ou des points qui composent une image. 607 00:39:02,380 --> 00:39:06,650 >> Il ya toute une rangée de points noirs et une autre rangée de points noirs. 608 00:39:06,650 --> 00:39:10,110 Il ya un tas de rangées de points noirs que nous puissions voir si nous avons vraiment un zoom avant, 609 00:39:10,110 --> 00:39:13,370 un peu comme quand on zoom sur le visage de Rob dans Photoshop. 610 00:39:13,370 --> 00:39:15,500 Dès que nous sommes arrivés plus en plus profond et plus profond dans l'image, 611 00:39:15,500 --> 00:39:19,990 vous commencé à voir la pixellisation, tous les carrés qui composent son oeil dans ce cas. 612 00:39:19,990 --> 00:39:24,130 Même affaire ici. Si l'on zoom un peu, vous verrez les points individuels. 613 00:39:24,130 --> 00:39:27,110 Eh bien, c'est un peu un gaspillage de bits. 614 00:39:27,110 --> 00:39:32,120 Si un tiers de l'indicateur est de couleur noire et un tiers de l'indicateur est jaune et ainsi de suite, 615 00:39:32,120 --> 00:39:34,860 pourquoi ne pouvons-nous pas en quelque sorte comprimer ce drapeau? 616 00:39:34,860 --> 00:39:39,560 Et même le drapeau français pourrait être compressé, même si le motif est un peu différent. 617 00:39:39,560 --> 00:39:44,120 Il s'avère que le format de fichier GIF est un format de compression sans perte, 618 00:39:44,120 --> 00:39:48,420 ce qui signifie que vous pouvez prendre une photo comme le drapeau allemand ici, 619 00:39:48,420 --> 00:39:53,540 vous pouvez jeter un grand nombre de ses bits sans sacrifier la qualité. 620 00:39:53,540 --> 00:39:55,340 Ceci est en contraste avec quelque chose comme JPEG, 621 00:39:55,340 --> 00:39:57,050 avec laquelle la plupart d'entre nous sont probablement plus familiers. 622 00:39:57,050 --> 00:39:59,000 Facebook des photos et des photos Flickr et autres 623 00:39:59,000 --> 00:40:02,200 sont presque toujours enregistrés en tant que fichiers JPEG quand ils sont téléchargés, 624 00:40:02,200 --> 00:40:08,100 mais JPEG est une perte - format dans lequel vous ne jetez bits - LOSSY 625 00:40:08,100 --> 00:40:10,430 mais vous pouvez également jeter qualité. 626 00:40:10,430 --> 00:40:13,890 Et si vous compressez des photos avec Photoshop ou les télécharger sur Facebook 627 00:40:13,890 --> 00:40:15,580 ou les prendre sur un téléphone vraiment la merde, 628 00:40:15,580 --> 00:40:19,510 vous savez que l'image commence à devenir très tachée et pixélisée, 629 00:40:19,510 --> 00:40:22,290 et c'est parce qu'elle est comprimée par l'ordinateur ou par téléphone 630 00:40:22,290 --> 00:40:24,550 par littéralement jeter information loin. 631 00:40:24,550 --> 00:40:28,500 Mais GIF est étonnant en ce sens qu'il peut utiliser moins de bits que cela pourrait par défaut 632 00:40:28,500 --> 00:40:30,750 sans perte d'information. 633 00:40:30,750 --> 00:40:32,410 >> Et il le fait essentiellement de manière suivante. 634 00:40:32,410 --> 00:40:38,740 Plutôt que de stocker dans un fichier comme un BMP serait un triplet RVB en noir, noir, noir, noir, 635 00:40:38,740 --> 00:40:42,570 noir, noir, noir, noir, noir, noir, noir, noir et ainsi de suite, 636 00:40:42,570 --> 00:40:45,640 plutôt, le format GIF va dire, "Noir", 637 00:40:45,640 --> 00:40:48,330 puis, «Répétez cette opération 100 fois», ou quelque chose comme ça. 638 00:40:48,330 --> 00:40:52,280 "Noir, répéter cette opération à 100 reprises, noir, répéter cette opération 100 fois ..." 639 00:40:52,280 --> 00:40:54,530 "Jaune, répéter cette opération 100 fois." 640 00:40:54,530 --> 00:40:57,200 Et il se souvient, pour l'essentiel, le pixel le plus à gauche 641 00:40:57,200 --> 00:41:02,160 et puis encode en quelque sorte la notion de répéter ce pixel, encore et encore. 642 00:41:02,160 --> 00:41:06,110 Ainsi, les fichiers GIF peuvent alors se compresser sans perte d'information. 643 00:41:06,110 --> 00:41:09,510 Mais si vous aviez à deviner, si ce n'est l'algorithme qui Gifs utilisation, 644 00:41:09,510 --> 00:41:13,180 laquelle de ces drapeaux, même si elles semblent identiques en taille, 645 00:41:13,180 --> 00:41:19,620 va être plus faible lors de l'enregistrement sur le disque au format GIF? >> [L'élève] en Allemagne. 646 00:41:19,620 --> 00:41:21,660 L'Allemagne va être plus petit? Pourquoi? 647 00:41:21,660 --> 00:41:26,620 [L'élève] Parce que vous le répéter de nombreuses fois horizontalement 648 00:41:26,620 --> 00:41:29,010 et puis vous répéter une autre fois. >> Exactement. 649 00:41:29,010 --> 00:41:32,020 Parce que les gens qui ont inventé GIF juste un peu arbitrairement décidé de 650 00:41:32,020 --> 00:41:36,040 que la répétition sera mise à profit horizontalement et non latéralement. 651 00:41:36,040 --> 00:41:40,900 Il ya répétition beaucoup plus latéralement ici dans le drapeau allemand que dans le drapeau français. 652 00:41:40,900 --> 00:41:44,430 Donc, si nous avons effectivement ouvrir un dossier sur mon disque dur qui possède ces images GIF, 653 00:41:44,430 --> 00:41:51,920 vous pouvez réellement voir que le drapeau allemand ici est de 2 kilo-octets et la française est de 4 kilo-octets. 654 00:41:51,920 --> 00:41:54,080 Il arrive à être une coïncidence que l'on est double de l'autre, 655 00:41:54,080 --> 00:41:57,960 mais c'est en fait le cas que le drapeau français est beaucoup plus grande. 656 00:41:57,960 --> 00:42:01,250 >> Même si nous parlons ici de graphiques, les mêmes idées peuvent s'appliquer à 657 00:42:01,250 --> 00:42:05,150 pas des choses comme des drapeaux mais des images qui sont un peu plus complexes. 658 00:42:05,150 --> 00:42:08,170 Si vous prenez une photo d'une pomme, il ya sûrement beaucoup de doubles emplois là-bas, 659 00:42:08,170 --> 00:42:11,040 si nous pouvions oublier que l'arrière-plan par défaut est bleu 660 00:42:11,040 --> 00:42:13,230 et non, comme l'image de droite indique, 661 00:42:13,230 --> 00:42:16,830 faut se rappeler la couleur de chaque pixel dans l'image. 662 00:42:16,830 --> 00:42:21,060 Ainsi, nous pouvons jeter les bits de suite là-bas sans perte d'information. 663 00:42:21,060 --> 00:42:23,340 La pomme a toujours l'air tout de même. 664 00:42:23,340 --> 00:42:27,510 Dans cet exemple ici, vous pouvez voir ce qui se passe dans un film. 665 00:42:27,510 --> 00:42:31,970 Celles-ci représentent bobines de film old-school où dans l'image du haut il 666 00:42:31,970 --> 00:42:36,900 vous avez une conduite RV devant une maison et un arbre. 667 00:42:36,900 --> 00:42:42,130 Et comme cette camionnette passe devant, de gauche à droite, ce qui évidemment ne change pas? 668 00:42:42,130 --> 00:42:45,320 La maison ne va nulle part, et l'arbre ne va nulle part. 669 00:42:45,320 --> 00:42:47,700 La seule chose qui bouge est le van dans ce cas. 670 00:42:47,700 --> 00:42:51,650 Donc comme fond d'Inchangé indique, ce que vous pouvez faire dans les films 671 00:42:51,650 --> 00:42:56,530 est même simplement jeter informations qui ne change pas entre les couples. 672 00:42:56,530 --> 00:42:58,900 Ceci est généralement connu sous le nom compression inter- 673 00:42:58,900 --> 00:43:02,120 de sorte que si ce cadre est presque identique à celui-ci, 674 00:43:02,120 --> 00:43:05,390 il ne faut pas déranger le stockage sur disque l'une des informations identiques 675 00:43:05,390 --> 00:43:09,250 sur ces cadres intermédiaires, nous allons uniquement utiliser des images clés de temps en temps 676 00:43:09,250 --> 00:43:13,420 qui en fait stocker ces informations de manière redondante comme un peu de raison vérifier. 677 00:43:13,420 --> 00:43:18,620 >> En revanche, une autre approche à la vidéo de compression est dans ce deuxième exemple, plus bas ici, 678 00:43:18,620 --> 00:43:23,970 où plutôt que de stocker 30 images, pourquoi ne pas simplement stocker 15 images par seconde au lieu? 679 00:43:23,970 --> 00:43:27,070 Plutôt que le genre film de couler à merveille, parfaitement, 680 00:43:27,070 --> 00:43:30,060 il pourrait ressembler à ça un peu le bégaiement, une petite vieille école, 681 00:43:30,060 --> 00:43:37,190 mais l'effet net sera d'utiliser des bits beaucoup moins qu'on ne pourrait autrement nécessaires. 682 00:43:37,190 --> 00:43:39,240 Alors, où puis-ce que cela nous mène? 683 00:43:39,240 --> 00:43:41,700 C'était un peu un côté de l'endroit où vous pouvez aller ailleurs avec la compression. 684 00:43:41,700 --> 00:43:45,140 Pour en savoir plus à ce sujet, prendre une classe comme CS175 ici. 685 00:43:45,140 --> 00:43:46,990 Voici un autre exemple dans la vidéo. 686 00:43:46,990 --> 00:43:49,190 Si l'abeille est la seule chose en mouvement, 687 00:43:49,190 --> 00:43:51,790 vous pouvez vraiment jeter informations contenues dans ces cadres du milieu 688 00:43:51,790 --> 00:43:55,260 parce que la fleur et le ciel et les feuilles ne changent pas. 689 00:43:55,260 --> 00:43:57,960 Mais nous allons maintenant examiner une dernière chose. 690 00:43:57,960 --> 00:44:03,890 Dans les 5 prochaines minutes nous laissons derrière eux pour toujours dans C conférence? Oui. Pas dans les psets, cependant. 691 00:44:03,890 --> 00:44:10,210 Dernière histoire à propos de C, puis on arrive à des choses très sexy 692 00:44:10,210 --> 00:44:13,870 impliquant HTML et Web et woo-hoo. Très bien. 693 00:44:13,870 --> 00:44:16,050 Nous y voilà. C'est la motivation. 694 00:44:16,050 --> 00:44:20,020 Il s'avère tout ce temps où nous avons été l'écriture de programmes que nous gérons Clang. 695 00:44:20,020 --> 00:44:23,890 Et Clang, nous l'avons dit depuis la première semaine à peu près, prend le code source 696 00:44:23,890 --> 00:44:25,740 et le convertit en un code objet. 697 00:44:25,740 --> 00:44:28,540 Il faut C et le convertit en 0 et de 1. 698 00:44:28,540 --> 00:44:32,150 J'ai été genre de mentir à vous pour quelques semaines car il n'est pas aussi simple que cela. 699 00:44:32,150 --> 00:44:36,750 >> Il ya beaucoup plus de choses sous le capot lorsque vous exécutez un programme comme Clang. 700 00:44:36,750 --> 00:44:39,560 En fait, le processus de compilation d'un programme peut vraiment se résumer, 701 00:44:39,560 --> 00:44:42,210 comme vous vous en souvenez de la vidéo de Rob sur des compilateurs, 702 00:44:42,210 --> 00:44:47,580 dans ces 4 étapes: pré-traitement, elle-même la compilation, l'assemblage et la liaison. 703 00:44:47,580 --> 00:44:51,950 Mais nous en classe et la plupart des gens dans le monde typiquement résumer l'ensemble de ces étapes 704 00:44:51,950 --> 00:44:54,410 simplement «compilation». 705 00:44:54,410 --> 00:44:58,070 Mais si nous commençons avec le code source de ce genre, c'est peut-être rappeler le programme le plus simple C 706 00:44:58,070 --> 00:45:03,530 nous avons écrit jusqu'ici, rappelons que lors de la compilation il finit par ressembler à cela. 707 00:45:03,530 --> 00:45:07,310 Mais il ya en fait une étape intermédiaire, et ces étapes sont les suivantes. 708 00:45:07,310 --> 00:45:10,750 D'abord il ya cette chose au sommet de cela et la plupart de nos programmes, 709 00:45:10,750 --> 00:45:13,550 # Include 710 00:45:13,550 --> 00:45:17,210 Qu'est-ce que # include faire pour nous? 711 00:45:17,210 --> 00:45:24,150 Il exemplaires assez bien et colle le contenu du stdio.h dans mon fichier de sorte que pourquoi? 712 00:45:24,150 --> 00:45:27,220 Pourquoi dois-je entretenir sur le contenu de stdio.h? Qu'y at-il de l'intérêt? 713 00:45:27,220 --> 00:45:32,310 Printf de déclaration, son prototype, de sorte que le compilateur sait alors ce que je veux dire 714 00:45:32,310 --> 00:45:34,900 quand je mentionne cette fonction printf. 715 00:45:34,900 --> 00:45:39,390 Ainsi, l'étape 1 de la compilation est pré-traitement, de sorte qu'un programme comme Clang 716 00:45:39,390 --> 00:45:43,450 ou un programme d'aide qui Clang est livré avec lit votre code de haut en bas, 717 00:45:43,450 --> 00:45:47,740 de gauche à droite, et à chaque fois qu'il voit un symbole # suivi d'un mot-clé comme include, 718 00:45:47,740 --> 00:45:53,980 il effectue cette opération, copier et coller dans ce cas stdio.h dans votre fichier. 719 00:45:53,980 --> 00:45:55,510 C'est l'étape 1. 720 00:45:55,510 --> 00:45:59,620 Ensuite, vous avez un fichier beaucoup plus gros C en raison de la copie énorme d'emplois coller ce qui vient d'arriver. 721 00:45:59,620 --> 00:46:01,710 >> Etape 2 est en train de compiler. 722 00:46:01,710 --> 00:46:04,880 Mais il s'avère que la compilation prend le code source qui ressemble à ceci 723 00:46:04,880 --> 00:46:08,160 et le transforme en quelque chose qui ressemble à ceci, 724 00:46:08,160 --> 00:46:12,560 qui, pour ceux qui connaissent s'appelle? >> [L'élève] Assemblée. Langage d'assemblage. >> 725 00:46:12,560 --> 00:46:16,700 C'est vraiment quelque chose si vous prenez CS61 vous plonger dans plus en détail. 726 00:46:16,700 --> 00:46:22,380 C'est à peu près aussi proche que vous pouvez obtenir à l'écriture de 0 et de 1-même 727 00:46:22,380 --> 00:46:25,850 mais écrire les choses de telle manière qui rend encore au moins un peu de bon sens. 728 00:46:25,850 --> 00:46:30,760 Ce sont des instructions de la machine, et si nous faites défiler jusqu'à la fonction principale ici, 729 00:46:30,760 --> 00:46:35,470 remarquerez qu'il ya cette instruction poussée, déplacez l'instruction, il faut soustraire l'instruction, 730 00:46:35,470 --> 00:46:38,550 appeler l'instruction, et ainsi de suite. 731 00:46:38,550 --> 00:46:42,930 Lorsque vous entendez que votre ordinateur dispose d'Intel à l'intérieur, 732 00:46:42,930 --> 00:46:46,180 vous avez un processeur Intel à votre Mac ou PC, ça veut dire quoi? 733 00:46:46,180 --> 00:46:51,200 Un processeur est intégré par des sociétés comme Intel comprendre certaines instructions. 734 00:46:51,200 --> 00:46:55,770 Ils n'ont aucune idée de ce qui fonctionne comme swap sont ou principale sont en soi, 735 00:46:55,770 --> 00:47:00,060 mais ils ne savent ce très faible niveau des instructions comme additionner, soustraire, pousser, 736 00:47:00,060 --> 00:47:02,430 déplacer, appeler, et ainsi de suite sont. 737 00:47:02,430 --> 00:47:06,170 Ainsi, lorsque vous compilez le code C en langage d'assemblage, 738 00:47:06,170 --> 00:47:11,820 votre très convivial prospectifs code est converti en quelque chose qui ressemble à ceci, 739 00:47:11,820 --> 00:47:21,670 qui se déplace littéralement octets ou 4 octets autour de ces petites unités et en dehors de la CPU. 740 00:47:21,670 --> 00:47:26,820 Mais enfin, quand Clang est prêt à prendre cette représentation de votre programme 741 00:47:26,820 --> 00:47:30,940 en 0 et de 1, puis l'étape de montage se produit appelé, 742 00:47:30,940 --> 00:47:33,850 et cette fois tout se passe en un clin d'œil lors de l'exécution Clang. 743 00:47:33,850 --> 00:47:39,300 Nous commençons ici, il génère un fichier comme celui-ci, puis il le convertit ces 0 et de 1. 744 00:47:39,300 --> 00:47:42,000 Et si vous voulez revenir à un moment donné et de voir cela en action, 745 00:47:42,000 --> 00:47:48,220 si je vais dans hello1.c--c'est l'un des tout premiers programmes que nous avons examinés - 746 00:47:48,220 --> 00:47:53,710 normalement nous compiler ce hello1.c avec Clang et cela nous donnerait a.out. 747 00:47:53,710 --> 00:47:59,890 Si par contre vous, au lieu de lui donner l'option-S, ce que vous obtenez est hello1.s 748 00:47:59,890 --> 00:48:02,750 et vous allez vraiment voir le langage d'assemblage. 749 00:48:02,750 --> 00:48:05,750 >> Je fais cela pour un programme très court, mais si vous allez revenir pour Scramble 750 00:48:05,750 --> 00:48:08,740 ou récupérer ou tout programme que vous avez écrit et juste par curiosité 751 00:48:08,740 --> 00:48:13,240 voulez voir à quoi il ressemble réellement, ce qui est effectivement introduite dans la CPU, 752 00:48:13,240 --> 00:48:15,700 vous pouvez utiliser cette option-S avec Clang. 753 00:48:15,700 --> 00:48:17,770 Mais enfin, il ya toujours une chasse aux sorcières. 754 00:48:17,770 --> 00:48:21,810 Voici le 0 et de 1 qui représentent mon implémentation de bonjour, monde. 755 00:48:21,810 --> 00:48:25,530 Mais j'avais l'habitude de quelqu'un d'autre fonction dans mon programme. 756 00:48:25,530 --> 00:48:28,710 Ainsi, même si le processus a été je prends hello.c, 757 00:48:28,710 --> 00:48:34,280 il se compile en code assembleur, puis il obtient assemblés en 0 et de 1, 758 00:48:34,280 --> 00:48:37,460 le seul 0 et de 1 qui sont délivrés à ce moment-là 759 00:48:37,460 --> 00:48:40,270 sont celles qui résultent de mon code. 760 00:48:40,270 --> 00:48:44,400 Mais la personne qui a écrit printf, ils ont compilé leur code il ya 20 ans 761 00:48:44,400 --> 00:48:47,000 et il est maintenant installé quelque part sur l'appareil, 762 00:48:47,000 --> 00:48:51,610 nous ont en quelque sorte à fusionner 0s ses 1s et avec mon 0 et de 1, 763 00:48:51,610 --> 00:48:56,160 et qui nous amène à l'étape 4e et dernière compilation, connu sous le nom de liaison. 764 00:48:56,160 --> 00:48:58,680 Ainsi, sur le côté gauche nous avons le tableau exactement la même que précédemment: 765 00:48:58,680 --> 00:49:02,580 hello.c devient le code assembleur devient 0 et de 1. 766 00:49:02,580 --> 00:49:05,960 Mais rappelez-vous que j'ai utilisé la norme bibliothèque E / S dans mon code, 767 00:49:05,960 --> 00:49:10,350 et cela signifie que quelque part sur l'ordinateur, il ya un fichier appelé stdio.c 768 00:49:10,350 --> 00:49:13,980 ou au moins la version compilée de celle-ci parce que quelqu'un il ya quelques années 769 00:49:13,980 --> 00:49:18,530 compilé en code assembleur stdio.c puis tout un tas de 0 et de 1. 770 00:49:18,530 --> 00:49:21,130 C'est ce qui est connu comme un statique ou une bibliothèque dynamique. 771 00:49:21,130 --> 00:49:23,350 C'est un fichier assis quelque part dans l'appareil. 772 00:49:23,350 --> 00:49:28,710 >> Mais enfin, je dois prendre mon 0s et 1s et cette personne 0s et 1s 773 00:49:28,710 --> 00:49:32,760 et en quelque sorte les relier entre eux, littéralement ceux qui combinent 0 et de 1 774 00:49:32,760 --> 00:49:37,900 dans un seul fichier appelé a.out ou hello1 ou quoi que j'ai appelé mon programme 775 00:49:37,900 --> 00:49:43,320 de sorte que le résultat final a toutes les 1s et 0s qui devrait composent mon programme. 776 00:49:43,320 --> 00:49:45,660 Donc tout ce temps ce semestre lorsque vous avez été en utilisant Clang 777 00:49:45,660 --> 00:49:48,750 et même plus récemment de lancer make pour exécuter Clang, 778 00:49:48,750 --> 00:49:53,580 toutes ces mesures ont été se passe en quelque sorte instantanément, mais tout à fait délibérément. 779 00:49:53,580 --> 00:49:57,830 Et si vous continuez à en informatique, à savoir CS61, 780 00:49:57,830 --> 00:50:00,850 c'est la couche que vous allez continuer à peler off il 781 00:50:00,850 --> 00:50:06,980 parle d'efficacité, conséquences sur la sécurité, etc de ces détails de niveau inférieur. 782 00:50:06,980 --> 00:50:09,220 Mais avec cela, nous sommes sur le point de quitter C derrière. 783 00:50:09,220 --> 00:50:11,420 Allons de l'avant et de prendre notre pause de 5 minutes maintenant, 784 00:50:11,420 --> 00:50:14,190 et quand nous reviendrons: l'Internet. 785 00:50:17,280 --> 00:50:19,170 Très bien. Nous sommes de retour. 786 00:50:19,170 --> 00:50:23,590 Maintenant, nous commençons notre regard non seulement au HTML, car, comme vous le verrez, 787 00:50:23,590 --> 00:50:26,050 HTML lui-même est en fait assez simple 788 00:50:26,050 --> 00:50:29,270 mais vraiment à la programmation web, plus généralement, la mise en réseau de façon plus générale, 789 00:50:29,270 --> 00:50:31,770 et comment toutes ces technologies se rejoignent 790 00:50:31,770 --> 00:50:35,400 pour nous permettre de créer des programmes beaucoup plus sophistiqués au-dessus de l'Internet 791 00:50:35,400 --> 00:50:38,690 à ce jour, nous avons pu dans ces fenêtres en noir et blanc. 792 00:50:38,690 --> 00:50:42,140 En effet, à ce point au cours du semestre, même si nous allons passer du temps relativement moins 793 00:50:42,140 --> 00:50:46,200 sur PHP, HTML, CSS, JavaScript, SQL et plus, 794 00:50:46,200 --> 00:50:48,480 la plupart des étudiants ne finissent par faire des projets finaux qui sont basé sur le Web 795 00:50:48,480 --> 00:50:51,230 parce que, comme vous le verrez, l'arrière-plan, vous avez maintenant dans C 796 00:50:51,230 --> 00:50:54,450 est tout à fait applicables à ces langues de niveau supérieur. 797 00:50:54,450 --> 00:50:56,800 >> Et comme vous commencez à penser à votre projet final, 798 00:50:56,800 --> 00:50:59,940 qui, à l'instar 0 Régler un problème, où vous avez été encouragé 799 00:50:59,940 --> 00:51:02,160 de faire quoi que ce soit plus d'intérêt pour vous dans Scratch, 800 00:51:02,160 --> 00:51:05,790 le projet final est pour vous l'occasion de prendre vos nouvelles connaissances et de bon sens avec C 801 00:51:05,790 --> 00:51:09,850 ou PHP ou JavaScript ou similaires sur un tour 802 00:51:09,850 --> 00:51:12,330 et de créer votre propre morceau de logiciel pour le monde de voir. 803 00:51:12,330 --> 00:51:17,770 Et pour vous semence d'idées, sachez que vous pouvez vous diriger ici, projects.cs50.net. 804 00:51:17,770 --> 00:51:21,800 Chaque année, nous sollicitons les idées des professeurs et du personnel et des groupes d'étudiants sur le campus 805 00:51:21,800 --> 00:51:27,330 simplement à soumettre leurs idées pour des choses intéressantes qui pourraient être résolus à l'aide d'ordinateurs, 806 00:51:27,330 --> 00:51:29,860 utilisant les sites Web, en utilisant le logiciel. 807 00:51:29,860 --> 00:51:32,360 Donc, si vous avez du mal à trouver une idée de votre propre, 808 00:51:32,360 --> 00:51:35,790 par tous les moyens de faire défiler les idées il ya à partir de cette année et le dernier. 809 00:51:35,790 --> 00:51:39,990 Il est parfaitement possible de s'attaquer à un projet qui a été abordé auparavant. 810 00:51:39,990 --> 00:51:44,540 Nous avons vu de nombreuses applications pour voir le statut de linge sur le campus, 811 00:51:44,540 --> 00:51:47,000 de nombreuses applications pour naviguer dans le menu de la salle à manger, 812 00:51:47,000 --> 00:51:49,540 de nombreuses applications pour naviguer dans le catalogue de cours, etc. 813 00:51:49,540 --> 00:51:53,680 Et en effet, lors d'une conférence avenir et à des séminaires à venir, 814 00:51:53,680 --> 00:51:57,750 nous allons vous présenter certaines API accessibles au public, à la fois disponibles dans le commerce 815 00:51:57,750 --> 00:52:02,520 comme ici disponible à partir CS50 sur le campus afin que vous ayez accès aux données 816 00:52:02,520 --> 00:52:04,910 et peut ensuite faire des choses intéressantes avec lui. 817 00:52:04,910 --> 00:52:09,380 Donc plus sur les projets définitifs dans quelques jours lorsque nous publierons la spécification, 818 00:52:09,380 --> 00:52:12,990 mais pour l'instant, sachez que vous pouvez travailler seul ou avec un ou deux amis 819 00:52:12,990 --> 00:52:16,010 sur la plupart des projets d'intérêt pour vous. 820 00:52:16,010 --> 00:52:18,080 L'Internet. 821 00:52:18,080 --> 00:52:22,300 Allez-y et sortez votre ordinateur portable, vous allez à facebook.com pour la première fois, 822 00:52:22,300 --> 00:52:27,020 ne pas avoir connecté récemment, et appuyez sur Entrée. Qu'est-ce qui se passe exactement? 823 00:52:27,020 --> 00:52:30,150 >> Lorsque vous appuyez sur Entrée sur votre ordinateur, tout un tas d'étapes 824 00:52:30,150 --> 00:52:32,600 commencer sorte de magie qui se passe. 825 00:52:32,600 --> 00:52:35,960 Alors vous ici sur la gauche, le serveur web comme Facebook est mis ici sur la droite, 826 00:52:35,960 --> 00:52:42,500 et en quelque sorte vous utilisez ce langage appelé HTTP, Hypertext Transfer Protocol. 827 00:52:42,500 --> 00:52:46,770 HTTP n'est pas un langage de programmation. Il s'agit plutôt d'un protocole. 828 00:52:46,770 --> 00:52:52,310 Il s'agit d'un ensemble de conventions que les navigateurs Web et les serveurs Web utilisent lors d'intercommunication. 829 00:52:52,310 --> 00:52:54,360 Et qu'est-ce que cela signifie est comme suit. 830 00:52:54,360 --> 00:52:56,790 Tout comme dans le monde réel, nous avons ces conventions 831 00:52:56,790 --> 00:53:00,140 où si vous répondez à certains humains pour la première fois, si vous ne me dérange pas moi humoring ici, 832 00:53:00,140 --> 00:53:03,980 Je pourrais venir à vous, dites: «Salut, mon nom est David." >> Salut, David. Mon nom est Sammy. 833 00:53:03,980 --> 00:53:05,770 "Salut, David. Mon nom est Sammy." 834 00:53:05,770 --> 00:53:08,310 Alors maintenant, nous venons engagés dans ce type de protocole de l'homme stupide 835 00:53:08,310 --> 00:53:12,200 où j'ai initié le protocole, Sammy a répondu, 836 00:53:12,200 --> 00:53:15,060 nous avons serré la main, et la transaction est terminée. 837 00:53:15,060 --> 00:53:18,260 HTTP est très similaire dans son esprit. 838 00:53:18,260 --> 00:53:23,350 Lorsque vos demandes du navigateur Web www.facebook.com, 839 00:53:23,350 --> 00:53:27,020 ce que votre navigateur fait vraiment tend la main, pour ainsi dire, 840 00:53:27,020 --> 00:53:29,960 au serveur et il lui envoyant un message. 841 00:53:29,960 --> 00:53:34,220 Et ce message est généralement quelque chose comme faire - qu'est-ce que vous voulez? - 842 00:53:34,220 --> 00:53:38,740 me la page d'accueil, ce qui est généralement représenté par une barre oblique à la fin d'une URL. 843 00:53:38,740 --> 00:53:43,790 Et juste pour que vous sachiez quelle langue je parle, je le navigateur vais vous dire 844 00:53:43,790 --> 00:53:46,930 que je parle la version HTTP 1.1, 845 00:53:46,930 --> 00:53:51,980 Et aussi pour faire bonne mesure, je vais vous dire que l'accueil que je veux la page d'accueil 846 00:53:51,980 --> 00:53:54,120 est facebook.com. 847 00:53:54,120 --> 00:53:57,730 En règle générale, un navigateur Web, à votre insu, les ressources humaines, 848 00:53:57,730 --> 00:54:03,350 envoie ce message à travers l'Internet lorsque vous tapez simplement www.facebook.com, 849 00:54:03,350 --> 00:54:05,370 >> Entrez, dans votre navigateur. 850 00:54:05,370 --> 00:54:07,300 Et qu'est-ce que Facebook répondre avec? 851 00:54:07,300 --> 00:54:12,540 Il répond avec quelques détails d'aspect semblable cryptiques, mais aussi beaucoup plus. 852 00:54:12,540 --> 00:54:14,310 Permettez-moi aller de l'avant à la page d'accueil de Facebook en cliquant ici. 853 00:54:14,310 --> 00:54:17,480 C'est l'écran que la plupart d'entre nous sans doute jamais si vous restez connecté tout le temps, 854 00:54:17,480 --> 00:54:19,830 mais c'est bien leur page d'accueil. 855 00:54:19,830 --> 00:54:24,150 Si nous faisons cela dans Chrome, notez que vous pouvez tirer de ces petits menus contextuels. 856 00:54:24,150 --> 00:54:26,980 En utilisant Chrome, que ce soit sur Mac OS, Windows, Linux, ou autre, 857 00:54:26,980 --> 00:54:31,840 Si vous contrôlez un clic ou clic gauche, vous pouvez généralement tirer vers le haut un menu qui ressemble à ceci, 858 00:54:31,840 --> 00:54:35,870 où attendent quelques options, dont l'une est source de la page. 859 00:54:35,870 --> 00:54:39,920 Vous pouvez également obtenir généralement à ces choses en allant dans le menu Affichage et fureter partout. 860 00:54:39,920 --> 00:54:42,750 Par exemple, ici sous Affichage, Développeur c'est la même chose. 861 00:54:42,750 --> 00:54:45,780 Je vais aller de l'avant et de regarder source de la page. 862 00:54:45,780 --> 00:54:50,800 Ce que vous voyez est le code HTML que Mark a écrit pour représenter facebook.com. 863 00:54:50,800 --> 00:54:55,910 C'est un désordre complet ici, mais nous allons voir ce que cela a un sens un peu plus avant longtemps. 864 00:54:55,910 --> 00:54:59,840 Mais il ya certaines tendances ici. Permettez-moi de faire défiler vers le bas pour des trucs comme ça. 865 00:54:59,840 --> 00:55:05,730 Il est difficile pour un être humain de lire, mais remarquerez qu'il ya ce modèle de chevrons 866 00:55:05,730 --> 00:55:10,360 avec des mots clés comme option, mots-clés comme valeur, certaines chaînes entre guillemets. 867 00:55:10,360 --> 00:55:15,660 C'est là que, lorsque vous vous êtes inscrit pour la première fois, a précisé ce que votre année de naissance est. 868 00:55:15,660 --> 00:55:19,020 Ce menu déroulant des années de naissance est en quelque sorte codée ici 869 00:55:19,020 --> 00:55:23,870 dans cette langue appelé HTML, Hypertext Markup Language. 870 00:55:23,870 --> 00:55:27,730 En d'autres termes, quand votre navigateur demande une page Web, 871 00:55:27,730 --> 00:55:30,610 il parle de cette convention appelée HTTP. 872 00:55:30,610 --> 00:55:35,170 Mais qu'est-ce que facebook.com répondre à cette demande avec? 873 00:55:35,170 --> 00:55:38,260 >> Il répond avec certains de ces messages cryptiques, comme nous le verrons dans un instant. 874 00:55:38,260 --> 00:55:43,760 Mais la plupart de sa réponse est dans la forme de HTML, Hypertext Markup Language. 875 00:55:43,760 --> 00:55:47,170 C'est le langage réel dans lequel une page web est écrite. 876 00:55:47,170 --> 00:55:52,030 Et quel navigateur ne puis vraiment dire, lors de la réception de quelque chose qui ressemble à ceci, 877 00:55:52,030 --> 00:55:57,120 le lit de haut en bas, de gauche à droite, et à chaque fois qu'il voit un de ces chevrons 878 00:55:57,120 --> 00:56:03,370 suivi d'un mot-clé comme option, il affiche ce langage de balisage de la manière appropriée. 879 00:56:03,370 --> 00:56:06,820 Dans ce cas, il affiche un menu déroulant d'années. 880 00:56:06,820 --> 00:56:09,240 Mais encore une fois, c'est un désordre complet à regarder. 881 00:56:09,240 --> 00:56:16,630 Ce n'est pas parce que les développeurs Facebook manifestent 0 pour 5 pour le style, par exemple. 882 00:56:16,630 --> 00:56:20,190 C'est parce que la plupart du code qu'ils écrivent est, en fait, écrit magnifiquement, 883 00:56:20,190 --> 00:56:22,450 bien commenté, bien indenté, et autres, 884 00:56:22,450 --> 00:56:26,080 mais des machines de cours, les ordinateurs, les navigateurs vraiment rien à foutre 885 00:56:26,080 --> 00:56:27,890 si votre code est bien coiffés. 886 00:56:27,890 --> 00:56:33,100 Et en fait, c'est tout à fait inutile de frapper la touche de tabulation toutes ces fois 887 00:56:33,100 --> 00:56:37,650 et de mettre des commentaires tout au long de votre code et de choisir des noms de variables descriptives vraiment 888 00:56:37,650 --> 00:56:42,340 parce que si le navigateur ne se soucie pas, tout ce que vous faites à la fin de la journée est de perdre octets. 889 00:56:42,340 --> 00:56:46,660 >> Ainsi, il s'avère que la plupart des sites ne sont même si le code source pour facebook.com, 890 00:56:46,660 --> 00:56:49,550 pour cs50.net et toutes ces autres sites Web sur Internet 891 00:56:49,550 --> 00:56:53,730 sont généralement bien écrit et bien commenté et bien en retrait et similaires, 892 00:56:53,730 --> 00:56:59,270 généralement avant le site Web est mis sur l'Internet, le code est minified, 893 00:56:59,270 --> 00:57:02,970 laquelle le HTML et le CSS - quelque chose d'autre nous le verrons bientôt - 894 00:57:02,970 --> 00:57:05,960 le code JavaScript que nous allons bientôt voir est comprimé, 895 00:57:05,960 --> 00:57:09,250 de sorte que les noms de variables deviennent longues X et Y et Z, 896 00:57:09,250 --> 00:57:13,900 et tout cela espaces qui rend tout l'air si lisible est tout jeté, 897 00:57:13,900 --> 00:57:17,700 parce que si vous pensez cela de cette façon, Facebook obtient une page milliards frappe un jour - 898 00:57:17,700 --> 00:57:21,670 quelque chose de fou comme ça - tant pis si un programmeur juste pour être anale 899 00:57:21,670 --> 00:57:26,660 appuyez sur la barre d'espace une fois supplémentaire juste pour indenter une ligne de code tellement plus? 900 00:57:26,660 --> 00:57:29,500 Quelle est la conséquence si Facebook conserve que les espaces 901 00:57:29,500 --> 00:57:32,880 dans tous les octets qu'ils renvoient à des gens sur Internet? 902 00:57:32,880 --> 00:57:36,400 Frapper la barre d'espace une fois que vous donne un octet supplémentaire dans votre fichier. 903 00:57:36,400 --> 00:57:39,730 Et si un milliard de personnes, puis procéder au téléchargement de la page d'accueil de ce jour-là, 904 00:57:39,730 --> 00:57:42,060 quelle quantité de données avez-vous transmis sur l'Internet? 905 00:57:42,060 --> 00:57:45,200 Un gigaoctet sans raison valable. 906 00:57:45,200 --> 00:57:48,510 Et a accordé, pour un grand nombre de sites, ce n'est pas une question aussi évolutive, 907 00:57:48,510 --> 00:57:51,030 mais pour Facebook, pour Google, pour certains des sites Web les plus populaires 908 00:57:51,030 --> 00:57:54,860 il ya une grande incitation financière pour rendre votre code ressemble à un gâchis 909 00:57:54,860 --> 00:57:58,980 de sorte que vous utilisez comme quelques octets que possible, en plus de la compression puis 910 00:57:58,980 --> 00:58:01,500 en utilisant quelque chose comme zip, un algorithme appelé gzip, 911 00:58:01,500 --> 00:58:04,250 que le navigateur fait pour vous automatiquement. Mais c'est terrible. 912 00:58:04,250 --> 00:58:08,060 Nous ne serons jamais apprendre quoi que ce soit sur les sites Web des autres et de la façon de concevoir des pages Web 913 00:58:08,060 --> 00:58:09,680 si nous devons le regarder comme ça. 914 00:58:09,680 --> 00:58:13,620 >> Donc, heureusement, les navigateurs comme Chrome et IE et Firefox nos jours 915 00:58:13,620 --> 00:58:16,450 généralement livrés avec des outils de développement intégrés. 916 00:58:16,450 --> 00:58:21,730 En fait, si je descends ici pour Inspectez élément ou si je vais à Voir, développeur, 917 00:58:21,730 --> 00:58:25,220 et allez dans Outils développeur explicitement, 918 00:58:25,220 --> 00:58:27,640 cette fenêtre au bas de mon écran apparaît maintenant. 919 00:58:27,640 --> 00:58:31,230 C'est un peu intimidant au premier abord, car il ya beaucoup d'onglets inconnus ici, 920 00:58:31,230 --> 00:58:34,510 mais si je clique sur les éléments tout le chemin en bas à gauche, 921 00:58:34,510 --> 00:58:38,810 Chrome est évidemment très intelligent. Il sait comment interpréter tout ce code. 922 00:58:38,810 --> 00:58:42,320 Et donc ce que Chrome fait est qu'il nettoie tout l'HTML Facebook. 923 00:58:42,320 --> 00:58:45,680 Même s'il n'y a pas de blancs là-bas, il n'y a pas indentation là, 924 00:58:45,680 --> 00:58:51,120 remarque maintenant que je peux commencer à naviguer sur cette page web d'autant plus hiérarchique. 925 00:58:51,120 --> 00:58:56,910 Il s'avère que chaque page écrite dans un langage appelé HTML 5 devrait commencer par cela, 926 00:58:56,910 --> 00:59:03,980 cette déclaration DOCTYPE, pour ainsi dire: 927 00:59:03,980 --> 00:59:07,840 C'est une sorte de clair et gris, mais c'est la toute première ligne de code dans ce fichier, 928 00:59:07,840 --> 00:59:12,080 et qui raconte simplement le navigateur, "Hey, voici quelques HTML5. Voici une page Web." 929 00:59:12,080 --> 00:59:18,490 La première tranche ouverte au-delà de ce qui se passe à cette chose, une parenthèse ouverte balise HTML, 930 00:59:18,490 --> 00:59:22,320 et puis si je plonge plus profondément - ces flèches sont complètement dénuée de sens; 931 00:59:22,320 --> 00:59:25,140 ils sont juste pour l'amour de la présentation, ils ne sont pas réellement dans le fichier - 932 00:59:25,140 --> 00:59:30,300 remarquerez que l'intérieur de la balise HTML de Facebook, tout ce qui commence par un crochet ouvert 933 00:59:30,300 --> 00:59:32,910 et a ensuite un mot est appelé une étiquette. 934 00:59:32,910 --> 00:59:38,610 Donc à l'intérieur de la balise HTML est apparemment un tag tête et une balise body. 935 00:59:38,610 --> 00:59:41,930 A l'intérieur de la balise head est maintenant un gâchis pour Facebook 936 00:59:41,930 --> 00:59:45,620 parce qu'ils ont beaucoup de métadonnées et d'autres choses pour le marketing et la publicité. 937 00:59:45,620 --> 00:59:50,600 >> Mais si nous défiler vers le bas, bas, bas, bas, nous allons voir où il est. Ici, il est. 938 00:59:50,600 --> 00:59:52,210 Celui-ci est au moins un peu. 939 00:59:52,210 --> 00:59:55,990 Le titre de la page d'accueil de Facebook, si jamais vous regardez dans l'onglet dans la barre de titre, 940 00:59:55,990 --> 00:59:59,060 Bienvenue sur Facebook est - Connexion, Inscription ou En savoir plus. 941 00:59:59,060 --> 01:00:01,110 C'est ce que vous verriez dans la barre de titre de Chrome, 942 01:00:01,110 --> 01:00:03,100 et voilà comment il est représenté dans le code. 943 01:00:03,100 --> 01:00:08,090 Si l'on ignore tout le reste dans la tête, la plupart des entrailles d'une page web sont dans le corps, 944 01:00:08,090 --> 01:00:10,940 et il s'avère que le code de Facebook va se pencher plus complexe 945 01:00:10,940 --> 01:00:14,540 que la plupart des choses que nous écrirons d'abord simplement parce qu'il a été construit au fil des ans, 946 01:00:14,540 --> 01:00:17,260 mais il ya tout un tas de balises de script, le code JavaScript, 947 01:00:17,260 --> 01:00:18,870 qui rend le site très interactif: 948 01:00:18,870 --> 01:00:22,330 voir instantanément mises à jour de statut en utilisant des langages tels que JavaScript. 949 01:00:22,330 --> 01:00:25,270 Il ya quelque chose qui s'appelle un div, qui est une division d'une page. 950 01:00:25,270 --> 01:00:27,940 Mais avant d'arriver à ce détail, nous allons essayer de faire un zoom arrière 951 01:00:27,940 --> 01:00:31,920 et regardez une version simplifiée de Facebook 1.0, pour ainsi dire. 952 01:00:31,920 --> 01:00:34,740 Voici le bonjour, monde de pages Web. 953 01:00:34,740 --> 01:00:37,370 Il a cette déclaration DOCTYPE au sommet 954 01:00:37,370 --> 01:00:40,280 qui est un peu différent de tout le reste. 955 01:00:40,280 --> 01:00:46,130 Rien d'autre que nous écrivons dans une page web va commencer par 01:00:48,880 et sauf pour ce qu'on appelle des commentaires en HTML. 957 01:00:48,880 --> 01:00:53,000 Mais la plupart du temps, le tout dans une page Web est ouverte support, mot-clé, ferme la parenthèse. 958 01:00:53,000 --> 01:00:56,220 >> Dans ce cas, vous pouvez voir la plus simple des pages Web possibles. 959 01:00:56,220 --> 01:01:00,260 La balise HTML contenant une balise tête et il contient une balise body, 960 01:01:00,260 --> 01:01:04,580 mais remarquez qu'il ya cette notion de démarrage et d'arrêt des tags. 961 01:01:04,580 --> 01:01:11,360 Il s'agit de la balise de début pour le HTML, il s'agit de la balise de fermeture ou de balise de fin. 962 01:01:11,360 --> 01:01:15,400 Remarquez qu'ils sont en quelque sorte des contraires dans le sens que la balise de fermeture ou de balise de fin 963 01:01:15,400 --> 01:01:20,030 a cette barre oblique à l'intérieur de lui-même. 964 01:01:20,030 --> 01:01:23,540 Pendant ce temps, il ya une balise head ouvert ici et une balise de tête tout près d'ici. 965 01:01:23,540 --> 01:01:26,880 >> Il s'agit d'un titre d'ouverture et une balise de titre tout près d'ici. 966 01:01:26,880 --> 01:01:29,850 Le fait que j'ai mis le titre sur une seule ligne, purement arbitraire. 967 01:01:29,850 --> 01:01:33,760 Il a juste regardé comme il se rangent bien sur une seule ligne, donc je n'ai pas pris la peine de taper Entrée à quelques reprises. 968 01:01:33,760 --> 01:01:38,200 Pendant ce temps, le corps que j'ai fait tiret juste d'être toujours aussi claire. 969 01:01:38,200 --> 01:01:41,050 Notez que HTML est un langage assez stupide. 970 01:01:41,050 --> 01:01:43,410 En effet, de retour dans la journée avant il y avait les éditeurs WYSIWYG 971 01:01:43,410 --> 01:01:46,770 et Microsoft Word où vous pouvez dire: «Faites ce gras, italique font de cette" 972 01:01:46,770 --> 01:01:50,850 vous auriez fait taper des commandes en petites essais 20 + ans 973 01:01:50,850 --> 01:01:55,740 où vous dites: «Commencez à faire de ce texte en gras. Arrêtez de faire ce texte en gras." 974 01:01:55,740 --> 01:01:59,010 "Commencez à faire de ce texte en italique. Arrêtez de faire ce italique texte." 975 01:01:59,010 --> 01:02:01,850 >> C'est ce que HTML ou tout autre langage de balisage est. 976 01:02:01,850 --> 01:02:05,530 Cette première étiquette dit: "Hé, navigateur. Voici le HTML." 977 01:02:05,530 --> 01:02:09,880 La balise suivante dit: "Hé, navigateur. Voici la tête, l'en-tête de ma page web." 978 01:02:09,880 --> 01:02:11,650 "Hé, navigateur. Voici le titre." 979 01:02:11,650 --> 01:02:15,880 Et puis ici, "Hé, navigateur. C'est tout pour le titre." 980 01:02:15,880 --> 01:02:20,000 Voilà donc comment le navigateur sait de ne plus afficher plus de caractères que bonjour, monde 981 01:02:20,000 --> 01:02:21,860 dans la barre de titre. 982 01:02:21,860 --> 01:02:23,640 Pendant ce temps, cela dit, "C'est tout pour la tête." 983 01:02:23,640 --> 01:02:28,340 Ceci dit, «Voici le corps est ici le véritable corps." - Littéralement, les mots bonjour, monde. 984 01:02:28,340 --> 01:02:33,190 Et cela est dit ici, «C'est tout pour le corps. C'est tout pour le HTML." 985 01:02:33,190 --> 01:02:34,640 Ainsi, les navigateurs sont assez stupide. 986 01:02:34,640 --> 01:02:39,920 Qu'ils viennent de lire ce genre de choses de haut en bas, de gauche à droite, et faire exactement ce qu'on leur dit de faire. 987 01:02:39,920 --> 01:02:41,860 Nous allons effectivement faire un petit exemple ici. 988 01:02:41,860 --> 01:02:46,240 Permettez-moi d'ouvrir le plus simple des programmes sur mon Mac ici, à savoir TextEdit. 989 01:02:46,240 --> 01:02:48,220 Sous Windows, vous pouvez utiliser le Bloc-notes. 990 01:02:48,220 --> 01:02:50,520 Mais c'est tout ce que vous avez besoin pour commencer à faire des pages web. 991 01:02:50,520 --> 01:02:53,730 Je vais aller de l'avant et il suffit de copier et coller ce code dans ce fichier. 992 01:02:53,730 --> 01:02:57,210 Je vais aller de l'avant et de l'enregistrer sur mon bureau, 993 01:02:57,210 --> 01:03:01,220 et je vais l'enregistrer comme hello.html, 994 01:03:01,220 --> 01:03:03,840 et maintenant le fichier est nommé hello.html. 995 01:03:03,840 --> 01:03:05,690 Ici, il est sur mon bureau. 996 01:03:05,690 --> 01:03:11,130 Permettez-moi maintenant aller dans un navigateur et faites glisser le fichier dans le navigateur. 997 01:03:11,130 --> 01:03:14,060 Et voila, voici ma page web toute première fois. 998 01:03:14,060 --> 01:03:17,340 Notez que le titre de l'onglet est bonjour, monde selon la balise title, 999 01:03:17,340 --> 01:03:20,040 et notez que bonjour, monde est le corps de ma page web, 1000 01:03:20,040 --> 01:03:22,190 et woo-hoo, je suis sur Internet. 1001 01:03:22,190 --> 01:03:24,700 >> Je ne suis pas vraiment, non, parce que ce fichier n'est pas sur Internet. 1002 01:03:24,700 --> 01:03:28,330 Il se trouve sur mon disque dur local à ce chemin particulier. 1003 01:03:28,330 --> 01:03:32,720 Mais l'idée est la même. Tout ce que nous devons maintenant est un serveur web vers lequel le télécharger. 1004 01:03:32,720 --> 01:03:37,410 Mais d'abord nous allons introduire une complexité en fait un peu plus et un peu plus de stylisation. 1005 01:03:37,410 --> 01:03:39,890 C'est un moyen simple, si ennuyeux, page Web. 1006 01:03:39,890 --> 01:03:41,990 Il s'avère qu'il ya d'autres types d'étiquettes que nous pouvons utiliser. 1007 01:03:41,990 --> 01:03:45,530 Par exemple, ici en jaune j'ai introduit 2 nouvelles balises. 1008 01:03:45,530 --> 01:03:49,630 Nous n'allons pas jouer beaucoup avec cela aujourd'hui, mais notez que la balise link 1009 01:03:49,630 --> 01:03:52,520 semble quelque peu différente de tout le reste. 1010 01:03:52,520 --> 01:03:55,370 La balise link prend ce qu'on appelle des attributs, 1011 01:03:55,370 --> 01:03:59,770 et un attribut est quelque chose qui modifie le comportement d'une étiquette. 1012 01:03:59,770 --> 01:04:03,840 Dans ce cas, ce n'est pas le meilleur choix des noms, des liens, parce que c'est un peu vide de sens, 1013 01:04:03,840 --> 01:04:11,590 mais cette balise link dit, essentiellement, d'inclure le fichier appelé styles.css l'intérieur de ma page web. 1014 01:04:11,590 --> 01:04:15,400 Vous pouvez considérer cela comme analogue à C de la directive # include. 1015 01:04:15,400 --> 01:04:19,650 Styles.css se réfère à une langue tout à fait différente que nous ne jouerons pas aujourd'hui, 1016 01:04:19,650 --> 01:04:23,790 mais c'est pour l'esthétique: la taille des polices, couleurs, espacements, l'indentation, les marges, 1017 01:04:23,790 --> 01:04:26,040 et tout ce genre de détail esthétique. 1018 01:04:26,040 --> 01:04:28,820 Pendant ce temps, la balise script est fonctionnellement similaire, 1019 01:04:28,820 --> 01:04:33,140 mais au lieu de include CSS, cette langue, il comprend une autre langue, JavaScript. 1020 01:04:33,140 --> 01:04:37,810 Donc, en d'autres termes, avec ces 2 balises je vais finir par être capable d'écrire ma propre page web 1021 01:04:37,810 --> 01:04:41,490 mais aussi tirer dans le code que moi ou quelqu'un d'autre a écrit 1022 01:04:41,490 --> 01:04:44,350 afin que nous puissions tenir debout sur les épaules des autres, nous pouvons pratiquer un bon design, 1023 01:04:44,350 --> 01:04:46,120 la factorisation de code commune. 1024 01:04:46,120 --> 01:04:49,090 Si j'ai eu 10 différentes pages Web, ce qui signifie que certains de mes esthétique 1025 01:04:49,090 --> 01:04:52,490 peut être mise de côté, un peu comme # include, dans un fichier séparé. 1026 01:04:52,490 --> 01:04:54,420 Donc, nous allons y arriver. 1027 01:04:54,420 --> 01:04:57,180 Mais nous allons d'abord faire réellement quelque chose de plus intéressant avec ce fichier. 1028 01:04:57,180 --> 01:05:01,110 >> Encore une fois, ce n'est que TextEdit. Je ne suis pas techniquement sur l'Internet, mais nous y arriverons. 1029 01:05:01,110 --> 01:05:04,910 Je voudrais faire bonjour, monde un peu plus audacieux que c'est. 1030 01:05:04,910 --> 01:05:10,890 Donc bonjour, nous allons dire arbitrairement pour le gras. 1031 01:05:10,890 --> 01:05:15,910 Encore une fois, l'histoire est la même: bonjour, virgule, commencer à faire cette audacieuse, 1032 01:05:15,910 --> 01:05:19,730 puis dans le monde est imprimé en caractères gras, ce qui signifie arrêter l'impression de ce en gras. 1033 01:05:19,730 --> 01:05:24,020 Laissez-moi aller de l'avant et sauver mon fichier, revenez à Chrome, je vais effectuer un zoom avant afin que nous puissions mieux voir, 1034 01:05:24,020 --> 01:05:27,870 et de recharger, et vous verrez que le monde est maintenant en gras. 1035 01:05:27,870 --> 01:05:31,810 Le Web est tout au sujet des liens hypertexte, nous allons donc aller de l'avant et de le faire: 1036 01:05:31,810 --> 01:05:38,550 mon site préféré est, disons, youtube.com. 1037 01:05:38,550 --> 01:05:43,810 Enregistrer, rechargez-le. D'accord. Il ya quelques problèmes aujourd'hui en dehors de la laideur du site. 1038 01:05:43,810 --> 01:05:47,310 1, je suis sûr que je la touche Entrée ici. Et je l'ai fait. 1039 01:05:47,310 --> 01:05:51,590 Je n'ai pas seulement appuyer sur Entrée, j'ai également en retrait, en pratique ce que nous avons prêché sur le style, 1040 01:05:51,590 --> 01:05:54,930 mais mon trouve juste à côté du monde. 1041 01:05:54,930 --> 01:05:58,410 Alors, pourquoi est-ce? Navigateurs seulement faire ce que vous leur dites de faire. 1042 01:05:58,410 --> 01:06:04,010 Je n'ai pas dit le navigateur, "lignes pause ici. Insérez un paragraphe casser ici." 1043 01:06:04,010 --> 01:06:07,820 Ainsi, le navigateur, ce n'est pas grave si je frappe 30 fois de retour, 1044 01:06:07,820 --> 01:06:10,820 il va toujours mettre mon juste à côté du monde. 1045 01:06:10,820 --> 01:06:15,930 Ce que j'ai vraiment avez à faire ici est de dire quelque chose comme
, insérer un saut de ligne. 1046 01:06:15,930 --> 01:06:17,940 >> Et en fait, un saut de ligne est une sorte de truc bizarre 1047 01:06:17,940 --> 01:06:21,650 parce que vous ne pouvez pas vraiment commencer à se déplacer sur une autre ligne, puis faire quelque chose, 1048 01:06:21,650 --> 01:06:25,380 et puis arrêtez de passer à une nouvelle ligne. C'est un peu une opération atomique. 1049 01:06:25,380 --> 01:06:28,140 Vous pouvez soit le faire ou vous n'avez pas. Vous appuyez sur Entrée ou vous n'avez pas. 1050 01:06:28,140 --> 01:06:33,390 Donc br est un peu différent d'une balise, et donc j'ai besoin de trier à la fois ouverte et fermez 1051 01:06:33,390 --> 01:06:35,230 en une seule fois. 1052 01:06:35,230 --> 01:06:37,500 La syntaxe de ce qui est. 1053 01:06:37,500 --> 01:06:41,760 Techniquement, vous pourriez faire quelque chose comme ceci dans certaines versions de HTML, 1054 01:06:41,760 --> 01:06:45,600 mais ce n'est tout simplement stupide parce qu'il n'y a aucune raison pour démarrer et arrêter quelque chose 1055 01:06:45,600 --> 01:06:48,420 si vous pouvez, au lieu de tout faire à la fois. 1056 01:06:48,420 --> 01:06:52,310 Sachez que HTML5 n'est pas strictement besoin de cette barre, 1057 01:06:52,310 --> 01:06:55,410 donc vous verrez des manuels et des ressources en ligne qui ne l'ont pas, 1058 01:06:55,410 --> 01:06:59,780 mais pour faire bonne mesure nous allons pratiquer la symétrie que nous avons vu jusqu'à présent. 1059 01:06:59,780 --> 01:07:02,870 Cela signifie que la balise est à la fois ouvert et fermé. 1060 01:07:02,870 --> 01:07:05,220 Alors maintenant, laissez-moi me sauver fichier, revenez ici. 1061 01:07:05,220 --> 01:07:10,240 Ok, donc il commence à regarder mieux, à l'exception du Web Je sais que c'est un peu cliquable, 1062 01:07:10,240 --> 01:07:13,610 et pourtant youtube ici ne semble pas mener à rien. 1063 01:07:13,610 --> 01:07:17,560 C'est parce que même si elle ressemble à un lien, le navigateur ne sait pas que soi, 1064 01:07:17,560 --> 01:07:20,670 je dois donc indiquer au navigateur qu'il s'agit d'un lien. 1065 01:07:20,670 --> 01:07:22,620 >> La façon de le faire est d'utiliser une balise d'ancrage: 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 et laissez-moi passer cela pour une nouvelle ligne juste donc c'est un peu plus lisible, 1069 01:07:38,490 --> 01:07:40,060 et je vais réduire la taille de la police. 1070 01:07:40,060 --> 01:07:43,890 Suis-je encore fait? Non, il va y avoir cette dichotomie. 1071 01:07:43,890 --> 01:07:46,760 Cette balise, la balise d'ancrage, en effet prendre un attribut, 1072 01:07:46,760 --> 01:07:52,900 qui modifie son comportement, et la valeur de cet attribut est apparemment URL de YouTube. 1073 01:07:52,900 --> 01:07:56,380 Mais remarquez la dichotomie est-ce simplement parce que c'est l'URL que vous allez, 1074 01:07:56,380 --> 01:08:01,020 cela ne signifie pas que doit être le mot que vous êtes en soulignant et faisant un lien. 1075 01:08:01,020 --> 01:08:03,960 Au contraire, cela peut être quelque chose comme ça. 1076 01:08:03,960 --> 01:08:10,870 Donc, je dois dire arrêter de faire ce mot d'un lien hypertexte à l'aide de la balise d'ancrage à proximité. 1077 01:08:10,870 --> 01:08:12,650 Remarquez que je ne fais pas ça. 1078 01:08:12,650 --> 01:08:15,890 1, ce serait juste une perte de temps tout le monde et ce n'est pas nécessaire. 1079 01:08:15,890 --> 01:08:19,290 >> Pour fermer une balise, il suffit de mentionner le nom de la balise à nouveau. 1080 01:08:19,290 --> 01:08:21,800 Vous ne mentionnez pas l'un des attributs. 1081 01:08:21,800 --> 01:08:26,189 Alors sauvons que, revenir en arrière. Bon, voila, maintenant il est bleu et hyperlien. 1082 01:08:26,189 --> 01:08:29,430 Si je clique dessus, je fais réellement aller sur YouTube. 1083 01:08:29,430 --> 01:08:32,529 Ainsi, même si ma page web n'est pas sur Internet, il est au moins HTML, 1084 01:08:32,529 --> 01:08:37,930 et si nous laissons l'Internet rattraper, nous finissons par ici sur youtube.com. 1085 01:08:37,930 --> 01:08:40,670 Et je peux revenir en arrière et voici ma page web. Mais remarquez ceci. 1086 01:08:40,670 --> 01:08:43,120 Si vous avez déjà reçu un spam ou phishing, 1087 01:08:43,120 --> 01:08:45,850 maintenant vous avez la possibilité, après seulement cinq minutes à faire de même. 1088 01:08:45,850 --> 01:08:50,920 Nous pouvons aller ici et de faire quelque chose comme www.badguy.com 1089 01:08:50,920 --> 01:08:59,319 ou quel que soit le site est sommaire, et alors vous pouvez dire vérifier votre compte PayPal. 1090 01:08:59,319 --> 01:09:04,840 [Rires] Et maintenant ça va aller badguy.com, que je ne vais pas cliquer sur 1091 01:09:04,840 --> 01:09:08,000 parce que je n'ai aucune idée où cela mène. [Rires] 1092 01:09:08,000 --> 01:09:10,859 >> Mais nous avons maintenant la possibilité de réellement arriver là. 1093 01:09:10,859 --> 01:09:12,640 Donc nous sommes vraiment juste de commencer à gratter la surface. 1094 01:09:12,640 --> 01:09:15,830 Nous ne sommes pas programmer soi; nous écrivons langage de balisage. 1095 01:09:15,830 --> 01:09:18,569 Mais dès que nous complétons notre vocabulaire en HTML, 1096 01:09:18,569 --> 01:09:21,520 nous allons présenter PHP, un langage de programmation actuelle 1097 01:09:21,520 --> 01:09:26,859 qui va nous permettre de générer du HTML automatiquement, de générer automatiquement CSS, 1098 01:09:26,859 --> 01:09:29,430 afin que nous puissions commencer à mettre en œuvre le mercredi, par exemple, 1099 01:09:29,430 --> 01:09:31,700 notre moteur de recherche et plus encore. 1100 01:09:31,700 --> 01:09:34,770 Mais plus à ce sujet dans quelques jours. Nous vous verrons ensuite. 1101 01:09:34,870 --> 01:09:39,000 >> [CS50.TV]