AP0 Quick Wins: Chart.js lokal, Scaffolding weg, Umlaute, FinalProtocol-Titel

- Chart.js von jsDelivr-CDN lokal vendored (static/js/vendor/chart.umd.min.js
  v4.4.7), progress.html darauf umgestellt -> schliesst das einzige externe
  Asset / DSGVO-Datenleck.
- Scaffolding entfernt: DummyController.java, dummy.html, static/hello.txt.
- Umlaute umfassend korrigiert (wort-/morphemgenau, Slugs + Code-Identifier wie
  ZahlungPruefung/GEPRUEFT/Daemon/Boehm bewusst geschont): usv.json,
  devlab/techtacular/bughunter content.json, techtacular.js, zahlensysteme.html,
  style.css-Mojibake. V21-Migration reseedet geseedete DBs aus korrigiertem JSON.
- FinalProtocol: Titel "AP1" entfernt, Hero deckt jetzt AP1 und AP2 ab.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WFxcjtc9HNP4VECT6Ur1tE
This commit is contained in:
AliceDarkest
2026-07-20 23:37:55 +02:00
parent c5009d1718
commit e52cada445
14 changed files with 300 additions and 318 deletions
@@ -1,13 +0,0 @@
package com.example.mindflux.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DummyController {
@GetMapping("/comingsoon")
public String comingSoon() {
return "dummy"; // verweist auf dummy.html in src/main/resources/templates
}
}
+5 -5
View File
@@ -15,8 +15,8 @@
{
"slug": "menue-fallt-durch", "title": "Fall #3: Das fallende Menü", "language": "Java", "difficulty": "junior", "examScope": "AP1",
"description": "Der Punkt ‚Status‘ öffnet unerwartet den Abmelde-Dialog.", "briefing": "Ein Azubi meldet einen Fehler im Konsolenmenü. Prüfe die Verzweigungen.", "consoleOutput": "Eingabe: 2\nStatus: OK\nAbmeldung gestartet",
"files": [{"filename":"Menue.java","content":"switch (auswahl) {\n case 1:\n System.out.println(\"Start\");\n break;\n case 2:\n System.out.println(\"Status: OK\");\n case 3:\n System.out.println(\"Abmeldung gestartet\");\n break;\n default:\n System.out.println(\"Ungültig\");\n}"}],
"bugs": [{"points":100,"file":"Menue.java","line":6,"category":"logik","evidence":"Nach dem Status-Fall wird der nächste case ebenfalls ausgeführt.","fixOptions":[" break;"," continue;"," return false;"," case 2: break;"],"fixIndex":0,"fixedLine":" break;","explanation":"Ohne break fällt ein switch in den nächsten Fall durch (fall-through)."}]
"files": [{"filename":"Menü.java","content":"switch (auswahl) {\n case 1:\n System.out.println(\"Start\");\n break;\n case 2:\n System.out.println(\"Status: OK\");\n case 3:\n System.out.println(\"Abmeldung gestartet\");\n break;\n default:\n System.out.println(\"Ungültig\");\n}"}],
"bugs": [{"points":100,"file":"Menü.java","line":6,"category":"logik","evidence":"Nach dem Status-Fall wird der nächste case ebenfalls ausgeführt.","fixOptions":[" break;"," continue;"," return false;"," case 2: break;"],"fixIndex":0,"fixedLine":" break;","explanation":"Ohne break fällt ein switch in den nächsten Fall durch (fall-through)."}]
},
{
"slug": "absturz-um-mitternacht", "title": "Fall #4: Der Absturz um Mitternacht", "language": "Java", "difficulty": "senior", "examScope": "AP2_FIAE",
@@ -43,11 +43,11 @@
"slug": "archiv-unter-druck", "title": "Fall #7: Archiv unter Druck", "language": "Java", "difficulty": "senior", "examScope": "AP2_FIAE",
"description": "Der tägliche Audit-Export bricht bei einem leeren Archiv ab und die CSV-Route stürzt nur in der Nachtverarbeitung ab.", "briefing": "Das Compliance-Team benötigt den Export vor 06:00 Uhr. Zwei Fehler liegen in getrennten Dateien; der Stacktrace nennt nur den Controller.", "consoleOutput": "java.lang.NullPointerException: Cannot invoke \"String.equals(Object)\"\n at ExportController.ausliefern(ExportController.java:4)\n[warn] Audit-Archiv enthält heute keine Einträge",
"files": [
{"filename":"AuditExport.java","content":"import java.util.List;\n\npublic class AuditExport {\n public String export(List<String> eintraege) {\n if (eintraege == null && eintraege.isEmpty()) {\n return \"Keine Einträge\";\n }\n return String.join(\"\\n\", eintraege);\n }\n}"},
{"filename":"ExportController.java","content":"public class ExportController {\n public String ausliefern(String format, AuditExport export, java.util.List<String> eintraege) {\n if (format.equals(\"csv\")) {\n return export.export(eintraege);\n }\n return \"Format nicht unterstützt\";\n }\n}"}
{"filename":"AuditExport.java","content":"import java.util.List;\n\npublic class AuditExport {\n public String export(List<String> einträge) {\n if (einträge == null && einträge.isEmpty()) {\n return \"Keine Einträge\";\n }\n return String.join(\"\\n\", einträge);\n }\n}"},
{"filename":"ExportController.java","content":"public class ExportController {\n public String ausliefern(String format, AuditExport export, java.util.List<String> einträge) {\n if (format.equals(\"csv\")) {\n return export.export(einträge);\n }\n return \"Format nicht unterstützt\";\n }\n}"}
],
"bugs": [
{"points":150,"file":"AuditExport.java","line":5,"category":"laufzeit","evidence":"Bei null wird rechts von && trotzdem ein Methodenaufruf ausgeführt.","fixOptions":[" if (eintraege == null || eintraege.isEmpty()) {"," if (eintraege != null && eintraege.isEmpty()) {"," if (eintraege.isEmpty() || eintraege == null) {"," if (eintraege == null & eintraege.isEmpty()) {"],"fixIndex":0,"fixedLine":" if (eintraege == null || eintraege.isEmpty()) {","explanation":"Die ODER-Verknüpfung beendet die Auswertung sofort, wenn die Liste null ist. Danach kann isEmpty sicher geprüft werden."},
{"points":150,"file":"AuditExport.java","line":5,"category":"laufzeit","evidence":"Bei null wird rechts von && trotzdem ein Methodenaufruf ausgeführt.","fixOptions":[" if (einträge == null || einträge.isEmpty()) {"," if (einträge != null && einträge.isEmpty()) {"," if (einträge.isEmpty() || einträge == null) {"," if (einträge == null & einträge.isEmpty()) {"],"fixIndex":0,"fixedLine":" if (einträge == null || einträge.isEmpty()) {","explanation":"Die ODER-Verknüpfung beendet die Auswertung sofort, wenn die Liste null ist. Danach kann isEmpty sicher geprüft werden."},
{"points":150,"file":"ExportController.java","line":3,"category":"laufzeit","evidence":"Der Stacktrace zeigt auf den Methodenaufruf equals; format kann aus einem optionalen Jobparameter stammen.","fixOptions":[" if (\"csv\".equals(format)) {"," if (format == \"csv\") {"," if (format.equalsIgnoreCase == \"csv\") {"," if (format != \"csv\") {"],"fixIndex":0,"fixedLine":" if (\"csv\".equals(format)) {","explanation":"Wird die feste Zeichenkette links verwendet, liefert equals bei einem null-Wert einfach false statt eine NullPointerException auszulösen."}
]
},
@@ -0,0 +1,21 @@
-- V21: Umlaut-Korrektur fuer bereits geseedete Spiel-Inhalte (bestehende Datenbanken).
--
-- Die Inhalte von DevLab, TechTacular und BugHunter wurden einmalig aus den
-- content.json-Dateien geseedet (Seeder laufen nur bei leerer Tabelle). Die JSON-
-- Quellen sind jetzt umlautkorrekt; frische Installationen sind dadurch bereits
-- korrekt. Fuer schon befuellte DBs leeren wir die Content-Tabellen, woraufhin die
-- CommandLineRunner-Seeder sie beim naechsten Start aus dem korrigierten JSON neu
-- aufbauen (gleiche Vorgehensweise wie V6 fuer TechTacular).
--
-- CASCADE raeumt nur die abhaengigen Content-Tabellen (Tasks/Questions/Answers/
-- Files/Bugs). Spielstaende (game_scores speichert das Spiel als String, kein FK)
-- und der Fortschritt (bughunter_hunt_progress hat keinen FK auf die Hunts) bleiben
-- erhalten; durch RESTART IDENTITY und die deterministische Seed-Reihenfolge sind
-- die neuen IDs identisch zu vorher.
--
-- Networker ist NICHT betroffen: dort war ausschliesslich der (bewusst stabile)
-- Slug transliteriert, die sichtbaren Welt-Titel/-Beschreibungen sind bereits korrekt.
TRUNCATE TABLE devlab_games RESTART IDENTITY CASCADE;
TRUNCATE TABLE techtacular_categories RESTART IDENTITY CASCADE;
TRUNCATE TABLE bughunter_hunts RESTART IDENTITY CASCADE;
+117 -117
View File
@@ -1253,7 +1253,7 @@
"type": "cloze",
"prompt": "Kopfbereich auszeichnen",
"points": 100,
"narrative": "Oben auf der Seite stehen Logo und Titel. Welches Element umschliesst diesen Kopfbereich?",
"narrative": "Oben auf der Seite stehen Logo und Titel. Welches Element umschließt diesen Kopfbereich?",
"codeTemplate": "<{{1}}>\n <h1>Mindflux</h1>\n</{{2}}>",
"gaps": [
{
@@ -1268,7 +1268,7 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag wie das oeffnende.",
"hint": "Gleiches Tag wie das öffnende.",
"caseSensitive": false,
"solutions": [
"header"
@@ -1290,19 +1290,19 @@
],
"correctIndex": 0,
"hint": "Es darf pro Seite nur einmal sichtbar vorkommen.",
"successText": "Genau, <main> umschliesst den Hauptinhalt."
"successText": "Genau, <main> umschließt den Hauptinhalt."
},
{
"type": "cloze",
"prompt": "Navigation",
"points": 100,
"narrative": "Die Linkliste fuehrt durch die Seite.",
"codeTemplate": "<{{1}} aria-label=\"Hauptmenue\">\n <a href=\"/\">Start</a>\n</{{2}}>",
"narrative": "Die Linkliste führt durch die Seite.",
"codeTemplate": "<{{1}} aria-label=\"Hauptmenü\">\n <a href=\"/\">Start</a>\n</{{2}}>",
"gaps": [
{
"position": 1,
"placeholder": "Tag",
"hint": "Steht fuer Navigation.",
"hint": "Steht für Navigation.",
"caseSensitive": false,
"solutions": [
"nav"
@@ -1311,32 +1311,32 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag schliessen.",
"hint": "Gleiches Tag schließen.",
"caseSensitive": false,
"solutions": [
"nav"
]
}
],
"successText": "<nav> ist die richtige Wahl fuer Navigationsbloecke."
"successText": "<nav> ist die richtige Wahl für Navigationsblöcke."
},
{
"type": "order",
"prompt": "Seitengeruest ordnen",
"prompt": "Seitengerüst ordnen",
"points": 100,
"instruction": "Bringe die Grundbausteine einer Seite in die uebliche Reihenfolge von oben nach unten.",
"instruction": "Bringe die Grundbausteine einer Seite in die übliche Reihenfolge von oben nach unten.",
"items": [
"<header>",
"<nav>",
"<main>",
"<footer>"
],
"hint": "Kopf, dann Menue, dann Inhalt, dann Fuss.",
"hint": "Kopf, dann Menü, dann Inhalt, dann Fuss.",
"successText": "Sauberes Dokument-Outline!"
},
{
"type": "cloze",
"prompt": "Eigenstaendiger Beitrag",
"prompt": "Eigenständiger Beitrag",
"points": 100,
"narrative": "Ein Blogpost soll auch einzeln (z. B. im RSS-Feed) sinnvoll sein.",
"codeTemplate": "<{{1}}>\n <h2>Blogpost</h2>\n <p>Text</p>\n</{{2}}>",
@@ -1344,7 +1344,7 @@
{
"position": 1,
"placeholder": "Tag",
"hint": "Eigenstaendiger, wiederverwendbarer Inhalt.",
"hint": "Eigenständiger, wiederverwendbarer Inhalt.",
"caseSensitive": false,
"solutions": [
"article"
@@ -1353,7 +1353,7 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag schliessen.",
"hint": "Gleiches Tag schließen.",
"caseSensitive": false,
"solutions": [
"article"
@@ -1374,14 +1374,14 @@
"<menu role=\"nav\">"
],
"correctIndex": 0,
"hint": "Es gibt ein dediziertes HTML-Element dafuer.",
"hint": "Es gibt ein dediziertes HTML-Element dafür.",
"successText": "Richtig, <nav> ist standardisiert und barrierearm."
},
{
"type": "spot",
"prompt": "Falsches schliessendes Tag",
"prompt": "Falsches schließendes Tag",
"points": 100,
"narrative": "Ein schliessendes Tag passt nicht zum oeffnenden Element.",
"narrative": "Ein schließendes Tag passt nicht zum öffnenden Element.",
"instruction": "Klick den fehlerhaften Token an.",
"tokens": [
"<section>",
@@ -1390,20 +1390,20 @@
],
"bugIndex": 2,
"fix": "</section>",
"hint": "Welches Tag wurde geoeffnet?",
"successText": "Korrekt, oeffnendes und schliessendes Tag muessen uebereinstimmen."
"hint": "Welches Tag wurde geöffnet?",
"successText": "Korrekt, öffnendes und schließendes Tag müssen übereinstimmen."
},
{
"type": "cloze",
"prompt": "Thematischer Abschnitt",
"points": 100,
"narrative": "Ein klar abgegrenztes Kapitel mit eigener Ueberschrift.",
"narrative": "Ein klar abgegrenztes Kapitel mit eigener Überschrift.",
"codeTemplate": "<{{1}}>\n <h2>Kapitel 1</h2>\n</{{2}}>",
"gaps": [
{
"position": 1,
"placeholder": "Tag",
"hint": "Thematischer Block mit Ueberschrift.",
"hint": "Thematischer Block mit Überschrift.",
"caseSensitive": false,
"solutions": [
"section"
@@ -1412,20 +1412,20 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag schliessen.",
"hint": "Gleiches Tag schließen.",
"caseSensitive": false,
"solutions": [
"section"
]
}
],
"successText": "<section> gruppiert thematisch zusammengehoerigen Inhalt."
"successText": "<section> gruppiert thematisch zusammengehörigen Inhalt."
},
{
"type": "choice",
"prompt": "Randinhalt",
"points": 100,
"question": "Welches Element eignet sich fuer ergaenzende Randinhalte wie eine Sidebar?",
"question": "Welches Element eignet sich für ergänzende Randinhalte wie eine Sidebar?",
"options": [
"<aside>",
"<side>",
@@ -1433,12 +1433,12 @@
"<div class=\"sidebar\">"
],
"correctIndex": 0,
"hint": "Inhalt, der nur indirekt zum Hauptinhalt gehoert.",
"successText": "Genau, <aside> ist fuer nebensaechliche Inhalte gedacht."
"hint": "Inhalt, der nur indirekt zum Hauptinhalt gehört.",
"successText": "Genau, <aside> ist für nebensächliche Inhalte gedacht."
},
{
"type": "cloze",
"prompt": "Label verknuepfen",
"prompt": "Label verknüpfen",
"points": 100,
"narrative": "Das Label soll beim Klick das passende Eingabefeld fokussieren.",
"codeTemplate": "<label {{1}}=\"mail\">E-Mail</label>\n<input id=\"mail\" {{2}}=\"email\">",
@@ -1462,7 +1462,7 @@
]
}
],
"successText": "for verknuepft Label und Feld, type setzt die Eingabeart."
"successText": "for verknüpft Label und Feld, type setzt die Eingabeart."
},
{
"type": "spot",
@@ -1483,9 +1483,9 @@
},
{
"type": "order",
"prompt": "Ueberschriften-Hierarchie",
"prompt": "Überschriften-Hierarchie",
"points": 100,
"instruction": "Ordne die Ueberschriften von der wichtigsten zur untergeordneten Ebene.",
"instruction": "Ordne die Überschriften von der wichtigsten zur untergeordneten Ebene.",
"items": [
"<h1>",
"<h2>",
@@ -1505,7 +1505,7 @@
{
"position": 1,
"placeholder": "Tag",
"hint": "Abschliessender Bereich.",
"hint": "Abschließender Bereich.",
"caseSensitive": false,
"solutions": [
"footer"
@@ -1514,14 +1514,14 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag schliessen.",
"hint": "Gleiches Tag schließen.",
"caseSensitive": false,
"solutions": [
"footer"
]
}
],
"successText": "<footer> markiert den abschliessenden Bereich."
"successText": "<footer> markiert den abschließenden Bereich."
},
{
"type": "choice",
@@ -1536,11 +1536,11 @@
],
"correctIndex": 0,
"hint": "Eines kapselt das Bild, das andere die Beschriftung.",
"successText": "Richtig, <figcaption> gehoert in eine <figure>."
"successText": "Richtig, <figcaption> gehört in eine <figure>."
},
{
"type": "cloze",
"prompt": "Schaltflaeche",
"prompt": "Schaltfläche",
"points": 100,
"narrative": "Der Button soll ein Formular absenden.",
"codeTemplate": "<button {{1}}=\"submit\">Senden</button>",
@@ -1555,7 +1555,7 @@
]
}
],
"successText": "type=\"submit\" loest das Absenden aus."
"successText": "type=\"submit\" löst das Absenden aus."
},
{
"type": "spot",
@@ -1571,14 +1571,14 @@
],
"bugIndex": 0,
"fix": "<nav",
"hint": "Welches dedizierte Element gibt es fuer Navigation?",
"successText": "Mit <nav> brauchst du keine Hilfsklasse fuer die Bedeutung."
"hint": "Welches dedizierte Element gibt es für Navigation?",
"successText": "Mit <nav> brauchst du keine Hilfsklasse für die Bedeutung."
},
{
"type": "choice",
"prompt": "Ueberschriften-Ebene",
"prompt": "Überschriften-Ebene",
"points": 100,
"question": "Wie viele <h1>-Hauptueberschriften sind pro Seite ueblicherweise empfohlen?",
"question": "Wie viele <h1>-Hauptüberschriften sind pro Seite üblicherweise empfohlen?",
"options": [
"Genau eine",
"Beliebig viele",
@@ -1586,12 +1586,12 @@
"Keine"
],
"correctIndex": 0,
"hint": "Eine klare Hauptueberschrift pro Dokument.",
"successText": "Eine einzige h1 haelt die Struktur eindeutig."
"hint": "Eine klare Hauptüberschrift pro Dokument.",
"successText": "Eine einzige h1 hält die Struktur eindeutig."
},
{
"type": "cloze",
"prompt": "Seiteninhalt umschliessen",
"prompt": "Seiteninhalt umschließen",
"points": 100,
"narrative": "Zwischen Header und Footer steht der zentrale Inhaltsbereich.",
"codeTemplate": "<{{1}}>\n <h1>Willkommen</h1>\n</{{2}}>",
@@ -1608,14 +1608,14 @@
{
"position": 2,
"placeholder": "Tag",
"hint": "Gleiches Tag schliessen.",
"hint": "Gleiches Tag schließen.",
"caseSensitive": false,
"solutions": [
"main"
]
}
],
"successText": "<main> umschliesst den dominanten Inhalt der Seite."
"successText": "<main> umschließt den dominanten Inhalt der Seite."
}
]
},
@@ -1683,7 +1683,7 @@
],
"bugIndex": 2,
"fix": "flex",
"hint": "Der CSS-Wert heisst nicht wie das Konzept.",
"hint": "Der CSS-Wert heißt nicht wie das Konzept.",
"successText": "Korrekt, der Wert lautet flex, nicht flexbox."
},
{
@@ -1716,7 +1716,7 @@
"type": "cloze",
"prompt": "Abstand zwischen Items",
"points": 100,
"narrative": "Zwischen den Kacheln soll ein gleichmaessiger Abstand entstehen.",
"narrative": "Zwischen den Kacheln soll ein gleichmäßiger Abstand entstehen.",
"codeTemplate": ".grid {\n display: grid;\n {{1}}: 16px;\n}",
"gaps": [
{
@@ -1729,7 +1729,7 @@
]
}
],
"successText": "gap erzeugt Abstaende ohne Rand-Tricks."
"successText": "gap erzeugt Abstände ohne Rand-Tricks."
},
{
"type": "cloze",
@@ -1748,13 +1748,13 @@
]
}
],
"successText": "center buendelt die Items in der Mitte."
"successText": "center bündelt die Items in der Mitte."
},
{
"type": "choice",
"prompt": "Zweidimensionales Layout",
"points": 100,
"question": "Welches Modell eignet sich am besten fuer ein Raster aus Zeilen UND Spalten?",
"question": "Welches Modell eignet sich am besten für ein Raster aus Zeilen UND Spalten?",
"options": [
"display: grid",
"display: flex",
@@ -1763,7 +1763,7 @@
],
"correctIndex": 0,
"hint": "Flex ist eindimensional, das gesuchte ist zweidimensional.",
"successText": "Grid ist fuer zweidimensionale Layouts gemacht."
"successText": "Grid ist für zweidimensionale Layouts gemacht."
},
{
"type": "spot",
@@ -1780,7 +1780,7 @@
"bugIndex": 2,
"fix": "space-between",
"hint": "Da fehlt ein Buchstabe.",
"successText": "Richtig, der Wert heisst space-between."
"successText": "Richtig, der Wert heißt space-between."
},
{
"type": "cloze",
@@ -1865,7 +1865,7 @@
"type": "cloze",
"prompt": "Eine flexible Spalte",
"points": 100,
"narrative": "Auf schmalen Schirmen soll alles in einer flexiblen Spalte ueber die volle Breite stehen.",
"narrative": "Auf schmalen Schirmen soll alles in einer flexiblen Spalte über die volle Breite stehen.",
"codeTemplate": "@media (max-width: 600px) {\n .grid { grid-template-columns: {{1}}; }\n}",
"gaps": [
{
@@ -1878,7 +1878,7 @@
]
}
],
"successText": "1fr fuellt den verfuegbaren Raum mit einer Spalte."
"successText": "1fr füllt den verfügbaren Raum mit einer Spalte."
},
{
"type": "spot",
@@ -1895,13 +1895,13 @@
"bugIndex": 0,
"fix": "grid-template-columns",
"hint": "Lies das Wort 'columns' genau.",
"successText": "Richtig geschrieben heisst es grid-template-columns."
"successText": "Richtig geschrieben heißt es grid-template-columns."
},
{
"type": "choice",
"prompt": "Luecke zwischen Zellen",
"prompt": "Lücke zwischen Zellen",
"points": 100,
"question": "Welche Property erzeugt gleichmaessige Abstaende zwischen Grid- oder Flex-Items?",
"question": "Welche Property erzeugt gleichmäßige Abstände zwischen Grid- oder Flex-Items?",
"options": [
"gap",
"margin-collapse",
@@ -1910,7 +1910,7 @@
],
"correctIndex": 0,
"hint": "Funktioniert ohne Rand am letzten Element.",
"successText": "gap ist die moderne Loesung fuer Item-Abstaende."
"successText": "gap ist die moderne Lösung für Item-Abstände."
},
{
"type": "cloze",
@@ -1938,7 +1938,7 @@
]
}
],
"successText": "display: grid eroeffnet das Raster-Layout."
"successText": "display: grid eröffnet das Raster-Layout."
},
{
"type": "match",
@@ -1990,7 +1990,7 @@
"title": "CSS Cascade",
"language": "CSS",
"path": "visual",
"description": "Verstehe Spezifitaet, Reihenfolge, Vererbung und !important - und welche Regel am Ende gewinnt.",
"description": "Verstehe Spezifität, Reihenfolge, Vererbung und !important - und welche Regel am Ende gewinnt.",
"tasks": [
{
"type": "choice",
@@ -2005,13 +2005,13 @@
],
"correctIndex": 0,
"hint": "ID-Selektoren wiegen schwerer als Klassen.",
"successText": "Richtig, eine ID schlaegt eine Klasse."
"successText": "Richtig, eine ID schlägt eine Klasse."
},
{
"type": "choice",
"prompt": "Inline gegen ID",
"points": 100,
"question": "Welche Deklaration hat die hoechste Spezifitaet (ohne !important)?",
"question": "Welche Deklaration hat die höchste Spezifität (ohne !important)?",
"options": [
"Ein Inline-Style (style-Attribut)",
"Ein ID-Selektor",
@@ -2019,14 +2019,14 @@
"Ein Element-Selektor"
],
"correctIndex": 0,
"hint": "Denke an die Spezifitaets-Stufen a,b,c,d.",
"successText": "Inline-Styles haben die hoechste normale Spezifitaet."
"hint": "Denke an die Spezifitäts-Stufen a,b,c,d.",
"successText": "Inline-Styles haben die höchste normale Spezifität."
},
{
"type": "match",
"prompt": "Spezifitaet zuordnen",
"prompt": "Spezifität zuordnen",
"points": 100,
"instruction": "Ordne jeden Selektor seiner Spezifitaet (IDs, Klassen, Elemente) zu.",
"instruction": "Ordne jeden Selektor seiner Spezifität (IDs, Klassen, Elemente) zu.",
"pairs": [
[
"#header",
@@ -2045,14 +2045,14 @@
"1,1,1"
]
],
"hint": "Zaehle IDs, dann Klassen, dann Element-Namen.",
"successText": "Perfekt, du zaehlst Spezifitaet richtig!"
"hint": "Zähle IDs, dann Klassen, dann Element-Namen.",
"successText": "Perfekt, du zählst Spezifität richtig!"
},
{
"type": "cloze",
"prompt": "Spezifischer werden",
"points": 100,
"narrative": "Die Klasse allein verliert gegen eine andere Regel. Erhoehe die Spezifitaet, indem du die ID #card des Containers voranstellst.",
"narrative": "Die Klasse allein verliert gegen eine andere Regel. Erhöhe die Spezifität, indem du die ID #card des Containers voranstellst.",
"codeTemplate": "{{1}} .title {\n color: var(--accent);\n}",
"gaps": [
{
@@ -2071,37 +2071,37 @@
"type": "choice",
"prompt": "Notbremse !important",
"points": 100,
"question": "Welche Aussage ueber !important ist korrekt?",
"question": "Welche Aussage über !important ist korrekt?",
"options": [
"Es ueberschreibt normale Deklarationen unabhaengig von der Spezifitaet",
"Es erhoeht die Spezifitaet um genau eine ID",
"Es überschreibt normale Deklarationen unabhängig von der Spezifität",
"Es erhöht die Spezifität um genau eine ID",
"Es wirkt nur bei Inline-Styles",
"Es deaktiviert die Vererbung"
],
"correctIndex": 0,
"hint": "!important steht ausserhalb der normalen Spezifitaets-Rechnung.",
"hint": "!important steht ausserhalb der normalen Spezifitäts-Rechnung.",
"successText": "Genau, !important sticht normale Regeln - sparsam einsetzen."
},
{
"type": "choice",
"prompt": "Gleiche Spezifitaet",
"prompt": "Gleiche Spezifität",
"points": 100,
"question": "Zwei Regeln gleicher Spezifitaet treffen dasselbe Element:\n.btn { color: red; }\n.btn { color: green; }\nWelche gewinnt?",
"question": "Zwei Regeln gleicher Spezifität treffen dasselbe Element:\n.btn { color: red; }\n.btn { color: green; }\nWelche gewinnt?",
"options": [
"Die spaeter im Stylesheet stehende (green)",
"Die später im Stylesheet stehende (green)",
"Die zuerst stehende (red)",
"Beide gemischt",
"Die kuerzere Regel"
"Die kürzere Regel"
],
"correctIndex": 0,
"hint": "Bei Gleichstand entscheidet die Quellreihenfolge.",
"successText": "Bei gleicher Spezifitaet gewinnt die letzte Regel."
"successText": "Bei gleicher Spezifität gewinnt die letzte Regel."
},
{
"type": "cloze",
"prompt": "Farbe als Token",
"points": 100,
"narrative": "Statt einer hartkodierten Hex-Farbe nutzt du eine CSS-Variable, damit Themes durchgreifen koennen.",
"narrative": "Statt einer hartkodierten Hex-Farbe nutzt du eine CSS-Variable, damit Themes durchgreifen können.",
"codeTemplate": ".badge {\n color: {{1}};\n}",
"gaps": [
{
@@ -2114,7 +2114,7 @@
]
}
],
"successText": "var(--accent) bleibt theme-faehig statt fest verdrahtet."
"successText": "var(--accent) bleibt theme-fähig statt fest verdrahtet."
},
{
"type": "choice",
@@ -2122,8 +2122,8 @@
"points": 100,
"question": "p { color: black; } und .lead { color: gray; } treffen dasselbe Element. Welche gewinnt?",
"options": [
".lead (Klasse schlaegt Element)",
"p (Element schlaegt Klasse)",
".lead (Klasse schlägt Element)",
"p (Element schlägt Klasse)",
"Die zuletzt geladene Datei",
"Keine"
],
@@ -2138,12 +2138,12 @@
"instruction": "Ordne jeden Faktor seiner Rolle in der Kaskade zu.",
"pairs": [
[
"Spezifitaet",
"Spezifität",
"Gewicht des Selektors"
],
[
"Reihenfolge",
"Spaeteres ueberschreibt Gleichwertiges"
"Späteres überschreibt Gleichwertiges"
],
[
"!important",
@@ -2154,14 +2154,14 @@
"Werte fliessen an Kindelemente"
]
],
"hint": "Vier Saeulen entscheiden, welcher Wert greift.",
"hint": "Vier Säulen entscheiden, welcher Wert greift.",
"successText": "Du kennst die Hebel der Kaskade!"
},
{
"type": "choice",
"prompt": "Spezifitaet zaehlen",
"prompt": "Spezifität zählen",
"points": 100,
"question": "Welche Spezifitaet (IDs, Klassen, Elemente) hat der Selektor ul li a.active?",
"question": "Welche Spezifität (IDs, Klassen, Elemente) hat der Selektor ul li a.active?",
"options": [
"0,1,3",
"0,2,2",
@@ -2176,7 +2176,7 @@
"type": "cloze",
"prompt": "Variable definieren",
"points": 100,
"narrative": "Lege das Theme-Token zentral an, damit alle Komponenten darauf zugreifen koennen.",
"narrative": "Lege das Theme-Token zentral an, damit alle Komponenten darauf zugreifen können.",
"codeTemplate": ":root {\n {{1}}: #4f46e5;\n}",
"gaps": [
{
@@ -2189,7 +2189,7 @@
]
}
],
"successText": "--accent ist nun als wiederverwendbares Token verfuegbar."
"successText": "--accent ist nun als wiederverwendbares Token verfügbar."
},
{
"type": "choice",
@@ -2204,7 +2204,7 @@
],
"correctIndex": 0,
"hint": "Text-bezogene Eigenschaften vererben sich oft.",
"successText": "Richtig, color wird standardmaessig vererbt."
"successText": "Richtig, color wird standardmäßig vererbt."
},
{
"type": "cloze",
@@ -2223,13 +2223,13 @@
]
}
],
"successText": "#main spricht das Element ueber seine ID an."
"successText": "#main spricht das Element über seine ID an."
},
{
"type": "choice",
"prompt": "Universalselektor",
"points": 100,
"question": "Welche Spezifitaet (IDs, Klassen, Elemente) traegt der Universalselektor * ?",
"question": "Welche Spezifität (IDs, Klassen, Elemente) trägt der Universalselektor * ?",
"options": [
"0,0,0",
"0,0,1",
@@ -2238,13 +2238,13 @@
],
"correctIndex": 0,
"hint": "Der Stern hat kein eigenes Gewicht.",
"successText": "Korrekt, * traegt die Spezifitaet 0,0,0."
"successText": "Korrekt, * trägt die Spezifität 0,0,0."
},
{
"type": "match",
"prompt": "Selektoren vergleichen",
"points": 100,
"instruction": "Ordne jeden Selektor seiner Spezifitaet zu.",
"instruction": "Ordne jeden Selektor seiner Spezifität zu.",
"pairs": [
[
"*",
@@ -2264,28 +2264,28 @@
]
],
"hint": "Von kein Gewicht bis ID aufsteigend.",
"successText": "Du sortierst Spezifitaet sicher!"
"successText": "Du sortierst Spezifität sicher!"
},
{
"type": "choice",
"prompt": "Wer schlaegt wen?",
"prompt": "Wer schlägt wen?",
"points": 100,
"question": "Eine Stylesheet-Regel hat !important, ein Inline-Style hat es nicht. Welche gewinnt?",
"options": [
"Die Regel mit !important",
"Der Inline-Style",
"Die mit der hoeheren Spezifitaet",
"Die mit der höheren Spezifität",
"Beide gleich"
],
"correctIndex": 0,
"hint": "!important steht ueber normalen Inline-Styles.",
"successText": "Richtig, !important schlaegt einen normalen Inline-Style."
"hint": "!important steht über normalen Inline-Styles.",
"successText": "Richtig, !important schlägt einen normalen Inline-Style."
},
{
"type": "cloze",
"prompt": "Klasse an Element binden",
"points": 100,
"narrative": "Erhoehe die Spezifitaet, indem du die Klasse active direkt an das Element a bindest.",
"narrative": "Erhöhe die Spezifität, indem du die Klasse active direkt an das Element a bindest.",
"codeTemplate": "a{{1}} {\n color: var(--accent);\n}",
"gaps": [
{
@@ -2307,7 +2307,7 @@
"title": "Flexbox Factory",
"language": "CSS",
"path": "visual",
"description": "Baue Flexbox-Layouts Schritt fuer Schritt: Richtung, Ausrichtung, Umbruch und flexible Items.",
"description": "Baue Flexbox-Layouts Schritt für Schritt: Richtung, Ausrichtung, Umbruch und flexible Items.",
"tasks": [
{
"type": "cloze",
@@ -2356,7 +2356,7 @@
"type": "cloze",
"prompt": "Richtung festlegen",
"points": 100,
"narrative": "Das Menue soll seine Eintraege untereinander anzeigen.",
"narrative": "Das Menü soll seine Einträge untereinander anzeigen.",
"codeTemplate": ".menu {\n display: flex;\n {{1}}: column;\n}",
"gaps": [
{
@@ -2401,7 +2401,7 @@
"type": "cloze",
"prompt": "Auf der Hauptachse verteilen",
"points": 100,
"narrative": "Logo links, Menue rechts - mit maximalem Abstand dazwischen.",
"narrative": "Logo links, Menü rechts - mit maximalem Abstand dazwischen.",
"codeTemplate": ".row {\n display: flex;\n {{1}}: space-between;\n}",
"gaps": [
{
@@ -2420,7 +2420,7 @@
"type": "choice",
"prompt": "Hauptachse bei row",
"points": 100,
"question": "Bei flex-direction: row - in welche Richtung verlaeuft die Hauptachse?",
"question": "Bei flex-direction: row - in welche Richtung verläuft die Hauptachse?",
"options": [
"Horizontal (links nach rechts)",
"Vertikal (oben nach unten)",
@@ -2429,7 +2429,7 @@
],
"correctIndex": 0,
"hint": "row bedeutet Reihe.",
"successText": "Genau, bei row laeuft die Hauptachse horizontal."
"successText": "Genau, bei row läuft die Hauptachse horizontal."
},
{
"type": "order",
@@ -2466,9 +2466,9 @@
},
{
"type": "choice",
"prompt": "Gleiche Hoehe",
"prompt": "Gleiche Höhe",
"points": 100,
"question": "Welcher align-items-Wert streckt alle Items auf die volle Hoehe des Containers?",
"question": "Welcher align-items-Wert streckt alle Items auf die volle Höhe des Containers?",
"options": [
"stretch",
"center",
@@ -2477,7 +2477,7 @@
],
"correctIndex": 0,
"hint": "Es ist auch der Standardwert.",
"successText": "stretch dehnt die Items ueber die Querachse."
"successText": "stretch dehnt die Items über die Querachse."
},
{
"type": "cloze",
@@ -2510,7 +2510,7 @@
],
[
"space-between",
"Aussen buendig, Rest verteilt"
"Aussen bündig, Rest verteilt"
],
[
"flex-end",
@@ -2518,17 +2518,17 @@
],
[
"space-evenly",
"Ueberall gleicher Abstand"
"Überall gleicher Abstand"
]
],
"hint": "Achte auf die Raender.",
"hint": "Achte auf die Ränder.",
"successText": "Du beherrschst die Verteilungs-Werte!"
},
{
"type": "choice",
"prompt": "Verfuegbaren Platz fuellen",
"prompt": "Verfügbaren Platz füllen",
"points": 100,
"question": "Womit laesst du ein einzelnes Flex-Item den verbleibenden freien Platz einnehmen?",
"question": "Womit lässt du ein einzelnes Flex-Item den verbleibenden freien Platz einnehmen?",
"options": [
"flex-grow: 1",
"flex-shrink: 0",
@@ -2537,7 +2537,7 @@
],
"correctIndex": 0,
"hint": "Es geht ums Wachsen, nicht ums Schrumpfen.",
"successText": "flex-grow: 1 laesst das Item expandieren."
"successText": "flex-grow: 1 lässt das Item expandieren."
},
{
"type": "cloze",
@@ -2556,7 +2556,7 @@
]
}
],
"successText": "gap haelt die Items gleichmaessig auf Abstand."
"successText": "gap hält die Items gleichmäßig auf Abstand."
},
{
"type": "order",
@@ -2569,7 +2569,7 @@
"align-items: center;"
],
"hint": "Erst Flex, dann beide Achsen zentrieren.",
"successText": "Der Klassiker fuer perfekte Zentrierung!"
"successText": "Der Klassiker für perfekte Zentrierung!"
},
{
"type": "choice",
@@ -2635,7 +2635,7 @@
"type": "choice",
"prompt": "Querachse benennen",
"points": 100,
"question": "Bei flex-direction: row verlaeuft die Querachse ...",
"question": "Bei flex-direction: row verläuft die Querachse ...",
"options": [
"vertikal (oben nach unten)",
"horizontal (links nach rechts)",
+3 -3
View File
@@ -16,7 +16,7 @@
transform: translateY(0);
}
}
/* Glanz-Effekt für Hover */
/* Glanz-Effekt für Hover */
@keyframes shine {
0% {
background-position: -100%;
@@ -26,7 +26,7 @@
}
}
/* Fade-In für Container beim Laden */
/* Fade-In für Container beim Laden */
@keyframes fadeInUp {
0% {
opacity: 0;
@@ -217,7 +217,7 @@ footer a:hover {
z-index: 10;
}
/* Kleinere Switch-Größe */
/* Kleinere Switch-Größe */
.switch {
position: relative;
display: inline-block;
@@ -75,7 +75,7 @@
<li>1 MB = 10^6 = 1.000.000 Byte, 1 MiB = 1024^2 = 1.048.576 Byte.</li>
<li>1 GB = 10^9 Byte, 1 GiB = 1024^3 = 1.073.741.824 Byte.</li>
</ul>
<p class="merksatz"><strong>Merksatz:</strong> Das kleine "i" (KiB, MiB, GiB) steht fuer "binär" und damit für 1024. Ohne "i" ist es dezimal (1000).</p>
<p class="merksatz"><strong>Merksatz:</strong> Das kleine "i" (KiB, MiB, GiB) steht für "binär" und damit für 1024. Ohne "i" ist es dezimal (1000).</p>
</section>
<section>
@@ -7,69 +7,69 @@
"text": "Wofür steht die Abkürzung USV?",
"answers": ["Unterbrechungsfreie Stromversorgung", "Ungeregelte Spannungsverteilung", "Unabhängige Stromverteilung"],
"correct": 0,
"explanation": "USV steht fuer Unterbrechungsfreie Stromversorgung; im Englischen heisst sie UPS (Uninterruptible Power Supply)."
"explanation": "USV steht für Unterbrechungsfreie Stromversorgung; im Englischen heißt sie UPS (Uninterruptible Power Supply)."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Was ist ein Hauptzweck einer USV?",
"answers": ["Die Netzspannung dauerhaft erhoehen", "Zeit fuer ein geordnetes Herunterfahren oder Umschalten schaffen", "Den Stromverbrauch der Server senken"],
"answers": ["Die Netzspannung dauerhaft erhöhen", "Zeit für ein geordnetes Herunterfahren oder Umschalten schaffen", "Den Stromverbrauch der Server senken"],
"correct": 1,
"explanation": "Die USV ueberbrueckt kurze Ausfaelle und gibt Systemen Zeit, kontrolliert herunterzufahren oder auf eine andere Quelle umzuschalten."
"explanation": "Die USV überbrückt kurze Ausfälle und gibt Systemen Zeit, kontrolliert herunterzufahren oder auf eine andere Quelle umzuschalten."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Welche Stoerung kann eine USV typischerweise abfangen?",
"answers": ["Eine fehlerhafte Netzwerkkonfiguration", "Eine ueberhitzte CPU im Server", "Einen kurzzeitigen Stromausfall und Spannungseinbrueche"],
"text": "Welche Störung kann eine USV typischerweise abfangen?",
"answers": ["Eine fehlerhafte Netzwerkkonfiguration", "Eine überhitzte CPU im Server", "Einen kurzzeitigen Stromausfall und Spannungseinbrüche"],
"correct": 2,
"explanation": "USV-Systeme schuetzen vor Stromausfaellen sowie - je nach Typ - vor Spannungsschwankungen, nicht aber vor IT- oder Hardwarefehlern."
"explanation": "USV-Systeme schützen vor Stromausfällen sowie - je nach Typ - vor Spannungsschwankungen, nicht aber vor IT- oder Hardwarefehlern."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Was kann eine normale USV nicht dauerhaft ersetzen?",
"answers": ["Eine langfristige Stromversorgung durch Netz oder Notstromgenerator", "Eine Steckdosenleiste mit Ueberspannungsschutz", "Den Hauptverteiler im Serverraum"],
"answers": ["Eine langfristige Stromversorgung durch Netz oder Notstromgenerator", "Eine Steckdosenleiste mit Überspannungsschutz", "Den Hauptverteiler im Serverraum"],
"correct": 0,
"explanation": "Eine Standard-USV ueberbrueckt meist nur Minuten; fuer laengere Ausfaelle ist ein Generator oder das Versorgungsnetz noetig."
"explanation": "Eine Standard-USV überbrückt meist nur Minuten; für längere Ausfälle ist ein Generator oder das Versorgungsnetz nötig."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Welche Systeme werden typischerweise an eine USV angeschlossen?",
"answers": ["Drucker und Klimageraete im gesamten Gebaeude", "Server, Storage und aktive Netzwerkkomponenten", "Beleuchtung und Bueroarbeitsplaetze"],
"answers": ["Drucker und Klimageräte im gesamten Gebäude", "Server, Storage und aktive Netzwerkkomponenten", "Beleuchtung und Büroarbeitsplätze"],
"correct": 1,
"explanation": "Kritische IT-Infrastruktur soll kontrolliert weiterlaufen oder herunterfahren; verbrauchsstarke, unkritische Lasten gehoeren nicht an die USV."
"explanation": "Kritische IT-Infrastruktur soll kontrolliert weiterlaufen oder herunterfahren; verbrauchsstarke, unkritische Lasten gehören nicht an die USV."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Was beschreibt die Autonomiezeit (Ueberbrueckungszeit) einer USV?",
"answers": ["Die Zeit bis zum naechsten Batteriewechsel", "Die Ladedauer der Batterien nach einem Ausfall", "Die Zeit, die eine USV die angeschlossene Last aus der Batterie versorgen kann"],
"text": "Was beschreibt die Autonomiezeit (Überbrückungszeit) einer USV?",
"answers": ["Die Zeit bis zum nächsten Batteriewechsel", "Die Ladedauer der Batterien nach einem Ausfall", "Die Zeit, die eine USV die angeschlossene Last aus der Batterie versorgen kann"],
"correct": 2,
"explanation": "Die Autonomiezeit haengt von Batteriekapazitaet, angeschlossener Last und dem Alterungszustand der Batterien ab."
"explanation": "Die Autonomiezeit hängt von Batteriekapazität, angeschlossener Last und dem Alterungszustand der Batterien ab."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Warum ist eine USV fuer Datenbankserver besonders sinnvoll?",
"answers": ["Sie reduziert das Risiko von Datenverlust durch abrupten Stromverlust", "Sie beschleunigt die Ausfuehrung von SQL-Abfragen", "Sie erstellt automatisch Transaktionsprotokolle"],
"text": "Warum ist eine USV für Datenbankserver besonders sinnvoll?",
"answers": ["Sie reduziert das Risiko von Datenverlust durch abrupten Stromverlust", "Sie beschleunigt die Ausführung von SQL-Abfragen", "Sie erstellt automatisch Transaktionsprotokolle"],
"correct": 0,
"explanation": "Abrupte Stromausfaelle koennen offene Transaktionen abbrechen und zu Inkonsistenzen oder Datenverlust fuehren."
"explanation": "Abrupte Stromausfälle können offene Transaktionen abbrechen und zu Inkonsistenzen oder Datenverlust führen."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Welche Aussage zur Schutzwirkung einer USV ist korrekt?",
"answers": ["Eine USV ersetzt eine Backup-Strategie vollstaendig", "Eine USV schuetzt nicht vor jedem IT-Risiko und ist nur ein Baustein im Schutzkonzept", "Eine USV verhindert Angriffe ueber das Netzwerk"],
"answers": ["Eine USV ersetzt eine Backup-Strategie vollständig", "Eine USV schützt nicht vor jedem IT-Risiko und ist nur ein Baustein im Schutzkonzept", "Eine USV verhindert Angriffe über das Netzwerk"],
"correct": 1,
"explanation": "Eine USV schuetzt gegen Stromprobleme, nicht gegen Datenverlust, Schadsoftware oder Bedienfehler - Backups und Security bleiben noetig."
"explanation": "Eine USV schützt gegen Stromprobleme, nicht gegen Datenverlust, Schadsoftware oder Bedienfehler - Backups und Security bleiben nötig."
},
{
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Was sollte bei einem laengeren Stromausfall automatisch ausgeloest werden?",
"answers": ["Ein hartes Trennen der Stromzufuhr zu allen Servern", "Ein Zuruecksetzen der Netzwerkkonfiguration", "Ein geordnetes Herunterfahren der Server vor Erschoepfung der Batterie"],
"text": "Was sollte bei einem längeren Stromausfall automatisch ausgelöst werden?",
"answers": ["Ein hartes Trennen der Stromzufuhr zu allen Servern", "Ein Zurücksetzen der Netzwerkkonfiguration", "Ein geordnetes Herunterfahren der Server vor Erschöpfung der Batterie"],
"correct": 2,
"explanation": "Eine Shutdown-Software fahrt Systeme rechtzeitig kontrolliert herunter, solange die Batterie noch Energie liefert."
},
@@ -77,7 +77,7 @@
"category": "USV-Grundlagen",
"hint": "Verstehe Zweck, Grenzen und typische Einsatzbereiche einer USV.",
"text": "Welche drei USV-Klassen werden nach IEC 62040-3 unterschieden?",
"answers": ["Offline/Standby (VFD), Line-Interactive (VI) und Online/Doppelwandler (VFI)", "Aktiv, Passiv und Hybrid", "Primaer-, Sekundaer- und Reserve-USV"],
"answers": ["Offline/Standby (VFD), Line-Interactive (VI) und Online/Doppelwandler (VFI)", "Aktiv, Passiv und Hybrid", "Primär-, Sekundär- und Reserve-USV"],
"correct": 0,
"explanation": "VFD = Offline, VI = Line-Interactive (Voltage Independent), VFI = Online/Doppelwandler (Voltage and Frequency Independent)."
},
@@ -92,88 +92,88 @@
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Welche USV-Klasse versorgt die Last per Doppelwandlung ohne Umschaltzeit und bietet den hoechsten Schutz?",
"text": "Welche USV-Klasse versorgt die Last per Doppelwandlung ohne Umschaltzeit und bietet den höchsten Schutz?",
"answers": ["Online-USV (VFI, Doppelwandler)", "Offline-/Standby-USV (VFD)", "Line-Interactive-USV (VI)"],
"correct": 0,
"explanation": "Bei der Online-USV erzeugt der Wechselrichter die Ausgangsspannung staendig neu; die Last ist gegen nahezu alle Netzstoerungen geschuetzt."
"explanation": "Bei der Online-USV erzeugt der Wechselrichter die Ausgangsspannung ständig neu; die Last ist gegen nahezu alle Netzstörungen geschützt."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Wodurch unterscheidet sich eine Line-Interactive-USV (VI) von einer einfachen Offline-USV?",
"answers": ["Sie versorgt die Last grundsaetzlich ohne jede Umschaltzeit", "Sie gleicht Spannungsschwankungen ueber einen regelbaren Transformator (AVR) aus", "Sie kommt vollstaendig ohne Batterie aus"],
"answers": ["Sie versorgt die Last grundsätzlich ohne jede Umschaltzeit", "Sie gleicht Spannungsschwankungen über einen regelbaren Transformator (AVR) aus", "Sie kommt vollständig ohne Batterie aus"],
"correct": 1,
"explanation": "Die Line-Interactive-USV regelt mit einem AVR kleinere Ueber- und Unterspannungen aus, ohne dafuer auf Batterie zu wechseln."
"explanation": "Die Line-Interactive-USV regelt mit einem AVR kleinere Über- und Unterspannungen aus, ohne dafür auf Batterie zu wechseln."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "In welchen Einheiten wird die Leistung einer USV ueblicherweise angegeben?",
"text": "In welchen Einheiten wird die Leistung einer USV üblicherweise angegeben?",
"answers": ["In Voltampere (VA) und Watt (W)", "In Amperestunden (Ah) und Volt (V)", "In Kilowattstunden (kWh) pro Tag"],
"correct": 0,
"explanation": "VA gibt die Scheinleistung, Watt die Wirkleistung an; das Verhaeltnis beider ist der Leistungsfaktor der USV."
"explanation": "VA gibt die Scheinleistung, Watt die Wirkleistung an; das Verhältnis beider ist der Leistungsfaktor der USV."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Warum darf man eine USV nicht allein nach der VA-Angabe auswaehlen?",
"text": "Warum darf man eine USV nicht allein nach der VA-Angabe auswählen?",
"answers": ["VA und Watt sind immer identisch, der Unterschied ist irrelevant", "Die nutzbare Wirkleistung in Watt liegt wegen des Leistungsfaktors unter dem VA-Wert", "Die VA-Angabe bezieht sich nur auf die Batterieladung"],
"correct": 1,
"explanation": "Wegen des Leistungsfaktors (z. B. 0,8 oder 0,9) ist die in Watt nutzbare Leistung kleiner als der VA-Wert - beide Grenzen muessen passen."
"explanation": "Wegen des Leistungsfaktors (z. B. 0,8 oder 0,9) ist die in Watt nutzbare Leistung kleiner als der VA-Wert - beide Grenzen müssen passen."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Warum sollte bei der Dimensionierung eine Leistungsreserve eingeplant werden?",
"answers": ["Damit die USV moeglichst nah an der Ueberlastgrenze betrieben wird", "Damit Batterietests komplett entfallen koennen", "Fuer Lastspitzen, Batteriealterung und spaetere Erweiterungen"],
"answers": ["Damit die USV möglichst nah an der Überlastgrenze betrieben wird", "Damit Batterietests komplett entfallen können", "Für Lastspitzen, Batteriealterung und spätere Erweiterungen"],
"correct": 2,
"explanation": "Eine Reserve (oft rund 20-30 Prozent) faengt Einschaltspitzen, nachlassende Batteriekapazitaet und zusaetzliche Geraete ab."
"explanation": "Eine Reserve (oft rund 20-30 Prozent) fängt Einschaltspitzen, nachlassende Batteriekapazität und zusätzliche Geräte ab."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Was passiert typischerweise bei einer Ueberlastung der USV?",
"answers": ["Sie schaltet ab oder geht in den Bypass und kann die Last nicht zuverlaessig schuetzen", "Sie erhoeht selbststaendig ihre VA-Leistung", "Sie verlaengert automatisch die Autonomiezeit"],
"text": "Was passiert typischerweise bei einer Überlastung der USV?",
"answers": ["Sie schaltet ab oder geht in den Bypass und kann die Last nicht zuverlässig schützen", "Sie erhöht selbstständig ihre VA-Leistung", "Sie verlängert automatisch die Autonomiezeit"],
"correct": 0,
"explanation": "Bei Ueberlast greift der Schutz: Die USV warnt, geht in den Bypass oder schaltet ab - die Schutzwirkung geht verloren."
"explanation": "Bei Überlast greift der Schutz: Die USV warnt, geht in den Bypass oder schaltet ab - die Schutzwirkung geht verloren."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Welcher Faktor beeinflusst die Autonomiezeit am staerksten?",
"answers": ["Die Hoehe der angeschlossenen Last", "Die Laenge der verwendeten Stromkabel", "Die Anzahl der Steckdosen am Geraet"],
"text": "Welcher Faktor beeinflusst die Autonomiezeit am stärksten?",
"answers": ["Die Höhe der angeschlossenen Last", "Die Länge der verwendeten Stromkabel", "Die Anzahl der Steckdosen am Gerät"],
"correct": 0,
"explanation": "Je hoeher die Last, desto schneller wird die Batterie entladen und desto kuerzer ist die Ueberbrueckungszeit."
"explanation": "Je höher die Last, desto schneller wird die Batterie entladen und desto kürzer ist die Überbrückungszeit."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Was sollte vor dem Kauf einer USV neben der Leistung geprueft werden?",
"answers": ["Die Gehaeusefarbe und das Gewicht", "Anzahl und Art der Anschluesse sowie die Kommunikationsschnittstelle", "Der Stromverbrauch der Bueroklimaanlage"],
"text": "Was sollte vor dem Kauf einer USV neben der Leistung geprüft werden?",
"answers": ["Die Gehäusefarbe und das Gewicht", "Anzahl und Art der Anschlüsse sowie die Kommunikationsschnittstelle", "Der Stromverbrauch der Büroklimaanlage"],
"correct": 1,
"explanation": "Anschlussart, genug Steckplaetze und eine Management-Schnittstelle (USB oder Netzwerk fuer die Shutdown-Software) muessen zur Infrastruktur passen."
"explanation": "Anschlussart, genug Steckplätze und eine Management-Schnittstelle (USB oder Netzwerk für die Shutdown-Software) müssen zur Infrastruktur passen."
},
{
"category": "Leistung & Dimensionierung",
"hint": "Dimensioniere die USV nach Typ, Last, Laufzeit und Reserve.",
"text": "Wie sollte die benoetigte Autonomiezeit geplant werden?",
"answers": ["So kurz wie moeglich, um Batterien zu sparen", "Mindestens so lang wie die Shutdown-Zeit aller Systeme plus Reserve", "Genau gleich der Umschaltzeit der USV"],
"text": "Wie sollte die benötigte Autonomiezeit geplant werden?",
"answers": ["So kurz wie möglich, um Batterien zu sparen", "Mindestens so lang wie die Shutdown-Zeit aller Systeme plus Reserve", "Genau gleich der Umschaltzeit der USV"],
"correct": 1,
"explanation": "Die Batterie muss lange genug durchhalten, damit alle Systeme geordnet herunterfahren koennen, mit Puffer fuer Unwaegbarkeiten."
"explanation": "Die Batterie muss lange genug durchhalten, damit alle Systeme geordnet herunterfahren können, mit Puffer für Unwägbarkeiten."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Warum sollte eine USV ueberwacht (Monitoring) werden?",
"answers": ["Damit Batteriestatus, Last und Stoerungen rechtzeitig erkannt werden", "Damit die USV moeglichst unauffaellig bleibt", "Damit der Stromzaehler langsamer laeuft"],
"text": "Warum sollte eine USV überwacht (Monitoring) werden?",
"answers": ["Damit Batteriestatus, Last und Störungen rechtzeitig erkannt werden", "Damit die USV möglichst unauffällig bleibt", "Damit der Stromzähler langsamer läuft"],
"correct": 0,
"explanation": "Monitoring meldet schwache Batterien, Ueberlast oder Defekte, bevor sie im Ernstfall zum Ausfall fuehren."
"explanation": "Monitoring meldet schwache Batterien, Überlast oder Defekte, bevor sie im Ernstfall zum Ausfall führen."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Warum sind regelmaessige USV-Tests wichtig?",
"answers": ["Sie machen die Batterien dauerhaft haltbar", "Sie pruefen, ob Ueberbrueckung und automatischer Shutdown tatsaechlich funktionieren", "Sie ersetzen den planmaessigen Batterietausch"],
"text": "Warum sind regelmäßige USV-Tests wichtig?",
"answers": ["Sie machen die Batterien dauerhaft haltbar", "Sie prüfen, ob Überbrückung und automatischer Shutdown tatsächlich funktionieren", "Sie ersetzen den planmäßigen Batterietausch"],
"correct": 1,
"explanation": "Ein Test unter realen Bedingungen zeigt, ob das Konzept aus Autonomiezeit und Shutdown-Software in der Praxis greift."
},
@@ -181,25 +181,25 @@
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Was ist beim Umgang mit USV-Batterien zu beachten?",
"answers": ["Sie sind Verschleissteile und muessen nach Herstellerangaben geprueft und ersetzt werden", "Sie halten ueber die gesamte Lebensdauer der USV ohne Pruefung", "Sie laden sich bei Nichtnutzung selbst nach"],
"answers": ["Sie sind Verschleissteile und müssen nach Herstellerangaben geprüft und ersetzt werden", "Sie halten über die gesamte Lebensdauer der USV ohne Prüfung", "Sie laden sich bei Nichtnutzung selbst nach"],
"correct": 0,
"explanation": "Batterien altern; nur regelmaessige Pruefung und rechtzeitiger Austausch sichern die geplante Ueberbrueckungszeit."
"explanation": "Batterien altern; nur regelmäßige Prüfung und rechtzeitiger Austausch sichern die geplante Überbrückungszeit."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Wie sollte auf einen USV-Alarm reagiert werden?",
"answers": ["Den Alarm quittieren und ignorieren, solange der Strom noch da ist", "Sofort alle Logdateien loeschen", "Die Ursache pruefen und bei Bedarf einen geordneten Shutdown einleiten"],
"answers": ["Den Alarm quittieren und ignorieren, solange der Strom noch da ist", "Sofort alle Logdateien löschen", "Die Ursache prüfen und bei Bedarf einen geordneten Shutdown einleiten"],
"correct": 2,
"explanation": "Ein Alarm signalisiert Handlungsbedarf, etwa Netzausfall, Ueberlast oder schwache Batterie - er darf nicht ignoriert werden."
"explanation": "Ein Alarm signalisiert Handlungsbedarf, etwa Netzausfall, Überlast oder schwache Batterie - er darf nicht ignoriert werden."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Warum ist es sinnvoll, auch Switches und Router an die USV anzuschliessen?",
"answers": ["Damit die Internetgeschwindigkeit steigt", "Damit Server waehrend des Ausfalls erreichbar und steuerbar bleiben", "Damit die VLAN-Konfiguration erhalten bleibt"],
"text": "Warum ist es sinnvoll, auch Switches und Router an die USV anzuschließen?",
"answers": ["Damit die Internetgeschwindigkeit steigt", "Damit Server während des Ausfalls erreichbar und steuerbar bleiben", "Damit die VLAN-Konfiguration erhalten bleibt"],
"correct": 1,
"explanation": "Ohne aktives Netzwerk koennen Shutdown-Befehle und Monitoring waehrend eines Stromausfalls die Server nicht mehr erreichen."
"explanation": "Ohne aktives Netzwerk können Shutdown-Befehle und Monitoring während eines Stromausfalls die Server nicht mehr erreichen."
},
{
"category": "Betrieb, Wartung & Praxis",
@@ -207,39 +207,39 @@
"text": "Was kennzeichnet einen geordneten Shutdown bei Stromausfall?",
"answers": ["Dienste und Betriebssysteme werden kontrolliert beendet, bevor die Batterie leer ist", "Die Stromzufuhr wird sofort hart getrennt", "Nur der Bildschirm wird abgeschaltet"],
"correct": 0,
"explanation": "Kontrolliertes Herunterfahren schreibt offene Daten zurueck und vermeidet Dateisystem- und Datenbankschaeden."
"explanation": "Kontrolliertes Herunterfahren schreibt offene Daten zurück und vermeidet Dateisystem- und Datenbankschäden."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Was sollte nach einem Stromereignis geprueft werden?",
"answers": ["Ausschliesslich, ob die Lampen wieder leuchten", "Nur, ob die USV piept", "Logs, Batteriestatus und der Zustand der angeschlossenen Systeme"],
"text": "Was sollte nach einem Stromereignis geprüft werden?",
"answers": ["Ausschließlich, ob die Lampen wieder leuchten", "Nur, ob die USV piept", "Logs, Batteriestatus und der Zustand der angeschlossenen Systeme"],
"correct": 2,
"explanation": "Eine Nachkontrolle deckt Folgeschaeden, eine teilentladene Batterie oder noetigen Wartungsbedarf auf."
"explanation": "Eine Nachkontrolle deckt Folgeschäden, eine teilentladene Batterie oder nötigen Wartungsbedarf auf."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Welche Aussage zum Verhaeltnis von USV und Backup ist richtig?",
"answers": ["Eine USV macht Backups ueberfluessig", "Eine USV ersetzt kein Backup, da beide gegen unterschiedliche Risiken schuetzen", "Backups verhindern Stromausfaelle"],
"text": "Welche Aussage zum Verhältnis von USV und Backup ist richtig?",
"answers": ["Eine USV macht Backups überflüssig", "Eine USV ersetzt kein Backup, da beide gegen unterschiedliche Risiken schützen", "Backups verhindern Stromausfälle"],
"correct": 1,
"explanation": "Die USV schuetzt vor Stromproblemen, das Backup vor Datenverlust - beide ergaenzen sich, ersetzen sich aber nicht."
"explanation": "Die USV schützt vor Stromproblemen, das Backup vor Datenverlust - beide ergänzen sich, ersetzen sich aber nicht."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Welche Information ist fuer den Betrieb einer USV besonders wichtig?",
"answers": ["Welche Systeme angeschlossen sind und wie kritisch sie sind", "Welcher Mitarbeiter sie zuletzt gesehen hat", "In welchem Jahr das Gehaeuse lackiert wurde"],
"text": "Welche Information ist für den Betrieb einer USV besonders wichtig?",
"answers": ["Welche Systeme angeschlossen sind und wie kritisch sie sind", "Welcher Mitarbeiter sie zuletzt gesehen hat", "In welchem Jahr das Gehäuse lackiert wurde"],
"correct": 0,
"explanation": "Der Betrieb muss wissen, welche Lasten geschuetzt sind, um Prioritaeten und Shutdown-Reihenfolge festzulegen."
"explanation": "Der Betrieb muss wissen, welche Lasten geschützt sind, um Prioritäten und Shutdown-Reihenfolge festzulegen."
},
{
"category": "Betrieb, Wartung & Praxis",
"hint": "Plane Tests, Monitoring, Batterieaustausch und Reaktion auf Stromereignisse.",
"text": "Was ist ein typischer Fehler beim Einsatz einer USV?",
"answers": ["Die Autonomiezeit zu dokumentieren", "Regelmaessige Batterietests einzuplanen", "Die USV zu installieren, aber die Shutdown-Software nie zu konfigurieren"],
"answers": ["Die Autonomiezeit zu dokumentieren", "Regelmäßige Batterietests einzuplanen", "Die USV zu installieren, aber die Shutdown-Software nie zu konfigurieren"],
"correct": 2,
"explanation": "Ohne konfigurierte Shutdown-Software fahren die Server bei laengerem Ausfall nicht geordnet herunter und die Schutzwirkung bleibt unvollstaendig."
"explanation": "Ohne konfigurierte Shutdown-Software fahren die Server bei längerem Ausfall nicht geordnet herunter und die Schutzwirkung bleibt unvollständig."
}
]
}
-1
View File
@@ -1 +0,0 @@
It works!
+1 -1
View File
@@ -175,7 +175,7 @@
const data = await res.json();
const removedIds = Array.isArray(data.removeAnswerIds) ? data.removeAnswerIds : [];
if (removedIds.length === 0) {
jokerNote.textContent = 'Der Joker ist fuer diese Frage nicht verfuegbar.';
jokerNote.textContent = 'Der Joker ist für diese Frage nicht verfügbar.';
return;
}
File diff suppressed because one or more lines are too long
+57 -57
View File
@@ -159,7 +159,7 @@
},
{
"points": 300,
"clue": "Diese Technik trennt ein physisches Switch-Netz logisch in mehrere getrennte Broadcast-Domaenen auf.",
"clue": "Diese Technik trennt ein physisches Switch-Netz logisch in mehrere getrennte Broadcast-Domänen auf.",
"solution": "VLAN",
"distractors": [
"VPN",
@@ -192,7 +192,7 @@
},
{
"points": 300,
"clue": "In dieser Netzwerktopologie sind alle Endgeräte sternfoermig mit einem zentralen Koppelelement verbunden.",
"clue": "In dieser Netzwerktopologie sind alle Endgeräte sternförmig mit einem zentralen Koppelelement verbunden.",
"solution": "Stern-Topologie",
"distractors": [
"Bus-Topologie",
@@ -265,7 +265,7 @@
"/27",
"/28"
],
"explanation": "Zwei zusaetzliche Bits (/26) erzeugen vier Subnetze zu je 64 Adressen."
"explanation": "Zwei zusätzliche Bits (/26) erzeugen vier Subnetze zu je 64 Adressen."
},
{
"points": 500,
@@ -298,7 +298,7 @@
"IEEE 802.3ad",
"IEEE 802.1D"
],
"explanation": "802.1Q fuegt ein VLAN-Tag in den Ethernet-Frame ein."
"explanation": "802.1Q fügt ein VLAN-Tag in den Ethernet-Frame ein."
},
{
"points": 500,
@@ -759,7 +759,7 @@
"Polymorphie",
"Komposition"
],
"explanation": "Vererbung übertraegt Eigenschaften und Verhalten von einer Oberklasse an eine Unterklasse."
"explanation": "Vererbung überträgt Eigenschaften und Verhalten von einer Oberklasse an eine Unterklasse."
},
{
"points": 200,
@@ -774,7 +774,7 @@
},
{
"points": 200,
"clue": "Diese Kontrollstruktur wählt anhand einer Bedingung zwischen verschiedenen Codezweigen, typischerweise mit den Schlüsselwoertern if und else.",
"clue": "Diese Kontrollstruktur wählt anhand einer Bedingung zwischen verschiedenen Codezweigen, typischerweise mit den Schlüsselwörtern if und else.",
"solution": "Verzweigung",
"distractors": [
"Schleife",
@@ -807,7 +807,7 @@
},
{
"points": 300,
"clue": "Dieses OOP-Konzept erlaubt es, dass derselbe Methodenaufruf je nach tatsaechlichem Objekttyp unterschiedliches Verhalten zeigt.",
"clue": "Dieses OOP-Konzept erlaubt es, dass derselbe Methodenaufruf je nach tatsächlichem Objekttyp unterschiedliches Verhalten zeigt.",
"solution": "Polymorphie",
"distractors": [
"Kapselung",
@@ -851,7 +851,7 @@
},
{
"points": 300,
"clue": "Dieser unerwartete Laufzeitfehler kann mit try und catch behandelt werden, damit das Programm nicht abstuerzt.",
"clue": "Dieser unerwartete Laufzeitfehler kann mit try und catch behandelt werden, damit das Programm nicht abstürzt.",
"solution": "Exception",
"distractors": [
"Syntaxfehler",
@@ -939,7 +939,7 @@
},
{
"points": 500,
"clue": "Dieses Paradigma beschreibt nur das gewuenschte Ergebnis und nicht den genauen Rechenweg; SQL ist ein bekanntes Beispiel dafür.",
"clue": "Dieses Paradigma beschreibt nur das gewünschte Ergebnis und nicht den genauen Rechenweg; SQL ist ein bekanntes Beispiel dafür.",
"solution": "Deklarative Programmierung",
"distractors": [
"Imperative Programmierung",
@@ -979,7 +979,7 @@
"Call by Name",
"Pass by Copy"
],
"explanation": "Bei Call by Reference wird die Adresse übergeben, daher wirken Änderungen auf den urspruenglichen Wert."
"explanation": "Bei Call by Reference wird die Adresse übergeben, daher wirken Änderungen auf den ursprünglichen Wert."
},
{
"points": 500,
@@ -994,7 +994,7 @@
},
{
"points": 500,
"clue": "Dieses Phaenomen tritt auf, wenn eine innere Funktion auf Variablen ihrer umgebenden Funktion zugreift und diese über deren Lebenszeit hinaus festhält.",
"clue": "Dieses Phänomen tritt auf, wenn eine innere Funktion auf Variablen ihrer umgebenden Funktion zugreift und diese über deren Lebenszeit hinaus festhält.",
"solution": "Closure",
"distractors": [
"Callback",
@@ -1017,11 +1017,11 @@
"Liste",
"Baum"
],
"explanation": "Ein Stack (Stapel) entnimmt zuerst das zuletzt eingefuegte Element (Last In, First Out)."
"explanation": "Ein Stack (Stapel) entnimmt zuerst das zuletzt eingefügte Element (Last In, First Out)."
},
{
"points": 100,
"clue": "Diese lineare Datenstruktur arbeitet nach dem FIFO-Prinzip: Das zuerst eingefuegte Element wird als Erstes wieder entnommen.",
"clue": "Diese lineare Datenstruktur arbeitet nach dem FIFO-Prinzip: Das zuerst eingefügte Element wird als Erstes wieder entnommen.",
"solution": "Queue",
"distractors": [
"Stack",
@@ -1057,7 +1057,7 @@
"clue": "Dieses Suchverfahren durchläuft eine Datenmenge Element für Element von vorne nach hinten, bis das gesuchte Element gefunden ist oder das Ende erreicht wird.",
"solution": "Lineare Suche",
"distractors": [
"Binaere Suche",
"Binäre Suche",
"Tiefensuche",
"Breitensuche"
],
@@ -1065,36 +1065,36 @@
},
{
"points": 100,
"clue": "Diese hierarchische Datenstruktur besitzt eine Wurzel, und jeder Knoten hat hoechstens zwei Kindknoten.",
"solution": "Binaerbaum",
"clue": "Diese hierarchische Datenstruktur besitzt eine Wurzel, und jeder Knoten hat höchstens zwei Kindknoten.",
"solution": "Binärbaum",
"distractors": [
"Graph",
"Verkettete Liste",
"Hashtabelle"
],
"explanation": "In einem Binaerbaum hat jeder Knoten maximal zwei Kinder (links und rechts)."
"explanation": "In einem Binärbaum hat jeder Knoten maximal zwei Kinder (links und rechts)."
},
{
"points": 200,
"clue": "Bei diesem Sortierverfahren werden Elemente nacheinander in einen bereits sortierten Teilbereich an die korrekte Stelle eingefuegt, ähnlich dem Sortieren von Spielkarten in der Hand.",
"clue": "Bei diesem Sortierverfahren werden Elemente nacheinander in einen bereits sortierten Teilbereich an die korrekte Stelle eingefügt, ähnlich dem Sortieren von Spielkarten in der Hand.",
"solution": "Insertionsort",
"distractors": [
"Selectionsort",
"Quicksort",
"Mergesort"
],
"explanation": "Insertionsort fuegt jedes Element an der passenden Position in den sortierten Teil ein."
"explanation": "Insertionsort fügt jedes Element an der passenden Position in den sortierten Teil ein."
},
{
"points": 200,
"clue": "Dieses Suchverfahren halbiert in einem sortierten Array wiederholt den Suchbereich und erreicht dadurch eine Laufzeit von O(log n).",
"solution": "Binaere Suche",
"solution": "Binäre Suche",
"distractors": [
"Lineare Suche",
"Hashing",
"Breitensuche"
],
"explanation": "Die binaere Suche teilt den sortierten Bereich bei jedem Schritt und benötigt nur O(log n)."
"explanation": "Die binäre Suche teilt den sortierten Bereich bei jedem Schritt und benötigt nur O(log n)."
},
{
"points": 200,
@@ -1112,11 +1112,11 @@
"clue": "Diese Datenstruktur berechnet aus einem Schlüssel mittels einer Funktion einen Speicherort und ermöglicht so im Mittel Zugriffe in O(1).",
"solution": "Hashtabelle",
"distractors": [
"Binaerbaum",
"Binärbaum",
"Verkettete Liste",
"Stack"
],
"explanation": "Eine Hashtabelle bildet Schlüssel über eine Hashfunktion auf Speicherplaetze ab."
"explanation": "Eine Hashtabelle bildet Schlüssel über eine Hashfunktion auf Speicherplätze ab."
},
{
"points": 200,
@@ -1125,7 +1125,7 @@
"distractors": [
"Omega-Notation",
"Theta-Notation",
"Fakultaet"
"Fakultät"
],
"explanation": "Die Groß-O-Notation gibt eine obere Schranke für das Wachstum der Laufzeit an."
},
@@ -1153,14 +1153,14 @@
},
{
"points": 300,
"clue": "Dieses stabile Sortierverfahren teilt die Daten rekursiv in zwei Haelften und fuegt die sortierten Teilfolgen anschließend wieder zusammen; es hat stets O(n log n).",
"clue": "Dieses stabile Sortierverfahren teilt die Daten rekursiv in zwei Hälften und fügt die sortierten Teilfolgen anschließend wieder zusammen; es hat stets O(n log n).",
"solution": "Mergesort",
"distractors": [
"Quicksort",
"Heapsort",
"Bubblesort"
],
"explanation": "Mergesort zerlegt die Folge rekursiv und verschmilzt die sortierten Haelften (Merge)."
"explanation": "Mergesort zerlegt die Folge rekursiv und verschmilzt die sortierten Hälften (Merge)."
},
{
"points": 300,
@@ -1168,7 +1168,7 @@
"solution": "Breitensuche",
"distractors": [
"Tiefensuche",
"Binaere Suche",
"Binäre Suche",
"Dijkstra-Algorithmus"
],
"explanation": "Die Breitensuche (BFS) erkundet Knoten schichtweise mithilfe einer Queue."
@@ -1189,7 +1189,7 @@
"clue": "Diese baumbasierte Datenstruktur erfüllt die Eigenschaft, dass jeder Elternknoten stets kleiner-gleich (bzw. größer-gleich) seinen Kindern ist und liefert so effizient das Minimum oder Maximum.",
"solution": "Heap",
"distractors": [
"Binaerer Suchbaum",
"Binärer Suchbaum",
"Hashtabelle",
"AVL-Baum"
],
@@ -1208,7 +1208,7 @@
},
{
"points": 400,
"clue": "Dieser binaere Suchbaum gleicht sich nach Einfuegungen und Löschungen über Rotationen automatisch aus, sodass der Höhenunterschied zweier Teilbaeume hoechstens eins betraegt.",
"clue": "Dieser binäre Suchbaum gleicht sich nach Einfügungen und Löschungen über Rotationen automatisch aus, sodass der Höhenunterschied zweier Teilbäume höchstens eins beträgt.",
"solution": "AVL-Baum",
"distractors": [
"Heap",
@@ -1219,7 +1219,7 @@
},
{
"points": 400,
"clue": "Dieses Sortierverfahren baut zunächst aus den Daten eine spezielle Baumstruktur auf und entnimmt dann wiederholt das Maximum; es läuft in O(n log n) ohne zusaetzlichen Speicher.",
"clue": "Dieses Sortierverfahren baut zunächst aus den Daten eine spezielle Baumstruktur auf und entnimmt dann wiederholt das Maximum; es läuft in O(n log n) ohne zusätzlichen Speicher.",
"solution": "Heapsort",
"distractors": [
"Mergesort",
@@ -1241,7 +1241,7 @@
},
{
"points": 400,
"clue": "Diese Baumtraversierung besucht zuerst den linken Teilbaum, dann den Knoten selbst und zuletzt den rechten Teilbaum und liefert bei einem binaeren Suchbaum die sortierte Reihenfolge.",
"clue": "Diese Baumtraversierung besucht zuerst den linken Teilbaum, dann den Knoten selbst und zuletzt den rechten Teilbaum und liefert bei einem binären Suchbaum die sortierte Reihenfolge.",
"solution": "Inorder-Traversierung",
"distractors": [
"Preorder-Traversierung",
@@ -1252,7 +1252,7 @@
},
{
"points": 400,
"clue": "Diese Strategie zum Auflösen von Kollisionen in einer Hashtabelle speichert alle Eintraege mit gleichem Hashwert in einer verketteten Liste am jeweiligen Speicherplatz.",
"clue": "Diese Strategie zum Auflösen von Kollisionen in einer Hashtabelle speichert alle Einträge mit gleichem Hashwert in einer verketteten Liste am jeweiligen Speicherplatz.",
"solution": "Verkettung",
"distractors": [
"Lineares Sondieren",
@@ -1292,7 +1292,7 @@
"Dijkstra-Algorithmus",
"Bellman-Ford-Algorithmus"
],
"explanation": "Der Kruskal-Algorithmus wählt zyklusfrei die guenstigsten Kanten für einen minimalen Spannbaum."
"explanation": "Der Kruskal-Algorithmus wählt zyklusfrei die günstigsten Kanten für einen minimalen Spannbaum."
},
{
"points": 500,
@@ -1318,14 +1318,14 @@
},
{
"points": 500,
"clue": "Diese selbstbalancierende Baumstruktur für Datenbanken und Dateisysteme hält mehrere Schlüssel pro Knoten und sorgt dafür, dass alle Blaetter dieselbe Tiefe haben.",
"clue": "Diese selbstbalancierende Baumstruktur für Datenbanken und Dateisysteme hält mehrere Schlüssel pro Knoten und sorgt dafür, dass alle Blätter dieselbe Tiefe haben.",
"solution": "B-Baum",
"distractors": [
"AVL-Baum",
"Rot-Schwarz-Baum",
"Trie"
],
"explanation": "Ein B-Baum speichert mehrere Schlüssel je Knoten und hält alle Blaetter auf gleicher Höhe."
"explanation": "Ein B-Baum speichert mehrere Schlüssel je Knoten und hält alle Blätter auf gleicher Höhe."
},
{
"points": 500,
@@ -3924,7 +3924,7 @@
"clue": "Diese Lizenzart erlaubt das freie Nutzen, Verändern und Weitergeben des Quellcodes von Software.",
"solution": "Open Source",
"distractors": [
"Proprietaer",
"Proprietär",
"Shareware",
"Freeware"
],
@@ -3932,7 +3932,7 @@
},
{
"points": 100,
"clue": "Dieser Vertrag verpflichtet den Verkäufer zur Übergabe einer Sache und den Kaeufer zur Zahlung des Kaufpreises.",
"clue": "Dieser Vertrag verpflichtet den Verkäufer zur Übergabe einer Sache und den Käufer zur Zahlung des Kaufpreises.",
"solution": "Kaufvertrag",
"distractors": [
"Werkvertrag",
@@ -3954,7 +3954,7 @@
},
{
"points": 100,
"clue": "Dieses Schutzrecht entsteht automatisch mit der Schoepfung eines Werkes und schützt geistiges Eigentum, etwa an Software oder Texten.",
"clue": "Dieses Schutzrecht entsteht automatisch mit der Schöpfung eines Werkes und schützt geistiges Eigentum, etwa an Software oder Texten.",
"solution": "Urheberrecht",
"distractors": [
"Patentrecht",
@@ -3976,14 +3976,14 @@
},
{
"points": 200,
"clue": "Dieses deutsche Gesetz konkretisiert und ergaenzt die DSGVO auf nationaler Ebene.",
"clue": "Dieses deutsche Gesetz konkretisiert und ergänzt die DSGVO auf nationaler Ebene.",
"solution": "BDSG",
"distractors": [
"DSGVO",
"TMG",
"GG"
],
"explanation": "Das Bundesdatenschutzgesetz (BDSG) ergaenzt die DSGVO in Deutschland."
"explanation": "Das Bundesdatenschutzgesetz (BDSG) ergänzt die DSGVO in Deutschland."
},
{
"points": 200,
@@ -4049,7 +4049,7 @@
"Kulanz",
"Haftpflicht"
],
"explanation": "Die Gewährleistung ist die gesetzliche Haftung für Sachmaengel."
"explanation": "Die Gewährleistung ist die gesetzliche Haftung für Sachmängel."
},
{
"points": 300,
@@ -4097,14 +4097,14 @@
},
{
"points": 300,
"clue": "Dieses Grundprinzip der DSGVO besagt, dass nur so viele Daten erhoben werden duerfen, wie für den Zweck erforderlich sind.",
"clue": "Dieses Grundprinzip der DSGVO besagt, dass nur so viele Daten erhoben werden dürfen, wie für den Zweck erforderlich sind.",
"solution": "Datenminimierung",
"distractors": [
"Zweckbindung",
"Transparenz",
"Speicherbegrenzung"
],
"explanation": "Die Datenminimierung verlangt, die Datenerhebung auf das Notwendige zu beschraenken."
"explanation": "Die Datenminimierung verlangt, die Datenerhebung auf das Notwendige zu beschränken."
},
{
"points": 300,
@@ -4131,17 +4131,17 @@
{
"points": 400,
"clue": "Diese Pflichtbewertung nach Art. 35 DSGVO ist bei Verarbeitungen mit voraussichtlich hohem Risiko für die Rechte Betroffener durchzuführen.",
"solution": "Datenschutz-Folgenabschaetzung",
"solution": "Datenschutz-Folgenabschätzung",
"distractors": [
"Auftragsverarbeitungsvertrag",
"Verfahrensverzeichnis",
"Risikoaudit"
],
"explanation": "Die Datenschutz-Folgenabschaetzung (DSFA) bewertet Risiken risikoreicher Verarbeitungen."
"explanation": "Die Datenschutz-Folgenabschätzung (DSFA) bewertet Risiken risikoreicher Verarbeitungen."
},
{
"points": 400,
"clue": "Diese Methode der Investitionsrechnung vergleicht alle Kosten einer Anlage über die Nutzungsdauer, ohne Erlöse zu beruecksichtigen.",
"clue": "Diese Methode der Investitionsrechnung vergleicht alle Kosten einer Anlage über die Nutzungsdauer, ohne Erlöse zu berücksichtigen.",
"solution": "Kostenvergleichsrechnung",
"distractors": [
"Gewinnvergleichsrechnung",
@@ -4159,14 +4159,14 @@
"Grenzkosten",
"Betriebsergebnis"
],
"explanation": "Der Deckungsbeitrag deckt die Fixkosten und traegt zum Gewinn bei."
"explanation": "Der Deckungsbeitrag deckt die Fixkosten und trägt zum Gewinn bei."
},
{
"points": 400,
"clue": "Dieses Verzeichnis nach Art. 30 DSGVO dokumentiert alle Verarbeitungstätigkeiten personenbezogener Daten im Unternehmen.",
"solution": "Verzeichnis von Verarbeitungstätigkeiten",
"distractors": [
"Datenschutz-Folgenabschaetzung",
"Datenschutz-Folgenabschätzung",
"Löschkonzept",
"Auftragsverarbeitungsvertrag"
],
@@ -4185,7 +4185,7 @@
},
{
"points": 400,
"clue": "Diese Kennzahl im Projektcontrolling vergleicht den Wert der geleisteten Arbeit mit den tatsaechlich angefallenen Kosten.",
"clue": "Diese Kennzahl im Projektcontrolling vergleicht den Wert der geleisteten Arbeit mit den tatsächlich angefallenen Kosten.",
"solution": "Cost Performance Index",
"distractors": [
"Schedule Performance Index",
@@ -4196,18 +4196,18 @@
},
{
"points": 400,
"clue": "Dieses Zerlegungsverfahren rechnet die Gemeinkosten über prozentuale Zuschlaege auf die Einzelkosten der Kostentraeger um.",
"clue": "Dieses Zerlegungsverfahren rechnet die Gemeinkosten über prozentuale Zuschläge auf die Einzelkosten der Kostenträger um.",
"solution": "Zuschlagskalkulation",
"distractors": [
"Divisionskalkulation",
"Maschinenstundensatzrechnung",
"Äquivalenzziffernkalkulation"
],
"explanation": "Die Zuschlagskalkulation verteilt Gemeinkosten über Zuschlagssaetze auf die Einzelkosten."
"explanation": "Die Zuschlagskalkulation verteilt Gemeinkosten über Zuschlagssätze auf die Einzelkosten."
},
{
"points": 500,
"clue": "Diese dynamische Investitionsrechnung diskontiert kuenftige Zahlungsströme auf den Gegenwartswert und bewertet die Vorteilhaftigkeit über das Vorzeichen des Ergebnisses.",
"clue": "Diese dynamische Investitionsrechnung diskontiert künftige Zahlungsströme auf den Gegenwartswert und bewertet die Vorteilhaftigkeit über das Vorzeichen des Ergebnisses.",
"solution": "Kapitalwertmethode",
"distractors": [
"Annuitätenmethode",
@@ -4240,18 +4240,18 @@
},
{
"points": 500,
"clue": "Diese permissive Lizenz erlaubt nahezu uneingeschraenkte Weiterverwendung von Code, auch in proprietaeren Produkten, und enthält eine ausdrückliche Patentklausel.",
"clue": "Diese permissive Lizenz erlaubt nahezu uneingeschränkte Weiterverwendung von Code, auch in proprietären Produkten, und enthält eine ausdrückliche Patentklausel.",
"solution": "Apache-Lizenz",
"distractors": [
"GPL",
"MIT-Lizenz",
"LGPL"
],
"explanation": "Die Apache-Lizenz 2.0 ist permissiv und gewährt zusaetzlich Patentrechte."
"explanation": "Die Apache-Lizenz 2.0 ist permissiv und gewährt zusätzlich Patentrechte."
},
{
"points": 500,
"clue": "Dieser Kalkulationssatz verrechnet die fixen und variablen Kosten eines Fertigungsmittels pro Betriebsstunde auf die Kostentraeger.",
"clue": "Dieser Kalkulationssatz verrechnet die fixen und variablen Kosten eines Fertigungsmittels pro Betriebsstunde auf die Kostenträger.",
"solution": "Maschinenstundensatz",
"distractors": [
"Lohnstundensatz",
@@ -4273,14 +4273,14 @@
},
{
"points": 500,
"clue": "Dieser ergonomische Grenzwert nach Arbeitsstaettenrecht beschreibt die maximal zulaessige Beleuchtungsstärke-Untergrenze in Lux für Bueroarbeitsplaetze mit Bildschirmarbeit.",
"clue": "Dieser ergonomische Grenzwert nach Arbeitsstättenrecht beschreibt die maximal zulässige Beleuchtungsstärke-Untergrenze in Lux für Büroarbeitsplätze mit Bildschirmarbeit.",
"solution": "500 Lux",
"distractors": [
"100 Lux",
"1000 Lux",
"250 Lux"
],
"explanation": "Für Bildschirmarbeitsplaetze werden mindestens 500 Lux Beleuchtungsstärke gefordert."
"explanation": "Für Bildschirmarbeitsplätze werden mindestens 500 Lux Beleuchtungsstärke gefordert."
}
]
}
-46
View File
@@ -1,46 +0,0 @@
<!DOCTYPE html>
<html lang="de" data-theme="dark" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SysnaptiK Neural – In Arbeit</title>
<link rel="stylesheet" href="/css/theme.css?v=3">
<script src="/js/theme.js?v=4"></script>
<style>
.mf-cardbox { max-width:560px; text-align:center; }
.mf-cardbox h1 { color:var(--heading); font-size:1.5rem; font-weight:800; margin-bottom:.5rem; }
.mf-cardbox .slogan { color:var(--muted); font-size:.95rem; margin-bottom:1.6rem; }
.mf-cardbox .quote { color:var(--accent); font-size:1.05rem; line-height:1.6; font-style:italic;
border-left:3px solid var(--border-accent); background:var(--surface-2); padding:1rem 1.2rem;
border-radius:10px; text-align:left; margin-bottom:1.6rem; }
.mf-cardbox .mf-back { display:inline-block; }
</style>
</head>
<body>
<div class="mf-theme-float"><button class="mf-theme"></button></div>
<div class="mf-center">
<div class="mf-cardbox">
<h1>Bereich in Vorbereitung</h1>
<p class="slogan">Hier entsteht ein weiterer Knoten für dein Lernnetz.</p>
<p class="quote">
"Dieser Bereich wird gerade für dein Lernnetz vorbereitet."
</p>
<a th:href="@{/dashboard}" class="mf-back">⟵ Zurück zum Dashboard</a>
</div>
</div>
<footer class="mf-footer">
<a href="#">Support</a>
<a href="#">Feedback</a>
<a href="/nutzungsbedingungen">Nutzungsbedingungen</a>
<a href="/richtlinien">Richtlinien</a>
<a href="/datenschutz">Datenschutz</a>
<a href="/impressum">Impressum</a>
</footer>
</body>
</html>
+7 -6
View File
@@ -2,7 +2,7 @@
<html lang="de" data-theme="dark">
<head>
<meta charset="UTF-8">
<title>FinalProtocol AP1 - SysnaptiK Neural</title>
<title>FinalProtocol - SysnaptiK Neural</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/css/theme.css?v=3">
@@ -73,12 +73,13 @@
<main class="finalflux-main">
<section class="finalflux-hero">
<p class="eyebrow">Abschlussprüfung Teil 1</p>
<h2>Einrichten eines IT-gestützten Arbeitsplatzes</h2>
<p class="eyebrow">Abschlussprüfung Teil 1 &amp; Teil 2</p>
<h2>Die gesamte Fachinformatiker-Prüfung im Blick</h2>
<p>
FinalProtocol bündelt AP1-Wissen für IT-Berufe: technische Grundlagen,
Arbeitsplatzanalyse, Netzwerke, Datenschutz, Beschaffung und einfache
Rechen- sowie Entscheidungssituationen.
FinalProtocol bündelt AP1 <strong>und</strong> AP2: Von den Grundlagen
(Einrichten eines IT-gestützten Arbeitsplatzes, Netzwerke, Datenschutz,
Wirtschaft) bis zu den fachrichtungsspezifischen Themen der AP2 –
Systemintegration (FISI) und Anwendungsentwicklung (FIAE).
</p>
</section>
+1 -1
View File
@@ -6,7 +6,7 @@
<title>Fortschritt – SysnaptiK Neural</title>
<link rel="stylesheet" href="/css/theme.css?v=3">
<script src="/js/theme.js?v=4"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="/js/vendor/chart.umd.min.js?v=4.4.7"></script>
<style>
.mf-progress-summary { display:flex; flex-wrap:wrap; align-items:center; gap:2rem; }
.mf-circular { position:relative; width:180px; height:180px; flex:0 0 auto; }