Autor: Christian Ullenboom
GWT: Eyes, Ears, Guns – wie man mit CSS3/HTML5 Quake baut und einen C-64 SID Emulator
Last.fm nutzt Java mit Tomcat und HornetQ (JMS) im Backend
Interessant zu lesen, wie Last.fm Java (und auch C++) in ihrem Backend nutzt: http://java.dzone.com/articles/case-study-how-lastfm-uses. HornetQ ist die JMS-Implementierung von JBoss 6.
Stirb Google Wave?
Gerade habe ich http://news.cnet.com/8301-13860_3-20012698-56.html?tag=cnetRiver gelesen. Krass. Möglicherweise steckt Google die Energie in eine Facebook-Alternative. Ich hoffe doch zumindest, das Google die GWT-Komponenten quelloffen machen.
Übersicht aller Android-Phones
unter http://www.androphones.com/2010-android-phones.php. Schöne Webseite.
Commons Lang 3.0 in Beta und (endlich) angepasst auf Java 5
Aus http://commons.apache.org/lang/article3_0.html:
What’s new in Commons Lang 3.0?
Commons Lang 3.0 is (not yet) out, and the obvious question is: "So what? What’s changed?".
The big story
Lang is now Java 5 based. We’ve generified the API, moved certain APIs to support
varargs
and thrown out any features that are now supported by Java itself. We’ve removed the deprecated parts of the API and have also removed some features that were deemed weak or unnecessary. All of this means that Lang 3.0 is not backwards compatible.To that end we have changed the package name, allowing Lang 3.0 to sit side-by-side with your previous version of Lang without any bad side effects. The new package name is the exciting and original
org.apache.commons.lang3
.There are also, as you’d expect, new features, enhancements and bugs fixed.
The build
We built 3.0 using Maven 2.2.1 and Java 1.5. Needs confirmation before release of actual build details
Migrating from 2.x
Despite the label of backwards incompatibility, in the vast majority of cases the simple addition of a
'3'
to an import statement will suffice for your migration. For example, using Perl:find . -type f -name ‚*.java‘ | xargs perl -pi -e ’s/org\.apache\.commons\.lang\./org.apache.commons.lang3./g‘
Maven users will need to update the groupId from
commons-lang
toorg.apache.commons
, and the artifactId fromcommons-lang
tocommons-lang3
.What’s gone?
Enum package – Java 5 provided enums out of the box, therefore we dispensed with both the deprecated enum package, and the enums package. Instead you should migrate over to the standard Java enum. An EnumUtils class has been born from the ashes of the old code, focused on providing additional functionality to the standard Java enum API.
NestedExceptions – In Java 1.4, the notion that all Throwables could be linked to a cause was introduced. In Lang we had provided a NestedException framework to support the same feature, and now that we’re jumping from Java 1.3 to Java 5 we are remove this feature. The deprecation section below covers one part of ExceptionUtils that remains until we are on Java 6, where the last remaining parts of the JDK appear to have embraced the new cause API.
JVMRandom – This class was introduced in Lang 2.0 to support a Random object built around the system seed. This proved to be both an uncommon use case and one with bugs and so was dropped.
StringEscapeUtils.escapeSql – This was a misleading method, only handling the simplest of possible SQL cases. As SQL is not Lang’s focus, it didn’t make sense to improve this method.
Various Exception classes were removed – the lesson in defining more semantically relevant exception classes is that you can keep on coming up with more and more new classes. Simpler to focus on using the main JDK classes.
The various Range classes in the
math
package were removed in favour of a new Range class.All deprecated fields/methods/classes – with a new major version, all of the previously deprecated parts of the API could finally go away.
If you feel that something was unfairly taken away, please feel free to contact the list. In many cases the possibility exists to reintroduce code.
Deprecations
The lone deprecation in 3.0 is that of the notion of ‚cause method names‘ in ExceptionUtils. In Java 5.0 it is still just about needed to handle some JDK classes that have not been migrated to the getCause API. In Java 6.0 things appear to be resolved and we will remove the related methods in Lang 4.0.
New packages
Two new packages have shown up. org.apache.commons.lang3.concurrent, which unsurprisingly provides support classes for multi-threaded programming, and org.apache.commons.lang3.text.translate, which provides a pluggable API for text transformation.
TODO: Add examples
New classes
CharSequenceUtils
EnumUtils
Pair
Range
builder.Builder
exception.ContextedException
exception.CloneFailedException
reflect.ConstructorUtils
reflect.FieldUtils
reflect.MethodUtils
reflect.TypeUtils
text.WordUtils
New methods
What’s fixed in Lang 3.0?
Weitere Änderungen: http://commons.apache.org/lang/upgradeto3_0.html.
So und wann kommt nun Common Collections für Java 5?
Eclipse WTP 3.2.1 Update mit JAXB Generator und vielen weiteren Neuerungen
Die Eclipse Web Tools Platform ist in der Version 3.2.1. Neben den Java EE , JSF 2.0 Updates, Tomcat 7 Support, JAX-RS Wizards, XPath-View ist auch ein JAXB Schema Generator mit dabei:
JAXB XML Schema Generation
- Dali has added JAXB Schema Generation support to WTP. You can now generate an XML Schema (XSD) for a chosen set of JAXB mapped Java classes in your workspace. Use the "New" wizard at the Workspace, Project, or Package level to access the "JAXB->Schema from JAXB Classes" wizard.

