sebadorn.de

SWT-Projekt: Hochregallagerverwaltung

HighrackWare

Das „kleine“ Gruppenprojekt in Softwaretechnik war ein Vorgeschmack auf das große Projekt im 4. Semester. Das Programm soll bei der Verwaltung eines Hochregallagers behilflich sein. Regal aufbauen, bunte Boxen kreieren und auf die Regalböden werfen; noch ein paar Zusatz­funktionen, wie Farbrestriktionen. Eine hochgradig nicht-triviale Aufgabe, wie sich gezeigt hat. Die lange Planungsphase am Anfang war lang­weilig, aber sehr notwendig.

Nach so einem Projekt weiß man viel mehr wertzuschätzen, was andere Software leistet. Wir sitzen vor dem Monitor, verschieben einen schwarzen Balken, der mit einer Regalwand gleichbedeutend ist, und sind total „Wow, yeah! Es klappt!“ Ein Nicht-Beteiligter stände un­beeindruckt daneben: „Gratuliere. Ihr könnt einen schwarzen Balken verschieben.“

Gut ging dann auch die Vorführung über die Bühne – alles Wichtige hat funktioniert. Über­flüssig zu erwähnen, dass wir während dem Präsentieren neue Bugs entdeckt haben.


Jetzt verstehe ich auch diesen Witz.


Der Umgang mit Eclipse

Mein Handwerkszeug in ADS und Proggen. Es ist ganz gut, wenn man ein paar Kniffe kennt, denn Eclipse kann einem viel Arbeit abnehmen.


Strg+1

Eclipse Strg+1

Anbetungswürdig. Da ist schon wieder eine böse, rote Schlange irgendwo. Draufklicken und Strg+1 drücken. Ihr erhaltet eine Liste mit möglichen Aktionen zum Beheben, die Eclipse dann auch automatisch durchführt.


Strg+2, R

Eclipse Strg+2, R

Riesige Methode, zwanzigmal die Variable blubb verwendet und jetzt wollt ihr sie sinnvoller benennen? Oder der Methodenname foobar() gibt Rätsel auf? Mit diesem Kniff könnt ihr vor euren Kumpels angeben: Namen markieren und Strg+2 gefolgt von R drücken. Der Variablenname wird in der gesamten Methode und der Methodenname in der gesamten Klasse geändert. Zum Bestätigen Enter drücken. Auch als Partytrick geeignet.


Strg+Leertaste

Eclipse Strg+Leertaste

Vervollständigung. Beispielsweise schreibt man syso, drückt Strg+Leertaste und erhält System.out.println();. Oder für for erhält man Möglichkeiten eine for()-Schleife zu bauen. Für uns faule Informatiker doch genau das Richtige.


Strg+Shift+L

Eclipse Strg+Shift+L

Was Eclipse sonst noch an Shortcuts anzubieten hat, erfährt man durch die Kombi Strg+Shift+L. Ein Shortcut für eine Shortcut-Liste.


Syntax-Highlighting anpassen

Eclipse Syntax-Highlighting anpassen

Die Standard-Farbgebung ist etwas mau. Wer es bunter treiben will, kann sich das einstellen. Zu finden unter Window -> Preferences… und im neuen Fenster unter Java -> Editor -> Syntax Coloring. Ein paar wenige Änderungen können bereits für bessere Orientierung sorgen.


Import

Eclipse Import

Ordner anklicken, wo die Datei hinein soll und dann File -> Import, im neuen Fenster General -> File System, weiterklicken und über Browse den Quellordner wählen. Der Rest ist selbsterklärend. Und ja, Drag&Drop geht meistens auch, ist aber „böse“. Wie dem auch sei.


Debuggen

Eclipse Breakpoint setzen

Setze einen Breakpoint, bis zu dem durchgelaufen werden soll und ab dem du dann das Tempo vorgibst. Dafür rechtsklickst du im Fenster mit dem Code ganz links auf den Rand und wählst Toggle Breakpoint. Ein blauer Punkt wird gesetzt. Unter Run -> Debug geht es los. Die Ansicht wechselt dafür automatisch.

