Compare commits

..

1 Commits

Author SHA1 Message Date
c50580733c Diplomarbeitsbuch/03-Diplomarbeitsbuch-individueller-teil-Adam-Gaiswinkler.md aktualisiert
Some checks failed
Word Count / count-words (pull_request) Has been cancelled
Gemini Writing Review / gemini-review (pull_request) Successful in 1m44s
2026-04-20 20:09:25 +00:00
37 changed files with 76 additions and 391 deletions

View File

@@ -33,14 +33,13 @@
\usepackage{pgfplots}
\usepackage{pgfplotstable}
% \usepackage{fontawesome}
\usepackage{fontawesome5}
\usepackage{tikzpingus}
\usepackage{tikzducks}
\usepackage{pdfpc}
\usepackage{amsmath}
\usepgfplotslibrary{dateplot}
\usetikzlibrary{shapes,tikzmark,positioning,shapes.geometric}
\usetikzlibrary{shapes,tikzmark}
\tikzset{pipelinestep/.style={lw,rnd,shape=signal,signal from=west,signal pointer angle=130,minimum width=3cm,minimum height=2cm,draw=black,fill=lightgray!30}}
\def\info#1{\begingroup\color{gray}\scriptsize#1\endgroup}

View File

@@ -4,10 +4,8 @@
## {.plain}
\setbeamertemplate{sidebar left}{}
\begin{tikzpicture}[remember picture,overlay]
\node[anchor=center, inner sep=0pt, outer sep=0pt] at (current page.center) {
\movie[width=\paperwidth, height=\paperheight, poster, showcontrols=false, autostart]{}{\imagepath/video/introduction/introduction.mp4}
\node[anchor=center] at (current page.center) {
\movie[width=\paperwidth, height=\paperheight, poster, showcontrols=false, autostart]{}{\imagepath/video/introduction/sample-10s.mp4}
};
\end{tikzpicture}

View File

@@ -58,214 +58,48 @@
::::
:::
\vfill
\begin{center}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/debian.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/docker.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/gitea.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/wireguard.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/github.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/nginx.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/postgres.pdf} \hspace{1em}
\includegraphics[width=2.5em]{./Images/images/konstantin/logos/oqtane.pdf}
\end{center}
## CI/CD
\vfill
<!-- ![](./Images/konstantin/tech_stack_logos.png){ width=100% } -->
CI:
---
- Gitea Actions
- Debian Packages (.deb)
- Code-Reviewing:
- KI
- Git-Flow
```mermaid
sequenceDiagram
participant browser as Client
participant nginx as NginX
participant oqtane as Oqtane
participant db as PostgreSQL
browser->>+nginx: HTTPS => 0.0.0.0:443
nginx->>nginx: SSL Terminierung
nginx->>+oqtane: HTTP => 127.0.0.1:5000
oqtane->>+db: SQL => 127.0.0.1:5432
db-->>-oqtane: SQL
oqtane-->>-nginx: HTTP
nginx-->>-browser: HTTPS
```
## Von Commit zu Paket
\begin{tikzpicture}[
node distance=1cm,
stepnode/.style={circle, minimum size=1.2cm, draw, line width=1.5pt, fill=white, inner sep=0pt},
labelnode/.style={align=center, font=\small\bfseries},
textnode/.style={align=center, font=\scriptsize, color=gray},
track/.style={line width=2pt, gray!20}
]
% Central Track
\draw[track] (-1,0) -- (12,0);
\node[stepnode, draw=gray!60!black] (n1) at (0,0) {\color{gray!60!black}\small\faCodeBranch};
\node[stepnode, draw=green!60!black, right=of n1] (n2) {\color{green!60!black}\small\faCheckCircle};
\node[stepnode, draw=blue!60!black, right=of n2] (n3) {\color{blue!60!black}\small\faCogs};
\node[stepnode, draw=green!60!black, right=of n3] (n4) {\color{green!60!black}\small\faBoxOpen};
\node[stepnode, draw=blue!60!black, right=of n4] (n5) {\color{blue!60!black}\small\faDatabase};
% Labels Above
\node[labelnode, below=0.2cm of n1, color=gray!60!black] {Commit};
\node[labelnode, below=0.2cm of n2, color=green!60!black] {Tag};
\node[labelnode, below=0.2cm of n3, color=blue!60!black] {CI/CD};
\node[labelnode, below=0.2cm of n4, color=green!60!black] {.deb Paket};
\node[labelnode, below=0.2cm of n5, color=blue!60!black] {Registry};
\end{tikzpicture}
\vspace{1em}
**Ablauf:**
1. laufende Entwicklung
2. Commit zu einem Release zusammenfassen (Tag)
3. CI/CD Pipeline beginnt zu laufen
4. .deb Paket wird gebaut
5. .deb Paket wird in der Registry abgelegt
## Softwarearchitektur (.NET / Oqtane)
**Design Patterns:**
\vspace{1em}
\begin{tikzpicture}[
node distance=0.15cm,
stepnode/.style={rectangle, draw, line width=1.5pt, minimum width=1.5cm, minimum height=1.5cm, fill=white, inner sep=0pt},
]
\node[stepnode, draw=gray!60!black] (n1) at (0,0) {\LARGE\color{gray!60!black}S};
\node[stepnode, draw=green!60!black, right=of n1] (n2) {\LARGE\color{green!60!black}O};
\node[stepnode, draw=blue!60!black, right=of n2] (n3) {\LARGE\color{blue!60!black}L};
\node[stepnode, draw=orange, right=of n3] (n4) {\LARGE\color{orange}I};
\node[stepnode, draw=orange!70!black, right=of n4] (n5) {\LARGE\color{orange!70!black}D};
\end{tikzpicture}
\vspace{1em}
## Softwarearchitektur
- Open-Closed Principle
- Dependency Injection (IServiceProvider)
- Repository-Pattern (EntityFramework)
## Module
::: columns
:::: column
**Admin Module:**
- Mass Mailer
- Token Lifetime
- Report System
**Allgemeine Module:**
- Event Registration
- Black Board
::::
:::: column
![](./Images/images/konstantin/ReportingSystem.png)
::::
:::
## Produktion $\neq$ Staging
\begin{tikzpicture}[
node distance=2.2cm,
stepnode/.style={circle, minimum size=1.2cm, draw, line width=1.5pt, fill=white, inner sep=0pt},
labelnode/.style={align=center, font=\small\bfseries},
textnode/.style={align=center, font=\scriptsize, color=gray},
track/.style={line width=2pt, gray!20}
]
% Central Track
\draw[track] (-1,0) -- (12,0);
% Steps
\node[stepnode, draw=green!60!black] (s1) at (0,0) {\color{green!60!black}\Large\faCheck};
\node[stepnode, draw=accent, right=of s1] (s2) {\color{accent}\Large\faCodeBranch};
\node[stepnode, draw=red, right=of s2] (s3) {\color{red}\Large\faExclamationTriangle};
\node[stepnode, draw=orange, right=of s3] (s4) {\color{orange}\Large\faLightbulb};
% Labels Above
\node[labelnode, above=0.2cm of s1, color=green!60!black] {Staging};
\node[labelnode, above=0.2cm of s2, color=accent] {Deploy};
\node[labelnode, above=0.2cm of s3, color=red] {Bruch};
\node[labelnode, above=0.2cm of s4, color=orange] {Erkenntnis};
\end{tikzpicture}
\vfill
::: columns
:::: column{.column width=33%}
"It works on my Machine"
::::
:::: column{.column width=66%}
**Deploymentprobleme bei Hetzner**
Problem: schlechte Dokumentation.
Lösung: Debugging mithilfe von Wireshark und lesen des Source Codes um das Framework zu verstehen und den Fehler zu finden.
::::
:::
## Teamleitung & PM
::: columns
:::: column
**Scrum Workflow:**
- 14-tägige Sprints
- Weeklies & Retrospektiven
- Definition of Done (DoD)
::::
:::: column
**Gitea Issues / Board:**
- Integrierter Workflow
- Single Source of Truth
- Strategy Pattern
- Dependency Injection
::::
:::
## Technischer Vergleich
![Gitea Board](./Images/images/konstantin/GiteaIssues-TaskBoard.png){ width=60% }
Bisherige Erfahrungen:
## Was bleibt
- Go
- Typescript
- GRPC (interprozess Kommunikation)
\vspace{0.5em}
Untersuchungsgebiete:
\begin{tikzpicture}[x=\linewidth/10, y=1cm, every node/.style={font=\sffamily}]
% Rule: 90/90
\fill[black!5] (0, 2.8) rectangle (10, 3.4);
\fill[green!60!black] (0, 2.8) rectangle (9, 3.4);
\node[anchor=north west, inner sep=3pt] at (0, 2.8) {\scriptsize Erste \textbf{90\,\%} des Codes $\rightarrow$ \textbf{90\,\%} der Zeit};
- Typisierung
- Konsistenz
\fill[black!5] (0, 1.2) rectangle (10, 1.8);
\fill[accent] (0, 1.2) rectangle (1, 1.8);
\node[anchor=north west, inner sep=3pt, text=accent] at (0, 1.2) {\scriptsize \textbf{Letzte 10\,\% des Codes $\rightarrow$ weitere 90\,\% der Zeit}};
\end{tikzpicture}
\vspace{0.5em}
## Teamleitung
::: columns
:::: { .column width=33% }
\begin{block}{Lean beats Perfect}
\scriptsize Weniger bauen, dafür fertig stellen.
\end{block}
:::: column
left
::::
:::: { .column width=33% }
\begin{block}{Environment First}
\scriptsize Zielumgebung testen, nicht nur lokal.
\end{block}
:::: column
right
::::
:::: { .column width=33% }
\begin{block}{Fragen ist Architektur}
\scriptsize Wer früh fragt, spart später Monate.
\end{block}
::::
:::
:::
## Fazit

