LF06.2 - Anwendungsentwicklung

1 Relationale Datenbanken

In der Praxis sind Relationale Datenbankmanagementsysteme immer noch von großer Bedeutung[3].

1.1 Datenbank-Entwurf

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... ein konzeptionelles ER-Modell entwerfen
  • ... ein ER-Modell in ein Relationales Datenmodell überführen
  • ... ein Relationales Datenmodell optimieren
  • ... eine Tabellenstruktur in einer Datenbank anlegen

(Präsentation aus dem Unterricht)

1.1.1 Entwurfs-Phasen

Beim Entwurf von Datenbanken durchläuft man die folgenden Phasen:

Externe Phase
Meist ausgehend von den Attributen des Klassendiagramms werden in der Anforderungsanalyse die zu speichernden Informationen bezogen auf die Anwendung ermittelt.
Konzeptionelle Phase
Der Sachverhalt wird in einem sematischen Modell formalisiert beschrieben. Am Schluss dieser Phase steht ein Entity Relationship Modell[4]. Dieses ER-Modell stellt hauptsächlich die Entitätstypen und deren Beziehungen untereinander mit den entsprechenden Kardinalitäten übersichtlich dar.
Logische Phase
Das semantische Datenmodell wird in ein relationales Datenmodell überführt. Dabei werden die Beziehungen zwischen den Tabellen konkret über Schlüsselfelder bzw. Verknüpfungstabellen realisiert. Anschließend wird das relationale Schema durch Normalisierung optimiert. Außerdem dürfen keine Prozessdaten gespeichert werden.
Physische Phase
Nach Festlegung der Datentypen wird das relationale Schema in einer Datenbank (z.B. mit SQL-Befehlen) angelegt.

1.1.2 Normalformen[5]

Zur Vermeidung von Redundanzen, die zu Anomalien führen können, sollten Datenbanken normalisiert werden.

1. Normalform
Atomare Werte.
2. Normalform
Jedes Nicht-Schlüsselattribut ist vom gesamten Schlüssel abhängig.
3. Normalform
Nicht-Schlüsselattribute sind voneinander unabhängig.

Links zum Nachschlagen

Arbeitsauftrag:

  • Datenbank für Rechnungserstellung:
  1. Erstellen Sie ein Datenbank-Modell in der Chen-Notation, die alle Informationen enthält, um eine Rechnung zu erstellen.
  2. Vergleichen Sie Ihr ER-Modell mit dem Modell an der Tafel, listen Sie die Unterschiede auf und beschreiben Sie die Auswirkungen in der Praxis.
  3. Überführen Sie das ER-Modell zur Rechnungserstellung in ein relationales Datenmodell.
  4. Überprüfen Sie das Datenmodell auf die drei Normalformen.
  • Betriebsabrechnungs-Datenbank:
  • Jeder Kunde hat die Attribute Name und Adresse.
  • Jeder Mechaniker hat die Attribute Name und Ausbildungsstand.
  • Jede Auftragsposition hat die Attribute Beschreibung und AnzahlArbeitseinheiten.
  • Kunden vergeben Aufträge; dabei erfolgt die Vergabe an bestimmtem Tag.
  • Mechaniker bearbeiten Aufträge; manche Aufträge werden von mehreren Mechanikern bearbeitet.
  • Jeder Auftrag besteht aus mindestens einer und maximal beliebig vielen Auftragspositionen.
    Auftragspositionen können zu mehreren Aufträgen gehören.
  • Mechaniker vergeben keine Aufträge.
  1. Definieren Sie ein entsprechendes, konzeptionelles Entity-Relationship Modell.
  2. Überführen Sie das ER-Modell in ein relationales Datenbankmodell. Vergessen Sie nicht alle Primär- und Fremdschlüssel sowie Attribute anzugeben.
  3. Überführen Sie das Modell in die dritte Normalform.
  • Datenbank für die Einkaufsabteilung:
  • ein Einkäufer führt mehrere Bestellungen aus
  • mit jeder Bestellung werden eine oder mehrere Waren zu unterschiedlichen Stückzahlen bestellt
  • eine Ware kann jeweils nur bei einem Hersteller bezogen werden
  • jede Ware wird einer Warengruppe zugeordnet
  • an einem Lagerort können mehrere Waren gelagert werden
  1. Erstellen Sie hierzu das entsprechende ER-Modell in der Chen-Notation.
  2. Überführen Sie das ER-Modell in ein relationales Datenbankmodell in der Dritten Normalform.
  • Datenbank für Online-Schichtplan:
  1. Entwickeln Sie aus dem Klassendiagramm, dem das WebTaxi Lastenheft zu Grunde liegt, für den Online-Schichtplan ein ER-Modell.
  2. Überführen Sie das ER-Modell für den Online-Schichtplan in ein relationales Datenmodell.
  3. Überprüfen Sie das Datenmodell auf die drei Normalformen.

