Last week Wilfred and I spent some time to understand why the Maven2 mvn site:deploy command would not work when scp was used to access the target server. Based on the documentation we put:

<servers>
  <server>
    <id>server-id</id>
    <username>gumpy</username>
    <password>hushhush</password>
  </server>
</servers>
in the ~/.m2/settings.xml file and included
<distributionManagement>
  <site>
    <id>server-id</id>
    <name>Deployment Server</name>
    <url>scp://server-id.domain.com/home/gumpy/projects/</url>
  </site>
</distributionManagement>
in the projects POM. Looks OK, right? Well, while using commandline scp or ssh works using the credentials above, mvn site:deploy fails saying it cannot authenticate (and lists the supported authentication methods).

After a number of attempts we decided to try the private key authentication method in combination with an external scp command. This worked! It might not be what you want in the end, but at least we could continue. Small advantage of this solution might be that you don't have to include a password in your ~/.m2/settings.xml file. On the other hand, everybody who wants to deploy the site has to get their public key included in the servers ~/.ssh/authorized_keys file, which might be a disadvantage.

Here's the settings.xml snippet:

<servers>
  <server>
    <id>server-id</id>
    <username>gumpy</username>
  </server>
</servers>
And this is the projects POM snippet (note that scpexe indicates that an external scp command must be used):
<distributionManagement>
  <site>
    <id>server-id</id>
    <name>Deployment Server</name>
    <url>scpexe://server-id.domain.com/home/gumpy/projects/
  </site>
</distributionManagement>
<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh-external</artifactId>
      <version>1.0-alpha-5</version>
    </extension>
  </extensions>
...
</build>
In addition to these changes to the settings.xml and the projects POM file we had to include the SSH public key of our development machines in the .ssh/authorized_keys2 file of the "gumpy" user on the server.domain.com machine. A howto for "SSH without a password can be found here.

I suspect that the above is just a temporary workaround till the Maven 2 site:deploy plugin is fixed.

Earlier this week I upgraded two of my mission critical machines. The first one was a planned upgrade. My server at home (which is hosting the blog) was still running RedHat 9 and time and time again I ran into packages that would not install. I was a afraid that it would take me days to get everything (Apache, Tomcat, IDS, imap server, ...) up and running again, but was pleasantly surprised! I upgraded to < a href="http://fedora.redhat.com/">Fedora Core 4 and the upgrade went like a breeze. The Fedora installer asked me if I'd like to upgrade and it did almost everything correct for me. The thing I had to fix manually were:

  • The mod_jk module for Apache
  • The IMAP server. I don't remember the name of the IMAP server that was included in RedHat 9, but Fedora included Dovecot and that was real easy to install and run
  • For IDS one of the Perl modules was missing (Image::Info), using CPAN that was fixed quickly

The other machine I upgraded was my laptop. This was not a planned action :-( The laptop was running Solaris 10 and I tried to mount an unused partition on the harddisk since I needed some extra space. I tried to do this using fdisk, but somewhere I must have made a mistake. After a reboot the machine wouldn't start anymore and even trying to fix it by booting from the installation DVD would not work. The only thing I could do was to completely reinstall the machine.... Data lost? Not really, it happened on Monday and I usually run a backup of the data on my laptop during the weekend :-) That's a good habit. The laptop is now up and running again, no more Solaris 10, but Nevada. Nevada (codename for development of Solaris 11) has even better support for laptops and since I did have to reinitialize the whole machine anyway, why not go for something cool? After installing the OS I added all my favorite applications using pkg-get from Blastwave. Really convenient.

Back to work...

I just became the proud daddy of a beautiful baby girl. As all IT guys, I usually don't start with the manual when I get my hands on something new: exploring is the best way to learn something ;-) This time, though, I decided to do it by the book and read the JavaDoc first. The description of the sleep() method worries me a bit.... I wonder if there is a plugpoint when I can squeeze in a more reliable implementation of the sleep() method.


Interface BabyGirl


public interface BabyGirl


Method Summary
 void sleep(long millis)
          Calling the sleep(long millisec) method suggests that the BabyGirl goes to sleep for the specified number of milliseconds.
 

Method Detail

sleep

public void sleep(long millis)
           throws java.lang.InterruptedException,
                  java.lang.UnsupportedOperationException
Calling the sleep(long millisec) method suggests that the BabyGirl goes to sleep for the specified number of milliseconds. It's up to the implementation to decide if it will actually do so.

Parameters:
millis - the length of time to sleep in milliseconds.
Throws:
java.lang.InterruptedException - if the sleep is disrupted by anything.
java.lang.UnsupportedOperationException - if the implementation does not allow others to decide when sleeping is appropriate.

For a demo at a developer event next week spent some time on figuring out how to build Glassfish. Glassfish is the next version of Suns J2EE application server and it has been open sourced at JavaOne this year. I did not find a complete how-to right away, but after some searching it came down to some simple steps:

A couple of prerequisites:

  • JDK1.5 (set JAVA_HOME and have $JAVA_HOME/bin in PATH)
  • Maven 1.02 (set MAVEN_HOME and have $MAVEN_HOME/bin in PATH)
  • cvs

Now start building it:

  1. First you need to make sure that you have a network connection to the CVS server at java.net. At home that's no problem, but at the office I had to set up a tunnel through a socks proxy using ssh like this:
    ssh -x -2 -g -L 2401:localhost:2401 tunnel@cvs.dev.java.net
    
    The password is tunnel
  2. Once you're connected, log in to CVS at java.net:
    cvs -d :pserver:guest@localhost:/cvs login 
    
    (password empty)
  3. And get the main module:
    cvs -d :pserver:guest@cvs.dev.java.net:/cvs checkout glassfish/glassfish
    
    If you set up a tunnel in the first step you should replace cvs.dev.java.net with localhost like this:
    cvs -d :pserver:guest@localhost:/cvs checkout glassfish/glassfish
    
    
  4. Now cd to the glassfish directory and edit the project.properties file. In my case I had to adjust the following properties:
    glassfish.os.name
    glassfish.cvs.username
    glassfish.root
    maven.proxy.host
    maven.proxy.port
    
  5. Now you're all set up to get the rest of the code. Do a
    maven checkout
    
    and sit back for a while... this is going to take ~30 minutes or so and will give the all the code that is part of Glassfish.
  6. In order to build it you need two extra steps:
    maven bootstrap
    maven build
    
    The bootstrap step completes fairly quick, the build step is taking up to an hour, so sit back and catch up with some reading.
  7. Now the appserver is build and using a
    maven configure-runtime
    
    The runtime environment will be configured. After this goto the ../publish/glassfish/bin directory and do a
    ./asadmin start-domain domain1
    
    to start the freshly build application server.
  8. You should now be able to acces the admin console on http://localhost:4848 (log in as admin/adminadmin) and the webpages at http://localhost:8080. (You can changes these ports in the project.properties file if you want.)

Working at Sun sometimes pays off in unexpected ways, yesterday was one of those days: being a Sun employee got a backstage pass for the U2 concert at the Amsterdam Arena! The deal was of course that I had to work. John, Danny and Mary already blogged about this and had the same pleasure. What was the deal? In the second half of the concert Bono asks the audience to support the campaign against AIDS and poverty by taking out their mobiles and sending a text message to a certain number. The senders should include their names in the text message and later in the concert their names will be displayed on the large screen that is backing the stage. Why do they need a local Sun employee? The whole thing is run by US staff, but outside the US and UK they need local native speaker to moderate the messages and make sure that no swear words will appear on screen. And guess what, I was one of the lucky ones.

Before the show Robin showed me around and this was the place we had to do our work.
.

During the show the place looked like this.
.

And this is me and Robin after we moderated the messages.
.

I was expecting a lot of creativity from the Dutch audience with regard to swear words, but all the obvious ones were already filtered out by the application and of the few that I had to filter out Ms. Hornyfeet (in Dutch Geilvoets) was the funniest one (what exactly would she do with her feet...). The result of our moderation looked like this, if you look real good you can decipher some names... the place where we were moderating the messages was halfway the field so I could not take a real sharp picture...

The concert itself was great, it started with Vertigo and I will follow and that already blew the roof off (yes, the Amsterdam Arena has a roof they can open and close and although it was a bright sunny day... the roof was closed). Because of the backstage pass I could easily switch places in the stadium and the first part of the concert I was in the first section to the stage. The large crowd on the field was several meters behind me .

Already at the beginning of the concert people at the front of the field were fainting and helped out by the security staff. Glad I had some space around me and could dive into the crowd whenever I wanted ;-) Bono really knows how to play the crowd, here are some other pictures:




During the concert I tried to use my Treo 600 to record a video from the show. The sound was a little to much for the little Treo... one time it even rebooted! The videos that succeeded only had noise as sound, while it was light (start of concert) the visual was reasonable. Of course there was also guys using real video camera's and at least one of them had to turn it in... how stupid can you be... digital photocamera's were allowed and I saw a lot of people taking short video's.

All in all a great experience! I was years ago since I last attended a U2 concert, and definitely want to go to the next!

"I hate testing", that was what James Gossling said during the panel discussion at thursdays keynote during JavaOne. He caught my attention with that statement and he explained it by stating that he'd like to have things "correct by construction", which would make testing obsolete. Still not sure how I should interpret this...

JMX

Today I joined two sessions on JMX, one was given by Eamonn McManus's and one of the new JMX features coming in JMX 1.3 (which will be part of Mustang) is the possibility to directly query attributes of a composite element. So for example you MBean has a ThreadInfo attribute, which is an object that has attributes in itself. Using this new feature you can directly query one of the attributes of the ThreadInfo attribute by addressing it as threadInfo.isActive.

In the last project we did we ran into the similar problem and solved it by utilizing commons-jxpath and commons-modeler of the Jakarta-commons project. What we did was define a custom MBean implemenetation class com.sun.util.jmx.JXPathEnabledMBean in the mbean-descriptiors file of commons-modeler like this:

<mbean         
  name="Foo"
  description="Foo something."
  className="com.sun.util.jmx.JXPathEnabledMBean"
  type="com.sun.x.y.Foo">
The className attribute overrides the default ModelMBean of commons-modeler. In the JXPathEnabledMBean class we used JXPath in the getAttribute() and setAttribute() methods to drill down to the requested attribute in case the requested attribute an atomic member of the class managed object itself. As an example the getAttribute() method:
public class JXPathEnabledMBean extends BaseModelMBean {

  public Object getAttribute(final String name)
      throws AttributeNotFoundException, MBeanException, ReflectionException {

    try {
      return super.getAttribute(name);
    } catch (ReflectionException re) {
      // Attribute not an atomic attribute of managed object
      // Try using JXPath...
      JXPathContext context;
      try {
        Object object = getManagedResource();
        context = JXPathContext.newContext(object);
        // JXPath uses '/' to as separator...
        String attName = name.replace('.', '/');
        return context.getValue(attName);
      } catch (Exception e) {
        // Here we know the attribute is not retrievable at all.
        logger.error("Failed getting attribute via JXPath", e);
        throw re;
      }
    }
  }

.....
}

