Usability - Productivity - Business - The web - Singapore & Twins

By Date: January 2011

eMail archival in PDF and electronic record keeping

The question pops up quite regularly: " Our compliance department has decided to use PDF/A for long term record storage, how can I save my eMail to it?" (The question applies to ALL eMail systems). The short answer: Not as easy as you think. The biggest obstacle is legal need vs. user expectation. To make that clear: I'm not a lawyer, this is not legal advise, just my opinion, talk to your legal counsel before taking action. User expectation (and thus problem awareness): "Storing as PDF is like storing on paper, so what's the big deal?" In reality electronic record keeping has a few different requirement (and NO printing an eMail as seen on screen is NOT record keeping - more on this in a second). Every jurisdiction has their own regulations, but they are strikingly similar (for the usual devil in the details ask your lawyer), so I just take Singapore's electronic transactions act as a sample:
Retention of electronic records
9. ???(1)   Where a rule of law requires any document, record or information to be retained, or provides for certain consequences if it is not, that requirement is satisfied by retaining the document, record or information in the form of an electronic record if the following conditions are satisfied:
(a) the information contained therein remains accessible so as to be usable for subsequent reference;
(b) the electronic record is retained in the format in which it was originally generated, sent or received, or in a format which can be demonstrated to represent accurately the information originally generated, sent or received;
(c) such information, if any, as enables the identification of the origin and destination of an electronic record and the date and time when it was sent or received, is retained; and
(d) any additional requirements relating to the retention of such electronic records specified by the public agency which has supervision over the requirement for the retention of such records are complied with.
(colour emphasis mine)
So as there is "more than meets the eyes". A eMail record is only completely kept if you keep the header information. Now you have 2 possibilities: change the way you "print" to PDF to include all header / hidden fields (probably at the end of the message) or you use PDF capabilities to retain them accessible as PDF properties. The later case is more interesting since it resembles the user experience in your mail client: users don't see the "techie stuff" but it is a click away to have a peek. There are a number of ways how to create the PDF:

Read more

Posted by on 26 January 2011 | Comments (3) | categories: Show-N-Tell Thursday Software

Manifesto for Software Craftsmanship

The Manifesto for Software Craftsmanship has been around for a while (go read it) with a growing number of signatories around the world. Robert Martin sums it up in one short sentence: " We are tired of writing crap". Since crap can be easily mis-understood he elaborates (reproduced here without asking for permission ):
  • What we are not doing:
    • We are not putting code at the centre of everything.
    • We are not turning inward and ignoring the business and the customer.
    • We are not inspecting our navels.
    • We are not offering cheap certifications.
    • We are not forgetting that our job is to delight our customers.
  • What we will not do anymore:
    • We will not make messes in order to meet a schedule.
    • We will not accept the stupid old lie about cleaning things up later.
    • We will not believe the claim that quick means dirty.
    • We will not accept the option to do it wrong.
    • We will not allow anyone to force us to behave unprofessionally.
  • What we will do from now on:
    • We will meet our schedules by knowing that the only way to go fast is to go well.
    • We will delight our customers by writing the best code we can.
    • We will honour our employers by creating the best designs we can.
    • We will honour our team by testing everything that can be tested.
    • We will be humble enough to write those tests first.
    • We will practice so that we become better at our craft.
  • We will remember what our grandmothers and grandfathers told us:
    • Anything worth doing is worth doing well.
    • Slow and steady wins the race.
    • Measure twice cut once.
    • Practice, Practice, Practice.
Go read more from Robert and follow him. While your are on it, sign the manifesto.

Posted by on 25 January 2011 | Comments (0) | categories: Software

Caching Lookup results in XPages

