Thema der Woche: Java Sicherheit und Angriffe

Zur Vorbereitung

  • Suche über die Nutzung von Escape Sequences \uxxxx im Internet und wo sie im Java-Programmcode überall genutzt werden können.
  • Lies über die Methode exec() von Runtime und den ProcessBuilder.
  • Lies über den Klassenlader und Klassenladehierarchien.
  • Mit der Java Compiler API lässt sich ein Java-Programm aus einem anderen Java-Programm heraus übersetzen. Wie sieht die API aus? Seit wann gibt es sie?

http://www.blackhat.com/presentations/bh-usa-09/WILLIAMS/BHUSA09-Williams-EnterpriseJavaRootkits-PAPER.pdf ist ein schöner Artikel, wie Entwickler den Quellcode kompromittieren können, um “böse” Sachen anzustellen. Zwar ist die Information über den Java-Compiler, den der Tomcat nutzt, nicht korrekt, aber Jeff Williams fasst wunderbar verschiedene Angriffsfälle zusammen.

Lies den Text und beantworte folgende Fragen:

  • Welcher Annahme im Programm bei “Abusing the JSP Compiler” wird gemacht? Ist das Beispiel realistisch?
  • Wie lässt es sich verhindern, dass man private Attribute auslesen kann? Lässt sich das in der Praxis realisieren?
  • Was ist BCEL? Seit wann und warum integriert das JDK BCEL?
  • Gibt es Unternehmen (in Deutschland), die Code Audits durchführen? Auch von bekannten Open-Source Libraries?

Wer weiter Interesse an dem Thema hast, kann sich http://www.blackhat.com/presentations/bh-usa-09/WEBER/BHUSA09-Weber-UnicodeSecurityPreview-SLIDES.pdf anschauen.

Labels:

Thema der Woche: “Sicheres” Programmieren

Studiere im Artikel http://java.sun.com/security/seccodeguide.html die Guidelines 0 bis 5.

Gib für alle einzelnen Tipps ein alternatives Beispiel. (Aufgabe für 2 Wochen.)

Labels:

Thema der Woche: MVC/MVP

Lies die Einträge

und skizziere kurz die Unterschiede zwischen den beiden Gui-Pattern MVC und MVP.

Skizziert http://www.c-sharpcorner.com/UploadFile/OVZh/Introducing_MVCSharp_framework03062008064516AM/Images/Untitled-2.gif den Unterschied? Was hat das allen mit Testen zu tun?

Das MVP ist weiterhin gültig, aber der Name hat sich etwas verändert. Erkläre das am Beispiel des Diagramms http://geekswithblogs.net/dchristiansen/archive/2007/12/07/microsoft-patterns-and-practices-team-release-the-model-view-presenter.aspx.

Schreibe ein Beispielprogramm.

  • Eine Maske soll nach dem Benutzernamen und Passwort fragen.
  • Ein Fake-Login-Service soll eine bekanntes Username/Passwort-Pärchen authentifizieren. Sind die Werte korrekt, soll eine einfache Meldung erscheinen und der Dialog geschlossen werden.
  • Schreibe einen JUnit-Testfall

Labels:

Thema der Woche: Ladebalken über dem Textfeld

