assignments/Assignment_008/readme.md

90 lines
6.4 KiB
Markdown

# Ein Traum in Zucker oder kann ich dem Zufallsgenerator trauen?
Ihr Auftritt in der Spieleindustrie war ein voller Erfolg: Racewars hat die Steam-Charts gestürmt und der Einfluss ist so groß, dass Rockstar Games den Launch von GTA VI um sechs Monate verschoben hat, um nicht in Konkurrenz zu Ihrem Spiel zu treten.
Während einer Promo-Tour für Ihr Spiel reisen Sie auch durch die USA und stellen in San Francisco dessen tolle Features vor. Dort werden Sie von Mark Zuckerberg angesprochen und zu einer Party am Abend eingeladen. Natürlich nehmen Sie die Einladung an und feiern dort heftig ab.
<img src="img/zuck.jpg" width="150" alt="Mark Zuckerberg">
Plötzlich wird Ihnen schwindelig und Sie brechen noch auf der Party vor den Augen von Mark zusammen. War da etwas in Ihrem Moscow Mule? Hätten Sie den vielleicht besser nicht unbeaufsichtigt von Mark Zuckerberg halten lassen, während Sie auf der Tanzfläche waren?
Als Sie wieder aufwachen, befinden Sie sich in einer dunklen Höhle, wahrscheinlich viele Meter unter der Erdoberfläche. Es ist feucht und tropft von der Decke, es stinkt nach Meta-Schimmel. Vor Ihnen stehen zwei Echsen, wahrscheinliche Reptiolide oder andere Außerirdische, die sich in den Höhlen unter der Erdoberfläche verstecken. Sie hatten schon immer das Gefühl, das mit Mark Zuckerberg etwas nicht stimmt; jetzt haben Sie den Beweis.
<img src="img/reptilien.png" width="260" alt="Reptiloide (KI-generiert)">
Die Echsen haben Sie nicht ohne Grund entführt; sie wollen Ihre hervorragenden Programmierkenntnisse nutzen. Das war ja klar! Die Echsen wollen in Zukunft ihre Daten besser verschlüsseln und haben zu diesem Zweck von der Firma Nahtlose Sicherheitsapplikationen (NSA) zwei Zufallszahlengeneratoren gekauft, die diese per Vibe Coding mit ChatGPT erstellt haben. Die Echsen haben allerdings den Verdacht, dass da etwas nicht stimmen könnte und da Sie so gut programmieren können, sollen Sie jetzt helfen.
Eigentlich hätten das Entwickler:innen bei Meta machen sollen, aber Mark Zuckerberg hat gerade wieder 10 % seiner Belegschaft entlassen, sodass er keine Kompetenzen mehr in der Firma hat. Er will alle seine Leute geschniegelt durch LLMs ersetzen.
Sie bekommen von den Echsen zwei Zufallszahlengeneratoren mit den Namen `SecRandomGenerator` und `SuperSecRandomGenerator`.
* [SecRandomGenerator](../sources/src/main/java/pr2/algorithmen/rnd/SecRandomGenerator.java)
* [SuperSecRandomGenerator](../sources/src/main/java/pr2/algorithmen/rnd/SuperSecRandomGenerator.java)
Die Firma NSA hat auch bereits eine Implementierung der Lösung dieser Aufgabe für einen der Generatoren (`StandardRandomGenerator`) geliefert.
* [DrawRandom](../sources/src/main/java/pr2/algorithmen/rnd/DrawRandom.java)
Diese Implementierung ist aber so kompliziert, dass wirklich niemand sie versteht und ganz offensichtlich enthält sie auch einen Fehler, denn es kommen immer nur schwarze Bilder heraus.
**Ziel**: Diese Aufgabe ist darauf ausgelegt, dass Sie ein **Large Language Model** nutzen. Sie soll dazu dienen, einen sinvollen Umgang mit LLMs einzuüben.
## Paket
Gehen Sie in das Paket [pr2.algorithmen.rnd](../sources/src/main/java/pr2/algorithmen/rnd).
## Programm verstehen
Nehmen Sie den vorhandenden Code von `DrawRandom` und versuchen Sie ihn mithilfe eines LLMs (z.B. ChatGPt) zu verstehen. Gehen Sie hierzu schrittweise vor und lassen Sie sich einzelne Konstrukte erklären. Versuchen Sie nicht, das gesamte Programm auf einmal zu analysieren, das wird Sie wahrscheinlich überfordern.
Sammeln Sie die Prompts und die Antworten des LLMs in einer Datei. Diese Datei checken Sie als `log.txt` mit in Ihre Abgabe ein.
## Programm vereinfachen
Vereinfachen Sie das Programm so, dass keine Konstrukte mehr vorkommen, die wir in der Vorlesung noch nicht behandelt haben. Nach der Vereinfachung sollte es nur noch Dinge enthalten, die Sie verstehen und erklären können. Sie können sich bei der Vereinfachung ebenfalls von einem LLM helfen lassen.
Dokumentieren Sie die Schritte, die Sie zum Verständnis des Programms und zur Vereinfachung unter Verwendung eines LLMs gemacht haben.
Hierzu gehen Sie wie folgt vor:
* Jede Vereinfachung führen Sie in einem **einzelnen commit** in Git durch.
* In die Commit-Message schreiben Sie den Prompt an das LLM, die Ausgabe des LLMs und Ihre Erkenntnisse. Verwenden Sie Markdown, damit man das ganze gut lesen kann.
Beachten Sie bei der Verwendung des LLMs die [Regeln/Guidelines](https://moodle.hs-mannheim.de/pluginfile.php/514165/mod_resource/content/2/ki_guideline_pr2.pdf), die am Anfang der Lehrveranstaltung vorgestellt wurden.
## Fehler finden
Nachdem das Programm vereinfacht wurde, suchen Sie nach dem Fehler, der sich im Programm versteck und beheben Sie ihn.
Diese Korrektur bringen Sie dann wieder mit einem getrennten Commit in Git.
## Programm ausführen
Nachdem Sie ein korrektes Bild mit Javas Zufallszahlengenerator erzeugt haben, erzeugen Sie ein weiteres Bild mit dem Generator `SecRandomGenerator`, der Ihnen von den Reptiloiden gegeben wurde. Speichern Sie dieses Bild in einer Datei `secure_random.png` ab.
Jetzt führen Sie denselben Vorgang noch einmal mit dem gegebenen `SuperSecRandomGenerator` durch und speichern das Bild als `super_secure_random.png` ab.
Vergleichen Sie die drei Bilder. Was fällt Ihnen auf?
## Abgabe
Alle Abgaben für die Vorlesung erfolgen über `git` und das Ihnen zugeordnete Repository.
Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Rufen Sie mit `bin/submit.sh` das Skript auf, das die Lösungen testet und kompiliert. Wenn Maven eine Fehlermeldung zeigt, beheben Sie diese zuerst, bevor Sie mit dem nächsten Schritt fortfahren.
4. Wenn Sie Meldung "✅ Projekt gebaut" bekommen, checken Sie Ihre Änderungen in `git` **auf der Kommandozeile** ein (comitten), d.h. mit `git add` und `git commit`. Verwenden Sie **nicht** Eclipse für diesen Schritt.
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
6. Überprüfen Sie über das Web-Frontend, ob alles so im Repository liegt, wie Sie es erwarten.
**Erinnerung**: Denken Sie daran, dass Sie alle **öffentlichen Methoden** mit entsprechender **Javadoc** versehen müssen. **Ausgaben** auf und **Eingaben** von der Konsole sind nur dann erlaubt, wenn der Aufgabentext es explizit verlangt.