HTML5-Tutorium: Canvas: Hello World 02: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
(19 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{HTML5-Tutorium:Canvas:HelloWorld:Menü}}
{{HTML5-Tutorium:Canvas:HelloWorld:Menü}}
'''Musterlösung''': [http://glossar.hs-augsburg.de/beispiel/tutorium/html5_canvas/hello_world/html5_canvas_hello_world_02/WebContent/hallo.html <code>hallo.html</code>]
'''Musterlösung''': [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world_canvas/WK_HelloWorldCanvas02/web/index.html <code>index.html</code>]
([http://glossar.hs-augsburg.de/beispiel/tutorium/html5_canvas/hello_world/html5_canvas_hello_world_02 SVN-Repository])
([https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world_canvas/WK_HelloWorldCanvas02/ SVN-Repository])


=Voraussetzung=
==Use Cases==


Sie sollten die Inhalte des Tutoriums [[HTML5-Tutorium: Canvas: Hello World 01]] kennen.
Wie im  [[HTML5-Tutorium: JavaScript: Hello World 03|dritten]] und 
[[HTML5-Tutorium: JavaScript: Hello World 04|vierten Teil des '''Hello-World'''-Tutoriums]] soll die ganze der Name des Benutzers
erfragt werden, bevor er persönlich begrüßt wird.


=Ziel: Ausgabe von „Hallo <Benutzername>!“ auf einem HTML5-Canvas=
Die Ausgabe erfolgt wie im  [[HTML5-Tutorium: Canvas: Hello World 01|ersten Teil des '''Canvas'''-Tutoriums]] mit Hilfe eines Canvas-Elements.
Die in [[HTML5-Tutorium: Canvas: Hello World 01|Teil 1]] erstellte Hello-World-Anwendung wird so erweitert,
dass der Benutzer seinen Namen eingeben kann und mit diesem
anschließend begrüßt wird. Außerdem wird das Canvas-Layout mit Hilfe von CSS modifiziert.


=Anwendung <code>HelloWorldCanvas02</code>=
Die Anwendung soll wie  „App5“ des [[HTML5-Tutorium: JavaScript: Hello World 04|vierten Teil]]s des Hello-World-Tutoriums
==Neues Projekt anlegen==
aufgebaut sein:


Legen Sie ein neues Projekt an:
* Die Initialisierungsinformationen werden aus JSON-Dateien eingelesen.
* Die Anwendung wird mit Hilfe von RequireJS modularisiert.


# <code>Datei</code> <code>Neu</code> <code>Statisches Web-Projekt</code>
==Erstellen eines neuen Projektes==
# Project name: <code>HelloWorldCanvas02</code> <code>Fertigstellen</code>
Erstellen Sie ein neues Projekt „<code>HelloWorldCanvas02</code>“.
Kopieren Sie anschließend Datei „<code>index5.html</code>“ sowie die Ordner
„<code>web/css</code>“, „<code>web/init</code>“, „<code>web/js/app5</code>“ , „<code>web/js/lib/require</code>
und die Datei „<code>web/js/main5.js</code>“ 
aus dem [https://glossar.hs-augsburg.de/beispiel/tutorium/es5/hello_world/WK_HelloWorld04/ vierten Teil des Tutoriums]
zusammen mit den darin enthaltenen Dateien in Ihr Projekt.


Speichern Sie Ihr Projekt wiederum in Ihrem Repository:
Nehmen Sie folgende Umbenennungen vor (smartes [[Refactoring]]):


# <code>Projektexplorer</code>: Rechtsklick auf <code>HelloWorldCanvas02</code> → <code>Team</code> <code>Projekt gemeinsam nutzen</code>
* <code>index5.html</code> → <code>index.html</code>
# <code>SVN</code> → <code>Weiter</code>
* <code>js/main5.js</code> → <code>js/main.js</code>
# Url: <code> https://praktikum.multimedia.hs-augsburg.de/svn/ACCOUNT</code> ('''<code>ACCOUNT</code> durch eigenen RZ-Account ersetzen''') → <code>Weiter</code>  
* <code>js/app5</code> → <code>js/app</code>
# Use specified folder name: <code>mmprog/tutorium/HelloWorldCanvas02</code> → <code>Fertigstellen</code>


==Projekt im Repository sichern==
Vergessen Sie nicht, dass Sie in der Datei „<code>index.html</code>“ den Befehl


Das neu angelegte Projekt wird als erstes im Repositotry gesichert:
<source lang="html5">
<script data-main="js/main5" src="js/lib/require/require.js"></script>
</source>
durch
<source lang="html5">
<script data-main="js/main" src="js/lib/require/require.js"></script>
</source>
ersetzen müssen. Und in der Konfigurationsanweisung von RequireJS ( Datei „<code>main.js</code>“)
müssen sie <code>app: 'app5'</code> entweder entfernen oder durch <code>app:  'app'</code> ersetzen.
Den Eintrag <code>wk:  'lib/wk_amd'</code> benötigen Sie auch nicht mehr (außer wenn Sie meine JSON-Bibliothek an Stelle der
des RequireJS-JSON-Plugins verwenden möchten).


# Im Projektexplorer: Rechtsklick auf <code>HelloWorldCanvas02</code> → <code>Team</code> → <code>Commit</code>
Passen Sie zu guter Letzt den Titel in der HTML-Datei „<code>index.html</code>“ an.
# Comment: <code>Neues Projekt angelegt.</code>
# <code>OK</code>


==Dateien erstellen==
Wenn Sie alles richtig gemacht haben, sollte jetzt der Code der ursprünglichen App5-Anwendung wieder laufen.


===<code>main.js</code>===
Jetzt müssen Sie nur noch wenige Veränderungen am Code vornehmen, um die Ausgabe auf eine Canvas-Ausgabe umzustellen.
Erstellen Sie im Ordner <code>WebContent/js</code> des Projektes die Datei <code>main.js</code>.
Diese Datei enthält nun zwei Funktionen:
* <code>init</code>: Diese wird nach dem Laden der HTML-Seiten in einen Browser aufgerufen, um die Zeichenbühne (<code>canvas</code>) zu initialisieren.
* <code>sayHello</code>: Diese wird aufgerufen, sobald der Benutzer seinen Namen eingegeben und den OK-Button gedrückt hat.


====Inhalt von <code>main.js</code>====
==<code>index.html</code>==


<source lang="javascript">
Ersetzen Sie Hello-Section-Elemente Ihrer HTML-Datei durch folgende Section-Element:
"use strict"; /* Warne vor unsauberem JavaScript-Code! */
var g_canvas;
var g_context;
/** Initialisiert die Bühne (Canvas). */
function init()
{
  g_canvas        = document.getElementById("d_canvas");
  g_canvas.width  = 300;
  g_canvas.height =  27;


  g_context = g_canvas.getContext("2d");
<source lang="html5">
}
<section id="section1_hello" class="hidden">
  <canvas id="canvas1">
/**
    Unfortunately, your browser doesn't support HTML5!
* Löscht den aktuellen Inhalt von der Bühne und schreibt dann einen Meldung
  </canvas>
* auf die Bühne, bei der der Benutzer mit seinem Namen begrüßt wird.
</section>
* Der Name des Benutzers wird aus einem Eingabefeld der HTML-Seite gelesen.
</source>
*/  
und
function sayHello()
<source lang="html5">
{
<section id="section2_hello" class="hidden">
  // Textausgabe (auf der Bühne)
  <canvas id="canvas2">
  g_context
  </canvas>
    .clearRect(0, 0, g_canvas.width, g_canvas.height); // clear canvas
</section>
  g_context
    .font = "bold 20px 'Times New Roman', Times, serif";
  g_context
    .fillText("Hallo " + document.getElementById("d_name").value + "!", 5, 20);
}
</source>
</source>


===<code>main.css</code>===
Dieser Schritt war in ähnlicher Form schon im [[HTML5-Tutorium:_Canvas:_Hello_World_01|ersten Teil des Canvas-Tutoriums]] notwendig.  
Erstellen Sie im Ordner <code>WebContent/css</code> des Projektes die Datei <code>main.css</code>:


====Inhalt von <code>main.css</code>====
==<code>hello_de.json</code> und <code>hello_en.json</code>==


<source lang="css">
Die Initialisierungs-Dateien „<code>hello_de.json</code>“ und „<code>hello_en.json</code>“ müssen an die neuen Gegebenheiten angepasst werden.
/* Das Text-Eingabefeld wird obtisch an die Bühne angepasst. */
Elemente, die es nicht mehr gibt – <code>"hello"</code> und <code>"welcome"</code> –, müssen entfernt werden,
#d_name
neue Elemente  – <code>"canvas"</code> – müssen eingefügt werden und Initialwerte für da Canvas-Element
(Höhe, Breit, Fontangaben etc.) müssen ergänzt werden.
 
Beispielsweise sieht die Datei „<code>hello_de.json</code>“ nun folgendermaßen aus:
<source lang="javascript">
{
{
   width: 185px;
   "HTMLElements":
}
  {
    "sectionForm":    "section2_form",
    "headingForm":    "heading2_form",
    "inputNameLabel": "label2_name",
    "inputName":      "input2_name",
    "buttonReset":    "button2_reset",
    "buttonSubmit":  "button2_submit",
    "sectionHello":  "section2_hello",
    "canvas":        "canvas2"
  },
 
  "text":
  {
    "title":  "Hello, Stranger!",
    "query":  "What's your name?",
    "reset":  "Reset",
    "submit":  "Say hello",
    "hello":  "Hello, $1!"
  },


/* Die Bühne wird mit Hilfe eines Rands optisch hervorgehoben. */
  "css":
#d_canvas
  {
{
    "hidden": "hidden"
  margin-top10px;
   },


   border-color: #BBBBBB;
   "canvas":
   border-width: 2px;
   {
   border-style: solid;
    "width": 500,
    "height":  60,
    "font":   "bold 40px \"Times New Roman\", Times, serif",
    "hello_x": 35,
    "hello_y": 43
  }
}
}
</source>
</source>
==<code>greet.js</code>==


===<code>hallo.html</code>===
Zu guter Letzt muss noch die Methode „<code>sayHello</code>“ in der Datei <code>greet.js</code>“ angepasst werden.
Erstellen Sie im Ordner <code>WebContent</code> des Projektes die Datei <code>hallo.html</code>,
Diese Methode soll nicht mehr den DOM-Baum manipulieren, sondern den Gruß in das Ihr übermittelte Canvas-Element schreiben.
die den Benutzer nach seinem Namen fragt und diesen, nachdem der Benutzer einen OK-Button
Alle übrigen Methoden werden nicht verändert.
gedrückt hat, zur Begrüßung des Benutzers verwendet.


====Inhalt von <code>hallo.html</code>====
Die Methode  „<code>sayHello</code> funktioniert im Prinzip genauso wie die Initialisierungsfunktion
im ersten Teil des Tutoriums. Nur werden jetzt keine konstanten Werte mehr zum Initialisieren des Canvas verwendet, 
sondern Werte, die im Parameter „<code>p_init</code>“ übermittelt wurden:
<source lang="javascript">
l_this.sayHello =
  function ()
  {
    var l_init_elements = p_init.HTMLElements,
        l_init_text    = p_init.text,
        l_init_hidden  = p_init.css.hidden,
        l_init_canvas  = p_init.canvas,
        l_name          = p_document.getElementById(l_init_elements.inputName).value,
        l_canvas        = p_document.getElementById(l_init_elements.canvas),
        l_context      = l_canvas.getContext('2d');


<source lang="html4strict">
    l_canvas.width  = l_init_canvas.width;
<!DOCTYPE html>
    l_canvas.height = l_init_canvas.height;
<html>
    l_context.font  = l_init_canvas.font;
  <head>


     <!-- Titel der HTML-Seite; wird i. Allg. im Browser im Reiter angezeigt -->
     l_context.fillText(l_init_text.hello.replace('$1', l_name), l_init_canvas.hello_x, l_init_canvas.hello_y);
    <title>HTML5-Tutorium: Canvas: Hello World 02</title>


     <!-- Als HTML-Encoding sollte man stets UTF-8 verwenden. -->
     p_document.getElementById(l_init_elements.sectionHello).classList.remove(l_init_hidden);
    <meta charset="UTF-8">
     p_document.getElementById(l_init_elements.sectionForm).classList.add(l_init_hidden);
 
   };
    <!-- Korrektes Skalieren der Seite auf einem mobilen Endgerät -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
 
    <!-- Laden aller CSS-Dateien -->
    <link rel="stylesheet" href="css/main.css"/>
 
    <!-- Laden aller JavaScript-Dateien -->
     <script type="text/javascript" src="js/main.js"></script>
 
  </head>
  <body onload="init()">
 
    <!-- Das Eingabeformular zur Eingabe des Benutzernamens -->
    <form >
      <label>Ihr Name:</label>
      <input id="d_name" type="text"  value=""                          />
      <input            type="button" value="OK" onmousedown="sayHello()"/>
    </form>
 
    <!-- Die Bühne -->
    <canvas id="d_canvas">
      Ihr Browser unterstützt HTML5 leider nicht!
    </canvas>
 
   </body>
</html>
</source>
</source>
 
==Quellen==
==Testen und Sichern des Projektes==
<references/>
 
<ol start ="2">
Testen Sie zunächst Ihr Projekt und sichern Sie dann das Ergebnis:
<li> {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}</li>
 
</ol>
# Im Projektexplorer: Rechtsklick auf <code>HelloWorldCanvas02</code> → <code>Team</code> → <code>Commit</code>
# Enter a comment for the commit operation: <code>hallo.html mit main.js und main.css wurden erstellt.</code>
# <code>OK</code>
 
Anschließend sollten Sie ein wenig mit den drei Dateien experimentieren, indem Sie
sinnvolle und fehlerhafte Änderungen vornehmen. Löschen Sie z.B. die Zeilen mit dem Aufruf
der Funktion <code>clearRect</code> aus der Datei <code>main.js</code> und testen Sie Ihre
Anwendung erneut. (Tipp: Geben Sie mehrmals hintereinander jeweils einen anderen Namen ein.)
 
Speichern Sie zu guter Letzt Ihre sinnvollen Änderungen auch im Repository (mit kurzem, aber sinnvollem Kommentar!).
 
=Apache als Test-Server (optional)=
 
Anstelle des Eclipse-eigenen Testserver kann man auch einen beliebigen
anderen Server (wie z.B. [[Apache]] oder [[Tomcat]]) zum Testen einer Web-Anwendung verwenden.
Der Vorteil dieser Variante ist, dass man den Zielserver gemäß seinen Bedürfnissen wählen und konfigurieren kann
und dass die Anwendung von Anfang an auf dem richtigen Server getestet wird.
 
Voraussetzung ist, dass ein entsprechender Server lokal installiert wurde:
* [[Installation von Apache (Windows)]], [[Installation von Apache (Mac OS X)]], [[Installation von Apache (Unix)]]
 
Der Apache-Server muss laufen, sonst funktioniert der nachfolgende Test nicht!
 
Definieren eines neuen Apache-Test-Servers in Eclipse (nachdem der Apache installiert und gestartet wurde):
 
# Projektexplorer: Rechtklick auf den Root-Ordner des aktuellen Projektes <code>HelloWorldCanvas02</code> → <code>Eigenschaften</code> → <code>Server</code> → Standardserver: <code>keine</code> → <code>OK</code>
# Im Projektverzeichnis: <code>hallo.html</code> selektieren → Klick auf Icon „grüner Kreis mit weißem Dreieck“ → <code>Run on Server</code> → <code>OK</code>
#<code>Neuen Server manuell definieren</code> selektieren → Severziel eingeben: <code>HTTP Server</code> selektieren
# Hostname des Servers: <code>localhost</code>, Server name: <code>Apache</code> → <code>Weiter</code>
# Publishing Directory: <code>C:\web\apache\htdocs</code> (Webverzeichnis des Servers, abhängig davon, wohin Sie den Apache installiert haben) → <code>Weiter</code>
# evtl. Anpassungen vornehmen → <code>Fertigstellen</code>
 
Beim nächsten Aufruf von <code>Run on Server</code> wird der Server <code>Apache</code> unter der Liste der vorhandenen Server aufgeführt.
Man sollte diesen Server wählen und dann das Häckchen vor <code>Server als Projektstandardeinstellung festlegen</code> setzen,
damit man die Serverwahl nicht bei jedem Test erneu ausführen muss.
 
Als Browser wird der in Eclipse integrierte Browser verwendet.
Besser ist es den Firefox als Standardbrowser zu verwenden:
 
* Klick auf <code>Fenster</code> → Klick auf <code>Web</code> → Klick auf <code>Web</code> → Klick auf <code>Firefox</code>
 
Ein Problem bleibt bestehen: Bei jedem Aufruf von <code>Run on Server</code> wird in Eclipse oder Firefox ein neues
Browserfester geöffnet. Um dies zu verhindern, kann man folgenden Trick anwenden, '''nachdem''' <code>Run on Server</code> zum ersten Mal ausgeführt worden ist:
 
# Im mittleren unteren Fenster den Reiter <code>Server</code> selektieren
# <code>Apache</code> aufklappen und selektieren
# Wenn dort nicht <code>synchronisiert</code>, sondern <code>Erneut publizieren</code> steht: Im unteren mittleren Fenster: Klick auf das vierte Icon von rechts (<code>Auf dem Server bereitstellen</code>)
# Sobald beim <code>Apache</code> wieder <code>synchronisiert</code> steht, kann im Browserfester der Reload-Button gedrückt werden, um die neuen Daten abzufrufen. (Eventuell muss der [http://de.wikipedia.org/wiki/Hilfe:Cache Browser-Cache geleert] werden.)
 
=Quellen=
<noinclude>
# {{Quelle|Kowarschick, W.: Multimedia-Programmierung}}</noinclude>
# [http://www.w3schools.com/html5/ w3schools.com: HTML5 Tutorial]
 
=Fortsetzung des Tutoriums=
 
Bearbeiten Sie nun [[HTML5-Tutorium: Canvas: Hello World 03|Teil 3 des Tutoriums]].
 
[[Kategorie: HTML5-Tutorium: Canvas: Hello World]][[Kategorie: HTML5-Beispiel]][[Kategorie:Kapitel:Multimedia-Programmierung:Beispiele]]

Version vom 31. Oktober 2016, 19:02 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen:

Korrektheit: 4
(großteils überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 5
(vollständig vorhanden)
Quellenarten: 5
(ausgezeichnet)
Konformität: 4
(sehr gut)

HTML-Tutorium Hello World: JavaScript | Canvas | SVG

Inhalt | Teil 1 | Teil 2

Musterlösung: index.html (SVN-Repository)

Use Cases

Wie im dritten und vierten Teil des Hello-World-Tutoriums soll die ganze der Name des Benutzers erfragt werden, bevor er persönlich begrüßt wird.

Die Ausgabe erfolgt wie im ersten Teil des Canvas-Tutoriums mit Hilfe eines Canvas-Elements.

Die Anwendung soll wie „App5“ des vierten Teils des Hello-World-Tutoriums aufgebaut sein:

  • Die Initialisierungsinformationen werden aus JSON-Dateien eingelesen.
  • Die Anwendung wird mit Hilfe von RequireJS modularisiert.

Erstellen eines neuen Projektes

Erstellen Sie ein neues Projekt „HelloWorldCanvas02“. Kopieren Sie anschließend Datei „index5.html“ sowie die Ordner „web/css“, „web/init“, „web/js/app5“ , „web/js/lib/require“ und die Datei „web/js/main5.js“ aus dem vierten Teil des Tutoriums zusammen mit den darin enthaltenen Dateien in Ihr Projekt.

Nehmen Sie folgende Umbenennungen vor (smartes Refactoring):

  • index5.htmlindex.html
  • js/main5.jsjs/main.js
  • js/app5js/app

Vergessen Sie nicht, dass Sie in der Datei „index.html“ den Befehl

<script data-main="js/main5" src="js/lib/require/require.js"></script>

durch

<script data-main="js/main" src="js/lib/require/require.js"></script>

ersetzen müssen. Und in der Konfigurationsanweisung von RequireJS ( Datei „main.js“) müssen sie app: 'app5' entweder entfernen oder durch app: 'app' ersetzen. Den Eintrag wk: 'lib/wk_amd' benötigen Sie auch nicht mehr (außer wenn Sie meine JSON-Bibliothek an Stelle der des RequireJS-JSON-Plugins verwenden möchten).

Passen Sie zu guter Letzt den Titel in der HTML-Datei „index.html“ an.

Wenn Sie alles richtig gemacht haben, sollte jetzt der Code der ursprünglichen App5-Anwendung wieder laufen.

Jetzt müssen Sie nur noch wenige Veränderungen am Code vornehmen, um die Ausgabe auf eine Canvas-Ausgabe umzustellen.

index.html

Ersetzen Sie Hello-Section-Elemente Ihrer HTML-Datei durch folgende Section-Element:

<section id="section1_hello" class="hidden">
  <canvas id="canvas1">
    Unfortunately, your browser doesn't support HTML5!
  </canvas>
</section>

und

<section id="section2_hello" class="hidden">
  <canvas id="canvas2">
  </canvas>
</section>

Dieser Schritt war in ähnlicher Form schon im ersten Teil des Canvas-Tutoriums notwendig.

hello_de.json und hello_en.json

Die Initialisierungs-Dateien „hello_de.json“ und „hello_en.json“ müssen an die neuen Gegebenheiten angepasst werden. Elemente, die es nicht mehr gibt – "hello" und "welcome" –, müssen entfernt werden, neue Elemente – "canvas" – müssen eingefügt werden und Initialwerte für da Canvas-Element (Höhe, Breit, Fontangaben etc.) müssen ergänzt werden.

Beispielsweise sieht die Datei „hello_de.json“ nun folgendermaßen aus:

{
  "HTMLElements":
  {
    "sectionForm":    "section2_form",
    "headingForm":    "heading2_form",
    "inputNameLabel": "label2_name",
    "inputName":      "input2_name",
    "buttonReset":    "button2_reset",
    "buttonSubmit":   "button2_submit",
    "sectionHello":   "section2_hello",
    "canvas":         "canvas2"
  },

  "text":
  {
    "title":   "Hello, Stranger!",
    "query":   "What's your name?",
    "reset":   "Reset",
    "submit":  "Say hello",
    "hello":   "Hello, $1!"
  },

  "css":
  {
    "hidden": "hidden"
  },

  "canvas":
  {
    "width":  500,
    "height":  60,
    "font":   "bold 40px \"Times New Roman\", Times, serif",
    "hello_x": 35,
    "hello_y": 43
  }
}

greet.js

Zu guter Letzt muss noch die Methode „sayHello“ in der Datei „greet.js“ angepasst werden. Diese Methode soll nicht mehr den DOM-Baum manipulieren, sondern den Gruß in das Ihr übermittelte Canvas-Element schreiben. Alle übrigen Methoden werden nicht verändert.

Die Methode „sayHello funktioniert im Prinzip genauso wie die Initialisierungsfunktion im ersten Teil des Tutoriums. Nur werden jetzt keine konstanten Werte mehr zum Initialisieren des Canvas verwendet, sondern Werte, die im Parameter „p_init“ übermittelt wurden:

l_this.sayHello =
  function ()
  {
    var l_init_elements = p_init.HTMLElements,
        l_init_text     = p_init.text,
        l_init_hidden   = p_init.css.hidden,
        l_init_canvas   = p_init.canvas,
        l_name          = p_document.getElementById(l_init_elements.inputName).value,
        l_canvas        = p_document.getElementById(l_init_elements.canvas),
        l_context       = l_canvas.getContext('2d');

    l_canvas.width  = l_init_canvas.width;
    l_canvas.height = l_init_canvas.height;
    l_context.font  = l_init_canvas.font;

    l_context.fillText(l_init_text.hello.replace('$1', l_name), l_init_canvas.hello_x, l_init_canvas.hello_y);

    p_document.getElementById(l_init_elements.sectionHello).classList.remove(l_init_hidden);
    p_document.getElementById(l_init_elements.sectionForm).classList.add(l_init_hidden);
  };

Quellen

  1. Kowarschick (MMProg): Wolfgang Kowarschick; Vorlesung „Multimedia-Programmierung“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 3 (Vorlesung)