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).

 

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: