[Powered by Google Translate] [Woche 7]
[David J. Malan - Harvard University]
[Dies ist CS50. - CS50.TV]
Gut. Willkommen zurück. Dies ist CS50, und dies ist der Beginn der 7. Woche.
Ein paar kleine Meldungen:
Pset5 ist nun im Gange oder werden bald sein,
und lassen Sie mich sagen, ganz ehrlich, bedeutet dies tendenziell unter den schwieriger sein
des Kurses das Problem Sätze, so möchte ich erwähnen, das jetzt
so dass in dieser Woche mehr denn je Sie nicht warten, bis, sagen wir, Mittwoch Abend
oder Donnerstag Nacht zu tauchen in.
Dies ist definitiv eine interessante pset. Wir denken, es macht Spaß.
Wenn Sie tatsächlich bekommen völlig korrekt und kann dann fordern die sogenannten Big Board,
Sie haben die Möglichkeit, Verstand mit einigen der natürlich die Mitarbeiter entsprechen
und einige von deinen Klassenkameraden.
What The Big Board ist, wenn Sie Ihre Rechtschreibprüfung gearbeitet haben,
Sie werden in der Lage zu cs50.net nach Ausführung eines Befehls zu gehen,
rein in entscheiden, und dann wird die Menge an Zeit und die Menge an RAM und
dass Sie in Ihrer Implementierung verwendet wird hier auf den Kurs der Homepage zu sehen sein.
Sie werden feststellen, dass eine ganze Reihe von diesen Leuten hier als Mitarbeiter aufgeführt sind
Seit über das Wochenende, dachte das Personal, es wäre lustig, um zu versuchen, sich gegenseitig zu übertrumpfen.
So klar, dass hier das Ziel nicht darin, die Mitarbeiter zu übertreffen.
Auch ich bin nur hier auf Nummer 13.
Rein entscheiden, aber es ist eine Gelegenheit, um zu sehen, wie wenig RAM
und wie wenige CPU Sekunden können Sie vis-a-vis einige Ihrer Klassenkameraden zu verwenden.
>> Und ich gebe zu, dass Kevin Michael Schmid,
derzeit in Nummer 1 Position als einer der TFs,
Dies ist eine Implementierung, die wir als nicht möglich
gegeben, dass er mit fast 0 RAM und fast 0 Sekunden zum Laden.
Also werden wir kümmern uns um Kevin offline. [Gelächter]
Es gibt bestimmte Fähigkeiten, die Kevin wird auf die Probe setzen hier.
Eines der Dinge, die wir dachten, wir würden es auch tun jetzt CS50x ist eine Woche im Gange,
und ihr seid genauso ein Teil dieses Experiments, wie diese Schüler sind.
Wir haben sie als Teil ihrer pset0 gebeten, das war ähnlich wie ein Scratch Projekt einreichen
für sie von Interesse - ein Spiel, ein interaktives Kunstwerk, eine Animation oder dergleichen -
eine 1 - bis 2-Minuten-Video, wenn sie möchten, sagen hallo zur Welt und wer sie wirklich sind.
Ich dachte, ich würde mit Ihnen teilen nur ein paar der Videos, die eingereicht wurden bisher
weil es für uns auf der Personal mindestens, ist es wirklich war spannend
und inspirierend, diese Leute aus der ganzen Welt zu sehen - Länder auf der ganzen Welt -
Tuning in, aller Dinge, zu einem Computer Wissenschaft natürlich auf dem Internet,
sei es, weil sie ihre eigenen Studien fortsetzen wollen,
sie wollen ihre Karriere in eine neue Richtung,
sie wollen, um Lücken im eigenen Wissen zu füllen,
so dass einige der aus den gleichen Gründen, die euch vielleicht hier gewesen.
>> So gebe ich Ihnen eine solche Studenten hier. Man könnte die Lautstärke zu erhöhen gerade ein wenig.
Hier ist einer unserer Schüler 1-Minuten Einreichungen.
Hallo, Welt. Ich bin ein Student des Wirtschaftsingenieurwesens hier in Malaga, Spanien.
Ich freue mich über dieses Online-Kurses aufgeregt, weil ich Informatik lieben, tue ich wirklich,
und ich wirklich zu schätzen, dass ich sie zu erforschen bekommen.
Und die Tatsache, dass ich die gleiche alle von euch tun zu lernen
aber anstatt in Harvard Ich bin in Malaga, wie geil ist das denn?
Nun, ich bin Fernando, und das ist CS50. See you guys.
[Gelächter] Ein weiterer Clip wir besonders magst, wirst du feststellen, dass dieses Herrn Englisch ist nicht so stark.
Es sieht aus wie er es maschinell übersetzt hatte, so dass die Übersetzungen selbst sind ein bisschen unvollkommen,
aber dies war einer unserer Favoriten bisher als gut.
[♪ ♪]
Hallo, Welt. [Spricht in Japanese]
[Ich habe auf Japanisch grüßen, weil mein Englisch ist sehr unzuverlässig.]
[Ich habe die Nachricht an Sie geliefert von der Stadt Gifu, Japan.]
[I kann ein Student zum ersten Mal in 20 Jahren, wie man sehen kann.]
[Ich bin sehr dankbar, Harvard University, die mir diese Gelegenheit und EDX.]
[Golf ist eine Gitarre und mein Favorit, was läuft.] [Gelächter]
[♪ ♪]
[Warum denken Sie, ich habe versucht, eine cs50x teilzunehmen.]
[Harvard University, ist es meine Sehnsucht.]
[Vor allem, wenn ich entfernte Präsenz in Japan gelebt.]
[Ich wollte versuchen, sofort Kenntnis von der Existenz solcher EDX wann.]
[Glaubst du nicht, so dass Sie nicht auf das Alter des Lernens I. verwandt]
[CS50 ist meine Sehnsucht. Mein Name ist Kazu, und dies ist CS50.]
[♪ ♪] [Applaus und Jubel]
Ein weiterer Favorit von uns war diese Unterwerfung hier von jemandem.
[♪ ♪] [Malan] Google, wenn Sie nicht mit diesem meme sind.
>> Und dann schließlich noch ein paar andere, die geschrieben, dass vielleicht gewinnen adorable Auszeichnung bekam.
[Schüler] Aww! >> [Malan] Wir müssen zuhören. Dies ist so kurz, genau zuhören.
[Sprecherin] Was ist dein Name? >> Louie.
[Sprecherin] Was ist das? >> [Kichert] CS50. [Gelächter]
[Malan] Er hat zwei Takes, though.
Hier gehen wir, die letzte.
Mein Name ist Louie, und dies ist CS50.
[Gelächter] Das ist dann CS50x.
Vielen Dank an alle diejenigen unter Ihnen, während nach zusammen zu Hause
die wurden bisher Teilhabe.
Heute schließen wir unsere Diskussion von Datenstrukturen,
wenigstens einige der grundlegenden,
und dann werden wir weiterhin unser Gespräch über HTML und Web-Programmierung.
In der Tat haben wir die Vergangenheit verbrachte einige 7 Wochen Blick auf die Grundlagen der Programmierung -
Algorithmen, Datenstrukturen und dergleichen -
und C, wie Sie vielleicht bisher erlebt haben,
ist nicht unbedingt die am besten zugänglichen Sprachen
mit denen einige dieser Ideen umzusetzen.
Und so beginnt diese Woche und nächste Woche und dann die folgenden,
wir werden schließlich in der Lage sein, den Übergang von C, das in der Regel als relativ niedrig-Level-Sprache bekannt ist,
Dinge höheren Ebene, unter ihnen PHP, JavaScript, und dergleichen,
die zeichnen wir auf die gleichen Lektionen, die wir in den vergangenen Wochen gelernt zu sehen,
aber du wirst feststellen, dass erklärt Dinge wie Arrays und Hash-Tabellen und Such-und Sortierfunktionen
so viel leichter, weil die Sprachen selbst beginnen wir dann mit
wird stärker.
Aber zuerst, eine Anwendung von Bäumen.
Es ist sehr häufig in diesen Tagen brauchen, um zu komprimieren.
In welchem ​​Zusammenhang würden Sie wollen, um irgendeine Art von digitalen Informationen zu komprimieren?
>> Yeah. >> [Schüler] Wenn Sie es über das Web senden müssen.
Ja, wenn Sie etwas über das Web senden möchten.
Wenn Sie eine große Datei herunterladen möchten, ist es ideal, wenn jemand am anderen Ende
komprimiert wurde diese Datei mit einem ZIP-Format oder so ähnlich
so dass Sie senden weniger Bits als sonst übermittelt werden könnten.
So wie Sie komprimieren Informationen?
Es läuft alles auf die Verwendung von weniger Bits als Standardmäßig sind erforderlich.
Aber dies ist eine Art seltsame Sache, weil denken Sie zurück an den Wochen 0 und 1
wenn wir sprachen über ASCII-und Binär und wir sprachen über ASCII insbesondere
wie mit 8 Bits Buchstaben des Alphabets darstellen
so dass der Buchstabe A durch 65 dargestellt wird, Kleinbuchstaben a die Zahl 97,
und wie Sie repräsentieren die 65 oder 97, du bist mit 7 oder 8 Bit.
Aber der Haken ist, dass es einige Buchstaben des englischen Alphabets
die nicht so populär wie andere.
Z ist gar nicht so beliebt, Q ist gar nicht so beliebt, aber A und E sind super beliebt.
Und doch für alle diese Briefe, die standardmäßig die Welt nutzt die gleiche Anzahl von Bits, nur 8.
So wäre es nicht klüger gewesen, wenn statt mit 8 Bit für jeden Buchstaben,
selbst die selten wie Q und Z verwendet,
was, wenn wir verwendet weniger Bits für A und E und S und den beliebtesten Briefe
und verwendet mehr Bits für die weniger populären Buchstaben,
die Idee ist, lasst uns optimieren für den üblichen Fall,
das ist ein Thema in der Informatik zu versuchen, zu optimieren, was los ist, um das Beste geschehen
und verbringen Sie ein wenig mehr Zeit, ein wenig mehr Platz auf die Dinge, die, ja, kann passieren,
aber nicht unbedingt so häufig.
Also lasst uns ein Beispiel nehmen.
>> Angenommen, dass wir Informationen ziemlich effizient kodieren wollen.
Sie können bis gewachsen zu wissen ein bisschen etwas über Morse-Code,
und Chancen sind Sie nicht wissen, den eigentlichen Code,
aber vielleicht daran erinnern, dass es zumindest diese Serie von Punkten und Strichen ist.
Dies ist eine ziemlich effiziente Codierung, und beachten Sie, dass die beliebtesten Brief - zum Beispiel E -
wird mit der kürzesten von Signaltönen.
Morse-Code ist alles über piep-piep-piep-piep-piep-piep und Halten Tönen
entweder für kurze Zeiträume oder lange Zeiträume.
E, wie durch den Punkt bezeichnet, ist ein super kurzer Signalton, nur Piepton, und das wäre E. stellen
Im Gegensatz dazu würde T einen längeren Piepton, wie beep [verlängert Sound]
und das wäre stellen T.
Aber das ist immer noch ziemlich kurz, weil im Gegensatz dazu, wenn Sie bei Z schauen,
bis Z ausdrücken würden Sie piep, piep [mehr sound], piep, piep [kürzeren Ton] zu gehen.
So ist es mehr, weil es weniger verbreitet ist.
Aber die gotcha hier ist, dass Morse Code ein bisschen fehlerhaft ist
in, dass es nicht sofort dekodiert.
Zum Beispiel: Angenommen, Sie auf einige Ende des Drahtes Piepton zu hören [kurz], beep [lang].
Welche Botschaft habe ich gerade erhalten? Ein Punkt und ein Strich. Was bedeutet das darstellen?
[Schüler] A. >> [Malan] Vielleicht.
Es könnte auch E von T. gefolgt
Mit anderen Worten, Morsecode, obwohl es nutzt das Prinzip der Optimierung der Ecke Fall
Es eignet sich nicht zur sofortigen Dekodierbarkeit.
Das heißt, der Mensch, Hören oder empfängt diese Punkte und Striche
muss irgendwie herausfinden, wo die Pausen zwischen den Buchstaben sind,
denn wenn Sie nicht wissen, wo diese Pausen sind, können Sie A für ET oder umgekehrt zu verwirren.
>> Also, was können Sie tun? In Morsecode Sie könnten nur Pause zwischen den einzelnen Buchstaben.
Aber Pause ist eine Art gegen die springende Punkt bei der Beschleunigung Dinge.
So was, wenn wir stattdessen kam mit einem Code, wo es war nicht diese schlechte Situation
wobei E ein Präfix, zum Beispiel von A -
in anderen Worten, wenn wir dafür sorgen, dass die Muster noch für die beliebten Briefe kurzen
lang für die weniger populären Buchstaben, aber es gibt keine mögliche Verwirrung?
Ein Mann mit dem Namen Huffman Jahren erfunden dieses System mit der Bezeichnung Huffman-Kodierung
das tatsächlich nutzt eine der Datenstrukturen wir ein bisschen Zeit damit verbracht habe reden
in der vergangenen Woche, das von Bäumen, binären Bäumen, die speziell -
ein binärer Baum bedeutet, dass es nicht mehr als zwei Kinder.
Es hat vielleicht eine linke Kind, vielleicht ein rechtes Kind, und das ist es.
Also nur für der Diskussion willen annehmen, dass jemand eine Nachricht senden möchte
das sieht wie folgt aus. Es ist völliger Unsinn, aber es ist von As zusammengesetzt, Bs, Cs, Ds und Es.
Und wenn Sie tatsächlich aufwärts zählen alle As, Bs, Cs, Ds und Es
und dann durch die Gesamtanzahl von Buchstaben zu unterteilen,
Diese kleine Tabelle sagt hier, dass 45% der Briefe Es sind 20% As,
10% B, und so fort.
Also mit anderen Worten davon aus, dass die Zeichenfolge in Anführungszeichen gibt
ist nur einige Nachricht, die Sie senden möchten.
Es passiert Unsinn nur so können wir so wenige Briefe wie möglich zu nutzen,
aber es ist in der Tat der Fall, daß E die beliebteste bleibt,
und B und C sind die am wenigsten beliebt, zumindest diese 5 Buchstaben des Alphabets.
Wie können wir also zu kommen mit einer Codierung gehen,
eine binäre Codierung, ein Muster von 0 und 1 für jeden dieser Briefe
derart, daß E eine kurze Muster ist und vielleicht B und C sind etwas länger Mustern,
wieder, dass die Idee, dass wir mit weniger Bits meiste Zeit wollen
und mehr Bits nur einmal in eine Weile.
Nach Huffman-Kodierung, können Sie einen Wald von Bäumen.
Es ist eine Art von Story hier, dass beinhaltet Bäumen und auch den Prozess des Aufbaus sie.
Lassen Sie uns beginnen.
>> Ich schlage vor, dass Sie mit diesem Wald beginnen, so zu sprechen, von 5 Bäume,
von denen jeder eine ziemlich dumme Baum.
Der Baum wird von nur einem einzigen Knoten, wie hier durch einen Kreis dargestellt zusammengesetzt.
So jedes dieser Dinge könnte eine C-Struktur sein,
und im Inneren des C-Struktur kann ein Schwimmer, der die Frequenzzähleinrichtung sein
und dann vielleicht ein char repräsentiert den Brief.
So dieser Knoten denken, wie irgendein alter C struct, aber für jetzt, höheren Niveau.
Dies ist ein Wald von 5 Bäume je, wer nur einen einzigen Knoten.
Was Huffman vorgeschlagene ist, dass wir diese Bäume zu kombinieren starten
, die die kleinsten Häufigkeiten haben in etwas größere Bäume
indem Sie sie mit einem neuen Root-Knoten.
So unter den Buchstaben hier bemerken, dass für die Bequemlichkeit Ich habe sie von links nach rechts sortiert,
aber das ist nicht unbedingt notwendig, und beachten Sie, dass die kleinsten Knoten
sind derzeit 10% und 10%.
So Huffman vorgeschlagen, dass wir die 2 kleinsten Knoten verschmelzen zu einem neuen Baum
durch die Einführung eines neuen übergeordneten Knoten und dann geben, dass Eltern eine linke Kind und ein rechtes Kind
wobei B beliebig die linke und C ist der rechte beliebig.
Und dann Huffman ferner vorgeschlagen, der uns jetzt nur noch der linke Kind denken,
in einem dieser Bäume immer als durch 0
und das rechte Kind immer als durch die Zahl 1 repräsentiert.
>> Es spielt keine Rolle, wenn man sie drehen so lange, wie Sie konsistente sind.
So, jetzt haben wir vier Bäume in diesem Wald.
Und ich sage vier, weil jetzt der Baum auf der linken Seite -
und es ist nicht so sehr ein Baum in dem Sinne, dass es auf diese Weise wächst,
es ist mehr wie eine Familie Baum, wo jetzt die 0,2 ist eine Art der Muttergesellschaft der beiden Kinder -
feststellen, dass in diesem Elternteil haben wir 0,2 gezogen.
Wir haben die Häufigkeiten der beiden Kinder aufgenommen und in Anbetracht der neuen Knoten die Summe.
So jetzt müssen wir nur wiederholen Sie diesen Vorgang.
Finden Sie die beiden kleinsten Knoten und dann kommen sie in einen neuen Baum
und wiederholen Sie den Vorgang weiter.
Im Moment haben wir ein paar Kandidaten, 20%, 15% und weitere 20%.
In diesem Fall haben wir die Krawatte zu brechen. Wir können es beliebig.
Wir sollten es einfach tun konsequent.
In diesem Fall werde ich willkürlich mit der auf der linken Seite,
und ich habe jetzt verschmelzen die 20% und die 15%, um mir eine neue Muttergesellschaft namens 35%,
deren linke Kind ist 0, deren rechte Kind ist 1, und jetzt haben wir nur drei Bäume im Wald.
Sie können vielleicht sehen, wohin das führt.
Wenn wir das ein paar Mal wiederholen, werden wir nur einen größeren Baum haben,
deren sämtliche Kanten sind mit 0 und 1 bezeichnet.
Lassen Sie es wieder tun.
35% ist der Baum der Wurzel. 20% und 45%, so werden wir die 35% und 20% zu verschmelzen.
Jetzt haben wir diesen Baum hier. Wir fügen diese zusammen, wir haben 55%.
Jetzt gibt es nur noch zwei Bäume im Wald.
Wir tun dies, ein letztes Mal, und hoffentlich mathematisch alle Frequenzen summieren
weil sie sollte, da wir sie aus berechnet der get-go, bis zu 100%.
Und jetzt haben wir ein Baum.
Dies ist also eine Huffman-Kodierung Baum.
Es Art von dauerte eine Weile, bis es verbal zu bekommen, aber die Realität ist, mit einer for-Schleife
oder mit einer rekursiven Funktion, könnte man diese Sache ziemlich schnell zu bauen.
Deshalb haben wir jetzt ein neuer Knoten, und alle diese inneren Knoten wurden malloc'd,
vermutlich auf dem Weg.
So, jetzt an der Spitze dieses Baumes haben wir 100%, aber jetzt bemerken wir einen Pfad
von dieser neuen Ur-Ur-Ur-Großeltern, um alle Ur-Ur-Ur-Enkel
den ganzen Weg nach unten, um alle Blätter.
>> Was wir jetzt tun vorzuschlagen, dass, um den Buchstaben E darstellen,
Wir werden einfach die Nummer 1. Warum?
Denn wenn wir durchqueren diesen Baum aus dem endgültigen root auf dem Blatt als E bekannt,
Wir folgen nur einem Rand, der rechte Rand, und das ist natürlich oben rechts 1 bezeichnet.
So die Implikation hier für Huffman war, dass E die Codierung in binärer wird nur 1 sein.
Und das ist verdammt effizient. Kann nicht wirklich alle kleiner.
Im Gegensatz dazu ist A werde vertreten sein, wenn Sie die Logik folgen,
mit welchen Muster von Bits statt? 01.
So, um A zu erhalten, beginnen wir an der Wurzel, und wir gehen links und dann gehen wir rechts,
das heißt, wir folgte eine 0, dann a 1.
So werden wir den Buchstaben A mit dem Muster 0 und 1 darstellen.
Und jetzt stellen wir fest, haben bereits eine Eigenschaft der unmittelbaren Dekodierbarkeit
dass wir nicht in Morse-Code.
Obwohl diese beiden Muster recht kurz sind - E 1 Bit ist, A 2 Bits -
feststellen, dass sie nicht die eine oder andere verwechselt werden,
denn wenn man eine 1 siehe es hat ein E sein, wenn Sie sehen 0 then a 1 es offensichtlich bekam ist ein A sein
Ebenso, was ist D? 001.
Was ist C? 0001.
Und was ist B? 0000.
Und wieder, weil alle Briefe, die wir kümmern uns sind die Blätter
und keiner von ihnen sind so eine Art Zwischenhändler auf dem Weg von der Wurzel bis Blatt,
es gibt kein Risiko conflating 2 Buchstaben verschiedene Kodierungen
da alle diese Bitmuster deterministisch sind.
0000 wird immer B sein
Es gibt kein Knoten irgendwo dazwischen, mit dem Sie einen Buchstaben für den anderen verwirren könnten.
Also, was ist die Implikation hier?
>> Das populärste Schreiben - in diesem Fall E - ist die kürzeste Codierung bekommen,
A hat die nächste kürzeste Codierung bekommen,
und B und C, die wir bereits aus der get-go waren irgendwie am wenigsten beliebten wusste,
bei 10% Frequenz jeder, haben sie die längste Kodierung bekommen.
Und was bedeutet dies nun, dass wenn Sie eine Nachricht, ist komprimiert senden
über das Internet oder in einer Email oder dergleichen,
anstatt Standard-ASCII, können Sie eine Huffman codierten Nachricht
wobei, wenn Sie den Buchstaben E zu senden möchten, senden Sie einfach ein einzelnes Bit.
Wenn Sie ein A senden möchten, senden Sie 2 Bits, 01, anstelle des Sendens 8 Bit
gefolgt von weiteren 8 Bits durch weitere 8 Bits und so weiter folgen.
Aber es ist ein gotcha hier.
Es ist nicht ausreichend, einfach zu konstruieren diesen Baum und starten Sie dann das Senden von Alice zu Bob
die kürzere Bit-Muster, Zeichenfolge aus ASCII,
weil Alice hat auch Bob, was zu informieren
wenn Bob wird in der Lage sein, ihre komprimierte Nachricht lesen?
[Unverständlich Student Response] >> Was ist das?
[Unverständlich Student Response] >> Von dem, was der Baum ist.
Oder noch genauer gesagt, was diese Codierungen sind,
zumal in dieser Geschichte, die wir ein Urteil Anruf an einer Stelle.
Beachten Sie, dass wir willkürlich holen zwischen den 2 verschiedenen 20% Knoten hatte?
Es ist also nicht so, dass Bob, der Empfänger kann nur rekonstruieren, den Baum auf eigene
vielleicht auch weil er den Baum immer so leicht anders Alice erstellen.
Außerdem hat Bob gar nicht wissen, was die ursprüngliche Nachricht ist
denn das einzige Alice sendet ihn wird, ist natürlich die komprimierte Nachricht.
>> So der Fang mit Kompression wie das ist, ja, kann Alice sparen eine ganze Menge von Bits
durch Senden 1 für E und 01 für A und so weiter,
aber sie hat auch Bob informieren, was die Zuordnung zwischen Buchstaben und Bits
weil sie nicht eindeutig stützen sich auf nur ASCII mehr, wenn wir nicht verwenden ASCII.
So kann sie entweder schickt ihn den Baum irgendwie -
notieren, bewahren Sie es als binäre Daten oder so ähnlich -
oder senden Sie ihm ein wenig Spickzettel, eine Excel-Datei, die die Zuordnungen zeigt.
So die Effektivität der Kompression wirklich davon ausgegangen, dass die Nachrichten, die Sie senden
sind ziemlich groß, zumindest mittelgroß,
denn wenn Sie senden eine super kurze Nachricht,
wenn Sie nur wollen, um die Nachricht BAD geschieht, die zu einem Wort, das wir hier buchstabieren kann,
B-A-D, du bist wahrscheinlich zu weniger Bits zu verwenden,
aber der Haken ist, wenn Sie auch an Bob informieren, was der Baum
oder was diese Codierungen sind, wirst du wahrscheinlich überwiegen alle Einsparungen
der mit Druckluft Dinge zu beginnen.
So kann es tatsächlich der Fall ist, dass, wenn Sie versuchen, komprimiert werden
auch mit so etwas wie zip oder Dateiformate, die Sie vielleicht kennen -
hübsche kleine Dateien, auch leere Dateien -
manchmal sind diese Dateien möglicherweise größer und nicht kleiner.
Aber realistisch, das passiert nur für kleine Dateigrößen,
so ist es nicht zu machen ein Gigabyte-Datei 2 Gigabyte sein;
wir wirklich reden Bytes oder nur ein paar Kilobyte.
>> Einige Programme wie zip sind intelligent genug, um das zu realisieren,
"Du wirst mehr Bits komprimiert diese zu verbringen."
"Lassen Sie mich nicht die Mühe es zu komprimieren für Sie überhaupt nicht."
Also das ist nur eine Möglichkeit, dann zu komprimieren Textformat.
Wir könnten so etwas in C zu implementieren
Zum Beispiel, hier ist, wie wir einen Knoten in diesem Baum stellen
wo wir eine char für das Symbol, ein schwimmendes Wert für die Frequenz,
und wie wir mit unseren anderen Datenstrukturen, 2 Zeiger gesehen,
1 nach links Kind 1 nach rechts, von denen jeder den Wert NULL annehmen kann,
aber wenn nicht, bezieht er sich auf einer linken und einer rechten Kindes Kind.
Also das ist dann Huffman-Kodierung, und es ist ein Weg, dass man zu komprimieren Informationen gehen,
und es ist sicherlich eines der am einfachsten zu implementieren
im Rahmen von beispielsweise vergangenen Woche Datenstrukturen,
obwohl auch komplexere Algorithmen existieren
das kann aber noch mehr anspruchsvolle Mutationen Ihrer Daten.
Fragen Sie dann auf Bäumen, binären Bäumen, oder Kompression von Text?
[Schüler] Gibt es einige Unklarheiten, wie wenn [unverständlich] aufgeteilt in 01,
dann 011 wäre mehrdeutig, nicht wahr?
[Unverständlich] >> Gute Frage. Mehrdeutigkeit.
Lassen Sie mich zusammenfassen unter Bezugnahme auf diese Bilder hier.
Weil Sie die Zeichen verdichten, die Darstellungen,
per Definition dieser Algorithmus immer die Blätter bleiben,
Sie werden nie versehentlich die gleiche Muster von Bits für das Präfix von mehreren Buchstaben.
Also mit anderen Worten, Sie besorgt sind, es klingt wie, eine Mehrdeutigkeit, die sich
wobei 001 könnte der Beginn B oder der Beginn C oder so ähnlich sein.
Aber das kann nicht der Fall sein, weil beachten Sie, dass alle Buchstaben des Alphabets wir kodieren
befinden sich an den Blättern.
>> Die Mehrdeutigkeit kann nur entstehen, wie im Fall des Morse-Code,
wenn zum Beispiel war C irgendwo entlang der Pfad von der Wurzel zu B.
[Schüler] Right. Also in diesem Fall, sagen A hat 2 Blätter. >> Say A - Sag das nochmal.
[Schüler] Say A hat 2 Blätter, F und G, und dann G - >> Okay. Aber es geht nicht.
Ein selbst konnte keine Blätter F und G, da diese Buchstaben F und G
würden sich verlässt irgendwo links von B oder rechts von E sein
So muss per definitionem sie Blätter sein.
Andernfalls Sie hier genau richtig, haben wir nicht das Problem, dass Morse-Code steht gelöst.
Gute Frage. Weitere Fragen? Gut.
Diese Vorstellung von Bits, stellt sich heraus, dass wir die Macht hatte schon die ganze Zeit, dass wir eigentlich nicht verwendet
wenn es um die Manipulation dieser 0s und 1s.
Wir fragten dazu auf eine der frühesten Problem Sets:
nämlich, wie Sie über das Konvertieren von Groß-in Kleinbuchstaben oder umgekehrt gehen?
Oder, genauer gesagt, fragte einer den ersten pset
wie viele Bits Sie haben tatsächlich zu kippen, um eine Änderung an einer oder umgekehrt Kleinschreibung?
Hier ist eine kurze Übersicht über 65 und 97 aussehen wie in binär.
Und selbst wenn diese Frage Art in Ihrer Erinnerung verblasst,
Sie können wieder sehen, dass, wie viele Bits gekippt werden müssen
zu Kapital zu ändern A in Kleinbuchstaben a? Nur eine.
>> Sie nur an einem Ort, das dritte Bit aus dem linken unterscheiden.
Während A hat eine 010, kleine a hat einen 011.
Also irgendwie müssen wir nur in der Lage, diese Bit-Flip,
und wir können dann zu nutzen oder Kleinbuchstaben.
Wir haben dies in der Vergangenheit getan tatsächlich nutzen, wenn die Bedingungen
und prüfen, ob der Brief ist zwischen Kapital A und Kapital Z,
gibt dann wie A - a + 26 oder so ähnlich.
Sie haben wahrscheinlich eine arithmetische Änderung der Buchstaben des Alphabets.
Aber was wäre, wenn wir nur Flip dass einzelne Bit?
Wie konnten Sie über die Einnahme ein Byte im Wert von Bits, so 8 Bits wie 01000001 und 01100001 zu gehen?
Wenn Sie diese Abfolgen von Bits hatten, wie können wir über die Änderung nur einer von ihnen gehen?
Was, wenn wir in Gelb hier vorstellen diese andere Muster von Bits?
Wenn ich die ganzen gelben String 0s mit Ausnahme der ein bisschen, dass ich ändern wollen
und dann stelle ich einen neuen Betreiber als bitweisen Operator bekannt -
bitweise in dem Sinne, dass sie auf einzelne Bits arbeitet,
nicht auf einer gesamten Byte oder vier Bytes auf einmal.
Diese vertikale bar es in Gelb schlägt vor, dass was passiert, wenn wir die Darstellung von Kapital A zu nehmen
und bitweise ODER es mit dem gelben Folge von Bits?
In anderen Worten, denken Sie zurück an unsere Diskussion über Boolesche Ausdrücke in Scratch und dann in C.
>> Doing eine boolesche oder bedeutet, dass um wahr zu sein, entweder das erste Ding hat um wahr zu sein
oder das zweite Ding hat um wahr zu sein, oder sie haben beide um wahr zu sein,
und dann das resultierende Ausgangssignal sich wahr.
In diesem Fall hier, was haben wir bekommen, wenn wir 0 annehmen "oder" ed mit 0? Falsche oder falsch?
Es ist immer noch falsch, so dass die Kleinbuchstaben a bleibt wie erwartet.
Was wäre, wenn wir stattdessen 1 oder 0 zu tun?
Dieser bleibt nun 1, aber bemerken, was geht darum, hier zu passieren.
Wenn wir mit dem Kapital A und beginnen wir weiter "oder" die einzelnen Bits wie wir hier sind,
0 oder die gelbe gibt uns, was hier unten? Dies gibt uns ein.
In der Tat, nehmen wir nicht wissen, was die Groß-Version von wenig ein tatsächlich war.
Lasst uns das tun. Lassen Sie mich zu bewegen diese wieder hier.
Lasst uns wieder tun. 0 oder 0 gibt mir 0.
1 oder 0 gibt mir ein.
0 oder 1 gibt mir ein.
0 oder 0 gibt mir 0. Der nächste ist 0, das nächste zu 0 ist, ist der nächste 0.
1 oder 0 gibt mir ein.
Und so, auch wenn wir nicht im Voraus wusste, was Kleinschreibung eine war,
einfach durch "oder" ing A mit diesem Muster der Bits, die wir hier in gelb dargestellt,
Sie Kleinbuchstaben ein Kapital A durch Umklappen dieses Bit.
Wir benutzten diesen Ausdruck Wochen: Spiegeln ein bisschen.
Wie wollen Sie wirklich tun programmatisch?
Sie verwenden, was in der Regel eine Maske, eine Folge von Bits genannt,
dass in diesem Fall einfach so passiert, wie diese Zahl schau mal,
und dann "oder" es zusammen mit dieser neuen C-Operator,
nicht | | Verwenden Sie ein einzelnes | und Sie würden tatsächlich bekommen diese Antwort hier, weil warum?
Dies ist die 1s Ort, 2s Ort, 4s, 8s, 16s, 32s.
So stellt sich heraus, dass, wenn Sie einen Großbuchstaben A und bitweise ODER es mit der Zahl 32,
weil die Zahl 32, wenn man es so aussehen, als Bits, sieht wie folgt aus,
dh Sie können das Bit, dass Sie wirklich wollen, zu kippen.
Und ähnlich - und wir werden auf Code in nur einem Augenblick aussehen -
Angenommen, wir wollen in die andere Richtung gehen.
>> Wie willst du von Kleinbuchstaben einem Kapital A gehen? Welche Bit muss sich ändern?
Es ist das gleiche.
Wir wollen, dass die dritte Bit von einem 1 ändern, um eine 0.
Und wie können wir dabei vorgehen?
Wie können wir ausschalten ein bisschen? Mit welchem ​​Muster von Bits könnten wir schalten ein bisschen?
Was, wenn wir von Invert der Maske zu sortieren?
Während vor, wir haben die ganze gelbe Maske 0s
mit Ausnahme des Ein-Bit wollten wir einzuschalten,
was ist, wenn dieses Mal machen wir die gesamte Maske 1s mit Ausnahme des bit dass wir ausschalten möchten
und verwenden Sie dann, was Betreiber?
Was ist, wenn wir "und" die Dinge? Lassen Sie uns einen Blick.
Wenn wir dies nun umdrehen, nehme an, dass ich wieder eine Maske, die alle 1s ist zu schaffen
mit Ausnahme der ein bisschen, dass ich ausschalten möchten
und dann anstatt "oder" die weißen Zahlen bis oben mit den gelben Zahlen hier unten,
was ist, wenn ich statt "und" sie zusammen? Es nennt sich eine bitweise und.
Logisch, es ist das gleiche wie ein Boolean und.
Das gibt mir 0 & 1 0 ist. So falsch und wahr ist falsch.
True und wahr ist wahr.
Und hier ist das Zauberwort: Echte und falsche ist nun falsch, so haben wir aus, dass etwas gedreht.
Und nun der Rest der Geschichte ist etwas einfach.
Da der Rest der Maske ist 1s, spielt es keine Rolle, was die Zahlen in weiß sind.
Wenn Sie "und" etwas mit echter, du wirst doch nicht um den Wert zu ändern.
Wenn es wahr ist, bleibt wahr. Wenn es falsch war, bleibt falsch.
>> Aber die Magie passiert, wenn Sie etwas, das wahr zu nehmen
und Sie dann "und" es mit falschen.
Dies hat die Wirkung des Ausschaltens dieses Bit.
Also ein wenig kryptisch gibt.
Lasst uns tatsächlich auf einige Code zu suchen, die vielleicht tatsächlich aussehen noch kryptisch,
aber lassen Sie uns einen Blick hier bei tolower.
Wenn ich bei tolower aussehen, gehen aus der Kapitalkonsolidierung A ein Kleinbuchstaben
Lassen Sie uns sehen, wie wir dieses Programm zu implementieren.
Hier ist Haupt, und es ist nicht an irgendwelche Kommandozeilen-Argumente.
Ich erkläre ein Zeichen c für den Brief, dass der Benutzer wird geben in.
Ich habe dann mit einer vertrauten do while-Schleife nur machen, um sicherzustellen, dass der Benutzer auf jeden Fall gibt mir ein großes A
oder B oder C. .. Z, so geben sie mir etwas zwischen A und Z.
Und nun, was mache ich hier?
Ich bin "oder" ing dies mit 0x20, aber das ist eigentlich das gleiche wie -
und wir kommen zurück, um dies in einem Moment - 32.
Also noch einmal, ist 32 dieses Muster von Bits hier. Warum wir das wissen?
Denk nur an Wochen 0.
Dies ist die 1s Ort, 2s Ort, 4s, 8s, 16s, 32s statt.
Also das gelbe Zahl passiert zu 32 sein.
Ich kann dann einen Brief wie der char hier bitweise "oder" es buchstäblich mit der Nummer 32,
und was bekomme ich zurück? Das kleine Version des char.
Vorhin, obwohl, drückte ich dies in einer anderen Basis Notation.
Was hat dies darzustellen? >> [Schüler] Hexadezimal.
[Malan] Dies geschieht in Hexadezimal darstellen.
Wir haben noch nicht über hexadezimale, dass alle viel geredet,
aber es ist eigentlich in Fällen wie diesem bequem.
>> Obwohl es sieht komplexer und obwohl es sieht aus wie 20 und nicht 32,
es stellt sich heraus, dass Hexadezimal ist eigentlich super bequem Notation
weil in hexadezimale jede Stelle nach dem 0x - und das bedeutet nichts;
dies ist nur die menschliche Konvention, hier kommt eine Hexadezimalzahl sagt -
jede dieser Stellen, die 2 und dann das 0, kann selbst dargestellt werden
mit genau vier Bits.
Also, wenn wir dies tun, lassen Sie mich eröffnen einen Texteditor hier - weird autocomplete -
wenn wir ein wenig Texteditor hier zu tun, die Zahl 0x20 bedeutet hier ist 4 Bits, hier weitere 4 Bits.
Lassen Sie uns die rechten 4 Bit zuerst.
0, wenn mit 4 Bits dargestellt ist, was? Super easy. Nur alle 0s.
So 4 Bits als 0s.
Wie stellen Sie 2? Es ist schon eine Weile her, seit wir dies taten, aber es ist 0100.
Das ist also die 1s Ort, das ist das 2s Ort, und dann ist es egal, was die anderen Orte sind.
In anderen Worten, in hexadezimaler könnte man sagen 0x20,
aber wenn man dann darüber nachdenken, was ist die 2 und wie wird sie vertreten im Binär-,
was ist die 0 und wie wird sie vertreten im Binär-,
die Antworten auf diese Fragen sind das und das sind.
So 0x20 geschieht dieses Muster von 8 Bits repräsentieren,
was genau das ist die Maske, die wir wollten.
Also das ist im Moment nur eine intellektuelle Übung,
aber die Realität ist im Code es in der Regel mehr gemeinsame Konstanten wie dies schreibe
in hexadezimaler denn dann kann der Programmierer relativ einfach,
auch wenn es etwas Papier und Bleistift benötigt, herauszufinden, was das Muster von Bits
da kann man nicht einfach auszudrücken 0s und 1s typischerweise im Code.
Du kannst nicht gehen 00010 und so weiter.
>> Sie müssen dezimal oder hexadezimal oder oktal oder andere Schreibweisen wählen.
Die meisten Menschen neigen dazu, hexadezimale einfach so, dass jede Ziffer 4 Bits repräsentiert holen
und Sie können dies tun, schnelle Mathematik.
Und ich werde meine Hand auf toupper, die fast die gleiche Wellenlänge, es sieht fast identisch.
Toupper passiert nicht die oder Betreiber, sondern dieser Kerl und df verwenden.
Was bedeutet df dar? df? Anyone? >> [Schüler] 255.
255? Nicht 255. Das wäre ff sein.
Wir werden diese ein als kleine Übung verlassen.
Aber wenn Sie reicht von 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 und was dann kommt nach 9?
Wir sind irgendwie von Dezimalstellen, sondern in hexadezimaler was kommt nach 9?
[Schüler] ein. >> Also a, b, c, d.
Sie können herausfinden, von dort, was Muster von Bits d tatsächlich steht.
Und wenn wir die Mathematik zu tun, werden wir sehen, dass die Maske, die Sie am Ende immer wieder mit diesem identisch ist.
Dies ist f alle 1s, und dies ist d. So df stellt diese Maske. Gut.
Und schließlich, nicht zu machen Dinge klingen super, super Technik,
aber angenommen, wir wollten ein Programm, das dies tut schreiben.
Lassen Sie mich voran gehen und binär, was ein Programm in einer Datei namens binary.c ist.
Und nun lassen Sie mich laufen binären und gib mir eine nicht-negative ganze Zahl ist.
Fangen wir einfach und geben 0.
Dies ist jetzt ein Programm, das druckt eine ganze Zahl in ihrer binären Darstellung.
Also, wenn ich dieses Spiel wieder zu spielen und geben in nur 1, sollte ich eine 32-Bit-Darstellung von 1.
Wenn ich das wieder tun mit 2, sollte ich, dass.
Wenn ich 7 zu tun, sollte ich ein paar 1s am Ende bekommen und so weiter.
Es stellt sich heraus, dass ich erwähnen, weil mit bitweise Operationen
Sie konkret tun können eine andere Sache als gut.
Sie können diese Masken dynamisch zu erstellen.
Werfen Sie einen Blick auf diese ein letztes Beispiel mit bitweise Operationen.
Hier ist der erste Teil des Codes, der Benutzer zur Eingabe einer Nummer,
und es besteht darauf, dass Sie mir eine nicht-negative Ganzzahl.
Damit ist eine Art der alten Schule Zeug.
Aber hier ist etwas, was irgendwie interessant ist.
>> Wie kann ich zum Drucken einer Zahl in binäre gehen?
Ich zum ersten Mal von was zu was durchlaufen?
Was ist in der Größe eines int in der Regel, zumindest in dem Gerät? >> [Schüler] 4.
Es ist 4. So 4 * 8 ist 32 - 1 ist 31.
Also, wenn ich fange an von 31 zu zählen, stellt das, es stellt sich heraus,
nur konzeptionell, den 31. Bit oder das Bit höchster Ordnung, die dieser Kerl hier ist,
während dies wird Bit 0 sein.
Das ist also Bit 01 ... Bit 31.
Also, was ist dieser Code tun?
Beachten Sie diese for-Schleife, obwohl es kryptisch aussieht, ist nur Iteration von 31 bis 0. Das war's.
So der interessante Teil muss nun in diesen 5 Zeilen hier zu sein.
Beachten Sie, dass in dieser Zeile Ich erkläre eine Variable namens Maske
im Einklang mit unserer Geschichte dieser gelben Zahlen.
Und was dann wird diese tun?
Dies ist ein weiterer bitweisen Operator wir nicht gesehen haben, bevor, am wahrscheinlichsten.
Es ist die linke Shift-Operator.
Dieser Operator tut dies.
Hier ist die Nummer 1, und wenn du i Verschiebung, Verschiebung nach links verlassen,
was denkst du, dass hat den Effekt zu tun, um dieser Person 1?
Wörtlich Verschieben Sie es um.
Also, wenn die Nummer 1 ist, was Sie auf der linken Seite haben und starten Sie mit der Initialisierung i bis 31,
Was ist das jetzt tun? Es wird diese Nummer 1 nehmen und verschieben es 31 Plätze hier.
Und weil es offensichtlich keine anderen Ziffern dahinter,
diese werden standardmäßig mit 0s ersetzt werden.
So werden Sie beginnen mit der Nummer 1, die natürlich aussieht -
und lass mich ziehen Sie es hier in der Mitte.
Und dann, wie Sie die Dinge nach links verschoben werden, dieser Kerl Wesentlichen geht auf diese Weise.
Aber sobald du das tust, wird eine 0 ausgefüllt
Wenn Sie es verschieben ein zweites Mal, es geht diesen Weg und voneinander 0 gefüllt wird in.
>> Sie verschieben es wieder und dann noch 0 gefüllt wird in.
Also, wenn Sie das Ding von 1 << i 31 Orten zu tun, beenden Sie immer eine Maske
das heißt 32 Zeichen lang ist, die am weitesten links von denen eine 1 ist,
der ganze Rest davon eine 0 ist.
Und es stellt sich heraus, als beiseite, Verschieben einer Zahl auf der linken wie diese
auch zufällig, und manchmal bequem,
hat den Effekt, zu tun, was zu dieser Zahl? >> [Schüler] verdoppeln.
Verdoppeln, weil jeder der Säulen - die 1s Ort, 2s Ort, 4s Ort,
8s Ort, 16s Platz - sie sind alle Verdoppelung, wie Sie auf der linken Seite zu gehen.
Oder besser gesagt, wenn Sie das 1s verschieben wirst du am Ende Verdoppelung des Wertes der Nummer.
Sie können am Ende dabei interessante Transformationen von Ziffern
indem alles über auf diese Weise durch Potenzen von 2.
Also, wie funktioniert das?
Dies ergibt dann mir eine Maske, die alle 0, außer für eine 1 in genau der Stelle möchte ich es,
und dann dieser Ausdruck, die von toupper.c gestohlen wird,
ist einfach zu sagen, nehmen Sie die Zahl n, die der Benutzer eingegeben wird,
"Und" es mit dieser Maske, und was wirst du bekommen?
Du wirst eine 1 bekommen, wenn es eine 1 in diesem maskierten Lage,
oder du wirst eine 0 zu erhalten, wenn es nicht.
Und damit alle dieses Programm nicht effektiv ist, hat es eine Schleife,
und es entsteht eine Maske mit einer 1 über hier, dann eine 1 über hier, dann eine 1 hier rüber,
und es nutzt diese bitweise UND Trick zu sagen, gibt es eine 1-Bit in der Eingabe des Benutzers hier?
>> Gibt es ein 1-Bit in der Eingabe des Benutzers hier? Und wenn ja, buchstäblich drucken 1, sonst gedruckt 0.
Wir tun dies mit ints, nur weil das ist, warum tun wir 32 Bit sind statt 8,
aber was wir dann eingeführt ist bitweise AND, diese bitweise OR,
und das linke Shift-Betreiber, die nicht oft schrecklich hilfreich
aber es stellt sich heraus, dass sie sein kann.
In der Tat, wenn Sie waren so etwas wie ein Array von booleschen stellen
nur zu repräsentieren wahr oder falsch, nehme an, Sie wollten zu verfolgen, ob oder nicht zu halten
ein Raum voller 300 Schüler vorhanden ist,
Sie könnten erklären, ein Array der Größe 300 vom Typ bool, so dass Sie 300 bools bekommen,
und Sie können jeweils auf true gesetzt, wenn jemand hier ist und sonst false.
Warum ist diese Vertretung in diesem Datenstruktur ineffizient?
Was ist schlimm daran das Design dieser Datenstruktur, ein Array von 300 bools?
Was ist ein bool, in der Tat, unter der Haube?
Auch dies ist etwas, das möglicherweise nicht vertraut.
Es stellt sich heraus gibt es keine bool.
Erinnern wir uns Art geschaffen, mit dem cs50.h Datei,
die selbst umfasst Standard bool.
C ist eine Art von dumm, aber wenn es um bool kommt.
Es verwendet 8 Bit für jeden bool darstellen, ist was ganz verschwenderisch
weil offensichtlich, wie viele Bits Sie brauchen, um einen bool dar? Nur 1.
So stellt sich heraus, dass, wenn Sie haben nun die Möglichkeit mit bitweisen Operatoren
auf einzelne Bits sogar in einem char, sogar in einem einzigen Byte zu manipulieren,
es stellt sich heraus Sie den Speicher benötigt, um etwas dumm darstellen könnte sinken
wie dieser Besuch styled Datenstruktur mit einem Faktor von 8.
Anstelle der Verwendung von acht Bits auf true oder false darstellen, könnte man buchstäblich verwenden ein
durch ein einzelnes Byte für jeweils acht Schüler in der Klasse
und Umschalten 0-1 einzelnen Bits durch Verwendung dieser Arten von Low-Level-Tricks.
Das ist wirklich ein Ende der Energie setzen. Gibt es irgendwelche Fragen zu bitweise Operationen?
>> Yeah. >> [Student] Gibt es eine ausschließliche oder Betreiber?
Ja. Es ist eine exklusive oder Betreiber, die so aussieht, ^, die Karotte Symbol,
was bedeutet, nur das erste oder das zweite, was etwas kann eine 1 für die Ausgabe an ein 1 sein.
Es gibt auch eine nicht ~, mit denen Sie eine 0 auf 1 oder umgekehrt sowie invertieren wird.
Und es gibt auch eine Verschiebung nach rechts Betreiber, >>, die das Gegenteil von dem, was wir gesehen haben, ist.
Gut. Lassen Sie uns die Dinge jetzt auf ein höheres Niveau.
Wir begannen, indem er über Text und dann zu komprimieren
und Darstellen des Textes mit weniger Bitzahlen;
Wir sprachen ein wenig darüber, wie wir jetzt anfangen zu manipulieren Dinge auf einer bitweisen Ebene.
Lassen Sie uns nun heranzoomen bis 10.000 Fuß zur Darstellung
von komplexeren Dinge wie Grafiken.
Hier haben wir eine Fahne von Deutschland haben, haben wir hier ein von Frankreich.
Diese könnten in Dateiformate, die Sie vielleicht wissen vertreten sein - GIFs, zum Beispiel.
Wenn Sie jemals ein Bild auf dem Web, die in. Gif endet gesehen
dies ist ein Graphics Interchange Format.
Beide Fahnen hier Art eignen sich die Kompression
für das, was vielleicht offensichtlichste Grund? >> [Unverständlich Studenten Antwort]
Es gibt eine Menge von Wiederholungen, nicht wahr?
Um Deutschland die Flagge zu senden, daran zu denken als ein Bild auf dem Bildschirm
Zurück in Ihrem Scratch Tag.
Sie erinnern sich vielleicht, dass es einzelne Pixel oder Punkte, die ein Bild zu komponieren.
>> Es gibt eine ganze Reihe von schwarzen Punkten und anderen ganze Reihe von schwarzen Punkten.
Es gibt eine Reihe von Zeilen von schwarzen Punkten, die wir sehen, ob wir in wirklich gezoomt konnte,
gern, wenn wir auf Robs Gesicht in Photoshop erkennen.
Sobald wir tiefer und tiefer und tiefer in das Bild,
Sie begann sehen die pixelation, alle Quadrate, die sein Auge in diesem Fall zusammen.
Gleiches Geschäft hier. Wenn wir gezoomt ziemlich viel, würde man die einzelnen Punkte.
Nun, das ist irgendwie eine Verschwendung von Bits.
Wenn eine dritte der Fahne ist schwarz und der dritte Teil der Fahne ist gelb usw.,
warum können wir nicht irgendwie komprimiert diese Flagge?
Und auch die Flagge Französisch konnte komprimiert, obwohl das Muster ist ein bisschen anders werden.
Es stellt sich heraus das GIF-Dateiformat ist ein verlustfreies Format,
das heißt, Sie können ein Bild, wie die deutsche Fahne hier nehmen,
Sie werfen eine Menge seiner Bits ohne Abstriche an der Qualität.
Dies steht im Gegensatz zu so etwas wie JPEGs,
mit denen die meisten von uns sind wahrscheinlich besser vertraut.
Facebook Fotos und Flickr Fotos und dergleichen
fast immer als JPEGs gespeichert, wenn sie hochgeladen sind,
aber JPEGs ist eine verlustbehaftete - LOSSY - Format, wobei Sie wegwerfen müssen bits
aber Sie können auch wegwerfen Qualität.
Und so, wenn Sie komprimieren Bilder mit Photoshop oder laden Sie sie auf Facebook
oder nehmen sie an einem wirklich crappy Telefon,
Sie wissen, dass das Bild zu bekommen sehr fleckig und pixelig beginnt,
und das ist, weil es durch den Computer oder Handy komprimiert wird
buchstäblich werfen Informationen entfernt.
Aber GIF ist erstaunlich, dass es weniger Bits verwenden, als es vielleicht standardmäßig
ohne Informationen zu verlieren.
>> Und es wesentlich tut dies wie folgt.
Anstatt store in einer Datei wie ein BMP würde ein RGB-Tripel für schwarz, schwarz, schwarz, schwarz,
schwarz, schwarz, schwarz, schwarz, schwarz, schwarz, schwarz, schwarz und so weiter,
vielmehr wird das GIF-Format gehen zu sagen, "Black"
und dann: "Wiederholen Sie diese 100-mal", oder so ähnlich.
"Black, wiederholen Sie diesen 100-mal, schwarz, wiederholen Sie diese 100-mal ..."
"Yellow, wiederholen Sie diesen 100-mal."
Und so erinnert sich im Wesentlichen die linke Pixel
und dann kodiert irgendwie den Begriff der Wiederholung dieses Pixels wieder und wieder.
So GIFs können dann komprimiert selbst ohne Informationen zu verlieren.
Aber wenn Sie zu erraten, wenn es das ist der Algorithmus, dass die Verwendung GIFs,
welche dieser Flaggen, obwohl sie gleich groß schauen,
wird kleiner sein, wenn auf der Festplatte als GIF gespeichert? >> [Schüler] Deutschland.
Deutschland wird kleiner sein? Warum?
[Schüler] Weil du es wiederholen viele, viele Male horizontal
und dann wiederholen Sie eine andere Zeit. >> Genau.
Weil die Leute, die GIF erfunden nur irgendwie willkürlich entschieden
dass die Wiederholung wird horizontal und seitlich nicht genutzt werden.
Es gibt eine Menge mehr Wiederholungen seitlich hier in der deutschen Flagge als im Französisch Flagge.
Also, wenn wir tatsächlich öffnen Sie einen Ordner auf meiner Festplatte, die diese GIFs hat,
man kann tatsächlich sehen, dass die deutsche Flagge hier 2 Kilobyte und die Französisch ist man 4 Kilobyte.
Es passiert ein Zufall sein, dass man zweimal das andere ist,
aber es ist in der Tat der Fall, dass die Flagge Französisch viel größer ist.
>> Auch wenn wir hier reden über Grafiken können die gleichen Ideen zu gelten
nicht Dinge wie Flaggen, sondern Bilder, die ein wenig komplexer sind.
Wenn Sie ein Bild von einem Apfel zu nehmen, sicherlich gibt es eine Menge von Doppelarbeit gibt,
so konnten wir irgendwie vergessen, dass die Standard-Hintergrund ist blau
und nicht, wie das rechte Bild suggeriert,
müssen die Farbe jedes einzelnen Pixels im Bild erinnern.
So können wir Bits wegwerfen dort ohne Informationen zu verlieren.
Der Apfel sieht immer noch genau das gleiche.
In diesem Beispiel hier können Sie sehen, was passiert in einem Film.
Diese stellen old-school Filmrollen, wobei in der oberen Bild gibt
Sie haben ein Wohnmobil fahren vorbei an einem Haus und einen Baum.
Und wie van fährt vorbei von links nach rechts, was ist offensichtlich nicht ändern?
Das Haus ist nicht überall, und der Baum ist nicht überall.
Das einzige, was sich bewegt ist die van in diesem Fall.
So als Hintergrund Unverändert sagt, was man in Filmen zu tun
ist ähnlich einfach wegwerfen Informationen, die nicht in zwischen den Frames nicht ändert.
Dies wird allgemein als Interframe-Kompression bekannt
wobei, wenn dieser Rahmen sieht fast identisch zu dieser,
Lassen Sie uns nicht die Mühe Speichern auf der Festplatte eine der identischen Informationen
auf diesen Zwischenrahmen, lasst uns nur Keyframes einmal in eine Weile
dass tatsächlich speichern diese Informationen redundant wie ein kleines Plausibilitätsprüfung.
>> Im Gegensatz dazu ist ein anderer Ansatz zur Komprimierung von Videodaten in diesem zweiten und niedrigeren Beispiel hier,
wo anstatt Speicher 30 Frames, warum gehst du nicht einfach speichern 15 Bildern pro Sekunde statt?
Vielmehr als der Film Art von fließenden schön, perfekt,
könnte es aussehen, wie es Stottern ist ein bisschen, ein wenig old school,
aber der Netto-Effekt wird sein, weit weniger Bits als sonst notwendig sein könnte, zu verwenden.
Woher kommt also diese dann lassen Sie uns?
Das war ein bisschen eine Seite, wo sonst können Sie mit Kompression gehen.
Für mehr Informationen darüber, nehmen eine Klasse wie CS175 hier.
Hier ist ein weiteres Beispiel im Video.
Wenn die Biene ist das einzige, was in Bewegung,
Sie können wirklich wegwerfen Informationen in diesen mittleren Rahmen
weil die Blume und Himmel und Blätter werden nicht verändert.
Aber lassen Sie uns betrachten nun eine letzte Sache.
In den nächsten 5 Minuten verlassen wir C für immer hinter sich in der Vorlesung? Ja. Nicht in den pset, though.
Zuletzt Geschichte über C und dann werden wir sehr sexy Zeug
mit HTML und Web-und Woo-hoo. Gut.
Here we go. Das ist die Motivation.
Es stellt sich heraus die ganze Zeit, wenn wir wurden Schreiben von Programmen laufen wir Clang.
Und Clang, die wir seit der ersten Woche ziemlich viel gesagt, nimmt Quellcode
und wandelt sie in Objektcode.
Es dauert C und wandelt es in 0s und 1s.
Ich habe Art von Ihnen liegt seit ein paar Wochen, weil es nicht ganz so einfach.
>> Es gibt eine Menge mehr los unter der Haube, wenn Sie ein Programm wie Clang laufen.
In der Tat kann der Prozess der Erstellung eines Programms wirklich zusammenfassen,
wie man es von Robs Video auf Compilern erinnern,
in diese 4 Schritte: Pre-Processing, sich selbst kompilierte, Montage und Vernetzung.
Aber wir in der Klasse und die meisten Menschen in der Welt in der Regel fassen alle diese Schritte
nur als "kompilieren."
Aber wenn wir mit Source Code wie diesen zu starten, rufen das ist vielleicht die einfachste C-Programm
haben wir bisher geschrieben erinnern, dass beim Kompilieren es so aussieht endet.
Aber es gibt tatsächlich ein Zwischenschritt, und diese Schritte sind wie folgt.
Zuerst gibt es das Ding an der Spitze dieses und die meisten unserer Programme,
# Include
Was bedeutet # include für uns tun?
Es ist ziemlich viel kopiert und fügt die Inhalte der stdio.h in meine Datei so, dass warum?
Warum muss ich über den Inhalt der stdio.h kümmern? Was ist da drin von Interesse?
Printf Erklärung, dessen Prototyp, so dass der Compiler weiß dann, was ich meine
wenn ich diese Funktion printf erwähnen.
So Schritt 1 bei der Zusammenstellung ist Pre-Processing, wobei ein Programm wie Clang
oder einige Hilfsprogramm, dass Clang kommt mit liest den Code von oben nach unten,
links nach rechts, und jedes Mal, es sieht ein Symbol # gefolgt von einem Schlüsselwort wie include,
es führt, dass der Betrieb, Kopieren und Einfügen in diesem Fall stdio.h in Ihre Datei.
Das ist Schritt 1.
Dann haben Sie eine viel größere C-Datei wegen der riesigen Kopieren, Einfügen Job, der gerade passiert ist.
>> Schritt 2 wird nun kompilieren.
Aber es stellt sich heraus kompilieren dauert Source Code, der wie folgt aussieht
und verwandelt es in etwas, das wie folgt aussieht,
die für Kenner heißt? >> [Schüler] Versammlung. >> Assembler-Code.
Das ist eigentlich etwas, wenn Sie nehmen CS61 Sie eintauchen werde im Detail.
Dies ist nur ungefähr so ​​nah wie man zu schreiben 0s und 1s sich selbst zu bekommen
aber das Schreiben Dinge in einer Weise, die macht immer noch wenigstens ein wenig Sinn.
Dies sind Maschinenbefehle, und wenn wir unten scrollen, um die Hauptfunktion hier
feststellen, dass es diese Push-Befehl, bewegen Anweisung, subtrahieren Unterricht,
CALL-Anweisung, und so weiter.
Wenn Sie hören, dass Ihr Computer Intel inside hat,
Sie haben eine Intel CPU in Ihrem Mac oder PC, was bedeutet das?
Eine CPU kommt von Unternehmen wie Intel das Verständnis bestimmter Befehle gebaut.
Sie haben keine Ahnung, was Funktionen wie Swap sind oder wichtigsten sind per se,
aber sie wissen, was auf sehr niedriger Ebene Anweisungen wie addieren, subtrahieren, drücken,
bewegen, nennen, und so weiter sind.
Also, wenn Sie C-Code zu kompilieren in Assembler,
Ihre sehr benutzerfreundlich aussehende Code wird in etwas, das wie folgt aussieht umgewandelt,
dass buchstäblich bewegt oder 4 Byte um in so kleinen Einheiten in die und aus der CPU.
Aber schließlich, wenn Clang ist bereit, diese Darstellung Ihres Programm teilnehmen
in 0 und 1, dann wird der Schritt als Montage geschieht,
und dies wiederum alles geschieht im Handumdrehen beim Laufen Clang.
Wir beginnen hier, gibt es eine Datei wie diese, und dann wandelt sie in dieser 0s und 1s.
Und wenn Sie wollen zurück zu einem bestimmten Zeitpunkt und tatsächlich sehen dies in Aktion,
wenn ich gehe in hello1.c--dies ist eines der ersten Programme, die wir betrachtet -
Normalerweise würden wir dies mit Clang hello1.c kompilieren und dies würde uns a.out.
Wenn hingegen geben Sie stattdessen die Option-S, was Sie bekommen, ist hello1.s
und du wirst tatsächlich sehen die Assembler-Sprache.
>> Ich tue dies für einen sehr kurzen Programm, aber wenn Sie zurück zum Scramble
oder Recover oder Programm, das Sie geschrieben haben und nur aus Neugier
wollen sehen, was es tatsächlich aussieht, was tatsächlich in der CPU zugeführt wird,
Sie können, dass-S-Flagge mit Clang verwenden.
Aber dann schließlich gibt es noch ein gotcha.
Hier sind die 0 und 1, die meine Implementierung von Hallo Welt vertreten.
Aber ich habe jemand anderes die Funktion in meinem Programm.
Also auch wenn der Prozess wurde ich hello.c,
Es wird in Assembler-Code kompiliert, und dann wird es in 0 und 1 montiert,
die einzige 0s und 1s, die zu diesem Zeitpunkt ausgegeben werden,
sind diejenigen, die sich aus meinem Code.
Aber die Person, die printf schrieb sie ihren Code kompiliert vor 20 Jahren
und es ist jetzt irgendwo auf dem Gerät installiert ist,
so dass wir irgendwie auf seine 0s und 1s mit meinem 0s und 1s verschmelzen,
und das bringt uns zu der vierten und letzten Schritt der Zusammenstellung, wie die Verknüpfung bekannt.
Also auf der linken Seite haben wir genau das gleiche Bild wie zuvor:
hello.c wird Assembler-Code wird 0s und 1s.
Aber daran erinnern, dass ich die Standard I / O-Bibliothek verwendet in meinem Code,
und das bedeutet, irgendwo auf dem Computer gibt es eine Datei namens stdio.c
oder zumindest die kompilierte Version davon weil jemand vor einigen Jahren
stdio.c kompiliert in Assembler-Code und dann eine ganze Reihe von 0s und 1s.
Dies ist, was als einer statischen oder einer dynamischen Bibliothek bekannt.
Es ist einige Datei irgendwo sitzt im Gerät.
>> Aber schließlich habe ich meine 0s und 1s zu nehmen und diese Person die 0 und 1
und irgendwie miteinander verbinden, buchstäblich zu kombinieren, die 0 und 1
in einer einzigen Datei namens a.out oder hello1 oder was auch immer, rief ich mein Programm
so dass das Endergebnis hat alle 1s und 0s, die mein Programm zusammenstellen sollte.
So all dieser Zeit in diesem Semester, wenn Sie schon mit Clang
und noch mehr kürzlich ausführten machen, um Clang laufen,
Alle diese Schritte wurden geschieht Art sofort, sondern ganz bewusst.
Und so, wenn Sie weiter auf in der Informatik, nämlich CS61,
Das ist die Schicht, dass Sie zu schälen back off gibt es weiterhin
reden Effizienz, Auswirkungen auf die Sicherheit und dergleichen dieser unteren Ebene Details.
Aber damit sind wir dabei, C hinter sich lassen.
Fahren wir fort und nehmen unsere 5-minütige Pause jetzt
und wenn wir zurückkommen: das Internet.
Gut. Wir sind zurück.
Jetzt beginnen wir unseren Blick nicht nur auf HTML, weil, wie Sie sehen werden,
HTML selbst ist eigentlich ziemlich einfach
aber wirklich bei Web-Programmierung allgemein Vernetzung allgemein
und wie alle diese Technologien kommen zusammen
uns zu erlauben, viel mehr anspruchsvolle Programme der Spitze der Internet erstellen
als bisher konnten wir in diesen schwarzen und weißen Fenstern.
In der Tat, an dieser Stelle in den Semesterferien, obwohl wir verbringen relativ weniger Zeit
auf PHP, HTML, CSS, JavaScript, SQL und mehr,
die meisten Studenten zu tun am Ende tut letzten Projekte, die web-basiert sind
denn wie Sie sehen werden, der Hintergrund haben Sie jetzt in C
ist sehr viel für diesen höheren Sprachen.
>> Und wie Sie sich Gedanken über Ihre letzte Projekt,
die, ähnlich wie Problem Set 0, wo Sie wurden ermutigt
die meisten nichts von Interesse für Sie tun Scratch,
das endgültige Projekt ist Ihre Chance, Ihre neu gewonnene Wissen und versierte mit C nehmen
oder PHP oder JavaScript oder dergleichen für eine Testfahrt
und erstellen Sie Ihre eigenen Stück Software für die Welt zu sehen.
Und Samen, den Sie mit Ideen, wissen, dass man hier den Kopf, projects.cs50.net.
Jedes Jahr, erbitten wir Ideen aus Dozenten und Mitarbeiter und Studenten auf dem Campus
nur um ihre Ideen für interessante Dinge, die gelöst mit Computern könnte einreichen,
mit Webseiten, mittels Software.
Also, wenn Sie kämpfen, um mit einer Idee des eigenen,
mit allen Mitteln zu blättern durch die Ideen es ab diesem Jahr und letzte.
Es ist vollkommen in Ordnung, ein Projekt, das in Angriff genommen wurde, bevor anzugehen.
Wir haben viele Apps für das Sehen den Status der Wäsche auf dem Campus gesehen
viele Anwendungen für die Navigation in den Speisesaal Menü
viele Anwendungen für die Navigation im Vorlesungsverzeichnis und dergleichen.
Und in der Tat, in einer zukünftigen Vortrag und in Zukunft Seminare,
stellen wir Ihnen einige öffentlich zugänglichen APIs einzuführen, beide im Handel erhältlich
wie auch hier erhältlich CS50 auf dem Campus, so dass Sie Zugriff auf die Daten
und können dann interessante Dinge mit ihm.
Also mehr über den endgültigen Projekten in ein paar Tagen, wenn wir die Spezifikation freizugeben,
aber jetzt wissen, dass man solo arbeiten oder mit einem oder zwei Freunden
auf fast jedem Projekt für Sie von Interesse.
Das Internet ist.
Du gehst vor und ziehen Sie Ihren Laptop, gehen Sie zu facebook.com zum ersten Mal,
er nicht in letzter Zeit protokolliert, und drücken Sie Enter. Was genau passiert?
>> Wenn Sie auf Ihrem Computer die Eingabetaste drücken, eine ganze Reihe von Schritten
Starten Art von Zauberhand passiert.
Also hier auf der linken Seite, Web-Server wie Facebook ist hier auf der rechten Seite,
und irgendwie Sie verwenden diese Sprache namens HTTP, Hypertext Transfer Protocol.
HTTP ist keine Programmiersprache. Es ist mehr ein Protokoll.
Es ist eine Reihe von Konventionen, dass Web-Browsern und Web-Servern verwenden, wenn kommunizierende.
Und was das bedeutet, ist wie folgt.
Vieles in der realen Welt, wir haben diese Konventionen
wo, wenn Sie treffen einige Menschen zum ersten Mal, wenn Sie nichts dagegen haben humoring mich hier,
Ich könnte kommen zu euch sagen: "Hallo, mein Name ist David." >> Hallo, David. Mein Name ist Sammy.
"Hallo, David. Mein Name ist Sammy."
So, jetzt haben wir gerade in dieser Art von dummen Menschen-Protokoll engagiert
wo ich das Protokoll initiiert hat Sammy reagiert,
haben wir die Hände geschüttelt, und die Transaktion abgeschlossen ist.
HTTP ist sehr ähnlich im Geiste.
Wenn Ihr Web-Browser fordert www.facebook.com,
was Ihr Browser wirklich tut baut seine Hand, so zu sprechen,
an den Server und es dem Senden einer Nachricht.
Und diese Botschaft ist in der Regel so etwas wie bekommen - was wollen Sie kommen? -
mich die Startseite, die in der Regel durch einen einfachen Schrägstrich am Ende der URL bezeichnet wird.
Und damit Sie wissen, welche Sprache ich spreche, bin ich der Browser werde Ihnen sagen,
daß ich spreche HTTP Version 1.1,
Und auch für eine gute Maßnahme, ich werde Ihnen sagen, dass der Gastgeber, die ich möchte die Homepage
ist facebook.com.
Typischerweise wird ein Web-Browser, ohne Wissen Sie, der Mensch,
sendet diese Meldung über das Internet, wenn Sie geben einfach www.facebook.com,
>> Geben Sie in Ihrem Browser.
Und was bedeutet Facebook antwortet mit?
Es reagiert mit einigen ähnlich aussehende kryptische Details, sondern auch vieles mehr.
Lassen Sie mich gehen Sie vor, um Facebook-Homepage hier.
Dies ist der Bildschirm, dass die meisten von uns wohl nie sehen, wenn Sie in all der Zeit angemeldet bleiben,
aber dies ist in der Tat ihrer Homepage.
Wenn wir dies in Chrome zu tun, feststellen, dass Sie ziehen diese kleinen Kontextmenüs.
Mit Chrome, ob auf Mac OS, Windows, Linux, oder dergleichen,
Wenn Sie oder linken Maustaste steuern, können Sie in der Regel nach oben ziehen ein Menü, das wie folgt aussieht,
wo ein paar Optionen zu erwarten, ist eine von denen View Page Source.
Sie können in der Regel auch auf diese Dinge zu bekommen, indem Sie auf das Menü Ansicht und stochern.
Zum Beispiel, hier unter Ansicht ist Entwickler die gleiche Sache.
Ich werde weitermachen und schauen View Page Source.
Was Sie sehen, ist das HTML, dass Mark hat geschrieben facebook.com vertreten.
Es ist ein komplettes Chaos hier, aber wir werden sehen, dass dies ein wenig mehr Sinn macht es dauerte nicht lange.
Aber es gibt einige Muster hier. Lassen Sie mich nach unten scrollen, wie dieses Zeug.
Das ist schwer für einen Menschen zu lesen, aber feststellen, dass es dieses Muster der spitzen Klammern
mit Schlüsselwörtern wie Option Schlüsselwörter wie Wert, einige Zeichenfolgen in Anführungszeichen.
Dies ist, wo, wenn Sie sich angemeldet haben für das erste Mal, angegeben, was Ihr Geburtsjahr ist.
Das Dropdown-Menü der Geburt Jahr ist irgendwie kodiert hier
in dieser Sprache namens HTML, Hypertext Markup Language.
In anderen Worten, wenn Ihr Browser eine Webseite anfordert,
es spricht diese Konvention als HTTP.
Aber was bedeutet facebook.com auf dieses Ersuchen reagieren mit?
>> Es reagiert mit einigen dieser kryptischen Botschaften, wie wir in einem Moment sehen.
Aber die meisten seiner Antwort in Form von HTML, HyperText Markup Language.
Das ist die eigentliche Sprache, in der eine Web-Seite geschrieben wird.
Und was für ein Web-Browser wirklich so ist, nach Erhalt von etwas, das wie folgt aussieht,
liest es von oben nach unten, von links nach rechts, und jedes Mal, es sieht eine dieser spitzen Klammern
gefolgt von einem Schlüsselwort wie die Option, zeigt es, dass die Markup-Sprache in geeigneter Weise.
In diesem Fall wäre es eine entsprechende Dropdown-Menü von Jahren.
Aber auch dies ist ein komplettes Chaos zu betrachten.
Dies ist nicht, weil Facebook-Entwickler 0 für 5 manifestieren für Stil, zum Beispiel.
Dies ist, weil die meisten der Code, den sie schreiben, ist in der Tat geschrieben schön,
gut kommentiert, schön eingerückt, und dergleichen,
aber natürlich Maschinen, Computer, Browser wirklich nicht give a damn
ob Ihr Code ist gut gestylt.
Und in der Tat, es ist völlig unwirtschaftlich, drücken Sie die Tab-Taste alle jene Zeiten
und legte Kommentare Alles gesamten Code und wirklich aussagekräftigen Variablennamen wählen
denn wenn der Browser nicht egal ist, ist alles, was Sie am Ende des Tages zu tun vergeuden Bytes.
>> So stellt sich heraus, was die meisten Websites zu tun ist, obwohl der Quellcode für facebook.com,
für cs50.net und alle diese anderen Seiten im Internet
sind in der Regel gut geschrieben und gut kommentiert und schön eingerückt und dergleichen,
in der Regel vor der Website ins Internet gestellt wird, wird der Code minimierte,
wobei die HTML und CSS - etwas, was wir bald sehen -
der JavaScript-Code, den wir bald sehen wird komprimiert,
wobei lange Variablennamen zu X und Y und Z,
und all das Leerzeichen, die alles so lesbar macht ist alles weggeworfen,
denn wenn man es auf diese Weise denken, bekommt Facebook eine Milliarde Seitenaufrufen einen Tag -
etwas Verrücktes wie die - so was ist, wenn ein Programmierer nur um anal
drücken Sie die Leertaste ein extra Zeit nur Gedankenstrich einige Codezeile noch so viel mehr?
Was ist die Implikation, wenn Facebook bewahrt, dass Leerzeichen
in all der Bytes schicken sie zurück zum Menschen über das Internet?
Schlagen Sie die Leertaste, sobald gibt Ihnen eine zusätzliche Byte in Ihrer Datei.
Und wenn eine Milliarde Menschen gehen dann auf die Homepage downloaden an diesem Tag,
wie viel mehr Daten haben Sie über das Internet übertragen?
Ein Gigabyte für keinen guten Grund.
Und gewährt, für eine Vielzahl von Websites, das ist nicht so eine skalierbare Ausgabe,
aber für Facebook, Google, für einige der beliebtesten Websites
es großer Anreiz finanziell, um Ihren Code wie ein Chaos aussehen
so dass Sie möglichst wenige Bytes wie möglich mit zusätzlich dann komprimieren
mit so etwas wie zip, als ein Algorithmus gzip,
, dass der Browser automatisch für Sie. Aber das ist schrecklich.
Wir werden es nie erfahren Sie alles über anderer Leute Webseiten und wie man Web-Seiten gestalten
wenn wir müssen es so aussehen.
>> So glücklicherweise Browsern wie Chrome und IE und Firefox in diesen Tagen
typischerweise mit eingebautem Entwickler-Tools kommen.
In der Tat, wenn ich hier unten gehen, um Element oder Prüfen gehe ich anschauen, Developer,
und Developer Tools explizit zu gehen,
Dieses Fenster an der Unterseite von meinem Bildschirm erscheint jetzt.
Es ist ein wenig einschüchternd auf den ersten, denn es gibt eine Menge von unbekannten tabs hier
aber wenn ich auf Elemente klicken Sie den ganzen Weg in der linken unteren,
Chrome ist offensichtlich ziemlich schlau. Er weiß, wie der gesamte Code zu interpretieren.
Und so was Chrome tut, ist es säubert alle Facebook-HTML.
Auch wenn es nicht Leerzeichen gibt, gibt es nicht Einzug dort,
Jetzt merke, dass ich damit beginnen, diese Web-Seite umso hierarchisch navigieren.
Es stellt sich heraus, dass jede Web-Seite in einer Sprache namens HTML5 geschrieben werden sollte mit diesem zu starten,
Diese DOCTYPE-Deklaration, so zu sprechen: <! DOCTYPE html>
Es ist eine Art von Licht und grau gibt, aber das ist die erste Zeile des Codes in dieser Datei
und das sagt nur den Browser "Hey, hier kommt etwas HTML5. Hier kommt eine Web-Seite."
Die erste Klammer darüber hinaus passiert, dieses Ding, eine offene Halterung HTML-Tag sein,
und dann, wenn ich tauchen tiefer - diese Pfeile sind völlig bedeutungslos;
sie sind nur für die Präsentation willen, sie sind nicht wirklich in der Datei -
feststellen, dass innerhalb der HTML tag von Facebook, alles, was mit einer Klammer beginnt
und dann hat ein Wort ist ein Tag genannt.
So in der HTML-Tag ist offenbar ein Kopf-Tag und ein Body-Tag.
Im Inneren des Kopfes tag ist jetzt eine ganze Durcheinander für Facebook
denn sie haben eine Menge von Metadaten und andere Dinge für Marketing und Werbung.
>> Aber wenn wir nach unten scrollen, down, down, down, mal sehen, wo es ist. Hier ist es.
Dieser ist zumindest etwas bekannt.
Der Titel der Facebook-Homepage, wenn Sie jemals zu sehen in der Registerkarte in Ihrer Titelleiste
ist Welcome to Facebook - Einloggen, Registrieren oder Erfahren Sie mehr.
Das ist das, was man in Chrome die Titelleiste zu sehen,
und das ist, wie es im Code ist vertreten.
Wenn wir alles im Kopf zu ignorieren, sind die meisten der Mut einer Web-Seite in den Körper,
und es stellt sich heraus, dass Facebook-Code aussehen wird komplexer
als die meisten Dinge, die wir dann zunächst zu schreiben, nur weil es gewesen ist im Laufe der Jahre gebaut,
aber es gibt eine ganze Reihe von Skript-Tags, JavaScript-Code,
das macht die Website sehr interaktiv:
Sehen Status-Updates sofort mit Sprachen wie JavaScript.
Es gibt so etwas wie ein div, die ein Geschäftsbereich von einer Seite ist.
Aber bevor wir zu diesem Detail zu gehen, wollen wir versuchen zu verkleinern
und eine einfachere Version von Facebook 1,0 aussehen, so zu sprechen.
Hier ist die Hallo Welt von Web-Seiten.
Es hat diesen DOCTYPE-Deklaration an der Spitze
das ist ein wenig anders als alles andere.
Nichts anderes haben wir in einer Web-Seite zu schreiben wird mit <beginnen! außer dieser Linie gibt
und außer für etwas namens Kommentare in HTML.
Aber zum größten Teil, alles ist in einer Web-Seite öffnende Klammer, Stichwort, Klammer.
>> In diesem Fall können Sie die einfachste von Web-Seiten möglich.
Das HTML-Tag enthält eine head-Tag und es enthält einen Körper tag,
aber feststellen, dass es diese Vorstellung von Starten und Stoppen Tags.
Dies ist der Starttag für HTML, das ist die enge tag oder End-Tag.
Beachten Sie, dass diese Art von Gegensätzen sind in dem Sinne, dass die enge tag oder End-Tag
hat dies uns innerhalb von sich selbst zu senken.
Inzwischen gibt es eine offene head-Tag hier und eine enge Kopf-Tag hier.
>> Es ist ein offenes Titel und eine enge Titel-Tag hier.
Die Tatsache, dass ich den Titel auf einer Linie, rein willkürlich gesetzt.
Es sah aus wie es schön wäre in eine Zeile passen, so dass ich nicht die Mühe Enter drücken ein paar mal.
Inzwischen Gedankenstrich der Körper habe ich nur noch so klar.
Beachten Sie, dass HTML eine ziemlich dumme Sprache ist.
In der Tat, wieder in den Tag, bevor es WYSIWYG-Editoren
und Microsoft Word, wo Sie sagen können "Machen Sie diese fett, machen diese kursiv"
Sie würden tatsächlich geben kleine Kommandos in Aufsätzen 20 + Jahren
wobei man sagen würde: "Beginnen Sie diesen Text fett. Stoppen Sie die diesen Text fett."
"Beginnen Sie diesen Text kursiv. Stoppen Sie die dieser Text kursiv."
>> Das ist, was HTML oder Markup-Sprache ist.
Dieser erste Tag sagt: "Hey, Browser. Hier kommt etwas HTML."
Der nächste Tag sagt: "Hey, Browser. Hier kommt der Kopf, der Kopf meiner Web-Seite."
"Hey, Browser. Hier kommt der Titel."
Und dann hier rüber, "Hey, Browser. Das ist es für den Titel."
Also das ist, wie der Browser nicht mehr angezeigt werden mehr Zeichen als hallo kennt, weltweit
in der Titelleiste.
Inzwischen dies sagt, "Das ist es für den Kopf."
Dieser sagt: "Hier kommt der Körper Hier ist der eigentliche Körper." - Buchstäblich die Worte Hallo Welt.
Und das hier sagt, "Das ist es für den Körper. Das ist es für den HTML."
So Browser sind ziemlich dumm.
Sie gerade gelesen das Zeug von oben nach unten, von links nach rechts, und genau das tun, was ihnen gesagt wird, zu tun.
Lasst uns tatsächlich ein kleines Beispiel hier.
Lassen Sie mich eröffnen die einfachsten Programme auf meinem Mac hier, nämlich TextEdit.
Unter Windows könnte Notepad.exe.
Aber das ist alles, was Sie brauchen, um so Web-Seiten.
Ich werde weitermachen und einfach kopieren und fügen Sie diesen Code in dieser Datei.
Ich werde weitermachen und speichern Sie es auf meinem Desktop,
und ich werde dies als hello.html speichern,
und jetzt wird die Datei hello.html benannt.
Hier ist es auf meinem Desktop.
Lassen Sie mich nun in einem Browser zu gehen und ziehen Sie die Datei in den Browser.
Und voila, hier ist meine erste Web-Seite.
Beachten Sie, dass der Titel der Registerkarte hallo ist weltweit nach dem Titel-Tag,
und bemerken, dass Hallo Welt der Körper meiner Web-Seite ist,
und woo-hoo, ich bin auf dem Internet.
>> Ich bin nicht wirklich, rechts, da diese Datei nicht auf dem Internet.
Es passiert auf meinem lokalen Festplatte an diesem bestimmten Pfad sein.
Aber die Idee ist die gleiche. Alles, was wir jetzt brauchen, ist ein Web-Server, auf die sie hochladen.
Aber lassen Sie uns zuerst tatsächlich einzuführen ein wenig mehr Komplexität und ein wenig mehr Stilisierung.
Dies ist eine einfache, wenn langweilig, Web-Seite.
Es stellt sich heraus es andere Arten von Tags können wir benutzen sind.
Zum Beispiel hier in gelb Ich habe 2 neue Tags eingeführt.
Wir werden nicht spielen viel mit diesen heute, aber feststellen, dass die Link-Tag
irgendwie sieht anders aus als alles andere.
Der Link-Tag nimmt, was sind die Attribute genannt,
und ein Attribut ist etwas, das Verhalten eines tag modifiziert.
In diesem Fall ist dies nicht die beste Wahl von Namen, Link, weil es irgendwie sinnlos,
aber dieser Link tag sagt, im Wesentlichen beinhalten die Datei namens styles.css Innenseite meiner Web-Seite.
Sie können sich diese als analog zu denken C die # include-Direktive.
Styles.css wird auf eine andere Sprache bezogen insgesamt, dass wir nicht mit der heutigen zu spielen,
aber es ist für Ästhetik: Schriftgrößen, Farben, Polster, Einzug, Ränder
und alle diese Art von Ästhetik Detail.
Inzwischen ist das Skript tag funktionell ähnliche
aber anstatt include CSS, dass die Sprache, enthält es eine andere Sprache, JavaScript.
Also mit anderen Worten, mit diesen 2 Tags werde ich schließlich in der Lage, meine eigene Web-Seite zu schreiben
sondern auch im Code zu ziehen, dass ich oder jemand anderes geschrieben hat
so dass wir auf andere Menschen auf ihren Schultern stehen, können wir üben gutes Design,
Ausklammern gemeinsamen Code.
Wenn ich 10 verschiedene Web-Seiten haben, bedeutet dies, dass einige meiner Ästhetik
können ausgeklammert werden, ähnlich wie # include in einer separaten Datei.
Also werden wir es bekommen.
Aber lasst uns eigentlich erst etwas interessanter mit dieser Datei.
>> Auch dies ist nur TextEdit. Ich bin technisch nicht auf dem Internet noch nicht, aber wir werden es schaffen.
Ich möchte hallo, Welt ein wenig mutiger als es ist.
So hallo, wir willkürlich sagen für fett.
Auch hier ist die Geschichte das gleiche: hallo, Komma, beginnen, diese kühne,
Dann Welt wird fett gedruckt, und das bedeutet mehr drucken diese in Fettschrift.
Lassen Sie mich gehen Sie vor und speichern Sie meine Datei, gehen Sie zurück zu Chrome, werde ich in nur so können wir es besser sehen zu vergrößern,
und laden Sie, und Sie werden sehen, dass die Welt nun fett.
Das Web ist alles über Hyperlinks, also lasst uns weitermachen und dies zu tun:
meine Lieblings-Webseite ist, sagen wir mal, youtube.com.
Speichern, neu zu laden. Okay. Es gibt ein paar Probleme jetzt neben der Abscheulichkeit der Website.
1, ich bin ziemlich sicher, dass ich getroffen Geben Sie hier. Und das tat ich.
Ich habe nicht nur getroffen, ich auch eingerückt Enter praktizieren, was wir über Stil gepredigt,
aber meine ist direkt neben Welt.
Warum ist dies so? Browser nur tun, was Sie zu tun ist.
Ich habe nicht den Browser gesagt, "Break-Linien hier. Absatz hier zu brechen. Einfügen"
So Browser, spielt es keine Rolle, ob ich zurück 30 Mal getroffen,
es ist immer noch zu meiner Rechten neben Welt zu setzen.
Was ich wirklich hier tun müssen, ist so etwas sagen wie , legen Sie einen Zeilenumbruch.
>> Und tatsächlich ist ein Zeilenumbruch eine Art seltsame Sache
weil Sie nicht wirklich starten kann Wechsel zu einer anderen Linie, dann tun Sie etwas,
und dann nicht mehr bewegt, um eine neue Zeile. Es ist eine Art einer atomaren Operation.
Entweder tun Sie es oder eben nicht. Sie Enter oder eben nicht.
So br ist ein wenig von einem anderen Tag, und so muss ich sowohl offen sortieren und schließen Sie es
alles auf einmal.
Die Syntax dafür ist.
Technisch könnte man etwas wie dies in einigen Versionen von HTML zu tun,
aber das ist einfach nur dumm, denn es gibt keinen Grund, zu starten und zu stoppen etwas
wenn man stattdessen tun sie alle auf einmal.
Erkenne, dass HTML5 nicht zwingend erforderlich diese Schrägstrich,
so werden Sie sehen, Lehrbüchern und Online-Ressourcen, die es nicht haben,
aber für eine gute Maßnahme lasst uns üben die Symmetrie, die wir bisher gesehen haben.
Dies bedeutet, dass das Tag sowohl geöffnet und geschlossen ist.
So, jetzt lass mich retten meine Datei, gehen Sie hier zurück.
Okay, es fängt an besser aussehen, mit Ausnahme der Web Ich weiß, ist eine Art anklickbar
und doch youtube hier scheint nicht zu nichts führen.
Das ist denn auch wenn es wie ein Link aussieht, ist der Browser nicht wissen, dass per se,
so habe ich den Browser sagen, dass dies ein Link ist.
>> Die Art und Weise, dies zu tun ist, um ein Anker-Tag verwenden:
<A href für hyper-Referenz, die die alte Schule Art zu sagen, ein Link ist,
= "Http://www.youtube.com">
und lassen Sie mich zu bewegen diese zu einer neuen Zeile einfach so, es ist ein wenig mehr lesbar,
und ich werde schrumpfen die Schriftgröße.
Ich bin noch nicht fertig? Nein, es geht um diese Dichotomie sein.
Dieser Tag, der Anker-Tag, tatsächlich zu nehmen ein Attribut,
was ändert sein Verhalten, und der Wert dieses Attributs ist offenbar YouTube URL.
Aber beachten Sie die Dichotomie ist, dass, nur weil das der URL Sie gehst ist,
das bedeutet nicht, das hat das Wort, das Sie unterstreichen und macht einen Link sein.
Vielmehr kann das so etwas wie dieses.
Also ich muss sagen, aufhören, dieses Wort ein Hyperlink durch die enge Anker-Tag.
Beachten Sie, ich tue das nicht.
1, würde dies nur eine Verschwendung von Zeit aller Beteiligten sein, und es ist nicht notwendig.
>> Um einen Tag zu schließen, können Sie nur den Namen des Tags wieder.
Sie erwähnen nicht, eines der Attribute.
Lassen Sie uns also retten, gehen Sie zurück. Okay, voila, jetzt ist es blau und Hyperlinks.
Wenn ich es auf, ich tatsächlich gehen auf YouTube.
Also auch wenn meine Web-Seite ist nicht über das Internet, ist es zumindest HTML,
und wenn lassen wir das Internet aufzuholen, würden wir tatsächlich am Ende hier bei youtube.com.
Und ich kann zurück gehen und hier ist meine Web-Seite. Aber bemerkt.
Wenn Sie jemals Spam oder eine Phishing-Attacke geworden,
Jetzt haben Sie die Möglichkeit nach nur fünf Minuten, um das gleiche zu tun.
Wir können hier gehen und etwas tun, wie www.badguy.com
oder was auch immer die skizzenhaften Website ist, und dann kann man sagen, ob Ihr PayPal-Konto.
[Gelächter] Und jetzt wird auf badguy.com, die werde ich nicht auf Sie zu gehen
weil ich habe keine Ahnung, wohin das führt. [Gelächter]
>> Aber wir haben jetzt die Möglichkeit, tatsächlich dort enden.
So sind wir wirklich gerade erst an der Oberfläche kratzen.
Wir sind nicht die Programmierung per se; wir schreiben Markup-Sprache.
Aber sobald wir runden unser Wortschatz in HTML,
wir stellen PHP, eine tatsächliche Programmiersprache
das wird es uns ermöglichen, HTML automatisch generieren, erzeugen CSS automatisch
so dass wir am Mittwoch beginnen, zu implementieren, zu sagen,
unsere eigene Suchmaschine und vieles mehr.
Aber mehr dazu in ein paar Tagen. Wir sehen uns dann.
>> [CS50.TV]