Thema der Woche: JUnit 4.x

Dass JUnit 4 auf Annotationen baut, ist bekannt (Kurzeinführung). Weniger bekannt sind die anderen Features, die es zu Erarbeiten geht:

  • Überfliege die Neuerungen http://junit.sourceforge.net/README.html
  • Was ergibt assertEquals( 1, new Long(1) );?
  • Was macht @RunWith?
  • Wie stellt man Filters und Sorters ein? Wozu sind sie nützlich und was steckt im Paket org.junit.runner.manipulation?
  • Was ist und wie setzt assumeThat() sie um? Was ist das Hamcrest-Projekt und was für Hamcrest Erweiterungen gibt es?
  • Was ist eine Theorie?
  • Wie schreibt man parametrisierte Tests?

Alphanum Algorithm

Der Alphanum Algorithm bietet eine alternative (bessere?) Sortierung für Zeichenketten mit gemischten Zahlen an:

Traditional  Alphanum
z1.doc

z10.doc

z100.doc

z101.doc

z102.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z2.doc

z20.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc

z1.doc

z2.doc

z3.doc

z4.doc

z5.doc

z6.doc

z7.doc

z8.doc

z9.doc

z10.doc

z11.doc

z12.doc

z13.doc

z14.doc

z15.doc

z16.doc

z17.doc

z18.doc

z19.doc

z20.doc

z100.doc

z101.doc

z102.doc

Der Alg. ist für Java über den AlphanumComparator (LGPL) implementiert.

Fluent Interface-based API für Java Reflection: FEST-Reflect

FEST-Reflect is a Java library that provides a Fluent Interface-based API that simplifies the usage of Java Reflection, resulting in improved readability and type safety. It supports class loading, access to static inner classes constructors, methods and fields, and more!

Die Aufrufen sind dann hübsch kompakt:

Steht zur Compilezeit etwa

  String name = names.get(8);

wird mit FEST-Reflect daraus

  String name = method("get").withReturnType(String.class)
.withParameterTypes(int.class)
.in(names)
.invoke(8);

Ein paar weitere Beispiele:

  Person person = constructor().withParameterTypes(String.class)
.in(Person.class)
.newInstance("Yoda");

method("setName").withParameterTypes(String.class)
.in(person)
.invoke("Luke");

field("name").ofType(String.class)
.in(person)
.set("Anakin");

List<String> powers = field("powers").ofType(new TypeRef<List<String>>() {})
.in(jedi)
.get();

Ehrlicher Kommentar: "Swing 2: Pissing in the Wind"

Elliott Hughes hat unter http://elliotth.blogspot.com/2009/02/swing-2-pissing-in-wind.html einen ehrlichen (bösen) Kommentar zu Projekt Swing 2 abgegeben. Mit der Kritik kann ich im Wesentlichen anschließen. Vielleicht ist aus diesem Grund auf der Homepage http://kenai.com/projects/swing2/ auch noch kein einziger Topic aufgeführt und Quellcode verfügbar. War vermutlich nur ’ne verrückte Idee, denn ein Fork macht wenig Sinn und eine Intergration im Kern der Java SE ist nötig. Zum Weiterlesen über Swing 2:

Dead Code Detector (DCD)

Von der Webseite https://dcd.dev.java.net/:

If you are a developer or a team leader, Dead Code Detector (DCD) simply finds never used code in your Java/JEE applications. Deleting dead code helps to reduce cost of maintenance and to improve quality of code, and as a side effect it improves code coverage metrics of tests by deleting code that can’t be tested.  Provide a directory of compiled classes, a jar or a war file in the UI and DCD lists suspects of dead code. Dead code found can be private, package-private and even protected or public. Unread local variables, self assignments, toString on String and useless initializations are also detected. Please remember that dead code found by DCD is just suspects. DCD can not detect that reflection or other is used: ask to people who know your application and don’t complain if you don’t. You can read the usage manual to know how to launch and use DCD or check the FAQ if you have questions. The search is very fast (2000 classes/s on warm files) and made by static analysis of compiled classes without running the application or loading classes. DCD uses the library ASM (licence open source, BSD) from ObjectWeb/OW2 to do the job.

