World Wide Web

Mit welchen fachlichen Argumenten wurde das WWW-Proposal von Tim Burners Lee abgelehnt?

HTTP

Sie bekommen im Browser den HTTP Status Code 200. Was bedeutet das?

Der HTTP-Status Code 200 bedeutet "OK". Es zeigt an, dass die Anfrage erfolgreich war und der Server die gewünschte Ressource gefunden und zurückgegeben hat.

Sie bekommen im Browser den HTTP Status Code 301. Was hat das zu bedeuten?

HTTP-Status Code 301 ist eine Umleitung "Moved Permanently". Es bedeutet, dass Die angeforderte Ressource dauerhaft auf eine neue URL verschoben wurde.

Sie bekommen im Browser den HTTP Status Code 400. Was hat das zu bedeuten? Was können Sie dagegen tun?

HTTP-Status Code 400 bedeutet, dass es sich um eine "Bad Request" handelt. Zur vermeiden 400: Bad Request kann man folgende schritte unternehmen: URL überprüfen, Anfrageparameter überprüfen, löschen Browser-Cache, Anderen Browser benutzen usw.

Sie bekommen im Browser den HTTP Status Code 403. Was hat das zu bedeuten? Was können Sie dagegen tun?

HTTP-Statuscode 403 bedeutet "Forbidden". Es zeigt, dass der Server den Zugriff auf die angeforderte Ressource verweigert. Ich kann Folgendes tun, um den Fehler zu vermeiden: Berechtigungen überprüfen, Verfügbarkeit der Ressource überprüfen. Passwörter überprüfen (wenn die Ressource durch Passwörter geschützt ist ), Web-Admin kontaktieren usw.

Quiz zu HTML

Frage 1/6: Was ist HTML?


Frage 2/6: Wofür steht HTML?


Frage 3/6: Wofür wird HTML eingesetzt?


Frage 4/6: Wer hat HTML erfunden?


Frage 5/6: Zu welchem ursprünglichen Zweck wurde HTML erfunden?


Frage 6/6: Wer arbeitet alles an der Weiterentwicklung von HTML?



Quiz zu HTML-Tags

Frage 1/6: Was ist ein HTML-Tag?


Frage 2/6: Wofür nutzt man einen HTML-Tag?



Frage 3/6: Woraus besteht ein HTML-Tag und wie setzt man ihn ein?




Frage 4/6: Was ist ein HTML-Attribut?


Frage5/6: Wofür nutzt man ein HTML-Attribut?


Frage 6/6: Wie schreibt man einen Kommentar in HTML?


Lückentext zu HTML

<!DOCTYPE html>
 <html>
    <head>
      <title>Titel der Webseite</title>
    </head>
    <body>
       <h1>Anwendung von HTML-Tags</h1>
       <h2>Motivation</h2>
       <p>Dieser Lückentext unterstützt Sie dabei selbst einzuschätzen, ob Sie in der Lage sind das HTML-Grundgerüst und die HTML-Tags zum Markieren von Überschriften, Paragraphen und HTML-Kommentaren einzusetzen.</p>
     <!--
       <h2>Auskommentierung von HTML-Code</h2>
       <p>Dieser Abschnitt wurde auskommentiert.</p>
     -->
    </body>
 </html>

HTML-Literatur lesen und Fragen beantworten

Was ist HTML?

HTML: HTML ist die Standard-Auszeichnungssprache für Webseiten. Es verwendet Tags und Attribute, um Webinhalte zu strukturieren und Webbrowser verwenden HTML, um Benutzern Webseiten anzuzeigen.

Wie kann man eine geschachtelte geordnete Liste der Tiefe 3 erzeugen?

<ol>
 <li>Kaffee</li>
 <li>Tee
  <ol>
   <li>Schwarz tee</li>
   <li>Grün tee
      <ol>
        <li>Spezial Grün Tee</li>
      </ol>
   </li>
  </ol>
 </li>
 <li>Milch</li>
</ol>

Wie ist eine HTML-Tabelle aufgebaut?

