Mindflux: Sicherheit, Datenintegrität und Navigation härten
This commit is contained in:
@@ -203,3 +203,9 @@ body.mf-nav-open .mf-nav-backdrop { opacity:1; pointer-events:auto; }
|
||||
}
|
||||
|
||||
@media (max-width:560px){ .mf-grid{grid-template-columns:1fr;} }
|
||||
|
||||
/* ===== Profilbereich: Tab-Navigation (Fragment fragments/layout :: profileTabs) ===== */
|
||||
.mf-tab-nav { display:flex; flex-wrap:wrap; gap:.4rem; margin-bottom:1.4rem; }
|
||||
.mf-tab { padding:.55rem .95rem; border-radius:10px; border:1px solid var(--border); color:var(--muted); text-decoration:none; font-size:.85rem; font-weight:700; transition:all .18s ease; }
|
||||
.mf-tab:hover { color:var(--text); background:var(--surface-2); }
|
||||
.mf-tab.active { color:var(--accent-ink); background:linear-gradient(100deg,var(--accent),var(--accent-2)); box-shadow:0 0 18px var(--glow-s); border-color:transparent; }
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Entwurfsmuster - FinalFlux AP2</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">
|
||||
<link rel="stylesheet" href="/css/finalflux.css">
|
||||
<script src="/js/theme.js"></script>
|
||||
</head>
|
||||
<body class="finalflux-page">
|
||||
<div class="mf-theme-float"><button class="mf-theme"></button></div>
|
||||
<main>
|
||||
<a href="/finalflux" class="back-link">Zurück zu FinalFlux</a>
|
||||
<h1>Entwurfsmuster (Design Patterns)</h1>
|
||||
|
||||
<section>
|
||||
<h2>Lernfokus</h2>
|
||||
<p>AP2 Anwendungsentwicklung: die prüfungsrelevanten Entwurfsmuster erkennen, erklären und dem richtigen Problem zuordnen.</p>
|
||||
<ul class="key-list">
|
||||
<li>Zweck von Entwurfsmustern erklären.</li>
|
||||
<li>Singleton, Factory und Observer unterscheiden.</li>
|
||||
<li>MVC-Schichten und ihre Aufgaben zuordnen.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Was sind Entwurfsmuster?</h2>
|
||||
<p>Entwurfsmuster sind bewährte, wiederverwendbare Lösungsschablonen für häufige Probleme im Software-Design. Sie sind kein fertiger Code, sondern beschreiben eine Struktur aus Klassen und deren Zusammenspiel. In der AP2 wird typischerweise verlangt, ein Muster zu benennen, seinen Zweck zu erklären oder es in einem UML-Diagramm wiederzuerkennen.</p>
|
||||
<p class="merksatz"><strong>Merksatz:</strong> Ein Entwurfsmuster ist eine Schablone für ein Entwurfsproblem – nicht der Code selbst.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Singleton</h2>
|
||||
<p>Stellt sicher, dass von einer Klasse <strong>genau eine Instanz</strong> existiert, und bietet einen globalen Zugriffspunkt darauf. Typische Einsätze: Konfiguration, Logger, Verbindungs-Pools.</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>Privater Konstruktor:</strong> verhindert Instanziierung von außen.</li>
|
||||
<li><strong>Statische Zugriffsmethode</strong> (z. B. <code>getInstance()</code>) liefert immer dieselbe Instanz.</li>
|
||||
<li><strong>Kritik:</strong> globaler Zustand erschwert Tests – in der Prüfung als Nachteil nennen können.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Factory (Fabrikmethode)</h2>
|
||||
<p>Kapselt die Objekterzeugung: Der aufrufende Code kennt nur das Interface, die Fabrik entscheidet, welche konkrete Klasse instanziiert wird. So lassen sich neue Varianten ergänzen, ohne den Client-Code zu ändern (Offen-Geschlossen-Prinzip).</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>Problem:</strong> <code>new KonkreteKlasse()</code> überall verstreut macht Änderungen teuer.</li>
|
||||
<li><strong>Lösung:</strong> zentrale Erzeugungsmethode, die das passende Objekt liefert.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Observer (Beobachter)</h2>
|
||||
<p>Ein Subjekt hält eine Liste von Beobachtern und benachrichtigt sie automatisch bei Zustandsänderungen (1:n-Abhängigkeit). Grundlage vieler GUI- und Event-Systeme.</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>Subjekt:</strong> <code>anmelden()</code>, <code>abmelden()</code>, <code>benachrichtigen()</code>.</li>
|
||||
<li><strong>Beobachter:</strong> gemeinsames Interface mit <code>aktualisiere()</code>.</li>
|
||||
<li><strong>Vorteil:</strong> lose Kopplung – das Subjekt kennt nur das Interface.</li>
|
||||
</ul>
|
||||
<p class="merksatz"><strong>Merksatz:</strong> Observer = abonnieren und benachrichtigt werden, statt ständig nachzufragen (Polling).</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>MVC (Model-View-Controller)</h2>
|
||||
<p>Architektur-Muster, das eine Anwendung in drei Verantwortlichkeiten trennt. In der AP2 häufig als Zuordnungsaufgabe gefragt.</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>Model:</strong> Daten und Geschäftslogik – unabhängig von der Darstellung.</li>
|
||||
<li><strong>View:</strong> Präsentation der Daten für den Benutzer.</li>
|
||||
<li><strong>Controller:</strong> nimmt Eingaben entgegen, ruft das Model auf, wählt die View.</li>
|
||||
</ul>
|
||||
<p>Vorteile: getrennte Zuständigkeiten, parallele Entwicklung, bessere Testbarkeit, austauschbare Oberflächen.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Prüfungsmodus</h2>
|
||||
<p>Dieser FluxCheck führt dich durch die wichtigsten AP2-Aspekte dieses Themas. Du kannst Antworten prüfen, Fragen überspringen und bekommst am Ende eine Auswertung nach Kategorie.</p>
|
||||
</section>
|
||||
|
||||
<section class="finalflux-test" data-finalflux-test aria-live="polite">
|
||||
<div class="test-meta">
|
||||
<span data-question-counter>Frage 1</span>
|
||||
<span data-score-counter>0 richtig</span>
|
||||
</div>
|
||||
<div class="category-block">
|
||||
<p class="eyebrow">Kategorie</p>
|
||||
<h2 data-category-title>Entwurfsmuster</h2>
|
||||
<p data-category-hint>AP2-Training</p>
|
||||
</div>
|
||||
<div class="question-card">
|
||||
<h3 data-question-text></h3>
|
||||
<div data-answer-options class="answer-options"></div>
|
||||
<div data-answer-feedback class="fluxcheck-result"></div>
|
||||
</div>
|
||||
<div class="test-actions">
|
||||
<button type="button" data-check-answer>Antwort prüfen</button>
|
||||
<button type="button" data-skip-question class="secondary">Überspringen</button>
|
||||
<button type="button" data-next-question class="secondary" disabled>Weiter</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section data-test-result class="finalflux-panel" hidden>
|
||||
<h2>Auswertung</h2>
|
||||
<p data-result-summary></p>
|
||||
<ul data-category-summary class="key-list"></ul>
|
||||
<div class="finalflux-actions">
|
||||
<button type="button" data-restart-test>Test neu starten</button>
|
||||
<a href="/finalflux">Zurück zur Übersicht</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<script src="/js/finalflux-test.js" data-questions-src="/finalflux/questions/ap2_fiae_entwurfsmuster.json" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,101 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de" data-theme="dark">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Hochverfügbarkeit - FinalFlux AP2</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">
|
||||
<link rel="stylesheet" href="/css/finalflux.css">
|
||||
<script src="/js/theme.js"></script>
|
||||
</head>
|
||||
<body class="finalflux-page">
|
||||
<div class="mf-theme-float"><button class="mf-theme"></button></div>
|
||||
<main>
|
||||
<a href="/finalflux" class="back-link">Zurück zu FinalFlux</a>
|
||||
<h1>Hochverfügbarkeit (HA)</h1>
|
||||
|
||||
<section>
|
||||
<h2>Lernfokus</h2>
|
||||
<p>AP2 Systemintegration: Verfügbarkeit berechnen, Redundanzkonzepte unterscheiden und RTO/RPO sicher einordnen.</p>
|
||||
<ul class="key-list">
|
||||
<li>Verfügbarkeit in Prozent und Ausfallzeit umrechnen.</li>
|
||||
<li>Redundanzkonzepte (RAID, Cluster, USV, Netzteil) einordnen.</li>
|
||||
<li>RTO und RPO unterscheiden.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Was bedeutet Hochverfügbarkeit?</h2>
|
||||
<p>Hochverfügbarkeit beschreibt die Fähigkeit eines Systems, trotz Ausfällen einzelner Komponenten weiterzulaufen. Die Verfügbarkeit wird in Prozent der Betriebszeit angegeben – die bekannten „Neunen": 99 % bedeuten rund 3,65 Tage Ausfall pro Jahr, 99,9 % rund 8,76 Stunden, 99,99 % rund 53 Minuten.</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>Formel:</strong> Verfügbarkeit = (Gesamtzeit − Ausfallzeit) / Gesamtzeit × 100 %.</li>
|
||||
<li><strong>SPOF (Single Point of Failure):</strong> jede Komponente, deren Ausfall das Gesamtsystem stoppt – Ziel ist, SPOFs durch Redundanz zu eliminieren.</li>
|
||||
<li><strong>MTBF/MTTR:</strong> mittlere Zeit zwischen Ausfällen bzw. mittlere Reparaturzeit.</li>
|
||||
</ul>
|
||||
<p class="merksatz"><strong>Merksatz:</strong> Jede zusätzliche „Neun" kostet überproportional mehr – Verfügbarkeit ist immer eine Kosten-Nutzen-Abwägung.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Redundanzkonzepte</h2>
|
||||
<p>Redundanz bedeutet, kritische Komponenten mehrfach auszulegen, damit der Ausfall einer Komponente abgefangen wird.</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>RAID:</strong> schützt gegen Ausfall einzelner Festplatten – <em>ersetzt aber kein Backup</em> (gelöschte Daten sind auf allen Platten gelöscht).</li>
|
||||
<li><strong>Cluster (Failover):</strong> zweiter Server übernimmt automatisch, wenn der aktive ausfällt (aktiv/passiv) oder Last wird verteilt (aktiv/aktiv).</li>
|
||||
<li><strong>USV:</strong> überbrückt Stromausfälle und ermöglicht geordnetes Herunterfahren.</li>
|
||||
<li><strong>Redundante Netzteile/Netzwerkpfade:</strong> doppelte Stromversorgung, zwei Switches/Uplinks gegen SPOFs im Netz.</li>
|
||||
<li><strong>Georedundanz:</strong> zweiter Standort gegen Standortausfall (Brand, Hochwasser).</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>RTO und RPO</h2>
|
||||
<p>Zwei Kennzahlen aus der Notfallplanung, die in der AP2 gern verwechselt werden:</p>
|
||||
<ul class="key-list">
|
||||
<li><strong>RTO (Recovery Time Objective):</strong> Wie lange darf die Wiederherstellung maximal dauern? → maximale Ausfall<em>zeit</em>.</li>
|
||||
<li><strong>RPO (Recovery Point Objective):</strong> Wie viele Daten dürfen maximal verloren gehen? → maximaler Daten<em>verlust</em>, bestimmt die Backup-Frequenz.</li>
|
||||
</ul>
|
||||
<p class="merksatz"><strong>Merksatz:</strong> RTO = Zeit bis alles wieder läuft, RPO = Zeitraum an Daten, der fehlen darf.</p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Prüfungsmodus</h2>
|
||||
<p>Dieser FluxCheck führt dich durch die wichtigsten AP2-Aspekte dieses Themas. Du kannst Antworten prüfen, Fragen überspringen und bekommst am Ende eine Auswertung nach Kategorie.</p>
|
||||
</section>
|
||||
|
||||
<section class="finalflux-test" data-finalflux-test aria-live="polite">
|
||||
<div class="test-meta">
|
||||
<span data-question-counter>Frage 1</span>
|
||||
<span data-score-counter>0 richtig</span>
|
||||
</div>
|
||||
<div class="category-block">
|
||||
<p class="eyebrow">Kategorie</p>
|
||||
<h2 data-category-title>Hochverfügbarkeit</h2>
|
||||
<p data-category-hint>AP2-Training</p>
|
||||
</div>
|
||||
<div class="question-card">
|
||||
<h3 data-question-text></h3>
|
||||
<div data-answer-options class="answer-options"></div>
|
||||
<div data-answer-feedback class="fluxcheck-result"></div>
|
||||
</div>
|
||||
<div class="test-actions">
|
||||
<button type="button" data-check-answer>Antwort prüfen</button>
|
||||
<button type="button" data-skip-question class="secondary">Überspringen</button>
|
||||
<button type="button" data-next-question class="secondary" disabled>Weiter</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section data-test-result class="finalflux-panel" hidden>
|
||||
<h2>Auswertung</h2>
|
||||
<p data-result-summary></p>
|
||||
<ul data-category-summary class="key-list"></ul>
|
||||
<div class="finalflux-actions">
|
||||
<button type="button" data-restart-test>Test neu starten</button>
|
||||
<a href="/finalflux">Zurück zur Übersicht</a>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<script src="/js/finalflux-test.js" data-questions-src="/finalflux/questions/ap2_fisi_hochverfuegbarkeit.json" defer></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"title": "Entwurfsmuster",
|
||||
"questions": [
|
||||
{
|
||||
"category": "Grundlagen",
|
||||
"hint": "Zweck von Entwurfsmustern.",
|
||||
"text": "Was ist ein Entwurfsmuster?",
|
||||
"answers": [
|
||||
"Eine bewährte, wiederverwendbare Lösungsschablone für ein häufiges Entwurfsproblem.",
|
||||
"Eine fertige Code-Bibliothek, die direkt eingebunden wird.",
|
||||
"Ein Werkzeug zur automatischen Codegenerierung aus UML-Diagrammen."
|
||||
],
|
||||
"correct": 0,
|
||||
"explanation": "Ein Entwurfsmuster beschreibt eine Struktur und ihr Zusammenspiel – es ist kein fertiger Code, sondern eine Schablone."
|
||||
},
|
||||
{
|
||||
"category": "Singleton",
|
||||
"hint": "Genau eine Instanz.",
|
||||
"text": "Welches Merkmal gehört zwingend zum Singleton-Muster?",
|
||||
"answers": [
|
||||
"Ein öffentlicher Konstruktor, damit jede Klasse Instanzen erzeugen kann.",
|
||||
"Ein privater Konstruktor und eine statische Zugriffsmethode auf die einzige Instanz.",
|
||||
"Eine Liste von Beobachtern, die bei Änderungen benachrichtigt werden."
|
||||
],
|
||||
"correct": 1,
|
||||
"explanation": "Der private Konstruktor verhindert Fremd-Instanziierung; getInstance() liefert immer dieselbe Instanz."
|
||||
},
|
||||
{
|
||||
"category": "Factory",
|
||||
"hint": "Objekterzeugung kapseln.",
|
||||
"text": "Welches Problem löst die Fabrikmethode (Factory)?",
|
||||
"answers": [
|
||||
"Sie sorgt dafür, dass Objekte automatisch gelöscht werden.",
|
||||
"Sie verschlüsselt die Kommunikation zwischen Objekten.",
|
||||
"Sie kapselt die Objekterzeugung, sodass der Client nur das Interface kennt."
|
||||
],
|
||||
"correct": 2,
|
||||
"explanation": "Die Fabrik entscheidet, welche konkrete Klasse instanziiert wird – neue Varianten erfordern keine Änderung im Client-Code."
|
||||
},
|
||||
{
|
||||
"category": "Observer",
|
||||
"hint": "1:n-Abhängigkeit.",
|
||||
"text": "Wann ist das Observer-Muster die richtige Wahl?",
|
||||
"answers": [
|
||||
"Wenn mehrere Objekte automatisch über Zustandsänderungen eines Objekts informiert werden sollen.",
|
||||
"Wenn von einer Klasse nur eine einzige Instanz existieren darf.",
|
||||
"Wenn die Erzeugung von Objekten zentralisiert werden soll."
|
||||
],
|
||||
"correct": 0,
|
||||
"explanation": "Das Subjekt benachrichtigt alle angemeldeten Beobachter – lose gekoppelt über ein gemeinsames Interface."
|
||||
},
|
||||
{
|
||||
"category": "MVC",
|
||||
"hint": "Drei Verantwortlichkeiten.",
|
||||
"text": "Welche Aufgabe hat der Controller im MVC-Muster?",
|
||||
"answers": [
|
||||
"Er speichert die Daten und enthält die Geschäftslogik.",
|
||||
"Er nimmt Benutzereingaben entgegen, ruft das Model auf und wählt die View.",
|
||||
"Er stellt die Daten grafisch für den Benutzer dar."
|
||||
],
|
||||
"correct": 1,
|
||||
"explanation": "Model = Daten/Logik, View = Darstellung, Controller = Vermittler zwischen Eingabe, Model und View."
|
||||
},
|
||||
{
|
||||
"category": "MVC",
|
||||
"hint": "Vorteile der Trennung.",
|
||||
"text": "Welcher Vorteil ergibt sich direkt aus der MVC-Trennung?",
|
||||
"answers": [
|
||||
"Die Anwendung benötigt keine Datenbank mehr.",
|
||||
"Der Quellcode wird automatisch schneller ausgeführt.",
|
||||
"Oberfläche und Logik sind getrennt test- und austauschbar."
|
||||
],
|
||||
"correct": 2,
|
||||
"explanation": "Durch die Trennung der Schichten lassen sich Views austauschen und Model-Logik isoliert testen."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"title": "Hochverfügbarkeit",
|
||||
"questions": [
|
||||
{
|
||||
"category": "Grundlagen",
|
||||
"hint": "Die Neunen kennen.",
|
||||
"text": "Ein System hat eine Verfügbarkeit von 99,9 % pro Jahr. Wie viel Ausfallzeit entspricht das ungefähr?",
|
||||
"answers": [
|
||||
"Rund 8,8 Stunden pro Jahr.",
|
||||
"Rund 3,65 Tage pro Jahr.",
|
||||
"Rund 53 Minuten pro Jahr."
|
||||
],
|
||||
"correct": 0,
|
||||
"explanation": "0,1 % von 8760 Stunden sind rund 8,76 Stunden. 3,65 Tage gehören zu 99 %, 53 Minuten zu 99,99 %."
|
||||
},
|
||||
{
|
||||
"category": "Grundlagen",
|
||||
"hint": "Kritische Einzelkomponenten.",
|
||||
"text": "Was ist ein Single Point of Failure (SPOF)?",
|
||||
"answers": [
|
||||
"Eine Komponente, die doppelt ausgelegt ist und darum nie ausfällt.",
|
||||
"Eine Komponente, deren Ausfall das gesamte System zum Stillstand bringt.",
|
||||
"Der zentrale Monitoring-Server eines Rechenzentrums."
|
||||
],
|
||||
"correct": 1,
|
||||
"explanation": "Ein SPOF ist jede nicht redundante Komponente, an der das Gesamtsystem hängt – Ziel ist, SPOFs durch Redundanz zu eliminieren."
|
||||
},
|
||||
{
|
||||
"category": "Redundanz",
|
||||
"hint": "RAID richtig einordnen.",
|
||||
"text": "Warum ersetzt ein RAID kein Backup?",
|
||||
"answers": [
|
||||
"Weil RAID nur bei SSDs funktioniert, Backups aber auf Festplatten liegen.",
|
||||
"Weil RAID die Daten komprimiert und dadurch Datenverlust entsteht.",
|
||||
"Weil versehentlich gelöschte oder verschlüsselte Daten sofort auf allen Platten betroffen sind."
|
||||
],
|
||||
"correct": 2,
|
||||
"explanation": "RAID schützt gegen Hardware-Ausfall einzelner Platten. Logische Fehler (Löschen, Ransomware) treffen alle Kopien gleichzeitig – dagegen hilft nur ein Backup."
|
||||
},
|
||||
{
|
||||
"category": "Redundanz",
|
||||
"hint": "Cluster-Betriebsarten.",
|
||||
"text": "Was kennzeichnet einen Aktiv/Passiv-Failover-Cluster?",
|
||||
"answers": [
|
||||
"Ein Standby-Server übernimmt automatisch, wenn der aktive Server ausfällt.",
|
||||
"Beide Server bearbeiten dauerhaft gemeinsam die Last.",
|
||||
"Die Server sichern sich gegenseitig täglich per Backup."
|
||||
],
|
||||
"correct": 0,
|
||||
"explanation": "Beim Aktiv/Passiv-Cluster steht der zweite Knoten bereit und übernimmt beim Ausfall (Failover). Aktiv/Aktiv verteilt dagegen die Last auf beide."
|
||||
},
|
||||
{
|
||||
"category": "RTO & RPO",
|
||||
"hint": "Zeit vs. Datenverlust.",
|
||||
"text": "Welche Aussage zu RTO und RPO ist korrekt?",
|
||||
"answers": [
|
||||
"RTO begrenzt den maximalen Datenverlust, RPO die Wiederherstellungszeit.",
|
||||
"RTO begrenzt die maximale Wiederherstellungszeit, RPO den maximalen Datenverlust.",
|
||||
"RTO und RPO bezeichnen dasselbe und sind austauschbar."
|
||||
],
|
||||
"correct": 1,
|
||||
"explanation": "RTO = wie lange darf die Wiederherstellung dauern; RPO = wie alt darf der letzte Datenstand sein (bestimmt die Backup-Frequenz)."
|
||||
},
|
||||
{
|
||||
"category": "RTO & RPO",
|
||||
"hint": "Backup-Frequenz ableiten.",
|
||||
"text": "Ein Unternehmen definiert einen RPO von 1 Stunde. Was folgt daraus?",
|
||||
"answers": [
|
||||
"Das System muss nach einem Ausfall innerhalb 1 Stunde wieder laufen.",
|
||||
"Die USV muss das System mindestens 1 Stunde überbrücken.",
|
||||
"Die Daten müssen mindestens stündlich gesichert bzw. repliziert werden."
|
||||
],
|
||||
"correct": 2,
|
||||
"explanation": "Der RPO begrenzt den maximal tolerierten Datenverlust – bei 1 Stunde RPO darf der letzte Sicherungsstand höchstens 1 Stunde alt sein."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -21,7 +21,18 @@
|
||||
try { localStorage.setItem(KEY, next); } catch (e) {}
|
||||
paint();
|
||||
}
|
||||
window.MindfluxTheme = { toggle: toggle, apply: apply };
|
||||
function set(mode) {
|
||||
var next = mode === 'light' ? 'light' : 'dark';
|
||||
apply(next);
|
||||
try { localStorage.setItem(KEY, next); } catch (e) {}
|
||||
paint();
|
||||
}
|
||||
window.MindfluxTheme = {
|
||||
toggle: toggle,
|
||||
apply: apply,
|
||||
set: set,
|
||||
current: function () { return document.documentElement.getAttribute('data-theme'); }
|
||||
};
|
||||
|
||||
// Mobile-Nav: Off-Canvas-Drawer für Seiten mit App-Sidebar (.mf-shell)
|
||||
function initMobileNav() {
|
||||
|
||||
Reference in New Issue
Block a user