... newer stories
Sunday, 5. July 2015
SW-Archäologie mit AspectJ (2)
javatux, 00:43h
1. Die klassische Herangehensweise
Dies ist ein sehr einfaches Modell einer Konto-Klasse, bei dem die Businesslogik (Einzahlung, Auszahlung, Überweisung) noch sehr gut erkennbar ist. Eine Warnung vorneweg: für Real-World-Implementierung bitte nie double als Datentyp verwenden, sonst kann es böse Überraschungen wegen Rundungsfehlern kommen (s. Ich bin reich!)
So langsam tritt damit die eigentliche Businesslogik immer mehr in den Hintergrund. Und es warten noch jede Menge weitere Anforderungen (oft auch als „Concerns“ bezeichnet), die technischer Natur sind und mit der eigentlichen Fachlichkeit nichts zu tun haben: Authorisierung, Sicherheit, GUI, Transaktionen, …).
Ein Vertreter aspekt-orientierter Sprachen ist AspectJ, die Java um einige Sprachmittel erweitert und damit das Herauslösen der Logging-Funktionalität aus der Konto-Klasse ermöglicht:
Um den Code besser zu verstehen, muss man erst einige Begrifflichkeiten verinnerlichen, die im nächsten Abschnitt vorgestellt werden. Übersetzt bedeutet dieser Code: Wenn sich der Kontostand ändert, gib eine Log-Meldung aus.
Aufruf (call) oder Ausführung (execution) einer Methode oder eines Konstruktors
Initialisierung einer Klasse oder eines Objekts (initialization, preinitialization, staticinitialization)
Zugriff auf eine Instanz-Variable (set, get)
Exception-Handling (handler)
Über Pointcuts lassen sich diese Joinpoints dann adressieren:
Den ersten Pointcut (setKontostand) kennen wir schon aus dem obigen Beispiel des LogAspects (Listing 3:) - er addressiert den schreibenden Zugriff auf das kontostand-Attribut. Interessanter ist der zweite Pointcut (callBankMethods): er adressiert alle Methoden der verschiedenen Konto-Klassen (genauer: die mit „...Konto“ im Namen aufhören und im bank-Paket liegen) und beliebige viele Argumente haben. Möglich wird dies durch die Unterstützung verschiedener Wildcards, die der Schlüssel für das Herausziehen der Crosscutting Concerns sind.
Das Ganze lässt sich auch mit boolschen Operatoren verknüpfen und mit weiteren Bedingungen kombinieren, sodass sich damit (fast) alle erdenklichen Szenarien realisieren lässt. Seit AspectJ 5 können auch noch Annotations zur Selektion herangezogen werden, was nicht nur für die Lesbarkeit und Wartbarkeit große Vorteile bietet.
vor (Before-Advice),
nach (After-Advice) oder
anstatt (Around-Advice)
des Pointcuts ausgeführt wird.
Hier wird nach dem Pointcut „setKontostand“ die entsprechende Log-Meldung ausgegeben. Die Verknüpfung mit dem args-Schlüsselwort von AspectJ dient in diesem Beispiel nur dazu, um auf das Argument (sprich: dem Attribut) des Pointcuts zugreifen zu können. Alternativ erlaubt AspectJ auch den Zugriff auf den Kontext des Joinpoints.
Beim Load-Time Weaving (LTW) werden die Aspekte während des Ladens der Java-Klassen „eingewebt“. Dies Technik wird z.B. vom Spring-AOP-Framework verwendet, das intern auf AspectJ aufsetzt. Vorteil hierbei ist, dass man mit den Aspekten eine größere Reichweite hat (prinzipiell jede Klasse, die geladen wird). Als Nachteil erkauft man sich hier Syntax-Fehler, die erst zur Laufzeit bemerkt werden.
AspectJ beherrscht beides und das AJDT-Plugin für Eclipse3 unterstützt neben der inkrementellen Kompilierung die Visualisierung von Pointcuts und das Debuggen von Advices.
3. Unterstützung durch AOP
2. Abstecher in die Welt von AOP
Um in die Begriffs- und Gedankenwelt von AOP (Aspekt-Orientierte Programmierung) einzutauchen, betrachten wir ein Beispiel aus dem Bank-Bereich:
public class Konto {
private double kontostand = 0.0;
public double abfragen() {
return kontostand;
}
public void einzahlen(double betrag) {
kontostand = kontostand + betrag;
}
public void abheben(double betrag) {
kontostand = kontostand - betrag;
}
public void ueberweisen(double betrag, Konto anderesKonto) {
abheben(betrag);
anderesKonto.einzahlen(betrag);
}
}
Listing 1: Einfache Konto-KlasseDies ist ein sehr einfaches Modell einer Konto-Klasse, bei dem die Businesslogik (Einzahlung, Auszahlung, Überweisung) noch sehr gut erkennbar ist. Eine Warnung vorneweg: für Real-World-Implementierung bitte nie double als Datentyp verwenden, sonst kann es böse Überraschungen wegen Rundungsfehlern kommen (s. Ich bin reich!)
2.1. Code-Verschmutzung
„Alle Kontobewegungen müssen protokolliert werden.“Diese gesetzliche Anforderung sollen jetzt umgesetzt werden. Dazu wird die Konto-Klasse wie folgt erweitert:
public class Konto {
private static Logger log = Logger.getLogger(Konto.class);
private double kontostand = 0.0;
public double abfragen() {
return kontostand;
}
public void einzahlen(double betrag) {
kontostand = kontostand + betrag;
log.info("neuer Kontostand: " + kontostand);
}
public void abheben(double betrag) {
kontostand = kontostand - betrag;
}
public void ueberweisen(double betrag, Konto anderesKonto) {
abheben(betrag);
anderesKonto.einzahlen(betrag);
log.info("neuer Kontostand: " + kontostand);
}
}
Listing 2: Konto-Klasse mit LoggingSo langsam tritt damit die eigentliche Businesslogik immer mehr in den Hintergrund. Und es warten noch jede Menge weitere Anforderungen (oft auch als „Concerns“ bezeichnet), die technischer Natur sind und mit der eigentlichen Fachlichkeit nichts zu tun haben: Authorisierung, Sicherheit, GUI, Transaktionen, …).
Separations of Concerns?
Während des Information-Studiums bekommt man mit Dijkstras „Separations of Concerns“ die Empfehlung mit auf den Weg, jeden „Concern“ in einer eigenem Modul oder Klasse zu kapseln, aber bereits dieses einfache Logging-Beispiel zeigt, dass das mit den Mitteln der Objekt-Orientierung gar nicht so einfach ist.2.2. Separation of Concerns
Ein Ausweg aus diesem Dilemma bietet die Aspekt-Orientierung. Sie bietet Konzepte an, um solche meist technischen Anforderungen (im AOP-Jargon als „Crosscutting-Conerns“ bezeichnet), in eigene „Aspekte“ kapseln zu können:Separations of Concerns!
AspectJ als Aspekt-orientierte Erweiterung von Java bietet dazu Sprachmittel, umEin Vertreter aspekt-orientierter Sprachen ist AspectJ, die Java um einige Sprachmittel erweitert und damit das Herauslösen der Logging-Funktionalität aus der Konto-Klasse ermöglicht:
public aspect LogAspect {
private static Logger log = Logger.getLogger(LogAspect.class);
pointcut setKontostand() :
set(double bank.Konto.kontostand);
after(double neu) : setKontostand() && args(neu) {
log.info("neuer Kontostand: " + neu);
}
}
Listing 3: LogAspectUm den Code besser zu verstehen, muss man erst einige Begrifflichkeiten verinnerlichen, die im nächsten Abschnitt vorgestellt werden. Übersetzt bedeutet dieser Code: Wenn sich der Kontostand ändert, gib eine Log-Meldung aus.
2.3. Do You Speak AOP?
Genauso wie SQL mit eigenen Begriffen wie Relationen und Normalform daherkommt, grenzt sich die Aspekt-Orientierung mit Ihrer eigenen Begriffswelt von anderen Techniken ab. Die wichtigsten davon sind:- Aspekt
- Joinpoints
- Pointcuts
- Advice
public aspect LogAspect {
// ...
}
Listing 4: Leerer LogAspect
2.3.1 Joinpoints und Pointcuts
Als Joinpoints werden im AOP-Jargon all die Punkte im Programm bezeichnet, auf die Einfluss genommen werden kann. Im Falle von AspectJ (und den meisten anderen AOP-Sprachen) sind dies:Aufruf (call) oder Ausführung (execution) einer Methode oder eines Konstruktors
Initialisierung einer Klasse oder eines Objekts (initialization, preinitialization, staticinitialization)
Zugriff auf eine Instanz-Variable (set, get)
Exception-Handling (handler)
Über Pointcuts lassen sich diese Joinpoints dann adressieren:
pointcut setKontostand() :
set(double bank.Konto.kontostand);
pointcut callBankMethods() :
call(* bank.*Konto.*(..));
Listing 5: Definition zweier PointcutsDen ersten Pointcut (setKontostand) kennen wir schon aus dem obigen Beispiel des LogAspects (Listing 3:) - er addressiert den schreibenden Zugriff auf das kontostand-Attribut. Interessanter ist der zweite Pointcut (callBankMethods): er adressiert alle Methoden der verschiedenen Konto-Klassen (genauer: die mit „...Konto“ im Namen aufhören und im bank-Paket liegen) und beliebige viele Argumente haben. Möglich wird dies durch die Unterstützung verschiedener Wildcards, die der Schlüssel für das Herausziehen der Crosscutting Concerns sind.
Das Ganze lässt sich auch mit boolschen Operatoren verknüpfen und mit weiteren Bedingungen kombinieren, sodass sich damit (fast) alle erdenklichen Szenarien realisieren lässt. Seit AspectJ 5 können auch noch Annotations zur Selektion herangezogen werden, was nicht nur für die Lesbarkeit und Wartbarkeit große Vorteile bietet.
2.3.2 Advices
Advices sind die Methoden der Aspekt-Orientierung: mit Ihnen kann ich die Punkte im Programm, die ich über die Pointcuts adressiert haben, um zusätzliche Funktionalität anreichern (oder einfacher: manipulieren). Dabei habe ich die Wahl, ob der Advicevor (Before-Advice),
nach (After-Advice) oder
anstatt (Around-Advice)
des Pointcuts ausgeführt wird.
after(double neu) : setKontostand() && args(neu) {
log.info("neuer Kontostand: " + neu);
}
Listing 6: After-AdviceHier wird nach dem Pointcut „setKontostand“ die entsprechende Log-Meldung ausgegeben. Die Verknüpfung mit dem args-Schlüsselwort von AspectJ dient in diesem Beispiel nur dazu, um auf das Argument (sprich: dem Attribut) des Pointcuts zugreifen zu können. Alternativ erlaubt AspectJ auch den Zugriff auf den Kontext des Joinpoints.
2.3.3 Der Webe-Vorgang
Wie kommen die Aspekte in das fertige Programm? Dazu gibt es Techniken wie:- Compile-Time Weaving (CTW)
- Load-Time Weaving (LTW)
Beim Load-Time Weaving (LTW) werden die Aspekte während des Ladens der Java-Klassen „eingewebt“. Dies Technik wird z.B. vom Spring-AOP-Framework verwendet, das intern auf AspectJ aufsetzt. Vorteil hierbei ist, dass man mit den Aspekten eine größere Reichweite hat (prinzipiell jede Klasse, die geladen wird). Als Nachteil erkauft man sich hier Syntax-Fehler, die erst zur Laufzeit bemerkt werden.
AspectJ beherrscht beides und das AJDT-Plugin für Eclipse3 unterstützt neben der inkrementellen Kompilierung die Visualisierung von Pointcuts und das Debuggen von Advices.
3. Unterstützung durch AOP
... link (0 Kommentare) ... comment
Friday, 3. July 2015
SW-Archäologie mit AspectJ (1)
javatux, 00:43h
Motivation
Um festzustellen, inwieweit der Code tatsächlich mit der Dokumentation übereinstimmt, sind Testfälle (sofern vorhanden) von eminenter Bedeutung. Sie bilden den Ausgangspunkt, um verschiedene Programmteile zu erkunden und deren Verhalten zu studieren. Die meisten Schwierigkeiten bestehen meist darin, die Testfälle zum Laufen zu bringen.
Hat man die Tests am Laufen, kann man sich an Refactoring-Maßnahmen wagen mit dem Ziel, die Businesslogik stärker zum Vorschein zu bringen und die Lesbarkeit und Wartbarkeit zu erhöhen. Vor allem JEE-Anwendungen sind oftmals over-designed, was eine Einarbeitung meist erschwert.
Mit den neuen Erkenntnisse sollte nochmals die Dokumentation begutachtet werden: welche Dokumente müssen überarbeitet, welche Dokumente können aussortiert oder/und in Form von neuen Testfällen ausgedrückt werden.
Auch die wenigen Test-Ruinen, die man dabei oft noch findet, sind von unschätzbarem Wert, geben Sie doch einen Einblick auf die dynamischen Zusammenhänge. Zusammen mit Aspektorientierten Code-Injektionen kann man darauf aufbauend neue Erkenntnisse über den Zusammenhalt der Code-Bereich gewinnen.
2. Abstecher in die Welt von AOP
1. Die klassische Herangehensweise
Meist ist die Dokumentation oft die erste Anlaufstelle, um sich mit einer Alt-Anwendung vertraut zu machen. Auch wenn sie oftmals von der Realität abweicht, gibt sie doch einen wertvollen Einblick und wichtige Informationen, die den Einstieg in die Thematik erleichtern.1.1. Der Ideal-Fall
Im Ideal-Fall ist eine aktuelle Dokumentation vorhanden, die diesen Namen auch verdient und verschiedene Sichten auf die Anwendung erlaubt. Vor allem Übersichts-Dokumente über die Architektur, Infrastruktur und Randbedingen sind hier für die Einarbeitung, aber auch als Nachschlagewerk sehr hilfreich.Um festzustellen, inwieweit der Code tatsächlich mit der Dokumentation übereinstimmt, sind Testfälle (sofern vorhanden) von eminenter Bedeutung. Sie bilden den Ausgangspunkt, um verschiedene Programmteile zu erkunden und deren Verhalten zu studieren. Die meisten Schwierigkeiten bestehen meist darin, die Testfälle zum Laufen zu bringen.
Hat man die Tests am Laufen, kann man sich an Refactoring-Maßnahmen wagen mit dem Ziel, die Businesslogik stärker zum Vorschein zu bringen und die Lesbarkeit und Wartbarkeit zu erhöhen. Vor allem JEE-Anwendungen sind oftmals over-designed, was eine Einarbeitung meist erschwert.
Mit den neuen Erkenntnisse sollte nochmals die Dokumentation begutachtet werden: welche Dokumente müssen überarbeitet, welche Dokumente können aussortiert oder/und in Form von neuen Testfällen ausgedrückt werden.
1.2. Der Normal-Fall
Die Realität sieht oft ganz anders aus: Die Dokumentation ist oft Teil des Problems und nicht der Lösung. Ehemalige Entwickler sind samt KnowHow im Bermuda-Dreieck des Outsourcings verschwunden und als Test-Umgebung dient das Produktiv-System. Da heißt es dann im Code graben und die Mosaikstücke der ursprünglichen Architektur richtig zu deuten. Alles, was mir dabei hilft, den Source-Code zu verstehen, hilft mir bei der Rekonstruktion des Gesamt-Systems.Auch die wenigen Test-Ruinen, die man dabei oft noch findet, sind von unschätzbarem Wert, geben Sie doch einen Einblick auf die dynamischen Zusammenhänge. Zusammen mit Aspektorientierten Code-Injektionen kann man darauf aufbauend neue Erkenntnisse über den Zusammenhalt der Code-Bereich gewinnen.
2. Abstecher in die Welt von AOP
... link (0 Kommentare) ... comment
Monday, 29. June 2015
SW-Archäologie mit AspectJ (0)
javatux, 18:26h
Motivation
Neue Projekte auf der grünen Wiese sind selten. Viel öfters wird man mit Altlasten konfrontiert und steht vor der undankbaren Aufgabe, vergangene Architekturen wieder freizulegen und unbekannten Code zu deuten, um das Projekt zu vergangenen Hochkulturen wieder zurückzuführen.Dabei gibt es verschiedenen Möglichkeiten, dem Code seine Geheimnisse zu entreißen. Ein vielversprechender Ansatz ist dabei der Einsatz von Aspekt-Orientierung und AspectJ, um unbekannte Codestellen zu erschließen und das Programmverhalten zu ergründen. Damit lassen sich:
- Schnittstellen überwachen
- Schnittstellen simulieren
- Events aufzeichen
- Sequenz-Diagramme für ausgesuchte Bereiche generieren
- …
Die klassische Herangehensweise
... link (0 Kommentare) ... comment
Sunday, 28. June 2015
SW-Archäologie mit AspectJ
javatux, 15:25h
Am 9. Juli ist es soweit - das Java Forum Stuttgart 2015 und damit auch mein Talk zu SW-Archäologie mit AspectJ steht vor der Tür. Zeit, um einige Begriffe zu klären:
Archäologie ist eine Wissenschaft, die die kulturelle Entwicklung der Menschheit erforscht. SW-Archäologie dagegen ist kein "offizieller" Begriff, steht hier aber für die mühsame Erforschung gewachsener SW-Systeme ("Altlasten"), die Ähnlichkeiten mit Ausgrabungen versunkener Ruinen, der Suche nach weiteren Puzzle-Teilen oder der Deutung unbekannter Code-Stücke ähnelt.
Wer mehr dazu wissen will (und vor allem, wie man mit AspectJ - einer Aspekt-Orientierten Erweiterung von Java - das Graben im Code unterstützen kann), sollte zum Vortrag kommen oder diesen Blog hier verfolgen - für die nächsten Tage sind als Vorbereitung auf das JFS einige begleitende Artikel zu diesem Thema geplant.
Teil 0: Motivation
Archäologie ist eine Wissenschaft, die die kulturelle Entwicklung der Menschheit erforscht. SW-Archäologie dagegen ist kein "offizieller" Begriff, steht hier aber für die mühsame Erforschung gewachsener SW-Systeme ("Altlasten"), die Ähnlichkeiten mit Ausgrabungen versunkener Ruinen, der Suche nach weiteren Puzzle-Teilen oder der Deutung unbekannter Code-Stücke ähnelt.
Wer mehr dazu wissen will (und vor allem, wie man mit AspectJ - einer Aspekt-Orientierten Erweiterung von Java - das Graben im Code unterstützen kann), sollte zum Vortrag kommen oder diesen Blog hier verfolgen - für die nächsten Tage sind als Vorbereitung auf das JFS einige begleitende Artikel zu diesem Thema geplant.
Teil 0: Motivation
... link (0 Kommentare) ... comment
Sunday, 26. April 2015
Testing Equals Semi-Automated
javatux, 14:23h
If you override Object.equals(..) you should also override Object.hashCode(). So your unit test for your class may look like:
To answer theses questions PatternTesting provides an ObjectTester class which checks that for you:
But stop - what is, if the default constructor creates two different objects which are not equals? E.g. the Date class does it! Then you can exclude classes from the check in different ways:
In a similiar way you can test different properties of your class like Serializable or Comparable with the different XxxTester classes in patterntesting.runtime.junit - try it!
Happy Testing
MyClass one = new MyClass();
MyClass anotherOne = new MyClass();
assertEquals(one, anotherOne);
assertEquals(one.hashCode(), another.hashCode();
But does your implementation returns false if the argument is null? Or is a.equals(b) the same as b.equals(a)?To answer theses questions PatternTesting provides an ObjectTester class which checks that for you:
MyClass one = new MyClass();
MyClass anotherOne = new MyClass();
ObjectTester.assertEquals(one, anotherOne);
But the ObjectTester can do much more for you: it can check all equals implementation of a package hierarchy:
ObjectTester.assertEqualsOfPackage("java");
For each class in the java package which have overriden the equals method the ObjectTester creates two test objects with the default constructor (if it has one) to verify the implementation.But stop - what is, if the default constructor creates two different objects which are not equals? E.g. the Date class does it! Then you can exclude classes from the check in different ways:
ObjectTester.assertEqualsOfPackage("java",
Pattern.compile("java.*\\.Date"));
Here a Java pattern (which is new in PatternTesting 1.5.1) is used to exclude the Date classes in java.util and java.sql from testing the equals and hashCode implementation.In a similiar way you can test different properties of your class like Serializable or Comparable with the different XxxTester classes in patterntesting.runtime.junit - try it!
Happy Testing
... link (0 Kommentare) ... comment
Thursday, 19. March 2015
#StTT2015: Stuttgarter Test-Tage 2015
javatux, 22:00h
Das Programm zu den vierten Stuttgarter Test-Tage steht jetzt und ist unter jugs.org/tt2015 online. Die Auswahl des Programmes war nicht ganz einfach, weil wir über 20 Einreichungen aus halb Europa bekommen haben, aber ich denke, es ist eine gelungene Mischung aus verschiedenen Themen, die für's Testen relevant sind.
Die Örtlichkeiten werden wieder die gleichen wie bei den Stuttgarter Test-Tagen 2013 sein, auch wenn damals das WLAN dem Ansturm der Teilnehmer nicht gewachsen war. Aber das soll Vermittlung von Theorie und Praxis keinen Abbruch tun. Wer jetzt Lust bekommen hat, Test-Mittel und neue Kollegen kennenzulernen, sollte sich möglichst bald anmelden - beim letzten Mal mussten wir Interessierte am Ende auf eine Warteliste setzen.
Die Örtlichkeiten werden wieder die gleichen wie bei den Stuttgarter Test-Tagen 2013 sein, auch wenn damals das WLAN dem Ansturm der Teilnehmer nicht gewachsen war. Aber das soll Vermittlung von Theorie und Praxis keinen Abbruch tun. Wer jetzt Lust bekommen hat, Test-Mittel und neue Kollegen kennenzulernen, sollte sich möglichst bald anmelden - beim letzten Mal mussten wir Interessierte am Ende auf eine Warteliste setzen.
... link (0 Kommentare) ... comment
Thursday, 5. February 2015
gdv.xport 1.0
javatux, 22:51h
Endlich ist es soweit - Version 1.0 von gdv.xport ist jetzt draußen. Die wichtigsten Änderungen gegenüber der 0.9er-Version sind:
- Unterstützung der 2013er Version des GDV-Datenformats
- Unterstützung aller Satzarten dank der XML-Datei des GDVs
- erhebliche Reduzierung des benötigten Hauptspeichers dank Streaming-API
... link (0 Kommentare) ... comment
Tuesday, 6. January 2015
PatternTesting 1.5 released
javatux, 14:17h
One of the most exciting features of PatternTesting 1.5 is the chance to log and monitor SQL statements. This feature was introduced with 1.4.1 and is described in SQL Logging and Monitoring - all you have to do is to add patterntesting-rt.1.5.0.jar as library and to use
Another improvement of 1.5 is the better performance of the ClasspathMonitor. Especially for large classpathes with more than 20,000 classes it needed some minutes to dump the unused classes and other informations into several files. Now the different infos are collected and dumped much faster. And the ClasspathMonitor should work better now together with the classloader of WebSphere if you use the PatternTesting Agent as described in Enabling ClasspathMonitor in Websphere.
jdbc:proxy:hsqldb:mem:testdbas JDBC URL for an in-memory DB (HSQL) - or any other valid JDBC URL, prefixed with "jdbc:proxy:...".
Another improvement of 1.5 is the better performance of the ClasspathMonitor. Especially for large classpathes with more than 20,000 classes it needed some minutes to dump the unused classes and other informations into several files. Now the different infos are collected and dumped much faster. And the ClasspathMonitor should work better now together with the classloader of WebSphere if you use the PatternTesting Agent as described in Enabling ClasspathMonitor in Websphere.
... link (0 Kommentare) ... comment
Thursday, 1. January 2015
Happy New Year 2015
oboehm, 13:48h
“An optimist stays up until midnight to see the new year in. A pessimist stays up to make sure the old year leaves.”
(Bill Vaughan)
... link (0 Kommentare) ... comment
Tuesday, 23. December 2014
Happy Christmas
oboehm, 22:57h
Christmas is a time in which, of all times in the year, the memory of every remediable sorrow, wrong, and trouble in the world around us, should be active with us, not less than our own experiences, for all good.
(Charles Dickens)
... link (0 Kommentare) ... comment
Saturday, 15. November 2014
#StTT2015: Stuttgarter Test-Tage 2015
javatux, 12:40h
Die Seiten zu den Stuttgarter Test-Tage 2015 sind jetzt unter jugs.org/tt2015 online. Ähnlich wie beim letzten Mal wollen wir auch dieses Mal den praktischen und sozialen Teil nicht zu kurz kommen lassen. So ist der Nachmittag wieder für praktische Übungen reserviert, während es am Donnerstag Gelegenheit gibt, sich beim virtuellen Lagerfeuer mit anderen Teilnehmern nicht nur über Java und Testen auszutauschen.
Dafür suchen wir noch Sponsoren, die uns den Abend-Event ermöglichen. Und natürlich suchen wir noch jede Menge Beiträge, um ein attraktives Programm gestalten zu können. Bis zum 15. Februar hat man noch Zeit, seinen CfP einzureichen...
Dafür suchen wir noch Sponsoren, die uns den Abend-Event ermöglichen. Und natürlich suchen wir noch jede Menge Beiträge, um ein attraktives Programm gestalten zu können. Bis zum 15. Februar hat man noch Zeit, seinen CfP einzureichen...
... link (0 Kommentare) ... comment
Sunday, 20. July 2014
javatux, 23:00h
Das 17. Java Forum Stuttgart ist jetzt vorbei. Zeit, einen kleinen Rückblick zu ziehen über Themen und Trends im Java-Bereich.
Ein Thema war natürlich Java 8, das im März veröffentlicht wurde. Nach Java 5 von 2005 ist es das erste Release, das mit Lambdas, Interfaces mit Default-Implementierung oder Streams wieder mit Spracherweiterungen glänzt. Java FX hat mit Java 8 jetzt einen großen Sprung nach vorne gemacht nimmt mächtig Fahrt auf. Leider sind viele Projekte noch in Java 6 gefangen - aber man darf sich als Entwickler schonmal darauf freuen.
Im Web-Bereich geht der Trend eindeutig zu Javascript-Bibliotheken wie jQuery oder AngularJS. Auch ist der Trend zu Javascript als "Bytecode" (GWT, TypeScript, ...) erkennbar. Im Java-Bereich dagegen herrscht immer noch die Qual der Wahl bei den Web-UI-Frameworks: JFS, Vaadin, Wicket, ... - was nehm' ich denn nur?
Bei 1600 Teilnehmer war die Wahrscheinlichkeit relativ hoch, alte Bekannte zu treffen oder sich mit anderen Entwicklern auszutauschen. Dazu dienten auch die 2 BoF-Sessions, die abends stattgefunden haben. Alles in allem war es wieder eine schöne Veranstaltung und ich freue mich schon auf's nächste Jahr.
Ein Thema war natürlich Java 8, das im März veröffentlicht wurde. Nach Java 5 von 2005 ist es das erste Release, das mit Lambdas, Interfaces mit Default-Implementierung oder Streams wieder mit Spracherweiterungen glänzt. Java FX hat mit Java 8 jetzt einen großen Sprung nach vorne gemacht nimmt mächtig Fahrt auf. Leider sind viele Projekte noch in Java 6 gefangen - aber man darf sich als Entwickler schonmal darauf freuen.
Im Web-Bereich geht der Trend eindeutig zu Javascript-Bibliotheken wie jQuery oder AngularJS. Auch ist der Trend zu Javascript als "Bytecode" (GWT, TypeScript, ...) erkennbar. Im Java-Bereich dagegen herrscht immer noch die Qual der Wahl bei den Web-UI-Frameworks: JFS, Vaadin, Wicket, ... - was nehm' ich denn nur?
Bei 1600 Teilnehmer war die Wahrscheinlichkeit relativ hoch, alte Bekannte zu treffen oder sich mit anderen Entwicklern auszutauschen. Dazu dienten auch die 2 BoF-Sessions, die abends stattgefunden haben. Alles in allem war es wieder eine schöne Veranstaltung und ich freue mich schon auf's nächste Jahr.
... link (0 Kommentare) ... comment
Sunday, 6. July 2014
Disk-Crash auf Blogger.de
javatux, 23:24h
Letzten Monat gab es einen Festplatten-Crash auf Blogger.de. Während die Daten für diesen Blog hier wieder eingespielt werden konnten, fehlen Bilder und PDFs. Für die kaputte Festplatte wird wohl eine Datenrettung in Auftrag gegeben werden, sodass ich hoffe, dass die fehlenden Dateien im Verlaufe des Julis wieder auftauchen werden.
Bis dahin kann man sich evtl. mit dem Internet Archive behelfen, wenn man die Bilder oder Dateien zu einem bestimmten Blog-Eintrag braucht.
Bis dahin kann man sich evtl. mit dem Internet Archive behelfen, wenn man die Bilder oder Dateien zu einem bestimmten Blog-Eintrag braucht.
... link (0 Kommentare) ... comment
Tuesday, 6. May 2014
SQL-Statements loggen mit PatternTesting
javatux, 23:31h
Manche JDBC-Treiber erlauben es, dass SQL-Statements mitprotokolliert werden können. Was aber, wenn dies der Treiber im Projekt nicht kann? Dann gibt es die Möglichkeit auf PatternTesting auszuweichen. Dort gibt es seit 1.4.1 die Möglichkeit, über eine spezielle Proxy-URL einen ProxyDriver anzusprechen, der u.a. die Protokollierung der SQL-Anweisungen übernimmt.
Damit die SQL-Anweisung auch tatsächlich im Log erscheinen, muss der Log-Level für patterntesting.runtime.monitor.db auf DEBUG gesetzt werden. Als weiteres Schmankerl kann man die Anzahl der offenen Connections per JMX überwachen.
jdbc:proxy:hsqldb:mem:testdbSo sieht z.B. die Proxy-URL für eine HSQL-Datenbank aus. Der Unterschied zur normalen JDBC-URL von HSQL (jdbc:hsqldb:mem:testdb) ist nur der zusätzliche "...proxy:..."-Eintrag in der URL.
Damit die SQL-Anweisung auch tatsächlich im Log erscheinen, muss der Log-Level für patterntesting.runtime.monitor.db auf DEBUG gesetzt werden. Als weiteres Schmankerl kann man die Anzahl der offenen Connections per JMX überwachen.
Genaueres kann im PatternTesting-Wiki unter SQL Logging and Monitoring nachgelesen werden.
... link (0 Kommentare) ... comment
... older stories