= Lecture Notes 22/23 - 3ahitm - ITP

ifndef::imagesdir[:imagesdir: images]
:icons: font
:experimental:
:sectnums:
:toc:
ifdef::backend-html5[]

// https://fontawesome.com/v4.7.0/icons/
icon:file-text-o[link=https://raw.githubusercontent.com/2223-3ahitm-itp/2223-3ahitm-itp-lecture-notes/main/asciidocs/{docname}.adoc] ‏ ‏ ‎
icon:github-square[link=https://github.com/2223-3ahitm-itp/2223-3ahitm-itp-lecture-notes] ‏ ‏ ‎
icon:home[link=http://edufs.edu.htl-leonding.ac.at/~t.stuetz/hugo/2021/01/lecture-notes/]
endif::backend-html5[]

== 2022-09-19

* Einrichten von Discord

=== Asciidoctor

=== Kreativitätstechniken

* bis inkl.
Mindmap

== 2022-09-30

=== Kreativitätstechniken

==== Bionik

==== Delphi-Methode

=== Projektantrag

==== Übung

* Erstellen Sie einen Projektantrag in Asciidoctor - Format
* Verwenden Sie hierzu die IntelliJ-Plugins
** Asciidoctor
** Plantuml

////

[plantuml,demo-cld,png]
----
@startuml
class Person
@enduml
----
////





=== SWOT

=== Projektziele

image::effizienz-vs-effektivitaet.png[]

* Effektivität: Grad der Zielerreichung
* Effizienz: Input/Output - Relation

=== Asciidoctor Präambel

----
= Lecture Notes 22-23 / 1ahitm / SEW
Thomas W. Stütz
1.0.0, {docdate}: Softwareentwicklung
ifndef::imagesdir[:imagesdir: images]
//:toc-placement!:  // prevents the generation of the doc at this position, so it can be printed afterwards
:sourcedir: ../src/main/java
:icons: font
:sectnums:    // Nummerierung der Überschriften / section numbering
:toc: left
:experimental:


//Need this blank line after ifdef, don't know why...
ifdef::backend-html5[]

// print the toc here (not at the default position)
//toc::[]

== Lehrplan
----

== 2022-10-07 (Fr.)

=== Projektziele

* operativ

=== Stakeholder-Analyse

=== Projektauftrag

== 2022-10-10 - Git

* Commands

** git add
** git commit
** git push
** git clone
** ...

* Workflow

* branches erstellen
* mergen
* auf frühere Version zurückgehen

== 2022-10-14

=== Pflichtenheft

|===
|Phase |Beschreibung |Beispiel

|Ausgangssituation
|Beschreibung des Umfeldes und / oder des Unternehmens
|Die HTL Leonding ist eine mittelgroße Schule im Zentralraum OÖ mit ca. 1200 Schülern

|Istzustand
|Beschreibung der Abteilung der Organisation bzw. des Geschäftsfalles
|Die Abteilungen Informatik und Medientechnik haben einen beträchtlichen Programmieranteil

|Problemstellung
|Das Problem wird beschrieben *OHNE* die Lösung zu erwähnen
a|
* Neue Schülerinnen und Schüler (SuS) der 1. und 2.Jg. müssen umfangreiche Programmpakete installieren, um programmieren zu können
* Die SuS sind angehalten, viele Beispiele zu programmieren.
* Die einzelnen Lehrer haben Ihre eigenen Übungsbeispiele - neue Lehrer müssen sich Ihre eigenen Beispiele erarbeiten

|Sollzustand / Ergebnis / Leistung / Aufgabenstellung
|Welcher Zustand soll erreicht werden? Was soll zB erstellt werden?
|Ein Portal ist zu erstellen in dem Schüler mit einer Online-IDE Beispiele aus einem vorhandenen Pool lösen können. Das Ergebnis dieses Projekts ist das fertige Portal.

|Ziel
|Leistungswirkung
|Die SuS lernen einfacher eine Programmiersprache, ...
|===

=== Git Branching Rules

* https://lutece.paris.fr/support/wiki/git.html[Git Branching Rules^]

image::git-developer-branch.png[]

== 2022-10-17 Projektanträge durchgesehen

.Bsp für einen Projektantrag (vgl. Buch S. 45)
|===
|Kapitel |Beschreibung |Beispiel

|Aufgabenbeschreibung
|Was ist zu erstellen? Welche Funktionalität hat das zu erstellende Produkt?
a|
Eine mobile App ist zu erstellen mit folgender Funktionalität:

* Anlegen von ToDo-Listen
* Abhaken von ToDo-Listen
* Versehen von einzelnen ToDo-Einträgen mit Datum und Zeit, damit der User automatisch erinnert werden kann.

|Nutzen
|Welche Leistungswirkung ergibt sich?
a|
Beim Einsatz im Schulunterricht:

* Schüler vergessen keine (Haus-)Übungen und sonstiges mehr
* Schüler lernen Zeitmanagement

|Konsequenzen
|Was passiert oder passiert nicht beim Fehlen des Produkts / Nichterstellen des Projekts
|Die Noten von Schülern sind ev. schlechter

|Pers. und finanz. Rahmenbedingungen
|Was wird benötigt? Was ist ev. bereits vorhanden?
|Ein Schülerteam aus ca. 4 Personen arbeitet ein Schuljahr dran.


|===

////
[%collapsible%close]
====
[plantuml,projektantraege1,png]
----
include::plantuml/projektantrag.puml[]
----
====
////

== 2022-11-04

=== Semantische Versionierung

https://semver.org/

=== Projektzuteilung

.Projektzuteilung
[%collapsible]
====
[plantuml,png]
----
include::plantuml/projektantrag.puml[]
----
====

=== UML

* Was ist ein Modell?

** *Ein Modell ist ein vereinfachtes Abbild der Realität unter Berücksichtigung eines besonderen Aspektes*
** zB Datenmodell: Vereinfachte Darstellung einer Situation unter besonderer Berücksichtigung der Datenstrukturen
** Ablaufdiagramm: Vereinfachte Darstellung einer Situation unter besonderer Berücksichtigung der Abläufe; zB Verschicken eines Pakets

==== Objektorientierter Entwurf S.274

==== Klassendiagramm

[plantuml,cld_class,png]
----
@startuml
class Person {
  -firstname: String
  -lastname: String
  -{static} counter: int
}
@enduml
----

== 2022-11-07

=== Klassendiagramm

* Beziehungen
** Assoziation
** Aggregation
** Komposition
** Vererbung
** Realisierung (Implementierung)

* Beziehungen
** unidirektional
** bidirektional

* Multiplizität
** 1:*
** 1:1
** \*:*

== 2022-11-11

=== Notation

* Schreib- oder Zeichenweise, wie etwas dargestellt wird. *Vereinbarung*, wie etwas gezeichnet oder geschrieben wird.

=== Klassendiagramme (Fortsetzung)

image::complete-vs-incomplete.png[]

image::disjoint-vs-overlapping.png[]

[plantuml,cld_1_n,png]
----
@startuml
'left to right direction
class Person {
}

class Haustier {
  besitzer: Person
}

Person "1" <-- "*" Haustier: < gehört zu
@enduml
----

.Variante 1
[plantuml,cld_n_m_var1,png]
----
@startuml
left to right direction
class Person {
}

class Firma {
}

class Aktie {
}

Person "*" -- "*" Firma
(Person, Firma) .. Aktie

@enduml
----

.Variante 2
[plantuml,cld_n_m_var2,png]
----
@startuml
left to right direction
class Person {
}

class Firma {
}

class Aktie {
  firma: Firma
  person: Person
}

Person "1" <-- "*" Aktie
Aktie "*" --> "1" Firma

@enduml
----

==== Lesen von Beziehungen

image::lesen-von-beziehungen.jpeg[]

=== Domain Object Model (DOM)

* Nicht zu verwechseln mit einem *Document Object Model* (in einem HTML-Dokument)

* Domain -> Fachbereich (zB Autohandel, Immobilien, Medizin, ...)

* vergleichbar mit einem ERD

* es werden nur die Fachbereichsobjete und deren Beziehungen dargestellt und keine technischen Klassen (oder auch Interfaces)

=== Use-Case-Diagram (Anwendungsfalldiagramm)

* Dient beim Erstellen der Anforderungen als Schnittstelle zwischen Kunde und Programmierer

* Es werden Anwendungsfälle dargestellt
** Bsp PKW
*** Transport von Personen
*** Transport von Gütern
*** ev.
Statussymbol

[plantuml,demo5,png]
----
@startuml
left to right direction
actor "Besitzer" as fc
rectangle PKW {
  usecase "transportiere Personen" as UC1
  usecase "transportiere Güter" as UC2
  usecase "cruise auf Landstraße" as UC3
}
fc -- UC1
fc -- UC2
fc -- UC3
@enduml
----

=== Google Java Style Guide

https://google.github.io/styleguide/javaguide.html[Google Java Style Guide^]

image::https://imgs.xkcd.com/comics/code_quality.png[]

== 2022-11-14

=== Projektauftrag

bis Montag 21.11.2022

=== Repo-Strukturierung

* README.adoc
* asciidoc-Verzeichnis
* backend

[source,asciidoc]
----
= Projekt XY
Projektmitglied A, ...
1.0.0, {docdate}
ifndef::imagesdir[:imagesdir: images]
:icons: font
:sectnums:    // Nummerierung der Überschriften / section numbering
//:toc:
//:toclevels: 4
:experimental:
//https://gist.github.com/dcode/0cfbf2699a1fe9b46ff04c41721dda74?permalink_comment_id=3948218
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]

== XY

TIP: Das ist ein Tipp

.Programmablaufplan
[%collapsible]
====
image::https://www.plantuml.com/plantuml/png/ZPBDZjCm4CVlVefXJwq4PVb0GYsBjeYFtGj2eENkn9DajCuuiiTKubauyWnxufONmoIjoQgYuMZD__VxZpI-3AAznDQg1vtNTQiX1loANgZKzhe2nsf8gFMxDTIuexAHpVZm3aF0ZQ8A5aLBy0gUl5ozM88qoB0G7t6f0DPfz5aBSGqNS7R3WdwlETiej07_uazdu8_Ejzh-YtvsVfhkVnIv-Z5yylrFRQXpWKI7OzdCAjkCmk8zYbYaWkfR95d21wyDN1yfdv__jt8q71IZuFL5CYHg5XivDbGf5NOaPRF8m5AL-ezmUePXa-qQRhe0Z-0B8JIwG8PfPhNPW_a4KpBrIhI47XzE-1oz9pXrXOFlodMTjlhUDbCk3OmESDlVCGj2qTybCx91pZNpzpcKRPCmShql2yG6gWoiu6qoxCYRkPPHcgrNP2jCpZT8S9o2jlyL0l9GQJnndRomIm699-nPFt25rx5iaiHWHKn2to2uoda194Q6hVykoPNCuozGGLodBjCxjlOt[]
====
----

TIP: XY

CAUTION: ACHTUNG

== 2022-11-18

=== CLD Kinokette besprochen

=== Projektablauf

image::projekt-leitfaden.png[]

== 2022-11-21

=== Anforderungen an das Projekt-Repository

* automatisches Generieren von gh-pages
** neues Repo: https://github.com/htl-leonding-college/asciidoctor-convert-template
** altes repo: https://github.com/htl-leonding-college/asciidoctor-docker-template
*** Templates für mom und sysspec, ...

* im repo-root ein README.adoc
** kurze Beschreibubgf des Projekts
** Die Links zu allen gh-pages

=== Wireframe vs Mockup vs Prototyp

siehe https://www.deckweiss.at/post/wireframes-mockups-und-prototypen-was-wann-und-warum[Wireframes, Mockups und Prototypen: Was, wann und warum?^]

== 2022-11-25

=== Teststoff besprochen

== 2022-11-28

=== Pflichtenheft

=== Git - Collaborator vs. Pull Request

=== V-Modell

image::v-modell.png[]

== 2022-12-05

Mitschrift: Ruep Michael

Was

* Pflichtenheft

** ein Pflichtenheft zeigt nicht wie man was macht

Wie

* Problemvereinfachung durch Problemzerkleinerung:
** Man nimmt die Probleme, unterteilt sie immer weiter in kleinere Probleme bis diese schaffbar sind.

* Grobentwurf
** Schnittstellen zwischen Komponenten definieren
*** Komponentendiagramm (UML)
*** Verteilungsdiagramm (UML)
** Wichtig für die Zusammenarbeit (collaboration der Programmierer)
*** Damit die verschiedenen Teile miteinander funktionieren.
*** Mocken (=vortäuschen)
**** beispielsweise eine Datenbank vortäuschen wobei diese nur 3 Einträge enthält.

** Bsp:

image::grobentwurf.png[]
//grafik von Puchner Manuel

* Feinentwurf
** Klassendiagramm (UML)
** Zustandsdiagramm (UML)
** Objektdiagramm (UML)
** ..

** Bsp:

image::feinentwurf.png[]
//grafik von Puchner Manuel

* Implementierung
** Durchführung (programmieren)
** Das Ergebnis der Implementierung ist dann der Code

== 2022-12-09

=== Anforderungsanalyse

Erhebung der Anforderungen für den Kunden

Mitschrift: Ruep Michael

* *Aufgabe:* Kapitel Anforderungsanalyse lesen (S.235 ff)


==== Interview

Wird am häufigsten als Ist-Aufnahmetechnik eingesetzt

* Standardisiert (fixe fragen)
* Halbstandardisiert (teilweise fix)
* Nicht-Standardisiert (benötigt gute Interviewer)

Offene Frage:
Bsp: Wie geht es Ihnen?

Geschlossene Frage:
antwort: ja nein Bsp: Hast du einen Führerschein?

Indirekte Frage:
Hast du den Autoführerschein (um das ungefähre alter eingrenzen zu können).

Direkte Frage:
Direkt das fragen, was man erfahren will.

* Interviewvorbereitung (interview preparation)
* Interviewdurchführung (interview session)
* Interviewauswertung (interview follow up) Bsp: Das Erfahrene niederschreiben

*Vorteile:*

- Möglichkeit zur vertiefung der Befragung durch Zusatzfragen und Verständnisfragen
- Möglichkeit zur steigerung der Motivation des Befragten

*Nachteile:*

- Zeitaufwand
- Anforderung and die Fähigkeiten der Interviewer
- Störung des Interviewten bei der Aufgaben erfüllung

==== Fragebogen

* quantitativ: Zahlen

* qualitativ: Meinungsbilder (wie geht es jemanden damit)

Es gibt Individual und Gruppenfragebögen

*Vorteile:*

- schriftliche Ergebnisse
- Anwendung der Wahrscheinlichkeitsrechnung
- geringe Kosten

*Nachteile:*

- geringe Antwortquote
- Missverständnisse möglich
- aufwendige Auswertung bei freien Fragen

==== Beobachtung

Direkte Erfassungsmethode, sinnliche Wahrnehmungen des Planers für zusätzliche Informationen.

* Man fragt nicht nur
** was gewollt ist, was das Problem ist was gemeint ist (*was mann bekommt*) man sagt auch
** das und das eben nicht (*was man nicht bekommt*), somit fallen Missverständnisse auf.

* Formen:*

- offene oder verdeckte Beobachtung
- strukturierte oder unstrukturierte Beobachtung
- aktiv teilnehmende oder passive Beobachtung
- Dauerbeobachtung oder unterbrochene Beobachtung

* Multimomentaufnahme: Stichprobenartig (nicht nur genau an einem Zeitpunkt, immer wieder, um eine Übersicht über die vom Mitarbeiter durchgeführten Tätigkeiten zu bekommen)

==== Selbstaufschreibung

Strukturierte Aufzeichnung relevanter Ereignisse und Handlungen

*Vorgehensrahmen:*

- Aufnahmenfestlegung
- Aufnahmenvorbereitung
- Mitarbeiterinformation
- Durchführung
- Auswertung

*Vorteile:*

- mögliche Totalaufnahme
- Entlastung des Systemplaners

*Nachteile:*

- bewusste Fälschung

== 2022-12-16

Mitschrift: Adelwöhrer Leonie

=== Git-Flow

* Branches
** Main Branch
*** Lauffähige Version
*** releases V.1.0
*** commits

** Development Branch
*** Development Umgebung
*** cherry-picking

** Feature Branch
*** Neue Funktionen
*** Bugfixes
*** Hotfix .... muss schnell passieren

image::git-overview2.png[]

=== V-Modell

* Validierung = Lösen wir das Problem?
* Grobentwurf = Datenbank, Backend, Frontend
* Feinentwurf = Bis zum Klassendiagramm
* Unterschied Entwurf und Design = Gibt keinen!

* V-Modell (Vorgehensmodell... Wie erstelle ich es?) = alles in einem,
** Wasserfallmodel (Grundlegende Prozessmodelle)
*** Analyse, Anforderungsanalyse, Design, Realisierung, Test, Einsatz und Wartung
** iterative Prozesse (iterative Prozessmodelle)
** XP (Agile Prozessmodelle)



Scrum (Haufen => agil heißt flink, beweglich)

* kleine Einheiten
* umfangreiche Dokumentation (im Code bspw.
AsciiDoc)
* Verträge
* Fokus, Leistung

* Verlauf:
** Product Backlog (User-story, Sachlich)
** Sprint Backlog (Zeitlich)
** Sprint (Bis wann?)
** lauffähige inkrementell verbesserte Software

* Warum Domainmodell und kein Klassendiagramm?
Da wir keine technischen Daten Benötigen!

Git

* Versionierungssoftware
* Architektur... Local Repo, Remote Repo

=== Dokumentenauswertung

Leicht verfügbare Informationsquelle.
Auswertung der verfügbaren und relevanten Dokumente (heute meist elektronisch).
Damit man weiß welche daten man hat.

- Dokumentation des Systems
- Studien über das System
- Belege und Formulare

=== Weitere Methoden

- Snowcards (Anforderungskarten)
- Problem-Frames
- QFD - Quality Function Deployment
- Anforderungs Workshop

== 2022-12-19

Mitschrift: Nico Wakolbinger

=== Scrum

.source: https://www.thescrummaster.co.uk/scrum/scrum-framework-image-from-scrum-org/[Scrum Framework Image From Scrum.org^]
image::the-scrum-framework-large.png[]

* Scrum Aktivitäten:

** Anforderungsanalyse

** Sprint Planning

.source: https://scrumguide.de/user-story/
+++ <iframe width="560" height="315" src="https://www.youtube.com/embed/YYkuwOSXOck" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> +++



* Product Backlog

** User Stories
** *Was* bekomme ich? (sachliche Komponente)
** Eine User Story oder Anwendererzählung ist eine kurze Beschreibung (Story) dessen, was ein Benutzer (User) will.
Eine User Story besteht aus ein paar Sätzen, in denen beschrieben wird, was der Benutzer des Produkts machen will bzw. muss.
Sie ist im Regelfall wenig detailliert und sollte auf ein post-it passen. (source: https://scrumguide.de/user-story/)

+++ <iframe width="560" height="315" src="https://www.youtube.com/embed/2xSKHVyj7CM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> +++


* Sprint Backlog
** User Stories werden in Task zerlegt (verfeinert)
** *Wie* bekomme ich etwas?

+++ <iframe width="560" height="315" src="https://www.youtube.com/embed/J0Hb35HC4aM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> +++

* Sprint: *wann* bekomme ich etwas?

* Sprintdauer: in real-world Projekten ca. 30 Tage; in Schule ca 14 Tage

Inkrementieren -> um 1 erhöhen, um ein Stück erhöhen, ...

Nach jedem Sprint ist das Produkt lauffähig -> dieser Stand des Produkts wird "*increment*" genannt

==== Rollen im Scrum

* Scrum Team)

** Product Owner
*** vertritt die Interessen des Auftraggebers

** Scrum Master
*** Kümmerer (sorgt für Softwarelizenzen, passende Hardware, ...)

** Developers
*** Programmierer
*** maximal 8 Personen pro Team

* Users
** Softwarenutzer

* Stakeholder
** Betroffene des Projekts, sind involviert, arbeiten aber nicht mit der erstellten Software

.source: https://www.thescrummaster.co.uk/wp-content/uploads/2021/03/TheSimpleGuideToScrum-1Pager.pdf[The Simple Guide To Scrum - 1 Pager^]
image::scrum-team.png[]

=== User Story

Unterteilung in Tasks

-> Sprint Backlog

=== Burndown Chart

Ermöglicht den Fortschritt eines Sprints grafisch darzustellen.

== 2022-12-23 Docker

Mitschrift: Nico Wakolbinger

Derivat: Abkömmling

Bekanntestes Linux Derivat => Ubuntu

Betriebssystem, Kernel

Packetmanager: z.B. apt, ...

siehe: https://htl-leonding-college.github.io/docker-lecture-notes/

== 2023-01-09

* https://www.youtube.com/watch?v=jXBo-RasY3g[YouTrack Project Management: Essentials for Getting Started^]

* https://github.com/1920-3ahitm-itp/02-project-repositories-studentfeedback

== 2023-01-XX

* Fehlende UML Diagramme erarbeiten
** Zustandsdiagramm
** Aktivitätsdiagramm

== 2023-02-17

* Bis nach den Semesterferien
** Cld fertigstellen
** in Java programmieren
*** Entities
*** Repositories
** Use-Cases mit assertj-db testen
** Konfigurieren einer gh-page im Repo laut Angabe

IMPORTANT: Für die einzelnen Aktivitäten im youtrack User Stories und tasks anlegen und bei den Commits deren Id in der Commit-Message eintragen

++++
<iframe width="560" height="315" src="https://www.youtube.com/embed/XUIse_dzdGw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
++++

== 2023-02-27

=== Docker

* Docker ist leichtgewichtige Virtualiserung.

==== Warum Docker?

image::works-on-my-machine.png[]

* Man braucht eine Laufzeitumgebung, die genau definiert ist
** Java hatte früher den Slogan "Write once, runs anywhere" (WORA)
** Heutzutage eher "Write once, run predictable" (WORP)


* Unterschied Developer - Operator
** Developer: programmiert Applikationen
** Operator: ist im Rechenzentrum; kümmert sich um das Hosting der Anwendungen, Sicherungen, etc.
** Es gab immer Konflikte zwischen Devs und Operators
** -> jetzt gibt es DevOps

++++
<iframe width="560" height="315" src="https://www.youtube.com/embed/0yWAtQ6wYNM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
++++


Fragen:

* Unterschiede Developer - Operator - DevOps
* Aufgaben des DevOps
** Was kommt zum Programmieren noch dazu?
* Warum gibt es DevOps?
* Aufgaben des Operators
* ...

== 2023-03-10

image::scrum-und-v-modell.png[]


=== Testen

* jUnit

image::unit-tests.png[]

** Test-Matcher

*** ein aktueller Wert wird mit einem vorgegebenen Wert verglichen.

*** in jUnit sind solche Matcher bereits eingebaut

**** assertEquals
**** assertTrue
**** assertXXX

*** Es gibt aber auch alternative Matcher
**** https://hamcrest.org/JavaHamcrest/tutorial[Hamcrest^]
**** https://assertj.github.io/doc/[assertJ^]
**** ...

*** Vorteile von alternativen Matcher
**** Übersichtlichkeit des Codes
**** Schreibweise (fluent)
**** Anzahl der Matcher
***** zB speziell für Collection-Vergleiche
***** zB für Datenbanken
***** https://jenkov.com/tutorials/jdbc/index.html

=== Activity Diagrams

* https://plantuml.com/activity-diagram-beta#sdl[ACD in plantuml^ (SDL)]

=== Zustandsdiagramme

== 2023-03-13

=== Forstsetzung Docker

==== Registry

* zB hub.docker.com

==== Bind Mounts vs Volumes

==== Hausübung

* Erstellen eines Container mit MariaDb
** In einem bind mount sollen die Datenbank-Files gespeichert werden (`db`-Verzeichnis)
** Das `docker run` - Kommando soll in einem shell-script `create-db-container.sh` gespeichert werden.
** Nach Ausführen des Scripts soll der Container erstellt werden.
** Erstellung eines Script `stop-db-container.sh` (der Container muss automatisch gelöscht werden)
** Nach einem neuerlichen Start müssen die Daten wieder vorhanden sein
** Erstellen Sie in IntelliJ eine Datenbank-Connection zu Ihrer Maria-Db

== 2023-03-24

=== Docker

* Docker ist eine leichtgewichtige Virtualisierung

==== Komponenten

* Container
* Image
* Netzwerk
* ev.
Volume oder Bind Mount

==== Image

* Image ist immtable und kann daher von mehreren Containern benutzt werden.

* Woher bekommt man ein Image?

** Pullen von der Docker Registry
** build mit einem Dockerfile (auch hier wird meist ein grundlegendes Image von einer Registry geholt)

* Welche Registries gibt es?

** Große öffentlich wie zB
*** hub.docker.com
*** quay.io
*** ghcr.io (Docker Registry von github)
*** ...

** Man kann eine eigene Registry hosten
*** https://hub.docker.com/_/registry


* Dockerfile

** vglbar mit einem Kochrezept oder einem shell-script
** Die Befehle werden sequentiell abgearbeitet

----
FROM debian:bullseye-slim

LABEL maintainer="NGINX Docker Maintainers <docker-maint@nginx.com>"

ENV NGINX_VERSION   1.23.3
ENV NJS_VERSION     0.7.9
ENV PKG_RELEASE     1~bullseye

RUN set -x \
# create nginx user/group first, to be consistent throughout docker variants
    && addgroup --system --gid 101 nginx \
    && adduser --system --disabled-login --ingroup nginx --no-create-home --home /nonexistent --gecos "nginx user" --shell /bin/false --uid 101 nginx \
    && apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests -y gnupg1 ca-certificates \
    && \
    NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
    found=''; \
    for server in \
        hkp://keyserver.ubuntu.com:80 \
        pgp.mit.edu \
    ; do \
        echo "Fetching GPG key $NGINX_GPGKEY from $server"; \
        apt-key adv --keyserver "$server" --keyserver-options timeout=10 --recv-keys "$NGINX_GPGKEY" && found=yes && break; \
    done; \
    test -z "$found" && echo >&2 "error: failed to fetch GPG key $NGINX_GPGKEY" && exit 1; \
    apt-get remove --purge --auto-remove -y gnupg1 && rm -rf /var/lib/apt/lists/* \
    && dpkgArch="$(dpkg --print-architecture)" \
    && nginxPackages=" \
        nginx=${NGINX_VERSION}-${PKG_RELEASE} \
        nginx-module-xslt=${NGINX_VERSION}-${PKG_RELEASE} \
        nginx-module-geoip=${NGINX_VERSION}-${PKG_RELEASE} \
        nginx-module-image-filter=${NGINX_VERSION}-${PKG_RELEASE} \
        nginx-module-njs=${NGINX_VERSION}+${NJS_VERSION}-${PKG_RELEASE} \
    " \
    && case "$dpkgArch" in \
        amd64|arm64) \
----

** Die Statements (einzelnen Befehle) werden oft mit einem && verbunden, dh sie werden nacheinander ausgeführt

** Dies ist wichtig, da Docker für jedes einzelne Kommando eine eigene Schicht erstellt.
** Mit && können mehrere Befehle zu einer Schicht (Layer) zusammengefasst werden.

== 2023-03-31

=== Docker-Netzwerk

== 2023-04-14

=== Testrückgabe test03w

=== Dockerfile wiederholt

=== Git - Fork

=== Git - Templates

=== Testen

==== Was testet man?

===== Teststrategien

* bei Datenbanken
** CRUD-Funktionalität
*** CREATE - Erstellen eines Datensatzen einer Entity Klasse in der Entity-Table
*** READ - Lesen eines Datensatzes und erstellen des zugehörigen Java - Objekts
*** UPDATE - Ändern eines Java - Objekts und diese Änderungen werden in der zugehörigen DB-Tabelle gespeichert
*** DELETE - Löschen eines Java - Objekts mit dazugehörogem Löschen in der Datenbank
+
TIP: Man beginnt mit den Stammdaten (ohne Abhängigkeiten zu anderen Tabelle)

*** Bsp:
***** Nicht Zimmer, sondern Hotel als erste Klasse testen

** Transaktionen nicht vergessen


* User Stories (Use-Cases, Anwendungsfälle) testen

** zB Reise buchen
** zB Reise stornieren

* Grenzwertanalyse - Grenzwerte werden getestet

** zB Alter von 450 Jahen bei Personen - wie reagiert das System
** Alter von -10 Jahren

* Äquivalenzklassenanalyse -> Äquivalenzklassen identifizieren und aus jeder Klasse einen Wert testen und die Grenzen dieser Klasse

** Bsp: Eintrittspeise: Kinder frei, Jugendliche 5 €, Erwachsene 50 €, Pensionisten 20€
*** Sind drei Äquivalenzklassen (alle Eingabewerte innerhalb einer solchen Klasse ergebn des selben Ausgabewert)
*** Bsp: Kind mit 3J -> gratis
*** Kind mit 5 J -> gratis


* Exceptions testen

==== Naming der Tests

The name of your test should consist of three parts:

* The name of the method being tested.
* The scenario under which it's being tested.
* The expected behavior when the scenario is invoked

//--
* Sources:
** https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices#naming-your-tests[microsoft^]
** https://medium.com/@stefanovskyi/unit-test-naming-conventions-dd9208eadbea[Unit Test Naming Conventions^]

== 2023-04-17

=== assertj-Tipps

image::assertj-using-recursive-comparison.jpg[]

image::assertj-satiesfies.jpg[]

=== Übung Dockerfile

* führen Sie die Dockerfile-Übungen aus den https://htl-leonding-college.github.io/docker-lecture-notes/dockerfile.html#_create_a_docker_image[Technology Notes^]


=== Übung Youtrack für das eigene Projekt

* Erstellen Sie im Product-Backlog mehrere UserStories und Tasks für eine, max. 2 User Stories
* Verschieben Sie diese 2 User Stories mit ihren Tasks in das Sprint-Backlog
* Führen Sie nun die in den Tasks angeführten Aufgaben durch und "verbinden" sie die Commits mit den jeweiligen Tasks (Issues)


== 2023-04-24

[source,asciidoc]
----
= Überschrift
vn nn
1.0.0, {docdate}
ifndef::imagesdir[:imagesdir: images]
:icons: font
:sectnums:    // Nummerierung der Überschriften / section numbering
// :toc:
// :toclevels: 1
:experimental:
//https://gist.github.com/dcode/0cfbf2699a1fe9b46ff04c41721dda74?permalink_comment_id=3948218
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]

[discrete]
== Themenschwerpunkte
----

== 2023-04-28

=== Wdhlg Docker

=== docker-compose

== 2023-05-05

== 2023-05-15

* Wiederholung Docker
* Wiederholung docker-compose

=== Übung docker-compose

* erstellen Sie ein File `docker-compose.yaml` welches folgende Dienste beinhaltet
** Service backend
*** beinhaltet eine php-Anwendung
*** greift auf eine mariadb zu
*** wird mittels einem Webserver deployed
** Service webserver
*** ein nginx Server oder Apache httpd Webserver
** Service db
*** wird vom Service backend benutzt
** Service phpmyadmin
** Netzwerk my-network mit ip 10.0.2.0/24

* erstellen Sie *ein* asciidoc-File, dass direkt die source-Files (docker-compose.yaml) in das sciidoc-File included. (vgl. https://github.com/htl-leonding-college/asciidoctor-docker-template/blob/master/asciidocs.demo/demo.adoc[Demo für Asciidoctor-Features^])
** Es darf nicht das gesamte File auf einmal inkludiert werden, sondern nur die einzelnen Teile hintereinander
** verwenden Sie https://docs.asciidoctor.org/asciidoc/latest/macros/keyboard-macro/[keyb-Macros^]
** Achten Sie auf eine saubere Präambel und allgemein ein sauberes Asciidoc-File

* Abgabe: siehe https://edufs.edu.htl-leonding.ac.at/moodle/mod/url/view.php?id=162267[moodle^]

* Quellen:
** https://hostadvice.com/how-to/web-hosting/how-to-deploy-a-php-application-using-docker-compose/[How To Deploy a PHP Application Using Docker-compose^]
** https://www.cloudbees.com/blog/using-docker-compose-for-php-development[PHP als Dockerfile^]
** https://github.com/rhamdeew/docker-compose-php/blob/master/docker-compose.yml


== 2023-05-22

=== Commits

* Es wird vereinbart für die Commit-Messages folgende Formate zu verwenden:

** https://www.conventionalcommits.org[^]
** im Besonderen: https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional#commitlintconfig-conventional[@commitlint/config-conventional^]
** und auch https://github.com/angular/angular/blob/16.0.x/CONTRIBUTING.md#-commit-message-format[Angular conventions^]


== 2023-06-16

=== 4. Leistungsfeststellung Wiederholungstermin

=== Lernstrategien

image::lernstrategie1.png[]
image::lernstrategie2.png[]

=== Iteration in der Projektarbeit

image::iteration.png[]

