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:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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)",
|
||||
|
||||
@@ -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 +0,0 @@
|
||||
It works!
|
||||
@@ -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
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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 & 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>
|
||||
|
||||
|
||||
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user