1.2 Vererbungen realisieren

Relationale Datenbanken können keine Vererbungsstrukturen darstellen. Es gibt verschiedene Wege, Vererbungshierarchien objektorientierter Modelle auf Datenbanktabellen abzubilden[6].

1.3 SQL

SQL am Beispiel der verbreiteten MySQL-Datenbank (Präsentation aus dem Unterricht).

Nordwind.png

Für Übungszwecke eignet sich die Nordwind-Datenbank.

Arbeitsauftrag:

  1. Vorbereitung:
    1. Installieren Sie xampp im Hauptverzeichnis auf Ihrem PC.
    2. Rufen Sie C:\xampp\xampp-control.exe auf und starten den Apache-Webserver und die MySQL-Datenbank. Falls der Apache nicht startet, kontrollieren Sie mit netstat -an ob der Port 80 belegt ist. In diesem Fall können Sie in der c:\xampp\apache\conf\httpd.conf über den Eintrag 'Listen' den Port umstellen, z.B. auf 8080.
    3. Speichern Sie das SQL-Skript lokal auf Ihrem PC.
    4. Importieren Sie das Skript mit dem phpMyAdmin, alle erforderlichen Datenbanken und Tabellen mit Daten werden angelegt.
  2. Legen Sie eine leere Datenbank an und überführen Sie das folgende ER-Modell
    er-modell.png
    mit Hilfe von SQL-Befehlen in Tabellen. Legen Sie die entsprechenden Primär- und Fremdschlüssel und alle Verknüpfungen an.
    Dokumentieren Sie alle hierfür notwendigen SQL-Befehle.
  3. Ermitteln Sie die SQL-Befehle für diese Abfragen[1].
    Dokumentieren Sie Ihre Lösungen, hierfür können Sie diese Vorlage verwenden.

Links zum Nachschlagen

Tutorials und Lernplattformen


  1. Die Seite wird mit folgenden php-Skript erzeugt: SQL_Aufgaben-Funktion

2 Node.js

Zuerst muss Node.js installiert werden. Fügen Sie anschließend die MySQL-Unterstützung hinzu.

Arbeitsauftrag:

  1. Bearbeiten Sie das Aufgabenblatt

3 HTML und PHP

PHP ist eine Programmiersprache, die in einer HTML-Seite eingebunden und serverseitig interpretiert wird. Der Interpreter ist in dem xampp-Paket, dass Sie im SQL-Teil bereits verwendet haben, integriert. Zur Verwendung muss der Webserver gestartet sein, die Datei mit der Endung '.php' in dem Verzeichnis c:\xampp\htdocs (oder darunter) liegen und über den Web-Browser aufgerufen werden.

Siehe Ringhand Kapitel 7.1, 7.2.1, 7.6, Seiten 246-263, 303-310

Einführung in PHP...

Arbeitsauftrag: Erstellen Sie die folgenden Seiten mit PHP-Skripten:
Kommentieren Sie alle Skripte und fassen diese in einem Dokument (.pdf) zusammen.

  1. Datum
  2. Verbrauch 1
  3. Verbrauch 2
  4. Mehrwertsteuer
  5. Buskarte
  6. dezimal zu binär
  7. Aufzinsfaktor
  8. Zinsen
  9. Schnittpunkt
  10. Geradengleichung

3.1 MySQL-Zugriff über PHP