Mit JXLayer (https://jxlayer.dev.java.net/) lassen sich beliebige Swing-Komponenten mit anderen Swing-Komponenten (oder Zeichnungen) auf eine Ebene legen und somit interessante Effekte und Lösungen entwerfen.

  1. Schreibe eine kleine Swing-Anwendung mit einem Textfeld und einer Schaltfläche. Wird die Schaltfläche gedrückt soll ein Web-Server kontaktiert und die Daten von dort geladen und in das Textfeld gesetzt werden.
  2. Das Laden soll künstlich verzögert werden. Schreibe einen eigenen ThrottleReader, der den FilterReader erweitert und deine künstliche Verzögerung einführt.
  3. Beim Laden soll nun ein (indefinite) Fortschrittsbalken mit JXLayer über dem Textfeld erscheinen, der dann ausgeblendet wird, wenn der Text geladen wurde.
  4. Überlege, wie sich der Fortschnitt des Fortschrittsbalken bestmöglich an der Anzahl geladenen Zeichen festmachen lässt.

Labels:

Thema der Woche: Checked Excpetion vs. Unchecked Exception

Java unterscheidet Checked von Unchecked Excecption.

Labels:

Thema der Woche: Programmieren mit einem bisschen Geo

Schreibe eine Klasse Location, die longitude und latitude speichert. Die Attribute sind vom Type double. Gib Setter/Getter an und einen Standard- und parametrisieren Konstruktor. Die Klasse Location soll die Abstands-Utility-Funktionen aus http://www.tutego.de/blog/javainsel/2009/09/latitudelongitude-distance-in-java.html bekommen.

Die Klasse Locations soll beliebig viele Location-Objekte speichern können. Dazu ist eine addLocation()-Methode nötig, die einen Ort als String mit einer Location annimmt und in eine intern Datenstruktur übernimmt. addLocation() soll überladen sein, dass man einmal den Ort über ein Location-Objekt bestimmt und einmal über Longitude und Latitude. Eine toString()-Methode soll angeben, wie viele Orte enthalten sind. Eine Methode Location findLocation(String location) soll die Location für einen Ort zurückgeben. Schreibe eine Methode List within(Location loc, double radius) Methode, die alle Orte liefert, die nicht weiter als radius von dem Ort entfernt sind. Nutzt die passende statische Funktionen aus Location für den Abstand! Nimm eine überladene Methode within() hinzu, die eine maximale Anzahl Elemente in der Rückgabeliste bestimmt.

Schreibe eine Klasse LocationApplication mit einem main(). Füge einige Location-Objekte ein und teste die Bereichsabfrage.

Eine Klasse LocationRepository soll zwei statische Methoden enthalten: Locations loadLocations() und void saveLocations(Locations locations). Die Methoden sollen Locations aus einer Text-Datei lesen und schreiben können. Nutze dazu beliebige Geokoordinaten. Das Dateiformat kann frei bestimmt werden.

Passe die Methode within() an, so dass die Liste sortiert ist nach dem Abstand zum Anfrageort. Schreibe dazu einen DistanceComparator und nutze die Collections.sort()-Methode.

Modelliere mit NetBeans eine grafische Oberfläche, mit zwei Reitern (JTabbedPane). In dem ersten Reiter soll man drei Textboxen haben für Ort, Longitude, Latitude und einen „Hinzufügen“ Button. Damit sollen neue Orte dem Locations hinzugefügt werden. Auf dem zweiten Reiter soll der Anwender Abfragen vornehmen können. Eine Eingabezeile für ein Ort (oder Longitude, Latitude) und Radius soll zu max. 10 Ergebnissen führen.

Zusatzaufgabe: Installiere Google Earth. Bei einer Bereichsabfrage erzeugte eine KML-Datei mit allen Ergebnissen. Diese Datei soll beim Start von Google Eath als Startparameter mitgegeben werden. Externe Programme startet man mit dem ProcessBuilder. Die Insel gibt ein Beispiel für diese Klasse.

Labels:

Thema der Woche: Repository-Pattern in DDD und DAO

Zur Abstraktion von Zugriffen auf konkreten Datastores (oft eine relationale Datenbank) haben sich DAOs (http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html) etabliert. Im Domain Driven Design (DDD) gibt es etwas, das so aussieht wie ein DAO, und zu großer Diskussion in der Community führt.

Lassen sich hier schon Unterschiede herausstellen?

Verfolge den “Streit” über den Unterschied zwischen Repos/DAO in den Blogs

Fragen:

  • Was sagt Eric Evans zu der Diskussion? Kann ein Repo als DAO implementiert sein?
  • Stehen Repo und DAO beide auf der Ebene vom Domain-Model?
  • Warum sagen Kritiker, dass Repos eine zusätzliche (unnötige) Zwischenschicht sind?
  • Einige EJB-Advocates injizieren gerne bei Java EE 5 Anwendungen den Entity-Manager in den DAO bzw. sehen den EM als DAO selbst, den man dann in Session-Beans injiziert. Ist das ein Design im Sinne von DDD?

Optional. Wie sieht Paginierung aus? http://tech.groups.yahoo.com/group/domaindrivendesign/message/5795

Labels:

Thema der Woche: Stripes, ein einfaches Web Presentation Framework

Die Listen http://java-source.net/open-source/web-frameworks und http://de.wikipedia.org/wiki/Liste_von_Webframeworks geben eine fast unendliche Aufzählung von Web-Frameworks an. Selbst bin ich ein Freund (je nach Anwendungsfall) von GWT, JSF 2.0 und Stripes.

Stripes is a presentation framework for building web applications using the latest Java technologies. The main driver behind Stripes is that web application development in Java is just too much work! It seems like every existing framework requires gobs of configuration. Struts is pretty feature-light and has some serious architectural issues (see Stripes vs. Struts for details). Others, like WebWork 2 and Spring-MVC are much better, but still require a lot of configuration, and seem to require you to learn a whole new language just to get started.

Stripes fällt die Kategorie der Action-orientierten Frameworks, wie Struts oder Spring MVC. Ein Front-Controller nimmt den Request entgegen und delegiert auf eine ActionBean-Klasse, die den Seitenfluss auf eine andere Zielseite steuert.

Aufgaben:

Trivia: Frederic Daoud ist der Autor vom Standard-Stripes Buch “Stripes: ...and Java Web Development Is Fun Again”. Frederic und seine Frau Nadia haben ein zweites Kind bekommen und es Ruby genannt.

Labels:

Thema der Woche: Effective Java

Das Buch Effective Java ist eines der beliebtesten Bücher für den fortgeschrittenen Java-Programmierer (http://java.sun.com/docs/books/effective/). Vor gar nicht allzulanger Zeit ist das Buch in die 2. Aufgabe gegangen (erste Auflage online).

Gehe die verfügbaren Informationen durch:
Beantworte folgende Fragen:
  • Warum ist es schwierig, eine perfekte equals()-Methode zu schreiben?
  • Welche Vorteile bieten immutale Objekte? Was hast das mit defensiven Kopien zu tun?
  • Wo hören die Wertebereiche von float und double auf?
  • Konstruiere ein Szenario, bei dem das wait() in einer if-Anweisung fehlschlägt und nur eine Schleife gültig ist.
  • Finde Informationen, ob über enum ein Singleton wirklich 100% korrekt ein Singleton ist und nur exakt ein einziges mal in der JVM ist.
Die Aufgabe beschäftigt für 2 Wochen!

Labels:

Thema der Woche: Pull-Parser/StAX

Nicht immer können und müssen Objektgraphen von XML-Dateien – entweder pur als XML-DOM, oder gemappt über etwa JAXB – im Speicher gehalten werden. Muss nur einmal eine XML-Datei abgelaufen werden (natürlich können in diesem einen Durchlauf dann der XML-DOM aufgebaut werden), kann gut ein Pull-Parser eingesetzt werden.

Aufgabe: Implementiere einen XHTML-Prüfer, der meldet, ob im img-Tag das Attribut alt gesetzt ist.

Labels:

Thema der Woche: Speicherverwaltung, Memory-Leaks

Lies das online-Kapitle http://java.sun.com/developer/Books/javaprogramming/bitterjava/bitterjavach06.pdf über Speicherprobleme.

Lies http://java.sun.com/javase/6/docs/api/java/lang/ref/package-summary.html und insbesondere http://java.sun.com/javase/6/docs/api/java/lang/ref/PhantomReference.html.

Aufgaben: Suche aus http://www.koders.com/default.aspx?s=phantomreference&btn=&la=Java&li=* ein Beispiel für PhantomReference. Dokumentiere, warum hier PhantomReference eingesetzt wird und keine andere Lösung exisitiert.

Was für Ergänzungen bieten die Google Collections mit den folgenden Klassen?

Implementiere ein Beispiel mit den Klassen, wobei eine OutOfMemoryError provoziert werden soll und dann gezeigt werden soll, dass die schwache Referenz gelöst wurde.

Labels:

Thema der Woche: Domain Driven Design (DDD)

Lies

Wirf einen Blick auf die Tools, die das erste Dokument aufführt:

Aufgabe: Schreibe zu jedem Tool einen Satz, der das Tool definiert und das Einsatzgebiet erklärt.

Labels:

Thema der Woche: Interface Design

Ließ von http://www.artima.com/interfacedesign/contents.html die öffentlich zugänglichen Kapitel.

Labels:

Thema der Woche: Micro-Benchmarks

Ließ zunächst die folgenden Artikel

Versuche dann mit http://jetm.void.fm/index.html die Frage zu klären, wie groß der Unterschied ist, wenn man Threads für eine Aufgabe per Hand startet oder aus einem Thread-Pool holt.

Labels:

Thema der Woche: Gof-Pattern-Wiederholung

Theoretische Aufgaben:
  • Nenne zwei Nachteile, die Vererbung gegenüber Assoziation hat.
  • Gibt es seit Java 5 eine Alternative zu Marker-Interfaces? Wie sieht diese aus? Nenne Beispiele.
Praktische Aufgaben:

Labels:

Thema der Woche: Matcher-Append-Replacement und Pig Latin

Die Pattern/Matcher erlauben nicht nur das Suchen und Ersetzen, sondern bieten noch weitere interessante Möglichkeiten.

Lösungen sind wieder gerne willkommen.

Labels:

Thema der Woche: NIO-Buffer

Java nutzt für Objekte den Heap-Speicher, kann aber Bytes auch in sogenannten direkten Puffern speichern. Das kann sehr effizient sein, da Kopieroperationen zwischen dem Heap-Speicher und dem internen Speichern vermieden werden.

Labels:

Thema der Woche: Java™ 6u10 - Java6u13

In der letzten Java™ 6 Updates sind einige Neuigkeiten hinzugekommen. Einige sind JavaFX geschuldet.
Java 6u14 ist noch nicht fertig. Es gibt nur ein "Java™ Platform, Standard Edition 6u14 Binary Snapshot Releases". Die Anzahl der gefixten Bugs ist groß. Lese dazu  http://download.java.net/jdk6/ und http://tutorial.fyicenter.com/out.php?ID=3688.

Labels:

Thema der Woche: Vernünftige Oberflächen, UI-Guidelines

Dass es unsinnige und schwer verständliche Gui-Oberflächen geht ist spätestens dann klar, wenn man sich folgendes Beispiel anschaut:

Besorge die UI-Guidelines und blättere

Lese anschließend

Labels:

Thema der Woche: OSGi

Zentrale Merkmale der Java-basierten OSGi-Service-Plattform sind das dynamische Einführen, Aktualisieren und Entfernen von Service-Anwendungen zur Laufzeit. Lese das Tutorial http://www.theserverside.com/tt/articles/content/OSGiforBeginners/article.html und führe die Beispiele praktisch durch. (Das mit JSR 277: Java Module System bitte vergessen, denn das ist tot.) Lese anschließend http://en.wikipedia.org/wiki/OSGi#OSGi_Tutorial und finde einige Unterschieden zwischen http://en.wikipedia.org/wiki/Knopflerfish, http://en.wikipedia.org/wiki/Apache_Felix und http://en.wikipedia.org/wiki/Equinox_OSGi.

Labels:

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?

Labels:

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.

Labels:

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...

Labels:

Thema der Woche: HTTP Header

Das http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol überträgt neben dem Content auch über Header wichtige Informationen wie MIME-Typ, Datenlänge oder Caching-Informationen.

Labels:

Thema des Monats: Programmieraufgaben / JavaBLOG Pause

Anders als bei den üblichen kleinen Beispielen für eine bestimmte API und Technologie sollen nun drei Aufgaben zur Auswahl stehen. Jeder kann nach Lust, Zeit und Laune eine/jede Aufgabe lösen.

Aufgabe 1

Brainfuck (http://de.wikipedia.org/wiki/Brainfuck) und Ook! (http://de.wikipedia.org/wiki/Ook!) sind einfache Turing-vollständige Sprachen, für die sich sehr leicht Interpreter in Java schreiben lassen. Für Brainfuck gibt es mittlerweile sogar eine IDE: http://hardtware.de/products/brainfuck.php. Die Aufgabe ist, unter Java 6 einen eleganten Compiler zu bauen, der aus einem Brainfuck- oder Oak!-Programm ein ausführbares Java-Programm in Form einer .class-Datei generiert. Der Aufruf kann so aussehen:



$ java BrainfuckC Application.bf

Successfully generated Application.class

$ java Application


Aufgabe 2


Gegeben ist eine potenziell sehr große ASCII-Datei mit Ganzzahlen im Wertebereich +-1000000, die durch Leerzeichen, Tab oder Return getrennt sind. Über die Datei soll eine Statistik gefahren werden, sodass am Ende die größte und kleinste Zahl sowie die maximale Teilsumme ausgegeben wird. Gesucht ist das schnellste Programm.



$ java Stat numbers.txt

Min: 3, Max: 199933, Maximale Teilsumme 4785



PS: Die maximale zusammenhängende Teilsumme von zum Beispiel

{-18,5,-3,9,4,-12} ist 5 + -3 + 9 + 4 = 15.


Aufgabe 3

Microsoft PowerPoint kann Folien im XML-Format speichern. Dazu verwendet Microsoft Zip-Dateien mit der Endung pptx. Im Zip-Archiv befindet sich ein Order ppt/slides und jede PowerPoint-Folie liegt dort als XML-Datei vor. Schreibe ein Swing-Programm, mit dem man einfache Text-Folien darstellen kann. Der Rückgriff auf beliebige Java-OpenSouce-Bibliotheken ist ausdrücklich gewünscht.

Lösungen können gerne in dem Blog gepostet werden (oder Verweise auf die Lösungen).

Blog-Pause

In den letzten Wochen gab es keine Posts, da ich auf den Philippinen, Brunei und Indonesien (ja, auch Java) war. Nach der Reise habe ich interessante Java-Neuigkeiten in den Blog nachgetragen. Nun wird es voraussichtlich für einige Wochen wieder keine weiteren Einträge geben, da ich nach Afrika fliege und Namibia, Südafrika, Swaziland, Lesotho, Botswana, Zambia, Mozambique, Malawi, Tansania, Kenia, Ruanda besuchen werde. Wollen wir hoffen, dass dies hier nicht der letzte Blog-Eintrag ist ;)

Labels:

Thema der Woche: SwingX

Die Anzahl Swing-Komponenten ist nicht besonders groß und seit dem Swing in Java 1.2 fest eingeführt wurde, hat sich wenig an Swing verändert. Im Laufe der Zeit sind diverse Projekte mit Zusatzkomponenten und Swing-Erweiterungen entstanden, wobei SwingX (http://swinglabs.org/) zu den bekannteren gehört.

SwingX wurde in den letzten Tagen mit mehr Aufmerksamkeit bedacht, seit dem Sun angekündigt hat, dass SwingX-Projekt nicht mehr zu unterstützten. Zusammen mit diversen Blog-Einträgen ergibt sich der Eindruck, dass Swing für Sun keine besondere Rolle spielt, sondern Sun stattdessen Geld und Entwicklerkapazität in JavaFX steckt. Lese dazu

Labels:

Thema der Woche: Das XML-Modell XOM

XOM (http://www.xom.nu/tutorial.xhtml) ist ein XML-Modell von Elliotte Rusty Harold, welches eine Alternative zu DOM, aber auch zu moderneren XML-Modellen JDOM und dom4j ist.

Um die Philosophie hinter dem Design zu verstehen, hat Elliotte Rusty Harold mit Bill Venners auf artima ein Interview geführt.

Aufgabe: Gehe mit XOM und XPath an das XML-Ergebnis einer REST-Abfrage http://www.flickr.com/services/api/flickr.places.findByLatLon.html und gib nur die place_url aus.

http://acs.lbl.gov/nux/ lässt sich als Erweiterung von XOM verstehen. Was macht NUX genau?

Labels:

Thema der Woche: Sun Certified Java Programmer (SCJP)

The Sun Certified Java Programmer (SCJP) exam is the entry level Java exam and is a prerequisite to a number of the other Java-related certifications. SCJP 6, designated CX-310-065 by Sun, was released in December 2007. It is designed to have a fairly detailed test of basic knowledge of the essentials of the Java programming language. It tests looping constructs and variables, and does not cover specific technologies such as GUI creation, Web or network programming. It is assessed through an automatically administered multiple-choice test system and consists of 72 questions which the candidate has 210 minutes to answer. At least 47 questions are needed to be correct to pass (around 65%). The SCJP 5 exam tests a candidate on knowledge of declarations, access control, object orientation, assignments, operators, flow control, assertions, string handling, I/O, parsing, formatting, generics, collections, inner classes, threads and the JDK toos (Quelle: http://en.wikipedia.org/wiki/Sun_Certified_Professional).

Zur Vorbereitung auf den SCJP gibt es im Netz viele Fragen, die denen aus dem SCJP sehr ähnlich sind. Auch wer kein SCJP machen möchte, sollte sich mit dem Thema beschäftigen, da es doch das tiefe Verständnis der Sprache Java schärft (weniger den Bibliotheken oder dem Design von großen Anwendungen!)

Aufgabe: Trage 30 der spannendsten Fragen zusammen.

Labels:

Thema der Woche: Continuous Integration mit Hudson

Lies zunächst http://martinfowler.com/articles/continuousIntegration.html von Martin Fowler über die Motivation von CI in der Softwareentwicklung.

In den letzten Monaten hat sich das Hudson zu einem Publikumslieblig entwickelt. Studiere die folgende Präsentation:

(Hudson stammt vom Kohsuke Kawaguchi, der eine ganze Reihe sehr interessanter Projekte bei Sun macht, etwas JAXB oder auch https://com4j.dev.java.net/. Wer ein Podcast von ihm und Husdon hören möchte: http://blogs.sun.com/glassfishpodcast/entry/episode_007_interview_with_kohsuke)

Blättere ein wenig auf den Seiten unter http://hudson.gotdns.com/wiki/display/HUDSON/Meet+Hudson. Falls ein Projekt mit CSV- oder SVN-Zugriff verfügbar ist teste Hudson.

Labels:

Thema der Woche: Refactoring

Refactoring von Code ist eine wichtige Aufgabe von Entwicklern neben der Neuentwicklung von Programmcode. Die Pflege und Aufarbeitung darf natürlich nicht zum Selbstzweck werden, aber langlebige Software muss zwingend für immer die Kriterien Wartbarkeit und Erweiterbarkeit bewahren und gut dokumentiert und verständlich sein.

Den größten Einfluss auf das Thema Refactoring hat das Refactoring-Buch von Martin Fowler, der auf seiner Webseite das Prinzip Refactoring, Refactoring-Tools und News auflistet.

Martin Fowler hat mir erlaubt, seinen Refactoring-Katalog auf Deutsch zu übersetzen: http://www.tutego.com/java/refactoring/catalog/. Gehe kurz über alle Refactorings.

Moderne IDEs erlauben von Haus aus das Refactoring von Code. Im Fall von Eclipse finde zu jedem unterstützten Refactoring ein Beispiel und lasse es von Eclipse umbauen:

Labels:

Thema der Woche: Rich Internet Applications mit OpenLaszlo und ZK

Statt wie bei vielen Java Web-Frameworks HTML-Seiten in das Zentrum zu stellen, gehen moderne RIA (Rich Internet Applications)-Frameworks einen anderen Weg. Im Mittelpunkt stehen dort XML-Dateien, die die View beschreiben, angereichert mit JavaScript für die Interaktion und das Ansprechen von Services in der Middle-Tier. Drei der bekannten Frameworks sind:

Verschaffe einen Eindruck über die Frameworks mit dem Demos http://www.zkoss.org/demo/, http://www.openlaszlo.org/showcase, http://www.webspiders.com/flex/.

http://www.openlaszlo.org/lps4/laszlo-explorer/index.jsp?lzr=dhtml bietet unter "Laszlo in 10 Minutes " einen Editor auf der einen Seite und eine Ansicht auf der anderen, so dass man über dem Editor, eigene Programme in der Mini-IDE schreiben kann. Entwickle auf diese Weise einen Umrechner von Euro in Dollar.

Installiere den OpenLaszlo Server (http://www.openlaszlo.org/lps4/docs/installation/). Setze den Euro/Dollar-Umrechner in das Verzeichnis. Schreibe eine einfache JSP (oder echten Web-Service über Java 6 wer will; angelehnt an http://rscreeney.wordpress.com/2006/09/19/laszlo-simple-web-service/), die als Service den aktuellen Umrechnugskurs liefert, worauf das eigene OpenLaslo-Programm zurückgreift. (Wer möchte, kann die Lösung gerne hier als Kommentar reinsetzen.)

Labels:

Thema der Woche: Collection-API-Erweiterungen

Die Java-Collection API bietet grundlegende Sammlungen, aber es gibt immer noch Bedarf an mehr. Drei Bibliotheken stechen hier besonders raus:

Lese etwas über die Projekte. Beantworte folgende Fragen:

  • Welche neuen Datenstrukturen enthalten Google Collections?
  • Welche Autoren arbeiten an Google Collections?
  • Welchen Sinn ergeben folgende Szenarien: new ReferenceMap(WEAK, STRONG), new ReferenceMap(WEAK, WEAK), new ReferenceMap(STRONG, STRONG)?
  • Was kann man mit der Apache-Klasse ExtendedProperties machen?
  • Wofür sind die Typen in org.apache.commons.collections.functors nötig und wie verwendet man sie ? Haben Transformer damit etwas zu tun?
  • Warum spricht Javolution an vielen Stellen von "hard real-time compliant"?
  • Bewerte den Benchmark http://javolution.org/doc/benchmark.html.

Labels:

Thema der Woche: Collection-API

Die Collection-API enthält grundlegende Sammlungen für Listen, Kellerspeicher, Assoziativspeicher. Gehe über alle Operationen der folgenden Schnittstellen:

Finde je ein Beispiel für keySet(), retainAll(), toArray(), headSet().

Welche Implementierungseigenschaften haben die folgenden Klassen:

Fülle eine WeakHashMap mit sovielen neuen java.awt.Point-Objekten, bis es einen OutOfMemoryError gibt. Fange diesen ab und gib die Größe der WeakHashMap aus.

Laufe zum Verständnis der Implementierung folgende Szenerien im Debugger ab:

  • Ein Element wird in die HashMap eingefügt, dann erfragt.
  • In eine LinkedList bzw. ArrayList werden einige Elemente eingefügt, dann nach ihrer Position erfragt und gelöscht.

Labels:

Thema der Woche: Google Web Toolkit (GWT)

Das Google Web Toolkit (GWT)  ist ein Web-Framework, mit einem interessanten Ansatz. Statt HTML-Seiten in den Vordergrund zu setzen, schreibt man Gui-Anwendungen in Java mit einer in AWT/Swing bekannten Art (Komponenten/Container und Listener) und lässt diese Anwendung von einem Compiler in JavaScript übersetzten. Die ganze Gui wird somit Teil des Web-Browers. Für den Teil, der nicht im Browser läuft, also die gesamte Geschäftslogik und Datenbank, gibt es eine RCP-Schnittstelle.

Schaue drei Beispiele für die Möglichkeiten von GWT an.

Um etwas mehr vom Hintergrund zu verstehen, kann man http://www.maximilien.org/presentations/2006/AJAX_and_GWT_Public_07052006.pdf lesen.

Wer praktisch spielen möchte, kann GWT+Eclipse+Plugin nach dem folgenden Blog-Eintrag installieren. Mehr über die Gui-Komponenten erfährt man in einem Kapitel des Hanser-Verlags (Übersetzung von GWT in Action): Widgets (deutsch).

Labels: ,

Thema der Woche: Bug-Finder

Bei jedem Software-Projekt sollte die Qualität über einen langen Zeitraum konstant hoch sein. Insbesondere bei wechselnden Team-Mitgliedern kommen aber schnell Inkonsistenzen in die Sourcen und die Qualität leidet. Code-Analyse Tools versuchen aufgrund bekannter Fehler-Pattern genau diese Schwachstellen zu finden. In Java gibt es eine ganze Reihe von Tools. So führt http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#Java auf:

  • Bandera — analyzer for Java
  • Checkstyle — analyze Java and apply coding standard
  • Classycle — analyze Java class cycles and class and package dependencies (Layers)
  • FindBugs — an open-source static bytecode analyzer for Java (based on Jakarta BCEL).
  • Jlint — for Java
  • PMD (software) — a static ruleset based Java source code analyzer that identifies potential problems.
  • Soot — A Java program analysis and compiler optimization framework

Für einige Produkte gibt es Eclipse-Plugins. Teste FindBugs in Eclipse/NetBeans. Studiere die Bugs/Schwachstellen, die FindBugs automatisch finden kann.

Labels:

Thema der Woche: Datum und Zeit

An der Datum/Zeit-API wird schon ewig rumgemeckert, und jetzt soll es wirklich gut werden. Lies zunächst die API-Dokumentation der zentralen Standard-Klassen:

  • Date
  • DateFormat
  • SimpleDateFormat
  • Calendar
  • GregorianCalendar

Was sind die Argumente der Kritiker?

Eine hervorragende Open-Source-Biblitohek ist http://joda-time.sourceforge.net/. Was macht Joda-Time anders/besser?

Die https://jsr-310.dev.java.net/ möchte endlich eine tolle Datums/Zeit-API in das Standard-Java Version 7 bringen. Was unterscheidet Joda-Time von JSR 310?

Labels:

Thema der Woche: Inversion Of Control/Dependency Injection

Komponenten müssen in irgendeiner Weise auf Dienste (Services) zurückgreifen. Diese Dienste könnte entweder in die Komponenten injiziert werden oder eine Komponente bezieht den Dienst über eine zentrale Service-Factory. Vergleiche die Ansätze Service-Locator und IoC (Spring-Beispiele).

Spring ist nicht der einzige IoC-Container. Verschaffe einen Überblick über

Ob nun IoC grundsätzlich die Beste Lösung ist, oder ob nicht eine einfache Zentrale reicht, ist Thema von http://lateralprogramming.wordpress.com/2008/04/07/why-use-spring-if-you-have-a-hashmap-at-hand/.

Aufgabe:

  • Welcher fundamentale Unterschied hat Google Guice gegenüber Spring?
  • Frage Google Trends, wie sich die beiden IoC-Framwork sich in letzter Zeit entwickelt haben.

Labels:

Thema der Woche: Apache Commons

Die Apache-Group hat mit ihren vielen Projekten irgendwann bemerkt, dass sie einige Dinge immer wieder programmieren. So ist nach und nach http://commons.apache.org/ entstanden, ein Projekt, welches viele Hilfsklassen implementiert.

Vertiefe in http://commons.apache.org/io/ und http://commons.apache.org/lang/ und schaue in die Typbeschreibung jeder Klasse/Schnittstelle.

  • Programme eine Beispielprogramm, bei dem die toString()-Methode generisch über ToStringBuilder aufgebaut wird.
  • Schreibe ein paar Demos, die Funktionen aus StringUtils, WordUtils nutzen.
  • Kopiere eine Datei von einer Stelle zur anderen.
  • Nutze passende Klassen/Funktionen aus org.apache.commons.io.filefilter um in einem Vergleiche alle Dateien zu finden, die (älter ein als gewisses Datum sind UND über einer gewissen Größe liegen) ODER (auf eine bestimmte Dateiendungen, wie doc oder rtf, enden).

Labels:

Thema der Woche: Bytecode und Obfuscator

Wie jeder weiß, produziert der Java-Compiler in der Regel Bytecode. Um eine Vorstellung davon zu bekommen, sollte man lesen

Dann je nach Wunsch weitere Kapitel aus der Java Virtual Machine Specification; da ist aber jede Waschmaschine spannender.

Java Bytecode lässt sich disassemblieren, etwa mit javap. Hier sollte man ein Beispiel ausprobieren.

Um den Bytecode unansehnlich zu machen, lässt sich ein Obfuscater einsetzten. Teste die Möglichkeiten von http://proguard.sourceforge.net/ an einem Beispiel.

Labels:

Thema der Woche: PDF-Dokumente

PDF ist ein Standard-Dokumentenformat geworden, an dem man nicht vorbeikommt.

Java bietet eine Reihe von Bibliotheken an, die PDF-Dokumente verfassen und darstellen. Bekannter sind:

Was sind Bibliotheken zum Anzeigen und Erstellen? Welche Einschränkungen sind bekannt? Was kann man mit http://djproject.sourceforge.net/ns/ machen?

Erstelle mit iText aus den Kurzbeispielen http://itextdocs.lowagie.com/tutorial/ eine PDF mit Absätzen, einfachen Tabellen und Bildern. Zeige die PDF mit dem https://pdf-renderer.dev.java.net/ an.

Microsoft versucht mit dem XPS-Standard (http://en.wikipedia.org/wiki/XML_Paper_Specification) eine Alternative zu etablieren. Gibt es dazu irgendwelche Java-Bibliotheken?

Labels:

Thema der Woche: Unicode und Kodierungen

Java verarbeitet Zeichen (bisher) intern in 2-Byte Unicode. Gespeichert werden Daten aber in der Regel in UTF-8 oder, für uns in Europa, in Latin-1. Thema der Woche ist Unicode und die Umkodierungen. Am Anfang sollen The Ten Commandments of Unicode von Elliotte Rusty Harold stehen:

  1. I am Unicode, thy character set. Thou shalt have no other character sets before me.
  2. Thou shalt carefully specify the character encoding and the character set whenever reading a text file.
  3. Thou shalt not refer to any 8-bit character set as “ASCII”.
  4. Thou shalt ensure that all string handling functions fully support characters from beyond the Basic Multilingual Plane. Thou shalt not refer to Unicode as a two-byte character set.
  5. Thou shalt plan for additions of future characters to Unicode.
  6. Thou shalt count and index Unicode characters, not UTF-16 code points.
  7. Thou shalt use UTF-8 as the preferred encoding wherever possible.
  8. Thou shalt generate all text in Normalization Form C whenever possible.
  9. Thou shalt avoid deprecated characters.
  10. Thou shalt steer clear of the private use area.

Da schließen sich nun einige Fragen an, die es zu klären gilt:

  • Was ist der Unterschied zwischen ASCII, Unicode 2 und Unicode 4?
  • Was ist ein Code-Point? Welche Funktionen in Java 5 sind wegen Unicode 4 hinzugekommen? Welche beiden Funktionen zum Zugriff auf ein Zeichen gibt es? Resultieren daraus Performance-Unterschiede?
  • Was ist eine Kodierung? Wie wird sie in Java bestimmt? Durch einen String oder durch eine Klasse?
  • Welchen Funktionen/Konstruktoren der Java Klassenbibliothek nehmen eine Kodierungskennung entgegeben? Nenne mehrere Wege, wie man Strings/Byte-Felder umkodiert.
  • Gibt es XML-Parser in Java, die Unicode 4 unterstützten? Was sagen die Autoren von XML-Parsern zu Unicode 4?
  • Warum kann es beim Datenbankzugriff auf Textspalten Probleme geben? Gibt es dokumentierte Probleme/Lösungen?

Auch neu: tutego's Clip-Art Seite. Links zu weiteren Clip-Art Sammlungen (ohne die lästigen Popup-Menüs) sind willkommen.

Labels:

Thema der Woche: Reguläre Ausdrücke

Reguläre Ausdrücke vereinfachen die Abfragen an Strings radikal. Lese zunächst zur Einleitung

Anschließend sollte man die die API-Doku lesen:

In einer Code-Suchmaschine kann man nun einige Beispiele für Pattern-Nutzung ablesen:

Mehr Beispiele (allerdings auch mit Perl-RegEx, die Java nicht unterstützt) gibt die Seite

Hier sollte man sich ein paar Beispiele anschauen.

Zum Schluss eine Übung: Schreibe einen RegEx-Ersetzer, der aus einem Satz mit der "Basic text formatting" Regel der Wiki-Syntax (http://wiki.splitbrain.org/wiki:syntax) HTML erzeugt. Also soll aus

**bold**

folgendes werden:

<b>bold</b>

Labels:

Thema der Woche: Java 5 und Java 6

Java 5 ist mittlerweile weit verbreitet, und Entwickler sollten auf der einen Seite die neuen Spracheigenschaften kennenlernen, auf der anderen Seite sich mit dem Update der Bibliotheken beschäftigen. Als Startlinks gelten:

Von jeder neue Klasse und Schnittstelle sollte man zumindest den API-Kopf gelesen haben. Besonderes Augenmerk sollten Entwickler auf Generics legen. Hier gilt hervorzuheben das Tutorial http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf. Die Begriffe

  • Generischer Typ
  • Typparameter
  • formalter Typparameter
  • parametrisierter Typ
  • Typargument
  • Wildcard-Typ
  • Bounded Wildcard
  • upper bound, lower bound
  • generische Methode
  • unchecked Warnung
  • erasure
  • Wildcard capture
  • multiple bound

solle man sofort einordnen und beschreiben können.

Jeder Entwickler sollte insbesondere alle Anwendungen von Generics bei der Utility-Klasse Collections verstehen:

PS: Beginne bei <T>/<E> bzw. <K,V>, dann <?> und dann den restlichen. max/min sind dann die Generics-"Bonbons".

Wer danach die Nase von Generics immer noch nicht voll hat, beginnt http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html zu lesen. Das ist die umfangreichste Quelle zu dem Thema im Netz.

Labels: