<< April 2008 | Home | June 2008 >>

TwitNotes - Notes 8.5 beta is not supported

So the public beta of Notes 8.5 is out and I'm sorry to say that it doesn't play nice with TwitNotes. I have been in contact with IBM Lotus about it (funny that they contacted me) and we're working on finding out why.

I'll post more as I find out why but for now it seems to be due to conflicting Java libraries in the TwitNotes plugin and the Notes 8.5 client as such. I thought they were in separate class loaders by it doesn't appear that way.

Looking forward to ILUG for more than the technical content

I sooo need a break. This week has been crazy and it will continue to be crazy until I leave for ILUG. And I need to finish the presentation for ILUG as well... Oh man!

Tags :

New Lotus podcast - YellowCast

Tim Tripcony and Chris Toohey has joined together to do another Lotus podcast (the third by my account). Read more at the YellowCast website and subscribe via the RSS feed (http://feeds.feedburner.com/YellowCast). For some reason my iTunes wont subscribe to the feed - got to try again l8r.

Tags :

Possibly a fantastic tool for Notes 8 education

Last night I stumbled over an amazing article on the developerWorks site and it's just fantastic. Not that the articles normally aren't good but this article introduce a Lotus Expeditor tool that could prove invaluable for many Notes 8 shops for use in Notes 8 training or for use in Notes 8 plug-in development. Although the tool was written for Lotus Expeditor it installs just fine under Notes 8.0.1 without any problems at all.

The tool is called the Personal Wizard plug-in and is, from what I can see, developed by Vittorio Castelli from IBM. The tool allows you to record user interface interactions in the Lotus Expeditor/Notes 8 client and play the interactions back. Either by you or by another person you send the procedure. You can also save/load procedures to/from the filesystem.

In this way the tool can be used to automate test procedures and as a way to create end-user education. The tool allows you to step through a procedure (useful for education) or run it as a macro which is useful for development/testing. The tool is a little rough around the edges but it is definitely worth a look.

Using the Personal Wizards plug-in in IBM Lotus Expeditor

How to get started with Java

I regularly receive e-mails from Notes/Domino developers asking how to get started with Java. In general people are intimidated by the language itself and turned away by the absence of good resources for novice Java programmers so they ask my advise on how to get started. Normally the focus is to use Java for web development (J2EE) and Notes 8 development.

Although evidence to contrary Java is actually quite a simple language at its core and it's mainly about syntax and a few (dozen) rules. I recommend starting with the language itself and focusing on that before diving into Java for Notes, J2EE and Notes 8 development.

Although not the easiest of routes I suggest the following:

  1. Start with a good Java book and learn the language itself without focusing on Notes/Domino. I can recommend the Thinking In Java book. Skip stuff on threading, GUI development and other advanced topics. Make sure to read up on the java.io framework (e.g. how to read/write to/from files) as that concept is used a lot. All in all - read chapter 1 through 12.
  2. Be sure you read the book and did the hands-on labs... :-)
  3. Start doing some simple Notes agents in Java instead of LotusScript. Maybe even convert a few existing agents into Java. Here my posts called "Java explained" might help.
  4. Do step 3 again and again until you're confident with the language.
  5. Start looking into more complex areas such as J2EE development and Notes 8 development.

If you have questions feel free to ask them here.

Tags :

Portable broadband

We're testing a portable broadband solution (Telia mobilt bredbånd (link in Danish)) at work these days and I must say it's much nicer than having to connect through some customers network with the limitations that normally entails. Especially when you get a solid connection like today - 495 kbps downstream and 397 upstream. Nice...

Part 2 of the blackbox article published

The second and final article in my series on Sametime blackboxes (Configuring the Sametime business card system, Part 2: Reach more data with custom blackboxes) has been published at the THE VIEW website and will be out in the May/June issue.

Where as the first article primarily focused on configuration and setup of the blackbox system the second article describes how to develop your own custom blackbox implementations. One of the blackboxes I describe is the one I developed for the bleedyellow.com Sametime server. This implementation retrieves business card data from Lotus Connections.

SWT@Notes 8: Logging from SWT components

As you probably know using System.out.println for logging in Java is a no-no and this is also the case when developing plugins for Notes 8 and Lotus Expeditor. This post outlines how to use the logging framework supplied with Lotus Expeditor, how to manage the logging and where the logs go.

You have probably been using log4j or similar logging framework for years. Avoiding writing to System.out is even more important when writing SWT components and plug-ins for Notes 8 a.k.a. Eclipse since the output goes to a log tucked away under the covers. Luckily there's an approach which is so much better and more flexible.

Logging basics

Luckily logging has been built into the language (since Java 1.4) and into the Lotus Expeditor platform. Actually there is 5 different frameworks built into the Lotus Expeditor platform. Based on advise from the Lotus and personal experience I really recommend you use the java.util.logging framework built into the core Java language. This is also known as JSR47 loggers. The below graphics shows the logging sub-system of Lotus Expeditor.


Page 8 from the IBM Lotus Expeditor 6.1 Client for Desktop Serviceability - Logging and IBM Support Assistant (PDF).

As you can see from the above you can use the following logging frameworks in Lotus Expeditor:

  • Eclipse Logging
  • OSGi Logging
  • IBM Commons Logging
  • Apache Jakarta Commons Logging
  • java.util.logging a.k.a. JSR47
I haven't got experience with all of the these frameworks and luckily I don't have to. I just have to know about java.util.logging and there's an abundance of info on that on Google. The Sun tutorial might be the best place to start if you've never used java.util.logging. All this being equal the frameworks work the same with the only difference being how you obtain loggers and what the different logging levels are called. Log levels are called something different in the different frameworks but slide 7 in the Lotus Expeditor documentation on logging shows the mapping between the different frameworks.

Using loggers in code

Using java.util.logging in code is really easy and consists of 3 steps:

  1. Obtain the logger to use (normally in a static final variable).
  2. Write info to the logger.
The below is an example of using loggers.
package com.example.logging;

import java.util.logging.Logger;

public class MyLoggingClass {
   // logger
   private final Logger log = Logger.getLogger(
      this.getClass().getPackage().getName());
   
   public MyLoggingClass() {
      log.finest("Finest...");
      log.finer("Finer...");
      log.fine("Fine...");
      log.info("Info...");
      log.warning("Warning...");
      log.severe("Severe...");
   }
}

The above code creates a logger in a variable called "log" as a private variable. The logger itself is called com.example.logging which is the name used to control the log level (see below). I find it best to name the logger after the package name that contains the class. Sometimes it is however beneficial to also have a logger with more specialized names to log info on specific events.

Configuring the logger log levels

The log level for a single logger or multiple loggers can be controlled using the LogManager using the <Notes data directory>/workspace/.config/rcpinstall.properties file. To change the log level for the com.example.logging logger to FINEST add the following line to the file and restart the client:

com.example.logging.level=FINEST
To change the level dynamically use the OSGi console commands as described below.

Interacting with loggers from the OSGi console

If you start the Notes 8 client with the OSGi console visible you can interact directly with the loggers using the console command called setlogrlev. To set the log level for the com.example.logging logger to FINEST use the following command:

setlogrlev com.example.logging FINEST
Please note that the logger levels are case sensitive so you have to write "FINEST" and not "finest".

Where the logging goes

All log messages are written to log files in the <Notes data directory>/workspace/logs directory. Opening the directory will reveal a number of files. The two most important are error-log-X.xml and trace-log-X.xml. The file names are quite explanatory and are, as the extension implies, XML-files. When you open them they'll be rendered using a XSLT stylesheet to be displayed nicely. You can either read them using a browser or using the "Help/Support/View Log" and "Help/Support/View Trace" menu item in the Notes 8 client.

While the log files are usable I personally find it much easier and better to use the OSGi console when developing as I can adjust the log levels on the fly.

Further reading

Anyone running mod_jk with Domino 7?

A while back I used the mod_jk DSAPI filter to use Domino as a web server for a Tomcat behind it and it worked fine. Anyone using that setup on Domino 7 today?

If you are do you have a binary version? If you do please let me have it! :-)

FeedDemon 2.7 available and it's still free

My favorite RSS reader FeedDemon is available in version 2.7 and it's free. So while we wait for a decent RSS reader for Notes 8 I suggest you use that one.

Tags : ,

CompApp wiki: Advanced Page Properties

The documentation for Notes 8 is starting to tickle online at the developerWorks CompApp wiki. Now some documentation on some of the Advanced Pages Properties has appeared at the wiki. Now we just need type-ahead and/or a dropdown selection for the available properties in the UI rather than having to remember and type the property names our selves. Typos in the property names are a major cause of CompApp behavior problems IMHO.

Bob Picciano - please don't blog like Mike Rhodin!

I'm writing this post as I just deleted my RSS feed for Mike Rhodins blog. I really hope the "new" General Manager of Lotus (Bob Picciano) will be better at blogging than Mike Rhodin who after starting to blog at Lotusphere 2007 managed 7 posts before going completely dark after blogging for 25 days. I don't know if Mike Rhodin has been blogging internally instead of publicly but it feels wrong that the General Manager of the leading social software platform (Lotus Connections if anyone is wondering) isn't more visible outside the IBM firewall. Maybe Ed didn't quite explain the concept... :-)

So, Bob, please don't blog like Mike... The community will love you for it.

mod_rewrite for Lotus Connections

I'm messing a fair bit with Lotus Connections these days as I'm configuring Lotus Connections 2.0 beta 2 at the office. Lotus Connections 2.0 comes with six features as a new Homepage feature has been added. By default you configure each of the six features with a separate server path that is /activities, /homepage etc. This means that the users have to explicitly state which feature to access from the get-go (e.g. http://lc.example.com/homepage). What I really wanted was for the Homepage feature to display whenever the user surfed to the "base url" (http://lc.example.com).

This is actually quite easy as Websphere uses IBM HTTP Server which is a fork of the standard Apache server. This means that IHS ships with the mod_rewrite module which allows you to do URL rewriting.

The steps are as follows:

  1. Edit the conf/httpd.conf file.
  2. Enable mod_rewrite by removing the # character in front of "LoadModule rewrite_module modules/mod_rewrite.so".
  3. At the bottom of the file add the following:
    <IfModule mod_rewrite.c>
       RewriteEngine on
       RewriteLog logs/rewrite_log.log
       RewriteLogLevel 0
       RewriteRule ^/?$ /homepage [PT,L]
    </IfModule>
    
  4. Restart IHS.

Easy peasy...

Do you speak web 2.0?

Wiki's, MySpace, deli.cio.us, facebook, twitter... Do you know them all? Do you know these new exciting technologies, what they do and how they can help your company?

IntraVision is hosting an event on web 2.0 technologies on 11 June in Copenhagen. The event is free of charge and will bring you up to speed on web 2.0 technologies and how they can help your company but more importantly what they are. The event will be conducted in Danish.

Read more at www.web2-4u.com.

developerWorks article - Going wild with generics (Understanding wildcard capture)

Although being a little hairy this article is quite interesting if you're doing stuff with generics in Java.

Java theory and practice: Going wild with generics - Understanding wildcard capture

Update: I can really recommend the Sun tutorial on Generics if you want to get up to speed on Generics.

Tags :

SWT @ Notes 8: Why OSGi is important

I have posted stuff on the OSGi console previously and why it's important but even better is to see for your self. I did this myself by adding TwitNotes console commands to the TwitNotes plugin for version 1.0.4. For the normal user it wont matter but it actually proves to be very useful for troubleshooting and something I will definitely add to the other sidebar projects I'm working on.

For more info and code example see the post "Extending the OSGI Console" by Bob Balfe.

WAS lessons from last week

Last week I overcame two stumbling blocks on my way to getting Lotus Connections 2.0 Beta 1 (yeah I know there's a beta 2) up and running. I'm blogging about it to help others that might experience the same problems.

LDAP issue

The first problem was that I couldn't log into the WAS admin. console after configuring the federated LDAP directory (I'm using Domino 7.0.2 LDAP). The exception I got in my SystemOut.log was the following (important part in bold):

"00000023 exception E com.ibm.ws.wim.adapter.ldap.LdapConnection search(String, String, Object[], SearchControls) CWWIM4520E The 'javax.naming.NoPermissionException: [LDAP: error code 50 - Insufficient Access Rights]; remaining name '/'; resolved object com.sun.jndi.ldap.LdapCtx@9e009e0' naming exception occurred during processing. [29/04/08 11:46:22:494 CEST] 00000023 exception E com.ibm.ws.wim.adapter.ldap.LdapConnection search(String, String, Object[], SearchControls) com.ibm.websphere.wim.exception.WIMSystemException: CWWIM4520E The 'javax.naming.NoPermissionException: [LDAP: error code 50 - Insufficient Access Rights]; remaining name '/'; resolved object com.sun.jndi.ldap.LdapCtx@9e009e0' naming exception occurred during processing. at com.ibm.ws.wim.adapter.ldap.LdapConnection.search(LdapConnection.java:2419) at com.ibm.ws.wim.adapter.ldap.LdapConnection.checkSearchCache(LdapConnection.java:2349) at com.ibm.ws.wim.adapter.ldap.LdapConnection.search(LdapConnection.java:2524) at com.ibm.ws.wim.adapter.ldap.LdapConnection.searchEntities(LdapConnection.java:2668) at com.ibm.ws.wim.adapter.ldap.LdapAdapter.search(LdapAdapter.java:2763) at com.ibm.ws.wim.ProfileManager.searchRepository(ProfileManager.java:4094) "

After spending a lot of time trying to diagnose the issue and making sure I did it EXACTLY as prescribed by IBM I still couldn't solve the issue. I had no problems logging into the LDAP directory which otherwise worked perfectly from other applications. Finally thanks to Robert Thatcher from IBM the problem was solved. It had nothing to do with wimconfig.xml as such or other WAS goodness - it was simply due to missing rights to the LDAP directory. I guess the exception says it too...

I simply didn't think the user logging into the LDAP needed anything else than reader access in the ACL of Domino Directory. It turns out that Manager is more like it. Hmmm.... I haven't turned the access level down yet so I don't know if less will do it as well.

Also many, many thanks to Courious Mitch for helping me out with wimconfig.xml. IHS node issue

Second issue was that I ended up with two nodes under my WAS profile when configuring the IHS WAS plugin. The actual issue that made me look there was that I was unable to manage SSL certificates for the IHS plugin.

The problem was that when creating the webserver1 in the WAS admin. console I didn't specify the hostname that WAS was actually bound to. Instead I specified the DNS name I would like to contact WAS using which made WAS create two nodes. Using the fully qualified hostname of the WAS server solved this issue.

ext.js moves to a commercial license

I first heard of this on some TWIT podcast so I went to see for myself but it appears that the ext.js Javascript framework has gone from an open source to a commercial license. This means that you have to pay if you use ext.js in an application that isn't compatible with the GNU license. All of the applications I do fail this requirement.

This is too bad and effectively removes ext.js as a framework I will even consider. With dojo being the framework of choice come Domino 8.5 this will however not be too much of a loss.

Lotus Notes vs. Microsoft Mesh

You might already know of this but I suggest you listen to the Windows Weekly podcast episode 56 and episode 57 for info on the upcoming Microsoft Mesh. In episode 57 there are comments about Lotus Notes and how Ray Ozzie took the thunder of Notes and brought it to Microsoft.

New CompApp url type (cai:///)

Niklas Heidloff is being very productive today on the CompApp wiki. He just uploaded another page called Pass Context to Components when opening Composite Applications. On this page he explains a new url type (cai:///):

"Opening a connection to a CAI URL will cause the corresponding application to be projected to the client or updated if already on the client, and then opened in the user interface to the specified page. If no page is specified, the first page in the application is opened."

Besides being, as Nathan describes it, "hideous", it's never going to work IMHO. This approach fails the number one test for URL's - they should be easily computable and/or written by users. How something with an appInstanceID of 63 characters (example: CFB7535080ECD4C270FDD126C5DD9E27_11_5JMPDRH1000980269G784H2GO4) came through QA I don't know.

The page refers to M5 (probably milestone 5 for 8.5) and says that "we might publish [the url type] in Lotus Notes 8.0.1". Let's hope not!

CompApp wiki: Open Notes Documents on Pages

Niklas Heidloff from IBM added a nice page to the CompApp wiki today detailing how to use a Notes 8.0.1 feature to open a doucment in a CompApp on a specific page. This is a nice approach and in many cases better than the Notes 8.0 way where a document would open the on a new tab.

More info at the IBM developerWorks CompApp wiki: Open Notes Documents on Pages

Stuff learned today

  • ContentViewer.setInput() is a lot different than ContentViewer.refresh()
  • When painting stuff in SWT you litterally have to paint everything yourself
  • 15 September 2008 is the longest day in 2008 (GC.stringExtent)
  • Sametime awareness is easy in Notes 8
  • Composite.getChildren() makes it easy to dispose all components

It's been a while

It has been a while since I last blogged. Since last I have been in Paris and have had a busy week with customer projects, Lotus Connections 2.0 beta LDAP issues and some very interesting meetings regarding the future. Can't say anything yet but it's gonna be exciting I think.