Archiv der Kategorie Empfehlungen

HTML5 & Forms

Als Ergänzung zu meinem XForms-Vortrag in der FH, hier ein paar nette Details zu den Neuerungen von HTML5/Forms. Jaja, was für eine Überaschung. Okay, nach dem Tod von XHTML2 (und demnach die Integration von XForms in XHTML) auch wieder nicht…

Ganz allgemein scheint Dive Into HTML5 aber auch empfehlenswert zu sein, wenn auch noch in Arbeit. Nett gemacht.

Ersatz für Thawte (personal e-mail certificates)

Kleine Randnotiz und Hinweis für diejenigen, die auch eine Alternative für Thawte suchen – zur Erinnerung: Die kostenlosen E-Mail-Zertifikate bzw. der Dienst dafür läuft in wenigen Tagen ab.

Eine Alternative ist TrustCenter mit seinem Angebot TC Internet ID. Auch dies ist ein E-Mail-Adressen basiertes und kostenloses Zertifikat – und dieses PKI-Zertifikat ist auch beim “Rest” installiert und bekannt.

Best practices in papayaCMS 5 – oder: Sinnvolle Aufteilung der Modulklassen.

Vor wenigen Tagen wurde papayaCMS 5.0 veröffentlicht. Da eventuell der ein oder andere mit dem System nun herumexperimentiert, wird man als Entwickler auch schnell Module entwickeln wollen. Vor allem bei größeren Modulen (bestehend aus vielen Ausgabe-Klassen) empfiehlt sich eine weit granulärere Aufteilung als zwingend vorgeschrieben ist.

Ich erspare mir die Erklärung der Basispapayasystems, dafür möge man bitte die entsprechenden Dokumentionen (PDF) konsultieren. Nur so viel sei gesagt: Um die Daten von der Datenbank auf den Bildschirm zu bekommen, braucht man grundsätzlich nur eine Ausgabeklasse (Seite, Box, usw.) und ein entsprechendes XSL-Template. Aber, aber..

Ineffiziente Strukturierung der Klassen

Ineffiziente Strukturierung der Klassen

Prinzipiell gilt: MVC-Kenner werden einen sehr leichten Einstieg haben, die anderen sollten bei Fragen zunächst diese Thematik verinnerlichen.

Damit eine Klasse Zugriff auf die Datenbank hat, muss es von base_db (sys_base_db.php) abgeleitet werden. Vor allem bei kleinen Seitenmodulen passiert es häufig, dass der Entwickler die Kurzversion nimmt: Generalisierung der Datenbankklasse, 1-2 Queries und XML-Ausgabe. Spätestens, wenn man die gleiche Funktionalität – etwa “last blog post titles” – nicht nur als Seiten- sondern auch als Boxmodul benötigt, entsteht doppelte Code. Doppelter und redundanter Code. Schlecht. Ein guter Ansatz, um die Zuständigkeiten zu prüfen und zu ermitteln, ob Operationen sich nicht generalisieren und delegieren lassen können. Und ja, wir kommen dem Ziel MVC damit praktisch sehr nahe.

Alleine aus diesem praktische Grunde (und selbstverständlich ist die Verwendung von Delegation grundsätzlich in Modulsystem zu befürworten) empfiehlt sich der Einsatz einer Datenbasisklasse. Diese Klasse erweitert die o.g. Datenbankklasse, die Ausgabemodule instanziieren nur noch diese Basisklasse. Und für unsere Freunde der notorischen Delegationsverweigerer: Mit “Seitenklasse erweitert Datenbankklasse” kommt ihr nicht weiter… und das gilt selbstverständlich auch für alle anderen Arten von Modulen. Tatsächlich ist hier Delegation unbedingt notwendig.

Ein weiterer Vorteil ist die bessere Wartbarkeit und Übersichtlichkeit (vgl. MVC). Selbstständlich werden auch schreibene Operationen in dieser Klasse implementiert. Der Einsatz von Interfaces oder mehrerer Datenbasisklassen steht jedem frei. Man sollte aber nicht mit Kanonen auf Spatzen schießen, ein komplexes System wird durch mehr Komplexität nicht wirklich einfacher.

