MSP: HÜ-Soziomat

Aus THM-Wiki
Wechseln zu: Navigation, Suche

Diese Wiki-Seite dient zur Dokumentation der Hausübung "Soziomat", die im Rahmen des Moduls "Methoden des Softwareentwicklungsprozesses (MSP)" an der Fachhochschule Gießen-Friedberg im Wintersemester 09/10 bearbeitet wird. Verantwortlich für die Hausübung sind Christian Peter und Alexander Ahrendt

Diese Seite dient der Dokumentation der Hausübung für die Master-Veranstaltung "Methoden des Softwareentwicklungsprozesses (MSP)" im Wintersemester 2009/2010.

Allgemein

Mitglieder der Gruppe sind:

  • Alexander Ahrendt
  • Christian Peter

Nicht-funktionale Anforderungen an das Modul

  • Benutzbarkeit
  • Performance
  • Fehlertoleranz
  • Verfügbarkeit
  • Sicherheit (BSI)
  • Datenschutz
  • Barrierefreiheit (WAI)
  • Benutzerdokumentation
  • WIKI

Der Soziomat

Die Online-Sozialisation ist nach dem 5-Stufen-Modell der E-Moderation von Gilly Sal­mon Voraussetzung für die virtuelle Gruppenarbeit.

Der Soziomat erlaubt die spielerische Drag&­Drop-Zuordnung von Namen zu Fotos der KursteilnehmerInnen (Le­vel 1), zu frei definierbaren Merk­malen der zu erratenen Person (Level 2), bis zur Stim­menerkennung (Level 3). Ein Scoreboard weckt den Spieltrieb, ein Ranking der erratenen Personen die Motivation zur Selbstdarstellung. Neben der Online-So­zi­a­li­sa­tion dient der Sozi­o­mat auch der Gruppenbildung auf der Basis von Vorwissen und Interessen.


Es handelt sich hier um einen Auszug aus dem Artikel von Benjamin Stadin. Den vollständigen Artikel findet man zum Nachlesen unter Soziomat.

Reverse Engineering

Datenbankschema

Die Datenbank setzt sich aus den folgenden 7 Tabellen zusammen:

soziomat_highscores

Diese Tabelle beinhaltet die erreichten Punkte in den einzelnen Leveln sowie die Gesamtpunktzahl eines Spielers. Pro Spieler wird jeweils und Kurs/eCom wird jeweils nur der Eintrag mit der höchsten Punktzahl gespeichert.


soziomat_games

Diese Tabelle beinhaltet Informationen über das aktuelle Spiel eines Spielers in einem Kurs/eCom.

Attribut Beschreibung
game_id Die ID des Spiels
level Das aktuelle Soziomat Level (1..3)
user_id Die eStudy-ID des Spielers
points Die im aktuellen Level erreichte Punktzahl. Dieser Wert kann von successful_moves (s.u.) abweichen (in den Soziomat Einstellungen können Punkte für richtige/falsche Spielzüge eingestellt werden).
successful_moves Die Anzahl richtiger Zuordnungen im aktuellen Level
audio_player_type ("JAVA","FLASH","NONE") Der verwendete Audio-Player im 3. Level. Dieses Feld wird gesetzt,nachdem vor Beginn des 3. Levels ein Script den Browser des Spielers auf Kompatibilität überprüft hat.
points_overall Die erreichte Gesamtpunktzahl seit Spielbeginn (Level 1).
lecteurers_only Flag das gesetzt wird, falls es sich um ein Dozentenratespiel handelt.

soziomat_settings

In dieser Tabelle stehen die Punkte, die pro richtigen bzw. falschen Spielzug in den Soziomat-Levels im jeweiligen Kurs/eCom vergeben werden, sowie Einstellungen zum Auswahlverfahren. Der Wert im Feld fail_user gibt an, wie viele in vorherigen Spielen falsch erratene Bilder dem Spieler im jeweiligen Level angezeigt werden.


soziomat_game_collections

Diese Tabelle beinhaltet alle die Bilder/Schatten, die der Spieler im aktuellen Spiel des Kurses/eComs sieht.

Attribut Beschreibung
game_id Verweis auf die game_id des Spiels (Referenz zu soziomat_games)
user_id Dies ist die reale eStudy user ID vom jeweiligen Bild bzw. Schatten, das im Spiel angezeigt wird.
droppable_id Eine zufällig erstellte ID, die für das "Ziel-Bild"/ den "Ziel-Schatten" verwendet wird (also das Bild/Schatten, auf das das gezogene Bildchen abgelegt wird). eingestellt werden).
draggable_id Analog zu droppable_id. Die ID des Bildchens/Schattens, das per Maus gezogen werden kann.

soziomat_user_profiles

Diese Tabelle speichert den Text, den der Spieler für Level 2 angeben muss und die Audiodatei mit dem Format MP3, welche in Level 3 für die Stimmenerkennung verwendet wird.


soziomat_ratings

Diese Tabelle beinhaltet eine Statistik über richtige bwz. falsche Rateversuche eines Spieles.

Attribut Beschreibung
game_id Das Spiel, indem der Rateversuch vorgenommen wurde.
user_id Die user ID des Bildchens/Schattens. Hinweis: Nicht zu verwechseln mit der user_id des Spielers - die steht in der Tabelle soziomat_games
rate_count Anzahl der Rateversuche für dieses Bild/Schatten im jeweiligen Spiel insgesamt.
fail_count Anzahl falscher Rateversuche für ein Bild/Schatten im jewieligen Spiel.
success Flag das angibt, dass das Bild/Schatten-Paar im jeweiligen Spiel bereits richtig erraten wurde (es steht dadurch nicht nochmal zur Auswahl bereit, wird also im aktuellen Spiel nicht nochmal doppelt angezeigt).

soziomat_default_profiles

Diese Tabelle beinhaltet den Standard-Text, den der Kursdozent als Hinweis für das Soziomat-Profil im 2. Level angeben kann. Diesen Hinweis-Text bekommt der Kursteilnehmer als Hinweis für sein Soziomat-Profil angezeigt.


Grafisches Datenbankschema

Soziomat db scheme.jpg

Das Datenbankschema wurde mit dem Designer von phpMyAdmin erstellt.

Klassendiagramm

Soziomat classdiagram.png

Das Klassendiagramm wurde mit Enterprise Architect erstellt.

Use Cases

Zunächst sollen anhand von Anwendungsfällen alle möglichen Szenarien des Moduls dargestellt werden, welche eintreten können. Es wird also beschrieben, was beim Versuch der Zielerreichung passieren kann, welche klickbaren Ereignisse vom Modul bereitgestellt werden und dabei von konkreten technischen Lösungen abstrahiert. Es dient dem Benutzer als eine Art Übersicht, zeigt welche Funktionen der Soziomat den verschiedenen Rollen bereitstellt. Mit Rollen sind in diesem Zusammenhang verschiedene Benutzergruppen gemeint, welche grundsätzlich aus User und Admin bestehen und dementsprechend verschiedene Rechte bestitzen. Unter User fallen Student sowie Schüler, Alumnus, Sekretariat oder Gäste. Die Gruppe Admin besteht noch aus dem Dozent des jeweiligen Kurses. Benutzer der Gruppe Admin können alles nutzen, was auch die normalen User können, plus angebene zusätzliche Funktionen. Folgend sollen die einzelnen Anwendungsfälle näher erläutert werden.

Soziomat spielen

Die Hauptfunktion stellt das eigentliche Spielen des Soziomaten dar. Hierbei ist zwischen drei verschiedenen Levels zu Unterscheiden.

  • Im ersten Level geht es darum, einem vorgebenen Foto aus einem Pool von Namen, den Richtigen zuzuordnen.
  • Das zweite Level besteht darin, verschiedene Merkmale, der entsprechenden Person zuzuordnen.
  • Im dritten und damit letzten Level werden verschiedene Sounddateien abgespielt, welche wiederum einer bestimmten Person zugeordnet werden müssen.

Ausserdem ist zu beachten, dass das Dozentenraten eine Sonderform des Soziomat spielens darstellt. Diese Funktion ist nur im Foyer erreichbar und besteht auch nur aus den ersten zwei Levels.

Soziomat Profil anlegen

Um ein Spiel mit dem Soziomaten zu starten, muss zunächst ein Profil angelegt werden.

  • Für Level 2 sollte also ein Spruch oder anderes aussagekräftiges Merkmal seiner Person im dafür vorgesehenen Feld erstellt werden.
  • Zusätzlich sollte für Level 3 eine aussagekräftige Sounddatei im MP3-Format hochgeladen werden.

