October, 2004 Java News

Sunday, October 31, 2004

The Jakarta Apache Project has posted Tomcat 5.5.4, an open source servlet container for the Apache web server and the official reference implementation of the Java Servlet API and Java Server Pages (JSP). "Tomcat 5.5 is designed to run on J2SE 5.0 and later, and requires configuration to run on J2SE 1.4....In addition, Tomcat 5.5 uses the Eclipse JDT Java compiler for compiling JSP pages. This means you no longer need to have the complete Java Development Kit (JDK) to run Tomcat, but a Java Runtime Environment (JRE) is sufficient. The Eclipse JDT Java compiler is bundled with the binary Tomcat distributions. Tomcat can also be configured to use the compiler from the JDK to compile JSPs, or any other Java compiler supported by Apache Ant." This implements version 2.4 of the Java Servlet API and version 2.0 of Java Server Pages. Changes since 5.5.3 consist of bug fixes. The version numbering is funky. This is really more like an alpha release and is definitely not considered to be ready for production.

Saturday, October 30, 2004

I finished Neal Stephenson's The System of the World, the third and final volume in the Baroque Cycle, a couple of days ago. I'll have more to say about that soon. However, I can say that it reveals almost about Enoch Root. There are a couple of hints at both the angel (pp. 834-835) and wizard (p. 886) hypotheses that have been promulgated here in the past, but nothing definitive. In fact, I wouldn't put it past Stephenson to have snuck the clues in just to tease fans. However, Enoch does not actually appear in the course of the book. There some letters back and forth, but he never actually shows up. Waiting for Enoch. One hypothesis about another unexplained occurrence in Cryptonomicon was confirmed in this volume. Maybe in the next book, set sometime in the future after the events of Cryptonomicon, Enoch's secret will finally be revealed.

There is one new question that I'll set up a web page for soon. I thought about this when I read QuickSilver, but wrote it off as bad 17th century science and alchemical superstition. However, it becomes more apparent in this volume that, at least within the context of the story if not reality, something very weird is going on. Without giving too much away, I'll simply ask for those who have read the books, what's up with the gold? If you'd care to comment on this, drop me some e-mail, and I'll summarize the best ideas on a separate page to avoid spoiling the fun for those who haven't read the book yet. Please note whether or not it's OK for me to post your e-mail publicly.

Friday, October 29, 2004

jutils.com has released lint4j 0.7, a free-beer "static Java source code analyzer that detects locking and threading issues, performance and scalability problems, and checks complex contracts such as Java serialization by performing type, data flow, and lock graph analysis." Version 0.7 adds a number of tests for Enterpise Javabeans issues as well as pointless assignments, accidental assignment of a boolean value, and method/constructor confusion.

As usual I ran this across the XOM code base. It found one unnecessarily shadowed local variable, which allowed me to eliminate one line of code. It also found a place where I should have been using an if-else block instead of a switch. Neither of these were real bugs, just minor code improvements. It also identified one area where XOM perhaps ought to be using string buffers instead of string concatenation. However, that particular bit of code is so convoluted that the StringBuffer algorithm is likely to be much more complex than the String based algorithm, so I chose not to fix it, at least not right now. These three issues were hidden in a large number of false positives, mostly involving deliberately ignored exceptions, switch statements without default branches, and using == instead of equals() for comparison.

JCraft, Inc has posted JSch 0.1.18, an open source, pure Java implementation of SSH2 that supports port forwarding, X11 forwarding, file transfer, etc. This version adds some minor features including handling hostkeys included in known_hosts file and setting timeout values for opening sockets. Java 1.2 or later and the JCE are required. JSch is released under a BSD license.

IBM's alphaWorks has updated their Abstract User Interface Markup Language (AUIML) Toolkit. "Version 5.1 now supports Eclipse 3.0.1 and includes significant updates in Web-renderered tables and other widgets. The release also includes many layout and functional fixes." This tool allegedly enables "developers to write an application once and run it in Java Swing or on the Web without any changes. The AUIML Toolkit includes the AUIML VisualBuilder, which is an Eclipse-based visual panel editor built on top of the Eclipse Visual Editor Project. The AUIML VisualBuilder allows developers to easily build user interfaces and generate Java data and event-handling code for them. Additional Java code can be written to AUIML's API to control application flow, data validation, and to listen for events. Once the application is implemented, it can be deployed as a Java Swing application or as an HTML servlet without changing the application's code."

Thursday, October 28, 2004

