Graphicsmagick 1.1.11 auf Ubuntu 10.04 LTS installieren

17. Mai 2011

Ich musste letzte Woche einen Server mit Ubuntu 10.04 LTS für eine TYPO3-Installation präparieren. Alles kein Problem, dachte ich. Graphicsmagick und die anderen Tools installiert

aptitude install graphicsmagick catdoc xpdf-utils ppthtml unrtf unzip xlhtml

und die Datenbank eingerichtet. Ein bisschen PHP- und Apache2-Konfiguration und das müsste es im Großen und Ganzen gewesen sein. Als ich dann aber im TYPO3-Install Tool die “Image Processing” Tests durchgeführt habe, gab es die böse Überaschung: Knapp 30 Sekunden für den Test “Reading image formats”. Und auch der Aufruf von Seiten, die noch nicht im Cache liegen, dauerte ewig. Die gesamte Site-Performance ließ dadurch zu wünschen übrig und war inakzeptabel. Ein Umstieg auf die unter Ubuntu 10.04 LTS aktuell verfügbare Version von ImageMagick brachte leider auch nicht den gewünschten Verbesserungseffekt. Ich entschied mich dann für die Installation von Graphicsmagick in der Version 1.1.11 (aus Ubuntu Hardy), die ich auch in anderen TYPO3-Installationen erfolgreich verwende. Hier folgt nun eine kurze Anleitung, wie ich das bewerkstelligt habe - mit dieser Vorgehensweise lassen sich ältere (vielleicht auch neuere) Versionen von Software-Paketen installieren.

Downloads:
wget http://ftp.halifax.rwth-aachen.de/ubuntu//pool/universe/g/graphicsmagick/libgraphicsmagick1_1.1.11-1_amd64.deb
wget http://ftp.halifax.rwth-aachen.de/ubuntu//pool/universe/g/graphicsmagick/graphicsmagick_1.1.11-1_amd64.deb

Installation:
dpkg -i libgraphicsmagick1_1.1.11-1_amd64.deb
apt-get install -f
dpkg -i libgraphicsmagick1_1.1.11-1_amd64.deb
dpkg -i graphicsmagick_1.1.11-1_amd64.deb

Lock in apt/aptitude:
echo libgraphicsmagick1 hold | dpkg --set-selections
echo graphicsmagick hold | dpkg --set-selections
aptitude hold libgraphicsmagick1
aptitude hold graphicsmagick

Test:
TYPO3 Backend > Install Tool > Image Processing > 1. Reading image formats
Parsetime with GraphicsMagick 1.3.5: 28221 ms
Parsetime with GraphicsMagick 1.1.11: 372 ms

Further information:
http://packages.ubuntu.com/hardy/graphicsmagick
http://packages.ubuntu.com/hardy/libgraphicsmagick1
http://wiki.ubuntuusers.de/Paketinstallation_DEB#Terminal
http://wiki.ubuntuusers.de/aptitude#Konsole

Starterkurs Fotografie

03. April 2011

Gestern habe ich den “Starterkurs Fotografie” der Werbeagentur rot|grün|blau besucht und möchte kurz meine Eindrücke und Erfahrungen schildern.

Der Kurs begann mit einer kurzen Vorstellung der Kursleiter und der Webeagentur. Auf die Vorstellung der einzelnen Teilnehmer wurde verzichtet und auch die Motivation, an diesem Kurs teilzunehmen und der Kenntnisstand der jeweiligen Teilnehmer blieb leider unberücksichtigt.

Als nächstes wurden im ersten Themenblock einige Basics, wie das Wählrad, AF/MF, die Blende und der Verschluss (Belichtungs-/Verschlusszeit) der Digitalkamera erläutert. Nach den Basics wurden verschiedene gestalterische Möglichkeiten, die man mit Hilfe der Belichtungszeit im Bereich “Bewegung” hat, theoretisch vorgestellt: “Einfrieren” bewegter Objekte, Dynamik in Langzeitbelichtungen, Betonung statischer Objekte durch Bewegungsunschärfe (Beispiel: Dom mit Personen im Vordergrund), fließendes Wasser, verwischen des Hintergrunds durch “mitziehen”. Auch die bedeutung des ISO-Werts wurde kurz besprochen, bevor es zur praktischen Umsetzung an einer Straßenkreuzung ging. Hier ein zwei Beispiele, die dabei entstanden sind:

Zurück in den Räumlichkeiten der Werbeagentur wurden die gemachten Bilder auf (leider etwas Leistungsschwache Laptops) kopiert. Dabei wurde “Adobe® Photoshop® Elements 9″ (für den “normalen” Anwender derzeit ab ca. 70 EUR zu haben) vorgestellt und eine gute Möglichkeit zur Verwaltung von Bildern anhand dieser Software erläutert. Leider wurde damit eine kostenpflichtige Anwendung vorgestellt, obwohl ich der Meinung bin, dass mittlerweile auch kostenlose Alternativen (wie zum Beispiel Picasa 3) existieren, die zumindest den gezeigten Funktionsumfang ebenso beherrschen. Durch die Tatsache, dass alternative Programme nicht wirklich erwähnt wurden, erweckte dieser Teil des Kurses ein wenig den Eindruck einer Werbeveranstaltung.

Der nächste Kursabschnitt war wieder ein Theorieteil, diesmal zum Thema “Blende”: Der unterschied zwischen einer offenen und einer geschlossenen Blende wurde erklärt, die Blendenwerte samt inernationaler Blendenreihe (1, 1.4, 2, 2.8, 4, 5.6, 8, 11, 16, 22, 32) und der Zusammenhang zu den Lichtstärkeangaben auf den Objektiven wurden erläutert und schließlich die Blende als Gestaltungselement anhand von Bildbeispielen diskutiert. Dabei ist natürlich auch der Begriff “Schärfentiefe” gefallen, der den Kursteilnehmern ebenfalls erläutert wurde.

Nun folgte wieder ein praktischer Teil, in dem versucht wurde, die eben erlernte Theorie auszuprobieren und umzusetzen:

Indoor-Aufnahmen

Outdoor-Aufnahmen (Der ISO-Wert wurde nach den Indoor-Aufnahmen versehentlich nicht geändert, obwohl die Lichtverhältnisse es zugelassen hätten.)

Im Anschluss an den praktischen Teil wurden die Ergebnisse unserer Aufnahmen wieder an auf die Laptops kopiert und konnten dort betrachtet und bewertet werden. Die Bildbewertung wurde im Kurs als elementar hervorgehoben, wenn man sich in der Fotografie weiterentwickeln möchte. Durch die Auseinandersetzung mit den Ergebnissen und dem Abgleich zwischen dem Ergebnis und den vorgenommenen Einstellungen - die von der Kamera mit dem Bild als zusätzliche Information mitgespeichert werden - lernt man stets dazu und bekanntlich macht nur Übung den Meister.

Abschließend wurden noch die restlichen Kameramodi besprochen, in Ergänzung zu den bereits verwendeten Halbautomatiken (Blenden- und Zeitautomatik). Dabei wurden auch Modi wie Portait, Landschaft, Sport, etc. “entschlüsselt”, die vor allem bei Kompaktkameras als Verkaufsargument dienen. Aufgrund der fortgeschrittenen Zeit wurde das Thema der Brennweite zuguterletzt zwar besprochen, jedoch nicht in aller Ausfürlichkeit behandelt.

Mein Fazit: Insgesamt ein gelungener Kurs, der sich aber wirklich nur an Teilnehmer mit keinerlei Vorkenntnissen im Bereich Fotografie richtet. Ideal geeignet wäre der Kurs für Personen, die sich am Vortag eine digitale Spiegelreflexkamera gekauft haben oder bisher nur im Vollautomatikmodus geknippst haben. Hat man sich, wie in meinem Fall, bereits mit Brennweite, Blende und Belichtungszeit beschäftigt und bereits mit den Halbautomatikmodi fotografiert, ist der Kurs zum größten Teil Wiederholung. Auch der Kursabschnitt, in dem Adobe® Photoshop® Elements 9 erklärt wurde, hätte meiner Meinung nach nicht in der Ausfürlichkeit geschehen müssen. Ausreichend wäre gewesen, hätte man sich auf das Importieren und Betrachten der Ergebnisse konzentriert und den Funktionsumfang der Softwarte zur Fotoverwaltung nur kurz skizziert. Das beste am Kurs waren für mich somit auch die praktischen Teile, in denen unter Anleitung ausprobiert und theoretisches praktisch umgesetzt werden konnte und die hilfreichen Tipps der Kursleiter. Meinen Bedürfnissen wäre vermutlich der Kurs zur Bildgestaltung eher gerecht geworden.

WebServices mit JBossWS realisieren

14. Dezember 2010

