(Helluva Boss)

Aus dem Englischen übersetzt

(Helluva Boss)

205

3969

Die I.M.P-Gruppe, mit der Möglichkeit von TETO!?

⯆⚉⯆
~Teteteto~

"Nenn mich nicht 'süß', ich bin gangsta!"
(Es wird empfohlen, es mit irgendeiner Art von Proxy zu verwenden. Ich weiß nicht, ob JLMM funktionieren wird, und ich bin zu faul, es selbst auszuprobieren)

Szenario eins:
Loona, Millie und Moxxie sind auf der Flucht vor den Cops.

Szenario zwei:
Du arbeitest jetzt seit einem Monat bei I.M.P. Heute haben sie alle eine Besprechung.

Szenario drei:
Du bist krank. Loona kümmert sich um dich. (Fluff gedacht)

Szenario vier:
Du und Millie seid auf einer Mission auf der Erde.

Szenario fünf:
Oh-oh...

Szenario sechs:
Es gab einen großen Streit. Geh und tröste Loona.

Szenario sieben:
Du und die Loon seid albern.

Szenario acht:
Loona, Millie, Moxxie und Blitzo wollen einen neuen Höllenhund adoptieren. Das bist du, Zwilling. (Höllenhund-POV)

Szenario neun:
Gib dein eigenes Szenario ein.

