Compare commits

...

21 Commits

Author SHA1 Message Date
2bfede6112 Neue Bilder für technologie 2026-04-21 20:07:50 +02:00
ae5ecf8564 Neues Image für technlogie 2026-04-21 18:00:36 +02:00
48b6193507 Eingesetze Technologien wurde neu gemacht 2026-04-21 16:52:07 +02:00
d2c877fe42 Neuste Änderung DSGVO Folie 2026-04-21 16:37:14 +02:00
e065b1f6ff Merge branch 'main' of https://git.kocoder.xyz/Diplomarbeit-Absolventenverein/pm 2026-04-21 16:21:29 +02:00
6a6786f6bc neue Version 2026-04-21 16:20:38 +02:00
803bdb234a bild hinzugefügt 2026-04-21 15:29:58 +02:00
e30c4086e2 Abstand bei Backup- & Restore Systeme hinzugefügt 2026-04-21 15:26:35 +02:00
9f827889f9 Unnötige Überschrift entfernen. 2026-04-21 15:26:35 +02:00
a7d0f34a14 Von Commit zu Paket: Kontrast in der Grafik erhöhen 2026-04-21 15:26:35 +02:00
e4dc1dc97c Merge remote-tracking branch 'origin/main' 2026-04-21 15:23:32 +02:00
522e60793a neuste version 2026-04-21 15:21:35 +02:00
4518e8142e Update 2026-04-21 11:09:22 +02:00
8bde5bc89b neue Version 2026-04-21 11:01:02 +02:00
d57913c339 neue Grafik 2026-04-21 10:42:30 +02:00
aa983da15d neue änderung 2026-04-21 09:26:09 +02:00
dfec681d34 BULK 2026-04-21 08:52:22 +02:00
1e5696cd50 Move all Modules to a single slide 2026-04-21 08:51:25 +02:00
bafe030e25 SOLID Grafik in der Softwarearchitektur Slide 2026-04-21 08:49:55 +02:00
62a6dd1fe3 Update: Infrastructure Slide 2026-04-21 08:46:15 +02:00
b975d4e270 neues desing 2026-04-21 00:45:42 +02:00
36 changed files with 397 additions and 82 deletions

View File

@@ -33,13 +33,14 @@
\usepackage{pgfplots} \usepackage{pgfplots}
\usepackage{pgfplotstable} \usepackage{pgfplotstable}
% \usepackage{fontawesome} % \usepackage{fontawesome}
\usepackage{fontawesome5}
\usepackage{tikzpingus} \usepackage{tikzpingus}
\usepackage{tikzducks} \usepackage{tikzducks}
\usepackage{pdfpc} \usepackage{pdfpc}
\usepackage{amsmath} \usepackage{amsmath}
\usepgfplotslibrary{dateplot} \usepgfplotslibrary{dateplot}
\usetikzlibrary{shapes,tikzmark} \usetikzlibrary{shapes,tikzmark,positioning,shapes.geometric}
\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}} \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} \def\info#1{\begingroup\color{gray}\scriptsize#1\endgroup}

View File

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

View File

@@ -58,48 +58,214 @@
:::: ::::
::: :::
\vfill
## CI/CD \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: \vfill
<!-- ![](./Images/konstantin/tech_stack_logos.png){ width=100% } -->
- Gitea Actions ---
- Debian Packages (.deb)
- Code-Reviewing:
- KI
- Git-Flow
## Softwarearchitektur ```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}
- Open-Closed Principle - Open-Closed Principle
- Strategy Pattern - Dependency Injection (IServiceProvider)
- Dependency Injection - Repository-Pattern (EntityFramework)
## Technischer Vergleich
Bisherige Erfahrungen: ## Module
- Go
- Typescript
- GRPC (interprozess Kommunikation)
Untersuchungsgebiete:
- Typisierung
- Konsistenz
## Teamleitung
::: columns ::: columns
:::: column :::: column
left **Admin Module:**
::::
- Mass Mailer
- Token Lifetime
- Report System
**Allgemeine Module:**
- Event Registration
- Black Board
::::
:::: column :::: column
right ![](./Images/images/konstantin/ReportingSystem.png)
:::: ::::
::: :::
## Fazit ## 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
::::
:::
![Gitea Board](./Images/images/konstantin/GiteaIssues-TaskBoard.png){ width=60% }
## Was bleibt
\vspace{0.5em}
\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};
\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}
::: columns
:::: { .column width=33% }
\begin{block}{Lean beats Perfect}
\scriptsize Weniger bauen, dafür fertig stellen.
\end{block}
::::
:::: { .column width=33% }
\begin{block}{Environment First}
\scriptsize Zielumgebung testen, nicht nur lokal.
\end{block}
::::
:::: { .column width=33% }
\begin{block}{Fragen ist Architektur}
\scriptsize Wer früh fragt, spart später Monate.
\end{block}
::::
:::

View File