Nathan and John have shown before how a column value in an XPages view can contain the result from a lookup into another view (Notes or RDBMS). As you all know " With great powers ....". These lookups are executed once per row in the view. If there is a possibility, that the lookup key is repeating, it is a good idea to cache these values. Depending on your application this can be the one of the scopes: requestScope, viewScope, sessionScope or applicationScope. A very simple cache mechanism can look like this:
var myLookups = {  
    "getColor" : function (color , name ) {
        var fruit ;
        if (requestScope. fruit != null ) {
            fruit = requestScope. fruit ;
        } else {
                fruit = new java. util. HashMap ( ) ;
        if (fruit. containsKey (color ) ) {
            var result = fruit. get (color ) ;
            return result ;
        var lookResult = @DbLookup ( @DbName ( ) , "Fruits" , color , 3 ) ;
        fruit. put (color ,lookResult ) ;
        requestScope. fruit = fruit ;
        return @Trim ( @Replace (lookResult , name , "" ) ) ;
The function can be called with myLookups.getColor("red","Apple"); (the function returns all fruits of a given color except the current fruit handed over as the second parameter). If you have a lot of variables to cache a HashMap might not get the best result and you could consider using JCS. To test if it is working alter the function like this (Line 12+13):

Read more

Posted by on 25 January 2011 | Comments (2) | categories: XPages

XSLT expression when the default namespace is missing

When dealing with XML XSLT is your SwissArmy Knive of data manipulation. Consider a snippet of XML like this:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                    <List DocTemplateUrl=""...
There are namespaces defined for SOAP, XMLSchema and XMLSchema-Instance, but not for the "payload". When trying to transform this XML using XSLT the usual expression <xsl:template match="GetListCollectionResult"> will not yield any results. I initially was puzzled by that. Relying on geany (highly recommended for light editing), EMACS or Windows Notepad would have left me in the dark. Luckily my oXygen XML Editor revelaled the actual Xpath expression saving me hours of research. There are two ways to target the element properly. One is to add a default namespace into your source XML. This is usually a bad idea, since it requires some manual intervention into data you might retrieve automatically. The other option is to use the local name function in XSLT. So your template would look like this:
<xsl:template match="*[local-name()='GetListCollectionResult']" >.
To get to the "meat" (rather than playing with the wrappers) in the above code snippet you could use this template:
    <xsl:template match="/">
        <!-- Jump the soap wrapper directly to the list -->
        <xsl:apply-templates select="/soap:Envelope/soap:Body/*[local-name()='GetListResponse']/*[local-name()='GetListResult']/*[local-name()='List']" />
As ususal YMMV

Posted by on 25 January 2011 | Comments (0) | categories: Software

Server Side JavaScript - an overview

" JavaScript? Isn't that the browser thing to add useless animations to your website?" Despite all web2.0 hype this is a question corporate developers or managers still ask from time to time. When telling them about Server Side JavaScript (SSJS for short) they reply in disbelieve: " That must be some IBM thing". To some extend it is true. IBM ships three different SSJS implementations in their products:
  1. IBM's own j9 JRE/JDK 6.0 includes, following the Java JSR 223 an implementation of Mozilla's Rhino SSJS engine (try for yourself. Open a command prompt and type jrunscript. You will be greeted with an JavaScript command prompt - works also with the JVM that ships with the Notes client)
  2. The second implementation can be found in Project Zero and its commercial implementation WebSphere sMash
  3. Last not least there are XPages with its JVM based SSJS implementation.
However IBM is not alone, besides JSR 223 and Rhino there is more SSJS to be found:
  • NodeJS is based on Google's V8 JavaScript engine that also powers the Chrome browser.
  • A number of extension build on top of NodeJS:
    • node.io - distributed data scraping and processing engine
    • expressjs - High performance, high class web development
    • many more
  • Flusspferd is written in C++, uses Mozilla's SpiderMonkey JS engine and provides C++ language bindings. Will extend to newer engines when available.
  • CommonJS defines a common set of APIs for SSJS. From the description:
    "The CommonJS API will fill that gap by defining APIs that handle many common application needs, ultimately providing a standard library as rich as those of Python, Ruby and Java. The intention is that an application developer will be able to write an application using the CommonJS APIs and then run that application across different JavaScript interpreters and host environments. ".
    There is a long list of implementations including NodeJS and Apache CouchDB.
    I do not know to what extend IBM does or will support CommonJS, nevertheless it is a development to keep an eye on
  • The Jaxer application server is offered by the same team who brought us the outstanding Aptana JS IDE for Eclipse
  • Erbix Application Server, featuring an online IDE
  • ejscript from embedThis Inc
  • Mynajs application server based on Rhino
  • For brave souls: mod_js a Apache HTTP plug-in
There's a good 2011 SSJS outlook on labnotes.org. Of course Google knows even more.
So it is really time to give the curly brackets a try.
Want to know more? Visit my Lotusphere 2011 AD103 session.

Posted by on 18 January 2011 | Comments (3) | categories: Software

Little Linux GTD Gem

On my Ubuntu 10.10 Gnome desktop I use Docky for my "Application Dock". It can be run "Apple style" horizontally - or taking advantage of wide screen monitors vertically. As most Linux tools it is highly customizable. Besides links to applications and documents Docky can host Docklets, that do all sorts of useful things. One particularly interesting docklet for GTD aficionados is the Timer Docklet. It allows with a simple mouse wheel scroll to create a timer and run it.
2min Docky Timer
So tracking "2 minutes or less" is just a click away. Installation with:
sudo add-apt-repository ppa:docky-core/ppa
sudo apt-get update && sudo apt-get install docky

(You can install Docky also from the Ubuntu application catalogue, but I'm too lazy to deal with the GUI. Once you know the command line is so much faster). You will find Docky in Applications - Accessories and can set auto-start in the preferences.

Posted by on 17 January 2011 | Comments (1) | categories: GTD Linux

If you're attractive enough on the outside ...

I'm a big fan of Despair.com. They make the true motivators. Reading about eMail news this came to my mind:

For historic reasons I'm cautious about any Radicati claims, but when they put Domino ahead of Exchange I simply have to share the picture:

One indicator for my dislike is Radicati's inability to label IBM's software correctly. All other bars have the appropriate product name, while Lotus Domino is lumped under the general Lotus Brand name. I think with a high availability configuration Domino would be rather in the Google range. We can check the Lotus Live Notes uptimes for that. So robustness of the Domino server can't be an issue. The battle is won on the outsite, read: how and what clients including mobile clients will work and how well are they liked.

Posted by on 16 January 2011 | Comments (0) | categories: Software

More fun with curl - Web forms and access rights (you will not like this)

We had fun with curl and LotusLive before. Now lets have some fun with curl and web forms. To follow the fun you should download and install cURL (for Ubuntu users: sudo apt-get install curl). When discussing web enablement and XPages the topic of "field validation" pops up quite regular. My advice here stands firm: " client side validation solely serves the comfort of the users (which is important) but never the integrity of your data". More often than not I'm greeted with disbelieve. However at the very end what is send back to the server is just a HTTP post and the server developer has little control how that post was generated. In a modern browser one can use Firebug or GreaseMonkey to alter the upload. All browsers can be redirected to send data via a local proxy (try TCPMon for fun or any other local proxy). While that might be out of the reach of NMU *, a simple cURL command is not. I will use Domino as backend for my examples, however the approach applies to all type of backends: ASP, PHP, JSP, JSF, Ruby, NodeJS and whatever. Some of the considerations are Domino specific (around back-end behavior).
To send (HTTP POST) data to a server one can simply use curl -F 'fieldname=fieldvalue' http://targeturl. However that command line can get messy when there are a lot of fields and eventually authentication and redirections. So I will a) use a file as source for upload b) use the following command: curl --netrc --data @filename --post301 --post302 http://targeturl. The parameters post301, post302 make sure curl follows redirections if they occur without dropping the POST method, --data @ uses a filename as source for the upload, finally --netrc tells curl to look in a secure (mode 600) file .nerc ( _netrc on Windows) for a line: machine hostname login username password password (replace the bold parts with your information) if authentication is required. You can wrap this into a shell script to reduce typing. I created a simple form Fruit with 3 fields: Subject, Color, Taste and one view Fruits sorted by subject in my curldemo.nsf. Let the fun begin:
    • Test: Post Subject=Durian&Color=White&Taste=don't ask!!! to http://localhost/curldemo.nsf/fruit?CreateDocument
      In this case an authorized user posts exactly the fields that are in the HTML form to the designated address.
    • Result/Insight: Works as expected. You get a message back (with some html decoration) Form processed.
    • Test: Post Subject=Apple&Color=Green&Taste=sour to "http://localhost/curldemo.nsf/fruit?OpenForm&Seq=1"
      One could expect the same result as in the first test, since it is all fields, a valid url and an authorized user.
    • Result/Insight: Domino comes back with an empty form and no document gets created. On closer inspection you will find an extra hidden field "__Click" in the form Domino provides. So when you change your post data to Subject=Apple&Color=Green&Taste=sour&__Click=0 the document gets created as expected.
    • Test: Remove your user's right to create documents by demoting to author with "Create documents" unchecked. Post Subject=Apple&Color=Green&Taste=sour to http://localhost/curldemo.nsf/fruit?CreateDocument
    • Result/Insight: As expected you get an HTTP Error 401 (not authorized) message
    • Test: Promote your user to Editor and post Subject=Apple2&Color=Green And Green&Taste=deadly&__Click=0 to http://localhost/curldemo.nsf/Fruits/Apple2?EditDocument&Seq=1
    • Result/Insight: The document gets saved back to the server and you get a "Form processed" message back. Works as expected. If you use a fruit name that doesn't exist you get a 404 - Entry not found in index error. You can change the key field when you post Subject=Deadly Apple&Color=Green And Green&Taste=deadly&__Click=0
    • Test: Update the input validation formula of the Color field to @If(@Trim(@ThisValue)="";@Failure("Please submit a color");@Success). Post Subject=JackFruit to http://localhost/curldemo.nsf/Fruit?CreateDocument In this example we only post a subset of the fields to create a document failing the server side validation
    • Result/Insight: As expected the creation of the document fails and an error is returned.
    • Test: Post Color=Red And Green&__Click=0 to http://localhost/curldemo.nsf/Fruits/Deadly%20Apple?EditDocument&Seq=1 In this example we only post a subset of the fields back to the form
    • Result/Insight: The existing fields in the document are preserved and only the submitted values are updated. Works as expected.

      So far we were playing nice and got expected results. Now let's get sneaky.

Read more

Posted by on 16 January 2011 | Comments (0) | categories: Show-N-Tell Thursday

Burncharts in XPages

One little step for a developer, a big step for agile software development: Julian has implemented my dojo Burncharts into the latest release of the xCharting project on OpenNTF. Have a look at the demo and use it happily. Nice work Julian.
Update: Gave Julian back his real name (Ave Julius is quite outdated isn't it)

Posted by on 13 January 2011 | Comments (2) | categories: XPages

Binding controls to managed beans

Out of the box XPages connect to Notes Views and Notes Documents as data sources. Other data souces require some advanced skills you might not be ready to invest. However controls can be bound to many things, data sources are just one of them. Under the hood the data binding uses the JSF Expression Language (EL). Since XPages knows a JavaScript binding you can bind your control to any JavaScript function, but that's not what I want to show today. One very interesting option (that is 1:1 JSF) is to bind your controls to a managed bean. So what is a managed bean? It sounds more complicated than it is. The bean part is a standard Java class that has a constructor without parameter (which is the default for a Java class anyway) and get/set methods pairs (more about that in just a moment). The managed part is an entry in the faces-config.xml where you define a "friendly" name for a Java class as well as the scope. If you use that friendly name in code (in SSJS or EL) the class instance is automatically created for the defined scope if it doesn't exist yet in that scope. Once the scope expires the object is automatically discarded. Since this works automagically the Java class is called "managed". An entry in your faces-config.xml (to find that file, open the Navigator view and look for /WebContent/WEB-INF/ in your NSF) could look like this:
    <managed-bean-name>demo </managed-bean-name>
    <managed-bean-class>com.demo.ELTest </managed-bean-class>
    <managed-bean-scope>session </managed-bean-scope>
With this entry a new top level object demo is available for use in EL or SSJS in the same way as you can use database, session, context etc. Our class is valid for the session context, so multiple XPages will see the same content. You can name your methods inside the Java class as you like and call them in SSJS, e.g. demo.playTune(). The more interesting use however is the bean use. If your (real live) object has e.g. 3 properties: Name, Color, Taste, then you would have 6 methods in Java, 2 each for each property: getName(), setName(newName), getColor(), setColor(newColor), getTaste(), setTaste(newTaste).
Once you follow this pattern you can refer to that property in EL just by its name: demo.name, demo.color, demo.taste (Note: no brackets here!). You enter that in XPages data binding in "Advanced / Expression Language". It will however appear in the regular data binding setting with the bean's friendly name as name of a data source.
A little stumbling block: the properties start always lowercase, while the first letter after get/set must be uppercase. Also the get function needs to return the same data type as the set function takes in as a parameter.
XPages inspects the bean for the get/set functions. If the set function is missing a control is automatically rendered read only, while a missing set function leaves an entry field empty. Once data is posted back to the server the set functions of your bean are called and it is up to you what to do with the data. Having named get/set function is great when you exactly know your object at design time. A very typical use for a bean binding however is retrieving a data set where you don't know what is coming. EL also can cater for that. Your Java class needs to implement a property that returns a Java MAP in a pair. e.g. Map<String, String> getStuffProperties(); void setStuffProperties(Map<String, String> newProps); Once you have that you can write as data binding in EL: demo.stuffProperties["Color"]. Here you have the freedom to use upper- or lowercase property names as you like. Of course you are not limited to a static string and have any expression EL is capable of at your disposal. This makes a quite powerful construct. Try it yourself! Use this simple Java class:
package com.demo ;

import java.util.HashMap ;
import java.util.Map ;

public class ELTest {

    private String color ;
    private String taste ;
    private String name ;
    private Map < String, String > fruitProperties = new HashMap < String, String > ( ) ;

    public String getColor ( ) {
        return color ;

    public void setColor ( String color ) {
        this. color = color ;
        this. fruitProperties. put ( "Color", color ) ;

    public String getTaste ( ) {
        return taste ;

    public void setTaste ( String taste ) {
        this. taste = taste ;
        this. fruitProperties. put ( "Taste", taste ) ;

    public String getName ( ) {
        return name ;

    public void setName ( String name ) {
        this. name = name ;
        this. fruitProperties. put ( "Name", name ) ;

    public Map < String, String > getFruitProperties ( ) {
        return this. fruitProperties ;

    public void setFruitProperties ( Map < String, String > fruitProperties ) {
        this. fruitProperties = fruitProperties ;

Read more

Posted by on 11 January 2011 | Comments (6) | categories: XPages

Expanding into mobile

The new IT paradigma is "mobile first", so I will prepare my skills. Since SWMBO runs on iOS, I'm looking at the other side:
Archos 10.1
Now I need a decent software set for the following:
  • Twitter Client
  • RSS Reader
  • Blog Writer supporting MetaWeblog API for Blogsphere
  • Note taking
  • Video chat client
  • VoIP client (besides Skype)
  • Book reader : Aldiko
  • Remote Access : VNC / ConnectBot
  • eMail : gMail & Lotus Traveler
What else would I need?

Posted by on 11 January 2011 | Comments (3) | categories: Software

Business Partner - IBM vs. Microsoft

I had an interesting chat with a business partner, who shall not be named, over the weekend which recalled memories of similar experiences and conversations before. I've been an IBM Business Partner as well as a Microsoft partner in Germany and Singapore, so I have some recall of my own (which I would discount now since that is more than 5 respectively 10 years ago). The gist of the conversation: Both IBM and Microsoft want to earn money with the help of the business partner. However the approach is diametral opposite. My partner summed it up as: "Microsoft would periodically shower you with information: look, this is how you can make money using Microsoft while IBM would periodically request: Can you please submit your sales plan and customers to our system". I know a few conversations can't establish a trend, nevertheless they can rise an eye brow. Of course is it easy to argue looking at the stock price that IBM does it right. So the question remains: what is, once you loose the myopic quarter-end view, the most efficient and mutual satisfactory way to run your partner network?

Posted by on 10 January 2011 | Comments (3) | categories: IBM

New Project: eMail Beauty Contest

Despite all the media hype eMail is still the work horse of enterprise and cross enterprise collaboration. And the bulk of workers use a traditional computer. So looking at eMail applications is surely worth a look. From my experience, having worked with MHS, MS-Mail, CCMail, Profs, CompuServe, Outlook, Notes and some more obscure packages, I can tell that details make all the difference. All applications have an Inbox, a send button and a calendar view. After all it is not enough if software works, Users have to be pleased too. So time and energy permitting I will dive into the details of a selection of eMail applications and compare: eMail, Calendar, Contact and Task management. My focus will be the user perspective and not admin capabilities or technobabble, so no diskspace or memory consumption musings. And yes, stop howling, Notes is much more than eMail, but that's not the point for this comparison. I have picked 3 eMail clients and 3 web applications for this project:
  1. Lotus Notes 8.5.2 running on Ubuntu 10.10 backed by Domino 8.5.2 on Linux
  2. Outlook 2010 running on Windows 7 backed by hosted Exchange 2010
  3. Evolution 2.30.3 running on Ubuntu 10.10 talking to Exchange / GMail / Domino
  4. iNotes Web Access 8.5.2 on Domino on Linux
  5. Outlook Web Access 2010
  6. gMail
This little project will run over the course of this year and I will publish installments in irregular intervals. If a software gets an update during this period I will most likely update it. To make this project successful I will need a good body of eMails, calendar invites and tasks. This is where I can use some help. Can you send some messages (richly formatted, some attachments) to the test account: BeautyContest? Please nothing NSFW. Some double byte eMail would be cool. What would you like to have compared?

Posted by on 08 January 2011 | Comments (4) | categories: IBM Notes Software

Learning XPages' foundations: JSF and Dojo (including the Expression Language)

When people ask me what exactly XPages is/are, I answer with the formula:
XPages = JSF + JavaScript + Notes + Domino Designer - J2EE headaches
The J2EE headaches would be XML descriptor files, deployments and the lack of an integrated database. Nevertheless a large part of the power of XPages results from its foundation in JSF. So understanding JSF surly doesn't harm. O'Reilly provides in their Safari Books Online platform a online video training with more than 10 hours duration: Building Ajaxified Web Applications with JSF 2.0 by Marty Hall. In 15 lessons you learn a lot about JSF and Ajax.
  1. Overview
  2. Getting Started
  3. Basics
  4. ManagedBeans
  5. Navigation
  6. Expression Language
  7. Properties
  8. Handling GUI Events
  9. AJAX
  10. Validation
  11. Looping
  12. Data Tables
  13. Templating
  14. Composite Components
  15. View Params
Probably a lot of the functions a JSF developer needs to take care of are handled by Domino Designer in XPages, but it is good to know what the platform handles for you to appreciate even more. Knowing the inner workings will enable one to take full advantage of all capabilities.

Posted by on 07 January 2011 | Comments (2) | categories: XPages

Looking for Inspirations for your 2011 Intranet Initiative? (and musings about usability)

Have a good technology platform in one form or the other is no guarantee for Intranet success, even if your platform is leading in social. Intranets need to be usable. Memento bene: I say " usable" not " user friendly". I haven't seen "friendly" software, people are friendly (hopefully). Intranets (or any technology) needs to be fit for purpose and that's called "usable". A lot of times "usable" is perceived as rather "fluffy" description, However there is a clear description in ISO 9241:
  • Usability: Extent to which a product can be used by specified users to achieve specified goals with effectiveness, efficiency and satisfaction in a specified context of use
  • Effectiveness: Accuracy and completeness with which users achieve specified goals
  • Efficiency: Resources expended in relation to the accuracy and completeness with which users achieve goals.
  • Satisfaction: Freedom from discomfort, and positive attitudes towards the use of the product
In other words: Can your users do the right thing, error free, fast, complete and will they be pleased. I recall I once was discussing the design of an accounting package with a tax consultant. I mentioned that account numbers are really hard to memorise and that names would be better. However in the context of use (software for accounting professionals) and the specific users (data entry clerks) account numbers proved to be the superior solution. Users could keep one hand on the numeric keypad to enter data and the other hand was free to flip through the pages. Another example: If you know your commands well, the command line is actually a superior user experience (specified users: knowledgeable about commands) since it will perform given task fast and accurate and leave the users with that pleasant feeling of accomplishment. If you specify the users different (e.g. casual or clueless users) the command line becomes a nightmare and a wizard driven GUI might provide the best user experience. Already Tao Zhu Gong stated 400 BC as first business rule: "Know your people" in his art of trade.
Back to the Intranets. The Nielsen Norman Group just published the 2011 edition of their annual Intranet design competition. Reviewing the winners can serve as an excellent source of inspiration for your own initiative. Of course: don't copy blindly since your context of users, goals and outcomes most likely is different. And don't limit yourself to the latest edition. Reports are available for 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009, 2010, Financial Service Intranets, Web 2.0 Intranets, Portals and many more. Jacob Nielsen's UseIT always is good for an entertaining read. The NNGroup Usability conference Hong Kong is surly worth a visit.

Posted by on 07 January 2011 | Comments (4) | categories: Software


To see what your ISP has in store for you SpeedTest and PingTest provide the measurements you are looking for. All the shiny web2.0 applications are less vulnerable to speed bumps but to latency since they make small calls but a lot of them. While the local figures for Starhub, my current ISP, look close to the advertised speed, latency and international speed leave wanting. SpeedTest measurement
SpeedTest measurement
PingTest measurement
PingTest measurement
PingTest measurement
Starhub doesn't fare well for their mobile access speed in Justin Lee's field test known as #sgtelcotest. So back to SingTel?

Posted by on 06 January 2011 | Comments (0) | categories: Buying Broadband Singapore

Apache Axis and Sharepoint Webservices

In preparation for Lotusphere 2011 I had to deal with SharePoint web services. While SharePoint 2010 is transitioning to oData the bulk of APIs is still web services only as in SharePoint 2003 and 2007. Inspired by Stubby and Julian's excellent explanations I decided to use Apache Axis (It's a bit outdated and one probably would use Apache CXF for flexibility today, but for my use case Axis was sufficient and lean. Now SharePoint has a lot of web service end points (I always thought you have a few and distinguish by port and service, but who am I to challenge a Microsoft architecture) you might want to use in code. Axis comes with a nice little tool called WDSL2Java to generate all the Java classes you need. Unfortunately the ServiceLocator classes have the URL where the WSDL file was retrieved from hard coded as local variable in case you call the service locator without URL.
Now I don't like the idea to have an arbitrary URL in a Java file. So I considered 2 options: edit all generated classes and replace the static string with a call to a variable or an not-implemented error -or- find a way how all these classes can be generated for every instance where one wants to use them. Then the actual/current SharePoint server name would be in the variable. I decided for the later and wrote a little script. It's a Linux script and requires that you have downloaded AXIS and made it available on the Java classpath (easiest: copy the jars to the lib/ext directory of your jvm). I also used some Linux eye candy, so you might need to adjust that for Mac or Windows. The result is a JAR file you can use in your XPages, Agent or Java project(s). Here you go:

Read more

Posted by on 06 January 2011 | Comments (0) | categories: Show-N-Tell Thursday

Adventures in new-z-land: Configuring LVM on zLinux

This week I'm honing my skills on Domino for zLinux. z/VM allows to run a nearly unlimited number of guests with various operating systems. For Domino IBM supports Suse 64Bit Linux and Redhat 64Bit Linux. The Domino server is a full 64Bit implementation on zLinux. The mainframe also supports all sorts of storage. Typically one would find large disk farms with iSCSI connectors, but the "traditional storage" would be DASD (direct attached storage device). z/VM makes DASD devices visible as 1, 2, 4, 8, 24 and 54 GB storage devices. So instead of going after a large chunk of the attached iSCSI I decided to get a set of smalish DASD devices and test the Logical Volume Manager on Linux to combine them into a larger entity. This is relevant also for standard Linux server (with bigger disk to start with) once you run out of storage on your RAID 10 storage and want to add more. While Domino offers directory links LVM is more flexible since it will appear as single storage to the application. LVM is a standard feature of Linux and is available on all mayor distributions (You might need to install the files first). In my test I used RedHat Enterprise Linux 5.2 for zOS, where LVM is pre-installed (check this Redbook for details). LVM pools physical disks, RAID arrays or SAN storage into "Volume Groups". Inside such a group multiple partitions can be created that then are formatted with a file system. Volume groups can be extended just by adding disk and thereafter carry additional partitions or allow to enlarge the partitions to cater for more data
Linux Logical Volume Manager
Depending on the file system it might need to be unmounted before it can be extended, so we typically don't see the root ( / ) or boot partition inside a volume group. There are a number of steps involved to configure the LVM which are almost identical on all Linux versions, except for dealing with raw storage (which would be DASD in my case). I configured all steps using the command line. If that is not your cup of tea, Redhat provides the command system-config-lvm that provides a GUI (which I used for the screen shots). To get the GUI working you need to login into zLinux with ssh -X to start support for XWindows (Windows users: check what application supports XWindows). As first step we want to check

Read more

Posted by on 05 January 2011 | Comments (0) | categories: Linux Show-N-Tell Thursday

Timex Ironman Sleek 150

My favorite workout actually is swimming. Since the Polar FT80 doesn't count laps and its button shouldn't be pressed in water I was looking for an alternative. Turns out the Timex Ironman Sleek 150 fits the bill. With its large display it is easy to read under water

and its TAP technology allows for a buttonless operation. The reviews were rather mixed to negative but I tried it anyway based on a recommendation from the sales guy at House of Times who I regard as competent (and savy: he can repair watches - I watched him doing that). It turns out the "tap" rather needs to be a distinct "peg" under water (pegging onto glass surfaces is all the rage these days isn't it). Force and speed to get a lap counted are stable, so once I got used to it operation is as designed and as expected. The large numbers make a huge positive difference. I love it. Now I only need to get back to my 19" for 1000m breast as I swam them at university days.

Posted by on 03 January 2011 | Comments (1) | categories: After hours Singapore

Polar FT80 Customer Service

I'm using a Polar FT80 watch when working out to monitor my heart rate and training progress. I like it a lot since it allows me to upload training results to Polar Personal Trainer to keep track. When Polar released the Mac version of the upload software I finally could upgrade the S10 Netbook to Ubuntu.

Unfortunately my firmware was to old, so I gave the unit to Polar's service center in Singapore via the shop where I bought it "House of Times" in Orchard road. Something went wrong with the upgrade so I wrote an angry eMail to Polar support. Less than an hour later I got a reply with a mobile number and the name of the service person who would look into my problem. So I brought the unit back. After a short check he told me, that he has to send the unit back and that it will take some days. The "some days" to my pleasant surprise turned out to be 4 only (with new year in between!) and I could collect the unit today. He wasn't around when a staff handed me the phone back. Half an hour later he called, apologized that he wasn't around and asked if I'm satisfied with the result of the repair - which was free of charge. What a pleasant customer service experience.

Posted by on 03 January 2011 | Comments (0) | categories: After hours Singapore