[Powered by Google Translate] [Semaine 7]
[David J. Malan - Université de Harvard]
[C'est CS50. - CS50.TV]
Très bien. Bienvenue à nouveau. C'est CS50, et c'est le début de la semaine 7.
Un couple de petits annonces:
Pset5 est maintenant en cours, ou sera bientôt,
et laissez-moi vous dire, en toute honnêteté, cela ne tendent à être parmi les plus difficiles
des ensembles de problèmes du cours, alors laissez-moi mentionner maintenant
de sorte que cette semaine, plus que jamais, vous n'attendez pas, disons, mercredi soir
ou jeudi soir à plonger po
C'est vraiment un pset intéressant. Nous pensons que c'est amusant.
Si vous avez réellement le faire tout à fait correcte et peut alors contester le Conseil soi-disant Big,
vous aurez l'occasion de s'affronter avec une partie du personnel du cours
et certains de vos camarades de classe.
Quel est le grand tableau est une fois que vous avez votre correcteur orthographique de travail,
vous serez en mesure d'aller à cs50.net après l'exécution d'une commande,
purement participer au programme, puis la quantité de temps et la quantité de RAM et plus
que vous avez utilisé dans votre mise en œuvre sera exposée ici sur la page d'accueil du cours.
Vous remarquerez que tout un tas de ces gens ici sont répertoriés comme personnel
depuis ce week-end, le personnel pensait que ce serait amusant d'essayer de se surpasser les uns les autres.
Ainsi se rendre compte que le but ici n'est pas de surpasser le personnel.
Même moi, je ne suis ici au numéro 13.
Purement participer au programme, mais c'est l'occasion de voir à quel point peu de RAM
et combien peu de secondes CPU, vous pouvez utiliser vis-à-vis de certains de vos camarades de classe.
>> Et je dois admettre que Kevin Michael Schmid,
actuellement en position numéro 1 comme l'un des facteurs de transcription,
il s'agit d'une mise en œuvre que nous appelons pas possible
étant donné qu'il utilise près de 0 RAM et près de 0 secondes pour le chargement.
Donc, nous allons prendre soin de Kevin déconnecté. [Rires]
Il ya certaines compétences que Kevin est mise à l'épreuve ici.
Une des choses que nous avons pensé que nous ferions aujourd'hui est trop CS50x est une semaine en cours,
et vous les gars font tout autant partie de cette expérience que ces étudiants sont.
Nous leur avons demandé dans le cadre de leur PSET0, qui était également de présenter un projet Scratch
d'intérêt pour eux - un jeu, une pièce d'art interactive, une animation, ou autre -
un 1 - vidéo 2-minute, si ils le souhaitent, dire bonjour au monde et qui ils sont réellement.
J'ai pensé que je partagerais avec vous juste un couple des vidéos qui ont été soumis à ce jour
parce que pour nous, le personnel au moins, il a vraiment été passionnante
et inspirant de voir ces gens de partout dans le monde - les pays du monde entier -
tuning, de toutes choses, à un cours d'informatique sur Internet,
si c'est parce qu'ils veulent continuer leurs études,
ils veulent prendre leur carrière dans une nouvelle direction,
ils veulent combler les lacunes dans leurs connaissances,
de sorte que certaines des mêmes raisons que vous les gars ont été peut-être ici.
>> Donc, je vous donne un tel étudiant ici. Vous pouvez augmenter le volume un peu.
Voici un de 1 minute de nos étudiants soumissions.
Bonjour tout le monde. Je suis un étudiant en génie industriel ici, à Malaga, en Espagne.
Je suis très enthousiaste à propos de ce cours en ligne parce que j'aime l'informatique, je le pense vraiment,
et j'apprécie vraiment que je reçois à l'explorer.
Et le fait que je peux apprendre la même chose tous vous les gars
mais au lieu d'être à Harvard, je suis à Malaga, comment impressionnant est ce?
Eh bien, je suis Fernando, et c'est CS50. Vous voir.
[Rires] Un autre clip que nous aimons particulièrement, vous vous rendrez compte que ce monsieur anglais n'est pas si forte.
On dirait qu'il l'avait traduit la machine, de sorte que les traductions elles-mêmes sont un peu imparfaite,
mais c'était l'un de nos favoris jusqu'ici ainsi.
[♪ ♪]
Bonjour tout le monde. [Parler en japonais]
[Je dois saluer en japonais parce que mon anglais est très peu fiable.]
[J'ai livré le message pour vous de la ville de Gifu, au Japon.]
[Je peux être un étudiant pour la première fois en 20 ans, comme on peut le voir.]
[Je suis très reconnaissant à l'Université de Harvard qui m'a donné cette opportunité et EDX.]
[Le golf est une guitare et je préfère courir.] [Rires]
[♪ ♪]
[Pourquoi pensez-vous que je tentais d'assister à une cs50x.]
[Université de Harvard, il est mon désir.]
[Surtout si je suis présence lointaine vécu au Japon.]
[Je voulais essayer immédiatement au courant de l'existence d'un tel EDX quand.]
[Tu ne crois pas si vous n'avez pas lié à l'âge de l'apprentissage I.]
[CS50 est mon désir. Mon nom est Kazu, et c'est CS50.]
[♪ ♪] [applaudissements et des acclamations]
Un autre favori de la nôtre était cette présentation ici de quelqu'un.
[♪ ♪] [Malan] Google il si vous n'êtes pas familier avec ce mème.
>> Et puis enfin, quelques autres qui se sont affichés que peut-être remporter le prix adorable.
[Étudiants] Aww! >> [Malan] Nous allons être à l'écoute. C'est court, alors écoutez attentivement.
[Locutrice] Quel est votre nom? >> Louie.
[Locutrice] Qu'est-ce? [Rires >>] CS50. [Rires]
[Malan] Il n'a deux prises, cependant.
Here we go, le dernier.
Mon nom est Louie, et c'est CS50.
[Rires] C'est alors CS50x.
Merci à tous ceux d'entre vous tout en suivant le long à la maison
qui ont été prenant part à ce jour.
Aujourd'hui, nous concluons notre discussion sur les structures de données,
au moins une partie du plus fondamental,
et puis nous continuons notre conversation sur le langage HTML et la programmation web.
En effet, nous avons passé le passé environ sept semaines à chercher dans les fondamentaux de la programmation -
algorithmes, des structures de données, et analogues -
et C, que vous pouvez avoir connu à ce jour,
n'est pas nécessairement le plus accessible des langues
avec laquelle mettre en œuvre certaines de ces idées.
Et donc à partir de cette semaine et la semaine prochaine, puis la suivante,
nous allons enfin pouvoir faire la transition de C, ce qui est généralement connu comme un langage assez bas niveau,
aux choses de plus haut niveau, parmi lesquels PHP, JavaScript, etc,
que nous verrons tirer les leçons mêmes que nous avons apprises au cours des dernières semaines,
mais vous verrez que déclarer des choses comme les tableaux et les tables de hachage et de recherche et de tri
devenu tellement plus facile parce que les langues elles-mêmes, nous allons commencer à utiliser
deviendra plus puissant.
Mais d'abord, une demande d'arbres.
Il est très fréquent de nos jours d'avoir besoin de comprimer l'information.
Dans quel contexte vous voulez compresser certains types d'informations numériques?
>> Ouais. >> [L'élève] Lorsque vous avez besoin de l'envoyer sur le Web.
Oui, quand vous voulez envoyer quelque chose sur le Web.
Si vous voulez télécharger un gros fichier, il est idéal si quelqu'un à l'autre bout
a comprimé ce fichier en utilisant un format zip ou quelque chose comme ça
de sorte que vous envoyez moins de bits que l'on pourrait autrement être transmises.
Alors, comment voulez-vous comprimer l'information?
Tout se résume à l'utilisation de moins de bits que requis par défaut.
Mais c'est un peu une chose curieuse parce repense aux semaines 0 et 1
quand nous avons parlé ASCII et binaires et nous avons parlé ASCII en particulier
comme utilisant 8 bits pour représenter les lettres de l'alphabet
de sorte que la lettre A est représentée par 65, un minuscule est le numéro 97,
et cependant vous représentez les 65 ou 97, vous utilisez 7 ou 8 bits.
Mais le hic, c'est qu'il ya des lettres de l'alphabet anglais
qui ne sont pas aussi populaires que d'autres.
Z est pas du tout populaire, Q n'est pas du tout populaire, mais A et E sont super populaire.
Et pourtant, pendant toutes ces lettres, par défaut le monde utilise le même nombre de bits, à seulement 8.
Donc, n'aurait-il pas été plus intelligent, si au lieu d'utiliser 8 bits pour chaque lettre,
même les plus souvent utilisées comme Q et Z,
Et si nous avons utilisé moins de bits pour A et E et S et les lettres les plus populaires
et plus de bits utilisés pour les lettres de moins populaires,
l'idée étant d'optimiser let pour le cas le plus courant,
qui est un thème en informatique d'essayer d'optimiser ce qui va se passer le plus
et de passer un peu plus de temps, un peu plus d'espace sur les choses qui, ouais, pourraient se produire
mais pas nécessairement aussi souvent.
Alors prenons un exemple.
>> Supposons que nous voulons pour coder les informations de façon assez efficace.
Vous pourriez avoir grandi en ne connaissant un petit quelque chose sur le code Morse,
et les chances sont que vous ne connaissez pas le code réel,
mais vous rappelez peut-être que c'est au moins cette série de points et de tirets.
Il s'agit d'un codage assez efficaces, et notez que la lettre la plus populaire - par exemple, E -
utilise le plus court de bips.
Le code Morse est tout au sujet bip-bip-bip-bip-bip-bip et la tenue des tons
que ce soit pour de courtes périodes de temps ou de longues périodes de temps.
E, comme indiqué par le point, un bip est super court, juste un bip, et qui représentent E.
En revanche, T serait un long bip, bip, comme [prolonge son],
et qui représentent T.
Mais c'est quand même assez court parce que, en revanche, si vous regardez Z,
d'exprimer Z vous iriez bip, bip [plus sonore], bip, bip [son court].
Donc, c'est plus parce que c'est moins commun.
Mais la chasse aux sorcières, c'est que le code Morse est un peu défectueux
en ce sens qu'elle n'est pas immédiatement décodable.
Par exemple, supposons que vous entendez sur une fin du bip fil [abrégé], bip [longue].
Quel est le message que je viens de recevoir? Un point et un tiret. Qu'est-ce que ça représente?
[L'élève] A. >> [Malan] Peut-être.
Il pourrait également être suivie par T. E
En d'autres termes, le code Morse, même si elle s'appuie sur ce principe d'optimisation le cas coin,
il ne se prête pas à décodabilité immédiate.
Autrement dit, l'homme qui entend ou reçoit ces points et de tirets
a en quelque sorte de savoir où les pauses sont entre les lettres,
parce que si vous ne savez pas où ces pauses sont, vous pourriez confondre A pour HE, ou vice versa.
>> Alors, que pouvez-vous faire? Dans le code Morse vous pouviez juste une pause entre chacune des lettres.
Mais la pause est un peu à l'encontre de toute la question des accélère les choses.
Alors que faire si au lieu nous sommes arrivés avec un code dans lequel il n'y avait pas cette mauvaise situation
où E est un préfixe, par exemple, de A -
en d'autres termes, si nous pouvions faire en sorte que les motifs sont encore en deçà des lettres populaires
long pour les lettres de moins populaires, mais il n'y a pas de confusion possible?
Un homme du nom de Huffman ans a inventé ce système appelé codage de Huffman
qui exploite en fait l'une des structures de données que nous avons passé un peu de temps à parler de
la semaine dernière, que des arbres, des arbres binaires en particulier -
un arbre binaire sens qu'il n'a pas plus de 2 enfants.
Il a peut-être un enfant de gauche, peut-être un enfant à droite, et c'est tout.
Supposons donc juste pour le plaisir de la discussion que quelqu'un veut envoyer un message
qui ressemble à ceci. C'est complètement absurde, mais il est composé de As, Bs, Cs, Ds et Es.
Et si vous avez réellement compter la totalité de l'As, Bs, Cs, Ds et Es
puis diviser par le nombre total de lettres,
ce petit tableau ici dit que 45% des lettres sont Es, 20% sont des As,
10% B, et ainsi de suite.
Donc, en d'autres termes, supposons que la chaîne entre guillemets il
est juste un message que vous souhaitez envoyer.
Il arrive à un non-sens afin que nous puissions l'utiliser comme quelques lettres que possible,
mais c'est effectivement le cas que E reste le plus populaire,
et B et C sont les moins populaires, au moins 5 de ces lettres de l'alphabet.
Alors, comment pouvons-nous prendre pour venir avec un codage,
un codage binaire, un motif de 0 et de 1 pour chacun de ces lettres
de telle sorte que E est un modèle court et peut-être B et C sont des motifs légèrement plus longues,
encore une fois, l'idée étant que nous voulons utiliser moins de bits la plupart du temps
et plus de bits que de temps en temps.
Selon le codage de Huffman, vous pouvez créer une forêt d'arbres.
Il ya une sorte de ligne de l'histoire ici qui implique des arbres et aussi le processus de leur mise en place.
Commençons.
>> Je vous propose de commencer par cette forêt, pour ainsi dire, de 5 arbres,
dont chacun est un arbre assez stupide.
L'arbre est composé de seulement un seul nœud, représenté ici par un cercle.
Ainsi, chacune de ces choses pourrait être une struct C
et à l'intérieur de la structure C peut être un flotteur qui représente le nombre de fréquences
et puis peut-être un char représentant la lettre.
Alors, pensez à ces nœuds comme n'importe quelle ancienne struct C, mais, pour l'instant, niveau supérieur.
Il s'agit d'une forêt de 5 arbres, chacun qui n'ont qu'un seul nœud.
Qu'est-ce Huffman proposée est que nous commençons à combiner ces arbres
qui ont les plus petits comptes de fréquence dans les arbres un peu plus grandes
en les reliant avec un nœud racine.
Ainsi, parmi les lettres ici, notez que pour plus de commodité, je les ai classés de gauche à droite,
même si ce n'est pas strictement nécessaire, et notez que les petits nœuds
actuellement 10% et 10%.
Donc Huffman a proposé que nous fusionnons ces 2 petits noeuds dans un nouvel arbre
en introduisant un nouveau nœud parent et de donner ensuite que parent d'un enfant gauche et droit d'un enfant
où B est arbitrairement la gauche et C est arbitrairement la droite.
Et puis Huffman en outre proposé que nous allons maintenant il suffit de penser à l'enfant gauche
dans l'un de ces arbres toujours comme étant représentée par 0
et l'enfant droit comme étant toujours représenté par le chiffre 1.
>> Ce n'est pas grave si vous les retourner aussi longtemps que vous êtes cohérent.
Alors maintenant, nous avons quatre arbres de cette forêt.
Et je dis quatre, car maintenant l'arbre sur la gauche -
et ce n'est pas tellement un arbre dans le sens où il pousse cette façon,
ça ressemble plus à un arbre généalogique où maintenant la 0.2 est en quelque sorte la mère des deux enfants -
remarquer que dans ce parent que nous avons établi à 0,2.
Nous avons ajouté les comptes de fréquence des deux enfants et compte tenu du nouveau nœud de la somme totale.
Alors maintenant, nous venons de répéter ce processus.
Trouvez les deux plus petits nœuds, puis de les assembler au sein d'un nouvel arbre
puis répétez le processus.
En ce moment nous avons quelques candidats, 20%, 15% et 20%.
Dans ce cas, nous devons briser l'égalité. Nous pouvons le faire de façon arbitraire.
Nous devons juste le faire de manière cohérente.
Dans ce cas, je vais arbitrairement aller avec celui sur la gauche,
et j'ai maintenant fusionner les 20% et 15% pour me donner un nouveau parent appelé 35%,
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.
Vous pouvez peut-être voir où cela va.
Si l'on répète cette fois un couple de plus, nous allons avoir un seul grand arbre,
dont toutes les arêtes sont marquées avec des 0 et des 1.
Faisons-le à nouveau.
35% est la racine de cet arbre est. 20% et 45%, de sorte que nous allons fusionner les 35% et 20%.
Maintenant, nous avons cet arbre ici. Nous ajoutons ceux ensemble, nous avons 55%.
Maintenant, il ya seulement deux arbres de la forêt.
Nous faisons cette fois-ci définitive, et j'espère que mathématiquement toutes les fréquences ajouter jusqu'à
parce qu'ils doivent depuis que nous avons calculée à partir de leur l'obtenir-aller d'ajouter jusqu'à 100%.
Et maintenant nous avons un arbre.
Il s'agit donc d'un arbre de Huffman codage.
Il a pris une sorte de temps pour y arriver verbalement, mais la réalité est avec une boucle for
ou avec une fonction récursive, on pourrait construire cette chose assez vite.
Alors maintenant, nous avons un nouveau noeud, et tous ces noeuds internes ont été malloc,
sans doute, le long du chemin.
Alors maintenant, au sommet de cet arbre, nous avons 100%, mais maintenant, nous avons remarqué un chemin
à partir de ce nouveau grand-grand-grand-grand-parent de tous les arrière-arrière-petits-enfants
tout le chemin vers le bas, pour toutes les feuilles.
>> Ce que nous allons faire maintenant, c'est de proposer que, pour représenter la lettre E,
nous utiliserons simplement le numéro 1. Pourquoi?
Parce que si nous parcourons cet arbre depuis la racine finale jusqu'à la feuille connue sous le nom E,
nous suivons un seul bord, le bord droit, et qui est marqué du cours en haut droite 1.
Ainsi, l'implication ici pour Huffman était que l'encodage binaire de E dans doit juste être 1.
Et c'est sacrément efficace. Ne peut pas vraiment tout petit que cela.
En revanche, A va être représenté, si vous suivez la logique,
par ce motif de bits à la place? 01.
Donc, pour obtenir à A, on commence à la racine et nous allons à gauche et puis nous allons à droite,
ce qui signifie que nous avons suivi un 0 et un 1.
Donc, nous allons représenter la lettre A avec le motif de 0 et 1.
Et remarquez maintenant que nous avons déjà une propriété de décodabilité immédiate
que nous n'avions pas dans le code Morse.
Même si ces deux modèles sont assez courts - E est de 1 bit, 2 bits A est -
remarquerez qu'ils ne peuvent pas être confondu un ou l'autre,
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.
De la même façon, ce qui est d? 001.
Qu'est-ce que C? 0001.
Et ce qui est B? 0000.
Et encore une fois, parce que toutes les lettres qui nous intéressent sont les feuilles
et aucun d'entre eux sont des sortes d'intermédiaires dans le chemin de la racine à la feuille,
il n'y a pas de risque de amalgamant encodages 2 lettres différentes »
parce que toutes ces configurations binaires sont déterministes.
0000 sera toujours B.
Il n'y a aucun nœud quelque part entre ce que vous pourriez confondre une lettre à l'autre.
Alors, quelle est l'implication ici?
>> La lettre la plus populaire - dans ce cas E - a obtenu le plus court d'encodage,
Un a obtenu l'encodage le plus court suivant,
et B et C, que nous connaissions déjà de la sorte obtenir-aller étaient des moins populaires
à la fréquence de 10% chacun, ils ont obtenu la plus longue encodage.
Et donc ce que cela signifie maintenant, c'est que si vous voulez envoyer un message qui est compressé
sur Internet ou dans un e-mail ou similaires,
plutôt que d'utiliser ASCII standard, vous pouvez envoyer un message codé Huffman
de sorte que si vous voulez envoyer la lettre E, vous envoyez juste un peu seule.
Si vous voulez envoyer un A, vous envoyez 2 bits, 01, au lieu d'envoyer 8 bits
suivie d'une autre de 8 bits suivie d'une autre de 8 bits et ainsi de suite.
Mais il ya un piège là.
Il n'est pas suffisant de simplement construire cet arbre, puis commencer à envoyer d'Alice à Bob
le modèle plus court bits, chaîne de l'ASCII,
car Alice doit également informer de ce que Bob
si Bob va être en mesure de lire son message compressé?
[Réponse de l'élève inaudible] >> Qu'est-ce que c'est?
[Réponse de l'élève inaudible] >> De quoi l'arbre est.
Ou plus précisément encore, ce sont ces codages,
d'autant plus que durant cette histoire, nous avons fait un appel de jugement à un moment donné.
Rappelez-vous que nous devions choisir arbitrairement entre les 2 différents nœuds 20%?
Donc ce n'est pas le cas de Bob, le destinataire, peut seulement reconstruire l'arbre sur son propre
parce que peut-être il va créer l'arbre tant soit peu différente de Alice.
De plus, Bob ne sait même pas ce que le message d'origine est
parce que la seule chose que Alice est l'envoyant, bien sûr, est le message compressé.
>> Ainsi, la prise en compression comme ceci, c'est que, oui, Alice peut sauver tout un tas de bits
par l'envoi d'E 1 et 01 pour A et ainsi de suite,
mais elle doit également informer Bob ce que la cartographie est entre les lettres et les bits
parce qu'ils ne peuvent compter que sur bien ASCII plus si nous n'utilisons pas ASCII.
Ainsi, elle peut soit lui envoyer l'arbre en quelque sorte -
notez-le, rangez-le sous forme de données binaires ou quelque chose comme ça -
ou tout simplement lui envoyer une petite antisèche, un fichier Excel, qui montre les mappages.
Ainsi, l'efficacité de la compression prend vraiment que les messages que vous envoyez
sont assez grandes, au moins moyennes entreprises,
parce que si vous voulez envoyer un message super court,
si vous voulez simplement envoyer le message BAD, qui se trouve être un mot, nous pouvons énoncer ici,
B-A-D, vous allez probablement utiliser moins de bits,
mais le hic, c'est si vous avez aussi d'informer Bob ce que l'arbre est
ou ce que ces codages sont, vous allez sans doute l'emportent sur toutes les économies
d'avoir des choses comprimé pour commencer.
Ainsi, il peut effectivement être le cas que si vous essayez de compression
même avec quelque chose comme formats zip ou un fichier que vous connaissez peut-être -
fichiers assez petits, même des fichiers vides -
parfois, ces fichiers peuvent devenir de plus en plus petit pas.
Mais, en réalité, ce qui se passe seulement pour fichiers de petite taille,
si ça ne va pas faire un fichier gigaoctet être 2 gigaoctets;
nous parlons vraiment octets ou quelques kilo-octets couple.
>> Certains programmes comme zip sont assez intelligents pour se rendre compte que,
"Vous allez passer plus de bits de compression cela."
"Permettez-moi pas la peine de le comprimer pour vous à tous."
Donc, c'est juste une façon, puis de compresser au format texte.
Nous avons pu mettre quelque chose comme ça en C.
Par exemple, voici comment nous pourrions représenter un nœud dans cette arborescence
où nous avons un char pour le symbole, une valeur flottante pour la fréquence,
et comme nous l'avons vu de nos autres structures de données, 2 pointeurs,
1 à l'enfant à gauche, 1 à droite, soit de ce qui peut être NULL,
mais sinon, il se réfère à un enfant gauche et droit d'un enfant.
Donc, c'est alors le codage de Huffman, et c'est une des façons dont vous pouvez aller sur la compression d'information,
et c'est certainement l'un des plus faciles à mettre en œuvre
dans le contexte, disons, de structures de données de la semaine dernière,
si même les algorithmes plus sophistiqués existent
qui peut faire des mutations encore plus sophistiqués de vos données.
Toutes les questions, puis sur les arbres, arbres binaires, ou la compression de texte?
[L'élève] Y at-il une certaine ambiguïté, comme si la division [inaudible] dans 01,
puis 011 serait ambigu, non?
[Inaudible] >> Bonne question. L'ambiguïté.
Permettez-moi de résumer en se référant à ce tableau ici.
Parce que les caractères sont de compression, les représentations,
par définition de cet algorithme toujours les feuilles,
vous ne serez jamais accidentellement utiliser le même modèle de bits pour le préfixe de plusieurs lettres.
Donc, en d'autres termes, vous êtes préoccupé, il semble que, d'une ambiguïté qui se dégage
où 001 pourrait être le début de B ou le début de C ou quelque chose comme ça.
Mais cela ne peut pas être le cas puisque l'avis que toutes les lettres de l'alphabet, nous vous encodez
sont les feuilles.
>> L'ambiguïté ne peut se produire, comme dans le cas du code Morse,
si, par exemple, C est quelque part le long du chemin de la racine à B.
[L'élève] Droit. Donc, dans ce cas, par exemple A a 2 feuilles. Say A >> a - Répète un peu.
[L'élève] Say A dispose de 2 feuilles, F et G, puis G - >> Okay. Mais il ne peut pas.
A lui-même ne pouvait pas avoir les feuilles F et G, car ces lettres F et G
seraient eux-mêmes laisse quelque part sur la gauche de B ou le droit de E.
Donc, par définition, ils doivent être des feuilles.
Dans le cas contraire, vous avez parfaitement raison, nous n'avons pas résolu le problème que le code Morse est confrontée.
Bonne question. D'autres questions? Très bien.
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é
quand il est venu à la manipulation de ces 0 et de 1.
Nous avons demandé à ce sujet sur l'un des jeux plus anciens problèmes:
à savoir, comment allez-vous sur la conversion des majuscules en minuscules ou vice-versa?
Ou, plus concrètement, l'un de ces psets d'abord demandé
le nombre de bits que vous avez réellement à retourner pour changer A en minuscules ou vice-versa, un?
Voici un petit rappel de ce que 65 et 97 ressemblent en binaire.
Et même si cette question n'a sorte de fané dans votre mémoire,
vous pouvez voir à nouveau ici que le nombre de bits doivent être retournées
de changer majuscule en minuscule un? Juste un.
>> Ils ne diffèrent que par un seul endroit, le troisième bit de la gauche.
Tandis que A a un 010, un peu a un 011.
Donc, en quelque sorte, nous devons simplement être en mesure de retourner ce bit,
et on peut alors capitaliser ou minuscules.
Nous avons fait cela dans le passé de votre utilisation effective si les conditions
et de vérifier si la lettre est entre le capital et le capital A Z,
alors les sorties comme A - a + 26 ou quelque chose comme ça.
Vous avez probablement fait un changement arithmétique aux lettres de l'alphabet.
Mais que faire si nous pouvions retourner que d'un seul bit?
Comment pourriez-vous de prendre une valeur d'un octet de bits, 8 bits de sorte 01000001 et 01100001 comme?
Si vous avez eu ces schémas de bits, comment pouvons-nous faire pour changer un seul d'entre eux?
Que si l'on introduit en jaune ici cette autre motif de bits?
Si je fais les 0 chaînes entières jaunes, sauf pour le bit que je veux changer
puis-je introduire un nouvel opérateur connu comme un opérateur binaire -
utiliser l'opérateur dans le sens où il opère sur des bits individuels,
pas sur un octet entier ou quatre octets à la fois.
Cette barre verticale en jaune il suggère que si nous prenons la représentation du capital A
OU bit à bit et c'est avec la séquence de bits jaune?
En d'autres termes, pensez à notre discussion sur les expressions booléennes dans Scratch, puis en C.
>> Faire un booléen ou signifie que pour être vrai, que ce soit la première chose que doit être vrai
ou la deuxième chose doit être vraie ou ils ont tous deux pour être vrai,
puis le résultat obtenu est lui-même vrai.
Dans ce cas là, qu'est-ce que nous obtenons si nous prenons 0 "ou" ed avec 0? Faux ou faux?
C'est encore faux, de sorte que le reste a minuscule comme prévu.
Et si au lieu que nous faisons 1 ou 0?
Cela reste maintenant 1, mais remarquez ce qui va se passer ici.
Si nous commençons avec un capital A et nous continuons à »ou« ses bits individuels comme nous le faisons ici,
0 ou le jaune donne ce que nous ici? Cela nous donne 1.
En effet, supposons que nous ne savions pas ce que la version majuscule d'un peu en réalité.
Allons faire. Permettez-moi de passer ce retour ici.
Faisons-le à nouveau. 0 ou 0 me donne 0.
1 ou 0 me donne 1.
0 ou 1 me donne 1.
0 ou 0 me donne 0. Le prochain est 0, la suivante est 0, la suivante est 0.
1 ou 0 me donne 1.
Et même si nous ne savions pas à l'avance ce qui était une minuscule,
par un simple "ou" ing A avec ce modèle de bits que nous avons présentées ici en jaune,
vous pouvez minuscules un A majuscule en feuilletant ce bit.
Nous avons utilisé cette expression semaine il ya: en feuilletant un peu.
Comment faites-vous le faire par programmation?
Vous pouvez utiliser ce qui est généralement appelé un masque, une séquence de bits,
que dans ce cas se trouve juste à ressembler à ce nombre ici,
et puis vous "ou" c'est ainsi que l'utilisation de ce nouvel opérateur C,
pas | |, vous utilisez un seul | et vous voulez réellement obtenir cette réponse ici parce que pourquoi?
C'est l'endroit 1s, 2s lieu, 16s 4s, 8s,, 32s.
Ainsi, il s'avère que si vous prenez une lettre majuscule et un OU binaire avec elle l'entier 32,
parce que l'entier 32, lorsque vous le regardez comme bits, ressemble à ceci,
cela signifie que vous pouvez retourner le bit que vous voulez vraiment.
Et de même - et nous allons regarder le code dans un instant -
supposons que nous voulions aller l'autre sens.
>> Comment allez-vous de minuscule d'un capital à A? Le bit qui doit changer?
C'est le même.
Nous voulons changer cette troisième bit à partir d'un 1 à 0.
Et comment pourrions-nous le faire de manière?
Comment pouvons-nous arrêter un peu? Avec ce modèle de bits pourrions-nous arrêter un peu?
Et si nous trions inverti, le masque?
Alors qu'avant, nous avons fait le 0s masque tout entier jaune
sauf pour le bit nous avons voulu mettre en marche,
Et si cette fois, nous faisons le 1s masque tout entier, sauf pour le bit que nous voulons pour éteindre
puis utilisez quel opérateur?
Que faire si nous »et« les choses? Jetons un coup d'oeil.
Si maintenant nous retourner ce, supposons que je crée un nouveau masque c'est tout ce que 1s
sauf pour le bit celui que je veux pour éteindre
et puis au lieu de "ou" les chiffres blancs là-haut avec les chiffres jaunes ici-bas,
si je place "et" ensemble? C'est ce qu'on appelle une opération de bits et.
Logiquement, c'est la même chose que une valeur booléenne et.
Cela me donne 0 et 1 est 0. Donc, faux et vrai est faux.
Vrai et vrai est vrai.
Et voici la magie: Vrai et faux est maintenant faux, nous avons donc éteint ce bit.
Et maintenant, le reste de l'histoire est un peu simple.
Parce que le reste du masque est 1s, ce n'est pas grave ce que les chiffres sont en blanc.
Lorsque vous »et« quelque chose avec vrai, tu ne vas pas changer sa valeur.
Si c'est vrai, il restera fidèle. Si c'était faux, il restera faux.
>> Mais la magie opère quand vous prenez quelque chose qui était vrai
et que vous "et" avec fausse.
Cela a pour effet d'éteindre ce bit.
Ainsi, un peu cryptique là.
Nous allons effectivement regarder un peu de code, ce qui peut effectivement paraître encore plus énigmatique,
mais nous allons jeter un coup d'oeil ici à tolower.
Si je regarde tolower, passant de majuscule en minuscule a,
nous allons voir comment nous pourrions mettre en œuvre ce programme.
Voici principale, et ce n'est pas en prenant des arguments de ligne de commande.
Je déclare un caractère c pour la lettre que l'utilisateur va taper po
J'utilise ensuite un do while pour connaître assurez-vous que l'utilisateur donne certainement moi un grand A
ou B ou C. .. Z, alors ils me donner quelque chose entre A et Z.
Et maintenant ce que je fais ici?
Je suis "ou" ing cela avec 0x20, mais c'est en fait le même que celui -
et nous y reviendrons dans un instant - 32.
Encore une fois, ce modèle 32 est ici de bits. Pourquoi ne savons-nous?
Il suffit de penser à la semaine 0.
C'est l'endroit 1s, 2s lieu, 4s, 8s, 16s, 32s lieu.
Donc, ce nombre jaune se trouve être 32.
Je peux alors prendre une lettre comme le char ici, bit à bit "ou" c'est littéralement avec le numéro 32,
et que dois-je le récupérer? La version minuscule de ce char.
Il ya un moment, cependant, je l'exprime dans une note de base différente.
Qu'est-ce que cela représente? >> [L'élève] Hexadécimal.
[Malan] Ce qui se passe à représenter hexadécimal.
Nous n'avons pas parlé hexadécimal tant que ça,
mais c'est en fait pratique dans des cas comme celui-ci.
>> Même s'il semble plus complexe et même si elle ressemble à 20 et non 32,
il s'avère que hexadécimale est réellement superbe notation pratique
car en hexadécimal tous les chiffres après la 0x - et cela ne signifie rien;
ce n'est que convention humaine qui dit voici un nombre hexadécimal -
chacun de ces chiffres, le 2, puis le 0, eux-mêmes peuvent être représentés
avec exactement 4 bits.
Donc, si nous faisons cela, permettez-moi d'ouvrir un éditeur de texte ici - bizarre saisie semi-automatique -
si nous faisons un petit éditeur de texte ici, le nombre 0x20 signifie ici est de 4 bits, voici encore 4 bits.
Faisons les 4 premiers bits les plus à droite.
0 lorsque représenté avec 4 bits, c'est quoi? Super facile. Juste tous les 0.
Alors que les 4 bits 0.
Comment représentez-vous 2? Il a été un moment depuis que nous avons fait cela, mais c'est 0100.
Donc, c'est l'endroit 1s, c'est l'endroit 2s, puis ce n'est pas grave ce que les autres endroits sont.
En d'autres termes, en hexadécimal 0x20 pourrait-on dire,
mais si vous pensez alors à ce qui est le 2 et comment est-il représenté en binaire,
quel est le 0 et comment est-il représenté en binaire,
les réponses à ces questions sont ceci et cela, respectivement.
Alors 0x20 arrive à représenter ce modèle de 8 bits,
ce qui est précisément le masque que nous voulions.
Il s'agit donc pour le moment seulement un exercice intellectuel,
mais la réalité est dans le code il est généralement plus fréquente pour écrire des constantes comme celui-ci
en hexadécimal, car alors le programmeur peut relativement facilement,
même si cela nécessite un peu de papier et un crayon, comprendre ce que ce modèle de bits est
parce que vous ne pouvez pas exprimer 0s et 1s généralement dans le code.
Vous ne pouvez pas aller 00010 et ainsi de suite.
>> Vous devez choisir notations décimales ou hexadécimale ou octale ou autre.
La plupart des gens ont tendance à choisir hexadécimal simplement pour que chaque chiffre représente 4 bits
et vous pouvez faire ce calcul rapide.
Et je vais agiter ma main à toupper, ce qui est presque la même, elle est presque identique.
Toupper arrive de ne pas utiliser l'opérateur ou plutôt cet homme et df.
Qu'est-ce que df représentent-ils? df? N'importe qui? >> [L'élève] 255.
255? Non 255. Ce serait ff.
Nous allons laisser celui-ci comme un peu d'exercice.
Mais si vous passez de 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 et ce qui vient après 9?
Nous sommes en quelque sorte en dehors de chiffres après la virgule, mais en hexadécimal ce qui vient après 9?
[L'élève] a. Alors >> a, b, c, d.
Vous pouvez imaginer à partir de là ce modèle de bits d représente réellement.
Et si on fait le calcul, nous allons voir que le masque que vous finissez par être de retour est identique à cela.
C'est f, tous les 1, et c'est d. Donc df représente ce masque. Très bien.
Et enfin, ne pas faire de bruit choses super, super technique,
mais supposons que nous voulions écrire un programme qui fait ça.
Permettez-moi aller de l'avant et de faire binaire, qui est un programme dans un fichier appelé binary.c.
Et maintenant, laissez-moi courir binaire et me donner un entier non négatif.
Commençons facile et tapez 0.
C'est maintenant un programme qui affiche un nombre entier dans sa représentation binaire.
Donc, si je joue ce jeu à nouveau et tapez en 1, je devrais obtenir une représentation 32-bit sur 1.
Si je fais ça encore une fois avec 2, je devrais obtenir cela.
Si je fais 7, je devrais obtenir un peu de 1s à la fin et ainsi de suite.
Il s'avère que je mentionne cela parce que des opérations binaires
vous pouvez réellement faire autre chose aussi.
Vous pouvez créer ces masques dynamiquement.
Jetez un oeil à cet exemple une finale impliquant des opérations binaires.
Voici la première partie du code, demander à l'utilisateur un certain nombre,
et il insiste sur le fait que vous me donnez un entier non négatif.
Donc, c'est une sorte de trucs old school.
Mais voici quelque chose qui est assez intéressant.
>> Comment puis-je faire pour imprimer un nombre en binaire?
J'ai d'abord effectuer une itération de quoi à quoi?
Quelle est la taille d'un int en général, au moins dans l'appareil? >> [L'élève] 4.
Il est 4. Donc 4 * 8 est de 32 - 1 est 31.
Donc, si je commence à compter à partir de 31, qui représente, il s'avère,
seulement conceptuellement, le bit 31ème ou le bit de premier ordre, qui est ce gars là-bas,
considérant que cela va être le bit 0.
C'est donc le bit 01 ... bit 31.
Donc ce qui est de ce code fait?
Notez que cette boucle for, même s'il semble énigmatique, est tout simplement une itération de 31 à 0. C'est tout.
Donc, maintenant la partie intéressante doit être dans ces 5 lignes ici.
Notez que dans cette ligne, je suis déclarant un masque variable appelée
d'être cohérent avec notre histoire de ces chiffres jaunes.
Et puis, ce qui est ce que ça fait?
C'est un autre opérateur de bits que nous avons jamais vu auparavant, le plus probable.
C'est l'opérateur de décalage à gauche.
Cet opérateur fait cela.
Voici le numéro 1, et si vous le faites, j'ai laissé déplacement, décalage vers la gauche,
que pensez-vous qui a pour effet de faire pour que 1 individu?
Littéralement, il évolué au cours de.
Donc, si le nombre 1 est ce que vous avez sur la gauche et vous commencez par initialiser i à 31,
ce qui est ce que cela va faire? Il va prendre ce numéro 1 et décaler il 31 places ici.
Et parce qu'il n'y a évidemment pas d'autres chiffres derrière elle,
ceux qui, par défaut, être remplacés par des 0.
Ainsi, vous aurez commencer par le numéro 1, ce qui bien sûr ressemble à ceci -
et permettez-moi de le dessiner ici dans le centre.
Et puis vous passez les choses vers la gauche, ce gars va essentiellement de cette façon.
Mais dès que vous le faites, un 0 est rempli po
Si vous passez une seconde fois, il va de cette façon et un autre 0 est rempli po
>> Vous le déplacer à nouveau, puis un autre 0 est rempli po
Donc, si vous faites cette chose de 1 << i 31 places, vous finissez par avoir un masque
qui est de 32 caractères de long, le plus à gauche de une, qui est un 1,
tous les autres qui sont 0.
Et il se trouve, soit dit en passant, le déplacement d'un nombre à gauche comme ceci
également par hasard, et parfois commode,
a pour effet de faire quoi ce numéro? >> [L'élève] il Doublement.
Le doubler, car chacune des colonnes - le lieu 1s, 2s lieu, le lieu 4s,
Lieu 8s, 16s endroit - ils sont tous doublement que vous allez à gauche.
Ou plutôt, quand vous déplacez le 1s vous allez finir par doubler la valeur du nombre.
Vous pouvez finir par faire des transformations intéressantes des chiffres
en déplaçant tout au cours de cette façon par des puissances de 2.
Alors, comment ça marche?
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,
et puis cette expression, qui est volé toupper.c,
dit simplement prendre le nombre n que l'utilisateur a tapé dans,
"Et" avec ce masque, et qu'allez-vous obtenir?
Vous allez obtenir un 1 s'il ya un 1 dans cet endroit masqué,
ou vous allez obtenir un 0 s'il n'y est pas.
Et si tout ce programme ne soit effectivement il a une boucle,
et il crée un masque avec un 1 ici, puis un 1 ici, puis un 1 ici,
et il utilise cette astuce ET bit à bit-à-dire est-il un bit 1 dans l'entrée utilisateur ici?
>> Y at-il un bit 1 dans l'entrée utilisateur ici? Et si oui, littéralement imprimer 1, else print 0.
Nous faisons cela avec ints juste parce que c'est pour cela que nous faisons 32 bits au lieu de 8,
mais ce que nous avons mis en place est donc cette opération AND binaire, ce bit à bit OU,
et cet opérateur de décalage à gauche, qui ne sont pas souvent terriblement utile,
mais il s'avère qu'ils peuvent être.
En fait, si vous étiez à représenter quelque chose comme un tableau de booléens
juste pour représenter vrai ou faux, supposons que vous vouliez garder la trace de si oui ou non
une salle pleine de 300 élèves est présente,
vous pouvez déclarer un tableau de taille 300 de type bool sorte que vous obtenez 300 bools,
et vous pouvez régler chaque valeur true si quelqu'un est là et false sinon.
Pourquoi est-ce que la représentation de cette structure de données efficace?
Ce qui est mauvais à propos de la conception de cette structure de données, un tableau de 300 bools?
Qu'est-ce qu'un bool, en effet, sous le capot?
Cela aussi, c'est quelque chose qui pourrait ne pas être familier.
Il s'avère qu'il ya pas de bool.
N'oubliez pas que nous sorte de création que le fichier cs50.h,
qui se comporte en standard un bool.
C est un peu idiot, mais, quand il s'agit de bool.
Il utilise 8 bits pour représenter chaque bool, ce qui est tout à fait inutile
car il est évident, combien de bits devez-vous représenter un bool? Juste 1.
Ainsi, il s'avère que si vous avez maintenant la possibilité avec les opérateurs bit à bit
pour manipuler les bits individuels, même dans un char, même dans un seul octet,
il s'avère que vous pourrait diminuer la mémoire nécessaire pour représenter quelque chose de stupide
comme cette structure de données présents style d'un facteur 8.
Au lieu d'utiliser huit bits pour représenter vrai ou faux, vous pouvez littéralement utiliser un
en utilisant un seul octet pour huit élèves dans la classe
et de basculer de 0 à 1 des bits individuels en utilisant ce genre de trucs de bas niveau.
C'est vraiment mettre un terme à l'énergie. Y at-il des questions au sujet des opérations binaires?
>> Ouais. >> [L'élève] Y at-il un opérateur ou exclusif?
Oui. Il est un opérateur exclusif ou qui ressemble à ceci, ^, le symbole carotte,
ce qui signifie que la première chose ou le deuxième élément peut être un 1 pour la production d'un 1.
Il ya aussi un pas, ~, ce qui vous permettra d'inverser une 0 à 1 ou vice versa ainsi.
Et il ya aussi un opérateur de décalage vers la droite, >>, qui est à l'opposé de celui que nous avons vu.
Très bien. Prenons les choses maintenant à un niveau supérieur.
Nous avons commencé par parler du texte, puis en le comprimant
et qui représente le texte avec un nombre réduit de bits;
nous avons un peu parlé de la façon dont nous pouvons maintenant commencer à manipuler les choses à un niveau binaire.
Nous allons maintenant faire un zoom avant jusqu'à 10.000 pieds à la représentation
des choses plus complexes comme les graphiques.
Ici, nous avons un drapeau de l'Allemagne, nous avons ici celui de la France.
Celles-ci peuvent être représentés dans des formats de fichiers que vous connaissez peut-être - GIF, par exemple.
Si vous avez déjà vu une image sur le Web se terminant par. Gif,
il s'agit d'un format d'échange de graphiques.
Ces deux drapeaux sorte d'ici se prêtent à la compression
pour ce que peut-être évident pourquoi? >> [Réponse de l'élève inaudible]
Il ya beaucoup de répétitions, non?
Pour envoyer drapeau de l'Allemagne, penser à cela comme étant une image sur l'écran
sauvegarder dans vos journées à gratter.
Vous vous rappelez peut qu'il y ait des pixels individuels ou des points qui composent une image.
>> Il ya toute une rangée de points noirs et une autre rangée de points noirs.
Il ya un tas de rangées de points noirs que nous puissions voir si nous avons vraiment un zoom avant,
un peu comme quand on zoom sur le visage de Rob dans Photoshop.
Dès que nous sommes arrivés plus en plus profond et plus profond dans l'image,
vous commencé à voir la pixellisation, tous les carrés qui composent son oeil dans ce cas.
Même affaire ici. Si l'on zoom un peu, vous verrez les points individuels.
Eh bien, c'est un peu un gaspillage de bits.
Si un tiers de l'indicateur est de couleur noire et un tiers de l'indicateur est jaune et ainsi de suite,
pourquoi ne pouvons-nous pas en quelque sorte comprimer ce drapeau?
Et même le drapeau français pourrait être compressé, même si le motif est un peu différent.
Il s'avère que le format de fichier GIF est un format de compression sans perte,
ce qui signifie que vous pouvez prendre une photo comme le drapeau allemand ici,
vous pouvez jeter un grand nombre de ses bits sans sacrifier la qualité.
Ceci est en contraste avec quelque chose comme JPEG,
avec laquelle la plupart d'entre nous sont probablement plus familiers.
Facebook des photos et des photos Flickr et autres
sont presque toujours enregistrés en tant que fichiers JPEG quand ils sont téléchargés,
mais JPEG est une perte - format dans lequel vous ne jetez bits - LOSSY
mais vous pouvez également jeter qualité.
Et si vous compressez des photos avec Photoshop ou les télécharger sur Facebook
ou les prendre sur un téléphone vraiment la merde,
vous savez que l'image commence à devenir très tachée et pixélisée,
et c'est parce qu'elle est comprimée par l'ordinateur ou par téléphone
par littéralement jeter information loin.
Mais GIF est étonnant en ce sens qu'il peut utiliser moins de bits que cela pourrait par défaut
sans perte d'information.
>> Et il le fait essentiellement de manière suivante.
Plutôt que de stocker dans un fichier comme un BMP serait un triplet RVB en noir, noir, noir, noir,
noir, noir, noir, noir, noir, noir, noir, noir et ainsi de suite,
plutôt, le format GIF va dire, "Noir",
puis, «Répétez cette opération 100 fois», ou quelque chose comme ça.
"Noir, répéter cette opération à 100 reprises, noir, répéter cette opération 100 fois ..."
"Jaune, répéter cette opération 100 fois."
Et il se souvient, pour l'essentiel, le pixel le plus à gauche
et puis encode en quelque sorte la notion de répéter ce pixel, encore et encore.
Ainsi, les fichiers GIF peuvent alors se compresser sans perte d'information.
Mais si vous aviez à deviner, si ce n'est l'algorithme qui Gifs utilisation,
laquelle de ces drapeaux, même si elles semblent identiques en taille,
va être plus faible lors de l'enregistrement sur le disque au format GIF? >> [L'élève] en Allemagne.
L'Allemagne va être plus petit? Pourquoi?
[L'élève] Parce que vous le répéter de nombreuses fois horizontalement
et puis vous répéter une autre fois. >> Exactement.
Parce que les gens qui ont inventé GIF juste un peu arbitrairement décidé de
que la répétition sera mise à profit horizontalement et non latéralement.
Il ya répétition beaucoup plus latéralement ici dans le drapeau allemand que dans le drapeau français.
Donc, si nous avons effectivement ouvrir un dossier sur mon disque dur qui possède ces images GIF,
vous pouvez réellement voir que le drapeau allemand ici est de 2 kilo-octets et la française est de 4 kilo-octets.
Il arrive à être une coïncidence que l'on est double de l'autre,
mais c'est en fait le cas que le drapeau français est beaucoup plus grande.
>> Même si nous parlons ici de graphiques, les mêmes idées peuvent s'appliquer à
pas des choses comme des drapeaux mais des images qui sont un peu plus complexes.
Si vous prenez une photo d'une pomme, il ya sûrement beaucoup de doubles emplois là-bas,
si nous pouvions oublier que l'arrière-plan par défaut est bleu
et non, comme l'image de droite indique,
faut se rappeler la couleur de chaque pixel dans l'image.
Ainsi, nous pouvons jeter les bits de suite là-bas sans perte d'information.
La pomme a toujours l'air tout de même.
Dans cet exemple ici, vous pouvez voir ce qui se passe dans un film.
Celles-ci représentent bobines de film old-school où dans l'image du haut il
vous avez une conduite RV devant une maison et un arbre.
Et comme cette camionnette passe devant, de gauche à droite, ce qui évidemment ne change pas?
La maison ne va nulle part, et l'arbre ne va nulle part.
La seule chose qui bouge est le van dans ce cas.
Donc comme fond d'Inchangé indique, ce que vous pouvez faire dans les films
est même simplement jeter informations qui ne change pas entre les couples.
Ceci est généralement connu sous le nom compression inter-
de sorte que si ce cadre est presque identique à celui-ci,
il ne faut pas déranger le stockage sur disque l'une des informations identiques
sur ces cadres intermédiaires, nous allons uniquement utiliser des images clés de temps en temps
qui en fait stocker ces informations de manière redondante comme un peu de raison vérifier.
>> En revanche, une autre approche à la vidéo de compression est dans ce deuxième exemple, plus bas ici,
où plutôt que de stocker 30 images, pourquoi ne pas simplement stocker 15 images par seconde au lieu?
Plutôt que le genre film de couler à merveille, parfaitement,
il pourrait ressembler à ça un peu le bégaiement, une petite vieille école,
mais l'effet net sera d'utiliser des bits beaucoup moins qu'on ne pourrait autrement nécessaires.
Alors, où puis-ce que cela nous mène?
C'était un peu un côté de l'endroit où vous pouvez aller ailleurs avec la compression.
Pour en savoir plus à ce sujet, prendre une classe comme CS175 ici.
Voici un autre exemple dans la vidéo.
Si l'abeille est la seule chose en mouvement,
vous pouvez vraiment jeter informations contenues dans ces cadres du milieu
parce que la fleur et le ciel et les feuilles ne changent pas.
Mais nous allons maintenant examiner une dernière chose.
Dans les 5 prochaines minutes nous laissons derrière eux pour toujours dans C conférence? Oui. Pas dans les psets, cependant.
Dernière histoire à propos de C, puis on arrive à des choses très sexy
impliquant HTML et Web et woo-hoo. Très bien.
Nous y voilà. C'est la motivation.
Il s'avère tout ce temps où nous avons été l'écriture de programmes que nous gérons Clang.
Et Clang, nous l'avons dit depuis la première semaine à peu près, prend le code source
et le convertit en un code objet.
Il faut C et le convertit en 0 et de 1.
J'ai été genre de mentir à vous pour quelques semaines car il n'est pas aussi simple que cela.
>> Il ya beaucoup plus de choses sous le capot lorsque vous exécutez un programme comme Clang.
En fait, le processus de compilation d'un programme peut vraiment se résumer,
comme vous vous en souvenez de la vidéo de Rob sur des compilateurs,
dans ces 4 étapes: pré-traitement, elle-même la compilation, l'assemblage et la liaison.
Mais nous en classe et la plupart des gens dans le monde typiquement résumer l'ensemble de ces étapes
simplement «compilation».
Mais si nous commençons avec le code source de ce genre, c'est peut-être rappeler le programme le plus simple C
nous avons écrit jusqu'ici, rappelons que lors de la compilation il finit par ressembler à cela.
Mais il ya en fait une étape intermédiaire, et ces étapes sont les suivantes.
D'abord il ya cette chose au sommet de cela et la plupart de nos programmes,
# Include
Qu'est-ce que # include faire pour nous?
Il exemplaires assez bien et colle le contenu du stdio.h dans mon fichier de sorte que pourquoi?
Pourquoi dois-je entretenir sur le contenu de stdio.h? Qu'y at-il de l'intérêt?
Printf de déclaration, son prototype, de sorte que le compilateur sait alors ce que je veux dire
quand je mentionne cette fonction printf.
Ainsi, l'étape 1 de la compilation est pré-traitement, de sorte qu'un programme comme Clang
ou un programme d'aide qui Clang est livré avec lit votre code de haut en bas,
de gauche à droite, et à chaque fois qu'il voit un symbole # suivi d'un mot-clé comme include,
il effectue cette opération, copier et coller dans ce cas stdio.h dans votre fichier.
C'est l'étape 1.
Ensuite, vous avez un fichier beaucoup plus gros C en raison de la copie énorme d'emplois coller ce qui vient d'arriver.
>> Etape 2 est en train de compiler.
Mais il s'avère que la compilation prend le code source qui ressemble à ceci
et le transforme en quelque chose qui ressemble à ceci,
qui, pour ceux qui connaissent s'appelle? >> [L'élève] Assemblée. Langage d'assemblage. >>
C'est vraiment quelque chose si vous prenez CS61 vous plonger dans plus en détail.
C'est à peu près aussi proche que vous pouvez obtenir à l'écriture de 0 et de 1-même
mais écrire les choses de telle manière qui rend encore au moins un peu de bon sens.
Ce sont des instructions de la machine, et si nous faites défiler jusqu'à la fonction principale ici,
remarquerez qu'il ya cette instruction poussée, déplacez l'instruction, il faut soustraire l'instruction,
appeler l'instruction, et ainsi de suite.
Lorsque vous entendez que votre ordinateur dispose d'Intel à l'intérieur,
vous avez un processeur Intel à votre Mac ou PC, ça veut dire quoi?
Un processeur est intégré par des sociétés comme Intel comprendre certaines instructions.
Ils n'ont aucune idée de ce qui fonctionne comme swap sont ou principale sont en soi,
mais ils ne savent ce très faible niveau des instructions comme additionner, soustraire, pousser,
déplacer, appeler, et ainsi de suite sont.
Ainsi, lorsque vous compilez le code C en langage d'assemblage,
votre très convivial prospectifs code est converti en quelque chose qui ressemble à ceci,
qui se déplace littéralement octets ou 4 octets autour de ces petites unités et en dehors de la CPU.
Mais enfin, quand Clang est prêt à prendre cette représentation de votre programme
en 0 et de 1, puis l'étape de montage se produit appelé,
et cette fois tout se passe en un clin d'œil lors de l'exécution Clang.
Nous commençons ici, il génère un fichier comme celui-ci, puis il le convertit ces 0 et de 1.
Et si vous voulez revenir à un moment donné et de voir cela en action,
si je vais dans hello1.c--c'est l'un des tout premiers programmes que nous avons examinés -
normalement nous compiler ce hello1.c avec Clang et cela nous donnerait a.out.
Si par contre vous, au lieu de lui donner l'option-S, ce que vous obtenez est hello1.s
et vous allez vraiment voir le langage d'assemblage.
>> Je fais cela pour un programme très court, mais si vous allez revenir pour Scramble
ou récupérer ou tout programme que vous avez écrit et juste par curiosité
voulez voir à quoi il ressemble réellement, ce qui est effectivement introduite dans la CPU,
vous pouvez utiliser cette option-S avec Clang.
Mais enfin, il ya toujours une chasse aux sorcières.
Voici le 0 et de 1 qui représentent mon implémentation de bonjour, monde.
Mais j'avais l'habitude de quelqu'un d'autre fonction dans mon programme.
Ainsi, même si le processus a été je prends hello.c,
il se compile en code assembleur, puis il obtient assemblés en 0 et de 1,
le seul 0 et de 1 qui sont délivrés à ce moment-là
sont celles qui résultent de mon code.
Mais la personne qui a écrit printf, ils ont compilé leur code il ya 20 ans
et il est maintenant installé quelque part sur l'appareil,
nous ont en quelque sorte à fusionner 0s ses 1s et avec mon 0 et de 1,
et qui nous amène à l'étape 4e et dernière compilation, connu sous le nom de liaison.
Ainsi, sur le côté gauche nous avons le tableau exactement la même que précédemment:
hello.c devient le code assembleur devient 0 et de 1.
Mais rappelez-vous que j'ai utilisé la norme bibliothèque E / S dans mon code,
et cela signifie que quelque part sur l'ordinateur, il ya un fichier appelé stdio.c
ou au moins la version compilée de celle-ci parce que quelqu'un il ya quelques années
compilé en code assembleur stdio.c puis tout un tas de 0 et de 1.
C'est ce qui est connu comme un statique ou une bibliothèque dynamique.
C'est un fichier assis quelque part dans l'appareil.
>> Mais enfin, je dois prendre mon 0s et 1s et cette personne 0s et 1s
et en quelque sorte les relier entre eux, littéralement ceux qui combinent 0 et de 1
dans un seul fichier appelé a.out ou hello1 ou quoi que j'ai appelé mon programme
de sorte que le résultat final a toutes les 1s et 0s qui devrait composent mon programme.
Donc tout ce temps ce semestre lorsque vous avez été en utilisant Clang
et même plus récemment de lancer make pour exécuter Clang,
toutes ces mesures ont été se passe en quelque sorte instantanément, mais tout à fait délibérément.
Et si vous continuez à en informatique, à savoir CS61,
c'est la couche que vous allez continuer à peler off il
parle d'efficacité, conséquences sur la sécurité, etc de ces détails de niveau inférieur.
Mais avec cela, nous sommes sur le point de quitter C derrière.
Allons de l'avant et de prendre notre pause de 5 minutes maintenant,
et quand nous reviendrons: l'Internet.
Très bien. Nous sommes de retour.
Maintenant, nous commençons notre regard non seulement au HTML, car, comme vous le verrez,
HTML lui-même est en fait assez simple
mais vraiment à la programmation web, plus généralement, la mise en réseau de façon plus générale,
et comment toutes ces technologies se rejoignent
pour nous permettre de créer des programmes beaucoup plus sophistiqués au-dessus de l'Internet
à ce jour, nous avons pu dans ces fenêtres en noir et blanc.
En effet, à ce point au cours du semestre, même si nous allons passer du temps relativement moins
sur PHP, HTML, CSS, JavaScript, SQL et plus,
la plupart des étudiants ne finissent par faire des projets finaux qui sont basé sur le Web
parce que, comme vous le verrez, l'arrière-plan, vous avez maintenant dans C
est tout à fait applicables à ces langues de niveau supérieur.
>> Et comme vous commencez à penser à votre projet final,
qui, à l'instar 0 Régler un problème, où vous avez été encouragé
de faire quoi que ce soit plus d'intérêt pour vous dans Scratch,
le projet final est pour vous l'occasion de prendre vos nouvelles connaissances et de bon sens avec C
ou PHP ou JavaScript ou similaires sur un tour
et de créer votre propre morceau de logiciel pour le monde de voir.
Et pour vous semence d'idées, sachez que vous pouvez vous diriger ici, projects.cs50.net.
Chaque année, nous sollicitons les idées des professeurs et du personnel et des groupes d'étudiants sur le campus
simplement à soumettre leurs idées pour des choses intéressantes qui pourraient être résolus à l'aide d'ordinateurs,
utilisant les sites Web, en utilisant le logiciel.
Donc, si vous avez du mal à trouver une idée de votre propre,
par tous les moyens de faire défiler les idées il ya à partir de cette année et le dernier.
Il est parfaitement possible de s'attaquer à un projet qui a été abordé auparavant.
Nous avons vu de nombreuses applications pour voir le statut de linge sur le campus,
de nombreuses applications pour naviguer dans le menu de la salle à manger,
de nombreuses applications pour naviguer dans le catalogue de cours, etc.
Et en effet, lors d'une conférence avenir et à des séminaires à venir,
nous allons vous présenter certaines API accessibles au public, à la fois disponibles dans le commerce
comme ici disponible à partir CS50 sur le campus afin que vous ayez accès aux données
et peut ensuite faire des choses intéressantes avec lui.
Donc plus sur les projets définitifs dans quelques jours lorsque nous publierons la spécification,
mais pour l'instant, sachez que vous pouvez travailler seul ou avec un ou deux amis
sur la plupart des projets d'intérêt pour vous.
L'Internet.
Allez-y et sortez votre ordinateur portable, vous allez à facebook.com pour la première fois,
ne pas avoir connecté récemment, et appuyez sur Entrée. Qu'est-ce qui se passe exactement?
>> Lorsque vous appuyez sur Entrée sur votre ordinateur, tout un tas d'étapes
commencer sorte de magie qui se passe.
Alors vous ici sur la gauche, le serveur web comme Facebook est mis ici sur la droite,
et en quelque sorte vous utilisez ce langage appelé HTTP, Hypertext Transfer Protocol.
HTTP n'est pas un langage de programmation. Il s'agit plutôt d'un protocole.
Il s'agit d'un ensemble de conventions que les navigateurs Web et les serveurs Web utilisent lors d'intercommunication.
Et qu'est-ce que cela signifie est comme suit.
Tout comme dans le monde réel, nous avons ces conventions
où si vous répondez à certains humains pour la première fois, si vous ne me dérange pas moi humoring ici,
Je pourrais venir à vous, dites: «Salut, mon nom est David." >> Salut, David. Mon nom est Sammy.
"Salut, David. Mon nom est Sammy."
Alors maintenant, nous venons engagés dans ce type de protocole de l'homme stupide
où j'ai initié le protocole, Sammy a répondu,
nous avons serré la main, et la transaction est terminée.
HTTP est très similaire dans son esprit.
Lorsque vos demandes du navigateur Web www.facebook.com,
ce que votre navigateur fait vraiment tend la main, pour ainsi dire,
au serveur et il lui envoyant un message.
Et ce message est généralement quelque chose comme faire - qu'est-ce que vous voulez? -
me la page d'accueil, ce qui est généralement représenté par une barre oblique à la fin d'une URL.
Et juste pour que vous sachiez quelle langue je parle, je le navigateur vais vous dire
que je parle la version HTTP 1.1,
Et aussi pour faire bonne mesure, je vais vous dire que l'accueil que je veux la page d'accueil
est facebook.com.
En règle générale, un navigateur Web, à votre insu, les ressources humaines,
envoie ce message à travers l'Internet lorsque vous tapez simplement www.facebook.com,
>> Entrez, dans votre navigateur.
Et qu'est-ce que Facebook répondre avec?
Il répond avec quelques détails d'aspect semblable cryptiques, mais aussi beaucoup plus.
Permettez-moi aller de l'avant à la page d'accueil de Facebook en cliquant ici.
C'est l'écran que la plupart d'entre nous sans doute jamais si vous restez connecté tout le temps,
mais c'est bien leur page d'accueil.
Si nous faisons cela dans Chrome, notez que vous pouvez tirer de ces petits menus contextuels.
En utilisant Chrome, que ce soit sur Mac OS, Windows, Linux, ou autre,
Si vous contrôlez un clic ou clic gauche, vous pouvez généralement tirer vers le haut un menu qui ressemble à ceci,
où attendent quelques options, dont l'une est source de la page.
Vous pouvez également obtenir généralement à ces choses en allant dans le menu Affichage et fureter partout.
Par exemple, ici sous Affichage, Développeur c'est la même chose.
Je vais aller de l'avant et de regarder source de la page.
Ce que vous voyez est le code HTML que Mark a écrit pour représenter facebook.com.
C'est un désordre complet ici, mais nous allons voir ce que cela a un sens un peu plus avant longtemps.
Mais il ya certaines tendances ici. Permettez-moi de faire défiler vers le bas pour des trucs comme ça.
Il est difficile pour un être humain de lire, mais remarquerez qu'il ya ce modèle de chevrons
avec des mots clés comme option, mots-clés comme valeur, certaines chaînes entre guillemets.
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.
Ce menu déroulant des années de naissance est en quelque sorte codée ici
dans cette langue appelé HTML, Hypertext Markup Language.
En d'autres termes, quand votre navigateur demande une page Web,
il parle de cette convention appelée HTTP.
Mais qu'est-ce que facebook.com répondre à cette demande avec?
>> Il répond avec certains de ces messages cryptiques, comme nous le verrons dans un instant.
Mais la plupart de sa réponse est dans la forme de HTML, Hypertext Markup Language.
C'est le langage réel dans lequel une page web est écrite.
Et quel navigateur ne puis vraiment dire, lors de la réception de quelque chose qui ressemble à ceci,
le lit de haut en bas, de gauche à droite, et à chaque fois qu'il voit un de ces chevrons
suivi d'un mot-clé comme option, il affiche ce langage de balisage de la manière appropriée.
Dans ce cas, il affiche un menu déroulant d'années.
Mais encore une fois, c'est un désordre complet à regarder.
Ce n'est pas parce que les développeurs Facebook manifestent 0 pour 5 pour le style, par exemple.
C'est parce que la plupart du code qu'ils écrivent est, en fait, écrit magnifiquement,
bien commenté, bien indenté, et autres,
mais des machines de cours, les ordinateurs, les navigateurs vraiment rien à foutre
si votre code est bien coiffés.
Et en fait, c'est tout à fait inutile de frapper la touche de tabulation toutes ces fois
et de mettre des commentaires tout au long de votre code et de choisir des noms de variables descriptives vraiment
parce que si le navigateur ne se soucie pas, tout ce que vous faites à la fin de la journée est de perdre octets.
>> Ainsi, il s'avère que la plupart des sites ne sont même si le code source pour facebook.com,
pour cs50.net et toutes ces autres sites Web sur Internet
sont généralement bien écrit et bien commenté et bien en retrait et similaires,
généralement avant le site Web est mis sur l'Internet, le code est minified,
laquelle le HTML et le CSS - quelque chose d'autre nous le verrons bientôt -
le code JavaScript que nous allons bientôt voir est comprimé,
de sorte que les noms de variables deviennent longues X et Y et Z,
et tout cela espaces qui rend tout l'air si lisible est tout jeté,
parce que si vous pensez cela de cette façon, Facebook obtient une page milliards frappe un jour -
quelque chose de fou comme ça - tant pis si un programmeur juste pour être anale
appuyez sur la barre d'espace une fois supplémentaire juste pour indenter une ligne de code tellement plus?
Quelle est la conséquence si Facebook conserve que les espaces
dans tous les octets qu'ils renvoient à des gens sur Internet?
Frapper la barre d'espace une fois que vous donne un octet supplémentaire dans votre fichier.
Et si un milliard de personnes, puis procéder au téléchargement de la page d'accueil de ce jour-là,
quelle quantité de données avez-vous transmis sur l'Internet?
Un gigaoctet sans raison valable.
Et a accordé, pour un grand nombre de sites, ce n'est pas une question aussi évolutive,
mais pour Facebook, pour Google, pour certains des sites Web les plus populaires
il ya une grande incitation financière pour rendre votre code ressemble à un gâchis
de sorte que vous utilisez comme quelques octets que possible, en plus de la compression puis
en utilisant quelque chose comme zip, un algorithme appelé gzip,
que le navigateur fait pour vous automatiquement. Mais c'est terrible.
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
si nous devons le regarder comme ça.
>> Donc, heureusement, les navigateurs comme Chrome et IE et Firefox nos jours
généralement livrés avec des outils de développement intégrés.
En fait, si je descends ici pour Inspectez élément ou si je vais à Voir, développeur,
et allez dans Outils développeur explicitement,
cette fenêtre au bas de mon écran apparaît maintenant.
C'est un peu intimidant au premier abord, car il ya beaucoup d'onglets inconnus ici,
mais si je clique sur les éléments tout le chemin en bas à gauche,
Chrome est évidemment très intelligent. Il sait comment interpréter tout ce code.
Et donc ce que Chrome fait est qu'il nettoie tout l'HTML Facebook.
Même s'il n'y a pas de blancs là-bas, il n'y a pas indentation là,
remarque maintenant que je peux commencer à naviguer sur cette page web d'autant plus hiérarchique.
Il s'avère que chaque page écrite dans un langage appelé HTML 5 devrait commencer par cela,
cette déclaration DOCTYPE, pour ainsi dire: <! DOCTYPE html>
C'est une sorte de clair et gris, mais c'est la toute première ligne de code dans ce fichier,
et qui raconte simplement le navigateur, "Hey, voici quelques HTML5. Voici une page Web."
La première tranche ouverte au-delà de ce qui se passe à cette chose, une parenthèse ouverte balise HTML,
et puis si je plonge plus profondément - ces flèches sont complètement dénuée de sens;
ils sont juste pour l'amour de la présentation, ils ne sont pas réellement dans le fichier -
remarquerez que l'intérieur de la balise HTML de Facebook, tout ce qui commence par un crochet ouvert
et a ensuite un mot est appelé une étiquette.
Donc à l'intérieur de la balise HTML est apparemment un tag tête et une balise body.
A l'intérieur de la balise head est maintenant un gâchis pour Facebook
parce qu'ils ont beaucoup de métadonnées et d'autres choses pour le marketing et la publicité.
>> Mais si nous défiler vers le bas, bas, bas, bas, nous allons voir où il est. Ici, il est.
Celui-ci est au moins un peu.
Le titre de la page d'accueil de Facebook, si jamais vous regardez dans l'onglet dans la barre de titre,
Bienvenue sur Facebook est - Connexion, Inscription ou En savoir plus.
C'est ce que vous verriez dans la barre de titre de Chrome,
et voilà comment il est représenté dans le code.
Si l'on ignore tout le reste dans la tête, la plupart des entrailles d'une page web sont dans le corps,
et il s'avère que le code de Facebook va se pencher plus complexe
que la plupart des choses que nous écrirons d'abord simplement parce qu'il a été construit au fil des ans,
mais il ya tout un tas de balises de script, le code JavaScript,
qui rend le site très interactif:
voir instantanément mises à jour de statut en utilisant des langages tels que JavaScript.
Il ya quelque chose qui s'appelle un div, qui est une division d'une page.
Mais avant d'arriver à ce détail, nous allons essayer de faire un zoom arrière
et regardez une version simplifiée de Facebook 1.0, pour ainsi dire.
Voici le bonjour, monde de pages Web.
Il a cette déclaration DOCTYPE au sommet
qui est un peu différent de tout le reste.
Rien d'autre que nous écrivons dans une page web va commencer par <! sauf que la ligne il
et sauf pour ce qu'on appelle des commentaires en HTML.
Mais la plupart du temps, le tout dans une page Web est ouverte support, mot-clé, ferme la parenthèse.
>> Dans ce cas, vous pouvez voir la plus simple des pages Web possibles.
La balise HTML contenant une balise tête et il contient une balise body,
mais remarquez qu'il ya cette notion de démarrage et d'arrêt des tags.
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.
Remarquez qu'ils sont en quelque sorte des contraires dans le sens que la balise de fermeture ou de balise de fin
a cette barre oblique à l'intérieur de lui-même.
Pendant ce temps, il ya une balise head ouvert ici et une balise de tête tout près d'ici.
>> Il s'agit d'un titre d'ouverture et une balise de titre tout près d'ici.
Le fait que j'ai mis le titre sur une seule ligne, purement arbitraire.
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.
Pendant ce temps, le corps que j'ai fait tiret juste d'être toujours aussi claire.
Notez que HTML est un langage assez stupide.
En effet, de retour dans la journée avant il y avait les éditeurs WYSIWYG
et Microsoft Word où vous pouvez dire: «Faites ce gras, italique font de cette"
vous auriez fait taper des commandes en petites essais 20 + ans
où vous dites: «Commencez à faire de ce texte en gras. Arrêtez de faire ce texte en gras."
"Commencez à faire de ce texte en italique. Arrêtez de faire ce italique texte."
>> C'est ce que HTML ou tout autre langage de balisage est.
Cette première étiquette dit: "Hé, navigateur. Voici le HTML."
La balise suivante dit: "Hé, navigateur. Voici la tête, l'en-tête de ma page web."
"Hé, navigateur. Voici le titre."
Et puis ici, "Hé, navigateur. C'est tout pour le titre."
Voilà donc comment le navigateur sait de ne plus afficher plus de caractères que bonjour, monde
dans la barre de titre.
Pendant ce temps, cela dit, "C'est tout pour la tête."
Ceci dit, «Voici le corps est ici le véritable corps." - Littéralement, les mots bonjour, monde.
Et cela est dit ici, «C'est tout pour le corps. C'est tout pour le HTML."
Ainsi, les navigateurs sont assez stupide.
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.
Nous allons effectivement faire un petit exemple ici.
Permettez-moi d'ouvrir le plus simple des programmes sur mon Mac ici, à savoir TextEdit.
Sous Windows, vous pouvez utiliser le Bloc-notes.
Mais c'est tout ce que vous avez besoin pour commencer à faire des pages web.
Je vais aller de l'avant et il suffit de copier et coller ce code dans ce fichier.
Je vais aller de l'avant et de l'enregistrer sur mon bureau,
et je vais l'enregistrer comme hello.html,
et maintenant le fichier est nommé hello.html.
Ici, il est sur mon bureau.
Permettez-moi maintenant aller dans un navigateur et faites glisser le fichier dans le navigateur.
Et voila, voici ma page web toute première fois.
Notez que le titre de l'onglet est bonjour, monde selon la balise title,
et notez que bonjour, monde est le corps de ma page web,
et woo-hoo, je suis sur Internet.
>> Je ne suis pas vraiment, non, parce que ce fichier n'est pas sur Internet.
Il se trouve sur mon disque dur local à ce chemin particulier.
Mais l'idée est la même. Tout ce que nous devons maintenant est un serveur web vers lequel le télécharger.
Mais d'abord nous allons introduire une complexité en fait un peu plus et un peu plus de stylisation.
C'est un moyen simple, si ennuyeux, page Web.
Il s'avère qu'il ya d'autres types d'étiquettes que nous pouvons utiliser.
Par exemple, ici en jaune j'ai introduit 2 nouvelles balises.
Nous n'allons pas jouer beaucoup avec cela aujourd'hui, mais notez que la balise link
semble quelque peu différente de tout le reste.
La balise link prend ce qu'on appelle des attributs,
et un attribut est quelque chose qui modifie le comportement d'une étiquette.
Dans ce cas, ce n'est pas le meilleur choix des noms, des liens, parce que c'est un peu vide de sens,
mais cette balise link dit, essentiellement, d'inclure le fichier appelé styles.css l'intérieur de ma page web.
Vous pouvez considérer cela comme analogue à C de la directive # include.
Styles.css se réfère à une langue tout à fait différente que nous ne jouerons pas aujourd'hui,
mais c'est pour l'esthétique: la taille des polices, couleurs, espacements, l'indentation, les marges,
et tout ce genre de détail esthétique.
Pendant ce temps, la balise script est fonctionnellement similaire,
mais au lieu de include CSS, cette langue, il comprend une autre langue, JavaScript.
Donc, en d'autres termes, avec ces 2 balises je vais finir par être capable d'écrire ma propre page web
mais aussi tirer dans le code que moi ou quelqu'un d'autre a écrit
afin que nous puissions tenir debout sur les épaules des autres, nous pouvons pratiquer un bon design,
la factorisation de code commune.
Si j'ai eu 10 différentes pages Web, ce qui signifie que certains de mes esthétique
peut être mise de côté, un peu comme # include, dans un fichier séparé.
Donc, nous allons y arriver.
Mais nous allons d'abord faire réellement quelque chose de plus intéressant avec ce fichier.
>> Encore une fois, ce n'est que TextEdit. Je ne suis pas techniquement sur l'Internet, mais nous y arriverons.
Je voudrais faire bonjour, monde un peu plus audacieux que c'est.
Donc bonjour, nous allons dire arbitrairement pour le gras.
Encore une fois, l'histoire est la même: bonjour, virgule, commencer à faire cette audacieuse,
puis dans le monde est imprimé en caractères gras, ce qui signifie arrêter l'impression de ce en gras.
Laissez-moi aller de l'avant et sauver mon fichier, revenez à Chrome, je vais effectuer un zoom avant afin que nous puissions mieux voir,
et de recharger, et vous verrez que le monde est maintenant en gras.
Le Web est tout au sujet des liens hypertexte, nous allons donc aller de l'avant et de le faire:
mon site préféré est, disons, youtube.com.
Enregistrer, rechargez-le. D'accord. Il ya quelques problèmes aujourd'hui en dehors de la laideur du site.
1, je suis sûr que je la touche Entrée ici. Et je l'ai fait.
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,
mais mon trouve juste à côté du monde.
Alors, pourquoi est-ce? Navigateurs seulement faire ce que vous leur dites de faire.
Je n'ai pas dit le navigateur, "lignes pause ici. Insérez un paragraphe casser ici."
Ainsi, le navigateur, ce n'est pas grave si je frappe 30 fois de retour,
il va toujours mettre mon juste à côté du monde.
Ce que j'ai vraiment avez à faire ici est de dire quelque chose comme , insérer un saut de ligne.
>> Et en fait, un saut de ligne est une sorte de truc bizarre
parce que vous ne pouvez pas vraiment commencer à se déplacer sur une autre ligne, puis faire quelque chose,
et puis arrêtez de passer à une nouvelle ligne. C'est un peu une opération atomique.
Vous pouvez soit le faire ou vous n'avez pas. Vous appuyez sur Entrée ou vous n'avez pas.
Donc br est un peu différent d'une balise, et donc j'ai besoin de trier à la fois ouverte et fermez
en une seule fois.
La syntaxe de ce qui est.
Techniquement, vous pourriez faire quelque chose comme ceci dans certaines versions de HTML,
mais ce n'est tout simplement stupide parce qu'il n'y a aucune raison pour démarrer et arrêter quelque chose
si vous pouvez, au lieu de tout faire à la fois.
Sachez que HTML5 n'est pas strictement besoin de cette barre,
donc vous verrez des manuels et des ressources en ligne qui ne l'ont pas,
mais pour faire bonne mesure nous allons pratiquer la symétrie que nous avons vu jusqu'à présent.
Cela signifie que la balise est à la fois ouvert et fermé.
Alors maintenant, laissez-moi me sauver fichier, revenez ici.
Ok, donc il commence à regarder mieux, à l'exception du Web Je sais que c'est un peu cliquable,
et pourtant youtube ici ne semble pas mener à rien.
C'est parce que même si elle ressemble à un lien, le navigateur ne sait pas que soi,
je dois donc indiquer au navigateur qu'il s'agit d'un lien.
>> La façon de le faire est d'utiliser une balise d'ancrage:
<A href hyper référence, qui est la façon old school de dire un lien,
= "Http://www.youtube.com">
et laissez-moi passer cela pour une nouvelle ligne juste donc c'est un peu plus lisible,
et je vais réduire la taille de la police.
Suis-je encore fait? Non, il va y avoir cette dichotomie.
Cette balise, la balise d'ancrage, en effet prendre un attribut,
qui modifie son comportement, et la valeur de cet attribut est apparemment URL de YouTube.
Mais remarquez la dichotomie est-ce simplement parce que c'est l'URL que vous allez,
cela ne signifie pas que doit être le mot que vous êtes en soulignant et faisant un lien.
Au contraire, cela peut être quelque chose comme ça.
Donc, je dois dire arrêter de faire ce mot d'un lien hypertexte à l'aide de la balise d'ancrage à proximité.
Remarquez que je ne fais pas ça.
1, ce serait juste une perte de temps tout le monde et ce n'est pas nécessaire.
>> Pour fermer une balise, il suffit de mentionner le nom de la balise à nouveau.
Vous ne mentionnez pas l'un des attributs.
Alors sauvons que, revenir en arrière. Bon, voila, maintenant il est bleu et hyperlien.
Si je clique dessus, je fais réellement aller sur YouTube.
Ainsi, même si ma page web n'est pas sur Internet, il est au moins HTML,
et si nous laissons l'Internet rattraper, nous finissons par ici sur youtube.com.
Et je peux revenir en arrière et voici ma page web. Mais remarquez ceci.
Si vous avez déjà reçu un spam ou phishing,
maintenant vous avez la possibilité, après seulement cinq minutes à faire de même.
Nous pouvons aller ici et de faire quelque chose comme www.badguy.com
ou quel que soit le site est sommaire, et alors vous pouvez dire vérifier votre compte PayPal.
[Rires] Et maintenant ça va aller badguy.com, que je ne vais pas cliquer sur
parce que je n'ai aucune idée où cela mène. [Rires]
>> Mais nous avons maintenant la possibilité de réellement arriver là.
Donc nous sommes vraiment juste de commencer à gratter la surface.
Nous ne sommes pas programmer soi; nous écrivons langage de balisage.
Mais dès que nous complétons notre vocabulaire en HTML,
nous allons présenter PHP, un langage de programmation actuelle
qui va nous permettre de générer du HTML automatiquement, de générer automatiquement CSS,
afin que nous puissions commencer à mettre en œuvre le mercredi, par exemple,
notre moteur de recherche et plus encore.
Mais plus à ce sujet dans quelques jours. Nous vous verrons ensuite.
>> [CS50.TV]