1. 2021-09-28 (Dienstag)

Prof. Aberger anwesend

  • Linux shell commands

32  echo $PATH
   33  ll
   34  echo Hello World
   35  echo $USER
   36  set
   37  env
   38  set | more
   39  env | grep BASH
   40  env | grep HOSTNAME
   41  env
   42  set | grep BASH
   43  set | grep HELLO
   44  set | grep SURFACE
   45  SURFACE=TOMTAILOR
   46  set | grep SURFACE
   47  ll
   48  where java
   49  which java
   50  ls -l /usr/bin
   51  ls -l /etc/alternatives
   52  ls -l /etc/alternatives/java
   53  sudo update-alternatives --config java
   54  sudo apt install openjdk-11-jdk
   55  sudo update-alternatives --config java
   56  java -version
   57  sudo update-alternatives --config java
   58  java -version
   59  which java
   60  docker version

2. 2021-10-05 (Donnerstag)

(1 EH entfallen)

  • Datenmodellierung: Bsp: Motel

motel angabe
cld motel
Figure 1. CLD Motel (noch nicht fertig)

3. 2021-10-05 (Dienstag)

Prof. Aberger anwesend

3.2. Docker Einführung

Eintragen des docker-Users in die docker-group
   68  docker version
   69  sudo docker version
   70  sudo docker run hello-world
   71  sudo groupadd docker
   72  sudo usermod -aG docker $USER
   73  docker run hello-world
   76  newgrp docker
   77  docker run hello-world
   78  docker run docker/whalesay Hallo 3BHITM

4. 2021-10-07, Do.

  • Projektarten

5. 2021-10-14, Do.

  • Projektantrag (project proposal)

  • Vorstudie

  • Machbarkeitsstudie

  • Projektauftrag (project order)

5.1. Projektziele

magisches dreieck
  • Kann durch Qualität erweitert werden.

6. 2021-10-19

6.1. Prof. Aberger: gh-actions

7. 2021-10-21

  • Linux repariert

  • abgegebene Projektanträge besprochen

8. 2021-11-09 (Prof. Aberger)

8.1. Build-Tools: maven

Source: .java → .class → .jar (gezipt)

java -jar MyClass

8.1.1. Was ist ein tar-Archiv

  • Was ist ein .tar.gz

    • tape archive (kommt von den Bandlaufwerken)

    • ist nicht komprimiert (nur Verzeichnisstruktur)

    • mit gzip wird komprimiert

tar -xzf xxx.tar.gz

8.1.2. WSL2

  • öffnen des Explorers

  • in Leiste //wsl$ eingeben

oder

  • Windows-Terminal downloaden vom Microsoft Store

  • installieren

  • öffnen

  • dann einfach explorer eingeben

8.1.3. Installation von maven

Verschieben ins opr-verzeichnis
sudo mv /<username>/Download/apache-maven-3.8.3-bin.tar.gz /opt
Entpacken im opt
sudo tar -xzf apache-maven-3.8.3-bin.tar.gz
Umbenennen des Folders zu maven
mv apache-maven-3.8.3 maven
 cat maven-env.sh
 ./maven-env.sh
 echo $MAVEN_HOME
 source ./maven-env.sh
 echo $MAVEN_HOME
 cd /opt
 echo $MAVEN_HOME
 . ./maven-env.sh
 echo $MAVEN_HOME
 cd /opt
 . maven-env.sh
 . ./maven-env.sh
 echo $MAVEN_HOME
 env
 echo $MAVEN_HOME
 . ./maven-env.sh
 echo $PATH
 nano maven-env.sh
 . ./maven-env.sh
 echo $PATH
 mvn -version
#aufrufen mit: source maven-env.sh
export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH

8.2. Erstellen eines Projekts mit maven

9. 2021-11-11

9.1. Reverse Engineering

reverse engineering

9.2. Projektthemen

Projekt Team

Diagramm-Generator

Eder Moritz, Al Sabagh A., Angerer Mona

Uno-Kartenspiel

Spindler Thomas, Reiter Lydia, Just Elias, Thaller David, Lautischer

Kino Reservierung

Schatzberger Oliver, Klose Peter, Lummerstorfer Lukas, Hager Sebastian

Versteigerungs-programm

Jaklitsch Julian, Scharrer Raphael, Goldmann Pascal, Mihaescu Teofan

Fragebogen-Programm

Weinhäupl, (Knoll), (Horner), (Brunner)

10. 2021-11-16 Maven Fortsetzung

10.1. Multimodule

  • Die Packages im Java-Code werden beim compilieren in einer Verzeichnisstruktur abgebildet

packages

10.2. Semantische Versionierung

  • z.B. 5.3.2

    • 5 → Major-Version

    • 3 → Minor-Version

    • 2 → Patch