Beispiel mit Kompetenzen: Delegation

Beispiel mit Kompetenzen: Delegation

Die weitere Aufgabe des Ausgabemoduls (vgl. Controller) ist natürlich auch die Ausgabe.. ja, kein Witz ;) Auch hier gibt es eine ähnliche Konstellation wie bei den Datenbankabfragen, aber in der umgekehrten Sicht: Es gibt in größeren System häufig gleiche oder ähnliche Ausgaben. Auch hier kann die Faulheit einen schnell dazu verleiten, den XML-Code im Controller selbst zu schreiben – ist ja praktisch. Aber auch hier gilt: Spätestens wenn man selber [beim Refactoring] anfängt, und klasseninterne Helpermethoden zur Sub-XML-Generierung zu bauen oder gleichen XML-Code an mehr als 1-2 Stellen verwendet.. richtig: Delegation! Hier empfiehlt sich der Einsatz einer Ausgabebasisklasse. Jene Klasse hat im Wesentlichen nur eine Aufgabe: Für einen oder mehrere Parameter (idR eine Datenarraystruktur) ein geschäftsklassenabhängiges XML zu bauen. Es gibt weder eine Verbindung zur Datenbank noch zu anderen Ausgabemodulen.

Ebenfalls für diese Klassen gilt: Eine weitere strukturelle Aufteilung der Ausgabebasisklassen kann, muss aber nicht vorteilhaft sein.

Selbstverständlich lassen sich beide Klasse auch in Nicht-Ausgabemodulen verwenden, etwa einem Connectormodul. Das ist vor allem für Module interessant, die bestimmte Daten und/oder XML (aus welchen Gründen auch immer) weitergeben müssen.

Tipp 1: Vor allem bei mehreren Seiten- oder Boxmodulen kann es durchaus sinnvoll sein, eine gemeinsame Oberklasse (base_myplugin_content) zu erstellen. Hier lassen sich auch direkt die notwendigen Basisklassen korrekt instanziieren.

Komplexes Beispiel mit Oberklassen für Module

Komplexes Beispiel mit Oberklassen für Module

Tipp 2: Die Verwendung des Singleton-Pattern steht einem frei: In der Regel hat es aber wenig Sinn, die Datenbasisklasse mehrfach zu erstellen (kann vorkommen, wenn Boxen in Seiten des gleichen Modules auftauchen). Daher: getInstance().

In der Zusammenfassung:

  • Trennung der Zuständigkeiten und Verwendung von Delegation, aber: Generalisierung geht auch
  • Verwendung von Datenbasisklassen, bspw. base_myplugin_data extends base_db
  • Verwendung von Ausgabebasisklassen, bspw. base_myplugin_output extends base_object
  • delegierte Verwendung der o.g. Klassen in Seiten- und Boxmodulen

Java-Anwendungen mit Exe-Wrapper

Bereits vor einigen Wochen hatte ich hier und dort beschrieben, wie man mit Eclipse/Ant seine Anwendung per Knopfdruck automatisiert deployen kann. Da es unter manchen Windows-Systemen zu Schwierigkeiten kommt, eine Jar-Datei zu starten (bspw. nicht verknüpft mit dem Jar-Launcher) empfiehlt es sich natürlich, für jene einen kleinen Exe-Wrapper zur Verfügung zu stellen. Launch4j bietet neben dieser Funktionalität auch diverse andere Tweaks: Splashscreen, Java-Download-Hinweis, JVM-Arguments und vieles mehr. Dabei gibt es Launch4j in zwei Modi: Im Gui-Modus lassen sich alle Einstellungen konfigurieren (und testen) und anschließend speichern, im Befehls-Modus wird eben eine solche Konfigurationsdatei erwartet.

Launch4j arbeitet selber mit Ant, daher ist die Integration in bestehende Build-Tasks sehr einfach. Wahlweise konfiguriert man die Optionen direkt im Hauptbuildscript oder verwendet ein eigenes Script, welches man durch die Gui erhält.

In dem eigenen Buildscript definiert man den Task etwa mit:

<taskdef name="launch4j"
    classname="net.sf.launch4j.ant.Launch4jTask"
    classpath="${launch4j.dir}/launch4j.jar :${launch4j.dir}/lib/xstream.jar" />

wobei launch4j.dir auf das gesamte Verzeichnis zeigt (Hinweis.. es werden mindestens bin, lib und conf benötigt).

Anschließend kann mit einem beherzten <launch4j configFile=”build_data/launch4j.xml” /> bereits der Prozess gestartet werden.

Beispielhafter Inhalt der build_data/launch4j.xml:

	<launch4jconfig>
		<dontwrapjar>false</dontwrapjar>
		<headertype>gui</headertype>
		<jar>../deploy/Application.jar</jar>
		<outfile>../deploy/Application.exe</outfile>
		<errtitle>Please download Java 6.</errtitle>
		<cmdline />
		<chdir />
		<priority>normal</priority>
		<downloadurl>http://java.com/download</downloadurl>
		<supporturl />
		<customprocname>false</customprocname>
		<stayalive>false</stayalive>
		<manifest />
		<icon>Application_32x32.ico</icon>
		<jre>
			<path />
			<minversion>1.6.0</minversion>
			<maxversion />
			<jdkpreference>preferJre</jdkpreference>
		</jre>
	</launch4jconfig>

Nullpointer-Exceptions verhindern

DZone.com sei Dank: Gestern ‘mal wieder einen lesenswerten Artikel gefunden. Diesmal: How to Avoid NullPointerExceptions (NPE)?. Vor allem der letzte Absatz Common Practices ist zu empfehlen.

Tags: , ,

Mac OS X Spotlight-Index neu aufbauen

Um den Index neu aufzubauen (beispielsweise aus Gründen der Performance, wenn er kaputt ist, nach einem Plattenwechsel) kann man sich Tools wie Onxy bedienen, die das auf Knopfdruck erledigen. Leider hat das bei mir nicht ganz geklappt, evtl. lag das daran, dass das Volume sich selber auf der Exclusionliste hatte (das hatte ich gemacht, damit ein Fremdsystem nicht den Index kaputt macht, die Idee ist nach hinten losgegangen ;) ).

Wie dem auch sei, wenn man so in Google danach sucht, wird einem überall der Befehl sudo mdutil -E / vorgeschlagen. Tatsächlich löscht und deaktiviert dieser Befehl den Index aber nur.. warum schreibt das keiner dahin?

Mac:/ knalli$ sudo mdutil -E /

/:
Indexing and searching disabled.

Etwas schwieriger war es, herauszufinden, wie man den Index wieder aktiviert. Aber, geht natürlich auch, nur anderer Parameter: sudo mdutil -i on /

Mac:/ knalli$ sudo mdutil -i on /

/:
Indexing enabled.

Die alternativen Möglichkeiten haben mir nichts gebracht, es war wirkungslos:

  • Volume in Ausnahmeliste aufnehmen und wieder entfernen (Apple-Lösung)
  • Onxy-Spotlight-Index-Reset (Reset ja, Neuaufbau nein).

Tags: ,

Teamtools für die Diplomarbeit

Die Diplomarbeit kommt in großen Schritten.. oder sie ist ja eigentlich schon halb da, schließlich hat die Recherche bereits begonnen.

Im folgenden eine Auflistung von einigen interessanten Tools, die man sicherlich teilweise schon kennt und auch für andere Projekte nutzen kann.

del.icio.us

Der Online-Social-Bookmarkdienst del.icio.us dient als Linkliste; durch die Verwendung von Tags (Schlüsselwörtern), Bundles (zur Gruppierung) und der Möglichkeit, diese Links auch mit anderen del.icio.us-Accounts zu sharen, ergibt sich eine sinnvolle Recherchebasis. Diesen Service kann man sowohl vor der Arbeit, während der Arbeit (Implementierung) als auch beim anschließenden Schreiben verwenden.

Dropbox

