<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Beiträge von Andy Babic - Mobile USTP MKL</title>
	<atom:link href="https://mobile.fhstp.ac.at/author/it221513/feed/" rel="self" type="application/rss+xml" />
	<link>https://mobile.fhstp.ac.at/author/it221513/</link>
	<description>Die &#34;Mobile Forschungsgruppe&#34; der USTP, sie  sammelt hier alles zu den Themen Design, UX und Entwicklung mobiler Applikationen</description>
	<lastBuildDate>Wed, 06 Mar 2024 23:34:26 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://mobile.fhstp.ac.at/wp-content/uploads/2025/03/icon-120x120.webp</url>
	<title>Beiträge von Andy Babic - Mobile USTP MKL</title>
	<link>https://mobile.fhstp.ac.at/author/it221513/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Blinky &#8211; die App die stressen soll</title>
		<link>https://mobile.fhstp.ac.at/allgemein/blinky-die-app-die-stesst/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Wed, 06 Mar 2024 23:23:48 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=12148</guid>

					<description><![CDATA[<p>Die Ursprungsidee für unser Projekt entsprang dem kreativen Geist von Grischa. Seine Inspiration entsprang dem Wunsch, ein Interface während des Autofahrens zu evaluieren &#8211; natürlich in einer simulierten Umgebung. Die zugrunde liegende Idee war, dass ein Interface, das auch unter den Ablenkungen und Herausforderungen des Autofahrens problemlos funktioniert und bedient werden kann, intuitiv und einfach <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/blinky-die-app-die-stesst/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/blinky-die-app-die-stesst/">Blinky &#8211; die App die stressen soll</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Die Ursprungsidee für unser Projekt entsprang dem kreativen Geist von Grischa. Seine Inspiration entsprang dem Wunsch, ein Interface während des Autofahrens zu evaluieren &#8211; natürlich in einer simulierten Umgebung. Die zugrunde liegende Idee war, dass ein Interface, das auch unter den Ablenkungen und Herausforderungen des Autofahrens problemlos funktioniert und bedient werden kann, intuitiv und einfach genug gestaltet ist.</p>



<p>Ursprünglich planten wir, unsere Methode auf dem Gelände der Fachhochschule vorzustellen, um eine authentische Testumgebung zu schaffen. Jedoch stellten wir fest, dass dies nicht möglich war, da unsere Versicherung nicht bereit war, uns die nötige Deckung zu gewähren. Als Alternative beschlossen wir, einen anderen Stresstest nach dem gleichen Schema durchzuführen.</p>



<p>Leider stellten wir fest, dass einige dieser Tests nicht alleine oder vollständig reproduzierbar waren. Dies führte uns zu der Überlegung, wie wir eine zuverlässige Methode entwickeln könnten, um die Aufmerksamkeit in einer kontrollierten Umgebung zu beeinträchtigen.</p>



<p>Aus dieser Herausforderung entstand die Idee, eine Webanwendung zu entwickeln, die genau dies bewerkstelligen sollte: die Aufmerksamkeit der Benutzer gezielt zu beeinträchtigen und dabei alle relevanten Daten aufzuzeichnen. Diese Idee war der Ausgangspunkt für die Entwicklung unserer innovativen Stresstest-Webanwendung.<br><br></p>



<p>Unser Ansatz war es, eine benutzerfreundliche Plattform zu schaffen, die es den Benutzern ermöglicht, Stresstests für ihre Anwendungen durchzuführen, und gleichzeitig eine detaillierte Analyse der Ergebnisse zu ermöglichen. Dabei setzen wir auf moderne Technologien wie WebSockets für eine effiziente Echtzeitkommunikation und Svelte für ein reaktives und performantes Frontend.</p>



<p>Die Kernidee hinter unserer Webanwendung ist einfach: Benutzer können individuelle Stresstests erstellen, indem sie Parameter wie Testdauer, Ereignisse und weitere Einstellungen festlegen. Sobald der Test erstellt ist, generiert die Anwendung einen QR-Code, der gescannt werden kann, um den Test zu starten.</p>



<p>Nach dem Start des Tests werden alle verbundenen Geräte in einem vordefinierten Muster zum Blinken gebracht und geben gleichzeitig einen Alarm aus. Jeder Benutzer muss jeden Alarm quittieren, was eine effektive Überwachung und Reaktion auf die Testbedingungen ermöglicht.</p>



<p>Ein entscheidender Aspekt unserer Webanwendung ist die umfangreiche Aufzeichnung aller Testparameter und Ereignisse. Diese Daten werden sorgfältig gespeichert und können später für eine detaillierte Analyse und Bewertung der Anwendungsnutzung verwendet werden.</p>



<p>Darüber hinaus verfügt unsere Anwendung über ein umfassendes Benutzermanagement, das es Administratoren ermöglicht, Benutzerkonten zu verwalten und Zugriffsrechte zu steuern. Benutzer können ihre erstellten Tests speichern und später erneut laden, um sie erneut durchzuführen oder zu modifizieren.</p>



<p>Dank der Verwendung von WebSockets können wir eine nahtlose Echtzeitkommunikation zwischen den Benutzern und der Anwendung gewährleisten, was eine schnelle Reaktion auf Ereignisse während des Tests ermöglicht. Darüber hinaus ermöglicht die Verwendung von Svelte als Frontend-Technologie eine reaktionsschnelle Benutzeroberfläche mit einer beeindruckenden Leistung, selbst bei umfangreichen Stresstestszenarien.</p>



<p>Insgesamt sind wir davon überzeugt, dass unsere Webanwendung einen bedeutenden Beitrag zur Verbesserung der Qualität und Leistungsfähigkeit von Softwareanwendungen leisten wird, indem sie Benutzern eine effektive Möglichkeit bietet, deren Belastbarkeit unter realen Bedingungen zu testen und zu bewerten.</p>



<h2 class="wp-block-heading"><br><br>Neues Learning 1: Der Websocket<br><br></h2>



<p>Die Entscheidung, WebSocket als Kommunikationsprotokoll für das SyncBlink-Projekt zu verwenden, war strategisch und basierte auf verschiedenen Überlegungen, die die Anforderungen und Ziele des Projekts berücksichtigten.</p>



<p>Zunächst einmal bietet WebSocket eine bidirektionale, dauerhafte Verbindung zwischen dem Server und den Clients. Im Vergleich zu herkömmlichen HTTP-Anfragen, die eine neue Verbindung für jede Anfrage öffnen und schließen, ermöglicht WebSocket eine kontinuierliche Kommunikation in Echtzeit. Dies ist besonders wichtig für Stresstestszenarien, in denen schnelle Reaktionszeiten und die Möglichkeit, Befehle sofort an die verbundenen Geräte zu senden, entscheidend sind.</p>



<p>Ein weiterer wichtiger Aspekt ist die Effizienz von WebSocket in Bezug auf die Netzwerkbelastung. Durch die Vermeidung des Overheads, der mit HTTP-Anfragen verbunden ist, und die Reduzierung der Latenzzeit bietet WebSocket eine optimierte Lösung für die Echtzeitkommunikation.</p>



<p>Darüber hinaus ermöglicht WebSocket die nahtlose Übertragung von Daten in einem standardisierten Format. Dies erleichtert die Entwicklung von Anwendungen, da Entwickler sich auf die Implementierung der Geschäftslogik konzentrieren können, ohne sich um die Details der Datenübertragung kümmern zu müssen.</p>



<p>Ein weiterer entscheidender Faktor für die Verwendung von WebSocket in unserem Projekt war die Notwendigkeit einer gemeinsamen Echtzeiterfahrung für alle Benutzer. WebSocket ermöglicht es, dass alle verbundenen Clients synchronisiert werden und gleichzeitig die gleichen Befehle erhalten, um die Geräte im Test zu steuern. Dies ist besonders wichtig für die Durchführung von koordinierten Stresstests, bei denen die Aktionen aller Benutzer simultan erfolgen müssen.</p>



<p>Insgesamt war WebSocket die ideale Wahl für das SyncBlink-Projekt aufgrund seiner Fähigkeit, eine zuverlässige, effiziente und synchronisierte Echtzeitkommunikation zu ermöglichen. Diese Entscheidung hat maßgeblich dazu beigetragen, eine leistungsstarke und benutzerfreundliche Plattform für Stresstests zu schaffen, die den Anforderungen unserer Benutzer gerecht wird.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="800" height="480" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/63fe48adb8834a29a618ce84_148.3.png" alt="" class="wp-image-12150"/></figure>



<h2 class="wp-block-heading"><br><br>Ein grober Aufbau des Websockets:<br></h2>



<ol class="wp-block-list">
<li><strong>Verbindungsaufbau</strong>:
<ul class="wp-block-list">
<li>Clients (sowohl Hosts als auch Teilnehmer) stellen eine Verbindung zum WebSocket-Server her.</li>



<li>Hosts verbinden sich einfach mit &#8220;wss://syncblink-ws.bandy-app.com&#8221;, während Clients eine Gruppen-ID an die URL anhängen müssen (z.B., &#8220;wss://syncblink-ws.bandy-app.com/?groupId=&lt;hostGroupId>&#8221;), um sich einer bestehenden Session anzuschließen.</li>
</ul>
</li>



<li><strong>Nachrichtenformat</strong>:
<ul class="wp-block-list">
<li>Sowohl der Server als auch die Clients kommunizieren durch Senden und Empfangen von Nachrichten in einem standardisierten Format: <code>{type: "typeOfMessage", data: "objectWithData"}</code>.</li>
</ul>
</li>



<li><strong>Typen von Nachrichten</strong>:
<ul class="wp-block-list">
<li><strong>socket_opened</strong>: Bestätigt die erfolgreiche Verbindung.</li>



<li><strong>new_client</strong>: Informiert den Host über einen neuen Teilnehmer und sendet eine Liste aller verbundenen Geräte.</li>



<li><strong>closing_client</strong>: Informiert den Host, dass ein Teilnehmer die Verbindung getrennt hat, und sendet die Geräte-ID des sich trennenden Clients.</li>



<li><strong>trigger</strong>: Sendet einen Befehl an ein spezifisches Gerät, um eine Aktion auszuführen (z.B., ein Licht zu blinken). Diese Nachricht enthält Gruppen-ID, Geräteinformationen und zusätzliche Eigenschaften für den Trigger.</li>



<li><strong>stop</strong>: Beendet alle Client-Verbindungen innerhalb einer Gruppe, lässt aber den Host verbunden.</li>
</ul>
</li>



<li><strong>Sitzungsverwaltung</strong>:
<ul class="wp-block-list">
<li>Der Server verwaltet aktive Sessions und Geräte mittels einer internen Map-Struktur. Jeder Client (bzw. Gerät) wird einer Session zugeordnet, wobei jeder Session eine eindeutige Gruppen-ID zugewiesen ist.</li>



<li>Bei jeder Verbindung wird überprüft, ob es sich um einen neuen Client oder einen Host handelt. Neue Clients erhalten eine Geräte-ID und werden der entsprechenden Session zugeordnet. Hosts verwalten die Session und erhalten Updates über Client-Verbindungen und -Trennungen.</li>
</ul>
</li>



<li><strong>Ereignisbehandlung</strong>:
<ul class="wp-block-list">
<li>Sobald eine Verbindung steht, können Nachrichten für verschiedene Zwecke gesendet werden: Geräte triggern, Sessions stoppen, und über Zustandsänderungen informieren.</li>



<li>Der Server verarbeitet eingehende Nachrichten, führt die angeforderten Aktionen aus, und leitet entsprechende Befehle an die betreffenden Clients weiter.</li>
</ul>
</li>



<li><strong>Fehlerbehandlung</strong>:
<ul class="wp-block-list">
<li>Fehler während der WebSocket-Kommunikation (z.B., wenn der angeforderte Master oder Client nicht gefunden wird) führen zum Senden einer Fehlermeldung mit dem Typ &#8220;error&#8221; und einer Beschreibung des aufgetretenen Fehlers.<br><br></li>
</ul>
</li>
</ol>



<p></p>



<h2 class="wp-block-heading">Neues Learning 2: Das G in Vue steht für Gut</h2>



<p></p>



<h2 class="wp-block-heading">Neues Learning 3: Svelte mit Tailwind &amp; Skeleton/Flowbite machen Spaß</h2>



<figure class="wp-block-image size-full"><img decoding="async" width="1240" height="698" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/9969f494-sveltelogo.png" alt="" class="wp-image-12151"/></figure>



<p></p>



<p>Ursprünglich hatten wir geplant, Vue.js für das Frontend zu verwenden. Vue.js ist bekannt für seine Einfachheit und Flexibilität, besonders für kleinere Anwendungen. Jedoch stellten wir fest, dass die Verwendung von TypeScript mit Vue.js zu Komplikationen führte, ähnlich wie Java und JavaScript nicht immer nahtlos zusammenarbeiten. Deshalb entschieden wir uns nach einigen Stunden und Tagen der Evaluation gegen Vue.js und wählten stattdessen Svelte. Die Entscheidung erwies sich als äußerst positiv, da Svelte eine leistungsstarke Alternative darstellt, die sich nahtlos in unser Projekt integrieren ließ und eine äußerst angenehme Entwicklererfahrung bietet.</p>



<p></p>



<p><strong>Tailwind CSS und Skeleton für das Styling:</strong> Da wir wenig Zeit in die Gestaltung des Frontends investieren wollten, entschieden wir uns für Tailwind CSS, um schnell und effizient ansprechende Benutzeroberflächen zu erstellen. Tailwind CSS ermöglicht es uns, den Styling-Prozess zu beschleunigen, indem wir die Styles direkt in den HTML-Dateien definieren. Obwohl dies anfangs etwas ungewohnt war, stellten wir fest, dass dies eine effektive Möglichkeit ist, das Styling zu vereinfachen und gleichzeitig eine hohe Flexibilität zu bieten. Zusätzlich nutzten wir Skeleton als UI-Bibliothek, um das Aussehen unserer Anwendung weiter zu verbessern und sicherzustellen, dass sie sowohl funktional als auch ästhetisch ansprechend ist.</p>



<p><strong>Kommunikation über WebSockets:</strong> Die Kommunikation im Frontend erfolgt über eine WebSocket-Verbindung zum Server. Diese bidirektionale, dauerhafte Verbindung ermöglicht eine effiziente Echtzeitkommunikation zwischen dem Frontend und dem Backend-Server. Durch die Verwendung von WebSockets können wir sicherstellen, dass alle Benutzer synchronisiert sind und dass Testergebnisse sofort aktualisiert und angezeigt werden können. Dies ist besonders wichtig für Stresstestszenarien, bei denen eine schnelle Reaktionszeit und präzise Steuerung erforderlich sind.</p>



<p><strong>Strukturierte Architektur und reaktives Zustandsmanagement:</strong> Das Frontend ist strukturiert und organisiert, um eine klare Trennung von Verantwortlichkeiten zu gewährleisten und die Wartbarkeit zu erleichtern. Wir verwenden Svelte-Komponenten, um die Benutzeroberfläche zu definieren und WebSocket-Funktionen, um die Kommunikation mit dem Server zu verwalten. Reaktive Zustandsmanagement-Techniken, wie z.B. die Verwendung von Stores, ermöglichen es uns, den Zustand der Anwendung effektiv zu verwalten und die Benutzeroberfläche dynamisch zu aktualisieren, basierend auf den Änderungen, die über WebSockets empfangen werden.</p>



<p>Insgesamt bietet die Frontend-Architektur von SyncBlink eine robuste und flexible Grundlage für die Durchführung von Stresstests und die effiziente Verwaltung von Benutzerinteraktionen in Echtzeit. Durch die Verwendung von Svelte, Tailwind CSS und WebSockets konnten wir eine ansprechende und leistungsfähige Anwendung entwickeln, die den Anforderungen unserer Benutzer gerecht wird.</p>



<p>Ein grober Aufbau unseres Frontends</p>



<ol class="wp-block-list">
<li><strong>Verbindungsaufbau über WebSockets</strong>:
<ul class="wp-block-list">
<li>Der <strong>Websocket.ts</strong> im <code>src/lib</code>-Ordner ist verantwortlich für das Einrichten der WebSocket-Verbindung mit dem Server. Die <code>connectWebSocket</code>-Funktion erlaubt es dem Frontend, sich entweder als Host oder als Client zu einer Gruppe (Session) zu verbinden, indem optional eine Gruppen-ID an die WebSocket-URL angehängt wird.</li>
</ul>
</li>



<li><strong>Session-Management und Gerätetriggerung</strong>:
<ul class="wp-block-list">
<li>Innerhalb der WebSocket-Kommunikation gibt es Funktionen wie <code>startSession</code>, <code>triggerDevice</code>, und <code>stopSession</code>, die für das Senden spezifischer Nachrichtentypen zum Server verantwortlich sind. Diese Funktionen werden verwendet, um Tests zu starten, Geräte innerhalb einer Session zu triggern oder die Session zu beenden.</li>
</ul>
</li>



<li><strong>Komponenten für Benutzerinteraktion</strong>:
<ul class="wp-block-list">
<li><strong>TestModal.svelte</strong>, <strong>BlinkModal.svelte</strong>, und <strong>ShareTestModal.svelte</strong> sind Svelte-Komponenten, die die Benutzerinteraktion mit der Anwendung darstellen. Sie nutzen die oben genannten WebSocket-Funktionen, um Benutzereingaben wie das Starten eines Tests oder das Triggern eines Geräts in Echtzeit zu verarbeiten.</li>
</ul>
</li>



<li><strong>Dynamische Testkonfiguration</strong>:
<ul class="wp-block-list">
<li>Der <strong>TestForm.svelte</strong> im <code>src/routes/(main)</code>-Ordner ermöglicht es dem Benutzer, Testparameter wie Testdauer, Ereignisanzahl und Geräteanzahl festzulegen. Nach der Konfiguration können diese Einstellungen genutzt werden, um die Testsession über WebSockets zu starten.</li>
</ul>
</li>



<li><strong>Reaktives Zustandsmanagement</strong>:
<ul class="wp-block-list">
<li>Die Stores in <code>src/lib/stores</code>, wie z.B. <code>websocketData.ts</code> und <code>user.ts</code>, verwalten den Zustand der Anwendung, einschließlich der verbundenen Geräte und Benutzerdaten. Diese Stores sind zentral für das Aktualisieren der UI basierend auf den Änderungen, die über WebSockets empfangen werden.</li>
</ul>
</li>



<li><strong>Feedback und Ergebnisanzeige</strong>:
<ul class="wp-block-list">
<li>Nach dem Abschluss von Tests können die Ergebnisse über die <strong>results/+page.svelte</strong>-Komponente visualisiert werden. Diese Komponente zeigt eine Zusammenfassung der Testergebnisse, ermöglicht das Herunterladen der Daten und bietet eine visuelle Darstellung der gesammelten Daten.</li>
</ul>
</li>
</ol>



<p>Zusammenfassend ermöglicht die Frontend-Architektur von SyncBlink eine reibungslose und effiziente Echtzeitkommunikation zwischen den Benutzern und dem Backend-Server für die Durchführung von Stresstests. Durch die Nutzung von WebSockets wird sichergestellt, dass alle Teilnehmer einer Session synchronisiert sind und dass die Testergebnisse in Echtzeit analysiert und dargestellt werden können.</p>



<h2 class="wp-block-heading">Neues Learning 4: Warum Tailwind großartig ist?</h2>



<p><strong>HTML-Datei mit normalem CSS:</strong></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
&amp;lt;!DOCTYPE html&gt;
&amp;lt;html lang=&quot;en&quot;&gt;
&amp;lt;head&gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &amp;lt;title&gt;Tailwind vs. Normal CSS&amp;lt;/title&gt;
    &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;styles.css&quot;&gt;
&amp;lt;/head&gt;
&amp;lt;body&gt;

&amp;lt;div class=&quot;container&quot;&gt;
    &amp;lt;h1 class=&quot;text-2xl font-bold text-blue-500&quot;&gt;Hello, world!&amp;lt;/h1&gt;
    &amp;lt;p class=&quot;text-lg text-gray-700&quot;&gt;This is a paragraph with some text.&amp;lt;/p&gt;
    &amp;lt;button class=&quot;px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-700&quot;&gt;Click me&amp;lt;/button&gt;
&amp;lt;/div&gt;

&amp;lt;/body&gt;
&amp;lt;/html&gt;

</pre></div>


<p><strong>styles.css:</strong></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
.container {
    max-width: 600px;
    margin: 0 auto;
    padding: 20px;
}

.container h1 {
    font-size: 24px;
    font-weight: bold;
    color: #1e40af;
}

.container p {
    font-size: 16px;
    color: #4b5563;
}

.container button {
    padding: 10px 20px;
    background-color: #4299e1;
    color: #fff;
    border-radius: 4px;
    cursor: pointer;
}

.container button:hover {
    background-color: #3182ce;
}

</pre></div>


<p>Mit Tailwind:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
&amp;lt;!DOCTYPE html&gt;
&amp;lt;html lang=&quot;en&quot;&gt;
&amp;lt;head&gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &amp;lt;title&gt;Tailwind vs. Normal CSS&amp;lt;/title&gt;
    &amp;lt;link href=&quot;https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css&quot; rel=&quot;stylesheet&quot;&gt;
&amp;lt;/head&gt;
&amp;lt;body&gt;

&amp;lt;div class=&quot;container mx-auto p-4&quot;&gt;
    &amp;lt;h1 class=&quot;text-2xl font-bold text-blue-500&quot;&gt;Hello, world!&amp;lt;/h1&gt;
    &amp;lt;p class=&quot;text-lg text-gray-700&quot;&gt;This is a paragraph with some text.&amp;lt;/p&gt;
    &amp;lt;button class=&quot;px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-700&quot;&gt;Click me&amp;lt;/button&gt;
&amp;lt;/div&gt;

&amp;lt;/body&gt;
&amp;lt;/html&gt;

</pre></div>


<p>In diesem Beispiel sehen Sie, dass Tailwind CSS Klassen verwendet, um das Styling direkt im HTML-Code anzugeben, während herkömmliches CSS in einer separaten Datei definiert ist. Der Einsatz von Tailwind CSS ermöglicht es, das Styling direkt in den Elementen zu definieren, was die Entwicklung beschleunigen kann, während herkömmliches CSS eine separate Stylesheet-Datei erfordert.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1057" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/Screen-Shot-2022-12-23-at-4.45.52-PM-1057x800.jpg" alt="" class="wp-image-12153"/></figure>



<p><strong>Skeleton: Ein UI-Framework für Svelte</strong> +Tailwind</p>



<p>Skeleton ist ein leichtgewichtiges und minimalistisches UI-Framework, das speziell für die Verwendung mit Svelte entwickelt wurde. Es bietet vorgefertigte Komponenten und Layouts, die es einfach machen, ansprechende Benutzeroberflächen für Svelte-Anwendungen zu erstellen, ohne dabei aufgebläht oder überladen zu wirken.</p>



<p><strong>Merkmale von Skeleton:</strong></p>



<ol class="wp-block-list">
<li><strong>Leichtgewichtig und minimalistisch:</strong> Skeleton ist bewusst schlank und minimalistisch gehalten, um eine einfache Integration in Svelte-Projekte zu ermöglichen, ohne unnötigen Overhead oder unnötige Komplexität.</li>



<li><strong>Einfache Verwendung:</strong> Skeleton bietet eine Reihe von vorgefertigten Komponenten und Layouts, die einfach in Svelte-Anwendungen eingebunden werden können. Dies erleichtert die Entwicklung von Benutzeroberflächen, indem es Entwicklern ermöglicht, sich auf die Funktionalität ihrer Anwendungen zu konzentrieren, anstatt Zeit mit dem Erstellen von UI-Komponenten zu verbringen.</li>



<li><strong>Responsives Design:</strong> Die Komponenten und Layouts von Skeleton sind responsiv und passen sich automatisch an verschiedene Bildschirmgrößen und Geräte an. Dies gewährleistet eine konsistente Benutzererfahrung auf allen Geräten und Bildschirmgrößen.</li>



<li><strong>Modular und anpassbar:</strong> Skeleton ist modular aufgebaut, was es Entwicklern ermöglicht, nur die Komponenten und Funktionen zu verwenden, die sie benötigen. Darüber hinaus ist Skeleton vollständig anpassbar und kann leicht an die spezifischen Anforderungen und Designrichtlinien eines Projekts angepasst werden.</li>



<li><strong>Aktive Community und Unterstützung:</strong> Skeleton wird von einer aktiven Community von Entwicklern unterstützt, die regelmäßig Updates und Verbesserungen bereitstellen. Darüber hinaus gibt es eine Vielzahl von Ressourcen und Dokumentationen, die Entwicklern helfen, das Beste aus dem Framework herauszuholen.</li>
</ol>



<p>Insgesamt bietet Skeleton eine einfache und effektive Möglichkeit, ansprechende Benutzeroberflächen für Svelte-Anwendungen zu erstellen, ohne dabei auf Komplexität oder übermäßigen Code zurückgreifen zu müssen. Mit seiner schlanken und minimalistischen Herangehensweise ist Skeleton eine hervorragende Wahl für Entwickler, die eine einfache und benutzerfreundliche UI-Lösung für ihre Svelte-Projekte suchen.</p>



<h2 class="wp-block-heading">Neues Learning 5: <strong>Pocketbase für das Datenmanagemen</strong>t</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1200" height="630" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/og.png" alt="" class="wp-image-12152"/></figure>



<p>Um die Benutzerkonten, Testdaten und andere relevante Informationen effizient zu verwalten, haben wir uns für Pocketbase als unsere Datenbanklösung entschieden. Pocketbase bietet eine benutzerfreundliche und skalierbare Plattform für das Speichern und Abrufen von Daten in Echtzeit.<br><br>Pocketbase faden wir dabei immer cool, denn wer das süße Maskottchen mal ins herz geschlossen hat, der will es natürlich auch mit Daten füttern !</p>



<p><strong>Warum Pocketbase?</strong></p>



<ol class="wp-block-list">
<li><strong>Einfachheit und Benutzerfreundlichkeit:</strong> Pocketbase bietet eine einfache und intuitive Schnittstelle für das Datenmanagement. Durch die Verwendung von Pocketbase konnten wir schnell und effizient Datenbankoperationen durchführen, ohne uns um komplexe Konfigurationen oder Administration kümmern zu müssen.</li>



<li><strong>Echtzeitdatenbank mit WebSockets:</strong> Eine der herausragenden Funktionen von Pocketbase ist die Unterstützung von Echtzeitdatenbanken mit WebSockets. Dies ermöglicht es uns, Daten in Echtzeit zwischen dem Frontend und dem Backend auszutauschen, was besonders wichtig ist für die Synchronisation von Benutzerinteraktionen und Testergebnissen in unserer Anwendung.<br>Leider haben wir das erst später erfahren. So haben wir unser Websocket nicht mit Pocketbase erstellt&#8230; Tja</li>



<li><strong>Skalierbarkeit und Zuverlässigkeit:</strong> Pocketbase bietet eine hoch skalierbare und zuverlässige Infrastruktur für das Datenmanagement. Wir können unsere Anwendung problemlos erweitern, wenn die Anforderungen wachsen, und gleichzeitig sicherstellen, dass unsere Daten sicher und geschützt sind.</li>



<li><strong>Dokumentenorientierte Datenbankstruktur:</strong> Pocketbase basiert auf einer dokumentenorientierten Datenbankstruktur, die flexibel und anpassungsfähig ist. Dies ermöglicht es uns, Daten in einer strukturierten und übersichtlichen Weise zu organisieren, ohne uns um komplexe relationale Datenbankmodelle kümmern zu müssen.</li>



<li><strong>Entwicklerfreundlichkeit:</strong> Pocketbase bietet eine Reihe von Entwicklerwerkzeugen und -funktionen, die die Entwicklung und Wartung unserer Anwendung erleichtern. Durch die Verwendung von Pocketbase konnten wir unsere Entwicklungszeit verkürzen und gleichzeitig sicherstellen, dass unsere Anwendung robust und leistungsstark ist.</li>
</ol>



<h2 class="wp-block-heading">Neugierig ?<br>Besuche <a href="http://Blinky.bandy-app.com">Blinky.bandy-app.com</a></h2>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/blinky-die-app-die-stesst/">Blinky &#8211; die App die stressen soll</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Wie Instagram von 20.000 auf 2.000.000 Nutzer skalierte</title>
		<link>https://mobile.fhstp.ac.at/allgemein/wie-instagram-von-20-000-auf-2-000-000-nutzer-skalierte/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Wed, 06 Mar 2024 19:00:15 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=12089</guid>

					<description><![CDATA[<p>Die Motivation hinter dem tiefergehenden Blick in die Infrastrukturtransformation von Instagram wurzelt in einer langjährigen Faszination für die Skalierbarkeit globaler Systeme. Diese Begeisterung wurde besonders angefacht, als ich begann, mich mit FastAPI, einer modernen, schnellen (high-performance) Backend-Webentwicklung mit Python zu beschäftigen. FastAPI, zusammen mit Django und Flask, bildet das Trio der führenden Backend-Frameworks in der <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/wie-instagram-von-20-000-auf-2-000-000-nutzer-skalierte/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wie-instagram-von-20-000-auf-2-000-000-nutzer-skalierte/">Wie Instagram von 20.000 auf 2.000.000 Nutzer skalierte</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p><br></p>



<p>Die Motivation hinter dem tiefergehenden Blick in die Infrastrukturtransformation von Instagram wurzelt in einer langjährigen Faszination für die Skalierbarkeit globaler Systeme. Diese Begeisterung wurde besonders angefacht, als ich begann, mich mit FastAPI, einer modernen, schnellen (high-performance) Backend-Webentwicklung mit Python zu beschäftigen. FastAPI, zusammen mit Django und Flask, bildet das Trio der führenden Backend-Frameworks in der Python-Entwicklungswelt. Jedes dieser Frameworks bringt seine eigenen Stärken und Einschränkungen mit sich, was die Entscheidung für eine Technologie sowohl zu einer Frage der Anforderungen als auch der persönlichen Vorlieben macht.</p>



<p>Die Entdeckung, dass Instagram, eine Plattform mit Milliarden von Nutzern, auf Django – einem Python-Framework – aufbaut, war eine Offenbarung. Es räumte mit dem Vorurteil auf, dass Python und seine Frameworks nur für kleinere Projekte oder Hobbyprogrammierer geeignet sind. Stattdessen stand ich vor einem lebendigen Beispiel dafür, wie Python-basierte Backend-Systeme skaliert und optimiert werden können, um den Anforderungen einer der größten Social-Media-Plattformen der Welt gerecht zu werden.</p>



<p>Diese Erkenntnis motivierte mich, tiefer in das Thema einzutauchen und die verschiedenen Quellen  zu erkunden, die die Evolution der technischen Infrastruktur von Instagram beleuchten. Von der Optimierung der Datenverarbeitung über innovative Video-Codierungsmethoden bis hin zur effizienten Nutzung von Serverressourcen. Jeder Aspekt dieser Transformation bietet wertvolle Lektionen und Inspiration für Entwickler und Technologieenthusiasten.</p>



<p>Durch die Zusammenfassung dieser Erkenntnisse in einem Bericht wollte ich nicht nur mein Verständnis für die Herausforderungen und Lösungen im Kontext globaler Skalierung vertiefen, sondern auch andere ermutigen, die Potenziale von Python und seinen Frameworks in der Entwicklung großer und leistungsfähiger Systeme zu erkennen. Die Geschichte von Instagrams technischer Evolution unterstreicht die Bedeutung kontinuierlicher Innovation und Anpassung, um den wachsenden Anforderungen einer dynamischen Nutzerbasis gerecht zu werden. Sie dient als Beweis dafür, dass mit der richtigen Strategie und den passenden Technologien auch scheinbar unüberwindbare technische Herausforderungen gemeistert werden können.<br><br>Überblick:</p>



<p>Die Skalierung und Optimierung der Webserver waren kritische Aspekte in der Entwicklung von Instagram, um mit dem rasanten Wachstum der Plattform Schritt zu halten. Die steigende Anzahl monatlich aktiver Benutzer und der exponentielle Anstieg der Anfragen pro Sekunde stellten eine Herausforderung dar, die nicht nur durch die Erweiterung der Serverinfrastruktur, sondern auch durch eine effiziente Gestaltung und Konfiguration der Webserver bewältigt werden musste. Instagram setzte auf zustandslose Webserver, die eine Schlüsselkomponente in modernen, hochverfügbaren Webanwendungen darstellen. Zustandslose Server speichern keine Informationen über den Benutzerzustand von einer Anfrage zur nächsten, was sie ideal für die Skalierung und Verteilung über mehrere Server und Rechenzentren macht. Dieser Ansatz ermöglichte es Instagram, eine hohe Verfügbarkeit und Zuverlässigkeit zu gewährleisten, indem Benutzeranfragen effizient zwischen den Servern verteilt wurden, ohne dass die Notwendigkeit bestand, den Benutzerzustand von einem Server zum anderen zu synchronisieren. Zur Bewältigung der Last wurden die Anfragen intelligent zwischen synchronen und asynchronen Verarbeitungswegen aufgeteilt. Synchron bearbeitete Anfragen wurden direkt von den Webservern abgewickelt, um schnelle Antworten auf Benutzerinteraktionen zu ermöglichen. Asynchrone Jobs hingegen, wie das Verarbeiten von hochgeladenen Bildern oder das Versenden von Benachrichtigungen, wurden in eine Warteschlange eingereiht und von spezialisierten Async-Servern verarbeitet. Dieses Modell der Aufgabentrennung ermöglichte es Instagram, Ressourcen effizient zuzuweisen und sicherzustellen, dass zeitaufwändige Aufgaben die sofortige Benutzererfahrung nicht beeinträchtigen. Für eine optimale Lastverteilung und zur Minimierung der Latenz für Endbenutzer weltweit setzte Instagram auf Load Balancer und geografisch verteilte Rechenzentren. Die Load Balancer spielten eine entscheidende Rolle bei der Verteilung der eingehenden Anfragen auf die verfügbaren Webserver, basierend auf Faktoren wie Serverlast und geografischer Nähe zum Benutzer. Durch die geografische Verteilung der Serverinfrastruktur konnten Anfragen lokal abgehandelt werden, was die Antwortzeiten verbesserte und die Belastung der zentralen Datenbanken reduzierte. In der Erweiterung und Optimierung ihrer Webserver-Architektur nutzte Instagram Open-Source-Technologien und bewährte Verfahren. Server wie Nginx oder Apache HTTP Server, bekannt für ihre Effizienz und Flexibilität, könnten in ähnlichen Szenarien eingesetzt werden. Für die asynchrone Verarbeitung bieten Technologien wie Celery (für Python-basierte Anwendungen) oder RabbitMQ als Message Broker robuste Lösungen zur Verwaltung von Hintergrundjobs und zur Entkopplung von komplexen Verarbeitungsaufgaben. Abschließend lässt sich sagen, dass die Strategie von Instagram, in zustandslose Webserver und die intelligente Verteilung von Aufgaben zu investieren, ein beispielhafter Ansatz für die Skalierung moderner Webanwendungen ist. Diese Architektur bietet nicht nur eine solide Grundlage für das Wachstum und die Expansion, sondern gewährleistet auch eine hohe Benutzerzufriedenheit durch schnelle und zuverlässige Dienste. Entwickler, die vor ähnlichen Herausforderungen stehen, können von diesen Erfahrungen lernen und Open-Source-Alternativen in Betracht ziehen, um ihre eigenen Webanwendungen effizient und skalierbar zu gestalten.</p>



<p>Die Nutzung von modernen Datenformaten:</p>



<p></p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/Reducing-Instagram-Video-Compute_image2.png.webp"><img loading="lazy" decoding="async" width="760" height="611" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/Reducing-Instagram-Video-Compute_image2.png.webp" alt="" class="wp-image-12090"/></a></figure>



<p>Die kontinuierliche Optimierung der Datenverarbeitung und -speicherung bei Instagram ist ein Kernaspekt der Infrastrukturentwicklung, um die Effizienz zu maximieren und das Nutzererlebnis zu verbessern. Ein herausragendes Beispiel dieser Bemühungen ist die innovative Methode zur Verarbeitung neuer Videos, die Instagrams Ingenieure entwickelt haben. Diese Methode reduziert die Kosten für die Erstellung grundlegender Video-Codierungen um 94 Prozent. Durch diese Optimierung kann die Videoinfrastruktur von Meta weiterhin skalieren, ohne zusätzliche Maschinen hinzufügen zu müssen. Dadurch werden Ressourcen frei, die es mehr Menschen ermöglichen, fortgeschrittene Codierungen zu nutzen, die ein klareres Video bieten, das flüssiger abgespielt wird. Dies ist besonders vorteilhaft für Personen in Ländern mit langsameren Internetverbindungen.</p>



<p>Angesichts einer stetig wachsenden Nutzerbasis von mehr als 2 Milliarden monatlich aktiven Benutzern war es für Instagram entscheidend, die bestmögliche Leistung aus seiner Serverflotte herauszuholen. Prognosen Anfang 2021 zeigten, dass innerhalb von 12 Monaten nicht genügend Kapazitäten vorhanden sein würden, um Video-Uploads für alle zu ermöglichen. Doch durch ständige Effizienzsteigerungen fand Instagram eine Möglichkeit, dieser zunehmenden Nachfrage zu begegnen und seine Infrastruktur zu skalieren, indem mehr aus den vorhandenen Maschinen herausgeholt wurde.</p>



<p>Instagram erzeugt mehrere codierte Versionen hochgeladener Videos, jede mit unterschiedlichen Eigenschaften. Durch die Wiederverwendung einer Art von Videocodierung zur Hilfe bei der Generierung einer anderen Art konnten die Rechenressourcen, die für weniger angesehene Videocodierungen aufgewendet wurden, um 94 Prozent reduziert werden. Mit mehr verfügbaren Ressourcen können mehr fortgeschrittene Codierungen produziert werden, was es mehr Menschen ermöglicht, Videos in klarerer Qualität mit flüssigerer Wiedergabe zu erleben.</p>



<p>Das Problem bestand darin, dass über 80 Prozent der Ressourcen für die Verarbeitung von Codierungen mit minimaler Funktionalität aufgewendet wurden. Wäre diese Tendenz fortgesetzt worden, hätten diese Codierungen innerhalb eines Jahres alle Ressourcen monopolisiert, was dazu geführt hätte, dass Videos länger zum Veröffentlichen gebraucht hätten oder gar nicht erst veröffentlicht werden konnten. Fortgeschrittene Codierungen machten nur 15 Prozent der gesamten Wiedergabezeit aus, und die gesamte Rechenleistung für Versionen mit minimaler Funktionalität aufzuwenden, hätte bald verhindert, dass fortgeschrittene Videocodierungen bereitgestellt werden könnten.</p>



<p>Durch die Entfernung redundanter Arbeitslasten und die Neupaketierung von Videoframes in eine ABR-fähige Dateistruktur konnte Instagram signifikant Rechenressourcen freisetzen. Dieser Ansatz ermöglichte eine erhöhte Produktion fortgeschrittener Codierungen, obwohl er auf Kosten der Kompressionseffizienz der grundlegenden ABR-Codierungen ging. Die Theorie war, dass die Generierung einer größeren Anzahl fortgeschrittener Codierungen insgesamt positiv für die Nutzer von Instagram sein würde.</p>



<p>Nach dem Start dieser Optimierung verzeichnete Instagram erhebliche Einsparungen bei den Rechenkosten und eine höhere Wiedergabezeit fortgeschrittener Codierungen. Die neue Codierungsstrategie reduzierte die Kosten für die Erstellung grundlegender ABR-Codierungen um 94 Prozent. Mit den freigewordenen Ressourcen konnte die Gesamtwiedergabezeit fortgeschrittener Codierungen um 33 Prozent erhöht werden. Dies bedeutet, dass heute mehr Menschen auf Instagram Videos erleben können, die klarer und flüssiger abgespielt werden. Dies ist besonders wichtig, um Personen in Ländern mit langsameren Internetverbindungen ein großartiges Erlebnis zu bieten.</p>



<p>Diese technische Innovation unterstreicht das Engagement von Instagram, kontinuierlich seine Produktangebote zu verbessern und einen signifikanten Einfluss zu haben, insbesondere angesichts seiner Skalierung – einschließlich 2 Milliarden monatlich aktiver Nutzer auf der Plattform und mehr als 140 Milliarden Reels-Wiedergaben auf Instagram und Facebook jeden Tag. Instagrams kontinuierliche Bemühungen um Ingenieursinnovationen sind entscheidend, um der wachsenden Nutzerbasis gerecht zu werden und den Anforderungen unserer Serverflotte zu begegnen.</p>



<figure class="wp-block-image size-full"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/Instagram-architecture-min-jpeg.jpg.webp"><img loading="lazy" decoding="async" width="1000" height="549" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2024/03/Instagram-architecture-min-jpeg.jpg.webp" alt="" class="wp-image-12092"/></a></figure>



<p>Quelle: https://instagram-engineering.com/under-the-hood-instagram-in-2015-8e8aff5ab7c2</p>



<p></p>



<p>Webserver:</p>



<p>Die effiziente Verarbeitung und Speicherung des gewaltigen Datenvolumens, das von den Millionen Instagram-Nutzern generiert wird, stellte eine erhebliche Herausforderung dar. Um dieser Herausforderung zu begegnen, setzte Instagram auf eine Kombination aus modernen Technologien und bewährten Datenmanagementstrategien. Die Wahl fiel auf PostgreSQL und Cassandra als primäre Datenbanksysteme, die für ihre Robustheit, Skalierbarkeit und Leistung bekannt sind. Diese Systeme ermöglichten es Instagram, mit der ständig wachsenden Datenmenge Schritt zu halten und eine effiziente Datenabfrage und -speicherung zu gewährleisten. PostgreSQL, ein fortschrittliches Open-Source-objekt-relationales Datenbanksystem, wurde vor allem wegen seiner Zuverlässigkeit und der starken Unterstützung für komplexe Abfragen und Transaktionen ausgewählt. Seine Fähigkeit, mit großen Datensätzen umzugehen und eine hohe Leistung bei gleichzeitiger Wahrung der Datenintegrität zu bieten, machte es zu einer idealen Wahl für die Speicherung von Benutzerdaten, Beiträgen und Beziehungen. Cassandra hingegen, ein hoch skalierbares NoSQL-Datenbanksystem, wurde für die Verwaltung von Daten verwendet, die eine schnelle Schreib- und Lesegeschwindigkeit erfordern, wie z.B. Likes und Kommentare. Durch seine verteilte Natur konnte Cassandra problemlos über mehrere Rechenzentren hinweg skaliert werden, was eine nahtlose globale Expansion unterstützte und die Grundlage für eine hohe Verfügbarkeit und Ausfallsicherheit bildete. Um die globale Konsistenz der Daten über alle Nutzer hinweg sicherzustellen, implementierte Instagram ausgeklügelte Replikationsmechanismen. Diese Mechanismen waren entscheidend, um konsistente und aktuelle Daten über verschiedene geografische Standorte hinweg zu gewährleisten. Die Replikation zwischen den Datenzentren ermöglichte es, Daten nahe am Benutzer zu halten, was die Latenzzeit verringerte und die allgemeine Benutzererfahrung verbesserte. Für die Anwendungsentwicklung und Datenverarbeitung nutzte Instagram ebenfalls eine Reihe von Open-Source-Technologien. Beispielsweise unterstützten Message-Queueing-Systeme wie RabbitMQ und Apache Kafka die asynchrone Datenverarbeitung, die für die Bewältigung der enormen Mengen an Benutzerinteraktionen erforderlich war. Diese Systeme ermöglichten eine effiziente Verarbeitung von Ereignissen und Datenströmen, indem sie eine Entkopplung der Dienste erlaubten, was zu einer verbesserten Skalierbarkeit und Wartbarkeit der Anwendungsarchitektur führte. Insgesamt bildeten die Kombination aus PostgreSQL und Cassandra für die Datenspeicherung, ergänzt durch leistungsfähige Replikationsmechanismen und unterstützt durch eine robuste Architektur für die Datenverarbeitung, das Rückgrat der Fähigkeit von Instagram, mit dem rasanten Wachstum umzugehen. Diese Technologiestapel, zusammen mit dem Einsatz von Open-Source-Tools für spezifische Aufgaben, demonstrieren einen effektiven Ansatz für die Verwaltung großer Datenmengen in einem globalen, hochverfügbaren und skalierbaren Webdienst.</p>



<p></p>



<p></p>



<p>Ein tiefgreifender Einblick in die Transformation:</p>



<p>Die umfassende Transformation von Instagram zielte darauf ab, die Skalierbarkeit und Performance der Plattform zu optimieren, insbesondere in den Bereichen Datenbankmanagement, Cache-Konsistenz und Minimierung der Netzwerklatenz. Um die Backend-Systeme effizienter zu gestalten und die Zuverlässigkeit zu erhöhen, implementierte Instagram innovative Technologien und Strategien, die eine signifikante Verbesserung der Systemperformance zur Folge hatten. Eine Schlüsselstrategie war die Nutzung von Memcache-Leasing, eine Technik, die die Effizienz des Caching-Mechanismus verbessert. Durch dieses Verfahren wurde ein Mechanismus eingeführt, der temporäre Exklusivrechte für das Aktualisieren oder Abrufen von Cache-Daten vergibt, um die Konsistenz zu gewährleisten und Cache-Stürme zu vermeiden. Dies war besonders wichtig, um die Belastung der Datenbanken zu reduzieren und gleichzeitig schnelle Zugriffszeiten auf häufig angefragte Daten zu ermöglichen. Memcache-Leasing half dabei, die Cache-Effizienz zu maximieren und gleichzeitig die Wahrscheinlichkeit von Dateninkonsistenzen zu minimieren. Ein weiterer wichtiger Schritt zur Optimierung der Backend-Systeme war die Denormalisierung von Zählern in den Datenbanken. Durch die Denormalisierung – also das Speichern redundanter Daten in der Datenbank, um komplexe Abfragen zu vermeiden – konnte Instagram die Anzahl der notwendigen Datenbankzugriffe reduzieren. Dieser Ansatz war insbesondere bei der Verwaltung von hochfrequentierten Daten, wie beispielsweise der Anzahl von Likes oder Kommentaren eines Posts, effektiv. Die Denormalisierung ermöglichte es, diese Werte schnell zu aktualisieren und abzufragen, ohne aufwendige Berechnungen oder Joins durchführen zu müssen, was die Performance erheblich verbesserte. Die Kombination dieser Optimierungen führte zu einer deutlichen Reduzierung der Latenzzeiten. Ursprünglich bei etwa 10 ms, konnte Instagram die Antwortzeiten auf beeindruckende 60 ms verbessern. Dieser Leistungsgewinn trug wesentlich zu einer schnelleren und reibungsloseren Benutzererfahrung bei. Schnellere Ladezeiten und eine flüssigere Interaktion mit der Plattform erhöhen die Benutzerzufriedenheit und -bindung, was für den Erfolg von Instagram in einem hochkompetitiven Marktumfeld entscheidend ist. Diese technischen Verbesserungen bei Instagram unterstreichen die Bedeutung einer kontinuierlichen Optimierung und Anpassung der Backend-Systeme, um mit dem Wachstum der Nutzerbasis und den steigenden Anforderungen Schritt zu halten. Durch den Einsatz von Technologien wie Memcache-Leasing und die strategische Denormalisierung von Daten konnte Instagram nicht nur die Systemperformance verbessern, sondern auch die Skalierbarkeit und Zuverlässigkeit der Plattform sicherstellen. Diese Maßnahmen sind beispielhaft für die Anwendung moderner Technologien und Architekturprinzipien in der Entwicklung skalierbarer und performanter Webanwendungen.</p>



<p><br><br></p>



<p>Zusammenfassung und eigene Meinung<br></p>



<p>Die Architektur, die Instagram entwickelt hat, um mit seinem massiven Wachstum Schritt zu halten, ist wirklich bemerkenswert. Es ist faszinierend zu sehen, wie sie sich Herausforderungen wie der steigenden Anzahl von Benutzern und der ständig zunehmenden Anfragen pro Sekunde gestellt haben. Durch den Einsatz von zustandslosen Webservern, intelligenten Lastverteilungssystemen und leistungsfähigen Datenbanklösungen haben sie eine Infrastruktur geschaffen, die nicht nur hochverfügbar und skalierbar ist, sondern auch eine schnelle und zuverlässige Benutzererfahrung gewährleistet.</p>



<p>Persönlich beeindruckt mich die Herangehensweise von Instagram an die Technologie. Sie haben nicht nur auf bewährte Methoden gesetzt, sondern auch Open-Source-Technologien genutzt und kontinuierlich nach Optimierungsmöglichkeiten gesucht. Diese Kombination aus Innovation und Pragmatismus ist inspirierend und zeigt, wie man mit kreativen Lösungen große technische Herausforderungen bewältigen kann.</p>



<p>Als Entwickler finde ich es besonders spannend, von den Erfahrungen und Entscheidungen zu lernen, die Instagram gemacht hat. Ihre Architektur ist ein wertvolles Fallbeispiel dafür, wie man skalierbare und leistungsfähige Webanwendungen entwickelt. Es ermutigt mich, neue Ansätze zu erkunden und Open-Source-Tools in meine eigenen Projekte zu integrieren.</p>



<p>Insgesamt ist die Architektur von Instagram nicht nur beeindruckend, sondern auch inspirierend. Sie zeigt, wie Technologie dazu beitragen kann, innovative Lösungen für komplexe Probleme zu schaffen und gleichzeitig eine erstklassige Benutzererfahrung zu gewährleisten.</p>



<p>Alle Optimierungen lassen sich auf 4 Punkte reduzieren:</p>



<ol class="wp-block-list">
<li>C<strong>aching-Strategien</strong>: Instagram setzte auf effiziente Caching-Mechanismen, um häufig abgerufene Daten zu speichern und den Zugriff auf diese Daten zu beschleunigen. Durch die Verwendung von Caching-Technologien wie Redis oder Memcached konnte die Plattform die Antwortzeiten für Benutzeranfragen weiter optimieren und die Last auf die Datenbanken reduzieren.</li>



<li><strong>Datenpartitionierung</strong>: Um die Last auf Datenbanken zu verteilen und die Skalierbarkeit weiter zu verbessern, führte Instagram eine sorgfältige Datenpartitionierung durch. Indem Daten in logische Partitionen aufgeteilt wurden, konnten die Datenbanken effizienter verwaltet und gleichzeitig die Abfrageleistung optimiert werden.</li>



<li><strong>Monitoring und Fehlererkennung</strong>: Instagram implementierte robuste Monitoring- und Fehlererkennungssysteme, um die Leistung der Webserver und Datenbanken kontinuierlich zu überwachen. Durch die frühzeitige Erkennung von Leistungsproblemen und Fehlern konnten schnell Maßnahmen ergriffen werden, um die Stabilität und Zuverlässigkeit des Systems sicherzustellen.</li>



<li><strong>Automatisierung von Wartungsarbeiten</strong>: Um den Betrieb der Infrastruktur effizienter zu gestalten, automatisierte Instagram routinemäßige Wartungsarbeiten und administrative Aufgaben. Dies umfasste die Automatisierung von Backups, Software-Updates und Skalierungsvorgängen, um eine reibungslose und unterbrechungsfreie Verfügbarkeit der Dienste zu gewährleisten.</li>
</ol>



<p>Durch die Implementierung dieser Optimierungen konnte Instagram nicht nur die Leistung und Skalierbarkeit seiner Plattform verbessern, sondern auch sicherstellen, dass sie den steigenden Anforderungen und Erwartungen der Benutzer gerecht wird. Diese fortlaufenden Bemühungen um technische Exzellenz und Innovation trugen maßgeblich zum langfristigen Erfolg von Instagram bei und festigten seine Position als führende Social-Media-Plattform weltweit.</p>



<p></p>



<p>Quellen:<br><br>https://engineering.fb.com/2022/11/04/video-engineering/instagram-video-processing-encoding-reduction/<br>https://engineering.fb.com/2022/09/06/data-center-engineering/viewing-the-world-as-a-computer-global-capacity-management/<br>https://instagram-engineering.com/instagration-pt-2-scaling-our-infrastructure-to-multiple-data-centers-5745cbad7834<br>https://issuu.com/jhon_miller28/docs/this_is_how_instagram_is_delighting_2_billion1_1_<br></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wie-instagram-von-20-000-auf-2-000-000-nutzer-skalierte/">Wie Instagram von 20.000 auf 2.000.000 Nutzer skalierte</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Erstellung eines automatisierten Nummernschild-Erkennungssystems</title>
		<link>https://mobile.fhstp.ac.at/allgemein/erstellung-eines-automatisierten-nummernschild-erkennungssystems/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Wed, 04 Oct 2023 19:05:23 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=11306</guid>

					<description><![CDATA[<p>Die automatisierte Erkennung von Nummernschildern ist eine Schlüsseltechnologie, die in zahlreichen Anwendungsbereichen, von der Verkehrsüberwachung bis hin zur automatisierten Parkplatzverwaltung, von Bedeutung ist. In diesem Blog-Beitrag möchte ich einen Einblick geben, wie ich mithilfe von Label Studio, YOLOv5 und FastAPI ein solides System zur Erkennung von Nummernschildern entwickelt habe. Obwohl ich hier nicht zu stark <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/erstellung-eines-automatisierten-nummernschild-erkennungssystems/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/erstellung-eines-automatisierten-nummernschild-erkennungssystems/">Erstellung eines automatisierten Nummernschild-Erkennungssystems</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Die automatisierte Erkennung von Nummernschildern ist eine Schlüsseltechnologie, die in zahlreichen Anwendungsbereichen, von der Verkehrsüberwachung bis hin zur automatisierten Parkplatzverwaltung, von Bedeutung ist. In diesem Blog-Beitrag möchte ich einen Einblick geben, wie ich mithilfe von Label Studio, YOLOv5 und FastAPI ein solides System zur Erkennung von Nummernschildern entwickelt habe. Obwohl ich hier nicht zu stark in die technischen Details eintauche, liefere ich einen klaren Fahrplan, der Ihnen hilft, die einzelnen Schritte des Projekts nachzuvollziehen und die verwendeten Tools besser zu verstehen.</p>



<p>Die Reise beginnt mit der Vorbereitung und Annotierung der Datensätze in Label Studio, gefolgt vom Training des YOLOv5-Modells zur Nummernschilderkennung. Schließlich wird eine schnelle API mit FastAPI erstellt, um die Erkennungsfunktion bereitzustellen. Durch die Kombination dieser leistungsstarken Tools war es möglich, ein effizientes und funktionsreiches System zur Nummernschilderkennung zu erstellen. Die folgenden Abschnitte bieten eine detaillierte Übersicht über jeden Schritt des Prozesses, um auch Ihnen den Einstieg in die Welt der automatisierten Nummernschilderkennung zu erleichtern.</p>



<h2 class="wp-block-heading">Warum<a href="https://labelstud.io"> Labelstud.io</a> ein Traum zum Anmontieren ist</h2>



<h3 class="wp-block-heading">Flexibilität und Anpassbarkeit:</h3>



<p>Label Studio kommt mit einer breiten Palette von Annotierungswerkzeugen, die es erlauben, diverse Datentypen wie Text, Bilder und sogar Audiodaten zu annotieren. Seine flexible Natur macht es zu einer einmaligen Lösung, die sich leicht an die spezifischen Anforderungen eines Projekts anpassen lässt.</p>



<h3 class="wp-block-heading">Benutzerfreundliche Oberfläche:</h3>



<p>Die intuitive Benutzeroberfläche von Label Studio vereinfacht den Annotierungsprozess erheblich. Die leicht verständliche Oberfläche ermöglicht es auch denjenigen mit weniger technischem Wissen, effektiv zu arbeiten und qualitativ hochwertige Datenannotationen zu erstellen.</p>



<h3 class="wp-block-heading">Kollaborative Funktionen:</h3>



<p>In einem Umfeld, wo Teamarbeit essentiell ist, erlaubt Label Studio mehreren Annotatoren, zusammenzuarbeiten und ihre Arbeit in einer zentralen Umgebung zu synchronisieren. Dies fördert eine effiziente Teamarbeit und beschleunigt den Annotierungsprozess.</p>



<h3 class="wp-block-heading">Exportschnittstellen:</h3>



<p>Nach der Annotation der Daten bietet Label Studio vielfältige Exportoptionen, die eine einfache Integration mit anderen Systemen und die Weiterverwendung der annotierten Daten in verschiedenen Machine Learning Frameworks ermöglichen.</p>



<h3 class="wp-block-heading">Open-Source:</h3>



<p>Als Open-Source-Projekt ermöglicht Label Studio eine Community-getriebene Entwicklung, die es stetig verbessert und an die sich schnell entwickelnde Welt der Datenwissenschaft anpasst. Die Offenheit des Projekts fördert auch die Transparenz und Vertrauenswürdigkeit, zwei Eigenschaften, die in der heutigen datengetriebenen Welt von unschätzbarem Wert sind.</p>



<p>Durch die Kombination all dieser Vorteile stellt Label Studio eine robuste und zuverlässige Lösung für die Datenannotation und -verwaltung dar, die die Entwicklung von Machine Learning Modellen erheblich erleichtert und beschleunigt.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.24-1540x800.jpg" alt="" class="wp-image-11311" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.24-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.24-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<h2 class="wp-block-heading">Datenvorbereitung mit Label Studio</h2>



<p>Der erste und wesentliche Schritt in jedem Machine Learning Projekt ist die Vorbereitung der Daten. Ich habe Label Studio verwendet, um 1534 Fotos zu annotieren, die als Grundlage für das Training des Modells dienen. Die Fotos wurden aus einer Dashcam generiert, und ich habe einzelne Frames extrahiert, um eine ausreichende Anzahl von Bildern für das Training zu erhalten.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.51-1540x800.jpg" alt="" class="wp-image-11313" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.51-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.44.51-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<h2 class="wp-block-heading">Modelltraining mit YOLOv5</h2>



<p>Nach der Annotierung der Bilder war der nächste Schritt, ein Modell zu trainieren, das die Nummernschilder erkennen kann. Ich habe mich für YOLOv5 entschieden, eine bewährte und effiziente Lösung für Objekterkennungsaufgaben. Nach dem Training des Modells mit den annotierten Bildern war ich in der Lage, eine akzeptable Genauigkeit in der Nummernschilderkennung zu erreichen.</p>



<p></p>



<p>Um Yolo zu trainieren brauchen wir nu mehr einen Befehl:</p>



<pre class="wp-block-code"><code>./darknet detector train &lt;path_to_data_file> &lt;path_to_cfg_file> &lt;path_to_pretrained_weights> -dont_show -map</code></pre>



<h2 class="wp-block-heading">API-Erstellung mit FastAPI</h2>



<p>Mit einem trainierten Modell in der Hand war der nächste logische Schritt, eine API zu erstellen, über die andere Systeme auf die Nummernschilderkennungsfunktionalität zugreifen können. Ich habe FastAPI verwendet, um eine kleine, aber effiziente API zu erstellen, die die Anforderungen leicht handhaben kann. FastAPI ist bekannt für seine Performance und einfache Handhabung, was es zu einer ausgezeichneten Wahl für dieses Projekt macht. </p>



<p></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.45.30-1540x800.jpg" alt="" class="wp-image-11314" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.45.30-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/10/Bildschirmfoto-2023-10-04-um-20.45.30-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<h2 class="wp-block-heading">Zusammenfassung</h2>



<p>Durch die Kombination von Label Studio für die Datenvorbereitung, YOLOv5 für das Modelltraining und FastAPI für die Bereitstellung der Erkennungsfunktionalität konnte ich ein robustes und effizientes System für die automatisierte Nummernschilderkennung erstellen. Die Schritte, die in diesem Beitrag skizziert wurden, bieten einen soliden Ausgangspunkt für jeden, der daran interessiert ist, ein ähnliches Projekt zu verfolgen. Die Welt der automatisierten Systeme ist spannend, und ich freue mich darauf, in zukünftigen Projekten weiter zu erforschen, was möglich ist.<br><br>Ihr wollt es selbst probieren ? Dann teste es auf https://bandy.at/plates/</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/erstellung-eines-automatisierten-nummernschild-erkennungssystems/">Erstellung eines automatisierten Nummernschild-Erkennungssystems</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Rückblick: Unsere Reise mit Pingo und die Herausforderungen von Ionic &#038; Vue</title>
		<link>https://mobile.fhstp.ac.at/allgemein/rueckblick-unsere-reise-mit-pingo-und-die-herausforderungen-von-ionic-vue/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Wed, 30 Aug 2023 13:25:32 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=11049</guid>

					<description><![CDATA[<p>Das digitale Zeitalter hat eine Welle von Innovationen und technologischen Durchbrüchen mit sich gebracht. Eine solche Neuerung, die während der Extreme Programming Week das Licht der Welt erblickte, war unsere App &#8220;Pingo&#8221;. Diese geobasierte Plattform hat das Ziel, den Nutzern ihre Umgebung auf spielerische und informative Weise näher zu bringen. Durch die Verwendung eines Location-based <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/rueckblick-unsere-reise-mit-pingo-und-die-herausforderungen-von-ionic-vue/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/rueckblick-unsere-reise-mit-pingo-und-die-herausforderungen-von-ionic-vue/">Rückblick: Unsere Reise mit Pingo und die Herausforderungen von Ionic &amp; Vue</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="800" height="380" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/09/logo-pingo-1.png" alt="" class="wp-image-11117"/></figure>



<p>Das digitale Zeitalter hat eine Welle von Innovationen und technologischen Durchbrüchen mit sich gebracht. Eine solche Neuerung, die während der Extreme Programming Week das Licht der Welt erblickte, war unsere App &#8220;Pingo&#8221;. Diese geobasierte Plattform hat das Ziel, den Nutzern ihre Umgebung auf spielerische und informative Weise näher zu bringen. Durch die Verwendung eines Location-based Systems (LBS) eröffnet Pingo den Benutzern eine interaktive Karte, auf der sie verschiedene &#8220;Geostops&#8221; erkunden können &#8211; von verborgenen Naturjuwelen über kulturelle Highlights bis hin zu historischen Sehenswürdigkeiten.</p>



<p>Das Hauptaugenmerk von Pingo liegt darauf, die Neugier und das Entdeckungspotential in jedem von uns zu wecken. Ob man nun ein Einheimischer ist, der die versteckten Ecken seiner Heimatstadt entdecken möchte, oder ein Reisender auf der Suche nach dem nächsten Abenteuer &#8211; Pingo ist als interaktiver Reisebegleiter konzipiert. Mit seiner Fähigkeit, Benutzern detaillierte Informationen, Fotos und Bewertungen zu jedem Geostop zu bieten, geht es bei Pingo nicht nur darum, Orte zu finden, sondern auch darum, die Geschichten und Erfahrungen hinter diesen Orten zu teilen und zu erleben.</p>



<p>Allerdings war unsere Reise mit Pingo nicht ohne Hindernisse. Während der Entwicklung stellten wir fest, dass die Entscheidung, Ionic mit Vue zu kombinieren, vielleicht nicht die optimale Wahl war &#8211; insbesondere, da unser Team größtenteils Erfahrung mit Angular hatte. Diese Kombination brachte spezifische Herausforderungen mit sich, von Problemen mit der reaktiven Datenbindung in Vue bis hin zu Schwierigkeiten bei der Integration bestimmter Bibliotheken, die besser mit Angular kompatibel waren. Es war eine Lernkurve, die uns wertvolle Einblicke in die Feinheiten und Unterschiede zwischen den beiden Frameworks gab.</p>



<p>In den folgenden Abschnitten werden wir tiefer in unsere Erlebnisse mit der Entwicklung von Pingo eintauchen, die Herausforderungen beleuchten, die uns begegnet sind, und warum es wichtig ist, die richtige Technologiebasis für ein Projekt zu wählen, das so ambitioniert und innovativ ist wie Pingo.</p>



<p><strong>Einführung in NestJS und unsere Backend-Architektur</strong></p>



<p>In der heutigen technologiegetriebenen Welt sind robuste und skalierbare Backends unerlässlich für den Erfolg einer App wie Pingo. Unsere Wahl fiel auf NestJS, ein progressives Node.js-Framework, das effizientes, zuverlässiges und skalierbares Serverseitiges-Entwickeln ermöglicht. Es basiert auf Express und kombiniert Elemente von OOP (Objektorientierte Programmierung), FP (Funktionale Programmierung) und FRP (Funktionsreaktive Programmierung).</p>



<p>Während Malek, unser Senior Backend-Entwickler, den Hauptteil der NestJS-Entwicklung übernommen hat, brachte Mohamed seine Expertise mit Spring Boot ein &#8211; ein Java-basiertes Framework, das er liebt. Ich, obwohl in vielen Technologien belesen, jedoch nirgends ein wirklicher Experte, half, die verschiedenen Teile zusammenzubringen und sorgte dafür, dass das Backend nahtlos mit unserer Frontend-Architektur interagierte.</p>



<p>Lassen Sie uns nun einen Blick auf unsere API-Endpunkte werfen:</p>



<p><strong>Pingo</strong></p>



<ul class="wp-block-list">
<li><strong>GET /pingo</strong>: Ruft alle existierenden Pingo-Objekte ab.</li>



<li><strong>PUT /pingo</strong>: Aktualisiert einen Pingo.</li>



<li><strong>POST /pingo</strong>: Erstellt einen neuen Pingo.</li>



<li><strong>GET /pingo/{lat}/{lng}/{radius}</strong>: Findet Pingo in einem bestimmten Radius.</li>



<li><strong>GET /pingo/byId/{id}</strong>: Ruft einen Pingo über seine ID ab.</li>



<li><strong>GET /pingo/byUser/{id}</strong>: Listet alle Pingo eines Nutzers auf, basierend auf der Benutzer-ID.</li>



<li><strong>DELETE /pingo/{id}</strong>: Löscht einen Pingo.</li>



<li><strong>GET /pingo/getByHashId/{hashId}</strong>: Ruft Pingo über Hash-ID ab.</li>
</ul>



<p><strong>Auth</strong></p>



<p>Diese Endpunkte behandeln Authentifizierung und Autorisierung:</p>



<ul class="wp-block-list">
<li><strong>POST /auth/login</strong>: Meldet einen Benutzer an.</li>



<li><strong>POST /auth/register</strong>: Registriert einen neuen Benutzer.</li>



<li>Weitere Endpunkte für die Validierung, das Signieren und das Auffrischen von Authentifizierungsdaten.</li>
</ul>



<p><strong>Stations &amp; Hash</strong></p>



<p>Dieser Bereich handhabt die verschiedenen Stationen, die in Pingo verwendet werden, sowie die Hash-Funktionalitäten für die Erstellung und Verwaltung von Verknüpfungen zwischen den Stationen, Benutzern und Rollen.</p>



<p><strong>Users</strong></p>



<ul class="wp-block-list">
<li><strong>POST /users/save</strong>: Speichert einen neuen Benutzer.</li>



<li><strong>GET /users/search</strong>: Findet einen Benutzer basierend auf einem Suchbegriff.</li>



<li>Weitere Endpunkte für das Abrufen, Aktualisieren und Löschen von Benutzerdaten.</li>
</ul>



<p><strong>Roles</strong></p>



<p>Endpunkte, die sich auf Benutzerrollen beziehen und es ermöglichen, Rollen zu speichern, abzurufen und zu verwalten.</p>



<p><strong>QRCode</strong></p>



<ul class="wp-block-list">
<li><strong>GET /qrcode/{data}</strong>: Generiert einen QR-Code basierend auf den bereitgestellten Daten.</li>
</ul>



<p>Diese API-Endpunkte bieten eine solide Grundlage für alle Funktionen, die Pingo den Benutzern bietet. Von der Erstellung und Verwaltung von Benutzerkonten über das Abrufen von Pingo-Orten bis hin zur Generierung von QR-Codes &#8211; unser Backend mit NestJS gewährleistet, dass alles reibungslos funktioniert und die Benutzer ein nahtloses Erlebnis haben.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1410" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/09/localhost_8100_homeiPhone-6_7_8-Plus-1410x800.png" alt="" class="wp-image-11118"/></figure>



<p><strong>Fazit zu unserem Backend-Projekt</strong></p>



<p>Unsere Reise mit dem Backend für Pingo war zweifelsohne beeindruckend und lehrreich. Dank der fachlichen Expertise von Malek und Mohamed und meiner Unterstützung als verbindendes Element, haben wir große Fortschritte erzielt und ein solides und zuverlässiges Backend aufgebaut. NestJS erwies sich als eine exzellente Wahl für unsere Bedürfnisse und erlaubte uns, eine robuste und leistungsstarke Infrastruktur zu schaffen.</p>



<p>Dennoch haben wir einen entscheidenden Fehler gemacht: Wir waren nicht agil. Agilität im Softwareentwicklungsprozess ermöglicht es Teams, sich schnell an Änderungen anzupassen, iterative Verbesserungen vorzunehmen und kontinuierlich Wert zu liefern. Indem wir uns zu stark auf die Backend-Entwicklung konzentrierten und nicht den agilen Ansatz verfolgten, haben wir wertvolle Ressourcen – in Form von zwei erstklassigen Entwicklern und mir – gebunden, die möglicherweise effektiver in anderen Bereichen, insbesondere im Frontend, eingesetzt worden wären.</p>



<p>Das Backend mag zwar solide und funktionsfähig sein, aber die übermäßige Konzentration darauf hat letztlich das Gesamtergebnis des Projekts beeinträchtigt. Wären wir agiler gewesen, hätten wir uns auf das Wesentliche konzentriert, ein MVP (Minimum Viable Product) entwickelt und zusätzliche Ressourcen in das Frontend investiert. Das hätte sicherlich zu einem ausgewogeneren und letztlich erfolgreicheren Endprodukt geführt.</p>



<p>Das Fazit daraus ist klar: Es ist nicht nur wichtig, was man tut, sondern auch wie man es tut. In Zukunft werden wir sicherlich den Wert von Agilität stärker berücksichtigen und sicherstellen, dass wir unsere Ressourcen optimal nutzen, um den größtmöglichen Wert für unsere Projekte zu schaffen.</p>



<p></p>



<p><strong>Fazit zum Frontend-Projekt</strong></p>



<p>Da es im Studium vor allem um einen Lerneffekt geht, haben sich einige bewusst für unbekanntes Terrain entschieden, um Neues zu erlernen. Florian Bauer hat sich großteils um Styling, Design und später auch die Printmedien gekümmert und teilweise im Frontend mitgewirkt. Manuel Hecht, welcher bereits Erfahrung mit Python, Augmented Reality und einigen JS-Frameworks sammeln konnte, hat sich dem Frontend-Team verschrieben. Christoph Murauer, welcher bereits viel Erfahrung in der Backend Entwicklung und Dev-Ops Themen besitzt, wählte bewusst den Frontend Bereich um sich darin weiterzuentwickeln.&nbsp;</p>



<p>Innerhalb der Masterklasse <em>Mobile</em>, lag unser Fokus auf der Entwicklung einer hybriden mobilen App, welche mehrere Plattformen wie iOS, Android und das Web unterstützt. Somit fiel die Wahl auf das, im Vergleich mit Flatter, universellere Ionic Framework, mit welchem wir bereits die meisten Erfahrungen sammeln konnten.&nbsp;</p>



<p>Das Fundament für dieses UI-Framework bilden wiederum die prominenten Komponenten-basierten JS-Frameworks Angular, React und VueJS. Die Integration mit Angular war von Beginn an vorhanden, wodurch bereits Kinderkrankheiten ausgebügelt werden konnten. Dies hat auch zu einer großen Community von Ionic + Angular beigetragen, wodurch auf eine reichhaltige Hilfestellung zurückgegriffen werden konnte.<br>Die Integration von Vue hingegen ist relativ neu, wodurch noch einige Ungereimtheiten existieren.&nbsp;</p>



<p>Im Frontend-Team wollte man trotzdem diesen Schritt wagen, da man bereits positive Erfahrung mit Vue und Nuxt hatte und zuvor im Studium bereits eine Applikation in der Kombination Ionic + Angular + NestJS erstellen musste. Um die Möglichkeiten einer anderen Technologie zu entdecken, entschied man sich somit für Vue + Ionic und hatte zusammen mit dem Backend eine funktionierende erste Version geschaffen.</p>



<p>Aus Zeitmangel konnte am Ende der Woche nur eine unfertige Version des Projekts vorgelegt werden und es musste vor allem das gewählte JS-Framework als Sündenbock herhalten. Gründe waren vermutlich der unvollständigen Dokumentation, der kleinen Community und der, im Vergleich zu Angular, fehlenden nötigen Erfahrung im Team geschuldet.&nbsp;</p>



<p>Nachdem das Projekt später vor allem durch unsere Angular-Experten weiterentwickelt werden sollte, wurde das Grundgerüst durch Angular ausgetauscht, dazu später mehr. Folgende Punkte wurden von ihnen als Gründe benannt:</p>



<p>Das Frontend einer Anwendung spielt eine entscheidende Rolle in der Nutzererfahrung. Es ist das Fenster, durch welches die Benutzer mit der Anwendung interagieren und ihre Funktionen erleben. Bei der Entwicklung von Pingo entschieden wir uns für eine Kombination aus Ionic und Vue. Obwohl beide Technologien für sich genommen leistungsstark und beliebt sind, stellten wir im Laufe der Entwicklung fest, dass diese Kombination uns vor unerwartete Herausforderungen stellte.</p>



<p>Unsere bisherige Erfahrung mit Ionic in Kombination mit Angular war durchweg positiv. Angular bietet eine klare Struktur, starke Typisierung mit TypeScript und umfangreiche Tools, die den Entwicklungsprozess beschleunigen. Die Verwendung von Vue mit Ionic, einem bisher unbekannten Terrain für uns, erforderte eine Lernkurve und Anpassung.</p>



<p>Einige der Schwierigkeiten, die wir mit Vue in Verbindung mit Ionic erlebt haben, umfassen:</p>



<ul class="wp-block-list">
<li><strong></strong><strong> </strong><strong>Mangelnde Strukturierung</strong>: Vue&#8217;s flexibler Ansatz kann für manche Projekte von Vorteil sein. Aber im Vergleich zu Angular, das einen strengeren und strukturierteren Ansatz verfolgt, fühlte sich Vue manchmal zu offen und unbeständig an. Dies führte oft zu Inkonsistenzen in unserem Code.</li>



<li><strong></strong><strong> </strong><strong>Integration mit TypeScript</strong>: Obwohl Vue mit TypeScript verwendet werden kann, ist die Integration nicht so nahtlos wie bei Angular. Dies führte zu Komplikationen und erhöhtem Debugging-Aufwand.</li>



<li><strong></strong><strong> </strong><strong>Dokumentation und Community-Unterstützung</strong>: Während sowohl Vue als auch Ionic gut dokumentiert sind, ist die spezifische Dokumentation und Unterstützung für ihre Kombination nicht so reichlich vorhanden wie für die Kombination von Ionic und Angular. Das bedeutete, dass wir oft alleine gelassen wurden, um bestimmte Probleme zu lösen.</li>



<li><strong></strong><strong> </strong><strong>Wiederverwendbarkeit von Komponenten</strong>: Vue ermutigt zur Verwendung von Single-File-Komponenten, was zu Problemen bei der Wiederverwendbarkeit und beim Teilen von Logik über mehrere Komponenten hinweg führte.</li>
</ul>



<p>Diese Herausforderungen kosteten uns wertvolle Zeit und Ressourcen, die effektiver genutzt worden wären, wenn wir uns für eine Technologie entschieden hätten, mit der wir bereits vertraut waren. Es ist zwar wichtig, neue Technologien zu erforschen und zu lernen, aber für kritische Projekte, insbesondere unter Zeitdruck, ist es oft klüger, bei bewährten Technologien zu bleiben.</p>



<p>Insgesamt hat unsere Entscheidung, Vue mit Ionic zu kombinieren, trotz seiner Vorzüge den Projektfortschritt gebremst. In zukünftigen Projekten werden wir sicherlich gründlicher abwägen, ob der Einsatz neuer Technologien tatsächlich einen Mehrwert bietet oder ob sie möglicherweise mehr Probleme verursachen als sie lösen.<br><br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-10.30.52-1540x800.jpeg" alt="" class="wp-image-11120" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-10.30.52-1540x800.jpeg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-10.30.52-770x400.jpeg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p><br><strong>Unser Abenteuer mit Leaflet und OpenStreetMaps</strong></p>



<p>Bei der Gestaltung des Herzstücks unserer Pingo-App, dem interaktiven Kartenfeature, standen wir vor der Entscheidung, welche Technologie wir nutzen sollten. Hier kam Leaflet ins Spiel, eine führende Open-Source-JavaScript-Bibliothek für mobile-freundliche interaktive Karten. In Kombination mit OpenStreetMaps (OSM), einer freien Weltkarte, auf der jeder Daten beitragen oder bearbeiten kann, hatten wir die Grundlage für unsere geobasierte Plattform.</p>



<p>Dank unseres &#8220;Navigators und Kartenspezialisten&#8221; Lukas Jungwirth konnten wir unsere Plattform effizient um Leaflet herum aufbauen. Lukas&#8217; Expertise ermöglichte es uns, die vollen Möglichkeiten von Leaflet und OSM auszuschöpfen, und er integrierte beeindruckende Animationen und Funktionen, die unsere Karte lebendig werden ließen. Obwohl die Implementierung dieser ausgeklügelten Funktionen viel Zeit in Anspruch nahm, waren die Ergebnisse überzeugend und trugen wesentlich zum Charme unserer App bei.</p>



<p>Die Wahl von Leaflet und OSM statt Google Maps war eine bewusste Entscheidung. Google Maps mag zwar das populärste Kartentool sein, aber es bringt auch seine eigenen Einschränkungen und Kosten mit sich. Eine Abhängigkeit von Google Maps hätte uns möglicherweise mit Lizenzkosten, API-Beschränkungen und weniger Flexibilität bei der Anpassung belastet. OpenStreetMaps hingegen bietet Freiheit in Bezug auf Anpassung und Datenverwendung. Es ermöglicht auch eine stärkere Community-Beteiligung, was zu einer immer aktuelleren und detaillierteren Kartendatenbank führt.</p>



<p>Trotz unserer anfänglichen Herausforderungen, insbesondere während der Extreme Programming Week, konnten wir letztendlich triumphieren. Nach dem Scheitern mit unserer ersten Implementierung in Vue, entschieden wir uns für eine Neugestaltung mit Angular. Hier war es Malek, der die Initiative ergriff. Dank seiner unermüdlichen Arbeit und dem Fehlen anderer Hobbys war der initiale Anstoß von ihm rasch umgesetzt. Durch diesen Neustart mit Angular und unsere bereits gewonnenen Erfahrungen mit Leaflet und OSM gelang es uns, Pingo zu einer funktionsreichen und benutzerfreundlichen Plattform zu machen.<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-18.53.27-1540x800.jpeg" alt="" class="wp-image-11121" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-18.53.27-1540x800.jpeg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/09/WhatsApp-Image-2023-05-08-at-18.53.27-770x400.jpeg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p><br><strong>Angular vs. Vue: Ein Rückblick auf unser Pingo-Projekt</strong></p>



<p><strong>Angular:</strong></p>



<p><strong>Vorteile:</strong></p>



<ul class="wp-block-list">
<li><strong></strong><strong> </strong><strong>Strukturierte Architektur:</strong> Angular bietet eine klare und konsistente Struktur, die es einfacher macht, große Anwendungen zu skalieren und zu warten. Für unser Projekt, das eine Vielzahl von Features und interaktiven Elementen umfasste, war dies ein unschätzbarer Vorteil.</li>



<li><strong></strong><strong> </strong><strong>TypeScript-Integration:</strong> Angular wurde mit TypeScript im Hinterkopf entwickelt, was zu einer nahtlosen Integration führt. Dies war besonders nützlich, da starke Typisierung und klare Schnittstellen Fehler verhinderten und die Codequalität verbesserten.</li>



<li><strong></strong><strong> </strong><strong>Reichhaltige Dokumentation und Community-Unterstützung:</strong> Durch unsere bisherige Erfahrung mit Angular konnten wir uns auf eine umfangreiche Dokumentation und eine aktive Community verlassen, was die Problembehandlung und Implementierung neuer Funktionen erleichterte.</li>
</ul>



<p><strong>Nachteile:</strong></p>



<ul class="wp-block-list">
<li><strong></strong><strong> </strong><strong>Steilere Lernkurve:</strong> Für Neueinsteiger kann Angular anfangs überwältigend sein, was jedoch durch unsere Vorkenntnisse gemildert wurde.</li>
</ul>



<p><strong>Vue:</strong></p>



<p><strong>Vorteile:</strong></p>



<ul class="wp-block-list">
<li><strong></strong><strong> </strong><strong>Flexibilität:</strong> Vue ist dafür bekannt, flexibel und anpassbar zu sein, was uns erlaubte, verschiedene Aspekte der Anwendung nach Bedarf zu gestalten.</li>



<li><strong></strong><strong> </strong><strong>Einfacher Einstieg:</strong> Für diejenigen, die neu in der Frontend-Entwicklung sind, bietet Vue eine weniger einschüchternde Einstiegshürde als einige andere Frameworks.</li>



<li><strong></strong><strong> </strong><strong>Reaktives Datenbindungs-System:</strong> Vue&#8217;s reaktives Datenbindungssystem ist intuitiv und effizient, was die Implementierung reaktiver UI-Komponenten vereinfacht.</li>
</ul>



<p><strong>Nachteile:</strong></p>



<ul class="wp-block-list">
<li><strong></strong><strong> </strong><strong>Mangelnde Strukturierung bei größeren Projekten:</strong> Im Vergleich zu Angular fehlte es Vue an einer strengen Architektur, was bei komplexeren Projekten wie Pingo zu Problemen führen konnte.</li>



<li><strong></strong><strong> </strong><strong>Suboptimale TypeScript-Integration:</strong> Obwohl Vue mit TypeScript verwendet werden kann, fühlte sich die Integration oft gehackt an und war nicht so intuitiv wie bei Angular.</li>



<li><strong></strong><strong> </strong><strong>Weniger Standardisierung:</strong> Wegen Vue&#8217;s Flexibilität gab es weniger &#8220;Best Practices&#8221;, was manchmal zu inkonsistentem Code führte.</li>
</ul>



<p><strong>Fazit:</strong></p>



<p>Während Vue sicherlich seine Stärken hat und für viele Projekte eine ausgezeichnete Wahl sein kann, stellte sich heraus, dass für das Pingo-Projekt, das eine tiefe Integration verschiedener Technologien und Funktionen erforderte, Angular besser geeignet war. Die strukturierte Architektur, die starke TypeScript-Integration und die Unterstützung, die Angular bietet, stellten sicher, dass wir effizient arbeiten und eine skalierbare, wartbare Anwendung produzieren konnten. Es war eine lehrreiche Erfahrung, die uns half, den Wert der Auswahl des richtigen Werkzeugs für den Job zu schätzen.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="224" height="160" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/09/ezgif-2-1d0db9201b.gif" alt="" class="wp-image-11122"/></figure>



<p><strong>Persönliche Reflexion und Einschätzungen</strong></p>



<p>Die Projektwoche, wie wir sie erlebt haben, hat nicht nur den Kern der Softwareentwicklung in den Mittelpunkt gestellt, sondern auch den Umgang mit den menschlichen Aspekten der Teamarbeit.</p>



<p>Zunächst einmal war es faszinierend zu beobachten, wie jeder im Team &#8211; einschließlich mir selbst &#8211; seine eigenen Vorurteile, Vorlieben und Abneigungen in Bezug auf Technologien und Methoden mitbrachte. Was für den einen das perfekte Tool für eine Aufgabe ist, könnte für einen anderen als unpassend oder sogar als hinderlich empfunden werden. Dies wurde insbesondere in der Diskussion um den Technologie-Stack sichtbar.</p>



<p>Ich persönlich schätze das Vue Framework und sehe seine Flexibilität und Struktur als eine &#8220;spezielle&#8221; Stärke, nicht jedoch für große Projekte. Die Entscheidung, Vue mit Ionic zu kombinieren, war meiner Meinung nach ein mutiger Schritt, um Neuland zu betreten und aus der Komfortzone herauszutreten. Aber wie so oft im Leben und insbesondere in der Technologiebranche, kann das Betreten unbekannten Terrains sowohl belohnend als auch herausfordernd sein.</p>



<p>Die Reaktionen im Team auf diese Entscheidung waren gemischt. Einige begrüßten die Neuerung und fanden es wie ich selber, recht witzig, während andere eine gewisse Widerstandsfähigkeit zeigten. Ich verstehe den Wunsch, bei Bewährtem zu bleiben, besonders unter dem Druck einer Projektwoche. Aber ich bin auch der Ansicht, dass die Möglichkeit, Neues zu lernen und sich weiterzuentwickeln, es wert ist, Risiken einzugehen.</p>



<p>Trotz der Herausforderungen und gelegentlichen Spannungen im Team bin ich stolz auf das, was wir erreicht haben. Wir haben als Team gearbeitet, uns gegenseitig unterstützt und uns den Herausforderungen gestellt. Und obwohl nicht alles perfekt war, war die Endpräsentation ein Beweis für unser Engagement und unsere harte Arbeit.</p>



<p>Abschließend glaube ich, dass diese Projektwoche eine der wertvollsten Erfahrungen meiner Studienzeit war. Sie lehrte mich nicht nur technische Fähigkeiten, sondern auch die Kunst des Kompromisses, der Kommunikation und der Teamarbeit.</p>



<p><br><br><em>Mitwirkende:</em><br>Malek Morad<br>Lukas Jungwirth</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/rueckblick-unsere-reise-mit-pingo-und-die-herausforderungen-von-ionic-vue/">Rückblick: Unsere Reise mit Pingo und die Herausforderungen von Ionic &amp; Vue</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Heurig &#8211; Der Start einer Heurigen-Suchmaschine</title>
		<link>https://mobile.fhstp.ac.at/allgemein/heurig-der-start-einer-heurigen-suchmaschine/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Tue, 28 Feb 2023 11:15:03 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=10732</guid>

					<description><![CDATA[<p>Unsere Plattform ist speziell auf die Bedürfnisse von Heurigenbesuchern zugeschnitten. Wir haben eine moderne und benutzerfreundliche Suchmaschine entwickelt, die es dem Nutzer ermöglicht, mit nur wenigen Klicks den besten Heurigen in der Nähe zu finden. Unsere Plattform soll dabei helfen, die Bindung zwischen Gästen und Wirten zu stärken und Heurigenbetreibern die Plattform bieten, die sie <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/heurig-der-start-einer-heurigen-suchmaschine/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/heurig-der-start-einer-heurigen-suchmaschine/">Heurig &#8211; Der Start einer Heurigen-Suchmaschine</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Unsere Plattform ist speziell auf die Bedürfnisse von Heurigenbesuchern zugeschnitten. Wir haben eine moderne und benutzerfreundliche Suchmaschine entwickelt, die es dem Nutzer ermöglicht, mit nur wenigen Klicks den besten Heurigen in der Nähe zu finden. Unsere Plattform soll dabei helfen, die Bindung zwischen Gästen und Wirten zu stärken und Heurigenbetreibern die Plattform bieten, die sie verdienen.</p>



<p>Die Plattform ist nicht in Konkurrenz zu anderen Plattformen wie Google Maps oder TripAdvisor, sondern ist maßgeschneidert für die Zielgruppe von Heurigenbesuchern, Fans regionaler Küche und jugendlicher Entdecker. Unsere Plattform bietet die Möglichkeit, mit wenigen Klicks und Interaktionen den besten Heurigen in der Nähe zu finden und umfassende Informationen zu erhalten, um eine fundierte Entscheidung zu treffen.</p>



<p>In unseren weiteren Release-Phasen planen wir, Filtermöglichkeiten nach Speisen sowie Bewertungen einzubauen. Auf diese Weise können Nutzer noch gezielter nach den für sie relevanten Heurigen suchen und Bewertungen anderer Nutzer einsehen, um eine informierte Entscheidung zu treffen. Wir sind davon überzeugt, dass unsere Plattform einen wertvollen Beitrag leisten kann, um das Heurigen-Erlebnis in Niederösterreich, Wien und der Steiermark zu verbessern.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-1-1540x800.jpg" alt="" class="wp-image-10742" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-1-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-1-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></figure>



<p>Das Technische Gerüst:</p>



<p>Die Plattform basiert auf modernen Technologien, die ein schnelles, zuverlässiges und benutzerfreundliches Erlebnis gewährleisten sollen. Im Folgenden haben wir eine Übersicht über die wichtigsten Technologien erstellt, die wir verwenden:</p>



<p><strong>Backend-Entwicklung mit Node.js und TypeScript:</strong></p>



<p>Wir verwenden das Node.js-Framework Nest.js, um unsere Backend-Logik zu implementieren. TypeScript ist eine Erweiterung von JavaScript, die die Entwicklung von skalierbaren Anwendungen erleichtert und Elemente von OOP (Object Oriented Programming), FP (Functional Programming) und FRP (Functional Reactive Programming) kombiniert.</p>



<p><strong>Frontend-Entwicklung mit Ionic und Angular:</strong>&nbsp;Das Frontend unserer Plattform basiert auf dem Ionic-Framework, das auf Angular aufbaut. Ionic bietet eine Vielzahl von vorgefertigten UI-Komponenten, mit denen wir schnell und effizient benutzerfreundliche Schnittstellen erstellen können.</p>



<p><strong>Datenbank mit MySQL:&nbsp;</strong></p>



<p>Wir verwenden eine MySQL-Datenbank, um die Informationen zu den Heurigen und deren Standorten zu speichern. MySQL ist eine bewährte und zuverlässige Open-Source-Datenbank, die uns die nötige Skalierbarkeit bietet.</p>



<p><strong>Projektverwaltung mit GitHub:</strong>&nbsp;Wir verwenden GitHub zur Verwaltung unseres Codes und unserer Projektarbeit. Mit GitHub können wir die Zusammenarbeit in unserem Team erleichtern und sicherstellen, dass der Code immer auf dem neuesten Stand ist.</p>



<p>Design mit Ionic Framework: Wir verwenden das Ionic Framework auch für das Design unserer Plattform. Ionic bietet eine Vielzahl von vorgefertigten Designelementen, mit denen wir schnell und einfach ein ansprechendes Design umsetzen können.</p>



<p><strong>Hosting mit einem Linux-Server und Plesk:</strong>&nbsp;Unsere Plattform wird auf einem Linux-Server gehostet. Wir nutzen Plesk, um den Server zu verwalten und unsere Dienste zu konfigurieren.</p>



<p>Wir sind davon überzeugt, dass die Kombination dieser modernen Technologien uns die nötige Flexibilität und Skalierbarkeit bietet, um eine leistungsstarke und benutzerfreundliche Heurigen-Suchmaschine zu entwickeln, die auf die Bedürfnisse unserer Nutzer zugeschnitten ist.</p>



<p><br>Server und Infrastruktur:</p>



<p>In der heutigen Zeit ist die Anwendung von Virtualisierungstechnologien in der IT-Welt nicht mehr wegzudenken.&nbsp;<br>Eine kurze Erklärung:&nbsp;<em>Docker ist eine solche Virtualisierungstechnologie, die es ermöglicht, Anwendungen in Containern auszuführen und diese Container unabhängig von der darunterliegenden Infrastruktur zu skalieren und zu verwalten. Docker ist ein Open-Source-Tool, das es Entwicklern ermöglicht, Anwendungen schnell und einfach in Containern zu isolieren, zu verteilen und auszuführen.</em></p>



<p>Mit Portainer hat man die Möglichkeit, Docker-Container noch einfacher zu verwalten. Portainer ist eine webbasierte Benutzeroberfläche für die Verwaltung von Docker-Containern, die es einem ermöglicht, Container zu erstellen, zu konfigurieren und zu überwachen. Mit Portainer kann man auch die Container skalieren, Versionen verwalten und Fehlerbehebungen durchführen.</p>



<p>Neben Docker und Portainer haben wir uns auch für Plesk entschieden, um unsere Hosting-Services zu verwalten. Plesk ist eine benutzerfreundliche Plattform, die einem ermöglicht, Websites, E-Mail-Konten und andere Dienste auf einem Server zu verwalten. Es ist besonders nützlich für die Verwaltung von Hosting-Services, da es eine einfach zu bedienende Oberfläche bereitstellt und eine Vielzahl von Erweiterungen und Tools bietet, um den Dienst sicher und zuverlässig bereitzustellen.</p>



<p>Wir haben uns für Plesk entschieden, da es uns eine einfache Möglichkeit bietet, unsere Dienste zu verwalten, ohne dass wir über umfangreiche Linux-Kenntnisse verfügen müssen. (kommt leider erst im 3. Semester). Darüber hinaus bietet Plesk eine Vielzahl von Erweiterungen und Tools, die es uns ermöglichen, unsere Dienste sicher und zuverlässig bereitzustellen. Natürlich gibt es auch andere Hosting-Optionen, die ebenfalls eine gute Wahl sein können, aber wir wollen den Dienst auch anderswertig verwenden. Es ist jedoch wichtig, die Vorteile und Einschränkungen von verschiedenen Optionen zu evaluieren, um sicherzustellen, dass man die beste Wahl für die eigenen Anforderungen trifft.</p>



<p>Insgesamt bieten Docker, Portainer und Plesk eine gute Kombination von Werkzeugen, die es uns ermöglichen, unsere App, sicher, effizient und einfach zu verwalten.<br></p>



<p><br><br><br><br>Vom Server zum Service:<br></p>



<p>Anfangs haben wir uns entschieden, unsere Ionic-App und das NestJS-Backend in Docker-Containern zu hosten, um eine einfache Skalierung und Verwaltung zu gewährleisten. Ebenso ist der Umzug auf einen anderen Server wesentlich einfacher. Um dies zu erreichen, haben wir uns für Portainer entschieden (Auch weil der Rat vom Lehrbeauftragten kam), eine webbasierte Benutzeroberfläche für die Verwaltung von Docker-Containern.</p>



<p>Zuerst haben wir Docker-Images für unsere Ionic-App und das NestJS-Backend erstellt. Hierfür haben wir Dockerfiles erstellt, in denen wir alle notwendigen Abhängigkeiten installiert und unsere Anwendungen konfiguriert haben.</p>



<p>Anschließend haben wir die Docker-Container mit den erstellten Images in Portainer gestartet. Hierfür haben wir eine neue App in Portainer erstellt und das entsprechende Image angegeben. Um die Netzwerkverbindung zwischen den Containern herzustellen, haben wir ein eigenes Netzwerk in Portainer erstellt und die Container diesem Netzwerk zugewiesen.</p>



<p>Nachdem wir sichergestellt hatten, dass die Anwendungen in den Containern liefen und auf Anfragen reagierten, haben wir sie veröffentlicht. Hierfür haben wir in Portainer eine Port-Weiterleitung erstellt, die Anfragen an den Container weiterleitete.</p>



<p>Dank Docker und Portainer haben wir unsere Anwendungen einfach skalieren und verwalten können. Wir konnten verschiedene Versionen unserer Anwendungen in verschiedenen Containern ausführen und problemlos zwischen ihnen wechseln. Die webbasierte Benutzeroberfläche von Portainer hat uns auch ermöglicht, Container zu überwachen und zu verwalten, was die Verwaltung unserer Anwendungen erheblich erleichtert hat.</p>



<p><strong>Das Backend mit NestJs:</strong></p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.43.png"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.43-1540x800.png" alt="" class="wp-image-10734" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.43-1540x800.png 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.43-770x400.png 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>



<p>Wie bereits erwähnt haben wir uns dazu entschieden das Backend mit NestJs in Kombination mit Typescript umzusetzen.&nbsp;NestJs ist ein komplettes, open-source Development-Kit zum Entwickeln von serverseitigen Applikationen. Für das Kommunizieren mit der Datenbank wurde TypeORM herangezogen und in der Applikation implementiert. TypeORM ist ein Tool für ORM (Object–relational mapping), mit dem objektrelationale Abbildungen zur Umwandlung von Daten zwischen objekt-orientierten Programmiersprachen und einer relationalen Datenbank verwirklicht werden können. Aufgrund der positiven Erfahrung in Lehrveranstaltungen und der Ähnlichkeit zu bekannten ORMs wie Hibernate haben wir uns für TypeORM entschieden.<strong></strong></p>



<p>Da NestJs eine CLI (Command Line Interface) anbietet, wurde diese als ersten Schritt mit dem Node Package Manager (NPM) installiert und anschließend ein neues Projekt generiert.<br></p>



<p>Dazu haben wir der offiziellen Dokumentation folgende Befehle entnommen:</p>



<figure class="wp-block-image"><img decoding="async" src="blob:https://akirchknopf-21110.php.fhstp.cc/ab4fcab4-c349-44e9-8ae8-c6345a9dc5c2" alt="Shape

Description automatically generated with low confidence"/></figure>



<p>Folgende, weitere Dependencies (Pakete) sind installiert worden:</p>



<ul class="wp-block-list">
<li>Cross-env (für das Plattformübergreifende Verwenden von Umgebungsvariablen)</li>



<li>Bcrypt (zum hashen/vergleichen/speichern von Passwörtern)</li>



<li>Mysql (für die Mysql-Verbindung)</li>
</ul>



<p>Nach dem Installieren der notwendigen Dependencies und der Erstellung der grundlegenden Struktur sieht das Projekt folgendermaßen aus:</p>



<figure class="wp-block-image"><img decoding="async" src="blob:https://akirchknopf-21110.php.fhstp.cc/dac5e480-144c-46c1-a6cb-a45c9a8b56b3" alt="Text

Description automatically generated"/></figure>



<p>Die sogenannten Endpoints spiegeln die clientseitige Erreichbarkeit der serverseitigen, nach außen freigegebenen Funktionalitäten&nbsp;wider. Diese API (= Schnittstelle) bietet zum gegebenen Zeitpunkt die Möglichkeit Heurigen anhand einer Query (= Suchwort/Suchwörter), einer eindeutigen ID oder einer GPS-Koordinaten zu suchen. Abgesehen davon besteht noch die Möglichkeit Heurigen zu erstellen und anhand der ID auch wieder zu löschen.</p>



<p>Die clientseitigen DTOs (Data Transfer Object) und serverseitigen Entities stellen die objektrelationale Abbildung zur Umwandlung von Daten dar, während mit den Repositories auf die Datenbank zugegriffen werden kann. Dabei bilden die Services die Businesslogik der Applikation, in denen beispielsweise auch die Umwandlungen stattfinden. Für das Auslagern der Umwandlungslogik wurden jeweils zu den Entities und DTOs sogenannte „Mapper“ erstellt, die unter dem Ordner „utils“ zu finden sind.</p>



<p>Für das Differenzieren zwischen der Development- und Production Umgebung sind folgende Dateien angelegt worden:</p>



<ol class="wp-block-list" type="1">
<li>dev.env</li>



<li>prod.env</li>
</ol>



<p><img loading="lazy" decoding="async" width="308" height="109" src="blob:https://akirchknopf-21110.php.fhstp.cc/2894b39e-c9cd-4452-b000-c338ba31cc7f"><br>Grundsätzlich sind in diesen .env Dateien zu diesem Zeitpunkt folgende Variablen notiert:</p>



<p>Je nachdem, welche Umgebung gestartet oder gebaut wird (dev / prod), werden die dev.env oder prod.env Variablen geladen. Die Verwendung von den jeweiligen Variablen und die Konfiguration der Datenbank bzw. TypeORM findet folgendermaßen statt:</p>



<figure class="wp-block-image"><img decoding="async" src="blob:https://akirchknopf-21110.php.fhstp.cc/ea70c1f7-7ddc-4932-9b0f-2976d80b4393" alt="Text

Description automatically generated"/></figure>



<p>Plesk:<br><br>Als wir uns dazu entschieden haben, unsere Heurigen-Suchmaschine zu entwickeln, war schnell klar, dass wir auch eine geeignete Hosting-Lösung benötigen. Nach einigen Recherchen haben wir uns schließlich dazu entschieden, einen vServer zu mieten und darauf Plesk zu installieren.</p>



<p>Plesk ist eine leistungsstarke Server-Management-Plattform, die es uns ermöglicht, unsere Webanwendungen, Datenbanken und E-Mail-Konten einfach und effizient zu verwalten. Hierbei bietet Plesk eine breite Palette an Funktionen, wie beispielsweise die automatische Einrichtung von SSL-Zertifikaten, Backups und Firewall-Konfiguration.</p>



<p>Um Plesk auf unserem vServer zu installieren, haben wir zunächst die entsprechende Lizenz erworben und die Installation auf unserem Server durchgeführt. Dabei haben wir uns für die Plesk Webhost Edition entschieden, da sie alle Funktionen bietet, die wir benötigen, um unsere Webanwendungen zu hosten und zu verwalten.</p>



<p></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
version: &#039;3&#039;

services:
  nestjs-backend:
    image: your-nestjs-backend-image
    ports:
      - &quot;3000:3000&quot;
    environment:
      - DB_HOST=mysql
      - DB_USER=your-db-user
      - DB_PASSWORD=your-db-password
      - DB_NAME=your-db-name
    depends_on:
      - mysql
    networks:
      - backend-network

  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=your-mysql-root-password
      - MYSQL_USER=your-db-user
      - MYSQL_PASSWORD=your-db-password
      - MYSQL_DATABASE=your-db-name
    volumes:
      - your-mysql-data-directory:/var/lib/mysql
    networks:
      - backend-network

networks:
  backend-network:


volumes:
  your-mysql-data-directory:

</pre></div>


<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>



<p></p>



<p>docker run -d -p&nbsp;3000:3000&nbsp;&#8211;name&nbsp;my-nest-app&nbsp;my-nest-app-image</p>



<p>Nach der Installation konnten wir uns direkt über den Browser in das Plesk Control Panel einloggen. Dort haben wir dann zunächst unsere Domain registriert und die entsprechenden DNS-Einträge vorgenommen, damit unsere Heurigen-Suchmaschine über die Domain erreichbar ist.</p>



<p>Anschließend haben wir dann die benötigten Webanwendungen, Datenbanken und E-Mail-Konten eingerichtet. Hierbei war die Benutzeroberfläche von Plesk sehr intuitiv und einfach zu bedienen, sodass wir uns schnell zurechtgefunden haben. ( ist auch das mindeste, wenn wir monatlich für die Lizenz zahlen)&nbsp;</p>



<p>Darüber hinaus bietet Plesk auch eine Integration von Docker, was es uns ermöglicht, unsere Webanwendungen in Docker-Containern zu betreiben. Dies bietet den Vorteil, dass wir unsere Anwendungen unabhängig von der zugrunde liegenden Serverkonfiguration betreiben können und somit auch die Flexibilität haben, unsere Anwendungen auf anderen Servern zu betreiben, falls dies notwendig sein sollte.</p>



<p>Insgesamt sind wir mit unserer Entscheidung, Plesk auf unserem angemieteten vServer zu nutzen, sehr zufrieden und gleichzeitig überrascht, wie strukturiert man mit so einer Infrastruktur arbeiten kann. Die Plattform bietet eine leistungsstarke und einfach zu bedienende Lösung für das Hosting unserer Webanwendungen, Datenbanken und E-Mail-Konten. Darüber hinaus bietet die Integration von Docker auch die Möglichkeit, unsere Anwendungen flexibel und unabhängig von der zugrunde liegenden Serverkonfiguration zu betreiben.</p>



<p>Github und automatische Builds :<br><br>Da auch einige nicht versierte Personen mitlesen, gehe ich wir mal etwas auf Github ein.<br>GitHub ist eine beliebte Plattform für die Versionsverwaltung von Code und ermöglicht es Entwicklern, an Projekten zusammenzuarbeiten und Änderungen an Code zu verfolgen. Plesk bietet die Möglichkeit, Git-Repositories in das Hosting-System zu integrieren und Webhooks zu verwenden, um automatische Bereitstellungen auszulösen. Wird eine Änderung vorgenommen, so ruft Github eine URL auf, die ein Skript triggert. Dieses holt sich die Änderung und erstellt ein neues Build der Applikation.</p>



<p>Um eine automatische Bereitstellung zu konfigurieren, sind wir wie folgt vorgegangen:</p>



<ol class="wp-block-list" type="1">
<li>Ein Git-Repository auf GitHub erstellen oder ein bestehendes Repository verwenden.</li>



<li>Eine neue Domain in Plesk hinzufügen und das zugehörige Verzeichnis erstellen.</li>



<li>Das Git-Repository in Plesk einrichten und Webhooks hinzufügen.</li>



<li>Eine Pipeline-Konfiguration in Plesk erstellen, um das Build-Skript auszuführen.</li>



<li>Eine Post-Receive-Hook-URL in GitHub einrichten, um das Webhook auszulösen</li>
</ol>



<p>Schritt 1: Git-Repository auf GitHub erstellen</p>



<p>Ein neues Git-Repository kann auf der GitHub-Website erstellt werden, indem auf den &#8220;New Repository&#8221;-Button geklickt wird. Man gibt dem Repository einen Namen und wählt, ob es öffentlich oder privat sein soll.</p>



<p>Schritt 2: Domain hinzufügen und Verzeichnis erstellen</p>



<p>In Plesk muss zunächst eine neue Domain hinzugefügt werden. Man klickt dazu auf &#8220;Websites &amp; Domains&#8221; und dann auf &#8220;Add Domain&#8221;. Dann wählt man nur mehr einen Domainnamen ein und wählt das Verzeichnis aus, in dem Ihre Anwendung gespeichert wird.</p>



<p>Schritt 3: Git-Repository in Plesk einrichten und Webhooks hinzufügen</p>



<p>In Plesk kann das Git-Repository über das Menü &#8220;Git&#8221; eingerichtet werden. Dazu fügt man die Git-URL und Authentifizierungsdaten hinzu, um auf das Repository zuzugreifen. Anschließend können Webhooks hinzugefügt werden, indem man auf das &#8220;+&#8221;-Symbol neben dem Repository klicken und die Webhook-URL auswählen.</p>



<p>Schritt 4: Pipeline-Konfiguration in Plesk erstellen</p>



<p>Eine Pipeline-Konfiguration muss in Plesk erstellt werden, um das Build-Skript auszuführen. Dies kann über das Menü &#8220;Websites &amp; Domains&#8221; und dann &#8220;Hosting Settings&#8221; erfolgen. Danach nur mehr auf “Run a script&#8221; drücken und das Skript einfügen, das ausgeführt werden soll.</p>



<p>Schritt 5: Post-Receive-Hook-URL in GitHub einrichten</p>



<p>Eine Post-Receive-Hook-URL muss in GitHub eingerichtet werden, um das Webhook auszulösen. Dazu klicken wir auf die Repository-Einstellungen und dann auf &#8220;Webhooks&#8221;. Fügen die URL hinzu, die in Plesk erstellt wurde, und wählt aus, welche Ereignisse das Webhook auslösen sollen.</p>



<p>Wenn alle Schritte abgeschlossen sind, wird die Anwendung automatisch bereitgestellt, wenn Änderungen an Ihrem Git-Repository vorgenommen werden.</p>



<p>Taskmanagment Github Projects:<br><br>Github Projects ist eine Funktion von Github, die es Nutzern ermöglicht, ihre Projekte zu organisieren und zu verwalten. Es ist ein flexibles und leicht zu bedienendes Tool, das bei der Zusammenarbeit an Projekten von Vorteil ist. Mit Github Projects kann man die Aufgaben und Backlogs visuell darstellen, was einem einen Überblick über den Fortschritt des Projekts gibt.</p>



<p>Die Einrichtung von Github Projects ist einfach. Man erstellt ein neues Projekt, indem man auf die Schaltfläche &#8220;Neues Projekt&#8221; auf der Github-Projektseite klicken. Wir können dann die Spalten definieren, die Sie für Ihr Projekt benötigen, z.B. &#8220;To Do&#8221;, &#8220;In Arbeit&#8221; und &#8220;Fertig&#8221;.</p>



<p>Ein Vorteil von Github Projects ist, dass es in Github integriert ist. Das bedeutet, dass man die Projekt-Management-Aufgaben direkt auf Github erledigen kann. Man muss nicht auf eine andere Plattform wechseln, um Ihre Projektdaten zu verwalten.</p>



<p>Ein weiterer Vorteil ist die Möglichkeit der Zusammenarbeit. Mit Github Projects können mehrere Personen an einem Projekt arbeiten und den Fortschritt des Projekts gemeinsam verfolgen. Es gibt eine Vielzahl von Funktionen, die es den Teammitgliedern ermöglichen, Aufgaben zuzuweisen, Kommentare zu hinterlassen und den Status von Aufgaben zu ändern.</p>



<p>Zusammenfassend bietet Github Projects eine großartige Option für Teams, die an einem gemeinsamen Projekt arbeiten und ihre Arbeit effektiv verwalten und koordinieren müssen.</p>



<p>Versionsverwaltung GitHUb<br><br>GitHub ist eine der bekanntesten Plattformen für Softwareentwickler und bietet eine Vielzahl von Tools, um die Zusammenarbeit und den Austausch von Code zu erleichtern. Es ist auch ein beliebtes Tool zur Verwaltung von Softwareprojekten und Backlogs.</p>



<p>Bei unserem Projekt haben wir uns dafür entschieden, GitHub Projects zu nutzen, um unsere Backlogs zu organisieren und das Projektmanagement zu vereinfachen. GitHub Projects ist ein Kanban-Board-Tool, das es Entwicklerteams ermöglicht, Aufgaben und Projektmanagement-Aufgaben zu erstellen, zu verwalten und zu verfolgen. Es ist direkt in GitHub integriert, so dass man es einfach nutzen kann, ohne eine separate Plattform nutzen zu müssen.</p>



<p>Um GitHub Projects nutzen zu können, müssen wir zunächst sicherstellen, dass unser Repository auf GitHub gehostet wird. Sobald das Repository vorhanden ist, können wir ein neues Projekt erstellen und die Karten in die Spalten &#8220;To Do&#8221;, &#8220;In Progress&#8221; und &#8220;Done&#8221; aufteilen. Anschließend können wir Karten erstellen und Aufgaben zuweisen. Diese Karten können dann per Drag-and-Drop verschoben werden, um den Fortschritt der Aufgaben zu verfolgen.</p>



<p>Die Vorteile von GitHub Projects liegen auf der Hand: Es ist einfach zu bedienen, es ist direkt in GitHub integriert, so dass man nicht auf eine separate Plattform zugreifen muss, und es ist für Teams jeder Größe geeignet. Auch die Möglichkeit, Issues direkt mit Karten in GitHub Projects zu verknüpfen, ist eine großartige Funktion, die den Workflow beschleunigt.</p>



<p>Insgesamt hat uns GitHub Projects geholfen, unser Projektmanagement zu verbessern und unsere Backlogs zu organisieren. Wir empfehlen es jedem Entwicklerteam, das eine einfache und benutzerfreundliche Lösung für die Organisation von Aufgaben sucht.</p>



<p><strong>Frontend-Entwicklung</strong></p>



<figure class="wp-block-image size-large"><a href="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-scaled.jpg"><img loading="lazy" decoding="async" width="1540" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-1540x800.jpg" alt="" class="wp-image-10733" srcset="https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-1540x800.jpg 1540w, https://mobile.fhstp.ac.at/wp-content/uploads/2023/02/Bildschirm­foto-2023-02-28-um-12.07.29-770x400.jpg 770w" sizes="auto, (max-width: 1540px) 100vw, 1540px" /></a></figure>



<p>Die Wahl für unser Toolkit in Hinblick auf die Frontend Entwicklung fiel nach einiger Überlegung auf das Ionic Framework in Kombination mit dem JavaScript Framework Angular. Der zentrale Vorteil, welcher sich für uns dadurch ergeben hat ist, dass wir später die Möglichkeit haben unsere Plattform auch als Mobile Applikationen anzubieten. Auch wenn wir unseren Service zunächst nur als Webplattform ausführen werden, kann mit diesem Setup leicht alle nativen Plattformen bedient werden, ohne später die Struktur oder Codebase ändern zu müssen. Zudem verfügt das Framework über einige vorgefertigte Komponenten, welche uns die Arbeit erleichtern.&nbsp;</p>



<p>Die Wahl des JavaScript Frameworks ergab sich aus mehreren Gründen. Zunächst war der Vorteil, dass wir schon in der Lehrveranstaltung mit Angular gearbeitet haben und so bereits gewisse Vorkenntnisse vorhanden waren. Zudem hat uns die generelle Struktur um einiges mehr überzeugt, als es bei Vue der Fall war und nachdem keiner aus unserem Team Erfahrungen mit React hatte und die Lernkurve vergleichsweise steil zu sein scheint, schied auch diese Option aus.&nbsp;</p>



<p>Bevor wir mit der eigentlichen Entwicklung des Frontends beginnen konnten, war uns eine detaillierte Planung wichtig. Vor allem, da wir das Projekt über mehrere Semester angelegt haben, wurde zunächst einige Zeit in die Gestaltung des User Interfaces gesteckt. Damit wollten wir vermeiden den Aufbau der Seite im Laufe der Entwicklung laufend überdenken zu müssen. Den Startpunkt legte hierbei die Gestaltung von Wireframes, um einmal grob festzulegen, welche Inhalte wir auf unserer Seite haben wollen. Dabei haben wir uns auch mit den Grundfunktionen unserer Plattform beschäftigt, welche für spätere Nutzer entscheidend sein werden. Nachdem wir uns auf die wichtigsten Elemente und eine grobe Positionierung auf der Seite geeinigt hatten, folgte die Umsetzung von High Fidelity Mockups mit Adobe XD. Im Zuge dessen haben wir uns auch mit den grundlegenden Design Aspekten, sowie dem Corporate Design unserer späteren Seite beschäftigt. Dabei wurden wichtige Elemente wie Farben und Schriftarten definiert.&nbsp;</p>



<p><strong>Die Entwicklung unseres Projekts: Ein vertiefender Einblick ins zweite Semester</strong></p>



<p>Als wir uns dem zweiten Semester näherten, wussten wir, dass sich der Fokus von der Backend-Entwicklung, die im ersten Semester unsere Hauptaufgabe war, zum Frontend verschieben würde. Was wir jedoch nicht erwartet hatten, war die Intensität und Komplexität der Herausforderungen, denen wir uns stellen würden.</p>



<p><strong>Die Synergie unseres Teams</strong></p>



<p>Unser Team ist eine Mischung aus talentierten Individuen mit einer gemeinsamen Vision. Diese Vision trieb uns an, nicht nur als Einzelpersonen, sondern als eine Einheit zu funktionieren. Während ich persönlich tief im Frontend versunken war, gab es Momente, in denen das Backend Aufmerksamkeit erforderte. Diese Balance zwischen den beiden Komponenten war nur durch die unermüdliche Zusammenarbeit und die Synergie unseres Teams möglich. Unsere täglichen Meetings und ständige Kommunikation halfen uns, auf dem richtigen Weg zu bleiben.</p>



<p><strong>Design- und UI-Herausforderungen</strong></p>



<p>Eines der größten Rätsel dieses Semesters war das User Interface (UI). Wir wollten nicht nur ein funktionelles, sondern auch ein intuitives und ästhetisch ansprechendes Design. Dies führte zu vielen Diskussionen, Prototypen und Tests. Unsere Entscheidung, das Error-Handling im Frontend zu erweitern, war entscheidend, um die User Experience zu verbessern. Diese Änderungen gewährleisteten, dass Benutzer nicht durch unerwartete Fehler oder Probleme frustriert wurden.</p>



<p><strong>Die Evolution der Leaflet Map</strong></p>



<p>Unsere Arbeit mit der Leaflet Map war besonders aufschlussreich. Die Entscheidung, sie in eine eigene Komponente auszulagern, war nicht trivial. Sie erforderte viele Stunden der Planung und Umsetzung, um sicherzustellen, dass sie nahtlos in unsere Anwendung integriert wurde. Die Herausforderung, welche Daten zu laden und wie sie dem Benutzer präsentiert werden sollten, verlangte einen feinen Balanceakt zwischen Performance und Benutzerfreundlichkeit.</p>



<p><strong>Technische Tiefe: Unsere Autovervollständigungs- und Suchmaschinenentwicklung</strong></p>



<p>In der modernen digitalen Welt ist die Nutzererfahrung eines der entscheidenden Merkmale einer erfolgreichen Anwendung. Ein wesentlicher Bestandteil dieser Erfahrung, besonders in datengetriebenen Anwendungen, ist die Fähigkeit, effizient und intuitiv nach Informationen zu suchen. Um dieses Erlebnis für unsere Nutzer zu optimieren, haben wir eine innovative Autovervollständigungs- und Suchfunktion entwickelt.</p>



<p><strong>Das Herzstück: Der Suchbaum</strong></p>



<p>Im Kern unserer Autovervollständigungslogik steht ein in PHP implementierter Suchbaum. Dieser Baum, auch bekannt als Trie (abgeleitet von Re<strong>trie</strong>val), ist eine baumartige Datenstruktur, die speziell für das dynamische Speichern und Abrufen von Zeichenketten verwendet wird. Jeden Tag aktualisiert sich unser Suchbaum automatisch durch einen Auszug aus unserer Datenbank. Dies garantiert, dass die Daten, die für die Autovervollständigung verwendet werden, stets aktuell und relevant sind.</p>



<p><strong>Gliederung der Daten: Heurigen, Straßennamen und mehr</strong></p>



<p>Ein wesentliches Merkmal unserer Implementierung ist die differenzierte Behandlung verschiedener Datensätze. Heurigen, Straßennamen und andere relevante Datensätze werden separat gespeichert und verarbeitet. Diese Segmentierung ermöglicht es uns, trotz der Kompaktheit des Suchbaums, eine klare Verbindung zwischen den zurückgegebenen Vorschlägen und ihren entsprechenden Kategorien zu behalten. So können wir beispielsweise sicherstellen, dass ein bestimmter Straßenname korrekt mit seiner zugehörigen Kategorie verknüpft ist und nicht versehentlich als Heuriger interpretiert wird.</p>



<p>Durch diese detaillierte Analyse und Trennung der Daten konnten wir auch interessante Einsichten gewinnen, wie zum Beispiel die Tatsache, dass es in unserer Datenbank 2072 einzigartige Wörter in Straßennamen gibt. Solche Informationen können nicht nur für interne Analysen wertvoll sein, sondern auch dazu beitragen, die Datenbank effizienter zu gestalten und den Nutzern ein noch schnelleres Sucherlebnis zu bieten.</p>



<p>Die Entwicklung dieser Autovervollständigungs- und Suchfunktion war kein einfacher Prozess, aber sie hat unsere Anwendung zweifellos auf die nächste Stufe gehoben. Durch unsere technisch fundierte Herangehensweise und die kontinuierliche Optimierung können wir unseren Nutzern ein reibungsloses und intuitives Sucherlebnis bieten, das ihre Interaktion mit unserer Plattform weiter verbessert.</p>



<p><strong>Unsere eigenen Komponenten</strong></p>



<p>Das Ionic Framework bietet viele nützliche Tools, aber wir erkannten schnell, dass wir spezifische Anforderungen hatten, die maßgeschneiderte Lösungen erforderten. Das Ergebnis war unser eigenes Split-Layout, das speziell entwickelt wurde, um den spezifischen Anforderungen unserer Anwendung gerecht zu werden.</p>



<p><strong>Blick nach vorne</strong></p>



<p>Während wir zurückblicken und unsere Erfolge feiern, sind wir uns auch bewusst, dass die Reise noch lange nicht zu Ende ist. Mit jedem neuen Semester kommen neue Herausforderungen und Möglichkeiten. Aber mit der Entschlossenheit und dem Engagement unseres Teams sind wir zuversichtlich, dass wir auch zukünftige Hürden überwinden und weiterhin Produkte von höchster Qualität liefern werden.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/heurig-der-start-einer-heurigen-suchmaschine/">Heurig &#8211; Der Start einer Heurigen-Suchmaschine</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sota: Wie PHP zur Verwendung für Aufgaben im Bereich „Maschinellen Lernen“ genutz werden kann</title>
		<link>https://mobile.fhstp.ac.at/allgemein/sota-wie-php-zur-verwendung-fuer-aufgaben-im-bereich-maschinellen-lernen-genutz-werden-kann/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Tue, 28 Feb 2023 11:02:44 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=10729</guid>

					<description><![CDATA[<p>p:paragraph &#8211;&#62; Zusammenfassung—&#160;Zu Beginn mag die Kombination aus PHP und maschinellem Lernen ungewöhnlich erscheinen. Jedoch liegt dies nicht an der Sprache selbst, sondern vielmehr an der begrenzten Verfügbarkeit von Bibliotheken, die alle wichtigen Features für das Training von neuronalen Netzen in PHP bereitstellen. Obwohl die Sprache selbst keine größeren Schwächen aufweist, fehlt es an einem <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/sota-wie-php-zur-verwendung-fuer-aufgaben-im-bereich-maschinellen-lernen-genutz-werden-kann/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/sota-wie-php-zur-verwendung-fuer-aufgaben-im-bereich-maschinellen-lernen-genutz-werden-kann/">Sota: Wie PHP zur Verwendung für Aufgaben im Bereich „Maschinellen Lernen“ genutz werden kann</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[p:paragraph &#8211;&gt;

<em>Zusammenfassung</em>—&nbsp;Zu Beginn mag die Kombination aus PHP und maschinellem Lernen ungewöhnlich erscheinen. Jedoch liegt dies nicht an der Sprache selbst, sondern vielmehr an der begrenzten Verfügbarkeit von Bibliotheken, die alle wichtigen Features für das Training von neuronalen Netzen in PHP bereitstellen. Obwohl die Sprache selbst keine größeren Schwächen aufweist, fehlt es an einem aktiveren Ökosystem, um den Funktionsumfang von Machine-Learning-bezogenen Bibliotheken weiterzuentwickeln. Die Geschwindigkeit stellt dabei kein Problem dar, da Rubix ML eine sehr attraktive Erweiterung bietet, die einen einfachen Einstieg ermöglicht und derzeit die umfangreichste Bibliothek für maschinelles Lernen in PHP ist. Rubix ML bietet Tools für den gesamten Lebenszyklus des maschinellen Lernens, von der Extraktion, Transformation und dem Laden von Daten, über das Training und die Kreuzvalidierung bis hin zur Produktion. Es stellt sich somit nicht die Frage, ob man mit PHP maschinelles Lernen betreiben kann, sondern vielmehr, warum die Szene in diesem Bereich so unterrepräsentiert ist. Zusammenfassend lässt sich sagen, dass PHP möglicherweise nicht die beste Wahl für maschinelles Lernen ist, aber manchmal ist man bei der Wahl des Technologie-Stacks eingeschränkt und es ist daher gut, Optionen wie diese zu haben

<!-- /wp:post-content -->

<!-- wp:paragraph -->

Keywords—PHP, Maschinelles Lernen, Künstliche Intelligenz

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I.&nbsp;&nbsp;&nbsp;&nbsp;<img loading="lazy" decoding="async" width="250" height="58" src="blob:https://akirchknopf-21110.php.fhstp.cc/1e762cfe-a1f0-4d96-8c02-50c727c4ffe7" alt="Textfeld: Abbildung 1:  Welche Programmiersprachen werden täglich von Data Science Nutzern genutzt. Daten aus der Kaggle Machine Learning and Data Science Survey 2018. Insgesamt beantworteten 18.827 Befragten die Frage. [2]">
Einleitung</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->

m Bereich des Maschinellen Lernens werden oft zahlreiche &#8220;Buzzwords&#8221; verwendet, von &#8220;Künstliche Intelligenz&#8221; bis &#8220;Big Data&#8221;. Allerdings wird PHP bei vielen Anwendern kaum mit Maschinellen Lernen in Verbindung gebracht. Ein Grund dafür ist in Abbildung 2 zu erkennen, in der nur 6% der befragten Personen aus dem Data Science Gebiet angeben, PHP regelmäßig zu nutzen, wodurch die Expertise in dieser Programmiersprache unterrepräsentiert ist [1] [2]. Im Vergleich zu PHP hat Python, die verbreitetste Sprache im ML-Gebiet, keine natürlichen Vorteile gegenüber PHP, sondern ist aufgrund einer größeren Community zum aktuellen Platzhirsch geworden.

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>Obwohl es mittlerweile Möglichkeiten gibt, auf verfügbare APIs zurückzugreifen und dadurch einen Kompromiss zu schaffen und nicht unterstützte Sprachen zu bedienen, liegt der Fokus in diesem Bericht auf der Performance von Bibliotheken für PHP.</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;II.&nbsp;&nbsp;&nbsp;Vorteile von PHP</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->

PHP ist mit Abstand die am häufigsten verwendete serverseitige Programmiersprache [3]. Viele Programmiersprachen bieten aufgrund ihrer Verwendung und bestehenden Ökosysteme einige Vorteile, die sie für bestimmte Anwendungen besonders attraktiv machen. In diesem Fall bietet auch PHP einige Funktionen, die die Entwicklung von Modellen und Pipelines erleichtern oder den Einstieg in diesen Bereich besonders einfach und zugänglich machen. Um einen Überblick darüber zu geben, gehen wir im Folgenden genauer auf diese Besonderheiten ein.

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>&nbsp;</h2>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2>&nbsp;</h2>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2>A.&nbsp;&nbsp;&nbsp;Eine leicht zu erlernende Sprache</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

PHP ist im Vergleich zu anderen Programmiersprachen eine vergleichsweise leicht zu erlernende und unkomplizierte Sprache. Selbst für Einsteiger in der Programmierung ist der Einstieg in PHP problemlos möglich.

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>B.&nbsp;&nbsp;&nbsp;Syntax</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Ein häufiges Problem, mit dem Entwickler konfrontiert sind, ist das Verständnis der Syntax, insbesondere für Anfänger. PHP verfügt über eine leicht verständliche Syntax, die vielen Entwicklern das Leben erleichtert. Aufgrund seiner C-ähnlichen Syntax ist es auch einfach, von anderen Programmiersprachen auf PHP umzusteigen.&nbsp;

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>C.&nbsp;&nbsp;&nbsp;Kosten</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

PHP ist eine Open-Source-Webentwicklungssprache und für jeden Benutzer völlig kostenlos. Alle Bestandteile können frei veröffentlicht und genutzt werden. Die Zugänglichkeit von PHP macht es zu einer der beliebtesten Sprachen für die Webentwicklung.

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>D.&nbsp;&nbsp;Benutzerfreundlichkeit</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Benutzerfreundlichkeit ist ein wichtiger Faktor bei der Wahl einer Programmiersprache. Viele Lernende zögern, eine Sprache auszuprobieren, wenn sie nicht benutzerfreundlich ist. Glücklicherweise ist PHP eine der benutzerfreundlichsten Sprachen in der Branche. Wenn Sie eine dynamische und benutzerfreundliche Webanwendung erstellen möchten, entscheiden sich die meisten Entwickler für PHP, da es viel flexibler als C, C++ und andere Sprachen ist [5]

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>E.&nbsp;&nbsp;&nbsp;Datenbank-Unterstützung</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

PHP unterstützt fast alle gängigen Datenbanken, was es unglaublich effizient in der Nutzung macht. Von MySQL und SQLite bis hin zu ODBC und mehr bietet PHP eine große Auswahl an Datenbankoptionen.

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>F.&nbsp;&nbsp;&nbsp;Geschwindigkeit&nbsp;</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Durch die Nutzung von PHP-eigenem Speicherplatz kann eine geringere Arbeitsbelastung der Server und kürzere Ladezeiten erreicht werden, was zu einer höheren Verarbeitungsgeschwindigkeit führt. Aufgrund der hohen Verarbeitungsgeschwindigkeit können eCommerce-, CMS-, Foren- und CRM-Anwendungen schneller entwickelt werden.[5]

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

PHP wurde von Anfang an für den Einsatz im Webbereich entwickelt, was sich auch in der Namensgebung widerspiegelt. Das Akronym &#8220;PHP&#8221; stand ursprünglich für &#8220;Personal Home Page Tools&#8221; und wurde im Jahr 1995 entwickelt. Die neueste Version, PHP 8.1, wurde im Jahr 2022 veröffentlicht. PHP unterstützt viele moderne Programmierkonzepte wie Objektorientierung und Klassen.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Wie viele andere Programmiersprachen auch basiert PHP auf einem Fundament, das in &#8220;C&#8221; geschrieben wurde. Dadurch können viele Prozesse durch C-Erweiterungen ausgelagert werden, was zu einer höheren Leistungsfähigkeit führt [6]. Viele der Sprachen, die bevorzugt für Machine-Learning-Anwendungen eingesetzt werden, nutzen ebenfalls diese Technik, um Arbeitsprozesse zu beschleunigen.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Allerdings sind viele bekannte Erweiterungen und Transformatoren nicht für alle Sprachen verfügbar, und das gilt auch für PHP. Daher gibt es für PHP nur wenige dieser Erweiterungen. [5][6]

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;III.&nbsp;&nbsp;PHP Erweiterungen für ML-Anwendungen</h1>
<!-- /wp:heading -->

<!-- wp:heading -->
<h2>A.&nbsp;&nbsp;&nbsp;RUBIXML</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Ein prominentes &#8220;Machine Learning&#8221;-Projekt ist RubixML. Es handelt sich dabei um eine &#8220;high-level machine learning and deep learning library&#8221; für PHP, die Werkzeuge für den gesamten Lebenszyklus des maschinellen Lernens von ETL (Extrahieren, Transformieren, Laden, Manipulieren und Zusammenfassen von Daten) bis hin zum Training, Kreuzvalidierung und Produktion mit über 40 überwachten und unbeaufsichtigten Lernalgorithmen bietet [7]. Eine Reihe von Algorithmen in der Bibliothek unterstützt Deep Learning, darunter der Multilayer Perceptron-Klassifizierer und der MLP Regressor. Viele Anwendungsfälle für RubixML sind beispielsweise Bildklassifizierung, Textstimmungsanalyse und Bildsegmentierung [7]. RubixML bietet eine Bibliothekserweiterung namens Tensor, um die Leistung und den Server für den Einsatz Ihres trainierten Modells in der Produktion zu beschleunigen [8].

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>B.&nbsp;&nbsp;&nbsp;PHP-OpenCV</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

OpenCV ist eine leistungsfähige Bibliothek für Computer Vision, die es ermöglicht, Strukturen auf Bildern zu finden. Unter anderem werden Trainingsdaten bereitgestellt, um Gesichter aus verschiedenen Perspektiven auf Bildern zu erkennen. Um auf die Funktionen von OpenCV zuzugreifen und Gesichtserkennung mit PHP zu implementieren, wurde ein Wrapper für PHP entwickelt: PHP-OpenCV. Diese PHP-Erweiterung basiert auf der OpenCV C/C++-Schnittstelle und erweitert inoffiziell die Unterstützung von OpenCV ab PHP7+. Damit bietet sie eine wertvolle Möglichkeit zur Entwicklung von Computer-Vision-Anwendungen. [9]

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>C.&nbsp;&nbsp;&nbsp;PHPML</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Die PHP-ML-Bibliothek bietet grundlegende Algorithmen für Aufgaben wie Klassifizierung, Stimmungsanalyse und neuronale Netze, aber im Vergleich zu anderen Machine-Learning-Bibliotheken ist ihre Auswahl begrenzt. Dies macht sie jedoch für Anwendungen geeignet, die keine Kosten für komplexe Hardware- und Softwareentwicklungsplattformen aufbringen können und nur einfache Vorhersagen und Datenanalysen benötigen. PHP-ML ist für die Version PHP &gt;= 7.1 verfügbar. [10]

<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>D.&nbsp;&nbsp;Google Cloud Machine Learning</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Google Cloud Machine Learning ist ein verwalteter Dienst, der die Erstellung und Implementierung von ML-Modellen in einem Workflow ermöglicht. Er bietet eine Pipeline, die darauf abzielt, das ML-Problem von Anfang bis Ende zu lösen, wie zum Beispiel von der Datenerfassung und -bereinigung bis hin zum Training und Einsatz der Modelle. [11]

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Wie in Tabelle&nbsp;1&nbsp;zu erkennen ist, werden viele der gängigen Funktionen der ML-Domäne noch nicht von PHP-Erweiterungen unterstützt oder es fehlen entsprechende Ansätze, um sie anzusprechen. Dies hat natürlich entscheidende Nachteile in Bezug auf die Attraktivität der Skriptsprache.

<!-- /wp:paragraph -->

<!-- wp:table -->
<figure class="wp-block-table">
<table>
<thead>
<tr>
<td>&nbsp;</td>
<td>A</td>
<td>B</td>
<td>C</td>
<td>D</td>
</tr>
</thead>
<tbody>
<tr>
<td>Developing ML models.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>+</td>
</tr>
<tr>
<td>Training ML models.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>+</td>
</tr>
<tr>
<td>Running ML models (in a browser).</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>+</td>
</tr>
<tr>
<td>Optical character recognition.</td>
<td>&nbsp;</td>
<td>a</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Computer vision.</td>
<td>&nbsp;</td>
<td>+</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Data manipulation.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Data visualization&nbsp;(in a browser / within a development environment).</td>
<td>+</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Big data analysis</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Designing NN.</td>
<td>+</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Training NN.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Running NN.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Signal and image processing.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Mathematics 1 (classification, regression analysis).</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>+</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Mathematics 2 (classification, regression analysis, clustering, survival analysis, recommender systems).</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Mathematics 3 (optimization, statistics, linear algebra).</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Scientific computing (multidimensional matrixes and arrays processing, linear algebra).</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Pattern recognition.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Prototyping.</td>
<td>+</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>Deploying ready-to-use ML models into the applications.</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>
</figure>
<!-- /wp:table -->

<!-- wp:paragraph -->

Tabelle&nbsp;1: Unterstützte Funktionen der PHP ML-Erweiterungen
Quelle. In Anlehnung an [1]

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IV.&nbsp;&nbsp;Beispiel Anhand von RubixML</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Im folgenden Beispiel wurde RubixML genutzt, da es laut Tabelle 1 die meisten Features in der direkten PHP Umgebung besitzt. Ebenso bietet es den größten Umfang und kann somit die gesamte Laufzeit eines Modells umsetzten.&nbsp;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Um ein einfaches Modell zu erstellen, das das Risiko für eine bestehende Diabetes basierend auf einem Array von Merkmalen bestimmt, kann die RubixML Dokumentation&nbsp;&nbsp;verwendet werden. Hierfür wird der Datensatz &#8220;pima-indians-diabetes.csv&#8221; genutzt, der Daten aus&nbsp;1990 beinhaltet&nbsp;[11].

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Zunächst wird das Trainingsdatenset als mehrdimensionales Array erstellt und in ein RubixML-Labeled-Dataset umgewandelt. Ein neues ClassificationTree-Objekt wird erstellt und trainiert, um das Modell zu erstellen. Anschließend werden die zuvor definierten Merkmale für neue Datensätze in einem Array &#8220;toPredict&#8221; bereitgestellt, um Vorhersagen mit dem Modell zu treffen. Die Ergebnisse können dann mit der predict-Methode des geschulten Modells ausgegeben werden. Zur Verbesserung der Performance können weitere Daten in das Modell integriert werden, indem zusätzliche Layer in die Pipeline aufgenommen werden.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Das Beispiel kann wie folgt aussehen:

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

use Rubix\ML\Classifiers\ClassificationTree;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

use Rubix\ML\Datasets\Labeled;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

use Rubix\ML\Datasets\Unlabeled as UnlabeledDataset;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

use Rubix\ML\Transformers\NumericStringConverter;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

// Trainingsdatenset als mehrdimensionales Array definieren

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

$trainData = [

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[6,148,72,35,0,33.6,0.627,50,1],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[1,85,66,29,0,26.6,0.351,31,0],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[8,183,64,0,0,23.3,0.672,32,1],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;// &#8230;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

];

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

// Trainingsdatenset in ein Labeled-Dataset umwandeln

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

$dataset = Labeled::fromIterator($trainData);&nbsp;

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

// ClassificationTree-Objekt erstellen und trainieren

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

$estimator = new ClassificationTree();

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

$estimator-&gt;train($dataset);

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

// Merkmale für neue Datensätze in einem Array &#8220;toPredict&#8221; bereitstellen

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

$toPredict = [

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[3,128,78,0,0,21.1,0.268,55],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[5,106,82,30,0,39.5,0.286,38],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;[2,108,52,26,63,32.5,0.318,22],

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

];

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

// Vorhersagen mit dem geschulten Modell treffen

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

var_dump($estimator-&gt;predict(UnlabeledDataset::fromIterator($toPredict)));

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Durch die Zugabe von weiteren Layern zur Pipeline kann die Genauigkeit des Modells verbessert werden.

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->
<h1>Platzhirsch Python</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Im Allgemeinen wird Python oft als die bevorzugte Sprache für Machine-Learning- und Data-Science-Projekte angesehen. Dies liegt vor allem an der großen Anzahl von Bibliotheken und Frameworks, die für Python verfügbar sind, wie z.B. NumPy, Pandas, Scikit-Learn, TensorFlow und Keras. Diese Bibliotheken bieten eine Vielzahl von Funktionen, die für Machine-Learning-Projekte unerlässlich sind, wie z.B. lineare Regression, neuronale Netze und Support-Vector-Machines. [5]

<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->

Obwohl es auch einige Machine-Learning-Bibliotheken und Frameworks für PHP gibt, wie z.B. PHP-ML und RubixML, ist das Angebot im Vergleich zu Python deutlich begrenzter. Es ist auch wichtig zu beachten, dass viele der gängigen Machine-Learning- und Data-Science-Tools und -Bibliotheken in Python geschrieben sind und deshalb besser mit Python integriert werden können.[6]

<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->

Darüber hinaus ist Python eine sehr leistungsstarke Sprache, die in der Lage ist, große Datenmengen zu verarbeiten und komplexe Machine-Learning-Modelle zu trainieren. Dies ist zum Teil auf die Tatsache zurückzuführen, dass Python eine interpretierte Sprache ist&nbsp;&nbsp;[5]&nbsp;&nbsp;und viele der rechenintensiven Aufgaben an optimierte Bibliotheken und Frameworks delegieren kann. [15]

<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->

Insgesamt ist Python eine sehr beliebte Wahl für Machine-Learning- und Data-Science-Projekte, und es gibt eine Vielzahl von Bibliotheken und Frameworks, die für diese Art von Arbeit optimiert sind. Obwohl es auch einige Machine-Learning-Tools für PHP gibt, ist das Angebot begrenzter, und es kann schwieriger sein, komplexe Modelle mit PHP zu implementieren.[15]

<!-- /wp:heading -->

<!-- wp:heading {"level":1} -->

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VI.&nbsp;&nbsp;Beispiel&nbsp;&nbsp;mit Python&nbsp;

<!-- /wp:heading -->

<!-- wp:paragraph -->

Ein direkter Vergleich beider Umsetzungen ist schwierig. Die beiden Code-Beispiele verwenden unterschiedliche Machine-Learning-Frameworks für unterschiedliche Programmiersprachen. Das erste Beispiel verwendet das Rubix ML Framework in PHP, während das volgende Beispiel das scikit-learn Framework in Python verwendet.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Ein weiterer großer Unterschied zwischen den beiden Beispielen besteht in den verwendeten Machine-Learning-Methoden und Algorithmen. Das erste Beispiel verwendet einen Klassifikationsbaum (Classification Tree) von Rubix ML, während das zweite Beispiel zwei unterschiedliche Algorithmen &#8211; die logistische Regression (Logistic Regression) und den zufälligen Wald (Random Forest) &#8211; von scikit-learn verwendet.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

In Bezug auf die Verarbeitung der Daten gibt es ebenfalls Unterschiede. Das erste Beispiel verwendet ein mehrdimensionales Array als Trainingsdatensatz, während das zweite Beispiel den &#8220;Digits&#8221;-Datensatz von scikit-learn lädt. Außerdem verwendet das zweite Beispiel die &#8220;train_test_split&#8221;-Funktion von scikit-learn, um den Datensatz in Trainings- und Testdaten zu unterteilen.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Die Ähnlichkeiten zwischen den beiden Beispielen bestehen darin, dass beide Frameworks eine Pipeline-basierte Methode zur Verarbeitung der Daten unterstützen und beide Beispiele die Vorhersage-Methoden der Modelle anhand von Testdaten evaluieren.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Importing necessary modules

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.datasets import load_digits

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.model_selection import train_test_split

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.pipeline import Pipeline

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.preprocessing import StandardScaler

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.linear_model import LogisticRegression

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.ensemble import RandomForestClassifier

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

from sklearn.metrics import accuracy_score

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Loading the dataset

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

X, y = load_digits(return_X_y=True)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Splitting the dataset

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Creating a pipeline for logistic regression with feature scaling

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

log_reg_pipeline = Pipeline([

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;(&#8216;scaler&#8217;, StandardScaler()),

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;(&#8216;classifier&#8217;, LogisticRegression())

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

])

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Training the model

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

log_reg_pipeline.fit(X_train, y_train)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Predicting on the test set

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

y_pred = log_reg_pipeline.predict(X_test)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Evaluating the model&#8217;s accuracy

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

accuracy = accuracy_score(y_test, y_pred)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Creating a pipeline for random forest classifier

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

rf_pipeline = Pipeline([

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;(&#8216;scaler&#8217;, StandardScaler()),

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

&nbsp;&nbsp;&nbsp;&nbsp;(&#8216;classifier&#8217;, RandomForestClassifier(n_estimators=100))

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

])

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Training the model

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

rf_pipeline.fit(X_train, y_train)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Predicting on the test set

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

y_pred = rf_pipeline.predict(X_test)

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

# Evaluating the model&#8217;s accuracy

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

accuracy = accuracy_score(y_test, y_pred)

<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VII.&nbsp;&nbsp;Fazit</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->

Insgesamt lässt sich sagen, dass die Verwendung von PHP zur Implementierung von Machine Learning-Modellen zwar möglich ist, aber aufgrund der begrenzten Unterstützung von gängigen Machine Learning-Frameworks in PHP auch deutliche Nachteile mit sich bringt. Andere Programmiersprachen wie Python oder R haben in dieser Domäne einen deutlichen Vorsprung und werden auch von der Mehrheit der Entwickler bevorzugt.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Dennoch kann die Verwendung von PHP in speziellen Fällen sinnvoll sein, insbesondere wenn bereits eine bestehende Codebasis in PHP vorliegt oder das Projekt eine stark PHP-orientierte Umgebung erfordert. In diesem Fall bietet Rubix ML eine gute Möglichkeit, Machine Learning-Modelle in PHP zu erstellen und umzusetzen.

<!-- /wp:paragraph -->

<!-- wp:paragraph -->

Es ist jedoch zu beachten, dass der Einsatz von Machine Learning nicht nur von der verwendeten Programmiersprache, sondern auch von der Datenqualität, der Art des Machine Learning-Algorithmus und anderen Faktoren abhängt. Es ist daher wichtig, die Vor- und Nachteile sorgfältig abzuwägen und die richtigen Entscheidungen im Kontext des konkreten Projekts zu treffen.

<!-- /wp:paragraph -->

<!-- wp:heading {"level":5} -->
<h5>References</h5>
<!-- /wp:heading -->

<!-- wp:list -->
<ul>
 	<li>Krishnan, N. (n.d.). Enterprise AI and Machine Learning for Managers. Retrieved November 4, 2022, from https://www.kaggle.com/datasets/kaggle/kaggle-survey-2018</li>
 	<li>Kaggle. (2018). 2018 Kaggle Machine Learning &amp; Data Science Survey. Retrieved November 6, 2022, from https://www.kaggle.com/datasets/kaggle/kaggle-survey-2018</li>
 	<li>W3Techs. (n.d.). Usage of server-side programming languages for websites. Retrieved November 9, 2022, from http://w3techs.com/technologies/overview/programming_language/all</li>
 	<li>&nbsp;Samra, J. (n.d.). Comparing Performance of Plain PHP and Four of Its Popular Frameworks. (Thesis Project). Linnaeus University, Sweden.</li>
 	<li>Bennett, S. (2019, March 20). Why machine learning is primarily written in Python. IBM Developer. Retrieved November 8, 2022, from https://developer.ibm.com/blogs/why-machine-learning-is-primarily-written-in-python/</li>
 	<li>[Kühn, A. (2015). PHP in scientific computing [Master&#8217;s thesis, Fakultät für Informatik, Karlsruher Institut für Technologie]. https://www.diva-portal.org/smash/get/diva2:846121/FULLTEXT01.pdf</li>
 	<li>&nbsp;DalPino, A. and Rubix ML. (n.d.). A high-level machine learning and deep learning library for the PHP language. Retrieved November 6, 2022, from&nbsp;<a href="https://rubixml.com/">https://rubixml.com/</a></li>
 	<li>Tensor: Scientific Computing for PHP. (n.d.). GitHub. Retrieved November 6, 2022, from&nbsp;<a href="https://github.com/RubixML/Tensor">https://github.com/RubixML/Tensor</a></li>
 	<li>OpenCV. (n.d.). About. Retrieved November 6, 2022, from&nbsp;<a href="https://phpopencv.org/">https://phpopencv.org/</a></li>
 	<li>Kondas, A. (n.d.). PHP-ML &#8211; Machine Learning library for PHP. Retrieved from&nbsp;<a href="https://php-ml.org/">https://php-ml.org/</a></li>
 	<li>Google Cloud. (n.d.). AI and machine learning products. Retrieved November 6, 2022, from&nbsp;<a href="https://cloud.google.com/products/ai/">https://cloud.google.com/products/ai/</a></li>
 	<li>Rubix ML. (n.d.). Basic Introduction for Rubix ML. Retrieved November 6, 2022, from&nbsp;<a href="https://docs.rubixml.com/2.0/basic-introduction.html">https://docs.rubixml.com/2.0/basic-introduction.html</a></li>
 	<li>Babic, A. (n.d.). Example-PHP-for-machine-learning-RubixML [Code example]. Retrieved November 6, 2022, from https://github.com/Andybabic/Example-PHP-for-machine-learning-RubixML-</li>
 	<li>Rossi, R. A., &amp; Ahmed, N. K. (2015). The Network Data Repository with Interactive Graph Analytics and Visualization. In AAAI. Retrieved November 21, 2022, from&nbsp;<a href="https://nrvis.com/data/mldata/pima-indians-diabetes.csv">https://nrvis.com/data/mldata/pima-indians-diabetes.csv</a></li>
 	<li>Brownlee, J. (2019). Top 10 Programming Languages for Machine Learning. Machine Learning Mastery.
&nbsp;Retrieved November 31, 2022, from&nbsp;<a href="https://www.booksfree.org/wp-content/uploads/2022/05/Machine-Learning-Mastery-With-Python-by-Jason-Brownlee-pdf-free-download-booksfree.org_.pdf">https://www.booksfree.org/wp-content/uploads/2022/05/Machine-Learning-Mastery-With-Python-by-Jason-Brownlee-pdf-free-download-booksfree.org_.pdf</a></li>
</ul>
<!-- /wp:list --><p>The post <a href="https://mobile.fhstp.ac.at/allgemein/sota-wie-php-zur-verwendung-fuer-aufgaben-im-bereich-maschinellen-lernen-genutz-werden-kann/">Sota: Wie PHP zur Verwendung für Aufgaben im Bereich „Maschinellen Lernen“ genutz werden kann</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Wand Plotter mit einem Raspberry Pico</title>
		<link>https://mobile.fhstp.ac.at/allgemein/wand-plotter-mit-einem-raspberry-pico/</link>
		
		<dc:creator><![CDATA[Andy Babic]]></dc:creator>
		<pubDate>Mon, 06 Feb 2023 11:07:29 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://akirchknopf-21110.php.fhstp.cc/?p=10649</guid>

					<description><![CDATA[<p>Was ein Raspberry Pico ? Was unterschiedet ihn zum Raspberry Pi ? Der Raspberry Pi ist ein kleiner, leistungsfähiger Einplatinencomputer, der für verschiedene Anwendungen wie z.B. das Erstellen von Servern, das Steuern von Haushaltsgeräten oder das Erstellen von Medienzentren verwendet werden kann. Der Raspberry Pi verfügt über mehrere Anschlüsse für Peripheriegeräte wie Tastaturen, Mäuse und <a class="read-more" href="https://mobile.fhstp.ac.at/allgemein/wand-plotter-mit-einem-raspberry-pico/">[...]</a></p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wand-plotter-mit-einem-raspberry-pico/">Wand Plotter mit einem Raspberry Pico</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1280" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Gross-2I0A0254-scaled-1-1280x800.jpeg" alt="" class="wp-image-10663"/></figure>



<h2 class="wp-block-heading">Was ein Raspberry Pico ? Was unterschiedet ihn zum Raspberry Pi ?</h2>



<p>Der Raspberry Pi ist ein kleiner, leistungsfähiger Einplatinencomputer, der für verschiedene Anwendungen wie z.B. das Erstellen von Servern, das Steuern von Haushaltsgeräten oder das Erstellen von Medienzentren verwendet werden kann. Der Raspberry Pi verfügt über mehrere Anschlüsse für Peripheriegeräte wie Tastaturen, Mäuse und Monitore, und es gibt verschiedene Modelle mit unterschiedlichen Leistungsmerkmalen und Preisen.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1280" height="800" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/Gross-Pi-Family-Photo-Master-Nov-2016_1500-1280x800.jpeg" alt="" class="wp-image-10660"/><figcaption>Raspberry Pi Family Photo</figcaption></figure>



<p>Der Raspberry Pi Pico ist ein neueres Produkt, das auf dem RP2040-Mikrocontrollerchip von Raspberry Pi basiert. Es ist im Vergleich zum Raspberry Pi deutlich kleiner und kostengünstiger und eignet sich besonders gut für einfache, ressourcensparende Anwendungen wie z.B. das Steuern von Geräten oder das Sammeln von Daten. Der Raspberry Pi Pico hat weniger Anschlussmöglichkeiten als der Raspberry Pi und ist weniger leistungsfähig, aber dafür auch einfacher zu programmieren und zu verwenden.</p>



<h2 class="wp-block-heading">Der Unterschied zum Arduino</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1280" height="720" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/maxresdefault-3.jpg" alt="" class="wp-image-10662"/><figcaption>Pico Vs. Arduino </figcaption></figure>



<p>Der Arduino ist ebenfalls ein Mikrocontroller, der für einfache, ressourcensparende Anwendungen wie das Steuern von Geräten oder das Sammeln von Daten geeignet ist. Im Vergleich zum Raspberry Pi Pico ist der Arduino jedoch eine etabliertere Plattform mit einer größeren Nutzerbasis und einer breiteren Auswahl an Hardware- und Software-Erweiterungen. Der Arduino ist auch etwas leistungsfähiger als der Raspberry Pi Pico und hat eine größere Auswahl an Anschlussmöglichkeiten. Allerdings ist er auch teurer und komplizierter zu programmieren.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="600" height="338" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/01_pinout_600x600.png.webp" alt="" class="wp-image-10661"/></figure>



<h2 class="wp-block-heading">Warum der RP2040-Mikrocontrollerchip besonders ist?</h2>



<p>Der RP2040-Mikrocontrollerchip, der im Raspberry Pi Pico verwendet wird, hat einige Vorteile gegenüber dem Arduino. Zunächst einmal ist der RP2040 leistungsfähiger als der Arduino, insbesondere in Bezug auf die Rechenleistung und die Taktfrequenz. Der RP2040 verfügt auch über mehr Arbeitsspeicher als der Arduino, was ihn für anspruchsvollere Aufgaben geeignet macht.</p>



<p>Ein weiterer Vorteil des RP2040 ist die Unterstützung für das Python-Programmiermodell. Viele Entwickler bevorzugen Python wegen seiner einfachen Syntax und seiner Beliebtheit in der Informatikindustrie. Der RP2040 bietet die Möglichkeit, Python-Code direkt auf dem Mikrocontroller auszuführen, was für Entwickler, die Python verwenden, eine attraktive Option darstellen könnte.</p>



<p>Zusätzlich zu diesen Vorteilen bietet der Raspberry Pi Pico eine breite Palette von Anschlussmöglichkeiten, darunter USB, UART, I2C und SPI, die es ermöglichen, verschiedene Peripheriegeräte anzuschließen und zu steuern. Der Arduino bietet zwar auch eine Reihe von Anschlussmöglichkeiten, aber der Raspberry Pi Pico hat hier einen leichten Vorsprung.</p>



<p>Insgesamt bietet der Raspberry Pi Pico eine leistungsfähigere und flexiblere Plattform als der Arduino, die insbesondere für Entwickler attraktiv sein könnte, die Python verwenden und anspruchsvollere Anwendungen erstellen möchten.</p>



<h2 class="wp-block-heading">Arduino-C++:</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}

</pre></div>


<h2 class="wp-block-heading">MicroPython:</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
from machine import Pin
import time

led = Pin(13, Pin.OUT)

while True:
  led.value(1)
  time.sleep(1)
  led.value(0)
  time.sleep(1)

</pre></div>


<p>Wie man sieht, sind die beiden Codebeispiele ziemlich ähnlich, aber es gibt einige Unterschiede in der Syntax und in den verwendeten Bibliotheken. Der Arduino-Code verwendet C++ und die Arduino-Bibliotheken, während der MicroPython-Code Python und die MicroPython-Bibliotheken verwendet. MicroPython ist in der Regel etwas einfacher zu lesen und zu verstehen als Arduino-C++, da es eine einfache, intuitive Syntax hat und weniger Zeichen benötigt.</p>



<h2 class="wp-block-heading">Wandplotter Logik mit einem Pico:</h2>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1280" height="720" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/maxresdefault.jpg" alt="" class="wp-image-10651"/><figcaption>Symbolbild von linkedline</figcaption></figure>



<p>Um den einfache Nutzbarkeit von einem Pico auf zu zeigen, schauen wir uns mein Lieblingsprojekt an. Der Wandplotter ist ein klasse Beispiel, um eine neue Plattform zu testen.<br><br>Als ersten sehen wir uns die Daten zum Drucken an. Hierfür verwenden wir Vektor Daten in Form von svg Dateien an. Wenn wir eine SVG Datei als TXT öffnen, bietet sich folgendes Bild:</p>



<p> </p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&amp;lt;!-- Generator: Adobe Illustrator 27.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --&gt;
&amp;lt;svg version=&quot;1.1&quot; id=&quot;Ebene_1&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; x=&quot;0px&quot; y=&quot;0px&quot;
	    viewBox=&quot;0 0 744.09448819 1052.3622047&quot;
   height=&quot;297mm&quot;
   width=&quot;210mm&quot; style=&quot;enable-background:new 0 0 1500 1500;&quot; xml:space=&quot;preserve&quot;&gt;
&amp;lt;g&gt;
	&amp;lt;path d=&quot;M454.4,408.4h98v19.7h-74.5v60.5h68.8v19.4h-68.8v82.3h-23.5V408.4z&quot;/&gt;
	&amp;lt;path d=&quot;M609.4,408.4v107.7c0,40.8,18.1,58,42.4,58c27,0,44.3-17.8,44.3-58V408.4h23.8v106.1c0,55.9-29.4,78.8-68.8,78.8
		c-37.3,0-65.3-21.3-65.3-77.7V408.4H609.4z&quot;/&gt;
	&amp;lt;path d=&quot;M887.7,584.5c-8.6,4.3-25.9,8.6-48,8.6c-51.3,0-89.9-32.4-89.9-92.1c0-57,38.6-95.6,95-95.6c22.7,0,37,4.9,43.2,8.1
......
</pre></div>


<p>SVG (Scalable Vector Graphics) ist ein XML-basiertes Format zur Beschreibung zweidimensionaler Grafiken. Die Formatierung von SVG-Grafiken erfolgt über XML-Tags und Attribute, die die Formen, Farben und Transformationen der Grafik beschreiben.</p>



<p>Ein grundlegendes SVG-Dokument besteht aus einem Wurzelelement, das <code>&lt;svg&gt;</code> genannt wird, und enthält eine Liste von Formen und Bildern, die als Kinder des <code>&lt;svg&gt;</code>-Elements definiert sind. Jede Form oder jedes Bild wird als ein einzelnes Element beschrieben, das ein bestimmtes Tag hat. Hier sind einige häufig verwendete Formen-Tags:</p>



<ul class="wp-block-list"><li><code>&lt;rect&gt;</code> &#8211; definiert ein Rechteck</li><li><code>&lt;circle&gt;</code> &#8211; definiert einen Kreis</li><li><code>&lt;ellipse&gt;</code> &#8211; definiert eine Ellipse</li><li><code>&lt;line&gt;</code> &#8211; definiert eine Linie</li><li><code>&lt;polyline&gt;</code> &#8211; definiert eine mehrseitige Linie</li><li><code>&lt;polygon&gt;</code> &#8211; definiert ein Polygon</li></ul>



<p>Jede Form hat Attribute, die ihre Größe, Position und Farbe beschreiben. Hier sind einige häufig verwendete Attribute:</p>



<ul class="wp-block-list"><li><code>x</code> und <code>y</code> &#8211; legen die Position der Form auf der x- und y-Achse fest</li><li><code>width</code> und <code>height</code> &#8211; legen die Größe der Form fest</li><li><code>fill</code> &#8211; legt die Füllfarbe der Form fest</li><li><code>stroke</code> &#8211; legt die Farbe des Rahmens (Strokes) der Form fest</li><li><code>stroke-width</code> &#8211; legt die Breite des Rahmens fest</li><li></li></ul>



<p></p>



<p>Neben den Grundformen unterstützt SVG auch komplexere Formen, wie z. B. Pfade, und bietet eine Vielzahl von Optionen für die Textformatierung. Pfade werden mit dem &lt;path&gt;-Element definiert, das eine breite Palette von Pfadbefehlen zur Erstellung komplexer Formen unterstützt. Text wird mit dem &lt;text&gt;-Element formatiert, mit dem Sie die Schriftart, die Größe und andere Formatierungsoptionen für den Text festlegen können.</p>



<p>Insgesamt ist die Formatierung von SVG-Grafiken recht flexibel und leistungsfähig und ermöglicht es Ihnen, eine breite Palette von Grafiken zu erstellen, von einfachen Formen bis hin zu komplexen Illustrationen.</p>



<h2 class="wp-block-heading">SVG TO G-Code</h2>



<p>G-Code ist eine Art von Maschinensprache, die hauptsächlich in der CNC-Fertigung und in der 3D-Druckbranche verwendet wird. Es wird verwendet, um Maschinen anzuweisen, bestimmte Bewegungen und Funktionen auszuführen, um ein Werkstück herzustellen oder zu bearbeiten.</p>



<p>Jede Zeile im G-Code-Programm enthält einen einzelnen Befehl, der von der Maschine interpretiert wird. Ein Befehl besteht aus einem oder mehreren G-Code-Befehlen und eventuell einer Liste von Parametern, die die Bedingungen des Befehls beschreiben.</p>



<p>Ein Beispiel eines einfachen G-Code-Befehls ist &#8220;G1 F500 X100 Y100&#8221;, was bedeutet, dass die Maschine mit einer Geschwindigkeit von 500 Millimeter pro Minute auf die Koordinaten X100 und Y100 bewegt werden soll.</p>



<p>Insgesamt ist G-Code ein mächtiges Werkzeug, um CNC-Maschinen und 3D-Drucker präzise und reproduzierbare Ergebnisse zu liefern.</p>


<p>G-Gode und Vektor Grafiken sind verschiedene Formate, haben aber eine nutzbare Gemeinsamkeit. Sie können hierarchisch gelesen werden und können in ein Koordinatensystem projiziert werden. Eine Umwandlung ist hierbei auch mit einfachen Mitteln zu verwirklichen.&nbsp;</p>
<p>Wir nutzen in diesem Fall eine Python Bibliothek namens svg_to_gcode. Diesen können wir leider wegen einem fehlenden XML-Parser Bibliothek &nbsp;nicht auf dem Pico laufen lassen, aber da wir den für den Pico einen Desktop benötigen, so lassen wir diesen einfach dort laufen. Unser G-Gode befindet sich nun im Ordner &#8216;path/to/output.gcode&#8217; und diesen können wir später in das Verzeichnis vom Pico laden.</p>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
from svg_to_gcode.svg_parser import parse_svg

# Parse the SVG file
path_data = parse_svg(&#039;path/to/input.svg&#039;)

# Check and adjust the coordinates to be positive
for path in path_data:
    for command in path:
        for i, coord in enumerate(command):
            if i % 2 == 0 and coord &amp;lt; 0:
                command&#x5B;i] = -1 * coord

# Generate the Gcode
gcode = svg_to_gcode.gcode_from_svg(path_data)

# Save the Gcode
with open(&#039;path/to/output.gcode&#039;, &#039;w&#039;) as f:
    f.write(gcode)

</pre></div>


<h2 class="wp-block-heading">Vom G-Code in die reale Welt:</h2>



<p>Alle Vorbereitungsschritte sind nun erledigt und wir können mit der Programmierung vom Pico beginnen. Da es keine speziellen Anforderungen beim Bespielen vom Microcontroller gibt, werde ich hierfür auf die offizielle Dokumentation verweisen<a href="https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html" target="_blank" rel="noreferrer noopener">:https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html</a></p>



<p></p>



<p>Wir werden nun eine main.py erstellen und den Code Teil für Teil implementieren:</p>



<p>Als erstes laden wir die benötigten Bibliotheken:</p>



<p></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
from time import sleep 
import math
from machine import Pin, PWM 

</pre></div>


<p>Diese benötigen wir für einen Delay, mathematische Funktionen und das ansteuern von Pins und einem Servo Motor.</p>



<p>Als nächsten Schritt machen wir uns das Leben einfacher und generieren eine Klasse Stepper für die einzelnen Steppermotoren. Hierfür ist die Funktionsweise und der Unterschied von herkömmlichen Elektromotoren wichtig.<br></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="640" height="321" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/SINGLE-STEP.jpg.webp" alt="" class="wp-image-10655"/><figcaption>Abbildung 3: Stepper Motor mit Signalen Wikipedia open Source</figcaption></figure>



<p>Stepper-Motoren sind speziell für präzise Positionierung entwickelt worden. Sie arbeiten indem sie in kleinen Schritten (Steps) rotieren und dabei eine präzise Position beibehalten. Jeder Schritt ist dabei gleich groß und kann genau gesteuert werden. Dies macht Stepper-Motoren ideal für Anwendungen, in denen eine genaue Positionskontrolle erforderlich ist, wie beispielsweise in CNC-Maschinen, 3D-Druckern und Robotern.</p>



<p>DC-Motoren (Gleichstrommotoren) hingegen sind einfachere Motoren, die einen gleichmäßigen Drehmomentausgang liefern. Sie sind nicht so präzise wie Stepper-Motoren, aber dafür einfacher zu verwenden und zu kontrollieren. DC-Motoren eignen sich besser für Anwendungen, bei denen keine präzise Positionierung erforderlich ist, wie beispielsweise in Lüftern, Pumpen und Antrieb für Fahrzeuge.<br><br>Durch mehrere Spulen kann ein Steppermotor realisiert werden. Dies benötigt dafür auch mehrere Leitungen zu dem Motor. In unserem Fall sind es 4 Phasen. Wenn wir nun wie in der Abbildung 3, zeitversetzt die jeweiligen Phasen nacheinander unter Spannung setzten, erzeigen wir eine Drehbewegung. Die Anzahl dieser Iteration ist dabei ein Stepp* der Anzahl der Phasen.</p>



<p></p>



<p>Kommen wir nun zu unserem Code und setzten wir das gelernte in eine Klasse um.<br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
class Stepper:
    
    sequence_forw = &#x5B;&#x5B;1,0,0,0],&#x5B;0,1,0,0],&#x5B;0,0,1,0],&#x5B;0,0,0,1]]
    sequence_rev = &#x5B;&#x5B;0,0,0,1],&#x5B;0,0,1,0],&#x5B;0,1,0,0],&#x5B;1,0,0,0]]
    sleeptime= 0.001
</pre></div>


<p>Die Klasse benötigt eine Sequenz für die Rotation. Diese Speichern wir in einem Array. Weil die Steuerung schneller schaltet, als die Massenträgheit des Motors überwunden werden kann, müssen wir jeden dieser Schritte mit einer Pause versetzten. 1-3 Millisekunde ist hierbei ein sehr guter Wert.<br><br></p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
def __init__(self,pins, currentlength, umfang):
        self.pins=pins
        self.currentlength = currentlength
        self.umfang = umfang
        self.stepps= 2048
        self.singleStepLen= umfang/self.stepps
</pre></div>


<p>Wenn wir die Klasse initialisieren, wollen wir auch Werte übergeben. Wichtig ist hierbei die Position, Dimension und die Ausgänge vom Motor. Beim Plotter entspricht die Position nur dem Zusammenspiel der 2 Seile. Es reicht deshalb, dem Stepper zu sagen, wie lang die aktuelle Länge ist und wie groß die Veränderung pro (Teil-)Umdrehung ist. Ein Stepper Motor hat übrigens meistens rund 2048 Stepps für eine gesamte Umdrehung.<br></p>



<h2 class="wp-block-heading">Die mathematische Lösung:</h2>



<p>Eine vermutlich sehr komplizierte Aufgabe kann durch die mathematischen Fähigkeiten von Mittelschülern einfach gelöst werden. So auch das Problem der Steuerung. Wir haben unsere Grafiken schon in ein Koordinatensystem umgewandelt und haben nun einen Punkt erreicht, in dem wir Steppermotoren und Druckdaten sehr gut zusammenführen können.<br><br><br></p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="938" height="587" src="https://akirchknopf-21110.php.fhstp.cc/wp-content/uploads/2023/02/F1XCJJXIOEKIPWH.jpg.webp" alt="" class="wp-image-10656"/><figcaption>Abb3. Mathematische Erklärung von Linkedline</figcaption></figure>



<p>Ich erspare mir die Erklärung der Abbildung und lasse diese auf euch wirken. <br>Wenn euch nun dein Licht auf geht, können wir fortfahren und alle wichtigen Funktionen von unserer Klasse erstellen.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
def calcSteps(self,slen):
        stepps=slen/self.singleStepLen
        return math.floor(stepps) # wir runden unsere Ausgabe

def goto(self,newlen):
            job= self.calcSteps(newlen - self.currentlength )    
            self.currentlength=job # neue länge muss in der Klasse gespeichert erden
            return job
        
def doStep(self,steps,stepPer):
        for i in range(stepPer):
            if steps &gt; 0:
                self.step_for(steps%4)
                steps= steps -1
            elif steps &amp;lt; 0:
                self.step_bac(steps%4)
                steps= steps +1
            else:
                break
        return steps
                   
    
            
def step_for(self,sIndex):
            step= self.sequence_forw&#x5B;sIndex]
            for i in range(len(self.pins)):
                self.pins&#x5B;i].value(step&#x5B;i])
                sleep(self.sleeptime)
                
                
def step_bac(self,sIndex):
            step= self.sequence_rev&#x5B;sIndex]
            for i in range(len(self.pins)):
                self.pins&#x5B;i].value(step&#x5B;i])
                sleep(self.sleeptime)
                

</pre></div>


<p>Wir haben nun alle wichtigen Funktionen. Wir können mit <strong>Stepper.goto(neueLänge)</strong> die Anzahl der Stepps berechnen, um von Länge A zu Länge B zu kommen. Der Rückgabewert ist je nach Veränderung der Länge, ein positiver oder negativer. Wenn wir diesen an<strong> Stepper.doStep(Stepps)</strong> schicken. wird die Sequenz ausgeführt.</p>



<p></p>



<p>Aktuell sollte der Code so aussehen:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
from time import sleep
import math
from machine import Pin, PWM


class Stepper:
    
    sequence_forw = &#x5B;&#x5B;1,0,0,0],&#x5B;0,1,0,0],&#x5B;0,0,1,0],&#x5B;0,0,0,1]]
    sequence_rev = &#x5B;&#x5B;0,0,0,1],&#x5B;0,0,1,0],&#x5B;0,1,0,0],&#x5B;1,0,0,0]]
    sleeptime= 0.001
    

    def __init__(self,pins, currentlength, umfang):
        self.pins=pins
        self.currentlength = currentlength
        self.umfang = umfang
        self.stepps= 2048
        self.singleStepLen= umfang/self.stepps

    def calcSteps(self,slen):
        import math
        stepps=slen/self.singleStepLen
        return math.floor(stepps)

    def goto(self,newlen):
            job= self.calcSteps(newlen - self.currentlength )    
            self.currentlength=job
            return job
        
    def doStep(self,steps,stepPer):
        for i in range(stepPer):
            if steps &gt; 0:
                self.step_for(steps%4)
                steps= steps -1
            elif steps &amp;lt; 0:
                self.step_bac(steps%4)
                steps= steps +1
            else:
                break
        return steps

    
            
    def step_for(self,sIndex):
            step= self.sequence_forw&#x5B;sIndex]
            for i in range(len(self.pins)):
                self.pins&#x5B;i].value(step&#x5B;i])
                sleep(self.sleeptime)
                
                
    def step_bac(self,sIndex):
            step= self.sequence_rev&#x5B;sIndex]
            for i in range(len(self.pins)):
                self.pins&#x5B;i].value(step&#x5B;i])
                sleep(self.sleeptime)
                

</pre></div>


<h2 class="wp-block-heading">Aus der Klasse raus in die Logik</h2>



<p>Wie steigen aus der Klasse aus und legen unsere Pins fest, im selben Atemzug, können wir unseren Stepper initialisieren.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
# GPIO für Steuersignal
servo_pin = 0

# Pins für den ersten Stepper definieren
pin1_1 = Pin(2, Pin.OUT)
pin1_2 = Pin(3, Pin.OUT)
pin1_3 = Pin(4, Pin.OUT)
pin1_4 = Pin(5, Pin.OUT)

# Pins für den zweiten Stepper definieren
pin2_1 = Pin(6, Pin.OUT)
pin2_2 = Pin(7, Pin.OUT)
pin2_3 = Pin(8, Pin.OUT)
pin2_4 = Pin(9, Pin.OUT)

# Stepper-Objekte erstellen
stepper1 = Stepper(&#x5B;pin1_1, pin1_2, pin1_3, pin1_4],0,10)
stepper2 = Stepper(&#x5B;pin2_1, pin2_2, pin2_3, pin2_4],0,10)

# Initialisierung PWM-Signal
servo = PWM(Pin(servo_pin))
servo.freq(50)

</pre></div>


<p>Öffnen unsere Lokale Version vom G-Code und laden es in eine Liste:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
with open(filename, &quot;r&quot;) as f:
    listData = f.readlines()

</pre></div>


<p>listData hat nun für jede Zeile ein Commando im Stiele von:</p>



<p>G90;<br>M5;<br>M5;<br>G1 F1000 X761.216815 Y81.931605;<br>M3 S255;<br>G1 F300 X764.251418 Y63.723614;<br>G1 X752.112820 Y88.000998;<br>G1 X764.251418 Y91.035600;<br>G1 X767.286209 Y63.723614;<br>G1 X782.459597 Y91.035600;<br>G1 X882.603734 Y91.035600;<br>G1 X752.112820 Y57.654221;</p>



<p> <br>Wichtig ist Hiebei: <br><br>M5= Spindel Stop &#8212;&gt; verwenden wir um den Servo ( Stift) anzuheben</p>



<p>M3= Spindel Start &#8212;&gt; verwenden wir um den Servo ( Stift) zu senken</p>



<p>G1 = Bewege dich zu &#8230;</p>



<p></p>



<p></p>



<p>Wir müssen nun den Wert aus jeder Zeile Lesen. Beim Nero ist es einfach, beinhaltet die Zeile den Wert M5, dann mache &#8230; , wenn M3 dann &#8230;:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
def servocontrol(job):
    if &quot;M5&quot; in job:
        for pos in range(3000,6000,20):
            setServoCycle(pos)
    if &quot;M3&quot; in job:
        for pos in range(6000,3000,-20):
            setServoCycle(pos)

    
def setServoCycle (position):
    servo.duty_u16(position)
    sleep(0.01)
</pre></div>


<p>Beim ablesen der Koordinaten wird es schwieriger, aber auch nicht unlösbar. Im selben Atemzug können wir unsere mathematisch hochkomplizierte Lösung anwenden:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
def plotJob(commandline,xOff,yOff,xmax):
    newX = float(commandline(&quot;X&quot;)&#x5B;1].split(&quot; &quot;)&#x5B;0])+xOff
    newY = float(commandline(&quot;Y&quot;)&#x5B;1].split(&quot;;&quot;)&#x5B;0])+yOff

    len1= math.sqrt(newX**2+newY**2)
    len2= math.sqrt((xmax-newX)**2  +newY**2)
    return len1,len2
</pre></div>


<p>Wir müssen nur mehr jede einzelne Zeile durchgehen und schon haben wir unseren Plotter fertig.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; title: ; notranslate">
 for i in listData:
        print(i)
        servocontrol(i)
        if &quot;X&quot; in i :
            job1,job2=plotJob(i,0,0,30)
            print(job1,job2)
            stepsfor1= stepper1.goto(job1)
            stepsfor2= stepper2.goto(job2)
            abs1= math.fabs(stepsfor1)
            abs2= math.fabs(stepsfor2)
            stepPer1=1
            stepPer2=1
            
            if abs1&gt;abs2 and abs2&gt;0 :
                stepPer1=abs1/abs2 
            elif abs1&amp;lt;abs2 and abs1&gt;0 :
                stepPer2=abs2/abs1 

            while True:
                stepsfor1=stepper1.doStep(stepsfor1,stepPer1)
                stepsfor2=stepper2.doStep(stepsfor2,stepPer2)
                if stepsfor1 == 0 and stepsfor2 == 0:
                    break
</pre></div>


<h2 class="wp-block-heading">Fazit:</h2>



<p>Der gesamte Code hat nun in formatierter Version rund 140 Zeilen Code und macht nun die Kernaufgabe unseres Plotters. Ich persönlich bin sehr beeindruckt über die Einfachheit der Umsetzung. Natürlich ist die Umsetzung nun eine erste Version eines Studenten und sicherlich ausbaufähig. Dennoch machte es unglaublich viel Spaß.<br><br>Meine Arduinoversion hat rund 2.900 Zeilen und bietet sicherlich mehr Funktionen. Dennoch ist diese Version eine grandiose Chance, genau die selbe Begeisterung für dieses Projekt zu entwickeln, als ich.<br><br>Ich habe absichtlich den Code auf das wesentlich reduziert. Somit wirst du nach und nach auf kleinere Probleme stoßen. Aber keine Angst, jedes Problem ist mit einem einfachen Trick zu lösen.</p>
<p>The post <a href="https://mobile.fhstp.ac.at/allgemein/wand-plotter-mit-einem-raspberry-pico/">Wand Plotter mit einem Raspberry Pico</a> appeared first on <a href="https://mobile.fhstp.ac.at">Mobile USTP MKL</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