Auf Grundlage einer Versionsnummer von MAJOR.MINOR.PATCH werden die einzelnen Elemente folgendermaßen erhöht:

  • MAJOR wird erhöht, wenn API-inkompatible Änderungen veröffentlicht werden,

  • MINOR wird erhöht, wenn neue Funktionalitäten, welche kompatibel zur bisherigen API sind, veröffentlicht werden, und

  • PATCH wird erhöht, wenn die Änderungen ausschließlich API-kompatible Bugfixes umfassen.

Außerdem sind Bezeichner für Vorveröffentlichungen und Build-Metadaten als Erweiterungen zum MAJOR.MINOR.PATCH Format verfügbar.

10.3. XML

  • Extensible Markup Language

  • vergleichbar mit HTML

    • es gibt Anfangs- und Ende-Tags

    • allerdings kann ich meine eigenen Tags verwenden

  • Mit Parsern (Syntaxanalysatoren) kann man XML-Files gut lesen

10.4. pom.xml

  • ist deklarativ (nicht imperativ)

  • Das Projektergebnis wird beschrieben und nicht der Weg dorthin.

11. 2021-11-18

12. Projektauftrag kontrolliert

13. UML Klassendiagramm

13.1. Multiplizität

  • Es gibt 2 Arten:

    • Multiplizität i.S.v

      • Eine Klasse kann 0 Instanzen haben → Utility-Klasse

      • Eine Klasse kann ein Objekt haben → Singleton

      • Eine Klasse kann mehrere Objekte instanzieren

    • Multiplizität i.S.v

      • einer Kardinalität bei Datenbanken

        kardinalitaet

14. Notationen

Notation Beispiel

PascalCase

NetworkController

CamelCase

networkController

SnakeCase

network_controller

KebabCase

network-controller

15. 2021-12-07

16. 2021-12-09 (Donnerstag)

16.1. UML-Klassendiagramm (Testverbesserung)

test01cld
Skipper(Vorname, Nachname, ...)
Segler(...)
Bei Generalisierung noch complete / incomplete und disjoint/overlapping besprechen

16.2. Buch Kapitel 2: Projektbegründung wiederholt

16.3. Buch Kapitel 3: Projektorganisation fertig

17. 2021-12-16

17.1. Was ist Asciidoctor?

17.1.1. Problemstellung

  • Dokumentationen für Software Projekte werden oft in binären Formaten wie MS-Word, LibreOffice usw erstellt.

  • Problem dabei ist, dass die Versionierung solcher Dokumente nur eingeschränkt möglich ist.

  • Besser wäre:

    • wenn sämtliche Dokumentation als Text vorliegt

    • auch sollte die Dokumentation von Softwaresystemen direkt aus dem Code generiert werden

17.1.2. Lösung

  • Verwendet man solche Auszeichnungssprachen wie Markdown, plantuml und Asciidoctor / Asciidoc so spricht man von "doc-as-code"

    • Die Dokumentation wird nicht mit eigenen Werkzeugen (Textverarbeitung, Zeichenprogramm usw. erstellt), sondern in der IDE, in der auch die Programme erstellt werden

17.1.3. Umsetzung

Markdown
  • Für markdown gibt es eigene Tools z.B. MacDown für MacOS, Notion als Browser-Plugin, bzw Plugins für sämtliche IDEs z.B. VSC, intellij, usw

  • markdown wird in github und in wikis wie z.B. der wikipedia verwendet

  • Nachteile:

    • beschränkte Möglichkeiten → daher ist es schwieriger umfangreiche Dokumente zu erstellen

  • Vorteile:

    • beschränkte Möglichkeiten → daher nicht so schwer zu lernen

17.1.4. Deployment

  • Asciidoctor kann local installiert werden (Das wird nicht empfohlen)

  • Besser mit Docker

    • Für lokales Arbeiten, das IDE-Plugin verwenden zB für intellij

    • für das Deployment verwendet man

      • entweder Docker

      • oder github-actions

18. 2021-12-21

18.1. Übung: Branching, Merging

History 21.12.21 Eder:
368 pwd
  369  cd
  370  ls .ssh
  371  ls -l
  372  ls -l .ssh
  373  gedit .ssh/id_rsa.pub
  374  cd 3bhitm-labs-eder/
  375  git status
  376  cd ..
  377  rm -rf 3bhitm-labs-eder/
  378  ll
  379  mkdir work
  380  cd work/
  381  git clone git@github.com:EderMoritz/3bhitm-labs-eder.git
  382  cd 3bhitm-labs-eder/
  383  ld
  384  ls
  385  gedit README.md
  386  git status
  387  git add README.md
  388  git status
  389  git commit -m "test merge"
  390  git status
  391  git push
  392  git pull
  393  git config pull.rebase false
  394  gedit README.md
  395  git add .
  396  git commit -m "update README"
  397  git push
Reiter Lydia
775  cd 3bhitm-labs-eder/
  776  gedit README.md
  777  git pull
  778  gedit README.md
  779  git add .
  780  git commit -m "change read.me"
  781  git push
  782  cd ..
  783  rm 3bhitm-labs-eder/
  784  ll
  785  git clone git@github.com:EderMoritz/3bhitm-labs-eder.git
  786  cd 3bhitm-labs-eder/
  787  ll
  788  nano README.md
  789  git add .
  790  git commit -m "changed README.md"
  791  git push
  792  history
  793  git add .
  795  git commit -m "updated by Lydia"
  796  git push

18.2. Github Keygen (Mitschrift Thomas Spindler)

mithilfe von SSH keys:

ssh-keygen -t rsa

18.3. GIT (Mitschrift Thomas Spindler)

neuen Ordner erstellen und erneut Klonen

mkdir work
cd work
git clone <LINK>

File im Directory abändern:

gedit readme.md
<ändern des files>
git commit -m "test merge"
git push

Andere Person nun auf dem repo:

git status

man bemerkt, dass das Repo nicht auf dem aktuellen Stand ist
updaten des Repos:

git pull

mit diesen Command laded man alle Abänderungen in den Dateien des remote repos herunter.

Person 2 editiert dann die Datei, commited und pusht

echo "Person 2 edit" >> readme.md
git commit -m "update readme.md - Person 2"
git push

Person 1 ladet nun wieder die Abänderungen herunter

git pull

nun ändern beide Personen die Datei readme.md ab.
beide Personen:

git add
git commit -m "merge test2"
git push

bei einer Person wird der push rejected, da das Remote repo Änderungen beinhaltet, die noch nicht existieren.
Daher braucht man git stash:

git stash

aufgrund des Commites kann stash nicht ausgeführt werden.

vor dem commit IMMER einen pull machen

Öffnen des Repos in IntelliJ für einen Merge. Mergekonflikte sind auf der Kommandozeile eher schwer zu machen, daher sollten wir dafür einen Editor verwenden (IntelliJ, VSCode)

18.4. Git stash (Mitschrift Thomas Spindler)

2 Leute klonen ein Git Repository und ändern in einem beliebigen File eine bestimmte Zeile ab.
Wir haben bereits gelernt, dass man die Abänderungen mergen kann, allerdings werden wir uns in dieser Übung stash verwenden.

Eine der Personen push dann die Abänderungen auf das aktuelle Repository:

git commit -m "<MESSAGE>"
git push

Hiermit haben wir einen Konflikt erstellt.

Die andere Person "versteckt" nun ihre Abänderungen, mithilfe von git stash, und pullt dann die Abänderungen vom remote Repo.

git stash
git pull

Danach holen wir die Abänderungen wieder zurück:

git stash pop

Dann können wir ohne weitere Probleme commiten und pushen.

Git pulls sollten regelmäßig und oft gemacht werden, um größere Konflikt zu verhindern. Dies kann auch in IntelliJ unter den folgenden Optionen automatisiert werden:
IntelliJ auto git pulls

18.5. Git stash - Tutorial (von Atlassian BitBucket)

18.6. Git branches (Mitschrift Thomas Spindler)

Die folgenden Übungen wurden in 06-git-lab-school mit 2er Gruppen durchgeführt.
Die Grundlage für diese Übung ist ein Java Programm (Maven) mit folgender Struktur:

06 git lab school

Für die Implementierung des Programmes werden zwei Git-Branches angelegt:

feature/teacher
feature/student

Jedes Teammitglied geht nun in einen Branch, und implementiert dort das passende Feature passend zum Branchname aus. Dies geht mithilfe folgendem Commandos:

git checkout feature/..

Nach dem Implementieren wird alles auf das remote Repository gepusht.

Daraufhin wechselt der 1. Schüler in den main branch und merged das Feature in diesen.

git checkout main
git merge feature/teacher
gut push

Dies wird nun für den Studenten wiederholt.
Danach werden beide Branches gelöscht:

git branch -d feature/teacher
git branch -d feature/student

Die remote Branches können ganz einfach im Webinterface von Github gelöscht werden.

Branches beziehen sich immer auf Features, und nicht Personen!

19. PlantUML (Mitschrift Thomas Spindler)

PlantUML Diagramme sind, wenn man das Template verwendet, im plantuml Ordner.

19.1. Umgebungen

19.1.1. PlantUML in Asciidoc