Zur Zeit befasse ich mit mit der Realisierung von WebServices mit JBossWS in einem JBoss AS 4.2.3.GA. Hier möchte ich kurz zusammenfassen, was ich beachtet habe und wie ich bei der Service-Implementierung vorgegangen bin.

JBoss AS und Java6

Betrieben wird ein JBoss AS 4.2.3.GA (und ein 4.2.2.GA; Java 5 compiled binaries) in einer Java 6 Umgebung. Auf die Gründe, wesghalb kein JBoss AS 5.x eingesetzt wird möchte ich nicht näher eingehen und wir nehmen die Umgebung als gegeben hin. In dieser Umgebung gilt es allerdings folgenden Konfigurationshinweis aus der 4.2.3.GA Distribution zu beachten, die analog für Version 4.2.2.GA gilt:

JBossAS 4.2.3.GA can be compiled with both Java5 & Java6. The Java5 compiled binary is our primary/recommended binary distribution. It has undergone rigorous testing and can run under both a Java 5 and a Java 6 runtime. When running under Java 6 you need to manually copy the following libraries from the JBOSS_HOME/client directory to the JBOSS_HOME/lib/endorsed directory, so that the JAX-WS 2.0 apis supported by JBossWS are used:

  • jboss-jaxrpc.jar
  • jboss-jaxws.jar
  • jboss-jaxws-ext.jar
  • jboss-saaj.jar
  • jaxb-api.jar

JAX-WS und JAX-RPC

“JAX-WS” und “JAX-RPC” laufen einem immer wieder über den Weg, sobald man sich mit WebServices in der Java-Welt beschäftigt. Anfangs stellte sich mir die Frage, was sich hinter diesen Begriffen verbirgt und was dabei der Unterschied ist. Ich fand hierzu einen interessanten Artikel von Vamshi Rapolu in dessen Blog und ich verzichte an dieser Stelle näher auf die Beantwortung meiner Frage einzugehen. Weitere Informationen findet der interessierte Leser in diesem Artikel und sicherlich auch über die Suchmaschine seines Vertrauens.

Warum nicht Axis2?

Warum ich mich für JBossWS als WebService Framework entschieden habe und nicht für Apache Axis2 hat folgende Gründe:

Axis2 eignet sich vor allem für den Einsatz in einem Servlet-Container wie z.B. einem Apache Tomcat - ohne den Rattenschwanz eines Applikationsservers wie dem JBoss (Was ist der Unterschied?). Axis2 wird einfach als eigenständige Applikation “deployed” und steht danach als WebService-Container zur Verfügung, in den wiederum die Services “deployed” werden. Für meine Zwecke war dies eher ungeeignet, da sich der WebService zusammen mit anderen Applikationskomponenten in einem *.ear-Archiv veröffentlicht werden soll. Zwar gibt es Wege auch Axis2 als weitere Applikationskomponente in das Archiv zu packen, doch das erschien mir alles irgendwie “zusammengeflickt”. Außerdem bringt der JBoss AS selbst ein WebService-Framework mit: JBoss WS. Und warum soll man nicht auf vorhandenes zurückgreifen? Ein weiterer Vorteil ist, dass WebServices direkt mit EJB3 Stateless Session Beans implemntiert werden können und innerhalb des Services per Dependency Injection auf vorhandene EJBs zugegriffen werden kann. Dies war schließlich ausschlaggebend für die Entwicklung eines JAX-WS WebServices und damit der Verwendung von JbossWS.

Zur weiteren Lektüre gibt es bei predic8.de einen Vergleich von Axis2, CXF und der JAX-WS Referenzimplementierung.

Das Service-Interface

MyService.java

package de.budisantoso.examples.jaxws;

import javax.ejb.Remote;
import javax.jws.WebService;

@Remote
@WebService()
public interface MyService {
    public static final String ENDPOINT_INTERFACE = "de.budisantoso.examples.jaxws";
    public static final String NAMESPACE = "http://jaxws.examples.budisantoso.de/";
    public static final String SERVICE_NAME = "MyService";

    public String echo(String input);
    public void foo();
}

Im Interface habe ich ein paar Konstanten definiert, um sie bequem an zentraler Stelle konfigurieren zu können. Die @Remote-Annotation gibt an, dass es sich um ein EJB-Remote-Interface handelt und die @WebService-Annotation gibt an, dass dieses Interface einen WebService definiert.

Die Stateless Session Bean

MyServiceBean.java

package de.budisantoso.examples.jaxws;

import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@Stateless
@WebService(endpointInterface = MyService.ENDPOINT_INTERFACE, serviceName = MyService.SERVICE_NAME)
@SOAPBinding(style = javax.jws.soap.SOAPBinding.Style.DOCUMENT)
public interface MyServiceBean implements MyService {
    public static final String ENDPOINT_INTERFACE = "de.budisantoso.examples.jaxws";
    public static final String NAMESPACE = "http://jaxws.examples.budisantoso.de/";
    public static final String SERVICE_NAME = "MyService";

    @EJB
    private AnotherBeanRemote anotherBean;

    @Override
    @WebMethod()
    public String echo(String input) {
        return input;
    }

    @Override
    @WebMethod()
    public void foo() {
        anotherBean.bar();
    }
}

Die Implementierung des Interface erhält drei Annotationen:

  • @Stateless - EJB-Annotation, die angibt, dass es sich um eine Stateless Session Bean handelt
  • @WebService(…) - gibt an, dass es sich bei dieser Klasse um eine WebService-Implementierung handelt
  • @SOAPBinding(…) - hierüber wird das Mapping des WebService auf das SOAP Message Protocol definiert

Weitere Infos zu den WebService-Annotationen gibt es im JBoss Community Wiki bzw. direkt in der JSR-181.

Deployment

Das Service-Interface und die Service-Implementierung können zusammen mit weiteren Applikationskomponenten in einer *.ear-Datei gepackt werden. Auf den genauen Build-, Assembly-und Deploy-Prozess und die Projekt- und Archivstruktur möchte ich jedoch nicht weiter eingehen. Hat man schließlich das *.ear-Archiv erstellt, “schiebt” man es in das Deploy-Verzeichnis des JBoss, z.B. [JBOSS_HOME]/server/default/deploy und startet den Applikationsserver. Zugriff auf die automatisch generierte WSDL erhält man dann über die JBossWS-Webapplikation, die beispielsweise (bei Standardinstallation eines JBoss auf dem lokalen Rechner) unter folgender URL erreichbar ist:
http://localhost:8080/jbossws/

Kurz erwähnen und empfehlen möchte ich an dieser Stelle noch das Tool “soap-UI“, mit dem man WebServices schnell und einfach testen kann.

Der Service-Client

Die Implementierung des Service Client kann auf mehrere Wege erfolgen. Zum einen kann der WebService über JAX-WS Direktzugriff angesprochen werde. Daneben gibt es die Möglichkeit, generierte “Stubs” zu verwenden (z.B. über “wsconsume” oder auch über das Axis2-Tool “WSDL2Java”).

Hier ein Beispiel für den direkten Zugriff:

MyServiceClient.java

package de.budisantoso.examples.jaxws;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

public class MyServiceClient {

    private static final String _wsdl = "http://localhost:8080/examples/MyServiceBean?wsdl";

