22.11.2011

Zusammenarbeit zwischen Mitarbeitern und Führungskräften - Probanden gesucht

Für eine Studie im Rahmen eines Psychologiestudiums der Uni Bonn werden noch Probanden gesucht, die bereit sind einen Fragebogen auszufüllen.

Das Thema der Studie ist die Zusammenarbeit zwischen Führungskräften und Mitarbeitern. Dafür werden Mitarbeiter mit Hochschulabschluss (mindestens Bachelor) gesucht, die bereits seit einem halben Jahr arbeiten, aber noch nicht länger als fünf Jahre. Sowohl der Mitarbeiter, als auch der Vorgesetzte füllen unabhängig und anonym einen Fragebogen aus und beschreiben darin die Zusammenarbeit im Rahmen des Mitarbeiterverhältnisses.

Sollte sich also eine Führungskraft oder ein Mitarbeiter angesprochen fühlen, wäre es nett, wenn derjenige Lisa unter l.fahrendholz@uni-bonn.de für die weitere Vorgehensweise kontaktieren könnte.

Alle Daten werden natürlich vertraulich und vollkommen anonym behandelt.

20.11.2011

Pasta mit Ofentomatensauce

Über Umwege erreichte mich die Beschwerde, dass die Gerichte doch arg fleischlastig sind. Daher, liebe Daniela, nur für dich, komplett fleischlos! Wobei ich allerdings sagen muss, dass es durchaus Einträge ohne Fleisch (dafür mit Fisch) gibt:

Also, ganz so schlimm, dann doch nicht! Aber trotzdem hier nun ein komplett fleischloses Gericht.

Die Idee für die gegrillten Ofentomaten stammt aus einem Facebook Eintrag von der Beef. Als Abo Inhaber, bin ich natürlich auch Fan der Beef und konnte daher die Ergüsse der Eat'n Style verfolgen. Dort wurde ich auf die "ultimative Tomatensoße" aufmerksam und habe mich direkt an die Recherche begeben. Tim Mälzer hat in einer Sendung eine recht einfache, aber gar nicht so schlechte Tomatespße für Pasta vorgestellt. Gefunden habe das Rezept inkl. Video der Zubereitung auf seiner Seite:

Tim Mälzer - Ofentomatensauce

Dieses Rezept sollte mir also als Grundlage dienen. Daher wurden ersteinmal Tomaten gekauft und gewaschen. Bedingt durch die Jahreszeit sind die Tomaten vom Geschmack her weniger ausgeprägt als im Sommer und somit gut geeignet.


Im drauffolgenden Schritt werden die Stielansätze entfernt.

Danach werden die Tomaten halbiert und auf ein, mit ein wenig Zucker bestreutes Backblech gegeben.

Eigentlich sollten die Tomaten danach so lange im Backofen gegrillt werden bis die Haut schwarz ist. Leider hat unser Herd das nicht ganz geschafft, sondern nur in Ansätzen...

Das Ziel war es allerdings die Haut leichter entfernen zu können, und das ist auch gelungen.

Nach dem die Haut entfernt worden ist, werden die Tomaten mit einer Gabel leicht zerdrückt und mit Knoblauch, Salz und Pfeffer leicht gewürzt. Zusätzlich habe ich an dieser Stelle noch Balsamico über die Tomaten gegeben. Hätte zwar aufgrund der bereits vorhandenen Säure der Tomaten nicht gemusst, war aber lecker ;-)

Danach geht das Blech wieder in den Ofen und darf weiter köcheln. Kurz vor Ende der Garzeit wird ein wenig gezupfter Basilikum hinzugegeben.

In der Zwischenzeit sollte die Pasta gegart sein und kann anschließend mit der Soße vermengt werden.

Somit muss nur noch angerichtet werden und schon ist es fertig.

Lecker, lecker!

Somit sieht man, ich kann auch ohne Fleisch! Danke Daniela für den Hinweis ;-)

14.11.2011

Spring 3 - Internationalisierung mit der ResourceBundleMessageSource