Da wir unsere Mitschriften in Asciidoc führen, zeigen wir dies gleich am Anfang.
Einbindung von PlantUML in Asciidoc:

[plantuml, <NAME>]
----
@startuml
...
@enduml
----

Hierbei gilt zu beachten, dass der <NAME> immer unterschiedlich sein muss. Wenn ein name doppelt verwendet wird, wird nur eines der zwei Diagramme an beiden Stellen angezeigt.

Um ein externes File einzufügen, kann folgende Syntax verwendet werden:

[plantuml, <NAME>]
----
include::plantuml/plantuml-example-1.puml[]
----

19.1.2. PlantUML in IntelliJ

Das Plugin "PlantUML integration" herunterladen und installieren. Anschließend das IDE neu starten

IntelliJ PlantUML intigration
Figure 2. Installieren von IntelliJ Plugin

19.2. Grundlagen

jedes PlantUML file hat ein Start und ein Ende:

@startuml
start
...
stop
@enduml

Nachschlagwerk: PlantUML Dokumentation

19.2.1. Sequenzen

Eine Sequenz ist ein Teil unseres Programmes. Mithilfe von PlantUML können wird diese schnell und genau darstellen.

Beispiel für eine Sequenz in PlantUML:

@startuml
:Hello World;
@enduml

wird zu:

hello world

Ebenfalls kann man einer Sequenz einen Titel und eine Beschreibung geben. Hierbei ist darauf zu achten, dass im Titel keine Leerzeichen vorhanden sein dürfen.

@startuml
HelloWorld:This is a description
@enduml
hello world2

19.2.2. If-Statements

If Statements in PlantUML darstellen:

@startuml
if(Paket-Gewicht) is (>10kg) then
:Sende mit LKW;
else
:Sende mit PKW;
endif
@enduml
if statement

19.2.3. Start und Stop

Wie bereits im Beispiel oben eingebaut, hat ein Programmablauf immer einen Anfang und ein Ende. Diese können mit den Keyworten "start" und "stop" dargestellt werden.

@startuml
start
:HelloWorld
stop
@enduml
start stop

19.2.4. Kommentare

Kommentare in PlantUML:

@startuml
'This is a comment
:HelloWorld;
@enduml

Wie man an folgendem Beispiel sieht, wird dieser nicht angezeigt:

comments 1

19.2.5. Klassen

Um Klassendiagramme in Plantuml darzustellen, sollte man Klasse dafür verwenden. Diese können mit folgender Syntax ausgedrückt werden:

@startuml

class example {
    +publicText: String
    #protectedText: String
    -privateText: String
}

@enduml
classes 1

Die Sichtbarkeit kann man Mithilfe folgender Kürzel festgelegt werden:

Character Visibility

+

public

-

private

#

protected

~

package private

Methoden können in Klassendiagrammen ebenfalls dargestellt werden:

@startuml

class example {
    +publicText: String
    #protectedText: String
    -privateText: String

    +method1()
    -method2()
}

@enduml
classes 2

Statische und abstrakte Element einer Klasse können ebenfalls dargestellt werden:

@startuml

class Dummy {
  {static} String id
  {abstract} void methods()
}

@enduml
classes 3

Die Linien zwischen Methoden und Variablen kann man auch selbst setzten.
Siehe PlantUMLDoc

19.2.6. Notizen

Notizen in Plantuml sind wichtig, wenn man Teile des Diagrams kommentieren möchte, dies allerdings im finalen Diagramm enthalten sein sollte.

@startuml
note "Das ist ein Kommentar" as CMT1(1)
@enduml
1 Mithilfe des Wortes as kann man dieser Notiz einen Namen geben.

Dies sieht dann wie folgt aus:

note 1

Kommentare können aber zu Elementen hinzugefügt werden, da diese sonst einfach nur am Anfang der Zeichnung stehen.

@startuml
class Player

note "Das ist ein Kommentar" as CMT1
CMT1 .right. Player (1)
@enduml
1 Mit dem right geben wir an, dass der Kommentar rechts mit der Klasse Player verbunden ist.
note 2

19.3. Klassendiagramme

Nun können wir das gelernte Wissen anwenden und ein Klassendiagramm gestalten.

Dazu legen wir zu als Erstes alle Klassen an, die wir benötigen:

@startuml

class Match

class Player {
    -player1: Player
    -player2: Player
    -score1: int
    -score2: int
    -court: Court
}

class Booking

class Court

@enduml

Dies sieht dann wie folgt aus:

class cld1

Nun fügen wir die Pfeile (Assoziationen) zwischen den Klassen dazu:

@startuml

left to right direction (1)

class Match
class Booking
class Player {
    -player1: Player
    -player2: Player
    -score1: int
    -score2: int
    -court: Court
}

