Apache Pivot – Java GUIs Plattformübergreifend

Programmieren an sich ist ja nicht so schwer, sollen die Programme aber auf verschiedenen Plattformen laufen, muss man einige Dinge beachten. Auf der einen Seite muss die Programmiersprache auf allen gewünschten Plattformen unterstützt werden (sprich es muss einen Compiler/Interpreter geben) und es sollten keine Bibliotheken verwendet werden, welche auf “native code” (Code, welcher für ein spezifisches Betriebssystem/CPU programmiert/compiliert wurde) setzen.

Es gibt diverse solcher Sprachen (Python, Java, Ruby, Mono, etc) und jede hat Vor- und Nachteile. Insbesondere wenn man nicht nur Konsolenprogramme schreiben will wird es meistens kompliziert. Frameworks für GUIs arbeiten meist nur auf einem Betriebsystem, da viel betriebsystemspezifischer Code verwendet wird. Deshalb habe war ich schon seit längerer Zeit auf der Suche nach einem GUI Framework, welches dieses Problem löst. Vor ein paar Wochen entdeckte ich “Apache Pivot”.

Apache Pivot ist ein Framework um GUIs für Java zu implementieren, welche auf verschiedenen Plattformen funktionieren. Das GUI wird in einem XML-File definiert. Grundlegende Elemente können so eingefügt werden. Elemente können auch später mittels Java Code hinzugefügt werden. Das Framework funktioniert für normale Programme, Applets und es sollten sich sogar Web-Applikationen erstellen lassen (Die WebApps habe ich aber noch nicht ausprobiert).

Es gibt ausführliche Demos und einfache Beispiele zu allen Komponenten.

Die Java-Programme funktionieren auf Windows, Mac OS X und Linux (im Grunde überall wo eine grafische Oberfläche vorhanden ist und Java unterstützt wird). Die Performance ist sowohl auf Windows als auch auf Mac OS X gut (Linux habe ich nicht so ausführlich getestet). Wenn nicht so sauber programmiert wird reagieren die Programme speziell unter Windows nicht ganz so schnell. Insbesondere bei Buttons, wenn grössere Aktionen ausgeführt werden sollen, muss diese in einem neuen Thread gestartet werden. Wenn da Fehler passieren, reagiert das GUI träge.

Alles in allem gefällt mir das Framework, es ist schnell, einfach zu benutzen und man kann es in bestehende Programme Integrieren (und so langsam zum Beispiel ein SWING-Interface durch Apache Pivot ersetzen).

 

Bücherliste für das neue Semester

Das neue Semester hat angefangen und bietet für mich einiges an Lesestoff. Da die Bücher thematisch mehr oder weniger zum Blog passen, stelle ich sie hier vor.

In “Software Architecture” behandeln wir die Planung und Durchführung von Software-Projekten. Folgendes Buch Buch behandelt vorallem die Implementierung grosser Projekte. Es treten immer wieder ähnliche Situationen auf in denen man Probleme ähnlich löst. Das Buch stellt nun diverse “Muster” vor, welche immer wieder verwendet werden. Es werden Vor- und Nachteile, sowie verschiedene Gefahren erklärt. Das Buch deckt in unserem Fall jedoch nicht den gesamten Stoff ab, da wir insbesondere auch Requirements, Planung und Testing behandeln.

Das zweite Buch ist für die Vorlesung über Computer Netzwerke. Das Buch dient als Einführung, insbesondere in die Verschiedenen Schichten eines Netzwerkes (von der Physikalischen Übertragung im Kabel/in der Glasfaser, bis zu den Programmen, welche Daten austauschen). Das Buch ergänzt die Vorlesungsunterlagen, insbesondere geht es in einigen Bereichen noch ein bisschen mehr in die Tiefe.

Das letzte Buch ist für die Datenbank-Vorlesung. Es geht in erster Linie um die Modellierung von Daten (einerseits mittels relationalen Datenbanken, andererseits auch allgemein, bzw. um die Darstellung mittels ER/UML). Das Buch ergänzt die Vorlesung mit weiteren Beispielen und mehr Erklärungen.

Viel Spass beim lesen.

