Slides from the Roller talk.
I sent them to TriJUG last night. Until they post, I'll host the presentation here: RollerTalk-TriJUG-2004.ppt (MS PowerPoint).
The Atom API, dependencies, and logic that I just don't understand.
I've been casually following the various Atom API debates and I've found that reading the back and forth flames is educational for me as I try to better understand XML, HTTP, and the various approaches to web services. Maybe you can help me out because some logic that I just don't understand has been introduced into the debate. I'll explain.
I've never written a real spec like the ones that IETF or W3C produces, but it seems to me that when you are writing a spec, as when you are designing software, you have to think a lot about dependencies. You have to decide what specs are you going to build your spec upon. With the Atom API initially, there seemed to be a bunch of choices for foundation specs including HTTP, XML, SOAP, and XML-RPC. Now, obviously you need HTTP and XML because Atom is about the web and the Atom data format is XML, but what do you need beyond that? You need some framework or at least some guiding philosophy on which to base a web services API, but you're never going to get concensus to bring XML-RPC or SOAP into the Atom API dependency list. There's too much politics in this decision, too much baggage comes along with SOAP, and most sane people realize that XML-RPC is an amorphous blob not a spec. So, you're stuck with HTTP and XML.
I don't think being stuck with HTTP and XML is a really a problem. HTTP and XML are fine specs and they've gotten us very far, at least in my practioners view of the web. What I don't understand is why you would limit yourself to using only two of the verbs defined in the HTTP spec, as Russell suggests. The Atom API is an API spec for a web application, so why shouldn't it make full use of the spec that literally defines the web? It's not like HTTP is some complex beastly thing either. HTTP is a pretty simple spec, simple and powerful, and it's verbs are perfectly suited to the Atom API problem domain. Making full use of HTTP and XML rather than pulling in SOAP or XML-RPC reminds me of the XP philosophy of doing the simplest thing that will work.
I guess what it comes down to is that I just don't understand Russell's logic. He seems to be saying: Java2 Micro Edition's (J2ME) HTTP support is incomplete and therefore the Atom API sucks. Russell also implies that the standard HTTP verbs DELETE and PUT were intentionally left out of J2ME. Do we know that to be a fact? How can that be anything but an oversight and, when you get right down to it, just a bug in J2ME.
MainSoft and Mono.
Following up my Running Dot-Net apps in a J2EE environment post about MainSoft's new MainWin for J2EE product, I found that MainSoft uses and contributes to Mono - a GPL an MIT licensed version of the Dot-Net class libaries:
<a href= "http://primates.ximian.com/~miguel/all.html#2%2F17%2F04%2012%3A00%3A00%20a"> Miguel de Icaza: Mainsoft has been using Mono's class libraries to deliver the functionality and they are regular contributors to the code base. We wish them much luck with their new product.
Where are those slides?
Not a very tough choice for me: should I clean up my speakers notes and post my slides tonight, or should I go out to shoot pool and tilt back a few beverages of the golden variety? Suffice it to say, you won't be seeing those slides tonight.
Running Dot-Net apps in a J2EE environment.
Remember MainSoft? They were the Win32-on-UNIX company that Microsoft didn't shoot down (unlike Bristol).
Anyhow... Matt Raible reports that MainSoft has a compiler that transforms Dot-Net apps to J2EE apps. According to the marketing materials, MainSoft's product <a href= "http://www.mainsoft.com/products/vmw_j2ee.html">Visual MainWin for J2EE supports Weblogic, Tomcat, and Websphere. Assuming that they support operating systems other than Windows, this is a pretty amazing engineering accomplishment. They must have both a compiler that converts MSIL bytecode into JVM bytecode and what's more, a complete compatibility layer that translates ADO.Net calls into JDBC calls, ASP.Net calls into Servlet API calls, and etc. That's amazing and a hell of a lot of work, but it is not clear to me that anybody will buy it. Win32-on-UNIX was an amazing feat too, but it did not exactly take the software development world by storm.Talk went well.
I was nervous as usual, but I think I did pretty well. Almost everybody stayed until the end and folks asked lots of questions after the talk. After I clean up the speakers notes in my slides, I will hand them over to TriJUG so they can post them on the TriJUG site.
Triangle JUG tonight: Weblogs and Java
Looks like the dusting of snow is not going to postpone my talk at the Triangle Java Users Group tonight. I have my slides ready and I've rehearsed the talk several times. I'm ready. I will be talking about weblogs in the Java community, weblogs at work, and the architecture of the Roller Weblogger software. Here is my high level outline:
- Java weblog community
- Weblog software features
- Weblog infrastructure
- Weblogs & communities
- Weblogs at work
- Roller demo
- Roller architecture and lessons learned
Introducing Hierarchical Categories in Roller
This weekend, I added support for hierarchical categories to the Roller macros. Hierarchical categories make it easy to partition a weblog and to manage both a main weblog and a number of sub-blogs. For example, I would like to have a link blog where each post is a URL to some interesting place and a comment about that place. I don't want my link-blog links to show up in my main weblog.
I added new category-capable versions of a number of Roller macros, as you can see in the three pairs of methods below. Now, if you want to display only weblog entries one category and it's sub-categories you can use catagory-capable macros to get what you want.
showWeblogEntries($dayTemplate $max): Display up to $max number of entries using specified day template. showWeblogEntriesInCategory($dayTemplate $max $cat): Same, except only include entries under $cat. showRSSLinks(): Show links to available RSS feeds. showRSSLinksForCategory($cat): Show links to vailable feeds under category $cat. showWeblogCategoryChooser(): Show links to all top-level categories. showWeblogSubcategoryChooser($cat): Show links to top-level subcategories under $cat.
But those category-capable macros are not enough to support the main-blog and sub-blogs arrangement that I had in mind. To get that, I added the notion of a main category to Roller. Now you can specify a main category for your weblog, and the showCategoryChooser(), showWeblogEntries(), and showRSSLinks() methods will treat that main category as the root of your weblog.
It is easier to understand this by example, so I'll tell you what I did to this site. Before re-arranging my site, my category tree looked like this:
+ Root <-- MAIN CATEGORY + General + Java + Rolling + Blogging + Dot-Net + Links
My main category was my root category and my top-level categories were Java, Dot-Net, General, Blogging, and Links. I wanted to partition my weblog so that my links category no longer shows up on my main blog and in my main RSS feed. To accomplish this, I rearranged my categories to look like this:
+ Root
+ Main <-- MAIN CATEGORY
+ General
+ Java
+ Rolling
+ Blogging
+ Dot-Net
+ Links
I moved my main-blog categories under a category at path /Main and set that as my new main category. Now, without changing any macros on my weblog pages, my weblog and RSS feed will include only entries from under category. As you can see by hovering over the links above in my category chooser, the links now point to category paths /Main/Java and /Main/Blogging rather than just category names Java and Blogging as they used to. You can also see the same effect in my RSS feeds on the lower right-hand side of the page. The RSS feeds macro now displays only the top-level categories under the main category and my main RSS feed now includes only posts made in the main category and it's subcategories.
To display entries under my Links category, which will be my link-blog, I'll use the new showEntryLinksInCategory("/Links") macro. I'll add that later, probably right under my calendar on the right-hand side of the page.
All this stuff works fine if Roller is configured to use Hibernate, which is the Roller default, but under Castor-JDO, fetching of subcategories does not work. It was important to me, for performance reasons, to be able to fetch all entries under a category and in all subcategories by using a single query. I don't think a recusive approach with queries at every level would be performant. To accomplish the one query, I had to de-normalize the Category table by adding a Category-Assoc table. By issuing a single multi-table query, I can get what I want, but most unfortunately, Castor-JDO does not support multi-table queries. So, long story short, if you use the Castor-JDO backend, you are stuck with a single level hierarchy.
Welcome to new Roller blogger...
Jeremy Sproat, who is running Roller 0.9.8.1 and JSPWiki and has created nice new themes for both.
Wiki article: RollerArchitecture.
In preparation for my talk Monday, I put together some new diagrams and a short overview of RollerArchitecture on the Roller Wiki.
Enterprise whuffie.
More source material for my talk next week: Weaving Social Nets for the Enterprise.
Sometimes my desire to develop blogging software
outweighs my desire to blog. That is the case right now. I've been working on getting hierarchies right in Roller and it is eating almost all of my free time. Plus, I've got other things to do, like teaching Alex and Linus how to ride bikes, watching Lawrence of Arabia, preparing my talk, and, god forbid, working. I'll be back.
JRoller seem sluggish today?
It does to me too. Rick Ross and I are investigating. Update: we never did figure out what cause the sluggish behaviour today. We suspected mod_jk because it was throwing lots of "SEVERE" errors, but it has been throwing those for a while now. Looks like we have not banished all of the gremlims that haunted FreeRoller in days of old.
#roller
Despite that busy week, I've been making time for Roller development in the evenings. I've also been keeping a window open on the #roller IRC channel on freenode.net. Stop by for a chat if you have Roller questions or just to say hi.
Busy week.
That was a long and busy week with lots of meetings, a big customer visit, app server portability gremlins, and a code freeze that never got past the slush stage. I didn't have a whole lot of time for blogging, but I did setup a new weblog at work to track the progress of some remote dev work that I am coordinating. I'll be spending some time this weekend working on my TriJUG presentation and perhaps that will provide some fodder for blogging.
The Weblog Community Aggregator.
A new type of web site is becoming popular in the weblogging world: the Community Aggregator. A Community Aggregator is a portal-like web application that displays weblog posts from a group of closely related but separately hosted weblogs and provides synthetic newsfeeds so that readers may subscribe to the group as a whole.
I'm not sure where this concept originated. The first such site that I recall is Javablogs, but others have suggested that Blawgistan was one of the the first and that O'Reilly had a community aggregator in 2000. I'm not sure when weblogs.oreilly.com came online. O'Reilly's Meerkat came online in 2000, but it does not really fit my definition of a community aggregator.
Portal like experience for web browsers. Web browsing visitors who visit a Community Aggregator experience a portal-like web site centered around the display of the most general of the synthesized newsfeeds.
Other information included on the portal page might include list of links to the weblogs included in the aggregator and display of other newsfeeds of interested to the community. For example, an open source software project might display the newsfeed from the project's bug tracking system and the newsfeed from the project's build system on the sidebar of the portal page.
Synthesized feeds for newsreaders. Synthesized newsfeeds are intended for users of newsreader software such as FeedDemon, NewNewsWire, or SharpReader. The synthesized feeds allow you to subscribe to the community as a whole instead of picking out specific individual weblogs.
The owners of an aggregation site might set some rules to limit which weblogs are included in the synthesized newsfeeds and what type of weblog entries are included in the feed. For example, community aggregation site javablogs.com allows anybody to sign up to be included on the site and asks only that included weblogs be primarily about Java. O'Reilly Weblogs includes only O'Reilly authors. The Planet Apache community aggregator allows only weblogs belonging to members of the Apache Software Foundation.
Features useful in a Community Aggregator:- Allow users to mark weblogs as favorite-blogs or ignored-blogs.
- Count clicks on each weblog entry.
- Allow users to design their own synthesized feeds.
- Allow administrator to "pin" weblog entries to the top of the page.
- Download subscription list as OPML
- Weblogs.com API RPC interface
- Search API RPC interface
- Portal-like web UI
- ARS Linux
- Advogato Recent Logs
- BLawgistan - now offline
- Fedora People
- JavaBlogs.com
- Java.net Weblogs
- KDE Developer Journals
- MetaDean - just a spec?
- Monologue
- O'Reilly Weblogs
- Planet Apache
- Planet Debian
- Planet Lisp
- Planet Python
- Planet RDF Hack
- Planet SUSE
- Weblogs@ASP.NET
- Weblogs at Harvard Law
- Spycroll - Python blog aggregator used by some "Planet" sites?
- http://planetplanet.org - is this the future home of the software that drives the various "Planet" sites?
- Monologue - ASP.Net application that drives the Monologue site.
« Previous page of month (Feb 2004) | Main | Next month (Mar 2004) »