diff --git a/assets/course_sidebar.js b/assets/course_sidebar.js new file mode 100644 index 0000000..08f7176 --- /dev/null +++ b/assets/course_sidebar.js @@ -0,0 +1,383 @@ +/** + * 🧭 DYNAMIC COURSE SIDEBAR & RESPONSIVE DRAWER SYSTEM 🧭 + * ======================================================= + * IT-Praxisportal – Vollständig responsive Kurs-Sidebar für alle 13 Kurse & Web-IDE. + */ + +(function () { + 'use strict'; + + function getRootPrefix() { + const scripts = document.querySelectorAll('script[src*="course_sidebar.js"]'); + if (scripts.length > 0) { + const src = scripts[scripts.length - 1].getAttribute('src'); + const idx = src.indexOf('assets/course_sidebar.js'); + if (idx !== -1) { + return src.substring(0, idx); + } + } + const p = window.location.pathname; + if (p.includes('/courses/')) return '../../../'; + if (p.includes('/lehrpfad_')) return '../../'; + return ''; + } + + function detectContext() { + const isWorkspace = window.location.pathname.endsWith('workspace.html') || !!document.querySelector('.workspace-topbar'); + const urlParams = new URLSearchParams(window.location.search); + + if (isWorkspace) { + return { + isWorkspace: true, + courseId: urlParams.get('course') || 'python', + trackId: urlParams.get('track') || '', + chapterFolder: urlParams.get('chapter') || '' + }; + } + + const path = window.location.pathname; + const courseMatch = path.match(/courses\/([^\/]+)\/([^\/]+)/); + if (courseMatch) { + return { + isWorkspace: false, + courseId: courseMatch[1], + chapterFolder: courseMatch[2], + trackId: '' + }; + } + + const pythonMatch = path.match(/(lehrpfad_[^\/]+)\/([^\/]+)/); + if (pythonMatch) { + return { + isWorkspace: false, + courseId: 'python', + trackId: pythonMatch[1], + chapterFolder: pythonMatch[2] + }; + } + + return { + isWorkspace: false, + courseId: 'python', + chapterFolder: '', + trackId: '' + }; + } + + function getSolvedChapters() { + const solved = new Set(); + try { + const stateStr = localStorage.getItem('python_gamification_state'); + if (stateStr) { + const s = JSON.parse(stateStr); + if (Array.isArray(s.geloeste_kapitel)) { + s.geloeste_kapitel.forEach(id => solved.add(id)); + } + } + const progStr = localStorage.getItem('python_gamification_progress'); + if (progStr) { + const p = JSON.parse(progStr); + if (Array.isArray(p.geloeste_kapitel)) { + p.geloeste_kapitel.forEach(id => solved.add(id)); + } + } + } catch (e) { + console.warn('Lernfortschritt konnte nicht geladen werden:', e); + } + return solved; + } + + function initSidebar() { + const rootPrefix = getRootPrefix(); + + if (!window.COURSES_MANIFEST) { + const manifestScript = document.createElement('script'); + manifestScript.src = `${rootPrefix}assets/courses_manifest.js`; + manifestScript.onload = () => buildSidebar(); + manifestScript.onerror = () => console.error('Konnte courses_manifest.js nicht laden.'); + document.head.appendChild(manifestScript); + } else { + buildSidebar(); + } + } + + function buildSidebar() { + if (!window.COURSES_MANIFEST) return; + + // Alte legacy sidebars entfernen falls vorhanden + document.querySelectorAll('.app-sidebar, .sidebar-mobile-toggle, .sidebar-overlay').forEach(el => el.remove()); + const existingSidebar = document.getElementById('courseSidebar'); + if (existingSidebar) existingSidebar.remove(); + const existingBackdrop = document.getElementById('courseSidebarBackdrop'); + if (existingBackdrop) existingBackdrop.remove(); + const existingMobileBtn = document.getElementById('courseSidebarMobileToggle'); + if (existingMobileBtn) existingMobileBtn.remove(); + + const rootPrefix = getRootPrefix(); + const context = detectContext(); + const manifest = window.COURSES_MANIFEST; + const currentCourse = manifest[context.courseId] || manifest['python']; + if (!currentCourse) return; + + const solvedSet = getSolvedChapters(); + + if (!context.chapterFolder && currentCourse.tracks && currentCourse.tracks[0] && currentCourse.tracks[0].chapters && currentCourse.tracks[0].chapters[0]) { + context.chapterFolder = currentCourse.tracks[0].chapters[0].folder; + if (!currentTrackId) currentTrackId = currentCourse.tracks[0].id; + } + + // Zähle Kapitel & gelöste Aufgaben für den aktiven Kurs + let totalChapters = 0; + let solvedCount = 0; + let currentTrackId = context.trackId || ''; + + (currentCourse.tracks || []).forEach(tr => { + (tr.chapters || []).forEach(ch => { + totalChapters++; + const isSolved = solvedSet.has(ch.folder) || + solvedSet.has(`${context.courseId}/${ch.folder}`) || + solvedSet.has(`${tr.id}/${ch.folder}`); + if (isSolved) solvedCount++; + if (ch.folder === context.chapterFolder && !currentTrackId) { + currentTrackId = tr.id; + } + }); + }); + + const percent = totalChapters > 0 ? Math.round((solvedCount / totalChapters) * 100) : 0; + + if (context.isWorkspace) { + document.body.classList.add('workspace-page'); + } else { + document.body.classList.add('has-course-sidebar'); + } + + // Erstelle Sidebar Container + const sidebar = document.createElement('aside'); + sidebar.className = 'course-sidebar'; + sidebar.id = 'courseSidebar'; + + // Header mit Branding, Close-Button & Dropdown + let courseOptionsHtml = ''; + const courseKeys = Object.keys(manifest); + courseKeys.forEach(cid => { + const c = manifest[cid]; + const selected = cid === context.courseId ? 'selected' : ''; + const icon = c.icon || '📚'; + courseOptionsHtml += ``; + }); + + // Navigation Tracks & Chapters generieren + let navHtml = ''; + (currentCourse.tracks || []).forEach((tr) => { + navHtml += `
`; + navHtml += `
${tr.title}
`; + navHtml += `
`; + + (tr.chapters || []).forEach((ch) => { + const isActive = (ch.folder === context.chapterFolder); + const isSolved = solvedSet.has(ch.folder) || + solvedSet.has(`${context.courseId}/${ch.folder}`) || + solvedSet.has(`${tr.id}/${ch.folder}`); + + let linkUrl = ''; + if (context.isWorkspace) { + linkUrl = `${rootPrefix}workspace.html?course=${context.courseId}&track=${tr.id}&chapter=${ch.folder}`; + } else { + if (context.courseId === 'python') { + linkUrl = `${rootPrefix}${tr.id}/${ch.folder}/index.html`; + } else { + linkUrl = `${rootPrefix}courses/${context.courseId}/${ch.folder}/index.html`; + } + } + + let statusIconHtml = ''; + if (isSolved) { + statusIconHtml = `✓`; + } else if (isActive) { + statusIconHtml = `●`; + } else { + statusIconHtml = ``; + } + + navHtml += ` + + ${statusIconHtml} + ${ch.title} + + `; + }); + + navHtml += `
`; + }); + + // Footer Action (Theorie lesen vs. Web-IDE) + let footerActionHtml = ''; + if (context.isWorkspace) { + let theoryUrl = ''; + if (context.courseId === 'python') { + theoryUrl = `${rootPrefix}${currentTrackId || 'lehrpfad_1_grundlagen'}/${context.chapterFolder}/index.html`; + } else { + theoryUrl = `${rootPrefix}courses/${context.courseId}/${context.chapterFolder}/index.html`; + } + footerActionHtml = ` + + 📖 Theorie lesen + + `; + } else { + const ideUrl = `${rootPrefix}workspace.html?course=${context.courseId}&track=${currentTrackId}&chapter=${context.chapterFolder}`; + footerActionHtml = ` + + 💻 Web-IDE + + `; + } + + sidebar.innerHTML = ` +
+
+ + +
+
IT-Praxisportal
+
PRO LERNPFAD
+
+
+ +
+ + + + +
+
+ Kursfortschritt + ${solvedCount} / ${totalChapters} (${percent}%) +
+
+
+
+
+
+ + + + + `; + + document.body.appendChild(sidebar); + + // Backdrop erstellen + const backdrop = document.createElement('div'); + backdrop.className = 'course-sidebar-backdrop'; + backdrop.id = 'courseSidebarBackdrop'; + document.body.appendChild(backdrop); + + // Kurswechsler Event Listener + const selectEl = document.getElementById('courseSidebarSelect'); + if (selectEl) { + selectEl.addEventListener('change', (e) => { + const newCourseId = e.target.value; + if (newCourseId === context.courseId) return; + + const targetCourse = manifest[newCourseId]; + if (!targetCourse || !targetCourse.tracks || !targetCourse.tracks.length) return; + const targetTrack = targetCourse.tracks[0]; + const targetChapter = targetTrack.chapters && targetTrack.chapters.length ? targetTrack.chapters[0].folder : ''; + + if (context.isWorkspace) { + window.location.href = `${rootPrefix}workspace.html?course=${newCourseId}&track=${targetTrack.id}&chapter=${targetChapter}`; + } else { + if (newCourseId === 'python') { + window.location.href = `${rootPrefix}${targetTrack.id}/${targetChapter}/index.html`; + } else { + window.location.href = `${rootPrefix}courses/${newCourseId}/${targetChapter}/index.html`; + } + } + }); + } + + // Toggle-Funktionen für Drawer + function openSidebar() { + sidebar.classList.add('open'); + backdrop.classList.add('active'); + } + + function closeSidebar() { + sidebar.classList.remove('open'); + backdrop.classList.remove('active'); + } + + const closeBtn = document.getElementById('courseSidebarClose'); + if (closeBtn) closeBtn.addEventListener('click', closeSidebar); + backdrop.addEventListener('click', closeSidebar); + + document.addEventListener('keydown', (e) => { + if (e.key === 'Escape') closeSidebar(); + }); + + // Mobil-Toggle Button für Leseansicht + if (!context.isWorkspace) { + const mobileBtn = document.createElement('button'); + mobileBtn.type = 'button'; + mobileBtn.className = 'course-sidebar-mobile-btn'; + mobileBtn.id = 'courseSidebarMobileToggle'; + mobileBtn.setAttribute('aria-label', 'Module und Kapitel öffnen'); + mobileBtn.innerHTML = `☰ Kapitel (${solvedCount}/${totalChapters})`; + mobileBtn.addEventListener('click', () => { + if (sidebar.classList.contains('open')) { + closeSidebar(); + } else { + openSidebar(); + } + }); + document.body.appendChild(mobileBtn); + } + + // Workspace: Topbar "☰ Kapitel" Button einbinden + if (context.isWorkspace) { + const topbarTitle = document.querySelector('.workspace-title'); + if (topbarTitle && !document.getElementById('btn-toggle-chapter-drawer')) { + const toggleBtn = document.createElement('button'); + toggleBtn.type = 'button'; + toggleBtn.id = 'btn-toggle-chapter-drawer'; + toggleBtn.className = 'btn btn-secondary'; + toggleBtn.style.cssText = 'font-size: 0.8rem; padding: 4px 10px; margin-right: 10px; display: inline-flex; align-items: center; gap: 6px; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.08); color: #f8fafc; font-weight: 700; cursor: pointer; border-radius: 6px;'; + toggleBtn.innerHTML = '☰ Kapitel'; + toggleBtn.title = 'Kapitel-Drawer aufklappen'; + toggleBtn.addEventListener('click', () => { + if (sidebar.classList.contains('open')) { + closeSidebar(); + } else { + openSidebar(); + } + }); + topbarTitle.insertBefore(toggleBtn, topbarTitle.firstChild); + } + } + + // Aktives Kapitel automatisch mittig in der Sidebar sichtbar scrollen + setTimeout(() => { + const activeItem = document.getElementById('activeSidebarChapter'); + if (activeItem) { + activeItem.scrollIntoView({ block: 'center', behavior: 'smooth' }); + } + }, 150); + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', initSidebar); + } else { + initSidebar(); + } +})(); diff --git a/assets/courses_manifest.js b/assets/courses_manifest.js new file mode 100644 index 0000000..8b02a24 --- /dev/null +++ b/assets/courses_manifest.js @@ -0,0 +1,1844 @@ +window.COURSES_MANIFEST = { + "bash": { + "id": "bash", + "title": "Linux Bash, Shell Scripting & Cloud DevOps", + "language": "bash", + "icon": "🐧", + "runner": "bash", + "description": "Vom Terminal-Einsteiger über professionelle Shell-Skripte, Text-Mining (jq/awk), Parallelisierung (xargs/parallel) bis zu Docker & BATS Unittests.", + "tracks": [ + { + "id": "track_1_terminal_grundlagen", + "title": "🌱 Lehrpfad 1: Linux Terminal Mastery & Core Unix Tools", + "description": "Navigation, Globbing, I/O Streams, Redirection, Umgebungsvariablen, Dateirechte und Prozesskontrolle.", + "certificateKey": "bash_grundlagen", + "chapters": [ + { + "folder": "01_navigation_dateien_und_globbing", + "title": "Bash 01: Terminal-Navigation & Globbing", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "02_streams_pipes_und_redirection", + "title": "Bash 02: I/O Streams, Pipes & Redirection", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "03_variablen_environment_und_subshells", + "title": "Bash 03: Variablen, Environment & Subshells", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "04_dateirechte_prozesskontrolle_und_jobs", + "title": "Bash 04: Dateirechte (chmod) & Job Control", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + } + ] + }, + { + "id": "track_2_skripting_und_textmining", + "title": "⚡ Lehrpfad 2: Professionelles Bash-Scripting & Text-Mining", + "description": "Kontrollfluss, Regex-Matching, Schleifen, Assoziative Arrays, grep, sed, awk, jq und Strict Mode (set -euo pipefail).", + "certificateKey": "bash_scripting", + "chapters": [ + { + "folder": "05_kontrollfluss_und_testoperatoren", + "title": "Bash 05: Kontrollfluss & Test-Operatoren", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "06_schleifen_arrays_und_assoziative_maps", + "title": "Bash 06: Schleifen & Assoziative Arrays", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "07_text_mining_grep_sed_awk_und_jq", + "title": "Bash 07: Text-Mining mit grep, sed, awk & jq", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "08_robuste_skripte_und_debugging", + "title": "Bash 08: Robuste Skripte (set -euo pipefail)", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + } + ] + }, + { + "id": "track_3_parallelisierung_und_netzwerk", + "title": "🚀 Lehrpfad 3: High-Performance, Parallelisierung & Netzwerke", + "description": "Multiprocessing mit xargs -P und GNU parallel, Prozess-Substitution, REST-Pipelines mit curl und Systemd Automation.", + "certificateKey": "bash_performance", + "chapters": [ + { + "folder": "09_parallelisierung_mit_xargs_und_parallel", + "title": "Bash 09: Parallelisierung mit xargs & parallel", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "10_prozess_substitution_und_coproc", + "title": "Bash 10: Prozess-Substitution & Co-Prozesse", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "11_netzwerk_ssh_und_curl_pipelines", + "title": "Bash 11: Remote SSH & REST-Pipelines (curl)", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "12_cron_systemd_und_service_automation", + "title": "Bash 12: Cronjobs, Systemd & Logrotation", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + } + ] + }, + { + "id": "track_4_cloud_devops_und_master", + "title": "💎 Lehrpfad 4: Cloud DevOps, BATS Testing & Masterprojekt", + "description": "Docker Container Scripting, CI/CD Pipelines, BATS Unittesting und Master DevOps Monitoring Suite.", + "certificateKey": "bash_master", + "chapters": [ + { + "folder": "13_docker_und_container_scripting", + "title": "Bash 13: Docker & Container Lifecycle Scripting", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "14_ci_cd_und_github_actions_shell", + "title": "Bash 14: CI/CD Workflows & GitHub Actions", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "15_bats_automatisiertes_unit_testing", + "title": "Bash 15: BATS Automatisiertes Unit-Testing", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + }, + { + "folder": "16_master_abschlussprojekt_devops_suite", + "title": "Master 16: DevOps Multi-Server Automation Suite", + "taskFile": "aufgabe.sh", + "testFile": "test_aufgabe.sh" + } + ] + } + ] + }, + "cpp": { + "id": "cpp", + "title": "C & Modernes C++20 Systems Engineering", + "language": "cpp", + "icon": "⚙️", + "runner": "cpp", + "description": "Von C Pointern & manuellem Speichermanagement (malloc/free) über RAII, Smart Pointer (unique_ptr) & STL bis zu GoogleTest & 2D Physics Simulation Master.", + "tracks": [ + { + "id": "track_1_c_basics", + "title": "🌱 Lehrpfad 1: C Fundamente & Manuelles Memory Management", + "description": "C-Syntax, Pointer & Adressoperatoren (&/*), Pointer-Arithmetik, Stack vs. Heap, malloc/free & Header-Dateien (.h/.c).", + "certificateKey": "cpp_c_grundlagen", + "chapters": [ + { + "folder": "01_c_syntax_datentypen_und_io", + "title": "C 01: C Syntax, Datentypen & printf/scanf", + "taskFile": "aufgabe.c", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "02_pointer_und_speicheradressen", + "title": "C 02: Pointer, Adressen (&/*) & Arithmetik", + "taskFile": "aufgabe.c", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "03_arrays_strings_und_manuelle_speicherallokation", + "title": "C 03: Strings, Stack vs. Heap & malloc/free", + "taskFile": "aufgabe.c", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "04_structs_und_header_dateien", + "title": "C 04: Structs, typedef & Header-Architektur", + "taskFile": "aufgabe.c", + "testFile": "test_aufgabe.cpp" + } + ] + }, + { + "id": "track_2_cpp_oop", + "title": "🏗️ Lehrpfad 2: Modern C++ Einstieg, RAII & OOP", + "description": "std::cout, Referenzen, Klassen, Konstruktoren/Destruktoren, RAII-Prinzip, virtual Methoden & Operator-Overloading.", + "certificateKey": "cpp_oop", + "chapters": [ + { + "folder": "05_einstieg_cpp_und_namespaces", + "title": "C++ 05: Einstieg C++, Namespaces & Referenzen (&)", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "06_klassen_konstruktoren_und_raii", + "title": "C++ 06: Klassen, Destruktoren & RAII-Prinzip", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "07_vererbung_und_virtuelle_methoden", + "title": "C++ 07: Vererbung, Virtual & Polymorphismus", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "08_operator_overloading", + "title": "C++ 08: Operator Overloading & Rule of Five", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + } + ] + }, + { + "id": "track_3_smart_pointers_stl", + "title": "⚡ Lehrpfad 3: Modern C++20: Smart Pointer & STL", + "description": "Templates, Smart Pointer (std::unique_ptr, std::shared_ptr), STL-Container (vector/map), Algorithmen, Lambdas & Structured Binding.", + "certificateKey": "cpp_modern", + "chapters": [ + { + "folder": "09_templates_und_generische_programmierung", + "title": "C++ 09: Function & Class Templates", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "10_smart_pointer_und_speichersicherheit", + "title": "C++ 10: Smart Pointer (unique_ptr, shared_ptr)", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "11_standard_template_library_stl", + "title": "C++ 11: STL Container (vector/map) & Algorithmen", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "12_lambdas_und_moderne_cpp20_features", + "title": "C++ 12: C++ Lambdas, auto & Structured Binding", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + } + ] + }, + { + "id": "track_4_concurrency_master", + "title": "💎 Lehrpfad 4: Concurrency, GoogleTest & Systems Master", + "description": "std::thread, std::mutex, Streams & Binärdateien, GoogleTest (gtest) Suite & High-Performance 2D Physics Engine Master.", + "certificateKey": "cpp_master", + "chapters": [ + { + "folder": "13_multithreading_mit_std_thread", + "title": "C++ 13: Multithreading (std::thread & std::mutex)", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "14_dateiverarbeitung_und_streams", + "title": "C++ 14: Dateiverarbeitung & Binäre Streams", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "15_googletest_gtest_unittesting", + "title": "C++ 15: GoogleTest (gtest) & Assertions", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + }, + { + "folder": "16_master_abschlussprojekt_high_performance_engine", + "title": "Master 16: High-Performance 2D Physics Simulation", + "taskFile": "aufgabe.cpp", + "testFile": "test_aufgabe.cpp" + } + ] + } + ] + }, + "csharp": { + "id": "csharp", + "title": "C# 12 & Modernes .NET 8+ Enterprise", + "language": "csharp", + "icon": "💜", + "runner": "csharp", + "description": "Von C# 12 Top-Level Statements über Records, LINQ-Pipelines & Async/Await bis zu xUnit Testing & der Enterprise Order Processing Engine.", + "tracks": [ + { + "id": "track_1_csharp_basics", + "title": "🌱 Lehrpfad 1: C# 12 Essentials & Moderne Syntax", + "description": "Top-Level Statements, Nullable Reference Types, moderne Switch-Expressions, Collections und C# Tupel.", + "certificateKey": "csharp_grundlagen", + "chapters": [ + { + "folder": "01_syntax_datentypen_und_top_level_statements", + "title": "C# 01: Syntax, Top-Level Statements & Nullables", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "02_kontrollfluss_und_pattern_matching", + "title": "C# 02: Switch-Expressions & Pattern Matching", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "03_arrays_listen_und_collections", + "title": "C# 03: Arrays, List & Collection Expressions", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "04_methoden_parameter_und_tuples", + "title": "C# 04: Methoden, Out/Ref & Tupel", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + } + ] + }, + { + "id": "track_2_modern_oop", + "title": "🏗️ Lehrpfad 2: Modernes OOP, Records & Interfaces", + "description": "Primary Constructors, Records mit with-Expressions, Vererbung & Polymorphismus, Interfaces & Dependency Injection.", + "certificateKey": "csharp_oop", + "chapters": [ + { + "folder": "05_klassen_objekte_und_primary_constructors", + "title": "C# 05: Klassen, Properties & Primary Constructors", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "06_records_und_immutability", + "title": "C# 06: Records, Immutability & with-Expressions", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "07_vererbung_polymorphismus_und_abstract", + "title": "C# 07: Vererbung, Virtual/Override & Abstract", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "08_interfaces_und_dependency_injection", + "title": "C# 08: Interfaces & Dependency Injection", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + } + ] + }, + { + "id": "track_3_linq_async", + "title": "⚡ Lehrpfad 3: LINQ, Generics & Async/Await Tasks", + "description": "Generics mit Constraints, LINQ-Pipelines (.Where/.Select/.GroupBy), asynchrone Tasks (async/await) und using-Disposal.", + "certificateKey": "csharp_linq", + "chapters": [ + { + "folder": "09_generics_und_constraints", + "title": "C# 09: Generics & Generic Constraints", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "10_linq_funktionale_datenabfragen", + "title": "C# 10: LINQ Datenabfragen & Fluent Chaining", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "11_asynchrone_programmierung_mit_async_await", + "title": "C# 11: Async/Await & Task.WhenAll Pipelines", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "12_exception_handling_und_ressourcen", + "title": "C# 12: Exceptions & using-Statements (IDisposable)", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + } + ] + }, + { + "id": "track_4_enterprise_master", + "title": "💎 Lehrpfad 4: Architektur, xUnit & Cloud Master", + "description": "System.Text.Json, Events & Delegates, xUnit Unit-Testing ([Fact]/[Theory]) & Enterprise Order Processing Engine.", + "certificateKey": "csharp_master", + "chapters": [ + { + "folder": "13_json_serialisierung_und_dateien", + "title": "C# 13: System.Text.Json & Asynchrone Dateien", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "14_events_delegates_und_lambdas", + "title": "C# 14: Delegates, Action/Func & Events", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "15_xunit_automatisiertes_unit_testing", + "title": "C# 15: xUnit Tests, Data-Theories & Assertions", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + }, + { + "folder": "16_master_abschlussprojekt_enterprise_order_engine", + "title": "Master 16: Enterprise Order Processing & Analytics", + "taskFile": "Aufgabe.cs", + "testFile": "TestAufgabe.cs" + } + ] + } + ] + }, + "go": { + "id": "go", + "title": "Go (Golang) Cloud Microservices & Systems", + "language": "go", + "icon": "⚡", + "runner": "go", + "description": "Vom statischen Typensystem über Structs & Interfaces, Goroutines & Channels bis zu net/http REST-APIs und dem Cloud Microservice Master.", + "tracks": [ + { + "id": "track_1_go_basics", + "title": "🌱 Lehrpfad 1: Go Syntax, Typensystem & Kontrollfluss", + "description": "Variablen, Typen, Type Inference (:=), Slices, Arrays, Maps, Schleifen (for/range) und Verzweigungen (if/switch).", + "certificateKey": "go_grundlagen", + "chapters": [ + { + "folder": "01_syntax_variablen_und_typen", + "title": "Go 01: Go Syntax, Variablen & Typensystem", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "02_slices_arrays_und_maps", + "title": "Go 02: Slices, Dynamische Arrays & Maps", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "03_kontrollfluss_und_schleifen", + "title": "Go 03: Kontrollfluss, for-Loops & switch", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "04_funktionen_und_multiple_returns", + "title": "Go 04: Funktionen & Mehrfache Rückgabewerte", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + } + ] + }, + { + "id": "track_2_structs_interfaces", + "title": "🏗️ Lehrpfad 2: Idiomatisches Go: Structs & Interfaces", + "description": "Structs, Methoden mit Pointer-Receivern, Interfaces & Duck Typing, Explizites Error-Handling (if err != nil) & Defer/Panic/Recover.", + "certificateKey": "go_oop", + "chapters": [ + { + "folder": "05_structs_und_methoden", + "title": "Go 05: Structs, Instanziierung & Pointer-Methoden", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "06_interfaces_und_polymorphie", + "title": "Go 06: Interfaces, Duck Typing & Polymorphie", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "07_explizites_error_handling", + "title": "Go 07: Idiomatisches Error-Handling (if err != nil)", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "08_defer_panic_und_recover", + "title": "Go 08: Ressourcensicherheit mit defer & Recover", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + } + ] + }, + { + "id": "track_3_concurrency", + "title": "🚀 Lehrpfad 3: Concurrency: Goroutines & Channels", + "description": "Leichtgewichtige Goroutines (go fn()), Unbuffered & Buffered Channels, select Multiplexing, sync.WaitGroup und sync.Mutex.", + "certificateKey": "go_concurrency", + "chapters": [ + { + "folder": "09_goroutines_und_waitgroups", + "title": "Go 09: Goroutines (go worker) & sync.WaitGroup", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "10_channels_und_datenfluss", + "title": "Go 10: Buffered & Unbuffered Channels (<-)", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "11_select_und_timeouts", + "title": "Go 11: select Multiplexing, Context & Timeouts", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "12_mutex_und_thread_safety", + "title": "Go 12: Race Conditions vermeiden mit sync.Mutex", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + } + ] + }, + { + "id": "track_4_microservices_master", + "title": "💎 Lehrpfad 4: REST-APIs, Microservices & Master", + "description": "Standardbibliothek net/http, JSON Encoding/Decoding, Middleware-Pattern, automatisierte Unit-Tests mit testing Package & Cloud API Master.", + "certificateKey": "go_master", + "chapters": [ + { + "folder": "13_http_server_und_routing", + "title": "Go 13: HTTP Web Server & net/http Routing", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "14_json_apis_und_middleware", + "title": "Go 14: REST JSON APIs & Chained Middleware", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "15_unit_testing_und_benchmarks", + "title": "Go 15: Automatisiertes Testing & Benchmarks", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + }, + { + "folder": "16_master_abschlussprojekt_microservice", + "title": "Master 16: High-Concurrency Microservice API", + "taskFile": "aufgabe.go", + "testFile": "test_aufgabe.go" + } + ] + } + ] + }, + "html_css": { + "id": "html_css", + "title": "HTML5, Modern CSS3 & Responsive UI", + "language": "html_css", + "icon": "🎨", + "runner": "html_css", + "description": "Vom semantischen HTML5-Dokument über modernes CSS3 Box Model, Flexbox, CSS Grid Matrix bis zu Themes (Dark Mode) & SaaS Portfolio Master.", + "tracks": [ + { + "id": "track_1_html_basics", + "title": "🌱 Lehrpfad 1: Semantisches HTML5 & Barrierefreiheit", + "description": "Dokumentenstruktur, semantische Tags (header/main/footer/article), interaktive Formulare, Validierung & Accessibility (A11y/ARIA).", + "certificateKey": "html_grundlagen", + "chapters": [ + { + "folder": "01_semantisches_html_und_struktur", + "title": "HTML 01: Semantik & Dokumentenstruktur", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "02_texte_listen_und_medien", + "title": "HTML 02: Texte, Listen, Bilder & Videos", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "03_formulare_und_validierung", + "title": "HTML 03: Formulare & HTML5-Validierung", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "04_barrierefreiheit_und_aria", + "title": "HTML 04: Accessibility (A11y) & ARIA-Attribute", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_2_css_styling", + "title": "🎨 Lehrpfad 2: Modern CSS3 Styling & Box Model", + "description": "CSS-Selektoren, Kaskade, Spezifität, Box-Modell (Margin/Padding/Border), Custom Properties (CSS-Variablen) und Typografie.", + "certificateKey": "css_styling", + "chapters": [ + { + "folder": "05_css_selektoren_und_kaskade", + "title": "CSS 05: Selektoren, Kaskade & Spezifität", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "06_box_modell_und_abstaende", + "title": "CSS 06: Box-Modell, Padding, Margin & Border", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "07_css_variablen_und_farbwelten", + "title": "CSS 07: CSS Custom Properties & Farbsysteme", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "08_typografie_und_webfonts", + "title": "CSS 08: Web-Typografie, Schriftarten & Text-Effekte", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_3_layouts_and_responsive", + "title": "📱 Lehrpfad 3: Responsive Layouts: Flexbox & Grid", + "description": "Flexbox 1D-Layouts, CSS Grid 2D-Matrix, Media Queries (@media) für Mobile-First Design, Keyframe-Animationen & Transitions.", + "certificateKey": "css_responsive", + "chapters": [ + { + "folder": "09_flexbox_achsen_und_alignment", + "title": "CSS 09: Flexbox Achsen, Justify & Align", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "10_css_grid_und_areas", + "title": "CSS 10: CSS Grid 2D-Matrix & Template Areas", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "11_media_queries_und_mobile_first", + "title": "CSS 11: Media Queries & Mobile-First Design", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "12_transitions_und_animationen", + "title": "CSS 12: Transitions, Transforms & Keyframes", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_4_modern_ui_and_master", + "title": "💎 Lehrpfad 4: CSS-Architektur, Themes & UI Master", + "description": "BEM-Methodik, Dark/Light Themes (prefers-color-scheme), moderne UI-Komponenten (Glassmorphism/Cards) & SaaS Landingpage Master.", + "certificateKey": "html_css_master", + "chapters": [ + { + "folder": "13_bem_methodik_und_modularitaet", + "title": "CSS 13: BEM-Methodik & Modulare CSS-Architektur", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "14_dark_mode_und_themes", + "title": "CSS 14: Dark/Light Mode & System-Themes", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "15_moderne_ui_komponenten", + "title": "CSS 15: Moderne UI-Komponenten & Glassmorphism", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + }, + { + "folder": "16_master_abschlussprojekt_saas_landingpage", + "title": "Master 16: Responsive SaaS Landingpage & Portfolio", + "taskFile": "aufgabe.html", + "testFile": "test_aufgabe.js" + } + ] + } + ] + }, + "ihk_ap1": { + "id": "ihk_ap1", + "title": "IHK AP1 Crashkurs: IT-Arbeitsplatz & Programmierung", + "language": "ihk_ap1", + "icon": "📘", + "runner": "none", + "description": "Lückenlose Vorbereitung auf die IHK-Abschlussprüfung Teil 1. Alle Lernfelder (LF 1 bis LF 8) mit interaktiven Übungen, 150-Fragen-Pool & 90-Minuten Probeprüfung.", + "tracks": [ + { + "id": "track_1_it_systeme", + "title": "🌱 Lehrpfad 1: Basissysteme & Sicherheit (LF 1–4)", + "description": "Unternehmen & Rolle im Betrieb, Hardware & Ergonomie, Subnetting & Netzwerke, Schutzbedarfsanalyse & DSGVO.", + "certificateKey": "ihk_ap1_systeme", + "chapters": [ + { + "folder": "01_lf1_unternehmen_und_arbeitsplatz", + "title": "LF 1: Unternehmen & Rolle im Betrieb (Organisation, Verträge, ITIL)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "02_lf2_arbeitsplaetze_ausstatten", + "title": "LF 2: Arbeitsplätze ausstatten (Hardware, Ergonomie, USV, NWA)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "03_lf3_clients_in_netzwerke_einbinden", + "title": "LF 3: Clients in Netzwerke einbinden (Subnetting, IPv6, LWL)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "04_lf4_schutzbedarfsanalyse_und_cybersicherheit", + "title": "LF 4: Schutzbedarfsanalyse & Cyber-Sicherheit (CIA, Backup, TOMs)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_2_programmierung_und_datenbanken", + "title": "💻 Lehrpfad 2: Software, CPS & Schnittstellen (LF 5–8)", + "description": "Algorithmen & SQL-Datenbanken, Cyber-physische Systeme, Instandhaltung & Fehlerdiagnose, REST-Schnittstellen.", + "certificateKey": "ihk_ap1_programmierung", + "chapters": [ + { + "folder": "05_lf5_software_zur_datenverwaltung", + "title": "LF 5: Software zur Datenverwaltung anpassen (Trace, UML, SQL)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "06_lf6_cyber_physische_systeme_iot", + "title": "LF 6: Das Cyber-Physische System ergänzen (Sensoren, Aktoren, MQTT)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "07_lf7_instandhaltung_und_fehlerdiagnose", + "title": "LF 7: Cyber-Physische Systeme instand halten (Diagnose, ESD, Messen)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "08_lf8_datenfluesse_und_schnittstellen", + "title": "LF 8: Datenflüsse optimieren & Schnittstellen anpassen (REST, JSON, JWT)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_3_praxis_drills", + "title": "⚡ Lehrpfad 3: Interaktive Praxis-Drills & Labore", + "description": "Trace-Tabellen-Trainer mit zeilenweiser Prüfung, Relationales SQL-Labor & Subnetting-Drill Master.", + "certificateKey": "ihk_ap1_prozesse", + "chapters": [ + { + "folder": "09_trace_tabellen_trainer", + "title": "Drill 1: Interaktiver Trace-Tabellen-Trainer (LF 5)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "10_sql_datenbank_labor", + "title": "Drill 2: Relationale Datenbanken & Live-SQL Labor (LF 5)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "11_subnetting_drill_master", + "title": "Drill 3: Endlos Subnetting-Drill Generator (LF 3)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_4_probepruefung", + "title": "🏆 Lehrpfad 4: Offizielle AP1 Probeprüfung & Notenrechner", + "description": "90-Minuten Realtime Prüfungsmodus mit Countdown, 100 Punkten, Zufallsgenerator aus 150 Fragen & Erwartungshorizont.", + "certificateKey": "ihk_ap1_master", + "chapters": [ + { + "folder": "12_ap1_probepruefung_simulation", + "title": "Probeprüfung AP1: 90 Min. Realtime Simulation (100 Pkt.)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + } + ] + }, + "ihk_ap2_fisi": { + "id": "ihk_ap2_fisi", + "title": "IHK AP2 Crashkurs: Fachinformatiker Systemintegration", + "language": "ihk_ap2_fisi", + "icon": "📕", + "runner": "none", + "description": "Vollständige Prüfungsvorbereitung für FISI (LF 9–12, WiSo, 40h-Projekt). VLANs, OSPF, Active Directory, RAID-Simulator, Cloud & 3 vollständige Probeprüfungen.", + "tracks": [ + { + "id": "track_1_netzwerke_und_server", + "title": "🌱 Lehrpfad 1: Enterprise Netzwerke & Serverdienste (LF 9 & 10)", + "description": "VLANs (802.1Q), LACP, Spanning Tree, OSPF, BGP, Active Directory, Gruppenrichtlinien, PKI & Ansible.", + "certificateKey": "ihk_ap2_netzwerke", + "chapters": [ + { + "folder": "01_lf9_netzwerke_und_dienste", + "title": "LF 9: Netzwerke & Dienste bereitstellen (VLAN, Routing, Firewalls)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "02_lf10_serverdienste_und_automation", + "title": "LF 10: Serverdienste & Automation bereitstellen (AD DS, DNS, Ansible)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_2_storage_und_cloud", + "title": "🛡️ Lehrpfad 2: Storage, Hochverfügbarkeit & Cloud (LF 11 & 12)", + "description": "RAID 0/1/5/6/10, SAN/NAS, HA-Cluster, Quorum, STONITH, ZFS, Hypervisoren, Docker, Kubernetes & Prometheus.", + "certificateKey": "ihk_ap2_sicherheit", + "chapters": [ + { + "folder": "03_lf11_speicher_und_hochverfuegbarkeit", + "title": "LF 11: Speicher- & Hochverfügbarkeitssysteme (RAID, SAN, Cluster)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "04_lf12_virtualisierung_und_cloud", + "title": "LF 12: Virtualisierung, Cloud & Automation (Docker, K8s, IaC)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_3_wiso_und_projekt", + "title": "☁️ Lehrpfad 3: WiSo & 40h-Betriebliche Projektarbeit", + "description": "Wirtschafts- & Sozialkunde (Arbeitsrecht, KSchG, Sozialversicherung) & Leitfaden zur 40h-Projektarbeit samt Fachgespräch.", + "certificateKey": "ihk_ap2_wiso_projekt", + "chapters": [ + { + "folder": "05_wiso_arbeitsrecht_und_wirtschaft", + "title": "WiSo: Wirtschafts- & Sozialkunde Prüfungs-Fit (BGB, KSchG, BetrVG)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "06_betriebliche_projektarbeit_guide", + "title": "Projekt: Betriebliche Projektarbeit (40h) & Fachgespräch-Guide", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + }, + { + "id": "track_4_probepruefungen", + "title": "🏆 Lehrpfad 4: Offizielle AP2 Probeprüfungen & Simulationen", + "description": "Die 3 schriftlichen IHK-Prüfungsteile unter Realbedingungen (Teil 1: 90 Min., Teil 2: 90 Min., WiSo: 60 Min.) mit 150-Fragen-Zufallsgenerator.", + "certificateKey": "ihk_ap2_fisi_master", + "chapters": [ + { + "folder": "07_ap2_teil_1_probepruefung", + "title": "Probeprüfung AP2 Teil 1: Planen & Umsetzen (90 Min. / 100 Pkt.)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "08_ap2_teil_2_probepruefung", + "title": "Probeprüfung AP2 Teil 2: Administration & Netzanalyse (90 Min. / 100 Pkt.)", + "taskFile": "README.md", + "testFile": "index.html" + }, + { + "folder": "09_ap2_wiso_probepruefung", + "title": "Probeprüfung AP2 WiSo: Wirtschafts- & Sozialkunde (60 Min. / 100 Pkt.)", + "taskFile": "README.md", + "testFile": "index.html" + } + ] + } + ] + }, + "java": { + "id": "java", + "title": "Java 21+ Enterprise & IHK/Uni Standard", + "language": "java", + "icon": "☕", + "runner": "java", + "description": "Vom statischen Typensystem über reine OOP, Kapselung & Records bis zu Generics, Streams API, Virtual Threads Loom & JUnit 5 Banking Master.", + "tracks": [ + { + "id": "track_1_java_basics", + "title": "🌱 Lehrpfad 1: Java Syntax, Typen & Kontrollfluss", + "description": "Primitive Typen, main()-Einstieg, moderne switch-Expressions (->), Schleifen, Arrays und Methodenüberladung.", + "certificateKey": "java_grundlagen", + "chapters": [ + { + "folder": "01_java_syntax_und_primitive_typen", + "title": "Java 01: Java Syntax & Primitive Datentypen", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "02_kontrollfluss_und_verzweigungen", + "title": "Java 02: Kontrollfluss & Switch-Expressions", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "03_schleifen_und_arrays", + "title": "Java 03: Schleifen, For-Each & Arrays", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "04_methoden_und_parameter", + "title": "Java 04: Methoden, Static & Overloading", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + } + ] + }, + { + "id": "track_2_pure_oop", + "title": "🏗️ Lehrpfad 2: Reine Objektorientierung & Kapselung", + "description": "Klassen, Konstruktoren, Kapselung, Immutability & Java 17+ Records, Vererbung (extends), Polymorphie & Interfaces.", + "certificateKey": "java_oop", + "chapters": [ + { + "folder": "05_klassen_objekte_und_konstruktoren", + "title": "Java 05: Klassen, Objekte & Konstruktoren", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "06_kapselung_und_records", + "title": "Java 06: Kapselung, Immutability & Records", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "07_vererbung_polymorphie_und_super", + "title": "Java 07: Vererbung, Polymorphie & Abstract Classes", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "08_interfaces_und_default_methods", + "title": "Java 08: Interfaces, Default Methods & Kopplung", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + } + ] + }, + { + "id": "track_3_collections_streams", + "title": "⚡ Lehrpfad 3: Generics, Collections & Modern Streams", + "description": "Generics , Java Collections Framework (List/Set/Map), Exception-Hierarchien, try-with-resources, Streams API & Optional.", + "certificateKey": "java_streams", + "chapters": [ + { + "folder": "09_generics_und_type_safety", + "title": "Java 09: Generics & Type Safety", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "10_collections_framework_list_set_map", + "title": "Java 10: Collections (ArrayList, HashSet, HashMap)", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "11_exceptions_und_ressourcenmanagement", + "title": "Java 11: Exceptions & Try-with-Resources", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "12_lambdas_streams_api_und_optional", + "title": "Java 12: Lambdas, Streams API & Optional", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + } + ] + }, + { + "id": "track_4_enterprise_master", + "title": "💎 Lehrpfad 4: Enterprise Architekturen & Masterprojekt", + "description": "NIO.2 Dateiverarbeitung, Java 21 Virtual Threads (Loom), JUnit 5 Unittesting & Enterprise Banking Core Master.", + "certificateKey": "java_master", + "chapters": [ + { + "folder": "13_dateien_json_und_persistenz", + "title": "Java 13: Modernes Dateihandling (NIO.2) & JSON", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "14_multithreading_und_virtual_threads", + "title": "Java 14: Virtual Threads (Loom) & Concurrency", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "15_junit_5_automatisiertes_unit_testing", + "title": "Java 15: JUnit 5 Testsuites & Assertions", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + }, + { + "folder": "16_master_abschlussprojekt_banking_system", + "title": "Master 16: Enterprise Banking Core & Transactions", + "taskFile": "Aufgabe.java", + "testFile": "TestAufgabe.java" + } + ] + } + ] + }, + "javascript": { + "id": "javascript", + "title": "JavaScript & Moderne Web-Entwicklung", + "language": "javascript", + "icon": "🌐", + "runner": "javascript", + "description": "Vom Einsteiger über moderne ES6+-Features, OOP, Reguläre Ausdrücke, Asynchronität bis hin zu TypeScript und dem Master-Abschlussprojekt.", + "tracks": [ + { + "id": "track_1_grundlagen", + "title": "🌱 Lehrpfad 1: JavaScript Grundlagen & ES6", + "description": "Variablen, Kontrollfluss, Funktionen, Scopes, Arrays, Sets, Maps, Objekte & Destructuring.", + "certificateKey": "js_grundlagen", + "chapters": [ + { + "folder": "01_erste_schritte_variablen", + "title": "JS 01: Variablen, Typen & Template-Strings", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "02_kontrollfluss_und_schleifen", + "title": "JS 02: Kontrollfluss & Schleifen", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "03_funktionen_und_scope", + "title": "JS 03: Funktionen, Arrow Functions & Scope", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "04_arrays_sets_und_maps", + "title": "JS 04: Arrays, Sets & Maps", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "05_objekte_und_destructuring", + "title": "JS 05: Objekte, Destructuring & Rest/Spread", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_2_oop_und_daten", + "title": "🏗️ Lehrpfad 2: Moderne Datenmodelle & OOP", + "description": "Objektorientierung mit ES6-Klassen, Reguläre Ausdrücke (RegExp) & strukturierte Fehlerbehandlung mit Error-Klassen.", + "certificateKey": "js_oop", + "chapters": [ + { + "folder": "06_klassen_und_oop", + "title": "JS 06: Klassen & Objektorientierung (OOP)", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "07_regex_und_textverarbeitung", + "title": "JS 07: Reguläre Ausdrücke & Textverarbeitung", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "08_fehlerbehandlung_und_debugging", + "title": "JS 08: Fehlerbehandlung & Debugging", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_3_web_und_async", + "title": "⚡ Lehrpfad 3: Web-APIs, DOM & Asynchronität", + "description": "DOM-Manipulation, Web Storage, Callbacks, Promises, Async/Await und REST-APIs (Fetch).", + "certificateKey": "js_async", + "chapters": [ + { + "folder": "09_dom_und_events", + "title": "JS 09: DOM-Manipulation & Events", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "10_web_storage_und_json", + "title": "JS 10: Web Storage & JSON", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "11_callbacks_und_promises", + "title": "JS 11: Callbacks, Event Loop & Promises", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "12_async_await_und_fetch", + "title": "JS 12: Async/Await & REST-APIs (Fetch)", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + } + ] + }, + { + "id": "track_4_typescript_und_master", + "title": "🛡️ Lehrpfad 4: Architektur, TypeScript & Masterprojekt", + "description": "ES-Module, statische Typsicherheit mit TypeScript, Interfaces, Generics und vollwertige MVC-Applikation.", + "certificateKey": "js_master", + "chapters": [ + { + "folder": "13_es_module_und_architektur", + "title": "JS 13: ES-Module & Clean Architecture", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "14_einstieg_typescript", + "title": "TS 14: TypeScript Type Safety & Interfaces", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "15_typescript_fortgeschritten", + "title": "TS 15: TypeScript Generics & Advanced Types", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + }, + { + "folder": "16_master_abschlussprojekt_web_app", + "title": "Master 16: Interaktive Task-App (MVC)", + "taskFile": "aufgabe.js", + "testFile": "test_aufgabe.js" + } + ] + } + ] + }, + "powershell": { + "id": "powershell", + "title": "Modern PowerShell 7+ Core & Cloud Automation", + "language": "powershell", + "icon": "🔷", + "runner": "powershell", + "description": "Vom Cmdlet-Einsteiger über .NET-Objekt-Pipelines, Multithreading (ForEach-Object -Parallel), REST-APIs bis zu Pester v5 Unittests & Cloud Engineering.", + "tracks": [ + { + "id": "track_1_ps7_essentials", + "title": "🌱 Lehrpfad 1: PowerShell 7+ Essentials & Objekt-Pipeline", + "description": "Verb-Noun Cmdlets, die .NET-Objekt-Pipeline, Where-Object Filterung, Select-Object Projektion und PSCustomObjects.", + "certificateKey": "ps_grundlagen", + "chapters": [ + { + "folder": "01_powershell_konsole_und_cmdlet_architektur", + "title": "PS 01: Cmdlet-Architektur & Verb-Noun Syntax", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "02_die_objekt_pipeline_und_get_member", + "title": "PS 02: Die Objekt-Pipeline & Get-Member", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "03_filterung_sortierung_und_projektion", + "title": "PS 03: Where-Object, Select & Calculated Properties", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "04_variablen_datentypen_und_pscustomobject", + "title": "PS 04: Typisierung, Hashtables & PSCustomObject", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + } + ] + }, + { + "id": "track_2_skripting_und_errorhandling", + "title": "⚡ Lehrpfad 2: Skripting, Kontrollfluss & Error-Handling", + "description": "Moderne Operatoren (Ternary, Null-Coalescing), Schleifen, erweiterte Cmdlet-Funktionen mit [CmdletBinding()] und Try/Catch.", + "certificateKey": "ps_scripting", + "chapters": [ + { + "folder": "05_kontrollfluss_und_moderne_operatoren", + "title": "PS 05: Kontrollfluss & Moderne PS7 Operatoren", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "06_schleifen_und_pipeline_durchlaeufe", + "title": "PS 06: Schleifen (foreach, while & Pipeline)", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "07_erweiterte_funktionen_und_parameter", + "title": "PS 07: Eigene Cmdlets [CmdletBinding()] & Validierung", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "08_robustes_error_handling_und_try_catch", + "title": "PS 08: Robustes Error-Handling (Try/Catch/Finally)", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + } + ] + }, + { + "id": "track_3_parallelisierung_und_rest", + "title": "🚀 Lehrpfad 3: Parallelisierung, REST-APIs & Datenformate", + "description": "Multithreading mit ForEach-Object -Parallel, Start-ThreadJob, REST-APIs mit Invoke-RestMethod, PSDrives und SecretManagement.", + "certificateKey": "ps_performance", + "chapters": [ + { + "folder": "09_multithreading_mit_foreach_object_parallel", + "title": "PS 09: Multithreading mit ForEach-Object -Parallel", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "10_json_csv_xml_und_rest_apis", + "title": "PS 10: REST-APIs & JSON-Pipelines (Invoke-RestMethod)", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "11_dateisystem_registry_und_psprovider", + "title": "PS 11: Dateisystem, PSDrives (Env/Cert) & Hashes", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "12_sicherheit_und_credentials_management", + "title": "PS 12: Sicherheit, Execution Policies & Secrets", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + } + ] + }, + { + "id": "track_4_enterprise_und_cloud_master", + "title": "💎 Lehrpfad 4: Enterprise Modules, Pester Testing & Masterprojekt", + "description": "Modul-Entwicklung (.psm1/.psd1), Pester v5 Unittests, Cloud-Automatisierung und Cloud Ops Masterprojekt.", + "certificateKey": "ps_master", + "chapters": [ + { + "folder": "13_modul_entwicklung_und_manifeste", + "title": "PS 13: Enterprise Module & Manifeste (.psd1)", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "14_pester_automatisierte_unit_tests", + "title": "PS 14: Pester v5 Automatisiertes Testing & Mocking", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "15_cloud_und_cross_platform_automatisierung", + "title": "PS 15: Cross-Platform Cloud Automation (Az & AWS)", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + }, + { + "folder": "16_master_abschlussprojekt_cloud_ops_engine", + "title": "Master 16: Multi-Threaded Cloud & Server Ops Engine", + "taskFile": "aufgabe.ps1", + "testFile": "test_aufgabe.ps1" + } + ] + } + ] + }, + "python": { + "id": "python", + "title": "Python Software Engineering", + "language": "python", + "icon": "🐍", + "runner": "python", + "description": "Vom Einsteiger über professionelle Objektorientierung bis hin zu Data Engineering und Desktop-Apps in 33 Modulen.", + "tracks": [ + { + "id": "lehrpfad_1_grundlagen", + "title": "🌱 Lehrpfad 1: Grundlagen der Programmierung", + "description": "Zahlen, Variablen, Bedingungen, Schleifen, Funktionen, Listen, Strings, Dicts & Sets.", + "certificateKey": "lehrpfad_1", + "chapters": [ + { + "folder": "01_erste_schritte_taschenrechner", + "title": "G01: Python als Taschenrechner", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "02_variablen_und_datentypen", + "title": "G02: Variablen & Datentypen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "03_ein_und_ausgabe", + "title": "G03: Interaktive Ein- & Ausgabe", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "04_verzweigungen_und_bedingungen", + "title": "G04: Verzweigungen & Bedingungen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "05_schleifen_und_wiederholungen", + "title": "G05: Schleifen & Wiederholungen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "06_funktionen_und_module", + "title": "G06: Eigene Funktionen & Module", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "07_listen_und_sequenzen", + "title": "G07: Listen & Sequenzen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "08_textverarbeitung_und_strings", + "title": "G08: Textverarbeitung & Strings", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "09_dictionaries_und_sets", + "title": "G09: Dictionaries & Sets", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "10_comprehensions_datum_algorithmen", + "title": "G10: Comprehensions & Algorithmen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + } + ] + }, + { + "id": "lehrpfad_2_oop_einstieg", + "title": "🏗️ Lehrpfad 2: Einstieg in die Objektorientierung (OOP)", + "description": "Klassen, Konstruktor, self, Methoden, Tools (VS Code & Git) und Tamagotchi-Projekt.", + "certificateKey": "lehrpfad_2", + "chapters": [ + { + "folder": "00_fehlersuche_und_grundlagen", + "title": "OOP 00: Python-Fehlersuche", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "01_einstieg_klassen", + "title": "OOP 01: Erste Klassen & Instanzen", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "02_init_und_self", + "title": "OOP 02: Konstruktor __init__ & self", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "03_methoden_und_verhalten", + "title": "OOP 03: Methoden & Verhalten", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "04_str_und_darstellung", + "title": "OOP 04: __str__ & String-Darstellung", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "04b_umstieg_vscode", + "title": "Tooling 04b: Umstieg auf VS Code", + "taskFile": "vscode_test.py", + "testFile": "" + }, + { + "folder": "04c_git_und_versionskontrolle", + "title": "Tooling 04c: Git & Versionskontrolle", + "taskFile": "git_uebung.py", + "testFile": "" + }, + { + "folder": "05_objekte_kombinieren", + "title": "OOP 05: Objekte kombinieren", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "06_abschlussprojekt_tamagotchi", + "title": "Projekt 06: Virtuelles Haustier (Tamagotchi)", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + } + ] + }, + { + "id": "lehrpfad_3_fortgeschrittenes_oop", + "title": "🚀 Lehrpfad 3: Fortgeschrittenes OOP & GUIs", + "description": "Speicher-Referenzen, Dunder-Methoden, TDD, Vererbung, Polymorphie, Exceptions, JSON/CSV, Tkinter & Masterprojekt.", + "certificateKey": "lehrpfad_3", + "chapters": [ + { + "folder": "07_referenzen_und_speicher", + "title": "Adv 07: Referenzen & Speicher", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "08_operator_overloading_dunder", + "title": "Adv 08: Operator Overloading & Dunder", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "09_eigene_unit_tests_schreiben", + "title": "Adv 09: Eigene Unit Tests & TDD", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "10_vererbung_und_super", + "title": "Adv 10: Vererbung & super()", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "11_polymorphie_und_interfaces", + "title": "Adv 11: Polymorphie & Interfaces", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "12_exceptions_und_fehlerbehandlung", + "title": "Adv 12: Exceptions & Fehlerbehandlung", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "13_persistenz_json_und_csv", + "title": "Adv 13: Datei-Persistenz (JSON & CSV)", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "14_gui_mit_tkinter", + "title": "Adv 14: Desktop-GUIs mit Tkinter", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "15_parameter_und_container", + "title": "Adv 15: Parameter & Eigene Container", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "16_master_abschlussprojekt", + "title": "Master 16: Master-Abschlussprojekt", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + } + ] + }, + { + "id": "lehrpfad_4_professional_data_engineering", + "title": "🌟 Lehrpfad 4: Python Professional & Data Engineering", + "description": "Reguläre Ausdrücke (re), funktionale Idiome, Generatoren, Dataclasses, Type Hints, SQLite & REST-APIs.", + "certificateKey": "lehrpfad_4", + "chapters": [ + { + "folder": "17_regulaere_ausdruecke_re", + "title": "Pro 17: Reguläre Ausdrücke (re)", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "18_funktionale_programmierung_lambda", + "title": "Pro 18: Funktionale Programmierung (lambda)", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "19_generatoren_und_itertools", + "title": "Pro 19: Generatoren & itertools (yield)", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "20_dataclasses_und_typehints", + "title": "Pro 20: Dataclasses & Type Hints", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "21_datenbanken_und_sqlite", + "title": "Pro 21: Relationale Datenbanken & SQLite", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + }, + { + "folder": "22_web_apis_und_json_feeds", + "title": "Pro 22: Web-APIs & JSON-Feeds", + "taskFile": "aufgabe.py", + "testFile": "test_aufgabe.py" + } + ] + } + ] + }, + "rust": { + "id": "rust", + "title": "Rust Modern Systems & WebAssembly", + "language": "rust", + "icon": "🦀", + "runner": "rust", + "description": "Vom revolutionären Ownership- & Borrowing-System über Structs, Enums, Option/Result bis zu Traits, Fearless Concurrency & LRU Cache Master.", + "tracks": [ + { + "id": "track_1_rust_basics", + "title": "🌱 Lehrpfad 1: Rust Grundlagen & Ownership-System", + "description": "Variablen, Typen, Mutabilität, Move-Semantik, Stack vs. Heap, Referenzen &mut, Slices und Pattern Matching.", + "certificateKey": "rust_grundlagen", + "chapters": [ + { + "folder": "01_variablen_mutabilitaet_und_typen", + "title": "Rust 01: Variablen, Mutabilität & Typensystem", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "02_das_ownership_und_borrowing_system", + "title": "Rust 02: Ownership, Move & Borrowing (&/&mut)", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "03_slices_und_lifetimes_grundlagen", + "title": "Rust 03: Slices (&str/&[T]) & Lifetimes ('a)", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "04_kontrollfluss_und_pattern_matching", + "title": "Rust 04: Kontrollfluss & match Pattern Matching", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + } + ] + }, + { + "id": "track_2_structs_enums", + "title": "🏗️ Lehrpfad 2: Structs, Enums & Error-Handling", + "description": "Structs, impl-Methodenblöcke, Option Monade, Result mit ?-Operator und Cargo Multi-File Modul-Architektur.", + "certificateKey": "rust_structs", + "chapters": [ + { + "folder": "05_structs_und_impl_methoden", + "title": "Rust 05: Structs, impl-Methoden & Konstruktoren", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "06_enums_und_option_monade", + "title": "Rust 06: Enums, Option & if let", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "07_robustes_error_handling_mit_result", + "title": "Rust 07: Result & der ?-Operator", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "08_packages_crates_und_module", + "title": "Rust 08: Packages, Crates & Multi-File Module", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + } + ] + }, + { + "id": "track_3_traits_generics", + "title": "⚡ Lehrpfad 3: Traits, Generics & Smart Pointer", + "description": "Traits, Trait Bounds, Monomorphisierung vs. Trait Objects (dyn Trait), Closures, Iterator-Pipelines & Smart Pointer (Box/Rc/RefCell).", + "certificateKey": "rust_traits", + "chapters": [ + { + "folder": "09_traits_und_shared_behavior", + "title": "Rust 09: Traits & Shared Behavior", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "10_generics_und_dynamischer_dispatch", + "title": "Rust 10: Generics & Trait Objects (dyn Trait)", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "11_iteratoren_und_closures", + "title": "Rust 11: Closures & Iterator Pipelines", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "12_smart_pointer_und_speichersicherheit", + "title": "Rust 12: Smart Pointer (Box, Rc, RefCell)", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + } + ] + }, + { + "id": "track_4_concurrency_master", + "title": "💎 Lehrpfad 4: Fearless Concurrency & Systems Master", + "description": "Thread Spawning, MPSC Channels, Send & Sync Traits, Arc>, Cargo Testsuite & High-Speed In-Memory LRU Cache Master.", + "certificateKey": "rust_master", + "chapters": [ + { + "folder": "13_fearless_concurrency_threads_und_channels", + "title": "Rust 13: Threads & MPSC Channels", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "14_shared_state_concurrency", + "title": "Rust 14: Shared State Concurrency (Arc>)", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "15_automatisiertes_testing_mit_cargo_test", + "title": "Rust 15: Automatisierte Tests mit cargo test", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + }, + { + "folder": "16_master_abschlussprojekt_high_speed_cache", + "title": "Master 16: High-Speed In-Memory LRU Cache Engine", + "taskFile": "aufgabe.rs", + "testFile": "test_aufgabe.rs" + } + ] + } + ] + }, + "sql": { + "id": "sql", + "title": "SQL & Relationale Datenbanken", + "language": "sql", + "icon": "🗄️", + "runner": "sql", + "description": "Vom ersten SELECT über relationale Joins, Normalisierung (1NF-3NF) bis zu CTEs, Window Functions (OVER) und dem Analytics Data Warehouse Master.", + "tracks": [ + { + "id": "track_1_grundlagen", + "title": "🌱 Lehrpfad 1: SQL-Grundlagen & CRUD-Operationen", + "description": "Tabellen anlegen, Datentypen, Constraints, Filterung mit WHERE, Daten einfügen, aktualisieren und löschen.", + "certificateKey": "sql_grundlagen", + "chapters": [ + { + "folder": "01_tabellen_und_select", + "title": "SQL 01: Tabellen anlegen & SELECT", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "02_filterung_und_logische_operatoren", + "title": "SQL 02: Filterung mit WHERE, LIKE & BETWEEN", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "03_daten_aktualisieren_und_loeschen", + "title": "SQL 03: UPDATE, DELETE & ALTER TABLE", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "04_datentypen_und_constraints", + "title": "SQL 04: Datentypen & Constraints (CHECK/UNIQUE)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + } + ] + }, + { + "id": "track_2_joins_und_design", + "title": "🏗️ Lehrpfad 2: Relationale Joins & Datenbank-Design", + "description": "Fremdschlüssel, Relationen (1:1, 1:n, n:m), INNER & OUTER JOINs, Datenbank-Normalisierung (1NF bis 3NF) und Junction Tables.", + "certificateKey": "sql_joins", + "chapters": [ + { + "folder": "05_foreign_keys_und_relationen", + "title": "SQL 05: Foreign Keys & Relationen (1:n)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "06_inner_und_outer_joins", + "title": "SQL 06: INNER JOIN & LEFT/RIGHT JOIN", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "07_datenbank_normalisierung_1nf_bis_3nf", + "title": "SQL 07: Datenbank-Normalisierung (1NF–3NF)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "08_m_zu_n_verknuepfungstabellen", + "title": "SQL 08: n:m Beziehungen & Junction Tables", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + } + ] + }, + { + "id": "track_3_aggregation_und_analytics", + "title": "⚡ Lehrpfad 3: Aggregationen, CTEs & Window Functions", + "description": "GROUP BY, HAVING, Aggregate, Subqueries, Common Table Expressions (WITH ...) und moderne Window Functions (ROW_NUMBER, OVER).", + "certificateKey": "sql_analytics", + "chapters": [ + { + "folder": "09_aggregate_und_group_by", + "title": "SQL 09: Aggregationen (COUNT/SUM) & GROUP BY", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "10_subqueries_und_mengenoperationen", + "title": "SQL 10: Subqueries & UNION / INTERSECT", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "11_common_table_expressions_cte", + "title": "SQL 11: Common Table Expressions (WITH CTE)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "12_window_functions_over_partition", + "title": "SQL 12: Window Functions (ROW_NUMBER, OVER)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + } + ] + }, + { + "id": "track_4_performance_und_master", + "title": "💎 Lehrpfad 4: Performance, Transaktionen & Analytics Master", + "description": "B-Tree Indizes, EXPLAIN Query Plans, ACID Transaktionen (COMMIT/ROLLBACK), Views und E-Commerce Data Warehouse Master.", + "certificateKey": "sql_master", + "chapters": [ + { + "folder": "13_indizes_und_query_optimierung", + "title": "SQL 13: B-Tree Indizes & EXPLAIN QUERY PLAN", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "14_transaktionen_acid_und_locking", + "title": "SQL 14: ACID Transaktionen (BEGIN/COMMIT)", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "15_views_und_gespeicherte_logik", + "title": "SQL 15: Virtuelle Views & Trigger", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + }, + { + "folder": "16_master_abschlussprojekt_data_warehouse", + "title": "Master 16: E-Commerce Analytics Data Warehouse", + "taskFile": "aufgabe.sql", + "testFile": "test_aufgabe.sql" + } + ] + } + ] + } +}; diff --git a/assets/style.css b/assets/style.css index 9be34d4..5d78feb 100644 --- a/assets/style.css +++ b/assets/style.css @@ -1419,3 +1419,344 @@ pre code { display: none; } } + +/* ========================================================================== + 🧭 DYNAMIC COURSE SIDEBAR & RESPONSIVE DRAWER SYSTEM + ========================================================================== */ + +body.has-course-sidebar { + margin-left: 280px !important; + transition: margin-left 0.25s ease; + position: relative; + min-height: 100vh; +} + +@media (max-width: 1024px) { + body.has-course-sidebar { + margin-left: 0 !important; + padding-top: 0 !important; + } +} + +/* Sidebar Container */ +.course-sidebar { + position: fixed; + top: 0; + left: 0; + bottom: 0; + width: 280px; + background: #090d16; + border-right: 1px solid rgba(255, 255, 255, 0.08); + display: flex; + flex-direction: column; + z-index: 1050; + overflow: hidden; + transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1); +} + +@media (max-width: 1024px) { + .course-sidebar { + transform: translateX(-100%); + box-shadow: 0 0 35px rgba(0, 0, 0, 0.85); + } + + .course-sidebar.open { + transform: translateX(0); + } +} + +/* Sidebar Header */ +.course-sidebar-header { + padding: 16px 16px 14px 16px; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + background: #0d1322; + flex-shrink: 0; +} + +.course-sidebar-brand-row { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 12px; +} + +.course-sidebar-brand { + display: flex; + align-items: center; + gap: 10px; + text-decoration: none; + color: white; +} + +.course-sidebar-logo { + width: 32px; + height: 32px; + border-radius: 8px; + background: rgba(56, 189, 248, 0.15); + border: 1px solid rgba(56, 189, 248, 0.4); + display: flex; + align-items: center; + justify-content: center; + font-size: 1.1rem; +} + +.course-sidebar-title { + font-size: 0.95rem; + font-weight: 800; + color: #f8fafc; + line-height: 1.2; +} + +.course-sidebar-close-btn { + display: none; + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(255, 255, 255, 0.12); + color: #94a3b8; + width: 28px; + height: 28px; + border-radius: 6px; + align-items: center; + justify-content: center; + font-size: 0.9rem; + cursor: pointer; + line-height: 1; + transition: all 0.15s ease; +} + +.course-sidebar-close-btn:hover { + background: rgba(255, 255, 255, 0.15); + color: #ffffff; + border-color: rgba(255, 255, 255, 0.3); +} + +@media (max-width: 1024px) { + .course-sidebar-close-btn { + display: inline-flex; + } +} + +.course-sidebar-select { + width: 100%; + background: #080c14; + color: #f1f5f9; + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 6px; + padding: 7px 9px; + font-size: 0.8rem; + font-weight: 600; + outline: none; + cursor: pointer; + transition: border-color 0.15s ease; +} + +.course-sidebar-select:focus { + border-color: #38bdf8; +} + +/* Progress bar inside sidebar */ +.course-sidebar-progress-container { + margin-top: 12px; +} + +.course-sidebar-progress-text { + display: flex; + justify-content: space-between; + font-size: 0.72rem; + font-weight: 700; + color: #94a3b8; + margin-bottom: 5px; +} + +.course-sidebar-progress-bar-bg { + width: 100%; + height: 6px; + background: rgba(255, 255, 255, 0.08); + border-radius: 99px; + overflow: hidden; +} + +.course-sidebar-progress-bar-fill { + height: 100%; + background: linear-gradient(90deg, #10b981, #0284c7); + border-radius: 99px; + transition: width 0.3s ease; +} + +/* Navigation list */ +.course-sidebar-nav { + flex: 1; + overflow-y: auto; + padding: 12px 10px; +} + +.course-sidebar-nav::-webkit-scrollbar { + width: 5px; +} +.course-sidebar-nav::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.15); + border-radius: 99px; +} + +.course-sidebar-track-title { + font-size: 0.68rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.6px; + color: #64748b; + padding: 12px 10px 4px 10px; +} + +.course-sidebar-link { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 10px; + border-radius: 6px; + color: #94a3b8; + text-decoration: none; + font-size: 0.82rem; + font-weight: 600; + line-height: 1.3; + transition: all 0.15s ease; + margin-bottom: 2px; + border: 1px solid transparent; +} + +.course-sidebar-link:hover { + background: rgba(255, 255, 255, 0.05); + color: #f8fafc; +} + +.course-sidebar-link.active { + background: rgba(56, 189, 248, 0.12); + color: #38bdf8; + border-color: rgba(56, 189, 248, 0.3); + font-weight: 700; +} + +.course-sidebar-title-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} + +.course-sidebar-status-icon { + font-size: 0.72rem; + width: 18px; + height: 18px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.status-icon-solved { + background: #059669; + color: white; + font-weight: 800; +} + +.status-icon-open { + border: 1.5px solid #475569; + color: transparent; +} + +.course-sidebar-link.active .status-icon-open { + border-color: #38bdf8; + background: rgba(56, 189, 248, 0.3); + color: #38bdf8; +} + +/* Sidebar Footer */ +.course-sidebar-footer { + padding: 12px 16px; + background: #080c14; + border-top: 1px solid rgba(255, 255, 255, 0.08); + display: flex; + justify-content: space-between; + align-items: center; + flex-shrink: 0; +} + +.course-sidebar-footer a { + color: #94a3b8; + font-size: 0.78rem; + text-decoration: none; + font-weight: 600; + transition: color 0.15s ease; +} + +.course-sidebar-footer a:hover { + color: #38bdf8; +} + +/* Mobile Toggle Button */ +.course-sidebar-mobile-btn { + display: none; + position: fixed; + bottom: 22px; + left: 20px; + z-index: 1030; + background: #0f172a; + color: white; + border: 1px solid rgba(56, 189, 248, 0.5); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.55), 0 0 12px rgba(56, 189, 248, 0.25); + padding: 10px 18px; + border-radius: 99px; + font-size: 0.85rem; + font-weight: 700; + cursor: pointer; + align-items: center; + gap: 8px; + backdrop-filter: blur(8px); + transition: transform 0.15s ease, background-color 0.15s ease; +} + +.course-sidebar-mobile-btn:active { + transform: scale(0.96); +} + +@media (max-width: 1024px) { + .course-sidebar-mobile-btn { + display: inline-flex; + } +} + +.course-sidebar-backdrop { + display: none; + position: fixed; + inset: 0; + background: rgba(15, 23, 42, 0.75); + backdrop-filter: blur(4px); + z-index: 1040; +} + +.course-sidebar-backdrop.active { + display: block; +} + +/* Workspace Specific Drawer Overrides */ +body.workspace-page.has-course-sidebar { + margin-left: 0 !important; +} + +.workspace-page .course-sidebar { + transform: translateX(-100%); + box-shadow: 0 0 35px rgba(0, 0, 0, 0.85); + z-index: 9999; +} + +.workspace-page .course-sidebar.open { + transform: translateX(0); +} + +.workspace-page .course-sidebar-close-btn { + display: inline-flex; +} + +.workspace-page .course-sidebar-backdrop { + z-index: 9998; +} + diff --git a/courses/bash/01_navigation_dateien_und_globbing/index.html b/courses/bash/01_navigation_dateien_und_globbing/index.html index d2cd6d6..f5607cb 100644 --- a/courses/bash/01_navigation_dateien_und_globbing/index.html +++ b/courses/bash/01_navigation_dateien_und_globbing/index.html @@ -150,5 +150,7 @@ rm -rf /tmp/build_cache/ # Rekursives Löschen ohne Bestätig + + diff --git a/courses/bash/02_streams_pipes_und_redirection/index.html b/courses/bash/02_streams_pipes_und_redirection/index.html index 8f82384..79106a5 100644 --- a/courses/bash/02_streams_pipes_und_redirection/index.html +++ b/courses/bash/02_streams_pipes_und_redirection/index.html @@ -152,5 +152,7 @@ EOF + + diff --git a/courses/bash/03_variablen_environment_und_subshells/index.html b/courses/bash/03_variablen_environment_und_subshells/index.html index 97b57e8..611bfbd 100644 --- a/courses/bash/03_variablen_environment_und_subshells/index.html +++ b/courses/bash/03_variablen_environment_und_subshells/index.html @@ -151,5 +151,7 @@ FREE_RAM=$(( TOTAL_RAM - USED_RAM )) + + diff --git a/courses/bash/04_dateirechte_prozesskontrolle_und_jobs/index.html b/courses/bash/04_dateirechte_prozesskontrolle_und_jobs/index.html index f0f4d6c..caa4217 100644 --- a/courses/bash/04_dateirechte_prozesskontrolle_und_jobs/index.html +++ b/courses/bash/04_dateirechte_prozesskontrolle_und_jobs/index.html @@ -153,5 +153,7 @@ fi + + diff --git a/courses/bash/05_kontrollfluss_und_testoperatoren/index.html b/courses/bash/05_kontrollfluss_und_testoperatoren/index.html index 9eaa1d8..f6f6d43 100644 --- a/courses/bash/05_kontrollfluss_und_testoperatoren/index.html +++ b/courses/bash/05_kontrollfluss_und_testoperatoren/index.html @@ -157,5 +157,7 @@ esac + + diff --git a/courses/bash/06_schleifen_arrays_und_assoziative_maps/index.html b/courses/bash/06_schleifen_arrays_und_assoziative_maps/index.html index 852eb9b..7875bf2 100644 --- a/courses/bash/06_schleifen_arrays_und_assoziative_maps/index.html +++ b/courses/bash/06_schleifen_arrays_und_assoziative_maps/index.html @@ -145,5 +145,7 @@ echo "Alle Keys: ${!PORT_MAP[@]}" + + diff --git a/courses/bash/07_text_mining_grep_sed_awk_und_jq/index.html b/courses/bash/07_text_mining_grep_sed_awk_und_jq/index.html index e1914cd..f019a06 100644 --- a/courses/bash/07_text_mining_grep_sed_awk_und_jq/index.html +++ b/courses/bash/07_text_mining_grep_sed_awk_und_jq/index.html @@ -130,5 +130,7 @@ cat pods.json | jq -r '.items[] | "\(.metadata.name),\(.status.phase)"' + + diff --git a/courses/bash/08_robuste_skripte_und_debugging/index.html b/courses/bash/08_robuste_skripte_und_debugging/index.html index 1178f3f..2b9d633 100644 --- a/courses/bash/08_robuste_skripte_und_debugging/index.html +++ b/courses/bash/08_robuste_skripte_und_debugging/index.html @@ -147,5 +147,7 @@ set +x # Schaltet Tracing wieder aus + + diff --git a/courses/bash/09_parallelisierung_mit_xargs_und_parallel/index.html b/courses/bash/09_parallelisierung_mit_xargs_und_parallel/index.html index 3004a1c..bc13a46 100644 --- a/courses/bash/09_parallelisierung_mit_xargs_und_parallel/index.html +++ b/courses/bash/09_parallelisierung_mit_xargs_und_parallel/index.html @@ -130,5 +130,7 @@ wait # Blockiert, bis ALLE Subshells im Hintergrund fertig sind + + diff --git a/courses/bash/10_prozess_substitution_und_coproc/index.html b/courses/bash/10_prozess_substitution_und_coproc/index.html index 1d8bfc1..6d0881a 100644 --- a/courses/bash/10_prozess_substitution_und_coproc/index.html +++ b/courses/bash/10_prozess_substitution_und_coproc/index.html @@ -137,5 +137,7 @@ echo "Ergebnis: $antwort" # 30 + + diff --git a/courses/bash/11_netzwerk_ssh_und_curl_pipelines/index.html b/courses/bash/11_netzwerk_ssh_und_curl_pipelines/index.html index ac88c2b..6b04790 100644 --- a/courses/bash/11_netzwerk_ssh_und_curl_pipelines/index.html +++ b/courses/bash/11_netzwerk_ssh_und_curl_pipelines/index.html @@ -126,5 +126,7 @@ rsync -avz --delete --exclude="*.log" /var/app/ deploy@backup-server:/var/app/ + + diff --git a/courses/bash/12_cron_systemd_und_service_automation/index.html b/courses/bash/12_cron_systemd_und_service_automation/index.html index 195504e..6e7c538 100644 --- a/courses/bash/12_cron_systemd_und_service_automation/index.html +++ b/courses/bash/12_cron_systemd_und_service_automation/index.html @@ -124,5 +124,7 @@ WantedBy=multi-user.target + + diff --git a/courses/bash/13_docker_und_container_scripting/index.html b/courses/bash/13_docker_und_container_scripting/index.html index 94de52c..819a01b 100644 --- a/courses/bash/13_docker_und_container_scripting/index.html +++ b/courses/bash/13_docker_und_container_scripting/index.html @@ -120,5 +120,7 @@ status=$(docker inspect --format='{{.State.Health.Status}}' my-postgres) + + diff --git a/courses/bash/14_ci_cd_und_github_actions_shell/index.html b/courses/bash/14_ci_cd_und_github_actions_shell/index.html index e841388..85a1cd6 100644 --- a/courses/bash/14_ci_cd_und_github_actions_shell/index.html +++ b/courses/bash/14_ci_cd_und_github_actions_shell/index.html @@ -121,5 +121,7 @@ echo "::error file=config.json,line=5::Invalid JSON format" + + diff --git a/courses/bash/15_bats_automatisiertes_unit_testing/index.html b/courses/bash/15_bats_automatisiertes_unit_testing/index.html index 329aec2..75f1619 100644 --- a/courses/bash/15_bats_automatisiertes_unit_testing/index.html +++ b/courses/bash/15_bats_automatisiertes_unit_testing/index.html @@ -132,5 +132,7 @@ teardown() { + + diff --git a/courses/bash/16_master_abschlussprojekt_devops_suite/index.html b/courses/bash/16_master_abschlussprojekt_devops_suite/index.html index 0562b54..bca7fe4 100644 --- a/courses/bash/16_master_abschlussprojekt_devops_suite/index.html +++ b/courses/bash/16_master_abschlussprojekt_devops_suite/index.html @@ -118,5 +118,7 @@ + + diff --git a/courses/cpp/01_c_syntax_datentypen_und_io/index.html b/courses/cpp/01_c_syntax_datentypen_und_io/index.html index 7c5ed8f..7a97408 100644 --- a/courses/cpp/01_c_syntax_datentypen_und_io/index.html +++ b/courses/cpp/01_c_syntax_datentypen_und_io/index.html @@ -165,5 +165,7 @@ snprintf(buffer, sizeof(buffer), "Sensor #%03d: %.2f C", sensor_id, temp); + + diff --git a/courses/cpp/02_pointer_und_speicheradressen/index.html b/courses/cpp/02_pointer_und_speicheradressen/index.html index 867331f..7998d0a 100644 --- a/courses/cpp/02_pointer_und_speicheradressen/index.html +++ b/courses/cpp/02_pointer_und_speicheradressen/index.html @@ -150,5 +150,7 @@ swap(&x, &y); // x ist jetzt 10, y ist jetzt 5! + + diff --git a/courses/cpp/03_arrays_strings_und_manuelle_speicherallokation/index.html b/courses/cpp/03_arrays_strings_und_manuelle_speicherallokation/index.html index 9e08f97..de53ad7 100644 --- a/courses/cpp/03_arrays_strings_und_manuelle_speicherallokation/index.html +++ b/courses/cpp/03_arrays_strings_und_manuelle_speicherallokation/index.html @@ -151,5 +151,7 @@ buffer = NULL; // WICHTIG: Verhindert versehentlichen Zugriff nach Freigabe! + + diff --git a/courses/cpp/04_structs_und_header_dateien/index.html b/courses/cpp/04_structs_und_header_dateien/index.html index db85c3a..38fb8d4 100644 --- a/courses/cpp/04_structs_und_header_dateien/index.html +++ b/courses/cpp/04_structs_und_header_dateien/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/05_einstieg_cpp_und_namespaces/index.html b/courses/cpp/05_einstieg_cpp_und_namespaces/index.html index b90005f..54a1603 100644 --- a/courses/cpp/05_einstieg_cpp_und_namespaces/index.html +++ b/courses/cpp/05_einstieg_cpp_und_namespaces/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/06_klassen_konstruktoren_und_raii/index.html b/courses/cpp/06_klassen_konstruktoren_und_raii/index.html index 88f6efc..a984552 100644 --- a/courses/cpp/06_klassen_konstruktoren_und_raii/index.html +++ b/courses/cpp/06_klassen_konstruktoren_und_raii/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/07_vererbung_und_virtuelle_methoden/index.html b/courses/cpp/07_vererbung_und_virtuelle_methoden/index.html index f77ff57..f2d44f4 100644 --- a/courses/cpp/07_vererbung_und_virtuelle_methoden/index.html +++ b/courses/cpp/07_vererbung_und_virtuelle_methoden/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/08_operator_overloading/index.html b/courses/cpp/08_operator_overloading/index.html index 557948c..7a2e963 100644 --- a/courses/cpp/08_operator_overloading/index.html +++ b/courses/cpp/08_operator_overloading/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/09_templates_und_generische_programmierung/index.html b/courses/cpp/09_templates_und_generische_programmierung/index.html index b9f1d75..b33bb74 100644 --- a/courses/cpp/09_templates_und_generische_programmierung/index.html +++ b/courses/cpp/09_templates_und_generische_programmierung/index.html @@ -192,5 +192,7 @@ struct TypeFormatter<bool> { + + diff --git a/courses/cpp/10_smart_pointer_und_speichersicherheit/index.html b/courses/cpp/10_smart_pointer_und_speichersicherheit/index.html index 7ebd98e..15cf320 100644 --- a/courses/cpp/10_smart_pointer_und_speichersicherheit/index.html +++ b/courses/cpp/10_smart_pointer_und_speichersicherheit/index.html @@ -185,5 +185,7 @@ SafeFile open_safe_file(const char* filename, const char* mode) { + + diff --git a/courses/cpp/11_standard_template_library_stl/index.html b/courses/cpp/11_standard_template_library_stl/index.html index 5fe7872..5e22c92 100644 --- a/courses/cpp/11_standard_template_library_stl/index.html +++ b/courses/cpp/11_standard_template_library_stl/index.html @@ -165,5 +165,7 @@ int main() { + + diff --git a/courses/cpp/12_lambdas_und_moderne_cpp20_features/index.html b/courses/cpp/12_lambdas_und_moderne_cpp20_features/index.html index e819b7b..434cab1 100644 --- a/courses/cpp/12_lambdas_und_moderne_cpp20_features/index.html +++ b/courses/cpp/12_lambdas_und_moderne_cpp20_features/index.html @@ -166,5 +166,7 @@ int main() { + + diff --git a/courses/cpp/13_multithreading_mit_std_thread/index.html b/courses/cpp/13_multithreading_mit_std_thread/index.html index 8cd4097..eee0d8c 100644 --- a/courses/cpp/13_multithreading_mit_std_thread/index.html +++ b/courses/cpp/13_multithreading_mit_std_thread/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/14_dateiverarbeitung_und_streams/index.html b/courses/cpp/14_dateiverarbeitung_und_streams/index.html index eb4ecc6..0a91519 100644 --- a/courses/cpp/14_dateiverarbeitung_und_streams/index.html +++ b/courses/cpp/14_dateiverarbeitung_und_streams/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/15_googletest_gtest_unittesting/index.html b/courses/cpp/15_googletest_gtest_unittesting/index.html index 9d33f7a..4616f7b 100644 --- a/courses/cpp/15_googletest_gtest_unittesting/index.html +++ b/courses/cpp/15_googletest_gtest_unittesting/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/cpp/16_master_abschlussprojekt_high_performance_engine/index.html b/courses/cpp/16_master_abschlussprojekt_high_performance_engine/index.html index ee6687e..19d1813 100644 --- a/courses/cpp/16_master_abschlussprojekt_high_performance_engine/index.html +++ b/courses/cpp/16_master_abschlussprojekt_high_performance_engine/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/01_syntax_datentypen_und_top_level_statements/index.html b/courses/csharp/01_syntax_datentypen_und_top_level_statements/index.html index 3449383..c9b9f19 100644 --- a/courses/csharp/01_syntax_datentypen_und_top_level_statements/index.html +++ b/courses/csharp/01_syntax_datentypen_und_top_level_statements/index.html @@ -3,4 +3,6 @@ C# 01

C# 01: Syntax & Top-Level Statements

-💻 In Web-IDE öffnen → \ No newline at end of file +💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/02_kontrollfluss_und_pattern_matching/index.html b/courses/csharp/02_kontrollfluss_und_pattern_matching/index.html index 922cb35..a5d99e2 100644 --- a/courses/csharp/02_kontrollfluss_und_pattern_matching/index.html +++ b/courses/csharp/02_kontrollfluss_und_pattern_matching/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/03_arrays_listen_und_collections/index.html b/courses/csharp/03_arrays_listen_und_collections/index.html index eb9558a..70cd7ba 100644 --- a/courses/csharp/03_arrays_listen_und_collections/index.html +++ b/courses/csharp/03_arrays_listen_und_collections/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/04_methoden_parameter_und_tuples/index.html b/courses/csharp/04_methoden_parameter_und_tuples/index.html index bcfd9d6..3850c6f 100644 --- a/courses/csharp/04_methoden_parameter_und_tuples/index.html +++ b/courses/csharp/04_methoden_parameter_und_tuples/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/05_klassen_objekte_und_primary_constructors/index.html b/courses/csharp/05_klassen_objekte_und_primary_constructors/index.html index eed276e..c4957db 100644 --- a/courses/csharp/05_klassen_objekte_und_primary_constructors/index.html +++ b/courses/csharp/05_klassen_objekte_und_primary_constructors/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/06_records_und_immutability/index.html b/courses/csharp/06_records_und_immutability/index.html index 1b9d33c..374521f 100644 --- a/courses/csharp/06_records_und_immutability/index.html +++ b/courses/csharp/06_records_und_immutability/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/07_vererbung_polymorphismus_und_abstract/index.html b/courses/csharp/07_vererbung_polymorphismus_und_abstract/index.html index bce8456..37c8868 100644 --- a/courses/csharp/07_vererbung_polymorphismus_und_abstract/index.html +++ b/courses/csharp/07_vererbung_polymorphismus_und_abstract/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/08_interfaces_und_dependency_injection/index.html b/courses/csharp/08_interfaces_und_dependency_injection/index.html index 118e67a..05f2c4d 100644 --- a/courses/csharp/08_interfaces_und_dependency_injection/index.html +++ b/courses/csharp/08_interfaces_und_dependency_injection/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/09_generics_und_constraints/index.html b/courses/csharp/09_generics_und_constraints/index.html index 51f8635..f85c92a 100644 --- a/courses/csharp/09_generics_und_constraints/index.html +++ b/courses/csharp/09_generics_und_constraints/index.html @@ -177,5 +177,7 @@ public class InMemoryRepository<TEntity, TId> + + diff --git a/courses/csharp/10_linq_funktionale_datenabfragen/index.html b/courses/csharp/10_linq_funktionale_datenabfragen/index.html index 79a7a07..e9fc032 100644 --- a/courses/csharp/10_linq_funktionale_datenabfragen/index.html +++ b/courses/csharp/10_linq_funktionale_datenabfragen/index.html @@ -163,5 +163,7 @@ var revenueByCategory = orders + + diff --git a/courses/csharp/11_asynchrone_programmierung_mit_async_await/index.html b/courses/csharp/11_asynchrone_programmierung_mit_async_await/index.html index 9dc43c4..80d654a 100644 --- a/courses/csharp/11_asynchrone_programmierung_mit_async_await/index.html +++ b/courses/csharp/11_asynchrone_programmierung_mit_async_await/index.html @@ -152,5 +152,7 @@ catch (OperationCanceledException) + + diff --git a/courses/csharp/12_exception_handling_und_ressourcen/index.html b/courses/csharp/12_exception_handling_und_ressourcen/index.html index 20148af..87ca199 100644 --- a/courses/csharp/12_exception_handling_und_ressourcen/index.html +++ b/courses/csharp/12_exception_handling_und_ressourcen/index.html @@ -173,5 +173,7 @@ catch (BankDomainException ex) + + diff --git a/courses/csharp/13_json_serialisierung_und_dateien/index.html b/courses/csharp/13_json_serialisierung_und_dateien/index.html index 872a135..c430e0a 100644 --- a/courses/csharp/13_json_serialisierung_und_dateien/index.html +++ b/courses/csharp/13_json_serialisierung_und_dateien/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/14_events_delegates_und_lambdas/index.html b/courses/csharp/14_events_delegates_und_lambdas/index.html index dd79cac..f2f8868 100644 --- a/courses/csharp/14_events_delegates_und_lambdas/index.html +++ b/courses/csharp/14_events_delegates_und_lambdas/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/15_xunit_automatisiertes_unit_testing/index.html b/courses/csharp/15_xunit_automatisiertes_unit_testing/index.html index 8c85ca6..e02c014 100644 --- a/courses/csharp/15_xunit_automatisiertes_unit_testing/index.html +++ b/courses/csharp/15_xunit_automatisiertes_unit_testing/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/csharp/16_master_abschlussprojekt_enterprise_order_engine/index.html b/courses/csharp/16_master_abschlussprojekt_enterprise_order_engine/index.html index 10bfce8..19a3c6c 100644 --- a/courses/csharp/16_master_abschlussprojekt_enterprise_order_engine/index.html +++ b/courses/csharp/16_master_abschlussprojekt_enterprise_order_engine/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/go/01_syntax_variablen_und_typen/index.html b/courses/go/01_syntax_variablen_und_typen/index.html index 162cdab..365fe64 100644 --- a/courses/go/01_syntax_variablen_und_typen/index.html +++ b/courses/go/01_syntax_variablen_und_typen/index.html @@ -148,5 +148,7 @@ durchschnitt := float64(summe) / float64(anzahl) // Ergibt 37.5 (float64) + + diff --git a/courses/go/02_slices_arrays_und_maps/index.html b/courses/go/02_slices_arrays_und_maps/index.html index 9cda55f..50cca0a 100644 --- a/courses/go/02_slices_arrays_und_maps/index.html +++ b/courses/go/02_slices_arrays_und_maps/index.html @@ -103,5 +103,7 @@ delete(ports, "ssh") + + diff --git a/courses/go/03_kontrollfluss_und_schleifen/index.html b/courses/go/03_kontrollfluss_und_schleifen/index.html index 19e6621..ec85a9e 100644 --- a/courses/go/03_kontrollfluss_und_schleifen/index.html +++ b/courses/go/03_kontrollfluss_und_schleifen/index.html @@ -123,5 +123,7 @@ default: + + diff --git a/courses/go/04_funktionen_und_multiple_returns/index.html b/courses/go/04_funktionen_und_multiple_returns/index.html index 20b7352..8c35e39 100644 --- a/courses/go/04_funktionen_und_multiple_returns/index.html +++ b/courses/go/04_funktionen_und_multiple_returns/index.html @@ -115,5 +115,7 @@ fmt.Println(c1()) // 12 + + diff --git a/courses/go/05_structs_und_methoden/index.html b/courses/go/05_structs_und_methoden/index.html index b82d01d..98c9d12 100644 --- a/courses/go/05_structs_und_methoden/index.html +++ b/courses/go/05_structs_und_methoden/index.html @@ -137,5 +137,7 @@ fmt.Println(admin.Info()) // Ruft User.Info() auf + + diff --git a/courses/go/06_interfaces_und_polymorphie/index.html b/courses/go/06_interfaces_und_polymorphie/index.html index 7005de0..838a19a 100644 --- a/courses/go/06_interfaces_und_polymorphie/index.html +++ b/courses/go/06_interfaces_und_polymorphie/index.html @@ -108,5 +108,7 @@ func Describe(val any) string { + + diff --git a/courses/go/07_explizites_error_handling/index.html b/courses/go/07_explizites_error_handling/index.html index 29b35ce..a44c15b 100644 --- a/courses/go/07_explizites_error_handling/index.html +++ b/courses/go/07_explizites_error_handling/index.html @@ -104,5 +104,7 @@ func (e *APIError) Error() string { + + diff --git a/courses/go/08_defer_panic_und_recover/index.html b/courses/go/08_defer_panic_und_recover/index.html index 54f2e6b..82d06f6 100644 --- a/courses/go/08_defer_panic_und_recover/index.html +++ b/courses/go/08_defer_panic_und_recover/index.html @@ -93,5 +93,7 @@ defer fmt.Println("3. Dritter Defer") + + diff --git a/courses/go/09_goroutines_und_waitgroups/index.html b/courses/go/09_goroutines_und_waitgroups/index.html index 08a5d88..b247605 100644 --- a/courses/go/09_goroutines_und_waitgroups/index.html +++ b/courses/go/09_goroutines_und_waitgroups/index.html @@ -194,5 +194,7 @@ func main() { + + diff --git a/courses/go/10_channels_und_datenfluss/index.html b/courses/go/10_channels_und_datenfluss/index.html index 1d9e47e..0ac82fd 100644 --- a/courses/go/10_channels_und_datenfluss/index.html +++ b/courses/go/10_channels_und_datenfluss/index.html @@ -169,5 +169,7 @@ func Consume(in <-chan int) { + + diff --git a/courses/go/11_select_und_timeouts/index.html b/courses/go/11_select_und_timeouts/index.html index fa982ef..a86526a 100644 --- a/courses/go/11_select_und_timeouts/index.html +++ b/courses/go/11_select_und_timeouts/index.html @@ -182,5 +182,7 @@ func main() { + + diff --git a/courses/go/12_mutex_und_thread_safety/index.html b/courses/go/12_mutex_und_thread_safety/index.html index 2ffdaf6..ff370e5 100644 --- a/courses/go/12_mutex_und_thread_safety/index.html +++ b/courses/go/12_mutex_und_thread_safety/index.html @@ -182,5 +182,7 @@ func GetTotalRequests() int64 { + + diff --git a/courses/go/13_http_server_und_routing/index.html b/courses/go/13_http_server_und_routing/index.html index cd1d3d8..282b78c 100644 --- a/courses/go/13_http_server_und_routing/index.html +++ b/courses/go/13_http_server_und_routing/index.html @@ -182,5 +182,7 @@ func main() { + + diff --git a/courses/go/14_json_apis_und_middleware/index.html b/courses/go/14_json_apis_und_middleware/index.html index 664ea86..7d4e3f8 100644 --- a/courses/go/14_json_apis_und_middleware/index.html +++ b/courses/go/14_json_apis_und_middleware/index.html @@ -173,5 +173,7 @@ func AuthMiddleware(secretKey string) func(http.Handler) http.Handler { + + diff --git a/courses/go/15_unit_testing_und_benchmarks/index.html b/courses/go/15_unit_testing_und_benchmarks/index.html index 356ca85..6e76163 100644 --- a/courses/go/15_unit_testing_und_benchmarks/index.html +++ b/courses/go/15_unit_testing_und_benchmarks/index.html @@ -173,5 +173,7 @@ func TestAdd(t *testing.T) { + + diff --git a/courses/go/16_master_abschlussprojekt_microservice/index.html b/courses/go/16_master_abschlussprojekt_microservice/index.html index 99dbfe8..277aa76 100644 --- a/courses/go/16_master_abschlussprojekt_microservice/index.html +++ b/courses/go/16_master_abschlussprojekt_microservice/index.html @@ -153,5 +153,7 @@ + + diff --git a/courses/html_css/01_semantisches_html_und_struktur/index.html b/courses/html_css/01_semantisches_html_und_struktur/index.html index 5084cf3..6a5e78c 100644 --- a/courses/html_css/01_semantisches_html_und_struktur/index.html +++ b/courses/html_css/01_semantisches_html_und_struktur/index.html @@ -165,5 +165,7 @@ + + diff --git a/courses/html_css/02_texte_listen_und_medien/index.html b/courses/html_css/02_texte_listen_und_medien/index.html index a40a86a..199a31f 100644 --- a/courses/html_css/02_texte_listen_und_medien/index.html +++ b/courses/html_css/02_texte_listen_und_medien/index.html @@ -154,5 +154,7 @@ + + diff --git a/courses/html_css/03_formulare_und_validierung/index.html b/courses/html_css/03_formulare_und_validierung/index.html index a66c761..8ec544c 100644 --- a/courses/html_css/03_formulare_und_validierung/index.html +++ b/courses/html_css/03_formulare_und_validierung/index.html @@ -139,5 +139,7 @@ + + diff --git a/courses/html_css/04_barrierefreiheit_und_aria/index.html b/courses/html_css/04_barrierefreiheit_und_aria/index.html index 365cf37..2af9275 100644 --- a/courses/html_css/04_barrierefreiheit_und_aria/index.html +++ b/courses/html_css/04_barrierefreiheit_und_aria/index.html @@ -157,5 +157,7 @@ + + diff --git a/courses/html_css/05_css_selektoren_und_kaskade/index.html b/courses/html_css/05_css_selektoren_und_kaskade/index.html index 6e8a7f1..04249bd 100644 --- a/courses/html_css/05_css_selektoren_und_kaskade/index.html +++ b/courses/html_css/05_css_selektoren_und_kaskade/index.html @@ -107,5 +107,7 @@ tr:nth-child(odd) { background-color: #ffffff; } + + diff --git a/courses/html_css/06_box_modell_und_abstaende/index.html b/courses/html_css/06_box_modell_und_abstaende/index.html index 85bafae..b72be51 100644 --- a/courses/html_css/06_box_modell_und_abstaende/index.html +++ b/courses/html_css/06_box_modell_und_abstaende/index.html @@ -153,5 +153,7 @@ + + diff --git a/courses/html_css/07_css_variablen_und_farbwelten/index.html b/courses/html_css/07_css_variablen_und_farbwelten/index.html index 873744c..3a3bbfa 100644 --- a/courses/html_css/07_css_variablen_und_farbwelten/index.html +++ b/courses/html_css/07_css_variablen_und_farbwelten/index.html @@ -127,5 +127,7 @@ + + diff --git a/courses/html_css/08_typografie_und_webfonts/index.html b/courses/html_css/08_typografie_und_webfonts/index.html index cca1497..739342a 100644 --- a/courses/html_css/08_typografie_und_webfonts/index.html +++ b/courses/html_css/08_typografie_und_webfonts/index.html @@ -143,5 +143,7 @@ p { font-size: 1rem; font-weight: 400; line-height: 1.65; } /* 16px, Lesefre + + diff --git a/courses/html_css/09_flexbox_achsen_und_alignment/index.html b/courses/html_css/09_flexbox_achsen_und_alignment/index.html index ef52a1f..6424ba3 100644 --- a/courses/html_css/09_flexbox_achsen_und_alignment/index.html +++ b/courses/html_css/09_flexbox_achsen_und_alignment/index.html @@ -193,5 +193,7 @@ + + diff --git a/courses/html_css/10_css_grid_und_areas/index.html b/courses/html_css/10_css_grid_und_areas/index.html index fc59a49..bc1cbbe 100644 --- a/courses/html_css/10_css_grid_und_areas/index.html +++ b/courses/html_css/10_css_grid_und_areas/index.html @@ -137,5 +137,7 @@ + + diff --git a/courses/html_css/11_media_queries_und_mobile_first/index.html b/courses/html_css/11_media_queries_und_mobile_first/index.html index cb73b0b..2fe1f5a 100644 --- a/courses/html_css/11_media_queries_und_mobile_first/index.html +++ b/courses/html_css/11_media_queries_und_mobile_first/index.html @@ -113,5 +113,7 @@ h1.hero-title { + + diff --git a/courses/html_css/12_transitions_und_animationen/index.html b/courses/html_css/12_transitions_und_animationen/index.html index 9715f12..785aea7 100644 --- a/courses/html_css/12_transitions_und_animationen/index.html +++ b/courses/html_css/12_transitions_und_animationen/index.html @@ -175,5 +175,7 @@ + + diff --git a/courses/html_css/13_bem_methodik_und_modularitaet/index.html b/courses/html_css/13_bem_methodik_und_modularitaet/index.html index 29c6328..7057779 100644 --- a/courses/html_css/13_bem_methodik_und_modularitaet/index.html +++ b/courses/html_css/13_bem_methodik_und_modularitaet/index.html @@ -130,5 +130,7 @@ + + diff --git a/courses/html_css/14_dark_mode_und_themes/index.html b/courses/html_css/14_dark_mode_und_themes/index.html index bbfac0f..d3f2833 100644 --- a/courses/html_css/14_dark_mode_und_themes/index.html +++ b/courses/html_css/14_dark_mode_und_themes/index.html @@ -132,5 +132,7 @@ body { + + diff --git a/courses/html_css/15_moderne_ui_komponenten/index.html b/courses/html_css/15_moderne_ui_komponenten/index.html index ee07af0..0427d47 100644 --- a/courses/html_css/15_moderne_ui_komponenten/index.html +++ b/courses/html_css/15_moderne_ui_komponenten/index.html @@ -129,5 +129,7 @@ dialog::backdrop { + + diff --git a/courses/html_css/16_master_abschlussprojekt_saas_landingpage/index.html b/courses/html_css/16_master_abschlussprojekt_saas_landingpage/index.html index 7d60123..e7f9c8d 100644 --- a/courses/html_css/16_master_abschlussprojekt_saas_landingpage/index.html +++ b/courses/html_css/16_master_abschlussprojekt_saas_landingpage/index.html @@ -114,5 +114,7 @@ + + diff --git a/courses/ihk_ap1/01_lf1_unternehmen_und_arbeitsplatz/index.html b/courses/ihk_ap1/01_lf1_unternehmen_und_arbeitsplatz/index.html index 028ae48..1b8c729 100644 --- a/courses/ihk_ap1/01_lf1_unternehmen_und_arbeitsplatz/index.html +++ b/courses/ihk_ap1/01_lf1_unternehmen_und_arbeitsplatz/index.html @@ -297,5 +297,7 @@ Qualitative Kriterien: 1. Know-how-Aufbau und Datensicherheit im eigenen Haus; 2 Nächstes Modul → + + diff --git a/courses/ihk_ap1/02_lf2_arbeitsplaetze_ausstatten/index.html b/courses/ihk_ap1/02_lf2_arbeitsplaetze_ausstatten/index.html index e8e7b20..c0815de 100644 --- a/courses/ihk_ap1/02_lf2_arbeitsplaetze_ausstatten/index.html +++ b/courses/ihk_ap1/02_lf2_arbeitsplaetze_ausstatten/index.html @@ -414,5 +414,7 @@ Burn-In-Risiko: IPS hat kein Burn-In; bei OLED besteht bei statischen Office-Ele Nächstes Modul → + + diff --git a/courses/ihk_ap1/03_lf3_clients_in_netzwerke_einbinden/index.html b/courses/ihk_ap1/03_lf3_clients_in_netzwerke_einbinden/index.html index 08b8e01..83c375a 100644 --- a/courses/ihk_ap1/03_lf3_clients_in_netzwerke_einbinden/index.html +++ b/courses/ihk_ap1/03_lf3_clients_in_netzwerke_einbinden/index.html @@ -505,5 +505,7 @@ RRSIG (Resource Record Signature): Enthält die kryptografische Signatur über e Nächstes Modul → + + diff --git a/courses/ihk_ap1/04_lf4_schutzbedarfsanalyse_und_cybersicherheit/index.html b/courses/ihk_ap1/04_lf4_schutzbedarfsanalyse_und_cybersicherheit/index.html index c2b282d..9528f5e 100644 --- a/courses/ihk_ap1/04_lf4_schutzbedarfsanalyse_und_cybersicherheit/index.html +++ b/courses/ihk_ap1/04_lf4_schutzbedarfsanalyse_und_cybersicherheit/index.html @@ -470,5 +470,7 @@ Drei Säulen: 1. Identitätsbasierte Zugriffskontrolle (starke MFA, Kontextprüf Nächstes Modul → + + diff --git a/courses/ihk_ap1/05_lf5_software_zur_datenverwaltung/index.html b/courses/ihk_ap1/05_lf5_software_zur_datenverwaltung/index.html index 31a672d..680dcb5 100644 --- a/courses/ihk_ap1/05_lf5_software_zur_datenverwaltung/index.html +++ b/courses/ihk_ap1/05_lf5_software_zur_datenverwaltung/index.html @@ -457,5 +457,7 @@ Syntax-Erklärung: Nächstes Modul → + + diff --git a/courses/ihk_ap1/06_lf6_cyber_physische_systeme_iot/index.html b/courses/ihk_ap1/06_lf6_cyber_physische_systeme_iot/index.html index 66a408d..64a70cf 100644 --- a/courses/ihk_ap1/06_lf6_cyber_physische_systeme_iot/index.html +++ b/courses/ihk_ap1/06_lf6_cyber_physische_systeme_iot/index.html @@ -199,5 +199,7 @@ Modbus TCP: Basiert auf Standard-Ethernet und TCP/IP (Standard-Port 502). Adress Nächstes Modul → + + diff --git a/courses/ihk_ap1/07_lf7_instandhaltung_und_fehlerdiagnose/index.html b/courses/ihk_ap1/07_lf7_instandhaltung_und_fehlerdiagnose/index.html index 698e1d0..d2a3a10 100644 --- a/courses/ihk_ap1/07_lf7_instandhaltung_und_fehlerdiagnose/index.html +++ b/courses/ihk_ap1/07_lf7_instandhaltung_und_fehlerdiagnose/index.html @@ -187,5 +187,7 @@ CAT-Einstufung (Überspannungskategorien): CAT II gilt für Geräte an normalen Nächstes Modul → + + diff --git a/courses/ihk_ap1/08_lf8_datenfluesse_und_schnittstellen/index.html b/courses/ihk_ap1/08_lf8_datenfluesse_und_schnittstellen/index.html index 8c515f1..4bfc601 100644 --- a/courses/ihk_ap1/08_lf8_datenfluesse_und_schnittstellen/index.html +++ b/courses/ihk_ap1/08_lf8_datenfluesse_und_schnittstellen/index.html @@ -194,5 +194,7 @@ Webhook (Push-Prinzip): Der Client registriert eine Empfänger-URL beim Server. Nächstes Modul → + + diff --git a/courses/ihk_ap1/09_trace_tabellen_trainer/index.html b/courses/ihk_ap1/09_trace_tabellen_trainer/index.html index 080b34a..aa074da 100644 --- a/courses/ihk_ap1/09_trace_tabellen_trainer/index.html +++ b/courses/ihk_ap1/09_trace_tabellen_trainer/index.html @@ -28,5 +28,7 @@ ↑ Nach oben + + \ No newline at end of file diff --git a/courses/ihk_ap1/10_sql_datenbank_labor/index.html b/courses/ihk_ap1/10_sql_datenbank_labor/index.html index 8a9c346..1dd0e20 100644 --- a/courses/ihk_ap1/10_sql_datenbank_labor/index.html +++ b/courses/ihk_ap1/10_sql_datenbank_labor/index.html @@ -39,5 +39,7 @@ ORDER BY anzahl_bestellungen DESC; ↑ Nach oben + + \ No newline at end of file diff --git a/courses/ihk_ap1/11_subnetting_drill_master/index.html b/courses/ihk_ap1/11_subnetting_drill_master/index.html index 998f138..a262a3c 100644 --- a/courses/ihk_ap1/11_subnetting_drill_master/index.html +++ b/courses/ihk_ap1/11_subnetting_drill_master/index.html @@ -28,5 +28,7 @@ ↑ Nach oben + + \ No newline at end of file diff --git a/courses/ihk_ap1/12_ap1_probepruefung_simulation/index.html b/courses/ihk_ap1/12_ap1_probepruefung_simulation/index.html index 48e2d76..1244b8f 100644 --- a/courses/ihk_ap1/12_ap1_probepruefung_simulation/index.html +++ b/courses/ihk_ap1/12_ap1_probepruefung_simulation/index.html @@ -186,5 +186,7 @@ AUSGABE alarm, versuche + + \ No newline at end of file diff --git a/courses/ihk_ap2_fisi/01_lf9_netzwerke_und_dienste/index.html b/courses/ihk_ap2_fisi/01_lf9_netzwerke_und_dienste/index.html index 4ce38ba..075776f 100644 --- a/courses/ihk_ap2_fisi/01_lf9_netzwerke_und_dienste/index.html +++ b/courses/ihk_ap2_fisi/01_lf9_netzwerke_und_dienste/index.html @@ -388,5 +388,7 @@ Roaming: WireGuard bindet Sitzungen an kryptografische Schlüssel und öffentlic Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/02_lf10_serverdienste_und_automation/index.html b/courses/ihk_ap2_fisi/02_lf10_serverdienste_und_automation/index.html index ee368d1..5757ed7 100644 --- a/courses/ihk_ap2_fisi/02_lf10_serverdienste_und_automation/index.html +++ b/courses/ihk_ap2_fisi/02_lf10_serverdienste_und_automation/index.html @@ -254,5 +254,7 @@ Dynamic ARP Inspection (DAI): Verhindert ARP-Spoofing/Poisoning. Der Switch fän Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/03_lf11_speicher_und_hochverfuegbarkeit/index.html b/courses/ihk_ap2_fisi/03_lf11_speicher_und_hochverfuegbarkeit/index.html index 37a1157..1d581e8 100644 --- a/courses/ihk_ap2_fisi/03_lf11_speicher_und_hochverfuegbarkeit/index.html +++ b/courses/ihk_ap2_fisi/03_lf11_speicher_und_hochverfuegbarkeit/index.html @@ -279,5 +279,7 @@ Asynchrone Replikation: Der Schreibbefehl wird der Anwendung sofort nach dem Sch Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/04_lf12_virtualisierung_und_cloud/index.html b/courses/ihk_ap2_fisi/04_lf12_virtualisierung_und_cloud/index.html index b9428d4..54dbde6 100644 --- a/courses/ihk_ap2_fisi/04_lf12_virtualisierung_und_cloud/index.html +++ b/courses/ihk_ap2_fisi/04_lf12_virtualisierung_und_cloud/index.html @@ -255,5 +255,7 @@ Metriktypen: Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/05_wiso_arbeitsrecht_und_wirtschaft/index.html b/courses/ihk_ap2_fisi/05_wiso_arbeitsrecht_und_wirtschaft/index.html index 8948589..c634605 100644 --- a/courses/ihk_ap2_fisi/05_wiso_arbeitsrecht_und_wirtschaft/index.html +++ b/courses/ihk_ap2_fisi/05_wiso_arbeitsrecht_und_wirtschaft/index.html @@ -498,5 +498,7 @@ Zeichnung: Prokurist zeichnet mit "per procura" / "ppa. Vorname Nachname"; Handl Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/06_betriebliche_projektarbeit_guide/index.html b/courses/ihk_ap2_fisi/06_betriebliche_projektarbeit_guide/index.html index a2aba4f..29cdd4d 100644 --- a/courses/ihk_ap2_fisi/06_betriebliche_projektarbeit_guide/index.html +++ b/courses/ihk_ap2_fisi/06_betriebliche_projektarbeit_guide/index.html @@ -55,5 +55,7 @@ Nächstes Modul → + + diff --git a/courses/ihk_ap2_fisi/07_ap2_teil_1_probepruefung/index.html b/courses/ihk_ap2_fisi/07_ap2_teil_1_probepruefung/index.html index 37fc572..106a849 100644 --- a/courses/ihk_ap2_fisi/07_ap2_teil_1_probepruefung/index.html +++ b/courses/ihk_ap2_fisi/07_ap2_teil_1_probepruefung/index.html @@ -161,5 +161,7 @@ if (mwGesamt > 80 || mwVormittag > 80 || mwNachmittag > 80) { + + \ No newline at end of file diff --git a/courses/ihk_ap2_fisi/08_ap2_teil_2_probepruefung/index.html b/courses/ihk_ap2_fisi/08_ap2_teil_2_probepruefung/index.html index b352950..5a18c61 100644 --- a/courses/ihk_ap2_fisi/08_ap2_teil_2_probepruefung/index.html +++ b/courses/ihk_ap2_fisi/08_ap2_teil_2_probepruefung/index.html @@ -121,5 +121,7 @@ + + \ No newline at end of file diff --git a/courses/ihk_ap2_fisi/09_ap2_wiso_probepruefung/index.html b/courses/ihk_ap2_fisi/09_ap2_wiso_probepruefung/index.html index 1f2aa26..d1dc37e 100644 --- a/courses/ihk_ap2_fisi/09_ap2_wiso_probepruefung/index.html +++ b/courses/ihk_ap2_fisi/09_ap2_wiso_probepruefung/index.html @@ -125,5 +125,7 @@ + + \ No newline at end of file diff --git a/courses/java/01_java_syntax_und_primitive_typen/index.html b/courses/java/01_java_syntax_und_primitive_typen/index.html index 1b31119..b61f5b2 100644 --- a/courses/java/01_java_syntax_und_primitive_typen/index.html +++ b/courses/java/01_java_syntax_und_primitive_typen/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/02_kontrollfluss_und_verzweigungen/index.html b/courses/java/02_kontrollfluss_und_verzweigungen/index.html index b366041..51c64e8 100644 --- a/courses/java/02_kontrollfluss_und_verzweigungen/index.html +++ b/courses/java/02_kontrollfluss_und_verzweigungen/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/03_schleifen_und_arrays/index.html b/courses/java/03_schleifen_und_arrays/index.html index de42fe7..e48b491 100644 --- a/courses/java/03_schleifen_und_arrays/index.html +++ b/courses/java/03_schleifen_und_arrays/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/04_methoden_und_parameter/index.html b/courses/java/04_methoden_und_parameter/index.html index dc6b476..0e7118d 100644 --- a/courses/java/04_methoden_und_parameter/index.html +++ b/courses/java/04_methoden_und_parameter/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/05_klassen_objekte_und_konstruktoren/index.html b/courses/java/05_klassen_objekte_und_konstruktoren/index.html index 99a9343..619325a 100644 --- a/courses/java/05_klassen_objekte_und_konstruktoren/index.html +++ b/courses/java/05_klassen_objekte_und_konstruktoren/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/06_kapselung_und_records/index.html b/courses/java/06_kapselung_und_records/index.html index f4c06e1..2934a6f 100644 --- a/courses/java/06_kapselung_und_records/index.html +++ b/courses/java/06_kapselung_und_records/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/07_vererbung_polymorphie_und_super/index.html b/courses/java/07_vererbung_polymorphie_und_super/index.html index 8afd12e..c1616d3 100644 --- a/courses/java/07_vererbung_polymorphie_und_super/index.html +++ b/courses/java/07_vererbung_polymorphie_und_super/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/08_interfaces_und_default_methods/index.html b/courses/java/08_interfaces_und_default_methods/index.html index 7f244b5..8105793 100644 --- a/courses/java/08_interfaces_und_default_methods/index.html +++ b/courses/java/08_interfaces_und_default_methods/index.html @@ -15,5 +15,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/09_generics_und_type_safety/index.html b/courses/java/09_generics_und_type_safety/index.html index ee8894d..7cef02c 100644 --- a/courses/java/09_generics_und_type_safety/index.html +++ b/courses/java/09_generics_und_type_safety/index.html @@ -176,5 +176,7 @@ public static <T> void copy(List<? extends T> src, List<? super T + + diff --git a/courses/java/10_collections_framework_list_set_map/index.html b/courses/java/10_collections_framework_list_set_map/index.html index 97826b8..d9159fc 100644 --- a/courses/java/10_collections_framework_list_set_map/index.html +++ b/courses/java/10_collections_framework_list_set_map/index.html @@ -152,5 +152,7 @@ byCategory.computeIfAbsent("Hardware", k -> new ArrayList<>()).add(new + + diff --git a/courses/java/11_exceptions_und_ressourcenmanagement/index.html b/courses/java/11_exceptions_und_ressourcenmanagement/index.html index cc71873..5bf7a8c 100644 --- a/courses/java/11_exceptions_und_ressourcenmanagement/index.html +++ b/courses/java/11_exceptions_und_ressourcenmanagement/index.html @@ -142,5 +142,7 @@ + + diff --git a/courses/java/12_lambdas_streams_api_und_optional/index.html b/courses/java/12_lambdas_streams_api_und_optional/index.html index b618bed..6e97772 100644 --- a/courses/java/12_lambdas_streams_api_und_optional/index.html +++ b/courses/java/12_lambdas_streams_api_und_optional/index.html @@ -154,5 +154,7 @@ List<String> topPerformers = employees.stream() + + diff --git a/courses/java/13_dateien_json_und_persistenz/index.html b/courses/java/13_dateien_json_und_persistenz/index.html index 6b2cd5f..dda5e83 100644 --- a/courses/java/13_dateien_json_und_persistenz/index.html +++ b/courses/java/13_dateien_json_und_persistenz/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/14_multithreading_und_virtual_threads/index.html b/courses/java/14_multithreading_und_virtual_threads/index.html index a6fe71f..ce2e806 100644 --- a/courses/java/14_multithreading_und_virtual_threads/index.html +++ b/courses/java/14_multithreading_und_virtual_threads/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/15_junit_5_automatisiertes_unit_testing/index.html b/courses/java/15_junit_5_automatisiertes_unit_testing/index.html index 0ac7c5c..603938f 100644 --- a/courses/java/15_junit_5_automatisiertes_unit_testing/index.html +++ b/courses/java/15_junit_5_automatisiertes_unit_testing/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/java/16_master_abschlussprojekt_banking_system/index.html b/courses/java/16_master_abschlussprojekt_banking_system/index.html index ddcabc2..8f727f8 100644 --- a/courses/java/16_master_abschlussprojekt_banking_system/index.html +++ b/courses/java/16_master_abschlussprojekt_banking_system/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/javascript/01_erste_schritte_variablen/index.html b/courses/javascript/01_erste_schritte_variablen/index.html index 26a2b6b..605ffb8 100644 --- a/courses/javascript/01_erste_schritte_variablen/index.html +++ b/courses/javascript/01_erste_schritte_variablen/index.html @@ -54,5 +54,7 @@ console.log(text); + + diff --git a/courses/javascript/02_kontrollfluss_und_schleifen/index.html b/courses/javascript/02_kontrollfluss_und_schleifen/index.html index dae339f..d40cd07 100644 --- a/courses/javascript/02_kontrollfluss_und_schleifen/index.html +++ b/courses/javascript/02_kontrollfluss_und_schleifen/index.html @@ -183,5 +183,7 @@ while (countdown > 0) { + + diff --git a/courses/javascript/03_funktionen_und_scope/index.html b/courses/javascript/03_funktionen_und_scope/index.html index 58ff42e..1fbcc73 100644 --- a/courses/javascript/03_funktionen_und_scope/index.html +++ b/courses/javascript/03_funktionen_und_scope/index.html @@ -164,5 +164,7 @@ console.log(zaehlerB()); // 101 (Komplett unabhängig von zaehlerA!) + + diff --git a/courses/javascript/04_arrays_sets_und_maps/index.html b/courses/javascript/04_arrays_sets_und_maps/index.html index 0ff7acc..c71a534 100644 --- a/courses/javascript/04_arrays_sets_und_maps/index.html +++ b/courses/javascript/04_arrays_sets_und_maps/index.html @@ -176,5 +176,7 @@ const lexikon = new Map([ + + diff --git a/courses/javascript/05_objekte_und_destructuring/index.html b/courses/javascript/05_objekte_und_destructuring/index.html index b77f0f4..45fc44b 100644 --- a/courses/javascript/05_objekte_und_destructuring/index.html +++ b/courses/javascript/05_objekte_und_destructuring/index.html @@ -168,5 +168,7 @@ console.log(restlicheDaten); // { name: "Lisa", alter: 28, stadt: "Hamburg", sta + + diff --git a/courses/javascript/06_klassen_und_oop/index.html b/courses/javascript/06_klassen_und_oop/index.html index 7c89ac8..cd23320 100644 --- a/courses/javascript/06_klassen_und_oop/index.html +++ b/courses/javascript/06_klassen_und_oop/index.html @@ -331,5 +331,7 @@ console.log(meinTesla.beschreibung()); + + diff --git a/courses/javascript/07_regex_und_textverarbeitung/index.html b/courses/javascript/07_regex_und_textverarbeitung/index.html index 2f2f8b3..56dc191 100644 --- a/courses/javascript/07_regex_und_textverarbeitung/index.html +++ b/courses/javascript/07_regex_und_textverarbeitung/index.html @@ -236,5 +236,7 @@ console.log(maskiert); // "... Tel: 0171-XXXX." + + diff --git a/courses/javascript/08_fehlerbehandlung_und_debugging/index.html b/courses/javascript/08_fehlerbehandlung_und_debugging/index.html index e016947..941dbc0 100644 --- a/courses/javascript/08_fehlerbehandlung_und_debugging/index.html +++ b/courses/javascript/08_fehlerbehandlung_und_debugging/index.html @@ -248,5 +248,7 @@ class ValidierungsFehler extends AnwendungsFehler { + + diff --git a/courses/javascript/09_dom_und_events/index.html b/courses/javascript/09_dom_und_events/index.html index 0a225e5..dcb3e1f 100644 --- a/courses/javascript/09_dom_und_events/index.html +++ b/courses/javascript/09_dom_und_events/index.html @@ -161,5 +161,7 @@ saveBtn.addEventListener("click", (event) => { + + diff --git a/courses/javascript/10_web_storage_und_json/index.html b/courses/javascript/10_web_storage_und_json/index.html index 9c1f9fd..98ed1da 100644 --- a/courses/javascript/10_web_storage_und_json/index.html +++ b/courses/javascript/10_web_storage_und_json/index.html @@ -192,5 +192,7 @@ localStorage.removeItem("user_profile"); + + diff --git a/courses/javascript/11_callbacks_und_promises/index.html b/courses/javascript/11_callbacks_und_promises/index.html index 8c2f0b8..a52e635 100644 --- a/courses/javascript/11_callbacks_und_promises/index.html +++ b/courses/javascript/11_callbacks_und_promises/index.html @@ -200,5 +200,7 @@ Promise.all([quelleA, quelleB]) + + diff --git a/courses/javascript/12_async_await_und_fetch/index.html b/courses/javascript/12_async_await_und_fetch/index.html index de850ff..fa453d3 100644 --- a/courses/javascript/12_async_await_und_fetch/index.html +++ b/courses/javascript/12_async_await_und_fetch/index.html @@ -186,5 +186,7 @@ + + diff --git a/courses/javascript/13_es_module_und_architektur/index.html b/courses/javascript/13_es_module_und_architektur/index.html index f0d30b7..5a60e7a 100644 --- a/courses/javascript/13_es_module_und_architektur/index.html +++ b/courses/javascript/13_es_module_und_architektur/index.html @@ -148,5 +148,7 @@ import * as Formatters from "./utils/format.js"; + + diff --git a/courses/javascript/14_einstieg_typescript/index.html b/courses/javascript/14_einstieg_typescript/index.html index 1f64f1d..dcd2ed4 100644 --- a/courses/javascript/14_einstieg_typescript/index.html +++ b/courses/javascript/14_einstieg_typescript/index.html @@ -172,5 +172,7 @@ const strings = umkehren(["A", "B", "C"]); // Typ bleibt string[] + + diff --git a/courses/javascript/15_typescript_fortgeschritten/index.html b/courses/javascript/15_typescript_fortgeschritten/index.html index f0b3c03..cdd511a 100644 --- a/courses/javascript/15_typescript_fortgeschritten/index.html +++ b/courses/javascript/15_typescript_fortgeschritten/index.html @@ -152,5 +152,7 @@ const taskPage: PaginiertesErgebnis<Task> = erstellePaginiertesErgebnis(ta + + diff --git a/courses/javascript/16_master_abschlussprojekt_web_app/index.html b/courses/javascript/16_master_abschlussprojekt_web_app/index.html index aaa0fc6..702976f 100644 --- a/courses/javascript/16_master_abschlussprojekt_web_app/index.html +++ b/courses/javascript/16_master_abschlussprojekt_web_app/index.html @@ -176,5 +176,7 @@ + + diff --git a/courses/powershell/01_powershell_konsole_und_cmdlet_architektur/index.html b/courses/powershell/01_powershell_konsole_und_cmdlet_architektur/index.html index 7324d6c..dd9a4fd 100644 --- a/courses/powershell/01_powershell_konsole_und_cmdlet_architektur/index.html +++ b/courses/powershell/01_powershell_konsole_und_cmdlet_architektur/index.html @@ -167,5 +167,7 @@ Get-Help Get-Service -Detailed + + diff --git a/courses/powershell/02_die_objekt_pipeline_und_get_member/index.html b/courses/powershell/02_die_objekt_pipeline_und_get_member/index.html index 7d1b4e8..2e5d139 100644 --- a/courses/powershell/02_die_objekt_pipeline_und_get_member/index.html +++ b/courses/powershell/02_die_objekt_pipeline_und_get_member/index.html @@ -143,5 +143,7 @@ $memoryMB = [Math]::Round(104857600 / 1MB, 2) # 100 MB + + diff --git a/courses/powershell/03_filterung_sortierung_und_projektion/index.html b/courses/powershell/03_filterung_sortierung_und_projektion/index.html index 1492bf5..c37199b 100644 --- a/courses/powershell/03_filterung_sortierung_und_projektion/index.html +++ b/courses/powershell/03_filterung_sortierung_und_projektion/index.html @@ -141,5 +141,7 @@ Get-Service | Group-Object -Property Status | Select-Object Name, Count + + diff --git a/courses/powershell/04_variablen_datentypen_und_pscustomobject/index.html b/courses/powershell/04_variablen_datentypen_und_pscustomobject/index.html index e1fba67..5546988 100644 --- a/courses/powershell/04_variablen_datentypen_und_pscustomobject/index.html +++ b/courses/powershell/04_variablen_datentypen_und_pscustomobject/index.html @@ -153,5 +153,7 @@ $serverInfo | ConvertTo-Json + + diff --git a/courses/powershell/05_kontrollfluss_und_moderne_operatoren/index.html b/courses/powershell/05_kontrollfluss_und_moderne_operatoren/index.html index 2b605e1..a8d6abd 100644 --- a/courses/powershell/05_kontrollfluss_und_moderne_operatoren/index.html +++ b/courses/powershell/05_kontrollfluss_und_moderne_operatoren/index.html @@ -162,5 +162,7 @@ switch -Regex ($logLine) { + + diff --git a/courses/powershell/06_schleifen_und_pipeline_durchlaeufe/index.html b/courses/powershell/06_schleifen_und_pipeline_durchlaeufe/index.html index 36fc8c6..691f0a5 100644 --- a/courses/powershell/06_schleifen_und_pipeline_durchlaeufe/index.html +++ b/courses/powershell/06_schleifen_und_pipeline_durchlaeufe/index.html @@ -175,5 +175,7 @@ foreach ($item in 1..10) { + + diff --git a/courses/powershell/07_erweiterte_funktionen_und_parameter/index.html b/courses/powershell/07_erweiterte_funktionen_und_parameter/index.html index 0aceb25..1101381 100644 --- a/courses/powershell/07_erweiterte_funktionen_und_parameter/index.html +++ b/courses/powershell/07_erweiterte_funktionen_und_parameter/index.html @@ -174,5 +174,7 @@ + + diff --git a/courses/powershell/08_robustes_error_handling_und_try_catch/index.html b/courses/powershell/08_robustes_error_handling_und_try_catch/index.html index 695cbb8..dcec28c 100644 --- a/courses/powershell/08_robustes_error_handling_und_try_catch/index.html +++ b/courses/powershell/08_robustes_error_handling_und_try_catch/index.html @@ -171,5 +171,7 @@ finally { + + diff --git a/courses/powershell/09_multithreading_mit_foreach_object_parallel/index.html b/courses/powershell/09_multithreading_mit_foreach_object_parallel/index.html index 3a434b3..af16bdc 100644 --- a/courses/powershell/09_multithreading_mit_foreach_object_parallel/index.html +++ b/courses/powershell/09_multithreading_mit_foreach_object_parallel/index.html @@ -136,5 +136,7 @@ $results = $servers | ForEach-Object -Parallel { + + diff --git a/courses/powershell/10_json_csv_xml_und_rest_apis/index.html b/courses/powershell/10_json_csv_xml_und_rest_apis/index.html index 56ff312..2fb1662 100644 --- a/courses/powershell/10_json_csv_xml_und_rest_apis/index.html +++ b/courses/powershell/10_json_csv_xml_und_rest_apis/index.html @@ -130,5 +130,7 @@ $jsonConfig = $nodes | ConvertTo-Json -Depth 10 + + diff --git a/courses/powershell/11_dateisystem_registry_und_psprovider/index.html b/courses/powershell/11_dateisystem_registry_und_psprovider/index.html index 35fa682..219212e 100644 --- a/courses/powershell/11_dateisystem_registry_und_psprovider/index.html +++ b/courses/powershell/11_dateisystem_registry_und_psprovider/index.html @@ -110,5 +110,7 @@ New-PSDrive -Name "LogStore" -PSProvider FileSystem -Root "/var/log" + + diff --git a/courses/powershell/12_sicherheit_und_credentials_management/index.html b/courses/powershell/12_sicherheit_und_credentials_management/index.html index 9569a01..8f7261e 100644 --- a/courses/powershell/12_sicherheit_und_credentials_management/index.html +++ b/courses/powershell/12_sicherheit_und_credentials_management/index.html @@ -118,5 +118,7 @@ $plain = $credential.GetNetworkCredential().Password + + diff --git a/courses/powershell/13_modul_entwicklung_und_manifeste/index.html b/courses/powershell/13_modul_entwicklung_und_manifeste/index.html index 5ee1c1e..a7a36d4 100644 --- a/courses/powershell/13_modul_entwicklung_und_manifeste/index.html +++ b/courses/powershell/13_modul_entwicklung_und_manifeste/index.html @@ -103,5 +103,7 @@ Get-Command -Module MyModule + + diff --git a/courses/powershell/14_pester_automatisierte_unit_tests/index.html b/courses/powershell/14_pester_automatisierte_unit_tests/index.html index 00d4ee8..7b77e3d 100644 --- a/courses/powershell/14_pester_automatisierte_unit_tests/index.html +++ b/courses/powershell/14_pester_automatisierte_unit_tests/index.html @@ -121,5 +121,7 @@ + + diff --git a/courses/powershell/15_cloud_und_cross_platform_automatisierung/index.html b/courses/powershell/15_cloud_und_cross_platform_automatisierung/index.html index ac33e60..f123d5a 100644 --- a/courses/powershell/15_cloud_und_cross_platform_automatisierung/index.html +++ b/courses/powershell/15_cloud_und_cross_platform_automatisierung/index.html @@ -119,5 +119,7 @@ $vms = (aws ec2 describe-instances | ConvertFrom-Json).Reservations.Instances + + diff --git a/courses/powershell/16_master_abschlussprojekt_cloud_ops_engine/index.html b/courses/powershell/16_master_abschlussprojekt_cloud_ops_engine/index.html index a0b8806..5b3be19 100644 --- a/courses/powershell/16_master_abschlussprojekt_cloud_ops_engine/index.html +++ b/courses/powershell/16_master_abschlussprojekt_cloud_ops_engine/index.html @@ -135,5 +135,7 @@ + + diff --git a/courses/rust/01_variablen_mutabilitaet_und_typen/index.html b/courses/rust/01_variablen_mutabilitaet_und_typen/index.html index 1477e22..d0b5313 100644 --- a/courses/rust/01_variablen_mutabilitaet_und_typen/index.html +++ b/courses/rust/01_variablen_mutabilitaet_und_typen/index.html @@ -158,5 +158,7 @@ println!("Geparster Integer: {}", input); + + diff --git a/courses/rust/02_das_ownership_und_borrowing_system/index.html b/courses/rust/02_das_ownership_und_borrowing_system/index.html index dca3704..b9b0e72 100644 --- a/courses/rust/02_das_ownership_und_borrowing_system/index.html +++ b/courses/rust/02_das_ownership_und_borrowing_system/index.html @@ -150,5 +150,7 @@ r_mut.push_str(" 2024"); + + diff --git a/courses/rust/03_slices_und_lifetimes_grundlagen/index.html b/courses/rust/03_slices_und_lifetimes_grundlagen/index.html index 4e11b0e..74efaf3 100644 --- a/courses/rust/03_slices_und_lifetimes_grundlagen/index.html +++ b/courses/rust/03_slices_und_lifetimes_grundlagen/index.html @@ -108,5 +108,7 @@ fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + + diff --git a/courses/rust/04_kontrollfluss_und_pattern_matching/index.html b/courses/rust/04_kontrollfluss_und_pattern_matching/index.html index fdd810e..2cb1577 100644 --- a/courses/rust/04_kontrollfluss_und_pattern_matching/index.html +++ b/courses/rust/04_kontrollfluss_und_pattern_matching/index.html @@ -114,5 +114,7 @@ let grade = match score { + + diff --git a/courses/rust/05_structs_und_impl_methoden/index.html b/courses/rust/05_structs_und_impl_methoden/index.html index aa19791..0220b59 100644 --- a/courses/rust/05_structs_und_impl_methoden/index.html +++ b/courses/rust/05_structs_und_impl_methoden/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/06_enums_und_option_monade/index.html b/courses/rust/06_enums_und_option_monade/index.html index b347b2c..db1d51b 100644 --- a/courses/rust/06_enums_und_option_monade/index.html +++ b/courses/rust/06_enums_und_option_monade/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/07_robustes_error_handling_mit_result/index.html b/courses/rust/07_robustes_error_handling_mit_result/index.html index 875600d..2889e61 100644 --- a/courses/rust/07_robustes_error_handling_mit_result/index.html +++ b/courses/rust/07_robustes_error_handling_mit_result/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/08_packages_crates_und_module/index.html b/courses/rust/08_packages_crates_und_module/index.html index d233e86..5f21c73 100644 --- a/courses/rust/08_packages_crates_und_module/index.html +++ b/courses/rust/08_packages_crates_und_module/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/09_traits_und_shared_behavior/index.html b/courses/rust/09_traits_und_shared_behavior/index.html index ac7c48c..66ef816 100644 --- a/courses/rust/09_traits_und_shared_behavior/index.html +++ b/courses/rust/09_traits_und_shared_behavior/index.html @@ -187,5 +187,7 @@ where + + diff --git a/courses/rust/10_generics_und_dynamischer_dispatch/index.html b/courses/rust/10_generics_und_dynamischer_dispatch/index.html index 8538dec..2b876ea 100644 --- a/courses/rust/10_generics_und_dynamischer_dispatch/index.html +++ b/courses/rust/10_generics_und_dynamischer_dispatch/index.html @@ -168,5 +168,7 @@ impl PluginPipeline { + + diff --git a/courses/rust/11_iteratoren_und_closures/index.html b/courses/rust/11_iteratoren_und_closures/index.html index f74585a..8d53d5f 100644 --- a/courses/rust/11_iteratoren_und_closures/index.html +++ b/courses/rust/11_iteratoren_und_closures/index.html @@ -164,5 +164,7 @@ let sum_of_even_squares: u64 = (1..=100) + + diff --git a/courses/rust/12_smart_pointer_und_speichersicherheit/index.html b/courses/rust/12_smart_pointer_und_speichersicherheit/index.html index 2ccbf0c..82a8013 100644 --- a/courses/rust/12_smart_pointer_und_speichersicherheit/index.html +++ b/courses/rust/12_smart_pointer_und_speichersicherheit/index.html @@ -149,5 +149,7 @@ println!("Aktive Handles: {}", Rc::strong_count(&shared_data)); // 3< + + diff --git a/courses/rust/13_fearless_concurrency_threads_und_channels/index.html b/courses/rust/13_fearless_concurrency_threads_und_channels/index.html index b18ad6d..788f957 100644 --- a/courses/rust/13_fearless_concurrency_threads_und_channels/index.html +++ b/courses/rust/13_fearless_concurrency_threads_und_channels/index.html @@ -145,5 +145,7 @@ for msg in rx { + + diff --git a/courses/rust/14_shared_state_concurrency/index.html b/courses/rust/14_shared_state_concurrency/index.html index ab9be41..2ba509f 100644 --- a/courses/rust/14_shared_state_concurrency/index.html +++ b/courses/rust/14_shared_state_concurrency/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/15_automatisiertes_testing_mit_cargo_test/index.html b/courses/rust/15_automatisiertes_testing_mit_cargo_test/index.html index 42d0270..b9f5be1 100644 --- a/courses/rust/15_automatisiertes_testing_mit_cargo_test/index.html +++ b/courses/rust/15_automatisiertes_testing_mit_cargo_test/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/rust/16_master_abschlussprojekt_high_speed_cache/index.html b/courses/rust/16_master_abschlussprojekt_high_speed_cache/index.html index b2b6e5d..10e20e1 100644 --- a/courses/rust/16_master_abschlussprojekt_high_speed_cache/index.html +++ b/courses/rust/16_master_abschlussprojekt_high_speed_cache/index.html @@ -19,5 +19,7 @@ 💻 In Web-IDE öffnen → + + \ No newline at end of file diff --git a/courses/sql/01_tabellen_und_select/index.html b/courses/sql/01_tabellen_und_select/index.html index d31e1ea..ded33bc 100644 --- a/courses/sql/01_tabellen_und_select/index.html +++ b/courses/sql/01_tabellen_und_select/index.html @@ -55,5 +55,7 @@ SELECT * FROM kunden WHERE guthaben > 100; + + diff --git a/courses/sql/02_filterung_und_logische_operatoren/index.html b/courses/sql/02_filterung_und_logische_operatoren/index.html index a5305be..02a4485 100644 --- a/courses/sql/02_filterung_und_logische_operatoren/index.html +++ b/courses/sql/02_filterung_und_logische_operatoren/index.html @@ -187,5 +187,7 @@ SELECT * FROM shop_artikel WHERE titel LIKE '%Pro%'; + + diff --git a/courses/sql/03_daten_aktualisieren_und_loeschen/index.html b/courses/sql/03_daten_aktualisieren_und_loeschen/index.html index c7352d7..fdec35f 100644 --- a/courses/sql/03_daten_aktualisieren_und_loeschen/index.html +++ b/courses/sql/03_daten_aktualisieren_und_loeschen/index.html @@ -144,5 +144,7 @@ ALTER TABLE mitarbeiter RENAME TO angestellte; + + diff --git a/courses/sql/04_datentypen_und_constraints/index.html b/courses/sql/04_datentypen_und_constraints/index.html index 1327da7..12948e8 100644 --- a/courses/sql/04_datentypen_und_constraints/index.html +++ b/courses/sql/04_datentypen_und_constraints/index.html @@ -133,5 +133,7 @@ + + diff --git a/courses/sql/05_foreign_keys_und_relationen/index.html b/courses/sql/05_foreign_keys_und_relationen/index.html index 82e1321..7159208 100644 --- a/courses/sql/05_foreign_keys_und_relationen/index.html +++ b/courses/sql/05_foreign_keys_und_relationen/index.html @@ -143,5 +143,7 @@ CREATE TABLE bestellungen ( + + diff --git a/courses/sql/06_inner_und_outer_joins/index.html b/courses/sql/06_inner_und_outer_joins/index.html index 35d05d4..b3fc9e5 100644 --- a/courses/sql/06_inner_und_outer_joins/index.html +++ b/courses/sql/06_inner_und_outer_joins/index.html @@ -134,5 +134,7 @@ LEFT JOIN abteilungen a ON m.abteilung_id = a.id; + + diff --git a/courses/sql/07_datenbank_normalisierung_1nf_bis_3nf/index.html b/courses/sql/07_datenbank_normalisierung_1nf_bis_3nf/index.html index 0d0ca7a..925850b 100644 --- a/courses/sql/07_datenbank_normalisierung_1nf_bis_3nf/index.html +++ b/courses/sql/07_datenbank_normalisierung_1nf_bis_3nf/index.html @@ -133,5 +133,7 @@ + + diff --git a/courses/sql/08_m_zu_n_verknuepfungstabellen/index.html b/courses/sql/08_m_zu_n_verknuepfungstabellen/index.html index 93d7beb..c5c1768 100644 --- a/courses/sql/08_m_zu_n_verknuepfungstabellen/index.html +++ b/courses/sql/08_m_zu_n_verknuepfungstabellen/index.html @@ -134,5 +134,7 @@ ORDER BY s.nachname, k.kurs_code; + + diff --git a/courses/sql/09_aggregate_und_group_by/index.html b/courses/sql/09_aggregate_und_group_by/index.html index 2843b22..bb7209a 100644 --- a/courses/sql/09_aggregate_und_group_by/index.html +++ b/courses/sql/09_aggregate_und_group_by/index.html @@ -198,5 +198,7 @@ ORDER BY umsatz_gesamt DESC; -- 4. ORDER BY sortiert das Endergebnis + + diff --git a/courses/sql/10_subqueries_und_mengenoperationen/index.html b/courses/sql/10_subqueries_und_mengenoperationen/index.html index d72d8d9..3149cec 100644 --- a/courses/sql/10_subqueries_und_mengenoperationen/index.html +++ b/courses/sql/10_subqueries_und_mengenoperationen/index.html @@ -180,5 +180,7 @@ WHERE EXISTS ( + + diff --git a/courses/sql/11_common_table_expressions_cte/index.html b/courses/sql/11_common_table_expressions_cte/index.html index cb5e2b8..418a784 100644 --- a/courses/sql/11_common_table_expressions_cte/index.html +++ b/courses/sql/11_common_table_expressions_cte/index.html @@ -191,5 +191,7 @@ SELECT * FROM organigramm ORDER BY ebene, name; + + diff --git a/courses/sql/12_window_functions_over_partition/index.html b/courses/sql/12_window_functions_over_partition/index.html index 18764a5..ed88b8c 100644 --- a/courses/sql/12_window_functions_over_partition/index.html +++ b/courses/sql/12_window_functions_over_partition/index.html @@ -171,5 +171,7 @@ FROM monats_umsatz; + + diff --git a/courses/sql/13_indizes_und_query_optimierung/index.html b/courses/sql/13_indizes_und_query_optimierung/index.html index 37acc7b..5c68bbc 100644 --- a/courses/sql/13_indizes_und_query_optimierung/index.html +++ b/courses/sql/13_indizes_und_query_optimierung/index.html @@ -170,5 +170,7 @@ WHERE kategorie_id = 1 AND preis > 500; + + diff --git a/courses/sql/14_transaktionen_acid_und_locking/index.html b/courses/sql/14_transaktionen_acid_und_locking/index.html index 7d8b212..17e9737 100644 --- a/courses/sql/14_transaktionen_acid_und_locking/index.html +++ b/courses/sql/14_transaktionen_acid_und_locking/index.html @@ -190,5 +190,7 @@ COMMIT; + + diff --git a/courses/sql/15_views_und_gespeicherte_logik/index.html b/courses/sql/15_views_und_gespeicherte_logik/index.html index 2e046b4..0e01a69 100644 --- a/courses/sql/15_views_und_gespeicherte_logik/index.html +++ b/courses/sql/15_views_und_gespeicherte_logik/index.html @@ -176,5 +176,7 @@ END; + + diff --git a/courses/sql/16_master_abschlussprojekt_data_warehouse/index.html b/courses/sql/16_master_abschlussprojekt_data_warehouse/index.html index 7f0463f..dfd9529 100644 --- a/courses/sql/16_master_abschlussprojekt_data_warehouse/index.html +++ b/courses/sql/16_master_abschlussprojekt_data_warehouse/index.html @@ -161,5 +161,7 @@ + + diff --git a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html index d6e1f5c..c144799 100644 --- a/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html +++ b/lehrpfad_1_grundlagen/01_erste_schritte_taschenrechner/index.html @@ -10,173 +10,6 @@ - - - @@ -499,6 +329,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html index dc28f39..6d20460 100644 --- a/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html +++ b/lehrpfad_1_grundlagen/02_variablen_und_datentypen/index.html @@ -10,173 +10,6 @@ - - - @@ -450,6 +280,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html index dd9d875..01f8c3e 100644 --- a/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html +++ b/lehrpfad_1_grundlagen/03_ein_und_ausgabe/index.html @@ -10,173 +10,6 @@ - - - @@ -453,6 +283,7 @@ return f"Steckbrief: {name} | Größe: {groesse_m:.2f} m | Gewicht: {gewicht_kg: - + + diff --git a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html index ad08e1c..95d41ea 100644 --- a/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html +++ b/lehrpfad_1_grundlagen/04_verzweigungen_und_bedingungen/index.html @@ -10,173 +10,6 @@ - - - @@ -485,6 +315,7 @@ return False - + + diff --git a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html index 25d8194..1b92944 100644 --- a/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html +++ b/lehrpfad_1_grundlagen/05_schleifen_und_wiederholungen/index.html @@ -10,173 +10,6 @@ - - - @@ -526,6 +356,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html index d017986..c4dd170 100644 --- a/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html +++ b/lehrpfad_1_grundlagen/06_funktionen_und_module/index.html @@ -10,173 +10,6 @@ - - - @@ -479,6 +309,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html index 9337289..dc8c5b7 100644 --- a/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html +++ b/lehrpfad_1_grundlagen/07_listen_und_sequenzen/index.html @@ -10,173 +10,6 @@ - - - @@ -470,6 +300,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html index b1977bb..bfe870d 100644 --- a/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html +++ b/lehrpfad_1_grundlagen/08_textverarbeitung_und_strings/index.html @@ -10,173 +10,6 @@ - - - @@ -425,6 +255,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html index 8211b63..f8ea781 100644 --- a/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html +++ b/lehrpfad_1_grundlagen/09_dictionaries_und_sets/index.html @@ -10,173 +10,6 @@ - - - @@ -499,6 +329,7 @@ - + + diff --git a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html index 2eadf7b..a3da5fc 100644 --- a/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html +++ b/lehrpfad_1_grundlagen/10_comprehensions_datum_algorithmen/index.html @@ -10,173 +10,6 @@ - - - @@ -449,6 +279,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html index 966a2fc..1091f2b 100644 --- a/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html +++ b/lehrpfad_2_oop_einstieg/00_fehlersuche_und_grundlagen/index.html @@ -10,173 +10,6 @@ - - - @@ -403,6 +233,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html index 2cfa1f0..9f25af7 100644 --- a/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html +++ b/lehrpfad_2_oop_einstieg/01_einstieg_klassen/index.html @@ -10,173 +10,6 @@ - - - @@ -485,6 +315,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html index 266b379..1b4bda7 100644 --- a/lehrpfad_2_oop_einstieg/02_init_und_self/index.html +++ b/lehrpfad_2_oop_einstieg/02_init_und_self/index.html @@ -10,173 +10,6 @@ - - - @@ -412,6 +242,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html index 78b3b52..429272a 100644 --- a/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html +++ b/lehrpfad_2_oop_einstieg/03_methoden_und_verhalten/index.html @@ -10,173 +10,6 @@ - - - @@ -392,6 +222,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html index 6793df8..550bdf7 100644 --- a/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html +++ b/lehrpfad_2_oop_einstieg/04_str_und_darstellung/index.html @@ -10,173 +10,6 @@ - - - @@ -399,6 +229,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html index 4d94a68..a50b494 100644 --- a/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html +++ b/lehrpfad_2_oop_einstieg/04b_umstieg_vscode/index.html @@ -10,173 +10,6 @@ - - - @@ -509,6 +339,7 @@ sudo snap install --classic code - + + diff --git a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html index ca64538..35793fb 100644 --- a/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html +++ b/lehrpfad_2_oop_einstieg/04c_git_und_versionskontrolle/index.html @@ -10,173 +10,6 @@ - - - @@ -405,6 +235,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html index 2da7128..06e77bb 100644 --- a/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html +++ b/lehrpfad_2_oop_einstieg/05_objekte_kombinieren/index.html @@ -10,173 +10,6 @@ - - - @@ -395,6 +225,7 @@ - + + diff --git a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html index f0365db..8792b52 100644 --- a/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html +++ b/lehrpfad_2_oop_einstieg/06_abschlussprojekt_tamagotchi/index.html @@ -10,173 +10,6 @@ - - - @@ -374,6 +204,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html index 2c261d6..8731a81 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/07_referenzen_und_speicher/index.html @@ -10,173 +10,6 @@ - - - @@ -425,6 +255,7 @@ STACK (Variablen-Namen) HEAP (Echter Speicher / RAM) - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html index 079d7f7..c3db4b4 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/08_operator_overloading_dunder/index.html @@ -10,173 +10,6 @@ - - - @@ -474,6 +304,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html index d4afa76..d22b461 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/09_eigene_unit_tests_schreiben/index.html @@ -10,173 +10,6 @@ - - - @@ -493,6 +323,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html index 17c8a3d..0b86ab2 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/10_vererbung_und_super/index.html @@ -10,173 +10,6 @@ - - - @@ -491,6 +321,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html index 98276ed..0a4703c 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/11_polymorphie_und_interfaces/index.html @@ -10,173 +10,6 @@ - - - @@ -524,6 +354,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html index ed0f1df..f664791 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/12_exceptions_und_fehlerbehandlung/index.html @@ -10,173 +10,6 @@ - - - @@ -453,6 +283,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html index 695d2d8..760dc22 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/13_persistenz_json_und_csv/index.html @@ -10,173 +10,6 @@ - - - @@ -441,6 +271,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html index 4cc44c1..dfa44dc 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/14_gui_mit_tkinter/index.html @@ -10,173 +10,6 @@ - - - @@ -547,6 +377,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html index d83b35e..71f4b6a 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/15_parameter_und_container/index.html @@ -10,173 +10,6 @@ - - - @@ -510,6 +340,7 @@ - + + diff --git a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html index 21a4302..0f51037 100644 --- a/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html +++ b/lehrpfad_3_fortgeschrittenes_oop/16_master_abschlussprojekt/index.html @@ -10,173 +10,6 @@ - - - @@ -472,6 +302,7 @@ - + + diff --git a/lehrpfad_4_professional_data_engineering/17_regulaere_ausdruecke_re/index.html b/lehrpfad_4_professional_data_engineering/17_regulaere_ausdruecke_re/index.html index 5bf1512..462de1a 100644 --- a/lehrpfad_4_professional_data_engineering/17_regulaere_ausdruecke_re/index.html +++ b/lehrpfad_4_professional_data_engineering/17_regulaere_ausdruecke_re/index.html @@ -10,212 +10,6 @@
-
@@ -495,9 +289,6 @@
- - - @@ -506,6 +297,7 @@ - + + diff --git a/lehrpfad_4_professional_data_engineering/18_funktionale_programmierung_lambda/index.html b/lehrpfad_4_professional_data_engineering/18_funktionale_programmierung_lambda/index.html index 2127473..e24dab3 100644 --- a/lehrpfad_4_professional_data_engineering/18_funktionale_programmierung_lambda/index.html +++ b/lehrpfad_4_professional_data_engineering/18_funktionale_programmierung_lambda/index.html @@ -10,212 +10,6 @@
-
@@ -435,9 +229,6 @@
- - - @@ -446,6 +237,7 @@ - + + diff --git a/lehrpfad_4_professional_data_engineering/19_generatoren_und_itertools/index.html b/lehrpfad_4_professional_data_engineering/19_generatoren_und_itertools/index.html index 8dc1dc7..f501254 100644 --- a/lehrpfad_4_professional_data_engineering/19_generatoren_und_itertools/index.html +++ b/lehrpfad_4_professional_data_engineering/19_generatoren_und_itertools/index.html @@ -10,192 +10,6 @@
-
@@ -488,9 +302,6 @@
- - - @@ -499,6 +310,7 @@ - + + diff --git a/lehrpfad_4_professional_data_engineering/20_dataclasses_und_typehints/index.html b/lehrpfad_4_professional_data_engineering/20_dataclasses_und_typehints/index.html index 56ef1ea..ae7ed15 100644 --- a/lehrpfad_4_professional_data_engineering/20_dataclasses_und_typehints/index.html +++ b/lehrpfad_4_professional_data_engineering/20_dataclasses_und_typehints/index.html @@ -10,192 +10,6 @@
-
@@ -464,9 +278,6 @@
- - - @@ -475,6 +286,7 @@ - + + diff --git a/lehrpfad_4_professional_data_engineering/21_datenbanken_und_sqlite/index.html b/lehrpfad_4_professional_data_engineering/21_datenbanken_und_sqlite/index.html index a6f1b91..be2daa6 100644 --- a/lehrpfad_4_professional_data_engineering/21_datenbanken_und_sqlite/index.html +++ b/lehrpfad_4_professional_data_engineering/21_datenbanken_und_sqlite/index.html @@ -10,192 +10,6 @@
-
@@ -488,9 +302,6 @@ cursor.execute(query, (user_name,))
- - - @@ -499,6 +310,7 @@ cursor.execute(query, (user_name,)) - + + diff --git a/lehrpfad_4_professional_data_engineering/22_web_apis_und_json_feeds/index.html b/lehrpfad_4_professional_data_engineering/22_web_apis_und_json_feeds/index.html index 3e48ee4..5e3734b 100644 --- a/lehrpfad_4_professional_data_engineering/22_web_apis_und_json_feeds/index.html +++ b/lehrpfad_4_professional_data_engineering/22_web_apis_und_json_feeds/index.html @@ -10,192 +10,6 @@
-
@@ -429,9 +243,6 @@
- - - @@ -440,6 +251,7 @@ - + + diff --git a/workspace.html b/workspace.html index 5df5c7d..2322b6f 100644 --- a/workspace.html +++ b/workspace.html @@ -189,6 +189,33 @@ grid-template-rows: 50% 50%; } } + + @media (max-width: 768px) { + .workspace-topbar { + padding: 0 10px; + height: 48px; + } + #editor-save-indicator { + display: none !important; + } + .workspace-title a { + display: none; + } + .workspace-title span:first-of-type { + display: none; + } + #workspace-chapter-name { + max-width: 140px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 0.82rem; + } + .workspace-actions button { + padding: 5px 8px !important; + font-size: 0.78rem !important; + } + } @@ -370,6 +397,23 @@ } async function loadCourseManifest() { + if (window.COURSES_MANIFEST && window.COURSES_MANIFEST[courseId]) { + currentCourseManifest = window.COURSES_MANIFEST[courseId]; + const list = []; + (currentCourseManifest.tracks || []).forEach(tr => { + (tr.chapters || []).forEach(ch => { + list.push({ + track: tr.id, + folder: ch.folder, + title: ch.title, + taskFile: ch.taskFile || "aufgabe.py", + testFile: ch.testFile || "test_aufgabe.py" + }); + }); + }); + CHAPTERS_MANIFEST = list; + return; + } try { const res = await fetch(`courses/${courseId}/course.json`); if (res.ok) { @@ -591,5 +635,7 @@ document.addEventListener("DOMContentLoaded", loadWorkspaceData); + +