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.
Autor: Christian Ullenboom
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:
NetBeans 7.0 Roadmap und NetBeans 7.0M1/M2
Die Roadmap sieht so aus:
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.
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, …
Viele Neuerungen aus dem PHP-Projekt (netbeans php blog)
- Generating Getters and Setters Improved
- SFTP support added
- Parameter Info
- Code completion for constructors
- Marking returns
- Go to type for class members – improved
- SQL code completion in the PHP editor
- Marking occurrences improved
Und Ruby
Aktualisierung auf JS 1.7
Komlettes Redesign unter Mac OS
Bessere Unterstützung fürs Profiling:
SVG-Komponenten in NB Mobility
Von jHat eine interessante Unterstützung, um im Speicherbaum zumzusuchen.
Bei der C++-IDE: Unterstützung zum Bau vom Qt-Applikationen, Macro-Expansion (Tooltip), Tastaturvervollständigung, Setter/Getter bauen.
Vervollständigung bei Grails:
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:
- re-throw
- null-dereference expressions
- Type-Inference — Wer zu viel Zeit hat, dem ist http://blog.henning.makholm.net/2008/11/java-50-type-inferences-is.html empfohlen
- Multi-Catch
- JSR 203 (More NIO, NIO2)
- JSR 296: Swing Application Framework
- SCTP
- SDP
- Unicode 5
- Swing-Updates wie JXLayer, DatePicker
- G1 GC
- JSR 308, http://groups.csail.mit.edu/pag/jsr308/
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:
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…
Java ME Anwendungen nach Android portieren
Das schafft das J2ME Polish-Projekt Janus + Zusatzbiblitotheken. Heise hat das Produkt kurz in den News vorstellt.
Zwei interessante GWT-Erweiterungen: Gilead und GWT-SL
Sind
Gilead (früher Hibernate4GWT), abgeleitet von "Generic Light Entity Adapter" ist ein interessantes Projekt mit folgendem Konzept:
transform persistent entities back to simple Plain Old Java Object, by removing code instrumentation and replacing persistent collections with their regular counterpart.
Kommt zum Beispiel eine JPA-Bean mit Assoziationen mit Eager-fetching rein, kommt ein vollständig geladener Objektgraph raus. Das ist praktisch genau dann, wenn man einen Daten-Service hat, den man von der GWT-Oberfläche zum Holen der Daten nutzt, aber die JPA-Implementierung baut diverse Proxies ein.
Das SF-Projekt "GWT-Widgets" besteht aus zwei Teilen: Der GWT Server Library (GWT-SL) und der GWT Widget Library. Die GWT-SL ist eine GWT-Spring-Integration. Mit dem GWTRPCServiceExporter können etwa die Spring-POJOs als GWT-Services veröffentlicht werden. Die Doku stellt die Arbeitsweise kurz vor.
IntelliJ IDEA 8.1
JetBrains hat eine neue Version ihrer IDE herausgegeben: IntelliJ 8.1. Die Änderungen sind eher unter der Haube (wie Performance Optimierungen) als das groß neue Features implementiert wurden. Dennoch gibt es einiges Neues:
IntelliJ IDEA Server
To make all of your favorite settings (keymap, fonts and colors, inspection profiles, etc.) accessible from any computer where you run IntelliJ IDEA, create a JetBrains Account and log in with it to a dedicated JetBrains server at IntelliJ IDEA startup.
Team Foundation Server integration
Perform all common VCS functions (commit, update, revert, etc.) from IDE. Create and manage TFS workspaces, merge branches, lock and unlock files, view the changes history, and do more.
Git integration
Carry out common VCS operations right from IntelliJ IDEA, plus do Git-specific tasks like cloning of remote repositories, pushing and pulling of local repositories, rebasing (including interactive mode and multiple Git roots), and more.
Perforce jobs support
IntelliJ IDEA Perforce integration now lets you list Perforce jobs, view their details and link them to arbitrary changelists. Jobs can be selected and linked directly from the Commit Changes dialog.
Oracle SQL dialect support
SQL editor supports Oracle SQL dialect, with completion, validation and highlighting.
Resin integration
Resin application server is supported via the dedicated run configuration, with application deployment and debugging (both local and remote).
Copyright plugin bundled
Generate copyright headers for any type of source code and let IntelliJ IDEA automatically keep them up-to-date. All it takes is creating a template for the copyright text and specifying the scope to which it should be applied.
Auswirkung von neuen Sprachkonstrukturen in Java 7 und Project Coin
Joseph Darcy veröffentlichte schon vor 2 Jahren einen interessanten Blog-Artikel über die Änderungen, die enum mit sich brachte: JSL, Compiler, Bibliotheken, JVM-Spezifikation, usw. Da Sun sich mit dem neuen Modulsystem Jigsaw wohl ganz gut was vorgenommen hat, wird es große Änderungen an der Sprache (wie Closures oder Reified Generics) wohl nicht in Java 7 geben. Dennoch gibt es mit dem aktuellen Project Coin: Small Language Changes for JDK 7 einen neuen Versuch, zumindest einige Features unterzubringen, die mit wenig Aufwand implementiert werden können. Dazu zählen ein switch mit Strings oder die Möglichkeit, multiple Exceptions in einem catch zu fangen.
Folien zum Einsatz von Annotationen in Spring
Habe bei SlideShare interessante Folien zum Einsatz von Annotationen in der Spring-Entwicklung gefunden. Zunächst werden allgemeine Annotationen aus dem Java SE und besonders aus dem Java EE-Umfeld vorgestellt. Dann werden JPA und REST im Kontext von Spring an Beispielen erklärt. Zum Schluss folgt noch etwa Spring MVC und wie dort Annotationen die Konfiguration vereinfachen.
JavaFX 1.1 veröffentlicht
Unter der Homepage http://java.sun.com/javafx/ kann man nun die neue Version JavaFX 1.1 beziehen. Neuerungen sind:
Key Release Components
- Official support for JavaFX Mobile
- Language improvements
- Performance and stability improvements
JavaFX 1.1 SDK
- JavaFX Mobile Emulator enables developers to begin creating advanced and expressive mobile content.
- Desktop Runtime update improves performance and stability.
- Better support is provided for developing mobile or desktop applications from the same code base.
JavaFX 1.1 Platform Features
- Support for "full screen" applications
- Improved support for applications that need to access resources across multiple domains
- Standard navigation method for cross-device content
Documentation
- Updates to JavaFX GUI tutorial with support for desktop and mobile
- Updates to the Media Browser tutorial to add support for advanced JavaFX features
- Improved JavaFX Script Programming Language tutorial and Reference Guide
JavaFX 1.1 Language
- Addition of all Java numeric types (float, double, long, int, short, and byte) to the type system
- Sequence performance and footprint optimizations
- Dynamic footprint optimizations in animations
Aptana Studio wird immer größer (Rails, pydev, …)
http://www.aptana.com/ find klein an. Erst war es die PHP-IDE auf der Basis von Eclipse, nun ist auch noch die Python-IDE pydev dazugekommen und eine Entwicklungsumgebung für Ruby/Rails und Mobile Web.
Das Geschäftsmodell bei pydev ist wie folgt: Während der Kern immer noch OpenSource bei http://pydev.sourceforge.net/ bleibt, kommt es kommerzielles Pydev Extensions hinzu. Die Webseite zählt für das Produkt etwa die folgenden Neuerungen auf:
- Rename refactoring: renames all occurrences for some token in your workspace — with preview and undo/redo (1.2.6)
- Support for python 2.5 (1.2.3)
- Mark Occurrences is able to highlight all the occurrences of some token in a file (1.0.7)
- Rename Occurrences: renames all the occurrences of some token in a file (Ctrl+2+R — 1.0.7)
- Interactive Console binded to the Pydev Editor (1.0.4)
- Open Definition Quick-outline (1.0.3)
- Debug console (1.0.2 — allows interactive probing in suspended mode)
- Code completion with auto-import
- Code analysis (PyLint replacement, but much faster)
- Quick-Fix for problems found in code analysis
- Go to definition (Bycicle Repair Man replacement, but much more reliable)
- Debug server (allows debugging scripts not lauched from within Eclipse)
- Keywords presented as auto-completions as you type
- Quick-outline
- Python 3.0 Unterstützung
Für die IDE gibt es unter http://showmedo.com/videos/series?name=PyDevEclipseList zwei Screencasts.
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.
- Installiere das Firefox-Plugin https://addons.mozilla.org/en-US/firefox/addon/3829 um die HTTP-Header mitzulesen.
- Welche HTTP-Header beim Request und beim Response werden ausgetauscht? http://en.wikipedia.org/wiki/List_of_HTTP_headers gibt eine kurze Erklärung.
- Wie kann man über JSTL und in einem Servlet auf die Header zugreifen?
- Zur Optimierung sollte man den Cache nutzen. Lese http://www.mnot.net/cache_docs/ und verstehe den Expires-Header
- Lies http://www.onjava.com/pub/a/onjava/2004/03/03/filters.html und http://www.agimatec.de/blog/2008/05/caching-mittels-http-header/ und setzte den Filter praktisch um.
GWT 1.6 Milestone 1
*** New Project Structure in GWT 1.6 ***
One of the biggest changes to GWT 1.6 is a new project structure. The old
output format has been replaced by the standard Java web app expanded „war“
format, and the actual directory name does default to „/war“. Note that the
war directory is not only for compiler output; it is also intended to
contain handwritten static resources that you want to be included in your
webapp alongside GWT modules (that is, things you’d want to version
control). Please also note that the „GWTShell“ and „GWTCompiler“ tools will
maintain their legacy behavior, but they have been deprecated in favor of
new „HostedMode“ and „Compiler“ tools which use the new war output. When 1.6
is officially released, we will be encouraging existing projects to update
to the new directory format and to use the new tools to take advantage of
new features and for compatibility with future GWT releases.
The sample projects provided in the GWT distribution provide an example of
correct new project configurations. For more details on the specifics of the
new project format, please see GWT 1.6 WAR design document (
http://code.google.com/p/google-web-toolkit/wiki/WAR_Design_1_6).
A couple of important changes we should highlight here:
– Projects with server-side code (GWT RPC) must configure a „web.xml“ file
at „/war/WEB-INF/web.xml“. This web.xml file must define and publish any
servlets associated with the web application. See the included DynaTable
sample. Additionally, server-side library dependencies must be copied into
„/war/WEB-INF/lib“. For example, any GWT RPC servlets must have a copy of
gwt-servlet.jar in this folder.
– HTML host pages will no longer typically be located in a GWT module’s
public path. Instead, we’ll be recommending that people take advantage of
the natural web app behavior for serving static files by placing host pages
anywhere in the war structure that makes sense. For exmaple, you might want
to load a GWT module from a JSP page located in the root of your web app. To
keep such handwritten static files separate from those produced by the GWT
compiler, the latter will be placed into module-specific subdirectories. Any
page that wishes to include a GWT module can do so via a script tag by
referencing the GWT-produced „<module>.nocache.js script“ within that
module’s subdirectory. As of 1.6, we’ll be recommending that only
module-specific resources used directly by GWT code, such as image files
needed by widgets, should remain on the public path. See the included
Showcase sample for some examples of this distinction.
– When you do need to load resources from a module’s public path, always
construct an absolute URL by prepending GWT.getModuleBaseURL(). For example,
‚GWT.getModuleBaseURL() + „dir/file.ext“‚. This advice has not changed, but
in the past it was easy to be sloppy with this, because the host page and
GWT module typically lived in the same directory, so using a relative URL
would usually do the right thing. Now that GWT modules live in a
subdirectory, you must reference public resources through
GWT.getModuleBaseURL().
*** Hosted Mode Enhancements ***
Although the legacy GWTShell still uses an embedded Tomcat server, the new
HostedMode runs Jetty instead. There is also a new „Restart Server“ button
on the main hosted mode window. Clicking this button restarts the internal
Jetty server, which allows Java code changes to take effect on the server
without having to completely exit and restart hosted mode. This is useful
when making code changes to RPC servlets, or when serializable RPC types are modified and the server and client are out of sync.
*** New EventHandler System ***
Event handlers have been added to replace the old event listeners used by
Widgets, History, and various other classes. The new system has a few
differences from the old system:
– EventHandler methods always take a single parameter: the GwtEvent that the Widget fired. For example, ClickHandler has a single method
onClick(ClickEvent).
– Each GwtEvent contains accessors relevant to the event, such as the key
that was pressed on KeyEvents. Native events provide access to the
underlying native event object.
– Each EventHandler defines only one method, so you do not need to create
empty methods just to satisfy the interface requirements.
For users who create their own Widgets, you no longer need to manage
listeners manually. Every Widget has a HandlerManager that manages all of
its handlers. For native events, such as ClickEvent, just call
addDomHandler() from within your code to register a handler and sink the
associated event on the Widget. When the native event is detected, the
handler will automatically be called. For logical events, such as
SelectionEvent, call addHandler() and fire the event manually using the
fireEvent() method.
You can see examples of EventHandler usage in many of the updated GWT
widgets and samples, or in new projects created with the new webAppCreator tool.
You can now trigger a native event on almost any Element. Create a new
native event using the Document.create*Event() methods, then dispatch it on a specific Element by calling Element.dispatchEvent(). These methods allow you to expand your test coverage in ways that were previously impossible.
*** New Widgets ***
DatePicker
The new DatePicker and DateBox widgets allow your users to select a date
from a calendar. The Showcase sample provides examples of both of these
widgets.
LazyPanel
The new LazyPanel widget allows you to delay the creation of certain
sections of your application until they are first accessed, improving
startup performance. For example, if your application has a seldom used
„Help“ section, you can wrap it in a LazyPanel and create the user interface
only if and when the user tries to access it. To use the LazyPanel, extend
the class and override the abstract createWidget() method. The
createWidget() method will be called the first time you call setVisible() on
the LazyPanel.
Flamingo 4.0 Swing Ribbon Komponente
Kirill Grouchnikov schreibt heute in seinem Blog http://www.pushing-pixels.org/?p=1087 über das 4.0 Release von Flamingo, einer Swing Ribbon Komponente. Auf der Haupsteite https://flamingo.dev.java.net/ gibt es weitere Demos.
1.6.0_12
Neues Update von Java 6. Die Änderungen listet http://java.sun.com/javase/6/webnotes/6u12.html auf. Interessante Änderungen sind der 64-Bit Browser Support for Java Plugin and Java Webstart:
- This release supports the New Java Plugin and Java Webstart on AMD64 architecture, on Windows platforms. A Java offline installer (JRE and JDK) is provided. Note, if you use 32-bit and 64-bit browsers interchangeably, you will need to install both 32-bit and 64-bit JREs in order to have Java Plug-In for both browsers.
Weiterhin:
- Limited mixing of heavyweight and lightweight components is supported. Limited mixing means that some components may not be handled perfectly. This includes, but is not limited to, support for non-opaque lightweight components.
- The Security Warning used with the toplevel windows of an untrusted application has been improved to make it less intrusive and more subtle.
- Graphics performance improvements for: Anti-aliasing drawing and filing, Non-anti-aliasing transformed rectangles and single wide lines. Java Webstart startup time
Buchkritik: Reversing: Secrets of Reverse Engineering
Eldad Eilam. Wiley. ISBN 0-7645-7481-7. 2005. 619 Seiten
Thema des Buches ist die Wiederherstellung von übersetztem Code in ein menschenlesbares Format und gleichzeitig der Schutz von diesem Reverse Engineering Verfahren. Das Buch pendelt zwischen grundlegenden Begrifflichkeiten, wie der Erklärung der Arbeitsweise eines Compilers und wofür die Win 32 API gut ist. Auf der anderen Seite beschäftigt es sich mit IA 32 Assembler-Code. Die Zielgruppe ist daher schwer auszumachen. Sicherlich ist für beide etwas dabei. Wer eher grundlegende Begrifflichkeiten sucht, wird sie hier auf jeden Fall finden und sicherlich nicht den Appendix mit den Prozessor-Flags lesen. Wer in IA 32 Assembler dagegen fit ist, findet viele Anregungen zum Reverse Engineering, Disassemblieren sowie Decompilieren. Zu allen Punkten werden freie und kommerzielle Tools aufgeführt. Der Autor ist nicht ideologisch in Open-Source oder freie Software verliebt und schließt daher kommerzielle Produkte nicht aus; oftmals sind die kostenpflichtigen Lösungen leistungsfähiger. Die Fallbeispiele (Kap. 6, Deciphering File Formats und Kap. 8, Reversing Malware) sind realistisch und ausführlich beschrieben und geben einen guten Eindruck in die Arbeitsweise. Schlussendlich ist auch für .NET-Programmierer etwas dabei, und die Ideen zum Schutz gegen Decompilierung finden auch in der Java-Welt ihre Anwendung.