‏ ‏ ‎ ‏ ‏ ‎

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. Man verwendet es z.B. wenn man im Feature-Branch einen Bug gefixt hat, aber das Feature noch nicht fertig ist.

Befehl:
git cherry-pick <Commit-Hash>

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. 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.8. 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.9. 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.10. 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.11. Starten von Docker Compose im Vordergrund Foundation

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

2.12. Starten von Docker Compose im Hintergrund Foundation

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

-d …​ detached mode

2.13. Stoppen von Docker Compose Foundation

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

2.14. Beenden von Docker Compose Foundation

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

2.15. Anzeigen der Logs von Docker Compose Foundation

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

2.16. postgres-Backup eines Containers Foundation

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

[TODO]: Hier sind noch die Lösungen einzutragen, für die Verwendung eines einzelnen Docker Containers und eines Datenbank-containers in einem docker-compose Verbund.

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

2.17. postgres-Backup in Container wiederherstellen Foundation

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

Lösung

2.18. .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.19. Umgebungsvariable in Docker-Compose setzen Foundation

  • Warum werden Umgebungsvariablen in docker compose verwendet?

2.20. 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.21. 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. Testfrage Advanced

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?

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

Wenn der Port 5432 auf lokalhost nicht verfügbar ist, kann ich den Port 5432 vom Server auch auf einen anderen Port von localhostweiterleiten, zB 5433.

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. 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.9. 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.

5. Java

5.1. manifest.xml Foundation

6. Asciidoctor

6.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:

6.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

6.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.

6.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

6.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::[]

6.7. Nummerierung vermeiden Foundation

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

Lösung
[discrete]
== Überschrift

6.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^]

6.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

6.11. Seitenumbrüche in pdf-Dokumenten Foundation

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

Lösung

6.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

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

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

== UML

=== Class Diagrams

=== Object Diagrams

=== Deploymant Diagrams

=== Activity Diagrams

=== State Diagrams