Arbeitsauftrag:

  1. Schrittweise Erstellung einer Bestellmaske für die Nordwind-Datenbank:
  • Einleitung: nur die Artikel ausgeben (Quelltext)
  • Bestellungen ausgeben
    Erstellen Sie ein Programm, mit dem zunächst alle Bestellungen aus der Nordwind-Datenbank in Tabellenform angezeigt werden. Zeigen Sie die Spalten ‘Bestellnummer’, ‘Firmenname’, ‘Vor-und Nachname des Sachbearbeiters’ (Personal), ‘Bestelldatum’, ‘Name der Versandfirma’ und ‘Frachtkosten’ an .
  • 1. Erweiterung
    Erweitern Sie die Ausgabe um die Spalten ‘Gesamtwarenwert’ (Rabatt berücksichtigen) und ‘Gesamtwert’ (Gesamtwarenwert + Frachtkosten)
  • 2. Erweiterung
    Über Listen (Combobox) sollen Kunden, Sachbearbeiter (Personal) und/oder Versandfirmen mit ihrem Namen auswählbar sein. Zusätzlich kann ein Datumsbereich angegeben werden. Die angezeigten Bestellungen werden dann entsprechend eingeschränkt .
    (optional: Schränken Sie den Inhalt der anderen ComboBoxen abhängig von der Auswahl einer ComboBox ein.)
  • 3. Erweiterung:
    Wenn eine Bestellung aus der Liste ausgewählt wird, werden alle Positionen dieser Bestellung angezeigt. Hierbei werden die Spalten ‘Artikelname’, ‘Anzahl’, ‘Einzelpreis’, ‘Rabatt’ und ‘Gesamtpreis’ angezeigt.
  • 4. Erweiterung:
    Über eine Schaltfläche wird ein Dialog oder Fenster geöffnet, in dem eine neue Bestellung angelegt werden kann. Die Einträge für Kunde, Sachbearbeiter und Versandfirma sollen über Listen (Combobox) ausgewählt werden.
  • 5. Erweiterung:
    Der neu angelegten Bestellung können beliebig viele Artikel zugeordnet werden. Die Artikel werden über eine Liste aus der Artikel-Tabelle ausgewählt. Die Anzahl und der Rabatt für die Bestellposition werden frei eingegeben, für die Eingaben erfolgt eine Plausibilitätsprüfung.
  • 6. Erweiterung:
    Bevor der Artikel der Bestellung hinzugefügt wird, wird der Lagerbestand (Artikel-Tabelle) überprüft. Nach erfolgter Bestellung wird der Lagerbestand in der Artikel-Tabelle angepasst und der Mindestbestand überprüft. Wird der Mindestbestand unterschritten oder reicht der Lagerbestand für die Bestellung nicht aus, ist eine entsprechende Meldung auszugeben.
  • 7. Erweiterung:
    Eine einzelne Bestellung kann mit allen Positionen und sonstigen Angaben übersichtlich in ein pdf-Dokument exportiert werden.
  1. Erstellen einer Webanwendung für einen Online-Schichtplan auf der Grundlage des WebTaxi Lastenheftes

Tutorials und Lernplattformen:

4 PowerShell

Erstellen Sie auf einem der Server, die in den Unterrichtsräumen bereitliegen oder lokal auf Ihrem Rechner eine virtuelle Maschine mit Windows Server 2019[7] und erstellen Sie ein Active-Directory [8]. Treten Sie der Domäne als Administrator bei.

Die PowerShell ist ab Windows 7 SP1 bereits installiert. Zur Überprüfung der Version öffnen Sie die PowerShell und geben Sie den Befehl $PSVersionTable ein. Update

4.1 Anwendungsfälle

  1. AD-Benutzer anlegen
  2. AD-Gruppen erstellen und AD-Benutzer hinzufügen:
    1. Gruppe erstellen
    2. alle AD-Benutzer, die in der Gruppe 'VerkaufWest' sind, auch in der Gruppe 'Verkauf' hinzufügen, sofern sie noch nicht Mitglied in dieser Gruppe sind.
  3. Monitoring
    1. Event-Log nach bestimmten Fehlermeldungen durchsuchen
    2. Ressourcen-Verbrauch
  4. Skripte bei Benutzeranmeldung automatisch ausführen
  5. Datei-Operationen
  6. Registry-Bearbeitung
  7. Verändern der Energie-Optionen von verbundenen Computern
  8. (Firewall-Regeln)
  9. Exchange-Administration über Exchange Management Shell
    1. Mails versenden
    2. Kalender-Freigabe
    3. Postfach anlegen
    4. Bearbeiten von Regeln

Arbeitsauftrag:

  1. Erstellen Sie zu den oben genannten Anwendungsfällen eine Dokumentation, die die Befehle mit einer präzisen Erläuterung enthält. Testen Sie die Befehle, soweit wie technisch möglich.

4.2 Skript-Verarbeitung

In Skripten lassen sich mehrere Befehle zusammenfassen. Hierbei besteht die Möglichkeit, Parameter zu übergeben und innerhalb des Skriptes mit Variablen, bedingten Verzweigungen und Schleifen zu programmieren. In der PowerShell ISE lässt sich der Skript-Bereich im Menü View - Show Script Pane (Ctrl+R) einschalten.

