Hey, wie verlinke ich die Navbar Buttons wenn ich das Projekt auf dem PC baue?

Du kannst relative Pfade verwenden.

Beispiel bei folgender Dateistruktur:

root
- index.php
- imprint.php
- meta/
  - contact.php

index.php:

<a href="imprint.php">Imprint</a>
<a href="meta/contact.php">Contact</a>
<p1><a href="??">Home<a><p1>

Es gibt kein p1-Element.

ausserdem wie bekomme ich Fiveserver zum funktionieren?

Wenn du den Ordner oder die Datei, die du öffnen möchtest, im Explorer View mit der rechten Maustaste anklickst, findest du einen entsprechenden Eintrag im Kontextmenü.

Lies dazu auch hier.

Ausserdem, wie bekomme ich das wieder zum laufen, dateien liegen im selben Ordner wie die Index.php, (...)

Normalerweise sollte die Startseite auch die Webseitewurzel darstellen, über die man alle anderen öffentlichen Seiten erreichen kann (sprich: Die Seiten sind irgendwie untereinander verlinkt). Folglich sollte es erst einmal genügen, die Startseite zu öffnen. Wenn sie Fehler beinhaltet, musst du die eben erst einmal beheben.

(...) ausserdem kann ich die index.php auch mit Fiveserver öffnen?

Ja, für das Rendern reicht es. Solltest du mehr vorhaben (z.B. Testen einer Formularauswertung), wäre ein richtiger Webserver angebracht. Für die lokale Entwicklung eignet sich das XAMPP-Softwarepaket, welches u.a. einen für PHP-vorkonfigurierten Apache Webserver beinhaltet.

PS.: meta-Tags gehören in den head-Bereich.

...zur Antwort

Du kannst die Zeilenhöhe auf dieselbe Höhe wie die des Elements setzen.

line-height: 600px;

Das style-Element gehört übrigens in den head-Knoten, nicht in body. Des Weiteren würde ich empfehlen, den Code einheitlich einzurücken.

...zur Antwort

Wenn du bei einer Suchmaschine nach free html templates suchst, kannst du mehrere Seiten finden, die vorgefertigte HTML-Templates / Designs auflisten.

Zum Beispiel:

  • https://www.free-css.com/free-css-templates
  • https://html5up.net/
  • https://templatemo.com/

Da du schreibst, dass du nicht viel Ahnung von Webdesign hast, wäre das meines Erachtens einer der einfachsten Wege, denn du bräuchtest dann nur noch das dynamische Rendering via PHP implementieren. Ein Programm, in dem du selbst Designs erstellen kannst, würde dir die Umsetzung eines ästhetischen Designkonzepts schließlich nicht abnehmen.

Ein zweiter einfacher Weg wäre es, ein/e CSS-Bibliothek/Framework zu verwenden, welche/s ein bereits existierendes Design für ein Set an verschiedenen Komponenten schon vorimplementiert anbietet (z.B. Ant Design, Flat Remix, Materialize, MUI, Primer).

Wenn du wirklich selbst ein Designkonzept kreieren möchtest, bietet sich Figma an oder eben ein beliebiges Grafikbearbeitungsprogramm (Gimp, Illustrator, Photoshop, ...). Ein Nachbau dieses Designs mit HTML und CSS stände dann allerdings noch aus, wobei man sich auch da wenn nötig nochmal etwas Hilfe von CSS-Frameworks (wie Tailwind, PureCSS, ...) holen kann.

...zur Antwort

Du kannst eine E-Mail als Formulardatenempfänger vorgeben:

<form action="mailto:some@email.de">
  <label for="subject">Subject:</label>
  <input id="subject" name="subject">
  <label for="message">Message:</label>
  <textarea id="message" name="body"></textarea>
  <input type="submit">
</form>

Bei Versand öffnet der Browser einen E-Mail-Client (oder ein Auswahlfenster mit den für den Nutzer verfügbaren Clients).

Wenn die Felder subject und body existieren, wird ihr Inhalt in der Regel in den neuen E-Mail Entwurf eingefügt.

...zur Antwort
Ist das ein genauer Typescript Code?
interface User {
    id: number;
    firstName: string;
    lastName: string;
    email: string;
    password: string;
}

let users: User[] = [];
let currentUserId: number | null = null;

const userForm = document.getElementById('userForm') as HTMLFormElement;
const firstNameInput = document.getElementById('firstName') as HTMLInputElement;
const lastNameInput = document.getElementById('lastName') as HTMLInputElement;
const emailInput = document.getElementById('email') as HTMLInputElement;
const passwordInput = document.getElementById('password') as HTMLInputElement;
const userTableBody = document.getElementById('userTableBody') as HTMLTableSectionElement;

userForm.addEventListener('submit', (event) => {
    event.preventDefault();
    if (currentUserId === null) {
        addUser();
    } else {
        updateUser();
    }
    userForm.reset();
    currentUserId = null;
});

function addUser() {
    const newUser: User = {
        id: Date.now(),
        firstName: firstNameInput.value,
        lastName: lastNameInput.value,
        email: emailInput.value,
        password: passwordInput.value,
    };
    users.push(newUser);
    renderUserTable();
}

function updateUser() {
    const user = users.find((u) => u.id === currentUserId);
    if (user) {
        user.firstName = firstNameInput.value;
        user.lastName = lastNameInput.value;
        user.email = emailInput.value;
        user.password = passwordInput.value;
        renderUserTable();
    }
}

function deleteUser(id: number) {
    users = users.filter((user) => user.id !== id);
    renderUserTable();
}

function editUser(id: number) {
    const user = users.find((u) => u.id === id);
    if (user) {
        currentUserId = id;
        firstNameInput.value = user.firstName;
        lastNameInput.value = user.lastName;
        emailInput.value = user.email;
        passwordInput.value = user.password;
    }
}

function renderUserTable() {
    userTableBody.innerHTML = '';
    users.forEach((user) => {
        const row = document.createElement('tr');
        row.innerHTML = `
      <td>${user.firstName}</td>
      <td>${user.lastName}</td>
      <td>${user.email}</td>
      <td>
        <button onclick="editUser(${user.id})">Bearbeiten</button>
        <button onclick="deleteUser(${user.id})">Löschen</button>
      </td>
    `;
        userTableBody.appendChild(row);
    });
}

Bitte es soll nichts von Js haben, sondern wirklich die Typescript Merkmale beeinhalten

...zum Beitrag
  • Bei der Variable event könntest du noch eine genaue Typangabe anheften. Optional könnte man das ebenfalls bei Variablen wie row, user oder u noch in Erwägung ziehen - das wäre dann allerdings eher eine Stilfrage. Entweder man zieht die expliziten Typspezifizierungen rigoros durch oder man nutzt Typinterferenz an den Stellen aus, wo sich der Typ beim Lesen noch leicht zuordnen lässt.
  • Für die Funktionen könntest du noch einen konkreten Rückgabetyp (in deinem Fall stets void) vorgeben.
  • Es wäre eigentlich besser, wenn die Variable u einen aussagekräftigeren Namen erhalten würde.
...zur Antwort

Bei InnoDB handelt es sich um ein Speichersubsystem von MariaDB bzw. die eigentliche Speicher-/Datenbank-Engine, die für das Erstellen, Lesen, Löschen und Aktualisieren der Daten zuständig ist.

MariaDB bietet generell mehrere verschiedene Speichersubsysteme an (z.B. Aria, CSV, MERGE, MyISAM, Spider) und du kannst ebenso eigene Engines oder die externer Hersteller einsetzen.

Diese vorhandenen Engines unterscheiden sich darin, dass sie für verschiedene Anwendungsfälle/Szenarien ausgelegt sind. Dementsprechend speichern sie Daten auf jeweils andere Weise, sind bei Lese- oder Schreiboperationen unterschiedlich schnell und stellen unterschiedliche zusätzliche Funktionalitäten zur Verfügung. Letzeres unterscheidet die MariaDB-Engines übrigens von klassischen Datenbanksubspeichersystemen.