<table>
  <tr>
   <th>Person 1</th>
   <th>Person 2</th>
   <th>Person 3</th>
 </tr>
 <tr>
   <td>Emil</td>
   <td>Tobias</td>
   <td>Linus</td>
 </tr>
 <tr>
   <td>16</td>
   <td>14</td>
   <td>10</td>
 </tr>
</table>

Wie baut man in HTML ein Menü?

<ul>
 <li><a href="startseite.html">Startseite</a></li>
  <li><a href="produkte.html">Produkte</a></li>
  <li><a href="überuns.html">Über uns</a></li>
  <li><a href="kontakt.html">Kontakt</a></li>
</ul>

Welche Attribute sollte man bei Bildern wie verwenden?

Das <img>-Tag verfügt über zwei erforderliche Attribute:

   1. src – Gibt den Pfad zum Bild an
   2. alt – Gibt einen alternativen Text für das Bild an

Zuordnung der Homepage

Repository-URL Meiner Homepage

CSS-Selektoren und CSS-Farben

RGB-Werte in HSL-Werte umrechnen:

CSS-Positionierung

Lösung zum 2. Video:

Wireframe mit HTML und CSS

HTML-Wireframe:

Responsiv mit Flexbox und Desktop-First

Desktop-First-Strategie:

Responsiv mit Grid und Mobile-First

Mobile-First:

Wireframe responsive mit Grid

Landing-Page responsiv mit Grid:

Funktionen

//Aufgabe 1
function identity(a) {
return a;
}

//Aufgabe 2
function identity_function(a) {
return function() {
return a;
};
}

// Aufgabe 3
function add(x, y) {
return x + y;
}

function mul(x, y) {
return x * y;
}

//Aufgabe 4
function addf(x) {
return function(y) {
return x + y;
};
}

// Example usage:
const result = addf(3)(4);
console.log("Result:", result);

//aufgabe 5
function applyf(binaryFunc) {
return function(x) {
return function(y) {
return binaryFunc(x, y);
};
};
}
const addff = applyf(add);
const mulf = applyf(mul);

const resultAdd = addff(3)(4); // Result: 7
const resultMul = mulf(5)(6); // Result: 30

console.log("Result (addf):", resultAdd);
console.log("Result (mulf):", resultMul);

Objekte

// Person-Prototyp
function Person(name) {
this.name = name;
this.autos = [];
}

// Auto-Prototyp
function Auto(model) {
this.model = model;
this.owner = [];
}

// Funktion zum Überprüfen von Konflikten
function conflict(auto) {

if(auto.owner.length > 1){
console.log('\nKonflikt gefunden');
for(var x of auto.owner ){
console.log(auto.model, 'wird von', x, 'besessen');
}

return true;
}
else{
console.log('\nFür',auto.model,'Kein Konflikt gefunden');
}
return false;
}

// Beispiel
const person1 = new Person("Paul");
const person2 = new Person("Linda");
const person3 = new Person("Tim");

const auto1 = new Auto("BMW");
const auto2 = new Auto("Audi");
const auto3 = new Auto("Volkswagen");


person1.autos.push(auto1);
person2.autos.push(auto2);
person3.autos.push(auto3);



auto1.owner.push (person1.name);
auto2.owner.push (person2.name);
auto3.owner.push (person1.name);
auto3.owner.push (person3.name);


// false, kein Konflikt
conflict(auto1);

// true, Konflikt gefunden
conflict(auto3);

Fibonacci


const fibTable = new Map();
const GrosteInt = new Array();
const intZahl = new Array();
const numZahl = new Array();

function fib(n) {
// Initialisiere die ersten beiden Fibonacci-Zahlen.
let prevPrev = 0;
let prev = 1;
if(n === 0){
return 0;
}
if(n === 1) {
return 1;
}
// Berechne die Fibonacci-Zahlen von 2 bis n.
for (let i = 2; i <= n; i++) {
const current = prevPrev + prev;
prevPrev = prev;
prev = current;
}

// Rückgabe der n-ten Fibonacci-Zahl.
return prev;
}
for (let i = 0; i <= 2000; i++) {
let result = fib(i);

if(result > Number.MAX_SAFE_INTEGER && result < Number.MAX_VALUE){

intZahl.push(i-1);
const newResult = fib(i-1);
GrosteInt.push(newResult);
result = BigInt(result);
numZahl.push(result);

}
fibTable.set(i, result);
console.log(fibTable);

}
//größte Fibonacci-Zahl, die sich noch als Integer sicher speichern lässt
console.log('Größte Fibonacci-Zahl(Integer)', GrosteInt[0])