Arbeitsauftrag:

  1. Erstellen Sie ein Skript, das einen Benutzer anlegt. Dabei soll zuerst überprüft werden, ob der Benutzer bereits existiert. Der Benutzername wird bei Aufrufen des Skripts übergeben und das Passwort wird zweimal durch das Skript abgefragt. Die beide Eingaben werden verglichen und bei Übereinstimmung das Skript angelegt.

5 Container-Virtualisierung

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... den Unterschied zwischen Container- und Betriebssystem-Virtualisierung erklären
  • ... Container starten und mit Volumes verbinden
  • ... mehrere Container starten, die untereinander in Abhängigkeit stehen

Docker ist eine Software, mit der Server-Dienste in Containern virtualisiert werden können und getrennt voneinander laufen. Der Container beinhaltet ein Programm mit all seinen Abhängigkeiten, wodurch er sich in allen Umgebungen identisch verhält, was seine Portierung stark vereinfacht. Dabei nutzen die Container gemeinsam das Host-Betriebssystem. Es besteht die Möglichkeit, fertige Images zu nutzen oder diese selbst zusammen zu stellen.

Warum man unbedingt Docker lernen muss:[9]

5.1 Begriffe[1]

Image
ein Speicherabbild eines Containers. Das Image selbst besteht aus mehreren Layern, die schreibgeschützt sind und somit nicht verändert werden können. Ein Image ist portabel, kann in Repositories gespeichert und mit anderen Nutzern geteilt werden. Aus einem Image können immer mehrere Container gestartet werden.
Container
als Container wird die aktive Instanz eines Images bezeichnet. Der Container wird also gerade ausgeführt und ist beschäftigt. Sobald der Container kein Programm ausführt oder mit seinem Auftrag fertig ist, wird der Container automatisch beendet.
Layer
ein Layer ist Teil eines Images und enthält einen Befehl oder eine Datei, die dem Image hinzugefügt wurde. Anhand der Layer kann die ganze Historie des Images nachvollzogen werden.
Dockerfile
eine Textdatei, die mit verschiedenen Befehlen ein Image beschreibt. Diese werden bei der Ausführung abgearbeitet und für jeden Befehl ein einzelner Layer angelegt.
Repository
ein Repository ist ein Satz gleichnamiger Images mit verschiedenen Tags, zumeist Versionen.
Registry
eine Registry, wie zum Beispiel Docker Hub oder Artifactory, dient der Verwaltung von Repositories.
libcontainer
eine Schnittstelle zu den Grundfunktionen von Docker.
libswarm
eine Schnittstelle, um Docker-Container zu steuern.
libchan[2]
ermöglicht eine einfache („light weighted“) Kommunikation zwischen Prozessteilen und Prozessen.

5.2 Docker installieren

Docker steht für die gängigen Plattformen - Linux, Raspberry Pi, Windows, Mac - zur Verfügung[10]. Wenn Docker unter Windows installiert wird, muss auch das Windows-Subsystem Linux (WSL 2) installiert werden[11]. Docker kann nicht in einer Virtuellen Maschine installiert werden.

Unter Linux sollte man den eigenen Benutzer mit sudo usermod -aG docker $USER zur Gruppe 'docker' hinzufügen, damit nicht bei jedem Befehl 'sudo' angegeben werden muss[12]. Dieser Eintrag wird nach erneuter Anmeldung wirksam.

Play with Docker[13] stellt neben zahlreichen Tutorials auch eine Testumgebung bereit.

5.3 Wichtige Befehle[3]

Befehl Funktion
docker version zeigt die installierte Docker-Version an
docker run <Image> startet einen Container und lädt das Image aus dem Docker-Hub[14]
docker ps zeigt alle laufenden Container
docker ps -a zeigt alle Container, auch nicht laufende
docker stop <Container> stoppt einen Container
docker restart <Container> startet einen Container neu
docker inspect <Container> zeigt umfangreiche Informationen über den angegebenen Container
docker image ls zeigt heruntergeladene Images
docker image prune löscht nicht verwendete Images
docker volume create <VolName> erzeugt ein Volume[15]
docker volume prune löscht nicht verwendete Volumes (Vorsicht ist geboten)
docker stop $(docker ps -a -q) hält alle Container an
docker rm $(docker ps -a -q) löscht alle Container

5.4 Image verwenden

Das Docker-Image, wie man es z.B. aus dem Docker-Hub[16] herunterladen kann, ist die Grundlage für den Container. Neben dem eigentlichen Programm enthält es alle Abhängigkeiten, daher verhalten sich Container auf allen Systemen gleich.

