Compare commits
76 Commits
1e230b67e4
...
gaisi-patc
| Author | SHA1 | Date | |
|---|---|---|---|
| c50580733c | |||
| 8ce0d4e186 | |||
| c6ebf25659 | |||
| 2bb2161e2f | |||
| 7d570e9945 | |||
| 65983a2f38 | |||
| a27136bbe3 | |||
| 764b18e41a | |||
| b07fc29512 | |||
| f6718139cc | |||
| b944048df3 | |||
| 7eb4e0761e | |||
| 1bfd8b3a96 | |||
| 020707c380 | |||
| e623ca9340 | |||
| 76e0d6b65f | |||
| b408cb0d0f | |||
| 23fe2c0863 | |||
| dd8eb9d269 | |||
| c8f95f5169 | |||
| 450509008d | |||
| c780145790 | |||
| 9d96f7eafc | |||
| eb9b4c4c1f | |||
| 2cd24abcde | |||
| c030d304f5 | |||
| b950ec6d66 | |||
| c52d5b3303 | |||
| f87090357c | |||
| 8bedef1f85 | |||
| c966caf7f9 | |||
| c19ae8a982 | |||
| 26d56c0d24 | |||
| f5223405a5 | |||
| 7ab7e9e25d | |||
| 370942efe1 | |||
| 490912aaca | |||
| 6d15ab6b0a | |||
| aa1353adce | |||
| bbb2f94944 | |||
| f25d6be858 | |||
| b2d89e7830 | |||
| c4d0bb1a9a | |||
| 2aeb5f2f8f | |||
| 8a150208dd | |||
| 6798cbf877 | |||
| 63f9f721a2 | |||
| ea9479628c | |||
| 4ddb7d8904 | |||
| aa704577ad | |||
| 15eb9d9d5e | |||
| f11fcb68fe | |||
| 37262ff470 | |||
| 8da8374a1b | |||
| d397f0cd60 | |||
| b450fd6475 | |||
| 6789fa6f9d | |||
| 2061cdc218 | |||
| 6b0c4f7884 | |||
| ad47997aab | |||
| b337833410 | |||
| 69d898bc86 | |||
| 29fda2257b | |||
| caedd3ba9e | |||
| 710667481b | |||
| 2e4353bf8e | |||
| a38cbd0dfe | |||
| 9aad0c5394 | |||
| e774cec6d5 | |||
| 9a0cb1ffa0 | |||
| 4e0861147a | |||
| 35a0ebd15a | |||
| 04bc48133b | |||
| 0551792aca | |||
| efaf02156c | |||
| 6e7d30b1d6 |
45
.gitea/workflows/create-presentation.yml
Normal file
@@ -0,0 +1,45 @@
|
||||
name: build-debian-package
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "doc-*"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Convert to PDF
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: "Git clone"
|
||||
run: git clone ${{ gitea.server_url }}/${{ gitea.repository }}.git .
|
||||
- name: "Git checkout"
|
||||
run: git checkout "${{ gitea.sha }}"
|
||||
- name: "Submodules auschecken"
|
||||
run: git submodule update --init
|
||||
- name: "Debug"
|
||||
run: ls -la ./Defensio
|
||||
- uses: docker://git.kocoder.xyz/docker/ga-pandoc:d2995fb914e313703da2c7754763e7fa01dae88f
|
||||
name: Pandoc
|
||||
with:
|
||||
env: TEXINPUTS=./Defensio:./Defensio/libs/awesome-beamer/:./Defensio/libs/smile/
|
||||
command: pandoc
|
||||
args: >-
|
||||
/workspace/Diplomarbeit-Absolventenverein/pm/Defensio/01_Praesentation_Allgemein.md
|
||||
/workspace/Diplomarbeit-Absolventenverein/pm/Defensio/02_Praesentation_Konstantin_Hintermayer.md
|
||||
/workspace/Diplomarbeit-Absolventenverein/pm/Defensio/03_Praesentation_Florian_Edlmayer.md
|
||||
/workspace/Diplomarbeit-Absolventenverein/pm/Defensio/04_Praesentation_Adam_Gaiswinkler.md
|
||||
-t beamer
|
||||
--template /workspace/Diplomarbeit-Absolventenverein/pm/Defensio/00_preamble.tex
|
||||
--pdf-engine=pdflatex
|
||||
--slide-level=2
|
||||
--number-sections
|
||||
--lua-filter /workspace/Diplomarbeit-Absolventenverein/pm/_extensions/diagram/diagram.lua
|
||||
--syntax-definition /workspace/Diplomarbeit-Absolventenverein/pm/_extensions/razor/razor.xml
|
||||
--syntax-definition /workspace/Diplomarbeit-Absolventenverein/pm/_extensions/nginx/nginx.xml
|
||||
-o defensio.pdf
|
||||
- name: "Create release"
|
||||
uses: akkuman/gitea-release-action@v1
|
||||
with:
|
||||
files: |-
|
||||
./Defensio/defensio.pdf
|
||||
./Defensio/Images/*
|
||||
@@ -1,8 +1,6 @@
|
||||
name: Word Count
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main", "master" ]
|
||||
pull_request:
|
||||
branches: [ "main", "master" ]
|
||||
|
||||
|
||||
3
.gitignore
vendored
@@ -1 +1,2 @@
|
||||
diplomarbeitsbuch.pdf
|
||||
diplomarbeitsbuch.pdf
|
||||
defensio.pdf
|
||||
6
.gitmodules
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
[submodule "Defensio/libs/awesome-beamer"]
|
||||
path = Defensio/libs/awesome-beamer
|
||||
url = https://git.kocoder.xyz/kocoded/awesome-beamer
|
||||
[submodule "Defensio/libs/smile"]
|
||||
path = Defensio/libs/smile
|
||||
url = https://codeberg.org/LukasPietzschmann/smile
|
||||
34
Artikel_Schulhomepage.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# AlumniHub – Die neue digitale Plattform des Absolventenvereins
|
||||
|
||||
Im Rahmen ihrer Diplomarbeit an der HTL SZU Ungargasse haben **Konstantin Hintermayer**, **Florian Edlmayer** und **Adam Gaiswinkler** (5BHITN, Schuljahr 2025/26) eine moderne Webanwendung für den Absolventenverein entwickelt: den **AlumniHub**.
|
||||
|
||||
## Worum geht es?
|
||||
|
||||
Der Absolventenverein der HTL Ungargasse verwaltet rund 300 Alumni – bisher über Excel-Tabellen und abgelaufene Softwarelizenzen. Das Diplomarbeitsteam hat eine zentrale Plattform geschaffen, die Mitgliederverwaltung, Event-Organisation und Kommunikation unter einem Dach vereint.
|
||||
|
||||
## Was kann der AlumniHub?
|
||||
|
||||
- **Anmeldetool für Treffen** – Veranstaltungen erstellen, Einladungen verschicken und Anmeldungen verwalten
|
||||
- **Hall of Fame** – Absolventen können ihre Erfolge präsentieren, inklusive PDF-Export
|
||||
- **Schwarzes Brett** – Ein interaktiver Feed für Neuigkeiten, Events und Jobangebote
|
||||
- **Premiumbereich** – Exklusive Inhalte für Premiummitglieder mit eigenem Freigabe-Workflow
|
||||
- **LinkedIn-Login** – Sichere Anmeldung über OAuth 2.0
|
||||
- **DSGVO-konform** – Datenschutz von Anfang an mitgedacht
|
||||
|
||||
## Die Technik dahinter
|
||||
|
||||
Die Anwendung basiert auf dem Content-Management-System **Oqtane** mit **ASP.NET Core** und **Blazor**. Gehostet wird das Ganze auf einem Linux-Server mit PostgreSQL-Datenbank – betrieben in der Schulinfrastruktur. Gearbeitet wurde agil nach **Scrum** in zweiwöchigen Sprints.
|
||||
|
||||
## Das Team
|
||||
|
||||
| Name | Schwerpunkt |
|
||||
| :---------------------- | :----------------------------------------------------------------- |
|
||||
| Konstantin Hintermayer | Projektleitung, Serverinfrastruktur, Schwarzes Brett, Auswertungen |
|
||||
| Florian Edlmayer | Premiumbereich, LinkedIn-OAuth, Datenschutz (DSGVO) |
|
||||
| Adam Gaiswinkler | Anmeldetool, Hall of Fame, CMS-Konfiguration, UI/UX-Design |
|
||||
|
||||
**Betreuung:** Ing. Thomas Gürth & Johannes Kreuzer
|
||||
|
||||
---
|
||||
|
||||
*Das Projektteam bedankt sich bei allen Unterstützern – insbesondere beim Absolventenverein als Auftraggeber und bei der Schule für die Bereitstellung der Infrastruktur.*
|
||||
102
Defensio/00_preamble.tex
Normal file
@@ -0,0 +1,102 @@
|
||||
\documentclass[aspectratio=169,t]{beamer}
|
||||
|
||||
\providecommand{\tightlist}{%
|
||||
\setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
|
||||
\makeatletter
|
||||
\newsavebox\pandoc@box
|
||||
\newcommand*\pandocbounded[1]{% scales image to fit the slide if it's too large
|
||||
\sbox\pandoc@box{#1}%
|
||||
\ifdim\wd\pandoc@box>\linewidth
|
||||
\makebox[\linewidth][c]{\resizebox{\linewidth}{!}{\usebox\pandoc@box}}%
|
||||
\else
|
||||
\usebox\pandoc@box
|
||||
\fi
|
||||
}
|
||||
\makeatother
|
||||
|
||||
\usepackage[T1]{fontenc}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{lmodern}
|
||||
\usepackage{multimedia}
|
||||
\usepackage{graphicx}
|
||||
|
||||
\newcommand{\imagepath}{Images}
|
||||
|
||||
\definecolor{orange}{HTML}{f87a01}
|
||||
\usetheme[german, color, coloraccent=orange, notoc]{awesome}
|
||||
\makeatletter
|
||||
\newcommand{\nonumberson}{\awesome@nonumbersinframetitletrue}
|
||||
\newcommand{\nonumbersoff}{\awesome@nonumbersinframetitlefalse}
|
||||
\makeatother
|
||||
|
||||
% \usepackage{firamath-otf}
|
||||
\usepackage{pgfplots}
|
||||
\usepackage{pgfplotstable}
|
||||
% \usepackage{fontawesome}
|
||||
\usepackage{tikzpingus}
|
||||
\usepackage{tikzducks}
|
||||
\usepackage{pdfpc}
|
||||
\usepackage{amsmath}
|
||||
|
||||
\usepgfplotslibrary{dateplot}
|
||||
\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}
|
||||
|
||||
\newcommand<>{\talknote}[1]{\only#2{\pdfpcnote{- #1}\relax}}
|
||||
|
||||
\makeatletter
|
||||
\newlength\beamerleftmargin
|
||||
\setlength\beamerleftmargin{\Gm@lmargin}
|
||||
\makeatother
|
||||
|
||||
|
||||
% \addbibresource{refs.bib}
|
||||
|
||||
% \addtobeamertemplate{title page}{}{
|
||||
% \begin{tikzpicture}[overlay, remember picture]
|
||||
% \node[anchor=south east,outer sep=0pt] at (current page.south east) {\fontsize{3}{3}\selectfont\color{white}This image was generated by AI};
|
||||
% \end{tikzpicture}
|
||||
% }
|
||||
|
||||
\pgfplotsset{
|
||||
every axis legend/.append style={style={roundednode,fill=accent!10,lcr}},
|
||||
every axis plot/.append style={lw,lcr},
|
||||
}
|
||||
|
||||
\title[AlumniHub]{AlumniHub}
|
||||
\subtitle{Web-Entwicklung für den Absolventenverein}
|
||||
\author{Konstantin Hintermayer \\ Florian Edlmayer \\ Adam Gaiswinkler}
|
||||
\email{}
|
||||
\institute{Schulzentrum HTL HAK Ungargasse}
|
||||
\uni{Schulzentrum HTL HAK Ungargasse}
|
||||
\location{Wien}
|
||||
\background{./Images/images/background/title-slide/background.png}
|
||||
\date{22. April 2026}
|
||||
|
||||
|
||||
\AtBeginSection[]
|
||||
{
|
||||
\begingroup
|
||||
\nonumberson
|
||||
\begin{frame}[c,noframenumbering,plain]{Agenda}
|
||||
\tableofcontents[currentsection]
|
||||
\end{frame}
|
||||
\endgroup
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\maketitle
|
||||
|
||||
\begingroup
|
||||
\nonumberson
|
||||
\begin{frame}[c,noframenumbering,plain]{Agenda}
|
||||
\tableofcontents
|
||||
\end{frame}
|
||||
\endgroup
|
||||
|
||||
$body$
|
||||
|
||||
\end{document}
|
||||
11
Defensio/01_Praesentation_Allgemein.md
Normal file
@@ -0,0 +1,11 @@
|
||||
# Allgemein Alumnihub
|
||||
|
||||
---
|
||||
|
||||
## {.plain}
|
||||
|
||||
\begin{tikzpicture}[remember picture,overlay]
|
||||
\node[anchor=center] at (current page.center) {
|
||||
\movie[width=\paperwidth, height=\paperheight, poster, showcontrols=false, autostart]{}{\imagepath/video/introduction/sample-10s.mp4}
|
||||
};
|
||||
\end{tikzpicture}
|
||||
105
Defensio/02_Praesentation_Konstantin_Hintermayer.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Konstantin Hintermayer
|
||||
|
||||
## Rolle im Projekt
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
**Aufgabenbereiche**:
|
||||
|
||||
- Product Owner
|
||||
- Kundenschnittstelle
|
||||
- Infrastruktur & CI/CD
|
||||
|
||||
**Softwareentwicklung:**
|
||||
|
||||
- Event Registration
|
||||
- Black Board
|
||||
- Report System
|
||||
- Mass Mailer
|
||||
|
||||
::::
|
||||
|
||||
:::: column
|
||||
|
||||
\begin{tikzpicture}
|
||||
\clip (0,0) circle (3em);
|
||||
\node at (0,0) {\includegraphics[width=6em]{./Images/images/konstantin/profile.jpg}};
|
||||
\draw[accent, line width=3pt] (0,0) circle (3em);
|
||||
\end{tikzpicture}
|
||||
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
## Infrastruktur
|
||||
|
||||
::: columns
|
||||
:::: column
|
||||
|
||||
**Entwicklung:**
|
||||
|
||||
- **Gitea:** Versionskontrollsystem
|
||||
- **Wireguard:** VPN
|
||||
- **Docker:** Containerisierung
|
||||
- **GitHub:** Transfer
|
||||
- **Gitea Actions:** CI/CD
|
||||
|
||||
::::
|
||||
:::: column
|
||||
|
||||
**Produktion:**
|
||||
|
||||
- **Debian:** Betriebssystem
|
||||
- **NginX:** Reverse Proxy
|
||||
- **PostgreSQL:** Datenbank
|
||||
- **Oqtane:** CMS
|
||||
|
||||
::::
|
||||
:::
|
||||
|
||||
|
||||
## CI/CD
|
||||
|
||||
CI:
|
||||
|
||||
- Gitea Actions
|
||||
- Debian Packages (.deb)
|
||||
- Code-Reviewing:
|
||||
- KI
|
||||
- Git-Flow
|
||||
|
||||
## Softwarearchitektur
|
||||
|
||||
- Open-Closed Principle
|
||||
- Strategy Pattern
|
||||
- Dependency Injection
|
||||
|
||||
## Technischer Vergleich
|
||||
|
||||
Bisherige Erfahrungen:
|
||||
|
||||
- Go
|
||||
- Typescript
|
||||
- GRPC (interprozess Kommunikation)
|
||||
|
||||
Untersuchungsgebiete:
|
||||
|
||||
- Typisierung
|
||||
- Konsistenz
|
||||
|
||||
## Teamleitung
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
left
|
||||
::::
|
||||
|
||||
:::: column
|
||||
right
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
## Fazit
|
||||
96
Defensio/03_Praesentation_Florian_Edlmayer.md
Normal file
@@ -0,0 +1,96 @@
|
||||
# Florian Edlmayer
|
||||
|
||||
## Individueller Teil: Florian Edlmayer
|
||||
|
||||
- **Datensicherheit** – DSGVO-konform & verschlüsselt
|
||||
- **Backup-Systeme** – Automatisch, täglich & zuverlässig
|
||||
- **Premium-Bereich** – Exklusiv, motivierend & sicher
|
||||
|
||||
---
|
||||
|
||||
## Ausgangslage & Zielsetzung
|
||||
- **Ausgangssituation**:
|
||||
- Kein digitaler Vernetzungsraum für Absolventen.
|
||||
- Keine rechtskonforme Datenverwaltung (DSGVO).
|
||||
- Keine automatisierte Datensicherung vorhanden.
|
||||
- **Mein Beitrag**:
|
||||
- Datenschutz (DSGVO).
|
||||
- Automatisierte Backups & Restore.
|
||||
- LinkedIn-Login (OAuth 2.0).
|
||||
- Premium-Bereich.
|
||||
- **Nutzen**: Rechtssicherheit, Ausfallsicherheit, hohes Engagement.
|
||||
|
||||
---
|
||||
|
||||
## Eingesetzte Technologien
|
||||
- **Datenbanksystem**: PostgreSQL
|
||||
- **Authentifizierung**: OAuth 2.0 (LinkedIn)
|
||||
- **Scripting & Automation**: Bash-Skripte für Linux Cronjobs
|
||||
|
||||
---
|
||||
|
||||
## DSGVO & Datenschutz
|
||||
- **Rechtliche Basis**: Einhaltung von DSGVO & DSG.
|
||||
- **Umsetzung**:
|
||||
- **Datenschutzerklärung**: Rechtskonform integriert.
|
||||
- **Datenminimierung**: Nur zwingend benötigte Daten.
|
||||
- **Vertraulichkeit**: TLS/HTTPS & lokales Austria-Hosting.
|
||||
- **Betroffenenrechte**: Auskunft & Löschung garantiert.
|
||||
|
||||
---
|
||||
|
||||
## Backup- & Restore-Systeme (1)
|
||||
- **Problem**: Datenverlust (Hardware, Software, Cyberangriffe).
|
||||
- **Lösung**: Vollautomatisiertes Backup-Skript.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Backup- & Restore-Systeme (2)
|
||||
- **Speichermanagement (Retention)**:
|
||||
- Automatische Backup-Rotation.
|
||||
- Limit: Letzte 30 Tage (Speicherplatz-Optimierung).
|
||||
- **Restore-Skript**:
|
||||
- Kontrollierter Wiederherstellungsprozess.
|
||||
- Sicherheitsabfrage vor Überschreiben.
|
||||
- Backup als "Rückversicherung" vor Import.
|
||||
- DB-Neuanlage & automatischer Import.
|
||||
|
||||
---
|
||||
|
||||
## Authentifizierung mit LinkedIn (OAuth 2.0)
|
||||
- **Ziel**:
|
||||
- Abbau von Registrierungshürden.
|
||||
- Keine sensiblen Passwörter im eigenen System.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Der Premium-Bereich (1)
|
||||
**Zweck**: Motivation für aktives Mitglieder-Engagement.
|
||||
|
||||
{width=20em}
|
||||
|
||||
{width=20em}
|
||||
|
||||
---
|
||||
|
||||
## Der Premium-Bereich (2)
|
||||

|
||||
**Datensparsame Mitgliedersuche & Kontaktfunktion:**
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Fazit & Ausblick
|
||||
- **Erreichtes**:
|
||||
- DSGVO-konformer Datenschutz.
|
||||
- Hohe Ausfallsicherheit (automatisierte Bash-Backups).
|
||||
- Barrierefreier Zugang (LinkedIn-Login).
|
||||
- Echter Mehrwert durch Premium-Funktionen.
|
||||
- **Persönliche Learnings**:
|
||||
- Tiefes Verständnis für moderne Webtechnologien (ASP.NET, PostgreSQL, OAuth 2.0).
|
||||
- Agile Arbeitsweise mit Scrum stärkt Planung & Zeitmanagement.
|
||||
- Komplexe Projekte fördern Selbstorganisation & Problemlösungskompetenz.
|
||||
160
Defensio/04_Praesentation_Adam_Gaiswinkler.md
Normal file
@@ -0,0 +1,160 @@
|
||||
# Adam Gaiswinkler
|
||||
|
||||
## Individueller Teil: Adam Gaiswinkler
|
||||
**Entwicklung von CMS‑Modulen & Frontend-Design**
|
||||
|
||||
- **Schwerpunkt**:
|
||||
- Oqtane-Theme
|
||||
- Hall-of-Fame-Modul
|
||||
- Anmeldetool
|
||||
- **Ziel**: Moderne, responsive Website für den HTL-Absolventenverein
|
||||
|
||||
---
|
||||
|
||||
## Ausgangslage & Motivation
|
||||
- **Ausgangssituation**: Moderne Frontend‑Plattform für den Absolventenverein (responsive, neue Features).
|
||||
- **Persönliche Motivation**:
|
||||
- Team‑Verkleinerung (6 → 3) → mehr Verantwortung.
|
||||
- Projektidentifikation & Praxis‑Blazor/ASP.NET.
|
||||
- **Ziele**:
|
||||
- Oqtane‑Module (Anmeldetool, Hall‑of‑Fame).
|
||||
- Responsives UI/UX.
|
||||
|
||||
---
|
||||
|
||||
## Eingesetzte Technologien
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
- **Tech‑Stack**:
|
||||
- Bootstrap
|
||||
- Custom‑CSS
|
||||
- QuestPDF
|
||||
- Gitea
|
||||
- Visual Studio 2022 → Visual Studio Code (macOS).
|
||||
::::
|
||||
|
||||
:::: column
|
||||
\begin{tikzpicture}
|
||||
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.8\columnwidth]{Images/Technologien.png}};
|
||||
\end{tikzpicture}
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## Oqtane Theme
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
- Eigen‑Navigation (bootstrap Komponenten haben nicht gepasst ).
|
||||
- Systemseiten per LINQ ausblenden.
|
||||
- Responsive CSS‑Media‑Queries + reines CSS‑Burger‑Menu.
|
||||
- Cookie‑Consent (erforderlich für dsgvo konformität und gesamtheit der website ).
|
||||
::::
|
||||
|
||||
:::: column
|
||||
\begin{tikzpicture}
|
||||
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/BurgerMenuLiveDesign.png}};
|
||||
\end{tikzpicture}
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## Hall of Fame
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
- **Karten‑Grid**: Responsive Übersicht, Live‑Suche & Sortierung **in Echtzeit – kein Seitenreload** (Blazor).
|
||||
- **Detail‑Seite**: Glasmorphismus‑Design (halbtransparente Karten mit Blur-Effekt).
|
||||
::::
|
||||
|
||||
:::: column
|
||||
\begin{tikzpicture}
|
||||
\node[inner sep=0pt, rounded corners=5pt, clip] {\includegraphics[width=0.55\columnwidth]{Images/HallOfFameBeispiel.png}};
|
||||
\end{tikzpicture}
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## Hall of Fame – Workflow & Export
|
||||
|
||||
::: columns
|
||||
|
||||
:::: column
|
||||
- **Workflow**: Rich‑Text‑Editor, Bild‑Upload mit **Live-Vorschau** (max 5 MB), Status (Entwurf/Veröffentlicht) inkl. Eigentümer‑Check.
|
||||
- **PDF‑Export**: Professionelle Profil-PDFs server-seitig mit QuestPDF.
|
||||
- **Moderation**: Meldesystem über separates Interfaces‑Paket → saubere Logik-Trennung.
|
||||
::::
|
||||
|
||||
:::: column
|
||||
\begin{tikzpicture}[
|
||||
node distance=12mm,
|
||||
every node/.style={font=\small},
|
||||
state/.style={rectangle, rounded corners=3pt, draw=accent, fill=accent!10, minimum width=2.4cm, minimum height=8mm, align=center, font=\small\bfseries},
|
||||
arr/.style={->,>=stealth,thick,accent}
|
||||
]
|
||||
\node[coordinate] (start) {};
|
||||
\node[state, right=10mm of start] (draft) {Entwurf};
|
||||
\node[state, below=18mm of draft] (pub) {Veröffentlicht};
|
||||
\draw[arr] (start) -- node[above] {\scriptsize Erstellen} (draft);
|
||||
\draw[arr] (draft) to[out=135, in=45, looseness=4] node[above] {\scriptsize Speichern} (draft);
|
||||
\draw[arr, bend left=25] (draft) to node[right] {\scriptsize Veröffentlichen} (pub);
|
||||
\draw[arr, bend left=25] (pub) to node[left] {\scriptsize Zurückziehen} (draft);
|
||||
\end{tikzpicture}
|
||||
::::
|
||||
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## Anmeldetool
|
||||
- **UI**: Ja/Nein‑Buttons (grün/rot)
|
||||
- **Live‑Feedback**: 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}
|
||||
\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
|
||||
|
||||
BIN
Defensio/Images/BurgerMenuLiveDesign.png
Normal file
|
After Width: | Height: | Size: 40 KiB |
BIN
Defensio/Images/HallOfFame.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
Defensio/Images/HallOfFameBeispiel.png
Normal file
|
After Width: | Height: | Size: 2.7 MiB |
BIN
Defensio/Images/Technologien.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
Defensio/Images/images/background/title-slide/background.png
Normal file
|
After Width: | Height: | Size: 132 KiB |
86
Defensio/Images/images/konstantin/logos/debian.svg
Normal file
@@ -0,0 +1,86 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 10.0, SVG Export Plug-In . SVG Version: 3.0.0 Build 77) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
|
||||
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
|
||||
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
|
||||
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
|
||||
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
|
||||
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
|
||||
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
|
||||
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
|
||||
<!ENTITY ns_svg "http://www.w3.org/2000/svg">
|
||||
<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
|
||||
]>
|
||||
<svg
|
||||
xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;" i:viewOrigin="262 450" i:rulerOrigin="0 0" i:pageBounds="0 792 612 0"
|
||||
xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
|
||||
width="87.041" height="108.445" viewBox="0 0 87.041 108.445" overflow="visible" enable-background="new 0 0 87.041 108.445"
|
||||
xml:space="preserve">
|
||||
<metadata>
|
||||
<variableSets xmlns="&ns_vars;">
|
||||
<variableSet varSetName="binding1" locked="none">
|
||||
<variables></variables>
|
||||
<v:sampleDataSets xmlns="&ns_custom;" xmlns:v="&ns_vars;"></v:sampleDataSets>
|
||||
</variableSet>
|
||||
</variableSets>
|
||||
<sfw xmlns="&ns_sfw;">
|
||||
<slices></slices>
|
||||
<sliceSourceBounds y="341.555" x="262" width="87.041" height="108.445" bottomLeftOrigin="true"></sliceSourceBounds>
|
||||
</sfw>
|
||||
</metadata>
|
||||
<g id="Layer_1" i:layer="yes" i:dimmedPercent="50" i:rgbTrio="#4F008000FFFF">
|
||||
<g>
|
||||
<path i:knockout="Off" fill="#A80030" d="M51.986,57.297c-1.797,0.025,0.34,0.926,2.686,1.287
|
||||
c0.648-0.506,1.236-1.018,1.76-1.516C54.971,57.426,53.484,57.434,51.986,57.297"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M61.631,54.893c1.07-1.477,1.85-3.094,2.125-4.766c-0.24,1.192-0.887,2.221-1.496,3.307
|
||||
c-3.359,2.115-0.316-1.256-0.002-2.537C58.646,55.443,61.762,53.623,61.631,54.893"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M65.191,45.629c0.217-3.236-0.637-2.213-0.924-0.978
|
||||
C64.602,44.825,64.867,46.932,65.191,45.629"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M45.172,1.399c0.959,0.172,2.072,0.304,1.916,0.533
|
||||
C48.137,1.702,48.375,1.49,45.172,1.399"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M47.088,1.932l-0.678,0.14l0.631-0.056L47.088,1.932"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M76.992,46.856c0.107,2.906-0.85,4.316-1.713,6.812l-1.553,0.776
|
||||
c-1.271,2.468,0.123,1.567-0.787,3.53c-1.984,1.764-6.021,5.52-7.313,5.863c-0.943-0.021,0.639-1.113,0.846-1.541
|
||||
c-2.656,1.824-2.131,2.738-6.193,3.846l-0.119-0.264c-10.018,4.713-23.934-4.627-23.751-17.371
|
||||
c-0.107,0.809-0.304,0.607-0.526,0.934c-0.517-6.557,3.028-13.143,9.007-15.832c5.848-2.895,12.704-1.707,16.893,2.197
|
||||
c-2.301-3.014-6.881-6.209-12.309-5.91c-5.317,0.084-10.291,3.463-11.951,7.131c-2.724,1.715-3.04,6.611-4.227,7.507
|
||||
C31.699,56.271,36.3,61.342,44.083,67.307c1.225,0.826,0.345,0.951,0.511,1.58c-2.586-1.211-4.954-3.039-6.901-5.277
|
||||
c1.033,1.512,2.148,2.982,3.589,4.137c-2.438-0.826-5.695-5.908-6.646-6.115c4.203,7.525,17.052,13.197,23.78,10.383
|
||||
c-3.113,0.115-7.068,0.064-10.566-1.229c-1.469-0.756-3.467-2.322-3.11-2.615c9.182,3.43,18.667,2.598,26.612-3.771
|
||||
c2.021-1.574,4.229-4.252,4.867-4.289c-0.961,1.445,0.164,0.695-0.574,1.971c2.014-3.248-0.875-1.322,2.082-5.609l1.092,1.504
|
||||
c-0.406-2.696,3.348-5.97,2.967-10.234c0.861-1.304,0.961,1.403,0.047,4.403c1.268-3.328,0.334-3.863,0.66-6.609
|
||||
c0.352,0.923,0.814,1.904,1.051,2.878c-0.826-3.216,0.848-5.416,1.262-7.285c-0.408-0.181-1.275,1.422-1.473-2.377
|
||||
c0.029-1.65,0.459-0.865,0.625-1.271c-0.324-0.186-1.174-1.451-1.691-3.877c0.375-0.57,1.002,1.478,1.512,1.562
|
||||
c-0.328-1.929-0.893-3.4-0.916-4.88c-1.49-3.114-0.527,0.415-1.736-1.337c-1.586-4.947,1.316-1.148,1.512-3.396
|
||||
c2.404,3.483,3.775,8.881,4.404,11.117c-0.48-2.726-1.256-5.367-2.203-7.922c0.73,0.307-1.176-5.609,0.949-1.691
|
||||
c-2.27-8.352-9.715-16.156-16.564-19.818c0.838,0.767,1.896,1.73,1.516,1.881c-3.406-2.028-2.807-2.186-3.295-3.043
|
||||
c-2.775-1.129-2.957,0.091-4.795,0.002c-5.23-2.774-6.238-2.479-11.051-4.217l0.219,1.023c-3.465-1.154-4.037,0.438-7.782,0.004
|
||||
c-0.228-0.178,1.2-0.644,2.375-0.815c-3.35,0.442-3.193-0.66-6.471,0.122c0.808-0.567,1.662-0.942,2.524-1.424
|
||||
c-2.732,0.166-6.522,1.59-5.352,0.295c-4.456,1.988-12.37,4.779-16.811,8.943l-0.14-0.933c-2.035,2.443-8.874,7.296-9.419,10.46
|
||||
l-0.544,0.127c-1.059,1.793-1.744,3.825-2.584,5.67c-1.385,2.36-2.03,0.908-1.833,1.278c-2.724,5.523-4.077,10.164-5.246,13.97
|
||||
c0.833,1.245,0.02,7.495,0.335,12.497c-1.368,24.704,17.338,48.69,37.785,54.228c2.997,1.072,7.454,1.031,11.245,1.141
|
||||
c-4.473-1.279-5.051-0.678-9.408-2.197c-3.143-1.48-3.832-3.17-6.058-5.102l0.881,1.557c-4.366-1.545-2.539-1.912-6.091-3.037
|
||||
l0.941-1.229c-1.415-0.107-3.748-2.385-4.386-3.646l-1.548,0.061c-1.86-2.295-2.851-3.949-2.779-5.23l-0.5,0.891
|
||||
c-0.567-0.973-6.843-8.607-3.587-6.83c-0.605-0.553-1.409-0.9-2.281-2.484l0.663-0.758c-1.567-2.016-2.884-4.6-2.784-5.461
|
||||
c0.836,1.129,1.416,1.34,1.99,1.533c-3.957-9.818-4.179-0.541-7.176-9.994l0.634-0.051c-0.486-0.732-0.781-1.527-1.172-2.307
|
||||
l0.276-2.75C4.667,58.121,6.719,47.409,7.13,41.534c0.285-2.389,2.378-4.932,3.97-8.92l-0.97-0.167
|
||||
c1.854-3.234,10.586-12.988,14.63-12.486c1.959-2.461-0.389-0.009-0.772-0.629c4.303-4.453,5.656-3.146,8.56-3.947
|
||||
c3.132-1.859-2.688,0.725-1.203-0.709c5.414-1.383,3.837-3.144,10.9-3.846c0.745,0.424-1.729,0.655-2.35,1.205
|
||||
c4.511-2.207,14.275-1.705,20.617,1.225c7.359,3.439,15.627,13.605,15.953,23.17l0.371,0.1
|
||||
c-0.188,3.802,0.582,8.199-0.752,12.238L76.992,46.856"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M32.372,59.764l-0.252,1.26c1.181,1.604,2.118,3.342,3.626,4.596
|
||||
C34.661,63.502,33.855,62.627,32.372,59.764"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M35.164,59.654c-0.625-0.691-0.995-1.523-1.409-2.352
|
||||
c0.396,1.457,1.207,2.709,1.962,3.982L35.164,59.654"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M84.568,48.916l-0.264,0.662c-0.484,3.438-1.529,6.84-3.131,9.994
|
||||
C82.943,56.244,84.088,52.604,84.568,48.916"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M45.527,0.537C46.742,0.092,48.514,0.293,49.803,0c-1.68,0.141-3.352,0.225-5.003,0.438
|
||||
L45.527,0.537"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M2.872,23.219c0.28,2.592-1.95,3.598,0.494,1.889
|
||||
C4.676,22.157,2.854,24.293,2.872,23.219"/>
|
||||
<path i:knockout="Off" fill="#A80030" d="M0,35.215c0.563-1.728,0.665-2.766,0.88-3.766C-0.676,33.438,0.164,33.862,0,35.215"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.6 KiB |
25
Defensio/Images/images/konstantin/logos/docker.svg
Normal file
@@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 340 268">
|
||||
<!-- Generator: Adobe Illustrator 30.1.0, SVG Export Plug-In . SVG Version: 2.1.1 Build 136) -->
|
||||
<defs>
|
||||
<style>
|
||||
.st0 {
|
||||
fill: none;
|
||||
}
|
||||
|
||||
.st1 {
|
||||
fill: #2560ff;
|
||||
}
|
||||
|
||||
.st2 {
|
||||
clip-path: url(#clippath);
|
||||
}
|
||||
</style>
|
||||
<clipPath id="clippath">
|
||||
<rect class="st0" width="339.5" height="268"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g class="st2">
|
||||
<path class="st1" d="M334,110.1c-8.3-5.6-30.2-8-46.1-3.7-.9-15.8-9-29.2-24-40.8l-5.5-3.7-3.7,5.6c-7.2,11-10.3,25.7-9.2,39,.8,8.2,3.7,17.4,9.2,24.1-20.7,12-39.8,9.3-124.3,9.3H0c-.4,19.1,2.7,55.8,26,85.6,2.6,3.3,5.4,6.5,8.5,9.6,19,19,47.6,32.9,90.5,33,65.4,0,121.4-35.3,155.5-120.8,11.2.2,40.8,2,55.3-26,.4-.5,3.7-7.4,3.7-7.4l-5.5-3.7h0ZM85.2,92.7h-36.7v36.7h36.7v-36.7ZM132.6,92.7h-36.7v36.7h36.7v-36.7ZM179.9,92.7h-36.7v36.7h36.7v-36.7ZM227.3,92.7h-36.7v36.7h36.7v-36.7ZM37.8,92.7H1.1v36.7h36.7v-36.7ZM85.2,46.3h-36.7v36.7h36.7v-36.7ZM132.6,46.3h-36.7v36.7h36.7v-36.7ZM179.9,46.3h-36.7v36.7h36.7v-36.7ZM179.9,0h-36.7v36.7h36.7V0Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
31
Defensio/Images/images/konstantin/logos/gitea.svg
Normal file
@@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<svg version="1.1" id="main_outline" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 640 640" style="enable-background:new 0 0 640 640;" xml:space="preserve">
|
||||
<g>
|
||||
<path id="teabag" style="fill:#FFFFFF" d="M395.9,484.2l-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5,21.2-17.9,33.8-11.8
|
||||
c17.2,8.3,27.1,13,27.1,13l-0.1-109.2l16.7-0.1l0.1,117.1c0,0,57.4,24.2,83.1,40.1c3.7,2.3,10.2,6.8,12.9,14.4
|
||||
c2.1,6.1,2,13.1-1,19.3l-61,126.9C423.6,484.9,408.4,490.3,395.9,484.2z"/>
|
||||
<g>
|
||||
<g>
|
||||
<path style="fill:#609926" d="M622.7,149.8c-4.1-4.1-9.6-4-9.6-4s-117.2,6.6-177.9,8c-13.3,0.3-26.5,0.6-39.6,0.7c0,39.1,0,78.2,0,117.2
|
||||
c-5.5-2.6-11.1-5.3-16.6-7.9c0-36.4-0.1-109.2-0.1-109.2c-29,0.4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5
|
||||
c-9.8-0.6-22.5-2.1-39,1.5c-8.7,1.8-33.5,7.4-53.8,26.9C-4.9,212.4,6.6,276.2,8,285.8c1.7,11.7,6.9,44.2,31.7,72.5
|
||||
c45.8,56.1,144.4,54.8,144.4,54.8s12.1,28.9,30.6,55.5c25,33.1,50.7,58.9,75.7,62c63,0,188.9-0.1,188.9-0.1s12,0.1,28.3-10.3
|
||||
c14-8.5,26.5-23.4,26.5-23.4s12.9-13.8,30.9-45.3c5.5-9.7,10.1-19.1,14.1-28c0,0,55.2-117.1,55.2-231.1
|
||||
C633.2,157.9,624.7,151.8,622.7,149.8z M125.6,353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6,321.8,60,295.4
|
||||
c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5,38.5-30c13.8-3.7,31-3.1,31-3.1s7.1,59.4,15.7,94.2c7.2,29.2,24.8,77.7,24.8,77.7
|
||||
S142.5,359.9,125.6,353.9z M425.9,461.5c0,0-6.1,14.5-19.6,15.4c-5.8,0.4-10.3-1.2-10.3-1.2s-0.3-0.1-5.3-2.1l-112.9-55
|
||||
c0,0-10.9-5.7-12.8-15.6c-2.2-8.1,2.7-18.1,2.7-18.1L322,273c0,0,4.8-9.7,12.2-13c0.6-0.3,2.3-1,4.5-1.5c8.1-2.1,18,2.8,18,2.8
|
||||
l110.7,53.7c0,0,12.6,5.7,15.3,16.2c1.9,7.4-0.5,14-1.8,17.2C474.6,363.8,425.9,461.5,425.9,461.5z"/>
|
||||
<path style="fill:#609926" d="M326.8,380.1c-8.2,0.1-15.4,5.8-17.3,13.8c-1.9,8,2,16.3,9.1,20c7.7,4,17.5,1.8,22.7-5.4
|
||||
c5.1-7.1,4.3-16.9-1.8-23.1l24-49.1c1.5,0.1,3.7,0.2,6.2-0.5c4.1-0.9,7.1-3.6,7.1-3.6c4.2,1.8,8.6,3.8,13.2,6.1
|
||||
c4.8,2.4,9.3,4.9,13.4,7.3c0.9,0.5,1.8,1.1,2.8,1.9c1.6,1.3,3.4,3.1,4.7,5.5c1.9,5.5-1.9,14.9-1.9,14.9
|
||||
c-2.3,7.6-18.4,40.6-18.4,40.6c-8.1-0.2-15.3,5-17.7,12.5c-2.6,8.1,1.1,17.3,8.9,21.3c7.8,4,17.4,1.7,22.5-5.3
|
||||
c5-6.8,4.6-16.3-1.1-22.6c1.9-3.7,3.7-7.4,5.6-11.3c5-10.4,13.5-30.4,13.5-30.4c0.9-1.7,5.7-10.3,2.7-21.3
|
||||
c-2.5-11.4-12.6-16.7-12.6-16.7c-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3c4.7-9.7,9.4-19.3,14.1-29
|
||||
c-4.1-2-8.1-4-12.2-6.1c-4.8,9.8-9.7,19.7-14.5,29.5c-6.7-0.1-12.9,3.5-16.1,9.4c-3.4,6.3-2.7,14.1,1.9,19.8
|
||||
C343.2,346.5,335,363.3,326.8,380.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.5 KiB |
10
Defensio/Images/images/konstantin/logos/github.svg
Executable file
@@ -0,0 +1,10 @@
|
||||
<svg width="98" height="96" viewBox="0 0 98 96" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_730_27126)">
|
||||
<path d="M41.4395 69.3848C28.8066 67.8535 19.9062 58.7617 19.9062 46.9902C19.9062 42.2051 21.6289 37.0371 24.5 33.5918C23.2559 30.4336 23.4473 23.7344 24.8828 20.959C28.7109 20.4805 33.8789 22.4902 36.9414 25.2656C40.5781 24.1172 44.4062 23.543 49.0957 23.543C53.7852 23.543 57.6133 24.1172 61.0586 25.1699C64.0254 22.4902 69.2891 20.4805 73.1172 20.959C74.457 23.543 74.6484 30.2422 73.4043 33.4961C76.4668 37.1328 78.0937 42.0137 78.0937 46.9902C78.0937 58.7617 69.1934 67.6621 56.3691 69.2891C59.623 71.3945 61.8242 75.9883 61.8242 81.252L61.8242 91.2051C61.8242 94.0762 64.2168 95.7031 67.0879 94.5547C84.4102 87.9512 98 70.6289 98 49.1914C98 22.1074 75.9883 6.69539e-07 48.9043 4.309e-07C21.8203 1.92261e-07 -1.9479e-07 22.1074 -4.3343e-07 49.1914C-6.20631e-07 70.4375 13.4941 88.0469 31.6777 94.6504C34.2617 95.6074 36.75 93.8848 36.75 91.3008L36.75 83.6445C35.4102 84.2188 33.6875 84.6016 32.1562 84.6016C25.8398 84.6016 22.1074 81.1563 19.4277 74.7441C18.375 72.1602 17.2266 70.6289 15.0254 70.3418C13.877 70.2461 13.4941 69.7676 13.4941 69.1934C13.4941 68.0449 15.4082 67.1836 17.3223 67.1836C20.0977 67.1836 22.4902 68.9063 24.9785 72.4473C26.8926 75.2227 28.9023 76.4668 31.2949 76.4668C33.6875 76.4668 35.2187 75.6055 37.4199 73.4043C39.0469 71.7773 40.291 70.3418 41.4395 69.3848Z" fill="black"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0_730_27126">
|
||||
<rect width="98" height="96" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
2
Defensio/Images/images/konstantin/logos/nginx.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||
<svg width="800px" height="800px" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><title>file_type_nginx</title><path d="M15.948,2h.065a10.418,10.418,0,0,1,.972.528Q22.414,5.65,27.843,8.774a.792.792,0,0,1,.414.788c-.008,4.389,0,8.777-.005,13.164a.813.813,0,0,1-.356.507q-5.773,3.324-11.547,6.644a.587.587,0,0,1-.657.037Q9.912,26.6,4.143,23.274a.7.7,0,0,1-.4-.666q0-6.582,0-13.163a.693.693,0,0,1,.387-.67Q9.552,5.657,14.974,2.535c.322-.184.638-.379.974-.535" style="fill:#019639"/><path d="M8.767,10.538q0,5.429,0,10.859a1.509,1.509,0,0,0,.427,1.087,1.647,1.647,0,0,0,2.06.206,1.564,1.564,0,0,0,.685-1.293c0-2.62-.005-5.24,0-7.86q3.583,4.29,7.181,8.568a2.833,2.833,0,0,0,2.6.782,1.561,1.561,0,0,0,1.251-1.371q.008-5.541,0-11.081a1.582,1.582,0,0,0-3.152,0c0,2.662-.016,5.321,0,7.982-2.346-2.766-4.663-5.556-7-8.332A2.817,2.817,0,0,0,10.17,9.033,1.579,1.579,0,0,0,8.767,10.538Z" style="fill:#fff"/></svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
19
Defensio/Images/images/konstantin/logos/oqtane.svg
Normal file
@@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="200.000000pt" height="200.000000pt" viewBox="0 0 200.000000 200.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
|
||||
<g transform="translate(0.000000,200.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M994 1922 c-6 -4 -25 -50 -44 -102 -80 -218 -210 -455 -391 -712 -49
|
||||
-70 -100 -151 -114 -180 -105 -226 -53 -507 126 -686 190 -188 468 -234 709
|
||||
-116 104 51 223 170 274 274 84 172 86 367 7 532 -16 35 -72 122 -123 193 -52
|
||||
72 -111 161 -133 198 -21 37 -42 67 -46 67 -3 0 -46 -61 -94 -136 l-88 -136
|
||||
106 -156 c57 -87 110 -172 116 -191 16 -50 13 -150 -6 -207 -23 -69 -110 -155
|
||||
-182 -179 -68 -22 -144 -22 -212 0 -74 25 -159 110 -183 183 -19 57 -22 148
|
||||
-7 200 6 19 116 193 246 387 129 195 235 358 235 363 0 5 -22 56 -49 113 -27
|
||||
57 -64 145 -81 196 -31 88 -46 109 -66 95z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1008 B |
22
Defensio/Images/images/konstantin/logos/postgres.svg
Normal file
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
|
||||
<svg width="432.071pt" height="445.383pt" viewBox="0 0 432.071 445.383" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<g id="orginal" style="fill-rule:nonzero;clip-rule:nonzero;stroke:#000000;stroke-miterlimit:4;">
|
||||
</g>
|
||||
<g id="Layer_x0020_3" style="fill-rule:nonzero;clip-rule:nonzero;fill:none;stroke:#FFFFFF;stroke-width:12.4651;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;">
|
||||
<path style="fill:#000000;stroke:#000000;stroke-width:37.3953;stroke-linecap:butt;stroke-linejoin:miter;" d="M323.205,324.227c2.833-23.601,1.984-27.062,19.563-23.239l4.463,0.392c13.517,0.615,31.199-2.174,41.587-7c22.362-10.376,35.622-27.7,13.572-23.148c-50.297,10.376-53.755-6.655-53.755-6.655c53.111-78.803,75.313-178.836,56.149-203.322 C352.514-5.534,262.036,26.049,260.522,26.869l-0.482,0.089c-9.938-2.062-21.06-3.294-33.554-3.496c-22.761-0.374-40.032,5.967-53.133,15.904c0,0-161.408-66.498-153.899,83.628c1.597,31.936,45.777,241.655,98.47,178.31 c19.259-23.163,37.871-42.748,37.871-42.748c9.242,6.14,20.307,9.272,31.912,8.147l0.897-0.765c-0.281,2.876-0.157,5.689,0.359,9.019c-13.572,15.167-9.584,17.83-36.723,23.416c-27.457,5.659-11.326,15.734-0.797,18.367c12.768,3.193,42.305,7.716,62.268-20.224 l-0.795,3.188c5.325,4.26,4.965,30.619,5.72,49.452c0.756,18.834,2.017,36.409,5.856,46.771c3.839,10.36,8.369,37.05,44.036,29.406c29.809-6.388,52.6-15.582,54.677-101.107"/>
|
||||
<path style="fill:#336791;stroke:none;" d="M402.395,271.23c-50.302,10.376-53.76-6.655-53.76-6.655c53.111-78.808,75.313-178.843,56.153-203.326c-52.27-66.785-142.752-35.2-144.262-34.38l-0.486,0.087c-9.938-2.063-21.06-3.292-33.56-3.496c-22.761-0.373-40.026,5.967-53.127,15.902 c0,0-161.411-66.495-153.904,83.63c1.597,31.938,45.776,241.657,98.471,178.312c19.26-23.163,37.869-42.748,37.869-42.748c9.243,6.14,20.308,9.272,31.908,8.147l0.901-0.765c-0.28,2.876-0.152,5.689,0.361,9.019c-13.575,15.167-9.586,17.83-36.723,23.416 c-27.459,5.659-11.328,15.734-0.796,18.367c12.768,3.193,42.307,7.716,62.266-20.224l-0.796,3.188c5.319,4.26,9.054,27.711,8.428,48.969c-0.626,21.259-1.044,35.854,3.147,47.254c4.191,11.4,8.368,37.05,44.042,29.406c29.809-6.388,45.256-22.942,47.405-50.555 c1.525-19.631,4.976-16.729,5.194-34.28l2.768-8.309c3.192-26.611,0.507-35.196,18.872-31.203l4.463,0.392c13.517,0.615,31.208-2.174,41.591-7c22.358-10.376,35.618-27.7,13.573-23.148z"/>
|
||||
<path d="M215.866,286.484c-1.385,49.516,0.348,99.377,5.193,111.495c4.848,12.118,15.223,35.688,50.9,28.045c29.806-6.39,40.651-18.756,45.357-46.051c3.466-20.082,10.148-75.854,11.005-87.281"/>
|
||||
<path d="M173.104,38.256c0,0-161.521-66.016-154.012,84.109c1.597,31.938,45.779,241.664,98.473,178.316c19.256-23.166,36.671-41.335,36.671-41.335"/>
|
||||
<path d="M260.349,26.207c-5.591,1.753,89.848-34.889,144.087,34.417c19.159,24.484-3.043,124.519-56.153,203.329"/>
|
||||
<path style="stroke-linejoin:bevel;" d="M348.282,263.953c0,0,3.461,17.036,53.764,6.653c22.04-4.552,8.776,12.774-13.577,23.155c-18.345,8.514-59.474,10.696-60.146-1.069c-1.729-30.355,21.647-21.133,19.96-28.739c-1.525-6.85-11.979-13.573-18.894-30.338 c-6.037-14.633-82.796-126.849,21.287-110.183c3.813-0.789-27.146-99.002-124.553-100.599c-97.385-1.597-94.19,119.762-94.19,119.762"/>
|
||||
<path d="M188.604,274.334c-13.577,15.166-9.584,17.829-36.723,23.417c-27.459,5.66-11.326,15.733-0.797,18.365c12.768,3.195,42.307,7.718,62.266-20.229c6.078-8.509-0.036-22.086-8.385-25.547c-4.034-1.671-9.428-3.765-16.361,3.994z"/>
|
||||
<path d="M187.715,274.069c-1.368-8.917,2.93-19.528,7.536-31.942c6.922-18.626,22.893-37.255,10.117-96.339c-9.523-44.029-73.396-9.163-73.436-3.193c-0.039,5.968,2.889,30.26-1.067,58.548c-5.162,36.913,23.488,68.132,56.479,64.938"/>
|
||||
<path style="fill:#FFFFFF;stroke-width:4.155;stroke-linecap:butt;stroke-linejoin:miter;" d="M172.517,141.7c-0.288,2.039,3.733,7.48,8.976,8.207c5.234,0.73,9.714-3.522,9.998-5.559c0.284-2.039-3.732-4.285-8.977-5.015c-5.237-0.731-9.719,0.333-9.996,2.367z"/>
|
||||
<path style="fill:#FFFFFF;stroke-width:2.0775;stroke-linecap:butt;stroke-linejoin:miter;" d="M331.941,137.543c0.284,2.039-3.732,7.48-8.976,8.207c-5.238,0.73-9.718-3.522-10.005-5.559c-0.277-2.039,3.74-4.285,8.979-5.015c5.239-0.73,9.718,0.333,10.002,2.368z"/>
|
||||
<path d="M350.676,123.432c0.863,15.994-3.445,26.888-3.988,43.914c-0.804,24.748,11.799,53.074-7.191,81.435"/>
|
||||
<path style="stroke-width:3;" d="M0,60.232"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 4.3 KiB |
2
Defensio/Images/images/konstantin/logos/wireguard.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="400" height="400" version="1.1" viewBox="0 0 400 400" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><defs><clipPath id="a"><path d="m0 300h300v-300h-300z"/></clipPath></defs><g transform="matrix(1.3333 0 0 -1.3333 0 400)"><g clip-path="url(#a)"><g transform="translate(177.57 268.56)"><path d="m0 0c0.969-0.066 2.097 0.81 3.987 1.635-1.862 0.802-2.973 1.655-3.939 1.593-0.996-0.063-2.592-1.031-2.567-1.578 0.027-0.603 1.532-1.583 2.519-1.65" fill="#871719"/></g><g transform="translate(179.32 268.11)"><path d="m0 0c0.969-0.066 2.097 0.81 3.987 1.635-1.862 0.802-2.973 1.655-3.939 1.593-0.996-0.063-2.592-1.031-2.567-1.578 0.027-0.603 1.532-1.583 2.519-1.65" fill="#871719"/></g><g transform="translate(299.74 154.44)"><path d="m0 0s6.94 145.56-153.04 145.56c-141.48 0-145.9-139.63-145.9-139.63s-20.811-160.37 149.16-160.37c163.02 0 149.78 154.44 149.78 154.44" fill="#871719"/></g><g transform="translate(133.86 128.17)"><path d="m0 0c-2.627-1.39-4.65-2.414-6.63-3.517-8.1-4.512-15.026-10.419-20.544-17.868-1.784-2.409-3.01-2.603-5.727-0.941-35.338 21.61-37.609 75.843 0.983 99.453 30.017 18.364 68.365 7.14 82.735-20.477 2.723-5.234 3.069-13.291 1.345-18.782-5.955-18.955-20.015-29.586-39.313-34.102 5.689 4.87 10.218 10.393 11.659 18.025 1.452 7.687-0.084 14.638-4.542 20.956-6.773 9.596-19.868 13.544-30.811 9.389-11.881-4.511-18.39-15.354-17.216-28.683 1.09-12.381 10.484-20.405 28.061-23.453" fill="#fff"/></g><g transform="translate(58.513 66.293)"><path d="M 0,0 C 2.838,19.152 25.265,36.788 44.23,34.776 38.356,26.832 35.643,17.846 34.988,8.883 28.686,7.722 22.747,6.941 16.981,5.478 11.304,4.037 5.803,1.903 0,0" fill="#fff"/></g><g transform="translate(183.79 273.09)"><path d="m0 0c1.061 0.812 2.155 1.494 3.472 0.408 0.75-0.617 1.478-1.257 2.386-2.032-1.127-0.595-2.042-1.096-2.975-1.567-1.306-0.658-2.282-0.218-3.072 0.822-0.642 0.844-0.757 1.645 0.189 2.369m15.447-157.8c-1.598 1.382-2.611 1.381-4.485 0.182-6.359-4.068-12.867-7.922-19.481-11.562-3.792-2.086-7.898-3.599-12.653-5.724 1.633-0.421 2.418-0.619 3.201-0.827 17.776-4.73 27.272-20.335 23.065-37.813-3.741-15.544-19.52-25.482-34.812-22.86-12.748 2.186-23.877 12.772-25.735 25.456-2.026 13.824 4.859 27.119 17.108 32.689 6.794 3.089 13.771 5.778 20.549 8.9 7.706 3.551 16.038 6.355 22.766 11.296 16.7 12.262 27.012 29.145 31.033 49.523 2.408 12.207 2.245 24.36-3.339 35.95-4.286 8.895-11.319 15.357-18.875 21.253-7.775 6.068-16.007 11.554-23.747 17.664-2.095 1.653-3.509 4.505-4.478 7.09-0.411 1.095 0.925 4.066 1.819 4.227 4.746 0.852 9.596 1.29 14.425 1.473 5.574 0.21 11.164 0.032 16.746-0.042 1.21-0.015 2.853 0.141 3.549-0.542 2.891-2.843 5.159-1.014 7.166 0.856 1.689 1.573 2.893 3.668 4.236 5.433-0.815 0.12-2.487 0.541-4.168 0.581-5.613 0.133-11.233 0.047-16.843 0.253-1 0.037-1.963 1.066-2.942 1.637 1.031 0.409 2.058 1.165 3.093 1.175 9.682 0.091 19.366 0.054 29.057 0.054 0.011 5.038-6.722 11.936-12.704 13.806-0.045-0.682-0.087-1.317-0.131-1.994-5.944-0.141-11.778-0.03-17.078 2.788-1.396 0.743-2.309 2.394-3.446 3.627-1.431 1.551-2.605 3.547-4.349 4.559-3.576 2.076-7.48 3.58-11.211 5.397-13.259 6.458-27.262 6.231-42.302 4.854 8.991-2.092 17.11-3.982 25.23-5.872-0.093-0.494-0.185-0.987-0.278-1.481-10.86-1.455-21.134 2.528-31.756 4.003 3.849-2.254 7.749-4.35 11.778-6.158 4.095-1.837 8.316-3.39 12.538-5.091-5.364-4.583-10.746-5.588-17.488-4.048-3.686 0.842-7.585 1.29-11.348 1.106-3.887-0.19-7.802-1.147-11.332-3.506 3.78-1.916 7.263-3.506 10.549-5.432 1.355-0.795 2.909-2.144 3.287-3.536 0.904-3.333 1.166-6.841 1.687-10.281-6.188-0.701-17.071-6.994-19.27-11.09 9.512-1.831 19.868 0.383 28.942-5.746-2.989-2.262-9.949-5.075-12.502-7.007 3.156-0.827 10.469-0.423 13.33-0.229 2.409 0.164 3.521 0.223 4.508-0.59l28.001-21.921c2.944-2.374 14.835-13.629 17.939-20.704 2.643-6.023 2.966-11.148 2.965-12.398-2e-3 -3.355-0.413-8.609-2.721-14.469-0.969-2.461-3.812-7.912-9.677-14.267-9.09-9.847-20.783-15.17-33.57-17.807-29.732-6.13-54.436-37.881-47.462-72.884 8.142-40.866 53.247-62.991 90.107-43.552 23.824 12.564 36.456 37.078 33.072 63.762-2.045 16.12-9.338 29.269-21.563 39.839" fill="#fff"/></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
BIN
Defensio/Images/images/konstantin/profile.jpg
Normal file
|
After Width: | Height: | Size: 985 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
BIN
Defensio/Images/oauth-flow-new.png
Normal file
|
After Width: | Height: | Size: 235 KiB |
BIN
Defensio/Images/video/introduction/sample-10s.mp4
Normal file
BIN
Defensio/background.png
Normal file
|
After Width: | Height: | Size: 352 KiB |
BIN
Defensio/image-1.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
BIN
Defensio/image-2.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
Defensio/image-3.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
BIN
Defensio/image-4.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
Defensio/image.png
Normal file
|
After Width: | Height: | Size: 53 KiB |
1
Defensio/libs/awesome-beamer
Submodule
1
Defensio/libs/smile
Submodule
16
Defensio/pandoc.sh
Executable file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
export TEXINPUTS=".:./libs/awesome-beamer/:./libs/smile/:$TEXINPUTS"
|
||||
pandoc \
|
||||
01_Praesentation_Allgemein.md \
|
||||
02_Praesentation_Konstantin_Hintermayer.md \
|
||||
03_Praesentation_Florian_Edlmayer.md \
|
||||
04_Praesentation_Adam_Gaiswinkler.md \
|
||||
-t beamer \
|
||||
--template 00_preamble.tex \
|
||||
--pdf-engine=pdflatex \
|
||||
--slide-level=2 \
|
||||
--number-sections \
|
||||
--lua-filter ../_extensions/diagram/diagram.lua \
|
||||
--syntax-definition ../_extensions/razor/razor.xml \
|
||||
--syntax-definition ../_extensions/nginx/nginx.xml \
|
||||
-o defensio.pdf
|
||||
3
Defensio/puppeteer-config.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"args": ["--no-sandbox"]
|
||||
}
|
||||
20
Defensio/texput.log
Normal file
@@ -0,0 +1,20 @@
|
||||
This is LuaHBTeX, Version 1.24.0 (TeX Live 2026/Arch Linux) (format=lualatex 2026.4.6) 13 APR 2026 22:05
|
||||
restricted system commands enabled.
|
||||
**
|
||||
|
||||
! Emergency stop.
|
||||
<*>
|
||||
|
||||
End of file on the terminal!
|
||||
|
||||
|
||||
|
||||
Here is how much of LuaTeX's memory you used:
|
||||
5 strings out of 476076
|
||||
100000,460012 words of node,token memory allocated 270 words of node memory still in use:
|
||||
1 hlist, 39 glue_spec nodes
|
||||
avail lists: 2:12,3:3,4:1,5:1
|
||||
22567 multiletter control sequences out of 65536+600000
|
||||
14 fonts using 591679 bytes
|
||||
0i,0n,0p,0b,6s stack positions out of 10000i,1000n,20000p,200000b,200000s
|
||||
! ==> Fatal error occurred, no output PDF file produced!
|
||||
376
Defensio/ulem.sty
Normal file
@@ -0,0 +1,376 @@
|
||||
%
|
||||
% U L E M . S T Y [2019-11-18]
|
||||
%
|
||||
% The ulem package provides various types of underlining that can stretch
|
||||
% between words and be broken across lines in LaTeX or plain TeX.
|
||||
% In LaTeX ulem replaces italics with underlining in \em-phasized text.
|
||||
% It is most suitable for simple text such as {\em ibid.} or \emph{\LaTeX:
|
||||
% A Document Preparation System} that may need to be underlined in a
|
||||
% manuscript submitted for publication. A declaration of \normalem (or
|
||||
% the \usepackage option "normalem") restores the normal \em behavior.
|
||||
%
|
||||
% Full instructions appear in ulem.ltx (ulem.pdf). In summary:
|
||||
%
|
||||
% \uline{important} underlined text
|
||||
% \uuline{urgent} double-underlined text
|
||||
% \uwave{boat} wavy underline
|
||||
% \sout{wrong} line drawn through word
|
||||
% \xout{removed} marked over with //////.
|
||||
% \dashuline{dashing} dash underline
|
||||
% \dotuline{dotty} dotted underline
|
||||
%
|
||||
% {\em phasized\/} | In LaTeX, by default, these are underlined; use
|
||||
% \emph{asized} | \normalem or [normalem] to restore italics
|
||||
% \useunder{\uwave}{\bf}{\textbf}
|
||||
% use wavy underline in place of bold face
|
||||
% Use \markoverwith for defining new types of underlining.
|
||||
%
|
||||
% Copyright (c) 1989-2011 by Donald Arseneau (Vancouver, Canada; asnd@triumf.ca)
|
||||
%
|
||||
% This software may be freely transmitted, reproduced, or modified for any
|
||||
% purpose provided that this copyright notice is left intact.
|
||||
% (Small excerpts may be taken and used without any restriction.)
|
||||
%
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% Defend against multiple loading.
|
||||
\expandafter \ifx \csname UL@box\endcsname \relax \else
|
||||
\immediate\write16{ulem.sty refuses to load twice. }\endinput \fi
|
||||
|
||||
% Set catcode of @ in case it isn't a "letter" already
|
||||
\chardef\ULthickness\catcode\string`\@ % hold catcode temporarily
|
||||
\catcode\string`\@=11
|
||||
|
||||
% \UL@protected = \protected, if available, else \relax
|
||||
|
||||
\begingroup
|
||||
\global\expandafter\let\expandafter\UL@protected\csname protected\endcsname
|
||||
\endgroup
|
||||
|
||||
\UL@protected\def\uline{\relax \ifmmode\expandafter\underline
|
||||
\else \bgroup\expandafter\ULset\fi}
|
||||
|
||||
\newbox\UL@box
|
||||
\newbox\UL@hyphenbox
|
||||
\newskip\UL@skip
|
||||
\newtoks\UL@hook
|
||||
\newdimen\UL@height \UL@height=\maxdimen % flags being unused
|
||||
\newcount\UL@pe
|
||||
|
||||
\UL@protected\def\UL@end *{\relax\relax}% something harmless but unique
|
||||
|
||||
% For regular underlines, set the depth based on the font, or retain
|
||||
% the preset value, then start underlining.
|
||||
\def\ULset{\UL@setULdepth
|
||||
\def\UL@leadtype{\leaders \hrule \@height\UL@height \@depth\ULdepth}%
|
||||
\ifmmode \ULdepth-4\p@ \fi
|
||||
\UL@height-\ULdepth \advance\UL@height\ULthickness \ULon}
|
||||
|
||||
% Automatically set \ULdepth if it is to be automatic (flagged by \maxdimen)
|
||||
\def\UL@setULdepth{\relax
|
||||
\ifdim\ULdepth=\maxdimen % Set depth based on font, if not set already
|
||||
\setbox\UL@box\hbox{{(j}}\ULdepth\dp\UL@box\advance\ULdepth.4\p@
|
||||
% use setbox to support plain TeX
|
||||
\fi}
|
||||
|
||||
% \ULon simply calls \UL@on (possibly \UL@on=\UL@onin) for text mode, but
|
||||
% \UL@onmath if it is math mode.
|
||||
\def\ULon{\ifmmode \expandafter\UL@onmath\else \expandafter\UL@on\fi}
|
||||
|
||||
% \UL@on sets the engine of underline running, and tells it
|
||||
% where to stop. #1 = the relevant text.
|
||||
\long\def\UL@on#1{\leavevmode\UL@ender \let\UL@on\UL@onin
|
||||
\everymath{\UL@hrest}\everyvbox{\UL@hrest}\let\hskip\UL@hskip
|
||||
\let\\\UL@cr \let\-\UL@dischyp \let\newline\UL@newline \let\ \UL@space
|
||||
\def\hfil{\hskip\z@ plus1fil\relax}\def\hfill{\hskip\z@ plus1fill\relax}%
|
||||
\def\hss{\hskip\z@ plus1filminus1fil\relax}\let\penalty\UL@penalty
|
||||
\the\UL@hook
|
||||
\UL@word\@empty#1\xdef\UL@spfactor{\the\spacefactor} \UL@end * }
|
||||
|
||||
% This is what \ULon does when it appears nested in an inner place.
|
||||
\long\def\UL@onin#1{\leavevmode\UL@ender % when nested, do multiple underlining
|
||||
\ifdim\ULdepth=\maxdimen\else
|
||||
\UL@height\ULthickness \advance\ULdepth\thr@@\UL@height \advance\UL@height-\ULdepth
|
||||
\fi
|
||||
\setbox\UL@box\hbox{{#1}}%
|
||||
\let\UL@start\relax\UL@putbox\egroup}
|
||||
% \UL@putbox is disabled in inner mode, so re-enable it by changing \UL@start
|
||||
% \UL@hrest is implicit due to \everyhbox. Double braces for \hbox are in
|
||||
% lieu of \color@begin(end)group.
|
||||
|
||||
% This is what \ULon does in math mode.
|
||||
\def\UL@onmath#1{\UL@ender\mathord{\UL@hrest\mathop{\kern\z@#1}\limits\sb
|
||||
{\UL@leadtype\LA@hskip\p@ plus1fill}}\egroup}
|
||||
|
||||
\def\UL@unegroup{}
|
||||
\gdef\UL@ender{}
|
||||
% end-brace matching hack for when command is used as a font declaration:
|
||||
\def\UL@swender{\ifnum`{=\z@\fi\aftergroup}\gdef\UL@ender{}}
|
||||
|
||||
% must expand to nothing outside the ifs for syntactical spaces to work.
|
||||
% the \expandafters get rid of the \@empty inserted at the beg. of word
|
||||
\long\def\UL@word#1 {\expandafter\UL@start#1 %
|
||||
\expandafter\ifx\expandafter\UL@end#1\egroup\egroup
|
||||
\unskip \unskip \unskip % remove extra leader at end
|
||||
\spacefactor\UL@spfactor \let\UL@word\egroup
|
||||
\else % not finished
|
||||
\ifmmode\else \ifdim\lastskip=\z@\else % allow syntactical spaces
|
||||
\global\UL@skip\lastskip \unskip
|
||||
\UL@stop \UL@leaders
|
||||
\fi\fi
|
||||
\fi \UL@word\@empty}% \@empty preserves braces in param
|
||||
|
||||
% \UL@start: start of each chunk. It gives two levels of grouping.
|
||||
% Each chunk is ended by \UL@stop. Local intermissions go like
|
||||
% \UL@stop...\UL@start.
|
||||
\def\UL@start{\setbox\UL@box\hbox\bgroup\everyhbox{\UL@hrest}%
|
||||
% the following are to cope with stops (\ ,\- etc) within extra braces
|
||||
\let\UL@start\@empty \def\UL@unegroup{\bgroup\bgroup}\let\UL@leadtype\@empty
|
||||
\bgroup \kern-3sp\kern3sp % kerns so I can test for beginning of list
|
||||
\if@ignore \global\@ignorefalse \ignorespaces \fi}
|
||||
|
||||
\def\UL@stop{\global\UL@pe\lastpenalty \unpenalty % penalty in \UL@pe
|
||||
\ifnum\lastkern=\thr@@ \egroup\egroup % Nothing in hbox...but make sure:
|
||||
\ifdim\wd\UL@box=\z@ \else \UL@putbox \fi % something in box so print it
|
||||
\else \egroup\egroup \UL@putbox % something in box so print it
|
||||
\fi \ifnum\UL@pe=\z@ \else \LA@penalty\UL@pe \fi % use penalty from inside box
|
||||
\UL@unegroup}
|
||||
% notice that a box with only a penalty in it is discarded, but the penalty
|
||||
% is still used! This is so a series of discardable glues and penalties
|
||||
% behaves properly.
|
||||
|
||||
\def\UL@putbox{\ifx\UL@start\@empty \else % not inner
|
||||
\vrule\@width\z@ \LA@penalty\@M
|
||||
{\UL@skip\wd\UL@box \UL@leaders \kern-\UL@skip}%
|
||||
\box\UL@box
|
||||
\fi}
|
||||
|
||||
% With interword leaders, give some overlap to avoid gaps caused by
|
||||
% round-off errors in the printing program. Needs \unskip \unskip \unskip
|
||||
% above. This version overlaps 1/300 inch, which looks good at high
|
||||
% resolution, and will still work down to ~150 dpi. Change the value
|
||||
% of \UL@pixel if necessary.
|
||||
|
||||
\newdimen\UL@pixel \UL@pixel=1in \divide\UL@pixel 300
|
||||
|
||||
\def\UL@leaders{{\LA@hskip-\UL@pixel \advance\UL@skip\tw@\UL@pixel
|
||||
\UL@leadtype\LA@hskip\UL@skip \LA@hskip-\UL@pixel}}
|
||||
|
||||
% restore some things for inside math or \mbox
|
||||
\def\UL@hrest{\let\ \LA@space \let\-\@empty \let\penalty\LA@penalty}
|
||||
|
||||
\let\LA@space\ %
|
||||
\UL@protected\def\UL@space{\LA@space \global\UL@skip\lastskip \unskip \UL@reskip}%
|
||||
|
||||
% Hyphenation is done by explicit \discretionary. The overlapping melds
|
||||
% with the running overlap because it *is* part of the running overlap:
|
||||
% The word fragment is extended by the width of the hyphenation which is
|
||||
% then overlapped by leaders. The discretionary may occupy this space
|
||||
% if a break occurs; otherwise the next syllable gets doubly-overlapped
|
||||
% (in registration) for a distance of the hyphen's width.
|
||||
\UL@protected\def\UL@dischyp{\global\setbox\UL@hyphenbox\hbox
|
||||
{\ifnum \hyphenchar\font<\z@ \string-\else \char\hyphenchar\font \fi}%
|
||||
\kern\wd\UL@hyphenbox \LA@penalty\@M
|
||||
\UL@stop \kern-\wd\UL@hyphenbox
|
||||
\discretionary{\box\UL@hyphenbox}{}{}\UL@start}
|
||||
|
||||
\let\LA@penalty\penalty
|
||||
\UL@protected\def\UL@penalty{\relax\ifhmode \afterassignment\UL@@penalty\count@
|
||||
\else\LA@penalty\fi}
|
||||
\def\UL@@penalty{\LA@penalty \ifnum\count@=\z@
|
||||
\@ne \else \count@ \fi % zero penalty => no penalty, so use 1 instead.
|
||||
\UL@stop \UL@start}
|
||||
|
||||
% The test \ifx\ \LA@space \else means we are neither in math mode nor an
|
||||
% \mbox, so it is safe to stop the current \UL@box. \ , \- , and \penalty
|
||||
% (= \linebreak or \nolinebreak) are common enough that they are restored
|
||||
% directly (by \UL@hrest); \\, \newline, \hskip (= \hspace) are rare enough
|
||||
% that the test is incorporated in their UL versions. This adds processing
|
||||
% when they're used, but saves processing in \UL@hrest called by \everymath
|
||||
% \everyvbox and \everyhbox.
|
||||
|
||||
\let\LA@hskip\hskip
|
||||
\UL@protected\def\UL@hskip{\ifx\ \LA@space \LA@hskip \else
|
||||
\afterassignment\UL@reskip \global\UL@skip \fi}
|
||||
|
||||
\def\UL@reskip{\UL@stop \UL@leaders \UL@start}
|
||||
|
||||
% Redefine \\ and \newline so the vertical space from \\[ ] is not lost
|
||||
% and so the \hfil is not underlined! \\ and \newline do nothing if inside
|
||||
% inner braces.
|
||||
|
||||
\UL@protected\def\UL@cr{\unskip \ifx\ \LA@space \let\UL@vad\@gobble
|
||||
\else \UL@stop \unskip\unskip\unskip \let\UL@vad\vadjust \fi
|
||||
\@ifstar{\UL@vad{\LA@penalty\@M}\UL@cra}\UL@cra}
|
||||
\def\UL@cra{\@ifnextchar[\UL@crb\UL@newline}
|
||||
\def\UL@crb[#1]{\UL@vad{\vskip#1}\UL@newline}
|
||||
|
||||
\UL@protected\def\UL@newline{\ifx\UL@start\@empty % (\UL@cr may have \UL@stop-ed already)
|
||||
\unskip \ifx\ \LA@space \else \UL@stop \unskip\unskip\unskip \fi\fi
|
||||
\LA@hskip \z@\@plus.0001fil\LA@penalty -\@M \UL@start}
|
||||
|
||||
% That concludes the basic underlining. To put various other objects
|
||||
% (characters) under (or over) text we need to define \markoverwith
|
||||
% to set the overlay material in a box, and use leaders of that box for
|
||||
% overlaying the text. Here, the meaning of \UL@pixel is changed so
|
||||
% that `pixel' size = box size. Note that we generally need \leaders
|
||||
% (not \cleaders) for text, because an underline will be a patchwork
|
||||
% of small \leaders, and the characters must stay in registration.
|
||||
% However, we "hook" the leaders command so specific applications can
|
||||
% reassign it (\let\ULleaders\xleaders or \let\ULleaders\cleaders).
|
||||
%
|
||||
\newbox\ULC@box
|
||||
\let\ULleaders\leaders
|
||||
|
||||
\UL@protected\def\markoverwith#1{\leavevmode
|
||||
\setbox\ULC@box\hbox{{#1}}\UL@pixel.5\wd\ULC@box
|
||||
\ifmmode \setbox\ULC@box\hbox{\raise1.4ex\box\ULC@box}%
|
||||
\dp\ULC@box-1.4ex\ht\ULC@box\z@ \def\UL@leadtype{\cleaders\copy\ULC@box}%
|
||||
\else
|
||||
\def\UL@leadtype{\ULleaders\copy\ULC@box}%
|
||||
\fi}
|
||||
|
||||
% Now define various special underlines. All the definitions go like
|
||||
% \def \command {\bgroup \markoverwith{something} \ULon}
|
||||
|
||||
% For drawing a wavey underline instead of a straight one the command
|
||||
% is \uwave (under-wave) which uses the wiggle from 6-pt lasy font:
|
||||
|
||||
\UL@protected\def\uwave{\leavevmode \bgroup
|
||||
\ifdim \ULdepth=\maxdimen \ULdepth 3.5\p@
|
||||
\else \advance\ULdepth2\p@
|
||||
\fi \markoverwith{\lower\ULdepth\hbox{\sixly \char58}}\ULon}
|
||||
\font\sixly=lasy6 % does not re-load if already loaded, so no memory drain.
|
||||
|
||||
% To draw a double underline under text, use \uuline{text}
|
||||
|
||||
\UL@protected\def\uuline{\leavevmode \bgroup
|
||||
\UL@setULdepth
|
||||
\ifx\UL@on\UL@onin \advance\ULdepth2.8\p@\fi
|
||||
\markoverwith{\lower\ULdepth\hbox
|
||||
{\kern-.03em\vbox{\hrule width.2em\kern1\p@\hrule}\kern-.03em}}%
|
||||
\ULon}
|
||||
|
||||
% To draw a line through text instead of under it (strike out) do
|
||||
% `under'-line with negative depth. Note that this one uses a real
|
||||
% line, not characters, so there is no \markoverwith.
|
||||
|
||||
\UL@protected\def\sout{\leavevmode \bgroup \ULdepth=-.55ex \ULset}
|
||||
|
||||
% To mark //// over text instead of underlining (x-out)
|
||||
%
|
||||
\UL@protected\def\xout{\leavevmode \bgroup
|
||||
\markoverwith{\hbox to.35em{\hss/\hss}}\ULon}
|
||||
|
||||
\UL@protected\def\dotuline{\leavevmode \bgroup
|
||||
\UL@setULdepth
|
||||
\ifx\UL@on\UL@onin \advance\ULdepth2\p@\fi
|
||||
\markoverwith{\begingroup
|
||||
%\advance\ULdepth0.08ex
|
||||
\lower\ULdepth\hbox{\kern.06em .\kern.04em}%
|
||||
\endgroup}%
|
||||
\ULon}
|
||||
|
||||
\UL@protected\def\dashuline{\leavevmode \bgroup
|
||||
\UL@setULdepth
|
||||
\ifx\UL@on\UL@onin \advance\ULdepth2\p@\fi
|
||||
\markoverwith{\kern.13em
|
||||
\vtop{\kern\ULdepth \hrule width .3em}%
|
||||
\kern.13em}\ULon}
|
||||
|
||||
% A command to declare that an underline command should be used in
|
||||
% place of a particular font selection:
|
||||
% \useunder {underline_command}{font_declaration}{font_command}
|
||||
% e.g.: \useunder{\uuline}{\bfseries}{\textbf}
|
||||
% \useunder{\uwave}{\bf}{}
|
||||
|
||||
\UL@protected\def\useunder#1#2#3{\relax
|
||||
\ifx\relax#2\relax\else % declaration command given
|
||||
\UL@protected\def#2{\def\@tempa{#1}\global\let\UL@ender\UL@swender
|
||||
\expandafter\@tempa\expandafter{\ifnum\z@=\string`}\fi}%
|
||||
\fi
|
||||
\ifx\relax#3\relax\else % argumentative command
|
||||
\UL@protected\def#3{#1}%
|
||||
\fi}
|
||||
|
||||
\expandafter\ifx \csname @ifundefined\endcsname \relax
|
||||
|
||||
% Allow plain TeX to use ulem.sty:
|
||||
\def\@height{height}
|
||||
\def\@depth{depth}
|
||||
\def\@width{width}
|
||||
\def\@empty{}
|
||||
\long\def\@gobble#1{}
|
||||
\long\def\@firstoftwo#1#2{#1}%
|
||||
\long\def\@secondoftwo#1#2{#2}%
|
||||
% Do non-outer \newif with no visible \if's or \fi's when skipping
|
||||
\csname newif\expandafter\endcsname \csname if@ignore\endcsname
|
||||
|
||||
\else
|
||||
|
||||
\let\LA@em\em \let\LA@emph\emph
|
||||
\expandafter\let\expandafter\LA@Pem \csname em \endcsname
|
||||
\expandafter\let\expandafter\LA@Pemph \csname emph \endcsname
|
||||
\def\ULforem{\useunder{\uline}{\em}{\emph}}
|
||||
\def\normalem{\let\em\LA@em \let\emph\LA@emph
|
||||
\expandafter\let\csname em \endcsname\LA@Pem
|
||||
\expandafter\let\csname emph \endcsname\LA@Pemph}
|
||||
\ULforem % default is to use underlining for \em,
|
||||
|
||||
\fi
|
||||
|
||||
% Process LaTeX \package options; plain TeX skips this section
|
||||
|
||||
\expandafter\ifx\csname ProvidesPackage\endcsname \relax \else
|
||||
\ProvidesPackage{ulem}[2019/11/18]
|
||||
\DeclareOption{normalem}{\normalem}
|
||||
\DeclareOption{ULforem}{\ULforem}
|
||||
\DeclareOption{normalbf}{}
|
||||
\DeclareOption{UWforbf}{\useunder{\uwave}{\bf}{\textbf}}
|
||||
\ProcessOptions
|
||||
%
|
||||
\newcommand\UL@marpar[2][\ULmp@opt@arg]{\gdef\ULmp@opt@arg{#2}%
|
||||
\ifx\ \LA@space \@latexerr{Marginpar lost}%
|
||||
\else \UL@stop \LA@marginpar[#1]{#2}\UL@start \fi}
|
||||
%
|
||||
\AtBeginDocument{\let\LA@marginpar\marginpar}%
|
||||
%
|
||||
\addto@hook\UL@hook{\let\marginpar\UL@marpar}
|
||||
\fi
|
||||
|
||||
\catcode`@=\ULthickness % Scratch meaning: restore catcode of @
|
||||
|
||||
\def\ULthickness{.4pt}% can change this with \renewcommand
|
||||
\newdimen\ULdepth \ULdepth=\maxdimen
|
||||
% "maxdimen" depth causes the depth to be set according to the font. You
|
||||
% can change \ULdepth for a permanent setting or a special effect (\sout).
|
||||
|
||||
\endinput
|
||||
|
||||
|
||||
% Previous bug-finders: Esther Hu (\hfill in plain); Lones Smith (\tt\-);
|
||||
% Steve Anderson (\ooalign accents); Thanassi Protopapas ( { in tables).
|
||||
% The bug finders' fee is now $0.00; it will double for each new bug found.
|
||||
% Version (identified by year)
|
||||
% 1994:
|
||||
% Many changes! Notably: LaTeX2e options and \emph. Nesting works (somewhat).
|
||||
% Behavior with inner braces is more consistent (not stripped). \useunder.
|
||||
% Better underwave (using lasy6). Special underlines are not commented out.
|
||||
% patch 1995: fix \UL@swender to work in {tabular}; make hyphenation join
|
||||
% well; crude math support; eliminate \@clb
|
||||
% 1996: use "\csname ProvidesPackage\endcsname", tidying.
|
||||
% 1997: fix \\ when LaTeX changed; remove extra overlap in putbox.
|
||||
% 2000: hook (and marginpar)
|
||||
% 2004: Fix spacing in \uwave and \xout. \ULleaders hook.
|
||||
% 2009: Accept \par in argument (\long)
|
||||
% 2010: Include \dotuline and \dashuline, typeset documentation, add \UL@setULdepth
|
||||
% 2011: Change \dimen@ to \UL@height
|
||||
% 2012: Removed \let\par garbage
|
||||
% 2017: Remove \makerobust
|
||||
% 2019: Handle \ULdepth better. Some tweaks.
|
||||
%
|
||||
% Send problem reports to asnd@triumf.ca
|
||||
%
|
||||
% test integrity:
|
||||
% brackets: round, square, curly, angle: () [] {} <>
|
||||
% backslash, slash, vertical, at, dollar, and: \ / | @ $ &
|
||||
% hat, grave, acute (apostrophe), quote, tilde, under: ^ ` ' " ~ _
|
||||
@@ -236,6 +236,8 @@ Table: Sprints und deren Schwerpunkte
|
||||
### Grafische Darstellung
|
||||
|
||||
```mermaid
|
||||
%%| fig-cap: Projektumfeld Analyse
|
||||
%%| filename: projektumfeld-analyse
|
||||
|
||||
flowchart TD
|
||||
%% Interne Umwelten (Oben)
|
||||
@@ -318,6 +320,8 @@ Table: Risikoanalyse und Bewertung
|
||||
### Grafische Darstellung
|
||||
|
||||
```mermaid
|
||||
%%| fig-cap: Risikoportfolio Alumnihub
|
||||
%%| filename: risikoportfolio-alumnihub
|
||||
quadrantChart
|
||||
title Risikoportfolio Alumnihub
|
||||
x-axis Geringe Auswirkung --> Hohe Auswirkung
|
||||
@@ -1,6 +1,6 @@
|
||||
\cleardoublepage
|
||||
|
||||
# Adam Gaiswinkler
|
||||
# Adam Gaiswinklerr
|
||||
|
||||
## Einleitung des individuellen Teils
|
||||
|
||||
@@ -19,6 +19,7 @@ Mein Aufgabenbereich in diesem Projekt war vielseitig und umfasste sowohl leiten
|
||||
\
|
||||
|
||||
Als Product Owner war ich für die Definition der Produktvision und die Priorisierung des Backlogs verantwortlich. Dies beinhaltete:
|
||||
|
||||
- **Anforderungsmanagement**: Erhebung und Strukturierung der Anforderungen in Zusammenarbeit mit den Betreuern und dem Team.
|
||||
- **Sprint-Planung**: Organisation der 14-tägigen Sprints in YouTrack, um einen kontinuierlichen Entwicklungsfluss sicherzustellen.
|
||||
- **Qualitätssicherung**: Definition der *Definition of Done* (DoD) und Durchführung von Code-Reviews zur Einhaltung von Architekturstandards.
|
||||
@@ -28,6 +29,7 @@ Als Product Owner war ich für die Definition der Produktvision und die Priorisi
|
||||
\
|
||||
|
||||
Ein wesentlicher Teil meiner Arbeit lag in der Bereitstellung der technischen Basis für das gesamte Team:
|
||||
|
||||
- **Deployment-Strategie**: Konzeption und Umsetzung der Server-Infrastruktur auf Basis von Debian Linux und NginX als Reverse-Proxy.
|
||||
- **Datenbankdesign**: Entwurf des relationalen Datenmodells in PostgreSQL, inklusive der Absicherung durch SSL/TLS.
|
||||
- **CI/CD-Pipeline**: Automatisierung der Build- und Deployment-Prozesse mittels Gitea Actions für eine effiziente Integration der Teambeiträge.
|
||||
@@ -176,7 +178,8 @@ Ein Modul in Oqtane besteht aus vier Projekten:
|
||||
|
||||
- Im Package-Projekt findet man Skripte zum Debuggen und Releasen eines Moduls und die NuGet-Spezifikation.
|
||||
- Beim Debug werden die DLLs, PDBs und statischen Assets wie Skripte und Stylesheets der drei anderen Projekte in den bereits gebauten Oqtane.Server `oqtane.framework/oqtane.server/bin/debug/net10.0/...` kopiert.
|
||||
- Beim Release wird ein NuGet-Paket erstellt und unter oqtane.framework/oqtane.server/Packages abgelegt. Dort abgelegte NuGet-Pakete werden beim nächsten Start des Oqtane-Servers installiert (Datenbank-Migrationen werden gemacht und die Pakete entpackt).
|
||||
- Beim Release wird ein NuGet-Paket erstellt und unter \
|
||||
oqtane.framework/oqtane.server/Packages abgelegt. Dort abgelegte NuGet-Pakete werden beim nächsten Start des Oqtane-Servers installiert (Datenbank-Migrationen werden gemacht und die Pakete entpackt).
|
||||
|
||||
### Zusammenspiel der Infrastruktur
|
||||
|
||||
|
Before Width: | Height: | Size: 351 KiB After Width: | Height: | Size: 351 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 471 KiB After Width: | Height: | Size: 471 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 208 KiB After Width: | Height: | Size: 208 KiB |
|
Before Width: | Height: | Size: 227 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 90 KiB After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 459 KiB After Width: | Height: | Size: 459 KiB |
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 195 KiB |
|
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 344 KiB After Width: | Height: | Size: 344 KiB |
BIN
Diplomarbeitsbuch/images/preamble/logo-short.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
Diplomarbeitsbuch/images/preamble/logo.png
Normal file
|
After Width: | Height: | Size: 17 KiB |
BIN
Diplomarbeitsbuch/images/preamble/szu.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
@@ -10,14 +10,14 @@ pandoc \
|
||||
98-abbildungsverzeichnis.md \
|
||||
99-bibliographie.md \
|
||||
--number-sections \
|
||||
--lua-filter _extensions/diagram/diagram.lua \
|
||||
--syntax-definition _extensions/razor/razor.xml \
|
||||
--syntax-definition _extensions/nginx/nginx.xml \
|
||||
--lua-filter ../_extensions/diagram/diagram.lua \
|
||||
--syntax-definition ../_extensions/razor/razor.xml \
|
||||
--syntax-definition ../_extensions/nginx/nginx.xml \
|
||||
--citeproc \
|
||||
--bibliography sources.bib \
|
||||
--csl _extensions/sources/tgm.csl \
|
||||
--csl ../_extensions/sources/tgm.csl \
|
||||
--include-before-body 00_preamble.tex \
|
||||
-H _extensions/header/header.tex \
|
||||
-H ../_extensions/header/header.tex \
|
||||
-V geometry:"top=2.5cm, bottom=2cm, left=3cm, right=2cm, a4paper" \
|
||||
-V toc-title="Inhaltsverzeichnis" \
|
||||
-V classoption=twoside \
|
||||
@@ -1,100 +0,0 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
---
|
||||
|
||||
# Defensio Diplomarbeit: AlumniHub
|
||||
## Individueller Teil: Adam Gaiswinkler
|
||||
**Entwicklung von CMS-Modulen & Frontend-Design**
|
||||
|
||||
---
|
||||
|
||||
# Ausgangslage & Motivation
|
||||
- **Ausgangssituation**: Bedarf an einer modernen Plattform für den Absolventenverein der HTL Ungargasse.
|
||||
- **Persönliche Motivation**:
|
||||
- Steigende Verantwortung durch Teamverkleinerung (von 6 auf 3 Personen).
|
||||
- Identifikation mit dem Projekt wuchs deutlich.
|
||||
- Praktische Anwendung von Blazor & ASP.NET in einem realen Umfeld.
|
||||
- **Individuelle Ziele**:
|
||||
- Entwicklung von Oqtane-Modulen (Anmeldetool & Hall of Fame).
|
||||
- Web-Entwicklung mit Fokus auf responsives und nutzerfreundliches UI/UX.
|
||||
|
||||
---
|
||||
|
||||
# Eingesetzte Technologien
|
||||
- **Backend & Core**: C#, ASP.NET Core
|
||||
- **Frontend**: Blazor (für interaktive Weboberflächen direkt in C#)
|
||||
- **CMS**: Oqtane Framework
|
||||
- **Styling**: Bootstrap & Custom CSS
|
||||
- **Spezielle Tools**: QuestPDF (PDF-Generierung), Gitea (Versionskontrolle)
|
||||
- **Entwicklungsumgebung**: Visual Studio 2022 & JetBrains Rider (macOS)
|
||||
|
||||
---
|
||||
|
||||
# Umsetzung: Oqtane Theme
|
||||
- **Ziel**: Modernes, schlichtes Design im Stil der HTL Ungargasse (szu.at).
|
||||
- **Technische Highlights**:
|
||||
- Vollständige Eigenentwicklung der Navigationslogik (über `PageState.Pages`).
|
||||
- Dynamisches Ausblenden von Systemseiten via LINQ.
|
||||
- **Responsive Design**: Einsatz von CSS Media Queries und einer komplett CSS-basierten Burger-Menü-Lösung.
|
||||
- Integration eines `ControlPanels` und Cookie-Consent.
|
||||
|
||||
---
|
||||
|
||||
# Umsetzung: Hall of Fame (1)
|
||||
- **Zweck**: Sichtbarmachung von erfolgreichen Absolventinnen und Absolventen.
|
||||
- **UI & UX**:
|
||||
- Responsive Kartenübersicht der Personen mit Such- und Sortierfunktion (Echtzeit).
|
||||
- Detailseite im modernen "Glasmorphismus"-Design.
|
||||
- **Datenerfassung & Workflow**:
|
||||
- Rich-Text-Editor zur Eingabe des Werdegangs.
|
||||
- Bild-Upload-System (Live-Vorschau, max. 5 MB) statt manueller URLs.
|
||||
- Statusverwaltung ("Entwurf" vs. "Veröffentlicht") inkl. Eigentümerprüfung.
|
||||
|
||||
---
|
||||
|
||||
# Umsetzung: Hall of Fame (2)
|
||||
- **PDF-Export**: Dynamische Generierung eines ansprechenden Profil-PDFs mittels *QuestPDF*.
|
||||
- **Moderation**:
|
||||
- Integriertes Meldesystem (Reporting) direkt über ein separates Interfaces-Paket angesteuert.
|
||||
- **Datenbank & Persistenz**:
|
||||
- Entity Framework Core inkl. Migrationen (`HallOfFame` und `HallOfFameReport` Tabellen).
|
||||
|
||||
---
|
||||
|
||||
# Umsetzung: Anmeldetool für Treffen
|
||||
- **Zweck**: Vereinfachung der Planung und Teilnehmerverwaltung.
|
||||
- **Funktion**:
|
||||
- Klare, farblich getrennte Zusage- und Absage-Buttons.
|
||||
- Live-Rückmeldung bei Statusänderung dank Blazor.
|
||||
- Saubere Trennung von UI-Komponente und Backend-API.
|
||||
- **UX-Optimierung**:
|
||||
- Fokus auf Overlay-Darstellung und Mobile-Clipping-Vermeidung.
|
||||
|
||||
---
|
||||
|
||||
# Herausforderungen & Lösungen
|
||||
- **Plattformwechsel (Windows zu macOS)**: Oqtane ist stark an Windows gekoppelt; gelöst durch Einsatz von JetBrains Rider.
|
||||
- **Zeitdruck & Infrastruktur-Ausfälle**:
|
||||
- Probleme mit Hosting (Hetzner).
|
||||
- **Lösung**: Entwicklung einer schlanken "Übergangslösung" (Node.js/HTML) im Sommer 2025 zur zeitgerechten Event-Abwicklung.
|
||||
- **Entity Framework Concurrency Issues**: Gelöst durch Transaktions-Gliederung bei Löschvorgängen (Reports vs. Main Entity).
|
||||
|
||||
---
|
||||
|
||||
# Learnings
|
||||
- **Technisch**: Tieferes Verständnis von Version Control (Git), CSS/Flexbox (Responsiveness) und C#/Blazor-Tiefen.
|
||||
- **Methodisch**: Eine klare Aufgabenaufteilung sowie regelmäßige Team-Meetings sind unerlässlich für den Projekterfolg.
|
||||
- **Persönlich**: Bedeutsamkeit von Eigeninitiative und Verantwortungsübernahme, gerade in schwierigen Projektphasen.
|
||||
|
||||
---
|
||||
|
||||
# Fazit & Ausblick
|
||||
- **Erreichtes**:
|
||||
- Theme ist final in Oqtane integriert und mobil optimiert.
|
||||
- Hall of Fame und Anmeldetool sind voll funktionstüchtig.
|
||||
- **Ausblick**:
|
||||
- Integration einer umfassenden Teilnehmerlisten-Auswertung (Datenbank).
|
||||
- Limit-Funktion für maximale Anmeldungen bei Veranstaltungen.
|
||||
- Automatische E-Mail-Erinnerungen für Events.
|
||||
@@ -1,100 +0,0 @@
|
||||
---
|
||||
marp: true
|
||||
theme: default
|
||||
paginate: true
|
||||
---
|
||||
|
||||
# Defensio Diplomarbeit: AlumniHub
|
||||
## Individueller Teil: Florian Edlmayer
|
||||
**Datensicherheit, Backup-Systeme & Premium-Bereich**
|
||||
|
||||
---
|
||||
|
||||
# Ausgangslage & Zielsetzung
|
||||
- **Ausgangssituation**: Fehlen einer sicheren, datenschutzkonformen digitalen Vernetzung der Absolventen der HTL Ungargasse.
|
||||
- **Mein Beitrag**:
|
||||
- DSGVO-konforme Datenschutzimplementierung.
|
||||
- Robuste, automatisierte Backups & Restore-Systeme.
|
||||
- Externes Login mittels LinkedIn (OAuth 2.0).
|
||||
- Konzeption und Entwicklung des Premium-Bereichs.
|
||||
- **Nutzen**: Rechtskonformer Betrieb, hohe Ausfallsicherheit, einfache Nutzung, Förderung des Engagements.
|
||||
|
||||
---
|
||||
|
||||
# Eingesetzte Technologien
|
||||
- **Framework**: ASP.NET Core & .NET 8
|
||||
- **Datenbanksystem**: PostgreSQL
|
||||
- **Authentifizierung**: OAuth 2.0 (LinkedIn)
|
||||
- **Scripting & Automation**: Bash-Skripte für Linux Cronjobs
|
||||
|
||||
---
|
||||
|
||||
# DSGVO & Datenschutz
|
||||
- **Notwendigkeit**: Einhaltung gesetzlicher Rahmenbedingungen (DSGVO, DSG).
|
||||
- **Umsetzung**:
|
||||
- Erstellung und Einbindung einer rechtskonformen Datenschutzerklärung.
|
||||
- **Datenminimierung**: Es werden nur absolut notwendige Daten für den Vereinszweck erhoben.
|
||||
- **Vertraulichkeit**: TLS/HTTPS-Verschlüsselung, lokales Hosting der Daten in Österreich (LiveDesign).
|
||||
- Sicherstellung aller Betroffenenrechte (Auskunft, Löschung).
|
||||
|
||||
---
|
||||
|
||||
# Backup- & Restore-Systeme (1)
|
||||
- **Problem**: Schutz der Daten vor Hardwareausfällen, Softwarefehlern oder Cyberangriffen.
|
||||
- **Lösung: Vollautomatisiertes Backup-Skript**
|
||||
- **Cronjob** führt Skript nachtschlafend (`02:30 Uhr`) aus.
|
||||
- Sichert die `PostgreSQL`-Datenbank im Custom-Format (`pg_dump -Fc`).
|
||||
- Komprimiert den gesamten App-Dateibaum mittels `tar -cvpzf`.
|
||||
- Alle Backups erhalten UTC-Zeitstempel für ordentliche Strukturierung.
|
||||
|
||||
---
|
||||
|
||||
# Backup- & Restore-Systeme (2)
|
||||
- **Retention Management**:
|
||||
- Automatische Bereinigung alter Backups (Rotation). Nur die neuesten 30 Backups (`RETAIN=30`) bleiben vorhanden, um Speicherplatz zu sparen.
|
||||
- **Restore-Skript**:
|
||||
- Kontrollierter Wiederherstellungsprozess.
|
||||
- Integrierte Sicherheitsabfrage (`ja/nein`) vor dem Überschreiben.
|
||||
- Umbenennen bestehender Ordner als "Rückversicherung".
|
||||
- Neuanlage der Datenbank (`dropdb` / `createdb`) & Einspielen via `pg_restore`.
|
||||
|
||||
---
|
||||
|
||||
# Authentifizierung mit LinkedIn (OAuth 2.0)
|
||||
- **Ziel**: Reduzierung von Registrierungshürden und Steigerung der Plattformsicherheit (keine Passwörter im eigenen System speichern).
|
||||
- **Ablauf**:
|
||||
- Nutzer klickt auf "Via LinkedIn Anmelden".
|
||||
- Weiterleitung an LinkedIn -> Freigabe durch den Nutzer.
|
||||
- Oqtane External Login fängt Authorization Code ab, tauscht diesen gegen ein Access Token.
|
||||
- Automatisches Mapping auf lokales Benutzerkonto mithilfe der definierten *Claims* (Name, System-ID).
|
||||
|
||||
---
|
||||
|
||||
# Der Premium-Bereich (1)
|
||||
- **Zweck**: Anreiz für aktives Engagement im Absolventenverein.
|
||||
- **Ingenieur-Antrags-Workflow**:
|
||||
- Nutzer können *Ingenieur-Anträge* (PDF) via Oqtane FileManager hochladen (`Entity: EngineerApplication`).
|
||||
- Nach Prüfung und Freigabe durch Admins (`Approved`) wird automatisch für 12 Monate der Premium-Status vergeben (`UserPremium`).
|
||||
- **Bibliothek**:
|
||||
- Premium-Mitglieder können eine Übersicht aller genehmigten Vorzeige-Anträge einsehen.
|
||||
|
||||
---
|
||||
|
||||
# Der Premium-Bereich (2)
|
||||
- **Mitgliedersuche & Kontakt**:
|
||||
- Gezielte, datensparsame Suchfunktion nach anderen Absolventen.
|
||||
- Die Suche filtert sensible Daten serverseitig heraus, bevor es zum Client geschickt wird.
|
||||
- **Kontakt-Mechanismus**: In-App Nachrichtensystem *ohne* Preisgabe der persönlichen E-Mail-Adresse. Oqtane übernimmt als Broker die Zustellung.
|
||||
- **Architektur**:
|
||||
- Umsetzung über EF Core (Tabellen: `UserPremium`, `EngineerApplication`, `PremiumEvent` wg. Audit-Trails).
|
||||
- Rollenbasierte Zugriffskontrollen tief in der Service-Schicht (`IsAuthorized`).
|
||||
|
||||
---
|
||||
|
||||
# Fazit & Ausblick
|
||||
- **Erreichtes**:
|
||||
- Sensible Mitglieder-Daten sind DSGVO-konform geschützt.
|
||||
- Die Betriebssicherheit wird durch fehlerresistente Bash-Backups bewahrt.
|
||||
- Der nahtlose Login mit LinkedIn reduziert Barrieren stark.
|
||||
- Der Premium-Bereich samt Ingenieur-Anträgen stiftet echten Mehrwert für die Alumni-Community.
|
||||
- **Ausblick**: Evaluierung weiterführender OAuth-Anbieter sowie Ausbau der Premium-Pfeiler zur Steigerung der Mitglieds-Dauerhaftigkeit.
|
||||
23
Video_Text_Skript.md
Normal file
@@ -0,0 +1,23 @@
|
||||
# Video Text Skript
|
||||
|
||||
Anfang: Vernetzung, die wirklich funktioniert – willkommen beim AlumniHub. Wir haben im Rahmen unserer Diplomarbeit an unserer HTL eine moderne Webanwendung für den Absolventenverein entwickelt.
|
||||
Zu beginn unseres Projekts sind wir auf viele Probleme gestoßen. Im Sommer beschäftigten wir uns mit einer Übergangslösung um das kommende Treffen der Absolventen im Jahr 2025 zu ermöglichen. Ein weiteres Problem war unser Team Downsizing von 6 auf 3 Mitglieder. Dadurch mussten wir unsere ursprünglichen Pläne stark überdenken und uns auf das Wesentliche konzentrieren.
|
||||
Außerdem sind wir immer wieder auf Probleme mit unserer Serverinfrastruktur gestoßen.
|
||||
|
||||
Das Hauptziel des Projektes war es eine moderne Webanwendung für den Absolvenntenverein zu kreieren. Die es ermöglicht einfach Events und treffen zu organisieren mithilfe unseres EventRegistration Moduls. Weiter Funktionen sind die Hall of Fame, wo Absolventen ihre Erfolge präsentieren können, das Schwarze Brett für Neuigkeiten und Jobangebote und der Premiumbereich für exklusive Inhalte. Diese sind im Laufe der Entwicklung hinzugekommen.
|
||||
|
||||
Nun wollen wir Ihnen unsere Webanwendung genauer vorstellen.
|
||||
|
||||
EventRegistration Modul:
|
||||
|
||||
|
||||
Hall of Fame Modul:
|
||||
|
||||
|
||||
Schwarzes Brett Modul:
|
||||
|
||||
|
||||
Premiumbereich Modul:
|
||||
|
||||
|
||||
Ein zentraler Teil unserer Arbeit ist die kontinuierliche Integration unserer Software. Wir haben uns für Git als Versionsverwaltungssystem entschieden und hosten eine Gitea Instanz. Bei veröffentlichen eines tags wird automatisch ein neues Debian Paket gebaut und in unsererem Debian Package Registry bereitgestellt.Durch diese automatisierung ist die veröffentlichung von neuen Softwareversionen stark vereinfacht worden.
|
||||
@@ -151,6 +151,11 @@ local mermaid = {
|
||||
compile = function (self, code)
|
||||
local mime_type = self.mime_type or 'image/svg+xml'
|
||||
local file_extension = extension_for_mimetype[mime_type]
|
||||
|
||||
-- Resolve puppeteer config path
|
||||
local puppeteer_config = pandoc.path.join({pandoc.system.get_working_directory(), 'puppeteer-config.json'})
|
||||
|
||||
|
||||
return with_temporary_directory("diagram", function (tmpdir)
|
||||
return with_working_directory(tmpdir, function ()
|
||||
local infile = 'diagram.mmd'
|
||||
@@ -158,7 +163,7 @@ local mermaid = {
|
||||
write_file(infile, code)
|
||||
pipe(
|
||||
self.execpath or 'mmdc',
|
||||
{"--pdfFit", "--iconPacksNamesAndUrls", "mdi#https://unpkg.com/@iconify-json/mdi@1.2.3/icons.json", "--input", infile, "--output", outfile},
|
||||
{"--pdfFit", "--iconPacksNamesAndUrls", "mdi#https://unpkg.com/@iconify-json/mdi@1.2.3/icons.json", "-p", puppeteer_config, "--input", infile, "--output", outfile},
|
||||
''
|
||||
)
|
||||
return read_file(outfile), mime_type
|
||||
@@ -167,6 +172,24 @@ local mermaid = {
|
||||
end,
|
||||
}
|
||||
|
||||
-- Source - https://stackoverflow.com/a/27028488
|
||||
-- Posted by hookenz, modified by community. See post 'Timeline' for change history
|
||||
-- Retrieved 2026-04-18, License - CC BY-SA 4.0
|
||||
|
||||
function dump(o)
|
||||
if type(o) == 'table' then
|
||||
local s = '{ '
|
||||
for k,v in pairs(o) do
|
||||
if type(k) ~= 'number' then k = '"'..k..'"' end
|
||||
s = s .. '['..k..'] = ' .. dump(v) .. ','
|
||||
end
|
||||
return s .. '} '
|
||||
else
|
||||
return tostring(o)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- TikZ
|
||||
--
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/bash
|
||||
pandoc \
|
||||
00-praemble.md \
|
||||
01-toc.md \
|
||||
02-Allgemein.md \
|
||||
03-Diplomarbeitsbuch-individueller-teil-Adam-Gaiswinkler.md \
|
||||
04-Diplomarbeitsbuch-individueller-teil-Florian-Edlmayer.md \
|
||||
05-Diplomarbeitsbuch-individueller-teil-Konstantin-Hintermayer.md \
|
||||
97-tabellenverzeichnis.md \
|
||||
98-abbildungsverzeichnis.md \
|
||||
99-bibliographie.md \
|
||||
--number-sections \
|
||||
--lua-filter _extensions/diagram/diagram.lua \
|
||||
--syntax-definition _extensions/razor/razor.xml \
|
||||
--syntax-definition _extensions/nginx/nginx.xml \
|
||||
--citeproc \
|
||||
--bibliography sources.bib \
|
||||
--csl _extensions/sources/tgm.csl \
|
||||
--include-before-body 00_preamble.tex \
|
||||
-H _extensions/header/header.tex \
|
||||
-V geometry:"top=2.5cm, bottom=2cm, left=3cm, right=2cm, a4paper" \
|
||||
-V toc-title="Inhaltsverzeichnis" \
|
||||
-V classoption=twoside \
|
||||
-V fontsize=12pt \
|
||||
-V linestretch=1.5 \
|
||||
-o diplomarbeitsbuch.tex
|
||||
3
puppeteer-config.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"args": ["--no-sandbox"]
|
||||
}
|
||||