Leichte Kost für den heutigen Abend. Die Verwaltung von internationalisierten Nachrichten mit Spring ist durch Dependency Injection einfach und komfortabel geworden. Das ApplicationContext Interface erweitert die bereits vorhandene Funktionalität des MessageSource Interface, welches den Zugriff auf das Resource Bundle bereitstellt.
Zur Verfügung stehen die folgenden Methoden:

 StringgetMessage(MessageSourceResolvable resolvable, Locale locale)
 StringgetMessage(String code, Object[] args, Locale locale)
 StringgetMessage(String code, Object[] args, String defaultMessage, Locale locale)

Wird der ApplicationContext geladen, wird automatisch nach einer MessageSource innerhalb des Context gesucht. Diese Bean muss den Namen 'messageSource' tragen, damit diese korrekt initialisiert werden kann. Alle Methodenaufrufe werden dann an die gefundene Bean delegiert. Sollte keine Bean mit diesem Namen gefunden werden, so wird in Oberklassen gesucht, oder eine leere DelegatingMessageSource erzeugt. In jedem Fall ist sichergestellt, dass die Methodenaufrufe delegiert werden.

Spring stellt zwei unterschiedliche Verwaltungsmöglichkeiten für Messages bereit. Zum einen die ResourceBundleMessageSource und zum anderen die StaticMessageSource. Für die Nutzung innerhalb einer Anwendung wird im Normalfall die ResourceBundleMessageSource eingesetzt, die StaticMessageSource dient im wesentlichen dem programmatischen Zugriff auf das Resource Bundle. Als Beispiel wird eine Bean mit dem Zugriff auf die MessageSource definiert.


Die Angabe des Messages Bundles erfolgt mit Berücksichtigung der Platzierung im Classpath:


Die Beans werden wie gewohnt entweder mit Annotationen, oder per XML Deskriptor definiert. In diesem Fall wurde die HelloWorld Bean mit einer Konfiguration per Annotation konfiguriert.


Der Zugriff auf das Resource Bundle erfolgt innerhalb der Bean über den ApplicationContext, der per Dependency Injection durch Spring initialisiert und verwaltet wird. In beiden Fällen wird eine Defaultmessage mitgegeben, welche ausgegeben wird, wenn die gewünschte Message nicht gefunden wird.

Der Test der Bean erfolgt durch einen einfachen JUnit Test, der mit dem Spring-Testrunner durchgeführt wird.

Wie man sieht, ist die Verwaltung per Spring denkbar einfach und bietet gegenüber dem direkten Zugriff auf den FacesContext einige Vorteile, die ausgenutzt werden können.

Der Beispielcode findet sich wie immer im Subversion.

11.11.2011

Gulasch - Traditionelle Art

Die Basis für das Gulasch ist das Rezept aus der Kochschule von Witzigmann und Plachutta. Die meisten der Rezepte sind mit ein wenig Grundwissen nachzukochen und bieten Platz für eigene Kreativität.
Basis für das Gulasch bilden ein paar Metzgerzwiebeln, die fein gehackt werden.


Dazu kommt, ebenfalls fein gehackt, eine Portion Suppengemüse (bestehend aus Lauch, Petersilie, Möhren und Sellerie).


Das Gemüse darf in dem heißen Fett dünsten und Röstaromen aufnehmen.


In der Zwischenzeit wird das Fleisch in mundgerechte Stücke zerteilt. Ich habe hier den Rest meines Flanksteaks genommen, da dies vom Metzger wenig fachgerecht zugeschnitten wurde und für das direkte Grillen nicht mehr geeignet war. Für das Gulasch aber immer noch super!


Nach dem Portionieren des Fleisches hat die Gemüsebasis bereits genügend Röstaromen abbekommen und kann mit dem Zauberstab püriert werden.


Sieht zwar nicht lecker aus, bildet aber eine hervorragende Basis für ein sämiges Gulasch.


Die angerösteten Reste im Topf werden durch ein wenig Rotwein aufgekocht und vom Topf gelöst. Nächstes Mal auch ohne Kohlensäure...


Das Fleisch, die pürierte Gemüsebasis und die Flüssigkeit köcheln nun eine Weile (4h) vor sich hin, so dass das Fleisch schön mürbe wird.


Kurz vor Ende der Garzeit werden noch zwei Paprika fein gewürfelt und dem Gulasch untergemengt.


Nach ca. 4 bis 4,5h ist das Essen fertig und kann mit Kartoffeln angerichtet werden.