//Die Zahl, die in der Fibonacci-Folge(Integer)
console.log('Die anzahl, die in der Fibonacci-Folge(Integer):', intZahl[0]);

//die größte Fibonacci-Zahl, die sich noch als Number speichern lässt
console.log('Größte Fibonacci-Zahl(Number)', numZahl[numZahl.length-1])

//Die Zahl, die in der Fibonacci-Folge(Number)
console.log('Die anzahl, die in der Fibonacci-Folge(Number):', intZahl.length);

TopSort

function topsort(abhaengigkeiten) {
const graph = new Map();
const sortedGraph = new Map();
const ergebnis = [];

// Erstelle den Graphen und berechne die sortedGraph
for (const [von, nach] of abhaengigkeiten) {
if (!graph.has(von)) {
graph.set(von, []);
}
graph.get(von).push(nach);

sortedGraph.set(nach, (sortedGraph.get(nach) || 0) + 1);
}

// Initialisiere eine queue mit Knoten
const queue = [];
for (const knoten of graph.keys()) {
if (!sortedGraph.has(knoten)) {
queue.push(knoten);
}
}

// Führe die topologische Sortierung
while (queue.length > 0) {
const knoten = queue.shift();
ergebnis.push(knoten);

if (graph.has(knoten)) {
for (const nachbar of graph.get(knoten)) {
sortedGraph.set(nachbar, sortedGraph.get(nachbar) - 1);

if (sortedGraph.get(nachbar) === 0) {
queue.push(nachbar);
}
}
}
}

return ergebnis;
}

// Test
const abhaengigkeiten = [["schlafen", "studieren"], ["essen", "studieren"], ["studieren", "pruefen"],["vorbereiten", "pruefen"]];
const ergebnis = topsort(abhaengigkeiten);

console.assert(ergebnis.indexOf("essen") < ergebnis.indexOf("studieren"), "Test failed: 'essen' sollte vor 'studieren' liegen");
console.assert(ergebnis.indexOf("schlafen") < ergebnis.indexOf("studieren"), "Test failed: 'schlafen' sollte vor 'studieren' liegen");
console.assert(ergebnis.indexOf("studieren") < ergebnis.indexOf("pruefen"), "Test failed: 'studieren' sollte vor 'pruefen' liegen");
console.assert(ergebnis.indexOf("vorbereiten") < ergebnis.indexOf("pruefen"), "Test failed: 'studieren' sollte vor 'pruefen' liegen");

console.log("Topologische Sortierung:", ergebnis);

Spread-Operator


        /**
            Mit dem Spread-Operator können wir die Elemente eines Arrays in ein anderes Array einfügen oder sie als Argumente für eine Funktion übergeben.
        */

        //Zusammenfügen von Arrays
        const array1 = [1, 2, 3];
        const array2 = [4, 5, 6];
        const mergedArray = [...array1, ...array2];

        console.log(mergedArray); // Ausgabe: [1, 2, 3, 4, 5, 6]

        // Verwendung in einer Funktion
        const numbers = [10, 20, 30];
        const sum = (a, b, c) => a + b + c;

        console.log(sum(...numbers)); // Ausgabe: 60

        /*
            Der Spread-Operator kann auch verwendet werden, um Eigenschaften von einem Objekt in ein anderes zu kopieren.   
        */

        //Kopieren von Objekteigenschaften
        const person = { name: 'John', age: 25 };
        const details = {...person, email: 'john@beispiel.com'};

        console.log(details);
        // Ausgabe: {name: 'John', age: 25, email: 'john@beispiel.com'}
                    

Dom Operation

Performanz-Messungen

Rednerliste

Rednerliste mit Zeitmessung

