RSS-Feed

Welcome to the World of Washcraft

von Kai um 14:05 am Freitag, 2. Juli 2010 in News, Studium | 0 Kommentare

Seba hat auf seinem Blog unser Projekt für Softwaretechnik ganz schön zusammengefasst. Mir hat das ebenfalls sehr viel Spaß gemacht und interessante neue Aspekte in der Softwareentwicklung aufgezeigt:

So ist eine funktionierende Infrastruktur und Absprachen, an die man sich tunlichst halten sollte, wahrlich Gold wert. Ich glaube, eine gute Kommunikation ist für den Erfolg eines Softwareprojekts schon die halbe Miete.

Eleganz vs. Verständlichkeit

von Kai um 18:05 am Montag, 28. Juni 2010 in Programmiersprachen, Studium | 2 Kommentare

Fremden Code zu lesen ist grausam. Man muss sich nicht nur in eine völlig andere Denkweise hinein versetzen, sondern versuchen einzelne Stückchen zu einem großen Ganzen zusammenzusetzen.
Eigenen Code zu lesen ist aber mindestens genauso grausam, wenn der vorliegende Quelltext sagen wir älter als zwei Monate ist. Man vergisst schnell, was man sich beim entwickeln gedacht hat und warum man das entstehende Programm in eine bestimmte Richtung und nicht anders programmiert hat.

Wenn ich nun also zum Beispiel ein geschriebenes Programm aus dem ersten Semester um eine bestimmte Funktionalität erweitern müsste, dann wäre ich wahrscheinlich schneller, wenn ich das komplette Programm “from-scratch” noch einmal komplett neu schreiben würde.
Diese Erkenntnis ist natürlich schon lange bekannt und es gibt daher auch viele Konzepte, wie man diesem Problem entgegnen kann. Auf diese möchte ich hier aber gar nicht weitergehen, sondern versuchsweise aufzeigen, wie man im Kleinen schon darauf achten kann, lesbaren Code zu produzieren.
Als Beispielsprache verwende ich Python, weil mir erstens die Sprache sehr gut liegt und weil sie den Benutzer schon konzeptuell zwingt “saubereren” Code zu schreiben.

Kommentare sind dazu da, den eigenen Code zu erläutern bzw. zu erklären und verwendete Parameter auf ihre Bedeutung hin zu verdeutlichen. Im Prinzip wohl eine gute Sache. Ich finde den Einsatz von Kommentaren dennoch nicht gut, weil sie meiner Meinung nach das Problem nicht an der Wurzel packen: Wenn ich Code erst erklären muss, bevor sie einem dritten verständlich erscheinen, ist die Wahrscheinlichkeit hoch, dass entweder das zu lösende (Teil-)problem noch nicht ganz geknackt ist, oder meine Bezeichnungen für Funktionen und Variablen Mumpitz sind. Selbst Bezeichnungen für Hilfsvariablen sollten eindeutig bestimmen, wofür diese gebraucht werden.

Als Beispiel soll folgendes Szenario dienen:
Hier soll die Eingabe des Benutzer verarbeitet und an eine Funktion weitergegeben werden. Im ersten Beispiel ohne genauere Variablenbezeichnung und mit Kommentar, im zweiten Beispiel mit treffenden Bezeichnungen.
Obwohl die Lebensdauer der Variablen mindestgebot, auktionsdauer, dateipfad gerade mal zwei Zeilen beträgt, tragen diese doch erheblich zur Lesbarkeit bei:

# Eingabe: versteigere 50,60,/tmp/bild.jpg
eingabe = raw_input()
if eingabe.split()[0] == 'versteigere':
    data = eingabe.split()[1].split(',')
    if len(data) != 3:
        print "error: wrong input"
    else:
        # Startet neue Auktion mit Mindestgebot,
        # Dauer der Auktion und Pfad zum Bild
        auktion.versteigere(data[0],data[1],data[2])

Und jetzt nochmal mit eindeutigen Bezeichnungen

eingabe = raw_input()
userBefehl = eingabe.split()[0]
if userBefehl == 'versteigere':
    befehlsParameter = eingabe.split()[1].split(',')
    if len(befehlsParameter) != 3:
        print "error: wrong input"
    else:
        mindestgebot, auktionsdauer, dateipfad = befehlsParameter[:]
        auktion.versteigere(mindestgebot, auktionsdauer, dateipfad)