Jeder, der ein Konto auf dem Docker-Hub anlegt, kann dort Images ablegen. Da hierbei keine weiteren Kontrollen stattfindet, können diese Images auch Schadsoftware enthalten. Daher sollte man zu Beginn nur offiziellen Images vertrauen und die Dokumentation sorgfältig lesen.

5.4.1 Einzelnen Container starten

Der Docker-Hub[17] stellt zahlreiche fertige images bereit. Da ein Container den Kernel des Betriebssystems benutzt, muss bei der Auswahl eines fertigen Images dieses eingestellt werden.

Das folgende Beispiel lädt das Images für den Webserver nginx herunter, startet ihn als Hintergrunddienst (-d), der auf Port 8080 hört und diesen an den Port 80 im Container weiter leitet. Der Container erhält den Namen mein-nginx:
docker run --name mein-nginx -d -p 8080:80 nginx

Wenn man auf die Shell innerhalb des Containers zugreifen will: (hierfür muss das Image eine Shell bereitstellen)
docker exec -it mein-nginx bash

Der Container kann mit docker stop mein-nginx angehalten und mit docker rm mein-ngingx gelöscht werden.

5.4.2 Daten persistent speichern

Ein Container existiert nur temporär und kann keine Daten dauerhaft speichern. Um das persistente Speichern und Bereitstellen von Daten zu ermöglichen, werden beim Starten des Containers Volumes verbunden[18]. Dort bleiben die Daten auch nach dem Löschen des Containers erhalten.

Man unterscheidet drei Arten von Volumes:

Host Volumes
man legt selbst fest, welches Verzeichnis des Host-Computer mit welchem Verzeichnis in dem Container verbunden werden soll.
docker run -v <Host-directory>:<Container-directory> <Image>
Anonymous Volumes
hier wird nur das Verzeichnis im Container angegeben. Das Verzeichnis auf dem Host-Computer wird von Docker automatisch festgelegt.
docker run - v <Container directory> <Image>
Named Volumes
für das Volume auf dem Host-Computer wird ein Name vergeben und das Verzeichnis im Container angegeben. Der genaue Ort des Volumes wird ebenfalls von Docker festgelegt.
docker run -v <Name>:<Container directory> <Image>

Die Volumes werden dann beim Starten des Containers automatisch angelegt, Named Volumes können aber auch mit dem Befehl docker volume create <Volume-Name> angelegt werden.

Docker speichert die Inhalte der Volumes im Verzeichnis[4]:

  • Linux: /var/lib/docker
  • Windows: C:\ProgramData\DockerDesktop
  • MacOS: ~/Library/Containers/com.docker.docker/Data/vms/0/

Arbeitsauftrag:

  1. Verbinden Sie ein Host-Volume mit einem Container:
    1. Legen Sie ein Verzeichnis lokal auf Ihrem PC an und und speichern Sie darin eine Datei 'index.html', die Sie mit einem beliebigen Inhalt füllen.
    2. Starten Sie anschließend den nginx[19]-Container und verbinden Sie das Verzeichnis als Host-Volume mit dem Container.
      Als Ergebnis muss im Browser die von Ihnen erstellte Seite angezeigt werden.
    3. Dokumentieren Sie die Vorgehensweise und das Ergebnis.

5.4.3 Mehrere Container starten

Wenn mehrere Container gestartet werden sollen, empfiehlt es sich unbedingt, die Einstellungen für diese Container einen Stack in einer Yaml-Datei[20] zu erstellen und diese mit docker-compose[5] auszuführen. Die Parameter, die mit docker run ... angegeben werden, müssen strukturiert in der Datei gesammelt werden[21]. Die Einrückungen in der Datei müssen unbedingt korrekt strukturiert sein.

Die Reihenfolge der Parameter ist für die Funktionalität nicht entscheidend. Es erhöht allerdings die Übersichtlichkeit deutlich, wenn man für alle Container in der Datei die selbe Reihenfolge der Parameter wählt.

Zunächst muss ein Ordner erstellt werden, in dem die Datei docker-compose.yml angelegt wird. Diese Datei hat eine festgelegte Struktur, die sehr gut in [22] und [23] beschrieben wird.

In der ersten Zeile steht die Angabe version:. Diese hängt von der Version der installierten Docker-Engine ab[24]. Anschließend werden unter services: alle zu startenden Container mit den erforderlichen Parametern aufgelistet.

Alle Container, die über eine Datei gestartet werden, befinden sich im selben Netzwerk, das mit dem Namen <Ordnername>_default automatisch erstellt wird. Docker stellt in diesem Netzwerk auch einen internen DNS bereit.

