= 22/23 3bhif syp - Lecture Notes
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-3bhif-syp/2223-3bhif-syp-lecture-notes/main/asciidocs/{docname}.adoc] ‏ ‏ ‎
icon:github-square[link=https://github.com/2223-3bhif-syp/2223-3bhif-syp-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

* Organisatorisches

=== Plantuml

* https://plantuml.com/en/class-diagram

[plantuml,cld,png]
----
include::plantuml/cld.puml[]
----

== 2022-10-03

=== Git-Grundlagen

* centralized vcs
* distributed vcs

=== Projekte (Buch)

==== Projektmerkmale

* Routineaufgaben vs. Projekte


image::querschnittsaufgaben.png[]

* Reporting (Berichtswesen)
** Standard-Reports (wöchentlich, monatlich, ....)
** adhoc-Reports (aufgrund eines Ereignisses)


* Stakeholder -> Betroffenen
** nicht die Projektdurchführenden (Programmierer und User) und Eigentümer, sondern Personen, die die Auswirkungen des Projekts verspüren
** Stakeholder-Analyse identifiziert die Betroffenen, versucht die Auswirkungen für diese Betroffenen zu erfassen und ggf. deren Maßnahmen

* Meilenstein beinhaltet
** Termin (Zeitpunkt)
** und eine inhaltliche Komponente (Was wurde gemacht)


==== Projektantrag

* Erstellen Sie einen Projektantrag (Link im Moodle)
** in Asciidoctor
** Gliederung lt. Buch


== 2022-10-10

=== Kreativitätstechniken

==== Mindmap

* Freeplane
* plantuml - mindmap

* doc-as-code

[plantuml]
----
@startmindmap
* Debian
** Ubuntu
*** Linux Mint
*** Kubuntu
**** KDE
*** Lubuntu
**** LXDE
*** KDE Neon
** LMDE
** SolydXK
** SteamOS
** Raspbian with a very long name
*** <s>Raspmbc</s> => OSMC
*** <s>Raspyfi</s> => Volumio
@endmindmap
----

=== Projektidee - Projektantrag

=== Variantenbildung

* SWOT - Analyse

=== Zielbestimmung

* Ausgangssituation
* Problemstellung
* Aufgabenstellung
* Ergebnis -> Leistung
* Ziel -> Leistungswirkung

//--

* Operationalisieren s. Buch S. 53


==== Magisches Viereck

image::effektivität-vs-effizienz.png[]

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



== 2022-10-17

.Projektanträge - Übersicht
[%collapsible]
====
[plantuml,png]
----
include::plantuml/projekte.puml[]
----
====

.Projektgruppen
[%collapsible]
====
[plantuml,png]
----
include::plantuml/projektgruppen.puml[]
----
====


* https://github.com/htl-leonding-college/asciidoctor-convert-template


== 2022-11-07

=== Projektaufträge

=== Klassendiagramm

* bis Folie 3-1-19 Geltungsbereich (Scope) Attribute und Methoden

=== Modell

* Vereinfachte Darstellung der Realität unter Berücksichtigung eines besonderen Aspektes

* zB
** Datenmodell -> die Datenstrukturen werden besonders herausgearbeitet
** Ablaufdiagramm -> die zeit-logischen-Zusammenhänge werden besonders beachtet

[plantuml,democld,png]
----
@startuml
class Person {
 -firstName: String
 -lastName: String
}
@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

=== Klassendiagramme (Fortsetzung)

* Signatur


[plantuml,democld2,png]
----
@startuml
abstract class Mammal {
}

class Person {
 -firstName: String
 +lastName: String
 -{static} counter: int
}

class Hobby

Person -right- Hobby : > übt aus

Mammal <|-- Person
@enduml
----

==== Multiplizität

* 2 Interpretationen
** Anzahl der Instanzen einer Klasse
*** keine Instanzen zB Math-Klasse
*** eine Instanz -> Singleton
*** mehrere Instanzen
** Anzahl der Objekte bei einer Beziehung zB Assoziation

=== DOM - Domain Object Model

* nicht zu verwechseln mit Document Object Model (Baum-Repräsentation der HTML-Seite im Browser)
* Domain entspricht Fachbereich
** zB Medizin, Einzelhandel, Kfz-Handel, Warenwirtschaft,...
* DOM ist vergleichbar mit einem ERD
** ein Klassendiagramm ohne technische Klasse nut mit Fachbereichsklassen


=== Beziehungen

** Assoziation - benutzt-Beziehung
** Aggregation - "besteht aus" -> zerstörungsfreie Zerlegung
*** zB Auto besteht aus Autoreifen
** Komposition - "besteht aus" -> zerstörende Zerlegung
*** zB Haus besteht aus Etagen
** Vererbung
** Realisierung (Implementierung)

//--

* Beziehungen
** unidirektional
** bidirektional

//--

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


==== Vererbung

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

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


.Assoziative Beziehung (wird bei \*:*-Beziehungen verwendet)
[plantuml,democld3,png]
----
@startuml
left to right direction
Firma -- Person
(Firma, Person) .. Aktie
@enduml
----

.Alternative bei der Darstellung einer assoziativen Beziehung
[plantuml,democld4,png]
----
@startuml
left to right direction
Firma "1" <-- "0..*" Aktie
Aktie --> Person
@enduml
----

=== Anwendungsfalldiagramm (Use-Case-Diagramm)

* 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,demo4,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
----

* ev. Ergänzung mit
** Tabelle und
** Aktivitätsdiagramm



== 2022-11-21 Erstellen von gh-pages mit Asciidoctor

* altes Repo mit asciidoctor - Beispielen
** https://github.com/htl-leonding-college/asciidoctor-docker-template
** html-pages werden lokal erstellt
* neues Repo
** https://github.com/htl-leonding-college/asciidoctor-convert-template
** html wird in einem gh-runner generiert

=== 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?^]