Wie man sieht, hat man also nur durch eine bessere Bezeichnung der übergebenen Variablen ein Kommentar gespart und (hoffentlich) erheblich zur Lesbarkeit beigetragen.

Meines Erachtens darf hier auch ruhig redundante Information im Code vorkommen, wenn sie der Lesbarkeit dient. Im obigen Code ist das zum Beispiel das unnötige Slicing (befehlsParameter[:]), weil Python schlau genug ist, auch ohne das Slicing zu erkennen, dass die Liste mit drei Parameter auf die drei vorstehenden Variablen übergeben werden soll. Dennoch wird man durch das ‘[:]‘ beim Lesen noch einmal explizit darauf hingewiesen.

Erste Gehversuche in OpenGL

von Kai um 16:58 am Freitag, 14. Mai 2010 in Studium | 0 Kommentare

Dieses Semester habe ich die Veranstaltung Computergrafik besucht und mich dabei (neben viel Mathematik) auch ein bisschen in OpenGL eingearbeitet.
Leider wurde während des Semesters in dieser Vorlesung die bewährte Entwicklungsmethode des “Trial-and-Error“-Verfahrens Lügen gestraft. Man muss bei Computergrafik wirklich sehr genau wissen, was man da gerade tut. Alles andere endet in stundenlangem erfolglosen Rumstochern in Codezeilen.
Ich hatte schon eine dunkle Vorahnung, dass diese Entwicklungsmethode zum Scheitern verurteilt war und werde daher nun die gepredigten Vorsätze der ersten Semester versuchen zu verinnerlichen. Vor allem, da die anstehenden Softwareprojekte an Komplexität und Umfang stetig zunehmen ist das vielleicht nicht der schlechteste Zeitpunkt:-)

Zusammen mit zwei weiteren Kommilitonen habe ich als Projektabschluss für Computergrafik noch folgende Achterbahn zusammen gezimmert. Die Bahn ist nicht ganz fehlerfrei, weil wir bis zum Schluss noch ein paar Bugs drin hatten, die keiner von uns so richtig lösen konnte, aber moderne Videobearbeitung und ein guter Schnitt machen aus einer fehlerbehafteten Bahn ein einigermaßen anschauliches Ergebnis:

Mathe 3

von Kai um 15:54 am Donnerstag, 11. Februar 2010 in Klausuren, Studium | 0 Kommentare

Heute war der Klausurtermin für “Mathematik für Informatiker”. So aus dem Gedächtnis wurden folgende Aufgaben gestellt. Die Liste ist bestimmt nicht vollständig und kann noch Fehler enthalten, kann aber mit Hilfe der anderen Opfer, die mitgeschrieben haben, komplettiert werden.

Aufgabe 1

a.) Beweisen Sie mit Hilfe der vollständigen Induktion:


b.) Beweisen Sie folgende Aussage mit Hilfe von Kontraposition:

Wenn teilerfremd sind, so sind auch teilerfremd.

c.) Beweisen Sie, dass der Satz: Wenn 3a+2b und 3a-2b sind nicht teilerfremd, dann sind a und b auch nicht teilerfremd, nicht gilt.

Lösung (anzeigen)













Aufgabe 2

a.) Die Wettervorhersage gibt an, dass es mit 40% Wahrscheinlichkeit morgen regnet und mit 60% Wahrscheinlichkeit, dass es nicht regnet. Leider trifft die Vorhersage aber nur mit 80% Wahrscheinlichkeit zu, dass es morgen tatsächlich regnet und mit 90% Wahrscheinlichkeit, dass es nicht regnet

Berechnen Sie die Wahrscheinlichkeit dafür, dass morgen ein Regentag ist.

b.) Adam und Eva waren zum Inlineskaten verabredet, doch leider kam Eva nicht zum vereinbartem Zeitpunkt, weil Sie gehört hat, dass es regnen wird. Als Entschuldigung gibt sie an, dass Sie gehört hat, dass es regnen sollte. Adam ist sich sicher, dass Eva die Wettervorhersage nicht gesehen haben kann.

Wie hoch ist die Wahrscheinlichkeit, dass es geregnet hat?

Aufgabe 3