    public static void main(String[] args) {
        try {
            URL wsdlLocation = new URL(_wsdl);
            QName serviceName = new QName(MyService.NAMESPACE, MyService.SERVICE_NAME);

            // Load the service implementation class
            Service remoteService = Service.create(wsdlLocation, serviceName);

            // Load a proxy for our class
            MyService myService = (MyService) remoteService.getPort(MyService.class);

            // Execute a WebMethod
            String echo = myService.echo("Hello WebService-World!");
            System.out.println(echo);

            // Execute another WebMethod
            myService.foo();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Weitere Informationen

Kommentare und Verbesserungsvorschläge zu meinem Artikel sind natürlich sehr willkommen. Und auch falls es Fragen gibt, werde ich versuchen diese zu beantworten - dabei liegt die Betonung auf “versuchen” ;)

Blogs für Nicht-Blogger oder Einstieg in die Blogosphäre

01. Oktober 2010

Ich musste neulich die Frage “Was ist ein Blog?” und “Was macht man damit?” beantworten, als ich erzählt habe, was ich gerade mache. Nun, wie erklärt man das verständlich? Oft geben sich die Fragenden mit der sehr allgemeinen aber nicht umfassenden Antwort “Das ist ein Web-Logbuch, eine Art Online-Tagebuch.” zufrieden. Natürlich konnte ich eine ausfürlichere Antwort geben und am einfachsten erläutert sich das an einem Beispiel.

Als ich anderntags wieder an meinem Projekt gearbeitet habe, stellte ich mir die Frage, wie erläutert man jemandem, der sich noch nicht mit Blogs beschäftigt hat und von heute auf morgen in die “Blogosphäre” eintauchen soll, was man dort macht und wie man es macht. Um darauf gewappnet zu sein habe ich etwas recherchiert, so dass ich neben meinen Ausführungen auch einige Quellen nennen kann, die genau solche Fragen beantworten und eine Einstiegshilfe in die Welt der Blogs und Blogger bieten. Im Folgenden möchte ich zwei dieser Quellen vorstellen.

Mit Weblogs per Du

Auf der Seite Mit Weblogs per Du von Ralph Segert wird dem Einsteiger die Welt der Weblogs Schritt für Schritt näher gebracht. In kleinen Themenhäppchen (insgesamt sind es 13 Kapitel) wird beispielsweise erklärt, wie man ein Blog erkennt, wie man Blogs findet, wie man RSS-Feeds abonniert, wie man Blogtexte schreibt und formatiert und was einen guten Blogartikel ausmacht. Dabei greift der Autor in einzelnen Kapiteln auch immer wieder auf selbst erstellte Videos (besser gesagt auf mit Camtasia erstellte Screen-Captures) zurück, um bestimmte Aspekte zu erläutern. Alles in allem eine sehr übersichtliche und inhaltlich überzeugende Seite.

Wie starte ich ein Blog und mache es bekannt?

Eine weitere Informationsquelle ist die Seite Software Guide, die von Michael Wöhrer betrieben wird. In seinem Artikel beschreibt er, was man beachten sollte, wenn man ein Blog einrichten möchte, wie man in der Blogosphäre auf sich aufmerksam macht, was man beim schreiben beachten sollte und welche Optimierungsmöglichkeiten es für einen Blog gibt. Der Artikel liefert viele Informationen - zwar kompakt aber doch verständlich.

Nun wünsche ich, falls es einen Besucher meines Blogs überhaupt interessiert, viel Spaß beim Besuch der verlinkten Seiten.

ZeQ Blog realisiert

01. Oktober 2010

Für die ZeQ AG durfte ich jüngst die technische Umsetzung eines Blogs übernehmen. Die Herausforderung dabei war die nahtlose Integration in Typo3 und das “Look & Feel” der Firmen-Website der ZeQ AG zu übernehmen, was mir meiner Meinung nach - auch wenn Eigenlob stinkt ;) - ganz ordentlich gelungen ist.

Mein Einstieg in die DSLR-Welt

21. September 2010

Canon EOS 50D

Canon EOS 50D

Vor einiger Zeit habe ich mir eine neue Kamera geleistet, genauer gesagt eine digitale Spiegelreflexkamera (DSLR). Das Kameragehäuse ist das Canon EOS 50D, das ich zusammen mit dem 18-55mm f3.5-5.6 Kit-Objektiv (das mit dem Bildstabilisator) erstand. Für das Kit-Objektiv habe ich mich entschieden, da es mir eine günstige Möglichkeit bietet, mich mit der Kamera vertraut zu machen und erste Gehversuche in der DSLR-Fotografie zu unternehmen.

Canon EF-S 18-55mm f3.5-5.6 IS

Canon EF-S 18-55mm f3.5-5.6 IS

Thematisch interessiert mich zunächst grundsätzlich fast alles, da ich neugierig bin und vieles ausprobieren möchte; also zum Beispiel Portraits, Makros, Landschaft und Architektur sowie technische Spielereien wie die Erstellung von Panoramen und HDR-Bildern. Doch um das alles ausprobieren zu können, benötigte ich zunächst eine Einführung in die Grundlagen der Fotografie, die ich autodidaktisch über den Fotolehrgang im Internet bzw. das entsprechende Buch erhielt. Der Fotolehrgang vermittelt die Grundlagen der Fotografie meiner Meinung nach ziemlich gut und vor allem für Laien wie mich sehr verständlich. Was er jedoch nicht ersetzt und auch ausdrücklich propagiert ist das Üben, Üben, Üben. Die Erfahrungen die man dabei macht und der immer wieder auftretende AHA-Effekt, wenn man etwas selbst ausprobiert hat, sind eine notwendige Ergänzung zur Lektüre des Buchsn (bzw. des Pendants im Internet). Dabei wird man auch hin und wieder mit Erfolgserlebnissen belohnt.

Geholfen hat mir beim Einstieg auch das fototalk-Forum. Die meiner Meinung nach kompetente Kaufberatung und freundliche Aufnahme in die Community möchte ich hier hervorheben. Leider muss ich auch erwähnen, dass sich der Administrator allem Anschein nach nicht mehr um das Forum kümmert: Spam-Beiträge werden beispielsweise nicht unterbunden und die Forensoftware ist auch etwas eingestaubt. Dennoch finde ich, dass mir hier immer weitergeholfen wird, falls ich Fragen zur Fotografie habe.

Das DSLR-Forum soll auch nicht unerwähnt bleiben. Jedoch kann ich hier nichts zur Community sagen, da mich hier hauptsächlich der sehr gute “Biete”-Bereich interessiert hat, der eine tolle Verkaufsplattform für gebrauchtes Fotoequipment darstellt.

Tamron 28-75mm f2.8

Tamron 28-75mm f2.8

Jetzt freue ich mich auf das Tamron AF 28-75mm 2,8, das ich kürzlich gebraucht über das Internet erstanden habe und mir hoffentlich im Laufe der Woche zugeschickt wird. Ein wenig besorgt bin ich zwar, da es immer wieder negative Erfahrungsberichte über Gebrauchtkauf dieses Objektivs im Internet gibt, da ich so nicht die Möglichkeit hatte, mich vom einwandfreien Autofocus (kein Front-/Backfocus) sowie dem tadellosen Zustand der Linsen zu überzeugen. Jedoch lohnte es sich meiner Meinung nach aufgrund des günstigeren Preises dieses Risiko einzugehen.

Nun fehlt mir für’s Erste noch ein gutes, leichtes aber günstiges Stativ, um meine bisherige Ausrüstung vorläufig zu vervollständigen - wobei längerfristig noch das ein oder andere auf meiner Wunschliste steht ;)

Balsamiq Mockups

24. Mai 2010

Balsamiq MockupsIch habe kürzlich eine kostenlose Version der Software Balsamiq Mockups erhalten, gegen das Versprechen, einen Artikel über dieses Werkzeug zu schreiben, nachdem ich es evaluiert habe. Leider bin ich seither nicht mehr dazu gekommen, an dem ein oder anderen Projekt weiterzuarbeiten, bei dem ich Mockups benötige und so lässt auch mein Artikel auf sich warten. Dennoch möchte ich kurz beschreiben, was mich dazu bewogen hat, Balsamiq Mockups auszuprobieren und damit zu arbeiten.

Beim Start eines neuen Projekts, sei es eine Website oder eine zu programmierende (Web-) Applikation interessiert den Kunden meist an erster Stelle zunächst das Aussehen bzw. das Layout der Benutzeroberfläche. Auch werden Anforderungen an Funktionalität durch den Kunden häufig über GUI-Elemente kommuniziert, da diese das einzig “greifbare” an Software sind. Überaus große Bedeutung misst der Kundem dem Layout vor allem (und verständlicherweise) im Bereich der Website-Erstellung zu. Mittels Mockups lässt sich ein Prototyp einer grafischen Oberfläche skizzieren, die wie Papierskizzen die Anforderungsbeschreibung ergänzen. Hier besticht Balsamiq mit seinem Produkt durch das Skizzenhafte aussehen der Mockups - wie man an den Beispiel-Mockups sehen kann. Weitere Merkmale der Software sind zum einen die einfache Bedienung, mit der man zu schnellen Ergebnissen kommt und ein Preis, der meiner Meinung nach angemessen scheint.

Leider habe ich keine Erfahrung mit anderen Mockup-Produkten, so dass ich hier keine Vergleiche anstellen und auf besondere Stärken oder Schwächen hinweisen kann. Sobald ich Balsmiq Mockups wieder eingesetzt habe, werde ich jedoch an dieser Stelle über meine persönlichen Erfahrungen bei der Arbeit mit Mockups berichten und auch ein oder zwei selbst erstellte Mockups präsentieren =)

BBQ Smoker

22. Mai 2010

Ich freue mich auf die Grillsaison :-)

Smokin Pro - BBQ Grill & Smoker

Smokin Pro - BBQ Grill & Smoker

The Char-Griller® Smokin Pro BBQ Smoker meets the high demands of the Texas-style BBQ smoker.

Spring3 + Hibernate + Jasypt

20. Mai 2010

Ich habe ein neues Java-Projekt, indem ich Hibernate zum ersten mal mit Spring und Jasypt einsetze. Spring und Hibernate dürften eher bekanntere Begriffe aus der Javawelt sein, so dass ich nur kurz erwähnen möchte, was Jasypt ist.