=== Anforderungen an Projekt-Repositories

* Im repo-root gibt es ein README.adoc, in dem
** ganz kurz erklärt wird, was die Aufgabenstellung (und ev. das Problem) des Projekts ist
** sämtliche (adoc)-Dokumente aufgelistet sind
** das .idea-Verzeichnis wird nicht committed
** REGEL: Sämtliche Artefakte, die generiert werden, dürfen nicht im Repo gespeichert werden

=== Anforderungsanalyse

==== Interview



== 2022-11-28

image::projekt-leitfaden.png[]

* kein technischer Overkill - besser mit Bleistift gezeichnetes Wireframe als Clickable Mockup

=== Pflichtenheft

=== Git - Branches

.source: https://www.atlassian.com/de/git/tutorials/comparing-workflows/gitflow-workflow[Git-flow-Workflow^]
image::feature-branches.svg[]

* main-branch nur für releases
* develop-branch immer lauffähig
* feature- und bugfix-branches für entwickeln

== 2022-12-05

== Git - Architektur und Überblick

image::git-overview2.png[]

=== V-Modell

image::v-modell.png[]

==== Vorgehensmodelle in der Software Entwicklung

* Grobe Unterteilung
** Klassische Vorgehensweise
*** Wasserfallmodell
*** Spiralmodell nach Boehm
*** V-Modell
*** ...
** Agile Vorgehensmodelle
*** Scrum
*** Kanban

== 2022-12-19

=== Test 01

=== Scrum

== 2023-01-09

=== Rückgabe Test und Besprechung

=== Nächste Schritte im Projekt

== 2023-01-16

=== Regeln für die Projektarbeit

==== Jeder Commit ist einer User Story / Task zugeordnet

==== Arbeitszuordnung

* Jedes Projektmitglied hat einen eigenständigen Aufgabenbereich zB einen Task.
* Dieser Task wir in einem eigenem Branch erstellt / durchgeführt

==== Sprint Reviews / Präsentationen

* Es darf nicht auf dem eigenen Rechner (kein grüner Pfeil in der IDE) präsentiert werden. Ein essentielles Deployment ist erforderlich.