Let’s bake a cake – Entwickeln eines Webprojektes mit CakePHP

Seit einiger Zeit suche ich eine brauchbare Alternative zu PHP um Webseiten zu erstellen. Neben ASP.NET, Ruby und Python habe ich auch ein bisschen JSP angeschaut. Alle Lösungen waren mir jedoch in irgend einem Punkt unsympathisch. Da ich einzelne PHP-Basierte Anwendungen weiter verwenden möchte kann ich nicht ohne weiteres auf Tomcat/Jetty, etc umsteigen, ansonsten wäre JSP mit Velocity eine annehmbare Lösung gewesen. Zusammen mit Apache und mod_proxy oder mod_jk ist die Lösung jedoch nicht optimal. Insbesondere wenn mehrere Projekte zusammen laufen sollen wird es unter Umständen mühsam. Aus diesem Grund habe ich mich dazu entschieden ein PHP-Framework auszuprobieren. Meine Wahl fiel schlussendlich auf CakePHP.

CakePHP ist ein relativ kleiens PHP-Framework (ca. 5 MB) und funktioniert mehr oder weniger eigenständig. Man muss ein Zipfile in das Webverzeichnis des neuen Projektes entpacken und CakePHP ist mehr oder weniger bereit. Das Framework konzentriert sich auf Datenbankanwendungen, die Idee dabei ist, dass möglichst viel Arbeit vom Framework übernommen wird, so können zum Beispiel die Datenbanken von Hand generiert werden, und dann automatisch die “Models” und “Controler” sowie “Views” welche die Daten aus der Datenbank holen, verarbeiten, anzeigen und schliesslich wieder zurück speichern. Validierungen können direkt aus der Datenbank übernommen werden (zb. die Prüfung ob eine Variable nicht Null sein darf oder ob bei einem INTEGER-Feld wirklich eine Zahl eingegeben wurde, usw).

Ziel dieser Automatisierung ist es jeweils möglichst schnell auf funktionieren CRUD (Create, Read, Update Delete) Anwendungen zu kommen, da heisst Daten können erstellt, ausgelesen, bearbeitet und gelöscht werden. Standardmässig können zwei Benutzerlevel benutzt werden (‘normal’ und ‘admin’). Mit Hilfe einer Rechteverwaltung kann das Konzept jedoch beliebig fein eingestellt werden, so können einzelne Benutzer erstellt werden, Gruppen mit mehren Benutzer sowie Rollen welche den Benutzer oder Gruppen zugewiesen werden können und Rechte welche den Rollen verteilt werden. Mit den Rechten lässt sich dann steuern wer auf welche Funktionen zugreifen darf, also wer welche Daten lesen, schreiben, und löschen darf. Zusätzlich gibt es diverse Hilfsklassen, welche lästige aber notwendige Aufgaben übernehmen. Bilder, Links, etc. können so einfach eingefügt werden, so wird korrekter HTML-Code generiert und alle Links und Bilder haben eine korrekt relative URL egal an welcher stelle man verlinkt. Mit dem URL-Rewriting wäre dies von Hand oftmals gar nicht so einfach. Andere Hilfsklassen ermöglichen die automatische Generierung eines RSS-Feeds oder stellen einfach und zuverlässig Ajax-Funktionen und Elemente bereit und füttern diese mit den Daten aus der Datenbank.

Trotz den vielen Features ist das Framework recht gut aufgeräumt. Der Code welche ein Programmierer in seinem Projekt verwendet ist vollständig in einem Verzeichnis enthalten, so kann Cake aktualisiert werden, ohne dass Dateien aus dem eigenen Projekt überschrieben werden. Zu fast jedem Problem findet man jemanden der dafür eine Lösung gefunden hat, sei es eine Hilfsklasse die schon vorhanden ist oder eine selber geschriebene die man hinzufügen kann, etc. Zu CakePHP gibt es eine recht ausführliche Dokumentation, welche treffender weise Cookbook heisst: http://book.cakephp.org/ und zwei brauchbare Tutorials, welche eine schnelle und einfach Einführung bieten: Getting Started