Beide Konfigurationen können also unterdem Menüpunkt Profil anlegen erledigt werden und stellen somit einen weiteren fundamentalen Anwendungsfall des Soziomaten dar. (Bug: in momentaner Version nicht mehr möglich! [23.02.10 01:37])

Soziomat Einstellungen editieren

Ein weiterer Anwendungsfall betrifft nur die Gruppe Admin. Hier können verschiedene Einstellungen, die das Verhalten des Soziomaten beeinflussen, getätigt werden. Alle Einstellungen betreffen nur den Soziomaten in dem betreffenden Kurs, können also in verschiedenen Kursen verschieden Konfigurationen besitzen. Folgend die möglichen Einstellungen:

  • Die Anzahl der richtig zu erratenen BenutzerInnen pro Level. Nach dieser Anzahl korrekter Spielzüge wechselt Soziomat in das nächste Level (Min, Max)
  • Die Punkte, die Pro richtig oder falsch erratenem Spielzug im 1. Level vergeben bzw. abgezogen werden
  • Die Punkte, die Pro richtig oder falsch erratenem Spielzug im 2. Level vergeben bzw. abgezogen werden
  • Die Punkte, die Pro richtig oder falsch erratenem Spielzug im 3. Level vergeben bzw. abgezogen werden
  • Die Anzahl der falsch erratenen BenutzerInnen im 1. Level. Dieser Wert gibt an, wie viele BenutzerInnen bei Initialisierung des Levels ausgewählt werden, die der Spieler in vorherigen Spielen falsch erraten hat (auch aus Spielen in anderen Kursen). Andere BenutzerInnen werden nach dem Zufall ausgewählt.
  • Die Anzahl der falsch erratenen BenutzerInnen im 2. Level (Beschreibung s.o.).
  • Die Anzahl der falsch erratenen BenutzerInnen im 3. Level (Beschreibung s.o.).
  • Spielstände und Highscores zurücksetzen

Ausserdem besteht die Möglichkeit, die Vorlage, welche beim Anlegen seines Profils erscheint zu ändern. Diese Änderung bezieht sich auf den Text, welcher dazu auffordert ein aussagekräftiges Merkmal einzutragen.

Soziomat.jpg

Dokumentation

Die estudy-Soziomat Dokumentation wurde mit DoxyGen erstellt.

Software-Metriken

PHPUnit

Die Übersicht der Softwaremetriken des Moduls Soziomat wurde mit PHPUnit erstellt, welches ein XML Dokument erzeugt. Dieses Dokument wird mittels XSLT in HTML transformiert. Das Ergebnisdokument enthält alle wichtigen Metriken der im Modul Soziomat verwendeten Klassen und Methoden, unter anderem Code-Coverage, Zyklomatische Komplexität und den C.R.A.P.-Index.

Dabei stellten wir fest, dass keine Klassen und auch keine Methoden einen Unit Test besaßen. Somit sind die Metriken nicht ganz vollständig, bieten jedoch trotzdem einen brauchbaren Informationsgehalt, welcher den folgenden Dateien entnommen werden kann.

Bad Smells

Smell Ort
Long Parameter List EditSettings::updateSettings()
Parallel Inheritance Hierarchies wird das Interface iSoziomatLevel implementiert, muss auch eine entsprechende Klasse das iSoziomatControllerLevel Interface implementieren

Aufgabenstellung nach dem Walkhrough vom 19.11.09

Neue Features (Aufgabenstellung)

Feature 1: Anzeigen der Trefferquote in der Highscore-Liste

In der Highscore-Liste des Soziomaten werden die Spieler bisher nur mit ihren Highscores angezeigt. Dieser Highscore sagt aber nichts über die Treffsicherheit des Spielers aus, d.h. die Anzahl der richtigen und der falschen Rateversuche werden in dieser Statistik nicht berücksichtigt. Um hier die Aussagekraft der Highscore zu unterstützen, soll das neue Feature den Verlauf der getätigten Versuche eines Spielers mit aufnehmen. Diese sollen dann grafisch anhand eines Linien-Diagramms dargestellt werden und somit die Nachvollziehbarkeit der erreichten Punktzahl unterstützen. Auf diese Weise lassen sich die erreichten Spielstände besser vergleichen, da der Grafik zu entnehmen ist wie oft ein Spieler insgesamt gespielt hat. Basierend darauf soll zusätzlich eine Quote berechnet werden, welche die Treffsicherheit eines Spielers wiederspiegelt. Haben mehrere Spieler die gleiche Highscore erreicht, kann dieser Wert als zusätzliche Wertung miteinfließen. Außerdem lassen sich die Lernfortschritte der Spieler anhand der Verlaufsgrafiken ablesen, wodurch das eigentliche Anliegen des Soziomaten, nämlich soziale Kontakte zu pflegen, fundamental unterstütz wird.