TopSort

TopSort als Web-App

Klammerpaare

Überprüfen Klammerpaare

Topologische Iterierbarkeit

Topologische Iterierbarkeit Mit ES6 Klasse

Topologische Iterierbarkeit

Topologische Iterierbarkeit mittels Generator

class Vorrang {

constructor(relations) {
this.graph = new Map();
this.inDegree = new Map();
this.sortedOrder = [];

// Erstelle den Graphen und berechne die inDegreeGraph
relations.forEach(([node1, node2]) => {
if (!this.graph.has(node1)) {
this.graph.set(node1, new Set());
this.inDegree.set(node1, 0);
}
if (!this.graph.has(node2)) {
this.graph.set(node2, new Set());
this.inDegree.set(node2, 0);
}

this.graph.get(node1).add(node2);
this.inDegree.set(node2, this.inDegree.get(node2) + 1);
});
}

// generator function
*generator() {

while (this.sortedOrder.length < this.graph.size) {
const candidates = Array.from(this.inDegree.entries())
.filter(([node, inDegree]) => inDegree === 0 && !this.sortedOrder.includes(node))
.map(([node]) => node);

const node = candidates[0];
this.sortedOrder.push(node);

if (this.graph.has(node)) {
this.graph.get(node).forEach(neighbor => {
this.inDegree.set(neighbor, this.inDegree.get(neighbor) - 1);
});
}

yield node;

}

}

}

// Test Data
const studentenLeben = new Vorrang([
["schlafen", "studieren"],
["essen", "studieren"],
["studieren", "prüfen"],
["vorbereiten", "prüfen"]

]);

const gen = studentenLeben.generator();

//Tests
console.assert(gen.next().value === "schlafen", "Test 1 nicht bestanden!");
console.assert(gen.next().value === "essen", "Test 2 nicht bestanden!");
console.assert(gen.next().value === "studieren", "Test 3 nicht bestanden!");
console.assert(gen.next().value === "vorbereiten", "Test 4 nicht bestanden!");
console.assert(gen.next().value === "prüfen", "Test 5 nicht bestanden!");

Proxy

class Vorrang {

constructor(relations) {
this.graph = new Map();
this.inDegree = new Map();
this.sortedOrder = [];

// Erstelle den Graphen und berechne die inDegreeGraph
relations.forEach(([node1, node2]) => {
if (!this.graph.has(node1)) {
this.graph.set(node1, new Set());
this.inDegree.set(node1, 0);
}
if (!this.graph.has(node2)) {
this.graph.set(node2, new Set());
this.inDegree.set(node2, 0);
}

this.graph.get(node1).add(node2);
this.inDegree.set(node2, this.inDegree.get(node2) + 1);
});

// Proxy handler
this.handler = {
get: function (target, prop, receiver) {
if (prop === 'generator') {

return function () {
const result = target[prop].apply(target, arguments);

return result;
};
}
return target[prop];
},

}

// Proxy for Logging
this.proxy = new Proxy(this,this.handler);
}

// generator function
*generator() {

while (this.sortedOrder.length < this.graph.size) {
const candidates = Array.from(this.inDegree.entries())
.filter(([node, inDegree]) => inDegree === 0 && !this.sortedOrder.includes(node))
.map(([node]) => node);

const node = candidates[0];
this.sortedOrder.push(node);

if (this.graph.has(node)) {
this.graph.get(node).forEach(neighbor => {
this.inDegree.set(neighbor, this.inDegree.get(neighbor) - 1);
});
}
this.remainingRelations = this.graph.size - this.sortedOrder.length;
console.log(`Remaining relations: ${this.remainingRelations}`);
yield node;

}

}

}

// Test Data
const studentenLeben = new Vorrang([
["schlafen", "studieren"],
["essen", "studieren"],
["studieren", "prüfen"],
["vorbereiten", "prüfen"]

]);

const gen = studentenLeben.proxy.generator();