Die Dokumentation wird auch in andere Sprachen übersetzt, jedoch empfehle ich die englische Version, da die Übersetzungen teilweise maschinell und daher nicht sonderlich gut übersetzt sind.

Für Webprojekte mit Datenbanken kann ich CakePHP empfehlen. Design, Content und Daten können einfach getrennt werden. Ein Webdesigner kann am Design rumbasteln ohne dass er gross mit dem Code dahinter in Berührung kommt.

Falls ihr noch nicht von CakePHP überzeugt sind, könnt ihr ja noch ein paar andere Frameworks anschauen. Hier gibt es eine kleine Übersicht: http://www.phpframeworks.com/

Viel Spass beim ausprobieren!

Programmierst du noch oder backst du schon 😉

Hudson – Continiuous Integration

Nachdem wir nun unser “Semester-Projekt Part I” beinahe abgeschlossen haben, habe ich mir “Hudson” nochmals genauer angeschaut und mal ausprobiert. Für Java-Projekte, und insbesondere Web-Projekte (welche mit Java implementiert werden) eigent sich Hudson hervorragend. Hudson wurde selber in Java programmiert und benötigt einen “ServletContainer” (eine Art (Web-)Server, welcher das Java-Webapp ausführt). Ich habe mich für Tomcat entschieden, da wir Tomcat auch für die Entwicklung unseres Projektes verwenden und die Installation von Hudson beinahe null Aufwand mit sich bringt.

Was macht nun dieses “Hudson” genau? Beim Programmieren eines Webprojektes möchte man immer mal wieder testen ob alles funktioniert, ob alte Bugs repariert sind und ob sich evtl. neue Bugs eingeschlichen haben. Vorallem wenn auch Nicht-Programmierer an diesem Prozess beteiligt sind, muss das ganze Projekt auf einem Testserver eingerichtet werden und für die Tester zugänglich sein. Dabei muss bei jeder Änderung das Projekt kompiliert und übertragen werden. Hudson übernimmt nun diesen Teil. Der Quelltext wird von der Versionsverwaltung geholt, kompiliert und alles es keine Fehler gibt eingerichtet. Zusätzlich können Test-Mechanismen wie JUnit oder TestNG eingebunden werden. Entwickler können (falls gewünscht) direkt benachrichtigt werden, falls das Kompilieren fehlschlägt, usw.

Hudson kann auch mit anderen Programmiersprachen als Java umgehen und ist nicht nur auf Webprojekte beschränkt. Die Konfiguration ist sehr flexibel gestaltet und alles ist durch Plugins erweiterbar. Dies führt leider auch zu einer gewissen Komplexität. Für sehr kleine Projekte wird der Aufwand für die Konfiguration wohl beinahe ein bisschen zu gross. Ausserdem muss sich auf dem Server ein Compiler, und alles weitere befinden um das Projekt zu kompilieren und das ist für die Sicherheit des Server nicht unbedingt optimal. Weiter muss man den Beteiligten am Projekt bis zu einem gewissen Grad vertrauen können, denn diese können mit Änderungen am Code relativ viel Unfug anstellen auf dem Server. Meiner Meinung nach fehlt das “Sandboxing” ein wenig. Kann man mit diesen Nachteilen leben, macht Hudson das Leben der Programmierer um einiges leichter und beschleunigt die Arbeitsabläufe.

Viel Spass beim ausprobieren:

Tomcat6, Java, JDBC4, eine MySQL-Datenbank und “Communications link failure”

Damit uns der Einstieg in unser Semester-Projekt nicht so schwer fällt haben wir eine Muster-Anwendung inklusive Anleitung bekommen. Wir benutzen Java und wollen eine Web-Anwendung schreiben. Als Web-Server benutzen wir Tomcat6 und für die Datenbank MySQL.

Soweit so gut. VirtualBox war schon installiert, Ubuntu in ein paar Minuten heruntergeladen und kurze Zeit später lief mein Developpement-System. Tomcat6, JDK, eclipse, MySQL, etc waren schnell installiert und alles lief super. Die Homepage wurde angezeigt… und als ich mich “Registrieren” wollte:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Vollständige Fehlermeldung: http://bin.esheep.ch/2