Ein Prof vergisst jedes zehnte Mal (unabhängig vom vorherigen Mal) seine Unterlagen für die Vorlesung und muss zurücklaufen und sie holen. Bei 15 Vorlesungen:
a.) Wie groß ist die Wahrscheinlichkeit, dass er sie nie vergisst?
b.) Wie groß ist die Wahrscheinlichkeit, dass er sie mindestens zweimal nicht vergisst?

Lösung (anzeigen)


Aufgabe 4

In einer Sportgruppe liegt der Erwartungswert bzgl. der Körpergröße bei 1.8m und die Standardabweichung beträgt 0,1m. Für den Kurs „Turnen“ braucht man eine Größe zwischen 1,5m und 1,7m.

Wieviel Prozent der Studenten nehmen teil?

Lösung (anzeigen)





Es nehmen also 15,74% aller Studenten teil.

Aufgabe 5

Es sind folgende zwei Schätzer T1,T2 gegeben:

a.) Überprüfen Sie die Schätzer auf ihre Erwartungstreue
b.) Überprüfen Sie die Schätzer auf ihre Konsistenz

Aufgabe 6

Die Studenten geben an, dass Sie für das Fach Mathe folgenden Lernaufwand haben:

Studenten 80 100 60 40
Zeitaufwand in Std. [0,5) [5,10) [10,20) [20,40)

a.) Bitte erklären Sie, ob die Zufallsvariable X="Zeitaufwand der Studenten" diskret oder stetig ist. Bitte begründen Sie ihre Antwort. Ohne Begründung gibt es keine Punkte.
b.) Bitte geben Sie die Dichtefunktion an, und gehen Sie davon aus, dass die Studenten nicht länger als 40 Stunden für das Fach aufwenden?
c.) Zeichnen Sie die Verteilungsfunktion
d.) Berechnen Sie den Erwartungswert E(X)
e.) Berechnen Sie die Wahrscheinlichkeit für P(X<18)

Aufgabe 7

a.) Anhand folgender Tabelle soll eine Regressionsgerade mit Hilfe des Satzes der kleinen Quadrate berechnet werden.

Jahr nach 2000 2 4 6 8
Durchschnittsverbrauch an Kraftstoff in Liter/100km 8,5 8,2 7,9 8,0

b.) Berechnen Sie, ausgehend von einer linearen Abhängigkeit,nach wie viel Jahren nach dem Jahr 2000 der Durchschnittsverbrauch bei 5 Litern/100km liegen wird

Lösung (anzeigen)

















Die Sache mit dem Lotto

von Kai um 22:19 am Montag, 8. Februar 2010 in Allgemeines, Studium | 3 Kommentare

Millionen von Menschen versuchen jede Woche aufs neue mit einem Lottoschein den großen Gewinn zu holen. Die Tatsache, dass ein Sechser im Lotto so wahrscheinlich ist, wie in einem Treppenhaus von einem Blitz getroffen zu werden, wissen wohl die meisten.

Dennoch lässt sich diese Gruppe Menschen aber nicht davon beirren, es trotzdem zu probieren. Schließlich gewinnt ja fast jede Woche jemand beim Lotto.

Da bald eine Klausur in Stochastik und Statistik ansteht, habe ich mich zu folgender Überlegung hinreißen lassen:

Da es beim Lottospielen nicht auf die Reihenfolge der gezogenen Zahlen ankommt, ist die Anzahl aller Möglichkeiten 6 Zahlen aus 49 zu ziehen:

Eine von diesen knapp 14 Millionen wäre dann der Treffer für einen Lottogewinn. (Die Zusatzzahl habe ich hier mal nicht berücksichtigt).
Nun müssen es ja nicht immer 6 richtige sein. Vielleicht würde man sich ja mit 5 richtig gezogenen Zahlen auch zufrieden geben.

Die Anzahl der Möglichkeiten fünf richtige zu ziehen sind dann immer noch 43 x 6 = 258. Analog zu obiger Rechnung kann man es auch folgendermaßen schreiben:

Führt man diese Rechnung jetzt für alle Treffer durch, zum Spaß auch für die bei denen kein Gewinn ausgezahlt wird, kommt man zu folgendem Ergebnis (P steht hier für die Wahrscheinlichkeit):