Wenn ein Container den Dienst eines anderen dringend benötigt - wie z.B. WordPress die Datenbank - kann dies unter depends_on: eingetragen werden, damit der WordPress-Container erst gestartet wird, wenn der Datenbank-Container läuft.

Unter environment: können die Umgebungsvariablen für die Konfiguration des Containers eingetragen werden[6]. Welche Variablen benötigt werden, erfährt man in der Dokumentation des Images.

Befehl Funktion
docker-compose up -d startet alle in der Compose-Datei festgelegten Container als Dienst.
Falls restart: always gesetzt ist, wird der Container auch noch Neustart des Hosts wieder gestartet.
docker-compose restart startet alle Container neu
docker-compose stop stoppt vorübergehend alle laufenden Container
docker-compose down stoppt alle Container und löscht sie

Wenn nur einzelne Container gestartet oder beendet werden sollen, muss der Name, der unter 'services:' angeben wurde, angehängt werden.

Wenn ein Named-Volume von mehreren Container gemeinsam genutzt werden soll, muss es unter 'volumes:' in der Yaml-Datei aufgelistet werden.

Alle Angaben können auch in einer beliebigen Datei gespeichert werden. Deren Name kann beim Starten mitgegeben werden: docker-compose -f <Datei>.yml up -d

Arbeitsauftrag

  1. Erstellen Sie eine Yaml-Datei, die alle Einträge enthält, um den nginx-Webserver mit dem Volume zu verbinden und zu starten.
    Kommentieren Sie jede Zeile in Datei mit #.
  2. Erstellen Sie eine Yaml-Datei, mit der Sie eine MySQL-Datenbank[25] starten und mit dem phpmyadmin[26], [27] verwalten können.
    1. Dabei sollen alle Daten der Datenbank und die Konfiguration des phpmyadmins lokal in einem Volume abgelegt werden.
    2. Kommentieren Sie auch hier jede Zeile.
    3. Importieren Sie die Nordwind-Datenbank[28]
  3. Starten Sie mit der Yaml-Datei einen Wordpress-Container[29], der ...
    1. ... den vorhandenen MySQL-Container nutzt und hierin eine eigene Datenbank anlegt. Stellen Sie die Verbindung über die entsprechenden Umgebungsvariablen her.
    2. ... einen eigenen Benutzer für den Datenbank-Zugriff nutzt, der ebenfalls in den Umgebungsvariablen eingetragen wird.
    3. ... Dateien für Themes und Uploads in einem eigenen Volume ablegt.
    4. Kommentieren Sie auch hier jede Zeile.
  4. Ergänzen Sie die Yaml-Datei um die notwendigen Einträge, die mediawiki[30] starten.
    1. Hierbei sollen im Wiki hochgeladene Dateien und Bilder in einem Volume auf dem Host abgelegt werden.
    2. Binden Sie als Datenbank-Server den MySQL-Container an. Für das Wiki soll hierin eine eigene Datenbank angelegt und ein Benutzer hierfür festgelegt werden.
    3. Installieren Sie das Wiki vollständig und legen Sie einen Admin-Benutzer hierfür an.
    4. Kommentieren Sie auch hier jede Zeile.


5.5 Verschiedenes

  1. für die Installation auf einem Raspberry Pi empfehle ich:
    1. mit log2ram werden die log-Datei nicht ständig sondern in festgelegten Zyklen auf die SD-Karte geschrieben.
    2. swap-Datei abschalten[31]

5.6 Links


  1. Quelle: https://de.wikipedia.org/wiki/Docker_(Software)#Begriffe
  2. LinuxMagazinBegriffe, Autor: Michael Unke http://www.linux-magazin.de/ausgaben/2014/09/container/ 2014-09-01
  3. Quelle: c't Wissen - Docker 2020[1] - Seite 15
  4. Quelle: https://www.freecodecamp.org/news/where-are-docker-images-stored-docker-container-paths-explained/ - 17.05.2021 - 23:30
  5. Unter Umständen muss docker-compose noch installiert werden.[2]
  6. Es ist ebenso möglich, diese in einer separaten Datei im selben Verzeichnis zu speichern.

6 Hackathon

6.1 Scrum (Light)

Informieren Sie sich bitte über die Projektentwicklungsmethode Scrum (siehe Scrum_-_Light), da das Hackathon-Projekt mit Hilfe von Ideen dieser agilen Methode umgesetzt werden soll.

