‏ ‏ ‎ ‏ ‏ ‎

1. Mitschriften [Simone]

2. 2024-10-01

  • Hanan: IoT/HA - Alarmierung für ältere PErsonen

  • Zangenfeind: Koordination für Müllsammeln

  • Projektarten

  • Stakeholder

  • Projektantrag

2.1. Test Driven development

2.1.1. Continous Testing

  • Grundprinzipien

    • Der Source-Code wird nur geändert, wenn ein Test fehlschlägt

    • Zuerst werden die Tests geschrieben, dann die Methoden implementiert.

    • Unit-Tests so einfach wie möglich.

    • Die Umsetzung in den Methoden ist so einfach wie möglich zu gestalten. MNur der Test soll grün werden. Auch wenn man weiß, dass man später noch refactoren muss.

  • Continous Testing

    • Nach Speichern des Codes, werden automatisch Tests durchgeführt

  • Stack

package at.htl;

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;

class MyStackTest {

    @Test
    void givenNewStack_ThenTheStackIsEmpty() {

        var myStack = new MyStack();
        //assertThat(myStack.isEmpty()).isTrue();
        assertTrue(myStack.isEmpty()); (1)

    }

    @Test
    void givenNewStack_whenPushingOneElement_thenStackIsNotEmpty() {
        var myStack = new MyStack(); // <.> // String-Stack
        myStack.push("hallo");
        assertFalse(myStack.isEmpty());
    }

    @Test
    void givenNewStack_whenPushingOneElementAndPoppingOneElement_thenStackIsEmpty() {
        var myStack = new MyStack(); (2)
    }
}

2.2. Coverage

coverage

3. 2024-10-08

3.1. Erstellen von Websites und Slides mit Asciidoctor

  1. Mit Template ein Repo erstellen

  2. Repo clonen

  3. Änderungen committen und pushen

  4. In gh-repo-settings den gh-pages branch auswählen

gh pages settings

3.1.1. Beispiele

*

3.2. Scrum

minimum viable product
  • Rapid Value Creation

  • Sprint Commitment ist unveränderbar

scrum team

4. 2024-10-21

4.1. Kreativitätstechniken

4.2. Stakeholder

  • Betroffener

4.3. Projektziele

projektziele
  • Operationalisieren: Einen abstrakten Begriff so in Teile zu zerlegen, die in Zahlen ausgedrückt werden können

    • Bsp: Wohlfühlen in einem Betrieb

      • Fluktuationsrate (Anzahl der Kündigungen in einem Zeitabschnitt)

      • Krankenstandstage

      • …​

  • Was ist Qualität? → Was der Kunde wünscht?

4.4. Projektabgrenzung (sachlich, zeitlich sozial)

5. 2024-10-22

5.1. Docker

  • Virtualisierung bezeichnet in der Informatik die Nachbildung eines Hard- oder Software-Objekts durch ein ähnliches Objekt vom selben Typ mit Hilfe einer Abstraktionsschicht. Dadurch lassen sich virtuelle (d. h. nicht-physische) Geräte oder Dienste wie emulierte Hardware, Betriebssysteme, Datenspeicher oder Netzwerkressourcen erzeugen. Dies erlaubt es etwa, Computer-Ressourcen (insbesondere im Server-Bereich) transparent zusammenzufassen oder aufzuteilen, oder ein Betriebssystem innerhalb eines anderen auszuführen. Dadurch können u. a. mehrere Betriebssysteme auf einem physischen Server oder „Host“ ausgeführt werden.[wikipedia]

docker volumes

6. 2024-11-04

7. 2024-11-11

7.1. Git Branching Strategy

8. Git branching strategy

8.1. Was ist ein git branch?

  • Ein Git-Branch ist eine unabhängige Version eines Repositories, die es ermöglicht, an neuen Features oder Fixes zu arbeiten, ohne den Hauptcode (meistens im master- oder main-Branch) zu stören. Nach Abschluss der Arbeiten kann der Branch zurück in den Hauptbranch gemergt werden, um die Änderungen zu integrieren.

  • Git branching strategy diagrams

  • Der main-Branch ist immer lauffähig

  • Die Entwicklung der Features findet auf feature Branches statt.