Pat Niemeyer pointed out that I could also make Mozilla do automatic keywork searching by setting keyword.enabled to true using the about:config. Cool! (Firefox sets setting keyword.enabled to true by default, but Mozilla doesn't.)

Siemens AG has posted the early draft review of Java Specification Request 182, JPay - Payment API for the Java Platform. According to the JSR, "the JPay API will allow Java applications (typically Web applications or Java enabled content servers) to utilize a 3rd party's payment service to charge users for using the application or accessing the content. The payment service could be for instance a Parlay gateway providing the Parlay Content Based Charging function or an implementation of the emerging PayCircleTM Payment Web Service specification. The payment service will conduct payments between the content provider, who runs the Java application, and a consumer, who uses the application. The JPay API will provide the application programmer with local access to the payment functionality provided by the 3rd Party's payment service. "

The Jakarta Apache Project has released Torque 3.1.1. Torque is a persistence layer that generates all the database resources (SQL scripts + Java object model/peer classes) required by an application and includes a runtime environment to run the generated classes. Torque was developed as part of the Turbine Framework, but is now decoupled and can be used by itself. 3.1.1 is a bug fix release.

Wednesday, October 27, 2004

Nokia has submitted Java Specification Request 257, Contactless Communication API, to the Java Community Process. According to the JSR,

Contactless communication can be used to provide a small amount of information to applications from some other medium, for example, links to some content or identifiers for services etc. Contactless communication can be based on e.g. Radio Frequency Identification (RFID), Near Field Communication (NFC) or bar codes.

NFC mode can be used for exchanging small amounts of information between two NFC enabled devices. RFID readers and tags do not need a visual contact but only close proximity between the reader terminal device and the tag. Some RFID tags can be also written and the data contained in them updated. Bar codes can be printed e.g. in adverts in magazines and newspapers, or on product packaging or for use at points of sale.

The API is targeted for resource-constrained devices such as mobile phones or consumer electronic devices and it must be memory-efficient.

This JSR will define two optional packages in a way that it is possible for a device to implement either read-only contactless communication (e.g. bar code reading) or bi-directional contactless communication (e.g. NFC) or both of them.

In the future, the FBI, local police, organized crime, and others will use this API to read passports, driver's licenses, and other forms of ID remotely so they can identify and track individuals.

The Jakarta Apache Project has released Standard Taglib 1.1.2, an open source implementation of the JSP Standard Tag Library (JSTL) 1.1 specification. This is a bug fix release.

Tuesday, October 26, 2004

Taking care of a piece of old business, On September 9th I asked, "Why won't any browser except Mozilla (not even Firefox) let me type my Google searches in the location bar? More importantly, why won't any browser (not even Mozilla) default to a Google search when what I type in the location bar contains spaces and is obviously not a URL or host name?" It turns out Firefox will do this, as Matthew Wilson, C. Brian Jones, and several others informed me. However, it defaults to "I'm Feeling Lucky" (i.e. go to the first page in the search results) rather than showing the usual search results. To change this:

Sun's released a minor maintenance update to the Java 2 Software Development Kit 1.4.2, version 1.4.2_06. This version fixes several dozen assorted bugs. It's available for Windows, Linux, and Solaris.

Sun has posted second maintenance draft review for JSR-12 Java Data Objects. The changes are minor but functional. Comments are due by December 6.

Sun has posted the maintenance draft review for JSR-180 SIP API for J2ME. The changes are editorial in nature, not functional. Comments are due by November 15.

Monday, October 25, 2004

XDoclet 1.2.2 has been released. The web page aptly describes this:

XDoclet is an open source code generation engine. It enables Attribute-Oriented Programming for java. In short, this means that you can add more significance to your code by adding meta data (attributes) to your java sources. This is done in special JavaDoc tags.

XDoclet will parse your source files and generate many artifacts such as XML descriptors and/or source code from it. These files are generated from templates that use the information provided in the source code and its JavaDoc tags.

XDoclet lets you apply Continuous Integration in component-oriented development. Developers should concentrate their editing work on only one Java source file per component.

This approach has several benefits:

  1. You don't have to worry about out dating deployment meta-data whenever you touch the code. The deployment meta-data is continuously integrated.
  2. Working with only one file per component gives you a better overview of what you're doing. If your component consists of several files, it's easy to lose track. If you have ever written an Enterprise Java Bean, you know what we mean. A single EJB can typically consists of 7 or more files. With XDoclet you only maintain one of them, and the rest is generated.
  3. You dramatically reduce development time, and can concentrate on business logic, while XDoclet generates 85% of the code for you.

XDoclet requires an Ant based build system. 1.2.2 is a bug fix release that also adds support for Java Server Faces, J2EE 2.1, and Java Data Objects 2.

Sunday, October 24, 2004

Nokia has submitted Java Specification Request 256, Mobile Sensor API, to the Java Community Process. "This specification will define a generic sensor API for the J2ME applications, delivered and licensed as an optional package. The API will offer unified way of managing sensors, connected to the mobile devices, and easy access to the sensor data. The J2ME applications will be able to configure and control sensors transparently from underlying connectivity protocols, e.g. activate, deactivate sensor, launch sensor discovery, start data sampling, etc."

Sun's posted the first alpha of the NetBeans Integrated Development Environment (IDE) 4.1. (No, you didn't miss something. 4.0 is not out of beta yet.) This early access release is available for Windows, Linux, and Solaris (but not Mac OS X). New features in version 4.1 focus on Enterprise JavaBeans and Web Services. Final release is planned for April, 2005. Java 1.4.2 or later is required.

Oracle has released final specification of Java Specification Request (JSR) 73 Data Mining API. According to the spec,

In JDM, data mining [Mitchell1997, BL1997] includes the functional areas of classification, regression, attribute importance 1, clustering, and association. These are supported by such supervised and unsupervised learning algorithms as decision trees, neural networks, Naive Bayes, Support Vector Machine, K-Means, and Apriori, on structured data. Common operations include model build, test, and apply (score). A particular implementation of this specification may not necessarily support all interfaces and services defined by JDM. However, JDM provides a mechanism for client discovery of supported interfaces and capabilities.

JDM is based on a generalized, object-oriented, data mining conceptual model leveraging emerging data mining standards such the Object Management Group’s Common Warehouse Metadata (CWM), ISO’s SQL/MM for Data Mining, and the Data Mining Group’s Predictive Model Markup Language (PMML), as appropriate

Implementation details of JDM are delegated to each vendor. A vendor may decide to implement JDM as a native API of its data mining product. Others may opt to develop a driver/adapter that mediates between a core JDM layer and multiple vendor products. The JDM specification does not prescribe a particular implementation strategy, nor does it prescribe performance or accuracy of a given capability or algorithm.
Saturday, October 23, 2004

Sun has released version 1.3.2 of JavaMail, a Java class library for e-mail that supports SMTP, POP, and IMAP. New features in 1.3.2 include:

Java 1.4 or later is required for SSL support. SASL requires Java 1.5 or later. Other than SSL and SASL, it will probably run with 1.3, and maybe 1.2 or 1.1.

BlueJ 2.0.2, a free integrated development environment (IDE) for Java aimed at education, has been released. 2.0.2 is a bug fix release.

Subversion 1.1.1, an open source version control system designed to replace CVS, has been released. 1.1.1 is a bug fix release.

Friday, October 22, 2004

Jarhoo is a neat little web-based tool for finding out where the class listed in the NoClassDefFoundError might be hiding. In my initial unscientific tests, it only found classes from core APIs, though. It couldn't find more obscure classes from various XML and Unicode APIs.

Hugues Pisapia and Marc Gimpel have posted JSpeex 0.9.5, an open source "Java port of the Speex speech codec (Open Source/Free Software patent-free audio compression format designed for speech). It provides both the decoder and the encoder in pure Java, as well as a JavaSound SPI." 0.9.5 is a bug fix release. JSpeex is published under a BSD license.

Thursday, October 21, 2004

Stefan Reich has released SuperVersion 1.2, a single user version control system suitable for small projects, as opposed to multiuser, server-based systems like CVS and Subversion. According to the web page, "Superversion 1.1 is feature-complete, very stable and suitable for everyday use. It can be (and is!) used for local versioning today; an extension for client/server operation is under development." Version 1.2 treats DOS and Unix newline characters the same, makes the database format compatible with 2.0, and fixes a deadlock condition. Superversion is published under the GPL.

Reich has also posted beta 5 of Superversion 2.0, which extends the product to handle multiuser version control.

Wednesday, October 20, 2004