The plan was to post to my blog at least once a day during JavaOne. All went well till my server at home got disconnected from the internet :-( So I gave Mirjam a call to figure out what the problem was. Time to teach Mirjam je basic Linux commands... Open a terminal (right click an select "new terminal") and try doing an "/sbin/ifconfig -a". " I see 14 lines of magic ?!?" OK, anything like eth0 or eth1? "Nope, just vmnet.." What happened to the network interfaces? How am I going to explain how to configure network interfaces? Thats probably one step to far to do over the phone... no more blogging on JavaOne I guess...

Thanks to Wilfred we (Wilfred, Marcel and me) were sitting first row during the first keynote session at JavaOne. One of more funny things was the celebration of the 10th birthday of Java. Most of the original Green team that created the first version of Java was present and was invited to come onto the stage. When James Gossling and Scott Mcneally invited the Green team, all people sitting next to us on the first row stood up and walked onto stage... now that was very tempting... what would have happened if we would have simply did what the rest of the row did?

During this first key note there were a couple of interesting announcements. One cool one was the fact that Solaris DTrace will now also work for Java applications. So if you ever wonder why your Java application is not performing, consider using DTrace. If will give you detailed insight into all the system calls you app is doing and using that you'll be able to identify the bottlenecks.

The interesting announcements on the enterprise level were the open sourcing of Sun's Application Server (Platform Edition) and Sun's JBI (JSR 208) implementation. Both can be found at Java.net. The Studio Enterprise demonstration was interesting, it demo-ed how a service flow could be orchestrated graphically (not sure if the notation was BPMN) and generated a BPEL application of it. The BPEL implementation seemed to be FiveSight PXE since the console said "PXE start" when the application was deployed. Wonder if a BPEL engine will be included in the open sourced JBI implementation.

Boy would it be convenient if the airplane seats had a 220v outlet. I attempted to do some improvements on the JavaOne 2005 Schedule webapp but my batteries were empty before I knew it. The extra one I borrowed from the helpdesk specifically for this trip lasted 10 minutes... my original battery got me going a little longer. To kill some time I wrote this Blog entry using BlogME on my Treo.

I made two improvements to the JavaOne 2005 Schedule webapp. First, session that last longer than 1 hour are now spread over multiple rows (the start and end time were already correct in the generated vCalendar file). Second, when I imported the generated vCalendar file into Palm Desktop and then synced it to my Treo, I noticed that some crucial info (the location of a session, which is included in the vCalendar file) did not end up in the Treo. Palm Desktop and the Treo do not support the notion of a meeting location. That's not really handy when you're huuying to your next session. To overcome this, the session location is now prepended to the abstract of the session. This abstract is attachted to the meeting as a note and does end up in the Treo Calendar. After that I wanted to include the option to set alarms... but the screen went black...

In the plane I watched "Et Un Momento Dado", a movie about Johan Cruijff and the impact he had on Catelonia and Barcelona. Cruijff is the best dutch soccer player of all times and is in the same league as Pele and Maradona. Funny to see the impact a sportsman can make on so many people. Some even start crying when asked for their favorite Cruijff moment.

233 miles / 35 minutes to SFO.... almost there.

Check out my JavaOne 2005 Scheduling aid. Using this web page you'll be able to:

  • Get an overview of all JavaOne 2005 technical sessions and BOFs
  • Define which topic's you want to include in the overview
  • Generate a vCalendar file that can be imported into lots of Calendar applications (Outlook, Evolution, Palm Desktop, ....). This file can either include all of the sessions that you selected, or the sessions you selected and all other sessions.
I succesfully imported data into Evolution and Palm Desktop.

There are some things to keep in mind:

  • I noticed that Palm Desktop creates duplicate entries if you import the same file twice :-( This is a problem of Palm Desktop. Importing the same file multiple times into Evolution did not create duplicate entries.)
  • The generated vCalendar file is very rich (check out here). However, not every Calendar application imports all data. Evolution for example does import meeting attendees and categories, Palm Desktop does not.

There are still some things I'd like to improve:

  • All sessions are displayed on the webpage with the same length, which is not true. Some sessions are longer than others. The vCalendar file does contain the correct start and end times for sessions.
  • Add alarms to session that have been selected to attend
  • Create a slicker look & feel (it's really basic now).
  • Set up an automatic process that takes the latest updates in the JavaOne schedule.
That should be a nice job for the flight to San Francisco... if my battery lasts long enough...

Bummer...

Just found out that the calendar on my Treo 600 does not support categories! I'm pretty sure my old Palm did have categories for the calendar items.... the Treo 650 also seems to have it... This is going to make nearly impossible to import all JavaOne sessions into the Treo 600 calendar and still make sense of it? There are 10+ concurrent sessions taking place all the time and that's going to look pretty crowded on a small displaty. Using the categories you could limit this too only the session of a particular category, usually 2 - 3 per time slot.

I'll need to include an option in the webapp to only include the session I'm interested in in the generated vCalendar file. .... and I need to find some time to build the webapp...

As I described in Preparing for JavaOne I attempted to get my Treo 600 synced using Synthesis SyncML Client and the Sync4J SyncML server. Unfortunately the SyncML server and the Synthesis client are not completely on speaking terms yet. I got the sync process to start, but it never completed, tried to fix it, but no luck.

A different approach is needed to get the session details of JavaOne 2005 in the calendar or my Treo. Bert Ertman described a more k.i.s.s approach and that triggerd me to do the following. Instead of syncing directly to the palm, I now create a vCalender file that can be imported into any application that understands vCalender files. Examples are Evolution, Outlook and the Palm Desktop client. After importing the vCalendar file into one of these applications you can sync your PDA and you're done. Using some shell scripting (based on some prework by Wilfred), a little XSL and Java this was done quickly.

I now have a vCalendar file containing all details of all breakout sessions. So all sessions and BOF are included, the general sessions are not included. The calendar items contain:

  • Session ID
  • Title
  • Category
  • Abstract
  • Date
  • Start time
  • End time
  • Location
  • Speakers
I successfully imported this vCalender file into Evolution and all looked fine. What appeared to be very convenient is that I could limit the number of sessions displayed by selecting a specific category. With 300 meetings scheduled in 4 days time it get's a bit busy in the display...

What's next? In the current situation all sessions are imported and there is no notion of what sessions I'm intending to visit. The plan now is to create a web application that allows me to select the sessions I wany to attend. Once selected it will then generate a vCalendar file that adds an extra category to the sessions I want to attend. In my calendar application I can then quickly get an overview of the sessions I want to attend by selecting this category.

How am I going to keep track of all sessions at JavaOne, the subset of sessions I want to attend and the other meetings I'm scheduling? Obvious answer is to use the calendar I always use, namely my Treo 600. How do I get all sessions in there? Mmmm, must be a problem someone else already tackled.... but I could not find someting on the internet.

My idea now is to get all define categories per track in my calendar and one extra category for sessions I plan to attend. Challenges I see now are:

  1. Grab the session details from the JavaOne site
  2. Grab my schedule from the JavaOne site
  3. Get this data into the Treo calendar
The first two point don't seem to hard. The last one is more tricky. I'm currently looking at Sync4J and the Synthesis SyncML Client for my Treo. Once I have that working I should real easy to take the session details from the first two points, feed them into the Syn4J server and then sync my Treo.

If all went OK my blog entries should now also show up on planetsun.org...

Visiting JavaOne this year is triggered me to dust of my J2ME Blog Client: BlogME. I created this app about a year ago and just forgot about it. Using BlogME I'll keep track of JavaOne from my Treo 600. Needless to say that this post was also written and posted using BlogME...

I'll be a JavaOne this year and guess what, I'll be assisting in the tossing T-Shirts during tuesdays general session! These shirts are personally design by James Gossling and of course it's a limited edition ;-)

Finally found a web based bookmark managing solution that integrates nicely with Firefox (and other browsers): http://www.myqlinks.com. Other extensions for FireFox just didn't feel right and were not so straightforward to use. Also looked at the bookmark manager provided by Yahoo.com but the presentation was just clumsy. myQLinks presents your bookmarks in a much more compact and organized way.

One of the key characteristics of myQLinks is that others can also see you collection, but you do have the possibilty to hide bookmarks for others if you want. In case you're interested, my bookmark collection can be found here.