github flow
BEACHTE
  • Vor jedem Arbeiten:

    • git pull

    • git merge main (die Änderungen des main-branches werden in den aktuellen branch )

  • Nach jedem Arbeiten

    • git commit -m ""

    • git push origin feat/xxx

  • Beurteilungkriterien:

    • Anzahl der Commits (Insights)

    • Anzahl der feature-Branches

    • Qualität der Commit-Messages

      • Issue-Nummer

      • Existenz eines Tasks (Issue) zu jedem Commit

9. 2024-11-12

9.1. Aufbau des Projektrepos

aufbau projektrepo
BEACHTE
  • Nur ein .git-Verzeichnis im Repo

  • .gitignore im repo-root

  • Termin

    • 19.Nov.2024

      • Datenmodell (plantuml-class-diagram)

      • User-Stories (mind. 5)

      • User-Stories und Datenmodell als revealjs-slides (siehe README.adoc)

      • Projekt-Repo einrichten

10. 2024-11-19 [Hanan]

effektivitaet effizienz

10.1. Anforderungserhebung (Buch)

10.1.1. Interview

10.1.2. Beobachtung

10.1.3. Fragebogen

10.1.4. Dokumentenanalyse

10.2. Pflichtenheft (Buch)

v modell
  • Übung: Für Projekte ein Pflichtenheft im asciidoc - Format erstellen

10.3. Docker-Grundlagen

10.4. Was ist Docker?

  • Eine Technologie , um eine Application und alle ihre Abhängigkeiten in einen einzelnen , leicht zu transportierenden Container zu packen.

  • Wird eine Applikation in einem Docker-Container gepackt, so ist sichergestellt , dass die Laufzeitumgebung unverändert bleibt, auch wenn der Container auf einem anderen Hostsystem läuft.

10.5. Wie funktioniert Docker?

image 2024 12 14 00 53 54 579
  • Dockerfile: Dies ist eine Textdatei, die Anweisungen enthält , um ein Docker-Image zu erstellen.(Kochrezept zum Erstellen des Images).

  • docker build:

    • Mit diesem Befehl wird aus dem Dockerfile ein Docker-Image erstellt. Dieses Image hat alle notwendigen Datien und Abhängigkeiten , um eine Anwendung auszuführen.

docker build
  • Docker Registry: Bibliothek oder Lager , wo Docker-Images gespeichert und verwaltet werden.

  • docker pull: Man holt sich mit diesem Befehl ein Docker-Image aus der Docker-Registry.(herunterladen oder pullen)

docker pull
  • docker run: Mit docker run wird aus dem Docker Image ein Docker Container gestartet. Ein Docker Container ist die laufende Instanz eines Docker Images.

docker run

10.6. Leichtgewichtige Virtualisierung VS Schwergewichtige Virtualisierung

Leichtgewichtige Virtualisierung

Schwergewichtige Virtualisierung

Die beiden OS sind nicht unabhängig und müssen den selben Kernel benutzen. z.b Linux/Linux, verlangt aber weniger Ressourcenutzung.

Beispiele: Docker,Podman

Die beiden OS sind völlig unabhängig und können verschieden sein.

Beispiele: Virtual Box, vmWare

image 2024 12 14 01 03 56 506

10.7. Docker Registries

  • ist ein Remote-Repository zum Abspeichern von Docker Images

  • kann privat und öffentlich(public) sein

10.8. Docker Image

  • Ein Docker Image enthält alle notwendigen Dateien, Einstellungen und Abhängigkeiten , um eine Anwendung auszuführen.

10.9. Docker Container

  • Ein Docker Container ist die laufende Instanz von einem Docker Image und wird mit docker run erstellt

10.10. Docker-Wiederholung

10.10.1. Image

10.10.2. Container

10.10.3. Volume

  • Bits and Bytes, die man schreiben und lessen kann (→ File)

  • 2 Arten von Volumes:

    • bind mount

    • volume

10.10.4. BuildContext

  • Der Docker Build Context ist der Satz von Dateien, die Docker benötigt, um ein Docker-Image zu erstellen. Wenn Sie den Befehl docker build ausführen, übergeben Sie Docker einen Pfad zu einem Verzeichnis als Build Context. Docker sendet dann den Inhalt dieses Verzeichnisses (rekursiv) an den Docker-Daemon.

  • Der Build Context enthält typischerweise die Dockerfile und alle Dateien, die in der Dockerfile referenziert werden, wie z.B. Quellcode, Konfigurationsdateien und Abhängigkeiten.

    Beispiel:
    docker build -t my-image:latest .
  • In diesem Beispiel ist das aktuelle Verzeichnis (.) der Build Context. Docker wird alle Dateien und Unterverzeichnisse im aktuellen Verzeichnis an den Docker-Daemon senden, um das Image zu erstellen.

