>> [Review: Quiz 1]
[Ali Nahm, Oreoluwa Barbarinsa, Lucas Freitas, Rob Bowden] [Harvard University]
[Dies ist CS50.] [CS50.TV]
[Lucas Freitas] Willkommen alle. Dies ist eine Bewertung für ein Quiz.
So wie ein Haftungsausschluss, das ist - ich meine, wir werden versuchen zu vertuschen
so viel Material wie möglich, aber das bedeutet nicht, dass
wir werden all die Dinge, die in ein Quiz sein kann, zu decken.
So werden Sie sicher, dass Sie auch einen Blick auf Vortrag, Schnitte, alles, was Sie können.
Quiz 1 wird am Mittwoch, den nächsten Mittwoch.
So sicher sein, um zu studieren. Es wird sein, so ziemlich, wie das erste Quiz
in Bezug auf sein Format, aber es ist wahrscheinlich zu sein, viel schwieriger.
Zumindest als ich 50 im letzten Jahr, dachte ich, es war viel schwerer.
So lernen eine Menge.
>> Ich werde Datenstrukturen decken und Huffman-Kodierung.
Dies ist etwas, das eine Menge Leute denken, ist komplex,
aber ich werde versuchen, es so einfach wie möglich zu machen.
Vor allem, was wir wollen euch für ein Quiz wissen, ist,
verstehen die konzeptionellen Beschreibungen der einzelnen Datenstrukturen, die werde ich präsentieren.
Das bedeutet, dass Sie nicht haben, um tatsächlich
Implementierung einer Hash-Tabelle in Ihr Quiz ein.
Wir wollen nicht, dass Sie eine ganze Hash-Tabelle zu implementieren, vielleicht werden wir versuchen
um Ihnen einige Funktionen zu implementieren,
die häufigsten Operationen, aber wir werden nicht gehen, dass Sie alles umzusetzen.
Also ist es wichtig, dass Sie das Konzept hinter jeder Datenstruktur verstehen
und auch, dass Sie in der Lage, in C-Code sind,
nur die häufigsten Operationen, die sie für jede Datenstruktur aufweisen.
Und auch in der Lage, Zeiger und Strukturen überprüft werden,
erscheinen, weil sie eine Menge in diesen Strukturen.
>> Erstes, verkettete Listen. Verkettete Listen sind eigentlich sehr ähnlich wie Arrays,
aber der Unterschied zwischen einer verknüpften Liste und einem Array,
Zuallererst ist, daß eine verknüpfte Liste eine sehr flexible Größe,
während in Arrays muss man entweder einen sehr großen Größe für das Array,
so wissen Sie, dass Sie in der Lage, alle Ihre Daten in diesem Array zu speichern sind,
oder Sie müssen malloc verwenden, um eine flexible Länge von Array.
In verkettete Listen, es ist sehr einfach, nur bekommen mehr Elemente,
setzen mehr Elemente in der Liste zu entfernen oder Elemente.
Und tatsächlich, wenn Sie nicht wollen, dass die verknüpfte Liste, die sortiert werden,
Sie suchen und entfernen Elemente in konstanter Zeit,
so O (1) Zeit, so ist es sehr bequem.
Sie müssen nur darauf achten, immer daran denken, malloc und free die Knoten,
nur weil, wenn Sie nicht tun, werden Sie Speicherlecks haben.
So verknüpften Listen - die Definition eines Knotens ist wie das, was wir haben recht.
Ich habe int n, aber Sie alle Daten, die Sie wollen speichern kann.
Also, wenn Sie einen String speichern wollen, ist es in Ordnung.
Wenn Sie eine Struktur speichern möchten, ist es gut, ein Doppelzimmer, was Sie wollen.
Ich habe nur int n für die Beispiele hier.
Und man hat einen Zeiger auf den nächsten Knoten.
Also, im Grunde eine verbundene Liste hat einige Daten, und dann an den nächsten Knoten zeigt es.
Wenn es das letzte Element in der verketteten Liste, es wird darauf auf NULL.
Also das ist ein Beispiel für eine verkettete Liste.
>> Okay, jetzt mal sehen, was wir tun sollen, wenn ich ein Element in einer verketteten Liste einfügen lassen.
Zunächst wird eine Funktionseinsatz vom Typ void sein
weil ich nicht wollen, etwas zurückzugeben.
Und ich werde einen int als Argument zu nehmen,
weil ich weiß, was ich will einfügen.
Also, was ist das erste, was ich tun soll? Nun, sollte ich auf newNode malloc,
damit ist die erste Zeile.
Ich bin nur die Schaffung eines neuen Knoten in einer verknüpften Liste setzen.
Also, was kann ich tun? Nun, wir wissen, dass in unserer Implementierungen der verbundenen Listen
in der Klasse stellen wir stets den Kopf wie eine globale Variable.
Also, was wir tun können, ist die Veränderung der Kopf.
Ich kann diesen neuen Knoten der neue Kopf,
und es wird, um zur vorherigen Kopf zeigen.
Wie können wir das tun? Das erste, was ich zu tun habe
ist die Veränderung der "n" in den neuen Knoten, um den Wert,
, die an die Funktion übergeben wurde.
Dann ist newNode nächsten wird sich der Kopf sein.
Der Kopf wird zu newNode werden. So ist es ziemlich einfach.
Zum Löschen eines Knotens, können wir es tun, wie -
Eine Möglichkeit könnten wir tun, ist zu sagen,
okay, wenn ich wollte, zu löschen, beispielsweise 3,
was ich tun könnte, ist nur darauf den vorherigen Knoten
an den nächsten Knoten aus 3.
Also würde ich nur so etwas tun.
Aber was ist das Problem dabei, dass?
Ich habe ein Speicherleck, so dass ich keinen Zugang zu der Nummer 3 nicht mehr.
Das Problem dabei ist, dass ich nicht in der Lage, um diesen Knoten zu befreien.
Ich bin zu haben, Speicherverlust und (unverständlich) wird mich hassen.
Also anstatt das zu tun, dass, sollte ich wahrscheinlich eine temporäre Zeiger.
Also habe ich Temperatur. Es wird sich mit dem Knoten, das möchte ich darauf hinweisen löschen.
Und dann kann ich die vorherigen Knoten Punkt zum nächsten Knoten verschieben
des Knotens, das möchte ich löschen.
Und schließlich kann ich den Zeiger zu befreien.
Muss ich, um den Zeiger, dass ich genau dort geschaffen zu befreien?
Ich weiß nicht, nur weil -
der Unterschied ist, dass dieser Knoten wurde mit malloc erstellt,
so ist es in der Halde, während dieser wurde nur als eine NULL-Schalter im Stapel erklärt.
Also ich weiß nicht, um es zu befreien.
>> Ok. So, jetzt lassen Sie uns über Stapel zu sprechen.
Stacks sind ziemlich eindeutig.
Wir haben Stapel und Warteschlangen in der Klasse nur mit Arrays
aber Sie sollten vertraut sein - man muss nur aufpassen
dass Sie auch tun, Stapeln in Warteschlangen mit verknüpften Listen als gut.
Also, wenn Sie ein Feld haben, was wäre ein Stapel sein?
Ein Stapel erstens müssen eine Größe haben.
Sie haben zu speichern, was die Größe des Stapels, die Sie jetzt haben.
Und würde auch ein Array haben, in diesem Fall von Zahlen,
aber wenn Sie wollen, kann es ein Array sein
von Strings, ein Array von struct, alles, was Sie speichern möchten.
Über dem Stapel: Der Unterschied zwischen einem Stapel und einer verknüpften Liste
ist, dass in dem Stapel haben nur Zugang zu dem letzten Element, das in den Stapel gelegt wurde.
Es ist zuletzt genannten, first out.
Genau wie Sie einen Stapel von Schalen haben,
wenn du ein Fach auf der Oberseite des Stapels,
Sie müssen dieses Fach erst zu entfernen, um den Zugang zu den anderen Fächern haben.
Es ist die gleiche Sache mit Stacks.
Also, wenn ich will, zum Beispiel, fügen Sie ein Element auf einem Stapel, was soll ich tun?
Es heißt schieben, und es ist ziemlich einfach.
Das erste, was Sie tun müssen, ist zu überprüfen, ob die Größe des Stapels
nicht größer oder gleich der Kapazität des Stapels.
Denn wenn man schon auf voller Kapazität, kann man nichts mehr hinzufügen.
Und dann, wenn nicht, müssen Sie nur noch das Element auf dem Stapel hinzufügen.
Und schließlich, erhöhen Sie die Größe. So ist es ziemlich einfach.
Also habe ich nur hinzufügen, die Nummer zwei.
Und wenn ich bis Pop, was bedeutet, dass ich entfernen
das letzte Element, das hinzugefügt wurde und den Wert des Elements,
das erste, was ich überprüfen, ist, dass der Stapel nicht leer ist.
Weil, wenn es leer ist, kann ich nichts zurück.
In diesem Fall bin ich der Rückkehr -1.
Ansonsten werde ich die Größe des spec verringern,
und Rücknummern (s.size).
Warum habe ich die Größe verringern und dann wieder s.size?
Es ist, weil in diesem Fall hat das spec Größe 4,
und ich möchte das vierte Element zurück, oder?
Aber was ist der Index des vierten Elements? Drei.
Da ich Größe - wird sich 3 sein kann, kann ich nur zurückgeben s.numbers (s.size)
weil es drei. So ist es nur der Index.
Jetzt >> Warteschlangen. Warteschlangen sind so ziemlich das Gleiche.
Der einzige Unterschied ist, dass anstelle der mit last in, first out,
Sie haben first in, first out.
Wahrscheinlich, wenn Sie darauf warten, zu einem Konzert gehen sind,
Sie wäre nicht glücklich sein, wenn Sie einen Stapel statt einer Warteschlange hatte.
Als der letzte, der kommen würde, die erste Person, um das Konzert zu betreten.
Sie würden wahrscheinlich nicht glücklich sein.
In der Warteschlange, ist die erste Person, in erhalten auch die erste Person, um aus.
So in der Definition von einer Warteschlange, neben der Größe des Arrays,
Sie haben auch, um den Kopf, die der Index auf den Kopf des Stapels ist zu haben.
Also das erste Element jetzt.
Enqueue ist das gleiche wie Push für Stacks.
Wenn Sie sehr naiv wäre, würde man nur sagen,
Nun, ich kann nur tun, genau das gleiche wie ich für Push taten.
Ich kann einfach überprüfen, wenn es nicht über die Kapazität.
Wenn es ist, ich wieder falsch, sonst kann ich nur den neuen Wert zu exportieren
und dann erhöhen Sie die Größe.
Aber warum ist das falsch?
Mal sehen, dieses Beispiel.
Ich versuche, ein paar Sachen in die Warteschlange,
und dann werde ich aus der Warteschlange entfernt und in die Warteschlange.
Es gibt eine Menge von Befehlen, aber es ist sehr einfach.
Ich werde einreihen 5, so fügen Sie 5, und dann 7,
1, 4, 6, und dann möchte ich etwas aus der Warteschlange entfernt,
was bedeutet, dass ich gehe, um das erste Element entfernen.
Also werde ich die Zahl 3 zu entfernen, oder?
Das erste Element. Okay.
Nun, wenn ich versuche, etwas anderes einzureihen, ist das, was wird passieren?
Nach meiner Umsetzung,
Ich wollte die nächste Nummer in der Index q.size setzen.
In diesem Fall ist die Größe 8,
so der Index 8 wird hier in der letzten Position sein.
Wenn ich versuche, hier einreihen 1, würde ich das Überschreiben der letzten Position
der Zahl 1, die völlig falsch ist.
Was ich tun möchte, ist wickeln um und gehen Sie auf die erste Position.
Vielleicht würden Sie nur sagen, gut, ich habe nur zu prüfen,
wenn ich tatsächlich etwas gebracht dort.
Wenn nicht, ich nur sagen, oh, das neue volle Kapazität
ist eigentlich Kapazität - 1, und ein Element dort nicht stellen können.
Aber was ist das Problem? Das Problem ist, dass, wenn ich einfach alles hier aus der Warteschlange entfernt
und dann versuche ich noch etwas hinzufügen, wäre es nur sagen,
gut, Sie waren voll ausgelastet, die 0 ist.
So Warteschlange ist weg.
Sie haben zu umschlingen, und ein Weg des Umwickeln
Jungs, dass Sie in visionären und andere psets gelernt wurde mit mod.
Sie können es zu Hause versuchen zu verstehen, warum Sie q.size + q.head tun
mod Kapazität, aber wenn man hier zu überprüfen,
können wir sehen, dass es funktioniert.
So im letzten Beispiel, q.size war 8
und der Kopf war ein, weil es diese Position hier der Reihe war.
So wird es 8 + 1, 9 sein. Mod Leistung 9 würde 0 sein.
Es würde dem Index 0 gehen. Wir werden in der richtigen Position sein.
Und dann versuchen, die Warteschlange zu Hause.
Einige wichtige Dinge: versuchen, den Unterschied zwischen einem Stapel und einer Warteschlange zu verstehen.
Zu Hause versuchen, sehr vertraut mit der Umsetzung Enqueue, dequeue, Push-und Pop zu bekommen.
Und auch, wenn Sie verstehen, würde jeder von ihnen.
>> Also mal entspannen 10 Sekunden lang mit einem Bündel von Pokemons.
Und nun zurück zu Datenstrukturen zu gehen.
Hash-Tabellen. Eine Menge Leute hatten Angst, von Hash-Tabellen.
Problem in Satz 6, Rechtschreibprüfung.
Hash-Tabellen und versucht, eine Menge Leute bekommen Angst vor ihnen.
Sie denken, sie sind so schwer zu verstehen. Ja?
[Rob Bowden] Problem Set 5. Problem >> Set 5, ja. Dank Rob.
Ja. Sechs war Huff n 'Puff, ja.
Problem 5 wurde eingestellt Rechtschreibprüfung, und man musste entweder eine Hash-Tabelle oder einen Versuch zu verwenden.
Eine Menge Leute dachten, dass sie super schwer zu verstehen waren, aber sie sind eigentlich ziemlich einfach.
Was ist eine Hash-Tabelle, im Grunde? Eine Hash-Tabelle ist eine Reihe von verknüpften Listen.
Der einzige Unterschied zwischen einer Reihe und einer Hash-Tabelle
ist, dass in der Hash-Tabelle, die Sie so etwas wie eine Hash-Funktion haben.
Was ist eine Hash-Funktion?
Ich weiß nicht, ob ihr können Sie hier lesen.
Dies ist ein Beispiel einer Hash-Tabelle.
So können Sie sehen, dass Sie ein Array mit 31 Elementen haben.
Und was wir in einer Hash-Tabelle zu tun haben, ist eine Hash-Funktion
das wird eine Schlüssel übersetzen, int jeweils zu einem Index.
Wenn, zum Beispiel, wenn ich für B. Harrison wählen,
Ich würde B. Harrison in meinem Hash-Funktionen setzen,
und die Hash-Funktion würde 24 zurück.
Also ich weiß, dass ich in 24 B. Harrison speichern.
Also das ist der Unterschied zwischen nur mit einem Array und eine Hash-Tabelle.
In der Hash-Tabelle finden Sie eine Funktion, die gehen, um Ihnen zu sagen haben
wo die Daten, die Sie speichern möchten, speichern.
Für die Hash-Funktion, Sie wollen für eine Hash-Funktion aussehen
das ist deterministischen und gut verteilt.
Wie Sie hier sehen können, sehen Sie, dass ein großer Teil der Daten, die ich zu speichern wollte, war tatsächlich 19
anstelle von 31 und 30 und 29, die alle frei waren.
Also die Hash-Funktion, die ich verwendete, war nicht sehr gut verteilt.
Wenn wir sagen, gut verteilt, bedeutet dies, dass wir haben wollen,
etwa wenigstens 1 oder 2 für jeden der -
wie eine Differenz von 1 oder 2 für jeden der Indizes in den Arrays.
Sie haben wollen, in etwa die gleiche Anzahl von Elementen in jeder verbundenen Liste in der Anordnung.
Und es ist leicht zu überprüfen, ob sie gültig ist in der Hash-Tabelle, sehen Sie als Hash-Tabellen.
Dann >> Bäumen. Dies ist ein Baum.
Bäume in der Informatik sind aus irgendeinem Grund den Kopf.
Also hier haben Sie die Wurzel des Baumes und dann die Blätter.
Sie sollten nur wissen, die Nomenklatur für Eltern und Kind.
Jeder Knoten hat seine Kinder, die die Knoten, die unterhalb des Mutter sind.
Also, zum Beispiel 2 wird sich die Eltern für 3 und für das andere Kind gleich da,
während 3 wird sich die Eltern für ein und die anderen Kinder, die dort sind, sein.
Und 1 bis 3 wird das Kind zu sein, und so weiter.
Wir haben etwas viel interessanter, eine so genannte binäre Suchbaum,
bei dem alle Werte auf der rechten Seite des Knotens
gehen, um auf der rechten Seite, genau hier - auf der rechten Seite
gehen, größer als der in dem Wurzelelement zu sein.
Also wenn ich die Zahl 5 hier alle Elemente auf der rechten
gehen, größer als 5 ist, und auf der linken Seite
alle Elemente gehen, um weniger als 5 sein.
Warum ist das sinnvoll?
Nun, wenn ich will, zu überprüfen, ob die Zahl 7 ist da, zum Beispiel,
Ich habe gerade auf 5 zuerst gehen und ich werde sehen, sieben mehr oder weniger als 5?
Es ist größer, so dass ich weiß, es ist zu haben, um auf der rechten Seite des Baumes.
So habe ich viel weniger Zeug, zu betrachten.
In Umsetzung eines binären Suchbaum, der Knoten, ich bin nur zu haben, um Daten haben,
so int n, man könnte auch einen String
oder alles, was Sie wollten.
Sie müssen nur darauf achten, auf die Definition, was ist, größer zu sein, was weniger.
Also, wenn Sie Zeichenfolgen hatten, zum Beispiel, können Sie definieren könnte
dass all diese Dinge auf der rechten gehen, um größere Länge haben,
links gehen, um unteren Längen haben, so ist es wirklich an Ihnen.
>> Wie kann ich umsetzen finden für BST?
Das erste, was wir tun müssen, ist zu prüfen, ob die Wurzel ist NULL.
Wenn es NULL ist, bedeutet es, dass das, was nicht da ist
weil Sie noch nicht einmal einen Baum, oder?
Also ich wieder falsch.
Ansonsten werde ich prüfen, ob die Zahl größer ist
als der Wert in der Wurzel.
Ich werde versuchen, das Element auf der rechten Seite
des Baumes.
Sie sehen, dass ich mit Rekursion hier.
Und dann, wenn es weniger ist, werde ich auf links zu schauen.
Und schließlich, anders, wenn es nicht weniger oder gar nicht mehr,
es bedeutet, dass es das Wert sich.
Also habe ich nur true zurück.
Sie können hier sehen, dass ich, wenn, wenn, falls verwendet.
Und denken Sie daran, in Quiz-0, wir hatten ein Problem, das hatte, wenn, wenn, wenn,
und Sie sollten die Ineffizienz zu finden,
und die Ineffizienz war, dass man, wenn verwendet.
Sie sollten, wenn sonst, wenn verwendet haben, else if und else.
Also, sollte ich sonst if und else if und else hier?
Hat jemand - ja?
[Schüler sprechen, unverständlich]
Das ist großartig. So ist sie selbst, dass es keine Rolle spielt,
nur weil die Ineffizienz, die wir vorher hatten
war, dass da vielleicht, wenn eine bestimmte Bedingung erfüllt wurde,
so eine Aktion durchgeführt haben, aber dann wollten Sie alle anderen Bedingungen zu überprüfen.
Aber in diesem Fall zurück es sofort, so dass es keine Rolle spielt.
So müssen Sie nicht auf, wenn anderes zu verwenden.
>> Und schließlich, lassen Sie uns darüber sprechen, versucht,
Das ist locker.
Ein Versuch ist ein Baum des Arrays.
Es ist sehr schnell nachschlagen Werte, aber es nutzt eine Menge Speicher.
Und es ist in der Regel, um Wörter zu filtern, so dass, wenn Sie
umsetzen wollen, zum Beispiel, ich weiß nicht, wie ein Telefonbuch im Telefon
und Sie in der Lage sein wollen, Typ B
und einfach nur Namen von Personen, B. haben
Es ist sehr einfach zu implementieren, dass mit einem Versuch, zum Beispiel.
Wie kann man einen Knoten in einem Versuch zu definieren?
Sie müssen nur ein bool, die gehen, um is_word werden müssen.
Das bedeutet, daß mit allen Zeichen vor diesem Knoten,
Sie waren in der Lage, ein Wort zu bilden,
und dann werden Sie ein Array von Zeigern auf Knoten haben.
Können Sie sehen, dass wir eine Reihe von übergeordneten Knoten, also Knoten * Array? Ja?
Also mal sehen, wie das funktionieren wird. Für die Rechtschreibprüfung,
wir haben eine Reihe von 27 Elementen,
denn wir haben alle Buchstaben sowie den Apostroph.
Bevor ich hier werde nur 2 zu verwenden, weil ich in der Lage, an die Tafel zu schreiben.
Okay. Das ist also ein Beispiel für ein Versuch.
Wenn ich nur den ersten Knoten zu definieren, werde ich ein Array von 2 Elemente haben
, die zwei Zeiger auf NULL sind, so dass ich nur setzen 'a' und 'b'.
Und ich werde einen Bool, die is_word sagt.
Es wird false für die erste zu sein,
gerade weil, vor, dass Sie keine Zeichen haben.
So ein leeres Wort ist nicht ein Wort. Es ist also falsch.
Wenn ich 'a' auf dieses Wörterbuch hinzuzufügen, was würde ich tun?
Ich würde einfach nur einen neuen Knoten für 'a' malloc,
und dann sein Wort wahr hinzufügen.
So ist es nur zu, dass mit 'a' wird um wahr zu sein. Sinnvoll?
Dann, wenn ich will 'ba' hinzufügen, ich werde zu malloc 1 für 'b' haben,
und dann werde ich auf false gesetzt den boolean,
weil 'b' selbst ist nicht ein Wort.
Dann werde ich zu einem anderen für 'a', so 'ba' malloc,
und dann werde ich einrichten, es ist ein Wort, das wahr ist.
Weil 'ba' ist ein Wort.
Und dann, wenn ich will, um zu sehen, wenn 'b' ist in diesem Wörterbuch,
Ich kann nur die erste, 'b' zu gehen. Ich gehe nach unten, und ich sehe ist Wort, und es ist falsch, sagt.
Es ist also nicht ein Wort. Wenn ich 'ba' zu überprüfen,
Ich gehe in die erste, 'b' und dann auf 'a', und ich wahr sehen, so dass es ein Wort ist. Sinnvoll?
Eine Menge Leute durch Versuche verwirrt. Nein?
>> Schließlich Huffman-Codierung. Huffman-Kodierung ist sehr nützlich,
um Speicherplatz zu sparen und zu komprimieren, Text-Dateien,
nur weil eine Menge Zeit, die Sie verwenden "a" und "e", zum Beispiel,
in Ihren Dokumenten, aber ich weiß nicht, ob euch verwenden 'q' oder 'z' so viel.
Mit nur 1 Byte für jeden einzelnen Charakter,
jeder einzelne - die 256 Zeichen, die wir in der ASCII-Tabelle haben, ist nicht sehr optimal,
nur weil es einige Zeichen, die Sie viel mehr zu verwenden,
so sollten Sie vielleicht weniger Speicher für die.
Wie kann ich mit Huffman-Kodierung?
Wir müssen einen Huffman-Baum zu tun.
Ein Huffman-Baum hat Knoten
, das ein Symbol, das geht zu wie, 'a', 'b', 'c', der Buchstabe sein müssen,
Schreiben, was auch immer Sie haben, eine Frequenz, die Frequenz, die das Wort im Text erscheint, ist,
Sie schufen die Huffman-Baum für,
und dann ein Knoten, das geht auf der linken Seite der Huffman-Baum zeigen
und ein anderer Knoten, die gehen, um nach rechts zeigen. So einfach wie ein Baum.
Wie kann man einen Huffman-Baum zu bauen?
Du wirst die zwei Knoten, die die niedrigsten Frequenzen haben pflücken.
Wenn Sie eine Krawatte muss man gehen, um die 2-Knoten holen sind
, die die niedrigsten ASCII-Werte als gut.
Dann wirst du einen neuen Baum aus diesen zwei Knoten erstellen
das wird die kombinierte Häufigkeit in der übergeordneten Knoten haben.
Und dann wollen Sie die 2 Kinder aus dem Wald zu entfernen sind
und ersetzen sie durch die Eltern.
Und du wirst zu wiederholen, dass, bis Sie nur noch ein Baum im Wald.
Also mal sehen, wie Sie einen Huffman-Baum für ZAMYLA tun würde.
Sie können hier sehen, dass alle Buchstaben haben Frequenz 1 außer 'A', die Frequenz 2 hat.
Also habe ich Knoten für alle Buchstaben ich in der Reihenfolge der ASCII-Wert und Frequenz.
Also, wenn ich den ersten Baum zu schaffen, wird es mit "L" und "M" sein.
So ist es hier. Die Frequenz des Paars wird 2 sein
denn es ist 1 + 1, dann ist der nächste 2 mit den niedrigsten Frequenzen "Y" und "Z".
Und dann habe ich alle von ihnen sind - haben eine Frequenz von 2.
Also welche sind die, die die niedrigste ASCII-Wert für die nächste einen zu haben sind?
'A' und 'L'. Also habe ich den neuen Knoten zu erstellen,
und schließlich ist es 4 und 2, SO 2 wird auf der linken Seite.
Und das ist der Huffman-Baum.
Dann, wenn ich will, um einen Text zu schreiben,
wie in Binär in Text konvertieren, mit der Huffman-Baum ist sehr einfach.
Zum Beispiel, wenn ich sage, dass eine Bewegung nach links eine 0 ist und sich nach rechts eine 1 ist,
Was ist das los zu vertreten?
So wie 1, 1, so rechts, rechts,
und dann 0, so würde L links, und dann 1, 0, 0.
Also 1, 0, so dass nur 1, 0, 'A'.
Und 0, 1, so 'Z'.
Und dann 1, 0, 0 - keine.
0, 0 wird 'Y' so faul sein.
Also das ist alles für mich, Rob geht zu übernehmen.
>> [Rob Bowden] So, Woche 7 Sachen.
Wir haben viel überstanden wirklich schnell zu gehen.
Bit-Operatoren, Pufferüberlauf
CS50-Bibliothek, dann HTML, HTTP, CSS.
Alle wie in 15 bis 20 Minuten.
Bit-Operatoren. Es gibt sechs von ihnen, dass Sie wissen müssen.
Bitweise und bitweise oder, XOR, Verschiebung nach links, rechte Shift, und nicht.
Rechts zu verschieben und nicht Sie sah kaum in der Vorlesung überhaupt.
Wir werden über sie hier schnell gehen, aber es ist gut zu wissen, dass diese die 6, die es gibt.
Beachten Sie, dass Bit-Operatoren sind wie wenn Sie das tun 3 + 4.
Sie sind nicht mit dem binären von 3 und 4 zu tun haben.
Mit Bit-Operatoren sind Sie eigentlich den Umgang mit den einzelnen Bits der Nummern 3 und 4.
>> Also das erste, das wir sagen, ist nicht bitweise,
und alles was man tut, ist Flip alle Bits.
Also hier, wenn Sie dies in C schreibst, würden Sie nicht schreiben Sie es
als ~ 11011 oder was auch immer, würden Sie schreiben, es gefällt ~ 4,
und dann würde es die binäre Darstellung von 4 kippen.
Also hier, ~ einiger Binärzahl 1101101 wird sich genau Flip Alle 1 auf 0 und alle 0 auf 1 ist.
Wie ich es sagen, der häufige Gebrauch von diesem,
und wir werden es in etwas zu sehen, ist wie wir, kommen mit einigen Nummer ein
in dem alle Bits 1 sind, mit Ausnahme von einer von ihnen.
So ist es in der Regel einfacher, die Zahl auszudrücken
wo nur, dass einzelne Bit gesetzt ist,
und dann die ~ von ihm, so dass jedes andere Bit außer, dass man eingestellt ist.
Also das ist, was wir mehr in ein bisschen zu verwenden.
Oder >> Bitwise. Hier sind zwei binäre Zahlen, und diese zwei Zahlen
sind ziemlich repräsentativ, da sie jeden möglich darzustellen
Kombination von Bits, die Sie brauchen, um arbeiten auf.
Hier wird, wenn ich jedes Bit ODER-verknüpft, wir sind gerade dabei, gerade nach unten zu vergleichen.
So auf der linken Seite haben wir A 1 und A 1.
Wenn ich bitweise | die, was soll ich bekommen? One.
Dann bitweise | 0 und 1 wird mich geben? One.
Bitweise 1 und 0 wird sich die gleiche Sache, sein.
Bitweise 0 | 0 geht mir 0 zu geben.
Also der einzige Fall, wo ich 0 zu erhalten, ist in der 0 | 0 Fall.
Und Sie, dass genau wie Ihre logischen ors denken können.
Also, wenn Sie von 1 als wahr und 0 für falsch zu denken, gilt das Gleiche hier.
So wahr oder wahr ist wahr, richtig oder falsch ist, ist wahr.
Falsch oder wahr ist wahr, falsch oder falsch ist die einzige Sache, die tatsächlich falsch ist.
Hier ist das Beispiel, das Sie wissen sollten
wie ein ziemlich gutes Beispiel, wenn Bit-Operatoren verwendet werden.
Hier, wenn wir oder Kapital 'A' mit OX20,
und wir werden auf diese in einem zweiten Blick, wir haben etwas zu bekommen.
Und wenn wir oder Kleinbuchstaben "a" mit OX20, etwas zu bekommen wir.
Lassen Sie uns also nach oben ziehen ASCII-Tabelle.
Okay. Hier sehen wir, dass 'A' ist -
hier haben wir "A" ist Dezimal 65.
Aber ich werde mit hexadezimal, die Ox41 ist zu gehen.
Ziemlich sicher, dass wir es gesehen in der Klasse. Ich denke, dass wir es in der Klasse sah
, dass es ziemlich einfach zu konvertieren von hexadezimal binär.
Also hier, wenn ich 4 in binäre setzen,
das ist gerade dabei, sein 0100.
Dies ist ein Platz, Platz 2, Platz 4, so ist dies 4.
Dann kann ich in binäre 1, die gehen, um sein 0001 aufgeteilt.
Und so wird sich die Darstellung von 'A' in binär sein.
Unter Kleinbuchstaben 'a', es ist jetzt zu Ox61 sein,
wo diese Aufspaltung in seine binäre, so dass ein 6 -
Lassen Sie es wirklich tun - gibt es kein Radiergummi? Eraser.
Ox61. So spalten 6 in binäre wird zu 0 + 4 + 2 + 0 sein.
Und Aufspaltung 1 wird zu 0001 sein.
Mit Blick auf den Unterschied zwischen diesen 2,
wir sehen, dass der einzige Unterschied zwischen einem Klein und ein großes "A" ist das einzelne Bit.
Also wieder kommen, um hier - okay.
Kommen wir zurück zu hier, wenn wir uns an, was das Bit OX20 ist,
so OX20 Aufspaltung in seine binäre,
0010, 0000.
OX20, das einzige Bit, das gesetzt wird, ist das Bit, das wir mit betroffen sind,
mit Wechsel zwischen Groß-und Klein 'A'.
Wenn ich oder 'A', die in diesem einen, 'A' ist,
oder wenn ich 'A' mit OX20,
was soll ich denn bekommen?
[Schüler, unhörbar] >> Kleinbuchstaben "a", denn es geht um dieses Bit auf 1 zu kippen.
Und wenn ich oder 'a' mit OX20, was werde ich bekommen?
Kleinbuchstaben a, weil nur oring 'a' mit OX20,
Ich werde nur zu einer 1 werden oring dieses einzelne Bit, es ist bereits ein, so dass es keine Rolle spielt.
So bekommen wir 'a' und 'a'.
>> Bitweise und. Auch wir dies als unser logisches Gegenstück und denken können.
Auf der linken Seite haben wir true & wahr.
Es wird um wahr zu sein, und für alle Fälle
falsch & wahr oder true & false oder falsch & falsch,
keines dieser Dinge sind wahr.
Also, was wir am Ende immer ist 1000.
So, jetzt, hier, hier, wo ich die treuen bitweise verwendet werden, nicht,
wo wir OX20.
Also das ist OX20.
Nun, was ich tun möchte, bitweise ~ von OX20.
Das wird alle Bits kippen.
So habe ich 1101, 1111.
Und so 'A' mit ~ OX20 wird mir geben, was anded?
Die nur wenig wir wirklich brauchen, um darüber nachzudenken, ist dieses,
Da, wenn alle diese Bits auf 1 gesetzt sind,
dann werden wir genau das bekommen, was "A" war,
außer möglicherweise, was dieses Bit.
Denn wenn es eine 1 war, jetzt läuft es auf eine 0 gesetzt werden,
denn was auch immer das ist, mit anded das wird 0 sein.
Also, was ist 'A' & ~ OX20 werde mir geben?
[Studenten zu beantworten, unhörbar] >> Und was ist 'a' und - es ist 'A'.
Und was ist 'a' & ~ OX20 werde mir geben?
"A." Denn dies ist momentan eine 1 ist.
Anding mit diesem 0 geht, es eine 0 zu machen,
und jetzt sind wir ein 'A' zu erhalten.
>> Beide sind 'A', und nicht zuletzt dieser Art,
wir haben XOR. Es ist sehr ähnlich wie oder,
außer sie ausschließlich oder bedeutet.
Dies ist wie das, was Sie normalerweise denken als oder in der realen Welt.
Sie müssen sich also entweder 'x' oder 'y', aber nicht beides.
Hier ein ^ 1 wird auf 0 gesetzt.
Weil wahre, das ist - es ist nicht so gut mit der logischen wahr und falsch zu arbeiten
als bitweise & und oder tun,
aber wahr ^ true ist falsch.
Denn wir wollen nur true zurück, wenn nur einer von ihnen ist wahr.
Also 1 ^ 1 0 ist. Was ist mit 0 ^ 1?
Ist ein. 1 ^ 0 1, 0 0 ^ 0 ist.
So unter allen Umständen etwas bitweise 0 0 wird auf 0 gesetzt.
1 bitweise etwas 0 oder 0 bitweise 1,
wenn es | oder ^, wird es eine 1 sein, und wenn es ist und es wird 0 sein.
Und der einzige Fall, in dem ein bitweise 1 nicht 1 ist mit exklusiven oder.
Das ist 0110.
So, hier nun, mit XOR - so sind wir wieder bei 20.
'A' ^ OX20 ist diese 2 Bits wir den Vergleich.
So ein 1 ^ 0 wird mich geben, was? A ein.
'A' ^ OX20 wird mich geben? Kleinbuchstaben ein.
'A' ^ OX20 wird mich geben? Kapital A.
Denn was auch immer das tut, diese XOR-Verknüpfung mit OX20
effektiv Spiegeln, was dieses Bit.
Wenn dies eine 0, ist es jetzt zu einem 1 zu werden.
Da dies ein 1 1 ^ 1 0 ist.
Also unsere 'a' hat sich 'A', und unsere 'A' hat sich 'a'.
So XOR ist eine wirklich komfortable Möglichkeit, das Umdrehen der Fall ist.
Sie wollen einfach nur eine Folge von Buchstaben durchlaufen
und wechseln den Fall von jedem einzelnen Charakter,
Sie gerade XOR alles mit OX20.
>> Jetzt haben wir links schieben. Linksverschiebung wird nur gehen, um, im Grunde,
schieben alle Zahlen in oder auf der linken Seite, und legen Sie die 0 hinter ihnen.
So, hier haben wir 00.001.101.
Wir werden 3 0 der von rechts zu schieben,
und wir bekommen 01101000.
In Bezug auf nicht-binäre,
wir sehen, dass das ist wirklich um 13 nach links verschobenen mit 3, die uns 104.
So Linksverschiebung, sehen wir hier, x << y im Grunde x * 2 ^ y.
13 * 2 ^ 3, 2 ^ 3 8 ist, so 13 * 8 104.
Wenn Sie nur über binäre im Allgemeinen, wie jeder Ziffer, denken
wenn wir von der rechten Seite, ist es der 1er-Stelle, dann das 2er-Platz, dann der 4 Platz.
Also, indem Sie in der 0 von rechts,
wir sind nur schieben Dinge, die in der 4-Platz, um die 8 Platz waren,
und Dinge, die in der 8. Platz, um den 16 Platz waren.
Jede Schicht nur um 2 multipliziert. Ja?
[Schüler] Was passiert, wenn man um 5 verschoben?
[Bowden] Wenn Sie mit 5 verschoben würden Sie nur verlieren Ziffern.
Zwangsläufig ist es die gleiche Sache. Wie, ganze Zahlen sind nur 32 Bit,
Wenn Sie zwei wirklich große Zahlen addieren, es funktioniert einfach nicht in einen Integer passen.
So ist es die gleiche Sache hier. Wenn Sie mit dem 5 verschoben,
würden wir nur verlieren, dass man.
Und das ist irgendwie, was ich mit "grob"
wo, wenn Sie zu weit verschieben, verlieren Sie Bit.
>> Rechtsverschiebung wird sich das Gegenteil sein,
wohin wir gehen, um aus dem Ende des Schubs 0,
und für unsere Zwecke, füllen Sie bitte die 0 von der linken Seite.
Also, dies zu tun, sind wir im Grunde Umkehr, was wir bereits getan hatte.
Und wir sehen, dass die drei 0-en auf der rechten Seite haben gerade abgefallen,
und wir haben die 1101 ganz nach rechts geschoben.
Dies tut 104 >> 3, die ist, effektiv, x / 2 ^ y.
So, jetzt, hier, es ist eine ähnliche Idee.
Warum ist es nur etwa x / 2 ^ y, und nicht die tatsächlich x / 2 ^ y?
Weil, wenn ich um 4 verschoben hatte, würde ich eine 1 verloren haben.
Im Grunde, was Sie denken, nur der Integer-Division denke, im Allgemeinen.
So, wie 5/2 2 ist. Es ist nicht 2.5.
Es ist die gleiche Idee hier. Wenn wir durch 2 teilen,
wir ungeraden Bits auf dem Weg verlieren.
So, jetzt - das ist es für bitweise. Das ist alles, was Sie wissen müssen.
Denken Sie daran, die Anwendungsfälle haben wir in der Klasse sah,
wie eine Bit-Maske ist nützlich für die Bit-Operatoren,
oder Sie können sie für Bit-Masken zu verwenden.
Großbuchstaben und Kleinbuchstaben, Umbauten ist ein ziemlich prototypisches Beispiel.
>> Okay, also Pufferüberlauf-Attacken.
Wer daran erinnern, was mit dieser Funktion war?
Beachten wir ein Array von 12 Bytes, 12 Zeichen, erklärt
und dann kopieren wir in unsere Puffer von 12 Zeichen die gesamte Zeichenfolge bar.
Also, was ist hier das Problem?
Die magische Zahl 12 sollte so ziemlich sofort herausspringen wie - warum 12?
Was ist, wenn bar passiert mit mehr als 12 Zeichen sein?
Was ist, wenn Bar ist Millionen von Zeichen?
Hier das Problem ist memcpy. Wenn Bar ist lang genug,
es wird nur komplett - 'c', 'c' kümmert sich nicht darum, dass es nur 12 Zeichen;
"C" ist es egal, dass es nicht passt, dass viele Bytes.
Es wird nur komplett überschreiben char, die wir für 12 Byte zugeordnet haben,
und alles, was an ihm vorbei in Erinnerung, die nicht wirklich zu diesem Puffer gehören
mit dem, was der String-Bar ist.
Also das war das Bild, wir in der Klasse sah
wo wir unsere Stapel aufwachsen.
Sie sollten auf diese Bilder verwendet werden oder sich wieder mit ihnen vertraut.
Wir haben unsere Stapel aufwuchs, Speicheradressen beginnen bei 0 an der Spitze
und wachsen nach unten am Boden wie 4 Milliarden.
Wir haben unser Angebot 'c' irgendwo im Speicher,
dann haben wir unsere Zeiger nach rechts darunter eine Bar,
und dann haben wir diese gespeichert Rahmenzeiger in unserer Rücksprungadresse und unserer Mutter Routine-Stack.
Denken Sie daran, was der Absender-Adresse ist?
Es ist, wenn Haupt ruft eine Funktion foo, ruft eine Funktionsleiste,
zwangsläufig, Bar Renditen.
Also, wenn bar zurück, müssen sie wissen, dass es zurück zu foo, die sie aufgerufen.
So ist die Absenderadresse ist die Adresse der Funktion, die es hat, wenn auf die Funktion zurückkehrt zurück.
Der Grund, die wichtig für Pufferüberlauf-Attacken ist, weil, bequem,
Hacker betonen, dass die Absender-Adresse zu ändern.
Anstatt zurück zu foo, werde ich zurück, wo der Hacker will, dass ich zurück zu gehen zu gehen.
Und bequem, wo der Hacker will häufig gehen Sie zurück zu
ist der Anfang des Puffers, die wir ursprünglich hatte.
So bemerken, die wieder, Little Indian.
Das Gerät ist ein Beispiel für ein System Little Indian,
so eine ganze Zahl oder ein Zeiger zu den Bytes umgekehrt abgelegt.
So, hier sehen wir - ist das? Ja.
Wir sehen Ox80, OxC0, Ox35, OxO8.
Denken Sie an die hexadezimale Ziffern?
Wir sind nicht umgekehrt die hexadezimale Ziffern in Little Indian,
weil zwei hexadezimalen Ziffern bilden ein Byte, und wir umgekehrt die Bytes.
Das ist, warum wir nicht speichern, wie, 80530CO8.
Wir speichern, sondern jedes Paar von zwei Ziffern, beginnend von rechts.
Diese Adresse bezieht sich auf die Adresse der Start
der Puffer, die wir eigentlich in der ersten Stelle zu kopieren wollten.
Der Grund ist, die nützlich ist, weil, was ist, wenn der Angreifer
passiert ist, anstatt eine Zeichenfolge, die nur war
eine harmlose Kette von gleichen, ihren Namen oder so etwas,
was ist, wenn statt dessen, dass die String nur einige beliebigen Code waren
das tat, was sie wollten, es zu tun?
So konnten sie - ich kann nicht jeder kühle Code denken.
Es könnte alles sein, wenn. Jede katastrophalen Code.
Wenn sie wollten, könnten sie nur etwas zu seg Fehler machen, aber das wäre sinnlos.
Sie tun es in der Regel, um Ihr System zu hacken.
>> Ok. CS50-Bibliothek.
Dies ist im Grunde getInt, getString, all diese Funktionen, die wir für Sie bereitgestellt.
So haben wir char * string, und das ist die Abstraktion, die wir blies
irgendwann im Laufe des Semesters.
Denken Sie daran, dass ein String nur ein Array von Zeichen.
So, hier sehen wir eine gekürzte Fassung der getString.
Sie sollten es zurück zu erinnern, wie es tatsächlich umgesetzt werden.
Key Details sind, bemerken wir, in einem einzigen Charakter bekommen in einer Zeit,
von in, die genau wie wir die Eingabe über die Tastatur ist Standard.
So ein einzelnes Zeichen in einer Zeit, und wenn wir zu viele Zeichen zu bekommen,
also, wenn n + 1 größer als die Kapazität ist,
dann müssen wir die Kapazität unserer Puffer erhöhen.
So, hier sind wir die Verdoppelung der Größe unseres Puffer.
Und das läuft weiter, die wir in unsere Puffer legen Sie die Zeichen
erhalten, bis wir eine neue Linie oder das Ende der Datei oder was auch immer,
in diesem Fall sind wir mit der Saite und dann die Real getString getan
schrumpft die Erinnerung, wie wenn wir zu viel Speicher zugewiesen, es wird zurück gehen und ein wenig schrumpfen.
Wir wissen also nicht, dass die, aber die Grundidee ist
es muss in einem Zeichen zu einem Zeitpunkt zu lesen.
Es kann nicht nur in einer Sache auf einmal lesen
weil ihre Puffer ist nur mit einer bestimmten Größe.
Also, wenn die Zeichenfolge, die er versucht, in die Puffer einfügen zu groß ist, dann wäre es überläuft.
So, hier zu verhindern, dass wir nur durch Lesen in einem einzelnen Zeichen
zu einer Zeit, und wächst, wenn es nötig ist.
So getInt und die anderen CS50-Bibliotheksfunktionen neigen dazu, getString verwenden
in ihre Implementierungen.
So markierte ich die wichtigen Dinge hier.
Er fordert getString, um einen String zu erhalten.
Wenn getString versäumt, Speicher zurück,
daran erinnern, dass getString mallocs etwas, wenn Sie so zu nennen getString
Sie sollten nicht (unverständlich) kostenlos die Zeichenfolge, die Sie haben.
Also hier, wenn es nicht zu etwas malloc kehren wir INT_MAX als nur eine Fahne, die,
hey, wir waren nicht wirklich in der Lage, eine ganze Zahl zu erhalten.
Sie sollten ignorieren, was ich wieder zu Ihnen, oder
Sie sollten nicht behandeln dies als gültige Eingabe.
Schließlich habe der Annahme, dass erfolgreich zu sein, setzen wir mit dieser speziellen sscanf Flagge,
was bedeutet, zuerst eine ganze Zahl übereinstimmen,
dann alle Zeichen übereinstimmen nach diesem Integer.
So bemerken wir es gleich 1 wollen.
So sscanf gibt zurück, wie viele Spiele gemacht, wenn erfolgreich?
Es gibt 1 zurück, wenn es eine ganze Zahl erfolgreich abgestimmt,
wird es 0 zurück, wenn es nicht eine ganze Zahl übereinstimmt, und es wird 2 zurück
wenn es abgestimmt eine ganze Zahl, gefolgt von einem gewissen Charakter.
So bemerken wir versuchen, wenn wir alles andere als ein Spiel.
Wenn wir also eingetragen 1, 2, 3, C, oder 1, 2, 3, X,
dann 1, 2, 3 würde in der Integer gespeichert werden,
X würde bei der Charakter gespeichert werden,
sscanf würde 2 zurück, und wir versuchen würden, denn wir wollen nur eine ganze Zahl.
Schnell >> weht durch HTML, HTTP, CSS.
Hypertext Markup Language ist die Struktur und Semantik der Bahn.
Hier ist das Beispiel aus der Vorlesung, wo wir HTML-Tags.
Wir haben Kopf-Tags, Body-Tags,
Wir haben Beispiele für leere Tags, wo wir eigentlich nicht in der Nähe von Start-und-Tag,
wir haben nur Link und Bild.
Es gibt keine Schließ Bild-Tag, es ist nur ein einziger Tag, der alles, was der Tag tun muss, erfüllt.
Der Link ist ein Beispiel, wir werden sehen, wie Sie eine Verknüpfung zu CSS,
das Skript ist ein Beispiel, wie Sie einen Link zu einer externen JavaScript.
Es ist ziemlich einfach, und denken Sie daran, HTML ist keine Programmiersprache.
Hier erinnern, wie Sie ein Formular definieren, oder zumindest, was das tun würde?
Eine solche Form hat eine Klage und ein Verfahren.
Die Methoden, die Sie sehen, sind immer nur GET und POST.
So ist die Version, in der sich das Ding in der URL setzen GET.
POST ist, wo es nicht in der URL setzen.
Stattdessen werden alle Daten aus dem Formular eingefügt wird mehr versteckt in der HTTP-Anfrage.
So, hier, wo die Aktion definiert HTTP-Anfrage geht.
Wo es geht ist google.com / search.
Methode. Denken Sie daran, die Unterschiede zwischen GET und POST,
und, sagen Sie einfach als Beispiel, wenn Sie ein Lesezeichen etwas wollen.
Sie werden nie in der Lage, Lesezeichen für eine POST-URL sein
da die Daten nicht in der URL enthalten.
>> HTTP, jetzt ist Hypertext Transfer Protocol.
Das Hypertext Transfer Protocol, würden Sie erwarten es zu übertragen
Hypertext Markup Language, und es funktioniert.
Aber es überträgt auch keine Bilder im Web zu finden,
keine Downloads du anfängst, als HTTP-Anfrage.
So HTTP ist nur die Sprache des World Wide Web.
Und hier müssen Sie diese Art von einer HTTP-Anforderung erkennen.
Hier HTTP/1.1 auf der Seite nur sagt, das ist die Version
des Protokolls Ich bin mit.
Es ist so ziemlich immer zu HTTP/1.1 sein, wie Sie es sehen.
Dann sehen wir, dass dies GET, POST die Alternative sein, dass Sie vielleicht zu sehen.
Und die URL, die ich versucht habe, zu besuchen war www.google.com/search?q = blah, blah, blah.
Also denken Sie daran, dass dies das Fragezeichen q = blah blah blah,
ist die Art von Sachen, die durch eine Form vorgelegt wird.
Die Antwort, es könnte zu mir zurückkehren würde in etwa so aussehen.
Wiederum beginnend mit dem Protokoll, die gehen, um das sein,
gefolgt von dem Statuscode. Hier ist es 200 OK.
Und schließlich, die Web-Seite, die ich tatsächlich gefragt wird folgen.
Die möglichen Status-Code, den Sie vielleicht sehen, und Sie mehrere von ihnen wissen sollten.
200 OK Sie wahrscheinlich gesehen haben.
403 Forbidden, 404 Not Found, 500 Internal Server Error
ist in der Regel, wenn Sie gehen, um eine Website und etwas kaputt ist oder ihre PHP-Code abstürzt,
während in dem Gerät haben wir, dass große Orange Box
das kommt auf und sagt, wie, stimmt etwas nicht, wird dieser Code nicht funktioniert
oder schlechten dieser Funktion.
Normalerweise Websites nicht wollen, dass Sie wissen, was Funktionen sind eigentlich schlecht,
so werden sie, anstatt Ihnen nur 500 Interner Serverfehler.
>> TCP / IP ist ein Schicht unter HTTP.
Denken Sie daran, dass es Internet außerhalb des World Wide Web.
Wie, wenn Sie ein Online-Spiel, das nicht über HTTP nicht spielen gehen,
es wird durch eine andere - es ist immer noch über das Internet,
aber es nicht verwendet HTTP.
HTTP ist nur ein Beispiel des Protokolls TCP / IP aufgebaut.
IP bedeutet wörtlich Internet Protocol.
Jeder Computer hat eine IP-Adresse, sie sind die 4-stellige Dinge
wie 192.168.2.1, oder was auch immer, das dazu neigt, eine lokale sein.
Aber das ist das Muster einer IP-Adresse.
So ist die DNS, Domain Name Service,
das ist, was übersetzt Dinge wie google.com auf eine tatsächliche IP-Adresse.
Also, wenn Sie schreiben, dass die IP-Adresse in einer URL,
möchten Sie, dass Google zu bringen, aber Sie neigen dazu, nicht auf diese Dinge zu erinnern.
Sie neigen dazu, statt google.com erinnern.
Das letzte, was wir haben, ist Häfen, wo das ist der Teil des TCP-IP.
TCP tut mehr. Denken Sie darüber nach, wie, Sie Ihren Web-Browser laufen haben.
Vielleicht haben Sie einige E-Mail-Anwendung ausgeführt;
Vielleicht haben Sie ein anderes Programm, das das Internet nutzt Lauf.
Sie alle benötigen Zugriff auf das Internet,
aber Ihr Computer nur über ein WiFi-Karte oder was auch immer.
Also Ports sind der Weg, den wir in der Lage, aufgeteilt
wie diese Anwendungen sind in der Lage, das Internet zu nutzen.
Jede Anwendung wird ein bestimmter Port, dass sie hören auf,
und verwendet standardmäßig HTTP-Port 80.
Einige E-Mail-Dienste verwenden 25.
Die niedrigen nummerierten eher reserviert werden.
Sie sind in der Regel in der Lage, höhere nummerierten für sich selbst zu bekommen.
>> CSS, Cascading Style Sheets.
Wir Stil Webseiten mit CSS, nicht mit HTML.
Es gibt drei Orte, die Sie Ihrem CSS setzen.
Sie kann inline sein, zwischen Stil-Tags oder in einem völlig separaten Datei und dann in. verknüpft
Und hier ist nur ein Beispiel von CSS.
Sie sollten diese Muster zu erkennen,
wo das erste Beispiel ist, dass wir die passenden Body-Tag,
und hier sind wir Zentrierung des Body-Tag.
Das zweite Beispiel, werden wir die Sache pass
mit ID-Footer, und wir die Anwendung einiger Arten zu.
Beachten Sie, dass Text-ID footer richtet nach links,
wohingegen Text-Zentrum richtet.
Footer ist im Inneren des Körpers.
Es wird statt dessen text-align links, auch wenn Körper sagt text-align-Center.
Das ist die ganze Kaskaden Teil davon.
Sie können - Sie können Arten für den Körper anzugeben,
und dann die Dinge in den Körper können Sie spezifischere Stile geben,
und die Dinge funktionieren wie erwartet.
Weitere spezifische CSS-Bezeichner Vorrang.
Ich denke, das ist es.
>> [Ali Nahm] Hallo alle. Wenn ich nur bekommen Ihre Aufmerksamkeit.
Ich bin Ali und ich werde durch PHP-und SQL-wirklich schnell gehen.
So können wir beginnen. PHP ist die Abkürzung für PHP: Hypertext Preprocessor.
Und wie Sie alle wissen sollten, ist es eine serverseitige Skriptsprache,
und wir nutzen es für die Back-End von Webseiten,
und wie es macht eine Menge der Berechnungen, die hinter Kulissen Teil.
Syntax. Es ist nicht wie C, Überraschung, Überraschung.
Es hat immer mit dem, wenn man sehen kann, die beginnen - ich kann nicht vorankommen.
Sie können sehen Sie die neuen Arten von Zahnspangen brauchen, und dann müssen Sie auch die? Php.
Das ist immer, wie Sie Ihre PHP Text, PHP-Code Rahmen haben.
So kann es nicht nur wie C, wo Sie Art legte es auf den ersten.
Sie müssen sich immer umgeben.
Und jetzt ist der Haupt Syntax, dass alle Variablen müssen mit dem Zeichen $ beginnen.
Sie müssen es tun, wenn Sie sie zu definieren, Sie müssen es tun
wenn Sie sich beziehen, um sie später auf.
Sie müssen immer, dass $. Es ist Ihr neuer bester Freund, ziemlich viel.
Sie müssen nicht - im Gegensatz zu C, brauchen Sie nicht zu setzen, welche Art von Variablentyp es ist.
So, während Sie brauchen die $ zu tun, brauchen Sie nicht zu setzen, wie,
int x oder y String, etcetera, etcetera.
Also ein kleiner Unterschied.
Als ein Ergebnis davon ist, bedeutet dies, dass PHP eine schwach-Typ.
PHP ist eine Art Sprache schwach, und es hat schwach typisierte Variablen.
In anderen Worten bedeutet das, dass man zwischen verschiedenen Arten von Variablentypen wechseln.
Sie können Ihre Nummer 1 als int zu speichern,
Sie sie als String speichern kann, und Sie können es als Schwimmer speichern,
und es werden alle, dass die Nummer 1 sein.
Auch wenn Sie es speichern in verschiedenen Formen,
es ist immer noch - die Variablentypen halten sich noch am Ende.
Also, wenn Sie schauen hier, wenn Sie sich erinnern von pset 7,
viele von Ihnen wahrscheinlich hatte Probleme mit diesem.
Zwei gleiche Zeichen, Gleichheitszeichen 3, 4 Gleichheitszeichen.
Okay, es gibt keine 4 Gleichheitszeichen, aber es gibt 2 und 3.
Mit zwei Gleichheitszeichen, um die Werte zu überprüfen.
Es kann über Arten zu überprüfen.
Also, wenn Sie beim ersten Beispiel sehen können,
Ich habe num_int == num_string.
Also Ihr int und Ihre Schnur sind, sowohl technisch, 1,
aber sie sind verschiedene Typen. Aber für die Doppel-Gleichen, wird es immer noch passieren.
Doch für die Dreifach-Gleichen, prüft es Wert sowie die verschiedenen Arten.
Das bedeutet, dass es nicht geht, in diesem zweiten Fall hier passieren,
wo Sie mit 3 Gleichheitszeichen anstelle bist.
Also das ist ein großer Unterschied, dass Sie alle haben jetzt gezeigt.
>> String-Verkettung ist ein weiteres leistungsfähiges, was Sie in PHP verwenden können.
Es ist im Grunde nur diese handliche Punktnotation,
und das ist, wie Sie Zeichenfolgen zusammen binden können.
Also, wenn Sie Katze und Hund haben Sie, und Sie die 2 Strings zusammen setzen wollen,
Sie können die Zeit nutzen, und das ist eine Art, wie es funktioniert.
Sie können auch einfach legen Sie sie nebeneinander,
wie Sie hier in der unteren Beispiel sehen können,
wo ich String 1, Raum 2 echo String.
PHP wird wissen, sie als solche zu ersetzen.
Arrays. Jetzt, in PHP gibt es zwei verschiedene Arten von Arrays.
Sie können regelmäßige Anordnungen haben, und Sie können auch assoziative Arrays,
und wir werden durch sie jetzt gehen.
Regelmäßige Arrays sind gerade diese in C,
und so haben Sie Indizes, die nummeriert sind.
Momentan sind wir gerade dabei, eine zu erstellen und -
so ist dies, wie wir ein leeres Array, dann werden wir
setzen in die Indexnummer 0.
Wir werden die Nummer 6, den Wert 6 gesetzt.
Sie können es an der Unterseite finden Sie hier.
Where's - bei Index-Nummer 1 werden wir Wert legen Nummer 4,
und damit Sie sehen können gibt es eine 6, gibt es eine 4,
und dann als wir Druck Dinge,
wenn wir versuchen, und drucken Sie das an der Indexnummer 0 gespeicherten Wert,
dann werden wir den Wert 6 wird gedruckt zu sehen. Cool?
Also das ist, regelmäßige Anordnungen für Sie.
Eine weitere Möglichkeit, auch Dinge, um regelmäßige Anordnungen jetzt hinzufügen
ist man einfach hängen Sie sie am Ende.
Das bedeutet, dass Sie nicht haben, um die spezifischen Index angeben.
Sie können sehen, Nummer, und dann in den eckigen Klammern gibt es kein Index angegeben.
Und sie wird wissen - PHP weiß, um es bis zum Ende der Liste, die nächste freie Stelle nur hinzufügen.
So haben Sie die 1 genau dort an dieser Stelle 0 sehen können,
die 2 ging genau dort an der ersten Stelle.
Das 3 geht - ist auch dort aufgenommen.
Also diese Art von Sinn macht. Du bist einfach nur ständig um sie,
und dann, wenn wir Echo der Index der Nummer 1,
er ausdruckt, den Wert 2.
>> Dann haben wir Arrays, die assoziative Arrays sind.
Assoziative Arrays, anstatt numerische Indizes
was sie tun, ist, sie von Indizes, die Zeichenfolge sind zu haben.
Sie können sehen, statt - ich habe all diese Anzahl Indizes zu befreien,
und jetzt ist es Tasten 1, 2, key3, und sie sind in Anführungszeichen zu bedeuten, dass sie alle Saiten.
So können wir ein Beispiel dafür haben.
Das Beispiel dafür ist, dass wir die tf, und das ist der Indexname.
Wir werden, wie der Name setzen "Ali", bei dem Index, Kalorien gegessen,
Wir können ein int anstelle einer Zeichenfolge setzen dieses Mal,
und dann bei den Index gefällt, können wir eine ganze Reihe in der es genommen.
Also das ist eine Art - es ist ein ähnliches Konzept, wie wir
Indizes mit Zahlen, aber jetzt können wir die Indizes drehen
um sie als Zeichenfolgen statt zu haben.
Sie können dies auch tun, außer nur tun es individuell,
Sie alles in einem Stück machen kann. So können Sie diese tf des Arrays sehen
und dann setzen wir sie alle in einem riesigen eckige Klammer gesetzt.
Damit kann die Dinge zu beschleunigen.
Es ist mehr als eine stilistische Wahl nicht.
Wir haben auch Loops.
In C haben wir Schleifen, wie diese funktionieren.
Wir hatten unser Angebot, und wir an das Ende der Liste ging von Index 0,
und wir drucken alles, oder?
Außer das Problem ist, für assoziative Arrays,
wir wissen nicht unbedingt, diese numerische Indizes
denn jetzt haben wir die Zeichenfolge Indizes.
Jetzt verwenden wir foreach-Schleifen, die wiederum, Sie hoffentlich in pset 7 verwendet.
Foreach-Schleifen wird nur jedes einzelne Teil der Liste kennen.
Und es muss nicht exakt die numerischen Index, die Sie kennen.
So haben Sie die foreach-Syntax, so ist es foreach, setzen Sie das Array.
Also mein Array heißt pset und dann als, das Wort,
und dann können Sie diese lokale temporäre Variable, die Sie verwenden sind gestellt
nur für die spezifische Sache, die gehen, die spezifische zu halten ist -
eine Instanz oder ein Abschnitt des Arrays.
Pset num halten wird 1, und dann ist es vielleicht die Zahl 6 zu halten,
und dann wird es die Nummer 2 zu halten.
Aber es ist garantiert durch jeden einzelnen Wert, der im Array ist zu gehen.
Nützliche Funktionen, die Sie in PHP wissen, sind die erfordern,
das macht sicher, dass Sie auch bestimmte Dateien sind, Echo, Ausfahrt leer.
Ich empfehle Ihnen bei pset 7 sehen und schauen Sie sich diese Funktionen.
Unter Umständen müssen Sie diejenigen kennen,
so würde ich auf jeden Fall wissen, was genau die sind alle tun.
>> Und jetzt werden wir durch Umfang wirklich schnell gehen.
Im Anwendungsbereich, ist PHP Art von einem funky Sache, im Gegensatz zu C,
und so haben wir gerade gehen, um durch sie schnell gehen.
Also sagen wir, wir beginnen an diesem Pfeil, die wir dort haben.
Und wir werden mit $ i starten. So wird die Variable 'i' wird zu 0,
und wir sind gerade dabei, ihn zu drucken in dem großen weißen Box auf dort zu halten.
Wir werden mit i0 zu starten, und dann werden wir es Echo.
So gibt es die 0.
Und dann werden wir ihm von der for-Schleife zu erhöhen,
und dann es geht um den Wert 1 sein.
Man ist weniger als 3, also wird es durch die for-Schleife übergeben,
und dann werden wir sehen, es wieder gedruckt.
Wir werden es wieder erhöhen zu 2,
und 2 ist kleiner als 3, so dass es dann die for-Schleife übergeben, und es wird die 2 drucken.
Dann werden Sie beachten Sie, dass 3 nicht weniger als 3, so dass wir von der for-Schleife zu brechen.
So, jetzt haben wir verlassen, und dann werden wir in aFunction gehen.
Okay. So haben Sie zu beachten, dass diese Variable, die wir geschaffen haben,
das 'i' variable, nicht lokal Gültigkeitsbereich.
Das bedeutet, dass es nicht für die Schleife lokal,
und Variable, die wir können immer noch auf und ändern danach, und es wird immer noch wirksam sein.
Also, wenn Sie nun in der Funktion gehen, werden Sie sehen, dass wir auch die "i"-Variable verwenden,
und wir werden zu erhöhen 'i' + +.
Sie würden denken, auf den ersten, bezogen auf C, dass das ist eine Kopie der "i"-Variable.
Es ist eine ganz andere Sache, was richtig ist.
Also, wenn wir es drucken, wir gehen zu drucken 'i' + +, die gehen, um zu drucken, dass 4,
Entschuldigung - und dann sind wir los.
Dann werden wir aus dieser Funktion zu beenden,
und wir werden dort sein, wo dieser Pfeil ist jetzt.
Das bedeutet, dass dann aber, auch wenn die Funktion verändert den Wert von "i",
es hat nicht außerhalb der Funktion zu ändern,
da die Funktion hat einen separaten Rahmen.
Das bedeutet, dass, wenn wir echo 'i', hat es nicht in den Geltungsbereich der Funktion verändert,
und so ist, dann werden wir Sie erneut zu drucken 3.
Verschiedene Dinge über Umfang in PHP als in C.
>> Jetzt in PHP und HTML.
PHP wird verwendet, Webseiten dynamischer zu gestalten.
Es Art von macht die Dinge anders.
Wir haben es anders als HTML.
Mit HTML, haben wir immer nur die gleiche statische Sache, wie, wie Rob zeigte,
wohingegen PHP, können Sie die Dinge, die auf der Basis der Benutzer zu ändern.
Also wenn ich das, ich habe: "Sie sind angemeldet -" und dann den Namen,
und ich kann den Namen ändern. So jetzt der Name ist Josef,
und es hat die "über mich", aber dann kann ich auch den Namen ändern, um Tommy zu haben.
Und das wäre eine andere Sache sein.
So, dann können wir auch verschiedene Dinge über ihn zu ändern,
und es wird unterschiedliche Inhalte zeigen, die auf dem Namen.
So können PHP Art ändern, was ist los in Ihrer Webseite ein.
Same here. Dennoch ist zu beachten, dass sie unterschiedliche Inhalte haben,
obwohl Sie sind technisch immer noch Zugriff auf diese Web-Seite auf der Oberfläche.
Generieren von HTML. Es gibt 2 verschiedene Möglichkeiten, wie Sie dies tun können.
Also werden wir durch dieses Recht jetzt gehen. Der erste Weg ist, Sie haben - ja, sorry.
So müssen Sie nur noch Ihre regelmäßigen for-Schleife in PHP,
und dann können Sie in PHP echo und Sie HTML aus Echo.
Mit Rob zeigte, was Sie von HTML-Skript
und dann mit dem PHP-Druck nur drucken Sie es aus, um die Web-Seite.
Der alternative Weg ist, es zu tun, als ob Sie die PHP und HTML zu trennen.
So können Sie eine Zeile PHP, die die for-Schleife beginnt zu haben,
dann können Sie die Linie der HTML-Code in einem separaten Sache zu haben,
und dann die Schleife zu beenden, wieder mit einem PHP.
So ist es irgendwie trennen Sie es heraus.
Auf der linken Seite können Sie, dass Sie alle -
es ist nur ein Stück von PHP.
Auf der rechten Seite können Sie sehen, dass Sie eine Reihe von PHP haben,
Sie haben eine Reihe von HTML, und Sie haben eine Zeile PHP wieder haben.
So trennt sie sich in das, was sie tun.
Und Sie werden feststellen, dass so oder so, für eine von ihnen,
sie immer noch drucken Sie das Bild, das Bild, das Bild,
so still, dass HTML wird genauso gedruckt.
Und dann wird man noch die 3 Bilder zeigen, bis auf Ihrer Webseite ein.
So ist es zwei verschiedene Möglichkeiten, das Gleiche zu tun.
>> Jetzt haben wir Formulare und Anträge. Als Rob zeigte Ihnen,
gibt es Formen von HTML, und wir werden gerade durch diese Brise.
Sie haben eine Aktion und eine Methode zu haben, und Ihre Aktion
Art zeigt Ihnen, wo Sie gehen, sie zu senden sind, und die Methode ist, ob
es geht um ein GET-oder POST sein.
Und eine GET-Anfrage, als Rob sagte, bedeutet, dass Sie gehen, um es in eine Form gebracht sind
und du wirst es als URL sehen, während eine POST-Anfrage werden Sie nicht in einer URL zu sehen.
Also ein kleiner Unterschied.
Allerdings ist eine Sache, die eine ähnliche Sache ist
ist, dass POST und GET sind gleichermaßen verunsichert.
So können Sie denken, dass, nur weil Sie nicht in der URL sehen es nicht,
das bedeutet, dass der POST ist sicherer,
Sie können aber immer noch in Ihrem Cookies sehen es in den Informationen, die Sie senden.
Also nicht darüber nachdenken, dass der eine oder andere.
Eine andere Sache zu beachten ist, dass Sie auch Abschnitt Variablen.
Ihr Jungs verwendet, um dieses in pset 7 bis Ihre Benutzer-ID Informationen zu erhalten.
Was geschah, war, dass Sie dieses assoziativen Arrays zu verwenden,
die $ _SESSION, und dann sind Sie in der Lage, verschiedene Dinge zugreifen
und speichern Sie verschiedene Dinge über die Seiten.
>> Letzte Sache ist, dass wir SQL, Structured Query Language,
und dies ist eine Programmiersprache, um Datenbanken zu verwalten.
Was genau sind Datenbanken? Sie sind Sammlungen von Tabellen,
und jede Tabelle können ähnliche Arten von Objekten haben.
So hatten wir eine Tabelle der Benutzer in Ihre Finanzen pset.
Und warum sind sie nützlich? Denn es ist ein Weg, der Informationen dauerhaft speichern.
Es ist ein Weg der Verfolgung und Verwaltung Dinge Dinge
und tatsächlich sehen, es auf verschiedenen Seiten und die Verfolgung.
Während, wenn Sie speichern sie gerade in diesem Moment ein unmittelbarer
und dann später nutzen, werden Sie nicht in der Lage, alles, was Sie gespeichert haben zugreifen.
Wir haben 4 wichtigsten Dinge, die wir für SQL-Befehle.
Wir müssen wählen, einfügen, löschen und aktualisieren.
Das sind wirklich wichtig für euch, für Ihre Quiz wissen.
>> Wir werden schnell über jetzt gehen wählen.
Grundsätzlich können Sie die Auswahl von Zeilen aus einer Datenbank sind.
Also, wenn Sie, genau hier -
wir haben diese zwei verschiedene Dinge sind, und wir wollen von der Klassen-Tabelle auswählen
wo awesome - wo in der Spalte genial der Wert 1 ist.
So können Sie hier sehen können, haben wir diese zwei Dinge von Klassenname,
CS50 und Stat110, und wir haben die Klassen-IDs und der Slogan.
So wollen wir all diese Informationen aus.
Dann sind Sie hier sehen können, dass es Art der Kommissionierung aus dieser genial Spalte
wo all die Dinge ein, und dann die Klassen-ID, Klassennamen und Slogan, dass es heraus hat.
Wie genau macht man das im Code zu tun? Sie müssen PHP zu verwenden.
Also das ist eine Art, wie PHP und SQL sind miteinander verwandt.
Jetzt haben wir unseren Code, und wir werden unsere Abfrage-Funktion verwenden
wie wir in pset 7, und wir werden die SQL-Abfrage.
Dann sind wir zu haben -
müssen wir immer, wenn Zeile Triple gleich, wenn falsche überprüfen.
, Um die Art und den Wert überprüfen Also noch einmal, Sie wollen,
und dann, wenn es nicht funktioniert, dann können Sie sich zu entschuldigen, wie üblich, wie wir in pset 7 haben wollen.
Ansonsten, durch alles, was mit diesen handlichen möchten Sie eine Schleife
foreach-Schleifen, dass wir gingen gerade über.
Jetzt, da wir durch Schleifen und wir haben es Vergangenheit gemacht haben,
nehmen wir an, dass unsere Abfrage übergeben, haben wir jetzt unsere foreach-Schleife.
Und die erste Zeile, die es hat, also hier ist die Reihe, rechts hier, es ist eingerahmt.
Es wird alle Informationen, die es bekommen ausdrucken.
Also, es wird am Ende ausdrucken "Wollen Sie HTML lernen?"
Dann, es wird in die nächste Zeile zu gehen, weil es die erste for-Schleife beendet ist,
und so ist, dann es geht um drucken Sie die zweite Zeile von ihm,
die gehen, um STAT110 sein, Finden Sie alle Moments.
>> Eine letzte Sache ist, die auf SQL Schwachstellen.
Ich weiß, dass David berührte diese ein wenig in der Vorlesung.
Sie können diese später zu lesen. Es ist wirklich lustig.
SQL Injection ist eine Art heikle Sache.
Lassen Sie uns sagen, dass Sie nur diese Variablen kleben rechts in Ihrer Abfrage
wie Sie in dieser ersten Zeile sehen können.
So scheint es in Ordnung, oder? Sie sind gerade dabei, den Benutzernamen
und Passwort, um Ihre SQL-Abfrage, und Sie es aus und versenden bekommen, was in der Datentabelle ist möchten.
Das scheint ziemlich einfach. So können sagen, jemand stellt in,
für das Passwort, diese oder Text hier -
sollte eigentlich in der roten Box sein.
Also lassen Sie uns sagen, dass sie setzen, dass Passwort in - das ist, was sie eingeben.
Also sie setzen oder "1" = 1 ist.
Ein bisschen eine dumme vergessen zu lassen.
Nun wollen wir ersetzen sie nur in, und Sie werden jetzt beachten Sie, dass in dieser SQL-Abfrage,
wertet, um immer wahr, weil Sie werden bemerken, dass
Sie können SQL-Abfrage wählen Sie alle diese Informationen
oder Sie können einfach nur 1 = 1.
Damit wird immer auf true zu evaluieren.
Das wird nicht wirklich funktionieren, weil das bedeutet, dass der Hacker in Ihr System zu brechen.
Die Lösung hierfür ist, dass Sie die PDO-System benutzen, haben,
was bedeutet, dass Sie Fragezeichen verwenden,
das ist, was euch in pset 7 verwendet wird,
wohin Sie gehen, um ein Fragezeichen im Ort, wo man etwas setzen wollen zu verwenden,
und dann wirst du ein Komma, und dann werden Sie danach haben,
nach der Schnur, die verschiedenen Variablen, die Sie in Ihre Fragezeichen zu ersetzen.
So werden Sie hier zu beachten, dass ich jetzt diese roten Fragezeichen.
Dann legte ich die Variablen nach meiner Saiten, damit ich weiß, sie in dieser Reihenfolge danach ersetzen.
Das wird dafür sorgen, dass wenn jemand es so,
und sie haben die 1 = 1 oder Situation, die sicherstellen wird,
im Backend, stellen Sie sicher, dass es nicht tatsächlich die SQL-Abfrage zu brechen.
Okay, das ist ziemlich viel es, ein Wirbelwind von PHP und SQL.
Viel Glück an euch alle, und jetzt zu Erz.
>> [Oreoluwatomiwa Babarinsa] Okay, alle. Zeit zu gehen über einige JavaScript
und einige andere Dinge sehr schnell, so dass wir nicht halten Sie sich heute Abend.
JavaScript. Ja. JavaScript ist eine Art coole Sache, angeblich.
Die Dinge, die Sie wirklich brauchen, um über JavaScript wissen, ist es ein bisschen wie
die clientseitige Ende, was Ihre Web-App wird zu tun.
Es gibt einige Dinge, die Sie wollen einfach nicht, um all der Zeit auf der Server-Seite zu nehmen.
All die kleinen Interaktionen, Hervorhebung eine Sache, so etwas verschwinden.
Sie wollen wirklich nicht zu Ihrem Server reden die ganze Zeit dafür zu haben.
Und einige, dass es nicht einmal möglich, auf der Server-Seite zu tun.
Das ist, warum wir so etwas brauchen JavaScript.
Coole Dinge über JavaScript: Es wird dynamisch typisiert.
Was dies bedeutet, ist, dass Ihr Programm nicht wissen müssen
was genau sind die Variablen, wenn Sie schreiben es aus.
Es wird nur eine Art Reim darauf machen, wie es läuft.
Andere Dinge, die es zu kühl sind: Es ist eine geschweifte Klammer Sprache,
was bedeutet, die Syntax ist ähnlich zu C und PHP.
Sie haben nicht zu viel Nacharbeit zu tun, wenn Sie lernen JavaScript sind.
Hier haben wir ein wenig JavaScript.
Interessante Sache hier ist, dass, wenn man es betrachtet,
wir haben ein bisschen von JavaScript direkt in der Kopf-Tag.
Was tut, ist im Grunde nur eine JavaScript-Datei enthalten.
Dies ist eine Möglichkeit, Sie JavaScript in Ihr Programm aufzunehmen.
Dann ist die zweite etwas tatsächlich einige Inline-JavaScript
sehr ähnlich zu einem Inline-Stil mit CSS
und du bist nur einen Code schreiben sehr schnell dort.
JavaScript muss Arrays.
Nur ein weiterer Weg, um Daten herum zu halten, sehr nützlich.
Sehr schöne und einfache Syntax.
Sie eckige Klammern, alles zugreifen und halten alles zusammen.
Nichts zu komplex.
Die kühle Sache über JavaScript-und Scripting-Sprachen im Allgemeinen
ist, dass Sie nicht haben, um über Feldgrößen zu kümmern.
Sie können nur array.length und verfolgen es,
und auch das Array wachsen oder schrumpfen, wie Sie es brauchen.
So müssen Sie auch brauchen, um über jede Art von Sorgen,
oh nein, ich muss mehr Dinge, oder so etwas zuzuweisen.
>> Die coole Sache hier ist, dass JavaScript hat etwas Objekte genannt.
Es ist eine objektorientierte Sprache, was es hat, ist im Wesentlichen
eine Möglichkeit für Sie, um Gruppendaten zusammen, ähnlich wie eine Struktur,
aber man kann es wie eine Struktur oder in einem assoziativen Array Syntax zugreifen können.
Es ist ziemlich einfach, und was Sie tun können, mit diesem zusammen ist Gruppendaten
wenn Sie eine Reihe von Daten, die im Zusammenhang ist zu haben.
Weil es all das, was Sie beschreiben, ein Auto benötigen,
Sie brauchen nicht, um es in einer Reihe von verschiedenen Orten haben.
Sie können nur kleben sie in ein Objekt in JavaScript.
Wie Sie wahrscheinlich wissen, ist das Durchlaufen eines dieser lästigen Aufgaben.
Sie tun es nur etwas über eine immer wieder. Sie müssen sich an jedem Objekt im Auto zu sprechen,
oder Sie müssen über jedes Element in einer Liste oder so ähnlich gehen.
So JavaScript muss, ähnlich wie bei PHP, einer foreach-Syntax.
In diesem Fall ist es eine für die in-Schleife.
Sie wollen diese nur für Objekte zu verwenden.
Es gibt einige Probleme, die, wenn Sie diese auf Arrays auftreten.
Es ist in der Regel eines der Dinge, obwohl, das ist sehr nützlich,
weil Sie eine Menge Overhead beseitigen
weil Sie nicht haben, um alles, was in Ihrem Objekt selbst hochzuziehen.
Sie müssen nicht alle wichtigen Namen erinnern.
Sie einfach irgendwie bekommen sie zurück in dieser Syntax.
In diesem, für, Sie wollen einfach nur daran zu erinnern,
dass Sie immer wieder sind alle Schlüssel, in einer sehr ähnlichen Weise zu Tisch Hash.
Wenn Sie sich erinnern, dass aus, wenn Sie in einem String setzen würde, Sie könnten etwas raus
das wäre eine zugehörige Wert mit ihm haben.
Was man damit machen kann, ist man sagen kann, okay,
Ich habe in einem Auto, und ich nannte es ein Ferrari.
So können Sie in der Zeichenfolge Ferrari später wieder setzen kann, und Sie können die raus.
Und Sie können, dass in einer Schleife zu tun, mit dem in-Schleife.
Also einfach mehr über Objekte. Das Wichtigste von dem aus Sie sich merken müssen,
ist, dass man das Objekt Struktur ähnliche Syntax verwenden, wann immer Sie wollen, mit diesen,
außer wenn das, was Sie gehen, um als String verwenden ist kein gültiger Variablenname.
Also, wenn Sie an dieser dort zu suchen, haben wir Schlüssel mit Leerzeichen.
Nun, wenn Sie object.key gestellt waren, Raum, mit, Raum, Räume,
dass wäre einfach nicht sinnvoll, syntaktisch.
So können nur Sie, dass mit dieser Art von Klammer-Syntax zu tun.
>> Auch ist JavaScript sehr Umfang weise zu PHP.
Sie haben 2 Möglichkeiten der Adressierung Umfang.
Sie können nicht die var vor einem variablen,
und das bedeutet nur, das ist global.
Sie können es von überall zu sehen. Auch wenn Sie dies in einer if-Anweisung gesetzt waren,
anderswo im Code nach diesem Punkt könnte man diese Variable zu sehen.
Eine andere Sache ist aber, mit der var, es ist begrenzt, was auch immer Sie sind in. Funktion
Wenn Sie nicht in einer Funktion sind, gut, es ist global.
Aber wenn du in einer Funktion gibt es nur innerhalb dieser Funktion sichtbar.
Ich habe nicht ein Beispiel, aber, ja. Es ist eines dieser Dinge, wo
Sie verwalten können, welche Variablen Sie globale sein wollen,
welche Variablen Sie wollen lokal zu sein, aber Sie müssen vorsichtig sein, über diese zu sein,
weil Sie nicht über die Art der Feinkorn Kontrolle, die Sie in C,
wo, wenn etwas in eine for-Schleife deklariert, es geht um, dass zur Laufenden zu bleiben.
Das, was wir eigentlich egal, über die Verwendung von JavaScript manipuliert Web-Seiten, oder?
Ich meine, das ist, warum wir das tun.
>> Um das zu tun, haben wir so etwas wie das DOM zu verwenden.
Das Document Object Model.
Im Grunde, was es tut, ist es nimmt alle Ihre HTML
und Modelle es in einen Haufen von Objekten, die ineinander verschachtelt sind.
Sie beginnen mit so etwas.
Sie haben auf der rechten Seite für mich, eine Reihe von Code gibt, ist irgendwie -
Sie würden denken, das wäre sehr schwer zu manipulieren,
denn Sie würden durch ein Bündel von Text Parsen
und mit zu Stück auseinander Dinge. Und was, wenn es nicht korrekt formatiert?
Schlimme Dinge passieren würde.
So JavaScript erledigt dies für Sie, und Sie haben eine schöne Datenstruktur zu erhalten,
wie die, die zu meiner Linken, wo Sie nur noch ein Dokument,
und innen, dass Sie so etwas wie HTML,
und innen, dass Sie einen Kopf und einen Körper,
und innerhalb dieser Kopf Sie einen Titel haben, etcetera, etcetera, etcetera.
Dies vereinfacht die Manipulation einer Web-Seite, so dass es nur,
oh, ich will nur auf dieses Objekt sprechen.
Sortieren von einer sehr ähnlichen Weise würden Sie zu einem anderen Objekt, das Sie selbst gemacht zu sprechen.
Wie ich schon sagte, ist alles, das DOM-Objekt im Dokument.
Entweder ist es nur an einer Stelle und dann kann man in ihm gehen, um Dinge zu finden,
und Sie können es tun - das ist der alte Stil, es zu tun, da oben,
wo Sie tun document.getElementById, und dann den Namen,
und wie Sie wahrscheinlich sagen kann, erhält diese nach einer Weile sehr unhandlich.
So haben Sie wahrscheinlich nicht wollen, das zu tun. Das ist, warum wir
das nächste, was wir gehen danach zu reden.
Das Wichtigste dabei ist, dass alles in Ordnung, Sie haben all diese Elemente, richtig?
Also vielleicht kann ich die Farbe etwas, wenn die Seite geladen ändern.
So what? Was, wenn mein Benutzer klickt auf etwas?
Ich will es etwas Interessantes zu tun, wenn sie auf etwas.
Das ist, warum wir Veranstaltungen.
Sie können, im Grunde, finden jedes Element in Ihrem DOM,
und dann sagen, hey. Wenn diese lädt oder jemand klickt,
oder wenn sie die Maus über sie, tun Sie etwas mit ihm.
Und was Sie haben, ist, können Sie Funktionen, die diese verarbeiten für Sie haben.
Diese Funktionen sind Event-Handler.
Was sie sind - es ist nur eine andere Art zu sagen,
Diese Funktion wird nur ausgeführt, wenn dieses Ereignis passiert.
So ist es das Ereignis behandelt, die auftritt.
Dies ist, wie Sie das Layout einen Event-Handler.
Ich habe eine Taste, und wenn Sie darauf klicken, explodiert sie.
Also klicken Sie nicht auf die Taste.
Dies ist eine Möglichkeit der Annäherung, nicht wahr?
Sie haben eine Taste-Tag, und klicken Sie auf eine Zeichenfolge, die sagt haben,
oh, übrigens, ich mache diesen explodierenden Sache für mich.
Ansonsten ist es wie eine normale Taste, die Sie gerade gemacht.
Sie können dies auch tun, einen anderen Weg,
durch Greifen das DOM-Element, aber das sparen wir uns, nachdem wir über jQuery sprechen.
>> JQuery: Es ist eine Bibliothek, die Cross-Browser ist.
Sie können es in so ziemlich alles zu verwenden.
Und es gibt dir nur eine Menge von Werkzeugen, mit zu arbeiten.
Da JavaScript, während kraftvoll, nicht alle Werkzeuge, die Sie brauchen
aus der Box, um eine Web-App wirklich angehen möchten Sie vielleicht zu tun.
So vereinfacht es eine Menge Dinge, gibt Ihnen eine Menge von Funktionen
aus der Box, die Sie normalerweise haben, um sich wieder zu schreiben, über und über und über.
Und macht die Dinge sehr einfach.
Sie haben auch Selektoren, die Sie alle jene Elemente herausnehmen lassen
von Ihrem DOM viel einfacher, anstatt diese sehr lange Funktionsaufrufe zu verwenden.
Mehr über diese Selektoren. Sie haben, dort haben Sie, sagen wir,
Ich möchte ein Element mit der ID zu bekommen "rock".
Nun, in jQuery, es ist nur $ und dann eine Zeichenkette, die ein Pfund hat, und dann "rock".
Es ist sehr einfach und viel schneller als die traditionelle JavaScript Weg, um dieses Problem.
Und Sie haben ähnliche Dinge für Klassen und Elementtypen.
jQuery ist - eine der coolen Features ist, können Sie eine Art zu komprimieren
Sie Ihre Anfragen an das DOM sehr, sehr schnell.
Jetzt sind wir zurück zu Event-Handling, und dies ist, wie würden Sie eine Veranstaltung in jQuery zu behandeln.
Also, was wir hier los ist, wir sagen, alles in Ordnung. Ich habe ein Script-Tag, oder?
Also ich habe diese Inline JavaScript.
Was wir tun werden ist, dass wir sagen, alles in Ordnung.
Wenn das Dokument fertig ist, was bedeutet, dass das Dokument geladen ist,
werden wir gehen in dieser Funktion, und wir sagen, okay,
Diese Funktion ist eigentlich etwas anderes zu tun.
Es ist im Grunde sagen, alles in Ordnung, hol mir das Element mit der ID "myid."
Und dann geben diese eine Funktion Handler, wenn Sie darauf klicken ausführt.
Im Grunde, was das bedeutet ist, heißt es, alles in Ordnung.
Die Seite wird geladen, so werde ich in, finden Sie dieses Element,
geben Sie diese Ereignishandler, und es im Grunde stellt Ihre Seite für Sie.
Und das ist, wie Sie über die Ereignisbehandlung denken.
Sie wollen einfach nur zu denken, okay, wenn etwas eintritt, was will ich passieren?
Sie wollen nicht zu denken, okay, ich muss sicher, dass diese Sache im Gespräch mit dieser Sache zu machen,
diese Sache blah blah blah, weil Sie nur wollen, was in Bezug auf die Ereignisse zu sprechen.
Wenn dies geschieht, so geschieht dies. Wenn dies geschieht, passiert es, dass.
Und wenn es andere Dinge auslösen, das ist toll.
Aber Sie wollen nicht zu versuchen und tun komplizierten Code
wo man triggert mehrere Dinge zur gleichen Zeit,
weil Sie gerade dabei, sich ein Kopfschmerz zu geben.
>> Alles klar. Jetzt können wir unsere Seite, um Ereignisse zu verarbeiten,
aber sagen wir mal meine Benutzer auf eine Schaltfläche klickt.
Was ist, wenn ich möchte, dass die Anfrage zurück an den Server zu senden,
aber ich will nicht, um die Seite neu zu laden, da mit, eine neue Seite laden
jedes Mal bekommt Art von langweilig, und warum muss ich
um den Header wieder nach unten ziehen und die Fußzeile wieder
und alle Elemente der Seite erneut
nur, um die Begrüßung oder die Zeit, zu aktualisieren?
Also das ist, warum wir so etwas wie Ajax haben.
Was wir hier mit Ajax zu tun ist, können wir sagen, okay,
Ich möchte einige Daten an den Server zu senden,
und ich möchte eine Antwort zurück zu bekommen, damit ich meine Seite zu aktualisieren,
oder vielleicht auch nur tun einige algorithmische Berechnung, die nicht unbedingt zeigen, ist alles, was für den Benutzer.
Was wollen Sie dies tun? Nun müssen Sie eine URL, die Sie sprechen müssen.
Ihr Server kann nicht nur magisch aus dem Nichts hören.
Sie müssen einen bestimmten Ort Sie diese Daten an haben.
Und Sie müssen auch einige Daten zu schicken, oder vielleicht ist es ein datenlosen Abfrage.
Sie wollen einfach nur zurück an den Server anpingen und sagen, hey, am Leben, oder so ähnlich, dass ich bin.
Und dann hast du eine Funktion, die im Grunde mit Erfolg behandelt werden soll.
Angenommen, Sie haben einige Informationen wieder vom Server,
und Sie wollen den Titel des Benutzers auf ihrer Seite ändern möchten.
So können Sie die Informationen zurück bekommen würde,
und Sie würden, dass auf den Bildschirm zu schieben.
Was passiert, ist, wenn die Seite fertig ist,
Sie auf eine Funktion zu erstellen, klicken Sie für diese Schaltfläche namens Anmeldefenster.
Was dies dann tut, ist, dass, wenn Taste gedrückt wird,
Sie greetings.php zu sprechen, eine POST-Anforderung machen Sie,
und Sie sagen, hey, hol mir etwas von Ihrer Seite.
Wir wissen nicht wirklich brauchen, um zu beschreiben, aber greetings.php,
lasst uns einfach sagen, gibt zurück "Hallo Welt".
Also zurück bekommen wir diese "Hallo Welt", und auf den Erfolg dieser,
unter der Annahme, nichts schief geht, dann werden wir nur an diese Ziel Platz zu gehen
dass wir angegeben und wir nur halten die Antwort dort.
Und das ist eine sehr einfache Möglichkeit der Einrichtung eines Ajax-Abfrage.
>> Sehr schnell, Rob Art erwähnte dies bereits,
Dinge schief gehen, können schlimme Dinge passieren,
so dass Sie sich mit diesen HTTP-Antwortcodes vertraut machen wollen.
Was diese sind nur, wie, 200, ging alles okay.
Etwas anderes, schlimme Dinge passiert.
Es ist in der Regel das, was Sie sich erinnern wollen.
Aber es ist schön, all diese kennen.
Und schließlich, sobald wir durch all das weg,
wir müssen sehr schnell über Design zu sprechen,
und dann können wir euch alle verlassen.
Design. Dinge, die Sie sich erinnern wollen.
Stellen Sie sich folgende Fragen: Wer werden Sie mit diesem?
Was werden sie eingesetzt? Was meine Nutzer kümmern?
Was sie nicht zu kümmern?
Sie wollen einfach nicht, um eine App zu machen und lassen Sie sie einfach wachsen
und werden diese riesige, alles verzehr Sache, die Sie nicht einmal beenden kann.
Sie wollen diskrete Ziele und Pläne und Dinge, die Sie ansprechen wollen.
Machen Sie es mühelos. All dies erklärt, im Grunde
machen es dem Anwender leicht, es zu benutzen, machen Sie es nicht ein riesiger Klecks Text wie dieser Folie ist, eigentlich.
Sie wollen nur, dass es etwas, wo es sehr einfach für jemanden, gehen in sein
und tun, was sie tun wollen.
Sie wollen nicht, sie zu haben, um 5 Seiten navigieren
, um Ihre Hauptfunktion Ihrer Website.
Wenn Google hatte vor 5 Seiten könnten Sie sogar etwas zu suchen,
niemand es verwenden würden.
Und schließlich, Papier-Prototyp, Fokusgruppe.
Haben Sie gute Design und Testverfahren.
Nur weil Sie denken, dass es für Sie arbeitet,
bedeutet nicht, dass jemand denkt, dass es funktioniert.
Aber ja, das ist es.
[CS50.TV]