Feature 2: Nur noch den Vornamen der zu erratenen Personen in Level 1 anzeigen

Um den Schwierigkeitsgrad des 1. Levels zu erhöhen, sollen dem Spieler nur noch die Vornamen der zu erratenen Personen angezeigt werden, und nicht mehr der komplette Name. Hierbei ist zu überlegen, ob man dieses Feature über die Einstellungen auswählen kann oder ob man dieses Feature als zuzätzliches Level in den Soziomat einbaut.

Neue Features (Umgesetzt)

Feature 1: Anzeigen der Trefferquote in der Highscore-Liste

In der Highscore-Liste des Soziomats wird nun zusätzlich zu der erreichten Punkzahl jedes Spieles auch die gesamte Trefferquote, bezogen auf alle Spiele, angezeigt. Sollten nun verschiedene Spieler dieselbe Punktzahl haben, so kann man mit der angezeigten Trefferquote festellen, welcher der Spieler mehr richtige Rateversuche abgegeben hat. Weiterehin wird die Highscore-Liste nach Anzahl der erreichten Punkte sortiert, d.h der Spieler mit den meisten Punkten steht ganz oben.

Jetzt wurde aber noch die Trefferquote als zweites Sortierkriterium hinzugefügt, um zwischen gleichen Platzierungen nochmals unterscheiden zu können. Würde man hingegen nur nach der Trefferquote eines Spieler sortieren, so hätte der Spieler den Vorteil, der bereits mit einem Versuch gleich richtig rät und dann das Spiel abbricht, so hätte er folglich eine Trefferquote von 100 %.


Die Berechnung der Gesamt-Trefferquote eines Spielers:
Für die Berechnung der Trefferquote benötigt man die Tabelle soziomat_ratings. Da das Feld rate_count die Anzahl aller Rateversuche und das Feld fail_count die Anzahl der Fehlversuche beinhalten, kann man sich die Trefferquote berechnen, indem man die Anzahl der richtigen Rateversuche rate_count - fail_count mit den Fehlversuchen fail_count ins Verhältnis setzt und diese über alle Spiele hinweg aufsummiert und sie anschlißend mit 100 multipliziert, um auf den Prozentwert zu kommen.

Auszug aus dem SQL-Statement:

100 * (SUM(r.rate_count) - SUM(r.fail_count)) / SUM(r.rate_count) AS hitrate

Über das Anzeigen der Trefferquote eines Spielers hinaus, ist es nun ebenfalls möglich, mehr über den Lernerfolg eines Spieler im Verlauf der einzelnen Spiele zu erfahren, indem der erzielte Lernerfolg nun grafisch dargestellt wird.

Der Betrachter der Highscore-Liste kann durch einen Klick auf die Punktzahl bzw. die Trefferquote der einzelnen Spieler anzeigen lassen. Anhand der Grafiken kann man nun erkennen, wie oft man ein Level gespielt hat und wie der Lernerfolg sich im Laufe der Spiele entwickelt hat.

Die Statistiken eines Spielers in den einzelnen Levels:


Die Klasse SoziomatStatisticGraph: (class.statisticGraph.inc.php)
Die Klasse SoziomatStatisticGraph wurde implementiert, um die einzelnen Statistiken zu berechnen und in einer Grafik darzustellen.