10.10.5. mount

  • ein Volume wird gemountet

10.10.6. Registry

10.10.7. Dockerfile

10.10.8. port

10.11. docker compose

  • One Service - one docker container

11. 2024-12-04

12. 2024-12-17 [Hanan]

12.1. Beziehungen - Assoziation

  • Die Assoziation zwischen einem Akteur und einem Anwendungsfall wird durch eine einfache Linie dargestellt. Diese Linie symbolisiert die Interaktion, jedoch keine Datenflussrichtung.

  • Beispiel:

    • Ein Benutzer interagiert mit einem System, z. B. ein Kunde führt eine Bestellung durch.

12.2. Use case

  • Ein Beispiel für einen Use Case:

    • Ein Kunde kauft ein Auto.

  • Grund:

    • Der Kunde benötigt ein Transportmittel, um Güter von A nach B zu befördern.

12.3. includes vs extends

  • extends

    • Wird verwendet, wenn ein Anwendungsfall optional erweitert werden kann. Beispiel: 'Registrierung abschließen' kann optional 'Gutschein anwenden' erweitern.

  • include

    • Wird verwendet, wenn ein Anwendungsfall zwingend einen anderen Anwendungsfall beinhaltet, um korrekt zu funktionieren. Beispiel: 'Zahlung verarbeiten' beinhaltet zwingend 'Rechnungsdetails prüfen'.

12.4. Zustandsmaschine

  • Eine Zustandsmaschine zeigt die verschiedenen Zustände eines Objekts und die möglichen Übergänge zwischen diesen Zuständen.

  • Ein Fußballspiel kann mehrere Zustände haben

    • In Vorbereitung - Startzustand, z.B. Mannschaften werden aufgestellt.

    • Ablauf - Das Spiel wird gespielt.

    • Abbruch - Das Spiel wird vorzeitig beendet.

    • Pause - Halbzeitpause

    • Abschluss - Endzustand, z.B.Spielende

13. 2025-01-14 Use-Cases

  • CLD bereits erläutert

  • Anwendungsfalldiagramme bis Folie 12

14. 2025-02-04

14.1. Entwurfsentscheidungen

14.1.1. Schritt 1: Erarbeiten des Zielsystems

  • Was ist mir wichtig?

  • Bsp: Auswahl einer Datenbank für Ermittlung eines Produkts zu einem gewissen EAN-Code

    • kostenfrei

    • Zugriff über API möglich

    • keine Zugriffsbeschränkungen (möglichst viele Anfragen pro Tag)

    • möglichst viele Produkte sollen enthalten sein

    • ev. Eintragen eigener (neuer) Produkte

14.1.2. Schritt 2: Recherche für möglich Optionen (in unserm Bsp Datenbanken)

14.1.3. Schritt 3: Bewertung der Optionen

Alternativen ist kostenfrei Zugriff über API viele Produkte verfügbar Entscheidung

opengtindb

ja

ja

hoffentlich

X

ean-search

nein

ja

k.A.

15. 2025-02-11

disjunkt ueberlappend

16. 2025-02-25 Docker

16.1. nginx mit Docker

  • Aufgabenstellung: ein nginx-Image mittels Docker starten.

docker image ls

docker pull nginx

# mit Bind Mount
docker run --name nginx \
           --rm \
           -v $PWD/www-data:/usr/share/nginx/html \
           -p 8080:80 \
           -d nginx:1.27-alpine

docker container stop nginx && docker container rm nginx

# Mit Docker Volume
docker run --name nginx \
           --rm \
           -v www-data:/usr/share/nginx/html \
           -p 8080:80 \
           -d nginx:1.27-alpine

docker exec -it nginx /bin/ash

docker cp www-data/index.html nginx:/usr/share/nginx/html
Nur der root user darf Ports unter 1000 verwenden, daher verwenden wir 8080

17. 2025-03-04 Dockerfile

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello Chris!");
    }

}
FROM eclipse-temurin:21

COPY Main.java /usr/local/src/
WORKDIR /usr/local/src/
RUN javac Main.java
CMD ["java","Main"]
docker build --tag hello-chris .  # Bauen des Images anhand des Dockerfiles
docker run hello-chris            # Starten des Container mir dem gebauten Image