Um dazu einmal ein paar Beispiele anzuführen:

  • MyISAM ist vor allem für viele, schnelle Lesezugriffe konzipiert.
  • Die CSV-Engine speichert ihre Daten im CSV-Format.
  • InnoDB ermöglicht eine konfigurierbare Transaktionssicherheit beim Lesen und Schreiben. Das heißt, diese Operationen gewähren mehr Datensicherheit / Konsistenz.

MariaDB ist ein DBMS (Datenbankmanagementsystem) und als solches im Prinzip ein Wrapper für die tatsächliche Datenbank-Engine. Es stellt somit erst einmal die Schnittstelle, über die ein Anwender mit der inneren Engine kommunizieren kann. Dafür gibt es unter anderem implementiere Nutzerrollen, integrierte Zwischenspeicher, eine vorgesetzte Datenbanksprache (wie SQL), usw.. Konfigurationen gehören ebenso dazu.

...zur Antwort

Vorerst eine Anmerkung zu dem HTML-Code aus deinem Bild. Er ist invalid und sollte nicht mehr genutzt werden. Es fehlt ein Doctype und Elemente/Attribute wie center, oder bgcolor gehören schon seit vielen Jahren nicht mehr zum Standard. Des Weiteren wird dort offensichtlich eine Tabelle für andere Zwecke missbraucht, als für die sie eigentlich da ist.

Die JavaScript-Anwendung generiert eine Zufallszahl zwischen 1-6 (Grenzen inklusiv). Mit den jeweiligen if-Strukturen wird anschließend geprüft, welche Zahl generiert wurde. Je nachdem wird dem Image (Bild) eine andere Bildquelle zugeordnet (und später über das img-Element im HTML-Code dargestellt). Die verfügbaren Bildquellen werden die jeweiligen Würfelseiten repräsentieren.

...zur Antwort
(...) ob die Ts zur Html passt und ob es korrekt ist (...)

Ob die Anwendung das tut, was sie soll, kannst du in einem Fiddle testen. Ich habe einmal eines für dich angelegt: https://jsfiddle.net/cnhqx2es/.

Markup- und Syntaxfehler, die direkt auffallen:

  • Bei einigen deiner Eingabefelder ist das name-Attribut invalid. Der Wert darf nicht leer sein.
  • Eine ID ist immer eindeutig bzw. darf nur einmal in einem Dokument vorkommen. Bei dir sehe ich die IDs name, passwort und email jeweils mehrmals.
  • Das for-Attribut von label-Elementen verweist immer auf eine existierende ID. Eine ID Nachname gibt es in deinem Dokument jedoch nicht.
  • Es gibt kein Eingabefeld vom Typ passwort. Ersetze den Wert gegen password.
  • Den div-Elementen mit der Klasse inputField fehlt stets der Endtag.
  • Leerzeichen in URLs sind nicht erlaubt. Entweder du änderst den Dateinamen deines Profilicons oder du maskierst das Leerzeichen mit %20.
  • In deinem Typescript-Code hast du vor der Funktionsdefinition von showInfo vier Bindestriche gesetzt, mit denen ein Compiler/Interpreter nicht viel anfangen kann. Im Fiddle habe ich diese Zeile bereits auskommentiert.
  • Das Komma in der letzten Zeile von readInfo ist verkehrt. Generell ist nicht klar, wieso du überhaupt ein Komma hinter die vorherigen Zeilen setzt. Es handelt sich doch um einzelne Anweisungen.

Auf logische Fehler in der Anwendung kannst du wie gesagt selbst testen.

(...) ist es eine Typescript? (...)

Rein auf die Syntax bezogen, wenn du den oben benannten Syntaxfehler behebst, ja. Jeder (valide) JavaScript-Code entspricht auch validem TypeScript-Code. TypeScript ist ein Superset zu JavaScript.

Wenn du allerdings tatsächlich TypeScript nutzen möchtest, erfüllt dein Code diese Anforderung nicht. Du nutzt in ihm doch keinerlei TypeScript-Funktionalität.

