diff --git a/1-Ausbildungsjahr/LF2-Arbeitsplätze-ausstatten/LF2-04-Nutzwertanalyse.md b/1-Ausbildungsjahr/LF2-Arbeitsplätze-ausstatten/LF2-04-Nutzwertanalyse.md index 6442301..d94d5e9 100644 --- a/1-Ausbildungsjahr/LF2-Arbeitsplätze-ausstatten/LF2-04-Nutzwertanalyse.md +++ b/1-Ausbildungsjahr/LF2-Arbeitsplätze-ausstatten/LF2-04-Nutzwertanalyse.md @@ -80,6 +80,73 @@ Laptop B: --- +## Praktisches Beispiel: Cloud-Anbieter Auswahl + +### Szenario +Ein Unternehmen muss sich zwischen AWS, Azure und Google Cloud entscheiden. + +### 1. Kriterien definieren + +| Kriterium | Bedeutung | +|-----------|-----------| +| Preis | Kosten pro Monat | +| Leistung | Rechenleistung, Geschwindigkeit | +| Sicherheit | Zertifizierungen, Features | +| Support | Deutsche Ansprechpartner | +| Skalierbarkeit | Einfache Erweiterung | + +### 2. Gewichtung + +| Kriterium | Gewichtung | +|-----------|------------| +| Preis | 25% | +| Leistung | 30% | +| Sicherheit | 25% | +| Support | 10% | +| Skalierbarkeit | 10% | +| **Summe** | **100%** | + +### 3. Bewertung (1-10) + +| Kriterium | Gewichtung | AWS | Azure | Google Cloud | +|-----------|------------|-----|-------|--------------| +| Preis | 25% | 7 | 8 | 9 | +| Leistung | 30% | 9 | 8 | 9 | +| Sicherheit | 25% | 9 | 8 | 8 | +| Support | 10% | 7 | 8 | 6 | +| Skalierbarkeit | 10% | 9 | 8 | 9 | + +### 4. Berechnung + +``` +AWS: += 0,25×7 + 0,30×9 + 0,25×9 + 0,10×7 + 0,10×9 += 1,75 + 2,70 + 2,25 + 0,70 + 0,90 += 8,30 + +Azure: += 0,25×8 + 0,30×8 + 0,25×8 + 0,10×8 + 0,10×8 += 2,00 + 2,40 + 2,00 + 0,80 + 0,80 += 8,00 + +Google Cloud: += 0,25×9 + 0,30×9 + 0,25×8 + 0,10×6 + 0,10×9 += 2,25 + 2,70 + 2,00 + 0,60 + 0,90 += 8,45 +``` + +### 5. Ergebnis + +| Anbieter | Nutzwert | Rang | +|----------|----------|------| +| Google Cloud | 8,45 | 1 | +| AWS | 8,30 | 2 | +| Azure | 8,00 | 3 | + +**Empfehlung:** Google Cloud (aufgrund des besten Preis-Leistungs-Verhältnisses) + +--- + ## Vorlage ### Nutzwertanalyse - Vorlage diff --git a/1-Ausbildungsjahr/LF3-Datenbanken/LF3-00-Übersicht.md b/1-Ausbildungsjahr/LF3-Datenbanken/LF3-00-Übersicht.md index c34361d..81d8995 100644 --- a/1-Ausbildungsjahr/LF3-Datenbanken/LF3-00-Übersicht.md +++ b/1-Ausbildungsjahr/LF3-Datenbanken/LF3-00-Übersicht.md @@ -6,13 +6,13 @@ Dieses Lernfeld behandelt die Entwicklung und Verwaltung von Datenbanken. ## Themen -| Nr. | Thema | Beschreibung | -|-----|-------|-------------| -| 3.1 | [[LF3-01-Datenbankgrundlagen|Datenbankgrundlagen]] | Grundbegriffe, DBMS, Datenmodelle | -| 3.2 | [[LF3-02-Datenmodellierung|Datenmodellierung]] | ER-Modell, Normalisierung | -| 3.3 | [[LF3-03-SQL-Grundlagen|SQL-Grundlagen]] | SELECT, INSERT, UPDATE, DELETE | -| 3.4 | [[LF3-04-SQL-Abfragen|SQL-Abfragen]] | JOINs, Aggregatfunktionen, Unterabfragen | -| 3.5 | [[LF3-05-Datenbankmanagement|Datenbankmanagement]] | Rechte, Sicherheit, Backup | +| Nr. | Thema | Beschreibung | | +| --- | ---------------------------- | --------------------- | ---------------------------------------- | +| 3.1 | [[LF3-01-Datenbankgrundlagen | Datenbankgrundlagen]] | Grundbegriffe, DBMS, Datenmodelle | +| 3.2 | [[LF3-02-Datenmodellierung | Datenmodellierung]] | ER-Modell, Normalisierung | +| 3.3 | [[LF3-03-SQL-Grundlagen | SQL-Grundlagen]] | SELECT, INSERT, UPDATE, DELETE | +| 3.4 | [[LF3-04-SQL-Abfragen | SQL-Abfragen]] | JOINs, Aggregatfunktionen, Unterabfragen | +| 3.5 | [[LF3-05-Datenbankmanagement | Datenbankmanagement]] | Rechte, Sicherheit, Backup | ## Lernziele diff --git a/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-02-Frontend.md b/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-02-Frontend.md index 0c30b24..74a225c 100644 --- a/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-02-Frontend.md +++ b/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-02-Frontend.md @@ -99,6 +99,45 @@ element.setAttribute("class", "neu"); element.getAttribute("href"); ``` +### Praktisches Beispiel: To-Do-Liste + +```html + + + + +``` + +```javascript +// JavaScript +const input = document.getElementById('todo-input'); +const button = document.getElementById('add-btn'); +const list = document.getElementById('todo-list'); + +button.addEventListener('click', () => { + const text = input.value.trim(); + if (text) { + // Neues Element erstellen + const li = document.createElement('li'); + li.textContent = text; + + // Löschen-Button + const deleteBtn = document.createElement('button'); + deleteBtn.textContent = 'X'; + deleteBtn.onclick = () => li.remove(); + + li.appendChild(deleteBtn); + list.appendChild(li); + input.value = ''; + } +}); + +// Enter-Taste Support +input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') button.click(); +}); +``` + ### Events ```javascript diff --git a/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-04-Sicherheit-Web.md b/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-04-Sicherheit-Web.md index 50f1592..e514656 100644 --- a/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-04-Sicherheit-Web.md +++ b/1-Ausbildungsjahr/LF6-Webanwendungen/LF6-04-Sicherheit-Web.md @@ -80,6 +80,29 @@ function escapeHtml(text) { Content-Security-Policy: default-src 'self'; script-src 'self' ``` +### Praktisches Beispiel: Express.js Sicherheits-Header + +```javascript +const helmet = require('helmet'); +const cors = require('cors'); + +app.use(helmet()); + +// CORS konfigurieren +app.use(cors({ + origin: 'https://meine-app.de', + credentials: true +})); + +// Rate Limiting +const rateLimit = require('express-rate-limit'); +app.use('/api/', rateLimit({ + windowMs: 15 * 60 * 1000, // 15 Minuten + max: 100, // Max 100 Anfragen + message: 'Zu viele Anfragen, bitte später versuchen' +})); +``` + --- ## CSRF (Cross-Site Request Forgery) diff --git a/2-Ausbildungsjahr/LF8-Datenintegration/LF8-04-ETL-Prozesse.md b/2-Ausbildungsjahr/LF8-Datenintegration/LF8-04-ETL-Prozesse.md index d1b67ee..ce2cdfc 100644 --- a/2-Ausbildungsjahr/LF8-Datenintegration/LF8-04-ETL-Prozesse.md +++ b/2-Ausbildungsjahr/LF8-Datenintegration/LF8-04-ETL-Prozesse.md @@ -207,6 +207,81 @@ ETL - Fehlerstrategien --- +## Praktisches Beispiel: Vollständiger ETL-Pipeline + +```python +import pandas as pd +import requests +from sqlalchemy import create_engine +import logging + +# Logging konfigurieren +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) + +def etl_pipeline(): + """ + Vollständiger ETL-Pipeline für Verkaufsdaten + """ + + # === EXTRACT === + logger.info("Starte Extraktion...") + + # Aus CSV + kunden_df = pd.read_csv('daten/kunden.csv') + bestellungen_df = pd.read_csv('daten/bestellungen.csv') + + # Aus API + try: + response = requests.get('https://api.shop.de/produkte', timeout=30) + produkte_df = pd.DataFrame(response.json()) + except Exception as e: + logger.error(f"API Fehler: {e}") + produkte_df = pd.DataFrame() + + logger.info(f"Extrahiert: {len(kunden_df)} Kunden, {len(bestellungen_df)} Bestellungen") + + # === TRANSFORM === + logger.info("Starte Transformation...") + + # Daten bereinigen + kunden_df = kunden_df.drop_duplicates() + kunden_df['email'] = kunden_df['email'].str.lower().str.strip() + kunden_df['erstellt_am'] = pd.to_datetime(kunden_df['erstellt_am']) + + # Berechnungen + bestellungen_df['umsatz_mit_mwst'] = bestellungen_df['umsatz_netto'] * 1.19 + + # JOIN: Bestellungen mit Kunden verbinden + merged_df = bestellungen_df.merge( + kunden_df[['kunden_id', 'name', 'stadt']], + on='kunden_id', + how='left' + ) + + # Aggregation: Umsatz pro Stadt + umsatz_pro_stadt = merged_df.groupby('stadt')['umsatz_netto'].sum().reset_index() + + logger.info(f"Transformation abgeschlossen: {len(merged_df)} Datensätze") + + # === LOAD === + logger.info("Starte Laden...") + + # Datenbank-Verbindung + engine = create_engine('postgresql://user:pass@localhost:5432/warehouse') + + # In Datenbank laden + merged_df.to_sql('fact_bestellungen', engine, if_exists='replace', index=False) + umsatz_pro_stadt.to_sql('dim_umsatz_stadt', engine, if_exists='replace', index=False) + + logger.info("ETL Pipeline erfolgreich abgeschlossen!") + +if __name__ == '__main__': + etl_pipeline() +``` + +--- + ## Querverweise - [[LF8-03-Datenformate|Zurück: Datenformate]] diff --git a/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-03-Virtualisierung.md b/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-03-Virtualisierung.md index a13d79f..af0b241 100644 --- a/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-03-Virtualisierung.md +++ b/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-03-Virtualisierung.md @@ -108,6 +108,59 @@ EXPOSE 3000 CMD ["node", "server.js"] ``` +### Praktisches Beispiel: Docker Compose + +```yaml +# docker-compose.yml +version: '3.8' + +services: + # Webanwendung + app: + build: . + ports: + - "3000:3000" + environment: + - DATABASE_URL=postgres://db:5432/webapp + depends_on: + - db + - redis + + # Datenbank + db: + image: postgres:15-alpine + volumes: + - db_data:/var/lib/postgresql/data + environment: + - POSTGRES_PASSWORD=geheim + - POSTGRES_DB=webapp + + # Cache + redis: + image: redis:7-alpine + ports: + - "6379:6379" + +volumes: + db_data: +``` + +### Praktisches Beispiel: Docker Volume + +```bash +# Volume erstellen +docker volume create mydata + +# Volume einhängen +docker run -v mydata:/data ubuntu + +# Volumes auflisten +docker volume ls + +# Unbenutzte Volumes löschen +docker volume prune +``` + --- ## Kubernetes diff --git a/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-04-Monitoring.md b/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-04-Monitoring.md index c2d2808..59f66f4 100644 --- a/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-04-Monitoring.md +++ b/2-Ausbildungsjahr/LF9-Netzwerke-Dienste/LF9-04-Monitoring.md @@ -61,6 +61,73 @@ scrape_configs: - targets: ['localhost:9100'] ``` +### Praktisches Beispiel: Alert-Regeln + +```yaml +# alerts.yml +groups: +- name: server_alerts + rules: + # Hohe CPU-Auslastung + - alert: HighCPU + expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 + for: 5m + labels: + severity: warning + annotations: + summary: "Hohe CPU-Auslastung auf {{ $labels.instance }}" + description: "CPU Auslastung ist seit 5 Minuten über 80%" + + # Wenig Speicherplatz + - alert: DiskSpaceLow + expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10 + for: 2m + labels: + severity: critical + annotations: + summary: "Wenig Speicherplatz auf {{ $labels.instance }}" + + # Service ausgefallen + - alert: ServiceDown + expr: up == 0 + for: 1m + labels: + severity: critical + annotations: + summary: "{{ $labels.job }} Service ausgefallen" +``` + +### Praktisches Beispiel: Python Logging + +```python +import logging +import logging.handlers +import sys + +# Logger konfigurieren +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.StreamHandler(sys.stdout), + logging.handlers.RotatingFileHandler( + 'app.log', + maxBytes=10_000_000, # 10 MB + backupCount=5 + ) + ] +) + +logger = logging.getLogger(__name__) + +# Log-Ebenen nutzen +logger.debug("Detaillierte Debug-Info") +logger.info("Anwendung gestartet") +logger.warning("Warnung: Konfiguration fehlt") +logger.error("Fehler: Datenbank nicht erreichbar") +logger.critical("Kritisch: System muss heruntergefahren werden") +``` + ### Grafana Dashboard ```