Eclipse Debugger

F5: Schritt für Schritt. Methoden werden beim Ausführen betreten.
F6: Schritt für Schritt. Methoden werden nicht im Detail durchlaufen.
F7: Die aktuelle Methode fertig ausführen und verlassen.
F8: Zum nächsten Breakpoint springen.


Fehlt eine Nützlichkeit? Sagt es mir in den Kommentaren!


Mandelbrot-Menge b/w

Mandelbrot-Menge mit 16 Iterationen xmin: -2.0 | ymin: -2.0 | length: 4 | dimension: 450 | maxIt: 16

Mwahaha! Es läuft!

Ohne online nachzuschlagen hätte ich es aber vermutlich auch nicht geschafft. Den mathematischen Weg habe ich von Wikipedia. Aber was nützt mir das Ergebnis, wenn ich nicht verstehe, warum das so ist? Ja, einige Zeit des Pen-and-Paper-Grübelns waren die Folge.

Um zu prüfen, ob ein Programmabschnitt das macht, was er sollte, habe ich auch Fremdcode eingesetzt und geschaut, ob immernoch der gleiche Murks rauskommt. War dies der Fall, hat es nicht an diesem Abschnitt gelegen und ich konnte den Fehler woanders suchen.

Die schönste Suche waren eineinhalb Stunden nur um dann festzustellen, dass da lediglich ein „=“ zu viel war.

Matheteil

Ausgangspunkt ist diese rekursive Folge:
zn+1 = zn2 + c, z0 = 0

c ist eine komplexe Zahl und besteht aus einem Realteil Re(c) und Imaginärteil Im(c).
c = Re(c) + Im(c)
c = a + ib
i = sqrt(-1)

Betrachtet man nun z2 sieht das wie folgt aus:
z0 = 0 ? c0 = 0
z1 = 0 * 0 + c1
z2 = c1 * c1 + c2

Dies wollen wir nun aufteilen in den Realteil und Imaginärteil.
Schauen wir erst einmal auf die Rechenregeln für komplexe Zahlen:
c1 * c2 = (a1a2 - b1b2) + i(a1b2 + b1a2)
c1 + c2 = (a1 + a2) + i(b1 + b2)

Dann machen wir mal. Erst die Multiplikation:
c1 * c1 = (a1a1 - b1b1) + i(a1b1 + b1a1)
c1 * c1 = (a12 - b12) + i(2 * a1b1)

Nun noch die Addition:
c12 + c2 = (a12 - b12 + a2) + i(2 * a1b1 + b2)

Die 1. Klammer beinhaltet den Realteil, die 2. Klammer den Imaginärteil.
Re(z2) = a12 - b12 + a2
Im(z2) = 2 * a1b1 + b2

Wisst ihr was? Das formulieren wir mal allgemein:
Re(zn) = an-12 - bn-12 + an
Im(zn) = 2 * an-1bn-1 + bn

Warum haben wir das gemacht?

Im Programm müssen wir an einer wichtigen Stelle überprüfen, ob der Betrag von zn kleiner Zwei ist. Ach, wo ich ohnehin gerade dabei bin …

Formel allgemein:
|c| = sqrt(a2 + b2)
c2 = a2 + b2

Unsere Bedingung:
Gilt |zn| < 2 bzw. gilt zn2 < 4?

Zu überprüfen gilt also folgendes:
Re(zn) * Re(zn) + Im(zn) * Im(zn) < 4

Java

Der eben beschriebene Teil kann dann so aussehen:

public static int pixelValue(
	double coordX, double coordY, int maxIt) {

	int stepsGone = -1;
	double	OldReZ = 0,
		OldImZ = 0,
		NewReZ = 0,
		NewImZ = 0;

	while(NewReZ*NewReZ + NewImZ*NewImZ < 4
	&& stepsGone < maxIt) {

		OldReZ = NewReZ;
		OldImZ = NewImZ;

		NewReZ = OldReZ*OldReZ - OldImZ*OldImZ + coordX;

		NewImZ = 2*OldReZ*OldImZ + coordY;

		stepsGone++;
	}
	return maxIt - stepsGone;
}

coordX und coordY sind die aktuelle Position im Koordinatensystem. (Diese Methode wird in einer Schleife aufgerufen, die alle Koordinaten nach und nach abklappert.)

maxIt (= Iterationen) ist die Beschränkung, wie oft die Schleife durchlaufen werden soll. Da das Ergebnis in einem Graustufenbild gespeichert wird, wirkt sich diese Zahl auch auf die Anzahl verschiedener Grautöne und somit die Detailgenauigkeit aus.

Zurückgegeben wird der Grauwert des Pixels für die aktuelle Koordinate.

Zum Schluss gesagt …

So, ich hoffe, es hilft jedem mit dieser Aufgabe. Und lasst euch Eines gesagt sein: Mal eben aus dem Ärmel schütteln kann ich so etwas auch nicht. Die Formeln nachzuvollziehen hat mich mit am längsten aufgehalten. Eine große Hilfe beim Programmieren war mir dann der fertige Fremdquellcode (siehe nächster Punkt), den ich zu Vergleichs- und Testzwecken heranziehen konnte.

Hilfen für mich – Hilfen für dich

Java-Code: easy-coding.de/java-mandelbrot-menge-t464.html
Wiki: de.wikipedia.org/wiki/Mandelbrot-Menge#Iteration_eines_Bildpunktes


Programmieren

Hausaufgaben

Wir werden Hausaufgaben erhalten – haben die erste bereits erhalten – die es innerhalb einer Woche zu erledigen gilt.

Wunderbar gelöst: +2 Punkte.
So lala: +1 Punkt.
Nicht abgegeben: -1 Punkt.
Bestmögliches Ergebnis: 20 Punkte.

Die ersten Aufgaben drehen sich um das Umrechnen von Zahlensystemen. Also z.B. vom alltagsbekannten Dezimalsystem ins Binärsystem. Dann gibt es noch Besonderheiten zu beachten bei Vorzeichen und die etwas umständlicheren Gleitkommazahlen.

Geben Sie die Darstellung der Zahlen 2,718 und 0,1 als 32 Bit IEEE Floating Point Zahl an.

Am Anfang habe ich nichts davon verstanden. Zettel in der Hand und: „Hä?“ ^^ Das Skript der Vorlesung konnte mir nicht wirklich helfen. Aber Wikipedia weiß Rat! Schritt-für-Schritt-Anleitung mit Beispiel. Dazu noch Onlinetools anderer Seiten zum Überprüfen der Lösung.

Links

Wikipedia: Gleitkommazahlen
Umrechner für beliebige Zahlensysteme: http://www.arndt-bruenner.de
Umrechner für IEEE 754 (Floating Point): http://www.h-schmidt.net

Arbeiten am Rechner

Im Programmierenkurs werden wir auschließlich mit dem Betriebssystem Fedora arbeiten. Nicht groß mit Terminal und solche Geschichten. Einfach nur auf dieser (KDE-)Oberfläche. Also keine Linux-Kenntnisse von Nöten. Zum genaueren Anschauen lasse ich Fedora zu Hause auch mal laufen. Aber nur in einer virtuellen Maschine. Den Stress mache ich mir nicht. Ôo

Zum Schluss bleibt noch zu sagen:

public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World!");
  }
}

Unser Einstieg in Java. Zu Beginn noch mit Texteditor und Konsole. Später mit Eclipse. Das erste Programm war: „Hello World!“ Was auch sonst. ^^

Links

Fedora: http://fedoraproject.org
VirtualBox: http://www.virtualbox.de
Java Development Kit: http://java.sun.com/javase/downloads/
Eclipse: http://www.eclipse.org