{"id":23579,"date":"2022-08-30T17:43:19","date_gmt":"2022-08-30T15:43:19","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=23579"},"modified":"2023-06-18T17:28:13","modified_gmt":"2023-06-18T15:28:13","slug":"google-geodata-visualizer","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/","title":{"rendered":"Google Geodata Visualizer"},"content":{"rendered":"\n<p><em>Ein Projekt von Kai Kustermann, Michael Litschko, Sarah Mauff und Sebastian K\u00f6pp<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Im Sommersemester 2022 haben wir uns als 4-k\u00f6pfige Gruppe dazu entschlossen, einen Google Geodata Visualizer zu erstellen. Das Projekt ist aus der Idee einer McDonald\u2019s-Achievement-Card entstanden. Die Idee war eine Website, die dem Benutzer anzeigt, welche McDonald\u2019s Filialen der Nutzer, gem\u00e4\u00df den \u00fcber seinen Google Account gesammelten Standortdaten, jemals besucht hat. Im weiteren Verlauf wurde die Kernidee, Standortdaten aus Google Accounts zu verarbeiten, insoweit verallgemeinert, als dass das Endprodukt daraus besteht, an einem bestimmten Tag den zur\u00fcckgelegten Weg, die besuchten Orte und die gesamte Strecke &#8211; u. A. unterteilt in Verkehrsmittel &#8211; anzuzeigen.&nbsp;<\/p>\n\n\n\n<p>Zun\u00e4chst l\u00e4dt der Benutzer dazu seine lokal gespeicherten Standortdaten aus seinem Google Account hoch. Hier ist zu erw\u00e4hnen, dass die Einstellung, Standortdaten zu erheben, \u00fcber einen bestimmten Zeitraum eingeschaltet gewesen sein muss, sodass \u00fcberhaupt verwendbare Daten existieren. Nach Hochladen der Standortdaten hat der Nutzer nun die M\u00f6glichkeit \u00fcber Klick auf das linke Hamburger-Menu, seine Strecken und besuchte Orte nachzuverfolgen. Um die Auflistung abzurufen, klickt der Nutzer auf das rechte Hamburger-Menu. Dort sieht er nun auch die haupts\u00e4chlich genutzten Verkehrsmittel mit dem dazugeh\u00f6rigen Streckenanteil. Auch kann durch die Karte sowohl navigiert, als auch hinein- und herausgezoomt werden.&nbsp;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23589\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/1-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1.png\" data-orig-size=\"1234,753\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1-1024x625.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1-1024x625.png\" alt=\"\" class=\"wp-image-23589\" width=\"570\" height=\"347\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1-1024x625.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1-300x183.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1-768x469.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/1.png 1234w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/a><figcaption>Ein Kartenausschnitt mit Routen und Locations in Mannheim.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23590\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/2-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2.png\" data-orig-size=\"1228,794\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2-1024x662.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2-1024x662.png\" alt=\"\" class=\"wp-image-23590\" width=\"574\" height=\"371\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2-1024x662.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2-300x194.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2-768x497.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/2.png 1228w\" sizes=\"auto, (max-width: 574px) 100vw, 574px\" \/><\/a><figcaption>In diesem Men\u00fc kann man das Datum ausw\u00e4hlen und ob Routen und Locations angezeigt werden sollen.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23591\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/3-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3.png\" data-orig-size=\"1257,824\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3-1024x671.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3-1024x671.png\" alt=\"\" class=\"wp-image-23591\" width=\"552\" height=\"361\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3-1024x671.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3-300x197.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3-768x503.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/3.png 1257w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/a><figcaption>Es werden sowohl die besuchten Locations aufgelistet, als auch die Gesamtstrecke abh\u00e4ngig vom genutzten Transportmittel.<\/figcaption><\/figure>\n\n\n\n<p>Die Website kann \u00fcber <a href=\"https:\/\/miclit131.github.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/miclit131.github.io\/<\/a> aufgerufen werden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architektur<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"446\" data-attachment-id=\"23592\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/4-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4.png\" data-orig-size=\"1149,501\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4-1024x446.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4-1024x446.png\" alt=\"\" class=\"wp-image-23592\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4-1024x446.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4-300x131.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4-768x335.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/4.png 1149w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Die obige Grafik stellt unseren ersten Plan einer Architektur dar, den wir nach und nach ge\u00e4ndert haben. Im Folgenden gehen wir darauf ein, warum wir uns f\u00fcr welche Technologien entschieden haben.<\/p>\n\n\n\n<p>Vergleich von Technologien die zur Auswahl standen<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>BW Cloud vs Serverless (FaaS)<br>BW Cloud ist ein IaaS System, basierend auf Openstack. Die Idee war es, dort unser Backend zu hosten, da wir bereits Erfahrungen damit im Team hatten. Allerdings ist der Aufwand, ein Backend in der BW Cloud zu hosten, sehr gro\u00df. Die IBM Functions sind dagegen sehr leicht einzurichten und es muss kein Server gehostet werden. Deswegen haben wir uns f\u00fcr die Functions entschieden.<\/li><li>Big Query vs Cloudant<br>Wir haben ein Tutorial gefunden, in dem Google Location Daten in Big Query gehostet wurden. An diesem wollten wir uns orientieren und unsere Datenbank auch in Big Query hosten. Wir haben uns schlie\u00dflich dagegen entschieden, da wir keine relationalen Daten haben und somit eine nicht relationale Datenbank v\u00f6llig ausreicht. Als nicht relationale Datenbank haben wir Cloudant genommen, da es ein IBM Service ist und somit mit den anderen Services, die wir nutzen, gut kombinierbar ist.<\/li><li>IBM Object Storage vs Github Pages<br>Github Pages erm\u00f6glicht es, statische Websites direkt aus einem Git Repository zu verwalten bzw. zu hosten. Jedoch gibt es hier Limits: Die Website darf nicht gr\u00f6\u00dfer als 1 GB sein und die Bandbreite ist auf 100 GB pro Monat limitiert.<br>IBM Cloud Object Storage erm\u00f6glicht das Hosten von statischen Websites per Cloud Object Storage und den Build von cloud-nativen und serverlosen Apps mit Website.<br>Wir haben uns f\u00fcr Github Pages entschieden, da es die einfachere der beiden Optionen war und die Limitationen f\u00fcr unsere Zwecke voraussichtlich nicht relevant sind.<\/li><li>ArcGis vs react leaflet<br>ArcGis ist ein cloudbasiertes Tool zur Bereitstellung interaktiver Karten &#8211; allerdings ist es nicht kostenlos.<br>Leaflet ist eine funktionsreiche Open Source JavaScript Library &#8211; in unserem Fall f\u00fcr OpenStreetMap (inklusive Open Source Routing Machine).<br>Wir haben uns f\u00fcr Leaflet und OpenStreetMap entschieden, da es kostenlos ist.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"458\" data-attachment-id=\"23593\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/5-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5.png\" data-orig-size=\"1137,508\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5-1024x458.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5-1024x458.png\" alt=\"\" class=\"wp-image-23593\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5-1024x458.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5-300x134.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5-768x343.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/5.png 1137w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Obige Grafik stellt die endg\u00fcltige Architektur unseres Projekt dar.<\/p>\n\n\n\n<p>Hochladen der Daten<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>In das Frontend werden die Daten hochgeladen<\/li><li>Die Daten werden vom Frontend an eine API gesendet<\/li><li>Die API spricht IBM Functions an, welche die Daten verarbeiten und in die Datenbank laden<\/li><\/ol>\n\n\n\n<p>Lesen von Daten<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Das Frontend sendet einen Request an die API<\/li><li>Die API f\u00fchrt Functions aus<\/li><li>Die Functions laden Daten aus der Datenbank mithilfe einer Query<\/li><li>Die Daten werden von der API zur\u00fcck an das Frontend gesendet<\/li><li>Das Frontend stellt diese dar<\/li><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Frontend<\/h2>\n\n\n\n<p>Im Frontend haben wir verschiedene Technologien verwendet. Zun\u00e4chst basiert unser Programm auf React. Als CSS Framework haben wir uns f\u00fcr Bootstrap entschieden, da es einfache Dokumentationen bietet und schlussendlich als erstes funktioniert hat \ud83d\ude00 (siehe Punkt \u201cProbleme\u201d).&nbsp;<\/p>\n\n\n\n<p>Um \u00fcberhaupt eine Karte einbinden zu k\u00f6nnen, haben wir Leaflet verwendet &#8211; speziell react-leaflet. Leaflet ist eine Open Source Library f\u00fcr interaktive Karten &#8211; also sehr passend f\u00fcr unseren Use Case.<\/p>\n\n\n\n<p>Da Leaflet selbst aber kein Kartenmaterial bereitstellt, haben wir eine Karte von OpenStreetMap eingebunden, was zu unserer Erleichterung sehr einfach ablief. Kleiner Funfact: OpenStreetMap ist ein Projekt aus dem Jahr 2004, welches zum Ziel hat, eine freie Weltkarte zu erstellen und allen zur Verf\u00fcgung zu stellen.<\/p>\n\n\n\n<p>Unser Anwendungsfall beinhaltet die Darstellung der zur\u00fcckgelegten Strecken auf der Karte, weshalb wir einen Service f\u00fcr das Routing in Leaflet ben\u00f6tigten. Wir haben uns f\u00fcr Leaflet Routing Machine entschieden, eine Bibliothek f\u00fcr Leaflet, welche speziell f\u00fcr diesen Anwendungsfall erstellt wurde. In die Leaflet Routing Machine ist die Open Source Routing Machine als Standard integriert, es k\u00f6nnen aber viele weitere Routing Engines, wie TomTom Online Routing API, Esri oder GraphHoppper verwendet werden. Diese Routing Engines werden haupts\u00e4chlich dazu verwendet, um k\u00fcrzeste Wege zwischen zwei Standorten zu bestimmen.<\/p>\n\n\n\n<p>Aktuell verwenden wir den Demoserver der Open Source Routing Machine. Hier kann man in Zukunft Verbesserungen vornehmen und einen eigenen Server aufsetzen.<\/p>\n\n\n\n<p>Zusammenfassend hatten wir trotz kleiner Anfangsschwierigkeiten schlussendlich Gl\u00fcck mit der Wahl unserer verwendeten Technologien im Frontend.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backend<\/h2>\n\n\n\n<p>Zur Umsetzung unseres Backends haben wir uns f\u00fcr IBM Cloud Functions entschieden.<\/p>\n\n\n\n<p>IBM Cloud Functions ist ein Service, \u00fcber den man Code dezentral auf den Servern von IBM ausf\u00fchren lassen kann (FaaS). Es gibt auch alternative FaaS Anbieter wie zum Beispiel AWS Lambdas. Wir haben uns aber f\u00fcr IBM entschieden, da unsere Datenbank auch ein IBM Service ist und somit die Kompatibilit\u00e4t der Funktionen und der Datenbank gew\u00e4hrleistet ist.<\/p>\n\n\n\n<p>Unsere Applikation soll ein Frontend haben, welches Daten in eine Datenbank schreibt und diese liest. Das Backend k\u00f6nnte man klassisch \u00fcber ein Backend l\u00f6sen, das zusammen mit dem Frontend deployed wird. Stattdessen haben wir uns aber f\u00fcr ein Backend entschieden, welches in der Cloud gehostet wird. Dadurch k\u00f6nnen wir das Frontend komplett vom Backend abkoppeln. Wir m\u00fcssen uns auch nicht um das Deployment k\u00fcmmern, da dies bereits von IBM gemanagt wird. Zudem ist die Skalierung sehr gut.<\/p>\n\n\n\n<p>Mit IBM Cloud Functions kann man den Code direkt in eine HTTPS-API integrieren, welche auch \u00fcber die IBM Cloud gemanagt wird. Es gibt auch schon vorgefertigte API Calls zu anderen IBM Services, wie z.B. Cloudant, welches wir f\u00fcr unsere Datenbank benutzen. Somit m\u00fcssen wir diese nicht selbst schreiben.<\/p>\n\n\n\n<p>Unser Backend muss folgende Dinge k\u00f6nnen:<\/p>\n\n\n\n<p><strong>Auslesen der Google Location Data und umwandeln in Datenbankobjekte<\/strong><strong><br><\/strong>Die JSON-Datei, die wir von Google bekommen, beinhaltet mehr Informationen als die, die wir ben\u00f6tigen. Wir werden nur die relevanten Daten in die Datenbank hochladen. Wir unterscheiden zwischen zwei Typen:&nbsp;&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Location:<\/strong> Ein einzelner Ort, der an einem Datum besichtigt wurde.<br><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"262\" data-attachment-id=\"23607\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/14\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/14.png\" data-orig-size=\"486,318\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"14\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/14.png\" class=\"wp-image-23607\" style=\"width: 400px;\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/14.png\" alt=\"\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/14.png 486w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/14-300x196.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br>Die <em><code class=\"\" data-line=\"\">latitudeE7 <\/code><\/em>und <em><code class=\"\" data-line=\"\">longitudeE7 <\/code><\/em>Felder sind die aufgezeichneten Koordinaten, \u00fcber die wir die Location auf der Karte darstellen k\u00f6nnen<br><\/li><li><strong>Path:<\/strong> Eine Route, die an einem Datum zur\u00fcckgelegt wurde. Enth\u00e4lt auch Informationen \u00fcber die Wahrscheinlichkeit des Transportmittels.<br><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"552\" data-attachment-id=\"23606\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/13\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/13.png\" data-orig-size=\"486,671\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"13\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/13.png\" class=\"wp-image-23606\" style=\"width: 400px;\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/13.png\" alt=\"\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/13.png 486w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/13-217x300.png 217w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br>Die Felder <em><code class=\"\" data-line=\"\">startLocation <\/code><\/em>und <em><code class=\"\" data-line=\"\">endLocation <\/code><\/em>werden genutzt um eine Route \u00fcber leaflet-routing-machine zu generieren. In den activities sind alle m\u00f6glichen Fortbewegungsmittel mit ihrer jeweiligen Wahrscheinlichkeit enthalten. Dadurch k\u00f6nnen bei der Routenfindung unterschiedliche Wege bevorzugt werden.<\/li><\/ul>\n\n\n\n<p><strong>Einzelne Objekte in die Datenbank hochladen<\/strong><strong><br><\/strong>Dazu muss eine Verbindung mit der Datenbank hergestellt werden. Das Datenbankobjekt bekommt au\u00dferdem noch eine SessionID \u00fcber die wir es sp\u00e4ter einem Nutzer zuordnen k\u00f6nnen. Zum Hochladen einzelner Objekte gibt es bereits eine von IBM bereitgestellte Funktion f\u00fcr Cloudant Datenbanken.<\/p>\n\n\n\n<p><strong>Hinzuf\u00fcgen von SessionID zum Objekt<\/strong><strong><br><\/strong>Wenn wir Objekte in die Datenbank speichern, m\u00fcssen wir immer eine SessionID mitgeben \u00fcber die wir sp\u00e4ter auf die Objekte eines Nutzers zugreifen k\u00f6nnen. In dieser Aktion wird eine SessionID dem Objekt hinzugef\u00fcgt.<\/p>\n\n\n\n<p><strong>Mehrere Objekte auf einmal in die Datenbank hochladen<br><\/strong>Dies verl\u00e4uft \u00e4hnlich wie die vorherige Aktion, mit dem Unterschied, dass mehrere Objekte auf einmal hochgeladen werden. Daf\u00fcr mussten wir eine eigene Funktion schreiben, da wir die bereits bereitgestellte Funktion f\u00fcr Cloudant nicht verwenden konnten. Dazu nutzen wir die von IBM bereitgestellte Javascript Library f\u00fcr Cloudant.<br><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"367\" data-attachment-id=\"23608\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/15\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/15.png\" data-orig-size=\"276,338\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"15\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/15.png\" class=\"wp-image-23608\" style=\"width: 300px;\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/15.png\" alt=\"\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/15.png 276w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/15-245x300.png 245w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n\n\n\n<p><strong>Datenbankabfrage von Objekten anhand von Datum und SessionID<\/strong><strong><br><\/strong>Unser Frontend ben\u00f6tigt alle Locations und Paths f\u00fcr einen bestimmten Tag. Dazu k\u00f6nnen wir wieder eine bereits bereitgestellte Funktion verwenden. Dieser geben wir das Datum und die SessionID vom betroffenen Nutzer mit.<\/p>\n\n\n\n<p><strong>Aufbauen eines Query Objekts<br><\/strong>Damit wir die vorherige Abfrage t\u00e4tigen k\u00f6nnen, m\u00fcssen wir ein Query-Objekt mitgeben. Dieses muss aus SessionID und Datum aufgebaut werden.<br><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"194\" data-attachment-id=\"23609\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/16\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png\" data-orig-size=\"423,205\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"16\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png\" class=\"wp-image-23609\" style=\"width: 400px;\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png\" alt=\"\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16.png 423w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/16-300x145.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/p>\n\n\n\n<p>Bei den IBM Functions werden diese einzelnen Abschnitte als Aktionen definiert. Das ist einfach der Code mit einem Input und mit einem Output. Diese Aktionen k\u00f6nnen dann einzeln ausgef\u00fchrt werden oder aber auch in Sequenzen hintereinander. Dabei ist der Output der vorherigen Aktion der Input der darauffolgenden.<\/p>\n\n\n\n<p>Aus den obigen Aktionen k\u00f6nnen wir folgende Sequenzen erstellen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Auslesen der Google JSON \u2192 Hochladen mehrere DB Objekte<\/li><li>Hinzuf\u00fcgen von SessionID \u2192 Hochladen eines einzelnen DB Objekten<\/li><li>Aufbauen eines Query Objektes \u2192 Datenabfrage von DB Objekten<br><\/li><\/ul>\n\n\n\n<p>Um auf unsere Datenbank zugreifen zu k\u00f6nnen, m\u00fcssen wir einen API Key erstellen.<br>Dieser wird entweder \u00fcber die Cloudant Aktion mitgegeben, oder wir m\u00fcssen den Schl\u00fcssel beim manuellen Aufbau der Verbindung mitgeben.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"582\" data-attachment-id=\"23595\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/6-3\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6.png\" data-orig-size=\"1095,622\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"6\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6-1024x582.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6-1024x582.png\" alt=\"\" class=\"wp-image-23595\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6-1024x582.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6-300x170.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6-768x436.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/6.png 1095w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Mitgabe der Keys durch Cloudant Action<\/figcaption><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17.png\"><img loading=\"lazy\" decoding=\"async\" width=\"445\" height=\"195\" data-attachment-id=\"23611\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/17\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17.png\" data-orig-size=\"445,195\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"17\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17.png\" alt=\"\" class=\"wp-image-23611\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17.png 445w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/17-300x131.png 300w\" sizes=\"auto, (max-width: 445px) 100vw, 445px\" \/><\/a><figcaption>Manuelles mitgeben der Keys<\/figcaption><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Das Ausf\u00fchren von Aktionen in Sequenzen erleichtert das Austauschen von Code-Abschnitten. Wenn z.B. ein neuer Datenbank Service genutzt werden soll, tauscht man einfach die Aktion, die die Objekte auf die Datenbank schreibt, aus.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">API<\/h2>\n\n\n\n<p>Damit wir unsere Sequenzen aus dem Frontend einfach \u00fcber HTTP-Requests ansprechen k\u00f6nnen, m\u00fcssen wir diese einem API Endpunkt zuordnen. Diesem API-Endpunkt k\u00f6nnen Parameter mitgegeben werden, die der Input f\u00fcr die erste Aktion in der angesprochenen Sequenz sind.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"431\" data-attachment-id=\"23597\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/7-4\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7.png\" data-orig-size=\"1747,735\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"7\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-1024x431.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-1024x431.png\" alt=\"\" class=\"wp-image-23597\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-1024x431.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-300x126.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-768x323.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7-1536x646.png 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/7.png 1747w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Blau umrandete Aktionen sind von IBM bereitgestellte Aktionen.<\/figcaption><\/figure>\n\n\n\n<p>Die Aktion bulk-db-upload haben wir selbst geschrieben, da wir keine vorgefertigte Funktion gefunden haben. Allerdings gibt es in der Javascript Cloudant API eine M\u00f6glichkeit, mehrere Objekte auf einmal hochzuladen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8.png\"><img decoding=\"async\" data-attachment-id=\"23630\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/8-2\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8-edited.png\" data-orig-size=\"343,193\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"8\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8-edited.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8-edited.png\" alt=\"\" class=\"wp-image-23630\" width=\"344\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8-edited.png 343w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/8-edited-300x169.png 300w\" sizes=\"(max-width: 343px) 100vw, 343px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Testing<\/h2>\n\n\n\n<p>Durch das Testen von Software soll sichergestellt werden, dass diese die zuvor definierten Anforderungen erf\u00fcllt. Testing von Software kann auf verschiedenen Ebenen erfolgen. Neben E2E-Tests, welche die Software auf einem hohen Level aus Nutzersicht testen sollen, gibt es Integrationstests und Unit-Tests, welche die Qualit\u00e4t der Software auf tieferen Ebenen sicherstellen. W\u00e4hrend auf allen Ebenen Testautomatisierungen umgesetzt werden k\u00f6nnen, sind diese vor allem auf den unteren Ebenen, also im Integrations- und Unit-Testing, zu finden. Im Zuge der vermehrten Nutzung von automatisierten Tests, sowie dem Aufstieg der agilen Entwicklungsmethodik ist in den letzten Jahren der Ansatz der testgetriebenen Entwicklung entstanden. Anders als in der klassischen Softwareentwicklung, werden dabei die Tests vor dem Programmcode geschrieben. Dies hat den Vorteil, dass eine sehr hohe Testabdeckung erreicht werden kann und Fehler fr\u00fchzeitig in der Entwicklung entdeckt werden k\u00f6nnen. Die Vorteile von automatisierten Tests im Vergleich zu manuellen Tests sind, dass eine geringere Fehlerquote und eine h\u00f6here Testabdeckung mit demselben Aufwand erreicht werden k\u00f6nnen. Im Rahmen des DevOps-Gedankens kann durch die Integration automatisierter Tests in eine CI\/CD-Pipeline zudem eine h\u00f6here Auslieferungsgeschwindigkeit erreicht werden. Im Umfeld von Cloud Projekten ist es von besonderer Bedeutung externe Cloud-Services, zu welchen eine Abh\u00e4ngigkeit besteht, zu testen.<\/p>\n\n\n\n<p>In unserem Projekt haben wir sowohl Unit-Tests als auch Integrationstests in Form von API-Tests umgesetzt, um die Qualit\u00e4t der Software sicherzustellen. Das Backend, also die Cloud Functions, sowie die Interaktion der Functions mit der Cloudant Datenbank, wurden \u00fcber API-Tests mithilfe der Open Source Javascript-Library Frisby getestet. F\u00fcr die einzelnen Cloud Functions wurden keine Unit-Tests entworfen, da die Qualit\u00e4t dieser \u00fcber das Testen der einzelnen API-Endpunkte sichergestellt wird. Mithilfe von Frisby ist es m\u00f6glich, \u00fcber den Testrunner Jest API-Tests durchzuf\u00fchren. Die PUT-Methode sowie die GET-Methoden k\u00f6nnen mithilfe von Testdaten, die gleich wie die realen Daten aufgebaut sind, automatisiert getestet werden. Die Antworten der Endpunkte werden mithilfe von assertions der Bibliothek Frisby sowie der Bibliothek joi f\u00fcr die Datenvalidierung \u00fcberpr\u00fcft.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"440\" data-attachment-id=\"23600\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/9\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9.png\" data-orig-size=\"945,440\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"9\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9.png\" alt=\"\" class=\"wp-image-23600\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9.png 945w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9-300x140.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/9-768x358.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/a><\/figure>\n\n\n\n<p>In der Abbildung sind beispielhaft zwei Testf\u00e4lle f\u00fcr einen PUT-Endpunkt dargestellt. Im ersten Testfall wird \u00fcberpr\u00fcft, ob der HTTP-Statuscode 401 zur\u00fcckgegeben wird, wenn im HTTP-Header kein valider API-Key angegeben wird. Im zweiten Testfall wird \u00fcberpr\u00fcft, ob bei einer validen PUT-Anfrage der Statuscode 200 zur\u00fcckgegeben wird.<\/p>\n\n\n\n<p>Neben API-Tests wurden zudem Unit-Tests f\u00fcr das Frontend entworfen, um einzelne UI-Komponenten zu testen. Diese wurden mit react-testing-library implementiert. React-Testing-Library ist eine leichtgewichtige Bibliothek, um React-Komponenten zu testen. Ziel ist es, die Komponenten auf \u00e4hnliche Art und Weise zu testen, wie der Endnutzer mit ihnen interagieren w\u00fcrde. Hierzu bietet die Bibliothek die M\u00f6glichkeit, direkt auf DOM-Elemente zuzugreifen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"799\" data-attachment-id=\"23601\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/10-1\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1.png\" data-orig-size=\"945,799\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"10-1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1.png\" alt=\"\" class=\"wp-image-23601\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1.png 945w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1-300x254.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/10-1-768x649.png 768w\" sizes=\"auto, (max-width: 945px) 100vw, 945px\" \/><\/a><\/figure>\n\n\n\n<p>Beispielhaft sind zwei Testf\u00e4lle der Komponente HomeComponent dargestellt. In der beforeEach-Funktion wird ein HTML-Element erzeugt, in welchem sp\u00e4ter die HomeComponent gerendert wird. Daraufhin wird der erste Testfall definiert, in welchem sichergestellt wird, dass kein Text \u201eView your data\u201c dargestellt wird. Im zweiten Testfall wird \u00fcberpr\u00fcft, ob der Upload Button mit der TestId \u201euploadButton\u201c korrekt angezeigt wird. Tests \u00e4hnlicher Art wurden f\u00fcr verschiedene, wichtige Komponenten des Frontends entworfen, um das korrekte Verhalten der Komponenten sicherzustellen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deployment<\/h2>\n\n\n\n<p>Die grundlegende Idee war zun\u00e4chst, dass Deployment und App getrennt voneinander betrachtet werden. W\u00e4hrend sich ein Team um das Frontend k\u00fcmmerte, befasste sich eine andere Gruppe um die Kubernetes-Umgebung. Hierzu wollten wir zu Beginn die bwCloud verwenden, welche auf OpenStack basiert, einem Tool zum Aufsetzen von VM-Maschinen. Hierbei mussten grundlegende Infrastruktur-Bestandteile eingerichtet werden. Hierzu geh\u00f6rten Router, welche Floating-IP-Adressen freigeben, welche von der Cloud aus der Uni Mannheim heraus unseren Service \u00f6ffentlich machen sollten. Zudem z\u00e4hlte dazu eine Verbindung zum externen Ingress Controller der VM von Kubernetes aus, welche nicht von der Firewall blockiert wurde. Des Weiteren mussten mehrere Nodes aufgesetzt werden, um die Struktur von Master und Worker Nodes umzusetzen. Zu all dem kam dann noch das Problem, dass wir mit OpenStack noch nicht gearbeitet hatten, aber Kubernetes aus einem bereits eingerichteten Netzwerk kannten, was zur Folge hatte, dass einfache Dinge Probleme bereiteten. Hierzu z\u00e4hlte zum Beispiel das Einrichten eines SSH-Zugriffs auf eine Openstack VM oder das Aufsetzen von Monitoring Tools und Kubernetes mit kubectl und CUDA GPU Support. Auch beim Debugging auf einer externen Maschine ohne Interface oder eingerichtetem Ingress mussten wir uns \u00fcber Portforwarding, Kubernetes Event Logs und Curl-Befehle aushelfen. Die Fehlermeldungen von Kubernetes waren f\u00fcr uns teilweise ein wenig schwierig zu interpretieren. So kann ein ImagePullBackOff Fehler zum Beispiel sowohl an Credentials, falschen Settings oder Firewall-Regeln liegen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"709\" height=\"492\" data-attachment-id=\"23602\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/11\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11.png\" data-orig-size=\"709,492\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"11\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11.png\" alt=\"\" class=\"wp-image-23602\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11.png 709w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/11-300x208.png 300w\" sizes=\"auto, (max-width: 709px) 100vw, 709px\" \/><\/a><\/figure>\n\n\n\n<p>Je mehr wir uns mit dem Thema auseinandersetzen, desto eher merkten wir, wie viel eigentlich zu einem funktionierenden Cluster bis hin zum bare metal Bereich geh\u00f6rt, welches wir aus anderen Vorlesungen kaum bis gar nicht kennengelernt hatten.&nbsp;<\/p>\n\n\n\n<p>Da immer mehr Schwierigkeiten anfielen, entschieden wir uns vorerst dazu, das Frontend direkt \u00fcber eine PaaS-L\u00f6sung, IBM Cloud, zu deployen. Das Backend und die Datenbank ben\u00f6tigen kein Deployment, da beides in der IBM Cloud l\u00e4uft.<br>Der Plan war es, das react-basierte Frontend in eine statische Website mit einer index.html zu konvertieren und alle Ordner in ein Bucket im IBM Cloud Object Storage hochgeladen. Danach kann der Entrypoint f\u00fcr die Webseite eingetragen und die Website in der IBM Cloud gehostet werden. In den Einstellungen k\u00f6nnen nun die Sichtbarkeit und Sicherheitsvorkehrungen vorgenommen werden.<br>Bei dem Deployment des Frontends in IBM Cloud Object Storage kam es jedoch leider zu Problemen, da React-Anwendungen nicht ohne weiteres in eine statische Website umgewandelt werden k\u00f6nnen. IBM unterst\u00fctzt im Object Storage nur Node.js und anderweitige Backend Frameworks, weshalb wir uns dann letztendlich nach dem Ausprobieren unterschiedlicher L\u00f6sungen f\u00fcr GitHub Pages entschieden haben.<\/p>\n\n\n\n<p>GitHub Pages l\u00e4sst nicht kommerzielle, statische Webseiten schnell deployen, in unserem Fall \u00fcber npm-Befehle. Github Pages unterst\u00fctzt neben React zum Beispiel Docker, Jerkyl und html. Es sollte beachtet werden, dass das Repository auf public gestellt werden muss, damit Github Pages funktioniert. F\u00fcr das Deployment haben wir uns an diesen Guide gehalten <a href=\"https:\/\/www.c-sharpcorner.com\/article\/how-to-deploy-react-application-on-github-pages\/\">https:\/\/www.c-sharpcorner.com\/article\/how-to-deploy-react-application-on-github-pages\/<\/a> .<br>Bis auf die Struktur des Repository-Namen, mussten nur einige kleine \u00c4nderungen in der package.json vorgenommen werden, um die Webseite \u00fcber npm run deploy, mit einer funktionierenden CI\/CD zu ver\u00f6ffentlichen. F\u00fcr Deployments f\u00fcr kommerzielle Zwecke sollte man jedoch die gr\u00f6\u00dfere Cloud-Anbietern verwenden. Unsere Anwendung wird voraussichtlich aus Sicherheitsgr\u00fcnden nur bis zum 10.10.2022 unter <a href=\"https:\/\/miclit131.github.io\/\">https:\/\/miclit131.github.io\/<\/a> erreichbar sein, da jede Webanwendung verwaltet werden sollte falls Schwachstellen auftreten (zum Beispiel in verwendeten Libraries und npm-Packages).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"460\" data-attachment-id=\"23603\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/30\/google-geodata-visualizer\/attachment\/12\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12.png\" data-orig-size=\"1024,460\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"12\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12.png\" alt=\"\" class=\"wp-image-23603\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12-300x135.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/12-768x345.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.ibm.com\/cloud\/blog\/static-websites-cloud-object-storage-cos\">https:\/\/www.ibm.com\/cloud\/blog\/static-websites-cloud-object-storage-cos<\/a><\/p>\n\n\n\n<p>\u00dcber die Struktur sparen wir nun den ganzen Aufwand, eine Infrastruktur aufzubauen und erhalten mit nur wenigen Klicks eine \u00f6ffentliche Webseite. Gerade f\u00fcr Start-ups ist ein Cloud Modell geeignet, da keine Serverkosten anfallen und nur die tats\u00e4chliche Nutzung gezahlt wird. Zudem wird kein gr\u00f6\u00dferes Infrastruktur Team ben\u00f6tigt, welches das Monitoring, Security und Einrichten \u00fcbernimmt.&nbsp;<\/p>\n\n\n\n<p><strong>Probleme<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Material UI als CSS Framework: Wir planten, Material UI einzusetzen, da es eine gute Integration in React Apps versprach,&nbsp; jedoch funktioniert diese aus unbekannten Gr\u00fcnden nicht.<\/li><li>Grenzen des kostenlosen Cloudant Plans:<br>Wir benutzen f\u00fcr unsere Datenbank den kostenlosen Plan von Cloudant, da es sich um ein Studentenprojekt handelt. Leider hat dieser Plan eine Limitierung von 5 Queries pro Sekunde. Damit sto\u00dfen wir an unsere Grenzen, da im schlechtesten Fall nur 5 Nutzer parallel unsere Seite nutzen k\u00f6nnen.<\/li><li>Frontend Deployment in IBM Cloud f\u00fcr dynamische Webseiten, kein React index.html support<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit \/ Lessons Learned<\/h2>\n\n\n\n<p>W\u00e4hrend dem Projekt haben wir viele verschiedene Dinge gelernt. Durch den Architekturentwurf zu Beginn des Projektes konnten wir uns mit verschiedenen Technologien und Architekturmustern im Cloud-Umfeld auseinandersetzen. W\u00e4hrend wir zuerst durch das Aufsetzen eines Kubernetes Clusters auf der IaaS-Ebene arbeiten wollten, entschieden wir uns letztendlich daf\u00fcr, das Backend serverless zu gestalten. Hierbei lernten wir den Umgang mit der IBM Cloud, speziell den IBM Cloud Functions, sowie der nicht relationalen, verteilten Datenbank Cloudant kennen, welche von IBM als cloud-basierter Service bereitgestellt wird. Des Weiteren konnten wir den Umgang mit aktuellen Web-Technologien und Frameworks wie React und Bootstrap vertiefen und einiges in Richtung Routing und Kartendarstellung im Web-Umfeld lernen.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ein Projekt von Kai Kustermann, Michael Litschko, Sarah Mauff und Sebastian K\u00f6pp Einleitung Im Sommersemester 2022 haben wir uns als 4-k\u00f6pfige Gruppe dazu entschlossen, einen Google Geodata Visualizer zu erstellen. Das Projekt ist aus der Idee einer McDonald\u2019s-Achievement-Card entstanden. Die Idee war eine Website, die dem Benutzer anzeigt, welche McDonald\u2019s Filialen der Nutzer, gem\u00e4\u00df den [&hellip;]<\/p>\n","protected":false},"author":1107,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[120,650,22],"tags":[284,617,618,615,616],"ppma_author":[878],"class_list":["post-23579","post","type-post","status-publish","format-standard","hentry","category-cloud-technologies","category-scalable-systems","category-student-projects","tag-cloudant","tag-github-pages","tag-google-geodata","tag-ibm-cloud","tag-openstreetmap"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":23412,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/22\/migration-einer-rest-api-in-die-cloud\/","url_meta":{"origin":23579,"position":0},"title":"Migration einer REST API in die Cloud","author":"Raphael Kienh\u00f6fer","date":"22. August 2022","format":false,"excerpt":"Im Rahmen der Vorlesung \"Software Development f\u00fcr Cloud Computing\" haben wir uns zum Ziel gesetzt, eine bereits bestehende REST API in die Cloud zu migrieren.","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/OnPrem.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":27939,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/09\/11\/entwickeln-eines-ki-tools-zum-generieren-von-strukturierten-lerninhalten\/","url_meta":{"origin":23579,"position":1},"title":"Entwickeln eines KI-Tools zum Generieren von strukturierten Lerninhalten","author":"Jonathan Aupperle","date":"11. September 2025","format":false,"excerpt":"F\u00fcr den Kurs \"Software Development for Cloud Computing\" wollte ich eine Anwendung entwickeln, mit der konkrete Aufgaben f\u00fcr ein gegebenes Lernziel generiert werden k\u00f6nnen. Der Nutzer stellt dabei Informationen zum Lernziel, sowie seines aktuellen Niveaus und der geplanten Lerndauer zur Verf\u00fcgung. Auf dieser Basis k\u00f6nnen dann die konkreten Aufgaben, die\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/08\/grafik.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":21693,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/09\/20\/recall-trainer-eine-serverless-web-app-mit-aws\/","url_meta":{"origin":23579,"position":2},"title":"Recall Trainer &#8211;  Eine serverless Web-App mit AWS","author":"lr066","date":"20. September 2021","format":false,"excerpt":"Einleitung Im Rahmen der Vorlesung \u201cSoftware Development for Cloud Computing\u201d habe ich im vergangenen Semester eine Einf\u00fchrung in die Welt des Cloud Computings incl. der relevanten Konzepte und Technologien erhalten. Einige dieser Konzepte habe ich versucht in meinem Abschlussprojekt umzusetzen, das ich im Nachfolgenden vorstellen m\u00f6chte.\u00a0 Idee\/Projekt Die Idee war\u2026","rel":"","context":"In &quot;Cloud Technologies&quot;","block_context":{"text":"Cloud Technologies","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/cloud-technologies\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/09\/signup1-150x150.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":11711,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2020\/09\/29\/perfekter-gluhwein-fur-zuhause-thermometer-mit-raspberry-pi-und-aws\/","url_meta":{"origin":23579,"position":3},"title":"Perfekter Gl\u00fchwein f\u00fcr Zuhause: Thermometer mit Raspberry Pi und AWS","author":"jg129","date":"29. September 2020","format":false,"excerpt":"Abstract Kein anderes Getr\u00e4nk ist mit Weihnachtsm\u00e4rkten so verbunden wie Gl\u00fchwein. Und so trinkt sich der ausschweifende Weihnachtsmarktbesucher im Laufe der Adventszeit von Stand zu Stand bis er schlie\u00dflich am Ende des Jahres seinen Lieblingsstand gefunden hat. Doch auch daheim kann der perfekte Gl\u00fchwein gelingen.\u00a0 Wir zeigen, wie man sich\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA","width":350,"height":200,"srcset":"https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA 1x, https:\/\/lh3.googleusercontent.com\/rbu36fXExVo14XfyUicXbIFjAgh1bvNnXHlaUVRfqLevpyZx4KVyjeuYdgItPx6y39R8L9Ub_hug03LYM3AIAW_F14vhBiXOZlt92qIpN0Y2h0H-czZ65ERnn3qUoWVh7JfI5ihA 1.5x"},"classes":[]},{"id":25735,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/09\/13\/fastchat-your-words-instantly-delivered\/","url_meta":{"origin":23579,"position":4},"title":"FastChat &#8211; Your Words, Instantly Delivered","author":"Michael Dick","date":"13. September 2023","format":false,"excerpt":"Einf\u00fchrung Herzlich willkommen zu unserem Blogbeitrag \u00fcber FastChat, einer neuen Web-Chat-Anwendung, die das Kommunizieren im Internet auf ein neues Level hebt. In diesem Beitrag m\u00f6chten wir euch die Hintergrundgeschichte zu diesem Projekt, unsere Ziele und die Funktionalit\u00e4ten vorstellen, welche wir erfolgreich umgesetzt haben. Tauchen wir ein!\u00a0 Unsere Idee f\u00fcr FastChat\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/W_QwicX4WJDR2dKB4QjdppG7EF6IIhCEhDAhLUwZVqX2aHDevpVSAuBbz3tV3zaTEtIeWbiE3At_usAvJ3fl5Fx3Rohme2aszYrChgGMn6oyTmHH9_6xo1xrIQwnjpvaZ_iFRnKrl0m9L_3o2H3j7wo.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/W_QwicX4WJDR2dKB4QjdppG7EF6IIhCEhDAhLUwZVqX2aHDevpVSAuBbz3tV3zaTEtIeWbiE3At_usAvJ3fl5Fx3Rohme2aszYrChgGMn6oyTmHH9_6xo1xrIQwnjpvaZ_iFRnKrl0m9L_3o2H3j7wo.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/W_QwicX4WJDR2dKB4QjdppG7EF6IIhCEhDAhLUwZVqX2aHDevpVSAuBbz3tV3zaTEtIeWbiE3At_usAvJ3fl5Fx3Rohme2aszYrChgGMn6oyTmHH9_6xo1xrIQwnjpvaZ_iFRnKrl0m9L_3o2H3j7wo.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/09\/W_QwicX4WJDR2dKB4QjdppG7EF6IIhCEhDAhLUwZVqX2aHDevpVSAuBbz3tV3zaTEtIeWbiE3At_usAvJ3fl5Fx3Rohme2aszYrChgGMn6oyTmHH9_6xo1xrIQwnjpvaZ_iFRnKrl0m9L_3o2H3j7wo.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":23517,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/08\/29\/multiplayer-game-with-aws-stadtlandfluss\/","url_meta":{"origin":23579,"position":5},"title":"Multiplayer Game with AWS |\u00a0StadtLandFluss","author":"gi004","date":"29. August 2022","format":false,"excerpt":"Dieser Blogbeitrag soll einen Einblick in die Entwicklung unserer Webanwendung mit den unten definierten Funktionen geben sowie unsere L\u00f6sungsans\u00e4tze, Herausforderungen und Probleme aufzeigen.\u00a0 Cloud Computing VorlesungProjekt Idee & InspirationZielEinblick in das Spiel \u2013 DemoFrameworks - Cloud Services - InfrastructureArchitekturCloud KomponentenAWS ServicesDynamo DBS3LambdaAmazon API- GatewayAmazon CloudWatchTestingCI\/CD PipelineSchwierigkeitenFazit Cloud Computing Vorlesung Ziel\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2022\/08\/image.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":878,"user_id":1107,"is_guest":0,"slug":"sk331","display_name":"sk331","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bf462340d93db660027944f0537b73481660e9296ddc738d53075cc0ddfe37f2?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23579","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1107"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=23579"}],"version-history":[{"count":28,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23579\/revisions"}],"predecessor-version":[{"id":23664,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23579\/revisions\/23664"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=23579"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=23579"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=23579"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=23579"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}