...zur Antwort

Du hast dir da ein recht komplexes Softwareprojekt ausgedacht, was sich definitiv nicht einmal so nebenbei umsetzen lässt und auch später sicherlich nicht einfach warten lässt. Vorgefertigte Schablonen (Schritt-für-Schritt-Anleitungen) gibt es für solche Anwendungen nicht.

Du solltest mit einer guten Planung beginnen. Dazu gehört in erster Linie, dass du die Anwendung als System sehr genau beschreibst.

Das fängt damit an, dass du dir überlegst, welche Nutzer(-gruppen/-typen) später mit der Anwendung interagieren werden. Man kann da jetzt schon Streamer und Zuschauer benennen. Aber sicherlich wird es ebenso Administratoren und Moderatoren brauchen, die den üblichen Tagesablauf der Plattform auf inhaltlicher und technischer Ebene überwachen sollen.

Abgeleitet für diese Nutzertypen gibt es verschiedene Anwendungsfälle, die einmal (Schritt-für-Schritt) spezifiziert werden müssten. Bei einem Streamer wären das Ein- und Ausloggen in seinen Account oder das Buchen eines Zeitraums separate Anwendungsfälle. Für ihn und die anderen Typen wirst du noch etliche Weitere finden.

So eine Analyse inkludiert des Weiteren allgemeinere Erwartungshaltungen und spezifischere Zielgruppenbeschreibungen (z.B. Was für Personen gehören in deine Zielgruppe? Für welche Endgeräte soll die Webseite ausgerichtet werden? Welcher Last soll die Webseite standhalten können?). Wichtig ist an der Stelle auch, dass du ebenso Anwendungsfälle berücksichtigst, die gesetzlich vorgeschrieben werden. Das betrifft den Datenschutz (DSVGO) und ab Ende Juni ebenso die WCAG (EAA).

Schlussendlich kannst du mit diesen gesammelten Informationen besser die notwendige Architektur konzipieren und herausstellen, welche Ressourcen und Nutzerschnittstellen (z.B. grafische Oberflächen) es braucht und wie sie gestaltet werden. Im Bestfall findest du für einzelne Teile bereits fertige Lösungen, die du nur noch in dein System einbetten musst (Bsp.: Bezahlungen könnten über PayPal ablaufen).

Um es einmal beispielhaft aufzuzeigen:

  • Jeder Streamer wird einen Account benötigen. Das heißt, du brauchst Schnittstellen, über die er sich registrieren, anmelden und seine Daten verwalten kann. Die Daten wiederum müssen irgendwo persistent gespeichert werden.
  • Für die Buchungen und Koordination der Zeitpläne wirst du einen Dienst benötigen.
  • Es muss ein (Sub-)System geben, welches die Videodaten der Streamer erhält, verarbeitet (z.B. in verschiedene Auflösungen konvertiert) und dann weiterleitet (vgl. Ingest-Server).
  • Du brauchst eine grafische Oberfläche für die Hauptseite (dein generiertes Bild ist nur ein Anfang, es sollte konkreter sein).
  • Irgendwo muss generell die Webanwendung gehostet werden. Irgendein beliebiger Webspace tut es da nicht. Eine schnelle Datenverarbeitung ist wichtig und auf ein erhöhtes Nutzeraufkommen sollte die Anwendung zumindest bis zu einer bestimmten Hemmschwelle bspw. via vertikaler/horizontaler Skalierung reagieren können. Cloudservices wie z.B. AWS, Azure, Google Cloud oder Oracle Cloud würden sich eignen und ein CDN könnte genutzt werden, um einkommende Anfragen besser zu verteilen.

Das ist bis hier schon ein großes Arbeitspaket, welches nicht nur Sorgfalt/technische Genauigkeit erfordert, sondern einige Recherche und ebenso Erfahrung in der Softwareentwicklung.