Tags:
Computer ergeben keinen Sinn. Wirf etwas Metall in eine Kiste und boom. Was zum Teufel geht hier vor sich? In deinem PC steckt eine zentrale Recheneinheit oder CPU. Sie ist im Grunde nur ein Stück Silizium mit Milliarden mikroskopisch kleiner Schalter, sogenannter Transistoren. Je nach Stromfluss können sie an oder aus sein, ähnlich wie eine Glühbirne, was uns zwei Zustände gibt: eins und null. Der Wert eines dieser Schalter wird Bit genannt. Ein einzelnes Bit richtet nicht wirklich viel aus, aber setzt sie zusammen und... Eine Gruppe von 8 Bits wird Byte genannt und kann 256 verschiedene Kombinationen aus 0en und 1en haben. Herzlichen Glückwunsch! Wir können jetzt Informationen speichern, indem wir in einem System namens Binär zählen. Jedes Bit repräsentiert eine Zweierpotenz, wobei 1 bedeutet, dass die Potenz enthalten ist, und 0, dass sie nicht enthalten ist. Diese Zahl hat also 1 mal 64, 1 mal 4 und 1 mal 1, was zusammen 69 ergibt. Das ist schön, aber für Menschen ist Hexadezimal noch besser. Es wird oft durch dieses 0x gekennzeichnet und ist einfach ein besser lesbares Format als Binär. Vier Binärbits können jeden Wert von 0 bis 15 annehmen. Hexadezimal verwendet 0 bis 9 und A bis F, um diese Werte darzustellen, sodass eine Gruppe von vier Bits durch eine hexadezimale Ziffer ersetzt werden kann. Okay, jetzt, wo wir Zahlen speichern können, müssen die Computer nur noch tatsächlich, na ja, etwas damit machen. Mit Transistoren kann man Logikgatter bauen, also elektronische Schaltkreise, die logische Aussagen verkörpern. Du kannst es dir wie eine Glühbirne mit zwei Schaltern vorstellen, bei der das Licht nur unter bestimmten Bedingungen angeht, zum Beispiel nur, wenn A und B an sind. Indem man Logikgatter auf clevere Weise kombiniert, kann man Schaltkreise bauen, die Berechnungen nach der Booleschen Algebra durchführen, einem System, das mathematische Operationen im Binärsystem formalisiert. Aber obwohl Computer Nullen und Einsen verstehen, ist das für Menschen nicht wirklich allzu nützlich. Also können wir mithilfe einer Zeichenkodierung wie ASCII jedem Zeichen eine Binärzahl zuweisen. Wenn du etwas auf deiner Tastatur tippst, wird es in diesen Binärcode übersetzt, und sobald der Computer das sieht, sagt er: Ach ja, das ist ein großes A, und knallt es auf den Bildschirm. Wie diese Geräte zusammenpassen, wird von einem Betriebssystemkern wie Windows, Linux oder Mac geregelt, der zwischen Computerhardware und Anwendungen sitzt und verwaltet, wie alles zusammenarbeitet, zum Beispiel mit Gerätetreibern. Eingabegeräte ermöglichen es dir, dem Computer mit einem Tastendruck Anweisungen zu geben, aber auf der untersten Ebene verstehen Computer nur Anweisungen in Maschinencode, also Binärcode, der der CPU sagt, was sie tun und welche Daten sie verwenden soll. Wenn es darum geht, diese Anweisungen zu befolgen, ist die CPU sozusagen ein Genie, nur mit dem Gedächtnis eines dementen Goldfisches. Sie kann jede Anweisung verarbeiten, aber keine Daten speichern, daher ist sie nur mit einem Arbeitsspeicher oder RAM wirklich nützlich. Du kannst es dir wie ein Raster vorstellen, bei dem jede Box ein Byte an Informationen halten kann, das Daten oder Anweisungen sein kann, und eine Adresse hat, damit die CPU in vier Schritten darauf zugreifen kann. Aus dem Speicher holen, Anweisungen und Daten dekodieren und schließlich das Ergebnis ausführen und speichern. Das ist ein Maschinenzyklus. Da ein Programm im Grunde nur eine Liste von Anweisungen und Speicher ist, führt die CPU sie zum Ausführen nacheinander in Maschinenzyklen aus, bis es fertig ist. Oh ja, habe ich erwähnt, dass das, na ja, wirklich schnell passiert? Moderne CPUs schaffen Milliarden von Zyklen pro Sekunde, die von einem Taktgenerator koordiniert und synchronisiert werden. Die Geschwindigkeit dieses Takts wird in Gigahertz gemessen, und Leute übertakten oft ihre CPUs, um die Leistung zu verbessern, was schön ist, aber deinen PC einfach in Brand setzen könnte. Noch verrückter ist jedoch, dass eine CPU mehrere Kerne hat, die alle unterschiedliche Anweisungen parallel, also gleichzeitig, ausführen können. Jeder Kern kann auch in mehrere Threads aufgeteilt werden, wodurch jeder einzelne Kern mehrere Anweisungen gleichzeitig verarbeiten kann, indem er sehr schnell zwischen ihnen wechselt. Okay, das ist cool, aber es spielt keine Rolle, wie leistungsstark ein Computer ist, wenn du überhaupt keine Möglichkeit hast, ihm Anweisungen zu geben. Maschinencode von Hand zu tippen würde dich wahrscheinlich verrückt machen, aber zum Glück musst du das nicht. Der Kernel ist in eine Shell gehüllt, die einfach ein Programm ist, das den Kernel dem Benutzer zugänglich macht und einfache Anweisungen in einer Kommandozeilenschnittstelle mit Texteingaben ermöglicht. Aber der beste Weg, einen Computer etwas Nützliches tun zu lassen, ist mit einer Programmiersprache, die Abstraktion verwendet, sodass du statt diesem Code schreiben kannst, der so aussieht, und der dann für dich in Maschinencode umgewandelt wird. Einige Sprachen wie Python verwenden einen Interpreter, der den Quellcode direkt Zeile für Zeile auszuführen versucht. Andere Sprachen wie C oder Go verwenden einen Compiler, der das gesamte Programm in Maschinencode umwandelt, bevor er es in eine Datei packt, die die CPU ausführen kann. Nun, jede Programmiersprache hat eine andere Syntax, aber es gibt einige grundlegende Werkzeuge, die fast alle haben. Die einfachste Art, Daten zu verwenden, sind Variablen, die einem Namen einen Wert zuweisen, der dann wiederverwendet und geändert werden kann. Je nach Wert können Variablen unterschiedliche Datentypen haben. Für Text gibt es einzelne Zeichen und Zeichenketten aus mehreren Zeichen. Für Zahlen gibt es Ganzzahlen, die auch vorzeichenbehaftet sein können, wenn sie negativ sind, und Gleitkommazahlen für Dezimalwerte. Sie heißen Gleitkomma, weil das Komma umhergleiten kann, um Genauigkeit gegen Bereich einzutauschen. Das ist möglich, weil sie die wissenschaftliche Notation verwenden. Es ist eine Zahl mal einer Potenz, die dir sagt, wo das Komma hin soll, und genau so sehen sie unter der Haube aus. Die eigentliche Zahl wird mit Binärbrüchen gespeichert. Einige Brüche wie ein Drittel können im Binärsystem nur mit einer unendlichen Summe angenähert werden. Aber da der Speicher nicht unendlich ist, muss man ihn irgendwann abschneiden, was zu Rundungsfehlern führt und manchmal ziemlich seltsame Berechnungen verursacht. Wenn das nicht reicht, verbrauchen Long und Double die doppelte Speichermenge, um den Bereich von Ints und Floats zu verdoppeln. Einige Sprachen wie Python finden automatisch heraus, welchen Typ eine Variable hat, aber in einer Sprache wie C musst du den Typ einer Variablen explizit deklarieren. Der Wert einer Variablen wird an einer bestimmten Adresse im Speicher gespeichert. Zeiger sind Variablen, deren Wert die Speicheradresse einer anderen Variablen ist, was durch dieses kaufmännische Und-Zeichen gekennzeichnet wird. Ein Zeiger ist also wirklich nur ein Stück Speicher, das auf ein anderes Stück Speicher zeigt. Da eine Speicheradresse nur eine Zahl ist, kannst du sie addieren und subtrahieren, um durch einzelne Bytes des Speichers zu navigieren. Das nennt man Zeigerarithmetik. In einigen Low-Level-Sprachen wie C musst du Speicher manuell zuweisen und freigeben, sobald er nicht mehr verwendet wird. Das alles geschieht im Heap, einem Teil des Speichers, der dynamisch wachsen und schrumpfen kann, je nachdem, was das Programm verlangt, was mehr Kontrolle ermöglicht, aber es unglaublich leicht macht, deinen Code komplett zu zerlegen. Du könntest auf Speicher zugreifen, der dir nicht gehört oder einfach nicht existiert, was als Segmentation Fault bekannt ist. Aber auch wenn es ein Stück Speicher gibt, das nicht mehr verwendet wird und du vergisst, es freizugeben, oder du keine Möglichkeit mehr hast, darauf zuzugreifen, ist dieser Speicher nicht mehr nutzbar. Das nennt man ein Speicherleck und kann dazu führen, dass das Programm langsamer wird und schließlich abstürzt. Um dieses Durcheinander zu vermeiden, haben High-Level-Sprachen wie Python eingebaute Garbage Collectors, die den Speicher für dich verwalten. Unterschiedliche Datentypen belegen unterschiedlich viel Speicher. Ganzzahlen sind meistens 4 Bytes Speicher, ein einzelnes Zeichen ist meistens 1 Byte Speicher, und eine Zeichenkette ist einfach mehrere Zeichenbytes mit einem Nullzeichen, das das Ende der Zeichenkette signalisiert. Mehrere Elemente in einem zusammenhängenden Speicherblock wie diesem zu speichern, ist die Idee eines Arrays. Allgemeiner ausgedrückt ist es eine Liste von Elementen mit demselben Datentyp, wobei jedes Element einen numerischen Index hat, der meistens bei 0 beginnt. Da die Elemente im Speicher nebeneinander liegen, kannst du durch Kenntnis der Adresse des ersten Elements mithilfe von Zeigerarithmetik schnell auf jedes Element im Array zugreifen. Arrays sind, was man eine Datenstruktur nennt, also einfach eine Möglichkeit, Daten zu organisieren, um die Arbeit mit ihnen zu erleichtern. Das Abrufen von Werten aus einem Array ist blitzschnell, aber die Größe eines Arrays ist bei der Erstellung oft festgelegt, sodass du nichts hinzufügen kannst, wenn es voll ist, und wenn du es nicht vollständig nutzt, ist es einfach verschwendeter Speicher. Eine flexiblere Option ist daher eine verknüpfte Liste. Sie verwendet Knoten, die einen Wert und einen Zeiger auf den nächsten Knoten enthalten, wodurch sie im Speicher verstreut sein können. Außerdem kann sie dynamisch wachsen und schrumpfen, da du jeden Knoten hinzufügen und entfernen kannst, und du kannst sie neu anordnen, indem du einfach die Zeiger umhängst. Das ist großartig, aber sie können unpraktisch sein, da du keine Möglichkeit hast, auf den letzten Knoten zuzugreifen, außer indem du jeden einzelnen davor durchläufst. Aber trotzdem sind sowohl Arrays als auch verknüpfte Listen nützlich, da sie es dir ermöglichen, Warteschlangen und Stapel zu erstellen. Ein Stapel folgt dem Last-in-First-out-Prinzip, genau wie das Nehmen eines Pfannkuchens von einem Stapel. Stell dir praktisch einfach einen Zeiger vor, der immer auf das Element zeigt, das zuletzt zur Struktur hinzugefügt wurde; dann kannst du poppen, also das letzte Element entfernen, wodurch der Zeiger zurückgesetzt wird. Eine Warteschlange folgt dem First-in-First-out-Prinzip und verwendet zwei Zeiger, einen für das erste hinzugefügte Element und einen für das letzte. Jedes neue Element wird nach dem letzten Zeiger hinzugefügt, der dann aktualisiert wird, und das Dequeuing beginnt am ersten Zeiger. Eine weitere nützliche Datenstruktur ist eine Hash-Map, die einfach eine Sammlung von Schlüssel-Wert-Paaren ist. Sie funktioniert ähnlich wie ein Array, verwendet aber eine Hash-Funktion, um einen Schlüssel zu nehmen und ihm einen Index zuzuweisen, wo dann sein Wert gespeichert wird. Aber manchmal können zwei verschiedene Schlüssel auf denselben Index abgebildet werden, was als Kollision bezeichnet wird. Es gibt verschiedene Möglichkeiten, damit umzugehen, aber eine Möglichkeit ist, an dieser Position im Array eine verknüpfte Liste zu erstellen, was das Nachschlagen dieses Werts etwas langsamer macht, aber trotzdem sind HashMaps unglaublich nützlich, weil du die Schlüssel definieren kannst, die auf jeden Wert zeigen, und da sie auf Arrays basieren, ist das Abrufen blitzschnell. Für viele Probleme kann es sehr nützlich sein, die Beziehung zwischen verschiedenen Datenpunkten als Datenstruktur darzustellen. Wenn du die Knoten einer verknüpften Liste nimmst, aber zulässt, dass jeder Knoten auf jeden anderen Knoten zeigt, erhältst du einen Graphen, bei dem die Knoten durch Kanten verbunden sind, die gerichtet, ungerichtet sein und sogar ein Gewicht tragen können, das für jede Metrik wie Entfernung oder Kosten stehen kann. Graphen sind nützlich für die Analyse von Gruppen innerhalb von Netzwerken oder zum Finden des kürzesten Weges zwischen zwei Punkten, zum Beispiel in Google Maps. Es gibt zwei Hauptarten, einen Graphen zu durchsuchen. Die Breitensuche beginnt an einem Knoten und bewegt sich Schicht für Schicht nach außen, bis sie den Zielknoten zum ersten Mal findet. Die Tiefensuche erkundet jeden einzelnen Pfad vollständig, bis sie an eine Sackgasse stößt, dann geht sie zum letzten Knoten mit einem anderen Pfad zurück und fährt von dort auf die gleiche Weise fort, bis sie den Zielknoten findet. Ein Graph, bei dem zwei beliebige Knoten durch genau einen Pfad verbunden sind, wird Baum genannt und stellt eine Hierarchie dar, zum Beispiel das Dateisystem auf deinem Computer. Ein Baum beginnt an der Wurzel und verzweigt sich in Teilbäume, die in Blattknoten enden. Elternknoten können beliebig viele Kindknoten haben, aber oft sind Binärbäume am nützlichsten. Zum Beispiel wird ein Binärbaum, bei dem alle Werte links von einem Knoten kleiner und alle Werte rechts davon größer sind, als binärer Suchbaum bezeichnet, was das Finden bestimmter Werte extrem schnell macht. Wenn du einen Zielwert finden willst, beginne einfach an der Wurzel. Ist das Ziel kleiner als dieser Knoten, geh nach links, ist es größer, geh nach rechts, und wiederhole das, bis du das Ziel findest. Was wir gerade verwendet haben, ist ein sehr einfacher Algorithmus, also einfach eine Reihe von Anweisungen, die ein Problem Schritt für Schritt löst. Die einfachste Art, einen Algorithmus zu schreiben, ist in Form einer Funktion. Sie nimmt Eingaben, macht etwas damit und gibt eine Ausgabe zurück. Genau wie Variablen kannst du dann eine Funktion über ihren Namen aufrufen und verschiedene Argumente übergeben. Beim Aufruf einer Funktion wird der Funktionsaufruf auf den Aufrufstapel gelegt, einen Kurzzeitspeicher, der zur Ausführung von Code verwendet wird, und wie der Name schon sagt, basiert er auf einer Stapel-Datenstruktur, was bedeutet, dass das zuletzt Hinzugefügte zuerst herauskommt. Um Algorithmen umzusetzen, musst du oft zwei Werte vergleichen, was du mit Operatoren wie größer als oder Gleichheit und logischen Ausdrücken wie und, oder und nicht tun kannst. Solche Ausdrücke sind einfach, sie können wahr oder falsch sein, die möglichen Werte des Booleschen Datentyps, und ermöglichen es dir, bedingte Anweisungen zu schreiben. Wenn eine Bedingung wahr ist, tue dies, sonst tue das. Boolesche Werte können auch verwendet werden, um über bestimmte Teile des Codes zu schleifen. Eine Möglichkeit ist eine While-Schleife. Solange diese Bedingung wahr ist, wird dieser Code ausgeführt. Eine andere Möglichkeit ist eine For-Schleife, die über jedes Element innerhalb einer Datenstruktur wie einem Array iterieren kann, aber auch für eine bestimmte Anzahl von Iterationen schleifen kann, indem sie einen Startwert festlegt, ihn nach jeder Iteration erhöht und eine Obergrenze mit einer Bedingung festlegt. Funktionen können sich auch selbst aufrufen, was als Rekursion bekannt ist. Das ist nützlich, wenn ein Problem in kleinere identische Probleme zerlegt werden kann, wie die Berechnung von 5 Fakultät, was einfach 5 mal 4 Fakultät ist, was einfach 4 mal ist. Aber standardmäßig ruft sich eine rekursive Funktion einfach immer weiter selbst auf. Das bedeutet, dass sie immer mehr Funktionsaufrufe auf den Aufrufstapel legt, bis der Stapelspeicher überschritten wird, was als Stack Overflow bezeichnet wird. Das ist nicht optimal. Um das zu stoppen, musst du einer rekursiven Funktion eine Abbruchbedingung hinzufügen, die definiert, wann gestoppt wird. Erst dann werden die Funktionsaufrufe ohne Absturz deines PCs ausgeführt. Rekursion ist cool, aber sie kann zeit- und speichermäßig ziemlich teuer sein. Um die Anzahl der benötigten Berechnungen zu minimieren, können vergangene Ergebnisse in einem Cache gespeichert werden, sodass der Computer sie nicht von Grund auf neu berechnen muss, wenn sie wieder auftauchen. Das nennt man Memoisierung. Apropos Leistung: Um zu beurteilen, wie gut ein Algorithmus ist, kannst du die Zeit- und Platzkomplexität betrachten, also wie viel Zeit oder Speicher zur Ausführung benötigt wird. Dies wird in der Big-O-Notation gemessen, die die Beziehung zwischen dem Wachstum der Eingabegröße und der Anzahl der benötigten Operationen zur Ausführung des Algorithmus beschreibt. Zum Beispiel ist das Addieren von 1 zu jeder Zahl in einem Array O, weil die Anzahl der Operationen linear mit dem Wachstum des Arrays zunimmt. Relevant ist nicht die genaue Anzahl der Operationen, sondern der Trend, wenn die Eingabegröße gegen unendlich geht. Siehst du, so etwas wie n Fakultät wächst viel schneller als jede lineare Funktion jemals könnte. Solange die Zeitkomplexität also eine Art lineare Beziehung ist, wird sie auf O vereinfacht, und dasselbe gilt für jede andere Gruppe. Beim Schreiben eines Algorithmus gibt es immer verschiedene Ansätze. Ein Brute-Force-Ansatz bestünde darin, einfach jedes Element zu prüfen, bis wir ein Ziel in einer Liste finden. Aber wenn du willst, dass dein Programm schneller läuft als eine Gartenschnecke, brauchst du einen ausgefeilteren Ansatz wie Teile und Herrsche. Bei der binären Suche zum Beispiel prüfst du wiederholt das mittlere Element, um zu sehen, auf welcher Seite das Ziel liegt, und suchst in dieser Hälfte weiter, bis du es findest. Außerdem gibt es verschiedene Ansätze zum Schreiben von Code im Allgemeinen, die als Programmierparadigmen bezeichnet werden. Deklarative Programmierung beschreibt, was der Code tut, aber nicht, wie genau der Computer es tun soll, während imperative Programmierung explizit beschreibt, wie der Computer ein Ergebnis mit detaillierten Anweisungen erreichen soll. Eine Erweiterung der imperativen Programmierung ist die objektorientierte Programmierung, bei der du Klassen als Baupläne für Objekte definieren kannst, also einzelne Einheiten bestehend aus Daten in Form von Eigenschaften und Verhaltensweisen in Form von Methoden. Um eine Klasse zu programmieren, beginnst du damit, die Eigenschaften als Variablen und die Methoden als Funktionen zu definieren. Nachdem du Eigenschaften und Methoden in einer Klasse gekapselt hast, kannst du ein Objekt instanziieren und die Punktnotation verwenden, um mit seinen Eigenschaften und Methoden zu arbeiten. Klassen machen es einfach, Code zu organisieren und wiederzuverwenden, weil du Unterklassen definieren kannst, die Eigenschaften und Verhaltensweisen einer Oberklasse erben, aber sie auch erweitern und überschreiben können. Zum Beispiel könnte eine Unterklasse für eine Quietscheente quaken mit einem Quieken implementieren. Infolgedessen können Quietscheenten als Objekte der Entenklasse behandelt werden, verhalten sich aber anders, wenn quaken aufgerufen wird, was das Konzept der Polymorphie ist. Aber für manche Probleme wird keines dieser traditionellen Paradigmen funktionieren. Sagen wir, du willst einen Computer dazu bringen, zu erkennen, welches dieser Bilder eine Biene ist. Das Problem ist, du kannst nicht wirklich mit Code beschreiben, wie eine Biene aussieht. Hier kommt maschinelles Lernen ins Spiel, also einem Computer eine Aufgabe beizubringen, ohne ihn explizit dafür zu programmieren. Zuerst brauchst du viele Daten, die du in Trainingsdaten und Testdaten aufteilen kannst. Als Nächstes wählst du einen Algorithmus, der seine Parameter im Laufe der Zeit ändern kann, zum Beispiel ein neuronales Netz, bei dem die Gewichte aktualisiert werden können, um ein anderes Ergebnis zu erzielen. Indem du dem Algorithmus viele, viele Trainingsdaten zuführst, kannst du ein Modell aufbauen, dessen Genauigkeit du dann mit den Testdaten überprüfen kannst. Wenn es nicht ganz richtig ist, kann sich das Modell im Laufe der Zeit verbessern, indem es die Ausgabe mit dem vergleicht, was sie hätte sein sollen, die Differenz in einer Fehlerfunktion erfasst und seine Parameter anpasst, um die Differenz zu minimieren. Aber egal wie futuristisch, hochmodern, blitzschnell und optimiert es ist, wenn du willst, dass Leute die Anwendung, die du geschrieben hast, tatsächlich nutzen, solltest du wahrscheinlich etwas über das Internet wissen. Es ist ein Netzwerk von Computern aus der ganzen Welt, die durch Kabel verbunden sind. Also buchstäblich ist das Internet einfach ein Haufen dicker Kabel, die am Grund des Ozeans entlanglaufen, zusammen mit Einrichtungen wie Internetdienstanbietern, die dich mit deinem Ziel verbinden. Diese Computer kommunizieren mit der Internet-Protokoll-Suite. Jeder Computer im Netzwerk hat eine eindeutige IP-Adresse, und zwei Computer können dann Daten mit einem Transmission Control Protocol übertragen. Es zerlegt Nachrichten in einen Haufen Pakete, schickt sie durch ein Netzwerk von Kabeln, bevor das empfangende Ende die Nachricht wieder zusammensetzt. Wenn du eine schlechte Internetverbindung hast, hast du vielleicht schon mal Paketverlust erlebt, was einfach bedeutet, dass einige dieser Pakete unterwegs verloren gehen. Wenn das Internet die Hardware ist, dann ist das Web die Software, die du mit einem Browser nutzen kannst. Jede Seite im Web hat eine URL. Wenn du sie in deinen Browser eingibst, sucht er die IP-Adresse des Servers, der diese Website hostet, mit einem Domain Name System, das wie ein Wörterbuch ist, das Domainnamen den IP-Adressen tatsächlicher Server zuordnet. Nachdem er sich über TCP mit ihm verbunden hat, verwendet dein Browser, der Client genannt wird, das Hypertext Transfer Protocol, um eine HTTP-Anfrage an den Server zu senden, der dann eine Antwort gibt, die idealerweise den Inhalt der Webseite enthält. Die eigentliche Website besteht meistens aus drei Teilen. Eine HTML-Datei enthält den gesamten Inhalt einer Website und ist im Grunde nur eine Sammlung von Elementen, die Text, Links, Buttons und so weiter sein können. Eine CSS-Datei steuert die Optik und lässt eine Website gut aussehen. Aber eine Website ist nutzlos, wenn das Drücken schön aussehender Buttons nichts bewirkt, also fügt eine Sprache wie JavaScript Funktionalität hinzu. Aber manchmal kann etwas schiefgehen. Mit jeder HTTP-Antwort kommt ein Antwortcode, der Informationen über den Status der Antwort trägt. Zum Beispiel bedeutet 200 OK, und alles, was mit 4 beginnt, ist ein Fehler, der berühmteste davon ist 404, Seite nicht gefunden. HTTP-Anfragen können verschiedene Methoden tragen, zum Beispiel get, post, put und delete, also Informationen abrufen, hinzufügen, aktualisieren und löschen. Diese werden oft von Anwendungsprogrammierschnittstellen verwendet, die zwei Anwendungen verbinden und ihnen ermöglichen, miteinander zu interagieren. Zum Beispiel Daten aus einer Datenbank speichern und abrufen. Die häufigste Art von Datenbank ist eine relationale Datenbank, die Tabellen verwendet, um Daten zu speichern. Spalten einer Tabelle enthalten verschiedene Attribute, und Zeilen stellen einzelne Datenpunkte dar. Außerdem hat jede Tabelle ein eindeutiges Attribut, das als Primärschlüssel bezeichnet wird. Ein Fremdschlüssel ist der Primärschlüssel einer anderen Tabelle und stellt eine Beziehung zwischen den beiden her. In diesem Fall ist jedes Buch mit einem Autor verbunden. Mit einer Sprache wie SQL kannst du Anweisungen schreiben, um mit Daten aus diesen Tabellen zu arbeiten. Du könntest die Titel und Autoren aller Bücher nachschlagen, deren Titel mit einem H beginnt, aber dafür müssen wir die Tabelle der Autoren mit der Tabelle der Bücher über den passenden Schlüssel verbinden, um zwei Attribute aus verschiedenen Tabellen in einem zu kombinieren, was uns diese Ausgabe gibt. Diese Anweisungen sind nützlich, aber du musst vorsichtig sein, sonst löschst du vielleicht mit einer Zeile Code eine ganze Datenbank. Aber keine Sorge, das ist noch nie passiert. Hinter jeder Login-Seite steckt eine Datenbank mit Benutzernamen und Passwörtern. Wenn ein Benutzer versucht, sich anzumelden, wird oft eine SQL-Abfrage verwendet, um zu prüfen, ob die Benutzereingabe mit einem Eintrag in der Datenbank übereinstimmt. Das ist gut. Aber ein hinterhältiger Akteur könnte so etwas wie das hier eingeben, was die Abfrage ändert, indem es die Zeichenkette vorzeitig beendet und den Rest auskommentiert, was bedeutet, dass Zugriff gewährt wird, solange dieser Benutzername in der Datenbank existiert. Das nennt man einen SQL-Injection-Angriff, und es ist eine der einfachsten Möglichkeiten, wie Hacker an Orte gelangen, an die sie nicht gehören. Von diesen Konzepten zu hören ist eine Sache, aber um sie wirklich zu lernen, musst du sie in Aktion sehen und selbst anwenden, was genau das ist, was du mit Brilliant tun kannst, das Tausende interaktiver Lektionen für alles von Mathematik und Datenwissenschaft bis hin zu Programmierung und KI bietet. Sie sorgen dafür, dass Wissen haften bleibt, mit visuellen Lektionen und interaktiven Problemen, was nicht nur Spaß macht und intuitive Problemlösungsfähigkeiten aufbaut, sondern auch nachweislich sechsmal effektiver ist als einfach stundenlang Vorlesungen zu schauen. Ich weiß, dass es schwierig sein kann, Zeit zum Erlernen neuer Fähigkeiten zu finden, aber Brilliant macht es so einfach. Du kannst wertvolles Wissen von Grund auf in nur ein paar Minuten pro Tag mit häppchengroßen Lektionen von jedem Gerät, überall und jederzeit aufbauen. Du gehst von den Grundlagen der Datenwissenschaft bis zur Analyse echter Datensätze von Spotify in absolut kürzester Zeit, was du mit Mathematik-Grundlagen und Programmierkursen in Python ergänzen kannst, um eine der gefragtesten Fähigkeiten unserer Zeit aufzubauen. Das Beste daran? Du kannst alles, was Brilliant zu bieten hat, 30 Tage lang kostenlos ausprobieren, indem du brilliant.org slash wackyscience besuchst. Du bekommst außerdem 20 % Rabatt auf ein jährliches Premium-Abo. Danke an Brilliant für das Sponsoring dieses Videos.

Erstellt 30. Jan.

Aktualisiert 9. Aug.

Veröffentlicht 30. Jan.

Proxy erlaubt

Veröffentlichte Chats