Jasypt steht für Java simplified encryption und bietet dem Entwickler bei kombiniertem Einsatz mit Hibernate eine für die Businesslogik transparente Verschlüsselung von zu persitierenden Daten.

Ich habe versucht, der Anleitung zum Einsatz von Jasypt mit Hibernate 3 zu folgen, erhiel aber immer wieder die folgende EncryptionInitializationException:

Exception in thread "main" org.jasypt.exceptions.EncryptionInitializationException: No string encryptor registered for hibernate with name "strongHibernateStringEncryptor"
at org.jasypt.hibernate.type.AbstractEncryptedAsStringType.checkInitialization(AbstractEncryptedAsStringType.java:250)
at ...

Nachdem ich mehrere Stunden verzweifelt nach der Ursache und meinem Fehler gesucht habe - mittels Google und Try’n'Error - bin ich auf einen Beitrag gestoßen, der mich schließlich auf die Lösung gebracht hat.

Nach einer kleinen aber wirkungsvolle Änderung in meiner Spring-Konfigurationsdatei applicationContext.xml (rot markiert) war der Fehler behoben …

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
 xmlns:tx=”http://www.springframework.org/schema/tx
 xsi:schemaLocation=”
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
  http://www.springframework.org/schema/tx
  http://www.springframework.org/schema/tx/spring-tx-2.0.xsd“>
  <bean id=”strongEncryptor”
class=”org.jasypt.encryption.pbe.StandardPBEStringEncryptor”>
    <property name=”algorithm”>
      <value>PBEWithMD5AndDES</value>
    </property>
    <property name=”password”>
      <value>xJxAxSxYxPxTx</value>
    </property>
  </bean>
  <bean id=”hibernateStringEncryptor”
  class=”org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor”>
    <property name=”registeredName”>
      <value>strongHibernateStringEncryptor</value>
    </property>
    <property name=”encryptor”>
      <ref bean=”strongEncryptor” />
    </property>
  </bean>
  <bean id=”datasource” class=”com.mchange.v2.c3p0.ComboPooledDataSource”
  destroy-method=”close”>
    <property name=”driverClass” value=”com.mysql.jdbc.Driver” />
    <property name=”jdbcUrl” value=”jdbc:mysql://localhost:3306/mydatabase” />
    <property name=”user” value=”myusername” />
    <property name=”password” value=”mysecretpassword” />
    <property name=”minPoolSize” value=”2″ />
    <property name=”maxPoolSize” value=”4″ />
  </bean>
  <bean id=”hibernateSessionFactory”
    class=”org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean”
    depends-on=”hibernateStringEncryptor”>
    <property name=”dataSource” ref=”datasource” />
    <property name=”configLocation” value=”classpath:hibernate.cfg.xml” />
  </bean>
  <bean id=”myService”
  class=”tld.domain.service.MyServiceImpl”>
    <property name=”myBusinessObjectDao” ref=”businessObjectDao” />
  </bean>  <bean id=”businessObjectDao”
  class=”tld.domain.persistence.BusinessObjectDaoImpl”>
    <constructor-arg ref=”hibernateSessionFactory” />
  </bean>
  <!– Transaction handling –>
  <tx:annotation-driven transaction-manager=”txManager” />
    <bean id=”txManager”
  class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
    <property name=”sessionFactory” ref=”hibernateSessionFactory” />
  </bean>
</beans>

JAX2010 - Workshop und Konferenztag I

06. Mai 2010

Montag morgen. Ich bin nach über einer Stunde Stau mit einer kleinen Verspätung in Mainz angekommen. Leider keine Zeit mehr für eine Tasse Kaffee, der Workshop hat bereits begonnen. Also setze ich mich in eine der hinteren Reihen und merke, dass ich nicht allzuviel verpasst hatte.

Um was ging es im Workshop? Ich besuchte den Power Workshop “Einführung in das Spring Framework 3.0″. Eberhard Wolff, Referent des Workshops und Autor des Buchs Spring 3: Framework für die Java-Entwicklung, gab zunächst eine Einführung in die Konzepte von Spring 3 und zeigte den Teilnehmern eindrucksvoll die Anwendung dieser Konzepte in Life-Demonstrationen. Der interessanteste Teil war für mich die Einführung in die apektorientierte Programmierung (AOP) mit dem Spring Framework. Auch die Vorstellung von SpringRoo war beeindruckend. Aber irgendwo hab ich das schonmal gesehen: Codegenerierung und Scaffolding :-)

Zusammenfassend kann ich sagen, dass mir der Workshop einen guten Einblick und Einstieg in die Welt von Spring gegeben hat. Die Fragen, die ich mir stelle und die ich noch nicht beantwortet habe und auch noch nicht beantworten kann ist folgende: Sind EJB3 und Spring gegensätzliche Technologien? Welche Vorteile bietet mir die eine Technologie gegenüber der anderen? Wann ist es Sinnvoll einen ebedded Container zu verwenden und wann macht es Sinn auf JEE zurückzugreifen? Wie gesagt, für den Einstieg war der Workshop eine gelungene Veranstaltung, die in mir auf jeden Fall das Interesse an Spring geweckt hat.

Am nächsten Tag begann die eigentliche JAX2010 Konferenz mit diversen Vorträgen. In der ersten Keynote sprach Mike Piech (Oracle) über Java, die Community, die Technologien, über bisherige und zukünftige Entwicklungen in dem Javauniversum und gab einen Ausblick in welche Richtung die Wege der Kombination aus Sun und Oracle führen.

Im Anschluss daran ging es zum nächsten Vortrag: “Die richtige Architektur bei AJAX-Anwendungen” von Alois Reitbauer (dynaTrace Software). Der Vortrag war irgendwie nicht das, was ich bei dem Titel erwartet hatte, dennoch gab der Vortrag interessante Impulse. Gezeigt wurde vor allem, was man generell beachten sollte, um (subjektiv) performante AJAX-Applikationen zu erstellen.

Der nächste Vortrag den ich besuchte wurde gehalten von Jason van Zyl (Sonatype) mit dem Thema “Developing for the Enterprise with Maven, M2Eclipse, Nexus und Hudson. Dieser Vortrag bestätigte mich im Einsatz dieser bzw. ähnlicher Technologien (Eclipse IAM statt M2Eclipse, Artifactory statt Nexus). Es wurden die Tools im Einzelnen vorgestellt und darüberhinaus vermittelt, wie diese zusammenarbeiten und ineinandergreifend den Softwareentwicklungsprozess unterstützen. Außerdem sprach Jason van Zyl in seinem Vortrag über die derzeitigen und zukünftigen Entwicklungen dieser Technologien, insbesondere über Maven 3.

Nach dem Mittagessen gab es die nächste Keynote. Die “Vorstellung”, die die beiden Herren von der Accenture GmbH auf der Bühne präsentierten, war irgendwie nicht das Gelbe vom Ei. Neben der Selbstpräsentation und einem Video (Did you Know? 3.0) war die Message des Vortrags “From Art to Engineering - Designing technical Architectures for industrialized Software Development” nichts neues. Die Kommentare und Kritiken, die es im Anschluss an die Keynote über Twitter hagelte, war gelinde gesagt nicht die nettesten. :-)

Der nächste Vortrag behandelte das Thema Refactoring. Manuel Bork (Yatta Solutions GmbH) präsentierte in “Text to Model to Text” eine in Eclipse integrierte Modeling IDE (UML Lab), mit der aus bestehendem Quelltext ein Modell generiert werden und aus diesem Modell wieder exakt der selbe Code generiert werden kann. Dadurch erhält der Entwickler ein Werkzeug, mit dem er ein bestehendes Programm über Manipulation des generieten Modells verändern kann. Änderungen am Modell spiegeln sich im Code wieder und auch Änderungen am Code werden direkt in das Modell übernommen. Ein weiterer Schritt in Richtung MDD.

Der letzte Vortrag “Continuous Deployment and agile Testing”, den ich mir auf der JAX2010 angehört habe, wurde von Alexander Grosse (Nokia) gehalten. “Continuous Deployment” ermöglicht Entwicklern Software jederzeit auszuliefern. Alexander Grosse sprach in seinem Vortrag über seine Erfahrungen dieses Konzept in seinem Bereich einzuführen und stellte uns Best Practices in dieser Domäne vor.

Nach dem Abendessen endete der Konferenztag für mich. Die Abendveranstaltung habe ich nicht mehr miterlebt, da ich mich dafür entschieden hatte, nicht zu spät nach Hause zu fahren. Insgesamt kann ich sagen, dass es sich für mich gelohnt hat, die Konferenz zu besuchen, da ich allein an dem einen Tag viele Eindrücke und Impulse sammeln konnte. Falls es klappt, würde ich auch nächstes Jahr wieder die JAX besuchen.