Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7e4d4a8a4b | ||
|
|
3fa1e1b1dc | ||
|
|
a8343c9937 | ||
|
|
b951341376 | ||
|
|
0fab5005df | ||
|
|
2755d4dee0 | ||
|
|
a3131851f0 | ||
|
|
7e878c27ef | ||
|
|
93e8ced463 | ||
|
|
58e0457165 | ||
|
|
d77b0f20c7 | ||
|
|
f7f4872c11 | ||
|
|
5f6369ad85 | ||
|
|
31790930de | ||
|
|
4fa64a6abd | ||
|
|
5c970053ee | ||
|
|
d19aa98f79 | ||
|
|
ccceac83e4 | ||
|
|
8f9934413a | ||
|
|
32c14ac412 |
No files matched your search
@@ -32,3 +32,4 @@ hdm-internettechnik-slides/
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.bak
|
||||
.idea
|
||||
@@ -4,8 +4,8 @@ This project builds presentation decks for Marp, supporting multiple courses.
|
||||
|
||||
## Courses
|
||||
|
||||
- **223015b** - Dateiformate, Schnittstellen, Speichermedien (6 Termine)
|
||||
- **223015c** - Internettechnologien (3 Termine)
|
||||
- **223015b** - Dateiformate, Schnittstellen, Speichermedien (6 Kapitel)
|
||||
- **223015c** - Internettechnologien (3 Kapitel)
|
||||
|
||||
## Agent Restrictions
|
||||
|
||||
@@ -15,7 +15,7 @@ This project builds presentation decks for Marp, supporting multiple courses.
|
||||
|
||||
## Critical File Protection
|
||||
|
||||
Slide files in `courses/*/slides/*.md` are main content files:
|
||||
Slide files in `slides/*/*.md` are main content files:
|
||||
- ALLOWED: Adding slides, adjusting content, fixing typos, enhancing sections
|
||||
- FORBIDDEN (without permission): Deleting slides, removing sections, bulk deletions
|
||||
- Before ANY deletion: ALWAYS ask user for confirmation
|
||||
@@ -23,9 +23,9 @@ Slide files in `courses/*/slides/*.md` are main content files:
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
courses/
|
||||
├── 223015b/slides/ # Dateiformate course
|
||||
└── 223015c/slides/ # Internettechnik course
|
||||
slides/
|
||||
├── 223015b/ # Dateiformate course
|
||||
└── 223015c/ # Internettechnik course
|
||||
scripts/ # Shared scripts
|
||||
themes/ # Custom Marp themes
|
||||
build/ # Generated output (gitignored)
|
||||
@@ -34,13 +34,14 @@ build/ # Generated output (gitignored)
|
||||
## Build Commands
|
||||
|
||||
```bash
|
||||
make dev-b # Dev server 223015b (port 1312)
|
||||
make dev-c # Dev server 223015c (port 1313)
|
||||
make dev-b # Dev server 223015b (port 1311)
|
||||
make dev-c # Dev server 223015c (port 1312)
|
||||
make build # Build all courses
|
||||
make build-b # Build 223015b only
|
||||
make build-c # Build 223015c only
|
||||
make html # HTML only
|
||||
make pdf # PDF only
|
||||
make klausur # Extract klausur slides → slides/*/klausur.md
|
||||
make deploy # Deploy all (ASK FIRST!)
|
||||
```
|
||||
|
||||
@@ -56,12 +57,12 @@ nix run .#optimize-img -- <path> # Optimize images
|
||||
## Code Style Guidelines
|
||||
|
||||
### File Structure
|
||||
- Slides in `courses/<course>/slides/`
|
||||
- Assets in `courses/<course>/slides/assets/`
|
||||
- Slides in `slides/<course>/`
|
||||
- Assets in `slides/<course>/assets/`
|
||||
- Always reference images as `./assets/filename.png`
|
||||
|
||||
### Naming Conventions
|
||||
- Slide files: `YYYY-MM-DD-termin-N-topic.md`
|
||||
- Slide files: `NN-topic.md` (e.g., `01-grundlagen.md`)
|
||||
- Images: `snake_case.jpg` or `kebab-case.jpg`
|
||||
|
||||
### Markdown Style
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
# HdM Slides - Unified Makefile
|
||||
# Supports multiple courses: 223015b (Dateiformate) and 223015c (Internettechnik)
|
||||
|
||||
.PHONY: help dev dev-b dev-c build build-b build-c pdf html clean install deploy qr optimize-images
|
||||
.PHONY: help dev dev-b dev-c build build-b build-c pdf html klausur clean install deploy qr optimize-images
|
||||
|
||||
# Course configuration
|
||||
COURSES = 223015b 223015c
|
||||
COURSE_DIR = courses
|
||||
SLIDES_DIR = slides
|
||||
|
||||
# Port configuration (index starts at BASE_PORT, courses increment from there)
|
||||
BASE_PORT = 1310
|
||||
@@ -14,12 +14,12 @@ INDEX_PORT = $(BASE_PORT)
|
||||
# Course-specific settings
|
||||
223015b_NAME = Dateiformate, Schnittstellen, Speichermedien
|
||||
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_KAPITEL = 00-intro 01-grundlagen-text-audio 02-bild-audio-video 03-speichermedien-schnittstellen 04-distribution-apis-zukunft 05-vertiefung-offene-fragen klausur
|
||||
223015b_DEPLOY_PATH = /home/tengo/html/hdm/223015b
|
||||
|
||||
223015c_NAME = Internettechnologien
|
||||
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_KAPITEL = 01-geschichte-grundlagen-html 02-netzwerke-protokolle-css 03-interaktivitaet-javascript klausur
|
||||
223015c_DEPLOY_PATH = /home/tengo/html/hdm/223015c
|
||||
|
||||
DEPLOY_HOST = tengo@tuttle.uberspace.de
|
||||
@@ -43,6 +43,7 @@ help:
|
||||
@echo " make build-c - Build 223015c only"
|
||||
@echo " make pdf - Export all to PDF"
|
||||
@echo " make html - Export all to HTML"
|
||||
@echo " make klausur - Extract klausur slides"
|
||||
@echo ""
|
||||
@echo "Tools:"
|
||||
@echo " make qr URL=... - Generate QR code for URL"
|
||||
@@ -74,24 +75,24 @@ dev-kill:
|
||||
dev-b:
|
||||
@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/
|
||||
PORT=$(223015b_PORT) npx @marp-team/marp-cli --server $(SLIDES_DIR)/223015b/
|
||||
|
||||
dev-c:
|
||||
@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/
|
||||
PORT=$(223015c_PORT) npx @marp-team/marp-cli --server $(SLIDES_DIR)/223015c/
|
||||
|
||||
# Build functions
|
||||
define build_course
|
||||
@echo "Building $(1)..."
|
||||
@mkdir -p build/$(1)
|
||||
@cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true
|
||||
@cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true
|
||||
@for f in $($(1)_TERMINS); do \
|
||||
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
|
||||
@cp -r $(SLIDES_DIR)/$(1)/assets build/$(1)/ 2>/dev/null || true
|
||||
@cp -r $(SLIDES_DIR)/$(1)/materials build/$(1)/ 2>/dev/null || true
|
||||
@for f in $($(1)_KAPITEL); do \
|
||||
if [ -f "$(SLIDES_DIR)/$(1)/$$f.md" ]; then \
|
||||
echo " Building $$f..."; \
|
||||
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \
|
||||
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
|
||||
npx @marp-team/marp-cli $(SLIDES_DIR)/$(1)/$$f.md -o build/$(1)/$$f.html; \
|
||||
npx @marp-team/marp-cli $(SLIDES_DIR)/$(1)/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
|
||||
fi \
|
||||
done
|
||||
@./scripts/generate-index.sh $(1) build/$(1)
|
||||
@@ -110,12 +111,12 @@ build: build-b build-c
|
||||
define html_course
|
||||
@echo "Building HTML for $(1)..."
|
||||
@mkdir -p build/$(1)
|
||||
@cp -r $(COURSE_DIR)/$(1)/slides/assets build/$(1)/ 2>/dev/null || true
|
||||
@cp -r $(COURSE_DIR)/$(1)/slides/materials build/$(1)/ 2>/dev/null || true
|
||||
@for f in $($(1)_TERMINS); do \
|
||||
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
|
||||
@cp -r $(SLIDES_DIR)/$(1)/assets build/$(1)/ 2>/dev/null || true
|
||||
@cp -r $(SLIDES_DIR)/$(1)/materials build/$(1)/ 2>/dev/null || true
|
||||
@for f in $($(1)_KAPITEL); do \
|
||||
if [ -f "$(SLIDES_DIR)/$(1)/$$f.md" ]; then \
|
||||
echo " $$f.html"; \
|
||||
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md -o build/$(1)/$$f.html; \
|
||||
npx @marp-team/marp-cli $(SLIDES_DIR)/$(1)/$$f.md -o build/$(1)/$$f.html; \
|
||||
fi \
|
||||
done
|
||||
@./scripts/generate-index.sh $(1) build/$(1)
|
||||
@@ -133,10 +134,10 @@ html: html-b html-c
|
||||
define pdf_course
|
||||
@echo "Building PDFs for $(1)..."
|
||||
@mkdir -p build/$(1)
|
||||
@for f in $($(1)_TERMINS); do \
|
||||
if [ -f "$(COURSE_DIR)/$(1)/slides/$$f.md" ]; then \
|
||||
@for f in $($(1)_KAPITEL); do \
|
||||
if [ -f "$(SLIDES_DIR)/$(1)/$$f.md" ]; then \
|
||||
echo " $$f.pdf"; \
|
||||
npx @marp-team/marp-cli $(COURSE_DIR)/$(1)/slides/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
|
||||
npx @marp-team/marp-cli $(SLIDES_DIR)/$(1)/$$f.md --pdf --allow-local-files -o build/$(1)/$$f.pdf; \
|
||||
fi \
|
||||
done
|
||||
endef
|
||||
@@ -149,6 +150,16 @@ pdf-c: build/.exists
|
||||
|
||||
pdf: pdf-b pdf-c
|
||||
|
||||
# Klausur slide extraction
|
||||
klausur-b:
|
||||
@./scripts/extract-klausur.sh 223015b
|
||||
|
||||
klausur-c:
|
||||
@./scripts/extract-klausur.sh 223015c
|
||||
|
||||
klausur: klausur-b klausur-c
|
||||
@echo "Klausur slides extracted for all courses!"
|
||||
|
||||
# QR Code generation (uses nix-shell)
|
||||
qr:
|
||||
ifndef URL
|
||||
@@ -174,9 +185,9 @@ ifndef COURSE
|
||||
@echo "Usage: make optimize-images COURSE=223015b"
|
||||
else
|
||||
@echo "Optimizing images for $(COURSE)..."
|
||||
@mkdir -p $(COURSE_DIR)/$(COURSE)/slides/assets-original
|
||||
@nix-shell -p imagemagick --run 'for img in $(COURSE_DIR)/$(COURSE)/slides/assets/*.png $(COURSE_DIR)/$(COURSE)/slides/assets/*.jpg 2>/dev/null; do \
|
||||
[ -f "$$img" ] && cp "$$img" $(COURSE_DIR)/$(COURSE)/slides/assets-original/ && \
|
||||
@mkdir -p $(SLIDES_DIR)/$(COURSE)/assets-original
|
||||
@nix-shell -p imagemagick --run 'for img in $(SLIDES_DIR)/$(COURSE)/assets/*.png $(SLIDES_DIR)/$(COURSE)/assets/*.jpg 2>/dev/null; do \
|
||||
[ -f "$$img" ] && cp "$$img" $(SLIDES_DIR)/$(COURSE)/assets-original/ && \
|
||||
magick "$$img" -resize "1920x>" -quality 85 "$$img" && echo " Optimized: $$(basename $$img)"; \
|
||||
done || true'
|
||||
@echo "Done! Originals in assets-original/"
|
||||
@@ -187,7 +198,7 @@ HDM_DEPLOY_PATH = /home/tengo/html/hdm
|
||||
|
||||
build-index: build/.exists
|
||||
@echo "Building root index..."
|
||||
@echo '<!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>HdM Vorlesungen</title><style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","Segoe UI",Roboto,sans-serif;max-width:720px;margin:0 auto;padding:3rem 1.5rem;background:#fafafa;color:#1d1d1f;line-height:1.5}h1{font-size:2rem;font-weight:600;letter-spacing:-0.02em;margin-bottom:.5rem}.subtitle{color:#86868b;font-size:1rem}.courses{margin-top:2rem;display:flex;flex-direction:column;gap:.75rem}a.course{display:block;background:#fff;border-radius:12px;padding:1.5rem;text-decoration:none;color:inherit;box-shadow:0 1px 3px rgba(0,0,0,0.08);transition:all .2s ease;cursor:pointer}a.course:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.12)}.course-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.course-b .course-label{color:#1e5f8a}.course-c .course-label{color:#d63384}.course-title{font-size:1.15rem;font-weight:500;color:#1d1d1f;margin:.25rem 0}.course-info{font-size:.85rem;color:#86868b}.section-title{font-size:1rem;font-weight:600;color:#86868b;margin-top:2.5rem;margin-bottom:.75rem}.references{display:flex;flex-direction:column;gap:.75rem}footer{margin-top:2.5rem;padding-top:1.5rem;border-top:1px solid #e5e5e7;color:#86868b;font-size:.85rem}footer a{color:#1d1d1f;text-decoration:none}footer a:hover{text-decoration:underline}.qr-section{margin-top:2.5rem;padding:1.5rem;background:#fff;border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,0.08);text-align:center}.qr-code{width:100%;height:auto}.qr-url{margin-top:.75rem;font-size:.85rem;color:#86868b}</style></head><body><h1>HdM Vorlesungen</h1><p class="subtitle">Wintersemester 2025/26 · Michael Czechowski</p><div class="courses"><a class="course course-b" href="223015b/"><span class="course-label">223015b</span><div class="course-title">Dateiformate, Schnittstellen, Speichermedien & Distributionswege</div><span class="course-info">6 Termine · Modul "Technik 1"</span></a><a class="course course-c" href="223015c/"><span class="course-label">223015c</span><div class="course-title">Grundlagen IT- und Internettechnik</div><span class="course-info">3 Termine · Modul "Technik 1"</span></a></div><h2 class="section-title">Referenzen</h2><div class="references"><a class="course" href="https://codecrispi.es/"><span class="course-label">Plattform</span><div class="course-title">Code Crispies</div><span class="course-info">Selbstlernplattform</span></a></div><div class="qr-section"><img src="qr-root.svg" alt="QR Code" class="qr-code"><p class="qr-url">https://librete.ch/hdm/</p></div><footer><a href="mailto:mail@librete.ch">Kontakt</a></footer></body></html>' > build/index.html
|
||||
@echo '<!DOCTYPE html><html lang="de"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>HdM Vorlesungen</title><style>*{box-sizing:border-box;margin:0;padding:0}body{font-family:-apple-system,BlinkMacSystemFont,"SF Pro Display","Segoe UI",Roboto,sans-serif;max-width:720px;margin:0 auto;padding:3rem 1.5rem;background:#fafafa;color:#1d1d1f;line-height:1.5}h1{font-size:2rem;font-weight:600;letter-spacing:-0.02em;margin-bottom:.5rem}.subtitle{color:#86868b;font-size:1rem}.courses{margin-top:2rem;display:flex;flex-direction:column;gap:.75rem}a.course{display:block;background:#fff;border-radius:12px;padding:1.5rem;text-decoration:none;color:inherit;box-shadow:0 1px 3px rgba(0,0,0,0.08);transition:all .2s ease;cursor:pointer}a.course:hover{transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,0.12)}.course-label{font-size:.7rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.course-b .course-label{color:#1e5f8a}.course-c .course-label{color:#d63384}.course-title{font-size:1.15rem;font-weight:500;color:#1d1d1f;margin:.25rem 0}.course-info{font-size:.85rem;color:#86868b}.section-title{font-size:1rem;font-weight:600;color:#86868b;margin-top:2.5rem;margin-bottom:.75rem}.references{display:flex;flex-direction:column;gap:.75rem}footer{margin-top:2.5rem;padding-top:1.5rem;border-top:1px solid #e5e5e7;color:#86868b;font-size:.85rem}footer a{color:#1d1d1f;text-decoration:none}footer a:hover{text-decoration:underline}.qr-section{margin-top:2.5rem;padding:1.5rem;background:#fff;border-radius:12px;box-shadow:0 1px 3px rgba(0,0,0,0.08);text-align:center}.qr-code{width:100%;height:auto}.qr-url{margin-top:.75rem;font-size:.85rem;color:#86868b}</style></head><body><h1>HdM Vorlesungen</h1><p class="subtitle">Wintersemester 2025/26 · Michael Czechowski</p><div class="courses"><a class="course course-b" href="223015b/"><span class="course-label">223015b</span><div class="course-title">Dateiformate, Schnittstellen, Speichermedien & Distributionswege</div><span class="course-info">6 Kapitel · Modul "Technik 1"</span></a><a class="course course-c" href="223015c/"><span class="course-label">223015c</span><div class="course-title">Grundlagen IT- und Internettechnik</div><span class="course-info">3 Kapitel · Modul "Technik 1"</span></a></div><h2 class="section-title">Referenzen</h2><div class="references"><a class="course" href="https://codecrispi.es/"><span class="course-label">Plattform</span><div class="course-title">Code Crispies</div><span class="course-info">Selbstlernplattform</span></a></div><div class="qr-section"><img src="qr-root.svg" alt="QR Code" class="qr-code"><p class="qr-url">https://librete.ch/hdm/</p></div><footer><a href="mailto:mail@librete.ch">Kontakt</a></footer></body></html>' > build/index.html
|
||||
|
||||
# Deploy
|
||||
define deploy_course
|
||||
|
||||
@@ -1,182 +1,95 @@
|
||||
# HdM Slides
|
||||
|
||||
**Modul "Technik 1"** - 1. Semester - Digital- und Medienwirtschaft
|
||||
Hochschule der Medien Stuttgart - Wintersemester 2025/26
|
||||
Presentation slides for HdM Stuttgart courses, built with [Marp](https://marp.app/).
|
||||
|
||||
---
|
||||
## Courses
|
||||
|
||||
## Kurse
|
||||
| Code | Title | Kapitel |
|
||||
|------|-------|---------|
|
||||
| 223015b | Dateiformate, Schnittstellen, Speichermedien | 6 |
|
||||
| 223015c | Internettechnologien | 3 |
|
||||
|
||||
### 223015b - Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
## Project Structure
|
||||
|
||||
| # | Datum | Thema |
|
||||
|---|-------|-------|
|
||||
| 0 | 19.12.2025 | Intro |
|
||||
| 1 | 19.12.2025 | Grundlagen, Text & Audio |
|
||||
| 2 | 09.01.2026 | Bild- & Videoformate |
|
||||
| 3 | 23.01.2026 | Speichermedien & Schnittstellen |
|
||||
| 4 | 30.01.2026 | Distribution, APIs & Zukunft |
|
||||
| 5 | TBA | Vertiefung & offene Fragen |
|
||||
|
||||
### 223015c - Internettechnologien
|
||||
|
||||
| # | Datum | Thema |
|
||||
|---|-------|-------|
|
||||
| 1 | 20.12.2025 | Geschichte, Grundlagen & HTML |
|
||||
| 2 | 10.01.2026 | Netzwerke, Protokolle & CSS |
|
||||
| 3 | 24.01.2026 | Interaktivitat & JavaScript |
|
||||
|
||||
**Dozent:** Michael Czechowski - mail@librete.ch
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Mit Nix (empfohlen)
|
||||
|
||||
```bash
|
||||
# Development shell mit allen Tools
|
||||
nix develop
|
||||
|
||||
# Oder direkt QR-Code generieren
|
||||
nix run .#qr -- "https://example.com"
|
||||
nix run .#qr-slides -- 223015b
|
||||
```
|
||||
|
||||
### Ohne Nix
|
||||
|
||||
```bash
|
||||
npm install
|
||||
make dev-b # 223015b auf Port 1312
|
||||
make dev-c # 223015c auf Port 1313
|
||||
slides/
|
||||
├── 223015b/ # Dateiformate course
|
||||
│ ├── 00-intro.md
|
||||
│ ├── 01-grundlagen-text-audio.md
|
||||
│ └── ...
|
||||
└── 223015c/ # Internettechnik course
|
||||
├── 01-geschichte-grundlagen-html.md
|
||||
└── ...
|
||||
scripts/ # Build scripts
|
||||
build/ # Generated output (gitignored)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Development
|
||||
|
||||
### Dev Server starten
|
||||
|
||||
```bash
|
||||
make dev-b # 223015b (Dateiformate) - http://localhost:1312
|
||||
make dev-c # 223015c (Internettechnik) - http://localhost:1313
|
||||
# Start dev servers (hot reload)
|
||||
make dev # All courses + index
|
||||
make dev-b # 223015b only (port 1311)
|
||||
make dev-c # 223015c only (port 1312)
|
||||
```
|
||||
|
||||
### Build
|
||||
## Build
|
||||
|
||||
```bash
|
||||
make build # Alle Kurse (HTML + PDF)
|
||||
make build-b # Nur 223015b
|
||||
make build-c # Nur 223015c
|
||||
make html # Nur HTML
|
||||
make pdf # Nur PDF
|
||||
make build # Build all (HTML + PDF)
|
||||
make build-b # Build 223015b only
|
||||
make build-c # Build 223015c only
|
||||
make html # HTML only
|
||||
make pdf # PDF only
|
||||
```
|
||||
|
||||
### Deploy
|
||||
## Klausur Slides
|
||||
|
||||
Extract exam-relevant slides (marked with `<!-- _class: klausur -->`) into a single file:
|
||||
|
||||
```bash
|
||||
make deploy # Alle Kurse
|
||||
make deploy-b # Nur 223015b
|
||||
make deploy-c # Nur 223015c
|
||||
make klausur # Extract all courses
|
||||
make klausur-b # 223015b only
|
||||
make klausur-c # 223015c only
|
||||
```
|
||||
|
||||
---
|
||||
Output: `slides/<course>/klausur.md`
|
||||
|
||||
The generated file includes:
|
||||
- A title slide per kapitel for orientation
|
||||
- All slides marked with `<!-- _class: klausur -->`
|
||||
|
||||
## Tools
|
||||
|
||||
### QR-Code Generator
|
||||
```bash
|
||||
make qr URL=https://example.com # Generate QR code
|
||||
make qr-slides COURSE=223015b # QR for course URL
|
||||
make optimize-images COURSE=223015b # Resize images
|
||||
```
|
||||
|
||||
## Deploy
|
||||
|
||||
```bash
|
||||
# Mit Nix
|
||||
nix run .#qr -- "https://librete.ch/hdm/223015b/"
|
||||
nix run .#qr -- "https://example.com" output.png
|
||||
|
||||
# Mit Make
|
||||
make qr URL=https://example.com
|
||||
make qr URL=https://example.com OUTPUT=my-qr.png
|
||||
|
||||
# Fur Kurse
|
||||
make qr-slides COURSE=223015b
|
||||
make deploy # Deploy all courses
|
||||
make deploy-b # Deploy 223015b only
|
||||
make deploy-c # Deploy 223015c only
|
||||
```
|
||||
|
||||
### Bilder optimieren
|
||||
## Marking Slides as Klausur-Relevant
|
||||
|
||||
```bash
|
||||
# Mit Nix
|
||||
nix run .#optimize-img -- courses/223015b/slides/assets/
|
||||
|
||||
# Mit Make
|
||||
make optimize-images COURSE=223015b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Projektstruktur
|
||||
|
||||
```
|
||||
hdm/
|
||||
├── courses/
|
||||
│ ├── 223015b/
|
||||
│ │ └── slides/
|
||||
│ │ ├── 2025-12-19-termin-1-grundlagen-text-audio.md
|
||||
│ │ ├── assets/
|
||||
│ │ └── materials/
|
||||
│ └── 223015c/
|
||||
│ └── slides/
|
||||
│ ├── 2025-12-20-termin-1-geschichte-grundlagen-html.md
|
||||
│ └── assets/
|
||||
├── scripts/
|
||||
│ └── generate-index.sh
|
||||
├── themes/
|
||||
│ └── custom-theme.css
|
||||
├── build/ # Generated output
|
||||
├── flake.nix # Nix flake with tools
|
||||
├── Makefile
|
||||
└── package.json
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Slides erstellen
|
||||
|
||||
### Frontmatter
|
||||
|
||||
```yaml
|
||||
---
|
||||
marp: true
|
||||
theme: uncover
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
---
|
||||
```
|
||||
|
||||
### Slide-Trennung
|
||||
Add this comment block after the slide separator:
|
||||
|
||||
```markdown
|
||||
# Slide 1
|
||||
|
||||
Content
|
||||
|
||||
---
|
||||
|
||||
# Slide 2
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
More content
|
||||
# Your Slide Title
|
||||
|
||||
Content here...
|
||||
```
|
||||
|
||||
### Bilder
|
||||
|
||||
```markdown
|
||||

|
||||
```
|
||||
|
||||
### Themes
|
||||
|
||||
Built-in: `default`, `gaia`, `uncover`
|
||||
Custom: in `themes/` Verzeichnis
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
[CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
The `klausur` class adds a visual indicator (diagonal stripes) during presentation.
|
||||
@@ -1,967 +0,0 @@
|
||||
---
|
||||
marp: true
|
||||
theme: gaia
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
header: "Dateiformate, Schnittstellen, Speichermedien & Distributionswege (223015b)"
|
||||
footer: "Michael Czechowski – HdM Stuttgart – WS 2025/26"
|
||||
title: Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
---
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--color-foreground: #1a1a2e;
|
||||
--color-highlight: #1e5f8a;
|
||||
--color-dimmed: #4a4a6a;
|
||||
}
|
||||
section.invert {
|
||||
--color-foreground: #fff;
|
||||
}
|
||||
section {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
h1 {
|
||||
color: #1e5f8a;
|
||||
}
|
||||
section.invert h1 {
|
||||
color: #fff;
|
||||
}
|
||||
h2 {
|
||||
color: #1f2937;
|
||||
}
|
||||
pre {
|
||||
background: #0f0f23;
|
||||
color: #5fb3e4;
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid #1e5f8a;
|
||||
}
|
||||
pre code {
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
}
|
||||
code {
|
||||
background: #1a1a2e;
|
||||
color: #5fb3e4;
|
||||
padding: 0.15em 0.4em;
|
||||
border-radius: 4px;
|
||||
}
|
||||
a {
|
||||
color: var(--color-highlight);
|
||||
}
|
||||
section.klausur {
|
||||
background: repeating-linear-gradient(
|
||||
135deg,
|
||||
#e3f2fd,
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
section.aufgabe footer {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- _class: invert -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #000 -->
|
||||
|
||||

|
||||
|
||||
# Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
|
||||
**223015b** · Modul "Technik 1" · 1. Semester
|
||||
Digital- und Medienwirtschaft
|
||||
Hochschule der Medien Stuttgart
|
||||
|
||||
**Wintersemester 2025/26**
|
||||
|
||||
[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Teil 1: Dateiformate
|
||||
## Bild-, Audio- & Videoformate
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Links: Hochauflösend
|
||||
Rechts: Stark komprimiert (JPEG-Artefakte sichtbar)
|
||||
Instagram-Effekt
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Was ist ein Bild?
|
||||
|
||||
**Digital = Pixelraster**
|
||||
|
||||
**Beispiel: 1920×1080 (Full HD)**
|
||||
= 2.073.600 Pixel
|
||||
|
||||
**Jedes Pixel = 3 Bytes (RGB)**
|
||||
2.073.600 × 3 = **6,2 MB**
|
||||
|
||||
**Für EIN Foto!**
|
||||
|
||||
<!--
|
||||
Zoom auf Pixel-Ebene zeigen
|
||||
Jedes Pixel = RGB-Tripel (3 Bytes)
|
||||
6 MB × 10.000 Fotos = 62 GB
|
||||
Smartphone-Speicher wäre schnell voll ohne Kompression
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# Rastergrafiken (Bitmaps)
|
||||
|
||||
**Aufbau:** 2D-Array von Pixeln mit Farbwerten
|
||||
|
||||
**Speicherbedarf (unkomprimiert):**
|
||||
Breite × Höhe × Farbtiefe (in Bytes)
|
||||
→ 1920×1080 × 3 Byte (RGB) = **6,2 MB**
|
||||
|
||||
**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)
|
||||
|
||||
**Skalierung:** Interpolation (Nearest Neighbor, Bilinear, Bicubic)
|
||||
|
||||
<!--
|
||||
DEFINITION: Bitmap = Bit-mapped graphics, 2D-Matrix aus Pixeln
|
||||
BERECHNUNG SPEICHERBEDARF: Breite × Höhe × (Farbtiefe / 8)
|
||||
BEISPIEL: 1920×1080 × 24 Bit = 1920×1080×3 = 6.220.800 Bytes ≈ 6,2 MB
|
||||
FARBTIEFE erklärt:
|
||||
- 1 Bit: 2^1 = 2 Farben (Schwarz/Weiß, Fax)
|
||||
- 8 Bit: 2^8 = 256 Farben (GIF, Graustufen)
|
||||
- 24 Bit: 2^24 = 16.777.216 Farben (True Color, RGB je 8 Bit)
|
||||
- 32 Bit: 24 Bit + 8 Bit Alpha-Kanal (Transparenz)
|
||||
INTERPOLATION bei Skalierung:
|
||||
- Nearest Neighbor: Schnell, pixelig (Pixel-Art)
|
||||
- Bilinear: Mittelwert aus 4 Nachbarn (Standard)
|
||||
- Bicubic: 16 Nachbarn, glatter (Photoshop-Standard)
|
||||
- Lanczos: Beste Qualität, rechenintensiv
|
||||
PRÜFUNGSRELEVANT: Speicherberechnung, Farbtiefe-Tabelle, warum Vergrößern problematisch
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# Vektorgrafiken
|
||||
|
||||
**Speicherung als geometrische Primitive:**
|
||||
- Pfade (Bézierkurven mit Kontrollpunkten)
|
||||
- Grundformen (Rechteck, Ellipse, Polygon)
|
||||
- Text (Glyphen als Outlines)
|
||||
|
||||
**SVG-Beispiel:**
|
||||
`<circle cx="50" cy="50" r="40" fill="#ff0000"/>`
|
||||
→ 3 Parameter statt 5.027 Pixel (r=40)
|
||||
|
||||
**Rendering-Pipeline:**
|
||||
Vektordaten → Rasterisierung → Framebuffer → Display
|
||||
|
||||
**Auflösungsunabhängig:** Gleiche Datei für Icon (32px) und Plakat (3m)
|
||||
|
||||
<!--
|
||||
PRIMITIVE: Grundbausteine der Vektorgrafik
|
||||
- Pfade: Sequenz von Punkten, verbunden durch Linien/Kurven
|
||||
- Bézierkurven: Quadratisch (3 Kontrollpunkte), Kubisch (4 Kontrollpunkte)
|
||||
- Formen: Rechteck, Ellipse, Polygon (intern als Pfade)
|
||||
SVG-SYNTAX Beispiele:
|
||||
- <rect x="0" y="0" width="100" height="50"/>
|
||||
- <circle cx="50" cy="50" r="25"/>
|
||||
- <path d="M 0 0 L 100 100"/> (MoveTo, LineTo)
|
||||
BERECHNUNG: Kreis mit r=40 → Fläche = π×40² ≈ 5.027 Pixel vs. 3 Parameter
|
||||
RENDERING-PIPELINE: Vector → Tessellation → Rasterization → Framebuffer
|
||||
FORMATE:
|
||||
- SVG: XML-basiert, Web-Standard, editierbar
|
||||
- PDF: Seiten-Beschreibungssprache, Vektoren + Raster gemischt
|
||||
- AI/EPS: Adobe-proprietär, Druckvorstufe
|
||||
PRÜFUNGSRELEVANT: Warum Vektoren skalierbar, SVG-Grundsyntax, Rendering-Pipeline
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# Raster vs. Vektor: Entscheidungskriterien
|
||||
|
||||
| Kriterium | Raster | Vektor |
|
||||
|---|---|---|
|
||||
| **Speicherung** | Pixelmatrix | Geometrie + Attribute |
|
||||
| **Skalierung** | Qualitätsverlust | Verlustfrei |
|
||||
| **Komplexität** | O(Breite × Höhe) | O(Anzahl Objekte) |
|
||||
| **Bearbeitung** | Pixelbasiert | Objektbasiert |
|
||||
|
||||
**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)
|
||||
|
||||
<!--
|
||||
KOMPLEXITÄT erklärt:
|
||||
- Raster O(w×h): Speicher wächst mit Pixelanzahl
|
||||
- Vektor O(n): Speicher wächst mit Objektanzahl
|
||||
BEISPIEL: Foto einer Wiese
|
||||
- Raster: 1920×1080 = 2 Mio. Pixel, komprimiert ~500 KB
|
||||
- Vektor: Jeder Grashalm ein Pfad → Millionen Objekte, unkomprimierbar
|
||||
KONVERTIERUNG:
|
||||
- Raster→Vektor (Tracing): Kantenerkennung, verlustbehaftet
|
||||
- Tools: Potrace (Open Source), Adobe Live Trace, Inkscape
|
||||
- Funktioniert gut: Logos, Zeichnungen, Text
|
||||
- Funktioniert schlecht: Fotos, Farbverläufe
|
||||
- Vektor→Raster (Rasterisierung): Exakt, aber Auflösung fixiert
|
||||
- Jeder Bildschirm macht das (GPU)
|
||||
- Export: "Auflösung" wählen = Ziel-Pixelgröße
|
||||
ENTSCHEIDUNGSBAUM:
|
||||
- Foto/Screenshot? → Raster
|
||||
- Logo/Icon/Diagramm? → Vektor
|
||||
- Druckvorlage? → Vektor (Auflösungsunabhängig)
|
||||
- Web-Animation? → SVG (Vektor) oder Video (Raster)
|
||||
PRÜFUNGSRELEVANT: Wann welches Format, Konvertierungsrichtungen und deren Eigenschaften
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Lossless: PNG
|
||||
|
||||
**PNG = Portable Network Graphics (1996)**
|
||||
|
||||
**Funktionsweise:**
|
||||
- Vorhersage (Pixel ähneln Nachbarn)
|
||||
- Differenz-Encoding
|
||||
- DEFLATE-Algorithmus (wie ZIP)
|
||||
|
||||
**Kompression:** 20-50% Ersparnis
|
||||
|
||||
**Gut für:** Screenshots, Logos, Text
|
||||
**Schlecht für:** Fotos
|
||||
|
||||
<!--
|
||||
PNG wurde entwickelt als GIF-Alternative (Patent-Probleme)
|
||||
Lossless: Originaldaten bleiben erhalten
|
||||
Transparenz: Alpha-Kanal (sanfte Übergänge)
|
||||
DEFLATE: Gleicher Algorithmus wie ZIP
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Lossy: JPEG
|
||||
|
||||
**JPEG = Joint Photographic Experts Group (1992)**
|
||||
|
||||
**Eigenschaften:**
|
||||
- Lossy Kompression
|
||||
- 90%+ Platzersparnis möglich
|
||||
- Artefakte bei hoher Kompression
|
||||
|
||||
**6 MB → 500 KB** (typisch)
|
||||
|
||||
<!--
|
||||
JPEG-Norm beschreibt nur Kompression, nicht Speicherformat
|
||||
JFIF = JPEG File Interchange Format (das eigentliche Dateiformat)
|
||||
Dateierweiterungen: .jpg, .jpeg, .jfif (alle gleich)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Beispiel: Stark komprimiertes JPEG
|
||||
Blocking (8×8-Blöcke sichtbar)
|
||||
Ringing (Geister um Kanten)
|
||||
Color Banding (Verläufe "treppig")
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Wie funktioniert JPEG? (1/2)
|
||||
|
||||
**Schritt 1: RGB → YCbCr**
|
||||
- Y = Helligkeit (Luminanz)
|
||||
- Cb/Cr = Farbe (Chrominanz)
|
||||
|
||||
**Warum?** Menschen sehen Helligkeit besser als Farbe
|
||||
|
||||
**Schritt 2: Chroma Subsampling**
|
||||
Farbauflösung reduzieren (4:2:0)
|
||||
→ 50% Datenmenge weg, kaum sichtbar
|
||||
|
||||
<!--
|
||||
YCbCr = Farbraum-Konversion
|
||||
Y = Brightness, Cb = Blue-Yellow, Cr = Red-Green
|
||||
4:2:0 Subsampling: Farbe nur jedes 2. Pixel horizontal & vertikal
|
||||
Auge merkt's kaum, weil Helligkeitssehen dominiert
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Wie funktioniert JPEG? (2/2)
|
||||
|
||||
**Schritt 3: DCT (Discrete Cosine Transform)**
|
||||
Bild in 8×8-Blöcke → Frequenzspektrum
|
||||
|
||||
**Schritt 4: Quantisierung**
|
||||
Hohe Frequenzen (Details) stark reduzieren
|
||||
→ **Hier passiert Datenverlust!**
|
||||
|
||||
**Schritt 5: Huffman-Coding**
|
||||
Lossless-Kompression der Restdaten
|
||||
|
||||
<!--
|
||||
DCT: Ähnlich wie FFT bei Audio
|
||||
8×8 Blöcke: Warum JPEG "blocky" wird bei hoher Kompression
|
||||
Quantisierung: Quality-Schieberegler steuert genau das
|
||||
Huffman: Finale Effizienz (wie bei MP3)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# JPEG Qualität
|
||||
|
||||
| Quality | Dateigröße | Artefakte |
|
||||
|---------|------------|-----------|
|
||||
| **100** | ≈2-3 MB | Kaum |
|
||||
| **85-90** | ≈200-400 KB | Minimal |
|
||||
| **50** | ≈100 KB | Sichtbar |
|
||||
|
||||
**Sweet Spot: 85-90**
|
||||
10x Kompression, für Menschen kaum unterscheidbar
|
||||
|
||||
<!--
|
||||
Quality 100 = Minimum Compression (nicht lossless!)
|
||||
Quality 85-90 = Standard für Web
|
||||
Quality 50 = Sichtbare Artefakte (Blocking, Ringing)
|
||||
Photoshop "Save for Web": Standard ist 60
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
GIF-Animation (z.B. Meme)
|
||||
256 Farben, aber Animationen möglich
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Die GIF-Geschichte
|
||||
|
||||
**GIF = Graphics Interchange Format (1987)**
|
||||
CompuServe (US-Online-Dienst)
|
||||
|
||||
**Features:**
|
||||
- 256 Farben max (8-bit Palette)
|
||||
- Lossless (für Palette)
|
||||
- Animationen!
|
||||
|
||||
**1994 Twist:** Unisys hält Patent auf LZW-Kompression
|
||||
→ Fordert Lizenzgebühren
|
||||
|
||||
→ **"Burn All GIFs!" Kampagne**
|
||||
|
||||
<!--
|
||||
CompuServe: Früher Online-Dienst (1969-2009)
|
||||
LZW = Lempel-Ziv-Welch Compression
|
||||
Unisys Patent-Trolling: Erst Jahre nach GIF-Einführung
|
||||
Community-Reaktion: Boykott, Suche nach Alternative
|
||||
Ergebnis: PNG wurde entwickelt (1996)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# PNG vs. GIF
|
||||
|
||||
**GIF:**
|
||||
✓ Animationen
|
||||
✓ Breite Unterstützung
|
||||
❌ Nur 256 Farben
|
||||
❌ Patent-Probleme (bis 2003)
|
||||
|
||||
**PNG:**
|
||||
✓ Millionen Farben
|
||||
✓ Alpha-Transparenz
|
||||
✓ Patent-frei
|
||||
❌ Keine Animationen (bis APNG, 2004)
|
||||
|
||||
**Ergebnis:** PNG für Grafiken, GIF für Memes!
|
||||
|
||||
<!--
|
||||
APNG = Animated PNG (Firefox, Safari support)
|
||||
WebP (Google, 2010): Animationen + bessere Kompression
|
||||
GIF überlebte kulturell (Meme-Format)
|
||||
"GIF" Aussprache: "Jif" vs. "Gif" – ewiger Streit
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# WebP & AVIF
|
||||
|
||||
**WebP (Google, 2010):**
|
||||
- Lossy UND Lossless
|
||||
- Animationen
|
||||
- 25-35% kleiner als JPEG
|
||||
|
||||
**AVIF (2019):**
|
||||
- Basiert auf AV1-Video-Codec
|
||||
- 50% kleiner als JPEG
|
||||
- HDR-Unterstützung
|
||||
- Patent-frei
|
||||
|
||||
<!--
|
||||
WebP: Von Google entwickelt, deshalb Skepsis
|
||||
AVIF: Alliance for Open Media (Google, Netflix, Amazon, Mozilla...)
|
||||
Browser-Support 2024: WebP fast überall, AVIF wachsend
|
||||
JPEG bleibt dominant (Kompatibilität!)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Vorher/Nachher: Hochauflösend vs. Instagram-Upload
|
||||
Sichtbare Qualitätsverluste
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Warum Instagram eure Fotos "ruiniert"
|
||||
|
||||
**Upload-Pipeline:**
|
||||
1. Dein Foto: 12 MP, 8 MB
|
||||
2. Instagram skaliert: max. 1080px
|
||||
3. Re-Kompression: JPEG Quality ~75
|
||||
4. Endgröße: 200-400 KB
|
||||
|
||||
**Warum?**
|
||||
- Speicherkosten (Milliarden Fotos!)
|
||||
- Ladezeiten (Mobile)
|
||||
- Bandbreite (günstiger)
|
||||
|
||||
<!--
|
||||
Instagram ist keine Kunstgalerie
|
||||
Optimiert für Geschwindigkeit, nicht Qualität
|
||||
Facebook macht dasselbe
|
||||
Lösung: Portfolio-Websites (eigene Kontrolle)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: aufgabe -->
|
||||
|
||||

|
||||
|
||||
# Hands-On: Kompression vergleichen
|
||||
|
||||
**Aufgabe (40 Min):**
|
||||
|
||||
1. Hochauflösendes Foto (eigenes oder CC)
|
||||
2. Exportiere:
|
||||
- PNG
|
||||
- JPEG Q100, Q85, Q50
|
||||
- WebP (optional)
|
||||
3. Tool: **[Squoosh.app](https://squoosh.app)** (Google-Tool)
|
||||
4. Vergleiche: Dateigrößen, sichtbare Unterschiede
|
||||
5. Wo werden Artefakte sichtbar?
|
||||
|
||||
<!--
|
||||
Squoosh.app: Browser-basiert, keine Installation
|
||||
Side-by-Side-Vergleich mit Zoom
|
||||
Verschiedene Codecs testen
|
||||
Studis sollen selbst "Sweet Spot" finden
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Teil 2: Video
|
||||
## Kompression & Codecs
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Netflix 4K-Streaming
|
||||
Unmöglich ohne moderne Codecs
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Das Problem: Videos sind RIIIIIIIESIG
|
||||
|
||||
**1 Minute 4K-Video (3840×2160):**
|
||||
|
||||
- 30 fps (Bilder/Sekunde)
|
||||
- Jedes Bild: 24,8 MB (unkomprimiert)
|
||||
|
||||
**Rechnung:**
|
||||
30 × 24,8 MB = **744 MB/Sekunde**
|
||||
× 60 Sekunden = **44,6 GB/Minute**
|
||||
|
||||
**2-Stunden-Film: 5,3 TB!**
|
||||
|
||||
<!--
|
||||
4K = 3840×2160 Pixel = 8,3 Megapixel pro Frame
|
||||
30 fps = Standard, Kino = 24 fps, Gaming = 60+ fps
|
||||
Ohne Kompression: Unmöglich zu streamen oder speichern
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Container: Das Dateiformat
|
||||
|
||||
**Was ist ein Container?**
|
||||
Das Dateiformat – eine "Box", die verschiedene Streams zusammenpackt:
|
||||
- Video-Stream, Audio-Stream(s), Untertitel, Metadaten
|
||||
|
||||
**Gängige Container:**
|
||||
- **MP4** (.mp4) – Web, Streaming
|
||||
- **MKV** (.mkv) – Archiv, viele Streams
|
||||
- **AVI** (.avi) – Legacy (veraltet)
|
||||
- **MOV** (.mov) – Apple-Ökosystem
|
||||
|
||||
<!--
|
||||
Container = Verpackung, nicht der Inhalt
|
||||
Ein MP4 sagt nichts über die Qualität aus
|
||||
MKV kann beliebig viele Audio/Untertitel-Spuren haben
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Codec: Der Kompressionsalgorithmus
|
||||
|
||||
**Was ist ein Codec?** (Coder/Decoder)
|
||||
Entscheidet, WIE Video/Audio komprimiert wird
|
||||
|
||||
**Video-Codecs:**
|
||||
|
||||
| Codec | Jahr | Verbreitung |
|
||||
|-------|------|-------------|
|
||||
| H.264/AVC | 2003 | Universell, überall |
|
||||
| H.265/HEVC | 2013 | 4K, effizient, Lizenzen |
|
||||
| VP9 | 2013 | YouTube, Google |
|
||||
| AV1 | 2018 | Zukunft, lizenzfrei |
|
||||
|
||||
**Audio-Codecs:** AAC, MP3, Opus, FLAC
|
||||
|
||||
<!--
|
||||
H.264 = De-facto-Standard seit 20 Jahren
|
||||
H.265 = 50% kleinere Dateien, aber teure Lizenzen
|
||||
AV1 = Open Source, Netflix/YouTube pushen es
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Container + Codec = Video
|
||||
|
||||
**Das Zusammenspiel:**
|
||||
|
||||
```
|
||||
┌─────────────────────────────┐
|
||||
│ Container (z.B. MP4) │
|
||||
│ ┌────────────────────────┐ │
|
||||
│ │ Video-Stream (H.264) │ │
|
||||
│ ├────────────────────────┤ │
|
||||
│ │ Audio-Stream (AAC) │ │
|
||||
│ ├────────────────────────┤ │
|
||||
│ │ Untertitel (SRT) │ │
|
||||
│ └────────────────────────┘ │
|
||||
└─────────────────────────────┘
|
||||
```
|
||||
|
||||
**Häufiger Irrtum:** "Das ist eine MP4-Datei"
|
||||
→ Sagt nichts über den Codec aus!
|
||||
|
||||
<!--
|
||||
Container ≠ Codec (häufiges Missverständnis!)
|
||||
MP4 ist KEIN Codec, sondern Container
|
||||
Ein MP4 kann H.264, H.265 oder AV1 enthalten
|
||||
Prüfen mit: MediaInfo, ffprobe
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Diagramm: Container mit verschiedenen Streams
|
||||
Video-Track (H.264)
|
||||
Audio-Track (AAC)
|
||||
Untertitel-Track (SRT)
|
||||
Metadaten (Titel, Künstler, etc.)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Video-Kompression: Drei Prinzipien
|
||||
|
||||
**1. Spatial Compression (Intra-Frame)**
|
||||
Jedes Bild einzeln (wie JPEG)
|
||||
→ I-Frames
|
||||
|
||||
**2. Temporal Compression (Inter-Frame)**
|
||||
Nur Änderungen zwischen Bildern
|
||||
→ P-Frames, B-Frames
|
||||
|
||||
**3. Motion Compensation**
|
||||
"Ball bewegt sich von A nach B"
|
||||
|
||||
<!--
|
||||
Spatial: Innerhalb eines Bildes (JPEG-ähnlich)
|
||||
Temporal: Zwischen Bildern (zeitliche Redundanz)
|
||||
Motion Compensation: Intelligente Vorhersage
|
||||
→ 90%+ Effizienz durch temporale Kompression
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# I-Frames, P-Frames, B-Frames
|
||||
|
||||
**I-Frame (Intra):**
|
||||
Vollständiges Bild (wie JPEG)
|
||||
Groß, aber unabhängig
|
||||
|
||||
**P-Frame (Predicted):**
|
||||
Referenziert vorherige Frames
|
||||
Viel kleiner
|
||||
|
||||
**B-Frame (Bi-directional):**
|
||||
Referenziert vorherige UND zukünftige Frames
|
||||
Am effizientesten
|
||||
|
||||
**GOP:** I - B - B - P - B - B - P - B - B - I
|
||||
|
||||
<!--
|
||||
GOP = Group of Pictures (typisch 12-15 Frames)
|
||||
I-Frame: Alle 1-2 Sekunden nötig (für Seeking)
|
||||
P-Frame: "Pixel X bewegt sich 5px rechts"
|
||||
B-Frame: Komplex, aber beste Kompression
|
||||
Wenn du vorspulst: Sucht nach nächstem I-Frame
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Visualisierung: I/P/B-Frame-Abhängigkeiten
|
||||
I-Frame = Vollbild (Keyframe), P/B-Frames speichern nur Unterschiede
|
||||
Quelle: https://www.canon.com.hk/cpx/en/technical/va_EOS_Movie_Compression_Options_All_I_and_IPB.html
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# H.264 / AVC Codec (2003)
|
||||
### Der bisherige Platzhirsch
|
||||
|
||||
**Warum dominant?**
|
||||
✓ Exzellente Kompression (100:1 möglich)
|
||||
✓ Hardware-Support (jedes Gerät seit ~2010)
|
||||
✓ YouTube, Netflix, Blu-ray – alles H.264
|
||||
|
||||
**Features:**
|
||||
- Variable Block-Größen (16×16 bis 4×4)
|
||||
- Deblocking-Filter
|
||||
- CABAC-Coding
|
||||
|
||||
<!--
|
||||
AVC = Advanced Video Coding
|
||||
MPEG-4 Part 10 = H.264 (gleicher Standard)
|
||||
Revolutionierte Video-Streaming
|
||||
Hardware-Decoder in CPUs/GPUs → Batterie-schonend
|
||||
CABAC = Context-Adaptive Binary Arithmetic Coding
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Das Patent-Problem
|
||||
|
||||
**H.264 ist NICHT frei!**
|
||||
|
||||
**MPEG-LA (Patent Pool):**
|
||||
- 2.000+ Patente von ~30 Unternehmen
|
||||
- Apple, Microsoft, Sony, Panasonic...
|
||||
|
||||
**Lizenzgebühren:**
|
||||
- Hardware-Decoder: $0,20/Einheit
|
||||
- Content-Distribution: Kostenlos für "Internet Broadcast"
|
||||
|
||||
**Problem:** Open-Source-Projekte in Grauzone
|
||||
|
||||
<!--
|
||||
MPEG-LA = Licensing Authority
|
||||
Firefox weigerte sich lange, H.264 zu supporten (Patent-Gründe)
|
||||
Chromium musste extern linken
|
||||
Patent-Pool: Firmen teilen Patente, gemeinsame Lizenzierung
|
||||
"Free to View" Klausel: YouTube etc. kostenlos
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# H.265 / HEVC Codec (2013)
|
||||
|
||||
50% bessere Kompression als H.264
|
||||
|
||||
**ABER:** Patent-Desaster
|
||||
|
||||
**Drei (!) konkurrierende Patent-Pools:**
|
||||
- MPEG-LA
|
||||
- HEVC Advance
|
||||
- Velos Media
|
||||
|
||||
→ Viele bleiben bei H.264 oder suchen Alternativen
|
||||
|
||||
<!--
|
||||
HEVC = High Efficiency Video Coding
|
||||
Technisch überlegen, aber juristisch Albtraum
|
||||
Apple nutzt HEVC (iPhone-Videos)
|
||||
Netflix zögert wegen Lizenzkosten
|
||||
Fragmentierung verzögert Adoption
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
YouTube VP9-Logo
|
||||
Google's Patent-freie Alternative
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# VP9: Googles Antwort
|
||||
|
||||
**VP9 (2013):**
|
||||
Entwickelt von Google (On2-Akquisition)
|
||||
|
||||
**Eigenschaften:**
|
||||
✓ Ähnlich H.265-Kompression
|
||||
✓ KOSTENLOS, patent-frei (laut Google)
|
||||
✓ YouTube nutzt VP9 für 4K
|
||||
|
||||
**Nachteile:**
|
||||
❌ Hardware-Support langsam
|
||||
❌ Höherer CPU-Aufwand
|
||||
❌ Nicht universell wie H.264
|
||||
|
||||
<!--
|
||||
On2 Technologies: Gekauft 2010 für $133M
|
||||
VP8 → VP9 → AV1 (Evolution)
|
||||
YouTube forciert VP9: 4K-Videos nur VP9/AV1
|
||||
Hardware-Decoder erst ab ~2016 (langsame Adoption)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
AV1-Logo
|
||||
Alliance for Open Media
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# AV1: Die Open-Source-Revolution
|
||||
|
||||
**AV1 (2018):**
|
||||
Alliance for Open Media: Google, Netflix, Amazon, Microsoft, Apple, Mozilla...
|
||||
|
||||
**Ziel:** Patent-freier, moderner Codec
|
||||
|
||||
**Features:**
|
||||
✓ 30% besser als H.265
|
||||
✓ Royalty-free, Open Source
|
||||
✓ 8K, HDR, hohe Frame-Rates
|
||||
✓ Erster Codec, der einen Grammy gewonnen hat (2025)
|
||||
|
||||
**Stand 2025:**
|
||||
YouTube, Netflix nutzen AV1 für 4K/8K
|
||||
|
||||
<!--
|
||||
AOM = Alliance for Open Media (2015 gegründet)
|
||||
Alle Big-Tech-Player vereint (historisch!)
|
||||
"Fuck you" an Patent-Mafia
|
||||
Problem: Encoding SEHR langsam (10-100x vs. H.264)
|
||||
Hardware-Encoder kommen (ab 2020er-GPUs)
|
||||
|
||||
Source: https://blog.mozilla.org/en/mozilla/av1-video-codec-wins-emmy/
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Adaptive Bitrate Streaming
|
||||
|
||||
**Problem:** Internet-Geschwindigkeit variiert
|
||||
|
||||
**Lösung:** Mehrere Qualitäten parallel
|
||||
|
||||
**MPEG-DASH / HLS:**
|
||||
- 4K (20 Mbps)
|
||||
- 1080p (5 Mbps)
|
||||
- 720p (2,5 Mbps)
|
||||
- 480p (1 Mbps)
|
||||
- 240p (0,5 Mbps)
|
||||
|
||||
Segmente: 2-10 Sekunden (Player wählt dynamisch)
|
||||
|
||||
<!--
|
||||
DASH = Dynamic Adaptive Streaming over HTTP
|
||||
HLS = HTTP Live Streaming (Apple)
|
||||
Beide ähnlich, aber inkompatibel
|
||||
Manifest-Datei: Liste aller Qualitäten
|
||||
Player misst Bandbreite, wechselt live
|
||||
→ Warum Netflix plötzlich pixelig wird
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Visualisierung: Qualitätswechsel während Playback
|
||||
Bandbreite schwankt → Player reagiert
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Container im Detail
|
||||
|
||||
**MP4:** Standard für Web/Mobile, DRM-fähig (H.264, H.265, AV1)
|
||||
|
||||
**MKV:** Open Source, beliebig viele Spuren (fast jeder Codec)
|
||||
|
||||
**WebM:** Google/Web-optimiert (nur VP9/AV1 + Opus/Vorbis)
|
||||
|
||||
<!--
|
||||
MP4 = MPEG-4 Part 14 (ISO-Standard)
|
||||
Matroska = Russisch: Matrjoschka (Puppen ineinander)
|
||||
WebM = Subset von Matroska (HTML5-Video)
|
||||
MKV vs. MP4: Offenheit vs. Kompatibilität
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: aufgabe -->
|
||||
|
||||
# Hands-On: Video analysieren
|
||||
|
||||
**Aufgabe (40 Min):**
|
||||
|
||||
**Tools:**
|
||||
- Desktop: FFmpeg, HandBrake, [MediaInfo](https://mediaarea.net/MediaInfoOnline)
|
||||
- Browser: [Squoosh.app](https://squoosh.app) (Bilder), [MediaInfo Online](https://mediaarea.net/MediaInfoOnline)
|
||||
- iOS/Android: MediaInfo App, VLC
|
||||
|
||||
1. Download: CC-Video (Big Buck Bunny, ~1 Min)
|
||||
2. Analysiere: Container, Codec, Bitrate, Auflösung
|
||||
3. Konvertiere: H.264 vs. H.265 (gleiche Qualität)
|
||||
4. Vergleiche: Größen, Encoding-Zeit
|
||||
|
||||
<!--
|
||||
Big Buck Bunny: Open-Source-Film (Blender Foundation)
|
||||
FFmpeg: Swiss Army Knife für Video
|
||||
HandBrake: GUI für FFmpeg (einfacher)
|
||||
MediaInfo: Detaillierte Datei-Analyse
|
||||
Encoding-Zeit: H.265 deutlich langsamer als H.264
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Fragen & Diskussion
|
||||
|
||||
**Kontakt:** mail@librete.ch
|
||||
**Folien:** Online verfügbar unter https://librete.ch/hdm/223015b
|
||||
|
||||
---
|
||||
|
||||
# Lizenz & Attribution
|
||||
|
||||
Diese Präsentation ist lizenziert unter **Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)**
|
||||
|
||||
- Erlaubt Teilen & Anpassen mit Namensnennung
|
||||
- Adaptionen müssen unter gleicher Lizenz geteilt werden
|
||||
|
||||
Vollständige Lizenz: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
||||
@@ -8,7 +8,7 @@ set -e
|
||||
INDEX_PORT=1310
|
||||
COURSE_B_PORT=1311
|
||||
COURSE_C_PORT=1312
|
||||
COURSE_DIR="courses"
|
||||
SLIDES_DIR="slides"
|
||||
DEV_INDEX_DIR=".dev-index"
|
||||
|
||||
# Colors
|
||||
@@ -94,12 +94,12 @@ echo ""
|
||||
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/" &
|
||||
PORT=$COURSE_B_PORT npx @marp-team/marp-cli --server "$SLIDES_DIR/223015b/" &
|
||||
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/" &
|
||||
PORT=$COURSE_C_PORT npx @marp-team/marp-cli --server "$SLIDES_DIR/223015c/" &
|
||||
PID_C=$!
|
||||
|
||||
# Wait for any process to exit
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
#!/usr/bin/env bash
|
||||
# Extract klausur-relevant slides from all kapitel
|
||||
# Usage: ./extract-klausur.sh <course_id>
|
||||
# Output: slides/<course>/klausur.md
|
||||
|
||||
set -e
|
||||
|
||||
COURSE="${1:-223015b}"
|
||||
SLIDES_DIR="slides/$COURSE"
|
||||
OUTPUT_FILE="$SLIDES_DIR/klausur.md"
|
||||
|
||||
# Find the first kapitel file (01-*.md) to copy styles from
|
||||
FIRST_KAPITEL=$(ls "$SLIDES_DIR"/01-*.md 2>/dev/null | head -1)
|
||||
|
||||
if [[ -z "$FIRST_KAPITEL" ]]; then
|
||||
echo "Error: No 01-*.md file found in $SLIDES_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Extracting klausur slides for $COURSE..."
|
||||
|
||||
# Extract frontmatter and styles (everything up to first <!-- _class: line after style block)
|
||||
# This gets the YAML frontmatter + <style> block
|
||||
awk '
|
||||
BEGIN { in_frontmatter = 0; in_style = 0; done = 0 }
|
||||
/^---$/ && !in_frontmatter { in_frontmatter = 1; print; next }
|
||||
/^---$/ && in_frontmatter && !in_style { in_frontmatter = 0; print; next }
|
||||
in_frontmatter { print; next }
|
||||
/<style>/ { in_style = 1; print; next }
|
||||
/<\/style>/ { in_style = 0; print; print ""; done = 1; next }
|
||||
in_style { print; next }
|
||||
done { exit }
|
||||
' "$FIRST_KAPITEL" > "$OUTPUT_FILE"
|
||||
|
||||
# Add warning comment
|
||||
cat >> "$OUTPUT_FILE" << 'EOF'
|
||||
<!--
|
||||
╔═══════════════════════════════════════════════════════════════════╗
|
||||
║ AUTO-GENERATED FILE - DO NOT EDIT MANUALLY ║
|
||||
║ ║
|
||||
║ This file is generated by: make klausur ║
|
||||
║ Source: scripts/extract-klausur.sh ║
|
||||
║ ║
|
||||
║ To update, edit the source slides and re-run make klausur ║
|
||||
╚═══════════════════════════════════════════════════════════════════╝
|
||||
-->
|
||||
|
||||
EOF
|
||||
|
||||
# Extract and copy the cover slide (first slide after frontmatter/styles, up to first ---)
|
||||
awk '
|
||||
BEGIN { past_style = 0; in_cover = 0; printed = 0 }
|
||||
/<\/style>/ { past_style = 1; next }
|
||||
past_style && !in_cover && /^[^[:space:]]/ { in_cover = 1 }
|
||||
in_cover && /^---$/ { print "---\n"; exit }
|
||||
in_cover { print }
|
||||
' "$FIRST_KAPITEL" >> "$OUTPUT_FILE"
|
||||
|
||||
# Process each kapitel file in order - extract klausur slides only
|
||||
for md_file in $(ls "$SLIDES_DIR"/[0-9][0-9]-*.md 2>/dev/null | grep -v klausur | sort); do
|
||||
filename=$(basename "$md_file")
|
||||
kapitel_num=$(echo "$filename" | grep -oE '^[0-9]+' | sed 's/^0*//')
|
||||
|
||||
# Skip intro (kapitel 0)
|
||||
if [[ "$kapitel_num" == "0" ]] || [[ -z "$kapitel_num" ]]; then
|
||||
continue
|
||||
fi
|
||||
|
||||
# Check if file has any klausur slides
|
||||
if ! grep -q '<!-- _class: klausur -->' "$md_file"; then
|
||||
continue
|
||||
fi
|
||||
|
||||
echo " Processing Kapitel $kapitel_num..."
|
||||
|
||||
# Extract klausur slides, hide header/footer, convert * to - bullets
|
||||
awk '
|
||||
/<!-- _class: klausur -->/ {
|
||||
in_klausur = 1
|
||||
# Add header/footer hiding
|
||||
print "<!-- _header: \"\" -->"
|
||||
print "<!-- _footer: \"\" -->"
|
||||
print ""
|
||||
next
|
||||
}
|
||||
in_klausur && /^---$/ {
|
||||
print "\n---\n"
|
||||
in_klausur = 0
|
||||
next
|
||||
}
|
||||
in_klausur {
|
||||
# Skip marp directives (we add our own)
|
||||
if (/<!-- _header:/ || /<!-- _footer:/ || /<!-- _backgroundColor:/) next
|
||||
# Convert * bullets to - bullets (avoid fragments)
|
||||
gsub(/^\* /, "- ")
|
||||
gsub(/^ \* /, " - ")
|
||||
gsub(/^ \* /, " - ")
|
||||
print
|
||||
}
|
||||
' "$md_file" >> "$OUTPUT_FILE"
|
||||
|
||||
done
|
||||
|
||||
# Remove trailing --- and empty lines
|
||||
perl -i -0777 -pe 's/\n*---\n*$/\n/' "$OUTPUT_FILE"
|
||||
|
||||
# Count slides
|
||||
slide_count=$(grep -c '^---$' "$OUTPUT_FILE" 2>/dev/null || echo "0")
|
||||
|
||||
echo ""
|
||||
echo "Generated: $OUTPUT_FILE"
|
||||
echo "Total slides: $slide_count"
|
||||
@@ -77,13 +77,13 @@ cat > "$BUILD_DIR/index.html" << HEADER
|
||||
font-size: 0.875rem;
|
||||
margin-top: 0.25rem;
|
||||
}
|
||||
.termine {
|
||||
.kapitel {
|
||||
margin-top: 1.5rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
.termin-card {
|
||||
.kapitel-card {
|
||||
position: relative;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
@@ -94,31 +94,31 @@ cat > "$BUILD_DIR/index.html" << HEADER
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
.termin-card:hover {
|
||||
.kapitel-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.12);
|
||||
}
|
||||
.termin-link {
|
||||
.kapitel-link {
|
||||
display: block;
|
||||
padding: 1.25rem 1.5rem;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
grid-column: 1;
|
||||
}
|
||||
.termin-label {
|
||||
.kapitel-label {
|
||||
font-size: 0.7rem;
|
||||
font-weight: 600;
|
||||
color: $ACCENT_COLOR;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.05em;
|
||||
}
|
||||
.termin-title {
|
||||
.kapitel-title {
|
||||
font-size: 1.05rem;
|
||||
font-weight: 500;
|
||||
color: #1d1d1f;
|
||||
margin: 0.15rem 0;
|
||||
}
|
||||
.termin-date {
|
||||
.kapitel-date {
|
||||
font-size: 0.8rem;
|
||||
color: #86868b;
|
||||
}
|
||||
@@ -151,7 +151,7 @@ cat > "$BUILD_DIR/index.html" << HEADER
|
||||
}
|
||||
.btn-pdf:hover { background: #e8e8ed; }
|
||||
/* Make entire card clickable via overlay */
|
||||
.termin-link::after {
|
||||
.kapitel-link::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
@@ -184,10 +184,10 @@ cat > "$BUILD_DIR/index.html" << HEADER
|
||||
color: #86868b;
|
||||
}
|
||||
@media (max-width: 600px) {
|
||||
.termin-card {
|
||||
.kapitel-card {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
.termin-link {
|
||||
.kapitel-link {
|
||||
padding-bottom: 0.75rem;
|
||||
}
|
||||
.btn-slides, .btn-pdf {
|
||||
@@ -205,14 +205,13 @@ cat > "$BUILD_DIR/index.html" << HEADER
|
||||
<div class="termine">
|
||||
HEADER
|
||||
|
||||
# Generate links for each termin (sorted)
|
||||
for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
|
||||
# Generate links for each kapitel (sorted)
|
||||
for html in $(ls "$BUILD_DIR"/[0-9][0-9]-*.html 2>/dev/null | sort); do
|
||||
filename=$(basename "$html")
|
||||
|
||||
# Extract components from filename
|
||||
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-9x]{2}-[0-9x]{2}-termin-[0-9]+-//' | sed 's/\.html$//')
|
||||
# Extract components from filename (format: NN-topic.html)
|
||||
kapitel_num=$(echo "$filename" | grep -oE '^[0-9]+' | sed 's/^0*//')
|
||||
topic_raw=$(echo "$filename" | sed -E 's/^[0-9]+-//' | sed 's/\.html$//')
|
||||
|
||||
# Look up nice topic name or fallback
|
||||
topic="${TOPIC_MAP[$topic_raw]}"
|
||||
@@ -220,18 +219,11 @@ for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
|
||||
topic=$(echo "$topic_raw" | sed 's/-/ /g' | sed 's/.*/\u&/')
|
||||
fi
|
||||
|
||||
# Format 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")
|
||||
# Handle kapitel number
|
||||
if [[ "$kapitel_num" == "0" ]] || [[ -z "$kapitel_num" ]]; then
|
||||
kapitel_label="Einführung"
|
||||
else
|
||||
formatted_date="Termin folgt"
|
||||
fi
|
||||
|
||||
# Handle termin number
|
||||
if [[ "$termin_num" == "0" ]]; then
|
||||
termin_label="Einführung"
|
||||
else
|
||||
termin_label="Termin $termin_num"
|
||||
kapitel_label="Kapitel $kapitel_num"
|
||||
fi
|
||||
|
||||
pdf_filename="${filename%.html}.pdf"
|
||||
@@ -243,11 +235,10 @@ for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
|
||||
fi
|
||||
|
||||
cat >> "$BUILD_DIR/index.html" << LINK
|
||||
<div class="termin-card">
|
||||
<a href="$filename" class="termin-link">
|
||||
<div class="termin-label">$termin_label</div>
|
||||
<div class="termin-title">$topic</div>
|
||||
<div class="termin-date">$formatted_date</div>
|
||||
<div class="kapitel-card">
|
||||
<a href="$filename" class="kapitel-link">
|
||||
<div class="kapitel-label">$kapitel_label</div>
|
||||
<div class="kapitel-title">$topic</div>
|
||||
</a>
|
||||
<a href="$filename" class="btn btn-slides">Folien</a>
|
||||
$pdf_link
|
||||
@@ -255,6 +246,24 @@ for html in $(ls "$BUILD_DIR"/2*.html 2>/dev/null | sort); do
|
||||
LINK
|
||||
done
|
||||
|
||||
# Add klausur entry if it exists
|
||||
if [[ -f "$BUILD_DIR/klausur.html" ]]; then
|
||||
pdf_link=""
|
||||
if [[ -f "$BUILD_DIR/klausur.pdf" ]]; then
|
||||
pdf_link="<a href=\"klausur.pdf\" class=\"btn btn-pdf\">PDF</a>"
|
||||
fi
|
||||
cat >> "$BUILD_DIR/index.html" << KLAUSUR
|
||||
<div class="kapitel-card" style="border-left: 3px solid $ACCENT_COLOR;">
|
||||
<a href="klausur.html" class="kapitel-link">
|
||||
<div class="kapitel-label">Prüfung</div>
|
||||
<div class="kapitel-title">Klausurrelevante Folien</div>
|
||||
</a>
|
||||
<a href="klausur.html" class="btn btn-slides">Folien</a>
|
||||
$pdf_link
|
||||
</div>
|
||||
KLAUSUR
|
||||
fi
|
||||
|
||||
cat >> "$BUILD_DIR/index.html" << FOOTER
|
||||
</div>
|
||||
<div class="qr-section">
|
||||
|
||||
@@ -55,7 +55,12 @@ section.klausur {
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
@@ -104,7 +109,7 @@ Hochschule der Medien Stuttgart
|
||||
- Hintergrund:
|
||||
- Philosophie (Uni Stuttgart) -> NO degree
|
||||
- Wirtschafts-Informatik (Leibniz-FH) -> B.Sc.
|
||||
- Kontakt: mail@librete.ch
|
||||
- Kontakt: lb-czechowski@hdm-stuttgart.de
|
||||
|
||||
<!--
|
||||
Kurze Vorstellung
|
||||
@@ -0,0 +1,781 @@
|
||||
---
|
||||
marp: true
|
||||
theme: gaia
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
header: "Dateiformate, Schnittstellen, Speichermedien & Distributionswege (223015b)"
|
||||
footer: "Michael Czechowski – HdM Stuttgart – WS 2025/26"
|
||||
title: Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
---
|
||||
|
||||
<style>
|
||||
:root {
|
||||
--color-foreground: #1a1a2e;
|
||||
--color-highlight: #1e5f8a;
|
||||
--color-dimmed: #4a4a6a;
|
||||
}
|
||||
section.invert {
|
||||
--color-foreground: #fff;
|
||||
}
|
||||
section {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
h1 {
|
||||
color: #1e5f8a;
|
||||
}
|
||||
section.invert h1 {
|
||||
color: #fff;
|
||||
}
|
||||
h2 {
|
||||
color: #1f2937;
|
||||
}
|
||||
pre {
|
||||
background: #0f0f23;
|
||||
color: #5fb3e4;
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid #1e5f8a;
|
||||
}
|
||||
pre code {
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
}
|
||||
code {
|
||||
background: #1a1a2e;
|
||||
color: #5fb3e4;
|
||||
padding: 0.15em 0.4em;
|
||||
border-radius: 4px;
|
||||
}
|
||||
a {
|
||||
color: var(--color-highlight);
|
||||
}
|
||||
section.klausur {
|
||||
background: repeating-linear-gradient(
|
||||
135deg,
|
||||
#e3f2fd,
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
section.aufgabe footer {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- _class: invert -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _backgroundColor: #000 -->
|
||||
|
||||

|
||||
|
||||
# Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
|
||||
**223015b** · Modul "Technik 1" · 1. Semester
|
||||
Digital- und Medienwirtschaft
|
||||
Hochschule der Medien Stuttgart
|
||||
|
||||
**Wintersemester 2025/26**
|
||||
|
||||
[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Kapitel 3 – 23.01.2026
|
||||
## Speichermedien & Schnittstellen
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
HDD aufgeschraubt neben SSD-Platine
|
||||
Mechanisch vs. Elektronisch
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Speicherkapazität: KB vs. KiB
|
||||
|
||||
**Das Problem:** Hersteller vs. Betriebssysteme
|
||||
|
||||
| Dezimal (SI) | Binär (IEC) |
|
||||
|--------------|-------------|
|
||||
| 1 KB = 1.000 Bytes | 1 KiB = 1.024 Bytes |
|
||||
| 1 MB = 1.000 KB | 1 MiB = 1.024 KiB |
|
||||
| 1 GB = 1.000 MB | 1 GiB = 1.024 MiB |
|
||||
| 1 TB = 1.000 GB | 1 TiB = 1.024 GiB |
|
||||
|
||||
**1 TB Festplatte → Windows zeigt ~931 GB!**
|
||||
|
||||
<!--
|
||||
Hersteller: Dezimal (SI-Präfix) - klingt mehr!
|
||||
Betriebssysteme: Binär - aber zeigen "GB" statt "GiB"
|
||||
Diskrepanz bei 1 TB: 1.000.000.000.000 vs. 1.099.511.627.776 Bytes
|
||||
→ 10% Unterschied bei TB-Größen
|
||||
Verwirrung für Konsumenten seit Jahrzehnten
|
||||
ISO/IEC 80000-13: Definiert KiB, MiB, GiB, TiB (2008)
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# HDD: Aufbau & Struktur
|
||||
|
||||
**Komponenten:**
|
||||
- **Platter:** Magnetisch beschichtete Scheiben
|
||||
- **Spindel:** Dreht mit 5.400-7.200 RPM
|
||||
- **Schreib-Lese-Kopf:** Schwebt nm-dünn über Platter
|
||||
- **Aktuator:** Bewegt Kopf zur richtigen Spur
|
||||
|
||||
**Logische Struktur:**
|
||||
- **Spuren:** Konzentrische Kreise auf Platter
|
||||
- **Sektoren:** Unterteilung der Spuren (512 Bytes)
|
||||
- **Zylinder:** Gleiche Spuren aller Platter
|
||||
|
||||
<!--
|
||||
Aufbau seit 1956 (IBM) grundsätzlich gleich
|
||||
Platter: Aluminium oder Glas mit Magnetschicht
|
||||
Spindelgeschwindigkeit: Desktop 7.200, Laptop 5.400, Server 15.000 RPM
|
||||
Head Crash: Schreib-Lese-Kopf berührt Platter → Kratzer → Datenverlust
|
||||
Sektor: Kleinste adressierbare Einheit
|
||||
LBA (Logical Block Addressing): Abstraktion der physischen Struktur
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# NVMe: Die SSD-Revolution
|
||||
|
||||
**NVMe = Non-Volatile Memory Express (2011)**
|
||||
|
||||
**Unterschied zu SATA-SSD:**
|
||||
- SATA: Max. ~550 MB/s (AHCI-Protokoll)
|
||||
- NVMe: Bis zu 7.000+ MB/s (PCIe direkt)
|
||||
|
||||
**Form-Faktoren:**
|
||||
2,5" (SATA), M.2 (SATA oder NVMe), PCIe-Karte
|
||||
|
||||
<!--
|
||||
NVMe = Non-Volatile Memory Express
|
||||
Protokoll speziell für Flash-Speicher entwickelt.
|
||||
|
||||
SATA wurde für HDDs entwickelt.
|
||||
Für SSDs ein Flaschenhals.
|
||||
|
||||
M.2 ist ein Formfaktor, kein Protokoll!
|
||||
M.2 kann SATA oder NVMe sein – prüfen!
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# HDD vs. SSD: Vergleich
|
||||
|
||||
| Aspekt | HDD | SSD (NVMe) |
|
||||
|--------|----:|----------:|
|
||||
| Sequentiell | ~150 MB/s | ~3.500 MB/s |
|
||||
| Random Read | ~1 MB/s | ~500 MB/s |
|
||||
| Latenz | ~10 ms | ~0,02 ms |
|
||||
| Preis/TB | ~15€ | ~60€ |
|
||||
| Max. Kapazität | 24 TB | 8 TB (Consumer) |
|
||||
| Haltbarkeit | 3-5 Jahre | 5-10 Jahre |
|
||||
|
||||
<!--
|
||||
Der Random-Access-Unterschied ist dramatisch.
|
||||
500× schneller bei zufälligen Zugriffen.
|
||||
|
||||
Das ist der Grund, warum SSDs Betriebssysteme
|
||||
so viel schneller starten lassen.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# Wann HDD, wann SSD?
|
||||
|
||||
| Anwendung | Empfehlung |
|
||||
|-----------|------------|
|
||||
| Betriebssystem | SSD (NVMe) |
|
||||
| Anwendungen, Spiele | SSD |
|
||||
| Video-Editing (Projekte) | SSD |
|
||||
| Foto-Archiv | HDD oder SSD |
|
||||
| Backup | HDD |
|
||||
| NAS / Server | HDD (oder Mix) |
|
||||
| Cold Storage | HDD oder Band |
|
||||
|
||||
<!--
|
||||
Die Faustregel:
|
||||
- Oft genutzt, schnell gebraucht → SSD
|
||||
- Selten genutzt, viel Kapazität → HDD
|
||||
|
||||
Viele setzen auf beides:
|
||||
Kleine SSD für System + große HDD für Archiv.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Dateisysteme
|
||||
## Die Organisation der Daten
|
||||
|
||||
---
|
||||
|
||||
# Was macht ein Dateisystem?
|
||||
|
||||
**Aufgaben:**
|
||||
- Dateien in Blöcke aufteilen
|
||||
- Speicherort verwalten (Allokation)
|
||||
- Verzeichnisstruktur pflegen
|
||||
- Metadaten speichern (Name, Datum, Rechte)
|
||||
- Integrität sichern (Journaling)
|
||||
|
||||
**Ohne Dateisystem:**
|
||||
Nur eine Folge von Bytes ohne Struktur.
|
||||
|
||||
<!--
|
||||
Das Dateisystem ist die Abstraktionsschicht
|
||||
zwischen Anwendungen und rohem Speicher.
|
||||
|
||||
Es entscheidet:
|
||||
- Wie Dateien gefunden werden
|
||||
- Wie freier Speicher verwaltet wird
|
||||
- Was bei Abstürzen passiert
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# FAT32: Der Kompatibilitätskönig
|
||||
|
||||
**File Allocation Table, 32-bit (1996)**
|
||||
|
||||
**Vorteile:**
|
||||
- Überall lesbar (Windows, Mac, Linux, Kameras, Fernseher...)
|
||||
- Einfach, robust
|
||||
|
||||
**Nachteile:**
|
||||
- Max. 4 GB pro Datei
|
||||
- Max. 2 TB pro Volume
|
||||
- Keine Berechtigungen
|
||||
- Kein Journaling
|
||||
|
||||
**Ideal für:** USB-Sticks, SD-Karten (Kompatibilität)
|
||||
|
||||
<!--
|
||||
4 GB Limit ist das Hauptproblem.
|
||||
Ein 4K-Video oder ISO-Image passt oft nicht drauf.
|
||||
|
||||
Trotzdem: FAT32 ist der kleinste gemeinsame Nenner.
|
||||
Wenn Kompatibilität wichtiger ist als Features → FAT32.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# exFAT: FAT32 ohne Limits
|
||||
|
||||
**Extended FAT (2006, Microsoft)**
|
||||
|
||||
**Vorteile:**
|
||||
- Keine praktischen Dateigrößen-Limits
|
||||
- Breite Unterstützung (seit 2019 auch Linux-Kernel)
|
||||
- Für Flash-Speicher optimiert
|
||||
|
||||
**Nachteile:**
|
||||
- Kein Journaling
|
||||
- Weniger robust als NTFS/APFS/ext4
|
||||
|
||||
**Ideal für:** Große Dateien auf portablen Medien
|
||||
|
||||
<!--
|
||||
exFAT ist der Nachfolger von FAT32 für portable Medien.
|
||||
SD-Karten über 32 GB sind standardmäßig exFAT.
|
||||
|
||||
Microsoft hat 2019 die Patente freigegeben.
|
||||
Seitdem native Linux-Unterstützung.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# NTFS: Windows-Standard
|
||||
|
||||
**New Technology File System (1993)**
|
||||
|
||||
**Features:**
|
||||
- Journaling (Crash-Sicherheit)
|
||||
- Dateirechte (ACLs)
|
||||
- Kompression, Verschlüsselung
|
||||
- Große Dateien und Volumes
|
||||
|
||||
**Nachteile:**
|
||||
- Nur Windows schreibt nativ
|
||||
- macOS: Nur lesen
|
||||
- Linux: Über ntfs-3g (langsamer)
|
||||
|
||||
<!--
|
||||
NTFS ist seit Windows NT der Standard.
|
||||
Alle modernen Windows-Versionen nutzen es.
|
||||
|
||||
Für Windows-only-Systeme die beste Wahl.
|
||||
Für portable Medien: Kompatibilitätsprobleme.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# APFS: Apple-Modern
|
||||
|
||||
**Apple File System (2017)**
|
||||
|
||||
**Features:**
|
||||
- Snapshots (Zeitpunkt-Kopien)
|
||||
- Copy-on-Write (CoW)
|
||||
- Native Verschlüsselung
|
||||
- Optimiert für SSDs
|
||||
|
||||
**Nachteile:**
|
||||
- Nur Apple-Geräte
|
||||
- Nicht abwärtskompatibel mit HFS+
|
||||
|
||||
<!--
|
||||
APFS ersetzte HFS+ auf allen Apple-Geräten.
|
||||
Snapshots ermöglichen Time Machine und APFS-Klone.
|
||||
|
||||
Copy-on-Write: Daten werden nicht überschrieben,
|
||||
sondern neue Versionen werden geschrieben.
|
||||
Gut für Integrität und Snapshots.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# ext4: Linux-Standard
|
||||
|
||||
**Fourth Extended File System (2008)**
|
||||
|
||||
**Features:**
|
||||
- Journaling
|
||||
- Extents (effiziente große Dateien)
|
||||
- Online-Defragmentierung
|
||||
- Bewährt und stabil
|
||||
|
||||
**Nachteile:**
|
||||
- Windows/macOS können nicht nativ lesen
|
||||
- Weniger Features als btrfs/ZFS
|
||||
|
||||
<!--
|
||||
ext4 ist der Standard für Linux-Systeme.
|
||||
Evolution: ext (1992) → ext2 → ext3 → ext4
|
||||
|
||||
Alternativen: btrfs (Snapshots, CoW), XFS, ZFS
|
||||
Für Server oft XFS oder ZFS.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Dateisysteme: Übersicht
|
||||
|
||||
| FS | Max. Datei | Journaling | Ideal für |
|
||||
|----|----------:|:----------:|-----------|
|
||||
| FAT32 | 4 GB | ❌ | Kompatibilität |
|
||||
| exFAT | 16 EB | ❌ | Große portable Dateien |
|
||||
| NTFS | 16 EB | ✓ | Windows |
|
||||
| APFS | 8 EB | ✓ | macOS, iOS |
|
||||
| ext4 | 16 TB | ✓ | Linux |
|
||||
|
||||
<!--
|
||||
Die Wahl hängt vom Kontext ab.
|
||||
|
||||
Portable Medien: FAT32 oder exFAT
|
||||
Interne Laufwerke: NTFS, APFS, ext4 je nach OS
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Backup & Archivierung
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
|
||||

|
||||
|
||||
<!--
|
||||
Symbolbild: Kaputte Festplatte oder Ransomware
|
||||
Das Worst-Case-Szenario
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Warum Backup?
|
||||
|
||||
**Realitäten:**
|
||||
- HDDs haben 1-2% jährliche Ausfallrate
|
||||
- SSDs können ohne Vorwarnung sterben
|
||||
- Ransomware verschlüsselt Daten
|
||||
- Versehentliches Löschen passiert
|
||||
- Diebstahl, Brand, Wasserschaden
|
||||
|
||||
**Die Frage ist nicht ob, sondern wann.**
|
||||
|
||||
<!--
|
||||
Backblaze veröffentlicht jährliche HDD-Statistiken.
|
||||
1-2% Ausfallrate klingt wenig, aber bei 100 Platten...
|
||||
|
||||
Pixar verlor fast "Toy Story 2" (1998).
|
||||
Rettung: Eine Mitarbeiterin hatte ein Home-Backup.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: klausur -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _footer: '' -->
|
||||
<!-- _backgroundColor: #e3f2fd -->
|
||||
|
||||
# Die 3-2-1-Regel
|
||||
|
||||
**3** Kopien eurer Daten
|
||||
(Original + 2 Backups)
|
||||
|
||||
**2** verschiedene Medientypen
|
||||
(z.B. SSD + HDD, oder lokal + Cloud)
|
||||
|
||||
**1** Kopie an anderem Ort
|
||||
(Offsite: Cloud, anderes Gebäude)
|
||||
|
||||
<!--
|
||||
Herkunft: Peter Krogh, "The DAM Book" (2005)
|
||||
|
||||
Warum 3 Kopien?
|
||||
- Original kann kaputt gehen
|
||||
- Backup 1 auch
|
||||
- Backup 2 = Sicherheitspuffer
|
||||
|
||||
Warum 2 Medientypen?
|
||||
- Gleiche Medien haben gleiche Schwachstellen
|
||||
- Batch-Fehler bei HDDs derselben Charge
|
||||
|
||||
Warum 1 Offsite?
|
||||
- Brand/Wasserschaden zerstört alles vor Ort
|
||||
- Ransomware verschlüsselt angeschlossene Laufwerke
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Backup-Arten
|
||||
|
||||
**Vollständig (Full):**
|
||||
Kompletter Datenbestand jedes Mal.
|
||||
Einfach, aber langsam und platzhungrig.
|
||||
|
||||
**Inkrementell:**
|
||||
Nur Änderungen seit dem letzten Backup.
|
||||
Schnell, aber Wiederherstellung komplex (Kette).
|
||||
|
||||
**Differenziell:**
|
||||
Änderungen seit dem letzten Voll-Backup.
|
||||
Mittelweg zwischen beiden.
|
||||
|
||||
<!--
|
||||
Typisches Schema:
|
||||
- Sonntag: Voll-Backup
|
||||
- Mo-Sa: Inkrementell oder Differenziell
|
||||
|
||||
Inkrementell: Schnellstes Backup, langsamste Wiederherstellung
|
||||
Differenziell: Kompromiss
|
||||
Voll: Langsamstes Backup, schnellste Wiederherstellung
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Backup in der Praxis
|
||||
|
||||
**macOS:** Time Machine
|
||||
**Windows:** Veeam Agent (kostenlos), Windows Backup
|
||||
**Linux:** rsync, Borg, Restic
|
||||
**Cloud:** Backblaze, iCloud, Google Drive
|
||||
|
||||
**Wichtig:**
|
||||
- Automatisieren (manuell wird vergessen)
|
||||
- Regelmäßig testen (Backup nützt nichts, wenn Restore nicht funktioniert)
|
||||
|
||||
<!--
|
||||
Time Machine: Stündliche Snapshots, APFS-Integration
|
||||
Veeam: Enterprise-Level, kostenlose Endnutzer-Version
|
||||
rsync: Unix-Klassiker, extrem effizient
|
||||
Borg: Deduplizierung + Verschlüsselung
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Langzeitarchivierung
|
||||
|
||||
**Probleme:**
|
||||
- Bit Rot (Daten degradieren)
|
||||
- Format-Obsoleszenz (wer öffnet .wpd?)
|
||||
- Hardware-Obsoleszenz (Diskettenlaufwerk?)
|
||||
|
||||
**Lösungen:**
|
||||
- Migration alle 5-10 Jahre auf neue Medien
|
||||
- Offene Standards (PDF/A, TIFF, Plain Text)
|
||||
- Redundante Kopien
|
||||
|
||||
<!--
|
||||
WordPerfect dominierte die 1980er/90er.
|
||||
Heute kann kaum jemand .wpd-Dateien öffnen.
|
||||
|
||||
Flash-Dateien (.swf) sind seit 2020 praktisch tot.
|
||||
Millionen von Websites und Spielen verloren.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Archivmedien
|
||||
|
||||
**LTO-Tapes:**
|
||||
- 18 TB pro Band (LTO-9)
|
||||
- ~5€/TB
|
||||
- 30 Jahre Haltbarkeit
|
||||
- Für Cold Storage ideal
|
||||
|
||||
**M-DISC:**
|
||||
- Spezielle DVD/Blu-ray
|
||||
- 1.000+ Jahre Haltbarkeit (Herstellerangabe)
|
||||
- Für kleine, wichtige Daten
|
||||
|
||||
**Cloud:**
|
||||
- Glacier, Backblaze B2
|
||||
- Günstig für Langzeit
|
||||
|
||||
<!--
|
||||
LTO = Linear Tape-Open
|
||||
AWS, Google, Netflix nutzen Tape für Archive.
|
||||
|
||||
M-DISC nutzt anorganische Schicht statt Dye.
|
||||
Theoretisch sehr langlebig, praktisch ungetestet.
|
||||
|
||||
Cloud-Archive haben laufende Kosten.
|
||||
Aber: Keine Hardware-Wartung.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Schnittstellen
|
||||
|
||||
---
|
||||
|
||||
# USB: Die Universal-Schnittstelle
|
||||
|
||||
| Version | Jahr | Geschwindigkeit |
|
||||
|---------|------|----------------:|
|
||||
| USB 1.1 | 1998 | 12 Mbit/s |
|
||||
| USB 2.0 | 2000 | 480 Mbit/s (~60 MB/s) |
|
||||
| USB 3.0 | 2008 | 5 Gbit/s (~625 MB/s) |
|
||||
| USB 3.1 Gen 2 | 2013 | 10 Gbit/s |
|
||||
| USB 3.2 Gen 2×2 | 2017 | 20 Gbit/s |
|
||||
| USB4 | 2019 | 40 Gbit/s |
|
||||
|
||||
<!--
|
||||
USB = Universal Serial Bus
|
||||
|
||||
Die Namensgebung ist ein Chaos.
|
||||
USB 3.0 wurde nachträglich zu "USB 3.1 Gen 1" umbenannt.
|
||||
Dann zu "USB 3.2 Gen 1".
|
||||
|
||||
Die Industrie verwirrt absichtlich.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# USB-C: Der Stecker, nicht die Geschwindigkeit
|
||||
|
||||
**USB-C ist ein Steckertyp, kein Protokoll!**
|
||||
|
||||
Ein USB-C-Kabel kann sein:
|
||||
- USB 2.0 (480 Mbit/s)
|
||||
- USB 3.2 (bis 20 Gbit/s)
|
||||
- USB4 (40 Gbit/s)
|
||||
- Thunderbolt 3/4 (40 Gbit/s)
|
||||
|
||||
**Am Stecker nicht erkennbar.**
|
||||
→ Kabel-Spezifikation prüfen!
|
||||
|
||||
<!--
|
||||
Das ist eine häufige Quelle für Frustration.
|
||||
|
||||
"Ich habe ein USB-C-Kabel, warum ist es so langsam?"
|
||||
Weil es ein USB 2.0-Kabel mit USB-C-Stecker ist.
|
||||
|
||||
Gute Kabel sind teurer, aber es lohnt sich.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Thunderbolt
|
||||
|
||||
**Thunderbolt 3/4 (2015/2020):**
|
||||
- 40 Gbit/s
|
||||
- PCIe über Kabel (externe GPUs möglich)
|
||||
- DisplayPort integriert
|
||||
- USB-C-Stecker
|
||||
|
||||
**Vorteile:**
|
||||
- Sehr schnell
|
||||
- Vielseitig (Daten, Video, Strom)
|
||||
|
||||
**Nachteile:**
|
||||
- Teure Kabel
|
||||
- Nicht alle USB-C-Ports sind Thunderbolt
|
||||
|
||||
<!--
|
||||
Intel und Apple entwickelten Thunderbolt gemeinsam.
|
||||
Lizenzfrei seit 2019.
|
||||
|
||||
Thunderbolt-Kabel haben oft ein Blitz-Symbol.
|
||||
Aber nicht immer.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Video-Schnittstellen
|
||||
|
||||
| Schnittstelle | Max. Auflösung | Features |
|
||||
|---------------|---------------:|----------|
|
||||
| HDMI 2.0 | 4K/60Hz | ARC, CEC |
|
||||
| HDMI 2.1 | 8K/60Hz, 4K/120Hz | VRR, eARC |
|
||||
| DisplayPort 1.4 | 8K/60Hz | Daisy-Chain |
|
||||
| DisplayPort 2.0 | 16K/60Hz | Mehr Bandbreite |
|
||||
|
||||
**HDMI:** Consumer-Geräte (TV, Konsolen)
|
||||
**DisplayPort:** Computer, Monitore
|
||||
|
||||
<!--
|
||||
HDMI hat Lizenzgebühren, DisplayPort nicht.
|
||||
Deshalb ist DP bei Monitoren beliebter.
|
||||
|
||||
DisplayPort kann Daisy-Chaining:
|
||||
Laptop → Monitor 1 → Monitor 2 über ein Kabel.
|
||||
|
||||
HDMI hat ARC (Audio Return Channel):
|
||||
TV schickt Audio an Soundbar über HDMI.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Netzwerk
|
||||
|
||||
**Ethernet:**
|
||||
| Standard | Geschwindigkeit |
|
||||
|----------|----------------:|
|
||||
| Fast Ethernet | 100 Mbit/s |
|
||||
| Gigabit | 1 Gbit/s |
|
||||
| 2.5 Gigabit | 2,5 Gbit/s |
|
||||
| 10 Gigabit | 10 Gbit/s |
|
||||
|
||||
**WiFi:**
|
||||
| Generation | Standard | Geschwindigkeit |
|
||||
|------------|----------|----------------:|
|
||||
| WiFi 5 | 802.11ac | ~1,3 Gbit/s |
|
||||
| WiFi 6 | 802.11ax | ~9,6 Gbit/s |
|
||||
| WiFi 7 | 802.11be | ~46 Gbit/s |
|
||||
|
||||
<!--
|
||||
Gigabit-Ethernet ist heute Standard.
|
||||
2,5G und 10G verbreiten sich für NAS und Poweruser.
|
||||
|
||||
WiFi-Geschwindigkeiten sind theoretische Maxima.
|
||||
Real: Bruchteil davon, abhängig von Entfernung und Störungen.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
# Welche Schnittstelle für was?
|
||||
|
||||
| Anwendung | Empfehlung |
|
||||
|-----------|------------|
|
||||
| Externe SSD | USB 3.2 Gen 2 oder Thunderbolt |
|
||||
| USB-Stick | USB 3.0 reicht |
|
||||
| Monitor | DisplayPort oder HDMI 2.0+ |
|
||||
| NAS im Heimnetz | Gigabit Ethernet |
|
||||
| Backup-Platte | USB 3.0 |
|
||||
| Video-Editing extern | Thunderbolt |
|
||||
|
||||
<!--
|
||||
Die Schnittstelle muss zum Gerät passen.
|
||||
|
||||
Externe HDD über Thunderbolt?
|
||||
Bringt nichts, die HDD ist der Flaschenhals.
|
||||
|
||||
NVMe-SSD über USB 2.0?
|
||||
Verschwendung, USB ist der Flaschenhals.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: aufgabe -->
|
||||
|
||||
# Hands-On: Eigene Speicher analysieren
|
||||
|
||||
**Aufgabe (30 Min):**
|
||||
|
||||
1. Welche Laufwerke habt ihr? (SSD, HDD, extern)
|
||||
2. Welches Dateisystem nutzt ihr?
|
||||
3. Wie ist eure Backup-Situation?
|
||||
4. Welche Schnittstellen nutzt ihr?
|
||||
|
||||
**Tools:**
|
||||
- Windows: Datenträgerverwaltung
|
||||
- macOS: Festplattendienstprogramm
|
||||
- Linux: `lsblk`, `df -h`
|
||||
|
||||
<!--
|
||||
Ziel: Bewusstsein für eigene Infrastruktur.
|
||||
|
||||
Die meisten wissen nicht, welches Dateisystem
|
||||
auf ihrem USB-Stick ist.
|
||||
-->
|
||||
|
||||
---
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Fragen & Diskussion
|
||||
|
||||
**Kontakt:** lb-czechowski@hdm-stuttgart.de
|
||||
**Folien:** [librete.ch/hdm/223015b](https://librete.ch/hdm/223015b/)
|
||||
|
||||
---
|
||||
|
||||
# Lizenz & Attribution
|
||||
|
||||
Diese Präsentation ist lizenziert unter **Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)**
|
||||
|
||||
- Erlaubt Teilen & Anpassen mit Namensnennung
|
||||
- Adaptionen müssen unter gleicher Lizenz geteilt werden
|
||||
|
||||
Vollständige Lizenz: [creativecommons.org/licenses/by-sa/4.0/](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
|
||||
@@ -55,7 +55,12 @@ section.klausur {
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
@@ -93,7 +98,7 @@ Hochschule der Medien Stuttgart
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Termin 4 – 30.01.2026
|
||||
# Kapitel 4 – 30.01.2026
|
||||
## Distribution, APIs & Zukunft
|
||||
|
||||
---
|
||||
@@ -1261,7 +1266,7 @@ Dangerzone: FOSS-Tool (Freedom of Press Foundation)
|
||||
**Offene Formate:**
|
||||
✓ Spezifikation öffentlich
|
||||
✓ Keine Lizenzgebühren
|
||||
✓ Viele Programme unterstützen
|
||||
✓ Viele Programme unterstützen1
|
||||
**Beispiele:** PNG, OGG, MKV, Markdown, SVG
|
||||
|
||||
**Proprietäre Formate:**
|
||||
@@ -1276,7 +1281,7 @@ Lock-in: "Gefangene Daten" (nur in Software X öffenbar)
|
||||
Firma geht pleite → Format stirbt (WordPerfect-Beispiel)
|
||||
Offene Standards: Überlebensfähiger (Community kann implementieren)
|
||||
-->
|
||||
|
||||
111
|
||||
---
|
||||
|
||||
# Vendor Lock-in: Beispiele
|
||||
@@ -1848,7 +1853,7 @@ Evaluation: Feedback ernst nehmen, Kurs verbessern
|
||||
|
||||
# Fragen & Diskussion
|
||||
|
||||
**Kontakt:** mail@librete.ch
|
||||
**Kontakt:** lb-czechowski@hdm-stuttgart.de
|
||||
**Folien:** Online verfügbar unter https://librete.ch/hdm/223015b
|
||||
|
||||
---
|
||||
@@ -55,7 +55,12 @@ section.klausur {
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
@@ -93,7 +98,7 @@ Hochschule der Medien Stuttgart
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Termin 5 – TBA
|
||||
# Kapitel 5 – TBA
|
||||
## Vertiefung & Offene Fragen
|
||||
|
||||
---
|
||||
@@ -119,7 +124,7 @@ Themen nach Interesse der Studierenden
|
||||
|
||||
# Fragen & Diskussion
|
||||
|
||||
**Kontakt:** mail@librete.ch
|
||||
**Kontakt:** lb-czechowski@hdm-stuttgart.de
|
||||
**Folien:** Online verfügbar unter https://librete.ch/hdm/223015b
|
||||
|
||||
---
|
||||
|
After Width: | Height: | Size: 220 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 425 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 241 KiB |
|
After Width: | Height: | Size: 484 KiB |
|
After Width: | Height: | Size: 249 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 112 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,563 @@
|
||||
---
|
||||
marp: true
|
||||
theme: gaia
|
||||
paginate: true
|
||||
backgroundColor: #fff
|
||||
header: "Dateiformate, Schnittstellen, Speichermedien & Distributionswege (223015b)"
|
||||
footer: "Michael Czechowski – HdM Stuttgart"
|
||||
title: Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
---
|
||||
<style>
|
||||
:root {
|
||||
--color-foreground: #1a1a2e;
|
||||
--color-highlight: #1e5f8a;
|
||||
--color-dimmed: #4a4a6a;
|
||||
}
|
||||
section.invert {
|
||||
--color-foreground: #fff;
|
||||
}
|
||||
section {
|
||||
font-size: 1.7rem;
|
||||
}
|
||||
h1 {
|
||||
color: #1e5f8a;
|
||||
}
|
||||
section.invert h1 {
|
||||
color: #fff;
|
||||
}
|
||||
h2 {
|
||||
color: #1f2937;
|
||||
}
|
||||
pre {
|
||||
background: #0f0f23;
|
||||
color: #5fb3e4;
|
||||
border-radius: 8px;
|
||||
border-left: 3px solid #1e5f8a;
|
||||
}
|
||||
pre code {
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
}
|
||||
code {
|
||||
background: #1a1a2e;
|
||||
color: #5fb3e4;
|
||||
padding: 0.15em 0.4em;
|
||||
border-radius: 4px;
|
||||
}
|
||||
a {
|
||||
color: var(--color-highlight);
|
||||
}
|
||||
section.klausur {
|
||||
background: repeating-linear-gradient(
|
||||
135deg,
|
||||
#e3f2fd,
|
||||
#e3f2fd 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #e3f2fd !important;
|
||||
}
|
||||
section.aufgabe footer {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!--
|
||||
╔═══════════════════════════════════════════════════════════════════╗
|
||||
║ AUTO-GENERATED FILE - DO NOT EDIT MANUALLY ║
|
||||
║ ║
|
||||
║ This file is generated by: make klausur ║
|
||||
║ Source: scripts/extract-klausur.sh ║
|
||||
║ ║
|
||||
║ To update, edit the source slides and re-run make klausur ║
|
||||
╚═══════════════════════════════════════════════════════════════════╝
|
||||
-->
|
||||
|
||||
<!-- _class: invert -->
|
||||
<!-- _header: '' -->
|
||||
<!-- _backgroundColor: #000 -->
|
||||
|
||||

|
||||
|
||||
# Dateiformate, Schnittstellen, Speichermedien & Distributionswege
|
||||
|
||||
**223015b** · Modul "Technik 1" · 1. Semester
|
||||
Digital- und Medienwirtschaft
|
||||
Hochschule der Medien Stuttgart
|
||||
|
||||
[https://librete.ch/hdm/223015b/](https://librete.ch/hdm/223015b/)
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Verlustfrei vs. Verlustbehaftet
|
||||
|
||||
| | Verlustfrei (Lossless) | Verlustbehaftet (Lossy) |
|
||||
|---|---|---|
|
||||
| **Prinzip** | **Redundanz** entfernen | **Irrelevanz** entfernen |
|
||||
| **Reversibel** | Ja (Original wiederherstellbar) | Nein (Information unwiederbringlich weg) |
|
||||
| **Reduktion** | 30-50% | 80-99% |
|
||||
| **Formate** | ZIP, PNG, FLAC, GIF | JPEG, MP3, H.264/H.265 |
|
||||
|
||||
**Faustregel:**
|
||||
- Medien für Endnutzer → Lossy oft akzeptabel
|
||||
- Quellmaterial, Code, Archive → Lossless nötig
|
||||
|
||||
<!--
|
||||
REDUNDANZ: Wiederholende Muster kompakter darstellen (z.B. "AAAA" → "4×A")
|
||||
IRRELEVANZ: Für Menschen nicht wahrnehmbar (Psychoakustik, Psychovisuell)
|
||||
|
||||
KLAUSURRELEVANT:
|
||||
- Verlustfrei = Original 1:1 wiederherstellbar
|
||||
- Verlustbehaftet = Information geht verloren, aber kaum wahrnehmbar
|
||||
- Redundanz vs. Irrelevanz ist der Kernunterschied!
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Dateneinheiten
|
||||
|
||||
| Einheit | Bytes | Potenz | Beispiel |
|
||||
|---------|------:|:------:|----------|
|
||||
| **Byte** | 1 | 10⁰ | Farbwerte eines Pixels |
|
||||
| **Kilobyte (KB)** | 1.000 | 10³ | Kleiner Programmcode |
|
||||
| **Megabyte (MB)** | 1 Million | 10⁶ | Textdokument |
|
||||
| **Gigabyte (GB)** | 1 Milliarde | 10⁹ | Kinofilm in FullHD |
|
||||
| **Terabyte (TB)** | 1 Billion | 10¹² | ~12h Video in 4K |
|
||||
| **Petabyte (PB)** | 1 Billiarde | 10¹⁵ | Netflix-Gesamtarchiv |
|
||||
| **Exabyte (EB)** | 1 Trillion | 10¹⁸ | Alle E-Mails weltweit/Tag |
|
||||
| **Zettabyte (ZB)** | 1 Trilliarde | 10²¹ | Internet-Traffic 2016 |
|
||||
|
||||
<!--
|
||||
SI-Präfixe (Dezimal): 1 KB = 1.000 Bytes
|
||||
Binär (IEC): 1 KiB = 1.024 Bytes (Kibibyte)
|
||||
Windows zeigt oft binär, sagt aber "KB" → Verwirrung!
|
||||
1 TB Festplatte = ~931 GiB nutzbar
|
||||
|
||||
Eselsbrücke: "Kilo Mega Giga Tera Peta Exa Zetta Yotta"
|
||||
→ "Komm Mit Großem Tee, Peter Exte Zettelt Yachten"
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Der digitale Wendepunkt
|
||||
|
||||
| Jahr | Analog | Digital | Digital-Anteil |
|
||||
|------|--------|---------|----------------|
|
||||
| **1986** | 2,6 EB | 0,02 EB | **1%** |
|
||||
| **2002** | — | — | **50%** (Wendepunkt) |
|
||||
| **2007** | 18 EB | 277 EB | **94%** |
|
||||
|
||||
**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)
|
||||
|
||||
<!--
|
||||
PRÜFUNGSRELEVANT:
|
||||
- Wendepunkt 2002
|
||||
- Speichereinheiten (KB→MB→GB→TB→PB→EB→ZB)
|
||||
- Magnetband als Archivmedium
|
||||
|
||||
QUELLE: Hilbert & López (2011): "The World's Technological Capacity to Store, Communicate, and Compute Information", Science
|
||||
|
||||
METHODIK: 60 analoge + digitale Technologien untersucht (1986-2007)
|
||||
|
||||
WENDEPUNKT 2002: Erstmals mehr digital als analog gespeichert
|
||||
|
||||
ANALOG damals: Bücher, Zeitungen, Vinyl, VHS, Filmrollen, Fotos
|
||||
|
||||
DIGITAL damals: Festplatten, CDs, DVDs, frühe Flash-Speicher
|
||||
|
||||
HEUTE: LTO-9 (2021) speichert 18 TB pro Band, ~$5/TB für Cold Storage
|
||||
|
||||
VERGLEICH: SSD ~$50/TB, HDD ~$15/TB, LTO ~$5/TB
|
||||
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Analoge Medien
|
||||
### Distribution: physisch (Kauf, Verleih, Kopie)
|
||||
|
||||
- **Text**
|
||||
- Bücher, Zeitungen, Zeitschriften, Lochkarten
|
||||
- **Bild**
|
||||
- Fotografie (Negativ, Dia, Polaroid), Mikrofilm
|
||||
- **Audio:**
|
||||
- Schallplatte (Vinyl, Schellack), Tonband, Musikkassette
|
||||
- **Video:**
|
||||
- Film (35mm, Super 8), VHS, Betamax
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Digitale Medien
|
||||
### Distribution: Datenträger (CD, USB), Download, Streaming, P2P
|
||||
|
||||
- **Text**
|
||||
- E-Book (PDF, EPUB), Dokumente (TXT, DOCX)
|
||||
- **Bild**
|
||||
- Digitalfoto (JPEG, PNG, RAW, WebP, GIF)
|
||||
- **Audio**
|
||||
- Audiodatei (MP3, FLAC, WAV, AAC, OGG)
|
||||
- **Video**
|
||||
- Videodatei (MP4, MKV, AVI, WebM)
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Digitale Speichermedien
|
||||
|
||||
- **Optische Speicher**
|
||||
- CD, DVD, Blu-ray
|
||||
- **Magnetische Speicher**
|
||||
- Festplatte (HDD), Magnetband (LTO)
|
||||
- **Flash-Speicher**
|
||||
- SSD, USB-Stick, SD-Karte
|
||||
- **Cloud-Speicher**
|
||||
- Dropbox, Google Drive, iCloud, AWS S3
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Rastergrafiken
|
||||
|
||||
**Aufbau:** Liste von Pixeln mit Farbwerten (2D-Array)
|
||||
|
||||
**Speicherbedarf (unkomprimiert):**
|
||||
Breite × Höhe × Farbtiefe (in Bytes)
|
||||
|
||||
**Beispiele:** JPEG, PNG, WebP
|
||||
|
||||
| Bits (Farbtiefe) | Farben | Anwendung |
|
||||
|-----:|-------:|-----------|
|
||||
| 1 | 2 | Schwarz/Weiß (Fax) |
|
||||
| 8 | 256 | Graustufen, GIF |
|
||||
| 24 | 16,7 Mio. | True Color (Standard) |
|
||||
| 32 | 16,7 Mio. + Alpha | Transparenz |
|
||||
|
||||
<!--
|
||||
BERECHNUNG: Breite × Höhe × (Farbtiefe / 8)
|
||||
BEISPIEL: 1920×1080 × 24 Bit = 1920×1080×3 = 6.220.800 Bytes ≈ 6,2 MB
|
||||
|
||||
Farbtiefe erklärt:
|
||||
- 1 Bit: 2^1 = 2 Farben
|
||||
- 8 Bit: 2^8 = 256 Farben
|
||||
- 24 Bit: 2^24 = 16.777.216 Farben (je 8 Bit für R, G, B)
|
||||
- 32 Bit: 24 Bit + 8 Bit Alpha-Kanal
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Vektorgrafiken
|
||||
|
||||
**Speicherung als geometrische Primitive:**
|
||||
- Pfade (Bézierkurven mit Kontrollpunkten)
|
||||
- Grundformen (Rechteck, Ellipse, Polygon)
|
||||
- Text (Glyphen als Outlines)
|
||||
|
||||
**SVG-Beispiel:**
|
||||
```xml
|
||||
<circle cx="50" cy="50" r="40" fill="#ff0000"/>
|
||||
```
|
||||
|
||||
<small>SVG beschreibt nicht jeden einzelnen Pixel im Raster, sondern deklariert wie Farben und Formen gesetzt werden.</small>
|
||||
|
||||
<!--
|
||||
Vektorgrafiken beschreiben WAS gezeichnet werden soll.
|
||||
Rastergrafiken beschreiben WIE jeder Pixel aussieht.
|
||||
|
||||
Rendering-Pipeline:
|
||||
Vektordaten → Rasterisierung → Framebuffer → Display
|
||||
|
||||
Beim Skalieren werden einfach die Koordinaten multipliziert.
|
||||
Keine Information geht verloren.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Die Schwächen des Auges
|
||||
|
||||
**Menschen sehen:**
|
||||
- Helligkeit besser als Farbe
|
||||
- Große Flächen besser als feine Details
|
||||
- Niedrige Frequenzen besser als hohe
|
||||
|
||||
**JPEG nutzt das aus:**
|
||||
- Farbauflösung reduzieren (aber Helligkeit behalten)
|
||||
- Glatte Flächen effizient speichern
|
||||
- Hohe Frequenzen (Details) verwerfen
|
||||
|
||||
<!--
|
||||
Das ist die visuelle Entsprechung zur Psychoakustik.
|
||||
|
||||
Das Auge hat mehr Rezeptoren für Helligkeit (Stäbchen)
|
||||
als für Farbe (Zapfen).
|
||||
|
||||
Hohe Frequenzen = schnelle Wechsel = feine Details
|
||||
Niedrige Frequenzen = langsame Wechsel = große Flächen
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||

|
||||
|
||||
# JPEG: Schritt 1 – Farbraumkonversion
|
||||
|
||||
**RGB → Y'CbCr** (seltener Y'UV)
|
||||
|
||||
- **Y** = Helligkeit (Luminanz) – Was das Auge am besten sieht
|
||||
- **Cb** = Blau-Gelb-Anteil (Chrominanz)
|
||||
- **Cr** = Rot-Grün-Anteil (Chrominanz)
|
||||
|
||||
**Warum diese Trennung?**
|
||||
Y (Helligkeit) behält volle Auflösung.
|
||||
Cb/Cr (Farbe) kann reduziert werden – Auge merkt es kaum.
|
||||
|
||||
<!--
|
||||
YCbCr ist wie RGB ein Tripel aus 3 Werten pro Pixel.
|
||||
Der Unterschied: Statt Rot-Grün-Blau speichern wir Helligkeit + 2 Farbdifferenzen.
|
||||
|
||||
Die Umrechnung ist reversibel (mathematische Transformation).
|
||||
Der Clou: Jetzt können wir Helligkeit und Farbe getrennt behandeln.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# JPEG: Schritt 6 – Huffman-Coding
|
||||
|
||||
**Verlustfreie Kompression der Restwerte**
|
||||
|
||||
**Idee:** Statt fester 8 Bit pro Wert → variable Bitlänge
|
||||
Häufige Werte bekommen kurze Bit-Sequenzen.
|
||||
|
||||
| Zeichen | Häufigkeit | Code (Bit-Sequenz) |
|
||||
|---------|------------|------|
|
||||
| e | 40% | `0` (1 Bit) |
|
||||
| a | 25% | `10` (2 Bit) |
|
||||
| i | 20% | `110` (3 Bit) |
|
||||
| o | 10% | `1110` (4 Bit) |
|
||||
| u | 5% | `1111` (4 Bit) |
|
||||
|
||||
<!--
|
||||
Huffman-Coding ist verlustfrei.
|
||||
Der "Code" ist eine Bit-Sequenz, die das Zeichen eindeutig identifiziert.
|
||||
Weil "e" am häufigsten vorkommt, bekommt es den kürzesten Code.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Container und Codec
|
||||
|
||||
**Container = Das Dateiformat (Beispiel: MP4)**
|
||||
Die "Box", die verschiedene Streams zusammenpackt:
|
||||
- Video-Stream
|
||||
- Audio-Stream(s)
|
||||
- Untertitel
|
||||
- Metadaten
|
||||
|
||||
**Codec = Der Kompressionsalgorithmus (Beispiel: AV1)**
|
||||
Entscheidet, WIE komprimiert wird.
|
||||
|
||||
|
||||
<!--
|
||||
Container ≠ Codec
|
||||
Das ist ein häufiges Missverständnis.
|
||||
|
||||
MP4 ist ein Container, nicht ein Codec.
|
||||
Ein MP4 kann H.264, H.265 oder AV1 enthalten.
|
||||
|
||||
Übrigens: JPEG ist ein Codec (für Bilder), kein Container.
|
||||
Bei Bildern fallen Container und Codec oft zusammen.
|
||||
|
||||
Tools wie MediaInfo zeigen beide Informationen.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# H.264 / AVC
|
||||
|
||||
**Advanced Video Coding (2003)**
|
||||
|
||||
**Warum dominant?**
|
||||
- Exzellente Kompression (~100:1 möglich)
|
||||
- Hardware-Support in jedem Gerät seit ~2010
|
||||
- YouTube, Netflix, Blu-ray – alles H.264
|
||||
|
||||
**Features:**
|
||||
- Variable Block-Größen (16×16 bis 4×4)
|
||||
- Deblocking-Filter (reduziert Block-Artefakte)
|
||||
|
||||
<!--
|
||||
H.264 revolutionierte Video-Streaming.
|
||||
Ohne H.264 kein Netflix, kein YouTube in HD.
|
||||
|
||||
Hardware-Decoder bedeutet: Kein CPU-Aufwand, kein Akku-Drain.
|
||||
Selbst billige Smartphones können H.264 abspielen.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# AV1: Die offene Zukunft
|
||||
|
||||
**AV1 (2018)**
|
||||
|
||||
**Alliance for Open Media:**
|
||||
Google, Netflix, Amazon, Microsoft, Apple, Mozilla...
|
||||
|
||||
**Eigenschaften:**
|
||||
- 30% besser als H.265
|
||||
- Royalty-free, Open Source
|
||||
- 8K, HDR, hohe Frame-Rates
|
||||
|
||||
**Stand 2025:**
|
||||
YouTube und Netflix nutzen AV1 für 4K/8K
|
||||
Hardware-Encoder in aktuellen GPUs
|
||||
|
||||
<!--
|
||||
AOM = Alliance for Open Media, gegründet 2015.
|
||||
Historisch: Konkurrierende Tech-Giganten vereint.
|
||||
|
||||
Das Ziel: Nie wieder Patent-Chaos wie bei H.265.
|
||||
|
||||
Problem: Encoding ist sehr langsam (10-100× vs. H.264).
|
||||
Hardware-Encoder lösen das zunehmend.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Wann HDD, wann SSD?
|
||||
|
||||
| Anwendung | Empfehlung |
|
||||
|-----------|------------|
|
||||
| Betriebssystem | SSD (NVMe) |
|
||||
| Anwendungen, Spiele | SSD |
|
||||
| Video-Editing (Projekte) | SSD |
|
||||
| Foto-Archiv | HDD oder SSD |
|
||||
| Backup | HDD |
|
||||
| NAS / Server | HDD (oder Mix) |
|
||||
| Cold Storage | HDD oder Band |
|
||||
|
||||
<!--
|
||||
Die Faustregel:
|
||||
- Oft genutzt, schnell gebraucht → SSD
|
||||
- Selten genutzt, viel Kapazität → HDD
|
||||
|
||||
Viele setzen auf beides:
|
||||
Kleine SSD für System + große HDD für Archiv.
|
||||
-->
|
||||
|
||||
|
||||
---
|
||||
|
||||
<!-- _header: "" -->
|
||||
<!-- _footer: "" -->
|
||||
|
||||
|
||||
# Die 3-2-1-Regel
|
||||
|
||||
**3** Kopien eurer Daten
|
||||
(Original + 2 Backups)
|
||||
|
||||
**2** verschiedene Medientypen
|
||||
(z.B. SSD + HDD, oder lokal + Cloud)
|
||||
|
||||
**1** Kopie an anderem Ort
|
||||
(Offsite: Cloud, anderes Gebäude)
|
||||
|
||||
<!--
|
||||
Herkunft: Peter Krogh, "The DAM Book" (2005)
|
||||
|
||||
Warum 3 Kopien?
|
||||
- Original kann kaputt gehen
|
||||
- Backup 1 auch
|
||||
- Backup 2 = Sicherheitspuffer
|
||||
|
||||
Warum 2 Medientypen?
|
||||
- Gleiche Medien haben gleiche Schwachstellen
|
||||
- Batch-Fehler bei HDDs derselben Charge
|
||||
|
||||
Warum 1 Offsite?
|
||||
- Brand/Wasserschaden zerstört alles vor Ort
|
||||
- Ransomware verschlüsselt angeschlossene Laufwerke
|
||||
-->
|
||||
@@ -5,7 +5,7 @@ paginate: true
|
||||
backgroundColor: #fff
|
||||
header: "Grundlagen IT- und Internettechnik (223015c)"
|
||||
footer: "Michael Czechowski – HdM Stuttgart – WS 2025/26"
|
||||
title: "Termin 1: Geschichte, Grundlagen & HTML"
|
||||
title: "Kapitel 1: Geschichte, Grundlagen & HTML"
|
||||
---
|
||||
|
||||
<style>
|
||||
@@ -55,7 +55,12 @@ section.klausur {
|
||||
#fce4ec 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #fce4ec !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #fce4ec !important;
|
||||
@@ -93,7 +98,7 @@ Hochschule der Medien Stuttgart
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Termin 1 – 20.12.2025
|
||||
# Kapitel 1
|
||||
## Geschichte, Grundlagen & HTML
|
||||
|
||||
---
|
||||
@@ -1534,7 +1539,7 @@ Echte NutzerInnen einbeziehen = Gold-Standard
|
||||
|
||||
**Nächster Termin:** 10.01.2026 – CSS & Netzwerke
|
||||
|
||||
**Kontakt:** mail@librete.ch
|
||||
**Kontakt:** lb-czechowski@hdm-stuttgart.de
|
||||
|
||||
---
|
||||
|
||||
@@ -5,7 +5,7 @@ paginate: true
|
||||
backgroundColor: #fff
|
||||
header: "Grundlagen IT- und Internettechnik (223015c)"
|
||||
footer: "Michael Czechowski – HdM Stuttgart – WS 2025/26"
|
||||
title: "Termin 3: Interaktivität & JavaScript"
|
||||
title: "Kapitel 3: Interaktivität & JavaScript"
|
||||
---
|
||||
|
||||
<style>
|
||||
@@ -55,7 +55,12 @@ section.klausur {
|
||||
#fce4ec 40px,
|
||||
#fff 40px,
|
||||
#fff 80px
|
||||
);
|
||||
) !important;
|
||||
}
|
||||
@media print {
|
||||
section.klausur {
|
||||
background: #fce4ec !important;
|
||||
}
|
||||
}
|
||||
section.aufgabe {
|
||||
background: #fce4ec !important;
|
||||
@@ -93,7 +98,7 @@ Hochschule der Medien Stuttgart
|
||||
|
||||
<!-- _class: lead -->
|
||||
|
||||
# Termin 3 – 24.01.2026
|
||||
# Kapitel 3 – 24.01.2026
|
||||
## Interaktivität & JavaScript
|
||||
|
||||
---
|
||||
@@ -999,7 +1004,7 @@ Euer ehrliches Feedback hilft mir, den Kurs zu verbessern.
|
||||
- Was könnte besser sein?
|
||||
- Welche Themen interessieren euch noch?
|
||||
|
||||
*Feedback gerne auch anonym per E-Mail an mail@librete.ch*
|
||||
*Feedback gerne auch anonym per E-Mail an lb-czechowski@hdm-stuttgart.de*
|
||||
|
||||
---
|
||||
|
||||
@@ -1007,7 +1012,7 @@ Euer ehrliches Feedback hilft mir, den Kurs zu verbessern.
|
||||
|
||||
# Danke!
|
||||
|
||||
**Kontakt:** mail@librete.ch
|
||||
**Kontakt:** lb-czechowski@hdm-stuttgart.de
|
||||
|
||||
**Ressourcen:**
|
||||
- https://nextlevelshit.github.io/html-over-js/
|
||||