Mit anderen Worten ausgedrückt, bedeutet das also, dass man mit einer Wahrscheinlichkeit von ca. 41,3% eine Zahl richtig getippt hat. Für zwei richtige Treffer sinkt die Wahrscheinlichkeit schon auf etwas über 13%. Für einen “Dreier” liegt die Wahrscheinlichkeit dann nur noch bei ca. 1,76%.

Ich weiß nicht, wieviel Euro es für einen Dreier gibt, aber nehmen wir mal an, man würde für drei richtig getippte Zahlen 50,- € bekommen. Leider muss man dafür aber auch im Schnitt ca. 57 Lottospiele mitspielen, um statistisch betrachtet einmal drei Richtige zu haben. Wenn man für einen Lottoschein also 7,- € bezahlt, dann wären das knapp 400,- €, die man für einen 50,- € Gewinn erhalten hätte.

Das dürfte aber die meisten Lottospieler nicht interessieren, schließlich gewinnt fast jede Woche jemand die Millionen. ;-)

Onlinetest Python

von Kai um 20:37 am Montag, 11. Januar 2010 in Klausuren, Programmiersprachen, Studium | 0 Kommentare

Heute war es wieder mal soweit: Onlinetest. Dieses mal in Python. Nachdem ich erfolgreich meine Maschine (iMac mit Debian, Windowmanager war glaub ich FVWM) zweimal abgeschossen hatte, bin ich in der vorgegebenen Zeit von 90 Minuten knapp fertig geworden. Eigentlich sind die gestellten Aufgaben in den bisherigen Onlinetests, die ich so mitgeschrieben habe, nicht extrem schwer, trotzdem finde ich es aber schwierig auf Kommando kreativen (und möglichst cleveren) Code zu schreiben.

Es sind eben diese typischen Prüfungssituationen bei denen man unter erschwerten Bedingungen klaren Kopf behalten muss ;-)
Das waren die Aufgaben:

Aufgabe 1:

Man soll von der Standardeingabe eine Zeile einlesen und unnötige Leerzeichen entfernen. Außerdem soll jedes Wort mit einem großen Anfangsbuchstaben in Großbuchstaben umgewandelt wieder ausgegeben werden.

# a1.py
while True:
    line = raw_input()
    line = line.split()
    for word in line:
        if(str.isupper(word[0])):
            print str.upper(word),
        else:
            print word,
    print # Zeilenumbruch für schönere Ausgabe

Aufgabe 2:

Die zweite Aufgabe bestand darin, eine Datei belegung.dat einzulesen, die folgendes Format hatte: <VL-Nr>; <matrikelNr>; <VL-Name>; <VL-Typ>.
Danach sollte die so eingelesene Datei in folgendem Format in eine Datei ausgabe.dat geschrieben werden:
<VL-Nr>,<AnzahlBelegungen>, <VL-Name> <VL-Typ>
Momentan sind in der Ausgabe noch doppelte Einträge drin, das müsste noch geändert werden.

# a2.py
dict = {}
belegung = []

input = open('belegung.dat','r')
for line in input:
    line = line.split(';')
    belegung.append(line)

input.close()

for line in belegung:
    if dict.has_key(line[0]):
        dict[line[0]] += 1
    else:
        dict[line[0]] = 1

ausgabe = file('ausgabe.dat','w')

for nummer, anzahl in dict.iteritems():
    for line in belegung:
        tmp = ""
        if nummer==line[0]:
            try:
                tmp = str(nummer) + ',' + str(anzahl) + ',' + line[2] + '\n'
                ausgabe.write(tmp)
            except:
                pass

ausgabe.close()

Aufgabe 3:

Die dritte Aufgabe bestand darin, einen “sprach-begabten” Taschenrechner zu programmieren, der beim Aufruf des Programms Argumente wie “17 plus 4 minus 3 gleich” übernimmt und korrekt auswertet. Es soll bewusst auf Punkt-vor-Strich Rechnung verzichtet werden (also fällt eval() flach). Außerdem kann man der Einfachheit davon ausgehen, dass nur korrekte Argumente übergeben werden.
Ich hab ungefähr so etwas hingeschrieben:

# a3.py
import sys