Die letzte Version ist DCD 1.1 und vom 13.2.2009. Das Tool lässt sich auch über Java Web Start starten:

https://dcd.dev.java.net/screenshot.png

PHP mit Quercus + Tomcat + Eclipse Java Web-Projekt

  1. Lade das WAR-Archiv http://quercus.caucho.com/download/quercus-3.2.1.war von http://quercus.caucho.com/.
  2. Packe der WAR-Archiv aus.
  3. Lege in Eclipse ein Dynamic Web Project (etwa unter dem Namen php) an.
  4. Verbinde es mit Tomcat. (Tomcat kann über Eclipse neuerdings auch automatisch heruntergeladen werden.)
  5. Kopiere aus dem ausgepackten Quercus-WAR das WEB-INF in das WEB-INF vom Eclipse-Web-Projekt (3 Jars in lib und web.xml)
  6. Kopiere images und index.php aus dem ausgepackten Quercus-WAR in WebContent
  7. Starte Tomcat in der Eclipse-View
  8. Gehe im Browser auf http://localhost:8080/php/

JRuby 1.2.0RC1 Released

Aus den News JRuby 1.2.0RC1 Released:

JRuby 1.2.0RC1 has fixed many many compatibility issues and continued to improve general performance. Highlights:
– Improved Ruby 1.9 support (via –1.9)
  – Compiler now works
  – Almost all of the missing 1.9 methods have been added
– New experimental –fast flag which does more aggressive optimizations
– Large scale compiler and runtime cleanup and performance audit
– Parsing is 3-6x faster now.
– Preliminary android support (Ruboto)
– Rails pathname issue fixed on Windows
– Major bug triage since last release
– 1052 revisions since 1.1.6
– 232 bugs fixed since 1.1.6

mobile.de nutzt also Tomcat, Spring und Freemarker

Aufruf von http://suchen.mobile.de/fahrzeuge/anbieter-521268-seite81-112.html

macro city [on line 30, column 9 in search/vlisting/listSearchResults.ftl] in user-directive city [on line 76, column 229 in search/vlisting/listSearchResults.ftl] in user-directive rd.html [on line 62, column 9 in search/vlisting/listSearchResults.ftl] ———- Java backtrace for programmers: ———- freemarker.template.TemplateException: Error executing macro: city required parameter: resultView is not specified. at freemarker.core.Macro$Context.sanityCheck(Macro.java:181) at freemarker.core.Macro$Context.runMacro(Macro.java:161) at freemarker.core.Environment.visit(Environment.java:537) at freemarker.core.UnifiedCall.accept(UnifiedCall.java:128) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.MixedContent.accept(MixedContent.java:92) at freemarker.core.Environment.visit(Environment.java:196) at freemarker.core.Case.accept(Case.java:80) at freemarker.core.Environment.visit

:

:

org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:542) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:200) at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:773) at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703) at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:895) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) at java.lang.Thread.run(Thread.java:619)

Wenn man in Google nach "org.springframework.web.servlet.view" sucht,  bekommt man auch noch mehr indexierte Webseiten, die diese Fehler aufweisen.

Java AMF Client aus BlazeDS ziemlich beschränkt

BlazeDS (http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/) ist

the server-based Java remoting and web messaging technology that enables developers to easily connect to back-end distributed data and push data in real-time to Adobe® Flex™ and Adobe AIR™ applications for more responsive rich Internet application (RIA) experiences.

Zunächst habe ich angenommen, das die API symmetrisch ist, also nicht nur Java auf der Serverseite das Protokoll VOLLSTÄNGIG implementiert, sondern auch auf der Clientseite. Ursprünglich gab es gar keine Java-Client-API, aber mit http://opensource.adobe.com/wiki/display/blazeds/Java+AMF+Client ist die Klasse http://livedocs.adobe.com/blazeds/1/javadoc/flex/messaging/io/amf/client/AMFConnection.html dazugekommen.

Using this feature, customers will be able to write and read AMF messages using Java on the client (i.e. no Flash player). This in turn will enable Java applications talk to AMF compliant servers such as BlazeDS, LCDS, or AMFPHP.