Ich würde dir daher empfehlen:

  • ein Team zu suchen (oder zusammenzustellen), welches dir von Anfang bis Ende bei alldem helfen kann. Ein (UX-)Designer könnte zum Beispiel die grafischen Oberflächen entwerfen, ein Softwarearchitekt könnte die Systemarchitektur definieren und bei der grundsätzlichen Planung helfen, ein Projektmanager wäre für die allgemeine Ressourcenplanung hilfreich, usw.. Diese Expertise anzuwerben, würde dich natürlich Geld kosten, doch die Wahrscheinlichkeit, dass das Projekt erfolgreich wird, deutlich erhöhen.
  • die gefundenen Anforderungen zu priorisieren. Es wird einige Kernfeatures geben, auf die du den Fokus setzen musst und es gibt ganz sicher ebenso nice-to-have-Features (wie die Social Sharing-Optionen), die du vorerst beiseite lassen kannst.

Wenn du es trotz alledem unbedingt auf eigene Faust durchziehen möchtest, wärst du wohl gut damit beraten, dir Literatur zu Themen wie Softwareentwicklung, spezifisch Webentwicklung, Livestreaming und Videoverarbeitung zu suchen. Die hinterlegten Links sind nur Vorschläge für einen Einstieg.

Bezüglich der Umsetzungsphase benötigst du zudem noch sichere Kenntnisse in:

  • Datenbankdesign/-verwaltung
  • HTML, CSS und JavaScript für die grafischen Oberflächen
  • mindestens einer Programmiersprache (und einem zugehörigem Webframework), die die Kernlogik der Webanwendung definiert. Man könnte hier beispielsweise C#/ASP.NET, Golang (mit Beego), Java (mit Spring) oder JavaScript (NextJS) in Erwägung ziehen. Bezüglich der Videoverarbeitung wäre es vermutlich besser, für eine schnellere Ausführungsgeschwindigkeit C/C++ (mit bspw. der FFmpeg-Bibliothek) zu nutzen.

Je nachdem, mit welchen weiteren Ressourcen/Technologien du konkret arbeitest, wird es des Weiteren notwendig sein, dass du dich mit den Manuals diverser Bibliotheken/Frameworks/SDKs/... einlesen musst. Praktisch an der Stelle wäre übrigens noch, sich mit einem Versionsverwaltungssystem (wie Git) vertraut zu machen und das komplette Projekt via DevOps, GitHub, Jira + Bitbucket o.ä. zu verwalten. So kannst du unter anderem deinen Projektstatus gut sichern, Tasks anlegen und generell das Projekt leicht dokumentieren.

Wenn für dich Webentwicklung / Programmierung übrigens noch gänzlich neu ist, würde ich dir davon abraten, sofort mit deinem geplanten Projekt zu beginnen. Sammel stattdessen erst einmal Erfahrung mit kleineren Vorhaben. Es wäre frustrierend, wenn du (unerfahren) mit einer schlechten Basisumsetzung beginnst und später merkst, dass du deshalb wieder von vorn beginnen musst.

Generell kannst du schon jetzt davon ausgehen, dass dieses Projekt einigen Arbeitsaufwand fordern wird. Die Wartung und Testphase sind dabei auch noch nicht eingerechnet.

...zur Antwort

Ich kann dir Processing gut empfehlen. Das ist eine Programmiersprache mit gleichnamiger IDE, die in ihrer Syntax sehr Java-nah ist und ursprünglich für Programmiereinsteiger konzipiert wurde. Sie stellt dir eine einfache Zeichen-API zur Verfügung, sodass du schon von Beginn an problemlos grafisch visuelle Erfolge erzielen kannst.

Sofern du mit einigen wichtigen Grundlagen (Variablen, Operatoren, Kontrollstrukturen, Arrays) vertraut bist, kannst du dich so unter anderem mit grafischen Simulationen (schau hier für Beispiele) oder der Entwicklung kleiner 2D-Spiele widmen. Gerade Klassiker wie Pong, Snake, Space Invaders oder Vier gewinnt eignen sich hervorragend, um das Finden eigener Lösungswege (Algorithmen) zu üben.