6.2 Projektverwaltung

  • Erstellen Sie als Projektleiter auf GitLab ein Repository für Ihr Projekt
  • Beschreiben Sie das Projekt in der README.md-Datei
  • Laden Sie alle Mitglieder als Members mit der Rolle 'Developer' ein
  • Verwalten Sie alle Dateien, die zu Ihrem Projekt gehören in GitLab
  • Erstellen Sie die Dokumentation des Projekts im Wiki. (Anleitung zur Bedienung)

7 Datei- und Datenbankzugriffe mit Python

In der zurückliegenden Unterrichtseinheit haben Sie gelernt, wie man mit Python über APIs Daten erhalten kann. Diese Daten werden meist als JSON-Objekte zurückgegeben und stellen momentane Werte dar. Um diese Daten für Auswertungen zu nutzen und/oder grafisch darzustellen, müssen diese dauerhaft gespeichert werden. Hierzu bietet sich eine Datenbank an, die sich ebenfalls mit Python einfach anbinden lässt.

Ebenfalls in einer zurückliegenden Unterrichtseinheit haben Sie gelernt, wie man Tabellen in einer MySQL-Datenbank anlegt, diese über Schlüssel miteinander verbindet und anschließend mit SQL-Befehlen Daten in die Tabellen schreibt, damit sie für Auswertungen zur Verfügung stehen.

Ziel ist es jetzt, Wetterdaten von fünf Orten Ihrer Wahl über eine API abzufragen und in einer MySQL-Datenbank zu speichern. Diese Daten sollen grafisch dargestellt und ausgewertet werden können.

Arbeitsauftrag:

  1. Legen Sie zunächst bei OpenWeather ein Konto unter https://openweathermap.org/appid an, die Erstellung des API-Keys dauert etwas, Sie finden ihn unter: https://home.openweathermap.org/api_keys (Abgabe: 18.03.2020)
  2. Legen Sie eine sinnvolle Tabellenstruktur in der dritten Normalform an und verbinden Sie die Tabellen mit Schlüsseln. (Abgabe: 18.03.2020)
    1. Erstellen Sie hierzu zunächst ein ER-Modell in der Chen-Notation. Legen Sie das ER-Modell in der Cloud ab.
    2. Überführen Sie das ER-Modell in ein Relationales Datenmodell und legen Sie auch dieses in der Cloud ab.
    3. Legen Sie die entsprechenden Tabellen in eine MySQL-Datenbank an. Die Datenbank kann lokal auf Ihrem PC laufen (xampp). Falls Sie bereits einen Webspace haben, können Sie auch diese Datenbank nutzen.
  3. Erstellen Sie ein Python-Skript, dass in regelmäßigen Abständen die Daten von der API abfragt und in der Datenbank speichert.
    Weitere Informationen befinden sich hier: https://www.w3schools.com/python/python_mysql_getstarted.asp
    Speichern Sie das kommentierte Skript in der Cloud (Abgabe: 25.03.2020).

8 Grafana

Grafana ist ein sehr mächtiges Tool zur Visualisierung von (fast) beliebigen Daten auf Dashboards. Die Daten können u. a. von unterschiedlichen Datenbankmanagementsystemen bezogen werden, z.B. auch von MySQL und InfluxDB.

8.1 Installation

Normalerweise wird Grafana von einem Server in Ihrem Netzwerk oder zu Hause auch von Ihrem Raspberry Pi zur Verfügung gestellt. Hierbei muss das System auch entsprechend abgesichert werden. Im Unterricht ist es am einfachsten, wenn Grafana lokal auf Ihrem PC genutzt werden kann.

  1. Laden Sie das Programm für Ihren Computer herunter: https://grafana.com/grafana/download
  2. Öffnen Sie die Eigenschaften der zip-Datei und setzen Sie den Haken bei 'Zulassen' unter 'Sicherheit'
  3. Entpacken Sie die zip-Datei
  4. Öffnen Sie den Ordner C:\grafana-7.3.7\conf und erstellen Sie eine Kopie der Datei sample.ini, die Sie anschließend in custom.ini umbenennen. Änderungen dürfen nur in dieser Datei vorgenommen werden.

8.2 Grafana starten

Um mit Grafana zu arbeiten, führen Sie die folgenden Schritte aus:

  1. Starten Sie c:\grafana-7.3.7\bin\grafana-server.exe
  2. Öffnen Sie in Ihrem Browser die Seite http://localhost:3000 Benutzer und Passwort lauten 'admin'
  3. Im nächsten Schritt werden Sie aufgefordert ein neues Passort einzugeben.
    (Falls Sie das neue Passwort vergessen sollten, führen Sie über die Kommandozeile im Pfad cd "C:\grafana-7.3.7\bin" den Befehl grafana-cli.exe admin reset-admin-password passwdneu aus.)

