‏ ‏ ‎ ‏ ‏ ‎

1. Git

1.1. git Architektur und Kommandos Foundation

  • Skizzieren Sie die Architektur von git und erklären Sie die wichtigsten Kommandos.

Lösung
git architecture

1.2. Erstellung eines Repositories Foundation

  • Wie kann ich ein neues Repository lokal erstellen?

Lösung
git init

1.3. Den vorletzten Commit aus-checken Foundation

  • Wie kann man aus einem git-repo einen Commit auschecken, der nicht der letzte ist? Geben Sie die genauen Befehle an.

Lösung
git checkout <Commit-Hash>

oder

git checkout HEAD~1

HEAD zeigt auf den aktuellsten Commit.

HEAD~1 ist der eine Commit davor, also der vorletzte (ident mit HEAD^).

HEAD~2 wäre der drittletzte, usw.

HEAD^ Der Vorgänger (also ein Commit zurück). HEAD^ wird verwendet, wenn es mehrere Vorgänger gibt, zB bei einem Merge-Commit → HEAD^1 ist der erste Vorgänger, HEAD^2 der zweite Vorgänger.

1.4. git in Teams Foundation

  • Welcher Befehl ist zu Beginn jeder Arbeit und auch zwischendurch mit git notwendig und warum?

Lösung
git pull
  • Damit alle Änderungen der anderen Teammitglieder in den eigenen Branch übernommen werden.

1.5. .gitignore Foundation

  • Was bewirkt ein Eintrag in der Datei .gitignore? Warum ist es wichtig, .gitignore zu verwenden?

Lösung

Ein Eintrag in .gitignore sorgt dafür, dass bestimmte Dateien nicht mit ins Git Repository aufgenommen werden. Das ist wichtig,

  • weil man sonst generierte Dateien oder Dependencies wie node_modules hochladen würde, wodurch git push und git pull langsamer sind.

  • Außerdem ist es sicherheitstechnisch verboten, vertrauliche Daten (z.B. in .env Dateien) in einem öffentlichen Repository zu speichern.

Grundsatz: Dateien, die generiert werden (zB durch kompilieren, durch npm install), sollten nicht im Repository sein. Dateien, die nicht erstellt werden (zB Konfigurationsdateien, Dokumentation, Programmcode) sind im Repository zu speichern. Aber keine privaten Daten wie Passwörter, API-Keys, etc.!

1.6. ssh in github Foundation

  • Wie kann ich mich mit ssh in github einloggen?

Lösung
  1. ssh-key in ~/.ssh generieren

    ssh-keygen -t ed25519
  2. folgendes in ~/.ssh/config einfügen:

    Host github.com
      Hostname github.com
      User <user of the remote server>
      IdentityFile ~/.ssh/id_ed25519
  3. public-key in Developer-Settings in github einfügen

    gh-profile → Settings → SSH and GPG keys → New SSH key

1.7. git pull vs git fetch Advanced

  • Was ist der Unterschied zwischen git pull und git fetch?

Lösung

git pull ist eine Kombination aus git fetch und git merge. Es lädt die neuesten Änderungen vom Remote-Repository herunter und integriert sie in den aktuellen Branch. git fetch hingegen lädt nur die Änderungen herunter, ohne sie zu integrieren. Dies ermöglicht es Ihnen, die Änderungen zu überprüfen, bevor Sie sie in Ihren Branch übernehmen.

1.8. Cherry Picking Foundation

  • Erläutern Sie Cherry Picking und geben Sie ein konkretes Bsp. mit den git-cli-Kommandos an.

Lösung

Cherry Picking bedeutet, einzelne Commits aus einem Branch (z.B. Feature-Branch) in den derzeitigen (z.B. main-Branch) zu übernehmen, ohne den ganzen Feature-Branch zu mergen. Dabei wird der ausgewählte Commit auf den aktuellen Branch übernommen, und der HEAD zeigt anschließend auf den neuen Commit.

Anwendung: z.B. wenn man im Feature-Branch einen Bug gefixt hat, aber das Feature noch nicht fertig ist.

Befehl:
git switch main
git cherry-pick -x <Commit-Hash>

-x wird empfohlen, damit im Commit-Message der Original-Commit-Hash vermerkt wird, damit man später nachvollziehen kann, woher der Commit stammt.

❯ git switch log

commit cb6a74f7c7b49499c9b5087a6d43ae2b67ab60b1 (HEAD -> main)
Author: htl-leonding <t.stuetz@htl-leonding.ac.at>
Date:   Sun Feb 15 12:15:30 2026 +0100

    restructured dependencies

    (cherry picked from commit 587a53a23ac5e1b689c8a9e170a227eae0b1afb8)

1.9. gh-pages aktivieren Foundation

  • Wie kann man für ein repo gh-pages aktivieren?

Lösung
  1. Erstelle einen Branch gh-pages und pushe ihn auf GitHub.

  2. Gehe zu den Einstellungen (Settings) des Repositories auf GitHub.

  3. Settings - Pages - Deploy from a branch - gh-pages / root

    gh pages aktivieren

1.10. git Konfiguration 1 Foundation

  • Wie kann man sich die git-Konfiguration des aktuellen Repositories anzeigen lassen? Annahme: Sie befinden sich im Projektverzeichnis.

Lösung
git config list
result (q zum Beenden)
credential.helper=osxkeychain
user.name=maxmustermann
user.email=m.mustermann@students.htl-leonding.ac.at
core.autocrlf=input
init.defaultbranch=main
(END)

1.11. git Konfiguration 2 Foundation

  • Welche Scopes gibt es bei der Konfiguration in git? Welchen Vorteil haben Scopes?

Lösung
  • --global: Gilt für alle Repositories des Benutzers.

  • --local: Gilt nur für das aktuelle Repository.

Man kann zB grundsätzlich alle Repositories (zB für die Firma) mit public credentials (user.name, user.email) versehen und nur für gewisse Projekte (zB privat) andere credentials verwenden.

1.12. git Konfiguration 3 Foundation

  • Wie kann man den lokalen Git-Benutzernamen und E-Mail-Adresse einsehen?

Lösung
git config user.name
git config user.email
result
mmustermann
m.mustermann@private-mail.at

1.13. git Konfiguration 4 Foundation

  • Wie kann man den globalen Git-Benutzernamen und E-Mail-Adresse einsehen?

Lösung
git config --global user.name
git config --global user.email
result
maxmustermann
m.mustermann@students.htl-leonding.ac.at

1.14. git Konfiguration 5 Foundation

  • Wie kann man seine git-credentials lokal setzen

Lösung
git config --local user.name "Dein Name"
git config --local user.email "deine.email@beispiel.com"

1.15. git Konfiguration 6 Foundation

  • Wie kann man seine git-credentials global setzen

Lösung
git config --global user.name "Dein Name"
git config --global user.email "deine.email@beispiel.com"

1.16. git Konfiguration 7 Foundation

  • Wie kann man seine git-credentials wieder vom System (aus der Keychain) löschen? zB im EDV-Saal

Lösung
git config --global --unset-all user.name
git config --global --unset-all user.email

1.17. Unterschied merge vs rebase Foundation

Lösung

1.18. github Template Repo Foundation

  • Welchen Zweck erfüllt ein github-Template-Repo?

1.19. github commit logs Foundation

  • Wie kann man auf der Console die Commits eines Repositories einzeilig anzeigen?

2. Docker und Docker Compose

2.1. Auflisten aller Container Foundation

Lösung
docker container ls -a (1)
docker ps -a (2)
1 -a zeigt alle Container (laufend + gestoppt)
2 deprecated, daher nicht mehr verwenden

2.2. Auflisten aller Images Foundation

Lösung
docker image ls
docker images (1)
1 deprecated, daher nicht mehr verwenden

2.3. Container starten Foundation

Lösung
docker run [optionen] image-name (1)
docker start container-name-or-id (2)
1 Neuen Container starten
2 Gestoppten Container erneut starten

2.4. Container stoppen Foundation

Lösung
docker stop <container-name-or-id>
  • Beispiel

docker stop a1b2c3d4e5f6

2.5. Container löschen Foundation

Lösung
docker rm <container-name-or-id>
Man kann nur gestoppte Container löschen. Falls er noch läuft, bekommt man einen Fehler.
  1. Optional: Container erzwingen löschen

docker rm -f <container-name-or-id> (1)
1 Mit -f(force) wird der Container auch gelöscht, wenn er läuft - das wirkt wie ein harter Kill + Löschung.

2.6. Volumes löschen Foundation

Lösung
docker volume rm <volume-name>
Beispiel
docker volume rm mein-volume
Man muss zuerst den Container, mit dem das Volume verbunden ist, stoppen und löschen.

2.7. Alle Docker-Elemente löschen Foundation

Löschen von Containern, Images, Networks und Volumes.

Lösung
#!/usr/bin/env bash

docker compose down
docker container prune -f
docker image prune -f
docker volume prune -f
docker builder prune --all --force #build cache löschen
IMAGES=$(docker images -q)

for image in $IMAGES
do
    docker image rm -f $image
done
VOLUMES=$(docker volume ls -q)
for volume in $VOLUMES
do
    docker volume rm $volume
done
docker container ls
docker volume ls
docker image ls

2.8. Image bauen Foundation

Lösung
  • Um ein Docker-Image zu bauen, braucht man eine Datei namens Dockerfile und einen Build-Befehl

  • Die wichtigsten Dockerfile Instruktionen:

Instruction Description

ADD

Add local or remote files and directories. Use with care.

ARG

Use build-time variables.

CMD

Specify default commands.

COPY

Copy files and directories.

ENTRYPOINT

Specify default executable.

ENV

Set environment variables.

EXPOSE

Describe which ports your application is listening on.

FROM

Create a new build stage from a base image.

HEALTHCHECK

Check a container’s health on startup.

LABEL

Add metadata to an image.

MAINTAINER

Specify the author of an image.

ONBUILD

Specify instructions for when the image is used in a build.

RUN

Execute build commands.

SHELL

Set the default shell of an image.

STOPSIGNAL

Specify the system call signal for exiting a container.

USER

Set user and group ID.

VOLUME

Create volume mounts.

WORKDIR

Change working directory.

  • Beispiel

    1. Dockerfile im Projektordner erstellen

# Dockerfile
FROM node:18 (1)
WORKDIR /app (2)
COPY . . (3)
RUN npm install (4)
CMD ["node", "index.js"] (5)
1 Legt Node.js 18 als Basis-Image fest
2 Wechselt in den Arbeitsordner /app im Container
3 Kopiert alle Dateien vom Host ins Containerverzeichnis
4 Führt npm install beim Build aus (Abhängigkeiten installieren)
5 Definiert, was beim Containerstart ausgeführt wird
  1. Image bauen

docker build -t mein-node-image . (1)

2.9. COPY im Dockerfile Foundation

  • In einem Dockerfile kann das Kommando COPY verwendet werden. Schreiben Sie beispielhaft, wie dieses Kommando aussieht und von wo nach wohin kopiert wird.

2.10. Image nach ghcr.io pushen Foundation

  • Wie kann man ein Image in eine andere Registry als hub.docker.com pushen?

Lösung
docker tag <image_name> ghcr.io/<user>/<repo>:<tag>
docker push ghcr.io/<user>/<repo>:<tag>
  1. Beispiel:

docker tag my-image ghcr.io/htl-leonding-college/my-image:latest
docker push ghcr.io/htl-leonding-college/my-image:latest

Der Name des Images beinhaltet den Namen des Repositories, in dem das Image gespeichert werden soll. Der Tag ist optional, aber es ist eine gute Praxis, ihn zu verwenden, um verschiedene Versionen des Images zu kennzeichnen.

2.11. docker exec Foundation

  • Wie kann ich in einen laufenden Container ein Programm zB die shell starten?

Lösung
docker exec -it <container_id> /bin/bash

2.12. Starten von Docker Compose im Vordergrund Foundation

Lösung
docker compose -f my-docker-compose-file.yaml up

2.13. Starten von Docker Compose im Hintergrund Foundation

Lösung
docker compose -f my-docker-compose-file.yaml up -d

-d …​ detached mode

2.14. Stoppen von Docker Compose Foundation

Lösung
docker compose -f my-docker-compose-file.yaml stop

2.15. Beenden von Docker Compose Foundation

Lösung
docker compose -f my-docker-compose-file.yaml down

2.16. Anzeigen der Logs von Docker Compose Foundation

Lösung
docker compose -f my-docker-compose-file.yaml logs -f

2.17. postgres-Backup eines Containers Foundation

  • Wie kann man ein Backup einer gedockerten postgres DB erstellen?

Lösung
docker compose --file=docker-compose.yaml exec -it postgres pg_dump --username=app db | gzip > sql.gz
Ev. auch
docker exec -t <container_id> pg_dumpall -c -U <user> > dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql

Ein mögliches Script wäre:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

# Configuration
BACKUP_DIR="$(dirname "$0")/backups"
CONTAINER_NAME="my-container"
DB_USER="my-user"
DB_NAME="db"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/myapp_backup_${DATE}.sql"
RETENTION_DAYS=7

# Ensure backup directory exists
mkdir -p "${BACKUP_DIR}"

echo "Starting database backup for ${DB_NAME}..."

# Execute pg_dump inside the container
# We use -it or just docker exec. For scripts, no -t is better.
if docker exec ${CONTAINER_NAME} pg_dump -U ${DB_USER} ${DB_NAME} > "${BACKUP_FILE}"; then
    echo "Backup successful: ${BACKUP_FILE}"

    # Compress the backup to save space
    gzip "${BACKUP_FILE}"
    echo "Backup compressed: ${BACKUP_FILE}.gz"

    # Cleanup old backups (older than RETENTION_DAYS)
    echo "Cleaning up backups older than ${RETENTION_DAYS} days..."
    find "${BACKUP_DIR}" -name "payments_backup_*.sql.gz" -mtime +${RETENTION_DAYS} -exec rm {} \;
    echo "Cleanup finished."
else
    echo "ERROR: Backup failed! Check if container ${CONTAINER_NAME} is running."
    exit 1