Beispiele, wie mit dieser API ein remote-Aufruf gemacht wird, zeigen etwa

  • http://www.infoaccelerator.net/blog/post.cfm/remoting-from-java-to-coldfusion-by-example
  • http://java.dzone.com/news/calling-flex-data-services-piv

Nun interessieren mit RCP-Aufrufe überhaupt nicht, viel interessanter fand ich Messaging-Möglichkeiten über RTMP (http://en.wikipedia.org/wiki/Real_Time_Messaging_Protocol). Doch das gibt es leider in BlazeDS nicht, wie die Doku schreibt:

What this feature is not: 1) It is not full implementation of BlazeDS Actionscript client libraries. It will strictly be a mirror of Flash player’s NetConnection but no Channels will be built on top of it. Similarly, no Consumer, Producer, etc. of BlazeDS will be implemented on top. 2) Flash player’s NetConnection supports RTMP. AMFConnection will not support RTMP, and hence the name AMFConnection instead of NetConnection.

Vielleicht wird ja http://www.osflash.org/red5 eine vollständige Java-Client-API für  RTMP anbieten.

Thema der Woche: Abdecker

Bei der Codeabdeckung geht es darum herauszufinden, wie viel Programmcode ein Test (etwa von JUnit) abläuft. Wirf einen Blick auf

Schreibe einen eigenen Testfall mit JUnit und suche eine Apache-Commons-Bibliothek mit Testfällen aus und lasse ein Coverage-Tool laufen.

http://www.atlassian.com/software/clover/ ist ein kommerziellen Tool. Finde heraus, was Clover im Gegensatz zu den freien Tools für Vorteile hat.

macwidgets – Collection of Mac style widgets written in Java

Gibt es unter http://code.google.com/p/macwidgets/. Von der Webseite:

Mac Widgets for Java are a collection of widgets seen in OS X applications, offered in a Java API. These widgets help Java developers create more Mac-like applications. There usage is not restricted to Mac though, as they will render across platforms.

Sieht nett aus und die API ist einfach zu nutzen.

Darauf hat die Welt gewartet: Wieder ein neues/altes Web-Framework

Apache Click http://incubator.apache.org/click/ heißt es und läuft ab Java 1.4. Super. Kommt damit 5 Jahre zu spät. Also nix mit Annotationen. Schön XML und so. (Click 0.3 gab es auch schon im März 2005, also ist das Projekt nicht wirklich jung.) Das Wort Ajax taucht auf den ganzen Webseiten nicht auf. Immerhin gibt es eine http://incubator.apache.org/click/docs/click-ide.html auf Eclipse 3.4 Basis. Toll die Antwort auf die Frage "Why develop a new Web Application Framework?" Antwort: "Because the existing frameworks did not meet my needs. Struts doesn’t really do much, while Tapestry is too complicated. For a more comprehensive answer please see Why Click." Klar, als ob es nur Struts und Tapestry gibt. Vor 10 Jahren vielleicht. Bei Struts 1.x ist die Zeit schon lange abgelaufen und bei Tapestry 5 hält man sich noch ein wenig mit DI/IoC über Wasser.

Buchkritik: Pragmatic Unit Testing in Java with JUnit

Andy Hunt, Dave Thomas. The Pragmatic Bookshelf. ISBN 0-9745140-1-2. September 2003. 146 Seiten
Kompaktes und nicht allzu tiefes Buch zu Testkonzepten und dem Testframework JUnit 3.x. Gut gefallen haben mir die Vorstellung des CORRECT-Prinzips (Conformance, Ordering, Range, Reference, Existence, Cardinality, Time), die Kurzvorstellung von Mock-Objekten (hier hätte ich mir allerdings etwas mehr Hinweise gewünscht, wobei immerhin Frameworks wie EasyMock zur Sprache kommen) und die Diskussion, wie die Testbarkeit das Systemdesign (positiv) beeinflusst. Die Codequalität ist in Ordnung, aber Anweisungen wie Integer.valueOf(val).intValue() hätte ich gerne als Integer.parseInt(val) gesehen, denn der Aufbau eines Wrapper-Objekts (lassen wir das Caching aus Java 5 außen vor) ist völlig unnötig (aber immerhin ist die Fabrikmethode noch besser als new Integer(val), denn sie kann immerhin auf die gecachten Wrapperobjekte im JDK zurückgreifen ). Die Namenskonvention von Sun hält der Autor bei Variablennamen nicht ein (argument_list, small_list, naughty_url, num_degrees), wobei er auch kein konsistentes Nicht-Einhalten betreibt (ingredientsText oder exitButton). Größtes Dilemma dieser Ausgabe ist aber ihr Alter, da nicht der JUnit 4.x-Zweig verwendet wird ebenso wenig wie Java 5, also keine Generics oder Annotationen. Mit der relativ flachen Beschreibung ist das Buch heute wenig attraktiv.