8.3 Daten visualisieren

WICHTIG: in der Praxis muss für den Zugriff auf die Datenbank durch Grafana ein Benutzer angelegt werden, der nur SELECT auf einer bestimmten Tabelle ausführen darf.

  1. Um Daten visualisieren zu können, müssen zunächst welche zur Verfügung stehen. Falls Sie keine Temperaturdaten in Ihrer MySQL-Datenbank gespeichert haben, können Sie dieses SQL-Skript importieren.
  2. Wählen Sie 'Add data source', um Grafana mit einer Datenbank zu verbinden.
    Wählen Sie Ihre lokale MySQL-Datenbank, der Benutzer ist 'root' ohne Passwort.
  3. Stellen Sie die Daten in einem Graphen dar. (Beachten Sie, dass die Temperaturdaten in dem Skript im Dezember 2020 erstellt wurden.)
  4. Richten Sie in Grafana eine Ansicht ein, mit der die Daten ohne Eingabe eines Passworts angezeigt werden können.
    Dokumentieren Sie die hierzu notwendigen Schritte.


9 Versionsverwaltung mit Git

Nach Bearbeitung dieses Kapitels können Sie ...

  • ... sich in GitLab-Repositories zurechtfinden
  • ... Quellcode-Dateien erstellen und mit mehreren Gruppenmitgliedern gemeinsam bearbeiten
  • ... einen Workflow in Git abbilden

Präsentation aus dem Unterricht.

GitLab ist eine von vielen Möglichkeiten, um Projekte mit Git online zu verwalten und mit anderen Entwicklern ortsunabhängig zusammen zu arbeiten. Alternativen sind z.B. GitHub, Bitbucket, ... Ein Vorteil von GitLab ist u.a. das Lizenzmodell.

Initialisieren

  • Auf https://gitlab.com/users/sign_in ein Konto erstellen.
  • Mit 'Create Project' ein neues Projekt anlegen und dieses 'Private' markieren. Aktivieren Sie 'Initialize repository with a README'.
  • Folgen Sie den Anweisungen unter Command line instructions auf dieser Seite, um Ihre lokale Git-Installation mit GitLab zu verbinden.

lokale Projekte bei GitLab veröffentlichen

  • Jede weitere Änderung kann jetzt, nachdem sie wieder mit git add DaNa.ddd und git commit lokal gespeichert wurde, mit git push in GitLab veröffentlicht werden.

Mitarbeit in einem Projekt

9.1 Git lokal verwenden

  • Git von https://git-scm.com/download runterladen und installieren. Bei der Installation kann der Editor ausgewählt werden, der von Git verwendet werden soll. Ansonsten sollten die Standardeinstellungen übernommen werden.
  • Neuen Ordner anlegen.
  • Eingabeaufforderung öffnen und in den angelegten Ordner navigieren.
  • Mit git init für diesen Ordner das Repository anlegen.
  • In dem Ordner eine Datei anlegen.
  • Diese Datei mit git add DaNa.ddd für die Versionsverwaltung vorbereiten. Es erfolgt keine Ausgabe, der Status kann mit git status überprüft werden.
  • Diese Dateiversion mit git commit lokal speichern. Es öffnet sich der Editor und man sollte einen Kommentar schreiben, um die Änderung zu dokumentieren. Nach dem Schließen des Editors wird der Stand gesichert.
  • Eine Änderung in der Datei machen und spreichern.
  • Diesen Stand auch wieder mit git add DaNa.ddd und git commit festhalten.

Neben den Befehlen in der Eingabeaufforderung gibt es zahlreiche Git-Clients, z.B. https://www.sourcetreeapp.com

9.2 Literatur und Links

10 Programmtipps

11 Literatur*

  1. Dr. Klaus Ringhand, Hans-Georg Wittmann: Entwickeln und Bereitstellen von Anwendungssystemen für IT-Berufe. Westermann, Braunschweig 2011, ISBN: 978-3-8045-5384-2
  2. SQL von Kopf bis Fuß. Behandelt auch DB-Entwurf ausführlich
  3. Sascha Kersken: Kompendium der Informationstechnik. Rheinwerk Computing, Bonn, 2003, ISBN 978-3-89842-355-7
    1. Kapitel 7: Datenbanken und SQL
    2. Kapitel 18.2: Einführung in PHP

[*] Der Erwerb ist für den Unterricht nicht erforderlich und nicht vorgeschrieben. Die Bücher geben die Möglichkeit, sich tiefer in ein Teilgebiet ein zu arbeiten.