Tom Copeland has released PMD 2.0, an open source tool for automatically checking Java code for various classes of bugs. PMD scans Java source code and looks for potential problems including:

This release adds a new logging ruleset It can also read the source code from zip and jar files, and the HTML report include links to online source code. Most importantly, it now recognizes "NOPMD" comments in the code to indicate that it should not flag a particular violation of one of its rules, a feature that lint had 20 years ago and most Java static code checking tools have been sorely lacking until now. It may finally be possible to write 100% PMD-clean code.

As is my custom, I'm testing this by running it several code bases I have handy. I'm not expecting much because I do this with almost every release of every static code testing tool. The new logging rules didn't find anything, but I wouldn't expect them to since none of my code does any serious logging.

The basic rules found one minor problem (an extra semicolon) and one medium serious problem (a do-nothing else block) amidst 127 false positives, mostly involving empty if blocks and catch statements. Possibly some of those should not be empty, but since so many of them should be it's hard to tell. In a lot of the cases, I could perhaps replace the empty blocks with continue statements.

The naming rules were flat out wrong, suggesting XOM shouldn't be using such "long" variable names as additionalPrefix, currentEntity, and baseAttribute. Let's lay this shibboleth to rest once and for all: cryptic variable names like addPrfx, cEnty, and baseAtt are a relic of 1970s era computers that had 32KB of memory and were lucky to be able to calculate the first 100 prime numbers without keeling over in exhaustion. Consequently languages designed for these pea-brained dinosaurs only considered the first eight characters of a name to be significant with led to the insane abbreviations that persist in C++ and Unix to this day. But this hasn't been an issue for at least 20 years. In 2004, there is no excuse for not using names long enough to convey the intent of the variable or method. On the flip side, PMS also complains about variables with "short names like in", a perfectly reasonable name for a variable of type InputStream.

Unused code detection is a strength of most such tools, and indeed PMD did find several more unused variables and statements that I could eliminate, even though I had run the previous version of this tool not long ago, and set Eclipse to flag unused code as an error. None of these were major, and about half could be classified as false positives, but all the real hits were easy fixes.

The Cyclomatic complexity detector did flag a few methods that I know are complex. However it also tended to incorrectly calculate the cyclomatic complexity for switch statements implemented via table lookup. In these cases the entire switch statement should count as a single decision point rather than one for each case. This sent some of my scores through the roof.

Cenqua has posted FishEye 0.5, a $999 payware tool for drawing graphs of CVS activity.

Robert Oloffson has posted version 0.44 of Java Memory Profiler (JMP). JMP uses the Java Virtual Machine Profiling Interface (JVMPI) interface to track objects and method times in a JVM. It uses a GTK+ interface to display statistics. The current instance count and the total amount of memory for each class is shown as is the total time spent in each method. 0.44 is mostly a bug fix release but also adds an "alloced/call" column to the method list. JMP is written in C for Linux.

Tuesday, October 19, 2004

Nathan Fiedler has released version 2.28 of JSwat, a graphical, stand-alone Java debugger built on top of the Java Platform Debugger Architecture. Features include breakpoints, source code viewing, single-stepping, watching variables, viewing stack frames, and printing variables. Version 2.28 fixes bugs, preserves the expanded state of the breakpoint groups in the breakpoints panel indefinitely, and adds a Copy menu item to the locals panel context menu. JSwat is published under the GPL.

IBM's alphaWorks has updated the Development Tool for Java-COM Bridge, a "tool for developing and enabling tight communication between Java™- and COM-based applications. An application running on Microsoft Windows® systems is typically constructed as a set of interconnecting components entirely based on Microsoft Component Object Model (COM) technology, or on Java technology. There is not a simple, direct way to connect a COM-based component with a Java-based component. The Development Tool for Java-COM Bridge enables the integration of both COM- and Java-based components in one application and allows the two kinds of components to communicate bi-directionally through the Java Native Interface (JNI) technology." This is a bug fix release.

Monday, October 18, 2004

Tomorrow evening (Tuesday) I'll be talking about Effective XML at the XML Developers Network of the Capital District in Albany New York. The meeting runs from 6:00 to 8:00 P.M. Everyone's invited.

Planamesa Software has posted the second alpha of NeoOffice/J 1.1, a MacOS X variant of OpenOffice that replaces X-Windows with Java Swing. This release "supports the features in OpenOffice.org 1.1.2 including faster startup, right-to-left and vertical text editing, and the ability to save documents directly to PDF." I wrote the original version of the Effective XML presentation in OpenOffice on Linux, which proved not up to the task so I eventually moved it to PowerPoint. I'll check this out and see if maybe I can use NeoOffice/J for tomorrow night's presentation, but no promises.

OK: verdict's in. That was quick. This product is definitely not ready for prime time, at least in the presentation component. As soon as I opened my PowerPoint slides, NeoOffice/J seemed to get stuck in an infinite flashing loop of draw and redraw. At least it let me quit, but I couldn't do anything else. I will be using PowerPoint tomorrow night.

Sunday, October 17, 2004
Mike Cannon-Brookes

Atlassian has released JIRA 3.0, a $1200-$4800 payware J2EE-based bug tracking and project management server application. Version 3.0 adds workflow editing, sub-tasks, and a plug-in system.

Friday, October 15, 2004

Sun announced financial results for the first quarter of their fiscal year that ended September 26. Sun lost $174 million, 5 cents per share, down from a $286 million, or 9 cents a share loss in the same quarter a year ago. This includes an $82 million charge to satiate the patent leeches at Kodak. (I don't know all the terms of the settlement. Kodak's case seemed weak to me, but maybe Sun got more from the deal than just a settlement of one patent claim. For instance, these cases often end with a broad patent colicensing agreement that might have been worth more than the one very qustionable patent Kodak was litgating.) It also includes $108 million for cuts in workforce and real estate. Sun laid off 2900 more workers in the quarter and gave notice to 600 more. Our thoughts are with all the displaced people. Revenue grew 3.6 percent to $2.63 billion. Gross margins grew to 42.9%.

Thursday, October 14, 2004

Subversion 1.0.9 has been released. Subversion is an open source version control system designed to replace CVS, the open source version control system we've all learned to hate. According to the announcement

This is a bugfix release in the 1.0.x line. Baring a security or data loss issue, this will be the last release in the 1.0.x line.

The most notable fix in this release is a solution for a performance regression that was introduced by the 1.0.8 release. Users using 'svn ls' or browsing functionality via DAV against a 1.0.8 server will notice slower response times. This release resolves this issue.