* Folgende Möglichkeiten
** oravm
** leocloud in eigenem Namespace
** minikube

IMPORTANT: In einem laufenden Sprint wird nichts verändert. Weder Aufgaben des Sprint Backlog noch die gewählte Vorgangsweise (zB Branching)

==== git-branching

image::git-branching.png[]


=== Projekthandbuch für Scrum

* Team mit Rollen
* Wie werden die Branches durchgeführt (siehe #git-branching)
* Die URL für
** github-Repo
** Doku
** Scrum-Board


* https://www.youtube.com/watch?v=jXBo-RasY3g


=== Dokumentation

* Es muss eine (grobe) Systemarchitektur geben
* Gewisse Entwurfsentscheidungen müssen dokumentiert werden
* Eine RevealJS-Präsentation muss immer verfügbar sein
** Problemstellung
** Aufgabenstellung
** derzeitiger Stand

=== Testen

* Die Akzeptanzkriterien sind als Unit-Tests implementieren (wenn möglich)
* und ist zu präsentieren

=== Film

* im 5. Jg.

=== Plakat


=== Nächste Schritte im Projekt

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

* Entsprechend der Vorlage wird mit mybatis ein grundlegendes Projekt erstellt.
** Erstellung eines plantuml-Datenmodells mit anschließender Erstellung eine sql-Files
** Beim Starten des Projekts werden die Tabellen erstellt und Daten importiert (INSERTs)



== 2023-01-23


=== Pflichtenheft

* Ausgangssituation
* Istzustand (IST)
** DOM-Ist
* Problemstellung
* Aufgabenstellung (SOLL)
** Funktionale Anforderungen
*** DOM-Soll
*** UCD
*** ACD
*** Wireframes
** Nichtfunktionale Anforderungen

image::nfa.png[]

* Ziele
    * Mengengerüst
* ...

* TODO: Wie erstelle ich eine RevealJS-Präsentation

image::dart-feedback-2023-01-23.png[]




== 2023-02-13

* 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 Virtualisierung.

==== 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>
++++


== 2023-03-10


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



== 2023-03-13

* Leistungsfeststellung

=== Docker

image::web-server.png[]


==== Hausübung

* Erstellen eines Containers 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-20

=== Package Manager (maven, gradle, ...)

* gibt die Struktur (Verzeichnisse, Files, ...) in einem Softwareprojekt vor
** https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html
** hat den Vorteil, dass Softwareprojekte in jeder IDE geöffnet werden kann (zB intellij, vsc, eclipse, ...)
* man trägt in einer zentralen Datei (bie maven pom.xml) die Library ein
** diese Libraries werden automatisch beim Start des Programms heruntergeladen und
** in einem zentralen Verzeichnis gespeichert (bei maven .m2 im User-Home)
** Dies hat den Vorteil, dass bei Verwendung einer Library in mehreren Projekten, die Library nur einmal heruntergeladen wird.

=== Testen von Softwareprodukten

* jUnit
** stellt die Funktionalität zur Verfügung, um ein Programm testen zu können
** beim Testen werden die Ergebnisse von Methoden mit erwarteten Werten verglichen (matching)
** falls nicht das erwartete Ergebnis geliefert wird, gibt es einen Fehler
** als matcher kann man die Methoden von jUnit verwenden, allerdings gibt es bessere (zB hamcrest, assertj, karate ,...)
** wir verwenden assertj-core und assertj-db

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


== 2023-03-20


=== Activity Diagrams

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



== 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)




=== 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

=== Docker build

== 2023-04-24

=== Projekt-Feedback

==== Testen

* Tests müssen voneinander unabhängig sein


=== docker-compose Einführung

== 2023-05-15

=== docker-compose

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


==== Übung docker-compose

* erstellen Sie ein File `docker-compose.yaml` welches folgende Dienste beinhaltet
** Service backend
*** beinhalted eine nodejs-express-Anwendung
*** greift auf eine mariadb zu
** 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.
** 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=162255[moodle^]

== 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^]