fi
  • Was passiert hier?

  • Welche Ergänzung wäre hier sinnvoll?

2.18. postgres-Backup in Container wiederherstellen Foundation

  • Wie kann ein SQL-Backup einer (gedockerten) postgres DB wiederhergestellt werden?

Lösung
restore.sh könnte zB so aussehen:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash

# Configuration
BACKUP_DIR="$(dirname "$0")/backups"
CONTAINER_NAME="my-db"
DB_USER="my-user"
DB_NAME="db"

# Check if a backup file was provided
if [ -z "$1" ]; then
    echo "Usage: ./restore.sh <backup_file.sql.gz>"
    echo "Available backups in ${BACKUP_DIR}:"
    ls -1 "${BACKUP_DIR}"
    exit 1
fi

BACKUP_FILE=$1

# Ensure the container is running
if ! docker ps | grep -q "${CONTAINER_NAME}"; then
    echo "ERROR: Container ${CONTAINER_NAME} is not running! Please start it first with ./start-db.sh"
    exit 1
fi

echo "Restoring database ${DB_NAME} from ${BACKUP_FILE}..."

# Decompress and restore
# We use 'cat' and pipe to 'docker exec' to avoid needing to copy the file into the container
gunzip -c "${BACKUP_FILE}" | docker exec -i ${CONTAINER_NAME} psql -U ${DB_USER} -d ${DB_NAME}

if [ $? -eq 0 ]; then
    echo "------------------------------------------------------------"
    echo "SUCCESS: Database has been restored."
    echo "------------------------------------------------------------"
else
    echo "ERROR: Restore failed!"
    exit 1
fi
  • Welche Voraussetzungen müssen bei diesem Script erfüllt sein?

    • zB das Vorhandensein eines scripts namens start-db.sh, das den Container mit der DB startet, damit er für die Wiederherstellung läuft.

Siehe auch:

2.19. .dockerignore Foundation

  • Was bewirkt ein Eintrag in der Datei .dockerignore? Warum ist es wichtig, .dockerignore zu verwenden?

Lösung
  • Ein Eintrag in der Datei .dockerignore bewirkt, dass bestimmte Dateien oder Ordner vom Docker-Build Kontext ausgeschlossen werden - also nicht ins Image kopiert werden.

  • Typische Beispiele für Dateien und Ordner, die nicht ins Docker-Image übernommen werden:

    1. .git/

    2. node_modules/

    3. *.log

Vorteile:

  1. Schnellerer Build - Docker verarbeitet weniger Daten

  2. Saubereres Image - nur relevante Dateien landen im Image

  3. Mehr Sicherheit - keine sensiblen Daten wie .env, SSH-Keys usw. gelangen ins Image

  4. Weniger Speicherverbrauch - kleinere und effizientere Images

2.20. Umgebungsvariable in Docker-Compose setzen Foundation

  • Warum werden Umgebungsvariablen in docker compose verwendet?

2.21. Health Check in Docker Compose Foundation

  • Warum und wie wird in docker compose ein health-check durchgeführt? Zeigen Sie dies am Bsp einer postgres-Datenbank.

Lösung

Ein Healthcheck wird zB für die Datenbank durchgeführt, damit andere Container, die von der Datenbank abhängen, erst gestartet werden, wenn die Datenbank bereit ist.

2.22. docker compose stop vs. down Foundation

  • Was ist der Unterschied zwischen docker compose stop und docker compose down?

Lösung
  • docker compose stop stoppt die laufenden Container, aber behält die Daten und Konfigurationen bei. Die Container können später wieder gestartet werden.

  • docker compose down stoppt die Container und löscht die Container zusammen mit den zugehörigen Netzwerken und Volumes. Es ist eine vollständige Bereinigung der Umgebung.

3. Kubernetes

3.1. Imperativ vs. deklarativ Advanced

  • Was ist der Unterschied zwischen imperativem und deklarativem Management in Kubernetes?

Lösung
  • Beim imperativen Management werden die Kommandos direkt ausgeführt, um den gewünschten Zustand zu erreichen (z.B. kubectl create deployment …​). Vergleichbar mit Programmieren: Befehle werden nacheinander ausgeführt. Es wird der Weg zur Erreichung des gewünschten Zustands definiert.

  • Beim deklarativen Management definiert man den gewünschten Zustand in einer YAML-Datei (Manifest) und wenden diese mit kubectl apply -f …​ an. Kubernetes sorgt dann dafür, dass der tatsächliche Zustand dem gewünschten Zustand entspricht. Es wird nur der Zielzustand definiert, nicht der Weg dorthin.

3.2. Was bedeutet der Begriff "ephemeral"? Advanced

Lösung

3.3. Was versteht man unter einem "sidecar container"? Advanced