//Tests
console.assert(gen.next().value === "schlafen", "Test 1 nicht bestanden!");
console.assert(gen.next().value === "essen", "Test 2 nicht bestanden!");
console.assert(gen.next().value === "studieren", "Test 3 nicht bestanden!");
console.assert(gen.next().value === "vorbereiten", "Test 4 nicht bestanden!");
console.assert(gen.next().value === "prüfen", "Test 4 nicht bestanden!");

DeepCopy


        const deepCopy = (struct) =>
        Array.isArray(struct)
            ? struct.map((item) => deepCopy(item))
            : typeof struct === 'object' && struct !== null
            ? Object.fromEntries(
                Object.entries(struct).map(([key, value]) => [key, deepCopy(value)])
            )
            : struct;
        
        // Test 
        const originalArray = [1, [2, 3], { a: 4, b: { c: 5 } }];
        const copiedArray = deepCopy(originalArray);
        console.assert(JSON.stringify(originalArray) === JSON.stringify(copiedArray), 'Array test nicht bestanden');
        
        
        const originalObject = { x: 1, y: { z: 2 }, arr: [3, 4] };
        const copiedObject = deepCopy(originalObject);
        console.assert(JSON.stringify(originalObject) === JSON.stringify(copiedObject), 'Object test nicht bestanden');
                      
                    

WWW-Navigator

Responsiv WWW-Navigator mit HTML, CSS, and JS

Balkendiagramm

Balkendiagramm mit HTML, Inline SVG, CSS

Interaktive SVG Grafik

Tic-Tac-Toe Spiel

SVG Transformations

SVG Transformationsl

Static

Static classes in TypeScript


        // In TypeScript gibt es kein direktes Äquivalent zu statischen Klassen, da TypeScript in erster Linie den ECMAScript-Standards folgt und JavaScript selbst kein Konzept für statische Klassen hat.

        // Mit TypeScript können Sie jedoch mithilfe statischer Eigenschaften und Methoden innerhalb einer Klasse eine ähnliche Funktionalität erreichen.

        // Hier ist ein Beispiel für die Erstellung einer TypeScript-Klasse mit statischen Mitgliedern:
                    
        class StaticExample {
            static staticProperty: number = 42;
                        
                static staticMethod(): void {
                    console.log("Static method called");
                }
        }
                        
            // Auf statische Mitglieder zugreifen:
        console.log(StaticExample.staticProperty);
        StaticExample.staticMethod();

Fehler

Fehler finden mit TypeScript


        const add = (x: number, y: number): number => x + y;
        const equals = (x: any, y: any): boolean => x === y;
        
        console.log(add(1, 2));
        console.log(add(true, true)); // Dadurch wird ein TypeScript-Fehler generiert
        console.log(add(true, false)); // Dadurch wird ein TypeScript-Fehler generiert
        const x: number = 1;
        const y: number = 1;
        console.log(add(equals(x, y), equals(y, x))); 

        // Fehler tritt auf, weil „add“ Zahlenparameter erwartet, „equals(x, y)“ und „equals(y, x)“ jedoch einen booleschen Wert zurückgeben.
                        

Webserver

Lokaler Webserver mit NodeJS

// HTTP-Modul beladen
const http = require('http');
const url = require('url');

// Port und Hostname(IP address)
const port = 3000;
const hostname = '127.0.0.1';


// Konfigurieration des HTTP-Servers
const server = http.createServer((req, res) => {

const { pathname, query } = url.parse(req.url, true);

//Path überprüfen / Schnittstelle
if (pathname === '/greet' && req.method === 'GET') {

// Zugreifen die Name aus den Query-Parametern
const name = query.name || 'Unbekannt';

res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain' );
res.end(`Hallo ${name}!`);
} else {

res.statusCode = 404;
res.setHeader('Content-Type', 'text/plain');
res.end('404 Not Found');
}
});

server.listen(port, hostname , () => {
console.log(`Server läuft unter ${hostname}:${port}`);
});

/*
* Um mehr über Nodejs server zu erfahren (https://nodejs.org/api/synopsis.html)
* Der Client sendet "Mika", der Name als Query-Parametern und der Server wird mit "Hallo Mika!" antworten.
* Zum Beispiel:(http://127.0.0.1:3000/greet?name=Mika)
*/