Als Nachtisch gab es einen selbst angesetzten Joghurt mit Honig und frischen Walnüssen!


Lecker war's!

08.11.2011

Futter für den Winter - Pike Secrets I & II

Die Jungs der Film Schmiede "Wide Open Outdoor Film" haben ein paar weitere feine Trailer veröffentlicht.




Wenn die DVDs nur halb so gut sind, wie es "The Fish and the Fly 1" und "The Fish and the Fly 2" waren, dann werden die Teile auf jeden Fall den Weg in das heimische DVD Regal finden. Die Qualität der Trailer lässt auf jeden Fall auf die DVD hoffen. Die Spielzeit liegt bei knapp über einer Stunde pro DVD.

Und falls es doch wieder Fliegenfischen sein sollte, dann lohnt es sich einen Blick auf den Trailer von "The Fish and the Fly 3" zu werfen.



Leider erscheint die DVD deutlich später als geplant. Ich hoffe aber, dass es Ende November den dritten Teil auch zu kaufen gibt. Fehlt noch in meiner Sammlung ;-)

Bezug dere DVDs über die Webseite des Herstellers oder über den Fachhandel.

03.11.2011

Perfomance - Zeitmessung mit Servletfiltern

Um die Performance einer Anwendung zu messen, kann die Abarbeitungszeit eines Requests gemessen werden. Dabei können unterschiedliche Verfahren zur Anwendung kommen.
Für Webanwendungen bietet sich die Nutzung eines Filters an, der die Ausführungzeit des Requests messen und loggen kann.

Servlet-Filter können genutzt werden um auf die Werte eines Requests (und auch der Response) zurückzugreifen, diese zu manipulieren und weitere Aktionen durchzuführen.  Durch Mappingregeln innerhalb der Deploymentdeskriptoren werden die Filter definiert und in ihrer Reihenfolge festgelegt.

In der Literatur dient in vielen Fällen das Messen der Ausführungszeit als Beispiel für die Implementierung eines Filters. Dabei können Ausführungszeiten, Zugriffszeiten auf Ressourcen oder weitere Flaschenhälse einer Anwendung geprüft werden.

Als Basis für das Beispiel wird eine per Maven erzeugte Beispielanwendung verwendet, die mit einem Filter zur statistischen Auswertung erweitert wird. Um die Komplexität des Beispiels nicht zu hoch zu setzen, wird eine Erstellung durch die Auswahl des entsprechenden Archetypes durchgeführt.


Danach steht eine rudimentäre Webanwendung mit einer einfachen "Hello World" Seite zur Verfügung. Damit diese gestartet werden kann, wird das Tomcat Plugin genutzt. Dieses muss in der pom.xml des Projektes hinzugefügt werden.


Danach sollte der Server ohne weitere Probleme durch das Goal tomcat:run gestartet und die Webanwendung aufgerufen werden können.

Vor der Implementierung des Filters sollte klar sein, wie Filter im Allgemeinen funktionieren. Die drei wesentlichen Klassen sind
Die FilterConfig ist der Teil, der sich innerhalb des Deployment Deskriptors wiederfindet und dort die Details eines Filters konfiguriert. Dabei werden die angegeben Einträge in einem Objekt vom Typ FilterConfig gekapselt und innerhalb der init Methode eines Filters zur Verfügung gestellt.
Die FilterChain ist die Kette der Filter, die durch das Framework abgearbeitet werden. Alle Filter zusammen bilden die Filterkette. In dem Interface FilterChain ist als einzige Methode die Methode doFilter(..) definiert, die für die weitere Verarbeitung der Filter verantwortlich ist. Mit Hilfe der Methode wird das nächste Element (Filter oder, falls kein Filter mehr vorhanden ist, die Ressource selbst) angesprochen.
Das Interface Filter ist das wesentliche Interface bei der Eigenentwicklung eines Filters. Jeder Filter muss das Interface implementieren, damit dieser innerhalb der Chain verarbeitet werden kann. Die verschiedenen Methoden bieten die Möglichkeit zur Interaktion mit dem Request oder auch der Response.