Tutorials findest du unter anderem auf der offiziellen Webseite. Ansonsten lohnt sich der Track von Daniel Shiffman oder der Einführungskurs von Prof. Dr. Kipp. Ebenso kannst du einmal auf HappyCoding schauen.

Gibt es vielleicht kostenlose Webseiten, wo man mit Tutorials lernen und üben kann oder Ähnliches?

Zu vielen Programmiersprachen gibt es eine offizielle Webseite. Die sollte dein erster Anlaufpunkt sein, denn in der Regel findest du dort Verweise auf Lehrmaterial und die (Referenz-)Dokumentation selbst.

Des Weiteren gibt es Plattformen, die (Online-)Lernkurse für verschiedene Programmiersprachen anbieten. Zum Beispiel Codecademy, Hyperskill, JetBrains Academy, Programiz oder Exercism.

Mit Hilfe einer Suchmaschine (z.B. Google) kannst du zudem oft in kurzer Zeit Online-Tutorials zu der Programmiersprache deiner Wahl finden. Solltest du so Lernquellen zusammensuchen, würde ich dir allerdings empfehlen, zumindest mehrere solcher Tutorials zu nutzen, denn für den Fall, dass Tutorial X für Thema Y zu oberflächlich ist, kann das möglicherweise von den anderen Quellen abgefedert werden. Von Crashkursen, die dir Programmieren lernen in X Minuten/Stunden/... versprechen, würde ich dir definitiv abraten.

...zur Antwort

Die IP in Hosts ist doppelt unterstrichen, da sie den Primärschlüssel darstellen soll. Das heißt also, dass eine IP XY immer nur einmal in einem Eintrag von Hosts existieren kann. Die IP kann somit genutzt werden, um einen Eintrag eindeutig zu identifizieren.

Die anderen Felder können in ihren Relationen jeweils in mehreren verschiedenen Einträgen auftauchen. Die einmalige Unterstreichung verweist sicherlich auf einen Fremdschlüssel. Das heißt, IP, Nutzername und Hostname werden in jeweils anderen Relationen schon einmal definiert (bezüglich der IP könnte Hosts übernehmen) und die Fremdschlüssel verweisen lediglich auf diese bereits existierenden Werte.

...zur Antwort

Die Greenfoot API Referenz findest du hier.

Mit den Mathebefehlen beziehst du dich sicherlich auf die, die aus dem JDK kommen (Math-Klasse). Die Referenz zu der Version 21, die von der aktuellen Greenfoot-Version (3.9) genutzt wird, findest du hier.

...zur Antwort

Deine Dateien kannst du mit einem FTP-Client wie FileZilla hochladen. Im Hilfecenter von IONOS findest du mehrere Artikel, die erklären, wie es funktioniert.

Auch zum Verbinden einer Domain gibt es einen Leitfaden.

...zur Antwort

Unter der Voraussetzung, dass du ein Android-Gerät besitzt, würde sich für Projekt 1 Java sehr gut eignen. Zum einen kannst du mit dem Android SDK eine native App entwickeln und zum anderen gibt es bereits Programmbibliotheken wie ZXing, mit denen du Barcodes parsen kannst. Für die Aufschlüsselung der Produktinformationen würde ich eine API wie die von Discogs nutzen.

Die Daten kannst du dann in irgendeiner Datenbank speichern. Sei es auf dem Android-Gerät in einer SQLite-Datenbank oder (besser) in einer extern verwalteten Datenbank (z.B. MySQL). Eine Java Webanwendung (z.B. eine REST-API) könnte die sichere Kommunikation zwischen App und Datenbank steuern.

Solltest du eine App für iOS entwickeln wollen, wäre Dart eine gute Alternative. Mit Dart kannst du relativ leicht mobile Apps für iOS und Android sowie Webanwendungen erstellen.

Für Projekt 2 würde ich die Wahl wohl am ehesten davon abhängig machen, ob du für die Umsetzung der grafischen Oberfläche nun eine native Desktopanwendung erstellen möchtest oder eine Webanwendung.

Für Ersteres sind meines Erachtens C#, Java, Swift (nur für macOS) und C++ aufgrund der für sie verfügbaren GUI-Toolkits (Avalonia UI, JavaFX, Qt, WPF, wxWidgets, ...) stark aufgestellt.

Bei Letzterem hingegen sollte die Wahl (für die Backendimplementierung) weniger relevant sein. Ob nun C#, Java, JavaScript, PHP, Ruby, o.ä.. Bei keiner der genannten Optionen sollte es bezüglich der von dir beschriebenen Anwendungsfälle große Probleme geben. Hauptsache, die Sprache erfährt für das Web einen entsprechenden Support (bspw. durch dafür konzipierte Frameworks und Hosting-Services). Um die Interaktion zwischen Nutzer und grafischer Oberfläche zu beschreiben (Frontend), kommst du im Regelfall an JavaScript (oder TypeScript) kaum vorbei.

...zur Antwort

Um so eine Aufgabe zu lösen, musst du wissen, welche Vorgaben der Vertrag vorschreibt. Dann kannst du sie Schritt für Schritt durchgehen und den vorliegenden Quellcode daraufhin prüfen. Bei Bedarf kann es dabei hilfreich sein, sich Testobjekte auszudenken.

Tun wir das also einmal für deine Beispielaufgabe:

Vorgabe 1: Bei jedem Aufruf der hashCode-Methode (im aktuellen Programmlauf) erhalte ich für das jeweilige Objekt denselben Wert zurück, vorausgesetzt der Objektzustand wurde zwischenzeitlich nicht geändert.

Die hashCode-Methode liefert immer einen konstanten Wert (99) zurück, egal wie oft ich sie auch für ein Objekt XY aufrufe. Diese Vorgabe trifft also zu.

Vorgabe 2: Wenn zwei Objekte laut equals-Methode gleich sind, liefern sie auch den gleichen Hashcode zurück.

Da die Methode wie gesagt einen konstanten Wert liefert, ist die Implementation von equals egal. Jedes Kartenobjekt hat den Hashcode 99. Die Anforderung ist in dieser Hinsicht erfüllt.

Hätten wir den Fall, dass der Hashcode dynamisch berechnet wird (z.B. mit einem Feldwert als Faktor), dann sollte man zunächst Testobjekte finden, die laut equals als gleich bezeichnet werden würden.

Bei deinem Code wären sowohl ein Kartenobjekt A ("Bube", "Karo") und ein Kartenobjekt B ("Bube", "Karo") gleich, als auch A oder B im Vergleich mit sich selbst. Der nächste Schritt wäre die Berechnung des Hashcodes für A und B, um zu bestätigen, dass der jeweils berechnete Wert gleich ist.

Oft wird bei klausuren (...)

Eine weitere beliebte Anschlussfrage wäre, ob die vorliegende hashCode-Implementation denn gut ist oder was daran verbessert werden könnte.

Problematisch bei der obigen Implementation ist, dass jedes Kartenobjekt den selben Hashcode hat. Hashcodes werden in Hashstrukturen (z.B. HashMap) als interner Schlüssel genutzt, um die gespeicherten Elemente möglichst breit zu verteilen. Ein Objekt mit dem Hashcode 1 geht beispielsweise in Speicherzelle 1, ein Objekt mit Hashcode 2 in Speicherzelle 2, usw.. Umso breiter die Aufteilung (also umso weniger Objekte in einer Speicherzelle liegen), umso schneller kann ein Zugriff erfolgen: Die Anwendung braucht ja nur den Hashcode berechnen und dann auf die entsprechende Speicherzelle zugreifen. Wenn in dieser jedoch mehrere Objekte liegen, muss auch in dieser Liste nochmal nach dem richtigen Objekt gesucht werden.

Eine Verbesserungsmöglichkeit wäre, den Objektzustand in die Berechnung mit einzubeziehen. Bei einem Kartendeck könnte man beispielsweise den Typ und das Symbol numerisch darstellen (Typ: 7 = 7, 8 = 8, 9 = 9, 10 = 10, Bube = 11, ...; Symbol: Kreuz = 1, Pik = 2, ...) und diese beiden Faktoren dann miteinander verrechnen (z.B. Typ * Symbol).