Mit dem Befehl:

telnet localhost 3306

Konnte ich zum Server verbinden, Die Datenbank war also erreichbar. Ich prüfte die Konfiguration der Datenbank. Der Benutzer war korrekt eingerichtet, die Tabelle vorhanden (alles korrekt und so wie es in der Anleitung stand). Schlussendlich lag der Fehler daran, dass zwar die Datenbank erreichbar ist, jedoch Tomcat die Registrierungs-Anwendung nicht verbinden lies. TCP-Verbindungen sind mit den Default-Einstellungen vebroten.

Mit folgendem Befehl kann das init-Script geöffnet werden:

sudo EDIT /etc/init.d/tomcat6

Da muss anschliessend die Zeile “TOMCAT6_SECURITY=yes” gesucht und durch “TOMCAT6_SECURITY=no” ersetzt werden. Falls vorhanden, muss das Kommentarzeichen vor der Zeile entfernt werden.

Anschliessend Tomcat neu starten:

sudo /etc/init.d/tomcat6 restart

Viel Spass mit Tomcat, Java und MySQL 😉

esheep.ch erhält neuen Server

blog.esheep.ch wird ab sofort auf meinem eigenen Server gehostet.

esheep.ch dient zum experimentieren mit neuer Technologie, insbesondere bei Web-Applikationen und ähnlichem. Lassen wir uns überraschen wie es weiter geht. Konkrete Projekte gibt es zur Zeit keine, allerdings sind einige Ideen vorhanden, welche nun realisierbar werden. Wenn etwas zu Stande kommt, wird hier darüber berichtet.

Als Hardware kommt ein HP Proliant ML110 (G5) zum Einsatz. Das günstigste was HP anbietet, aber mehr als genug Leistung für die bescheidenen Ansprüche eines Blogs und ein paar Test-Pages.

Hardware-Details:

Produkte-Nr: 470064-918
Prozessor: Intel Xeon Dual Core E3110 (3.0GHz), 1x 6MB, Intel 3200 Chipsatz, 1333MHz, maximal 1 CPU
Arbeitsspeicher: 1024MB ECC DDR2 SDRAM, 800MHz, maximal 8GB in 4 Slots
Harddisk: 2x 160GB S-ATA, nur S-ATA 3.5″ NHP, maximal 8 HDDs (SmartArray) + 8 SATA OnBoard, nicht Hot Swap
Laufwerke: DVD ROM
Kontroller: Smart Array E200 mit 128MB BBWC Controller (Raid 0, 1, 1+0, 5)
Netzwerk: Embedded NC105i PCIe Gigabit Ehternet Server Adapter (1x 10/100/1000)
Grafik-Adapter: integrierte Grafik mit 8MB
Anschlüsse: 8x USB 2.0 (2x front, 4x rear, 2x internal), Seriell, 2x PS2, VGA, RJ-45
Netzteil: 1x 365 Watt, Maximum
Betriebssystem: kein OS
Masse: 42.6 x 36.7 x 17.5cm, Tower 4U
Gewicht: 12kg

-> QuickSpecs

HP Proliant ML110 G5
HP Proliant ML110 G5

Eiffel-Übung: Reversi-Spiel

Als letzte Übung müssen wir ein Spiel programmieren in Eiffel. Inklusive einem grafischen Interface.
Ich habe mich für “Reversi” entschieden. Ich werde die Grafik eher einfach halten, aber dafür eine kleine Spieler-Klasse programmieren, welche mit “MiniMax” oder einem einfachen “AlphaBeta-Algorithmus” Züge sucht.
Ich werde den Quelltext hier oder auf Black-Silence veröffentlichen.
Obwohl wahrscheinlich recht wenige etwas mit Eiffel anfangen können 😉

Hier ist erstmal ein Screenshot:

Der Quellcode folgt noch. Es hat noch einige Unschönheiten drin, allerdings hab ich im Moment keine Zeit alles auszubessern. Ausserdem ist das Ganze ja nur eine Übung 😉

Edit: Alle Spiele welche im Rahmen der Vorlesung programmiert wurden werden hier veröffentlicht: http://games.ethz.ch/09