emite – Chat-Client und GWT XMPP Bibliothek

Eine tolle GWT-Anwendung/Bibliothek ist http://code.google.com/p/emite/:

Der Chat-Client läuft im Browser als GWT-Anwendung. Über einen Proxy kann dann der Client (Browser) direkt mit dem Xmpp Server sprechen. (Noch ist ein Proxy nötig, siehe http://ejohn.org/blog/cross-site-xmlhttprequest/). Das heißt, emite implementiert das Extensible Messaging and Presence Protocol (XMPP), um über Bidirectional-streams Over Synchronous HTTP (BOSH) die Daten zum Chat-Server zu senden. Da emite auf der einen Seite eine Bibliothek ist und auf der anderen Seiten ein Chat-Client mit der hübschen Gui, lässt sich die Bib. natürlich auch getrennt nutzen; eine Nachricht wird etwas so versandt:

Session session = Suco.get(Session.class);
session.login(XmppURI.uri("me@domain", "myPassword");
Message message = new Message("send this");
session.send(message);

Intern setzt emite auf http://code.google.com/p/suco/ auf. Suco ist ein einfaches DI-Framework für GWT-Applikationen zusammen mit einem Eventing-Framework. (Suco ist nicht Annotationsgetrieben, da kein echtes Reflection mit GWT möglich ist. Mit einem speziellen Builder könnte man da aber was machen. Hm…)

GWT API’s for SmartClient

SmartClient Ajax (http://www.smartclient.com/) ist eine (weitere) Ajax-Bibliothek für RIA-Anwendungen. Die Demos unter http://www.smartclient.com/index.jsp#_Welcome zeigen auch, was man heute von RIA-Frameworks erwartet: Nette Komponenten, Layout-Manager und Data-Binding über diverse Datenquellen. Es geht nicht nur um hübsche Widgets allein und die Optik ist auch nur OK. (Obwohl http://extjs.com/ in meinen Augen immer noch aus optischen Gründen vorne liegt, hat doch SmartClient Ajax einen sehr großen Vorteil: SmartClient Ajax platform now open source under LGPL. Ext JS ist, wenn man es denn kommerziell einsetzten möchte, nicht ganz billig.)

Für die JS-Library gibt es mit http://code.google.com/p/smartgwt/ auch eine GWT-Wrapper SmartGWT. Der Showcase liegt unter http://www.smartclient.com/smartgwt/showcase/, die JavaDoc unter http://www.smartclient.com/smartgwt/javadoc/. SmartGWT liegt wie auch SmartClient Ajax unter der LGPL. Der Port ist mehr oder weniger die (Fleiß)Arbeit einer Person Sanjiv Jivan. Die folgenden Screenshots stammen aus seinem Blog http://www.jroller.com/sjivan/entry/smartgwt_1_0_released:

Miller Columns

Filter Builder

NetBeans 7.0 Roadmap und NetBeans 7.0M1/M2

Die Roadmap sieht so aus:

NetBeans Roadmap

Der Development Plan spricht vom 22. Juni, dann soll die finale Version kommen.

Mit NetBeans 7.0M2 ist auch die zweite Version aus dem 7er-Zweig raus.

  • Milestone 1: NewAndNoteworthyMilestone1NB70
  • Milestone 2: NewAndNoteworthyMilestone2NB70
  • Ein paar Impressionen aus den M1 und M2:

    Verbesserte Maven-Unterstützung (super, wo doch jetzt Ivy immer mehr zur Alternative fürs dependency management (nicht builds!!) wird). In den Dialogen, Vervollständigung, Web-Services, …

    cos.jpg

    add-dep.jpg

    generate_code.jpg

     

    worthy-maven-generate.png

     

    worthy-maven-completion.png

    Viele Neuerungen aus dem PHP-Projekt (netbeans php blog)

    Und Ruby

    Aktualisierung auf JS 1.7

    http://blogs.sun.com/tor/resource/wrong-yield.png

    http://blogs.sun.com/tor/resource/yield-ok.png

     

    http://blogs.sun.com/tor/resource/e4x-completion.png

    Komlettes Redesign unter Mac OS

     

    maclaf.png

    Bessere Unterstützung fürs Profiling:

     

    FitnessViaPartnership/profileme.png

    SVG-Komponenten in NB Mobility

    VMD.png

    Von jHat eine interessante Unterstützung, um im Speicherbaum zumzusuchen.

    OQL_code_completion.png

    Bei der C++-IDE: Unterstützung zum Bau vom Qt-Applikationen, Macro-Expansion (Tooltip), Tastaturvervollständigung, Setter/Getter bauen.

    Vervollständigung bei Grails:

    worthy-groovy-editordynamic.png

    Insgesamt viele Änderungen, wobei die meisten Sachen nicht in der Java-IDE selbst passieren, sondern im Tooling  und in anderen Sprachen.

    Video: Java 7, Modularisierung, Jigsaw, was kommt, was geht, 2010

    Mark Reinhold spricht über Java 7

     

    Geplante Änderungen:

    Wird (wohl) nicht in Java 7 kommen wird:

    • Closures
    • Reified Generics
    • First Class Properties
    • Überladene Operatoren
    • BigDecimal Syntax
    • JSR 295: Beans Binding

    Der Hammer: Java 7 wird Anfang  2010 erwartet.

    Wer mal was inspirierendes hören möchte: Unter http://channel9.msdn.com/posts/Charles/C-40-Meet-the-Design-Team/ sprechen C#-Macher Anders Hejlsberg und weitere C#-Experten über die Zukunft von C# und .NET, insbesondere im Kontext dynamischer Sprachen. Hier läuft man meilenweit vor Java; und das Interview ist schon 1 Jahr alt… Unter http://code.msdn.microsoft.com/csharpfuture geht’s es dann mit ein paar Links zur C# 4 und Ideen zu C# 5 weiter.

    Linux Tools Project

    Dass Linux Tools Project fasst verschiedene Projekte wie automake, Valgrind, Systemtrap-Editoren zur Linux-Entwickung zusammen. Von der Eclipse-Webseite:

    The Linux Tools project aims to bring a full-featured C and C++ IDE to Linux developers. We build on the source editing and debugging features of the CDT and integrate popular native development tools such as the GNU Autotools, Valgrind, OProfile, RPM, Systemtap, etc. Current projects include Autotools build integration, a Valgrind heap usage analysis tool, and an OProfile call profiling tool.

    Drei Scrrenshots von New and Noteworthy:

    New OProfile View UI

    Thema der Woche: Pfuschen erwünscht

    In der C-Welt gibt es bisher Wettbewerbe für das verpfuschteste Programm (http://www.ioccc.org/). Unter Java gibt es bisher diesen Obfuscated Contest nicht. Aufgabe: Schreibe nach den offiziellen C-Pfusch-Regeln

    • To write the most Obscure/Obfuscated [C] program under the rules below.
    • To show the importance of programming style, in an ironic way.
    • To stress [C] compilers with unusual code.
    • To illustrate some of the subtleties of the [C] language.
    • To provide a safe forum for poor [C] code. 🙂

    ein Java-Programm. Beispiel:

    class _{static long _
    (long __,long  ___) {
    return __==0 ?___+ 1:
    ___==0?_(__-1,1):_(__
    –1,_(__, ___-1)) ;  }
    static  {int _=2 ,___
    = 2;System.out.print(
    "a("+_+‘,’+___+ ")="+
    _ (_,  ___)) ;System.
    exit(1);}}//(C)tutego

    Ich bin gespannt auf das beste (also schlechteste) Java-Programm…