i = 0
result = 0
input = sys.argv[1:]
while i < len(input):
    if input[1]=="gleich":
        result = int(input[0])
        break
    elif input[i]=="plus":
        result = int(input[i-1]) + int(input[i+1])
        input[i+1] = result
    elif input[i]=="minus":
        result = int(input[i-1]) - int(input[i+1])
        input[i+1] = result
    elif input[i]=="mal":
        result = int(input[i-1]) * int(input[i+1])
        input[i+1] = result
    elif input[i]=="durch":
        result = int(input[i-1]) / int(input[i+1])
        input[i+1] = result
    i += 1

print "Ergebnis:",str(result)

Onlinetest in C

von Kai um 19:19 am Montag, 23. November 2009 in Programmiersprachen, Studium | 0 Kommentare

Heute fand nach sechswöchiger Einführung in C in dem Modul “Programmieren 3″ der Onlinetest in C statt. Nächste Woche gehts dann mit einer Einführung in Python weiter.

Da ich mir mittlerweile meiner akuten Prüfungsangst und der damit einhergehenden Blackouteritis bewusst bin, gehe ich davon aus, dass ich nur knapp bestanden hab, obwohl (zumindest die ersten beiden Aufgaben) nicht so schwer waren.

Nachfolgend nun die ersten beiden Aufgaben des Onlinetests. Die dritte Aufgabe reiche ich wie schonmal nach, sobald mein Kopf nicht mehr ganz so matschig ist.

Aufgabe 1


/****************************************************
* Aufgabe: Es werden Noten (Note '1' bis Note '6') *
* auf der Kommandozeile eingegeben. Als Ausgabe *
* erscheint dann die Summe der einzeln eingegeben- *
* en Noten *
****************************************************/

#include

int main(void) {

int n1=0,n2=0,n3=0,n4=0,n5=0,n6=0;
int note;
while(scanf("%d", &note) != EOF) {
switch (note) {
case 1:
n1++;
break;
case 2:
n2++;
break;
case 3:
n3++;
break;
case 4:
n4++;
break;
case 5:
n5++;
break;
case 6:
n6++;
break;
}
}

printf("Note 1: %d mal\n", n1);
printf("Note 2: %d mal\n", n2);
printf("Note 3: %d mal\n", n3);
printf("Note 4: %d mal\n", n4);
printf("Note 5: %d mal\n", n5);
printf("Note 6: %d mal\n", n6);
}

Aufgabe 2


/****************************************************
* Aufgabe: Versehentlich wurden einige Lottozahlen *
* doppelt gezogen. Es soll eine beliebige Reihe *
* von Zahlen auf der Kommandozeile eingegeben und *
* die doppelt vorkommenden Zahlen geklammert *
* werden *
****************************************************/

#include
#include

typedef struct zahlen {
int zahl;
struct zahlen *next;
} Zahl;

Zahl *neueZahl(void) {
Zahl *z;

z = malloc(sizeof(Zahl));
assert(z);
z->zahl = 0;
z->next = NULL;

return z;
}

Zahl *start;
Zahl *tmp;

int main(void) {

int eingabe;
int erstesMal = 0;
while(scanf("%d", &eingabe) != EOF) {
if(erstesMal == 0) {
Zahl *neu = neueZahl();
neu->zahl = eingabe;
neu->next = NULL;
start = neu;
tmp = neu;
erstesMal = 1;
} else {
Zahl *neu = neueZahl();
neu->zahl = eingabe;
tmp->next = neu;
tmp = neu;
}

}

printf("%d ",start->zahl);
tmp = start->next;
while(tmp != NULL) {
if(start->zahl == tmp->zahl) {
printf("[%d] ",tmp->zahl);
} else {
printf("%d ",tmp->zahl);
}
start = tmp;
tmp = start->next;
}
}

Ultimative Emacs Cheat Sheet Übersicht

von Kai um 14:17 am Samstag, 31. Oktober 2009 in Produktivität, Studium | 1 Kommentar

emacsCheatSheetNotgedrungen aus dem Umstand, dass ich mir für das Studium momentan den Emacs Editor anschauen muss, habe ich mir die Mühe gemacht, eine kleine Überlebenshilfe zu basteln. (Auch wenn ich Vim selbstverständlich viel besser finde ;-) )
Die Infos auf dem DIN A5 großen Blatt habe ich mir quer durchs Internet zusammengesucht.

Der Verweis über das Vorschaubild führt zum Original und damit zur vollen Auflösung von 300 DPI. Viel Spaß damit.

Über den Sinn und Unsinn von Studienführern