Player "*" -- "*" Court
(Player, Court) .. Booking

Match "*" --> "1" Player : Player1 >
Match "*" --> "1" Player : Player2 >

Match --> Court

@enduml
1 Angabe, dass das Diagramm von links nach rechts gezeichnet werden sollte.
class cld2

19.4. Beispiel aus dem Unterricht

Mithilfe diesen Beispieles wurde uns PlantUML erklärt:

demo cld
Figure 3. Beispiel aus dem Unterricht:

Mithilfe dieses Beispiels wurde uns PlantUML erklärt.

19.5. Usecase - Diagramm

Usecases können Beschreiben, wofür man ein Objekt verwenden kann.
Beispiel für usecases eines PKWs:

@startuml
usecase "transport goods"
usecase "transport persons"
@enduml
usecases

19.5.1. Actors:

Um Personen auf Diagrammen darzustellen, kann man Actors verwenden

@startuml
actor "driver"
@enduml
actors

19.5.2. Rectangles

Rectagles können verwendet werden, um Darstellungen übersichtlicher zu machen

@startuml
rectangle PKW {
    usecase "transport"
}
@enduml
rectangles

19.5.3. Verlinkungen

2 Objekte in PlantUML können mithilfe von Links miteinander verbunden werden. Dies kann mit der Syntax <OBJEKT1> — <OBJEKT2> erzielt werden.

@startuml
actor "driver" as fc
usecase "drives car" as UCGOODS
fc -- UCGOODS
@enduml
links

19.6. Beispiel

Wenn wir nun alle oben hergezeigten Sachen verwenden, bekommt man folgendes Beispiel:

ucd1

20. Java History (Mitschrift Lydia Reiter)

java history
Java History Tafelbild

21. Arten von Mengen (Mitschrift Lydia Reiter & Thomas Spindler)

Siehe auch: UML Usecase - Diagramm

mengen arten

22. V-Modell (Mitschrift Lydia Reiter & Thomas Spindler)

Das V-Modell zeigt den Vorgang von Softwareentwicklung:

V-Modell Zeichnung
V-Modell Tafel

23. Vererbung (Mitschrift Lydia Reiter & Thomas Spindler)

Tafelbild aus dem Unterricht:

B vererbt von A

verwendung vererbung
Verwendung Vererbung Tafelbild

Dies kann man auch in PlantUML darstellen:

vererbung basics

B besitz daraufhin beide Eigenschaften:
(keine korrekte Darstellung der Klasse, nur symbolisch!)

vererbung basics ex2

24. 2022-01-20

24.1. Mengen

overlapping disjoint

24.2. Admonitions

Lernen Sie die Fachbegriffe
Damit Sie gut googeln können

24.3. Callouts

return Response
        .status(Response.Status.OK)  (1)
        .entity(bookingResource.showError(e.getMessage()))  (2)
        .type(MediaType.TEXT_HTML)
        .build();
1 Rückgabe des HTTP-Statuscodes
2 Aufrufen der showError-Methode, die eine html-error-page-rendert und zurückgibt

25. Klassendiagramm Hafen (Mitschrift Moritz Eder)

cld hafen
Verwendung Vererbung Tafelbild

26. Anwendungsfalldiagramm (Mitschrift Moritz Eder)

Der Anwendungsfall ist die Schnittstelle zum Kunden und der Grund warum man die Software kauft.

Anwendungsfälle beim Auto:

  • Transport von Personen

  • Transport von Gütern

  • aus prestige Gründen (Angeberei)

Scheibenwischer sind nicht funktional
  • wichtige Seiten im kapitel_3_2_Anwendungsfalldiag.pdf

2, 3, 4, 7, 8, 13, 17, 19, 20, 22

27. Zustandsmaschinen (Mitschrift Moritz Eder)

Ein Thermostat ist ein gutes Beispiel für eine Zustandsmaschine. (siehe Seite 6)

Zustände Flugzeugbetrieb:

  • flugbereit

  • in Wartung

  • ausgeschieden

Zustände Rechnung:

  • offen

  • bezahlt

  • Mahnung1,

  • Mahnung2

  • uneinbringlich

  • wichtige Seiten im kapitel_3_3_Zustandsmaschinen.pdf

6, 7, 17, 27, 28, 45, 51

28. 2022-02-15 (Di.)

  • Mitarbeit von Peter Klose

28.1. Docker Einführung (yt-Video)

  • Please watch this video

28.2. Ist Docker installiert?

docker --version

28.3. Docker installieren

28.3.1. Linux

sudo apt-get update
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

28.3.2. Mac

brew install --cask docker

28.4. Docker testen

Versuchen Sie:

docker run --rm docker/whalesay cowsay hello 3bhitm

