diff --git a/Makefile b/Makefile
index 3fb1613..bf21ca9 100644
--- a/Makefile
+++ b/Makefile
@@ -7,14 +7,18 @@
COURSES = 223015b 223015c
COURSE_DIR = courses
+# Port configuration (index starts at BASE_PORT, courses increment from there)
+BASE_PORT = 1310
+INDEX_PORT = $(BASE_PORT)
+
# Course-specific settings
223015b_NAME = Dateiformate, Schnittstellen, Speichermedien
-223015b_PORT = 1312
+223015b_PORT = 1311
223015b_TERMINS = 2025-12-19-termin-0-intro 2025-12-19-termin-1-grundlagen-text-audio 2026-01-09-termin-2-bild-audio-video 2026-01-23-termin-3-speichermedien-schnittstellen 2026-01-30-termin-4-distribution-apis-zukunft 2026-xx-xx-termin-5-vertiefung-offene-fragen
223015b_DEPLOY_PATH = /home/tengo/html/hdm/223015b
223015c_NAME = Internettechnologien
-223015c_PORT = 1313
+223015c_PORT = 1312
223015c_TERMINS = 2025-12-20-termin-1-geschichte-grundlagen-html 2026-01-10-termin-2-netzwerke-protokolle-css 2026-01-24-termin-3-interaktivitaet-javascript
223015c_DEPLOY_PATH = /home/tengo/html/hdm/223015c
@@ -59,33 +63,23 @@ build/.exists:
@touch $@
# Development servers
-dev: dev-index
- @echo "Starting all dev servers..."
- @echo ""
- @echo " Index: http://localhost:1311"
- @echo " 223015b: http://localhost:1312"
- @echo " 223015c: http://localhost:1313"
- @echo ""
- @echo "Press Ctrl+C to stop all servers"
- @trap 'kill 0' INT; \
- PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/ & \
- PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/ & \
- python3 -m http.server 1311 --directory .dev-index & \
- wait
+dev:
+ @./scripts/dev-server.sh
-dev-index:
- @mkdir -p .dev-index
- @echo '
HdM SlidesHdM Slides
Development Server
223015b - DateiformatePort 1312223015c - InternettechnikPort 1313' > .dev-index/index.html
+dev-kill:
+ @-pkill -f "python3 -m http.server" 2>/dev/null || true
+ @-pkill -f "marp-cli.*--server" 2>/dev/null || true
+ @sleep 0.5
dev-b:
- @echo "Starting 223015b dev server on port 1312..."
- @echo "Open: http://localhost:1312"
- PORT=1312 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/
+ @echo "Starting 223015b dev server on port $(223015b_PORT)..."
+ @echo "Open: http://localhost:$(223015b_PORT)"
+ PORT=$(223015b_PORT) npx @marp-team/marp-cli --server $(COURSE_DIR)/223015b/slides/
dev-c:
- @echo "Starting 223015c dev server on port 1313..."
- @echo "Open: http://localhost:1313"
- PORT=1313 npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/
+ @echo "Starting 223015c dev server on port $(223015c_PORT)..."
+ @echo "Open: http://localhost:$(223015c_PORT)"
+ PORT=$(223015c_PORT) npx @marp-team/marp-cli --server $(COURSE_DIR)/223015c/slides/
# Build functions
define build_course
@@ -188,10 +182,18 @@ else
@echo "Done! Originals in assets-original/"
endif
+# Root index for /hdm/
+HDM_DEPLOY_PATH = /home/tengo/html/hdm
+
+build-index: build/.exists
+ @echo "Building root index..."
+ @echo 'HdM VorlesungenHdM Vorlesungen
Wintersemester 2025/26 · Michael Czechowski
' > build/index.html
+
# Deploy
define deploy_course
@echo "Deploying $(1)..."
scp build/$(1)/*.html $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/
+ scp build/$(1)/*.pdf $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ 2>/dev/null || true
scp -r build/$(1)/assets/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/
scp -r build/$(1)/materials/ $(DEPLOY_HOST):$($(1)_DEPLOY_PATH)/ 2>/dev/null || true
@echo "$(1) deployed!"
@@ -203,7 +205,12 @@ deploy-b: build-b
deploy-c: build-c
$(call deploy_course,223015c)
-deploy: deploy-b deploy-c
+deploy-index: build-index
+ @echo "Deploying root index..."
+ scp build/index.html $(DEPLOY_HOST):$(HDM_DEPLOY_PATH)/
+ @echo "Root index deployed!"
+
+deploy: build-index deploy-b deploy-c deploy-index
@echo "All courses deployed!"
# Clean
diff --git a/courses/223015b/slides/2025-12-19-termin-0-intro.md b/courses/223015b/slides/2025-12-19-termin-0-intro.md
index 2365622..a5e404d 100644
--- a/courses/223015b/slides/2025-12-19-termin-0-intro.md
+++ b/courses/223015b/slides/2025-12-19-termin-0-intro.md
@@ -58,7 +58,7 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015b](https://git.librete.ch/hdm/223015b)
+[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
---
diff --git a/courses/223015b/slides/2025-12-19-termin-1-grundlagen-text-audio.md b/courses/223015b/slides/2025-12-19-termin-1-grundlagen-text-audio.md
index a85a6b9..4856ebc 100644
--- a/courses/223015b/slides/2025-12-19-termin-1-grundlagen-text-audio.md
+++ b/courses/223015b/slides/2025-12-19-termin-1-grundlagen-text-audio.md
@@ -64,7 +64,7 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015b](https://git.librete.ch/hdm/223015b)
+[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
---
@@ -99,6 +99,32 @@ Hochschule der Medien Stuttgart
---
+
+
+# WTF!? – Auflösung
+
+```
+89 50 4E 47 ...
+```
+
+| Hex | Dezimal | ASCII |
+|-----|---------|-------|
+| `89` | 137 | ✗ (> 127, nicht druckbar) |
+| `50` | 80 | **P** |
+| `4E` | 78 | **N** |
+| `47` | 71 | **G** |
+
+→ **PNG**-Signatur! (Das `89` markiert: "Ich bin binär, kein Text!")
+
+
+
+---
+
@@ -278,25 +304,30 @@ Digital explodierte: IoT, Social Media, Cloud, Video
-# Der digitale Wendepunkt (Hilbert-Studie)
+# Der digitale Wendepunkt
| Jahr | Analog | Digital | Digital-Anteil |
|------|--------|---------|----------------|
-| **1986** | 2,57 EB | 0,02 EB | **1%** |
-| **2000** | ~37 EB | ~13 EB | 25% |
+| **1986** | 2,6 EB | 0,02 EB | **1%** |
| **2002** | — | — | **50%** (Wendepunkt) |
-| **2007** | ~18 EB | ~277 EB | **94%** |
+| **2007** | 18 EB | 277 EB | **94%** |
-**Beobachtung:** Analog blieb nahezu konstant (~2,6 → ~18 EB)
-Digital explodierte: ×14.000 in 21 Jahren
+**Perspektive:**
+- 1986: "Petabyte" war ein theoretisches Konzept
+- 2025: ~181 Zettabyte jährlich produziert
+
+**Magnetband lebt:** LTO-Tapes bleiben günstigstes Archivmedium
+(AWS Glacier, Film-Archive, Rechenzentren)
---
@@ -345,6 +376,38 @@ Model Collapse: AI trainiert auf AI-Output → Qualitätsverlust
---
+
+
+# ASCII
+## Ein Zeichensatz to rule them all
+
+
+
+---
+
@@ -837,22 +900,36 @@ Visualisierung der beiden Philosophien
---
-# Zwei Philosophien
+
+
-**Lossless (Verlustfrei):**
-- Original exakt wiederherstellbar
-- ZIP, PNG, FLAC
-- 30-50% Ersparnis
+# Kompression: Zwei Philosophien
-**Lossy (Verlustbehaftet):**
-- Daten irreversibel verändert
-- JPEG, MP3, H.264
-- 90%+ Ersparnis
+| | Lossless | Lossy |
+|---|---|---|
+| **Prinzip** | Redundanz entfernen | Irrelevanz entfernen |
+| **Reversibel** | Ja (bitgenau) | Nein |
+| **Kompression** | 30-50% | 80-99% |
+| **Algorithmen** | RLE, Huffman, LZW, DEFLATE | DCT, Psychoakustik |
+
+**Lossless:** ZIP, PNG, FLAC, GIF
+**Lossy:** JPEG, MP3, AAC, H.264, H.265, AV1
+
+**Entscheidung:** Archiv/Code → Lossless, Medien → Lossy
---
diff --git a/courses/223015b/slides/2026-01-09-termin-2-bild-audio-video.md b/courses/223015b/slides/2026-01-09-termin-2-bild-audio-video.md
index 9d9ab11..4c35cb7 100644
--- a/courses/223015b/slides/2026-01-09-termin-2-bild-audio-video.md
+++ b/courses/223015b/slides/2026-01-09-termin-2-bild-audio-video.md
@@ -42,6 +42,12 @@ code {
a {
color: var(--color-highlight);
}
+section.klausur {
+ background: #e3f2fd !important;
+}
+section.klausur footer {
+ display: none;
+}
@@ -59,7 +65,14 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015b](https://git.librete.ch/hdm/223015b)
+[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
+
+---
+
+
+
+
+
---
@@ -104,70 +117,123 @@ Smartphone-Speicher wäre schnell voll ohne Kompression
---
+
+
+
# Rastergrafiken (Bitmaps)
-**Pixelraster:** Jeder Bildpunkt hat Koordinate + Farbwert
+**Aufbau:** 2D-Array von Pixeln mit Farbwerten
-**Eigenschaften:**
-- Je größer das Bild → größere Datei
-- **Verkleinern:** Meist ohne Qualitätsverlust
-- **Vergrößern:** Wird unscharf/pixelig!
+**Speicherbedarf (unkomprimiert):**
+Breite × Höhe × Farbtiefe (in Bytes)
+→ 1920×1080 × 3 Byte (RGB) = **6,2 MB**
-**Formate:** JPEG, PNG, GIF, BMP, TIFF, WebP
+**Farbtiefe:**
+- 1 Bit = 2 Farben (S/W)
+- 8 Bit = 256 Farben (Graustufen/Palette)
+- 24 Bit = 16,7 Mio. Farben (True Color)
+- 32 Bit = True Color + Alpha (Transparenz)
-**Verwendung:** Fotos, Screenshots, komplexe Bilder
+**Skalierung:** Interpolation (Nearest Neighbor, Bilinear, Bicubic)
---
+
+
+
# Vektorgrafiken
-**Mathematische Beschreibung statt Pixel**
+**Speicherung als geometrische Primitive:**
+- Pfade (Bézierkurven mit Kontrollpunkten)
+- Grundformen (Rechteck, Ellipse, Polygon)
+- Text (Glyphen als Outlines)
-**Kreis speichern:**
-- Rastergrafik: Tausende Pixel
-- Vektorgrafik: Mittelpunkt + Radius (2 Werte!)
+**SVG-Beispiel:**
+``
+→ 3 Parameter statt 5.027 Pixel (r=40)
-**Gespeichert werden:**
-- Form (Kreis, Linie, Pfad...)
-- Position, Farbe, Strichstärke, Füllung
+**Rendering-Pipeline:**
+Vektordaten → Rasterisierung → Framebuffer → Display
-**Vorteil:** Beliebig skalierbar ohne Qualitätsverlust!
-
-**Formate:** SVG, PDF, AI, EPS
+**Auflösungsunabhängig:** Gleiche Datei für Icon (32px) und Plakat (3m)
---
-# Raster vs. Vektor
+
+
-| | Rastergrafik | Vektorgrafik |
+# Raster vs. Vektor: Entscheidungskriterien
+
+| Kriterium | Raster | Vektor |
|---|---|---|
-| **Basis** | Pixelraster | Mathematische Objekte |
+| **Speicherung** | Pixelmatrix | Geometrie + Attribute |
| **Skalierung** | Qualitätsverlust | Verlustfrei |
-| **Dateigröße** | Abhängig von Auflösung | Abhängig von Komplexität |
-| **Gut für** | Fotos | Logos, Icons, Text |
-| **Formate** | JPEG, PNG, GIF | SVG, PDF, AI |
+| **Komplexität** | O(Breite × Höhe) | O(Anzahl Objekte) |
+| **Bearbeitung** | Pixelbasiert | Objektbasiert |
-**Rasterung:** Vektorgrafik → Rastergrafik (für Bildschirm/Druck)
+**Wann Raster?** Fotos, Texturen, komplexe Farbverläufe
+**Wann Vektor?** Logos, Icons, Typografie, technische Zeichnungen
+
+**Konvertierung:**
+- Raster → Vektor: Tracing (verlustbehaftet, approximiert)
+- Vektor → Raster: Rasterisierung (exakt, aber auflösungsgebunden)
---
@@ -365,8 +431,6 @@ GIF überlebte kulturell (Meme-Format)
- HDR-Unterstützung
- Patent-frei
-**Problem:** Browser-Support dauert Jahre
-
+
+
+
---
diff --git a/courses/223015b/slides/2026-01-30-termin-4-distribution-apis-zukunft.md b/courses/223015b/slides/2026-01-30-termin-4-distribution-apis-zukunft.md
index 979eea9..e90ef63 100644
--- a/courses/223015b/slides/2026-01-30-termin-4-distribution-apis-zukunft.md
+++ b/courses/223015b/slides/2026-01-30-termin-4-distribution-apis-zukunft.md
@@ -59,7 +59,14 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015b](https://git.librete.ch/hdm/223015b)
+[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
+
+---
+
+
+
+
+
---
diff --git a/courses/223015b/slides/2026-xx-xx-termin-5-vertiefung-offene-fragen.md b/courses/223015b/slides/2026-xx-xx-termin-5-vertiefung-offene-fragen.md
index 994a9d2..eaff42d 100644
--- a/courses/223015b/slides/2026-xx-xx-termin-5-vertiefung-offene-fragen.md
+++ b/courses/223015b/slides/2026-xx-xx-termin-5-vertiefung-offene-fragen.md
@@ -59,7 +59,14 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015b](https://git.librete.ch/hdm/223015b)
+[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
+
+---
+
+
+
+
+
---
diff --git a/courses/223015b/slides/assets/compression-types.png b/courses/223015b/slides/assets/compression-types.png
index f29a122..d6b0896 100644
Binary files a/courses/223015b/slides/assets/compression-types.png and b/courses/223015b/slides/assets/compression-types.png differ
diff --git a/courses/223015b/slides/assets/qr/asciitable.png b/courses/223015b/slides/assets/qr/asciitable.png
new file mode 100644
index 0000000..dc3bdeb
Binary files /dev/null and b/courses/223015b/slides/assets/qr/asciitable.png differ
diff --git a/courses/223015b/slides/assets/qr/audacity-spectrogram.png b/courses/223015b/slides/assets/qr/audacity-spectrogram.png
new file mode 100644
index 0000000..5268779
Binary files /dev/null and b/courses/223015b/slides/assets/qr/audacity-spectrogram.png differ
diff --git a/courses/223015b/slides/assets/qr/mediainfo.png b/courses/223015b/slides/assets/qr/mediainfo.png
new file mode 100644
index 0000000..505e90e
Binary files /dev/null and b/courses/223015b/slides/assets/qr/mediainfo.png differ
diff --git a/courses/223015b/slides/assets/qr/repo-223015b.png b/courses/223015b/slides/assets/qr/repo-223015b.png
new file mode 100644
index 0000000..6acdf75
Binary files /dev/null and b/courses/223015b/slides/assets/qr/repo-223015b.png differ
diff --git a/courses/223015b/slides/assets/qr/slides-223015b.png b/courses/223015b/slides/assets/qr/slides-223015b.png
new file mode 100644
index 0000000..87c6a57
Binary files /dev/null and b/courses/223015b/slides/assets/qr/slides-223015b.png differ
diff --git a/courses/223015b/slides/assets/qr/squoosh.png b/courses/223015b/slides/assets/qr/squoosh.png
new file mode 100644
index 0000000..0f29b33
Binary files /dev/null and b/courses/223015b/slides/assets/qr/squoosh.png differ
diff --git a/courses/223015c/slides/2025-12-20-termin-1-geschichte-grundlagen-html.md b/courses/223015c/slides/2025-12-20-termin-1-geschichte-grundlagen-html.md
index 40e4cb0..01dd991 100644
--- a/courses/223015c/slides/2025-12-20-termin-1-geschichte-grundlagen-html.md
+++ b/courses/223015c/slides/2025-12-20-termin-1-geschichte-grundlagen-html.md
@@ -65,7 +65,14 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
-[https://git.librete.ch/hdm/223015c](https://git.librete.ch/hdm/223015c)
+[https://librete.ch/hdm/223015c/](https://librete.ch/hdm/223015c/)
+
+---
+
+
+
+
+
---
@@ -608,9 +615,17 @@ Euer Laptop, euer Handy, der Server dieser Präsentation
**Wichtig:** Programme und Daten **gemeinsam** im Speicher!
---
@@ -632,9 +647,19 @@ Laptop, Smartphone, Server, Spielkonsole...
(separate Speicher für Code und Daten → schneller für Echtzeitanwendungen)
---
@@ -1033,20 +1058,35 @@ Formattierungssprache
Im Browsertab als Überschrift sichtbar
-
+
-
+
-
+
...
-
+
```
* *Webseiten werden nicht nur von Menschen besucht, sondern auch von Suchmaschinen, Programmen, Bots etc.*
* *Metadaten helfen bspw. auch Screen-Readern beim "Verstehen" der Inhalte*
+
+
---
# HTML-Tags und Attribute
diff --git a/courses/223015c/slides/2026-01-10-termin-2-netzwerke-protokolle-css.md b/courses/223015c/slides/2026-01-10-termin-2-netzwerke-protokolle-css.md
index 0d615c6..a8536a8 100644
--- a/courses/223015c/slides/2026-01-10-termin-2-netzwerke-protokolle-css.md
+++ b/courses/223015c/slides/2026-01-10-termin-2-netzwerke-protokolle-css.md
@@ -65,6 +65,15 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
+[https://librete.ch/hdm/223015c/](https://librete.ch/hdm/223015c/)
+
+---
+
+
+
+
+
+
---
@@ -165,10 +174,19 @@ Internet nutzt beides: TCP = verbindungsorientiert, UDP = verbindungslos
| 1 | Bitübertragung | Kabel, WLAN |
---
@@ -189,8 +207,18 @@ TCP/IP ist die praktische Implementierung
**TCP/IP = Transmission Control Protocol / Internet Protocol**
---
@@ -463,6 +491,50 @@ ACK bestätigt Empfang
---
+# Schicht 5: Sitzung (Session)
+
+**Verwaltet Verbindungen zwischen Anwendungen:**
+
+- **Sessions** → Login-Sitzungen, "eingeloggt bleiben"
+- **Dialogsteuerung** → Wer darf wann senden?
+- **Synchronisation** → Wiederaufnahme nach Abbruch
+
+**Beispiele:**
+- Web-Sessions (Cookies, Tokens)
+- RPC (Remote Procedure Call)
+- NetBIOS
+
+
+
+---
+
+# Schicht 6: Darstellung (Presentation)
+
+**Übersetzt Datenformate:**
+
+| Funktion | Beispiel |
+|----------|----------|
+| **Encoding** | UTF-8, ASCII, Unicode |
+| **Verschlüsselung** | TLS/SSL (HTTPS) |
+| **Kompression** | gzip, deflate |
+| **Serialisierung** | JSON, XML, Protobuf |
+
+**TLS/SSL:** Transport Layer Security
+→ Verschlüsselt HTTP zu HTTPS
+
+
+
+---
+
# Schicht 7: Anwendung
@@ -479,8 +551,21 @@ ACK bestätigt Empfang
| **SSH** | 22 | Sichere Fernsteuerung |
---
@@ -572,12 +657,41 @@ MX = Mail Exchange
---
-
+# URLs & Domains
-# HTTP im Detail
+**URL** = Uniform Resource Locator
+
+```
+https://www.example.com:443/pfad/seite.html?suche=test#kapitel2
+└─┬──┘ └──────┬──────┘└┬┘ └──────┬──────┘ └───┬────┘ └──┬───┘
+Protokoll Hostname Port Pfad Query Fragment
+```
+
+| Begriff | Erklärung |
+|---------|-----------|
+| **Domain** | `example.com` (registrierter Name) |
+| **Subdomain** | `www`, `mail`, `api` (Prefix) |
+| **Hostname** | `www.example.com` (vollständig) |
+| **Port** | Standard: 80 (HTTP), 443 (HTTPS) |
+
+
---
+
+
+# HTTP/S im Detail
+
+---
+
+
+
# HTTP-Request
```http
@@ -603,6 +717,8 @@ Body kommt nach leerem Zeile (bei POST)
---
+
+
# HTTP-Response
```http
@@ -614,7 +730,11 @@ Content-Length: 1234
...
```
-**Status-Codes:** 2xx Erfolg · 3xx Umleitung · 4xx Client-Fehler · 5xx Server-Fehler
+**Status-Codes:**
+- **2xx** Erfolg
+- **3xx** Umleitung
+- **4xx** Client-Fehler (Browser, App, WhatsApp)
+- **5xx** Server-Fehler (Instagram, Google, HdM)
+
# HTTP-Methoden
-| Methode | Zweck | Beispiel |
-|---------|-------|----------|
-| **GET** | Daten abrufen | Seite laden |
-| **POST** | Daten senden | Formular absenden |
-| **PUT** | Daten ersetzen | Profil aktualisieren |
-| **PATCH** | Daten teilweise ändern | Einzelnes Feld |
-| **DELETE** | Daten löschen | Account löschen |
-
-**CRUD:** Create, Read, Update, Delete
-→ POST, GET, PUT/PATCH, DELETE
+| Methode | CRUD | Zweck | Beispiel |
+|---------|------|-------|----------|
+| **GET** | Read | Daten abrufen | Seite laden |
+| **POST** | Create | Daten senden | Formular absenden |
+| **PUT** | Update | Daten ersetzen | Profil aktualisieren |
+| **PATCH** | Update | Daten teilweise ändern | Einzelnes Feld |
+| **DELETE** | Delete | Daten löschen | Account löschen |
---
@@ -1012,9 +1141,21 @@ Situative Einschränkungen: laute Umgebung, Baby auf dem Arm
- Größerer Markt (~15% der Bevölkerung)
---
diff --git a/courses/223015c/slides/2026-01-24-termin-3-interaktivitaet-javascript.md b/courses/223015c/slides/2026-01-24-termin-3-interaktivitaet-javascript.md
index 647a2eb..f8481b0 100644
--- a/courses/223015c/slides/2026-01-24-termin-3-interaktivitaet-javascript.md
+++ b/courses/223015c/slides/2026-01-24-termin-3-interaktivitaet-javascript.md
@@ -59,6 +59,15 @@ Hochschule der Medien Stuttgart
**Wintersemester 2025/26**
+[https://librete.ch/hdm/223015c/](https://librete.ch/hdm/223015c/)
+
+---
+
+
+
+
+
+
---
diff --git a/courses/223015c/slides/assets/qr/codepen.png b/courses/223015c/slides/assets/qr/codepen.png
new file mode 100644
index 0000000..0b524bb
Binary files /dev/null and b/courses/223015c/slides/assets/qr/codepen.png differ
diff --git a/courses/223015c/slides/assets/qr/codescripsi.png b/courses/223015c/slides/assets/qr/codescripsi.png
new file mode 100644
index 0000000..97ecfae
Binary files /dev/null and b/courses/223015c/slides/assets/qr/codescripsi.png differ
diff --git a/courses/223015c/slides/assets/qr/cssgridgarden.png b/courses/223015c/slides/assets/qr/cssgridgarden.png
new file mode 100644
index 0000000..a790a33
Binary files /dev/null and b/courses/223015c/slides/assets/qr/cssgridgarden.png differ
diff --git a/courses/223015c/slides/assets/qr/flexboxfroggy.png b/courses/223015c/slides/assets/qr/flexboxfroggy.png
new file mode 100644
index 0000000..7efba01
Binary files /dev/null and b/courses/223015c/slides/assets/qr/flexboxfroggy.png differ
diff --git a/courses/223015c/slides/assets/qr/freecodecamp.png b/courses/223015c/slides/assets/qr/freecodecamp.png
new file mode 100644
index 0000000..8ce9127
Binary files /dev/null and b/courses/223015c/slides/assets/qr/freecodecamp.png differ
diff --git a/courses/223015c/slides/assets/qr/html-over-js.png b/courses/223015c/slides/assets/qr/html-over-js.png
new file mode 100644
index 0000000..70a4dbd
Binary files /dev/null and b/courses/223015c/slides/assets/qr/html-over-js.png differ
diff --git a/courses/223015c/slides/assets/qr/mandala.png b/courses/223015c/slides/assets/qr/mandala.png
new file mode 100644
index 0000000..30438c2
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mandala.png differ
diff --git a/courses/223015c/slides/assets/qr/mdn-button.png b/courses/223015c/slides/assets/qr/mdn-button.png
new file mode 100644
index 0000000..9477b6d
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mdn-button.png differ
diff --git a/courses/223015c/slides/assets/qr/mdn-details.png b/courses/223015c/slides/assets/qr/mdn-details.png
new file mode 100644
index 0000000..6f532de
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mdn-details.png differ
diff --git a/courses/223015c/slides/assets/qr/mdn-dialog.png b/courses/223015c/slides/assets/qr/mdn-dialog.png
new file mode 100644
index 0000000..0df945d
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mdn-dialog.png differ
diff --git a/courses/223015c/slides/assets/qr/mdn-input.png b/courses/223015c/slides/assets/qr/mdn-input.png
new file mode 100644
index 0000000..e34c60e
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mdn-input.png differ
diff --git a/courses/223015c/slides/assets/qr/mdn.png b/courses/223015c/slides/assets/qr/mdn.png
new file mode 100644
index 0000000..24a8136
Binary files /dev/null and b/courses/223015c/slides/assets/qr/mdn.png differ
diff --git a/courses/223015c/slides/assets/qr/odinproject.png b/courses/223015c/slides/assets/qr/odinproject.png
new file mode 100644
index 0000000..357a646
Binary files /dev/null and b/courses/223015c/slides/assets/qr/odinproject.png differ
diff --git a/courses/223015c/slides/assets/qr/repo-223015c.png b/courses/223015c/slides/assets/qr/repo-223015c.png
new file mode 100644
index 0000000..46b6365
Binary files /dev/null and b/courses/223015c/slides/assets/qr/repo-223015c.png differ
diff --git a/courses/223015c/slides/assets/qr/slides-223015c.png b/courses/223015c/slides/assets/qr/slides-223015c.png
new file mode 100644
index 0000000..2c7cb48
Binary files /dev/null and b/courses/223015c/slides/assets/qr/slides-223015c.png differ
diff --git a/courses/223015c/slides/assets/qr/vscode.png b/courses/223015c/slides/assets/qr/vscode.png
new file mode 100644
index 0000000..fa3852a
Binary files /dev/null and b/courses/223015c/slides/assets/qr/vscode.png differ
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..c2cc24a
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,61 @@
+{
+ "nodes": {
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1731533236,
+ "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1766902085,
+ "narHash": "sha256-coBu0ONtFzlwwVBzmjacUQwj3G+lybcZ1oeNSQkgC0M=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "c0b0e0fddf73fd517c3471e546c0df87a42d53f4",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/scripts/dev-server.sh b/scripts/dev-server.sh
new file mode 100755
index 0000000..07e676c
--- /dev/null
+++ b/scripts/dev-server.sh
@@ -0,0 +1,106 @@
+#!/usr/bin/env bash
+# Development server script for HdM slides
+# Starts index server + marp servers for each course
+
+set -e
+
+# Configuration
+INDEX_PORT=1310
+COURSE_B_PORT=1311
+COURSE_C_PORT=1312
+COURSE_DIR="courses"
+DEV_INDEX_DIR=".dev-index"
+
+# Colors
+RED='\033[0;31m'
+GREEN='\033[0;32m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# Cleanup function
+cleanup() {
+ echo -e "\n${RED}Shutting down servers...${NC}"
+ kill $PID_INDEX $PID_B $PID_C 2>/dev/null || true
+ exit 0
+}
+
+# Kill existing processes on our ports
+kill_existing() {
+ echo -e "${BLUE}Cleaning up existing processes...${NC}"
+ # Kill marp processes first
+ pkill -9 -f "marp-cli" 2>/dev/null || true
+ pkill -f "python3 -m http.server" 2>/dev/null || true
+ # Kill ports including marp's WebSocket ports (37717-37720 range)
+ fuser -k $INDEX_PORT/tcp $COURSE_B_PORT/tcp $COURSE_C_PORT/tcp 2>/dev/null || true
+ fuser -k 37717/tcp 37718/tcp 37719/tcp 37720/tcp 2>/dev/null || true
+ sleep 2
+}
+
+# Generate dev index
+generate_index() {
+ mkdir -p "$DEV_INDEX_DIR"
+ cat > "$DEV_INDEX_DIR/index.html" << 'EOF'
+
+
+
+
+
+ HdM Slides - Dev
+
+
+
+ HdM Slides
+ Development Server
+
+
+
+EOF
+}
+
+# Main
+trap cleanup SIGINT SIGTERM
+
+kill_existing
+generate_index
+
+echo -e "${GREEN}Starting development servers...${NC}"
+echo ""
+echo -e " Index: ${BLUE}http://localhost:$INDEX_PORT${NC}"
+echo -e " 223015b: ${BLUE}http://localhost:$COURSE_B_PORT${NC}"
+echo -e " 223015c: ${BLUE}http://localhost:$COURSE_C_PORT${NC}"
+echo ""
+echo -e "Press ${RED}Ctrl+C${NC} to stop all servers"
+echo ""
+
+# Start servers
+python3 -m http.server $INDEX_PORT --directory "$DEV_INDEX_DIR" &
+PID_INDEX=$!
+
+PORT=$COURSE_B_PORT npx @marp-team/marp-cli --server "$COURSE_DIR/223015b/slides/" &
+PID_B=$!
+
+sleep 3 # Stagger starts to avoid WebSocket port collision
+
+PORT=$COURSE_C_PORT npx @marp-team/marp-cli --server "$COURSE_DIR/223015c/slides/" &
+PID_C=$!
+
+# Wait for any process to exit
+wait
diff --git a/scripts/generate-index.sh b/scripts/generate-index.sh
index 5d02d36..3ade7aa 100755
--- a/scripts/generate-index.sh
+++ b/scripts/generate-index.sh
@@ -8,22 +8,40 @@ BUILD_DIR="${2:-build/$COURSE}"
# Course-specific configuration
case "$COURSE" in
223015b)
- TITLE="223015b - Dateiformate, Schnittstellen, Speichermedien"
- SUBTITLE="Dateiformate, Schnittstellen, Speichermedien & Distributionswege"
- REPO_URL="https://git.librete.ch/hdm/223015b"
+ TITLE="Dateiformate, Schnittstellen, Speichermedien & Distributionswege"
+ SUBTITLE="223015b · Modul \"Technik 1\" · 1. Semester"
+ SLIDES_URL="https://librete.ch/hdm/223015b"
+ ACCENT_COLOR="#5da9e9"
+ ACCENT_LIGHT="#e8f4fc"
;;
223015c)
- TITLE="223015c - Internettechnologien"
- SUBTITLE="Internettechnologien"
- REPO_URL="https://git.librete.ch/hdm/223015c"
+ TITLE="Grundlagen IT- und Internettechnik"
+ SUBTITLE="223015c · Modul \"Technik 1\" · 1. Semester"
+ SLIDES_URL="https://librete.ch/hdm/223015c"
+ ACCENT_COLOR="#d63384"
+ ACCENT_LIGHT="#fce4ec"
;;
*)
TITLE="$COURSE - HdM Slides"
SUBTITLE="Lecture Slides"
- REPO_URL="https://git.librete.ch/hdm/$COURSE"
+ SLIDES_URL="https://librete.ch/hdm/$COURSE"
+ ACCENT_COLOR="#0066cc"
+ ACCENT_LIGHT="#e8f4fc"
;;
esac
+# Topic mappings for nice German titles
+declare -A TOPIC_MAP
+TOPIC_MAP["intro"]="Einführung"
+TOPIC_MAP["grundlagen-text-audio"]="Grundlagen, Text & Audio"
+TOPIC_MAP["bild-audio-video"]="Bild, Audio & Video"
+TOPIC_MAP["speichermedien-schnittstellen"]="Speichermedien & Schnittstellen"
+TOPIC_MAP["distribution-apis-zukunft"]="Distribution, APIs & Zukunft"
+TOPIC_MAP["vertiefung-offene-fragen"]="Vertiefung & Offene Fragen"
+TOPIC_MAP["geschichte-grundlagen-html"]="Geschichte, Grundlagen & HTML"
+TOPIC_MAP["netzwerke-protokolle-css"]="Netzwerke, Protokolle & CSS"
+TOPIC_MAP["interaktivitaet-javascript"]="Interaktivität & JavaScript"
+
cat > "$BUILD_DIR/index.html" << HEADER
@@ -32,65 +50,142 @@ cat > "$BUILD_DIR/index.html" << HEADER
$TITLE
- $COURSE
- $SUBTITLE
- HdM Stuttgart - WS 2025/26 - Michael Czechowski
+
+
HEADER
# Generate links for each termin (sorted)
@@ -98,23 +193,26 @@ for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
filename=$(basename "$html")
# Extract components from filename
- date=$(echo "$filename" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}')
+ date=$(echo "$filename" | grep -oE '^[0-9]{4}-[0-9x]{2}-[0-9x]{2}')
termin_num=$(echo "$filename" | grep -oE 'termin-[0-9]+' | grep -oE '[0-9]+')
- topic_raw=$(echo "$filename" | sed -E 's/^[0-9]{4}-[0-9]{2}-[0-9]{2}-termin-[0-9]+-//' | sed 's/\.html$//')
+ topic_raw=$(echo "$filename" | sed -E 's/^[0-9]{4}-[0-9x]{2}-[0-9x]{2}-termin-[0-9]+-//' | sed 's/\.html$//')
- # Format topic: replace - with space, capitalize
- topic=$(echo "$topic_raw" | sed 's/-/ /g' | sed 's/.*/\u&/')
+ # Look up nice topic name or fallback
+ topic="${TOPIC_MAP[$topic_raw]}"
+ if [[ -z "$topic" ]]; then
+ topic=$(echo "$topic_raw" | sed 's/-/ /g' | sed 's/.*/\u&/')
+ fi
# Format date
- if [[ "$date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
- formatted_date=$(date -d "$date" "+%d.%m.%Y" 2>/dev/null || echo "$date")
+ if [[ "$date" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && [[ ! "$date" =~ xx ]]; then
+ formatted_date=$(date -d "$date" "+%d. %B %Y" 2>/dev/null || echo "$date")
else
- formatted_date="TBA"
+ formatted_date="Termin folgt"
fi
# Handle termin number
if [[ "$termin_num" == "0" ]]; then
- termin_label="Einfuhrung"
+ termin_label="Einführung"
else
termin_label="Termin $termin_num"
fi
@@ -124,35 +222,27 @@ for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
# Check if PDF exists
pdf_link=""
if [[ -f "$BUILD_DIR/$pdf_filename" ]]; then
- pdf_link="
PDF"
+ pdf_link="
PDF"
fi
cat >> "$BUILD_DIR/index.html" << LINK
-
+
LINK
done
-# Add QR code if exists
-if [[ -f "$BUILD_DIR/qr-$COURSE.png" ]]; then
- cat >> "$BUILD_DIR/index.html" << QRSECTION
-
-

-
Scan to open on mobile
-
-QRSECTION
-fi
-
cat >> "$BUILD_DIR/index.html" << FOOTER
+