generated from leonetienne/LaTeX-Paper-template
Compare commits
2 Commits
4dd8b36f2d
...
d1f6345306
| Author | SHA1 | Date | |
|---|---|---|---|
|
d1f6345306
|
|||
|
4cb4175a95
|
@@ -121,5 +121,5 @@ Die wichtigsten Erkenntnisse des Interviews sind:
|
||||
|
||||
\end{description}
|
||||
|
||||
Der Online-Fragebogen für teilnehmende Weingüter wurde über einen Monat hinweg nicht beantwortet
|
||||
und ermittelte bis auf das Desinteresse der Stakeholdergruppe keine näheren Informationen.
|
||||
Der Online-Fragebogen für teilnehmende Weingüter wurde über einen Monat hinweg nicht beantwortet, insofern
|
||||
gibt es keine Ergebnisse zu präsentieren.
|
||||
|
||||
@@ -20,8 +20,8 @@ Spezifisch ist der \enquote{vergleichbare Funktionsumfang}, dass es Datenmodelle
|
||||
Frontendlogik in Bezug auf die zuvor genannten Datenmodelle gibt.
|
||||
|
||||
\section{Digitization}
|
||||
Die Phase der Digitazion befasst sich mit der digitalen Abbildung von Objekten der realen Welt
|
||||
in einer Art und Weise, sodass diese elektronisch weiterverarbeitet werden können \cite{bib:dougherty, bib:loebbecke}.
|
||||
Die Phase der Digitazion nach Verhoef et al. befasst sich mit der digitalen Abbildung von Objekten der realen Welt
|
||||
in einer Art und Weise, sodass diese elektronisch weiterverarbeitet werden können \cite{bib:verhoef, bib:dougherty, bib:loebbecke}.
|
||||
Das bedeutet, dass in dieser Phase Datenobjekte definiert und implementiert werden.
|
||||
Ein Datenobjekt besteht nach firmeninternen Konventionen aus zumindest
|
||||
vier Komponenten:
|
||||
@@ -93,9 +93,17 @@ eingesehen, gelöscht und bearbeitet werden.
|
||||
|
||||
|
||||
\section{Digitalization}
|
||||
In der Phase \textit{Digitalization} werden bestehende Geschäftsprozesse so verändert,
|
||||
dass mit digitalen Werkzeugen und Datenmodellen gearbeitet werden kann \cite{bib:fengli}.
|
||||
Damit baut diese Phase auf der vorherigen Phase \enquote{Digitization} auf, um mit den dort
|
||||
implementierten Datenmodellen zu arbeiten. Im Folgenden werden die Umsetzungen der
|
||||
erforderlichen Geschäftsprozesse beschrieben.
|
||||
|
||||
\subsection{Teilnehmerregistrierung}
|
||||
Ein essenzieller Teil des Jahresauswahlprobenwerkzeuges ist die Registrierung von Teilnehmern.
|
||||
Dieses Modul repräsentiert den ersten Berührungspunkt der Winzer mit dem System.
|
||||
Hiervon profitiert \ac{WM}, weil registrierte Benutzer der Webseite eine Grundvorausetzung
|
||||
für die Onlineregistrierung von Weinen zu \acp{JAP} sind.
|
||||
Dem Pflichtenheft ist zu entnehmen, dass es zwei Kategorien von Teilnehmerregistrierungen gibt:
|
||||
\begin{enumerate}
|
||||
\item Nutzer ist \ac{WM}-Mitglied
|
||||
@@ -114,6 +122,8 @@ Nach erfolgreichem Login, wird ein Teilnehmerobjekt erstellt.
|
||||
Wählt der Nutzer \enquote{Nein, ich bin kein Mitglied} aus, würde er auf ein Registrierungsformular
|
||||
weitergeleitet, auf um sich einen Nicht-Mitgliederaccount anzulegen. Im Zuge dieser Registrierung werden
|
||||
Stammdaten zum Weingut angefragt.
|
||||
Dieser Schritt übersetzt unter anderem den \enquote{Einreicher}-Teil des ursprünglichen Anmeldeformulares,
|
||||
anbei in \fullref{chap:anhang-anmeldeformular}.
|
||||
|
||||
\begin{nicepic}
|
||||
\includegraphics[width=0.9\textwidth]{images/ux-flow-registrierung.png}
|
||||
@@ -150,10 +160,11 @@ Stammdatenformular konfrontiert. Dabei handelt es sich um Angaben zum teilnehmen
|
||||
Wird dieses Formular abgeschickt, ist die Teilnehmerregistrierung abgeschlossen.
|
||||
|
||||
\subsubsection*{Mitglied, mit Konto}
|
||||
Ist ein Nutzer ein Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite
|
||||
Ist ein Nutzer ein Weinland-Mosel-Mitglied und hat bereits ein Mitgliedskonto, muss dieser auf der Registrierungsseite
|
||||
\enquote{Ich bin ein Mitglied} auswählen. An dieser Stelle navigiert der Browser zu einem Login-Formular.
|
||||
Hier kann sich das Mitglied nun anmelden. Tut er dies erfolgreich, ist die Teilnehmerregistrierung
|
||||
abgeschlossen.
|
||||
Hier kann sich das Mitglied anmelden. Tut es dies erfolgreich, erstellt der Controller einen neuen
|
||||
Teilnehmer-Eintrag für den Frontend-Nutzer und fügt den Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} hinzu.
|
||||
Damit ist die Teilnehmerregistrierung abgeschlossen.
|
||||
|
||||
\subsubsection*{Mitglied, ohne Konto}
|
||||
Ist ein Nutzer ein Mitglied und hat noch kein Mitgliedskonto, muss dieser auf der Registrierungsseite
|
||||
@@ -163,12 +174,10 @@ Da der Nutzer noch keinen Account hat, muss dieser auf \enquote{Jetzt registrier
|
||||
Daraufhin navigiert der Browser zu einem Registrierungsformular, das eine Email-Adresse, ein Passwort
|
||||
und die Zustimmung zur Datenverarbeitung benötigt. Ist dieses Formular abgeschickt, erhält das Mitglied
|
||||
eine Email mit einem Bestätigungslink. Wird dieser Bestätigungslink angeklickt, wird das Mitgliedskonto
|
||||
freigegeben und es öffnet sich ein Login-Formular.
|
||||
Nach erfolgreichem Login wird das Mitgliedskonto um die notwendingen Teilnehmereigenschaften erweitert
|
||||
und ist somit erfolgreich als Teilnehmer registriert.
|
||||
freigegeben und es öffnet sich ein Login-Formular, beschrieben in \enpointy{Mitglied, mit Konto}.
|
||||
|
||||
\subsubsection*{Umsetzung}
|
||||
Um das umzusetzen wurde zunächst ein simples Weichen-Content-Element erstellt.
|
||||
Zunächst wurde ein simples Weichen-Content-Element erstellt.
|
||||
Dieses Content-Element hat die Parameter \enquote{question}, \enquote{answ-1-link}, \enquote{answ-1-text},
|
||||
\enquote{answ-2-link} sowie \enquote{answ-2-text}.
|
||||
Der Zweck dieses Content-Elementes ist es, Nutzer basierend auf einer ausformilierten Frage auf eine
|
||||
@@ -200,3 +209,130 @@ da diese Werte erst im Zuge der Persistierung erstellt werden. Das ist so, da da
|
||||
\enquote{AUTO\_INCREMENT}-Schlüsselwort lediglich zu SQL gehört und SQL nur von der Datenbank ausgeführt wird.
|
||||
Die Lösung hierfür ist es, beide Elemente zu erstellen und zu persistieren, danach ihre Uids gegenseitig
|
||||
bekannt machen um sie danach erneut zu persistieren.
|
||||
|
||||
\subsection{Weinregistrierung}
|
||||
Ein Basismerkmal des Jahresauswahlprobenwerkzeuges ist die Möglichkeit, Weine zu Jahresauswahlproben
|
||||
anzumelden. Dieser Schritt übersetzt unter anderem die verbleibenden Formfelder des
|
||||
ursprünglichen Anmeldeformulares, anbei in \fullref{chap:anhang-anmeldeformular} in den digitalen Workflow.
|
||||
Für die Weinanmeldung spielt die Mitgliedsschaft eines Teilnehmers keine Rolle. Es wird lediglich ein
|
||||
Frontend-Nutzer der Nutzergruppe \enquote{Teilnehmer} benötigt. Dieser Nutzer hat, wenn angemeldet,
|
||||
Zugriff auf eine Auflistung aller zeitlich freigegebenen Jahresauswahlproben.
|
||||
Soweit der Registrierungszeitraum dieser Jahresauswahlprobe den aktuellen Zeitpunkt miteinschließt,
|
||||
wird eine \enquote{Jetzt Wein anmelden}-Schaltfläche angeboten.
|
||||
Dadurch, dass Anmeldeformulare elektronisch und automatisiert verarbeitet werden, sinkt der Aufwand,
|
||||
der seitens \ac{WM} für Anmeldungen gestemmt werden muss. Das ist so, da diese Formular nun nicht mehr von
|
||||
Mitarbeitern bearbeitet werden müssen. Davon profitiert \ac{WM}, da diese Zeit nun anderweitig genutzt werden kann.
|
||||
|
||||
\begin{nicepic}
|
||||
\includegraphics[width=0.9\textwidth]{images/ux-flow-teilnahme.png}
|
||||
\captionof{figure}{UX-Flow: Weinanmeldung}
|
||||
\caption*{Quelle: Eigene Darstellung}
|
||||
\label{fig:uxflow-weinanmeldung}
|
||||
\end{nicepic}
|
||||
|
||||
\subsubsection*{IT-Sicherheit}
|
||||
Es ist wichtig zu erwähnen, dass solche Überprüfungen,
|
||||
wie das Aktivsein eines Registrierungszeitraumes einer \ac{JAP}, grundsätzlich im Backend, d.h. serverseitig
|
||||
auf der betroffenen Webseite (in diesem Beispiel der Weinanmeldungsseite) durchgeführt werden.
|
||||
Das Verstecken der zugehörigen
|
||||
Schaltfläche im Frontend dient lediglich der User-Experience und stellt keine Sicherheitsvorkehrung dar.
|
||||
Das ist essenziell, da eine URL, auch wenn für sie keine Schaltfläche existiert, dennoch aufgerufen werden kann.
|
||||
Da Jahresauswahlprobennummern (\acp{UID}) fortlaufend sind, ist es trivial URLs für Weinanmeldungen
|
||||
beliebiger Jahresauswahlproben herzuleiten. Insofern ist es von großer Wichtigkeit sicherzustellen,
|
||||
dass der Server solche Anfragen grundsätzlich selbst prüft und gegebenenfalls verneint.
|
||||
|
||||
\subsubsection*{Das Formular}
|
||||
Aufgrund dessen, dass TYPO3 die Fluid Templating Engine verwendet \cite{bib:typo3-fluid},
|
||||
werden Formulare und Formfelder mit den entsprechenden Fluid-Form-ViewHelpern aufgebaut.
|
||||
Diese ViewHelper repräsentieren und erstellen gleichnamige HTML-Tags und fügen diesen spezielle
|
||||
Attribute zur Identifizierung in Submit-Aufrufen hinzu \cite{bib:typo3-docs-fluid-form-viewhelpers}.
|
||||
Grundsätzlich entstehen hierbei drei Kategorien von Werten, die es im Formular abzubilden gilt:
|
||||
|
||||
\paragraph*{Inputfelder} sind triviale Formfelder, die nicht durch andere Datensätze beschränkt werden.
|
||||
Beispiele für Inputfelder sind: Weinbeschreibung, Jahrgang und Alkoholgehalt.
|
||||
Inputfelder wurden mit simplen Input-Tags umgesetzt und erhielten nach Bedarf \textit{required} und
|
||||
\textit{pattern}-Attribute. Diese Attribute beschreiben jeweils, ob ein Formfeld ein Pflichtfeld ist und
|
||||
mit welcher Regular Expression der Formfeldinhalt abzugleichen ist \cite{bib:w3schools-input}.
|
||||
Die Formfeldwerte können unverändert in der Datenbank persistiert werden.
|
||||
|
||||
\paragraph*{SelectSingle} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ Elementen aus
|
||||
anderen Datenbanktabellen geben. Der Nutzer muss sich für genau ein Element entscheiden.
|
||||
Beispiele für SelectSingle-Formfelder sind: Weinlage, Qualitätsstufe, Rebsorte und Geschmacksangabe.
|
||||
SelectSingle-Formfelder werden durch Select-HTML-Tags abgebildet. Der TYPO3-Form-ViewHelper für
|
||||
\enquote{Select} akzeptiert eine Liste an Auswahlmöglichkeiten und erstellt selbstständig Option-HTML-Tags
|
||||
für diese.
|
||||
Die Formfeldwerte von SelectSingle-Formfeldern sind die
|
||||
\acp{UID} des jeweils ausgewähltem Elementes \cite{bib:typo3-docs-fluid-form-viewhelpers}.
|
||||
\\
|
||||
\\
|
||||
Aufgrund dessen, dass das Weinlagen-Drop-Down-Menü über 170 Einträge führt, wurde eine Suchmöglichkeit implementiert. Diese ist lediglich ein Textfeld, das bei jeder Eingabe allen Option-Tags der Weinlage,
|
||||
deren Anzeigewert nicht der Suche entspricht, das Stilattribut \enquote{display: none;} auferlegt.
|
||||
Somit sind diese nicht mehr sichtbar.
|
||||
\\
|
||||
\\
|
||||
Eine komplexe Ausnahme stellt das SelectSingle-Formfeld \enquote{Category} dar, da TYPO3-Kategorien
|
||||
Baumstrukturen sind \cite{bib:typo3-docs-sys-category}.
|
||||
Um die Eltern-Kind-Beziehung der Baumstruktur erstichtlich zu machen, werden die Option-HTML-Tags einzeln rekursiv gerendert. Zunächst werden sämtliche Kategorien, deren
|
||||
\ac{PID} 0 ist, dargestellt. Diese Elemente sind direkte Kinder des unsichtbaren Wurzelelementes. Für jede dieser Kategorien $a$ wird nun ein
|
||||
Fluid-Partial aufgerufen,
|
||||
das alle Kategorien $b$ darstellt, für die gilt: $b.pid = a.uid$. Diese Darstellung erfolgt durch einen erneuten rekursiven Aufruf dieses Partials.
|
||||
In jeder Darstellung wird der Kategoriename, geprefixt mit
|
||||
$n$ Leerzeichen, dargestellt, mit $n = Rekursionstiefe$. Somit entsteht ein Drop-Down-Menü, das
|
||||
alle Kategorien in einer eindimensionalen Liste darstellt. Diese Liste ist nach einer Preorder-Traversierung
|
||||
des Kategoriebaumes sortiert und desto tiefer ein Element im Baum ist, desto weiter ist es eingerückt.
|
||||
Damit sieht das Drop-Down-Menü aus wie eine Baumstruktur.
|
||||
\\
|
||||
\\
|
||||
Diese Herangehensweise erzeugt schlüssigen und lesbaren Programmcode und lässt sich unkompliziert umsetzen.
|
||||
Das senkt Entwicklungskosten und erhöht den Profit des Endkunden, da hierdurch weniger Zeit aufgewandt wird.
|
||||
Rekursiv aufgerufene For-Schleifen, die sich selbst erneut für alle Elemente aufrufen,
|
||||
können jedoch zu einem Performanzproblem führen \cite{bib:schwarzer-vorlesung-alg}.
|
||||
Daher wird im Folgenden die Zeitkomplexität dieser Rekursionsfunktion betrachtet.
|
||||
Grundlegend, kann für diese Funktion kein Master-Theorem angewandt werden,
|
||||
da es sich hierbei nicht um einen Divide-and-Conquer-Algorithmus handelt \cite{bib:schwarzer-vorlesung-alg}.
|
||||
Das ist so, da das in der Rekursion weitergereichte Problem nicht kleiner wird,
|
||||
sondern gleich groß bleibt.
|
||||
Das verletzt die Bedingung $b>1$ des Master-Theorem, dargestellt als\\$T(n) = a*T(\frac{n}{b})+f(n)$.
|
||||
Betrachten wir den Algortihmus, besteht er aus $m, m \in \mathbb{N}$ verschachtelten For-Schleifen
|
||||
gleicher Länge.
|
||||
Somit ist die Zeitkomplexität $O(n^m)$. Normiert dargestellt beträgt die Zeitkomplexität $O(n^2)$. Das lässt sich experimentell bestätigen.
|
||||
|
||||
\begin{nicepic}
|
||||
\includegraphics[width=0.70\textwidth]{images/timecomplexity-category.png}
|
||||
\captionof{figure}{Stichprobenartige Laufzeitanalyse des\\Kategorie-Renderers, gegenüber einer\\ quadratischen Kurve}
|
||||
\caption*{Quelle: Eigene Darstellung}
|
||||
\label{fig:timecomplexity-category}
|
||||
\end{nicepic}
|
||||
|
||||
|
||||
Auf Optgroup-HTML-Tags wurde bewusst verzichtetet.
|
||||
Grund dafür ist, dass Optgroup-Titel an sich nicht als Option auswählbar sind.
|
||||
Das stellt ein Problem dar, da beispielsweise die Kategorie \enquote{Riesling},
|
||||
die die Unterkategorien \enquote{Trockener Riesling} und \enquote{Halbtrockener Riesling} beinhalten könnte,
|
||||
auch direkt auswählbar sein sollte. Zudem besitzen Kategorie-Elemente kein Attribut das auf die Präsenz
|
||||
von Unterkategorien hindeutet \cite{bib:typo3-docs-sys-category}, womit eine Unterscheidung zwischen
|
||||
Baumblättern und -Zweigen nicht ohne weiteres möglich ist. Diese Entscheidung wäre jedoch
|
||||
benötigt, um zwischen einem Optgroup-Tag und einem Option-Tag abzuwägen.
|
||||
|
||||
\paragraph*{SelectMultiple} sind Formfelder, die dem Nutzer eine Auswahl aus $n$ Elementen aus einer anderen
|
||||
Datenbanktabelle geben. Der Nutzer kann sich für eine beliebige Anzahl dieser, eingeschlossen null, entscheiden.
|
||||
Ein Beispiel für SelectMultiple-Formfelder ist: Weineigenschaften.
|
||||
TYPO3-Fluid implementiert hierfür keinen ViewHelper \cite{bib:typo3-docs-fluid-form-viewhelpers},
|
||||
also wurde eine eigene Lösung entworfen: Der Nutzer soll aus einer Menge $A$ wählen.
|
||||
Für alle Elemente $a \in A$
|
||||
wird ein Checkbox-Feld erstellt. Dieses Element trägt den Anzeigewert \enquote{<a.title>} und den
|
||||
Wert \enquote{<formfeldname>-true}.
|
||||
Ist also eine dieser Checkboxen angehakt, hat sie den zuvor genannten Wert. Falls nicht, trägt sie keinen Wert.
|
||||
Weil alle angehakten Checkboxen dieses Formfeldes den selben Wert tragen, ist es PHP-Seitig trivial
|
||||
eine Liste aller angehakten Checkbox-Ids dieses Formfeldes aus der Liste aller Formfeldparameter zu extrahieren.
|
||||
Hierfür wird die eingebaute PHP-Funktion \enquote{array\_keys} verwendet. Diese Funktion gibt alle
|
||||
Keys eines Arrays in Form eines numerisch indizierten Arrays zurück.
|
||||
Der optionale Parameter \enquote{filter\_values} bestimmt, dass ausschließlich die Keys
|
||||
der Key-Value-Pairs, die einen bestimmten
|
||||
Wert tragen, extrahiert werden. D.h., der Funktionsaufruf filtert alle Keys und somit alle Formfeld-IDs des Formfeldparameter-Arrays heraus, die den Wert \enquote{<formfeldname>-true} haben. Das ist eine Liste
|
||||
aller Formfeld-IDs der Checkboxen des SelectMultiples, die angehakt wurden.
|
||||
Mit der eingebauten PHP-Funktion \enquote{array\_map} wenden wir nun eine Operation auf alle Schlüssel
|
||||
der Liste an, die \enquote{strlen('formfeldname-')} Zeichen, von links ausgehend, von der Formfeld-ID
|
||||
entfernt. Somit wird beispielsweise die Formfeld-ID \enquote{winekind-18} zu \enquote{18} transformiert. Übrig bleiben die \acp{UID} aller angehakten Elemente $a$, in Form einer Zeichenkente.
|
||||
Über die eingebaute PHP-Funktion \enquote{intval} ist es trivial diese zu Zahlen zu übersetzen,
|
||||
wodurch die tatsächlichen Objekte aus der Datenbank angefragt werden können.
|
||||
|
||||
@@ -65,13 +65,12 @@ werden \cite{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022}.
|
||||
Nach Verhoef et al. lässt sich der hier sogenannte \enquote{Prozess der Digitalisierung} in drei Phasen unterteilen.
|
||||
Diese drei Phasen sind \textit{Digitization}, \textit{Digitalization} und \textit{Digital Transformation}
|
||||
\cite{bib:verhoef}.
|
||||
|
||||
Die Phase \textit{Digitization} befasst sich mit der Umwandlung analoger Datenstrukturen und Modellen in digitale Datenmodelle,
|
||||
sodass diese digital, z.B. in Form von Nullen und Einsen, gespeichert und elektronisch weiterverarbeitet werden können
|
||||
sodass diese digital, in Form von Nullen und Einsen, gespeichert und elektronisch weiterverarbeitet werden können
|
||||
\cite{bib:dougherty, bib:loebbecke}.
|
||||
\textit{Digitalization} beschreibt den Prozess der Veränderung bestehender Geschäftsprozesse, um mit digitalen Werkzeugen
|
||||
und Datenmodellen zu arbeiten \cite{bib:fengli}.
|
||||
Die letzte Phase, die \textit{Digitale Transformation} beschreibt eine firmenweite Veränderung, die beispielsweise
|
||||
Die letzte Phase, die \textit{Digitale Transformation}, beschreibt eine firmenweite Veränderung, die beispielsweise
|
||||
Ergründungen neuer Geschäftsmodelle mit sich bringen könnte \cite{bib:pagani}.
|
||||
|
||||
\section{Abwägung in Bezug auf die Problemstellung}
|
||||
|
||||
@@ -30,6 +30,12 @@
|
||||
|
||||
\acro{PO}[PO]{Product Owner}
|
||||
\acroplural{PO}[POs]{Product Owner}
|
||||
|
||||
\acro{UID}[UID]{Unique Identifier}
|
||||
\acroplural{UID}[UIDs]{Unique Identifier}
|
||||
|
||||
\acro{PID}[PID]{Parent Identifier}
|
||||
\acroplural{PID}[PIDs]{Parent Identifier}
|
||||
%
|
||||
%
|
||||
\end{acronym}
|
||||
|
||||
@@ -19,6 +19,13 @@
|
||||
publisher = {Hochschule Worms},
|
||||
}
|
||||
|
||||
@book{bib:schwarzer-vorlesung-alg,
|
||||
author = {Volker Schwarzer},
|
||||
title = {Vorlesung: Algorithmen und Datenstrukturen},
|
||||
year = {2022},
|
||||
publisher = {Hochschule Worms},
|
||||
}
|
||||
|
||||
@article{bib:Parviainen_Tihinen_Kaariainen_Teppola_2022,
|
||||
title={Tackling the digitalization challenge: how to benefit from digitalization in practice},
|
||||
volume={5},
|
||||
@@ -320,6 +327,22 @@
|
||||
note = {Zugriff: März 2023}
|
||||
}
|
||||
|
||||
@misc{bib:w3schools-input,
|
||||
author = {{W3Schools}},
|
||||
howpublished = "\url{https://www.w3schools.com/tags/tag_input.asp}",
|
||||
title = {{HTML <input> Tag}},
|
||||
year = {2023},
|
||||
note = {Zugriff: März 2023}
|
||||
}
|
||||
|
||||
@misc{bib:typo3-fluid,
|
||||
author = {{TYPO3 Association}},
|
||||
howpublished = "\url{https://typo3.org/fluid}",
|
||||
title = {{Fluid - A fast and secure templating engine}},
|
||||
year = {2023},
|
||||
note = {Zugriff: März 2023}
|
||||
}
|
||||
|
||||
@misc{bib:typo3-docs-managing-extensions,
|
||||
author = {{TYPO3 Contributors}},
|
||||
howpublished = "\url{https://docs.typo3.org/m/typo3/tutorial-getting-started/main/en-us/Extensions/Management.html}",
|
||||
@@ -407,3 +430,11 @@
|
||||
year = {2023},
|
||||
note = {Zugriff: März 2023}
|
||||
}
|
||||
|
||||
@misc{bib:typo3-docs-fluid-form-viewhelpers,
|
||||
author = {{TYPO3 Contributors}},
|
||||
howpublished = "\url{https://docs.typo3.org/other/typo3/view-helper-reference/11.5/en-us/typo3/fluid/latest/Form/Index.html}",
|
||||
title = {{form - Fluid ViewHelper Reference 11.5 Documentation}},
|
||||
year = {2023},
|
||||
note = {Zugriff: März 2023}
|
||||
}
|
||||
|
||||
BIN
images/timecomplexity-category.png
Normal file
BIN
images/timecomplexity-category.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 115 KiB |
@@ -1 +1 @@
|
||||
<mxfile host="Electron" modified="2023-02-23T17:11:48.640Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="13i6K3uAkC3erjQaRiNs" version="20.8.16" type="device"><diagram name="Seite-1" id="OQF_a6zVYjKttAf1AJ-S">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</diagram></mxfile>
|
||||
<mxfile host="Electron" modified="2023-03-23T14:49:19.151Z" agent="5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.8.16 Chrome/106.0.5249.199 Electron/21.4.0 Safari/537.36" etag="9qRytuOhA2HWE540xQnN" version="20.8.16" type="device"><diagram name="Seite-1" id="OQF_a6zVYjKttAf1AJ-S">5Vnbkto4EP0aHr0FNhh4HK5JFlLZIruT5WVL2MJWEJJXlrnM10ey5bu5BYiTylQxhVotu9V9+qhbNIzh9jBlwHPn1Ia4oTftQ8MYNXS912uL/1JwjAStbrcfSRyGbCVLBQv0BpWwqaQBsqGfU+SUYo68vNCihECL52SAMbrPq60pzr/VAw4sCRYWwGXpK7K5q/ald1P5O4gcN35zy1T724JYWe3Ed4FN9xmRMW4YQ0Ypj75tD0OIpfNiv0TrJidmE8MYJPyaBYsZ607n3ocFWAxhb/cneZ2ONcNQxvFjvGNoCweoIWXcpQ4lAI9T6YDRgNhQPrYpRqnOjFJPCFtC+BVyflTRBAGnQuTyLVazwmJ2/KLWh4N/5eCPTjwcHbKTo2Mysl9kTMVwham1iUQThLFSKPtEucmnAbPgGUfoCluAOZCfc5iKpvRS5g3K5VNIt1BYLBQYxICjXR5GQKHRSfTUUrEtcMwoeBQR7mee/EkKhIJKLL2n7IjzSu/kg3+bvvgSWRCPMltJRSGgbgCX8ukO4EC54TNEmEB3C5nMkMbQaAxMy+WwoZtYeH2wEnLTkd9eISLSH2QLsQ1JCaUpBiWg9i7icOGBMMR7wUR5vK0p4QqMLeHRgYOB7yvI+JzRTZLbUjtJVDm9FuAaUkxZ+FoDhn/JssyMYRp9wz6HwR1kHB7Ogiaebeaj1VfDfcpALVPJ3Az7dJunYZYJ9e2RbJci+TGMz53UkQlRBWFUEks2lK1rKEGMlH7vcrQxWEE8ANbGCQ2Nw0sogXfQ1klEXCSROFtVXG/jlJQEYhW6XvuC3c4SRScPveTd8TMihlSrCrB6AGeYJaQpJkA+L7MEIA4MCYL/3gTR+pEM8Y5M/+Pdzse+Nl/Z683m8zKYaq1SAH7iOiIb7hvqikK6fl+hERcQFyuN9r2FxV2MH5uZSUR5XPfN9Vpwod78AFwGfRD4e+Bij9EVJNpM5CgkgPhInOn3JeQDciQ5NWs4RN8PR/3BgQ7Acj7o2NPFYWb14hTJelQRmo12MaMlHJdznvl/QENpcjRpVsQsL/KtBHEEcLRaacbP+/uLNsEC2XpTEx/JpVFJFRAn8zaxn1XRAiGrsOuJpkrjMBD6c+qHXeRYjBFcQyaM9feQbd5g4JwzOT0YTm3iJCabVxwSGaZXFUGe5JXwAdgtQFdrlbGrV2HXfBa919smJoNfgN7719K7WSu990tkNAnbsSHGUBGFVk6rERAE7wP+Jm0K/No5vl1sa2uvg/Q6EqVOwLfjW7mLNyf9OgHfrjx91QmkWoyX5LIhntDmwN9U3E7sKKmsgSoOovCOQxZNd95hPCFbak+W/m+XLOaVyVLr4dAuN+ETyrYBBvLaDqx8y0XW5icAdLFO+qH0H/D5+OX4z3Jpf2pZ+OvyLzbrVNT4CxFr0QxNxsT2ArJ53EVF7xe4p2jrhQCV49OtCI/+rPCUb6RfNhzRx10v3xiUB7i4U7wKqtvFp9tc6afKXrHcC15cIic0P3S67Ct73qG6pxTJB8MfEoJ1pieMHntF85hXLB5WGCPPh5cBkk/EPFoeAYFiFfw0CIhh+oNldOWb/uxrjL8B</diagram></mxfile>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 30 KiB |
45
test.php
Normal file
45
test.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
// example code
|
||||
|
||||
function T($arr, $p) {
|
||||
foreach ($arr as $a) {
|
||||
if ($a['parent'] === $p) {
|
||||
T($arr, $a['uid']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function testOne($numItems) {
|
||||
$arr = [];
|
||||
for ($i = 0; $i < $numItems; $i++) {
|
||||
$arr[] = [
|
||||
'uid' => $i+1,
|
||||
'parent' => rand(0, $i)
|
||||
];
|
||||
}
|
||||
|
||||
$before = hrtime()[1];
|
||||
T($arr, 0);
|
||||
$after = hrtime()[1];
|
||||
|
||||
$delta = $after - $before;
|
||||
|
||||
return $delta;
|
||||
}
|
||||
|
||||
function testAvg($numItems, $numRuns) {
|
||||
$execTimes = [];
|
||||
for ($i = 0; $i < $numRuns; $i++) {
|
||||
$execTimes[] = testOne($numItems);
|
||||
}
|
||||
|
||||
sort($execTimes);
|
||||
$med = round($execTimes[count($execTimes)/2] / 4206040);
|
||||
|
||||
#echo("$numItems took on average $med time units. ($numRuns sample size)\n");
|
||||
echo("($numItems, $med)\n");
|
||||
}
|
||||
|
||||
for ($i = 0; $i <= 5000; $i += 100) {
|
||||
testAvg($i, 10);
|
||||
}
|
||||
Reference in New Issue
Block a user