Ausgabe:

 ______________
< hello 3bhitm >
 --------------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

Funktioniert nicht?

Versuche dies
newgrp docker
sudo groupadd docker
sudo usermod -aG docker $USER

Docker starten:

sudo systemctl start docker

Docker Status:

sudo systemctl status docker

28.5. Eigenen Docker Container

Terminal:

mkdir docker
cd docker (1)

nano Dockerfile (2)
1 neuen Ordner erstellen und hineinwechseln
2 neues File erstellen (image File) muss den Namen Dockerfile haben

Dockerfile:

FROM ubuntu

RUN echo hello 3bhitm > test.txt

Terminal:

docker build -t my-ubuntu . (1)
docker run -it my-ubuntu /bin/bash (2)
1 Buildet einen Container mit dem Namen my-ubuntu im aktuellen Verzeichnis (.)
2 Startet den Container my-ubuntu mit einem interaktiven Terminal (-it) im Verzeichnis /bin/bash

29. 2022-02-17

29.1. nginx auf oravm

30. 2022-03-01 (Di.)

30.1. Im Container nicht

Dockerfile
FROM ...
CMD ["tail", "-f", "/dev/null"]
  • Dieses Kommando verhindert, dass der Docker Container beendet wird.

30.2. Nachvollziehbarkeit

  • Beim Starten des Containers soll alles sauber definiert sein.

  • Daher ist es wichtig die Version beim zugrunde liegenden Image anzugeben.

Immer bei FROM-Klausel eine Versionsnummer angeben (vergleiche semantische Versionierung)

z.B. FROM ubuntu:20.04 oder FROM ubuntu:focal

  • Würde man latest verwenden, kann sich die verwendete Version ändern

    • das Image kann "brechen", dh es funktioniert nicht mehr

30.3. Nur ein Kommando

  • Jeder Container führt nur EIN Kommando aus

  • Man verwendet:

    • CMD oder

    • ENTRYPOINT

  • Haben unterschiedliche Funktionalität

  • Es muss immer ein String-Array übergeben werden

30.4. docker-entrypoint

  • Alle Scripts in docker-entrypoint werden beim Start des Containers ausgeführt

31. 2022-03-03 Do.

31.1. docker Installation auf oravm kontrollieren und vervollständigen

31.1.1. Ist docker-compose installiert?

docker-compose -v

31.1.2. Ist der ubuntu-User in der docker-group

Anzeigen aller groups
cat /etc/groups
Die group "docker" ist bereits enthalten → sonst Optional post-installation steps
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:ubuntu
tty:x:5:
...
opc:x:1000:
ubuntu:x:1001:  <--
docker:x:998:
Mit cat /etc/passwd kann man sich alle user ansehen.

31.1.3. docker post-installation steps

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
ausprobieren mit
docker image ls

31.2. nginx mittels docker installieren

31.2.1. Vorbereiten des opt-Verzeichnisses

  • Wir wollen die docker Container in /opt starten

ll /
sudo chown -R ubuntu:ubuntu /opt
ll /
cd /opt
mkdir docker
cd docker
mkdir nginx
cd nginx

31.2.2. Erstellen eines Scripts zum Builden und Starten eines gedockerten nginx

installieren des Texteditors nano
sudo apt install nano
Skript in Texteditor öffnen
nano start-nginx.sh
Skript
docker run --name my-nginx \  (1)
           --rm \  (2)
           -v ${PWD}/html:/usr/share/nginx/html \  (3)
           -p 80:80 \  (4)
           -d \  (5)
           nginx:1.21.6  (6)
1 Der Container erhält den Namen my-nginx
2 rm …​ remove → nach dem Stoppen des Containers wird dieser gelöscht
3 bind mount → im momentanen Verzeichnis ${PWD} (print working directory) wird der html-Ordner aus dem Container gespiegelt.
4 p …​ publish → der Port 80 des guests wird auf den Port 80 des hosts zugewiesen
5 d …​ daemon → der Docker Container läuft im Hintergrund
6 Das Image nginx in der Version 1.21.6 wird verwendet
chmod +x start-nginx.sh  (1)
./start-nginx.sh (2)
1 executable-flag setzen
2 Skript im momentanen Verzeichnis starten
Achten Sie darauf, dass die Ingress-Rule gesetzt ist

31.2.3. html-Contents erstellen

  • von Haus aus erstellt nginx keine html-Seite, dies erledigen wir nun.

im darunterliegenden (von docker erstelltem) html-Ordner wird ein index.html erstellt
sudo nano ./html/index.html
html/index.html
<html>
<head><title>Test Drive</title></head>
<body>
<center><h1>Hello 3bhitm!</h1></center>
<hr><center>nginx/1.21.6</center>
</body>
</html>

docker nginx browser

  • Wenn etwas im Skript verändert wird, kann man mit folgendem Befehl, den Container stoppen und sofort neu starten:

docker stop my-nginx && ./start-nginx.sh

32. 2022-03-08 Di

32.1. Docker Mounts

  • bind mounts

  • volume mounts

32.2. Schichten in Docker

  • Die Images werden schichtenweise gespeichert

  • Jedes RUN Kommando ist eine Schicht

32.3. Docker Kommandos

Liste aller Container (inkl. der gestoppten Container)
docker container ls -a
Löschen aller gestoppten Container
docker container prune -f
Dockerfile
FROM postgres:14-bullseye
RUN echo hello 3bhitm > test.txt
  • Wir verwenden ein Dockerfile, damit die db automatisch intialisiert werden kann

    • eigene user

    • Daten zum Initialiseren der Datenbank

    • …​

Erstellen des Docker Images
docker build -t my-database .
Erstellen des Docker Containers
docker run my-database
Ausgabe
Error: Database is uninitialized and superuser password is not specified.
       You must specify POSTGRES_PASSWORD to a non-empty value for the
       superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".

       You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
       connections without a password. This is *not* recommended.

       See PostgreSQL documentation about "trust":
       https://www.postgresql.org/docs/current/auth-trust.html
netstat -ant

oder

netstat -tulpen
  • ergänzen im

    • eine Environment Variable für das Password

    • der Port wird aus dem Container auf localhost (0.0.0.0) gehostet

docker run --name my-database -e POSTGRES_PASSWORD=password -p 5432:5432 my-database
docker container ls
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                    NAMES
3239b183f54c   my-database   "docker-entrypoint.s…"   23 seconds ago   Up 23 seconds   0.0.0.0:5432->5432/tcp   my-database
database postgres datasource
Figure 4. Zugriff auf database
Erstellen eines Volume Mounts
docker run --name my-database -e POSTGRES_PASSWORD=password -p 5432:5432 -v database-volume:/var/lib/postgresql/data my-database

33. 2022-03-10 Projekte

project cinema cld v01
  • Für Reservierung ein Statusfeld einführen (OFFEN, VERKAUFT, RESERVIERT, GESPERRT)

feuerloescher cld
uno cld v02

33.1. DOM - Domain Object Model

  • nicht zu verwechseln mit dem Document Object Model (js-Programmierung)

  • Domain …​ Fachbereich

  • Wir sprechen hierbei von Fachbereichsobjekten, zB

    • Arzt → Patient, Diagnose, Behandlung, Arzt, Krankenzimmer

    • Kaufhaus → Produkt, Kunde, Rechnung, Bestellung, …​

  • Technische Klassen (die zur Programmierung notwendig sind), sind nicht Bestandteil eines Domain Object Models

  • Die Domain-Objekte entsprechen den Tabellen, die in der Datenbank gespeichert werden (ERD - Entity Relationship Diagram)

34. 2022-03-15 Di

34.1. Wdhlg docker, docker-compose, volumes

34.2. COPY in Dockerfile

starten des Containers
docker run --name my-database -e POSTGRES_PASSWORD=password -p 5432:5432 my-database
öffnen in einem neuen Terminal
docker exec -it my-database bash
import.sql im entrypoint-Verzeichnis im Container erstellen
create database db;
cd docker-entrypoint-initdb.d/
echo create database db; > import.sql
start.sh
#!/usr/bin/env bash
docker run --name my-database -e POSTGRES_PASSWORD=password --rm -p 5432:5432 my-database
ausführbar machen
chmod +x start.sh
FROM postgres:14-bullseye
RUN echo hello 3bhitm > test.txt

COPY import.sql docker-entrypoint-initdb.d/

35. 2022-03-31

  • LF: 21.4.2022

  • Stoffumfang:

    • UML-CLD

    • plantuml

    • asciidoctor

      • wie mache ich ein adoc-Dokument?

      • wie bette ich ein plantuml-Diagramm ein (include vs erstellen im adoc-Dokument)

    • git

    • docker

    • docker-compose

  • Stoffumfang:

    • Projektmerkmale

    • uml-cld

    • git

    • was ist docker?

35.1. Nächste Schritte im Projekt

36. 2022-03-17 Do.

36.1. Anforderungsdef. (Requirements elicitation)

  • Buch S. 235 ff

36.2. Was ist zu tun?

36.2.2. Erstellen eines maven-Projekts

  • Anlegen der Datenbank

  • Erstellen von Unit Tests mit assertj-core und assertj-db

37. 2022-03-22 Di.

38. 2022-03-24

39. 2022-03-29 Di.

39.1. Persistieren von Daten bei Docker

  • im Container (ist nicht wirklich ein persistentes Speichern, da die Daten gelöscht werden, wenn der Container gelöscht wird.)

  • bind mount

  • volume mount (host mounted volumes)

39.2. docker-compose

  • Im Gegensatz zu virtualbox usw. werden nicht alle Dienste in eine vm installiert, sondern bei Docker wird fer jeden Dienst ein container erstellt.

  • Erstellen eines docker-compose.yml files

version: '3.1'

services:

  db:
    image: postgres:14-bullseye
    restart: always
    environment:
      POSTGRES_DB: db
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app

  adminer:
    image: adminer
    restart: always
    ports:
      - 8090:8080
Starten
docker-compose up
  • Derzeit kann man auf die DB nur über den Adminer zugreifen (ist vergleichbar mit phpadmin)

    • http:// localhost:8090

Nachschauen welcher Dienst lokal läuft
netstat -ant| grep LISTEN
Hinzufügen eines Ports für den direkten Zugriff
version: '3.1'

services:

  db:
    image: postgres:14-bullseye
    restart: always
    environment:
      POSTGRES_DB: db
      POSTGRES_USER: app
      POSTGRES_PASSWORD: app
    ports:
      - 5432:5432

  adminer:
    image: adminer
    restart: always
    ports:
      - 8090:8080
  • Wird die db nun wieder gestartet, so kann man direkt auf die db zugreifen: z.B. über intellij

40. 2022-05-05 Di.

Lösung Wiederholungstest CLD:

lösung wdh test

40.1. Erstellen eines Dockerfiles

FROM eclipse-temurin:17
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]

40.2. Erstellen eines uber-jars

  • quarkus.package.type=uber-jar

  • Dockerfile ins root kopieren

  • Korrektes Datenmodell

  • Beispieldaten sind zu erstellen (besonders für die Stammdaten):

    • entweder mittels unit-tests

    • oder über sql-Statements (in 3 files: create-xx.sql, insert-xx.sql und drop-xx.sql)

  • Geschäftsprozesse mit Unit-Tests abbilden z.B.

    • Erstellen einer Auktion mit einem Produkt und einem Verkäufer

    • Abgabe eines Angebots

41. 2022-05-03

41.1. Dockern einer Java Anwendung

41.1.1. http-Methoden

GET
POST
PUT
PATCH
DELETE

42. 2022-05-10

42.1. Stoppen aller Container

docker stop $(docker ps -q)

42.2. Löschen aller Container

docker rm $(docker ps -a -q)
  • -a …​ zeigt die gestoppten Container an

42.3. Löschen aller Images

docker rmi $(docker images -q)

42.4. Übung

  1. Erstellen eines Dockerfiles: im homeverzeichnis steht ein Text

  2. Erstellen eines zweiten Dockerfiles, welches am ersten Docker-Image basiert und den Text im Home ausgibt

43. 2022-05-17

  • Fortsetzung Docker-Java-Tutorial

44. 2022-05-19

44.1. Repository-Pattern

  • repository per aggregate

Es muss nicht für jede Entität ein eigenes Repository erstellt werden, sondern nur für starke Entitäten und den dazugehörigen schwachen Entitäten.

44.2. Was muss beim Projekt gemacht werden, um positiv zu sein?

  • Ein korrektes Datenmodell muss implementiert und dokumentiert werden

  • Die gh-pages müssen verfügbar sein

  • Implementierung

    • sql-files müssen vorhanden sein

      • sql-create-files

      • sql-drop-files

      • sql-insert-files

    • Die Java Zugriffsschicht muss funktionieren

      • SqlRunner und SqlScript

      • Repositories für Zugriff auf Tabellen

    • User-Stories müssen als Unit-Tests implementiert sein

44.3. Databases

2022 05 19 board1
Figure 6. assoziative Beziehungen auflösen
database transactions
Figure 7. database transaction
database structure

44.4. Gelernte Begriffe

Die wichtigsten Begriffe, die in der Stunde gefragt wurden:

  • Domain = Fachbereich

  • Aggregieren: zusammenfassen

  • DAO = Data Access Object

  • CRUD = Create Read Update Delete

Empfehle folgendes Video: JUnit 5 Tutorial - Nice & Easy

45. 2022-06-09 continuous integration / delivery / deployment

cicd pipeline
  • continuous integration

    • local development in IDE.

    • commit/push to remote repo

    • testing the code with gh-actions

  • continuous delivery

    • continuous integration

    • create a release and deliver to

      • staging server or

      • gh-packages

  • continuous development

    • continuous integration + continuous delivery

    • deployment on production server (or cloud, …​)

46. 2022-06-28 Testarten

v modell my
testarten