Eine Software zum gemeinsamen Lernen für die Amateurfunkprüfung https://agt.dl5lq.de/
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.
Christian Friedrich Coors 84065cabea Improve favicon at lower resolutions 1 mese fa
backend Add screenshots, load test code 2 mesi fa
frontend Improve favicon at lower resolutions 1 mese fa
screenshots Add screenshots, load test code 2 mesi fa
.gitignore Update design, optimize for mobile use 2 mesi fa
API.md Add high-level KeepAlive, small style changes 2 mesi fa
CHANGELOG.md Add high-level KeepAlive, small style changes 2 mesi fa
COPYING.md Initial public commit 2 mesi fa
README.md Add screenshots, load test code 2 mesi fa

README.md

AFU group trainer

Diese Software soll das gemeinsame Lernen für die AFU-Prüfung ermöglichen. Die Idee ist, dass bei einem Lernabend jeder die Frage beantwortet, anstatt dass sich nur einer meldet. Dadurch sollen Schwächen schneller erkannt und der Lerneffekt verbessert werden.

Autor und Kontakt

Christian Friedrich Coors, Rufzeichen DL5LQ, me@dl5lq.de

Fragen, Anmerkungen, Kommentare, Erfahrungen und Pull Requests sind gerne gesehen. Accountanfragen für die „offizielle“ Instanz auf https://agt.dl5lq.de/ werden gerne beantwortet.

Screenshots

Login

Frage aus Benutzersicht

Frage aus Adminsicht

Ergebnisse

Admin Interface

Ansicht unter Android

Ansicht unter Android als App auf dem Homebildschirm

Einschränkungen

Die bisher größte Einschränkung ist, dass der Fragenkatalog Technik A momentan noch nicht fertig ist. Dieser wird voraussichtlich zum nächsten Klasse A-Kurs in Bremen fertig.

Technische Hintergründe

Front- und Backend sind in JavaScript geschrieben. Das Backend wird mit Node ausgeführt, das Frontend basiert auf dem React-Framework und wird in „normales“ HTML/JS/CSS übersetzt. Front- und Backend kommunizieren über einen WebSocket, also eine ständig offene TCP-Verbindung. Dadurch wird eine Kommunikation aller Teilnehmer mit geringer Latenz ermöglicht.

Datenschutz

Die Software ist absichtlich sehr datensparsam designt: Alle Teilnehmer sind nicht ohne weitere Informationen identifizierbar. Insbesondere wird keine Statistik über richtig und falsch beantwortete Fragen erstellt. Sobald ein Teilnehmer die Seite verlässt und die Verbindung geschlossen wird „vergisst“ das Backend alle Daten über diesen Teilnehmer. Es werden keine Cookies gesetzt oder sonstige persistente Daten auf den Endgerät des Teilnehmers gespeichert, die ihn identifizierbar machen.

Performance

Ein erster Lasttest unter Laborbedingungen verlief positiv. Realistisch können auf durchschnittlichen Systemen einige 100 Teilnehmer das System parallel benutzen, ohne dass es zu besonders störenden Performanceproblemen kommt. Die Ergebnisse sind erwartungskonform da über den WebSocket bis auf ein Mal die Fragendatenbank für den Dozenten nur sehr kleine Nachrichten verschickt werden und das Backend keine besonders rechenintensiven Aufgaben durchführt.

Installation

Die Software wird momentan aktiv weiterentwickelt. Eine eigene Installation kann daher nicht uneingeschränkt empfohlen werden, wenn man ständig die aktuelle Version verwenden möchte.

Voraussetzungen

Die Software besteht aus einem Frontend und einem Backend. Beide Teile sind in JavaScript geschrieben. Serverseitig wird technisch ein relativ aktuelles Node, ein offener TCP-Port für den WebSocket und ein normaler Webserver benötigt. Optional kann TLS (HTTPS und WSS) Verschlüsselung eingeschaltet werden.

Backend

Im Ordner backend muss die config.js-Datei angepasst werden. Hier können einige Anpassungen vorgenommen werden:

  • config.websocketPort: Hier den offenen TCP-Port eintragen
  • config.tlsConfig: Hier kann mit useTLS auf true die TLS-Verschlüsselung eingeschaltet werden. Wenn sie eingeschaltet ist, müssen die Variablen cert und key mit Dateinamen befüllt werden. Am Beispiel Uberspace mit Let’s Encrypt wäre das cert auf /home/BENUTZER/.config/letsencrypt/live/DOMAIN/cert.pem und key auf /home/BENUTZER/.config/letsencrypt/live/DOMAIN/privkey.pem.
  • config.users: Ein Array von Objekten mit username und password Schlüsseln. Das sind die Dozenten-Logins.
  • config.pingTest: Der Intervall in Millisekunden, in denen über den WebSocket ein Ping-Paket geschickt wird. Wird verwendet, um kaputte Verbindungen zuverlässig zu trennen. Empfohlen wird ein Wert von 20 Sekunden (20000), maximal sollten 60 Sekunden (60000) eingetragen werden. Ein zu kleiner Wert führt zu Problemen! Hier sollten als absolute Untergrenze 10 Sekunden (10000) eingetragen werden.
  • config.debug: Aktiviert Debugausgaben. Im Produktivsystem i.d.R. nicht erforderlich.
  • config.questions: Die Fragenkataloge, die geladen werden sollen. I.d.R. ist eine Anpassung nicht erforderlich.

Anschließend im Ordner backend npm install ausführen, was die notwendigen Dependencies installiert. Das Backend kann dann mit npm run backend gestartet werden. Es sollte auf dem Server als Dienst eingerichtet werden.

Frontend

Das Frontend ist in React mit create-react-app und einigen Dependencies entwickelt worden. Das Frontend kann lokal gebaut und auf einen normalen Webserver gehostet/deployt werden.

Im Ordner frontend/src ist die Datei config.js anzupassen. Hier gibt es diese Konfigurationsparameter:

  • config.mathJaxProvider: Der MathJaxProvider. Entweder eine eigene Installation eintragen oder auf etwas wie https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML abändern.
  • config.webSocketPort: Der Port, über den der WebSocket des Backends erreichbar ist, falls die automatische WebSocket-Erkennung verwendet wird. Ansonsten wird die Angabe aus dem Parameter webSocketUrl verwendet.
  • config.webSocketUrl: Die URL, unter der der WebSocket erreichbar ist. Falls dieser unter der gleichen Domain erreichbar ist, kann das Feld leer gelassen werden. Ein Beispiel für eine valide Eingabe wäre ws://example.com:63605/.
  • config.footerLink: Eine React-Komponente, die in den Footer der Seite eingebaut wird. Hier kann etwa ein Link auf ein eigenes Impressum und eigene Datenschutzbestimmungen gesetzt werden. Wenn nicht benötigt, hier null eintragen.
  • config.release: Wenn aktiv, wird der Benutzer vor dem Verlassen der Seite gewarnt.

Der Parameter footerLink sollte für eine eigene Installation angepasst werden!

Dann muss in der Datei frontend/package.json noch der Parameter homepage auf die URL angepasst werden, unter der der AGT später verfügbar sein soll, damit die relativen Links richtig gesetzt werden.

Anschließend muss auch hier npm install ausgeführt werden. Dann kann das Frontend mit yarn build in den Ordner frontend/build gebaut werden. Dort landen die Dateien, die auf den Webserver kopiert werden sollen.