November 30, 2007
Tools für (Web-)Entwickler: Firefox Add-ons
November 18, 2007
Google mag Wordpress
Die Statistik zeigt ein deutliches Ansteigen der Besucher nach Installation von Wordpress Mitte September. Allerdings wird das Ergebnis durch die neuen Blog-Einträge verfälscht.
October 29, 2007
Synchronisation von Verzeichnissen mittels Unison
Eine Lösung des Problems fand sich mit der Anwendung Unison. Das Tool ist für alle Plattformen verfügbar und wird über Profile gesteuert. So kann beispielsweise eine Profil zur Synchronisation mit einem USB-Stick erstellt werden. Unter Linux Systemen legt man diese Profildateien (
*.prf
) im Ordner .unison
im Home-Verzeichnis ab.# synchronization folders
root = /home/micha
root = /media/USB
# Non-conflicting changes will be propagated; conflicts will be skipped
batch = true
# ignored sources
ignore = Path tmp
# needed for sync with FAT disks
perms = 0
Eine Besonderheit bei FAT formatierten USB-Sticks ist die Konfigurationseinstellung
perms=0
, da FAT keine Berechtigungsstrukturen unterstützt.Daneben lassen sich Verzeichnisse auch über SSH synchronisieren.
# synchronization folders
root = /Users/micha/Documents
root = ssh://192.168.1.2//home/micha/
# Non-conflicting changes will be propagated; conflicts will be skipped
batch = true
# ignored sources
ignore = Path tmp
Gestartet wird Unison beispielsweise in der Konsole über
unison profilName
(weitere Informationen in der Manual von Unison).
October 28, 2007
MP3 Server im lokalen Netz
In meinem konkreten Anwendungsfall läuft der Server auf einem Ubuntu Rechner und als Clients laufen Windows und Mac Systeme. Die Installation unter Ubuntu verlief mittels
apt-get
unkompliziert. Eine Anleitung findet sich hier.Allerdings hatte ich einige kleine Schwierigkeiten, nachdem ich die Konfiguration (
/etc/mt-daapd.conf
) angepasst hatte. So sollte der Benutzer, unter dem der Dienst ausgeführt wird auf mt-daapd
gesetzt bleiben. Ich hatte das Problem, dass ich diesen veränderte und somit der Dienst nicht gestartet werden konnte. Der Grund dafür waren wahrscheinlich Rechteprobleme.Soweit so gut. Der Server lief und ich konnte auch auf die Admin-Weboberfläche zugreifen (http://localhost:3689). Allerdings bekam ich keine Musik-Dateien im iTunes auf dem Client angezeigt. Ebenso war hier die Lösung nicht weit. Ein Blick in das Log-File brachte Aufschluss: Der User
mt-daapd
hatte keine Leseberechtigung auf das Verzeichnis, worin sämtliche Musikdateien enthalten sind.Folglich legte ich eine neue Gruppe
mp3
an und fügte diese dem Benutzer mt-daapd und meinem Benutzerkonto hinzu.sudo addgroup mp3
sudo adduser mt-daapd mp3
sudo adduser micha mp3
Nun musste nur noch das Verzeichnis mit der entsprechenden Gruppe ausgestattet werden.
chgrp -R mp3 music/
Nach Neustart des Daemons (
sudo /etc/init.d/mt-daapd restart
) indizierte der Dienst alle Musikdateien erfolgreich.
October 6, 2007
Lokalen iCal Kalender mit Google Calendar synchronisieren
Folglich bestand der Bedarf, Termine zwischen Google und lokalen iCal-Kalender-Dateien zu synchronisieren. Nach langer Suche stieß ich auf den GCALDaemon, der dies leistet. Ich verwende die dateibasierte Synchronisation, so dass ich Termine offline verwalten kann und soweit eine Internetverbindung verfügbar ist, werden die Änderungen an den Google Kalender übertragen - funktioniert hervorragend.
Als Alternative stieß ich auf ein zusätzliches Google Calendar Provider Add-on für Thunderbird, das direkt mit dem Google Kalender synchronisiert. Allerdings muss dazu eine ständige Internetverbindung bestehen. Eine Anleitung, wie das Add-on installiert wird findet sich hier.
Nun ist auch der Weg zur Synchronisation von Terminen mit dem Handy über eine Kabel-, Infrarot- oder Bluetoothverbindung nicht mehr weit, aber dazu später mehr.
October 2, 2007
Website Änderungen
PS: Das Bild im Kopf der Seite ist übrigens von der Mountain-Bike Tour im Rahmen unserer Südamerika-Reise, als wir mit 15 Personen im und 20 Fahrrädern auf dem Bus zum Ausgangspunkt der Downhill "Todesstrecke" fuhren.
August 22, 2007
Verwendung vom Eclipse UML2 Projekt zur Bearbeitung von UML2-Modellen und Profilen
protected static void registerResourceFactories(){
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().
put(UMLResource.FILE_EXTENSION, new UML22UMLResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().
put("ecore", new EcoreResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().
put("ecore2xml", new EcoreResourceFactoryImpl());
}
protected static void registerPathmaps(URI uri) {
URIConverter.URI_MAP.put(URI.createURI(UMLResource.LIBRARIES_PATHMAP),
uri.appendSegment("libraries").appendSegment(""));
URIConverter.URI_MAP.put(URI.createURI(UMLResource.METAMODELS_PATHMAP),
uri.appendSegment("metamodels").appendSegment(""));
URIConverter.URI_MAP.put(URI.createURI(UMLResource.PROFILES_PATHMAP),
uri.appendSegment("profiles").appendSegment(""));
final String UML2_200_NS_URI = "http://www.eclipse.org/uml2/2.0.0/UML";
EPackage.Registry.INSTANCE.put(UML2_200_NS_URI,
EPackage.Registry.INSTANCE.get(UMLPackage.eINSTANCE.getNsURI()));
Ecore2XMLPackage.eINSTANCE.getEClassifiers();
}
private static void registerMapping(URI uri) {
final String ECORE2XML = "platform:/plugin/org.eclipse.uml2.uml/
model/UML2_2_UML.ecore2xml";
URIConverter.URI_MAP.put(URI.createURI(ECORE2XML),
uri.appendSegment("model").appendSegment("UML2_2_UML.ecore2xml"));
}
Mit Hilfe der vorhergehenden Initialisierungen lässt sich ein UML2-Profil (XMI Version 2.x) laden und kann zur Modellierung verwendet werden.
private Profile loadProfile() {
registerResourceFactories();
URI uri = URI.createURI("resources");
registerPathmaps(uri);
registerMapping(uri);
URI profileFile = URI.createFileURI("MyProfile.profile.uml");
Resource r = new ResourceSetImpl().getResource(profileFile, true);
Profile p = (Profile) EcoreUtil.getObjectByType(r.getContents(),
UMLPackage.Literals.PROFILE);
return p;
}
July 31, 2007
JBoss AS und Portal
web.xml
) ein zusätzlicher Paramter übergeben werden, so dass die Bibliotheken des WARs benutzt werden.
<context-param>
<param-name>org.jboss.jbossfaces.WAR_BUNDLES_JSF_IMPL</param-name>
<param-value>true</param-value>
</context-param>
Auf Grund der Änderungen am Web Deployer kann das Portal in Version 2.4.1 nicht mehr verwendet werden, da es nicht korrekt geladen wird. Man erhält die Nachricht, dass die PortalWebApp nicht vom Web Deployer gehandhabt werden kann.
Folglich muss eine aktuelle Version des Portals genutzt werden. Ab Version 2.6 ist das Portal wieder mit dem JBoss AS 4.2.x lauffähig. Allerdings sollte unbedingt 2.6.1 verwendet werden, da das Portal 2.6.0 einige Bugs enthält. Diese wirken sich auf andere Anwendungen, die MyFaces verwenden, negativ aus, so dass diese nicht mehr lauffähig sind.
May 31, 2007
Mehrere Literaturverzeichnisse in LaTeX
Dazu definiert man in LaTeX folgendes in der Präambel:
\usepackage[square,sectionbib]{natbib}
\usepackage{bibtopic}
\bibliographystyle{alphadin}
Innerhalb des
document
Blocks können nun mehrere Quellenverzeichnisse mittels btSect
Block definiert werden.\begin{btSect}{bib/literature}
\section{Literatur}
\btPrintAll
\end{btSect}
\begin{btSect}{bib/specs}
\section{Spezifikationen}
\btPrintCited
\end{btSect}
\begin{btSect}[alpha]{bib/misc}
\section{Sonstiges}
\btPrintAll
\end{btSect}
Nach der Blockdefinition folgt die Angabe der BibTex Datei, die die Quellen eines bestimmten Typen enthalten. Innerhalb des Blocks kann noch die Bezeichnung des Verzeichnisses (
section
} angegeben werden, sowie welche Quellen das Verzeichnis enthalten soll. Mögliche Anweisungen sind:- btPrintAll - alle Quellen
- btPrintCited - nur zitierte Quellen
- btPrintNotCited - nicht zitierte Quellen
April 24, 2007
Switch: Windows - Linux (Ubuntu)
Ausschlaggebend für mich ist eine bessere Kontrolle über das System und die Möglichkeit es einfacher an meine Bedürfnisse anzupassen. Zugegeben das geht mit Windows auch, trotzdem bin ich der Meinung, dass ich mit einem Linux System meine Ziele schneller und effektiver erreichen kann.
Jedoch muss man sagen, dass nicht für jeden PC Nutzer ein Wechsel zu Linux sinnvoll ist. In meinem Fall nutzte ich den PC in allererster Linie als Arbeitsmittel. Also zur Programmierung und Dokumentation. Für Benutzergruppen die den Computer hauptsächlich zur Unterhaltung (Spiele, etc.) nutzen, ist ein Wechsel eher unsinnig.
Soweit so gut. Also begann ich damit alles auf Ubuntu umzustellen. Ubuntu hatte ich bereits als virtuelles Betriebssystem unter Windows laufen und fand mich mit dieser Linux Distribution gut zurecht. Außerdem finde ich die Mischung aus Design, Komfortabilität und Funktionalität dort optimal. Es ist auch ohne Kenntnis der Konsole benutzbar, zugleich hat man die volle Kontrolle mittels der Konsole. Gut das ist bei den meisten Linux Distributionen so ;)
Erfahrungen und Tipps
Ich habe mich für einen sanften Wechsel entschieden, d.h. ich machte eine Partition für das Ubuntu frei und installierte es. Der Vorteil liegt darin, dass man ggf. wieder Windows benutzen kann, falls es gravierende Schwierigkeiten gibt.
Internet und Mail
Darum muss man sich nicht weiter kümmern. Ubuntu bringt gleich Firefox und Evolution mit. Neben eMail senden und empfangen verfügt Evolution auch über einen Kalender und Kontaktverwaltung - es ähnelt Outlook. Jedoch habe ich es noch nicht weiter getestet.
Office
Ubuntu kommt bereits mit OpenOffice. Darin enthalten ist ein Schreibprogramm, Tabellenkalkulation, Präsentation und Datenbank. Alles was man von Microsoft Office kennt.
Messaging
Auch unter Linux kann mit Skype telefoniert werden, da es das Programm auch für Linux Systeme gibt. Um auch fleißig IMs zu schreiben kann das Programm Gaim genutzt werden. Gaim unterstützt verschiedene IM Protokolle (z.B. Yahoo, ICQ, AIM). Anscheinend wurde Gaim mittlerweile in Pidgin umbenannt - unter Ubuntu 7.0.4 heißt es noch Gaim ;).
Entwicklungs IDE
Hier ist für mich Eclipse erste Wahl und ganz einfach über installiert.
sudo apt-get install eclipse
Multimedia (Musik, TV, ..)
Eine große Herausforderung für Ubuntu als Alternative zum Windows, stellt die Verwaltung von Musik dar. Leider gibt es iTunes nicht für Linux. Auch ein Versuch es über wine zu installieren gelang mir nicht. Doch ich habe eine gute Alternative gefunden: Banshee
Seit einiger Zeit besitze ich einen DVB-T USB Stick von Freecom, um gelegentlich auf den PC als TV Ersatz zurückzugreifen, wenn meine Freundin kein Fußball schauen möchte :) Doch mitunter nutze ich es auch als digitalen Videorekorder. Ich muss sagen, dass ich nicht damit gerechnet habe den Stick unter dem neuen Ubuntu zum Laufen zu bekommen. Das es gehen würde da hatte ich keine Bedenken, aber ich dachte dazu ist ein riesiger Aufwand mit Kompilieren etc. notwendig. Glücklicherweise bin ich auf diese Anleitung gestoßen.
Das Vorgehen hat auch soweit wie beschrieben funktioniert, nur das ich bei der Firmware etwas abweichen musste. Die Firmware musste in /lib/firmware/$kernel kopiert werden und ich benötigte neben dvb-usb-wt220u-zl0353-01.fw auch dvb-usb-wt220u-fc03.fw von http://www.chandlerfamily.org.uk/files/firmware/. Danach noch Kaffeine und einige Codecs installiert und ich konnte DVB-T fernsehen.
Wie gesagt unverhofft einfach. Außerdem ist Kaffeine deutlich performanter als die Software, die mit dem DVB-T Stick für Windows mitgeliefert wird. Das Wechseln der Sender geht schneller und auch der Empfang scheint besser zu sein.
Auch IPTV ist möglich. Unter Windows nutzte ich zuletzt Sopcast . Dieses Programm ist auch unter Linux verfügbar. Jedoch benötigte ich gtk-sopcast_0.2.8-1_i386.deb (bei Google zu finden) und nicht die unter Downloads bei Sopcast angebotene Version (in Chinesisch). Dazu noch den mplayer installiert und IPTV funktionierte.
(Zwischen-)Fazit
Bis jetzt bin ich äußerst zufrieden mit Ubuntu. In den nächsten Wochen wird sich zeigen, ob es komplett alltagstauglich ist und werde hier über meine weiteren Erfahrungen berichten ;)
April 13, 2007
Spamschutz für Formulare
Dabei stieß ich diverse Seiten, die sich mit dem Thema Captcha "knacken" befassen. Jedoch wird auf dieser Seite auch beschrieben, was notwendig ist, um es Spambots schwer zu machen. Leider steht dies immer im Konflikt mit der Lesbarkeit. Was nutzt schon ein sicheres Captcha, dass auch der Benutzer nicht entschlüsseln kann?
Schließlich stieß ich auf einen anderen Ansatz. Dabei wird dem Benutzer eine Rechenaufgabe gestellt. Das verbunden mit einem Captcha Bild scheint nun die Spambots zuverlässig zu hindern. Zumindest habe ich seitdem keine Spameinträge mehr.
- Captcha Code, der Spambots kaum hindern kann:
- Zuverlässiger Schutz vor Spambots:
Das Prinzip ist einfach. Die Bots "wissen" nicht, dass die erkannten Zeichen zu einer Rechenaufgabe gehören und schreiben einfach alle Zeichen in das Textfeld, was natürlich zu einem falschen Ergebnis führt. Jedoch muss man sagen, dass dieser Variante auch nicht 100%ig sicher ist, da es nur eine Frage der Zeit ist, bis die Bots auch versuchen den Captcha Code zu berechnen.
Aber auch das lässt sich noch verbessern: Beispielsweise kann für die Angabe der Operation auch eine Zeichenkette, z.B. ADD für +, genutzt werden. Das würde es den Bots nochmals schwerer machen.
Download
Das Skript (calcpic.php) zur Erstellung einer Captcha Rechenaufgabe liegt der aktuellen Version des Captcha Codes bei.
captcha_03.zip
April 3, 2007
Verbesserter Spamschutz über Captcha Code
Deshalb habe ich mich noch einmal hingesetzt und den Captcha Code verbessert, um es den Bots schwerer zu machen, den Code zu erkennen.
Die Veränderungen sind:
- im Hintergrund des Captcha Codes wird ein zufälliges Polygon gezeichnet (kann auch deaktiviert werden)
- alternierende Textfarbe
- zufällige Drehung der Zeichen
Hier noch eine kleine Feature Liste des Captcha Skripts:
- Auswahl welche Zeichentypen zur Generierung einer zufälligen Zeichenfolge benutzt werden sollen (Zahlen, Klein-, Großbuchstaben)
- beliebige Länge an Zeichen
- Abmessungen des Captcha Bildes
- Farben frei definierbar
Das Skript läuft mit PHP4 und GDLib .
March 23, 2007
Trac Eclipse Plugin
Eine kurze Liste der Features von Trac:
- sehr gute Integration von Subversion
- Subversion Changesets (Timeline)
- Repository Inhalt über Webbrowser abrufbar
- Ticketsystem (Bugtracker)
- Wiki
- Milestones
Daraufhin kam bei mir der Wunsch nach einem Eclipse Plugin auf, so dass ich die Tickets auch dort sehen kann. Und ein solches Plugin gibt es auch.
So setzte ich mich sofort hin und wollte das Plugin installieren.
Nach der Anleitung müssen erst zwei Trac-Plugins installiert werden. Das funktioniert auch ohne Probleme. Dann das Eclipse-Plugin per Update Manager installieren. Doch leider (mal wieder) Abhängigkeitsprobleme: Es fehlt org.atl.eclipse.adt.debug. An sich sollte ich dieses Plugin installiert haben, weil die Xtext Komponente von openarchitectureware ATL ebenfalls benötigt. Heruntergeladen habe ich es bereits, anscheinend aber vergessen in den Eclipse Plugin Ordner zu kopieren ;).
Na egal, ATL dort rein und Eclipse neu starten. Und? Mist immer noch nicht. Auch org.eclipse.gmf.runtime.diagram.ui fehlt. Kann dieser Update Manager nicht gleich alle Abhängigkeiten anzeigen?! Dieses Prozedere geht mir jedes mal auf die Nerven und vor allem kostet es Zeit :(
Also auch noch GMT installieren. Eclipse Neustart. Und? Nee, schon wieder fehlendes org.atl.eclipse.adt.debug. Hm, vielleicht ist meine Eclipse Installation kaputt? Einfach mal das Trac Plugin so herunterladen und installieren - ohne Update Manager. Neustart. Und? Läuft ohne Probleme!
Nun noch einen neuen Trac Server anlegen. "Verbindung kann nicht hergestellt werden." Hä, warum das denn nicht?! Nach etwas stöbern in der XmlRpcPlugin Dokumentation kommt heraus, dass das Plugin nur mit dem BASIC-AUTH Authentifizierungsverfahren funktioniert. Ich benutze aber Digest. Das auch noch umstellen:
tracd.py -p8000 --basic-auth=*,C:...users.htbasic,trac C:... rac hesis
Beim Neustart des Daemon erscheint die Meldung, dass das crypt Modul zum entschlüsseln des Passworts nicht gefunden werden kann. Dieses Modul gibt es unter Windows nicht.
Daraufhin habe ich den Versuch Trac über das Eclipse Plugin zu bedienen ersteinmal eingestellt (hat schließlich schon 90 Minuten gekostet) :(
March 14, 2007
Alfresco in JBoss 4.0.5 integrieren
Zwar erscheint Alfresco, man kann es aber nicht benutzen, da die Links JavaScript Fehler produzieren. So etwas zum Beispiel:
Error: document.forms.dashboard['dashboard:act'] has no properties
Grund dafür scheint eine fehlerhafte MyFaces Bibliothek zu sein.
Um Alfresco doch unter JBoss 4.0.5 zum Laufen zu bekommen, muss man unter $JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar/jsf-libs/ die MyFaces Jars (in Version 1.1.4) gegen eine ältere Version (1.1.1) austauschen. Mit dieser Version von MyFaces kann Alfresco auch unter JBoss AS 4.0.5 benutzt werden. Unter 4.0.4 ist ein Austausch nicht notwendig, da dort MyFaces eh in Version 1.1.1 vorliegt.
Soweit so gut. Möchte man Alfresco 2.0 auch noch in einem Portlet unter JBoss Portal 2.4.1 benutzen, wird es komplizierter. Doch es gibt eine Lösung, die hier beschrieben wird.
February 25, 2007
Vortrag: openarchitectureware
Mit dem Generator Framework konnte ich mich während meines Praktikums bei Form4 intensiv aueinandersetzen. Das Ziel des Vortrags war eine praktische Einführung in die Benutzung von openarchitectureware zur modellgetriebenen Softwareentwicklung zu geben.
Die Präsentation, sowie der "live" entwickelte Generator steht auf den Seiten der SIG-MDSE zum herunterladen bereit.
January 28, 2007
Windows LaTeX Editor
Sicher hat OpenOffice den Vorteil eines WYSIWYG Editors, wo man gleich sieht, wie das Geschriebene aussieht. LaTeX mit seiner Syntax ist da schon kryptischer. Bisher habe ich noch keinen vernünftigen Editor für LaTeX unter Windows gefunden, der diesen Nachteil gegenüber Office Programmen ausgleichen konnte.
Jedoch bin ich vor einiger Zeit auf den Editor LEd gestoßen. LEd verfügt über eine integrierte DVI Vorschau. Zwar muss noch kompiliert werden, bevor das Dokument angezeigt wird, aber die paar Sekunden kann ich warten.
January 22, 2007
Web Service mit Java 6
Um eine Klasse als Web Service zu kennzeichnen wird sie mit der Annotation
javax.jws.WebService
und Service Methoden mit javax.jws.WebMethod
markiert. Außerdem muss der Web Service veröffentlicht werden. Hier hilft die Klasse javax.xml.ws.Endpoint
, die eine statische Methode publish(String address, Object implementor)
zur Verfügung stellt.
package webservicetest;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.Endpoint;
@WebService
public class CalculatorService{
@WebMethod
public int duplicate(int value){
return value * 2;
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:8080/Calculator", new CalculatorService());
}
}
Startet man die
main
Methode dieser Klasse, ist der Web Service unter der URL http://localhost:8080/Calculator
so lange verfügbar bis das Programm terminiert. Als Test kann die URL http://localhost:8080/Calculator/rate?WSDL
aufgerufen werden. Im Browser erscheint daraufhin eine Beschreibung des Services im WSDL Format.Mehr Informationen und weitere Möglichkeiten finden sich in der Java 6 API.
January 7, 2007
[FeedCreator] RSS-Feed mit PHP
Diese Frage stellte ich mir vor Kurzem auch. Nach etwas googeln, habe ich relativ schnell eine Antwort gefunden.
Deshalb möchte ich die Implementierung des RSS 2.0 Feeds nicht im Einzelnen beschreiben, sondern das PHP Skript hier zum herunterladen bereitstellen.
Aufbau
RSS verlangt eine bestimmte XML Struktur (siehe RSS 2.0). Die PHP Klasse setzt diese Struktur um.
Benutzung
Als Erstes muss ein neues Objekt mit den grundlegenden Informationen (Titel, URL, Beschreibung, Sprache) erstellt werden.
$feed = new FeedCreator("Feed Titel", "http://link/zum/feed", "Beschreibung des Feeds", "de-de");
Zusätzlich können noch weitere Feedinformationen hinzugefügt werden. Mehr in der API (ethalten im zip Archiv - Ordner doc).
Als nächstes werden dem Feed Artikel (Items) hinzugefügt. Das geht einfach über
$feed->addItem("Artikel Titel", "Text des Artikels", "Link zum vollständigem Artikel");
Die Länge des Textes wird standardmäßig nicht beschränkt. Die maximale Anzahl von Wörtern kann über
$feed->setSize(100);
angepasst werden (bevor sie addItem()
benutzen).Nun muss nur noch der RSS-Feed als XML-Datei ausgegeben werden. Das geht mit Hilfe der Funktion
$feed->getXML();
.Wichtig: Vor dem Aufruf dieser Methode darf noch nichts an den Browser gesendet worden sein. D. h. keine
print
oder echo
Ausgaben vorher.Erweiterungen
Den einzelnen Artikeln können noch mehr Informationen beigefügt werden.
Veröffentlichungsdatum
Nützlich für den Abonnementen für die Sortierung im Feedreader. Das Format richtet sich nach RFC 2822. Nützlich erweist sich die
date("r")
Funktion von PHP.addItem("Titel", "Text", "URL",
"Thu, 21 Dec 2000 16:01:07 +0200");
Autor
Der Autor des Artikels.
addItem("Titel", "Text", "URL", "Thu, 21 Dec 2000 16:01:07 +0200",
"autor@mail.de (Autor Name)");
Kategorie
Um dem Artikel eine Kategorie zuzuordnen, muss ein Hilfsobjekt (
Category
) erstellt werden. Diesem Objekt werden die Kategorien getrennt durch einen / und ein optionaler Namespace angegeben.$categorie = new Category("Technik/PC", "http://meinedomain.de");
addItem("Titel", "Text", "URL", "", "",
$category);
Anhang
Für einen Anhang gibt es auch eine Hilfsklasse (
Enclosure
). Diesem Objekt muss die URL des Anhangs, die Größe in Bytes und der MIME-Typ mitgeteilt werden.$enclosure = new Enclosure("http://image.png", 1536, "image/png");
addItem("Titel", "Text", "URL", "", "", null,
$enclosure);
Download
FeedCreator_0.3.zip
January 5, 2007
Persistenz für Desktop Anwendungen mit JPA und JavaDB
Voraussetzungen
In dieser Beschreibung benutze ich die Eclipse Entwicklungsumgebung und Hibernate als Implementierung der JPA. Es werden folgende Hibernate Komponenten benötigt: Hibernate Core, Hibernate Annotations und Hibernate EntityManager. Außerdem ist ein installiertes Java 6 erforderlich.
Aus den verschiedenen Hibernate Komponenten werden folgende Bibliotheken benötigt, die am besten in den Ordner
lib
kopiert werden.- lib
+ antlr-2.7.6.jar
+ asm-attrs.jar
+ asm.jar
+ c3p0-0.9.0.jar
+ cglib-2.1.3.jar
+ commons-collections-2.1.1.jar
+ commons-logging-1.0.4.jar
+ dom4j-1.6.1.jar
+ ejb3-persistence.jar
+ hibernate-annotations.jar
+ hibernate-entitymanager.jar
+ hibernate3.jar
+ javassist.jar
+ jboss-archive-browsing.jar
+ jta.jar
+ log4j-1.2.11.jar
Diese Bibliotheken müssen im Klassenpfad eingetragen sein. Außerdem ist es notwendig, die derby.jar
($JAVA_HOME/db/lib/
) ebenfalls in den Klassenpfad aufzunehmen.
Konfiguration
Trotz Verwendung von Annotations für das objektrelationale Mapping ist eine Konfiguration mittels XML Datei erforderlich. Für JPA wird dazu im Verzeichnis
etc/META-INF/
die Datei persistence.xml
angelegt. Darin wird angegeben, welche JPA Implementierung genutzt wird. Außerdem werden Persistenz Framework spezifische Einstellungen vorgenommen. Da diese Datei, ebenso wie die Jar-Dateien, im Klassenpfad verfügbar sein muss, wird das etc
Verzeichnis zu den Quellverzeichnissen (Source Folder) hinzugefügt.
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="hibernate">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="hibernate.connection.url" value="jdbc:derby:TestDatabase;create=true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect" />
</properties>
</persistence-unit>
</persistence>
Jeder persistence-unit muss ein provider
zugeordnet werden. Außerdem können weitere Providerspezifische Eigenschaften definiert werden.
Für das Beispiel mit Hibernate müssen Eigenschaften der Verbindung eingetragen werden. So z.B. der verwendete JDBC Treiber (hibernate.connection.driver_class
) und die URL zur Datenbank (hibernate.connection.url
). Die mitgelieferte JavaDB kann über jdbc:derby:$database
erreicht werden. Beispielsweise wird durch die URL jdbc:derby:TestDatabase;create=true
die Datenbank TestDatabase benutzt. Sollte diese nicht existieren, wird sie angelegt. Das Hibernate auch mit der JavaDB arbeiten kann, muss zudem der zu verwendende Dialekt eingestellt werden.
Diese drei Einstellungen sind notwendig, um mit der Hibernate auf JavaDB zu arbeiten. Es können aber noch viel mehr Einstellungen für Hibernate vorgenommen werden (siehe Hibernate Konfiguration).
Verwendung
Nach der Erstellung der Konfiguration können nun Objekte dauerhaft gespeichert und wieder gelesen werden. Dazu müssen die zu persistierenden Beans (bzw. POJOs) mit Annotations versehen werden. Alle Klassen, die persistiert werden sollen, erhalten die Annotation
javax.persistence.Entity
.import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Person {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name = "PERSON_ID")
private long id;
@Column(name="DNAME")
private String name;
private String firstName;
public String getFirstName() {
return this.firtsName;
}
public void setFirstName(final String firstName) {
this.firstName = firstName;
}
public long getId() {
return this.id;
}
public void setId(final long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(final String name) {
this.name = name;
}
}
Daneben ist es notwendig, dass die Bean ein Attribut besitzt, über die das Objekt eindeutig identifiziert werden kann. Im Normalfall ist dieses Attribut vom Typ
long
. Dieser Identifier muss mit einer entsprechenden Annotation markiert werden (javax.persistence.Id
). Weiterhin kann die Generierungsstrategie einer neuen Id festgelegt werden. Dazu wird die Annotation javax.persistence.GeneratedValue
benutzt.Neben der Deklaration der Id kann jeder Spalte der entsprechende Spaltenname in der Datenbank zugeordnet werden. Das geht über
javax.persistence.Colum
. Diese Annotation ist optional. Ist ein Attribut nicht damit versehen, wird einfach der Attributname als Spaltenname benutzt.Dies sind nur ein paar wenige Einstellungen für eine JavaBean. Für weiterführende Informationen kann die API zu Rate gezogen werden.
Objekt speichern
Die zentrale Klasse zum speichern und laden von Objekten ist
javax.persistence.EntityManager
. Eine Instanz kann über javax.persistence.EntityManagerFactory
erstellt werden.final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
final EntityManager em = emf.createEntityManager();
Nachdem der EntityManager
verfügbar ist, wird eine javax.persistence.EntityTransaction
benötigt. Diese Klasse ist zur Steuerung der Transaktionen verantwortlich. Will man ein Objekt in die Datenbank schreiben, braucht es eine offene Transaktion.
final EntityTransaction tx = em.getTransaction();
tx.begin();
Innerhalb dieser Transaktion kann nun ein Objekt persistiert werden.
final Person person = new Person();
person.setName("mrotzek");
person.setFirstName("michael");
em.persist(person);
Letztendlich muss die Transaktion noch geschlossen werden, um Änderungen wirklich in die Datenbank zu schreiben.
tx.commit();
em.close();
emf.close();
Objekt lesen
final EntityManagerFactory emf = Persistence.createEntityManagerFactory("hibernate");
final EntityManager em = emf.createEntityManager();
final EntityTransaction tx = em.getTransaction();
tx.begin();
final List persons = em.createQuery("select p from Person p").getResultList();
System.out.println(persons.size() + " person(s) found");
for (final Object p : persons) {
final Person lPerson = (Person) p;
System.out.println(lPerson .getName()+", "+lPerson .getFirstName()+" : "+lPerson .getId());
}
tx.commit();
em.close();
emf.close();
Referenzen
Java DB
Using Java DB in Desktop Applications
Working with Derby and Hibernate
Java Persistence with Hibernate
The Java Persistence API
Standardizing Java Persistence with the EJB3 Java Persistence API