Select the classes that you want to use for schema generation. Select a project, package, or just individual classes.

JAXB Class Generation
- Dali has added JAXB class generation support to WTP. Users can now generate classes for a given XML schema (XSD) in their workspace. Use the "Generate" context menu on any schema in a Java project to invoke the wizard.


Nette Sachen dabei, schaut rein:
Lebenszyklus in Google Guice einführen
Wenn man von Spring kommt ist man gewöhnt, dass es ein Lebenszyklus gibt insbesondere mit
- @PostConstruct
Standardmäßig gibt es das mit Guice nicht und das ist ziemlich ungünstig, insbesondere wenn man Spring-Projekte migrieren möchte. (Siehe Diskussion http://code.google.com/p/google-guice/issues/detail?id=62)
Allerdings gibt es http://code.google.com/p/guiceyfruit/. Das bildet den Lebenszkylus, vorgeschrieben durch Annotationen (http://code.google.com/p/guiceyfruit/wiki/Annotations), nach. Es wird einfach als Modul mit hinzugenommen, etwa so:
Injector injector = Guice.createInjector( new Jsr250Module(), new MEINModule() );
Mit paketsichtbaren Methoden gibt es aber Probleme: Sie müssen public sein.
2010 JVM Language Summit Wiki und Folien
gibt es hier: http://wiki.jvmlangsummit.com/Main_Page
null/NullPointerException in anderen Programmiersprachen: Ruby, nil, Scala, Option, None, Some
Ist Java eine pure objektorientiere Programmiersprache? Nein, da Java einen Unterschied zwischen primitiven Typen und Referenztypen macht. Nehmen wir für einen Moment an, dass es primitive Typen nicht gibt. Wäre Java dann eine reine objektorientierte Programmiersprache, bei der jede Referenz ein pures Objekt referenziert? Die Antwort ist immer noch nein, da es mit null etwas gibt, mit dem Referenzvariablen initialisiert werden können, aber was kein Objekt repräsentiert und keine Methoden besitzt. Und das kann bei der Dereferenzierung eine NullPointerException geben.
Neue Programmiersprachen gehen da etwas andere Wege und null-Referenzierungen sind nicht möglich. In der Sprache Ruby zum Beispiel ist immer alles ein Objekt. Wo Java mit null ein „nicht belegt“ ausdrückt, macht das Ruby mit nil. Der feine Unterschied ist, dass nil ein Exemplar der Klasse NilClass ist, genau genommen ein Singleton, was es im System nur einmal gibt. nil hat auch ein paar öffentliche Methoden wie to_s (wie Javas toString()), was dann einen leeren String liefert. Mit nil gibt es keine NullPointerException mehr, aber natürlich immer noch einen Fehler, wenn auf diesem Objekt vom Typ NilClass eine Methode aufgerufen wird, die es nicht gibt.
In Objective-C, der Standardsprache für iPhone-Programme, gibt es das Null-Objekt nil. Üblicherweise passiert nicht, wenn eine Nachricht an das nil-Objekt gesendet wird; die Nachricht wird einfach ignoriert.[1] Es gibt Programmiersprachen, die noch etwas anders an das null-Problem herangehen. Bei der JVM-Sprache Scala gibt es für den Wert null einen eigenen Typ, nämlich Null. (Null erbt von AnyRef – was wiederum von Any erbt, dem absoluten Basistyp – und Null hat sogar mit Nothing einen Untertyp). Allerdings wird Scalas null nicht so wie Rubys null genutzt sondern entspricht Java null: Der Versuch, eine genullte Variable zu dereferenzieren, führt zu einer NullPointerException. Anders gesagt: Scala führt für null einen Typ ein, aber eine NullPointerException ist immer noch nicht passé. Statt aber in Scala null zurückzugeben, nutzen Programmierer etwas anderes: eine Option. Die Klasse Option repräsentiert optionale Werte und kommt in zwei Ausprägungen: Some und None (entspricht Rubys nil). Statt dass wie in Java eine Methoden eine Referenz direkt zurückgibt, geben Scala-Methoden etwas vom Typ Option zurück, und das heißt, entweder ein None- oder Some-Objekt. Das Some-Objekt ist ein Behälter und speichert die eigentliche Referenz. Eine Methode mit Option-Rückgabe sieht etwa so aus: if ( WertUngleichNull ) Some(Wert) else None. Mit dem parametrisierten Konstruktor Some(Wert) kommt der Wert in das Some-Objekt. Empfängt der Aufrufer die Rückgabe, kann er am Typ erkennen, ob die Operation erfolgreich war oder nicht. Das ist jedoch nicht, wie eine Option üblicherweise in Scala eingesetzt wird. Denn Option-Objekte (und somit Some oder None) besitzen eine Methode getOrElse(), sodass sich für eine Rückgabe result vom Typ Option schreiben lässt: result.getOrElse(alternativerWert). Repräsentiert result ein Some-Objekt, so liefert die Implementierung von getOrElse() den gespeicherten Wert, ist es None, so liefert die Implementierung das Argument als Rückgabe. Spontan hört sich das jetzt noch nicht so wahnsinnig innovativ an, aber interessant wird die Option durch die Tatsache, dass Scala sie an verschiedenen Stellen intern in den Klassenbibliotheken einsetzt. Das liegt dran, dass die Option-Klasse an die 30 Methoden deklariert und viele der Methoden etwa bei Operationen auf Datenstrukturen aufgerufen werden. Wenn zum Beispiel auf allen Elementen der Liste eine Transformation durchgeführt werden soll, und ein None-Objekt befindet sich in der Liste, passiert beim Aufruf der Transformationsmethoden auf dem None-Objekt nichts, denn dort ist die Implementierung einfach leer.
[1] Es gibt auch Compiler wie der GCC, der mit der Option -fno-nil-receivers dieses Verhalten abschaltet, um schnellere Maschinencode zu erzeugen. Denn letztendlich muss in Maschinencode immer ein Test stehen, der auf 0 prüft.
Java 7 Build 102
http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html
Für ARM wurden noch einige Anpassungen vorgenommen: http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/c4d60bcce958, http://hg.openjdk.java.net/jdk7/jdk7/jdk/rev/425960cef714
Neue Methoden sind weiterhin für Surrogate in Character: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6933322
Flamingo 5.0 Imogene–Updates und neue Komponenten
Erinnerung: iText ist Affero GPL Lizenz
In the end of 2009, iText version 5 is released under Affero GPL license. This license is drastically different from the previous license that iText had been
distributed under, in that it requires anyone using iText 5 under a free license to provide the users with the full source of their application. Projects that do not want to provide their source code are required to purchase a commercial license for a non-disclosed price or they cannot upgrade to iText 5. (Projects can continue using previous versions of iText under the more liberal license without any changes.)
Siehe auch:
- http://itextpdf.com/terms-of-use/
- http://itext-general.2136553.n4.nabble.com/Silent-license-change-td2156060.html
- Dazu auch http://java.dzone.com/tips/java-pdf-tools-alternatives und Brunos Bemerkungen. Und alles Gute für einen Sohn.
Sieben XStream Tipps
1. XML-Prolog schreiben
Das kann XStream nicht, aber beim Lesen wird der XML-Prolog überlesen. Man muss den Prolog also von Hand in den Strom schreiben:
Writer w = new OutputStreamWriter(
new BufferedOutputStream(
new FileOutputStream( file ) ), „utf-8“ );
w.write( „<?xml version=\“1.0\“ encoding=\“utf-8\“?>\n“ );
xstream.toXML( value, w );
w.close();
2. Statt voll qualifizierte Klassenamen kann ein anderer Name mit alias() auf dem XStream-Objekt gesetzt werden.
xstream.alias( „Course“, Course.class );
xstream.alias( „Contact“, Contact.class );
3. Statt geschachtelte Elemente sollen gewisse Dinge in Attributen stehen:
xstream.useAttributeFor( TrainerCourse.class, „price“ );
xstream.useAttributeFor( TrainerCourse.class, „languages“ );
4. Statt Elemente von Sammlungen in ein eigenes Container-Element zu setzen, kann das auch ohne Überelement gesetzt werden:
xstream.addImplicitCollection( Trainer.class, „trainerCourses“ );
5. Gewisse Dinge sollen anders geschrieben werden. Konverter sind angebracht:
xstream.registerConverter( new TrainerCourseConverter() );
xstream.registerConverter( new YYYYMMDDConverter() );
Konverter können ganz eigenständig entwickelt werden (1. Bsp.), oder eine Basisklasse (2. Bsp.) vereinfacht das:
class TrainerCourseConverter implements Converter
{
@Override
public void marshal( Object value, HierarchicalStreamWriter writer, MarshallingContext arg2 )
{
TrainerCourse tc = (TrainerCourse) value;
writer.addAttribute( „courseCode“, c.getCourseCode() );
}
@Override
public Object unmarshal( HierarchicalStreamReader arg0, UnmarshallingContext arg1 )
{
…
}
@SuppressWarnings( „unchecked“ )
@Override
public boolean canConvert( Class clazz )
{
return clazz.equals( TrainerCourse.class );
}
}
Zweiter einfacher Konverter:
class YYYYMMDDConverter extends AbstractSingleValueConverter
{
@SuppressWarnings( „unchecked“ )
public boolean canConvert( Class clazz )
{
return clazz.equals( Date.class );
}
@Override
public Object fromString( String str )
{
return StringUtils2.isEmpty( str ) ? null : DateUtils.parseDDMMYYYY( str );
}
@Override
public String toString( Object obj )
{
return obj == null ? „“ : DateUtils.formatDDMMYY( (Date) obj );
}
}
6. Elemente mit bekannten Namen sollen in einer CDATA-Umgebung geschrieben werden:
xstream = new XStream( new XppDriver() {
public HierarchicalStreamWriter createWriter( Writer out ) {
return new PrettyPrintWriter( out ) {
boolean isCDATA = false;
@SuppressWarnings( „unchecked“ ) @Override public void startNode( String name, Class clazz ) {
super.startNode( name, clazz );
isCDATA = name.equals( „contents“ ) || name.equals( „description“ );
}
@Override protected void writeText( QuickWriter writer, String text ) {
if ( isCDATA ) { writer.write( „<![CDATA[\n“ ); writer.write( text ); writer.write( „\n]]>“ ); }
else super.writeText( writer, text );
}
};
}
} );
7. XStream soll XML-Dateien selbst laden und speichern (http://xstream.codehaus.org/persistence-tutorial.html)
Verwaltet man viele kleine XML-Dokumenten, etwa Kontakte, kann XStream diese XML-Kontakt-Dateien automatisch anlegen, lesen und aktualisieren. Der Tick ist, dass man alle Daten in eine spezielle Map, Set oder List setzt. Die XStream-Implementierungen der add(), put(), get(), … Methoden sind so realisiert, dass die Daten beim add()/put() in die Datenstruktur und gleichzeitig XML-serialisiert als Datei ins Dateisystem kommen. In welches Verzeichnis sagt die FilePersistenceStrategy.
PersistenceStrategy strategy = new FilePersistenceStrategy(new File(„/tmp“));
Map map= new XmlMap( strategy );
Die Dateinamen sind etwas merkwürdig, etwa long@12345676, aber dass ist kein Wunder, denn der Dateiname kodiert den Schlüssel, denn XStream muss ja bei einem get() etwa die XML-Datei wiederfinden.
Neue Spezifikation von ARM-Blöcken in Java 7
http://blogs.sun.com/darcy/entry/project_coin_updated_arm_spec
Das ganze ließt sich jetzt schon wie ein Text aus der JLS. (Was im Übrigen für einige andere Neuerungen in Java 7 noch aussteht.)
Apropos: Collection-Litarale sehe ich immer noch nicht, und es gibt ganz schön Haue bei den Closures. Bis September ist nicht mehr viel Zeit. Unterstriche in große Zahlen soll ja wohl nicht alles gewesen sein…
Build 100 von Java 7
- http://dlc.sun.com.edgesuite.net/jdk7/binaries/index.html
- http://download.java.net/jdk7/changes/jdk7-b100.html
Interessant aus der Sicht der Sprache ist
- 46cf751559ae. 6945418. Project Coin: Simplified Varargs Method Invocation
und von den Libs
- 38fd32b8e990. 6869741. Integrate JAX-WS 2.2 and JAXB 2.2 in JDK 7
Arbeit an JUnit 4.9 läuft
http://github.com/KentBeck/junit/downloads (Das ist jetzt allerdings schon 2 Monate alt und im Moment hängt die Version 4.9 etwas.)
Links:
- JUnit 4.9 SuiteBuilder: http://marcphilipp.tumblr.com/post/594982013/combining-suitebuilder-and-classpathsuite-mo-power
- Schön zu sehen, dass die Ideen auf Johannes Link zurückgehen: http://johanneslink.net/projects/cpsuite.jsp
Heise mobil gibt Überblick über 11 Android Smartphones
Unter http://www.heise.de/mobil/artikel/Elf-Smartphones-mit-Android-ab-160-Euro-1026810.html. Unter Anderem:
- Acer beTouch E110
- Google Nexus One
- HTC Desire
- HTC Legend
- LG GT540
- LG GW620
- Motorola Backflip
- Motorola Milestone
- Samsung I5700 Galaxy Spica
- Sony Ericsson Xperia X10
- Sony Ericsson Xperia X10 mini
Für Android-Schulungen siehe http://www.tutego.de/seminare/java-schulung/Android-Schulung-Google-Android-Kurs.html.
Android-Anwendungen zusammenklicken
http://appinventor.googlelabs.com/about/ schreibt heute von einer Möglichkeit, Android-Apps zuzusammenzuklicken:
Die Musik ist eigentlich am Besten…
Das ganze ist noch nicht für alle – eine Voranmeldung ist nötig.
Der App Builder nutzt unter anderen:
The blocks editor uses the Open Blocks Java library for creating visual blocks programming languages. Open Blocks is distributed by the Massachusetts Institute of Technology’s Scheller Teacher Education Program and derives from thesis research by Ricarose Roque. We thank Eric Klopfer and Daniel Wendel of the Scheller Program for making Open Blocks available and for their help in working with it. Open Blocks visual programming is closely related to the Scratch programming language, a project of the MIT Media Laboratory’s Lifelong Kindergarten Group.
The compiler that translates the visual blocks language for implementation on Android uses the Kawa Language Framework and Kawa’s dialect of the Scheme programming language, developed by Per Bothner and distributed as part of the Gnu Operating System by the Free Software Foundation.
Buchkritik: Java Extreme Programming Cookbook
Eric M. Burke, Brian M. Coyner. O’Reilly. ISBN 0-596-00387-0. März 2003. 288 Seiten
Viele XP-Bücher konzentrieren sich auf die „menschliche“ Seite der XP-Entwicklung, aber nicht auf die Tools, die bei der XP-Entwicklung einen großen Stellewert einnehmen. Diese Lücke versucht das Buch mit einer Vorstellung der Tools und Technologien zu füllen, die Anfang 2000 von Bedeutung waren: EJB 2, JUnit 3, CVS. Dumm ist nur, dass die Technologien und Tools heute an Bedeutung verloren haben und durch neuere Produkte ersetzt wurden, sodass auch das Buch heute nicht mehr sonderlich spannend ist und als veraltet gelten kann. Java EE 5 (bzw. Java EE 6) ersetzen für Enterprise-Produkte die J2EE 1.4, JUnit 3 ersetzt heute JUnit 4, Cactus (http://jakarta.apache.org/cactus/) wird nicht mehr weiterentwickelt, und Subversion ersetzt CVS. Für ein Buch, das es nicht nur bei den Konzepten belässt, sondern auch technisch tiefer geht ein Problem. Weiterhin ist die ausschließliche Betrachtung von Open Source etwas einschränkend. (Und der Titel des Buches ist nicht „Java XP Programming Cookbook with Open Source Tools“!) Es ist zwar toll, dass Open-Source Produkte nichts kosten und auch sehr verbreitet sind, aber Hersteller wie Atlassian bieten sehr gute Projekte, die bei der XP-Entwicklung helfen. Weiterhin fehlen in meinen Augen einige zentrale Tools, und es reicht nicht, XP auf Ant, JUnit (zzgl. HttpUnit, JUnitPerf), Mocking, XDoclet zu beschränken. Hier gibt es bessere Bücher. Februar 2009