@@ -2,9 +2,49 @@
## Individueller Teil: Florian Edlmayer ## Individueller Teil: Florian Edlmayer
- **Datensicherheit** DSGVO-konform & verschlüsselt \vspace{0.8em}
- **Backup-Systeme** Automatisch, täglich & zuverlässig
- **Premium-Bereich** Exklusiv, motivierend & sicher \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}
--- ---
@@ -23,19 +63,77 @@
--- ---
## Eingesetzte Technologien ## Eingesetzte Technologien
- **Datenbanksystem**: PostgreSQL
- **Authentifizierung**: OAuth 2.0 (LinkedIn) \vspace{1em}
- **Scripting & Automation**: Bash-Skripte für Linux Cronjobs
\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}
--- ---
## DSGVO & Datenschutz ## DSGVO & Datenschutz
- **Rechtliche Basis**: Einhaltung von DSGVO & DSG. - **Rechtliche Basis**: Einhaltung von DSGVO & DSG.
- **Umsetzung**: - **Umsetzung**:
- **Datenschutzerklärung**: Rechtskonform integriert.
- **Datenminimierung**: Nur zwingend benötigte Daten. \begin{center}
- **Vertraulichkeit**: TLS/HTTPS & lokales Austria-Hosting. \begin{tikzpicture}[
- **Betroffenenrechte**: Auskunft & Löschung garantiert. 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}
--- ---
@@ -43,7 +141,9 @@
- **Problem**: Datenverlust (Hardware, Software, Cyberangriffe). - **Problem**: Datenverlust (Hardware, Software, Cyberangriffe).
- **Lösung**: Vollautomatisiertes Backup-Skript. - **Lösung**: Vollautomatisiertes Backup-Skript.
![alt text](image-4.png) \vspace{2em}
![](image.png)
--- ---
@@ -64,7 +164,7 @@
- Abbau von Registrierungshürden. - Abbau von Registrierungshürden.
- Keine sensiblen Passwörter im eigenen System. - Keine sensiblen Passwörter im eigenen System.
![Ablauf der OAuth-Authentifizierung](Images/oauth-flow-new.png) ![](Images/oauth-flow-new.png){width=20em}
--- ---
@@ -78,7 +178,7 @@
--- ---
## Der Premium-Bereich (2) ## Der Premium-Bereich (2)
![alt text](image-3.png) ![](./Images/images/florian/image-3.png)
**Datensparsame Mitgliedersuche & Kontaktfunktion:** **Datensparsame Mitgliedersuche & Kontaktfunktion:**
![Mitgliedersuche und Kontaktfunktion für Premium-Mitglieder](../Diplomarbeitsbuch/images/04-Florian/premium-mitglieder-suche.png) ![Mitgliedersuche und Kontaktfunktion für Premium-Mitglieder](../Diplomarbeitsbuch/images/04-Florian/premium-mitglieder-suche.png)

View File

@@ -7,7 +7,8 @@
- Oqtane-Theme - Oqtane-Theme
- Hall-of-Fame-Modul - Hall-of-Fame-Modul
- Anmeldetool - Anmeldetool
- **Ziel**: Moderne, responsive Website für den HTL-Absolventenverein - **Ziel**:
- Moderne, responsive Website für den SZU Absolventenverein
--- ---
@@ -50,10 +51,10 @@
::: columns ::: columns
:::: column :::: column
- EigenNavigation (bootstrap Komponenten haben nicht gepasst ). - EigenNavigation (Bootstrap-Komponenten haben nicht gepasst).
- Systemseiten per LINQ ausblenden. - Systemseiten per LINQ ausblenden.
- Responsive CSSMediaQueries + reines CSSBurgerMenu. - 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 :::: column
@@ -77,7 +78,7 @@
:::: column :::: column
\begin{tikzpicture} \begin{tikzpicture}
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/HallOfFameBeispiel.png}}; \node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/HallOfFamePdfNeuBesser.png}};
\end{tikzpicture} \end{tikzpicture}
:::: ::::
@@ -117,44 +118,89 @@
--- ---
## Anmeldetool ## Anmeldetool
- **UI**: Ja/NeinButtons (grün/rot)
- **LiveFeedback**: Sofortige Statusänderung via Blazor
- **Mobile**: Sauberes Touch-Handling
- **Architektur**: UI & Backend-API getrennt
---
## Herausforderungen & Lösungen
- **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} \vspace{1cm}
\begin{tikzpicture}[remember picture, overlay] \begin{tikzpicture}[remember picture, overlay]
\node at (current page.center) { \node at (current page.center) {
\renewcommand{\arraystretch}{1.5} \begin{tabular}{@{}c@{\hspace{4mm}}c@{}}
\begin{tabular}{c c c} \begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{UI}, width=6.5cm, height=2cm, valign=center]
\textbf{Technisch} & \textbf{Methodisch} & \textbf{Persönlich} \\ \centering Ja/Nein-Buttons (grün/rot)
\hline \end{tcolorbox}
Git & Aufgabenverteilung & Eigeninitiative \\ &
CSS-Flexbox & Regelmäßige Meetings & Verantwortung \\ \begin{tcolorbox}[colback=accent!5, colframe=accent, arc=3pt, title=\textbf{Live-Feedback}, width=6.5cm, height=2cm, valign=center]
Blazor & & \\ \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{tabular}
}; };
\end{tikzpicture} \end{tikzpicture}
--- ---
## Fazit & Ausblick ## Herausforderungen & Lösungen
- **Ergebnis**:
- Theme final & mobil-optimiert \vspace{5mm}
- Hall of Fame funktionsfähig \begin{tikzpicture}[remember picture, overlay,
- Anmeldetool einsatzbereit 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}
---
## 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};
\end{tikzpicture}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 352 KiB

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 44 KiB

BIN
Defensio/image-5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
Defensio/image-6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 86 KiB