The 1.1.0 release also has the same issue. We will be releasing a 1.1.1 release soon which will resolve (among other issues) the same problem for the 1.1.x line.

The NetBeans Project has posted the second alpha release of a profiler based on Sun Labs' JFluid. It can profile memory and CPU usage. New features in this release include a threads timeline, attach using PID on Windows, and various usability enhancements and bug fixes. NetBeans 3.6 is required.

Wednesday, October 13, 2004

I've decided to go ahead and make the switch to CSS for this page. Only one person objected, (someone who used WebTV to read the site on the treadmill in the gym) and I was able to satisfy him with the No-frills version of this page. I'm still not sure I'd recommend a CSS layout for a consumer facing web site, but all you alpha geeks who come here seem to all have recent enough browsers to handle CSS. Kudos. :-) On the other hand if anyone is having trouble with this page, the old tables based layout will still be available for the foreseeable future at http://www.cafeaulait.org/tables.shtml.

Slashdot is collecting interview questions for Neal Stephenson. One of the proposals is to ask him to explain Enoch Root.

Sun has posted the final versions of twelve Java Specification requests (JSRs) that describe new features in Java 1.5:

BEA has posted the public review draft specification of JSR 181, Web Services Metadata for the Java Platform. This seems to describe a means of generating WSDL from Java code and Java code from WSDL using Java 1.5 annotations. Comments are due by October 25.

Michael Fuchs has posted version 0.60 of his DocBook Doclet that creates DocBook SGML and XML documents from JavaDoc. This release adds a "Constant Field Values" appendix and can handle numeric character references.

Gaudenz Alder has released JGraph 5.1, a free-as-in-speech (GPL) graph component for Swing that requires Java 1.4 or later. JGraph is accompanied by Graphpad, an open-source diagram editor for Swing that offers Automatic Layout, Printing, Zoom, and much more. It is available in English, German and French. Version 5.1 fixes some bugs and adds a few pieces of functionality to the API.

Nokia has posted proposed final draft of JSR-234 Advanced Multimedia Supplements. This is a J2ME API for controlling multimedia features like cameras, videocameras, and audio playback on newer devices such as camera phones.

jPOS 1.4.8 has been released. jPOS is an "ISO-8583 library/framework that can be used to implement financial interchanges, protocol converters, payment gateways, credit card verification clients and servers (merchant/issuer/acquirer)." Alejandro Revilla writes, "This new version represents over a year of hard work that includes bugfixes, performance tuning, new components, new TransactionManager framework, etc."

Tuesday, October 12, 2004

Nakina Systems has submitted Java Specification Request (JSR) 254, OSS Discovery API, to the Java Community Process (JCP). According to the JSR,

The Discovery APIs are suitable for use by applications that perform discovery of physical network devices and their data. The APIs provide an access point for configuration and management of discovery applications providing the means for the production of discovery files and discovery events related to the discovery job lifecycle.

Some examples of areas of concern for the Discovery APIs are discovery seed data, discovery agents, concurrency control, discovered data events, device connection management and policy, and device security credentials. The artefacts produced by these areas of concern are expected to manifest themselves in the form of an OSS Discovery object model that will extend the OSS/J CBE wherever possible (see JSR 144). The object model will also include OSS Discovery events. The existing CBE packages already provide many of the required methods for manipulating objects that extend the CBE.

Siemens AG has posted the public review draft of JSR 229, Payment API (PAPI). According to the draft,

The scope of this JSR is to define the following:
  • A generic optional API to initiate payment transactions and,
  • The syntax for the description of the associated provisioning data, enabling API implementers to support different payment instruments (or adapters).

Both will allow 3rd party developers to build applications with control of features and services that are chargeable. The JSR API may include methods for:

  • Requesting a payment transaction,
  • Requesting feature and service price management
  • Payment service availability

The definition for provisioning data makes sure that service providers and payment service providers can select a suitable set of payment adapters provisioned for applications during the application deployment time. Primarily payment adapters addressed will be:

  • Operator charging
  • 3rd party payment service providers

This JSR enables application developers to initiate mobile payment transactions from J2ME applications. It is an optional package for the J2ME CLDC configuration and targeted for MIDP and IMP devices. Scope of this JSR is to provide a generic payment initiation mechanism, which hides the actual payment architecture and complexity from the developers. This JSR does not define and imply any concrete payment implementation and mechanism but is generic enough to support different implementations. It is up to the implementing party to realize the API based on one or more technical solutions enabling the application initiated payment. The JSR also does not define any user behaviour or user interface but leaves them to be defined by the actual implementation of the API.

Comments are due by November 15.

Mort Bay Consulting has released Jetty 5.0, an open source servlet engine that supports version 2.4 of the Java Servlet specification. "Jetty is a 100% Java HTTP Server and Servlet Container. This means that you do not need to configure and run a separate web server (like Apache) in order to use java, servlets and JSPs to generate dynamic content. Jetty is a fully featured web server for static and dynamic content. Unlike separate server/container solutions, this means that your web server and web application run in the same process, without interconnection overheads and complications. Furthermore, as a pure java component, Jetty can be simply included in your application for demonstration, distribution or deployment." Jetty is published under the Apache 2.0 license.

The Jakarta Apache Project has posted Tomcat 4.1.31, an open source servlet container for the Apache web server and the official reference implementation of the Java Servlet API and Java Server Pages (JSP). This implements version 2.3 of the Java Servlet API and version 1.2 of Java Server Pages. 4.1.31 upgrades several supporting APIs inlcuding JavaMail to 1.3.1, JAF to 1.0.2, and JTA to 1.0.1b. It also adds support "for optionally passing the shell environment variables to the CGI script." Various bugs are fixed as well. Personally I prefer Tomcat 5. It's a quite a bit easier to set up and manage than Tomcat 4 was, but if you're still on Tomcat 4 you should probably upgrade.

Monday, October 11, 2004

Sun has posted the early draft review of Java Specification Request 208, Java Business Integration (JBI). According to the draft,

Enterprise application integration (EAI) and business-to-business integration (B2B) solutions have traditionally required the use of non-standard technologies to create functional systems. This has required end users to either "lock in" to a single vendor of such technologies, or create their own. Each approach has disadvantages. No single vendor can cover the vast functional space of EAI and B2B (consider the thousands of applications and protocols to be supported). This leaves users of integration technologies in the uncomfortable position of selecting less than ideal solutions to their integration problems, and paying dearly for them.