Lösung

In einem Pod (der kleinsten Einheit in Kubernetes) können mehrere Container gleichzeitig laufen. Während der Hauptcontainer die eigentliche Anwendung beherbergt (z. B. eine Web-App), übernimmt der Sidecar-Container unterstützende Aufgaben.

Beide teilen sich die gleichen Ressourcen, wie zum Beispiel das Netzwerk (localhost) und den Speicherplatz (Volumes).

Typische Aufgaben eines Sidecars

  • Logging & Monitoring: Der Sidecar sammelt Log-Dateien der App und schickt sie an einen zentralen Server (z. B. Splunk oder Elasticsearch).

  • Proxies & Sicherheit: Ein Sidecar kann den Netzwerkverkehr verschlüsseln (TLS-Terminierung) oder als Botschafter für die Kommunikation mit anderen Diensten fungieren (Service Mesh).

  • Konfigurations-Update: Der Sidecar beobachtet, ob sich Konfigurationsdateien ändern, und lädt sie für die Haupt-App neu.

  • Daten-Synchronisation: Ein Sidecar könnte regelmäßig Daten aus einem Repository (wie GitHub) ziehen und in ein Verzeichnis legen, auf das die Web-App zugreift.

Warum trennt man das überhaupt? Weil man so die Hauptanwendung "sauber" hält und Funktionen hinzufügen kann, ohne den Code der App zu ändern.

3.4. Was ist ein "init container"? Advanced

Lösung

3.5. Wie funktioniert ein "liveness probe" und ein "readiness probe"? Advanced

Lösung

Beide sind Health-Checks, die das Kubelet auf Containern ausführt:

Liveness Probe: Prüft, ob der Container noch läuft. Schlägt dieser Check fehl, killt Kubernetes den Container und startet ihn (gemäß der Restart-Policy) neu. Er hilft bei Deadlocks oder wenn die Applikation "eingefroren" ist.
Readiness Probe: Prüft, ob der Container bereit ist, Traffic zu empfangen. Schlägt dieser Check fehl, wird der Pod aus den Endpoints des zugehörigen Services entfernt. Es wird kein Neustart erzwungen. Dies ist wichtig während der Startphase oder wenn eine Applikation temporär überlastet ist.

3.6. Was versteht man unter einem "Kubernetes Manifest"? Advanced

  • …​ auch genannt: **

Lösung

4. Shell / Netzwerke

4.1. Was ist ein Domain Name Service (DNS)? Foundation

4.2. Kopieren auf einen entfernten Server Foundation

  • Wie kann ich eine Datei auf einen entfernten Server kopieren?

  • [TODO]: Bei dieser Frage sollte noch unterschieden werden, ob bereits ssh-key-Paare existieren oder nicht.

Lösung
scp -i ~/.ssh/id_ed25519 <file> <user>@<remote-server>:<path>

4.3. Port Forwarding Foundation

  • Wie kann ich einen Port eines entfernten Servers auf einen lokalen Port weiterleiten? zB Port 5432 von einem Server mit laufenden docker-compose - Containern auf Port 5432 auf localhost?

    • Nenne Anwendungsfälle für Port-Forwarding

Lösung
port forwarding
ssh -L 5432:localhost:5432 <user>@<remote-server>

Wenn der Port 5432 auf lokalhost nicht verfügbar ist (da zB eine lokale db bereits läuft), kann ich den Port 5432 vom Server auch auf einen anderen Port von localhost weiterleiten, zB 5433.

  • Anwendungsfälle:

    • Zugriff auf eine Datenbank, die auf einem entfernten Server oder in einem Container läuft, als wäre sie lokal

    • Zugriff auf einen Webserver, der auf einem entfernten Server oder in einem Container läuft, über localhost:8080

    • Man kann oft auch IDE’s so konfigurieren, dass sie über Port-Forwarding auf entfernte Debugging-Ports zugreifen können, um Remote-Debugging zu ermöglichen oder mit dem Datenbank-Client der IDE direkt auf eine entfernte Datenbank zuzugreifen.

Port-Forwarding ist grundsätzlich eine sichere Methode, um auf Dienste zuzugreifen, die hinter einer Firewall oder in einem privaten Netzwerk laufen. Trotzdem wird empfohlen zB für den Zugriff auf das (private) Heim-Netzwerk entweder einen VPN-Tunnel (zB WireGuard) oder einen Cloudflare-Tunnel zu verwenden, da Ports nicht nach außen geöffnet werden müssen, sondern der Zugriff über den Tunnel erfolgt.

4.4. Umgebungsvariable für Aufruf mitgeben Foundation

  • Wie kann ich nur für einen Aufruf eine Umgebungsvariable setzen?

Lösung
MY_ENV_VAR=1234 ./my_script.sh
zB
PGPASSWORD=app pg_dump --username=app db