Der Filter für das statistische Loggen der Dauer eines Requests ist einfach gehalten um so wenig Overhead wie möglich zu produzieren. Für die Bereitsstellung der Logs wurden zwei Logger über die SLF4J Factory initialisiert und stehen im weiteren Verlauf zur Verfügung.


Die Wahl fiel an dieser Stelle bewusst auf zwei Logger, da diese unabhängig voneinander loggen können. Einmal wird auf die Konsole geloggt, so dass der Entwickler weiterhin einen guten Überblick über die Meldungen hat und zum anderen wird über einen RollingFileAppender statistische Daten in eine Datei geloggt, so dass diese später weiterverarbeitet werden können. Das Konfigurationsfile ist wie folgt aufgebaut:


Die Implementierung der Methode gestaltet sich ebenfalls nicht weiter schwierig, so dass auf größere Erklärungen verzichtet werden kann.


Im weiteren Schritt braucht der Filter nur noch in den Deployment Deskriptor eingetragen werden. Dafür werden in der web.xml das Filtermapping und auch der Filter an sich ergänzt. Für die Namensgebung und die Verweise innerhalb der web.xml gelten die gleichen Regeln, wie für das definieren von Servlets und Servletmappings.


Wichtig an dieser Stelle ist, dass die Reihenfolge durch die Einträge innerhalb des Deployment-Deskriptors definiert werden. Für die Bestimmung der Filterreihenfolge existieren zwei wesentliche Kriterien. Zum einen gilt, dass Filter, die mit einem URL Mapping definiert worden sind immer Vorrang vor den Filtern mit einem Servletmapping haben. In der jeweiligen Gruppe der Filter entscheidet dann, als zweites Kriterium, die Reihenfolge der Definitionen.

Sobald der Filter aktiviert ist und die Anwendung erneut gestartet wurde, können die Ausgaben auf der Konsole, als auch innerhalb der Datei gefunden werden.


Die statistische Auswertung kann dann anhand der Textdatei erfolgen. Dort hilft ein Import und eine Betrachtung mit Hilfe von Excel um die Ergebnisse grafisch auszuwerten.


Wobei an dieser Stelle noch mehr herauszuholen ist ;-)

Das gesamte Projekt ist wie gewohnt bei Cloudbees im Repository zu finden.

Programmierbücher - Kostenlose Liste von eBooks

Durch den Newsletter der JUG Ostfalen bin ich auf einen Post bei Stackoverflow aufmerksam geworden.

Dort wird eine Menge an frei verfügbaren Büchern (Online oder auch als eBook) aufgelistet auf die man ohne weitere Vorraussetzungen Zugriff hat.

Sollte also jemand Bedarf an unterschiedlicher Lektüre haben, einfach mal bei Stackoverflow vorbeischauen.

http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books

02.11.2011

JavaEE 6 - Testing mit Hilfe des EJBContainers

Mit JavaEE 6 sind enige Neuerungen in die JavaEE Welt gekommen. Zum einen ist die Nutzung des Frameworks weiter vereinfacht worden und zum anderen wurden diverse Wünsche aus der Entwicklercommunity mit untergebracht.

In den meisten Fällen wurden die Konfigurations- möglichkeiten weiter vereinfacht und komplett auf Annotation umgestellt. Damit wurde die Linie bei der Entwicklung von J2EE 1.4 (schwergewichtig, stark XML lastig) zu Java EE 5 (POJOs, IoC, DI, Annotationen statt XML) konsequent weitergeführt.



Wesentliche Neuerungen sind:

  • Konfiguration von Servlets per Annotation (Servlet 3.0)
  • Integration von JSF 2.0 (ebenfalls Konfiguration per Annotation)
  • Wegfall der Interfaces für die Nutzung lokaler Beans
  • Singleton Scope für Beans (Annotation: @Singleton)
  • Erweiterung und Verbesserung der Timerfunktionalität
  • Unterstützung von asynchronen Methodenaufrufen in Session Beans
  • Integration von weiteren Mapping Optionen bei JPA 2.0
  • Bereitstellung eines EJBContainers für das Testen von EJB Anwendungen
Gerade der Wegfall der Interfaces ist ein wichtiger Punkt und kann kontrovers gesehen werden. Sicherlich ist somit eine Vereinfachung der Anwendung gegeben, aber gleichzeitig wird mit konkreten Implementierungen der Beans gearbeitet. Eine Entkopplung von Definition und konkreter Umsetzung fällt in diesem Fall unter den Tisch. Sicherlich ein Vorteil in unterschiedlichen Projekten, da der Overhead weiter dezimiert wird. Allerdings entscheidet man sich an dieser Stelle für die Nutzung der Implementierung innerhalb der weiteren Beans und somit gegen eine einfache Austauschbarkeit.

Ist kein Interface definiert, so stellt der Container ein Referenzobjekt zur Verfügung. Dieses Referenzobjekt beinhaltet alle öffentlichen Methoden der Bean selbst. Das Proxyobjekt ist eine von der ursprünglichen Bean abgeleitet Klasse und kann ganz normal in weiteren Beans genutzt werden. Diesen Umstand sollte der Entwickler unbedingt im Auge behalten.

Eine weitere spannende Neuerung ist der EJB Container (javax.ejb.embeddable.EJBContainer) , der für die Tests der entwickelten Beans bereit steht. Damit soll ein Test der erstellten Komponenten deutlich einfacher werden. Die Funktion ist an dieser Stelle reicht einfach zu erklären.

Der Container wird mit dem Aufruf EJBContainer.createEJBContainer() erstellt. Dabei werden alle EJBs die sich auf dem Classpath befinden als EJB im Container deployed und stehen in dem Test zur Verfügung. Dabei ist es egal, ob sich die EJBs verpackt in JAR Files befinden oder als Verzeichnis vorliegen. Sollte der Container nicht erfolgreich initialisiert werden können, wird eine EJBException geworfen.

Der Vorteil des Containers wird schnell an einem kleinen Beispiel klar. Als Basis dient eine kleine Anwendung, die die aktuellen Umrechnungskurse von der ECB bezieht, diese parst und einen einfachen Service für die Umrechnung von Euro in andere unterstützte Währungen bereithält.


Dabei spielt die Klasse EcbExchangeRateParser eine wichtige Rolle. Diese Klasse ist als Stateless Session Bean implementiert. Nach dem Erzeugen durch den Container werden die Daten der ECB abgerufen und mit Hilfe des EcbContentHandler geparst.


Mit Hilfe dieser Informationen werden später die Wechselkurse bestimmt, zu sehen in dem folgenden Snippet.


Diese Bean wird innerhalb des eigentlichen Währungsrechners für die Ermittlung des Wechselkurses genutzt.


Mit JavaEE 6 ist das durchführen von Integrationstests nun deutlich einfacher geworden. Die komplette Konfiguration und Nutzung von TestNG für einfache Tests entfällt als Beispiel. Dafür kann nun der bereits vorgestellte EJBContainer genutzt werden. Dieser wird in einer abstrakten Testklasse vor jedem Test erstellt und hochgefahren. Zusätzliche werden weitere Methoden bereitgestellt (Bean-Instanzen aus dem EJB-Kontext referenzieren und den Container nach den Tests ordnungsgemäß herunterfahren).


Beim Startup des Containers werden alle im Classpath befindlichen Beans geladen und deployed.

Bitte auf das Bild klicken um die Konsolenausgabe zu sehen
Dort sind dann auch die JNDI Namen für die Beans ersichtlich. Unter diesen JNDI Namen stehen die Beans für einen Lookup zur Verfügung.

Damit der Test funktioniert muss eine zusätzliche Dependency in die pom.xml eingetragen werden.


Diese Dependency sorgt für die Bereitstellung eines Embedded Glassfish der extra für das Testen entwickelt worden ist. Somit steht die gesamte Funktionalität des Glassfish innerhalb des Testcontainers zur Verfügung und ermöglicht ein einfaches implementieren der Tests.


Im Test selbst muss der Entwickler sich nicht mehr um DI oder die korrekte Instantiierung der Beans kümmern, da dies durch den EJBContainer abgewickelt wird.

Falls also wirklich die komplette Funktionalität zur Verfügung steht, ist dies sicherlich eine nette Alternative zu gängigen Frameworks.

Das Beispiel findet sich wie immer in meinem Repository unter https://svn-saschadoemer.forge.cloudbees.com/saschadoemerblogspotcom/EJB