Java™ Business Integration (JBI) seeks to address this problem by creating a standards-based architecture for integration solutions, allowing third-party components to be assembled by the end user. These components provide the many varied integration functions needed; JBI provides the mechanisms to allow such components to interoperate predictably and reliably. By avoiding lock-in to a particular vendor of integration technologies, the user is free to choose components that provide the particular functions that he or she needs, and be assured that a functional integration solution can be assembled from those pieces.

In the past, attempts to compose third-party components into systems that have the attributes required of enterprise systems have not been very successful. JBI addresses this by adopting a service-oriented architecture (SOA), which maximizes the decoupling between components, and creates well-defined interoperation semantics founded on standards-based messaging. The SOA approach creates many other benefits that are applicable to enterprise integrations solutions.

Sun has posted public review drafts of four Java 2 Micro Edition (J2ME) related Java Specification Requests (JSRs). These are

These drafts update the various device profiles to Java 1.4.

Nokia has posted maintenance draft review for JSR-212 Server API for Mobile Services: Messaging. The changes are minor but functional. Comments are due by October 18.

The Jakarta Apache Project has released HTTPClient 2.0.2. According to the web page:

Although the java.net package provides basic functionality for accessing resources via HTTP, it doesn't provide the full flexibility or functionality needed by many applications. The Jakarta Commons HttpClient component seeks to fill this void by providing an efficient, up-to-date, and feature-rich package implementing the client side of the most recent HTTP standards and recommendations.... Designed for extension while providing robust support for the base HTTP protocol, the HttpClient component may be of interest to anyone building HTTP-aware client applications such as web browsers, web service clients, or systems that leverage or extend the HTTP protocol for distributed communication.

Version 2.0.2 "greatly improves the performance of executing methods where the response contains little or no content." It's published under the Apache 2.0 license.

Sunday, October 10, 2004

David Hovemeyer and Bill Pugh have posted FindBugs 0.8.5, an automated open source tool for finding potential bugs in Java code. This release includes several new detectors including:

As usual, I tested this release on the latest XOM code base. It didn't find any major bugs, but it did locate several less than optimal places in my code including two unused fields I could delete, two local variables I could eliminate along with the method calls that initialized them, and one place where I wasn't properly closing a file on all paths out of a method. False positives were few, mostly involving places where I was deliberately catching and ignoring an exception. Java 1.4 or later is required. FindBugs is published under the LGPL.

The Apache Commons Group has posted Betwixt 0.6, an open source Java class library that "provides an XML introspection mechanism for mapping beans to XML in a flexible way. It is implemented using an XMLIntrospector and XMLBeanInfo classes which are similar to the standard Introspector and BeanInfo from the Java Beans specification....Betwixt release 0.6 is the first release containing the refactored codebase featuring an improved design. This is a service release for those who have been using the code from the CVS branch and offers an easy, compatible upgrade path for those using the 0.5 design. It is recommended that all users should upgrade to this release since the 0.5 design is no longer actively supported and is limited in terms of functionality."

Julien Ponge has released IzPack 3.6.1., an open source tool for building cross-platform installers in Java. 3.6.1 is a bug fix release. It's published under the GPL.

JPOX 1.0.4 is an open source implementation of Java Data Objects (JDO) JDO 1.0.1 that provides transparent persistence to Java objects. It supports most major SQL databases and can be queried using either JDOQL or SQL. It's published under an Apache-like License. This is a bug fix release.

The Jakarta Apache Project has posted Tomcat 5.5.3, an open source servlet container for the Apache web server and the official reference implementation of the Java Servlet API and Java Server Pages (JSP). "Tomcat 5.5 is designed to run on J2SE 5.0 and later, and requires configuration to run on J2SE 1.4....In addition, Tomcat 5.5 uses the Eclipse JDT Java compiler for compiling JSP pages. This means you no longer need to have the complete Java Development Kit (JDK) to run Tomcat, but a Java Runtime Environment (JRE) is sufficient. The Eclipse JDT Java compiler is bundled with the binary Tomcat distributions. Tomcat can also be configured to use the compiler from the JDK to compile JSPs, or any other Java compiler supported by Apache Ant." This implements version 2.4 of the Java Servlet API and version 2.0 of Java Server Pages. The version numbering is funky. This is really more like an alpha release and is definitely not considered to be ready for production.

Saturday, October 9, 2004

I've just added Specification-Title, Specification-Version, Specification-Vendor, Implementation-Title, Implementation-Version, and Implementation-Vendor attributes to the manifest file for XOM. It's the Implementation-Version and Specification-Version that concern me. Currently they look like this:

Specification-Version: 1.0b7
Implementation-Version: 1.0b7

Eventually I expect they'll look like this:

Specification-Version: 1.0
Implementation-Version: 1.0

And then this:

Specification-Version: 1.0.1
Implementation-Version: 1.0.1

The concern is that according to the JAR file specification only the middle one is legal. The production for version number is

version-number : digit+{.digit+}*

Thus 1.0, 1.1, and 1.2 are all legal version numbers but 1.0a1, 1.0b7, 1.0.1, 1.2.2,and so forth are not. On further research, it looks like the JAR file spec is wrong. According to the versioning specification, version numbers have the form "major.minor.micro; major version numbers identify significant functional changes, minor version numbers identify smaller extensions to the functionality, micro versions are even finer grained versions. These version numbers are ordered with larger numbers specifying additions to the specification." However, this still leaves open the question of versions like 1.0d25, 1.0a1, 1.0b7, 1.0rc1, and so forth. Further reading in the versioning spec shows that implementation versions are only compared for equality, so alphanumeric values should be OK there. However, the specification version is still an open question. Does anyone know whether using non-numeric version numbers for Specification-Version is likely to be a real problem? If so, please drop me a line.

Is anyone else as annoyed as I am by all the URLs in Sun tutorials and documentation that point into old, obsolete versions of documents that Sun has removed? Sun's Norm Walsh sits on the W3C Technical Architecture Group and Sun's Tim Bray did until quite recently, but I guess they haven't told the rest of the company about the architectural principle that "cool URIs don't change" and "A URI owner SHOULD provide representations of the identified resource consistently and predictably."

Friday, October 8, 2004

The Apache Portal Project has posted the first release candidate of Pluto 1.0, the open source reference implementation of the Java Portlet Specification. According to the announcement,

The Java Portlet Specification defines a Portlet API very similar to the Servlet API. The API provides means for aggregating disperate content sources. The specification addresses security and personalization considerations and defines a standard with which these sources, or portlets can be deployed.