4.5. Umgebungsvariable setzen Foundation

  • Wie kann ich eine Umgebungsvariable für alle Aufrufe setzen?

Lösung
  • Umgebungsvariablen gibt es sowohl für Linux, MacOS und auch für Windows.

  • Environment - Variablen die nicht nur für den aktuellen Aufruf, sondern für alle Aufrufe gesetzt werden, ist bspw. die PATH-Variable, die angibt, wo nach ausführbaren Dateien gesucht wird.

  • In Linux uns MacOS werden Umgebungsvariable wie folgt gesetzt:

    export MY_ENV_VAR=1234
  • In Windows ist das unterschiedlich je nach Shell. Falls das wen interessiert, soll er/sie sich das recherchieren.

    environment variables in windows
    Figure 1. In Windows kann man Umgebungsvariablen auch über die Systemsteuerung setzen:
  • In Linux uns MacOS werden Umgebungsvariable wie folgt verwendet:

    echo $MY_ENV_VAR
  • In Windows

    echo %MY_ENV_VAR%

4.6. Prozess mit Port Foundation

  • Wie kann ich eine Prozess-ID mit Port 8080 finden?

Lösung
Linux:
netstat -tulpn | grep 8080
Parameter Beschreibung

t

Zeigt TCP-Verbindungen an.

u

Zeigt UDP-Verbindungen an.

l

Zeigt nur lauschende (listening) Ports an.

p

Zeigt die Prozess-ID (PID) und den Programmnamen an, der den Port nutzt.

n

Zeigt numerische Adressen und Portnummern an, anstatt Hostnamen oder Dienstnamen aufzulösen.

MacOS
lsof -i :8080

4.7. Troubleshooting: netstat nicht gefunden Foundation

  • Wenn der Befehl netstat nicht gefunden wird, was kann ich tun?

Lösung
sudo apt install net-tools

4.8. Was ist ein Reverse Proxy? Foundation

Lösung
reverse proxy

Ein Reverse Proxy ist ein Server, der Anfragen aus dem Internet entgegennimmt und sie an interne Server weiterleitet. Er fungiert als „Schutzschild“ und „Verteiler“ vor deiner eigentlichen Infrastruktur. Die Kernfunktionen

  • Sicherheit: Die IP-Adressen deiner eigentlichen Server bleibt verborgen.

  • Lastverteilung (Load Balancing): Er verteilt Anfragen auf mehrere Server, um Überlastung zu vermeiden.

  • SSL-Terminierung: Er übernimmt die HTTPS-Verschlüsselung. Im internen Netzwerk können die Verbindungen unverschlüsselt sein, was die Leistung verbessert.

  • Caching: Er speichert Kopien von Inhalten, um sie schneller auszuliefern.

Kurzunterschied: Ein normaler Proxy schützt den Nutzer, ein Reverse Proxy schützt den Server.

4.9. Den Status für nginx anzeigen lassen Foundation

Lösung
  • Zeigt den Status des nginx-Dienstes an, einschließlich Informationen über den Dienststatus, die letzten Protokolleinträge und ob der Dienst läuft oder gestoppt ist.

    systemctl status nginx
    result
    ● nginx.service - A high performance web server and a reverse proxy server
         Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
         Active: active (running) since Thu 2025-06-05 12:10:20 UTC; 17h ago
           Docs: man:nginx(8)
        Process: 316744 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
        Process: 316783 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
       Main PID: 316811 (nginx)
          Tasks: 3 (limit: 4609)
         Memory: 10.9M (peak: 21.9M)
            CPU: 10.494s
         CGroup: /system.slice/nginx.service
                 ├─316811 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
                 ├─316812 "nginx: worker process"
                 └─316813 "nginx: worker process"
  • Überprüft die Konfiguration von nginx und zeigt an, ob sie gültig ist.

    nginx -t
    result
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
  • How to check NGINX status on Ubuntu

4.10. Wie kann man Tasks unter Linux zeitgesteuert automatisieren? Foundation

Lösung
  • Cronjobs sind zeitgesteuerte Aufgaben, die unter Linux und Unix-basierten Systemen verwendet werden, um Skripte oder Befehle zu bestimmten Zeiten oder in regelmäßigen Abständen automatisch auszuführen.

4.11. Wie kann man sich die derzeitigen Cronjobs anzeigen lassen? Foundation

Lösung
  • Um die derzeitigen Cronjobs für den aktuellen Benutzer anzuzeigen, kann man den folgenden Befehl verwenden:

    crontab -l

4.12. Wie kann man sich die derzeitigen Cronjobs editieren? Foundation

Lösung
  • Um die derzeitigen Cronjobs für den aktuellen Benutzer zu ändern, kann man den folgenden Befehl verwenden:

    crontab -e