von Kai um 22:20 am Dienstag, 30. Juni 2009 in Allgemeines, Studium | 1 Kommentar

Zeit StudienführerDa ich heute morgen auf dem Weg zur Arbeit meinen MP3-Player vergessen habe (meine oft einzige Möglichkeit in der Woche Podcasts zu hören), hab ich mich am Bahnhofskiosk nach einer Lückenfüller Zeitschrift umgeschaut und mir die aktuelle Ausgabe von “Die Zeit – Studienführer” gekauft. Neben den ganzen Überlebenstipps für Erstsemesterstudenten war auch ein aktuelles Hochschulranking dabei und eine Beschreibung vieler, vieler Studiengänge. Als ich dann die Inhaltsbeschreibung zu meinem Studiengang “Medieninformatik” durchgelesen habe, wurde mir auf einen Schlag klar, warum die Abbrecherquote in den ersten beiden Semestern so hoch ist :-(

Der erste Hammer war, dass Medieninformatik in die Kategorie “Irgendwas mit Medien” einsortiert wurde (die Tatsache, dass *Informatik* gelehrt wird und der ganze Medienkram höchstens (wenn überhaupt) als Zusatzqualifikation angesehen werden kann, wurde einfach mal unter den Teppich gekehrt). Dann war da zu lesen, dass in diesem Studium Gestaltung mit Computerwissenschaft (was auch immer Computerwissenschaft in diesem Zusammenhang bedeuten soll ) verbunden wird und man lernt wie “Internet”, “Mobilfunk” oder “Digitalradio” gestaltet und produziert werden…

Also auf die Sache mit dem Internet würde ich mich ja noch einlassen, aber was das mit dem Mobilfunk bzw. Digitalradio zu tun haben soll (und warum gerade das genannt wird), ich weiß ja nicht. Mir scheint eher, als wurden da ein paar schlagkräftige Buzzwords aneinandergereiht und der Verfasser des Textes hatte entweder keinen Bock sich zu informieren, keine Ahnung, keine Zeit oder alles zusammen:-)

Update auf Eclipse Galileo

von Kai um 20:26 am Donnerstag, 25. Juni 2009 in Studium | 0 Kommentare

Gestern kam die neue Version von Eclipse, meiner favorisierten (Java-) IDE. NetBeans hatte ich nur kurz ausprobiert, aber da wir an der FH ebenfalls Eclipse einsetzen, benutze ich die auch auf meinem Rechner zu Hause.

Eclipse

Neben einer “gefühlten” Verbesserung der Geschwindigkeit, kann ich eigentlich nicht viel Neues feststellen. Gut gelöst finde ich die neue Workspace Verwaltung. Hier kann man statt einer in Stein gemeißelten Festlegung eines Workspaces, nun bei jedem Start auswählen, in welcher man arbeiten möchte. Da ich meine Projekte bisher immer nach Semester getrennt habe, kommt mir das sehr entgegen.

Ich habe es seit Ganymede nicht geschafft, meine Version “einzudeutschen”. Mittlerweile ist mir die englische Oberfläche aber weitgehend lieber bzw. habe ich mich daran gewöhnt. Und da der Sourcecode (inklusive den Kommentaren und der Doku *hust*) in englischer Sprache gehalten ist, finde ich es auch eigentlich konsistenter die englische Variante zu benutzen.

Anfang dieses Semesters hatte ich mir von der FH ein SVN-Repository besorgt, um meine Projekte bequem von verschiedenen Rechnern aus verwalten zu können, ich habe aber schnell gemerkt, dass das bei dem Umfang der einzelnen Programmieraufgaben dem Schießen mit Kanonenrohren auf Spatzen gleichkommt. Ich habe nämlich keine Lust bei 20 Zeilen Code, jedesmal den Code neu auszuchecken, bzw. Updates zu ziehen und Patches hochzuladen. Ich nutze deswegen Dropbox, um die Ordner fürs Studium und den jeweiligen Workspace auf verschiedenen Rechnern synchron zu halten. Leider ist die FH an der ich studiere, von der Idee, Dropbox auf dem Rechnerpool zu installieren nicht sehr angetan gewesen, weswegen ich immer noch einer praktischen Lösung suche, den Kram, den ich zu Hause mache direkt auf dem Rechner in der FH zur Verfügung zu haben.