Class SoziomatStatisticGraph.jpg
Tabelle Verwendung
drawCoordSystem Zeichnet ein 2-dim. Koordinatensystem mit Achsenbeschriftung
drawGraph Zeichnet den Graph einer Wertmenge.
initGraph Erzeugt und initialisiert die PNG-Bilddatei
textOut Gibt einen Text an der Position x,y in der PNG-Bilddatei aus
graphOfPoints Zeichnet den Graphen der erreichten Punkten eines Spielers in den einzelnen Leveln
graphOfHitrate Zeichnet den Graphen der erreichten Trefferquoten eines Spielers in den einzelnen Leveln
getUserID Liefert die user-id anhand der highscore-id zurück
getUserFullname Liefert den Vor- und Nachnamen eines Spielers anhand der user-id zurück
getCourseName Liefert den Kursnamen anhand der course-id zurück
getMaxPointsOfLevel Liefert die maximale Punktzahl eines Levels des Spielers zur Skalierung der y-Achse zurück
getMaxHitrateOfLevel Liefert die maximale Trefferquote eines Levels des Spielers zur Skalierung der y-Achse zurück
getPointsOfLevel Liefert die Punktzahl eines Levels des Spielers als y-Koordinate zurück
getHitratesOfLevel Liefert die Trefferquote eines Levels des Spielers als y-Koordinate zurück

Erweiterung von Feature 1: Verbesserung der grafischen Darstellung

Nach der Integration des neuen Features des Soziomaten in die Live-Produktion konnte man feststellen, dass die grafische Darstellung der einzelnen Lernerfolge der Spieler erheblich an Übersichtlichkeit und Genauigkeit verloren hat. Der Grund hierfür ist, dass in der Live-Produktion eine viel größere Menge an Spielständen vorhanden ist. Zum Beispiel gibt es Spieler, die bis zu 100 Spiele absolviert haben.

Eine solche Datenmenge konnte in der Testumgebung beim Entwickeln nicht berücksichtigt werden. Durch eine Erweiterung des Features konnte man jedoch das Problem beheben, indem man nur noch eine feste Anzahl an Spielen in der Grafik darstellt.

Die folgenden Grafiken sollen den Unterschied der Darstellung einmal verdeutlichen:

Den vollständigen Wiki-Artikel und die Beschreibung findet man hier: Feature-Erweiterung

Feature 2: Nur noch den Vornamen der zu erratenen Personen in Level 1 anzeigen

Die Umsetzung des 2. Features konnte nicht realisiert werden, da die Umsetzung des 1. Features und die Erweiterung mit der Visualisierung der Lernerfolge in einer Grafik mehr Zeit in Anspruch genommen hat, als es vorher geplant war. Trotzdem soll hier kurz eine grobe Aufwandsabschätzung gegeben werden, um nachfolgenden Entwicklern einen ersten Eindruck darüber zu vermitteln, in welchem Verhältniss, die Verwirklichung dieses Features nachträglich zu realisieren, steht.

Grobe Aufwandsabschätzung

Wie oben erwähnt gibt es zwei grundsätzliche Ansätzte dieses Feature zu implementieren. Zum einen ist es möglich ein zusätzliches Level in das Modul mit aufzunehmen, zum anderen wäre eine Erweiterung des ersten Levels eine Alternative.

Neues Level

Architektonisch ist das Modul relativ flexibel gestaltet worden, sodass es möglich ist, ein zusätzliches Level in Form einer repräsentativen Klasse hinzuzufügen. Jede Klasse die ein Level repräsentiert, muss das Interface iSoziomatLevel implementieren. Dieses stellt die Anforderungen an die Klasse bereit und besteht aus 8 zu implementierenden Methoden. Zusätzlich zu jeder Level-Klasse muss ein zugehöriger Level Controller implementiert werden. Auch hierzu gibt es bereits ein Interface namens iSoziomatControllerLevel welches die Anforderungen an solch eine Klasse in Form von 5 Methodenschnittstellen bereitstellt. Außerdem gibt es die Klasse SoziomatControllerBase, welche die Grundfunktionalität eines jeden Controllers bereitstellt und somit abgeleitet werden muss.

Level 1 erweitern

Um das Feature über eine Erweiterung der Level1 Klasse zu realisieren, sollte eine Möglichkeit bestehen zwischen dem normal und diesem Modus hin und her zu schalten. Für solche Einstellungen gibt es eine Klasse namens EditSettings, welche Methoden bereitstellt um Einstellung in der Datenbank abzulegen sowie abzurufen. Soll also die Möglichkeit bestehen Level 1 in verschiedenen Modi zu spielen, müssen zusätzliche Anpassungen an der Datenbank gemacht werden, da hierfür zwar schon eine Datenbanktabelle namens soziomat_settings, jedoch noch keine spezifischen Datenbankfelder bestehen. Über die Methode getSettings stehen dann die spezifizierten Felder bereit und die Klasse SoziomatLevel1 kann entsprechend erweitert bzw. abgeändert werden.

Denkanstöße
  • Wie werden gleiche Vornamen behandelt?
    • Gleiche Vornamen werden vermieden, können also garnicht erscheinen
    • Bei gleichen Vornamen wird der Anfangsbuchstabe des Nachnamens angezeigt bzw. soviele Anfangsbuchstaben bis sie sich unterscheiden

Weitere Änderungen des Moduls nach der Abnahme

Änderung des Layouts

  • Die Tabellenspalten Platz, Punkte und Trefferquote werden zentriert angezeigt
  • Die Trefferquote wird als Ganzzahl dargestellt und nicht mehr mit zwei Nachkommastellen

HTML-Validierung mit Web-Developer

Damit die Klasse SoziomatStatistic W3C-konform ist, musste eine HTML-Validierung durchgeführt werden.

Ergebnis vor der Validierung:

  • 25 Fehler, 17 Warnungen

Fehlerquellen:

  • Verwendung von & anstatt & in Verlinkungen
  • Keine Angabe des alt-Tags in img-Anweisungen

Fehlerbehebung:

  • Aus Verlinkungen wie z.B. index.php?vorname=hans&nachname=meier wird nun index.php?vorname=hans&nachname=meier gemacht
  • Aus img-Anweisungen wie z.B. <img src='Foto_HansMeier.png' /> wird nun <img src='Foto_HansMeier.png' alt='Foto von Hans Meier' />

Ergebnis nach der Validierung:

  • 0 Fehler, 0 Warnungen

Datenauszug des Moduls

Userdatasoziomat.jpg

Die Klasse UserDataSoziomat ermöglicht es, den Soziomat in den Datenauszug zu intergrieren. Hierzu ist es erforderlich die Klasse UserDataSoziomat von der Klasse UserDataAdapter abzuleiten, welche wiederrum das Interface UserDataProvider implementiert.

Mit Hilfe des Datenauszugs des Soziomats gelangt der Benutzer direkt durch einen Link zur der Highscore-Liste, wo er seinen Punktestand einsehen kann. Das Löschen dieses Highscores ist aber nur dem Administrator vorbehalten.

Desweiteren kann der Benutzer durch einen weiteren Link sein Profilbild ändern oder auch löschen.


Diese Funktionalität stellt die Methode getUserData der Klasse UserDataSoziomat zur Verfügung, indem alle relevanten Benutzerdaten aus der Datenbank gelesen werden.


Um das Datenauszugsmodul in das Benutzerprofil integrieren zu können, ist es notwendig folgendes SQL-Statement in der Datenbanktabelle userdata_modules auszuführen:

INSERT INTO `userdata_modules` (`script`, `class`, `name`) VALUES ('soziomat/classes/class.userdatasoziomat.inc.php', 'UserDataSoziomat', 'Soziomat');


Den vollständige Wiki-Artikel des Datenauszugs findet man hier: Datenschutzkonformer Datenauszug

Check-In des Codes auf dem SVN-Server

Um den Code erfolgreich auf dem SVN-Server einchecken zü können, muss sich der Code einer Style-Validation unterziehen. Es müssen alle ERRORS und WARNINGS der einzucheckenden Moduls beseitigt werden.

Einige ERRORS und WARNINGS CodeSniffers:

  • WARNING: Zeilenlänge > 120 Zeichen
  • ERROR: Zeilenlänge > 140 Zeichen
  • ERROR: Name des Klassenkonstruktor muss "__construct()" sein
  • ERROR: Methoden müssen Sichtbarkeits-Modifier besitzen (private, public, protected)
  • ERROR: PHP-Tag "?>" am Ende entfernen, bei Dateien die nur PHP-Code beinhalten
  • ERROR: Identifier müssen dem CamelCase-Format entsprechen (CamelCase-Format)

Bisherige Modulautoren

  • Benjamin Stadin
  • Andre Girnus

Liste der überarbeiteten und neuen Dateien

In der folgenden Liste befinden sich alle überarbeiteten Dateien mit der entsprechenden Diff-Ansicht zum Vergleich mit vorherigen Dateiversionen und es werden ebenfalls alle neue Dateien augelistet.)

soziomat/

soziomat/classes/