17.1. Vereinbarung

  • Programmieren einer User Story

  • Erstellen eines Docker Container

    • Erstellen eines Verezichnisses compose im project-root

    • Erstellen eines Dockerfiles für ein beliebiges maven-PRojekt mit Textausgabe

      • Verwenden des maven-Images

      • mvn package

      • Java-Programm - gibt das Datum und die Uhrzeit auf der Console aus und gibt an ob das aktuelle Jahr ein Schaltjahr ist und wann das nächste Schaltjahr ist.

18. 2025-03-10

19. 2025-03-11

19.1. Automatisiertes Testen

tests ebenen
v modell
testplan

19.2. Docker

19.2.1. Lab

  • Das Dockerimage des Nachbarn ausführen

    • Multistage-Build mit 2 Stages

Sämtliche Files werden in das Docker-Image kopiert, daher ist es wichtig, dass nur die notwendigen Files im Build-Context sind.
FROM eclipse-temurin:21 AS builder

COPY Main.java /usr/local/src/
WORKDIR /usr/local/src/
RUN javac Main.java
CMD ["java","Main"]

# Build the image
FROM eclipse-temurin:21
RUN mkdir -p /opt/app
COPY --from=builder /usr/local/src/*.class /opt/app/
WORKDIR /opt/app/
CMD ["java","Main"]
docker build --tag hello-chris .
Einloggen auf der GitHub Container Registry
docker login ghcr.io
docker build --tag ghcr.io/htl-leonding/hello-world-chris:latest .
docker image ls
result
REPOSITORY                                  TAG           IMAGE ID       CREATED          SIZE
ghcr.io/htl-leonding/hello-world-chris      latest        bf8419a868f2   14 seconds ago   478MB
...
github create token
docker push ghcr.io/htl-leonding/hello-world-chris:latest
github packages
docker run ghcr.io/htl-leonding/hello-world-chris:latest
result
Hello Chris!

20. 2025-03-18

20.1. Microservices

  • Package by Feature als Vorstufe zu microservices.

  • Microservices: Eine Applikation wird fachl,ich in mehrere kleinere (unabhängige) Services aufgeteilt. Eine Koordinationsschicht ermöglicht die Kommunikation zwischen den Services.

20.2. Verteilungsdiagramm (Deployment Diagram)

  • Stellt dar, auf welcher Hardware welche Softwarekomponenten laufen.

20.3. Docker Compose

  • Dient der "Orchestrierung" von mehreren Containern.

  • Beispiel: Ein Webserver benötigt eine Datenbank. Mit Docker Compose können beide Container gestartet werden.

  • https://docs.docker.com/compose

21. 2025-03-24

21.1. assertj-db

tests in projekten
  1. Dependency in pom.xml eintragen

<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-db</artifactId>
    <version>3.0.0</version>
    <scope>test</scope>
</dependency>
  1. jdbc-Verbindung von unserer Testklasse zur Datenbank erstellen

private final static DataSource dataSource = Database.getDataSource();
// ...
var conn = AssertDbConnectionFactory.of(dataSource).create();
  1. den Inhalt der Datenbanktabelle auf der Console ausgeben

import org.assertj.db.type.Table;
import static org.assertj.db.output.Outputs.output;
//...
Table contactTable = conn.table("contact").build();
output(contactTable).toConsole();
  1. einen Vergleich durchführen

assertThat(contactTable).row(0)
        .value("c_name").isEqualTo("John Doe")
        .value("c_email").isEqualTo("john.doe@fmail.com")
        .value("c_dob").isEqualTo(LocalDate.of(1990, 6, 23))
        .value("c_id").isEqualTo(1);
    @Test
    void t010_createGroups_Ok() {
        // Arrange
        groupRepository.deleteAll();

        // Act
        Map<Character, Group> groups = t.createGroups("ABCDEF");

        // Assert
        // check table
        Table table = new Table(ds, "T_GROUP");
        output(table).toConsole();
        assertThat(table).hasNumberOfRows(6)
                .column("G_GROUP")
                .value().isEqualTo('A')
                .value().isEqualTo('B')
                .value().isEqualTo('C')
                .value().isEqualTo('D')
                .value().isEqualTo('E')
                .value().isEqualTo('F');

        // check Map
        org.assertj.core.api.Assertions.assertThat(groups).hasSize(6);
        org.assertj.core.api.Assertions.assertThat(groups).containsOnlyKeys('A', 'B', 'C', 'D', 'E', 'F');
        org.assertj.core.api.Assertions.assertThat(groups.values())
                .usingElementComparator((t1, t2) -> t1.groupLetter.compareTo(t2.groupLetter))
                .contains(
                        new Group('A'),
                        new Group('B'),
                        new Group('C'),
                        new Group('D'),
                        new Group('E'),
                        new Group('F')
                );

    }

22. 2025-04-01

23. 2025-04-08

23.1. wie kann man in Projekten REST-api’s verwenden?

  • api’s können abgefragt werden mittels:

    • Browser (eher nur GET)

    • standalone-Applikationen wie Postman und Insomnia

    • (Java-)Programme mittels http-client

    • curl und httpie (cli)

      • curl "http://opengtindb.org?ean=4337256824132&cmd=query&queryid=400000000"

      • http "http://opengtindb.org?ean=4337256824132&cmd=query&queryid=400000000"

    • REST-assured (Test-Framework)

    • REST-client (IDEA-Plugin oder auch für VSCode)

    • Browser-Plugin für REST

23.2. Marshalling / Unmarshalling

Java-Objekt -→ JSON-String : Marshalling JSON-String -→ Java-Objekt : Unmarshalling

24. Docker Context

  • In der pom.xml muss das manifest konfiguriert werden, damit die Main-Klasse gefunden wird.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>at.htl</groupId>
    <artifactId>webserver</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>at.htl.ServerSingleThreaded</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>

    </build>

</project>
  • beim Erstellen eines Docker Images ist darauf zu achten, dass der Build Context korrekt ist.

  • Sämtliche Files werden vom Build Context in die Docker Ausführungsumgebung kopiert.

  • Mit COPY werden dann die Files von dem Build Context in das Docker Image kopiert.

build - command
docker build --tag webserver --file src/main/docker/Dockerfile .
Dockerfile
FROM maven:3.9.9-eclipse-temurin-21 AS builder

ARG MAIN_CLASS=ServerSingleThreaded

COPY src/main/java/at/htl/$MAIN_CLASS.java /usr/local/src/
WORKDIR /usr/local/src/
RUN javac $MAIN_CLASS.java
CMD ["java", "$MAIN_CLASS"]

# Build the image
FROM eclipse-temurin:21
RUN mkdir -p /opt/app
COPY --from=builder /usr/local/src/*.class /opt/app/at/htl/
WORKDIR /opt/app
CMD ["java","at.htl.ServerSingleThreaded"]
open Interactive Terminal
docker run --rm -it webserver /bin/bash
run server
docker run --rm -p 8080:8080 --name webserver webserver

25. 2025-04-29

  • Zuerst wird für jedes Softwareprodukt eine eigene docker-compose.yaml Datei erstellt.

  • Anschließend werden diese Docker-Compose-Dateien in eine gemeinsame Datei zusammengeführt und dort koordiniert ausgeführt.

postgres.yaml
services:
  postgres:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
      POSTGRES_DB: db
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready" ]
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:
Vor der Arbeit mit docker compose ins Verzeichnis wechseln, in dem das docker-compose.yaml File liegt.
starten von docker-compose
;docker compose -f ../compose/postgres.yaml up
Welche Container laufen in docker-compose?
docker compose ls
Einloggen in einen laufenden Container
 docker compose --file=postgres.yaml exec -it postgres bash
Testweise Datenbank dumpen (ein Backup erstellen)
PGPASSWORD=app pg_dump --username=app db
  • PGPASSWORD=app ist eine Umgebungsvarianble, die für den nachfolgenden Aufruf von pg_dump zur Verfügung steht.

Backup einer PostgreSQL-Datenbank (dump)
docker compose --file=postgres.yaml exec -it postgres pg_dump --username=app db | gzip > sql.gz
  • Ergebnis ist ein gzip-komprimiertes File mit dem Namen sql.gz

26. 2025-05-19

26.1. Reverse-Proxy

26.2. 2025-05-20

netstat -ant | grep 5432
result
tcp46      0      0  *.5432                 *.*                    LISTEN
fd2f59fb6fe26d56 stream      0      0 8611bcf93543214b                0                0                0 /var/run/pppconfd
  • Der * bedeutet, dass der Port auf alle Netzwerk-Interfaces horcht.

  • bei Linux würde -antp auch die dazugehörigen Prozesse anzeigen.

netstat -antp
Result
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:30631         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.54:53           0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp6       0      0 127.0.0.1:45323         :::*                    LISTEN      17575/./jetbrains-t
tcp6       0      0 127.0.0.1:52829         :::*                    LISTEN      17575/./jetbrains-t
tcp6       0      0 :::22                   :::*                    LISTEN      -
tcp6       0      0 ::1:631                 :::*                    LISTEN      -
 netstat -ant | grep LISTEN
result
tcp46      0      0  *.5432                 *.*                    LISTEN
tcp46      0      0  *.6000                 *.*                    LISTEN
tcp6       0      0  *.53                   *.*                    LISTEN
tcp4       0      0  *.53                   *.*                    LISTEN
tcp4       0      0  127.0.0.1.61559        *.*                    LISTEN
tcp4       0      0  127.0.0.1.7239         *.*                    LISTEN
tcp4       0      0  127.0.0.1.61549        *.*                    LISTEN
tcp4       0      0  127.0.0.1.26621        *.*                    LISTEN
...
tcp4       0      0  127.0.0.1.49211        *.*                    LISTEN
tcp4       0      0  127.0.0.1.9151         *.*                    LISTEN
tcp4       0      0  *.57621                *.*                    LISTEN
tcp4       0      0  127.0.0.1.1025         *.*                    LISTEN
tcp4       0      0  *.88                   *.*                    LISTEN
tcp6       0      0  *.88                   *.*                    LISTEN
tcp4       0      0  127.0.0.1.8021         *.*                    LISTEN
tcp6       0      0  ::1.8021               *.*                    LISTEN
tcp4       0      0  *.445                  *.*                    LISTEN
tcp6       0      0  *.445                  *.*                    LISTEN
  • Hier sieht man, dass manche Ports nur von intern (localhost) angesprochen werden können.

  • bei MacOS würde man folgenden Befehl verwenden:

 lsof -i -P -n | grep LISTEN
Result
rapportd    606 stuetz    8u  IPv4 0xb6e2667869e70684      0t0    TCP *:50607 (LISTEN)
rapportd    606 stuetz   12u  IPv6 0x889aaa34d19a9844      0t0    TCP *:50607 (LISTEN)
ControlCe   777 stuetz    8u  IPv4 0x61d2a85b9b674e58      0t0    TCP *:7000 (LISTEN)
ControlCe   777 stuetz    9u  IPv6 0x452349c57bc733f0      0t0    TCP *:7000 (LISTEN)
ControlCe   777 stuetz   10u  IPv4 0x3b84959d8ee716c8      0t0    TCP *:5000 (LISTEN)
ControlCe   777 stuetz   11u  IPv6 0x26c0035d85e7504a      0t0    TCP *:5000 (LISTEN)
Spotify     929 stuetz   78u  IPv4 0xe4fbdca9704406b8      0t0    TCP *:57621 (LISTEN)
Spotify     929 stuetz   82u  IPv4 0x48d0e223be6fb0c6      0t0    TCP *:50597 (LISTEN)
FinderSyn   957 stuetz    3u  IPv4 0x9c9117e56e3bd34f      0t0    TCP 127.0.0.1:1025 (LISTEN)
jetbrains  1128 stuetz  103u  IPv6 0xbb8988425aee7c3f      0t0    TCP 127.0.0.1:49274 (LISTEN)
jetbrains  1128 stuetz  267u  IPv6 0xaf1596bddf6de4f0      0t0    TCP 127.0.0.1:52829 (LISTEN)
Dropbox    1132 stuetz  154u  IPv4 0x81dd39f69271770e      0t0    TCP 127.0.0.1:17600 (LISTEN)
Dropbox    1132 stuetz  155u  IPv4 0x4e68170e700218e2      0t0    TCP 127.0.0.1:17603 (LISTEN)
tor        1138 stuetz    6u  IPv4 0xd162863dccd6f047      0t0    TCP 127.0.0.1:9151 (LISTEN)
tor        1138 stuetz   11u  IPv4 0x7a379cd8dd421acb      0t0    TCP 127.0.0.1:9150 (LISTEN)
cloud-dri  1170 stuetz    4u  IPv4 0x37958c0585a9a952      0t0    TCP 127.0.0.1:49211 (LISTEN)
cloud-dri  1170 stuetz   10u  IPv4 0x5137ea581752d249      0t0    TCP 127.0.0.1:50634 (LISTEN)
idea       6925 stuetz   32u  IPv6 0xfa4db57756db584c      0t0    TCP 127.0.0.1:63343 (LISTEN)
embedding  7573 stuetz    5u  IPv6 0x8d634d0b00a6be49      0t0    TCP [::1]:52870 (LISTEN)
embedding  7573 stuetz    6u  IPv6  0x6304b015ccbac77      0t0    TCP 127.0.0.1:52870 (LISTEN)
TextMate  72369 stuetz   15u  IPv6 0x9d3a1c4167f22dd0      0t0    TCP [::1]:52698 (LISTEN)
Google    78808 stuetz   44u  IPv6 0x5b7c244ead49ed28      0t0    TCP [::1]:7679 (LISTEN)
idea      81281 stuetz   15u  IPv6 0x41a6de76702cdc4d      0t0    TCP 127.0.0.1:63342 (LISTEN)
idea      81281 stuetz  571u  IPv6 0x4b51db0cf7be0613      0t0    TCP 127.0.0.1:61912 (LISTEN)
embedding 81895 stuetz    5u  IPv6  0x56b4f81ee5b74a4      0t0    TCP [::1]:59523 (LISTEN)
embedding 81895 stuetz    6u  IPv6 0xcb0112bbb40a43d0      0t0    TCP 127.0.0.1:59523 (LISTEN)
adb       99562 stuetz    8u  IPv4 0x80ca7d7734ab36f4      0t0    TCP 127.0.0.1:5037 (LISTEN)

26.2.1. Umbauen von Multistage zu lokalem Bauen

  • Grund: Dependencies können im Docker build nicht gecached werden.

27. 2025-05-27

docker compose -f webserver.yaml up --build
beobachten der einzelnen Container
watch docker compose ps

watch …​ führt das Kommando wiederholt aus

result
Every 2.0s: docker compose ps                                                                                         Toms-MBP-2022.local: 09:30:58
                                                                                                                                      in 0.089s (0)
NAME                  IMAGE       COMMAND                  SERVICE     CREATED              STATUS                        PORTS
compose-postgres-1    postgres    "docker-entrypoint.s…"   postgres    About a minute ago   Up About a minute (healthy)   0.0.0.0:5432->5432/tcp
compose-webserver-1   webserver   "/__cacert_entrypoin…"   webserver   About a minute ago   Up About a minute             0.0.0.0:8080->8080/tcp

28. 2025-06-03

28.1. Übung

  • Erstellen eines Java-Webservers, der auf eine Datenbank zugreift.

  • Aus der Datenbank werden die Daten einer Tabelle ausgelesen und als html-table dargestellt.

  • Es ist ein Tabelle GREETING zu erstellen mit den Spalten:

    • ID (integer, primary key)

    • GREETING_TEXT (varchar(255)) zB "Hallo Welt", "Hallo Chris", "Hallo Hanan"

  • Aufruf mit http://localhost:8080/greeting/1 -→ "Hallo Welt"

  • Aufruf mit http://localhost:8080/greeting/2 -→ "Hallo Chris"

  • Aufruf mit http://localhost:8080/greeting/3 -→ "Hallo Hanan"

  • Die Datenbank ist eine Postgres-Datenbank, die in einem Docker-Container läuft.

  • Bauen Sie anschließend eine gh-actions-pipeline, die ein Docker-Image des Webservers baut und dieses in der GitHub Container Registry speichert.

28.2. gh-actions

dig . ns
dig htl-leonding.at ns
dig htl-leonding.atdir at ns ns
dig at ns
dig ac.at ns
dig htl-leonding.at ns
dig www.htl-leonding.at ns
dig www.htl-leonding.ac.at ns
cd compose
docker compose ps
docker compose up
watch docker compose ps
cd compose
watch docker compose ps
cd compose
docker compose exec -it webserver bash
git status
git add .
git commit -m "docker compose fertig"
git remote add origin git@github.com:htl-leonding/docker-monorepo-3ahitm.git
git branch -M main\ngit push -u origin main
mkdir -p .github/workflows
git status
git add .
git status
git commit -m "Erste pipeline erstellt"
git push origin main
git commit -m "Java in gh-runner"
git add .
git commit -m "Java in gh-runner"
git push origin main
git add .
git push origin main
git add .
git commit -m "Java in gh-runner"
git push origin main
cd webserver
mvn --batch-mode package --file pom.xml
history
cat ~/.zsh_history

29. 2025-06-10