= 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
*** Raspmbc => OSMC
*** Raspyfi => 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
++++
++++
== 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
++++
++++
== 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^]