Daily CheckIn
This commit is contained in:
parent
058472d1b4
commit
0e8b521f17
6 changed files with 80 additions and 27 deletions
|
@ -10,18 +10,17 @@
|
||||||
|
|
||||||
Um die Messungen etwas zu vereinfachen wurde ein Skript erstellt um die Aufrufe gesammelt durchzuführen. Um die
|
Um die Messungen etwas zu vereinfachen wurde ein Skript erstellt um die Aufrufe gesammelt durchzuführen. Um die
|
||||||
Messungen durchzuführen werden die Befehl, wie in \ref{lst:calling_script_exec} dargestellt aufgerufen.
|
Messungen durchzuführen werden die Befehl, wie in \ref{lst:calling_script_exec} dargestellt aufgerufen.
|
||||||
Durch die nummerierten Präfixe können im Nachgang über die \textit{pgBadger}"=Berichte die SQL-Abfragen verglichen
|
Durch die nummerierten Präfixe können im Nachgang über die \textit{pgBadger}"=Berichte die \ac{SQL}"=Abfragen verglichen
|
||||||
werden. Wichtig hierbei ist noch, dass vor dem ersten \textit{meascall}-Aufruf überprüft wird, ob die Docker-Container
|
werden. Wichtig hierbei ist noch, dass vor dem \textit{measrun}-Aufruf überprüft wird, ob die Docker-Container
|
||||||
gestartet und initialisiert sind. Wenn dies nicht der Fall ist, laufen die Abfragen ins leere. Am einfachsten ist das
|
gestartet und initialisiert sind. Wenn dies nicht der Fall ist, laufen die Abfragen ins leere. Am einfachsten ist das,
|
||||||
über die Statistik von Docker zu ermitteln, ob die CPU-Auslastung auf einen niedrigen Level gefallen ist.
|
wie dargestellt, über die Statistik von Docker zu ermitteln. Nun wird überwacht, das die CPU-Auslastung auf ein
|
||||||
|
niedriges Level fällt, danach kann das Skript für die Messung gerufen werden.
|
||||||
|
|
||||||
\includecode[bash]{chapters/thesis/appendix04_calling_script.sh}{lst:calling_script}{Calling Script}
|
\includecode[bash]{chapters/thesis/appendix04_calling_script.sh}{lst:calling_script}{Calling Script}
|
||||||
|
|
||||||
\begin{lstlisting}[language=Bash,caption={Aufrufe des Unterstützungsscriptes},label=lst:calling_script_exec]
|
\begin{lstlisting}[language=Bash,caption={Aufrufe des Unterstützungsscriptes},label=lst:calling_script_exec]
|
||||||
callscript.sh measinit
|
callscript.sh measinit
|
||||||
callscript.sh -rppf=_testname measres
|
callscript.sh -rppf=_testname measres
|
||||||
callscript.sh -rppf=_testname meascall
|
callscript.sh dcstats
|
||||||
callscript.sh -rppf=_testname -rppn=2 meascall
|
callscript.sh -rppf=_testname measrun
|
||||||
callscript.sh -rppf=_testname -rppn=3 meascall
|
|
||||||
callscript.sh -rppf=_testname -rppn=4 meascall
|
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
|
@ -12,6 +12,7 @@ script_path="/opt/docker/timing.sh"
|
||||||
pgbadger_out="/opt/docker/pgreport"
|
pgbadger_out="/opt/docker/pgreport"
|
||||||
report_postfix=""
|
report_postfix=""
|
||||||
report_postno=""
|
report_postno=""
|
||||||
|
report_postmax="5"
|
||||||
docker_name=dcpgbatch
|
docker_name=dcpgbatch
|
||||||
|
|
||||||
COMPOSE_FILE=/opt/docker/docker-compose.yaml
|
COMPOSE_FILE=/opt/docker/docker-compose.yaml
|
||||||
|
@ -20,14 +21,33 @@ gflog() {
|
||||||
echo "follow the log: $domain_log"
|
echo "follow the log: $domain_log"
|
||||||
tail -f $domain_log
|
tail -f $domain_log
|
||||||
}
|
}
|
||||||
|
gflogrm() {
|
||||||
|
echo "remove the log: $domain_log"
|
||||||
|
rm "$domain_log"
|
||||||
|
}
|
||||||
gfconf() {
|
gfconf() {
|
||||||
nvim "$payara_config"
|
nvim "$payara_config"
|
||||||
}
|
}
|
||||||
gfscript() {
|
gfscript() {
|
||||||
|
gflogcount=$(cat "$domain_log" | wc -l)
|
||||||
outPath=$pgbadger_out$report_postfix/bash.out
|
outPath=$pgbadger_out$report_postfix/bash.out
|
||||||
touch "$outPath"
|
touch "$outPath"
|
||||||
|
echo "" >>"$outPath"
|
||||||
echo "============================================================" >>"$outPath"
|
echo "============================================================" >>"$outPath"
|
||||||
|
echo "calling number $report_postno / $report_postmax" >>"$outPath"
|
||||||
|
echo "" >>"$outPath"
|
||||||
bash $script_path | tee -a "$outPath"
|
bash $script_path | tee -a "$outPath"
|
||||||
|
gflastlog=$(cat "$domain_log" | wc -l)
|
||||||
|
gfcnt=$(($gflastlog - $gflogcount))
|
||||||
|
printf "\n%-20s %+5s %+9s %+9s %+9s %+9s\n" "function" "Runs" "Min (ms)" "Avg (ms)" "Max (ms)" "1st (ms)" >>"$outPath"
|
||||||
|
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-create \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-create-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-build \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-buildr-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-loadData \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-loaddt-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-loadDataMap \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-loaddm-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-renderData \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-rdrdat-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-renderLoad \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-rdrlst-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
|
tail -$gfcnt $domain_log | awk '/PerformanceCounter-render \/view/ { print $3 }' | awk 'BEGIN {min=500;max=0} {sum += $1; cnt += 1}; first == "" { first = $1 }; min > $1 { min = $1 } max < $1 { max = $1 } END { if (cnt < 1) {cnt = -1}; printf("%-20s %5i %9.3f %9.3f %9.3f %9.3f\n", "view-render-list", cnt, min, sum/cnt, max, first) }' >>"$outPath"
|
||||||
}
|
}
|
||||||
|
|
||||||
pginit() {
|
pginit() {
|
||||||
|
@ -68,9 +88,17 @@ pgrpres() {
|
||||||
rm -R $pgbadger_out$report_postfix*
|
rm -R $pgbadger_out$report_postfix*
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
pgrpout() {
|
||||||
|
echo "Show bash output"
|
||||||
|
outPath=$pgbadger_out$report_postfix/bash.out
|
||||||
|
cat "$outPath"
|
||||||
|
}
|
||||||
dccreate() {
|
dccreate() {
|
||||||
sudo docker compose -f $COMPOSE_FILE create --force-recreate
|
sudo docker compose -f $COMPOSE_FILE create --force-recreate
|
||||||
}
|
}
|
||||||
|
dcconf() {
|
||||||
|
nvim $COMPOSE_FILE
|
||||||
|
}
|
||||||
dcstart() {
|
dcstart() {
|
||||||
sudo docker compose -f $COMPOSE_FILE start
|
sudo docker compose -f $COMPOSE_FILE start
|
||||||
sleep 2
|
sleep 2
|
||||||
|
@ -85,11 +113,24 @@ dcres() {
|
||||||
dcstats() {
|
dcstats() {
|
||||||
sudo docker stats
|
sudo docker stats
|
||||||
}
|
}
|
||||||
|
meascall() {
|
||||||
|
gfscript
|
||||||
|
pgrp
|
||||||
|
pglogrm
|
||||||
|
}
|
||||||
|
measrun() {
|
||||||
|
for i in $(seq 1 $report_postmax); do
|
||||||
|
report_postno=$i
|
||||||
|
meascall
|
||||||
|
done
|
||||||
|
}
|
||||||
for name in "$@"; do
|
for name in "$@"; do
|
||||||
case $name in
|
case $name in
|
||||||
-rppf=*) report_postfix="${name#*=}" ;;
|
-rppf=*) report_postfix="${name#*=}" ;;
|
||||||
-rppn=*) report_postno="${name#*=}" ;;
|
-rppn=*) report_postno="${name#*=}" ;;
|
||||||
|
-rppm=*) report_postmax="${name#*=}" ;;
|
||||||
gflog) gflog ;;
|
gflog) gflog ;;
|
||||||
|
gflogrm) gflogrm ;;
|
||||||
gfconf) gfconf ;;
|
gfconf) gfconf ;;
|
||||||
gfscript) gfscript ;;
|
gfscript) gfscript ;;
|
||||||
gfrestart) pgrpinit ;;
|
gfrestart) pgrpinit ;;
|
||||||
|
@ -101,7 +142,9 @@ for name in "$@"; do
|
||||||
pgrestart) pgrestart ;;
|
pgrestart) pgrestart ;;
|
||||||
pgrp) pgrp ;;
|
pgrp) pgrp ;;
|
||||||
pgrpres) pgrpres ;;
|
pgrpres) pgrpres ;;
|
||||||
|
pgrpout) pgrpout ;;
|
||||||
dcinit) dccreate ;;
|
dcinit) dccreate ;;
|
||||||
|
dcconf) dcconf ;;
|
||||||
dcstart) dcstart ;;
|
dcstart) dcstart ;;
|
||||||
dcstop) dcstop ;;
|
dcstop) dcstop ;;
|
||||||
dcres) dcres ;;
|
dcres) dcres ;;
|
||||||
|
@ -110,6 +153,7 @@ for name in "$@"; do
|
||||||
pginit
|
pginit
|
||||||
pgrpres
|
pgrpres
|
||||||
pglogrm 0
|
pglogrm 0
|
||||||
|
gflogrm
|
||||||
dccreate
|
dccreate
|
||||||
dcstart
|
dcstart
|
||||||
;;
|
;;
|
||||||
|
@ -117,15 +161,13 @@ for name in "$@"; do
|
||||||
dcstop
|
dcstop
|
||||||
pgrpres
|
pgrpres
|
||||||
pglogrm 0
|
pglogrm 0
|
||||||
|
gflogrm
|
||||||
dcstart
|
dcstart
|
||||||
pgrp
|
pgrp
|
||||||
pglogrm
|
pglogrm
|
||||||
;;
|
;;
|
||||||
meascall)
|
meascall) meascall ;;
|
||||||
gfscript
|
measrun) measrun ;;
|
||||||
pgrp
|
|
||||||
pglogrm
|
|
||||||
;;
|
|
||||||
help)
|
help)
|
||||||
echo "CALLING: $0 <function> [ <function>]"
|
echo "CALLING: $0 <function> [ <function>]"
|
||||||
echo "The overview of the functions of this script."
|
echo "The overview of the functions of this script."
|
||||||
|
@ -136,9 +178,11 @@ for name in "$@"; do
|
||||||
echo "*** parameter ***"
|
echo "*** parameter ***"
|
||||||
echo " -rppf=<val> Postfix name for the report-folder (used by gfscript, pgrp, pgrpres, measres, meascall)"
|
echo " -rppf=<val> Postfix name for the report-folder (used by gfscript, pgrp, pgrpres, measres, meascall)"
|
||||||
echo " -rppn=<val> Postfix number for the report-folder (used by pgrp, measres, meascall)"
|
echo " -rppn=<val> Postfix number for the report-folder (used by pgrp, measres, meascall)"
|
||||||
|
echo " -rppm=<val> Count of calling meascall (used by measrun)"
|
||||||
echo ""
|
echo ""
|
||||||
echo "*** glassfish ***"
|
echo "*** glassfish ***"
|
||||||
echo " gflog Show and follow the log of the glassfish server with $domain_name"
|
echo " gflog Show and follow the log of the glassfish server with $domain_name"
|
||||||
|
echo " gflogrm Remove the log file of the glassfish server with $domain_name"
|
||||||
echo " gfconf Open the configuration file from glassfish server"
|
echo " gfconf Open the configuration file from glassfish server"
|
||||||
echo " gfscript Calls the testscript for the website"
|
echo " gfscript Calls the testscript for the website"
|
||||||
echo ""
|
echo ""
|
||||||
|
@ -150,19 +194,22 @@ for name in "$@"; do
|
||||||
echo " pgconf Open the configuration file from postgresql"
|
echo " pgconf Open the configuration file from postgresql"
|
||||||
echo " pgrestart Restart the postgresql"
|
echo " pgrestart Restart the postgresql"
|
||||||
echo " pgrp Generate the pgbadger report from postgresql log files"
|
echo " pgrp Generate the pgbadger report from postgresql log files"
|
||||||
|
echo " pgrpout Show the saved output of the bash scripts"
|
||||||
echo " pgrpres Resetet the output of pgbadger"
|
echo " pgrpres Resetet the output of pgbadger"
|
||||||
echo ""
|
echo ""
|
||||||
echo "*** docker ***"
|
echo "*** docker ***"
|
||||||
echo " dcinit Docker erstellen"
|
echo " dcinit Create the both docker container"
|
||||||
echo " dcstart Docker Container starten"
|
echo " dcconf Open the configuration file for the docker container"
|
||||||
echo " dcstop Docker Container stoppen"
|
echo " dcstart Start the both docker container"
|
||||||
echo " dcres Docker Container stoppen und loeschen"
|
echo " dcstop Stop the both docker container stoppen"
|
||||||
echo " dcstats Docker live Statistik anzeigen"
|
echo " dcres Stop and remote the both docker container"
|
||||||
|
echo " dcstats Show the docker live statistik"
|
||||||
echo ""
|
echo ""
|
||||||
echo "*** combine cmds ***"
|
echo "*** combine cmds ***"
|
||||||
echo " measinit Initialize everthing after start"
|
echo " measinit Initialize everthing after start"
|
||||||
echo " measres reset data for new measuring"
|
echo " measres reset data for new measuring"
|
||||||
echo " meascall execute one measure"
|
echo " meascall execute one measure"
|
||||||
|
echo " measrun execute <rppm> calls of measure (default: 5 runs)"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
echo >&2 "Invalid option $name"
|
echo >&2 "Invalid option $name"
|
||||||
|
|
|
@ -65,9 +65,9 @@ weitere Relationen notwendig sind.
|
||||||
\includecode[SQL]{chapters/thesis/chapter03_documentlist.sql}{lst:documentlist}{Generische Abfrage der Dokumentenliste}
|
\includecode[SQL]{chapters/thesis/chapter03_documentlist.sql}{lst:documentlist}{Generische Abfrage der Dokumentenliste}
|
||||||
\includecode[SQL]{chapters/thesis/chapter03_documentlist_sub.sql}{lst:documentlist_sub}{Sub-Abfrage pro Dokument}
|
\includecode[SQL]{chapters/thesis/chapter03_documentlist_sub.sql}{lst:documentlist_sub}{Sub-Abfrage pro Dokument}
|
||||||
|
|
||||||
Nach aktuellem Stand beinhaltet die Datenbank circa 5400 Briefe, für die jeweils 2-7 eingescannte Faksimile gespeichert
|
Nach aktuellem Stand beinhaltet die Datenbank circa 5400 Briefe, für die jeweils zwei bis sieben eingescannte Faksimile
|
||||||
werden. Diese Graphik-Dateien werden im TIFF-Format abgespeichert und benötigen zwischen 1 und 80 MB Speicherplatz.
|
gespeichert werden. Diese Graphik-Dateien werden im TIFF-Format abgespeichert und benötigen zwischen 1 und 80 MB
|
||||||
Dadurch kommt die Datenbank aktuell auf circa 3,8 GB.
|
Speicherplatz. Dadurch kommt die Datenbank aktuell auf circa 3,8 GB.
|
||||||
|
|
||||||
Wie im Kapitel \ref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die
|
Wie im Kapitel \ref{ch:basics} dargestellt, besteht die eigentliche Anwendung aus mehreren Schichten. Die
|
||||||
PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher gehen wir nun weiter nach oben in den Schichten
|
PostgreSQL"=Schicht wurde schon im vorherigen Kapitel betrachtet. Daher gehen wir nun weiter nach oben in den Schichten
|
||||||
|
|
|
@ -260,6 +260,8 @@ abfragt.
|
||||||
\section{Caching im \ac{JPA}}
|
\section{Caching im \ac{JPA}}
|
||||||
\label{sec:performance-investigation-application:caching-jpa}
|
\label{sec:performance-investigation-application:caching-jpa}
|
||||||
|
|
||||||
|
%hier ein test vom acf: \acf{JPA}. aber ich seh ihn nicht
|
||||||
|
|
||||||
\mytodos{muss noch umgebaut werden, falsche Konfiguration erwischt}
|
\mytodos{muss noch umgebaut werden, falsche Konfiguration erwischt}
|
||||||
|
|
||||||
%Die Cache-Einstellungen von \ac{JPA} werden über mehrere Einstellungen konfiguriert. Anhand von
|
%Die Cache-Einstellungen von \ac{JPA} werden über mehrere Einstellungen konfiguriert. Anhand von
|
||||||
|
@ -650,11 +652,6 @@ Nach dem Anpassungen haben sich dann die Werte aus \ref{tbl:measure-materialized
|
||||||
|
|
||||||
\mytodos{prüfen ob ms oder msec die richtige SI-Einheit ist}
|
\mytodos{prüfen ob ms oder msec die richtige SI-Einheit ist}
|
||||||
|
|
||||||
Bei der Verwendung des Hints \textit{openjpa.FetchPlan.FetchBatchSize} kann die Abfrage enorm verschlechtern. Wenn
|
|
||||||
dieser Wert zu klein oder groß definiert ist, wird die Laufzeit verschlechtert. Bei einem zu großen Wert wird die
|
|
||||||
Laufzeit der Datenbankanfrage auf circa 20 ms verlängert. Wenn der Wert zu gering gewählt ist, dann wird zwar die
|
|
||||||
Laufzeit der Datenbankanfrage minimal verkürzt, aber die \textit{map}"=Funktion wird dadurch verlängert.
|
|
||||||
|
|
||||||
Da bei der Materialized View das laden der Daten und das wandeln in die Java"=Objekte getrennt programmiert wurde,
|
Da bei der Materialized View das laden der Daten und das wandeln in die Java"=Objekte getrennt programmiert wurde,
|
||||||
können hier eigene Zeitmessungen für die zwei Schritte eingebaut werden. Hierfür wird die Zeit vor dem
|
können hier eigene Zeitmessungen für die zwei Schritte eingebaut werden. Hierfür wird die Zeit vor dem
|
||||||
\textit{map}"=Aufruf und der \textit{map}"=Aufruf gemessen. Für den ersten Aufruf, wurde ein \textit{SearchDocument}
|
\textit{map}"=Aufruf und der \textit{map}"=Aufruf gemessen. Für den ersten Aufruf, wurde ein \textit{SearchDocument}
|
||||||
|
@ -665,6 +662,16 @@ erzeugt, noch ohne eine Konvertierung der ermittelten Daten in das Objekt, steig
|
||||||
Wenn man nun noch die Konvertierung der Daten wieder einbaut, steigt die Laufzeit nochmal auf nun 82 ms.
|
Wenn man nun noch die Konvertierung der Daten wieder einbaut, steigt die Laufzeit nochmal auf nun 82 ms.
|
||||||
Dies zeigt, alleine das erzeugen der Objekt kostet die meiste Zeit.
|
Dies zeigt, alleine das erzeugen der Objekt kostet die meiste Zeit.
|
||||||
|
|
||||||
|
Bei der Verwendung des Hints \textit{openjpa.FetchPlan.FetchBatchSize} kann die Abfrage enorm verschlechtern. Wenn
|
||||||
|
dieser Wert zu klein oder groß definiert ist, wird die Laufzeit verschlechtert. Bei einem zu großen Wert wird die
|
||||||
|
Laufzeit der Datenbankanfrage auf circa 20 ms verlängert. Wenn der Wert zu gering gewählt ist, dann wird zwar die
|
||||||
|
Laufzeit der Datenbankanfrage minimal verkürzt, aber die \textit{map}"=Funktion wird dadurch verlängert.
|
||||||
|
|
||||||
|
Das aktivieren der Cache-Optionen wie in \ref{sec:performance-investigation-application:caching-openjpa} oder in
|
||||||
|
\ref{sec:performance-investigation-application:caching-query} dargestellt, haben keine Auswirkung auf die Performance.
|
||||||
|
Dies ist dadurch erklärbar, da keine Objekte durch das OpenJPA"=Framework erstellt werden, sondern erst in der
|
||||||
|
\textit{map}"=Funktion des eigenen Codes.
|
||||||
|
|
||||||
Nun wird noch geprüft, welche Performance das parsen der Json-Informationen im Server benötigt. Im ersten Schritt wird
|
Nun wird noch geprüft, welche Performance das parsen der Json-Informationen im Server benötigt. Im ersten Schritt wird
|
||||||
die Parse-Funktion auskommentiert und die Seite nochmal aufgerufen. Durch diese Umstellung fällt die Laufzeit der
|
die Parse-Funktion auskommentiert und die Seite nochmal aufgerufen. Durch diese Umstellung fällt die Laufzeit der
|
||||||
Datenermittlung auf circa 4 ms ab. Nun muss noch geprüft werden, welche Zeit nun der Client zum parsen der
|
Datenermittlung auf circa 4 ms ab. Nun muss noch geprüft werden, welche Zeit nun der Client zum parsen der
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
\chapter*{Abk\"{u}rzungsverzeichnis}
|
\chapter*{Abk\"{u}rzungsverzeichnis}
|
||||||
|
|
||||||
% Insert your acronyms here (Das Kürzel mit der längsten Bezeichnung sollte in den eckigen Klammern eingetragen werden)
|
% Insert your acronyms here (Das Kürzel mit der längsten Bezeichnung sollte in den eckigen Klammern eingetragen werden)
|
||||||
\begin{acronym}[API]
|
\begin{acronym}[HTML]
|
||||||
\acro{EJB}{Enterprise Java Beans}
|
\acro{EJB}{Enterprise Java Beans}
|
||||||
\acro{JSF}{Java Server Faces}
|
\acro{JSF}{Java Server Faces}
|
||||||
\acro{ORM}{Object Relational Mapping}
|
\acro{ORM}{Object Relational Mapping}
|
||||||
|
|
BIN
thesis.pdf
BIN
thesis.pdf
Binary file not shown.
Loading…
Reference in a new issue