A trip down memory lane: I have a Prolog programming job
- Get link
- X
- Other Apps
I just accepted a small consulting job that is to be written in Prolog. Ten or fifteen years ago, I was pretty much a Prolog guru (I once rewrote a planning system that had taken 6 weeks to write in Common Lisp to a Prolog version - took just 4 or 5 days -- and the Prolog version had better graphics than the Common Lisp version). Fortunately, I worked through the excellent book Art of Prolog a few years ago, so I am not that rusty at Prolog programming. When Prolog is an appropriate for a problem domain, probably no other programming language is as productive. Good applications of Prolog include search, circuit layout, planning, and natural language processing (but not statistical natural language processing).
A novel search engine application
- Get link
- X
- Other Apps
During a couple hour conversation today with my publisher, he posed the problem of determining what word sequences can logically go together in natural language. Examples would be: the cow is brown - OK the cow is green - probably does not make sense the recess was one hour - OK the recess is brown - makes no sense if recess is used as a school break, could make sense if the recess is the (Wordnet #2) sense "an enclosure that is set back or indented" I would normally think of this as a sort-of hidden Markov model problem: look for frequencies of words appearing together, allowing a few wild card intermediate words. However, a better solution came to me in about 15 seconds: use a search engine like Nutch to index a reasonably large part of the web. To test word sequences like "the cow is brown" and "the cow is green", we would need to look at the number of times the words [cow, brown] appeared in that sequence close to together; same for [cow, green]. T...
The world is getting more peaceful
- Get link
- X
- Other Apps
You would not know it from most shoddy "20 second sound bite" news services but this Washington Post article clearly states otherwise . I quote: A major study by the Rand Corp. published this year found that U.N. peace-building operations had a two-thirds success rate. They were also surprisingly cost-effective. In fact, the United Nations spends less running 17 peace operations around the world for an entire year than the United States spends in Iraq in a single month. The reality is that, since the end of the Cold War, armed conflict and nearly all other forms of political violence have decreased. The world is far more peaceful than it was. It turns out that terrorism kills very few people, even small wars kill many people, and as the world becomes more tightly linked economically, war makes even less sense to sane and rational people.
New open source project: Ruby Message System
- Get link
- X
- Other Apps
I have relied on guarenteed delivery asynchronous messaging to build large scale systems for 20 years. I was surprised when I could not find something simular to Java's JMS for Ruby so I decided to build my own and release the server under a GPL license and the client libraries under a LGPL license. When I have code to release it will be in the usual place ( www.markwatson.com/opensource ). If I am reinventing the wheel, please let me know! I only plan on implementing what I need, but maybe when there is a public code base other people might contribute. This project is in the planning stage right now. Here are some rough notes: 1. unlike Java JMS, there is currently no planned support for publish and subscribe 2. the primary data structure of RMS is a shared collection of named message queues 3. there is currently no planned support for security: it is anticipated that enterprise applications will use RMS behind a firewall. very limited security will be provided by an optional conf...
Great commentary by Mark Shields
- Get link
- X
- Other Apps
Mark Shields is more than a bit more liberal ("to the left") than I am, but he gets it absolutely correct in this good opinion piece . I am a "fiscal conservative": I don't believe in large government expenditures in anything but education, defense (but to not use our armed forces in foolish ways), maintaining roads, etc. I voted for Bush in 2000 but I now feel that he is clearly the worst president that the U.S. has had in my lifetime. No one even comes close to both his failed policies that damage our country everyday and his thouroughness in protecting his own privacy but eagerness to strip away privacy and civil liberties of U.S. citizens. He gets away with it the way that corrupt elite-backed rulers have throughout history: dehumanize desired adversaries and do everything that you can to scare your own population instead of making them feel secure like a good leader tries to do. Think of Winston Churchill: "We have nothing to fear but fear itself....
Java and Ruby integration
- Get link
- X
- Other Apps
One of the chapters of the new book that I am writing is on Java and Ruby integration, mostly through cooperating web services. The idea for this chapter came from a small customer job that I did 18 months ago: integrate a CRM system written in PHP with a document work flow web portal that I had written for them using Tomcat+JSP+custom tag libraries+Prevayler. Sure, one of the great things about Ruby Rails is that the whole stack fits so well together - you lose some of the advantages of Rails when you start mixing in other technologies. Still, at this time a subset of J2EE and Ruby on Rails look to me like the two best tools for building web applications, so it makes sense to have strategies for using both technologies in a company or organization.
flickr: coolest web portal?
- Get link
- X
- Other Apps
A good friend of mine has been recommending flickr.com for a while and I set up a site with public pictures of Sedona, my family, etc. . Flickr is close to "desktop application functionality". Since I use so many different computers for my work, I like relying on web apps like flickr, gmail, del.itios.us, etc. And with all of my work and writing materials stored one of my servers with CVS, I have the freedom to work just about anywhere. For just about anything I do on the internet I have sufficient bandwidth. I do look forward to improvements in reducing network latency that will make using web portals and web applications even more compelling. There are drawbacks: for example, saleforce.com had a recent outage that affected some customers for a while - that is the drawback to outsourcing your business infrastructure. Still, I think that the convenience of well implemented web portals trumps any sporadic access problems.
RubyPlanet.net is done (for now)
- Get link
- X
- Other Apps
I ended up spending almost 6 hours writing and deploying the RubyPlanet.NET web portal. I would have preferred to write the portal software in Ruby but for cost reasons I used Java: I have a leased server running a single Tomcat instance. With Tomcat, it is trivial to add new virtual hosts so deploying this new web application only took a few minutes and costs me nothing extra. I currently do not have a leased server running Apache and FastCGI but that situation will change in the next week. There are other features I could add to this web portal, but I basically did it to "scratch an itch": I wanted a single page summary of what people are writing on their blogs about Ruby - this "blog scraping" is automatic so will take no effort on my part. I did add sections "News" and "Resources" that I have to manually maintain but I have a slick administration web interface that lets me effortlessly modify these sections. Anyway, I keep my new web portal ...
Moving to more collaborative web applications
- Get link
- X
- Other Apps
While I was listening to a 90 minute presentation on the Croquet project , I started thinking of what lessons can web portal developers learn from the croquet developers who have no constraints of supporting legacy technology. Croquet, still in early development, uses peer to peer protocols to allow small numbers of users to share a 3D simulation space - 3D graphics, naive physics, IP telephony, etc. are built in. Users of a web portal do not know who the other users are and can not interact with them. Now, to a limited degree, we could support some interaction between users who have an active session using AJAX: user modifications to a shared data store could be broadcast back out and a Javascript could listen for broadcast changes. However, this requires a central server - Croquet sends changes to an environment (actually, it only broadcasts user inputs and counts on the environment simulation being deterministic - same precision math used on all connected computers, etc.) using peer...
Efficient use of time, getting things done
- Get link
- X
- Other Apps
After coming back from a 20 day vacation in Belize and Guatemala, I have been revisiting making my work flow as efficient as possible. The first thing that I am doing (a "New Year Resolution" made several months ago) is to concentrate on mastering just two technologies: Java and Ruby server side development. I find it fun to spend about 10 hours a week spread out over research and learning about AI in general, trying many software frameworks written in Lisp, Smalltalk, Python, Ruby, and Java - a New Year Resolution is to limit myself to a few hours only to Ruby and Java, and a few hours on AI research. In the last few years I have tried to streamline my development work flow to minimize time wasted: use CVS for everything, use standard web server setups and automate deployments, etc. For Ruby development, I just came up with another developer's trick that is saving me time: I set up a Ruby standard class library project with Eclipse (and RDT and Rad Rails) than has all of...
RubyPlanet.NET - all things Ruby
- Get link
- X
- Other Apps
I was looking for a Ruby oriented blog feed aggregator and did not find one so I just created the domain name RubyPlanet.NET and I am currently implementing the site. I will automatically filter out non-Ruby blog posts so feel free to submit your blog feed URL to me even if you only occasionally post about Ruby programming.
World peace: yes it is possible
- Get link
- X
- Other Apps
I just returned from a trip to Belize and Guatemala. Visiting other countries always reminds me of how similar people are. I believe that spiritually we are all bound tightly together and on a practical day to day level we all want the same thing: a better life for our children, a safe environment to live in, and time to spend with people we love. So why do we have wars? The answer has been the same for all of known history: a small group of elites profits from war, whether they are the people behind George W. Bush, Muslim extremist leaders, the Nazis, wealthy Romans, etc. Normal people do not profit from war but often their leaders and the elites in their countries do. The mechanism of going to war has also always been the same: dehumanize the opponent and spread fear among your own population. The more I travel the more optimistic I get that with better communication, human consciousness will reach a higher point where self-serving leaders will loose the power to spread fear and dehu...
I have a new book contract
- Get link
- X
- Other Apps
I need to check with my publisher before talking too much about my new project, but the book will focus on advanced development techniques using Ruby and Ruby on Rails. I assume that readers already have knowledge of Ruby, Ruby on Rails, and some enterprise development experience. Anyway, I love to write and I am very much looking forward to working on this project. I find myself using Ruby more than Java now. I still think that Java is great for huge enterprise projects but most of my work is for smaller deployments and mid-size projects where Ruby and Ruby on Rails simply seems like a better fit. Since I have a Lisp (I have written 2 Springer-Verlag Lisp books and many years of Lisp use) and Smalltalk background, Ruby is a very comfortable language for me to use. I find it interesting that Ruby might end up being the vehicle for introducing Lisp-like and Smalltalk type programming paradigms to mainstream programmers. Really, the only problem that I have with Ruby is that it is slow -...
Back from Belize
- Get link
- X
- Other Apps
Carol, our friends Tim, Kathleen, Tom, and Cheryl, and I all had a great time. We did 5 days of beach time, then rented a sailboat for a week to explore the second largest coral reef in the world, then spent 4 days inland to the north. On the spur of the moment, two days ago we rented a car and driver to go into Guatemala to see the ruins of the Mayan super-city at Tikal - awesome! When I was in high school, I took about a 3000 mile train ride down to Merida to see the Mayan ruins at Chichen Itza. A very long day driving to Tikal was easier than that train ride!
I am going to be offline for a few weeks
- Get link
- X
- Other Apps
Later this week, I will be in the Caribbean (mostly diving) - so no blogging for a while. Carol and I are going with two other couples - all dear friends. I will post a few pictures when I get back. I have two very exciting projects starting up, so it is a little difficult to break away right now for a vacation - but the work will be here when I get back and I am looking forward to it.
Best paper on Ruby on Rails
- Get link
- X
- Other Apps
Rick Bradley wrote Evaluation: moving from Java to Ruby on Rails for the CenterNet rewrite as an internal company strategy document - a great read! I have only been using Ruby on Rails for relatively small (low traffic) projects so I was most interested in Rick's take on RoR for enterprise class systems.
This guy gets it right: Java language extensions hurt the platform
- Get link
- X
- Other Apps
I don't usually just write blog entries linking to other people's writing, but Ed Burnette gets it totally right : adding new language features to the Java language hurts the Java platform. Look, there are two huge advantages to the Java platform: The JVM is supported on many platforms The wealth of Java libraries, tools, and applications As Ed points out so well, language extensions hurt efforts to get JVMs universally available on all platforms. Writing Java code that only targets version 1.5 language features prevents it from running on GNU gcj/CLASSPATH and on operating systems that do not have a reliable 1.5 JVM. Except for a few projects for my own use only, I make a point of setting IntelliJ to target version 1.4.x JVMs. I obviously like to run 1.5 JVMs to pick up the runtime improvements, but for serious work, I still target the 1.4.x language.
Cornucopia complex, Ruby on Rails vs. Java and Lisp
- Get link
- X
- Other Apps
"Cornucopia Complex" is an old joke of mine: fear of too many good things :-) I claim to be program language agnostic (best tool for the job, etc.) but that is not strictly true because given sufficient libraries of pre-built code, I would just about always choose to program in Lisp. The point here is that existing infrastructure software continually drives me to one language or another. Java usually wins big here with tools like Tomcat, Lucene (including that fantastic Nutch project - I have been using Nutch in the last week - great stuff!), Hibernate, etc. But Java does not win hands down: Ruby on Rails gets more compelling the more I use it. Seriously, compare using one of the Java AJAX frameworks with the simplicity of in RoR just including the prototype Javascript library in a RHTML template, and using link_to_remote, form_remote_tag, etc. On the Ruby side, a controller class action simply returns HTML with full access to form values using params[], etc. The first time I...
Updated version of my "Practical AI Programming in Java" free web book
- Get link
- X
- Other Apps
A download link is on the Open Content page on my main web site . I re-worked the chapter on Hidden Markov Models, added a chapter based on Paul Graham's 'Plan for SPAM' ideas (with his permission), and converted the manuscript to Open Document Format (using OO2 version 2). As always, please email me if you see any typos or other errors.
I just added PDF and RTF export to KBdocs.com
- Get link
- X
- Other Apps
I have been writing the KBdocs.com online word processor for my own use, but it is also freely available to anyone who wants to create a login account for themselves. I found the old export as a HTML fragment file to be fairly useful for exporting from the web site to a local word processor, but RTF is a little more convenient. While I was adding RTF export functionality I decided to also implement PDF file generation.
MIT's $100 laptop
- Get link
- X
- Other Apps
I have been following this story for a long time, so it feels good to see pictures of a mock-up unit in the news today. The unit will only be made available to schools and NGOs, but I have a few suggestions: Have a program where people can purchase 10 units for donation to schools in poor countries (or their own country for that matter). Kids getting the units could optionally get a picture of the donor's family so they know who gave them the computer. Donors would receive one machine for themselves for 'geek value'. Computer geeks could purchase a unit for software development testing, or whatever, for double the price, plus shipping so one extra student would also get a computer. Universal improvement in education will help make the world a better place, for sure.
Tomcat, Ruby on Rails, and Araneida
- Get link
- X
- Other Apps
While I do most of my work using Tomcat (mostly JSPs, POJOs, a few custom tag libraries, and a few persistence strategies) I still devote a fair amount of time covering two other great server side platform options: Ruby on Rails and Common Lisp Araneida and cl-http web servers. For server side Lisp, I think that I am going to start favoring Araneida over cl-http because Araneida (with LispWorks Professional) only uses about 20 megabytes of working set memory while cl-http uses much more memory. Most people might find Lisp a strange language choice, but not only have I written two Springer-Verlag Lisp books so my Lisp skills are fairly good, I find the ultra-high performance of natively compiled Lisp refreshing after both java (which also has great performance on the server side once HotSpot has had a good chance to work) and Ruby (which only has OK performance while executing built in methods that are compiled C code). Because good Lisp programmers are difficult to find, I tend to sta...
Partnering and forming a Corporation
- Get link
- X
- Other Apps
My wife and I are planning on forming a corporation around our KnowledgeBooks.com business ideas. Our business plan is simple (at least in concept): slowly build up a collection of knowledge-intensive web portals that provide free services with some income generation from advertisements. If appropriate business-wise, package web portals as commercial products for deployment inside customers' local area networks and provide consulting services for customization. The great thing about this business plan is that except for our time, it is a low-cost business to startup and run. A difficult decision for us is whether or not we want to actively persue finding partners for our business. It would be great to have a graphics artist/web designer, a marketing person, someone with better hosting bandwidth, etc. Since our goal is more to create a growing sustainable business than to make a quick buck, sharing ownership in the corporation is not a problem. We are more concerned with finding pe...
Interesting artificial intelligence problem
- Get link
- X
- Other Apps
I have been working on a very interesting AI problem today. (This is not for a customer, rather it is for my wife's and my CJsKitchen.com web portal so I can talk about it :-) A bit of background before discussing the problem itself: users of our web portal are encouraged to maintain a simple database on our server of what ingredients that they have on hand in their kitchens. This data is stored per user in a database on my server and is easy to keep up to date. Users can search/view all recipes or just recipes that they have the ingredients on hand to make. The AI problem is this: given (in a case based reasoning sense) a set of recipes, the ingredients the user has on hand, user preference for cooking style (American Comfort Food, Italian, Chinese, or Japanese) and how spicy they want the dish to be, the problem is this: create a good recipe using only the ingredients the user has in their kitchen. As a bonus, I offer advice, based on the requested cooking style, on spices to bu...
Possible privacy concerns, but I like Google's personal search
- Get link
- X
- Other Apps
A few years ago when I was in California I spent a fun afternoon at the sci-fi writer and physicist David Brin's house - he had a Java related business idea that we were talking about. Anyway, he has an interesting take on privacy: reduced privacy is OK if everyone gets the same power of "surveillance" (hopefully, I am paraphrasing him OK on this). I thought about David's take on privacy when playing with Google's new beta (of course :-) personal search tonight: you login with your Google account and it remembers your search queries, what links you follow, etc. This is all searchable and convenient so I think that I am going to use it frequently in the future. Since nothing you do on the internet is really private without taking some effort, I just accept that. Now, in practice, only software agents are likely to be monitoring what we do on the web, whether it is Google, Yahoo, or one of dozens (or more!) companies that make our business their business. US, UK, e...
Intel Macs running OS X, Linux, and Windows
- Get link
- X
- Other Apps
This is big, at least to me. I use two laptops and two desktop PCs (and some leased hosted servers) for my business: 2 Macs and 2 dual boot Linux/Windows boxes. I don't like clutter in my home office, and the idea of one high end Intel Mac laptop (with an external monitor for desktop use) that is OS X/Linux/Windows capable sounds great to me. I absolutely don't mind rebooting since I usually need to use one OS for a while, depending on what I am working on. As I have written before, the secret to no hassle switching computers and operating systems is a CVS server so you can sync up development assets easily on any computer (cvs or svn update is your friend :-)
Excellent: official Java support for system tray functionality
- Get link
- X
- Other Apps
This is excellent! I use a very good 3rd party library to add system tray functionality to JFC Java applications when running under Windows and quietly fail when running on Linux. Sun's JDK 6.0 (Mustang) support covers Windows, KDE Linux, and Gnome Linux desktops in a portable way. BTW, I do wish that Linux distribution creators and Sun could get together to have a JRE installed by default on Linux desktops, but I hold out little hope of this. GNU Java (Classpath, gcj, etc.) are coming along nicely but I find it much less facile to develop with than Sun's JDK.
A la cart media purchases will lead to higher quality in TV and movies
- Get link
- X
- Other Apps
Apple's iTunes music store has changed the way I buy music: preview before I buy and only buy what I really like - a great combination where I spend more money on music than I used to but my satisfaction as a consumer is much greater than when I used to buy music CDs. I hope for the same kind of flexibility in purchasing video content: movies, short "Indie" movies, and selected TV shows. The improved quality will certainly be greatest for TV, which has the most room for improvement. The current TV network system works against the success of smaller niche market programs that have small but loyal followings. We spend a lot of money on cable TV each month and I am not really a happy consumer. There is just too much stuff offered that my family has no interest in what so ever. I don't mind paying for TV shows, movies, and "Indie" films that I really like, but I want control and selection. DRM that does not threaten the security of my computers is fine with me -...
What a difference a day makes
- Get link
- X
- Other Apps
Latest Java Trails version 0.8 looks very cool
- Get link
- X
- Other Apps
Congratulations to Chris Nelson! Trails is looking better and better. I had a chance to grab the new version released yesterday and went through the first few tutorials: 1 and 2 . I have little spare time right now, so I just quickly zoomed through the tutorials. When I get a few spare hours, I want to dig into the Trails code itself. I like Ruby on Rails because of the ease of customizing the auto-generated scaffold code. I spent a little time looking at the generated Trails configuration files, etc. and I am not sure about customizing as far as changing global appearance, etc. but the second tutorial shows how to use Java 5 annotations to change generated form labels, data formats, etc. The second tutorial does show how to change page templates, which is probably what I want: a functional equivalent to global changes of style sheets.
Microsoft's Live.com
- Get link
- X
- Other Apps
Since I used Microsoft's new beta portal on my Linux laptop running FireFox, I may not have had the "full experience" :-) That said, live.com looks well done: the client side Javascript is slick and the interface is simple and clean. I was not so happy with the requirement to login with Passport (otherwise, all your customizations go away when your session ends). Anyway, I think that competition between Google, Yahoo, and Microsoft in the web application area is great. Because I mostly use Linux I use Google's and Yahoo's web applications but Microsoft has announced that they will support other platforms - I am at least trying to keep an open mind about using live.com in the future, depending on what useful functionality that they provide.
Poor product: Sony Network Walkman NW-E95: poor MP3 support
- Get link
- X
- Other Apps
This is just my personal opinion: I wanted to get my wife a portable MP3 player for her birthday - she enjoys downloading free MP3s (mostly talks people give, etc.) from the internet. We went out and bought a Sony Network Walkman NW-E95 today only to discover that while it works beautifully for transferring music from an audio CD collection it seems to be (again this is just my opinion) purposefully crippled for playing arbitrary MP3 files. There is a lot of great free content on the internet in MP3 format and I think that Sony made a really bad decision to not support a wide variety of MP3 formats. I found a web blog where someone suggested taking MP3 files and using them to create audio CDs - then load these CDRs to the Sony Network Walkman NW-E95; this is more trouble than my wife wants to go to listen to audio lectures (she has little interest in listening to music on a portable player). BTW, we live in a very small town, so we have to drive 25 miles to get to an electronics store...
Great Java open source project: Nutch search engine
- Get link
- X
- Other Apps
Nutch is an Apache licensed open source search engine project that I have been keeping an eye on for a while. One thing that makes this project especially compelling is that the author of the (fabulous) Lucene search library Doug Cutting is also a principle designer and implementer of Nutch. You can grab the source code using subversion: svn co http://svn.apache.org/repos/asf/lucene/nutch/ Nutch now contains two new modules: the Nutch Distributed File System (patterned after the Google File System) and a Java version of MapReduce (patterned after Google's MapReduce). So far, I have only been looking at the source code (no builds and playing with it yet!) but this stuff looks really good. Anyone want to start a search engine company? :-)
Good update: RadRails 0.4 released today
- Get link
- X
- Other Apps
Efficiency (or lack of) in Java reflection: glad we have it anyway
- Get link
- X
- Other Apps
It is good that the java.lang.reflect package exists. This interesting read (a PDF file on java.sun.com) shows a great example of using a decorator/proxy/delegation pattern for implementing a logging property across multiple classes. Neat stuff and I like this better than, for example, using Aspect Oriented Programming (AOP) to get the same effect: add logging without touching original POJO classes. However, Java reflection is not very efficient and I have seen at least one very large Java application that has poor performance because it performs lots of reflection. Other languages like Ruby have better support. Common Lisp Object System ( CLOS ) with support for things like before/after methods, class slot introspection, etc. also is very effective for applications requiring more flexibility than Java.
I add spell checking/correcting to KBdocs.com online word processor
- Get link
- X
- Other Apps
I had a little time this weekend to add spell checking/correcting to my KBdocs.com online word processor . There are some general directions on the "About" page. This system is still in beta (I have just written it in the last week and a half in my spare time) so please email me with any bug reports. Thanks!
WebSphere Community Edition: not available until the end of the year
- Get link
- X
- Other Apps
I was enthusiastic about the announcement from IBM: bundling WebSphere Community Edition with Eclipse development plugins etc. sounded great but after a fair amount of searching I saw that it will not be available until the end of the year. I don't intend to be critical of IBM: I appreciate their Java SDK for the PowerPC architecture, their support of Linux, etc., etc. However, it seems like this early announcement is just to generate some buzz for IBM's purchased Gluecode and perhaps to rain on JBoss's parade. While I am very happy with my development environment for simple JSP, JavaBeans, custom tag libraries, etc. I would like a super productive environment for use when I want to use more of the J2EE stack. The JBoss Eclipse IDE looks like it may be a possibility and IBM's WebSphere Community Edition looks like another possibility - I think that it is worth waiting for this to sort itself out. Meanwhile, I find it ironic that my favorite Ruby Rails development syst...
Classic computer science text and papers on the web
- Get link
- X
- Other Apps
I have seen the old Frank Sinatra movie that my wife is watching so I decided to read tonight. I still appreciate my rather large personal library because physical books, journals, and reprints are more fun to read than balancing a laptop. That said, I thought that it would be interesting to share some of my favorite links to classic computer science texts and papers: Structure and Interpretation of Computer Programs is arguably the best single text book Original 'Lambda Papers' by Guy Steele and Gerald Sussman General reading on Kolmogorov Complexity; for example: 1 2 This is just a sampling taken from my bookmarks. The ACM has a program to make classic texts available. Other must-study 'classics' like "Introduction to Algorithms" (Cormen, et. al.) are still too new (first edition 1991) to be freely available. I find it interesting to re-read material that I used many years ago - you get a different take on papers and texts after years of experience, making...
KBdocs.com updated: added document export and search (or: sometimes it is good to be lazy)
- Get link
- X
- Other Apps
I updated my new KBdocs.com web portal to support search and exporting all of a user's documents compressed into a ZIP file. I only had an hour or so free today to work on this, so I got lazy: I had intended to export the rich text documents that a user keeps on the web portal as OpenDocument formatted files for OpenOffice.org, AbiWord, etc. I often read (programatically, that is) OpenDocument files: easy: it is a ZIP file, so just grab the contents, style, whatever that you need as ZIP file entries. The problem was that it looked like a multi-hour task to take the internal rich text format used on the web portal (which is really just HTML snippets) and generate equivalent looking OpenDocument formatted document files. So, I got lazy and just bundle all of a user's documents in one ZIP file for users to download. It turns out that OpenOffice.org imports these ill-formed HTML files just fine - so, I am happy that I did not spend the time right now generating OpenDocument files....