...zur Antwort

Die Struktur einer Webseite wird immer auf Grundlage eines HTML-Dokuments aufgebaut. Anhand von Elementen/Tags (es sind keine Befehle) wie head oder body kann der Browser zuordnen, welche Inhalte wohin gehören.

Man kann die expliziten Start- und Endtags beider Elemente (head, body) beim Schreiben unter bestimmten Voraussetzungen in der Tat weglassen (schau dafür in die von mir verlinkten Spezifikationen), ohne dadurch ein invalides Dokument zu erzeugen. Wenn der Browser die Seite lädt und sein DOM aufbaut, kann er die Inhalte trotzdem noch entsprechend einordnen.

Beispiel:

<!doctype html>
<title>Example</title>
<p>Hello world!</p>

Doctype und Titel sind Pflichtbestandteile, Letztgenannter wird automatisch dem head zugeordnet. Der Paragraph geht in den body.

Allerdings bringt es dir keine so großen Vorteile. Der Schreibaufwand ist minimal kleiner, von einer reellen Performanceoptimierung (aufgrund der wenigen gesparten Bytes) würde ich an der Stelle nicht sprechen. Problematischer hingegen ist, dass du das Fehlerrisiko erhöhst. Die Tags dienen ja nicht nur dem Browser zur Orientierung, sondern auch dir selbst. Wenn du sie weglässt, musst du stets selbst wissen, wo Bereich A endet und Bereich B anfängt.

Bei einem invaliden HTML-Dokument erstellen Browser üblicherweise dennoch ein DOM und versuchen die zur Verfügung gestellten Informationen irgendwie einzuordnen. Dieses Korrekturverhalten kann je Browser variieren und natürlich darfst du nicht damit rechnen, dass er in deinem Sinne handelt.

Im schlimmsten Fall nimmt ein invalides Markup Einfluss auf dein CSS, deine JavaScript-Ressourcen, die Bedienbarkeit oder das allgemeine Ladeverhalten der Webseite. Bezüglich SEO und überhaupt der Gestaltung einer nutzerfreundlichen, barrierefreien Webseite ist so etwas also mehr als hinderlich. Im beruflichen Kontext kann es die Achillesferse sein, die es Konkurrenten ermöglicht, dir Kunden wegzuschnappen.

...zur Antwort

Für ein allererstes Hineinschnuppern bzw. eine sehr einfache Heranführung an die Programmierung ist Karel ok. Andere Sprachen mit mehr Praxisrelevanz können dir allerdings ebenso einen einfachen Einstieg bieten.

Ein paar Beispiele:

  • Ich persönlich empfehle sehr gern Processing. Diese Sprache ist sehr nah an Java angelehnt und bietet dir eine einfache Schnittstelle zum Zeichnen an, sodass du bereits zu Beginn leicht grafisch visuelle Erfolge erzielen kannst. Mit Processing kannst du gut Minispiele und grafische Simulationen entwickeln. Für höher gesteckte Ziele bietet sich ein späterer Umstieg auf Java an.
  • Python wurde ursprünglich als Lehrsprache konzipiert und gehört dementsprechend zu den wohl am leichtesten erlernbaren Programmiersprachen. Sie eignet sich vorzugsweise zur Entwicklung kleiner Skripte/Hilfstools, Minispiele, kleiner Webanwendungen sowie zur Datensteuerung und -analyse. Das eingebaute turtle-Modul ist eine sehr gute Alternative zu Karel.
  • Wenn du ein macOS hast und Anwendungen für Apple OS erstellen möchtest, wäre Swift eine hervorragende Wahl. Apple bietet für einen spielerischen Einstieg die App Swift Playgrounds an.

Der Vorteil gegenüber Karel ist der, dass sie in ihren Mitteln weniger begrenzt sind und damit auch mehr Raum für das bedarfsweise Eintauchen in komplexere Themengebiete erlauben.

...zur Antwort