Algorithmen und Datenstrukturen - HowTo
Sommersemester 2022
Fabian Kuhn
English version
Daphne
Die Programmierübungen werden in Python programmiert und die Lösungen mittels Daphne eingereicht (eine kleine Übersicht zu den wichtigsten Schritten in Daphne finden Sie auch hier). Üblicherweise verlangen wir für alle Aufgaben Unit Tests und einwandfreie Style Checks. Dies wird von dem Build-Server Jenkins (der bei Daphne im Hintergrund läuft) automatisch überprüft. Im Folgenden wird kurz beschrieben, an welche Richtlinien Sie Sich halten sollten damit die Abgabe Ihrer Lösungen auf Daphne und das Zusammenspiel mit dem Build-Server Jenkins einwandfrei funktioniert.
Subversion (SVN)
Bei der Anmeldung zu diesem Kurs im Daphne-Sytem wird automatisch ein SVN-Repository für sie angelegt welches eine URL der folgenden Form hat:
https://daphne.informatik.uni-freiburg.de/ss2022/AlgoDat/svn/ihr-rz-account-name/
Außerdem gibt es ein öffentliches Repository (namens public) in dem wir Dateien zur Verfügung stellen welche Sie für die Barbeitung der Übungsaufgaben benötigen
https://daphne.informatik.uni-freiburg.de/ss2022/AlgoDat/svn/public/
Auf diese Repositories sollen Sie ein checkout ausführen um jeweils eine lokale Kopie auf ihren Rechner zu spiegeln. Mittels eines update können Sie das public Repository auf den neuesten Stand des zentralen Repositories bringen. Mittels des Befehls commit können Sie ihr Repository auf dem Server auf den Stand ihres lokalen Repositories bringen. Falls Sie eine tiefere Einführung, bzw. Auffrischung benötigen wie SVN funktioniert und wie man es benutzt, gibt dieser Link eine gute Übersicht. Es gibt eine große Auswahl an Subversion Clients die Sie benutzen können. Unter Windows ist Tortoise-SVN empfehlenswert.
Python
Um die Übungen in Python zu programmieren, müssen Sie natürlich einen Python-Interpreter installieren (wir verwenden Python 3). Zusätzlich sollten Sie den Style Checker flake8 installieren. Mit dem Style Checker können Sie überprüfen ob Ihr Programm den Programmierkonventionen PEP-8 entspricht, was für eine erfolgreiche Einreichung Ihrer praktischen Lösungen bei Daphne erforderlich ist.
Damit Sie in standardisierter Art auf den Python-Interpreter und den Style
Checker zugreifen, sowie die Unit Tests ausführen können,
sollten Sie das Programm make
verwenden. Um dieses anzuwenden, müssen Sie die
Konfigurationsdatei Makefile
(aus den Coding Standards oder aus dem public-repository) in Ihr
aktuelles Arbeitsverzeichnis kopieren. Im Falle der Übungen
heisst das Arbeitsverzeichnis
immer uebungsblatt-xx,
wobei xx die Nummer der
Übungsblatts
bezeichnet (mit führender Null falls die Nummer einstellig ist). Das Makefile aus
dem public Repository ist dabei dafür ausgerichtet, dass Sie
doctest für die Unit Tests
verwenden. Das Makefile aus
den Coding Standards verwendet die
Bibliothek unittest. Es ist
Ihnen freigestellt, für Ihre Unit Tests eine der beiden Varianten
zu verwenden.
Um zu Überprüfen, ob alle Ihre Source-Dateien dem
Standard des Style Checkers entsprechen, führen sie
make checkstyle aus.
Unit Tests mit doctest schreiben Sie direkt in den
Kommetarblock am Anfang jeder Python-Funktion. Unit Test mit der
Bibliothek unittest schreiben
Sie indem Sie Source-Dateien erstellen,
welche auf Test.py enden
(make sucht für die Tests
nach solchen Dateien). Wie solche Unit Tests aussehen sollten,
entnehmen Sie am besten den Beispielen in den Coding Standards. Das
Ausführen der Unit Test geschieht mit make test.
Um beide Dinge gemeinsam auszuführen, können Sie auch
einfach den Befehl make (ohne
Argumente) oder make all
verwenden. Um alle von Python automatisch erstellten zusätzlichen
Dateien zu löschen, können Sie make clean aufrufen. Bitte tun Sie das, bevor Sie Dateien zum SVN-Repository
hinzufügen. Alle vom Python-Interpreter automatisch generierten
Dateien müssen (und sollen) Sie nicht über SVN hochladen.
Jenkins
Damit Ihre Übungen vom Build-Server Jenkins bearbeitet werden können (und damit die Tutoren die Übungsabgaben nicht mühsam suchen müssen), müssen Sie jeweils in einem Unterordner uebungsblatt-xx Ihres Daphne-Homeverzeichnisses liegen, wobei xx die Nummer des Übungsblattes bezeichnet (einstellige Nummern mit führender 0!).
Sobald Sie Ihre Lösungen in den entsprechenden Unterordner im SVN Repository hochgeladen haben, überprüft Jenkins ob Ihre Quellcodes den Style-konventionen entsprechen und ob die Unit-Tests ordnungsgemäß druchlaufen. Dabei muss das Makefile immer mit hochgeladen werden damit Jenkins weiß welche Programme auf Ihren Quellcode auszuführen sind.
Jenkins wird dann entsprechende Symbole auf der Daphne-Website diese Kurses ausgeben. Wenn alle Tests erfolgreich waren und der Code den Konventionen entspricht wird ein grüner Haken ausgegeben (das Wettersymbol dahinter ist übrigens nicht so wichtig, es sollte nur kein schweres Gewitter sein). Solange Sie sich an die obigen Richtlinien halten, sollte dies eigentlich immer der Fall sein, wenn es lokal bei Ihnen funktioniert. Falls ein rotes Kreuz erscheint kann man auf das entsprechende Symbol klicken um Zugriff auf die konkreten Build-Logs und damit Hinweise auf die Fehler zu erhalten.
Gnuplot
Für manche Programmieraufgaben sollen Sie die Laufzeiten Ihrer Implementierungen auswerten indem Sie Graphen erstellen und einreichen. Wir machen zwar keinerlei Vorgaben über die Software die Sie dafür nutzen sollen, aber da wir in der Vorlesung und für unsere Lösungen in der Übung auf gnuplot zurückgreifen stellen wir (auf Wunsch von Studenten, supplementär zur Erklärung in der Fragestunde) eine kleine Gebrauchsanweisung zur Verfügung in der die wichtigsten Schritte noch einmal schriftlich erklärt werden.
Das Programm Gnuplot und einige Informationen zur Installation für diverse Betriebssysteme erhalten Sie unter anderem hier. In vielen Betriebsystemen lässt sich Gnuplot mit einem einzigen Shellbefehl installieren (wenn sie bspw. OSX/Linux und den package manager homebrew nutzen reicht brew install gnuplot).
Zunächst müssen Sie entsprechende Daten generieren die Sie plotten können. In der Vorlesung lassen wir unsere Python Programme eine entsprechende Ausagabe machen die einer Wolke von 2D-Punkten der Form X Y enspricht. Die Koordinaten X Y sind jeweils mit einem Leerzeichen getrennt, mit einem Zeilenumbruch zwischen zwei Paaren. X stellt meist die Eingabegröße dar und Y die Laufzeit. Für Details zur Ausagbe im Python Code sehen Sie Sich bitte die Python Quellcodes die wir mit dem ersten Übungsblatt zur Verfügung stellen sowie die Vorführungen in der ersten Vorlesung an.
Die Ausagbe des Python Programms lässt sich dann wie folgt in eine textdatei umleiten: python3 file.py > plot.txt. Die entsprechende Ausgabe plot.txt kann man nun direkt in gnuplot in eine Grafik umwandeln. Starten Sie dazu gnuplot in Ihrer jeweiligen Kommandozeile und tippen sie das Kommando plot 'plot.txt'. Das war's. Gnuplot wird Ihnen eine ensprechende Punktwolke mit automatisch angepasster Achsenskalierung generieren.
Es kann sein dass Sie aufgrund verbesserter Vergleichbarkeit mehrere plots in einem Graph anzeigen möchten. Wenn Sie schon entsprechende Dateien plot1.txt und plot2.txt vorliegen haben geht das einfach mittels plot 'plot1.txt', 'plot2.txt'. Sie können diese plots auch mit einem Titel versehen durch plot 'plot1.txt' title 'plot 1', 'plot2.txt' title 'plot 2'. Falls die Legende die Grafik verdeckt, lässt sich diese verschieben, bpsw. mit set key left auf die linke Seite. Des weiteren könnte es manchmal eine Verbesserung der Übersicht bringen wenn man eine logarithmische y-Achse wählt. Das geht einfach indem man vorher set logscale y eintippt. Sie können (und sollen) zudem die x und y Achsen beschriften mittels set xlabel 'input size' oder set ylabel 'elapsed time in ms'.
Gnuplot ist natürlich noch weitaus mächtiger als das was wir hier erklären können. Eine wesentlich tiefere Beschreibung der Möglichkeiten von Gnuplot erhalten Sie (u.a.) hier.