5. Asciidoctor

5.2. Präambel / Preamble Foundation

  • Was ist eine Präambel?

Lösung
  • In AsciiDoc ist eine Präambel der Abschnitt vor der ersten Überschrift. Sie dient dazu, Einleitungstext, Metadaten oder Kontext anzugeben, der nicht Teil eines Kapitels ist.

  • Beispiel

= Fragenkatalog
Thomas W. Stütz
1.0.0, {docdate}: Basiswissen für Programmieren und Projektentwicklung
:icons: font
:experimental:
:sectnums:
:source-highlighter: rouge
:docinfo: shared
:toc:
// https://fontawesome.com/v4.7.0/icons/
icon:file-text-o[link=https://github.com/2324-4bhif-wmc/2324-4bhif-wmc-lecture-notes/main/asciidocs/{docname}.adoc] ‏ ‏ ‎
icon:github-square[link=https://github.com/htl-leonding-college/fragenkatalog] ‏ ‏ ‎
icon:home[link=http://edufs.edu.htl-leonding.ac.at/~t.stuetz/hugo/2021/01/lecture-notes/]

:toc:

5.3. Admonitions Foundation

  • Was sind Admonitions?

Lösung
  • Admonitions (auch Hinweisboxen genannt) sind auffällige Informationsblöcke in AsciiDoc, die besondere Inhalte wie Warnungen, Tipps oder wichtige Hinweise hervorheben. Sie helfen, wichtige Stellen optisch hervorzuheben und besser verständlich zu machen.

Typische Admonitions sind:

  • NOTE: allgemeiner Hinweis

  • TIP: nützlicher Tipp

  • IMPORTANT: wichtige Info

  • WARNING: mögliche Probleme

  • CAUTION: Gefahr oder kritischer Fehler

Damit die Icons angezeigt werden, muss man in der Präambel setzen:
:icons: font

5.4. Callouts Foundation

  • Was sind Callouts?

Lösung

Kommentare für Code im Source-Block

Man unterscheidet zwischen:

  • automatische Callouts

    public class Main {
        public static void main(String[] args) {
            System.out.println("Hallo Welt"); // <.>
        }
    }
    <.> Print-Statement
  • manuelle Callouts

    public class Main {
        public static void main(String[] args) {
            System.out.println("Hallo Welt"); // <1>
        }
    }
    <1> Print-Statement

    Manuelle Callouts sind an verschiedenen Stellen wiederverwendbar.

Verwende die Kommentarzeichen der jeweiligen Programmiersprache.

5.5. Callouts und Kommentarzeichen Foundation

  • Wieso sind Callouts im Code mit einem Kommentarzeichen zu verwenden

Lösung
  • Wenn im Code eines Projektes Callouts verwendet werden, dann sind diese mit einem Kommentarzeichen zu kennzeichnen. Sonst würde der Code nicht mehr ausführbar sein.

  • Es sind die Kommentarzeichen der jeweiligen Programmiersprache zu verwenden.

Beispiel
docker compose -f docker-compose.yaml up #<.>
<.> Callout-Text
Result
docker compose -f docker-compose.yaml up (1)
1 Callout-Text

5.6. adoc in github-Environment Foundation

  • Wie kann man die Admonitions in github in einem README.adoc anzeigen lassen?

Lösung
    ifdef::env-github[]
    :tip-caption: :bulb:
    :note-caption: :information_source:
    :important-caption: :heavy_exclamation_mark:
    :caution-caption: :fire:
    :warning-caption: :warning:
    endif::[]

5.7. Nummerierung vermeiden Foundation

  • Wie kann man eine Überschrift von der Nummerierung ausnehmen?

Lösung
[discrete]
== Überschrift

5.8. Nummerierung der Überschriften Foundation

  • wie kann man die Überschriften nummerieren?

Lösung
:sectnums:
  • Wie werden Links in einem Asciidoctor-Dokument in neuen Tabs geöffnet?

Lösung

Man muss ein Caret (^) nach dem Link-Text einfügen.

Link[Text^]

5.10. Keyboard-Macro Foundation

  • Wie kann man ein Keyboard-Macro in Asciidoctor erstellen?

Lösung
1. In der Präambel experimental aktivieren
:experimental:
2. Im Text die Taste definieren
Drücken Sie die kbd:[RETURN]-Taste
result

Drücken Sie die RETURN-Taste

5.11. Seitenumbrüche in pdf-Dokumenten Foundation

  • Wie kann man einen Seitenumbruch in einem pdf-Dokument erzeugen?

Lösung

5.12. Tabellen Foundation

  • Wie erstellt man eine dreispaltige Tabelle mit Kopfzeilen im asciidoctor-Format?

Lösung
Variante 1:
|===
|Spalte 1 |Spalte 2 |Spalte 3

|Wert 1 - Spalte 1
|Wert 2 - Spalte 2
|Wert 3 - Spalte 3


|Wert 4 - Spalte 1
|Wert 5 - Spalte 2
|Wert 6 - Spalte 3
|===
Table 1. result
Spalte 1 Spalte 2 Spalte 3

Wert 1 - Spalte 1

Wert 2 - Spalte 2

Wert 3 - Spalte 3

Wert 4 - Spalte 1

Wert 5 - Spalte 2

Wert 6 - Spalte 3

Ohne Leerzeilen zwischen den Zeilen der Tabelle wird die Tabelle nicht korrekt dargestellt. Auch wird der Header ohne Leerzeile nicht erkannt.
Variante 2:
[cols="3,3,3", options="header"]
|===
|Spalte 1 |Spalte 2 |Spalte 3
|Wert 1   |Wert 2   |Wert 3
|Wert 4   |Wert 5   |Wert 6
|===
Table 2. result
Spalte 1 Spalte 2 Spalte 3

Wert 1

Wert 2

Wert 3

Wert 4

Wert 5

Wert 6

5.13. Aufzählung in Kleinbuchstaben [.badge.foundation]#Foundation

  • Wie kann man eine Aufzählung in Kleinbuchstaben erstellen?

5.14. Wie erstellt man zusammenklappbaren Text? [.badge.foundation]#Foundation

  • wie kann man Absätze erstellen, die man zusammenklappen kann, wie zB für Lösungen in diesem Dokument?

Lösung
 .Lösung
 [%collapsible]
 ====

 ...

 ====

6. UML

6.1. Class Diagrams

6.2. Object Diagrams

6.3. Deploymant Diagrams

6.4. Activity Diagrams

6.5. State Diagrams

7. Java

7.1. manifest.xml Foundation

8. Quarkus (Jakarta EE)

8.1. Was ist Quarkus? Advanced

8.2. JPA - Lifecycle einer entity Advanced

Lösung
  • An entity instance may be characterized as being new, managed, detached, or removed.

    • A new entity instance has no persistent identity, and is not yet associated with a persistence context.

    • A managed entity instance is an instance with a persistent identity that is currently associated with a persistence context.

    • A detached entity instance is an instance with a persistent identity that is not (or no longer) associated with a persistence context.

    • A removed entity instance is an instance with a persistent identity, associated with a persistence context, that is scheduled for removal from the database.

9. GitHub Classroom

9.1. Wie kann man ein GitHub Classroom Assignment erstellen? Foundation

Lösung
  1. Erstellen eines Repositories auf GitHub, das als Vorlage für das Assignment dienen soll. Dabei ist zu beachten:

    1. Dieses Repo muss sich in der GitHub-Organisation befinden, in der die Assignments erstellt werden sollen. z.B. Organisation 2526-4ahitm-itp, Repository-Name: 01-lab-keycloak

    2. Das Repository 01-lab-keycloak muss ein Template-Repository sein.

  2. Anschließend wird ein neues Assignment in GitHub Classroom erstellt. Das Template-Repository 01-lab-keycloak wird Vorlage ausgewählt.

github classroom assignment

9.2. Wie kann man in ein GitHub Classroom Assignment, das bereits von Schülern angenommen wurde, Änderungen einpflegen? Foundation

Lösung
  1. Änderungen im Template-Repository vornehmen, zB 01-lab-keycloak

  2. Anschließend das vom Template-Repository abgeleitete Repository clonen, zB 2526-4ahitm-itp-01-lab-keycloak-01-lab-keycloak

  3. In diesem Repository wird das Template als "upstream" hinzugefügt:

    git remote add template git@github.com:2526-4ahitm-itp/01-lab-keycloak.git
  4. Nun können die Änderungen aus dem Template-Repository in das Original-Repo zB 2526-4ahitm-itp-01-lab-keycloak-01-lab-keycloak geholt werden, von dem die Schüler das Assignment angenommen (fork) haben:

    git fetch template
    git status
    git merge template/main  --allow-unrelated-histories
    git status
    git add .
    git commit -m "fix instructions"
    git push origin main
    Es muss --allow-unrelated-histories angegeben werden, da die Historie des Template-Repositories und des Original-Repositories nicht zusammengeführt werden kann, da sie unterschiedliche Wurzeln haben. Es handelt sich ja um zwei verschiedene Repositories, die nicht voneinander abgeleitet sind, sondern nur den gleichen Code enthalten.
  5. Erstellen von Pull-Requests für die Schüler-Repositories, damit die Schüler die Änderungen in ihre Repositories übernehmen können.

    github classroom sync repos
  6. Jetzt könnnen die Schüler die Pull-Requests in ihren Repositories annehmen, um die Änderungen aus dem Template-Repository in ihre Repositories zu übernehmen.