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