Dropbox ist ein einfacher Dienst, der ganze Verzeichnisse mit einem Server synchronisiert. Interessant auch deswegen, weil Verzeichnisse mit anderen Dropboxnutzern gemeinsam (shared) verwendet werden können. Da die Synchronisation quasi in Echtzeit (innerhalb von 5-10 Sekunden) geschieht, ist dies der ideale Weg für kleine Dokumente oder Fragmente, die nicht in ein SVN kommen.

drop.io

Im Gegensatz zu Dropbox ist drop.io für on-demand Austauschereignisse konzipiert. Man kann sich zwar auch einen festen Account und eine feste “Drop” holen, dies ist aber nicht notwendig. Eine Drop ist eine schnelle Alternative zu einem FTP-Client, durch eine geeignete Verfallszeit werden die Daten auch wieder zeitnah gelöscht.

LaTeX

Grob und kurz zusammengefasst: Mittels LaTeX kann man das gesamte (Text-)Dokument komplett selber steuern, wo was in welcher Art und Weise gelayoutet, platziert und dargestellt wird. Bei der größe des zu erwartenden Dokuments und der Tatsache, welche formalen Aspekte eingehalten werden müssen, ist die Verwendung von LaTeX durchaus empfehlenswert. Da LaTeX ähnlich Programmcode vollständig in Textdateien geschrieben wird, ist SVN eine sinnvolle Ergänzung in der Teamarbeit.

Subversion

Das Versionierungstool Subversion dient zur Nachvollziehbarkeit von unterschiedlichen Versionen sowie dem Zusammenarbeiten von Programmcode. Wir verwenden es für die eigentliche Anwendung (Java), als auch für die Dokumentation bzw. Abschlussarbeit (LaTeX).

Trac

In perfekter Zusammenarbeit mit Subversion bietet das Managementtool trac die Möglichkeit, die bisherigen Changesets sowie den eigentlichen Code zu durchsuchen. Außerdem beinhaltet das integrierte Wiki die Möglichkeit, flexibel und schnell Informationen aufzubereiten. Als weitere Features sind Meilensteine und Tickets nutzbar, wennauch nur bei größeren Teams sinnvoll einzusetzen.

Tags: , , ,

Rufnummernmissbrauch 06985006800

Du wirst auch öfters von dieser Nummer angerufen? Keiner geht ran, oder verspricht Gewinnspiele und das übliche Blabla? Alles Humburg. Kurze Suche nach der Nummer bei Onkel Google fördert schnell was zu Tage. Wir sind also nicht alleine.

Abhilfe schaffen hier nur zwei Dinge (und zwar unmittelbar sofort): Provider kontaktieren und Nummer sperren lassen – oder aber selber sperren, sofern die eigene Telefonanlage das zulässt. Unser neuer Router von NetCologne ist eine FritzBox und besitzt eine Option für das Sperren von Nummern. Eingetragen, und schon ist Ruhe. Naja, zumindestens von dieser Nummer.

Tags: , ,

Wie man in MacOS X in der Finder-Sidebar resettet.

Ich hatte das Problem, dass jeder Öffnen und Speichern-Dialog neuerdings mehrere Sekunden brauchte, bis man etwas “machen” konnte. Zudem war die Liste der “Orte” (englisch: Places) überfüllt mit Hunderten Einträgen. Meine definierte Liste war etwa 15-20 Items lang, aber diese Liste wurde ein paar Mal wiederholt – strange.

Löscht man die Datei ~/Library/Preferences/com.apple.sidebarlists.plist, loggt sich aus und wieder neu ein, so ist die Sidebar wieder aufgeräumt. Man muss allerdings die Places wieder neu einstellen und ggf. Tweaks wie das Ausblenden der iDisk reaktivieren.

Tags: , ,

Youtubevideos direkt runterladen – ohne Plugin, als MP4.

Super Sache: Weil YouTube ja Videos seit einiger Zeit – vor allem für das iPhone/AppleTV – in hochauflösenden MP4s speichert, kann man sich auch viele Videos in diesem Format runterladen.

Dazu reicht es, im Browser ein kleines Javascript-Bookmark abzulegen. Sieht man sich ein Video an, braucht man nur auf den Link zu klicken, und schon kriegt man das Video als Download. Wofür noch umständliche Plugins und Konverter (vom Flash)?

Tags: , ,