View File

@@ -2,49 +2,9 @@
## Individueller Teil: Florian Edlmayer
\vspace{0.8em}
\begin{center}
\begin{tikzpicture}
% ── Card 1: Datensicherheit ────────────────────────────────────────
\fill[rounded corners=6pt, fill=orange!8] (0,0) rectangle (3.4,-3.0);
\draw[rounded corners=6pt, orange, line width=1.8pt] (0,0) rectangle (3.4,-3.0);
\begin{scope}
\clip[rounded corners=6pt] (0,0) rectangle (3.4,-3.0);
\fill[orange] (0,0) rectangle (3.4,-0.85);
\end{scope}
\node[text=white, font=\small\bfseries, align=center] at (1.7,-0.425)
{\faShieldAlt\ \ Datensicherheit};
\node[font=\small, align=center, text width=3.0cm] at (1.7,-1.95)
{DSGVO-konform \& verschlüsselt};
% ── Card 2: Backup-Systeme ─────────────────────────────────────────
\fill[rounded corners=6pt, fill=orange!8] (3.8,0) rectangle (7.2,-3.0);
\draw[rounded corners=6pt, orange, line width=1.8pt] (3.8,0) rectangle (7.2,-3.0);
\begin{scope}
\clip[rounded corners=6pt] (3.8,0) rectangle (7.2,-3.0);
\fill[orange] (3.8,0) rectangle (7.2,-0.85);
\end{scope}
\node[text=white, font=\small\bfseries, align=center] at (5.5,-0.425)
{\faDatabase\ \ Backup-Systeme};
\node[font=\small, align=center, text width=3.0cm] at (5.5,-1.95)
{Automatisch, täglich \& zuverlässig};
% ── Card 3: Premium-Bereich ────────────────────────────────────────
\fill[rounded corners=6pt, fill=orange!8] (7.6,0) rectangle (11.0,-3.0);
\draw[rounded corners=6pt, orange, line width=1.8pt] (7.6,0) rectangle (11.0,-3.0);
\begin{scope}
\clip[rounded corners=6pt] (7.6,0) rectangle (11.0,-3.0);
\fill[orange] (7.6,0) rectangle (11.0,-0.85);
\end{scope}
\node[text=white, font=\small\bfseries, align=center] at (9.3,-0.425)
{\faStar\ \ Premium-Bereich};
\node[font=\small, align=center, text width=3.0cm] at (9.3,-1.95)
{Exklusiv, motivierend \& sicher};
\end{tikzpicture}
\end{center}
- **Datensicherheit** DSGVO-konform & verschlüsselt
- **Backup-Systeme** Automatisch, täglich & zuverlässig
- **Premium-Bereich** Exklusiv, motivierend & sicher
---
@@ -63,77 +23,19 @@
---
## Eingesetzte Technologien
\vspace{1em}
\begin{columns}[c]
\begin{column}{0.33\textwidth}
\centering
\includegraphics[height=2.2cm]{image-1.png}\\[0.5em]
{\large\textbf{\color{accent}PostgreSQL}}\\[0.3em]
{\small Relationale Datenbank\\für strukturierte Datenspeicherung}
\end{column}
\begin{column}{0.33\textwidth}
\centering
\includegraphics[height=2.2cm]{image-6.png}\\[0.5em]
{\large\textbf{\color{accent}LinkedIn OAuth 2.0}}\\[0.3em]
{\small Sichere Authentifizierung\\ohne eigene Passwortverwaltung}
\end{column}
\begin{column}{0.33\textwidth}
\centering
\includegraphics[height=2.2cm]{image-5.png}\\[0.5em]
{\large\textbf{\color{accent}Bash}}\\[0.3em]
{\small Automatisierte Skripte\\für Linux Cronjobs}
\end{column}
\end{columns}
- **Datenbanksystem**: PostgreSQL
- **Authentifizierung**: OAuth 2.0 (LinkedIn)
- **Scripting & Automation**: Bash-Skripte für Linux Cronjobs
---
## DSGVO & Datenschutz
- **Rechtliche Basis**: Einhaltung von DSGVO & DSG.
- **Umsetzung**:
\begin{center}
\begin{tikzpicture}[
node distance=0.5cm,
stepnode/.style={rectangle, rounded corners=3pt, minimum width=4.2cm, minimum height=2.2cm, draw, line width=1pt, fill=white, inner sep=2pt},
iconnode/.style={circle, minimum size=0.8cm, fill=gray!5},
titlenode/.style={align=center, font=\scriptsize\bfseries},
arrow/.style={-latex, line width=1.5pt, color=accent!60}
]
% Obere Reihe
\node[stepnode, draw=gray] (n1) at (0,0) {};
\node[stepnode, draw=green!60!black, right=of n1] (n2) {};
% Untere Reihe
\node[stepnode, draw=blue!60!black, below=of n1] (n3) {};
\node[stepnode, draw=orange, below=of n2] (n4) {};
% Icons obere Reihe
\node[iconnode] at (n1.north) [yshift=-0.7cm] {\color{gray}\small\faFileAlt};
\node[iconnode] at (n2.north) [yshift=-0.7cm] {\color{green!60!black}\small\faFilter};
% Icons untere Reihe
\node[iconnode] at (n3.north) [yshift=-0.7cm] {\color{blue!60!black}\small\faLock};
\node[iconnode] at (n4.north) [yshift=-0.7cm] {\color{orange}\small\faUserShield};
% Labels
\node[titlenode] at (n1.center) [yshift=-0.2cm] {Datenschutz-\\erkl\"{a}rung};
\node[titlenode] at (n2.center) [yshift=-0.2cm] {Daten-\\minimierung};
\node[titlenode] at (n3.center) [yshift=-0.2cm] {Vertrau-\\lichkeit};
\node[titlenode] at (n4.center) [yshift=-0.2cm] {Betroffenen-\\rechte};
% Pfeile: → rechts oben, ↓ rechts, → rechts unten
\draw[arrow] (n1) -- (n2);
\draw[arrow] (n2) -- (n4);
\draw[arrow] (n3) -- (n4);
\end{tikzpicture}
\end{center}
- **Datenschutzerklärung**: Rechtskonform integriert.
- **Datenminimierung**: Nur zwingend benötigte Daten.
- **Vertraulichkeit**: TLS/HTTPS & lokales Austria-Hosting.
- **Betroffenenrechte**: Auskunft & Löschung garantiert.
---
@@ -141,9 +43,7 @@
- **Problem**: Datenverlust (Hardware, Software, Cyberangriffe).
- **Lösung**: Vollautomatisiertes Backup-Skript.
\vspace{2em}
![](image.png)
![alt text](image-4.png)
---
@@ -164,7 +64,7 @@
- Abbau von Registrierungshürden.
- Keine sensiblen Passwörter im eigenen System.
![](Images/oauth-flow-new.png){width=20em}
![Ablauf der OAuth-Authentifizierung](Images/oauth-flow-new.png)
---
@@ -178,7 +78,7 @@
---
## Der Premium-Bereich (2)
![](./Images/images/florian/image-3.png)
![alt text](image-3.png)
**Datensparsame Mitgliedersuche & Kontaktfunktion:**
![Mitgliedersuche und Kontaktfunktion für Premium-Mitglieder](../Diplomarbeitsbuch/images/04-Florian/premium-mitglieder-suche.png)

View File

@@ -7,8 +7,7 @@
- Oqtane-Theme
- Hall-of-Fame-Modul
- Anmeldetool
- **Ziel**:
- Moderne, responsive Website für den SZU Absolventenverein
- **Ziel**: Moderne, responsive Website für den HTL-Absolventenverein
---
@@ -51,10 +50,10 @@
::: columns
:::: column
- EigenNavigation (Bootstrap-Komponenten haben nicht gepasst).
- EigenNavigation (bootstrap Komponenten haben nicht gepasst ).
- Systemseiten per LINQ ausblenden.
- Responsive CSSMediaQueries + reines CSSBurgerMenu.
- CookieConsent (erforderlich für DSGVO-Konformität und Gesamtheit der Website).
- CookieConsent (erforderlich für dsgvo konformität und gesamtheit der website ).
::::
:::: column
@@ -78,7 +77,7 @@
:::: column
\begin{tikzpicture}
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/HallOfFamePdfNeuBesser.png}};
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/HallOfFameBeispiel.png}};
\end{tikzpicture}
::::
@@ -118,89 +117,44 @@
---
## Anmeldetool
\vspace{1cm}
\begin{tikzpicture}[remember picture, overlay]
\node at (current page.center) {
\begin{tabular}{@{}c@{\hspace{4mm}}c@{}}
\begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{UI}, width=6.5cm, height=2cm, valign=center]
\centering Ja/Nein-Buttons (grün/rot)
\end{tcolorbox}
&
\begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{Live-Feedback}, width=6.5cm, height=2cm, valign=center]
\centering Sofort via Blazor
\end{tcolorbox}
\\[3mm]
\begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{Mobile}, width=6.5cm, height=2cm, valign=center]
\centering Sauberes Touch-Handling
\end{tcolorbox}
&
\begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{Architektur}, width=6.5cm, height=2cm, valign=center]
\centering UI \& Backend-API getrennt
\end{tcolorbox}
\end{tabular}
};
\end{tikzpicture}
- **UI**: Ja/NeinButtons (grün/rot)
- **LiveFeedback**: Sofortige Statusänderung via Blazor
- **Mobile**: Sauberes Touch-Handling
- **Architektur**: UI & Backend-API getrennt
---
## Herausforderungen & Lösungen
\vspace{5mm}
\begin{tikzpicture}[remember picture, overlay,
problem/.style={rectangle, rounded corners=3pt, draw=red!60!black, fill=red!8, minimum width=5cm, minimum height=1.4cm, align=center, font=\small},
solution/.style={rectangle, rounded corners=3pt, draw=green!60!black, fill=green!8, minimum width=5cm, minimum height=1.4cm, align=center, font=\small},
header/.style={font=\small\bfseries\color{gray!70}}
]
% Spalten-Header
\node[header] at ([xshift=-2.5cm, yshift=2.2cm]current page.center) {Herausforderung};
\node[header] at ([xshift=2.5cm, yshift=2.2cm]current page.center) {Lösung};
% Reihe 1
\node[problem] at ([xshift=-2.5cm, yshift=0.9cm]current page.center) (p1) {$\triangle$\;\textbf{Plattformwechsel}\\[-1mm]{\scriptsize Windows $\rightarrow$ macOS}};
\node[solution] at ([xshift=2.5cm, yshift=0.9cm]current page.center) (s1) {\checkmark\;\textbf{Visual Studio Code}\\[-1mm]{\scriptsize Plattformübergreifend}};
% Reihe 2
\node[problem] at ([xshift=-2.5cm, yshift=-1.1cm]current page.center) (p2) {$\triangle$\;\textbf{Kein CMS verfügbar}\\[-1mm]{\scriptsize Sommer 2025, Event steht an}};
\node[solution] at ([xshift=2.5cm, yshift=-1.1cm]current page.center) (s2) {\checkmark\;\textbf{Node.js/HTML}\\[-1mm]{\scriptsize Übergangslösung}};
% Reihe 3
\node[problem] at ([xshift=-2.5cm, yshift=-3.1cm]current page.center) (p3) {$\triangle$\;\textbf{UI-Fehler am Handy}\\[-1mm]{\scriptsize Clipping-Probleme}};
\node[solution] at ([xshift=2.5cm, yshift=-3.1cm]current page.center) (s3) {\checkmark\;\textbf{Testen und Anpassen}\\[-1mm]{\scriptsize Debuggen und Verbessern der UI}};
\end{tikzpicture}
- **Plattformwechsel** Windows → macOS
- Oqtane stark an Windows gebunden
-**Visual Studio Code** als plattformübergreifende Lösung
- **Keine funktionsfähige Website** (Sommer 2025)
- Kurz vor einem Event, kein funktionierendes CMS
- → Schnelle **Node.js/HTML-Übergangslösung** sicherte Event-Anmeldung
---
## Learnings
\vspace{1cm}
\begin{tikzpicture}[remember picture, overlay,
every node/.style={font=\small},
branch/.style={thick, accent},
cat/.style={rectangle, rounded corners=3pt, draw=accent, fill=accent!15, font=\small\bfseries, minimum height=7mm, align=center},
item/.style={font=\scriptsize, align=left}
]
\node[circle, draw=accent, fill=accent!20, font=\bfseries, minimum size=1.5cm] at (current page.center) (center) {Learnings};
% Technisch - links
\node[cat] at ([xshift=-3.5cm, yshift=0.8cm]current page.center) (tech) {Technisch};
\draw[branch] (center) -- (tech);
\node[item, anchor=east] at ([xshift=-1mm, yshift=5mm]tech.west) {Git};
\node[item, anchor=east] at ([xshift=-1mm]tech.west) {CSS-Flexbox};
\node[item, anchor=east] at ([xshift=-1mm, yshift=-5mm]tech.west) {Blazor};
% Methodisch - rechts oben
\node[cat] at ([xshift=3.5cm, yshift=0.8cm]current page.center) (meth) {Methodisch};
\draw[branch] (center) -- (meth);
\node[item, anchor=west] at ([xshift=1mm, yshift=3mm]meth.east) {Aufgaben-};
\node[item, anchor=west] at ([xshift=1mm, yshift=-3mm]meth.east) {verteilung};
\node[item, anchor=west] at ([xshift=1mm, yshift=-9mm]meth.east) {Meetings};
% Persönlich - unten
\node[cat] at ([yshift=-2cm]current page.center) (pers) {Persönlich};
\draw[branch] (center) -- (pers);
\node[item] at ([yshift=-7mm]pers.south) {Eigeninitiative \& Verantwortung};
\begin{tikzpicture}[remember picture, overlay]
\node at (current page.center) {
\renewcommand{\arraystretch}{1.5}
\begin{tabular}{c c c}
\textbf{Technisch} & \textbf{Methodisch} & \textbf{Persönlich} \\
\hline
Git & Aufgabenverteilung & Eigeninitiative \\
CSS-Flexbox & Regelmäßige Meetings & Verantwortung \\
Blazor & & \\
\end{tabular}
};
\end{tikzpicture}
---
## Fazit & Ausblick
- **Ergebnis**:
- Theme final & mobil-optimiert
- Hall of Fame funktionsfähig
- Anmeldetool einsatzbereit

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

View File

Before

Width:  |  Height:  |  Size: 352 KiB

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -1,6 +1,6 @@
\cleardoublepage
# Adam Gaiswinkler
# Adam Gaiswinklerr
## Einleitung des individuellen Teils