Pluto is an embedable portlet container which will typically be bundled within a fully functional Portal. The Pluto community has developed a simple portal driver implementation which allows for the testing and development of portlets with the container. The Pluto testsuite is an implementation agnostic portlet application which tests several basic operations of the container in which it is deployed.

Thursday, October 7, 2004

The Jakarta Apache Project has posted a beta of Tomcat 5.0.29, an open source servlet container for the Apache web server and the official reference implementation of the Java Servlet API and Java Server Pages (JSP). Tomcat 5.0.29 implements version 2.4 of the Java Servlet API 2.4 and version 2.0 of Java Server Pages. 5.0.29 will be a bug fix release.

Wednesday, October 6, 2004

I've written a version of this page that uses CSS for the layouts instead of tables. Please take a look at it, and let me know if anything looks too funky to live with. It's essentially the same layout I've debbugged on Cafe con Leche over the last couple of weeks, so i don't expect any major problems. However, a few more people read this page than that one, so perhaps someone will find a new issue here.

The Peacock Book

I'm very pleased to announce the publication of XML in a Nutshell, 3rd edition by myself and W. Scott Means, now available at a fine bookseller near you. XML in a Nutshell is quite simply the most complete and succinct treatment of the major technologies in XML you'll find anywhere. Topics covered include elements, attributes, syntax, namespaces, well-formedness, DTDs, schemas, XPath, XSLT, XSL-FO, CSS, SAX, DOM, internationalization, XHTML, and more. The third edition is a major update that syncs the book with the latest developments in XML including:

If you don't have a copy, you need a copy. Do you need to upgrade your old copy? If you're sticking to XML 1.0 (a recommendation I've made in my two previous books and continue to stand by in this one), the second edition will probably continue to serve you well. However, if you're still thumbing through a very dog-eared copy of the first edition, it's definitely time to upgrade. XML hasn't stood still in the three years since the first edition was published, and there's a lot of new and improved material here.

Amazon has the cheapest price I've seen, $27.17, a 32% savings, plus they're offering free supersaver shipping. It will also be available on Safari in the not too distant future for those readers who prefer their books in electronic format. The book is XML in a Nutshell, 3rd edition. The ISBN is 0-596-00292-0. It's published by O'Reilly, and written by W. Scott Mean and me, Elliotte Rusty Harold. Check it out!

Tuesday, October 5, 2004

Linus Tolke has posted ArgoUML 0.17.1, an open source UML modeling tool written in Java. I've been meaning to add a really simply class diagram to the XOM documentation for some time. What I was trying to do was nothing fancy, just nine classes in a hierarchy three levels deep, and I only want to show the class names, not even any attributes or operations. ArgoUML is open source (BSD license) so I decided to fire it up and see how it ran. Big mistake. This product is clearly not ready for prime time. I wouldn't consider it even alpha quality. The user interface is flaky, and the documentation is poorly organized and poorly written. Clicking on tool icons would sometimes activate them and sometimes wouldn't. At least once I had to quit the entire application and relaunch it before it would let me create a new class box. Critical operations are only accessible from the context menu, which much more often than not refused to appear. It's about exactly what you'd expect from a product with a version number of 0.17.1. The whole product was almost non-functional and absolutely unusable. Maybe one day this will be a worthy product, but that day is not today, it's almost certainly not this year, and it probably won't be this decade.

Having gotten that off my chest (I have a real distaste for products that waste my time, open source or otherwise), can anyone recommend a free UML tool that actually works? I suppose I could fire up my old copy of Visio (5.0, I think), but that requires booting up the Dell laptop with the dead battery, and drawing on the tiny screen with a trackpad. Bleah. Or I could use StencilIt!, a great pre-UML product that never went anywhere post-1.0. But it really feels like there should be something for less than $5000 that can draw UML class diagrams. I've long suspected UML's main purpose in life was to sell consulting, books, and tools; and that nobody was actually using it. If nobody has noticed how unfinished and incomplete ArgoUML actually is up till now, to the point of awarding it a Jolt Productivity Award, I'm now convinced that's true.

Update: lots of people have written in with a host of suggestions. I doubt I can try everything recommended, but I'm going to start at the beginning and try each one until I get my diagram drawn. It's a really simple diagram. Surely one of these can do the job.

First out the gate is UMLet, which nearly didn't make the cut because it requires Java 1.5, but apparently an older beta might do the trick. I immediately note: no documentation, ships with an old and buggy version of Xerces, and no runnable file, just a bunch of JARs. Amazingly despite this it runs. The user interface is obviously designed by someone who's never bothered to look at what's in the edit menu of every major application on the planet. OK let's see if it works.

The editing interface is weird but plausible. The panel layout is poor. It doesn't allow nearly enough space for the stereotypes (is that the right word?). The instructions are right up front—good; but it should be using drag and drop rather than simple double clicking. However, I rapidly dug myself into a hole I couldn't reverse from (Why are the stereotypes editable in the first place?) and had to quit and relaunch. OK, now I've got the first three classes set up. Oops! I lost my SimpleClass stereotype again. Hmm, looks like I dragged it behind the panel. By what insanity is this possible? Anyway, got it back now. OK. I've set up all eight classes (two abstract and seven concrete), time to connect them. Oh, wait a minute. UMLet doesn't automatically resize the class boxes for long names, so first I should resize a few. OK, that's done. Now let's make sure everything is in the right place. There seems to be an invisible grid the boxes are snapping to. That's good. The lack of alignment tools had worried me. OK, let's try connecting them now. That went OK. Here's the finished result:

Don't see anything? Me neither. Apparently it exported a corrupt JPEG. Final grade for UMLet: F.

What to try next? A couple of people mentioned Jude. This one's free beer. Oh wait. No it isn't. They want my personal info so they can spam me before they'll let me download a copy. Nope. Next!

JP Bonn suggests the payware Enterprise Architect. It can reverse engineer code to diagrams (which I would love to be able to do, though I don't need to do it today). Cost is between $125 and $225. There's a free trial. Sounds good, but wait! It only runs on Windows (or Linux using CrossOver Office). Nope, that's not my platform right now. They lose the sale, plus sales to anybody who might have listened to my recommendation if I had liked the product. Next!

Gentleware's Poseidon CE is a product I've mentioned here before. It's a free-beer lite version of a payware product. No reverse engineering in the community edition, but as I said, I don't need that today. I'm just trying to draw one damn picture! They have a WebStart version. This should make evaluating it a little easier, but Mozilla can't seem to figure out how to do that. OK. Looks like Safari can. The application is loading now. Hmm, 4.2M of 18.9M complete. My fingers are twiddling. Thank Zeus I have a high speed connection. (Oops. Wrong god. I hope Poseidon doesn't get angry with me.)

OK. It finally loaded, and they didn't self-sign their certificate like most companies do. Plus 1. They want me to register for a license key, but I seem to be able to cancel out of that (another good sign). They've got a startup tip, and it can be turned off in an obvious way if I don't like it. Two more good signs. At least one person at this company is on the ball, which is more than I can say for all the other products I've tested today.

Looking at the interface, it doesn't seem too complex. The tool tips remind me which box is a class and which is a package. I'm able to turn off the attributes and operations using the context menu, as I'd expect. They even put the menu bar at the top of the screen where God intended it to be. Excellent. There are a few mistakes in the user interface. It gets some of the menu shortcut keys wrong, and puts the Exit menu item in the wrong place on the Mac, but overall it's the best effort yet (which ain't saying much).

OK, first hiccup. I don't see how to make the class abstract. I may have to (Horrors!) read the documentation. OK. Found it. The checkbox was hidden because the window was too small for all the widgets, even though my monitor is quite large. Expanding it to fill the screen revealed the necessary checkbox. Why this didn't start with a maximized screen I don't know. Time to save. They don't use a native file dialog. Why not, I don't know. OK, now I tried to create a new class by copying and pasting an old one, so I wouldn't have to hide attributes and operations and resize the new box, and instead I seem to have changed the name of the class to "cstring element". Where the hell did that come from? Looks like a bug. Poseidon does seem to resize the class boxes as necessary to accommodate long class names. However, when I turn off the attributes and operations it does not shrink the boxes. I have to do that manually. Plus 1. Minus 1.

Now I have all nine classes laid out. It's highlighting the bounding box of the entire diagram as I move classes around. That's a nice touch. I just need to connect the classes. This is harder than it should be. Poseidon keeps creating new classes and interfaces rather than connecting to my existing classes. At least Undo works. OK. I think I've figured out how to do this. Now if I could just get the generalization arrows to connect to the right points on each class box. Trying to move them just seems to create another class. Anyway, this is almost right. Let's export it to PNG:

Oh my God. Look at that! They've decided to put advertising for their product in my diagram. What's worse, they never told me they were going to do that. This isn't a community edition. It's a crippled demo. They almost had me until that point. I don't mind companies choosing to provide a limited demo of their products, but I hate companies that lie and aren't up front about what they're offering. What a colossal waste of time. Next!

The next suggestion in my Inbox is Borland Together Designer Community Edition. Let's see if this is a real product or another piece of false advertising. The download is 60 megabytes. There better be something there. You know what: they require cookies and registration, so I'm not going to bother.

Borland used to be a company that really understood developers, but they've had troubles for the last ten years or so, a combination of both Microsoft aggression and internal incompetence, though one can argue about what percentage of their travails to attribute to each cause. This time though, I'm attributing their problem to internal incompetence. They had an opportunity to have their product reviewed on a web site read by 20,000 Java developers a day; but they'd rather get my e-mail address to send me more spam. Next!

Next up is MagicDraw. This one is payware, but they have a demo, which they actually call a demo instead of lying about it like some other companies. However, they want me to register before I can download it. Nope, no go. They lose the review and the potential sale. Next!

OmniGraffle looks interesting, and the Pro version can import and export Visio files, which would be a big help with a lot of legacy figures I have laying around from various books written in my Windows days. And they'll give me a trial license key right away. No registration or waiting required! They don't even ask for my name or e-mail address. How civilized of them. If the product actually works, they may have made a sale. They do need to fix the MIME types on their web server, though. Mozilla tried to display the disk image file rather than downloading it.

It seems I may not have to buy it. As I was copying the Omnigraffle Pro demo into my applications folder, I noticed there's a already a copy of Omnigraffle there. I can only surmise that it came with the Mac. (There was a lot of bundled software I ignored.) Yep, it seems to be licensed to "Macintosh Software Bundle".

This is basically a drawing program, not a UML program; but it does have a UML stencil; and, unlike all the UML programs I've tried today, the tools work in an intuitive fashion. For instance, I can change the name of class box by typing right inside the box, instead of hunting around for some dialog hidden a menu item or two deep. The boxes line up and distribute with each other automatically, and show me how they're doing it as I move them using little blue lines that vanish as soon as I've moved the boxes into place. I'm not quite sure how they're doing this, but it's damn smooth. Tool tips show me where things I'm moving are, but don't get in my way like the handles in some of the other products I've tried. The arrows lock to the center of the boxes automatically. (I never could figure out how to get Poseidon to do that.) OK. I spoke too soon. I had one arrow that Omnigraffle really, really wanted to lock to the side of the box, but it took me 10 seconds to delete it and put in a new arrow. I never did get Poseidon's arrows pointed exactly where I wanted them. Basic things like copy and paste work exactly like I expect them to work. Maybe my expectations have been lowered by all the crap I've dealt with today, but I am very impressed.

On the other hand, some things I have to do by hand. For instance, there's no way to mark a class abstract that I can see. I just have to italicize the class name. And it won't do things like reverse engineer source code or export to XMI, but it is giving me a pretty nice picture with much less frustration than the other tools I've tried today.

Here's the finished diagram. This is pretty much what I wanted. I'm not so happy with the arrows. I think they'd look better with small black heads. And after about 15 seconds of hunting around through several palettes in Omnigraffle, I found the option to do that. However, I don't think that's what the UML standard expects so I've left this as is. The picture's also a bit wide. It will probably slide under or over the navbar if your browser window is fairly narrow. I'll need to fix that. Omnigraffle can't make up for my own lack of artistic talent.

XOM class hierarchy as drawn in OmniGraffle

But isn't that nice? Look at those gorgeous drop shadows. And so much easier than the other options! I like this product. I think I've finally found a worthy replacement for StencilIt!; and the next time I need to open my old Visio files, I'll upgrade to the Professional edition instead of booting up my Windows laptop. You see, I'm not congenitally pissed off. I actually can like a product if it's worth liking.

Why am I not surprised the first product to actually work is the only one designed explicitly for the Mac? Fact is, Mac users are just pickier about user interfaces and software in general. We will not put up with bugs and poor design any Windows or Linux user would not even notice. This has led to brutal selection in the Macintosh developer community. Macintosh software companies either learned how to develop quality software or went out of business.

I am finding it hard to believe the sheer number of mistakes I encountered across all these products (except for OmniGraffle, which was near perfect aside from a small web server configuration issue). It's not like I was trying to find mistakes, or delving deep into the obscure corners of each application. I just couldn't help stumbling across major flaws. A few of the tools I looked at were open source, hobbyist products done as time permits; and I understand those may have issues. But quality control seems seriously lacking across the board. I'm thinking very seriously about starting a service in which I will privately review software for companies. This would not be a fancy and expensive user interaction study like the Nielsen-Norman Group might do (valuable though that might be), but just a detailed list of all the flaws I find in a day or two of putting the product through its paces. I'm just getting this idea now; but seriously, if you think your company needs a service like this, send me an e-mail. Let's talk. I have no idea if I can actually sell this service or not, but there's obviously a desperate need for it.

Monday, October 4, 2004

Sun's posted the second beta of the NetBeans Integrated Development Environment (IDE) 4.0. NetBeans is available for Windows, Linux, the Solaris(tm) Operating System and Mac OS X. New features in version 4 include:

Java 1.4.2 or later is required.

BlueJ 2.0.1, a free integrated development environment (IDE) for Java aimed at education, has been released. 2.0.1 is a bug fix release.

IBM has released version 1.22 of Jikes, their open source Java compiler written in C. Version 1.22 "supports compilation using the rt.jar shipped with the released version of Java 5.0, but otherwise has no more support for new language features than 1.21 did." It also fixes assorted bugs. Jikes is published under the IBM Public License.

Sunday, October 3, 2004

Cox Communications has posted the early draft review specification of Java Specification Request 242, Digital Set Top Box Profile - "On Ramp to OCAP". According to the executive summary,

In the North American cable market, the current landscape of set top boxes consists of a mix of non-standard, incompatible APIs and development environments, resulting in expensive application development, and thus ultimately restricting the types and number of applications available on legacy set top box platforms. At the same time, there are currently only a few distinct classes of set top boxes deployed, and the majority of these set top box platforms have been proven capable of running a Java Virtual Machine.

OCAP defines a standardized, interoperable, Java-based middleware specification that developers can use to produce compelling content for a comprehensive range of set top box hardware. Unfortunately, it requires set tops to have greater capabilities (CPU, RAM, ROM, etc) than is available in the vast bulk of those currently deployed.

OnRamp provides a solution for these existing set tops. By modeling this API as a subset of OCAP, OnRamp provides a clear migration path to the OCAP environment.

Comments are due by October 31.

Saturday, October 2, 2004

The Legion of the Bouncy Castle has released version 1.25 of the Bouncy Castle Java Cryptography API, an open source, clean-room implementation of the Java Cryptography Extension (JCE). It supports X.509 certificates, PKCS12, S/MIME, CMS, PKCS7, and lots of other juicy acronyms. It also includes its own light-weight crypto API that works in Java 1.0 and later, and does not depend on the JCE. New features in 1.25 include:

Plus a few significant bugs were fixed. Download it while it's still legal.

Bare Bones Software has released version 8.0.2 of BBEdit, my preferred text editor on the Mac. This release fixxes one bug in FTP/SFTP uploads that occurred in 8.0.1. BBEdit is $179 payware. Upgrades from 8.0 are free. Upgrades from earlier versions are $49 for 7.0 owners and $59 for owners of earlier versions.

Friday, October 1, 2004

James Strachan has released beta 7 of Groovy, a JVM hosted scripting language that strikes me as more than a little baroque and a tad Perl-like. Not that the syntax lookes like Perl. (Hard as it is to believe, Perl syntax would probably be an improvement.) It's just that Groovy looks like feature after feature has been glued on to a foundation of sand. I don't feel an overall sense of design here. There's no overarching vision for what a language should look like that I can discern. There are lots of features to like in the language (and quite a few to dislike: I'm sorry, but operator overloading is simply a bad idea, as C++ proved once and for all; and we've known for at least 30 years that having both = and == in a language is a mistake; adding === to the mix doesn't help.). Built-in regular expression support is probably a good idea, if it's done right, but Groovy doesn't do it right. Rather than building it into the core syntax of the language like Perl does, there's just a minimal amount of syntax sugar on top of the usual java.util.regex package, which still needs to be imported. Rather than just using regular expressions as you would in Perl, you have to compile patterns and create Matcher objects. GPath might be useful, but I'm really worried it would fall apart if you tried to use it on structures that don't follow the neat, record-like patterns the developers expected. (I could be wrong about that one, but I've seen these sorts of things done wrong so many more times than I've seen them done right, that the burden of proof is on those who want to claim GPath works.) Closures might be helpful, but even the features that do seem like a good idea when considered individually don't feel like they fit together. Groovy just isn't as clean a language as Java or Python. :-(

Lorenzo Bettini has released GNU Source-highlight 1.11, a GPL'd tool for reading Java, C/C++, Prolog, Perl, PHP3, Flex, ChangeLog, JavaScript, LUA, CAML, SML, and Python code and translating them into syntax highlighted HTML and XHTML. Binaries are available for Unix, and it should compile on Windows with the appropriate libraries. Version 1.11 is a bug fix release.

Older news:

January January, 2004 January, 2003 January, 2002 January, 2001 January, 2000 January, 1999 January, 1998
February February, 2004 February, 2003 February, 2002 February, 2001 February, 2000 February, 1999 February, 1998
March March, 2004 March, 2003 March, 2002 March, 2001 March, 2000 March, 1999 March, 1998
April April, 2004 April, 2003 April, 2002 April, 2001 April, 2000 April, 1999 April, 1998
May May, 2004 May, 2003 May, 2002 May, 2001 May, 2000 May, 1999 May, 1998
June June, 2004 June, 2003 June, 2002 June, 2001 June, 2000 June, 1999 June, 1998
July July, 2004 July, 2003 July, 2002 July, 2001 July, 2000 July, 1999 July, 1998
August August, 2004 August, 2003 August, 2002 August, 2001 August, 2000 August, 1999 August, 1998
September September, 2004 September, 2003 September, 2002 September, 2001 September, 2000 September, 1999 September, 1998
October October, 2004 October, 2003 October, 2002 October, 2001 October, 2000 October, 1999 October, 1998
November November, 2004 November, 2003 November, 2002 November, 2001 November, 2000 November, 1999 November, 1998
December December, 2004 December, 2003 December, 2002 December, 2001 December, 2000 December, 1999 December, 1998

[ Cafe au Lait | Books | Trade Shows | FAQ | Tutorial | User Groups ]

Copyright 2004 Elliotte Rusty Harold