wissel.net

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

By Date: April 2009

When customer service sucks - Star Alliance


I travel a lot. I use a world class airline, but are still member of Miles and More (The Lufthansa program). No problem one would think, since they are both members of Star Alliance. The main reason I haven't switched is that I would loose my status and since IBMers fly coach couldn't seek refuge in the lounge. So far so good. Miles/Point crediting works reasonable well and booking a reward flight works if you can plan 6-9 month ahead. However when it comes to requesting an upgrade on a Star Alliance member airline (for me: pay with Mile-and-More for a Singapore Airlines flight) the process breaks down. On the Lufthansa website there is a description how it works and a dead link that redirects without explanation to a completely different page. On the Star Alliance web site there is nothing, nor on the SIA website. A complaint via the online form only triggered the automated reply "We are looking into it". Seems the airlines happily issue miles and points, but loath to make redemption easy. *Sigh* night flight in embryo position coming up.

Posted by on 30 April 2009 | Comments (1) | categories: Travel

Domino Servers and Anti-Virus


You have build your High performance Domino Server but it doesn't perform. Besides running a proper OS, you need to ensure the right anti-virus configuration. All big Anti-virus vendors have plug-ins that intercept documents before they saved into a database and checked for integrity. So you are save (as far as you can say that). However when using the scanners default configuration the NSF are scanned again when you want to access them. And this is a bad idea. Pointless and an I/O killer. So go check: Does the Virus On-Access-Scanner leave your Notes databases alone (*.NSF/*.NTF in the notes data directory)? Excluding the various tmp locations and the transaction log is also a good idea. Works wonders on performance.

Posted by on 24 April 2009 | Comments (2) | categories: Show-N-Tell Thursday SYWTBADD

How to explain "What is Server Virtualization"


When explaining server virtualization to non technical people the easiest way to confuse them is to introduce the trade lingo: host, guest, hypervisor and so on. Discussing virtualization for a while I came up with a good analogy: " Server virtualization is like car sharing". If you commute to work in a car: have a look out of the window. How many cars, perfectly capable of carrying 4 or more people, just transport one person?
No virtualization leaves server resources unused
(Think server = car) The same is true for many servers. They run under-utilized. The number of seats would be the equivalent of the I/O capabilities and the cruise speed (or horse powers) You can go through a number of phases in easing your traffic congestion (in IT: work overload for administration and IT budget):
  • Pool the cars: The equivalent of moving physical x86 server onto a virtual infrastructure, still on x86 architecture. XEN and VMWare lead the charge here. Of course if you have 20 people the car won't help. And you know what hassle it is to distribute a crowd into the available cars.
    x86 based virtualization uses resources better, but the container size stays the same
  • Take a bus: Move workloads (if suitable) to high end hardware like IBM AIX, SUN Oracle Solaris or HP/UX
    Unix Virtualization allows for more loads per server
  • Take a train: Replace all the boxes with an IBM zSeries. The z10 would be the equivalent of a MagLev train (short of the cost of course)
    zSeries Virtualization - IBM reduced several 10thousand servers to a few mainframes
  • Fly: In the clouds. Cloud computing is the logical end-point (keep in mind: flying is not the one-fits-all solution for your travel needs. Just try to fly to the grocery store down the road.) However Server Virtualization and Cloud computing differ in a few aspects: The cloud user is no longer aware of physical machines, they are completely managed by the cloud provider. A cloud provider would typically not offer a OS container (like the virtual server), but a specific execution service: storage (file and database), computation (application server) and presentation (web server with various protocols) or even higher level services like: data sync, ERP, CRM). Nevertheless virtualization is a step in making the cloud work for you.
    The Cloud as ultimate virtualization - if the bandwidth would allow it.
Advanced topics here: car pool management, bus maintenance, train scheduling (ask your z/OS or VMWare experts for that).
As usual: YMMV.

Update: There is a nice article on developeworks explaining more about virtualization in the context of Domino on Linux on zOS

Posted by on 21 April 2009 | Comments (1) | categories: Software

Building a high performance Domino Server


Domino can take huge user populations. To do this successfully all elements of a Domino server have to be considered carefully. Following the old insight " It is always the cable" you need to pay attention to the hardware layout. While you perfectly well can install a Domino server on a low-end laptop or a VM Image, it wouldn't give you the peak performance you are looking for. You rather want something looking like this:
Server layout for a high performance Domino server
Let us look at the details:
  • Disk layout
    • Operating system and Applications: This is your first RAID 1 Array. Since data hardly change and are really not that much a small but fast spinning drive will do. RAID1 protects you against failure of one drive and speeds read operations. Some suggest to have separate drives for application and OS, but that might be overkill. You could consider having separate partitions (easy on Linux/Unix).
    • View Rebuild Directory: There is a nice notes.ini variable View_Rebuild_Dir. You can point to a separate drive to store the temporary files created during index updates. The default is the system temp directory. This directory is a good candidate for a RAM disk or a solid state disk when your system is updating a lot of views all the time.
    • Domino Data: Typically you have a RAID5/RAID10 storage here to accommodate the large amount of data (users demand Google size mailboxes and your applications don't shrink magically). More and more we do see SAN systems for Domino storage, which is OK. Just keep in mind: Don't store Domino cluster databases from different clusters in the same SAN since it defeats the idea of a share-nothing cluster. While we support the use of NAS, the network latency and bandwidth is a limiting factor. Archival servers run fine with NAS, but not your high performance primary production server.
      Update: Fixed the graphic to show RAID10 since is shows much better performance than RAID5
    • Transaction Logging: You have tried it. Switched it on, expected great things and it didn't perform. The flaw: for good transaction logging performance you need your own disk. Not just another partition, but your very own spindle (RAID1) ideally with its own controller. It would be interesting to see how solid state disks work here.
    • Full Text Index: Since Domino 8.5.3 you can move the FTIndex to a different drive. This improves data throughput and reduces fragmentation on your data drive. Add FTBasePath=d:\full_text to the notes.ini and run updall -f. Your 100 user server won't notice. Large environments will benefit
  • Network layout
    • Cluster Replication (If you cluster your server only): You want to have your cluster on its own network segment. If you have 2 boxes next to each other a cross-over cable would do (afaik 1GB Ethernet requires a hub). If your go three-way (highly recommended), then a hub and an IP address segment that doesn't get routed will do.
    • Server Network: All servers should be connected on the server backbone. Put them into their own subnet clients can't see. Replication never gets disrupted by clients jamming the network ports. The server network also handles mail routing.
    • Client access: If you have huge numbers of clients you might reach the physical capability of your network card or the TCP/IP stack. Use more than one card and/or more than one IP address to have sufficient ports available for clients to connect.
Of course all of this isn't new (except the shiny picture), you can read much more details on IBM's Domino Performance Best Practices pages. This is just about the hardware layout. You need to consider the operating system too. But that's a story for another time. As usual YMMV.
Update: There is now addtional material available how to tune an IBM System x server to peak performance. Update 2: Samir points to a nice comparison between RAID5 and RAID10. It's not Domino related but insightful. One key point there: watch your controller.
Update 3: Added the separate drive for the full-text index

Posted by on 21 April 2009 | Comments (10) | categories: IBM Notes Lotus Notes Show-N-Tell Thursday

Professional Traveller


I wake up. It is Shangri-La
Not that mystical place of my dreams
but a well run hotel. Carefully
maintained beauty, flawless service.
I'm connected, my social graph is with me,
posts, tweets and sweaks try to lull me
into the illusion of closeness.
Another day, professional excellence is expected.
The keyboard has a precise pressure point,
but I'm longing for a human touch.
I loath to join the club of lonely hearts
convening at the hotel bar every night.
Memories tell me travel was exiting, ready like
a minute man heading to the airport.
Gone. The call of duty remains. I watch
in the cafes happy chatter
in languages I don't understand.
I'm the professional Traveller,
ready to go where I'm needed,
all by myself.
Loneliness my faithful companion.
What city is this?

Posted by on 19 April 2009 | Comments (4) | categories: After hours

Code Quality and Decomposition


I spend the past few weeks reviewing code in Lotus Notes applications. While the robustness of the platform amazed me, the code I saw didn't (short of that one form with 1932 fields and 212 @DBLookups).There seems to be a common lack of coding quality among corporate LotusScript developers. I hear " C'mon what is your problem? The code is working." I reminds me of the guy who jumped from the 88 story building stating " So far everything is fine" when falling past the 10th floor. Unfortunately very often the person who writes the code (being a contractor) doesn't have to maintain it, so bad engineering kicks in. When you write code you should make one base assumption: " The guy who will have to maintain your code is an armed maniac and has your address".Sadly the statement " It is working" neglects the most basic principle of software engineering: we don't write code for machine, we write code for humans to understand. Machines don't "understand" code, they just execute it. Enough of the rant, what needs to be done, what makes good code? In a nutshell: decomposition. Decomposition is a fancy word for breaking down tasks into smaller units until a unit solves exactly one problem. The recommended approach for this is top-down development. The Stanford Computer Engineering class uses your morning routine as example. The big task is "Morning routine" Morning routine can be broken down into: Get out of bed, morning hygiene, breakfast, get to work. These tasks can be further broken down, lets take breakfast as example (Stanford uses the morning hygiene, so you have 2 now): Prepare Breakfast, Eat Breakfast, Read Newspaper. Prepare Breakfast can be broken down to: Kiss wife, make coffee, make eggs, get juice, make toast. Make coffee can be broken down to: get water, get coffee powder, fill machine, boil coffee. Get coffee powder can be broken down into: get box with beans, fill grinder, grind, get grinded powder.And so on. Whatever programming language you use (even in COBOL) you could just write down in natural language what you do and then implement the sub routine:

 
 
 
Sub Breakfast PrepareBreakfast EatBreakfast ReadNewsPaper End Sub Sub PrepareBreakfast Do until sheIsSmiling sheIsSmiling = KissWife End Do MakeCoffee 2 MakeEggs 4 MakeToast 2 End Sub
This LotusScript was converted to HTML using the ls2html routine,provided by Julian Robichaux at nsftools.com.
There are a number of tips (lifted from the Stanford lesson without asking) around decomposition:
  • Break your program down until a routine solves just one problem. That one problem: HaveBreakfast then gets broken down into smaller tasks. This is a subject of heated discussion, when you reached that one problem. But you can for sure tell, that acquiring a collection of documents, looping through them and manipulate one document at a time are 3 problems.
  • Methods are short. In the Stanford lecture a number between 1 and 15 lines was stated. I would say: a method (function, subroutine) needs to be readable on screen without scrolling (so your methods get shorter when you develop on a netbook)
  • Methods have good names. If you read your program out aloud it should tell the story. function1 function2 doesn't cut it. The computer doesn't care, but keep in mind you write your code for other people to read and understand. (OK, nothing beats this COBOL statement: PERFORM makeMoney UNTIL rich [Fullstop])
  • Methods have comments. What does the routine do? Any special considerations. What are the pre- or post- conditions. For LotusScript use LSDOC to generate documentation out of the comments.
  • Decomposition is valid for procedural, functional and object oriented programming.
You want to know more? Take the free course and read books about OO Design and Software Engineering or complete and beautiful code.

Posted by on 19 April 2009 | Comments (0) | categories: Software SYWTBADD

NoReader and NoAuthor Fields


Access control in Lotus Notes and Domino is build around the concept of positive identification, meaning you specify who can read or edit by naming them explicitly or implicitely as members of a role or group. What you can't do is to say: Everybody except these people (or all members of group A but not when they are members of group B). We don't have PreventReader or PreventAuthor fields (which would come in handy from time to time). The only construct is the the -No Access- setting in the ACL which has the highest priority.
For web applications there is actually a way how you can implement a PreventReader form (must be web only). You have to be clear that is is NOT a watertight method and can be compromised given enough effort. However it is good enough for most requirements (It doesn't work in Notes clients). These are the steps:
  1. Create a Names field that will hold the entries that can't read an entry (call it PreventReader)
  2. Design all your views to only contain hidden columns
  3. Create $$ViewTemplates for [ViewNames] form with no embedded view, no $$ViewBody fields, but a Body RichText field and a SaveOptions field, Computed, Formula "0"
  4. Create a webqueryopen agent (with a little creativity you can get away with one agent and one form) that prints the columns you want to display into the BODY field. The logic that prints the lines needs to be extended to skip printing when the @UsersNamesList contains a value from the PreventReader field. Since the view columns are otherwise hidden even ?ReadViewEntries wouldn't reveal a thing.
However a user could open a direct link to the document. So there are a few additional steps required:
  1. Create one subform per form. Call them sf[OriginalFormName]. Cut & Paste the whole content short of the PreventReader field into the subform.
  2. Create one subform sfUnauthorizedAccessAttempt that has a nice message or throws the user back to the start-page and/or logs the attempt
  3. In the now almost empty main forms add a computed subform with the formula @if(@isNotMember(ReventReader;@UserNamesList;"sf"+form;"sfUnauthorizedAccessAttempt")
Now if a user gets a direct link (e.g. forwarded by an authorized user), the subform "sfUnauthorizedAccessAttempt" will load instead of the subform with the real data, so our excluded user has nothing to see.
As usual: YMMV.

Posted by on 15 April 2009 | Comments (4) | categories: Show-N-Tell Thursday

Reader Fields - extreme Edition (update)


Reader fields are "haunting" me. Recently I was asked to provide a solution for a requirement to add a very large number of entries to a reader field. A number that firmly exceeds the storage capability of a reader field (still 32k after all these years). My first instinct was to look for alternatives like using a few group names. However the alleged business case is the exclusion of a few people from a large group (somehow: the whole department can read a document except the person who has birthday since it is a party-planning application). This was one of the cases where I was wishing for a new field-type: NoReaderField (and for that sake NoAuthorField).
Well there is always the next version. Until then I created a small class, that allows you to add, remove and query names in a "virtual" reader field. Instead of reading and writing into a Notes item the developers call a method in a class (addEntry(newName as String) or addEntries(newNames as Variant) (an Array)) to interact with the reader field. The "saveField" method then distributes the values onto one or more reader fields. I don't made it too scientific and counted bytes, but rather count number of names. Splitting the reader names across multipe fields requires adjustments to your views. Something like Reader1:Reader2:Reader3:....:Readerx. We haven't tested the impact of that on performance. Once I have data on that I'll provide an update.

Update: Turns out the class was a bad idea. There is a hard stop for the total size of all combined Reader fields in a document. So the alternative is to use an approach similar to the NoReader field. I consulted with the master and discuss alternatives.

Have a look at the code yourself:
 
 
 
Option Public Option Declare '/** ' * ' * FieldAccess is a universal class to manage large amount of values put into text fields ' * (text, names, readers, authors etc. ' * it manages these large amount by splitting reader names into multiple fields to overcome ' * the 32k size limit. New fields are created as needed. ' * Good for 62500 entries ' * ' * v0.1 2009-03-20 : notessensei@sg.ibm.com ' **/ '// Important: This class doesn't contain production quality error handling, you need to add '// that for production use. Use OpenLog for best results! Public Class FieldAccess Private AccessFieldName As String 'The base name for the Reader field Private maxFieldEntries As Integer 'The maximum number of entries per reader field Private maxNumOfFields As Integer 'Limit the number of fields, to avoid mising data in views Private maxTotal As Integer 'The maximum number of names in total Private curTotal As Integer 'The current number of entries Private curFieldMembers List As String 'The list of current Reader entries Private fieldCount As Integer 'The current number of fields Private initialized As Boolean 'Has the list of names been initialized Private doc As NotesDocument 'The current document Private fieldType As Integer 'Text, names, reader, author Sub new (curDoc As NotesDocument ) Set Me .doc = curDoc Me .AccessFieldName = "Field" Me .maxFieldEntries = 500 Me .maxNumOfFields = 10 'Adjust as needed Me .initialized = False Me .fieldType = 0 'No special type End Sub 'Need to set the field Name Public Property Set fieldName As String If Me .AccessFieldName < > fieldName Then Me .AccessFieldName = fieldName Me .initialized = False End If End Property Public Property Get FieldName As String fieldName = Me .AccessFieldName End Property 'How many entries are in the names field right now Public Property Get count As Integer If Not Me .initialized Then Me .initializeFields End If count = Me .curTotal End Property 'Add a entry to the value list Public Sub addEntry (entryToAdd As String ) If Not Me .initialized Then Me .initializeFields End If If Not Iselement ( Me .curFieldMembers (entryToAdd ) ) Then If Me .curTotal = Me .maxFieldEntries * Me .maxNumOfFields Then Error 8000 'We throw an error Else Me .curFieldMembers (entryToAdd ) = entryToAdd Me .curTotal = Me .curTotal + 1 End If End If End Sub 'Bulk adding of entries. Suitable to pull in entries from getItemValues

Read more

Posted by on 15 April 2009 | Comments (2) | categories: Show-N-Tell Thursday

Lotus Domino and RFC


In a recent request by a government customer we were asked about the compliance of Domino with various RFC. I've listed them here for reference:
RFC Description Domino Remarks
RFC 1123 Requirements for Internet Hosts Application and Support (STD 3) Yes
RFC 1870 SMTP Service Extension for Message Size Declaration (obsoletes: RFC 1653) Yes
RFC 2476 Message Submission Obsolete see RFC 4409 below.
RFC 2505 AntiSpam Recommendations for SMTP MTAs (BCP 30) Yes
RFC 5321 The Simple Mail Transfer Protocol (obsoletes RFC 821 aka STD 10, RFC 974, and RFC 1869, RFC 2821) Yes
RFC 5322 Internet Message Format (obsoletes RFC 822 aka STD 11, and RFC 822) Yes
RFC 2920 SMTP Service Extension for Command Pipelining (STD 60) Yes
RFC 3030 SMTP Service Extensions for Transmission of Large and Binary MIME Messages No
RFC 3207 SMTP Service Extension for Secure SMTP over Transport Layer Security (obsoletes RFC 2487) Yes
RFC 3461 SMTP Service Extension for Delivery Status Notifications (obsoletes RFC 1891) Yes
RFC 3462 The Multipart/Report Content Type for the Reporting of Mail System Administrative Messages (obsoletes RFC 1892) Yes
RFC 3463 Enhanced Status Codes for SMTP (obsoletes RFC 1893 ) Yes
RFC 3464 An Extensible Message Format for Delivery Status Notifications (obsoletes RFC 1894) Yes
RFC 3834 Recommendations for Automatic Responses to Electronic Mail Yes
RFC 4409 Message Submission for Mail (obsoletes RFC 2476) Partial Domino can be configured to act as an MSA, but is not strictly compliant (e.g. does not qualify unqualified domains in addresses)
RFC 4952 Overview and Framework for Internationalized Email This is not a standard - only an informational document
RFC 4954 SMTP Service Extension for Authentication (obsoletes RFC 2554) Yes
RFC 5068 Email Submission Operations: Access and Accountability Requirements (BCP 134) Yes This is not a standard - it is a document describing a set of operational best practices. Domino can be configured to support these practices

Posted by on 13 April 2009 | Comments (4) | categories: Show-N-Tell Thursday

Before you blink the feature is there - add geo location information to your Ajax applications.


If you want to know where an IP address belongs to, you now can use a free service. As Volker lets us know, you could have the whole database at your (local) service. But why do all the heavy lifting if you just need an IP address from time to time? iplocationtools offers a simple REST API to query an IP address returning a XML or CVS result. The only thing missing was a JSON return value (and JSON *is* the flavor of the day isn't it?). So I asked nicely and about 7 hours later (given the difference in time zones: that is pretty instantly after getting the first coffee into your face), the interface is ready. Now I wish other ideas would be implemented with the same speed.

Posted by on 12 April 2009 | Comments (0) | categories: Software

DXLMagic - using the DesignExtractor


I'll show you to take full advantage of the DXLMagic Tools one post at a time. You have exported your database application using the DesignExporter. Now you can run reports, transform the XML, edit it etc. When you are planning to work on individual element using the full DXL is a bit cumbersome, especially when you plan to write back just some parts of it later on. To split your file into multiple files you use the DesignExtractor. It will extract parts of your DXL based on an XPath expression. If XPath is still a mystery for you, this would be the time for a tutorial, Jeni's Introduction or Michael's Reference . Since you typically want to extract more than one sort of element, DesignExtractor uses a command file with instructions.
The syntax for DesignExtractor is:
java com.ibm.sg.dxlmagic.DesignExtractor [PathToDXL] [ResultPath] [CommandFile]
In the latest version of the DXLMagic.jar I have updated the path parameter, so you now can use "." for the current directory instead of specifying absolute path names. [PathToDXL] must point to a DXL File. I currently don't process all DXL files in one directory (Maybe I should think about such an option), so you have to point it to one DXL file. [ResultPath] is where your individual files go. You will see in a second, that you can specify subdirectories for individual results. The interesting part is the command file. The command file executes one extraction per line (empty lines or line with # at the beginning are ignored) and needs 3 parameters:
  1. File Prefix: The extractor tries to name the file using a name or alias found in the result from the XPath expression. If it can't find something it uses a running number. It appends this to the file prefix. If your file prefix contains a directory separator it will write that file into that subdirectory (and create it if needed). So the full name for any file is composed out of [ResultPath]+[File Prefix]+[Name that the Extractor figured out]. A typical value for File Prefix would be "forms/form"
  2. Export Mode: The extractor can write the result of the XPath expression into one summary file or into one file each for every result node. If you want one summary file you use "summary", for individual files use "single".
  3. XPath expression: The heart of the extractor. An XPath expression is evaluated and returns a note-set. You can do whatever you fancy including using the extractor against other XML files (you might struggle with the name spaces a little bit then). To make your live easier with the XPath, the DXL namespace is abbreviated "d:". Typically you would extract high level elements like forms, views, libraries, agents etc.. However you are not limited to that. You could e.g. extract all fields to feed them into a cross-reference system. Getting started is easy: Extracting all views is this expression "/d:/database/d:view".
The command file you typically will want to use looks like this:
forms/form,single,/d:database/d:form
forms/subform,single,/d:database/d:subform
forms/page,single,/d:database/d:page
misc/frameset,single,/d:database/d:frameset
views/view,single,/d:database/d:view
views/folder,single,/d:database/d:folder
sharedstuff/field,single,/d:database/d:sharedfield
sharedstuff/action,single,/d:database/d:sharedactions
resources/image,single,/d:database/d:imageresource
resources/applet,single,/d:database/d:appletresource
code/agent,single,/d:database/d:agent
code/webservice,single,/d:database/d:webservice
code/scribtlibrary,single,/d:database/d:scriptlibrary
sharedstuff/column,single,/d:database/d:sharedcolumn
misc/outline,single,/d:database/d:outline
code/databasescript,single,/d:database/d:databasescript
misc/helpusingdocument,single,/d:database/d:helpusingdocument
misc/helpaboutdocument,single,/d:database/d:helpaboutdocument
resources/dataconnection,single,/d:database/d:dataconnection
resources/fileresource,single,/d:database/d:fileresource
resources/stylesheetresource,single,/d:database/d:stylesheetresource
resources/db2accessview,single,/d:database/d:db2accessview
Happy extracting. I'll continue that series with some of the stylesheets we have written. Stylesheets are not only good for reports, but also to whip your code into shape. Stay tuned.

Posted by on 11 April 2009 | Comments (0) | categories: DXLMagic Lotusphere Show-N-Tell Thursday

Enemy of the <strike>state</strike> IT system #1 : complexity


As the saying goes the complexity of any system grows at the square of the components involved. We do live in a complex world, so you can shrug, surrender to the unavoidable and move on. Or you can take a closer look and discover differences in complexity. There is the complexity from the nature of the task at hand and there is the complexity we add in the way we approach the completion of the task. Order a meal in a restaurant can be straight forward or incredibly complex. You can call that " Essential Complexity" and " Accidental Complexity", terms coined by Fred Brooks over 20 years ago. His book The Mythical Man-Month is a must read for any software engineer or normal mortal human dealing with software engineers. Brooks states that software isn't werewolfs, so there is no silver bullet. While I fully agree with his insights, I more and more doubt, that the second complexity is really " accidental". It is man made and IMHO quite deliberate. Of course we never need to assume malice where incompetence is sufficient to explain*. Let us look at the setup of your average web application (and I skipped the provisioning and monitoring pieces, as well as the diverse interfaces to administrate all this):
Too many moving parts
After careful counting that would make 6 servers or a complexity of 36. The setup is typical for Microsoft setups (Exchange, ActiveDir, Sharepoint, IIS, DotNet, SQL Server) as well as for Java setups (Apache HTTP, Tomcat/WAS, Samba, LDAP, DB2/MySQL, POP/IMAP) or your favourite scripting environment (just swap out Tomcat/WAS for the script of your choice). Not all of these servers need to be physical boxes or virtual images. They can be tasks running on one hardware. Make that high available (12 boxes) and you have a complexity of 144. Of course you could use Domino for your applications. The setup will look like this:
DominoSimplicity.png
Of course to get there you have to challenge your believes:
  • Complexity is good
  • Web systems need to be 3 tier
  • A directory must be dedicated LDAP (Domino does LDAP, as does AD)
  • Databases must be relational
  • Only complex setups scale
  • Only with [insert-your-favourite-language-here] web applications can be developed properly
  • And then the Lotus Domino specific ones:
    • Domino is legacy
    • Domino doesn't scale
    • NSF is not reliable
    • Web development with Domino is complicated
* On the other hand: Any sufficiently advanced incompetence is indistinguishable from malice.

Posted by on 10 April 2009 | Comments (8) | categories: Show-N-Tell Thursday

XPages Workshop Impressions from Bangkok


The XPages workshop proved to be very popular. About 30 participants showed up to get their take on web2.0 development with Domino Designer 8.5. Impressions from earlier workshops got confirmed:
  • Everybody loves XPages
  • Developer with a background in web development grasp XPages faster than classical Notes developers
  • Exercise 17 is the most difficult one, but everybody can complete it
  • The XPages outline (in the default Domino Designer perspective on the lower left) is a huge time saver navigating your XPage
  • Having the ability to inspect the source code can accelerate trouble shooting tremendously
  • A modal window to enter code is a nuisance
For business partners the workshop run as "bring your own laptop". To my surprise quite a number had Windows ME 2009 Edition Vista on their machines and quite some trouble getting the local preview of Domino designer to work. This is a known problem that plagued others too but has been solved one way or another. Just keep in mind: Never ever install a data directory inside the place where programs go (I think we need to adjust our installer defaults) and be clear what runs/blocks Port 80. Look out for Skype (can be switched off in the settings), Firewalls, Webservers etc.

Posted by on 09 April 2009 | Comments (1) | categories: XPages

Lotus Top Gun Singapore, 11 -15 May, 2009


Want to get up to speed on the whole Lotus Software Portfolio? Attend a Lotus TopGun (sorry IBM business partners only).

This intense, fast-paced class provides the very latest training on Lotus products and solutions, as well as direct access to some of the best sales leaders and offering managers in Lotus!  We'll discuss solutions you can sell with Connections, Quickr, Sametime, Portal and Accelerators; the very latest information on Notes/Domino 8 solutions, as well as the latest news about Lotus Foundations, Lotus Protector, LotusLive, and more!  Students will spend 4-1/2 days focusing intently on how to beat the competition, while acquiring the skills and knowledge to do it.  Sign up now, seats are limited!
  • Audience:  IBMer, IBM Business Partners and anyone selling or recommending Lotus solutions.
  • When: 11-15 May, 2009
  • Where: Singapore (Venue To Be Announced)
  • Cost: There is no tuition charge for the class.  (NOTE: Your company or department is responsible for the cost of any meals, lodging, and transportation expenses, as applicable)
  • Prerequisites:
    • Have a basic knowledge of the Lotus product family, which can be obtained by attending Software Top Gun and a Lotus TOP GUN Virtual Learning class; on-the-job experience; or by reviewing the Lotus Strategy Notebook and the portal portion of the Websphere Strategy Notebook, which are online here.
    • If applicable to your role, bring an active Lotus opportunity to class that you will work on with a team
You can enroll for Lotus Top Gun here. Complete logistics information will be sent after your enrolment is confirmed. If you have any questions, please contact the Class Manager, Darlene Shamsid-Deen.

Posted by on 07 April 2009 | Comments (1) | categories: IBM - Lotus

XPages Custom controls parameter definitions


One of the very cool features in XPages is the ability to create your own custom controls. While on the first look one could say "well, they are just subforms with a new name" the second look shows bigger differences:
  • Custom controls can appear more than once on a page, subforms only once (yes there was the possibility to add a subform twice if it didn't contain any fields, but that was not intended)
  • Custom controls are self aware: they "know" what is inside and what is outside
  • Custom controls have parameters. You can define parameters that the custom control will address as CompositeData.[parameterName] and the hosting pages address as [controlName].[parameterName]
When you look at the source code of a page you can clearly see the parameters you might have set for a custom control. However when you look at the source code of your custom control, you won't see any definition. Puzzled me for a moment, so I asked the master. At the very end XPages is a JFS application. In JFS a custom control has 2 files (at least): the code and the definition. XPages shields you from the complexity by allowing you to edit everything in one UI. But if you *really* want to have a look, add the Navigator window to your Domino Designer perspective and navigate to the custom control directory. Here you will find MyControl.xsp as well as MyControl.xsp-config. If you want to understand what the containing XML is all about, take a peek at a JSF tutorial

Posted by on 04 April 2009 | Comments (7) | categories: XPages

Interesting Challenge or lack of platform understanding?


A developer approached me with an interesting question: " In a Domino web application I need to prevent the same user account being used simultaneously in different sessions". I found that question quite interesting and tried to make sense of it (which I couldn't, so I ask here):
  • It sounds like a question straight out of the eighties: Users must only logon to the application once.
  • Domino doesn't count user sessions, so licensing can't be an issue. If the web page has been transmitted no additional resources are consumed, so load factor can't be an issue.
  • A "session" in HTTP is identified by a successful login and can include multiple connections (different browser windows, retrieval of html, css, js, XML, images etc.). The only differentiator would be "login from a different location", which becomes difficult for users behind a shared NAT.
So I conclude: the request is not to allow sessions from the same userid from different places. My first gutt feeling is that an DSAPI filter would be required to achive something like that. Or what would you do?

Posted by on 02 April 2009 | Comments (6) | categories: IBM - Lotus

What makes a good April fools story?


It is April fools day and we are waiting for the stories to come in. But what makes a good Aprils' fool? The story needs:
  • Within the bounds of regular reporting: This is easy for general newspapers, a little more challenging for technical publications/technical blogs
  • Plausible: A reader must think: yes that is possible
  • Disguised: Best mixed with facts, so facts and fiction melt together
  • Falsifiable: With a little effort it should become obvious (most cases: nobody else reports it)
I'm blogging for a number of years now and had more or less successful entries:
Of course: Funniness is in the eye of the beholder

Posted by on 02 April 2009 | Comments (1) | categories: After hours

My new IBM role


Musical chairs is a favorite game in IBM. Typically there were enough chairs for everybody, but this year quite some were falling off. Luckily I found a seat to sit on. Effective today I'm leaving IBM's Techworks to head a new IBM R&D facility. As you know IBM is on a buying spree also in AP. We bought Outblaze last year. It wasn't the last acquisition in AP. IBM just acquired Bali Camp, an Indonesian ISV. Bali Camp will be IBM's center for eW2.0 application development. eW2.0 stands for emerging web2.0 applications. One challenge that emerging economies face is the reliability and quality of service of their networks. High fluctuations of latency and bandwidth require new approaches to development. In eW2.0 there is nothing like "always on" but "mostly on, except when you need it". Since Bali sits in the middle of that problem we will deliver close to the problem. And I'll run the show. Bali here I come!
Update:

Read more

Posted by on 01 April 2009 | Comments (11) | categories: IBM - Lotus

Upcoming XPages workshops in AP


We have new dates for XPages workshops: Places are limited, so be quick.

Posted by on 01 April 2009 | Comments (7) | categories: XPages

Manage your IBM servers - use the IBM Tools Center


The IBM System x? ToolsCenter is collection server management tools to help manage your IBM System x and BladeServer environment. ToolsCenter makes managing your server environment less complicated, more productive and cost-effective.
You will find a lot of gems there: Server Guide, Bootable Media Creator, Scripting Toolkits and more.

Posted by on 01 April 2009 | Comments (0) | categories: IBM