Ohm-Management - Projektarbeit B-ME
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

Gruppenbericht.tex 63KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. % !TeX spellcheck = de_DE
  2. % ---
  3. % Preamble
  4. % ---
  5. \documentclass[12pt]{report}
  6. \usepackage{defaultPreamble}
  7. \bibfilename{Gruppenbericht.bib}
  8. %
  9. % ---
  10. % Document Body
  11. % ---
  12. \begin{document}
  13. \pagenumbering{arabic}
  14. %
  15. % Deckblatt
  16. \setcounter{page}{0} % setze seitenzähler auf 0 -> alle Seitenzahlen <1 werden nicht angezeigt
  17. {\centering
  18. \clear % Select ClearSans for the title page
  19. \vspace*{2\baselineskip}
  20. %
  21. {\large Technische Hochschule}\\
  22. \vspace{0.3ex}
  23. {\large Georg-Simon Ohm Nürnberg}\\
  24. \vspace{0.3ex}
  25. {\large Fakultät Elektrotechnik Feinwerktechnik Informationstechnik}\\
  26. \vspace{2.5ex}
  27. %
  28. {\large Projekt OHM News}\\
  29. \vspace{3.5ex}
  30. %
  31. {\Large\b{Projektstudienarbeit}}\\
  32. \vspace{0.3ex}
  33. {\Large\b{B-ME 5}}\\
  34. \vspace{4.5ex}
  35. {\Large\b{OHM News - See only what matters}}\\
  36. \vspace{3.5ex}
  37. %
  38. {\large Wintersemester 2018/2019}\\
  39. \vspace{10\baselineskip}
  40. %
  41. \begin{table}[h]
  42. \centering \large
  43. \begin{tabular}{rl}
  44. \rule{0pt}{14pt}\b{Senta Mandutz} & \b{Edwina Barbalan} \\
  45. Matrikel-Nr.: 3022812 & Matrikel-Nr.: 3064088 \\
  46. \rule{0pt}{14pt}\b{Vivianne Pham} & \b{Xenia Gr\"unzinger} \\
  47. Matrikel-Nr.: 2928261 & Matrikel-Nr.: 3046080 \\
  48. \rule{0pt}{14pt}\b{Erik R\"ommelt} & \\
  49. Matrikel-Nr.: 2843345 & \\
  50. \end{tabular}
  51. \end{table}
  52. } % Need 1 empty line above for centering
  53. %
  54. \newpage % Seitenumbruch nach Titelblatt
  55. \paragraph{\Large Projekt-Roadmap}$~~$\\
  56. %
  57. \begin{table}[h]
  58. \centering%\small
  59. \begin{tabularx}{\textwidth}{|X|X|X|}
  60. \hline
  61. \rule{0pt}{14pt}\b{Tätigkeit} & \b{Dokument} & \b{Beteiligung} \\
  62. \hline
  63. \rule{0pt}{14pt}Konzeption & Projektidee & Alle \\
  64. Organisation und Pflege & Trello & Erik \\
  65. Organisation und Pflege & Bitrix24 & Erik \\
  66. Protokollierung der Treffen & Handschriftlich & Erik, Vivianne \\
  67. Transkription der Protokolle & LaTeX Protokolle & Erik \\
  68. Organisation und Pflege & Wiki & Vivianne \\
  69. Erstformulierung & Pflichtenheft & Alle \\
  70. Erste Entwürfe des App UI & Scribbles, Skizzen & Alle \\
  71. Namensüberlegungen & Notizen zur Namensfindung & Alle \\
  72. Corporate Design & Styleguide & Xenia \\
  73. Entwicklung & Erstellung der Mockups & Xenia, Edwina \\
  74. Entwicklung & Frontenddesign mit Bootstrap & Xenia, Edwina \\
  75. Entwicklung & Single-Page mit Vue.js & Xenia, Edwina \\
  76. Entwicklung & ServiceWorker & Erik \\
  77. Entwicklung & Manifest mit Json & Erik \\
  78. Entwicklung & Meta-Tags mit HTML & Erik \\
  79. Entwicklung & Erstellung der API-Schnittstelle & Senta, Edwina, Vivianne, \mbox{Xenia} \\
  80. Dokumentation RESTful API & Digital mit Swagger.io & Erik \\
  81. Entwicklung & Server mit Node.js/Express.js & Vivianne \\
  82. Entwicklung & Datenbank mit MongoDB & Senta \\
  83. Entwicklung & DB-Anbindung mit Mongoose & Senta \\
  84. Designentwürfe Plakat & Plakatgestaltung & Vivianne \\
  85. \rule{0pt}{14pt}Design und Ausformulierung & Projektpräsentation & Edwina, Vivianne \\
  86. \hline
  87. \end{tabularx}
  88. \caption{Projekt-Roadmap Tabelle}
  89. \end{table}
  90. %
  91. % Inhaltsverzeichnis
  92. \newpage
  93. \tableofcontents
  94. %
  95. % Bericht
  96. \newpage % Seitenumbruch nach Titelblatt
  97. \section*{1. Einleitung}
  98. \phantomsection\addcontentsline{toc}{section}{1. Einleitung}
  99. In der heutigten Zeit werden die meisten Menschen tagtäglich mit einer Vielzahl an Reizen und Informationen überflutet. Dabei ist es nicht immer einfach den Blick auf das Wesentliche zu halten. Häufig werden wir durch Werbung, irrelevante Mails, Social Media Beiträge und weiteres schnell abgelenkt. So geht es auch vielen Studierenden und Angehörigen der Technischen Hochschule Nürnberg.\\
  100. Für uns war das Anlass genug. Es sollte doch eine Möglichkeit zur qualitativen Verbesserung der Informationsflut im Studienalltag geben. Auf der einen Seite müssen die Hochschulangehörigen entlastet werden, damit die Konzentration für die relevanten Themen gesteigert werden kann und auf der anderen Seite sollte genügend Freiraum für die individuellen Interessen bestehen.\\
  101. Im Folgenden wird die Entwicklung einer Idee zur Lösung dieser Problematik, über deren Ausarbeitung in Form eines Konzeptes bis hin zur praktischen Entwicklung eines lauffähigen Prototypen detailliert beschrieben.
  102. %
  103. \section*{2. Vorwort zur Projektidee}
  104. \phantomsection\addcontentsline{toc}{section}{2. Vorwort zur Projektidee}
  105. Die erste Konzeptversion zu der Projektidee von dem Projekt ''Ohm Management App'', dass im Verlauf der ersten Projektphase in ''OHM-News - See only what matters'' umbenannt wurde, wurde von Erik Römmelt erstellt. Nach gemeinsamer Überarbeitung durch Prof.Dr. Matthias Hopf, dem zukünftig betreuenden Professor und Erik Römmelt wurde die zu Projektbeginn gegebene Version des Projektkonzeptes ausformuliert.
  106. %
  107. \section*{3. Projektidee}
  108. \phantomsection\addcontentsline{toc}{section}{3. Projektidee}
  109. Die Projektidee basiert darauf, dass eine plattformunabhängige App für Studierende an der TH Nürnberg entwickelt werden soll, die Kurznachrichten filtert und in einem Nachrichtenfeed anzeigt. Das Filtern funktioniert durch Tags. Es können beim Nachrichten erstellen mehrere, jedoch mindestens eine eingegeben werden. Diese werden bei einer Überschneidung bei der Suche durch eine logische UND-Verknüpfung eingeschränkt. Angezeigt werden die Nachrichten abhängig von ihrer Priorität und Aktualität. \\
  110. Dazu können in einer Dateiablage von Professoren und Befugten wichtige Links oder andere Dateien gesammelt werden oder als Referenz darauf verwiesen werden. Damit es den Status ''Befugte'' gibt, muss es zudem eine Rollenverteilung geben, wem welche Rechte zu stehen oder beispielsweise wer nur Nachrichten empfangen kann.
  111. Zudem ist eine Speicherung einzelner Nachrichten aus dem Feed möglich, welche im Nachhinein in den Bookmarks oder auch Lesezeichen einsehbar sind.\\
  112. Des Weiteren können Push-Benachrichtigungen angezeigt werden, sodass das Risiko, wichtige Nachrichten zu übersehen, minimiert wird.
  113. Zuletzt gibt es noch ein Nutzerprofil. Hier können Daten zur Person eingetragen und angezeigt werden wie zum Beispiel das Profilbild, deren Status an der technischen Hochschule oder die Matrikelnummer.
  114. Für den Optimalfall einer Übernahme der App von der Hochschule soll modulorientiert und wartungsaufwandsarm gearbeitet werden, um die spätere Verwaltung zu erleichtern. Auch wird Wert gelegt auf eine nutzerfreundliche und möglichst intuitive Bedienoberfläche.
  115. %
  116. \subsection*{3.1. Technische Umsetzung}
  117. \phantomsection\addcontentsline{toc}{subsection}{3.1. Technische Umsetzung}
  118. Zur Umsetzung des Projektes fiel die Zielsetzung auf die Entwicklung einer progressiven Web-App. Aufgrund ihrer Plattformunabhängigkeit und Kompatibilität mit den TH-Servern (VPN und Eduroam) und laut Erfahrungen von Professor Dr. Hopf stellt dies eine gute Lösung und sichere Wahl dar. Ebenfalls, was die Datenschutzvorkehrungen der Hochschule betrifft. \\
  119. Es werden die Codesprachen HTML, CSS und JavaScript verwendet und als Frameworks Vue.js, Bootstrap und node.js. \\
  120. Als Datenbank dient MongoDB und das zugehörige Framework mongoose.
  121. %
  122. \section*{4. Projektorganisation}
  123. \phantomsection\addcontentsline{toc}{section}{4. Projektorganisation}
  124. Wöchentlich fand ein Treffen, zum Austausch und zur Besprechung zurückliegender und anstehender Aufgaben, statt. An diesem Treffen nahmen in der Regel alle Mitglieder dieser Projektgruppe und der Projektbetreuer Prof.Dr. Matthias Hopf teil. Konnten Teammitglieder, gleich welcher Gründe, an einem Treffen nicht teilnehmen, so haben alle sich unverzüglich über Absprachen und den neu anstehenden Aufgaben selbstständig erkundigt.
  125. %
  126. \subsection*{4.1. Trello}
  127. \phantomsection\addcontentsline{toc}{subsection}{4.1. Trello}
  128. Zu Beginn des Projekts wurde entschieden, dass zur Verbesserung des Arbeitsablaufs ein Organisationstool hilfreich wäre. So fiel ist Trello in Gespräch gekommen.\\
  129. Trello ist ein graphisch sehr gut aufbereitetes Projektmanagement-Tool in Form von Kanban-Boards. In der kostenfreien Version, ist es möglich ''unbegrenzt [viele] Boards, Listen, Karten, Mitglieder, Checklisten und Anhänge'' hinzuzufügen und zu nutzen\cite{trello:price}. Zur typografischen Gestaltung der Karten, um zum Beispiel eine Liste einzufügen ist die Nutzung von einigen Markdown-Markup Elementen möglich.\\
  130. Dem Projekt zugute kommend ist die sehr einfache Bedienbarkeit, Plattform unabhängige Verfügbarkeit, sowie die gute Übersichtlichkeit der Boards. Nachteilig ist, dass es nur sehr eingeschränkt die Zeitkomponente abbilden kann. Dies ist nur über die sogenannten ''Plugins'' möglich, wobei in der kostenfreien Version nur ein Plugin je Board zugleich genutzt werden kann. So kann einem Board entweder die Funktion ''Gantt-Diagramme nutzen'' oder ''Storypoints den Karten hinzufügen'' verwendet werden.\\
  131. Diese Einschränkung führte zur der Entscheidung gegen die Nutzung von Trello im Team.
  132. %
  133. \subsection*{4.2. Bitrix24}
  134. \phantomsection\addcontentsline{toc}{subsection}{4.2. Bitrix24}
  135. Nach dem Ausschluss von Trello begann die Umsicht nach einem anderen Tool, dass kostenfrei mit einer Gruppe von fünf Personen genutzt werden kann. Und es sollte die Funktionen Gantt-Diagramme erstellen, Aufgaben an Mitglieder verteilen und den Gewichtungs-Punkte oder ''Storypoints'' an Aufgaben zuweisen erfüllen.\\
  136. Bitrix24 hat diese Anforderungen erfüllt, war jedoch bereits auf den ersten Blick deutlich unübersichtlicher und komplexer in der Handhabung. Da es sich bei Bitrix24 in erster Linie um ein umfangreiches CRM-System handelt, mit vielen weiteren Funktionen wie ''Aufgabenverwaltung für Gruppen'', ''Projektplanung und -management'' und ''Team-Chat''\cite{bitrix:feature}.\\
  137. Auch nach der Deaktivierung und Ausblendung sämtlicher Funktionen, die die Nutzung von Bitrix24 komplizierter machten, blieb die Benutzeroberfläche noch unübersichtlich. Was die Umsetzung der Aufgaben als Kanban-Karten mit Gewichtungs-Punkten und der zeitlichen Darstellung der Aufgaben in einem Gantt-Diagramm betrifft, so war dies sehr angenehm und vollends zufriedenstellend möglich.\\
  138. So wurden zahlreiche organisatorische Fristen, sowie Aufgaben organisatorischer und entwicklungs-technischer Natur in Bitrix24 erfasst und anschließend in einem wöchentlichen Treffen vorgestellt. Im Weiteren wurde die Nutzung und Pflege des Tools an alle Mitglieder übertragen.\\
  139. Es stellte sich am Ende des ersten Projektabschnittes heraus, dass das Tool Bitrix24 aufgrund der komplexen und unübersichtliche Benutzeroberfläche kaum genutzt wurde.
  140. %
  141. \section*{5. Entwicklerblog}
  142. \phantomsection\addcontentsline{toc}{section}{5. Entwicklerblog}
  143. Die Wiki Blogeinträge in dem hochschulinternen github Repository dienen dazu, die Projektfortschritte transparent zu gestalten und eine kurze prägnante Zusammenfassung für Professoren und Studierende zu gewährleisten. Einzusehen sind die Beiträge auf der git efi Seite \cite{gitefi}.
  144. %
  145. \subsection*{5.1. Protokollierung}
  146. \phantomsection\addcontentsline{toc}{subsection}{5.1. Protokollierung}
  147. Für die Protokollierung wurden in regelmäßigen Intervallen Dokumentationen über die Tätigkeiten aller Teammitglieder geführt und diese folglich in Schrift festgehalten. Enthalten sind die Aufgabenaufteilung und die bisherige Umsetzung aller Projektteilnehmer in einer bestimmten Zeit, welche anschließend gebündelt zusammengefasst wurden.
  148. %
  149. \subsection*{5.2. Blogentwurf}
  150. \phantomsection\addcontentsline{toc}{subsection}{5.2. Blogentwurf}
  151. Da das git efi nicht nur für Professoren sondern auch Studierenden der Fakultät efi zugänglich ist, werden die Vorgänge des Projekts in kurzen Sätzen und möglichst verständlich wiedergegeben. So können sich auch Studierende außerhalb des Fachgebietes ein ungefähres Bild von dem Fortschritt der OHM News-App machen. Nach dem Umformulieren und Reduzieren auf die Kernaussagen wurden Einträge in kontinuierlichen Abständen auf dem Hochschul github\cite{gitefi} zum Abrufen hochgeladen. Diese berufen sich auf etwa ein Monats-Abstände oder kürzer. Bei neuen Einträgen wird Professor Dr. Hopf informiert, sodass er stets den Verlauf des Projektes nachvollziehen kann. In zeitlich chronologischer Reihenfolge aufgelistet, vereinfacht dies den Überblick. Insgesamt wurden im Laufe des OHM News-App Projektes sechs Wiki Blogeinträge erstellt.
  152. %
  153. \section*{6. Pflichtenheft}
  154. \phantomsection\addcontentsline{toc}{section}{6. Pflichtenheft}
  155. Das Pflichtenheft hat die Gruppe gemeinsam zusammengestellt. Dabei sollte der Datenzugriff per MongoDB erzeugt werden, alternativ könnte auch eine Schnittstelle zur Verfügung gestellt werden. Die Grafische UI der PWA sollte einen Login, ein Menü, eine Suche, ein Profil, einen Filter nach Hashtags, ein Dashboard, Einstellungen, das Nachrichtfeld und ein Formular zum Verfassen von Nachrichten umfassen. Ein Abhängigkeitsdiagramm soll erstellt werden. Die Anwendungslogik sollte im Bereich des Routings, der Darstellung und Speicherung von Nachrichten und dem LDAP-Login umgesetzt werden. Codetests sollten durchgeführt werden und das Rollenkonzept der Nutzer sollte festgelegt werden.\\
  156. Des Weiteren sollte ein Anwendungsname gefunden und ein Logo erstellt werden. Ein UX Konzept sollte aufgestellt werden. Wenn es zeitlich noch möglich wäre, hätte man die Funktionen umsetzen sollen um die Datenbankabrufe zu filtern und Kanälen zu folgen. Ebenso hätte man die Anzeigekriterien festlegen können.
  157. %
  158. \section*{7. Konzepterstellung}
  159. \phantomsection\addcontentsline{toc}{section}{7. Konzepterstellung}
  160. Der erste Schritt zur Definition eines Layoutentwurfs war die Erstellung von Scribbles. Unter einem Scribble versteht man einen groben ersten Entwurf, der zur Ideenfindung beitragen soll. Nach Festlegung der grundsätzlichen Projektidee, zeichnete jedes unserer Teammitglieder Scribbles für verschiedene Seiten der App, die wir im Anschluss zusammen diskutierten. Wichtig war uns hierbei, dass jedes Teammitglied erst eigene Ideen entwickelte, um so viele verschiedene Aspekte zu sammeln.\cite{scrib} \\
  161. Wir versuchten alle Ideen zu vereinen und einigten uns auf einen Layoutentwurf, welcher im Anschluss in einem detaillierten Screendesign umgesetzt wurde. In Abbildung \ref{layout} ist das Screendesign für die Startseite zu sehen. Wir legten vor allem den Fokus auf die Startseite, da diese der erste Baustein der App werden sollte. Die Navigation auf die anderen Seiten erfolgt über eine Leiste am unteren Displayrand. Die weiteren Seiten legten wir zu Beginn fest, arbeiteten diese allerdings erst mit der Zeit detaillierter aus. Ein genauer Aufbau der App wird unter 9.1. beschrieben. \\
  162. \begin{figure}[H]
  163. \centering
  164. \includegraphics[width=4.5cm]{Layout}
  165. \caption{Layoutentwurf der Startseite}
  166. \label{layout}
  167. \end{figure}
  168. Bevorstehende Implementierungen von Funktionalitäten sollten, wenn bereits im Vorfeld möglich, ebenfalls in den Layoutentwürfen berücksichtigt werden. Änderungen sind natürlich auch zu einem späteren Zeitpunkt möglich, erhöhen allerdings den Aufwand. Deswegen wurde versucht, möglichst viele Funktionalitäten bereits in die Layoutentwürfe miteinzubeziehen.\\\\
  169. Wir einigten uns im Projektteam darauf die App gemäß den Material Design Richtlinien von Google zu gestalten. Material Design ist eine von Google entwickelte Designvorgabe, die auf materienartigen Flächen basiert und dadurch zu einem sehr minimalistischen \mbox{Design} führt. Ziel dieser Designsprache ist unter anderem eine intuitive Benutzeroberfläche. Die Richtlinien wurden bei der Erstellung des Screendesigns berücksichtigt. \cite{md,md2}
  170. %
  171. \section*{8. Namensfindung}
  172. \phantomsection\addcontentsline{toc}{section}{8. Namensfindung}
  173. Zu Anfang haben wir uns für den Titel OHM-Management entschieden, mit dem Wissen, dass es höchstwahrscheinlich nicht dabei bleibt, da das Wort Management mit unserer angestrebten Funktionalität der App nur einschränkend passte.
  174. Die Verwendung des Wortstammes Kommunikation war für unsere Benennung auch nicht zutreffend, insofern der Austausch von Information nur in eine Richtung erfolgt.
  175. Zusätzlich gestaltete sich die Namensfindung etwas schwierig, da wir sozusagen eine App für die TH-Nürnberg entwickelten, die man auch in Verbindung mit dem OHM-Zeichen kennt. Diesbezüglich wollten wir uns bei der Benennung auch an dieses anlehnen. Um dies tun zu können, mussten wir uns erst einmal informieren, ob es ähnliche Namen bereits gibt die man aus diesem Grund dementsprechend nicht verwenden kann.
  176. %
  177. \subsection*{8.1. Recherche}
  178. \phantomsection\addcontentsline{toc}{subsection}{8.1. Recherche}
  179. Bevor also der erste Schritt in Richtung Namensfindung gemacht werden konnte, recherchierten wir über bereits vorhandene Namen, die von der TH-Nürnberg genutzt werden. Neben Namen wie InfoTHek, OHMdoc und OHM-Shop, welche für unser Thema eher irrelevant wirkten, fanden wir auch den Titel OHM-News. Dies war ein Online Journal, welches jedoch, wie sich später rausgestellt hatte, eingestellt wurde.
  180. %
  181. \subsection*{8.2. Brainstorming}
  182. \phantomsection\addcontentsline{toc}{subsection}{8.2. Brainstorming}
  183. In der Zwischenzeit setzten wir jedoch die Ideensammlung weiter fort und präsentierten in der Gruppe einzelne Namensvorschläge. Hieraus entstand eine Liste an kreativen Gedanken. Unsere Favoriten :
  184. \begin{itemize}
  185. \item \b{ON AIR}
  186. \begin{itemize}
  187. \item \b{O}HM \b{N}ews \b{A}pp for \b{I}nformation and \b{R}ediscovery/\b{R}ecommendations
  188. \item \b{O}HM \b{N}ews Stream for \b{A}ctivities, \b{I}nformation and \b{R}ecommendations
  189. \end{itemize}
  190. %
  191. \item \b{ON STREAM}
  192. %
  193. \begin{itemize}
  194. \item \b{O}HM \b{N}ews \b{Stream}
  195. \end{itemize}
  196. %
  197. \item \b{OHM News}
  198. %
  199. \item \b{TH i s}
  200. %
  201. \item \b{INFOhm}
  202. \end{itemize}
  203. Alle Vorschläge waren sehr durchdacht und kreativ. Jedoch hatten einige nicht ganz die Wirkung die wir uns erhofften, denn wir waren der Meinung, dass man das Wort On Air eher mit einem Radiosender verbindet. Ebenfalls der Nachteil bei der Idee On Stream war es, dass man stark an Streaming Dienste wie zum Beispiel Netflix erinnert wird.
  204. %
  205. \subsection*{8.3. Ergebnis}
  206. \phantomsection\addcontentsline{toc}{subsection}{8.3. Ergebnis}
  207. Nach langem Überlegen kamen wir auf den Namen OHM News zurück und dieser überzeugte uns im Endeffekt alle. Dieser Titel war recht kurz, er ist leicht zu verstehen ohne viel nachzudenken, man verbindet ihn auf Anhieb mit der TH-Nürnberg auf Grund des Wortes OHM und er verweist auf die Funktionalität die unsere App bereitstellt, die da wären Neuigkeiten, sprich News, für die Studenten der Hochschule bereitzustellen.
  208. %
  209. \subsection*{8.4. Claim}
  210. \phantomsection\addcontentsline{toc}{subsection}{8.4. Claim}
  211. Parallel zur Namensfindung, befassten wir uns auch mit dem Claim unseres Produktes. Da ein Claim die Funktion unserer App auf den Punkt bringen soll, und dabei kurz, leicht zu merken und aussagekräftig sein sollte, entschieden wir uns für eine Formulierung der Art ''nur relevante Themen werden angezeigt''. Nach einer kurzen Denkphase kamen wir auf den Claim ''See only what matters'', beziehungsweise ''Only see what matters'' vor. Dies kam bei uns allen sehr gut an, jedoch wussten wir nicht, welche von den beiden Optionen die erhoffte Bedeutung am besten hervorbringt. Sie haben zwar die selbe Bedeutung, trotz alle dem empfanden wir, dass die Betonung des Wortes „Only“ auf zwei verschiedene Faktoren des Satzes liegt. Nach reichlicher Überlegung entschieden wir uns also für die Formulierung ''See only what matters'' als Claim für unsere App.
  212. %
  213. \section*{9. Corporate Design}
  214. \phantomsection\addcontentsline{toc}{section}{9. Corporate Design}
  215. Um das ganze Konzept stimmig zu gestalten, wurde ein Corporate Design erstellt.
  216. Wichtigste Grundlage hierfür ist das Farbkonzept. Da die App im Hochschulrahmen verwendet werden soll, wurde für die Grundfarbe der Blauton des Hochschullogos gewählt, umso eine Zugehörigkeit zu symbolisieren. Ergänzend zu diesem Blauton werden noch zwei dezente Grautöne verwendet, wie in Abbildung \ref{farbschema} zu sehen ist. \\
  217. %
  218. \begin{figure}[H]
  219. \centering
  220. \includegraphics[width=12cm]{Farbschema_CD}
  221. \caption{Farbkonzept}
  222. \label{farbschema}
  223. \end{figure}
  224. \noindent Für die Schrift wird in der gesamten App die von Google Material Design vorgegebene Schriftart Roboto verwendet. Diese ist eine serifenlosen Schriftart und deshalb durchweg gut lesbar.
  225. Auch ein Logo ist wichtig, um einen gewissen wiedererkennungswert für die App zu schaffen. Da wir uns in der Gruppe für den App-Namen ''Ohm-News'' entschieden haben, war der erster Gedanke eine Zeitung für das Logo herzunehmen (siehe Abbildung \ref{logo1}). Die Grafik war allerdings schwierig in das Produkt einzubinden, weil sie sehr detailreich ist. \\
  226. %
  227. \begin{figure}[H]
  228. \centering
  229. \includegraphics[width=4cm]{Logo1_CD}
  230. \caption{Erster Logoentwurf}
  231. \label{logo1}
  232. \end{figure}
  233. \noindent Ein zweiter etwas minimalistischer Entwurf ist in Abbildung \ref{logo2} zu sehen, für welchen sich das Projektteam schlussendlich auch entschied. Es zeigt ein Globussymbol mit dem Hochschullogo im Zentrum, um auch hier wieder die Verbindung zur Hochschule schaffen. \\
  234. %
  235. \begin{figure}[H]
  236. \centering
  237. \includegraphics[width=4cm]{Logo2_CD}
  238. \caption{Finales Logo}
  239. \label{logo2}
  240. \end{figure}
  241. %
  242. \noindent Das Logo wurde dann auch zu einem App Icon erweitert. In Abbildung \ref{icons} ist das Icon für Android sowie IOS Geräte zu sehen. Das Android Icon wurde analog den Material-Design Richtlinien gestaltet und besitzt deshalb einen leichten Schatten. Bei dem IOS Icon wurde das Logo lediglich auf einen einfarbigen Hintergrund gesetzt. \\
  243. %
  244. \begin{figure}[H]
  245. \centering
  246. \includegraphics[width=10cm]{Icons_CD}
  247. \caption{App Icons}
  248. \label{icons}
  249. \end{figure}
  250. %
  251. \section*{10. Erstellung der Mockups}
  252. \phantomsection\addcontentsline{toc}{section}{10. Erstellung der Mockups}
  253. Auf Basis des Screendesigns wurden erste Mockups erstellt, welche mittels HTML und CSS umgesetzt wurden. Um die Elemente entsprechend den Material-Design Richtlinien zu gestalten, wurde das CSS-Framework Bootstrap mit eingebunden, das eine Auswahl an vordefinierten Gestaltungselementen und Stilen in Form von CSS-Stylesheets bereitstellt. Dazu gehören Elemente wie Buttons, Formulare, Navigationszeilen und viele mehr. Wir verwendeten Bootstrap Dateien, die auf Material Design abgestimmt sind. So wird ein einheitliches Design gewährleistet und die Styles müssen nicht selbst erstellt werden. Ein weitere Vorteil von Bootstrap, ist, dass es ein responsives Webdesign unterstützt und man deshalb plattformunabhängig entwickeln kann. Dafür sorgt ein Grid-Layout, welches den Benutzerbildschirm in 12 Spalten teilt und die Elemente, je nach verfügbarer Auflösung, anzeigt. Im ersten Projektabschnitt legten wir den Fokus besonders auf eine mobile Ansicht. Eine Desktopansicht wird ebenfalls unterstüzt, kann allerdings noch stark optimiert werden. \cite{bootstrap} \\
  254. Durch die Ergänzung von eigenen CSS-Dateien konnten Änderungen an den vordefinierten Stilen vorgenommen werden. Sowohl unsere als auch die von Bootstrap bereitgestellten Dateien, wurden auf Grundlage von Less-Stylesheets erstellt. Dabei wird auf effiziente Weise CSS generiert. Variablen sowie Funktionen sind möglich und Vererbung wird durch \mbox{verschachtelte} Selektoren dargestellt. \cite{less} \\
  255. Wir habe für jeden Menüpunkt eine HTML-Seite erstellt, welche im Unterpunkt genauer beschrieben werden.
  256. %
  257. \subsection*{10.1. Aufbau der App}
  258. \phantomsection\addcontentsline{toc}{subsection}{10.1. Aufbau der App}
  259. %
  260. \begin{figure}[H]
  261. \begin{minipage}[t]{5cm}
  262. \vspace{0pt}
  263. \centering
  264. \includegraphics[width=4cm]{Homescreen_MU}
  265. \caption{Startseite}
  266. \label{abbildung_homescreen}
  267. \end{minipage}
  268. \hfill
  269. \begin{minipage}[t]{11cm}
  270. \vspace{0pt}
  271. Auf der Startseite der App gelangt der Nutzer als erstes auf einen Newsfeed. Der Newsfeed besteht aus einzelnen Nachrichten in Form von Karten und soll für jeden Nutzer nur \mbox{relevante} Nachrichten anzeigen. Jede Nachricht besitzt einen oder \mbox{mehrere} Tags. Eine Nachricht wird für einen Nutzer als relevant eingestuft, wenn dieser mindestens einen Tag aus der Nachricht abonniert hat. Somit erhält jeder Nutzer eine individuelle Startseite. Zusätzlich befindet sich auf der Nachrichtenkarte oben rechts ein Icon, welches die Nachricht zu einer Fakultät zuordnet. Unten rechts kann das Lesezeichen-Icon geklickt werden, um eine Nachricht zu speichern. Auf diese Weise können die Studierenden wichtige Informationen schnell wiederfinden.\\\\
  272. Im Header ist die Suche zu finden, in der Tags explizit gefiltert werden können. Der \mbox{Header} ist von jeder Seite aus zugängig. Im Footer befindet sich die Navigationszeile, von wo aus der Nutzer auf die weiteren Seiten gelangt.
  273. \end{minipage}
  274. \end{figure}
  275. %
  276. \begin{figure}[H]
  277. \begin{minipage}[t]{5cm}
  278. \vspace{0pt}
  279. \centering
  280. \includegraphics[width=5cm]{Links_MU}
  281. \caption{Infoseite}
  282. \label{abbildung_infoseite}
  283. \end{minipage}
  284. \hfill
  285. \begin{minipage}[t]{11cm}
  286. \vspace{0pt}
  287. Der zweiten Menüpunkt, der durch ein Globus-Icon dargestellt wird, soll eine Informationsseite beinhalten. Das Konzept hierfür ist allerdings noch nicht konkret ausgearbeitet, da wir uns zuerst auf die Mitteilungsfunktionen konzentrieren wollten. Aktuell wird ein Empty State angezeigt.
  288. \end{minipage}
  289. \end{figure}
  290. %
  291. \medskip
  292. \begin{figure}[H]
  293. \begin{minipage}[t]{5cm}
  294. \vspace{0pt}
  295. \centering
  296. \includegraphics[width=5cm]{CreateMessage_MU}
  297. \caption{Formular}
  298. \label{abbildung_createmsg}
  299. \end{minipage}
  300. \hfill
  301. \begin{minipage}[t]{10cm}
  302. \vspace{0pt}
  303. Über das Plus-Icon, in der Mitte der Navigationszeile, gelangt man zu einem Formular. Hier können neue Nachrichten erstellt werden. Nachrichten sollen nur von ausgewählten Nutzergruppen, wie Fakultäten, Studienbüro und ähnlichen gesendet werden können.
  304. Für eine Nachricht wird ein Betreff, mindestens ein Tag und der Nachrichteninhalt benötigt. Es soll eine Auswahl an vordefinierten Tags geben, damit am Ende nicht jeder Verfasser wahllos Tags setzten kann und \mbox{Duplikate} vermieden werden. Dieser Menüpunkt ist der einzige in dem keine Navigationszeile angezeigt wird. Nach Absenden einer Nachricht, gelangt man zurück auf die Startseite. Über den Button 'Abbrechen' wird man auf den vorherigen Menüpunkt zurückgeleitet.
  305. \end{minipage}
  306. \end{figure}
  307. %
  308. \begin{figure}[H]
  309. \begin{minipage}[t]{5cm}
  310. \vspace{0pt}
  311. \centering
  312. \includegraphics[width=5cm]{Gespeicherte_MU}
  313. \caption{Gespeicherte}
  314. \label{abbildung_gespeichert}
  315. \end{minipage}
  316. \hfill
  317. \begin{minipage}[t]{11cm}
  318. \vspace{0pt}
  319. Der nächste Menüpunkt wird über das Lesezeichen-Icon erreicht und zeigt die gespeicherten Nachrichten an. Diese Seite ist ähnlich aufgebaut wie der Newsfeed der Startseite, beinhaltet allerdings nur die vom Nutzer gespeicherten Nachrichten.
  320. \end{minipage}
  321. \end{figure}
  322. %
  323. \medskip
  324. \begin{figure}[H]
  325. \begin{minipage}[t]{5cm}
  326. \vspace{0pt}
  327. \centering
  328. \includegraphics[width=5cm]{Profil_MU}
  329. \caption{Profil}
  330. \label{abbildung_profil}
  331. \end{minipage}
  332. \hfill
  333. \begin{minipage}[t]{11cm}
  334. \vspace{0pt}
  335. Der letzte Menüpunkt ist das Profil. \\
  336. Oben sieht man zuerst das Profilbild, hier verwendeten wir die runde Form anstatt der üblichen Quadratischen. Darunter sieht man dann die im Vorfeld angegebene Information des Benutzers. Am Ende der sogenannten Karte befinden sich zwei Knöpfe, die Anzeigen wie vielen Kanälen man folgt und wie viele Beiträge man bis jetzt gespeichert hat. Auf der Karte rechts oben im Eck findet man den Bearbeitungs-Knopf, in Form eines kleinen Stiftes, dies ermöglicht dem Benutzer, die Seite gemäß seinen Wünschen anzupassen.
  337. \end{minipage}
  338. \end{figure}
  339. %
  340. \section*{11. Single-Page Entwicklung}
  341. \phantomsection\addcontentsline{toc}{section}{11. Single-Page Entwicklung}
  342. Neben klassischen Webanwendungen gibt es ebenfalls Single-Page Webanwendungen. Bei klassischen Webapplikationen gibt es mehrere untereinander verlinkte HTML-Dokumente, die dann gemeinsam eine komplette Anwendung ausmachen. Der Nachteil hierbei ist, dass die Seite beim Wechsel durch die erneute Kommunikation mit dem Server neu heruntergeladen werden muss. SPA’s jedoch bestehen nur aus einer HTML-Datei. Dies bewirkt, dass neue oder veränderte Daten dynamisch geladen werden und somit die Kommunikation zwischen Server und Client verringert wird. Es ermöglicht dem Benutzer, nach dem einmaligen laden der Seite, diese auch weiterhin im offline Modus zu steuern. Sollte also die Interaktion mit dem Server unterbrochen werden, werden die zwischengespeicherten Daten einfach aus dem Webbrowser verwendet.\cite{spa:1}\cite{spa:2}
  343. %
  344. \subsection*{11.1. Warum Vue.js?}
  345. \phantomsection\addcontentsline{toc}{subsection}{11.1. Warum Vue.js?}
  346. Neben dem Vue.js Framework gibt es noch weitere wie zum Beispiel react.js, angular.js, meteor.js und viele mehr. Warum wir uns jedoch für das Vue.js Framework entschieden haben, werden wir Ihnen nun erläutern. Vue.js das jüngste von den drei größten Frameworks, es hat jedoch den Vorteil, dass es aus den Fehlern der Vorgänger lernen konnte und diese schon im Vorfeld überdenken und ausmerzen konnte. Da es auf Sprachen wie HTML, CSS und JavaScript aufbaut, lässt es sich problemlos in schon bestehende Projekte einbauen.
  347. Die Syntax ist hierbei, im Vergleich zu anderen, besser lesbar. Hierfür werden nämlich sogenannte ''Single File Components'' verwendet.\cite{vue:warum} Sogenannte Komponenten sind wiederverwendbare Vue-Instanzen mit einem Namen, die als benutzerdefiniertes Element in einer Vue-Stamminstanz verwendet werden. Wie so eine erstellte Komponente aussieht, werden wir Ihnen im folgenden erörtern.
  348. %
  349. \subsection*{11.2. Vue.js in vorhandene Mockups einbinden}
  350. \phantomsection\addcontentsline{toc}{subsection}{11.2. Vue.js in vorhandene Mockups einbinden}
  351. Nach reichlicher Recherche und dem einlesen in das uns vorher unbekannte Framework, war es an der Zeit unsere HTML-Seiten in Vue-Komponenten umzuwandern. Wir setzten uns erstmal zusammen und erstellten die Startseite.
  352. Im Folgenden wird der Aufbau der Home-Komponente näher erläutert. In Listing 1 ist der dazugehörige Quellcode zu sehen. Nicht enthalten sind zur Komponente zugehörige Methoden. Die Home-Komponente wird in unserem Projekt als HomeRouter betitelt.
  353. %
  354. \begin{center}
  355. \begin{lstlisting}[caption={HomeRouter-Komponente},captionpos=b]
  356. const HomeRouter = {
  357. template: `
  358. <div id="om-msg-cards">
  359. <MsgCard
  360. v-for="id in messagelist.slice().reverse()"
  361. :key="id"
  362. :msg="messages[id] || {}"
  363. ></MsgCard>
  364. </div>`,
  365. //Restliche Komponente
  366. ...
  367. \end{lstlisting}
  368. \end{center}
  369. %
  370. Im Newsfeed, welcher der Hauptbestand der Startseite ist, wird eine Liste von Nachrichten dynamisch generiert, sodass jeder Nutzer später einmal eine individuelle Ansicht erhält, abhängig von den Tags, die dieser abonniert. \\
  371. Jede Komponente besitzt ein Template in Form eines Strings, welcher HTML-Code \mbox{beinhaltet}. Die Komponente HomeRouter ist verschachtelt und enthält die Komponente MsgCard. Der Quellcode für diese Komponete ist in Listing 2 zu sehen.
  372. %
  373. \begin{center}
  374. \begin{lstlisting}[caption={MsgCard-Komponente},captionpos=b]
  375. Vue.component('MsgCard', {
  376. template: `<div class="om-card card">
  377. <h6 class="msg-head">
  378. <b>{{ msg.subject }}</b>
  379. <img src="favicon.ico" width=20px height=20px>
  380. </h6>
  381. {{ msg.message }}<br><br>
  382. <a href="#">{{ msg.tag }}</a></p>
  383. <div class="om-card-footer"> <div class="om-user-line">
  384. <i class="material-icons">account_circle</i>
  385. Erstellt von {{ msg.user }}</div>
  386. <i class="material-icons">bookmark_border</i>
  387. </div></div>`,
  388. props: ['msg']
  389. });
  390. \end{lstlisting}
  391. \end{center}
  392. %
  393. Eine MsgCard stellt eine einzelne Nachricht in Form einer Karte dar. In der HomeRouter-Komponete geht eine For-Schleife alle vorhandenen Nachrichten-Ids durch. Dabei werden der MsgCard-Komponente alle relevanten Informationen übergeben, die für eine Darstellung benötig wird. Am Ende stellt die App eine fortlaufende Liste mit allen Nachrichten dar.\\\\
  394. Da wir nun ein bisschen geübter im Umgang mit Vue waren, teilten wir uns die restlichen Seiten auf. Dabei gingen wir ähnlich vor, wie bei der Home-Komponente.
  395. %
  396. \subsection*{11.3. Routing}
  397. \phantomsection\addcontentsline{toc}{subsection}{11.3. Routing}
  398. Vue.js bietet eine Reihe von Funktionen, mit denen Sie wiederverwendbare Webkomponenten erstellen können. Routing ist eine dieser Methoden. Der Benutzer kann somit zwischen den Seiten wechseln, ohne diese erneut zu aktualisieren. Dies ermöglicht dem Benutzer eine einfache und dynamische Navigation durch die Webanwendung. Wir werden Ihnen nun, anhand unseres Codes erklären, wie ein Vue.js-Router funktioniert.\cite{vue:router} \\
  399. Zunächst richten wir hierfür die Navigation über die Navigationsbar ein, die wir mittels einem Router-Link-Element erstellt haben. Dieser gibt an, auf welche der angegebenen JS-Datei zugegriffen wird sobald man auf das ausgewählte Item klickt.
  400. %
  401. \begin{center}
  402. \begin{lstlisting}[caption={Navbar},captionpos=b]
  403. <nav class="nav nav-tabs nav-justified om-nav" v-if="$route.path !=='/createMessage' ">
  404. <router-link to="/home" class="nav-item nav-link">
  405. <i class="material-icons">home</i></router-link>
  406. <router-link to="/files" class="nav-item nav-link">
  407. <i class="material-icons">language</i></router-link>
  408. <router-link to="/createMessage" class="nav-item nav-link outlined">
  409. <i class="material-icons">add_circle</i></router-link>
  410. <router-link to="/bookmark" class="nav-item nav-link">
  411. <i class="material-icons">bookmark</i></router-link>
  412. <router-link to="/profil" class="nav-item nav-link">
  413. <i class="material-icons">person</i></router-link>
  414. </nav>
  415. \end{lstlisting}
  416. \end{center}
  417. %
  418. Im Folgenden werden Komponenten definiert und dann in ein neues Array von Objekten, so genannte Routen, eingefügt. Zu beachten ist die Zuordnung eines URL-Pfads zu der dazugehörigen Komponente. Daraufhin wird ein Vue-Router definiert, der an ein neues Vue-Objekt übergeben wird. Wenn nun beispielsweise ''/home'' geladen ist, wird die Home-Komponente in der Router-Ansicht gerendert und aufgerufen. Die erste Zeile mit dem ''/'' steht für die Startseite, auf die man gelangt, sobald man die App öffnet.\cite{vue:router3} \\
  419. %
  420. \begin{center}
  421. \begin{lstlisting}[caption={Routing},captionpos=b]
  422. const routes = [
  423. { path: "/", component: HomeRouter },
  424. { path: "/home", component: HomeRouter },
  425. { path: "/files", component: FileRouter },
  426. { path: "/createMessage", component: CreateMsgRouter },
  427. { path: "/bookmark", component: BookmarkRouter },
  428. { path: "/profil", component: ProfilRouter },
  429. ];
  430. const router = new VueRouter({
  431. routes
  432. });
  433. var app = new Vue({
  434. router,
  435. el: '#api',
  436. methods: {
  437. ...
  438. },
  439. });
  440. \end{lstlisting}
  441. \end{center}
  442. %
  443. \section*{12. Service Worker}
  444. \phantomsection\addcontentsline{toc}{section}{12. Service Worker}
  445. Der ServiceWorker ist eine JavaScript Datei, die üblicherweise im root-Verzeichnis der Webanwendung liegt. Für die Funktionsweise ist die Namensgebung der Datei nicht maßgebend. Damit der ServiceWorker überhaupt funktionieren kann, wird eine SSL-Verbindung benötigt. Ist eine sicher Verbindung gegeben, kann der ServiceWorker (im Weiteren auch mit ''SW'' abgekürzt) nach erfolgreichem Laden der Webseite im Browser des Clients registriert werden. Nachdem der SW zeitlich unabhängig, also asynchron im Browser läuft, muss bei der Entwicklung und Umsetzung des ServiceWorker-Codes darauf geachtet werden, dass in Promises geschrieben wird. Da Promises ein wenig schwieriger nachzuvollziehen sind und insbesondere das Problem der sogenannten Callback-Hell nicht lösen, bietet es dich an den SW in Async/Await Struktur zu schreiben. Diese basiert auf dem asynchronen Prinzip der Promises und lässt sich dennoch lesen wie synchrone Funktionen.\\
  446. Zunächst wird der ServiceWorker, nach dem vollständigen Laden der Webanwendung, versuchen sich im Browser des Clients zu registrieren. Schlägt die Registrierung fehl, ist dies ein Anzeichen dafür, dass der genutzte Browser keine ServiceWorker unterstützt. Es folgen zwei Code Umsetzungen, beide dienen der Registrierung:\\
  447. %
  448. \begin{center}
  449. \begin{lstlisting}[caption={Register, Promise/Then-Codestruktur},captionpos=b]
  450. /* Promise / Then */
  451. if ('serviceWorker' in navigator) {
  452. window.addEventListener('load', function() {
  453. navigator.serviceWorker.register('/serviceWorker.js').then(function(registration) {
  454. // Registration was successful
  455. }, function(err) {
  456. // registration failed
  457. });
  458. });
  459. }
  460. \end{lstlisting}
  461. \end{center}
  462. %
  463. \begin{center}
  464. \begin{lstlisting}[caption={Register, Async/Await-Codestruktur},captionpos=b]
  465. /* Async / Await */
  466. const registerServiceWorker = async () => {
  467. try {
  468. const registration = await navigator.serviceWorker.register('/serviceWorker.js', {scope: '/'});
  469. // Registration successful
  470. } catch (err) {
  471. // Registration failed
  472. }
  473. return;
  474. }
  475. if ('serviceWorker' in navigator) {
  476. window.addEventListener('load', registerServiceWorker());
  477. }
  478. \end{lstlisting}
  479. \end{center}
  480. %
  481. Einmal in der Promise.then Schreibweise und einmal in der Async/Await Schreibweise.\\
  482. Nach erfolgreicher Registrierung, folgt das ServiceWorker Event Installation. Dabei wird eine neue ServiceWorker Version im Browser angelegt und ein Abbild der festgelegten Dateien, hier als Beispiel nur die ''index.html'' (siehe filesToCache), im sogenannten ''Local Storage'' mittels Cache-Managements (auch Cache API genannt) gespeichert. Diese beiden Code Blöcke zeigen den Install-Vorgang:
  483. %
  484. \begin{center}
  485. \begin{lstlisting}[caption={Install, Promise/Then-Codestruktur},captionpos=b]
  486. /* Promise / Then */
  487. const cacheName = 'appname-v1-0';
  488. const filesToCache = [ '/index.html' ];
  489. self.addEventListener('install', function(event) {
  490. console.log('[ServiceWorker] Install');
  491. event.waitUntil(
  492. caches.open(cacheName).then(function(cache) {
  493. console.log('[ServiceWorker] Caching app shell');
  494. return cache.addAll(filesToCache);
  495. })
  496. );
  497. });
  498. \end{lstlisting}
  499. \end{center}
  500. %
  501. \begin{center}
  502. \begin{lstlisting}[caption={Install, Async/Await-Codestruktur},captionpos=b]
  503. /* Async / Await */
  504. const installNewCache = async (event) => {
  505. const cacheName = 'appname-v1-0';
  506. const filesToCache = [ '/index.html' ];
  507. const cacheStatic = await caches.open(cacheName);
  508. cacheStatic.addAll(filesToCache);
  509. console.log('[ServiceWorker] Cache static files.');
  510. return;
  511. }
  512. self.addEventListener('install', event => {
  513. // don't wait
  514. self.skipWaiting();
  515. // cache static files
  516. event.waitUntil(installNewCache());
  517. console.log('[ServiceWorker] Install');
  518. });
  519. \end{lstlisting}
  520. \end{center}
  521. %
  522. Anschließend folgt die Aktivierung. Hier wird aufgeräumt und zwar die alten ServiceWorker Versionen. Es sollte immer nur eine ServiceWorker Version je Webanwendung im Browser registriert und installiert sein.
  523. %
  524. \begin{center}
  525. \begin{lstlisting}[caption={Activate, Promise/Then-Codestruktur},captionpos=b]
  526. /* Promise / Then */
  527. self.addEventListener('activate', function(event) {
  528. // ServiceWorker activated
  529. event.waitUntil(
  530. caches.keys().then(function(cacheKeyList) {
  531. return Promise.all(
  532. cacheKeyList.map(function(cacheKeyList) {
  533. if (cacheWhitelist.indexOf(cacheKeyList) === -1) {
  534. // Old Cache removed
  535. return caches.delete(cacheKeyList);
  536. }
  537. })
  538. );
  539. })
  540. );
  541. return self.clients.claim();
  542. });
  543. \end{lstlisting}
  544. \end{center}
  545. %
  546. \begin{center}
  547. \begin{lstlisting}[caption={Activate, Async/Await-Codestruktur},captionpos=b]
  548. /* Async / Await */
  549. const cacheCleanUp = async () => {
  550. const cacheKeyList = await caches.keys();
  551. const deletions = cacheKeyList
  552. .filter(key => key.startsWith(appPrefix) && !cacheKeyList.includes(key))
  553. .map(key => {
  554. caches.delete(key)
  555. // Old Cache removed
  556. });
  557. for (const success of deletions) {
  558. await success;
  559. }
  560. return;
  561. }
  562. self.addEventListener('activate', event => {
  563. event.waitUntil(cacheCleanUp());
  564. clients.claim();
  565. // ServiceWorker activated
  566. });
  567. \end{lstlisting}
  568. \end{center}
  569. %
  570. Als letzter Schritt bleibt nur noch der 'fetch'. Das ist jenes Event in dem der ServiceWorker neue, aktuelle Dateien aus dem Netzwerk bezieht und die Dateiversionen im Cache, lokalen Speicher aktualisiert. Hier gibt es verschiedene Vorgehensweisen. Wir haben uns entschieden, das der ServiceWorker nur jene API GET-Anfragen speichern soll. Dies dient der Vermeidung doppelter und korrupter Datensätze. Im Weiteren soll überprüft werden, ob die angefragten Dateien mit den gespeicherten Dateien übereinstimmt. Falls nicht, gibt es keine gespeicherten Daten und eine Netzwerkanfrage wird zwingend benötigt. Andernfalls zeige die gespeicherten Daten an und tätige anschließend eine Anfrage ans Netzwerk. Wenn aktuellere Daten aus dem Netzwerk empfangen werden, so aktualisiere die gespeicherten Dateien und zeige die aktuelleren Daten an. Zusätzlich wird noch ein wenig der Ursprung der Anfrage überprüft.
  571. %
  572. \begin{center}
  573. \begin{lstlisting}[caption={Fetch, Promise/Then-Codestruktur},captionpos=b]
  574. /* Promise / Then */
  575. self.addEventListener('fetch', function(event) {
  576. /* We should only cache GET requests */
  577. if (event.request.method !== 'GET') {
  578. /* If we don't block the event as shown below,
  579. then the request will go to the network as usual. */
  580. console.log('[ServiceWorker] Fetch event ignored.',
  581. event.request.method, event.request.url);
  582. return;
  583. }
  584. event.respondWith(
  585. caches.match(event.request)
  586. .then(function(response) {
  587. return fetch(event.request)
  588. .then(function(response) {
  589. // Check if response is valid, status is 200, response type is basic
  590. // (indicates request is from origin, means that requests to third party
  591. // assets aren't cached as well.
  592. if(!response || response.status !== 200 || response.type !== 'basic') {
  593. return response;
  594. }
  595. caches.open(CACHE_NAME)
  596. .then(function(cache) {
  597. // We have to clone the response here because request bodies can only
  598. // be read once. Placing a response in the cache counts as a read.
  599. cache.put(event.request, response.clone());
  600. });
  601. // Cache hit - return response
  602. if (response) return response;
  603. return response;
  604. });
  605. })
  606. .catch(function(err) {
  607. // Report a lack of connectivity to the user.
  608. });
  609. });
  610. \end{lstlisting}
  611. \end{center}
  612. %
  613. \begin{center}
  614. \begin{lstlisting}[caption={Fetch, Async/Await-Codestruktur},captionpos=b]
  615. /* Async / Await */
  616. self.addEventListener('fetch', event => {
  617. /* We should only cache GET requests */
  618. if (event.request.method !== 'GET') {
  619. /* If we don't block the event as shown below,
  620. then the request will go to the network as usual. */
  621. console.log('[ServiceWorker] Fetch event ignored.',
  622. event.request.method, event.request.url);
  623. return;
  624. }
  625. event.respondWith(async function update() {
  626. try {
  627. var requestURL = new URL(event.request.url);
  628. // Start the network request as soon as possible.
  629. const networkPromise = fetch(requestURL);
  630. const cachedResponse = await caches.match(event.request);
  631. const networkResponse = await networkPromise;
  632. // Check if response is valid, status is 200, response type is basic
  633. // (indicates request is from origin, means that requests to third party
  634. // assets aren't cached as well.
  635. if (!networkResponse || networkResponse.status !== 200
  636. || networkResponse.type !== 'basic') return networkResponse;
  637. const cache = await caches.open(staticCacheKey);
  638. // We have to clone the response here because request bodies can only
  639. // be read once. Placing a response in the cache counts as a read.
  640. cache.put(event.request, networkResponse.clone());
  641. if (cachedResponse) return cachedResponse;
  642. // ServiceWorker fetch
  643. return networkResponse;
  644. } catch (err) {
  645. // Report a lack of connectivity to the user.
  646. }
  647. }());
  648. });
  649. \end{lstlisting}
  650. \end{center}
  651. %
  652. Die Bildausschnitte mit dem Code wurden teils von mir erstellt, teils stammen diese von dieser Internetseite\cite{dev:codeSource}\cite{sw:cacheThenNetwork}.
  653. %
  654. \pagebreak
  655. \section*{13. ''Add-To-Homescreen''-Funktion}
  656. \phantomsection\addcontentsline{toc}{section}{13. ''Add-To-Homescreen''-Funktion}
  657. Für die Implementierung der ''Add-to-Homescreen''-Funktionalität sind für Android, iOS und die diversen Browser unterschiedliche Schritte nötig.\\
  658. Bei Android genügt es eine manifest.json Datei im root-Verzeichnis der App abzulegen. Diese Manifest-Datei enthält Meta-Informationen von App-Icon, über App-Name, über die Start-URL bis hin zu der Theme-Farbe für den Hintergrund des App-Icons oder dem Navigationsmenü im Browser. Wenn ein Nutzer im Abstand von 5 Minuten (Standard-Einstellung) die Webseite zweimalig aufruft, so wird dieser gefragt, ob er die App zum Homescreen hinzufügen möchte. Ab da kann er diese über das App-Icon als auch über den Browser starten.\\
  659. Für iOS müssen die Meta-Informationen im Bereich des Head-Elements, der index.html eingefügt werden. So wird dort das Aussehen von mehreren App-Icon Versionen definiert. Dies wird benötigt, da die meisten Apple-Geräte unterschiedliche Density (Pixel per Inch) haben. Des Weiteren werden Konfigurationseinstellungen aktiviert oder deaktiviert, als auch das Aussehen des Ladescreens für iOS Geräte festgelegt.\\
  660. Auch die Windows-Mobilgeräte muss in der index.html Datei im Head-Bereich mittels Meta-Informationen mitgeteilt werden, wie der Ladebildschirm oder das Appicon aussehen soll (vgl.\cite{dev:homescreen}).
  661. %
  662. \section*{14. Erstellung der API-Schnittstelle}
  663. \phantomsection\addcontentsline{toc}{section}{14. Erstellung der API-Schnittstelle}
  664. Nachdem Server und die Clientseite der PWA funktionsfähig waren, war es noch relevant, dass zwischen diesen beiden kommuniziert werden kann. Dafür verwendet man die API.\cite{api} API steht für ''Application Programming Interface'' und diese Programmierschnittstelle kann wie in diesem Projekt zum Zugriff auf die Datenbank verwendet werden. Dabei handelt es sich in diesem Fall um einen RESTful Webservice.\cite{rest} \\
  665. %
  666. \begin{figure}[H]
  667. \centering
  668. \includegraphics[width=0.3\textwidth]{ajax.png}
  669. \caption{Ajax Modell einer Webanwendung. Quelle: nach Haischt, Daniel; https://de.wikipedia.org/wiki/Ajax\_(Programmierung)\#/media/File:Ajax-vergleich.svg}
  670. \label{ajax}
  671. \end{figure}
  672. %
  673. \noindent Das asynchrone Datenübertragungskonzept AJAX wurde zur Kommunikation zwischen Browser und Server verwendet.\cite{ajax1} \cite{ajax2} \cite{ajax3} Dabei werden wie in Abbildung \ref{ajax} zu sehen ist HTTP Requests von dem Browser an den Server geschickt. Diese werden daraufhin von dem Server verarbeitet und es werden entweder Daten zurückgegeben oder ein HTTP Response mit einer Rückmeldung. Mit der Verwendung von AJAX hat man einige Vorteile, zum Beispiel, dass man die Seite nicht neu laden muss, damit die neuen Inhalte erscheinen und dass der Browser bereits weiter Requests schicken kann, ohne auf die Responses des Servers warten zu müssen. Da die gesamte PWA des Projekts in JavaScript geschrieben ist, ist es zudem vorteilhaft, dass die AJAX-Engine in JavaScript geschrieben wird. Die Daten aus der Datenbank werden im JSON-Format transportiert.\\
  674. \\
  675. Um die Funktionsweise einer derartigen Schnittstelle zu verstehen, wurde der Code einer PWA die Professor Matthias Hopf geschrieben und der Gruppe zur Verfügung gestellt hat, analysiert. Dieser war jedoch etwas zu komplex für einen Einsteiger in das Thema. Deswegen wurde auf simplere Beispiele in Tutorials zurückgegriffen. Diese Beispiele konnten nun auf das eigene Projekt übertragen und getestet werden. Nach einer ausführlichen Erläuterung durch Professor Hopf anhand eines Beispiels im Projektzusammenhang, war ein grundsätzliches Verständnis über die Schnittstelle vorhanden. Nun konnte die konkrete Umsetzung der API beginnen.\\
  676. Die erste Methode die umgesetzt wurde war ''list\_messages''. Diese zeigt nun alle Nachrichten der Datenbank auf der Startseite der PWA an. Dazu musste zuerst vom Server die IDs aller Nachrichten abgefragt werden. Man schreibt eine API Funktion, die ein GET Request an den Server schickt. Dieser sucht nach den IDs per find Anfrage in der Datenbank und antwortet mit einem HTTP Response, der das Array mit den IDs enthält. Auf der Client Seite wird nun für jede ID per GET Request alle Informationen der Nachricht angefragt. Der Server sucht die gefragten Information und schickt diese zurück mit dem dazugehörigen Nachrichtentext an den Browser.\\
  677. %
  678. \begin{center}
  679. \begin{lstlisting}[caption={''list\_messages''-Methode},captionpos=b]
  680. list_messages: function () {
  681. $.ajax({url: "api/ids", method: "GET"})
  682. .done(jd => {
  683. _messagelist.splice(0, _messagelist.length);
  684. _messagelist.push.apply(_messagelist, jd);
  685. console.log("jd: "+jd);
  686. for (var e in jd) {
  687. if (!_messages[jd[e]]) {
  688. get_insert_message(jd[e]);
  689. }
  690. }
  691. }).fail(function (e, f, g) {
  692. console.log("err: " + e + f + g);
  693. });
  694. }
  695. \end{lstlisting}
  696. \end{center}
  697. %
  698. Was für Vorgänge beim Senden einer Nachricht in einer API getätigt werden, ist im Folgenden aufgeführt. Hierfür muss die Mongodb heruntergeladen und angebunden sein.\\
  699. In der Server.js Datei wird durch die ''App.post''-Methode eine Nachricht erstellt. Dabei wird in ''createMsg'' die Funktion aufgerufen, in einen String umgewandelt und die Nachricht anschließend in der Datenbank gespeichert. Mit der POST-Methode können Nachrichten in die Datenbank gespeichert werden und anhand von einer GET-Methode angezeigt werden.\\
  700. Nun müssen in der createMsg.js alle Werte einsetzbar gestaltet werden. Wichtig dabei ist, sich an das vorgegebene Mongo Schema zu halten. Durch die ajax-Methode ''post'' können große Datenmengen an den Server geschickt werden. Zuletzt soll die Konsole auch einen Error anzeigen, falls der Abruf der Funktion erfolglos war. \\
  701. In Abbildung \ref{sys} kann man diese Vorgänge nachverfolgen. Diese beiden Funktionen haben am Ende funktioniert und können zusammen verwendet werden. \\
  702. \begin{figure}[H]
  703. \centering
  704. \includegraphics[width=0.7\textwidth]{system.png}
  705. \caption{Erstellen einer Nachricht und Anzeigen aller Nachrichten}
  706. \label{sys}
  707. \end{figure}
  708. %
  709. \section*{15. Aufsetzung des Servers}
  710. \phantomsection\addcontentsline{toc}{section}{15. Aufsetzung des Servers}
  711. Zunächst muss ein http port eingerichtet werden. Über einen lokalen Server über node.js ist die Ohm News-App abrufbar. Mit der createServer Methode
  712. %
  713. \begin{center}
  714. \begin{lstlisting}[caption={''list\_messages''-Methode},captionpos=b]
  715. http.createServer(app).listen(http_port, function () {
  716. console.log("Express http server listening on port " + http_port);
  717. });
  718. \end{lstlisting}
  719. \end{center}
  720. %
  721. lässt sich ein Server aufsetzen. Hier wird auch der Listener für den Port impliziert und auf der Konsole ausgegeben, wenn die Verbindung erfolgreich war. \\
  722. Um die wichtigsten Fehlermeldungen und Bugs auszugeben, wird für unsere node.js App der Logger ''Morgan'' verwendet. Zusätzlich wird eine try-catch Funktion eingeordnet, da Zertifikat und Schlüssel noch nicht zertifiziert sind (siehe SSL und Keys) und somit vorerst ein Fehler angezeigt wird.
  723. %
  724. \subsection*{15.1. SSL und Keys}
  725. \phantomsection\addcontentsline{toc}{subsection}{15.1. SSL und Keys}
  726. Um die Applikation für die Nutzer sicher zu gestalten und eine Verschlüsselung sensibler Daten zu gewährleisten, sorgt ein SSL(Secure Socket Layer). Dadurch wird ein sicherer Kanal zwischen Web-Server und Client bereitgestellt und aus der http- wird eine https-Verbindung.
  727. \setlength{\parindent}{0cm}
  728. Übergangsweise werden ein selbst verifizierter Schlüssel und Zertifikat erstellt, welche später durch echte ausgetauscht werden. In einem neu erstellten Ordner ''keys'' werden das Zertifikat und der Schlüssel platziert.
  729. %
  730. \section*{16. Datenbankanbindung}
  731. \phantomsection\addcontentsline{toc}{section}{16. Datenbankanbindung}
  732. Für diese Anwendung wird eine Datenbank benötigt, weil die geschriebenen Nachrichten gespeichert werden müssen. Später sollen auch User mit ihren Userinformationen gespeichert werden. Im Falle dieses Projekts wurde sich für eine MongoDB entschieden.\\
  733. MongoDB ist eine dokumentenorientierte NoSQL Datenbank. Diese ist für diese Anwendung sinnvoll, da sie im Vergleich zu SQL Datenbanken flexibler handhabbar ist und somit auch viele Einstellungen noch im Nachhinein geändert werden können.\cite{mongo} \\
  734. Um den Umgang mit MongoDB zu vereinfachen wurde Mongoose, eine Object Data Modeling Bibliothek, verwendet.\cite{mongoose} \\
  735. Da man zu Beginn des Projekts noch nicht mit NoSQL Datenbanken gearbeitet hatte, mussten zuerst Tutorials und Erklärungen gelesen werden. Anhand von Beispieltests mit einer lokalen Datenbank konnte die grundsätzliche Funktionsweise bald verstanden werden. Daraufhin wurde das grobe Schema für eine Nachricht aufgebaut. Eine Nachricht sollte einen Betreff, eine Nachricht, den schreibenden User und die Tags beinhalten wie man in Listing \ref{lst:json} an einer beispielhaften JSON-Datei sehen kann. Die Datenbank musste konfiguriert und gestartet werden.
  736. %
  737. \begin{center}
  738. \lstset{language=xml}
  739. \begin{lstlisting}[caption={Nachricht im JSON-Format},captionpos=b,label=lst:json]
  740. {
  741. "messages": [{
  742. "subject": "Test"
  743. "message": "Hallo Welt!"
  744. "tag": "#OHM_News"
  745. "user": "User1"
  746. }]
  747. }
  748. \end{lstlisting}
  749. \lstsetdefault
  750. \end{center}
  751. %
  752. Die serverseitigen Codeteile zur API und der Code für die Datenbank sind momentan zur Vereinfachung in der server.js Datei. Später sollen diese zur Übersichtbarkeit und Wartbarkeit ausgelagert werden. Das Schema für die Nachricht und die Konfiguration der Datenbank sind zu diesem Zweck bereits in eigenen js-Dateien zu finden.\\
  753. Sobald all das lokal funktioniert hat, wurde die Portierung auf einen Server der Hochschule vorgenommen.
  754. %
  755. \section*{17. Plakatgestaltung}
  756. \phantomsection\addcontentsline{toc}{section}{17. Plakatgestaltung}
  757. Zu dem Plakat für die OHM News App wurde eine Ideensammlung in Form von Skizzen angefertigt.
  758. \begin{figure}[H]
  759. \centering
  760. \includegraphics[width=6.5cm, angle=90, scale=1.409]{IMG_Skizze1.jpg}\quad
  761. \includegraphics[width=6.5cm]{IMG_Skizze2.jpg}
  762. \includegraphics[width=6.5cm, angle=270, scale=1.409]{IMG_Skizze3.jpg}\quad
  763. \includegraphics[width=6.5cm, angle=270, scale=1.409]{IMG_Skizze4.jpg}
  764. \end{figure}
  765. %
  766. Die Umsetzung derer folgte in Form von ersten Entwürfen in Illustrator, welche der gesamten Gruppe vorgestellt wurden. \\
  767. Zu den hier unten aufgeführten Plakatentwürfen wurden jeweils zwei Versionen erstellt. Diese zwei kamen jedoch in die engere Auswahl und sollten noch weiter ausgearbeitet werden.
  768. \begin{figure}[H]
  769. \centering
  770. \includegraphics[width=6.5cm]{PDF_Plakat1.pdf}\quad
  771. \includegraphics[width=6.5cm]{PDF_Plakat2.pdf}
  772. \end{figure}
  773. %
  774. Bei der nächsten Vorauswahl an fünf OHM News Plakat-Versionen wurde daraufhin auf zwei reduziert, welche hier zu sehen sind.
  775. \begin{figure}[H]
  776. \centering
  777. \includegraphics[width=6.5cm]{PDF_Plakat3.pdf}\quad
  778. \includegraphics[width=6.5cm]{PDF_Plakat4.pdf}
  779. \end{figure}
  780. %
  781. Diese wurden weiter bearbeitet und Änderungen in Absprache mit der Projektgruppe vor\-genommen. Auch die Meinung von Professor Dr. Hopf beeinflusste die Plakatgestaltung.\\
  782. Einige Ansätze später und nach etlichem Experimentieren stand die Endauswahl bei diesen nächsten zwei Exemplaren. Besonderen Zeitaufwand nahm die Suche nach einer geeigneten Schrift für die zweite Version in Anspruch. Es gestaltete sich als äußerst schwierig, den künstlerischen leicht verspielten Ausdruck des Plakatlayouts mit der Seriösität des Hochschulcharakters in einer Schrift zu vereinen.
  783. \begin{figure}[H]
  784. \centering
  785. \includegraphics[width=6.5cm]{PDF_Plakat5.pdf}\quad
  786. \includegraphics[width=6.5cm]{PDF_Plakat6.pdf}
  787. \end{figure}
  788. %
  789. Zuletzt fiel die Wahl auf das linke mit blauem Verlauf versehene Plakat. Denn es vermittelt genau das, was der Slogan des Projektes aussagt. Der Fokus liegt auf der Nachrichtenbox, also das was wichtig ist, und der Rest verschwimmt im Hintergrund. \\
  790. Bei den wöchentlichen Treffen wurde im Allgemeinen der Fortschritt des Plakatdesigns analysiert und mit konstruktiver Kritik versehen. Dieses Feedback wurde im Rahmen des Möglichen umgesetzt und so kristallisierte sich die finale Version heraus. Nach gründlichem Finetuning und einer Umformatierung von DIN A3 auf DIN A1 wurde die Endfassung per Mail eingeschickt und schließlich ausgedruckt. Im Anhang ist sie in voller Auflösung aufzufinden.
  791. %
  792. \section*{18. PowerPoint Präsentation}
  793. \phantomsection\addcontentsline{toc}{section}{18. PowerPoint Präsentation}
  794. Als sich das Projekt für dieses Semester zum Ende hinneigte, war es an der Zeit sich für die Projektpräsentation vorzubereiten. Hierfür erstellte ich für die Gruppe eine PowerPoint Präsentation. Zunächst besprachen wir Gemeinschaftlich, wie diese ungefähr aussehen sollte. Wir waren alle einstimmig der Meinung, dass wir die Präsentation sehr einfach gestalten wollen, ohne zu lange Textpassagen mit einzubinden. Wir wollten es nämlich verhindern, dass das Publikum von zu vielen Faktoren in der Darstellung abgelenkt werden, zum Beispiel durch lesen von langem Fließtext. Durch den Gebrauch von bildlicher Veranschaulichung, versuchten wir es den Zuschauern zu ermöglichen, das Verständnis zu erleichtern.
  795. Auch hatten wir die Idee, eine fiktive Persona zu erstellen, zu dem der Betrachter einen Bezug finden kann und diese durch das vorgetragene Thema begleitet.
  796. %
  797. \subsection*{18.1. Gestaltungselemente}
  798. \phantomsection\addcontentsline{toc}{subsection}{18.1. Gestaltungselemente}
  799. Da man jedoch, aus Urheberrechtlichen Gründen, nicht einfach wahllos Charaktere aus dem Internet benutzen kann, suchte ich nach einer Seite, auf der man solche Animationen erstellen kann. Ich bin auch direkt fündig geworden, trotz alle dem war es erstmal schwer etwas zu finden das man auch Gratis verwenden konnte.
  800. Dann bin ich auf die Seite www.Powtoon.com gestoßen. Dort fing ich als nächstes an, unseren sogenannten Klaus in all den Stimmungen, die wir für unsere Präsentation brauchten, zu gestalten. \\
  801. Wir entschieden im Vorfeld als Gruppe, dass sich unser Männchen so wenig wie möglich bewegen soll, aus dem gleichen Grund wie auch oben schon erwähnt und zwar um den Fokus nicht zu sehr darauf zu richten und das Publikum nicht zu sehr abzulenken. Nachdem das erledigt war, war es an der Zeit, die eben erstellten Videos von unserer Persona einzeln so zu kürzen und zu beschneiden, dass man sie gut auf die gewünschte Position einsetzen konnte. Als dieses erledigt wurde, besprach ich weitere Vorgehen einzeln mit den anderen Gruppenmitgliedern. Ich Informierte mich darüber, über welches Thema jeder einzelne vorträgt und wie sie sich ihren Präsentationsteil vorstellen. Diese Wünsche und Vorstellung setzte ich dann dementsprechend in unserer Präsentation um.
  802. Falls sie an dem Ergebnis interessiert sind, haben sie die Möglichkeit sich dies im Git-Repository im Ordner ''presentation'' anzusehen.
  803. %
  804. \section*{19. Weiterverwendung für Infoscreens}
  805. \phantomsection\addcontentsline{toc}{section}{19. Weiterverwendung für Infoscreens}
  806. Am Mittwoch, den 24.10.2018 fand das Info-Treffen mit Frau Fabi statt, welches von Prof.Dr. \mbox{Matthias} Hopf organisiert wurde. Dieses Treffen diente der Besprechung und Erörterung zukünftiger Nutzungsmöglichkeiten der Info-Screens, das sind geplante und teils bereits montierte Bildschirme zur Information-Bereitstellung für die Hochschulangehörigen auf dem Campusgelände. Frau Fabi ist Angehörige der Fakultät efi und in ihrer Funktion für die Dokumentenlenkung und Webredaktion an dem ''Tag''-basiertem Nachrichten-System unserer Webanwendung interessiert, welches zukünftig auch auf den Bildschirmen dargestellt werden könnten. Sie ließ auch das Interesse von Herr Pöhlau, dem Dekan der Fakultät efi bekunden.\\
  807. Außerdem informierte Frau Fabi uns, die Projektmitglieder und unseren Projektbetreuer, dass die Fakultät efi sicher die restlichen Info-Screens montieren werde und derzeit Besprechungen hinsichtlich weiterer Sicherheitsaspekte zu den Montagebereichen am Laufen sind. Ergänzend würden sie sich eine Softwarelösung wünschen, für die Ansteuerung und ''Befüllung'' der Monitore mit den Daten unserer App. Diese wird jedoch nicht mehr im Rahmen unseres Projektes umgesetzt werden. Die Umsetzung einer Softwarelösung wäre als Idee für ein zukünftiges Projekt denkbar, nach Aussage von Prof.Dr. Matthias Hopf.
  808. %
  809. \section*{20. Soll/Ist Vergleich auf Basis des Projektplanes}
  810. \phantomsection\addcontentsline{toc}{section}{20. Soll/Ist Vergleich auf Basis des Projektplanes}
  811. Zu Beginn des Semesters hat die Gruppe zusammen ein Pflichtenheft für den ersten Abschnitt des Projekts erstellt. Ziel war es den Datenzugriff zu ermöglichen und eine Schnittstelle zur Verfügung zu stellen. Es besteht eine Datenbankanbindung über den Server der Technischen Hochschule Nürnberg. Darüber hinaus sollten die folgenden Ziele im Bereich der grafischen Benutzerschnittstelle erreicht werden.\\
  812. Die Oberfläche der PWA sollte über eine Login Möglichkeit, eine Menüleiste, eine Suchoption, ein Profil, eine Filterfunktion, ein Dashboard als Hauptseite, ein Einstellungsmenü, Nachrichtenfelder und ein Formular zum Verfassen einer Nachricht verfügen. Die Login Funktion ist noch nicht implementiert und die Filterfunktion soll im nächsten Semester in das Suchfeld und die Profilanzeige eingebaut werden. Die restlichen Funktionen sind in der PWA grafisch umgesetzt worden. Es sollte zusätzlich ein Abhängigkeitsdiagramm erstellt werden. Allerdings war dies aufgrund fehlender komplexer Zusammenhänge noch nicht notwendig. Für die API-Schnittstelle wurde eine Dokumentation erstellt, um den Überblick zu bewahren. Im Bereich der Anwendungslogik wurde das Routing, die Darstellung der Nachrichten, die Speicherung der Nachrichten in der Datenbank und der LDAP-Login besonders behandelt. Das Routing sowie die Erstellung, Speicherung und Darstellung der Nachrichten funktioniert. Die Login Funktion wurde noch nicht näher betrachtet. Codetests wurden bisher noch keine durchgeführt. Das Rollenkonzept der Nutzer wurde bereits besprochen, allerdings noch nicht umgesetzt.\\
  813. Darüber hinaus gibt noch einige nachrangige Punkte. Dazu gehört die Festlegung des Anwendungsnamens, die Erstellung eines Logos, das UX-Konzept, das Filtern der Datenbankabrufe, das Festlegen der Anzeigekriterien und die Funktion einem Kanal zu folgen. Wie oben bereits erwähnt wird das Filtern der Abrufe im nächsten Semester umgesetzt. Auch die Anzeigekriterien und die Möglichkeit einem Kanal zu folgen wird erst zu einem späteren Zeitpunkt möglich sein.
  814. %
  815. \section*{21. Fazit}
  816. \phantomsection\addcontentsline{toc}{section}{21. Fazit}
  817. Im ersten Projektabschnitt ist viel Zeit ist in der Konzeptionsphase vergangen, da es ein sehr iterativer Prozess ist und deshalb mehrere Durchläufe bis zum Endentwurf nötig waren. Verschiedene Meinungen mussten mit einbezogen werden. Doch ein gutes Konzept erspart am Ende viel Änderungsarbeit. \\
  818. Für die weitere Erarbeitung der App haben sich die Projektmitglieder auf die Bereiche Front\-end, Datenbank, Sever und Service-Worker aufgeteilt. Diese Aufgaben\-verteilung hat gut funktioniert. Trotzdem ist unser Team sehr oft ins Stocken geraten, da sich die Aufgaben\-bereiche gerade am Anfang oft überschnitten haben. Hinzukommt, dass wir insgesamt \mbox{wenig} Erfahrung in diesen Bereichen hatten. Wir haben uns deshalb zu Beginn intensiv in die Themen eingearbeitet, was länger dauerte als erwartet. Zusätzlich mussten wir auf \mbox{fachliche} Unterstützung zurückgreifen.\\\\
  819. Alles in einem kann man trotzdem von einem erfolgreichen Projektabschnitt sprechen. Ein erster funktionierender Prototyp ist fertig und kann im nächsten Zug erweitert werden. Parallele individuelle Arbeiten sind einfacher möglich, da das Grundgerüst steht. Das Team hat sich in die Materie eingearbeitet und kann im zweiten Projektabschnitt schneller durchstarten. Die Idee und das Konzept für die App sind soweit ausgereift, sodass diese nur noch umgesetzt werden müssen. Abläufe innerhalb der Gruppe sind klarer geworden, allerdings gibt es noch einiges strukturelle Abläufe, die im zweiten Projektabschnitt weiter optimiert werden können.
  820. %
  821. % Literaturverzeichnis
  822. \newpage
  823. \section*{Quellen- und Literaturverzeichnis}
  824. \phantomsection\addcontentsline{toc}{section}{Quellen- und Literaturverzeichnis}
  825. \medskip
  826. %\nocite{*} % Alle Inhalte zur Ausgabe markieren, nicht nur jene die zitiert wurden.
  827. {\setstretch{1.0}%
  828. \printbibliography[heading=none]}
  829. %
  830. \end{document}