How IBM could make my life a little easier

Dear IBM,

I like that I now can use database icons with more than 16 fixed colors. I have updated pretty much all our applications (or is it called databases again?) with new and modern looking icons. The users likes it too.

However, with the old icon editor,it was easy to use the flood-fill tool to add a (in my case red) background to all templates. This made it very easy to differentiate between applications and templates. There is no option like that when I use the new database icons, I have to make a second icon in Photoshop and manually re-color it.

Why not add some kind of indicator to the application icon, to show that it is a template?  Below is my attempt to design something.  You see the red indicator that it is a template, you see the version number of the template and the server at the bottom is alwasy visible, as it is in a section of it's own.

Template Indicator in Lotus Notes Domino

As you see above, I use version numbers on my templates. Would it be too much to ask for a version number property and have the version number displayed on at least the template icon, like I have in my image above?
The version number should be transferred over to the application at design refresh time. The build number could be automatically updated when a "Recompile All Lotusscript" is performed, or automatically when any design element is modified and the build number has not been updated the same day already. A fully manual option shold also be available. How the build number gets updated should be an option in the settings for Domino Designer.

Of course, you need to create a way to access the version number programatically. Something like this:

 
 Dim version as NotesVersionNumberSet version = db.VersionNumberPrint version.Major ' Returns 1 Print version.Minor ' Returns 3 Print version.Revision ' Returns 0 Print version.Build ' Returns 1234 Print version.FullVersion ' Returns "1.3.0.1234" 

A formula function like @AppVersionNumber would be nice as well.

 

Thank you,

Your friend Karl-Henry

 

 

0 Comments

YUI3: Powerful Javascript Framework

Last week I came up with a small side project. It was basically a simple web chat, working pretty much like the comments on a blog. I decided to build this as a classic Domino application, not using Xpages. I started development Wednesday mid-afternoon, and the application needed be done Thursday evening, and I of course had my regular job to do. So I could not justify spending the time I needed to learn doing it in Xpages, and then try to write CSS to get it to look like I wanted it. So there you have the reason for why I did not use Xpages.

I decided to take a look at YUI, the framework developed by Yahoo. The latest version is version 3, and it is really nice and powerful. I looked into in, and realized that I could do things very quickly, getting the same functionality as using Xpages (partial refresh  or page, etc) in just a few lines of code.

So what did I need for my application? I started with a blank Notes database. I created a page, which is where all the action would take place. On the page I created a header section (logo), a content section (where the messages/chat would be displayed) and a form section where I put a few fields for the users to fill out. The fields were name/handle, email, (optional) website and lastly the message to send. I also put two images there, one to use as a submit button, and one to refresh the chat content without having to submit a text.

Bloggfika Webchat using YUI3

I added some javascript at the top of the page, loading YUI3 (hosted by Yahoo, I did not even have to download anything):

 
<script src="http://yui.yahooapis.com/3.5.1/build/yui/yui-min.js"></script> 

The next step was to add some code for the actual logic on the page. YUI works by binding functions to events on elements on the page. I wanted to bind function functions to the onClick event of the two buttons, "submit" and "refresh". To avoid this blog entry to be too long, I will just show the code behind the refresh button:

 Y.one('#refresh').on('click', function(e) {        e.preventDefault();        var contentcell = Y.one("#contentCell");        if (contentcell) {            var currentTime = new Date();            Y.one('#refresh').set('src','webchat.nsf/ajax-loader-150.gif'); var args = &refresh=true&datetime=" + currentTime.getTime();            contentcell.load("webchat.nsf/SendText?OpenAgent" + args,"", function()  {                Y.one('#refresh').set('src','webchat.nsf/refresh.png');            } );        }    });

This code gets a reference to the first element with the id "refresh" using Y.one(), then bind a function to the "click" event. The function is defined right there, and it will do a couple of things. First it get a reference to the element (in this case a DIV) with the id  "contentCall". I check if it was found, and if so I get the current time (get a unique number). I then change the image of the refresh element to a spinning "loading" icon.

The next line is the coolest one. In one line of code I perform an Ajax call to an agent on the Domino server, and put the returned data into the contentcell element. Finally, after the server returns teh data, another function is called, which restored the refresh button to the original image.

The agent is written in Lotusscript, and it just read the existing chat entries from a database and output it using the print statement as HTML. I add the times in seconds as a second argument, just to get each call to be unique. Otherwise the returned data might be cached on the server and the user would not get the latest data.

The submit action is similar, the difference is that it read the values from the different fields on the form and submit them to the same agent as name-value pairs. The agent will detect that data is being passed to it, and will store the values in a new Notes document, then return HTML for all entries just like the refresh.

As you can see, a complete Ajax call (calling the server, waiting for data, gettingthe data back, replacing the content of an element on a page to perform a partial refresh and triggering additional code when the data has been returned) is just one line of code. Could not be much easier!

The actual application got more functionality, I check for certain required fields already in the web client, using javascript, I load up the content when the page is first opened (so the user does not have to press refresh to see anything), etc. The webchat is also just open specific times, when it is closed a message is displayed about when it will be open next, etc. The open/close is set by a Notes configuration document. Note: Do not use profile documents to store items for a web application, they get cached on the server and you will probably not get the latest data…

I am impressed with how easy and quick it was to build this application, using a compbiantion of classic Notes and a powerful javascript framework.

 

0 Comments

Notes/Domino future roadmap survey results

Yesterday I created a simple survey to see what people wanted in a future version of Notes/Domino. It was based onEd Brill's post, where he summarized the result of the comments to his request for suggestions on what areas to focus future development of Notes/Domino.

I think the results speak for themselves. But with 74 survey takers, more than two in three want the client performance to be improved, and almost as many want the limitations (32K/64K) removed and teh Notes cleint UI modernized. Rewriting all templates using Xpages and match the templates delivered with Sharepoint was another popular feature, as well as better documenattion and a more stable Domino Designer.
I think the 52% who voted on improving Domino NSF performance mainly were thinking about faster indexing, and moving view index to separate drives, outside the NSF file itself.

The "other" answers were:
* Make Connections free
* Create an AppStore for Domino applications
* Make Deployment easier, as easy as outlook
* Solve the known bugs
* Enhance Linux support

 

Survey Results

Update: There are still responses coming in, I will update the result as more results come in.

 

0 Comments

[Code] – Mail Merge/Form Letters in Lotuscript

Back in 2003 or so, I wrote some code to take a form letter (stored in a Notes document) and merge that with data stored in another Notes document in order to create a personalized letter that could be printed or emailed. Back then we were still on Notes 5, so very limited rich text functionality and no budget to purchase Ben’s excellent Midas LSX. The end result worked, but any formatting in the form letter template was lost.

Eventually we upgraded to Notes 7 and later to Notes 8.5. Now I had much more rich text functionality to play with, so I rewrote the code as a class. I added some additional functionality, like formatting values using a mask, and some lookup functionality. The class support all kind of formatting in the form letter template, including fonts, colors, tables, graphics, etc.

This is what a typical form letter look like:

Form Letter Template

As you can see, the placeholders are using curly brackets to hold either a field name or a command. The commands are indicated by the percent sign (%). There can also be different arguments, for formatting, lookup into the NAB/Domino Directory, etc. I even have functionality to present a nice dialog box where the user can pick recipient from a list of everyone associated with the claim (as this is from a claim system used by an insurance company).

Here is a description of the syntax for the placeholders:

{fieldname}
Displays the content of the specified field from the selected source document. Additional (optional) formatting arguments can be used, for example to format values to desired format.
By using the argument LOSSNOTICE or SOURCE=”LOSSNOTICE” the value of the field is retrieved from the Loss Notice instead of the current source document, e.g. {adjuster LOSSNOTICE}.
Use the argument SELECTED to get the fields name, address, city, state, zip, email, SSN and DoB for the recipient selected in the separate dialog box.
{email SELECTED} will return the email address for the recipient selected, either producer, insured or one of the claimants.
The optional argument NABFIELD will retrieve the value of the specified field from the NAB for the user specified in the field (field must be spelled exactly as in the NAB design):
{Adjuster NABFIELD=”JobTitle”} will return the title of the person in the ‘Adjuster’ field.

{%DATE}
Displayes the current date. Default format is mm/dd/yyyy but the FORMAT argument can be used to change the value into desired format. The old {%DUS}, {%DUT}, etc have been removed and must be replaced with the new format, as they don’t work.
Examples of date formats:
FORMAT=”mmmm d, yyyy” -> March 3, 2010
FORMAT=”yyyy-mm-dd” -> 2010-03-01
FORMAT=”mmmm yyyy” -> March 2010

{%TIME}
Displayes the current time. Default format is hh:nn:ss (24h universal format) but like with the date, the FORMAT argument can be used to change the value into desired format. Note that minutes use the letter N, not M (which is used for month)! The old {%TUS}, {%TUT}, etc have been removed and must be replaced with the new format, as they don’t work.
Examples of time formats:
FORMAT=”h.nn ampm” -> 2.34 pm
FORMAT=”hh.nn ampm” -> 02.34 pm
FORMAT=”hh:nn” -> 14:34

{%INPUT PROMPT=”Please enter the amount” FORMAT=”$#,##0.00″ REQUIRED SETVAR=”variablename”}
Asks the user to enter a value. The optional arguemnt REQUIRED is used to force the user to enter a value (blank values will not be accepted). FORMAT can be used to format the value entered, for example into correct currency format (as shown above) or desired date format.
Additionally, SETVAR=”variablename” can be used to store the value entered for re-use later in the document, where {%GETVAR NAME=”variablename”} is used to retrieve/display it.

{%GETVAR NAME=”variablename”}
Get the value previously stored in an {%INPUT} command using the SETVAR argument.

{%USER} or {%USR}
Displayes the current user’s name. It will be the name of the user creating the form letter. {%USR} have been deprecated, it is just available for backwards compatibility. The optional argument NABFIELD will retrieve the value of the specified field from the NAB for the current user (field must be spelled exactly as in the NAB design):
{%USER NABFIELD=”JobTitle”}

{%PICKLIST SERVER=”servername” DB=”database” VIEW=”viewname” FIELD=”fieldname” PROMPT=”text}
This command let the user select a document from a list, and returns the value in the
specified field. SERVER and DB are optional, and defaults to current server and current database. VIEW, FIELD and PROMPT are required. Optionally CLEARCACHE can be used for multiple lookups to the same view where different documents are to be selected.

By using the FILTER argument, the document collection will be filtered to only those where the category (in a categorized view) matches the value in the specified field in the source document. E.g: VIEW=”(ClaimantList)” FILTER=”ParentUNID” will only show documents in the (categorized) lookup view with the same ParentUNID as the document being processed (merged).
By specifying the optional keyword/argument CLAIMANT, the VIEW, PROMPT and FILTER argumenst are set automatically as follows: VIEW=”(SysLookupClaimantsCatByParentUNID)” PROMPT=”Select Claimant:” FILTER=”ParentUNID”.

{%PICKLIST VIEW=”viewname” FIELD=”fieldname” CACHED}
This command is used after the initial picklist command. It will retrieve additional fields from the same (cached) document, so the user only have to select the document once but can retrieve multiple field values from it. If another {%PICKLIST} command is encountered with the CLEARCACHE argument, the cached document will not be available anymore.

And now the code, from a script library called Class.MailMerge.
Right now I don’t have the time to move the code out of my application and build a working sample database (the form letters are actually stored in a separate database), but I hope that this code can still help someone.

Option Public
Option Declare

'*** Script Library for MailMerge, preserving formatting in Rich Text field
'*** Requires Notes 6.5 or higher (tested in 7.0, 8.0 and 8.5)
'*** Copyright (c) Karl-Henry Martinsson 2003-2012
'*** Email: texasswede@gmail.com
'*** Websites: www.texasswede.com & blog.texasswede.com
'*** This code can be user in any application, as long as this notice
'*** is left intact. Also, the copyright information must be published in
'*** any documentation and on the About page, or similar location visible
'*** to the users, if they can not easily view/access the source code.
'*** If this code saves you time and helps you, consider a donation.

Const TYPE_FIELD = 1
Const TYPE_CMD = 2
Dim picklist List As NotesDocument 
Dim variable List As String

Class PlaceHolderData
    Public placeholderstring As String
    Public placeholdertype As Integer
    Public fieldname As String
    Public fieldtype As Long
    Public command As String
    Public argument List As String
    Public text As String 

    Public Sub New(Byval placeholder As String)
        ' Store the original placeholder
        placeholderstring = placeholder        
        ' Strip out curly brackets before and after
        placeholder = Mid$(placeholder,2,Len(placeholder)-2)
        If Left$(placeholder,1) = "%" Then    ' Check if it is a command
            Me.placeholdertype = TYPE_CMD
            ' Remove the % in front of the command
            placeholder = Right$(placeholder,Len(placeholder)-1)    
        Else
            Me.placeholdertype = TYPE_FIELD
        End If
        Call ParsePlaceHolder(placeholder)
    End Sub

    Private Sub ParsePlaceHolder(Byval placeholder As String)
        Dim startpos As Integer 
        Dim midpos As Integer 
        Dim endpos As Integer 
        Dim args As Integer                            ' Boolean to indicate argements present or not
        Dim argstring As String
        Dim qt As Integer 
        Dim eq As Integer
        Dim char As String
        Dim argname As String
        Dim argvalue As String
        Dim i As Integer

        ' First we need to find the end of the command or field.
        ' It is either at the end of the placeholder or when we encounter a space
        endpos = Instr(placeholder," ")            ' Search for space
        If endpos = 0 Then                                ' No space, e.g. no arguments
            endpos = Len(placeholder)                
            args = False
        Else                                                    ' We have some arguments
            endpos = endpos -1                        ' Reduce by one to get rid of trailing space
            args = True
        End If
        If Me.placeholdertype = TYPE_CMD Then
            Me.command = Ucase(Left$(placeholder,endpos))
        Else
            Me.fieldname = Left$(placeholder,endpos)            
        End If
        If args = True Then 
        ' Add code here to get arguments
            argstring = Fulltrim(Right$(placeholder,Len(placeholder)-endpos)    )    ' Get arguments only
            qt = False
            eq = False
            For i = 1 To Len(argstring)
                char = Mid$(argstring,i,1)    ' Get character
                If eq = True Then
                    argvalue=argvalue & char
                Else
                    argname=argname & char
                End If

                If char = |"| Then                    ' We found a quote
                    If qt = False Then
                        qt = True                        
                    Else
                        qt = False
                    End If
                Elseif char="=" Then             ' Found a equal, e.g. now we are getting to a value
                    If eq = False Then
                        eq = True                        
                    Else
                        eq = False
                    End If
                End If
                If i = Len(argstring) Then        ' We are at the end
                    char = " "                        ' Fake a space
                End If
                If char = " " Then                    ' Found a space
                    If qt = False Then            ' Make sure it is not within quotes
                        eq = False                    ' Now we are back at argument name again
                        If Right$(argname,1) = "=" Then                    
                            argname = Left$(argname,Len(argname)-1)    ' Remove trainling equal sign
                        End If
                        Me.argument(Ucase(argname)) = Fulltrim(Replace(argvalue,|"|,""))    ' Create list item, remove quotes
                        argname = ""
                        argvalue = ""
                    End If
                End If
            Next
        End If
    End Sub

    Public Sub ProcessPlaceHolder(sourcedoc As NotesDocument, lossnotice As NotesDocument)
        Dim session As New NotesSession                
        Dim thisdb As NotesDatabase
        Dim ws As New NotesUIWorkspace
        Dim pickcollection As NotesDocumentCollection
        Dim pickdoc As NotesDocument
        Dim servername As String
        Dim dbname As String
        Dim viewname As String        
        Dim fieldvalue As String
        Dim formatstring As String
        Dim inputstr As String
        Dim prompt As String
        Dim title As String
        Dim default As String
        Dim filterfield As String
        Dim filtervalue As String
        Dim nabdoc As NotesDocument

        ' Read any formatting specified in arguments
        If Iselement(Me.argument("FORMAT")) Then
            formatstring = Me.argument("FORMAT")
        Elseif Iselement(Me.argument("FMT")) Then
            formatstring = Me.argument("FMT")
        Else 
            formatstring = ""
        End If

        If placeholdertype = TYPE_FIELD Then
            If sourcedoc Is Nothing Then
                Msgbox "Error: sourcedoc not defined, unable to retrieve data from field '" & Me.fieldname & "'.",,"MailMerge::PlaceHolder.ProcessPlaceHolder()"
                fieldvalue = "*** ERROR ***"                
                Exit Sub
            Else
                If Iselement(Me.Argument("LOSSNOTICE")) Then
                    fieldvalue = lossnotice.GetItemValue(Me.fieldname)(0)
                    Me.FieldType = lossnotice.GetFirstItem(Me.fieldname).Type
                Elseif Iselement(Me.Argument("SOURCE")) Then
                    If Ucase(Me.Argument("SOURCE")) = "LOSSNOTICE" Then
                        fieldvalue = lossnotice.GetItemValue(Me.fieldname)(0)
                        Me.FieldType = lossnotice.GetFirstItem(Me.fieldname).Type
                    End If
                Else
                    fieldvalue = sourcedoc.GetItemValue(Me.fieldname)(0)
                    Me.FieldType = sourcedoc.GetFirstItem(Me.fieldname).Type
                End If
                If formatstring <> "" Then
                    If Isdate(fieldvalue) Then                    ' Check if it might be a date/time value
                        fieldvalue = Format$(Cdat(fieldvalue),formatstring)
                    Elseif Isnumeric(fieldvalue) Then    ' Check if it might be a numeric value
                        fieldvalue = Format$(Cdbl(fieldvalue),formatstring)
                    End If
                End If
            End If
            Me.text = fieldvalue
        Else
            ' *** Fix legacy commands
            If Ucase(Me.Command) = "USR" Then    
                Me.Command = "USER"
            End If
            ' *** Process placeholder commands
            Select Case Ucase(Me.Command)
            Case "USER" :
                If Iselement(Me.Argument("NABFIELD")) Then
                    Me.Text = GetNABField(session.CommonUserName, Me.Argument("NABFIELD")) 
                Else
                    Me.Text = session.CommonUserName 
                End If
            Case "INPUT"        :        ' *** Ask the user to enter information
                prompt = Me.Argument("PROMPT")
                If Iselement(Me.Argument("TITLE")) Then
                    title = Me.Argument("TITLE")
                Else
                    title = "FormLetter Mail Merge"
                End If
                If Iselement(Me.Argument("DEFAULT")) Then
                    default = Me.Argument("DEFAULT")
                Else
                    default = ""
                End If
                If Iselement(Me.Argument("REQUIRED")) Then
                    ' Repeat until user enter a value
                    Do                
                        inputstr = Inputbox$(prompt, title, default)                        
                    Loop While Fulltrim(inputstr)=""
                Else
                    inputstr = Inputbox$(prompt, title, default)                        
                End If
                If formatstring <> "" Then
                    If Isdate(inputstr) Then                    ' Check if it might be a date/time value
                        inputstr = Format$(Cdat(inputstr),formatstring)
                    Elseif Isnumeric(inputstr) Then    ' Check if it might be a numeric value
                        inputstr = Format$(Cdbl(inputstr),formatstring)
                    End If
                End If
                Me.Text = inputstr
                ' *** Check for SETVAR argument
                If Iselement(Me.argument("SETVAR")) Then
                    variable(Ucase(Me.argument("SETVAR")))=Me.Text
                End If

            Case "PICKLIST"    :        ' Present the user with a list of documents to choose from
                Set thisdb = session.CurrentDatabase
                Set pickdoc = Nothing        ' Clear pickdoc
                ' *** We need to get the view argument to perform a lookup into the list...
                If Iselement(Me.Argument("VIEW")) Then
                    viewname = Ucase(Me.Argument("VIEW"))
                End If
                ' *** If CLAIMANT argument is specified, set arguments to predefined values
                If Iselement(Me.Argument("CLAIMANT")) Then
                    Me.Argument("VIEW") = "(SysLookupClaimantsCatByParentUNID)"
                    Me.Argument("FILTER") = "ParentUNID"
                    Me.Argument("PROMPT") = "Select Claimant:"
                End If
                ' *** Check if user requested to clear cached data
                If Iselement(Me.Argument("CLEARCACHE")) Then
                    If Iselement(picklist(viewname)) Then
                        Erase picklist(viewname)    ' Delete this cached item (document)
                    End If
                End If
                ' *** If user want to use cached data, load pickdoc with cached data
                If Iselement(Me.Argument("CACHED")) Then
                    If Iselement(picklist(viewname)) Then
                        Set pickdoc = picklist(viewname)
                    End If
                End If
                If pickdoc Is Nothing Then    ' No cached document for this view 
                    If Iselement(Me.Argument("SERVER")) Then
                        servername = Me.Argument("SERVER")
                    Else
                        servername = thisdb.Server
                    End If
                    If Iselement(Me.Argument("DB")) Then
                        dbname = Me.Argument("DB")
                    Else
                        dbname = thisdb.FilePath 
                    End If
                    If Iselement(Me.Argument("VIEW")) Then
                        viewname = Me.Argument("VIEW")    
                    Else
                        Msgbox "Missing Required Argument - VIEW" & Chr$(13) & Me.PlaceHolderString,,"Missing Argument"
                        Exit Sub
                    End If
                    If Iselement(Me.Argument("PROMPT")) Then
                        prompt = Me.Argument("PROMPT")
                    Else
                        Msgbox "Missing Required Argument - PROMPT" & Chr$(13) & Me.PlaceHolderString,,"Missing Argument"
                        Exit Sub
                    End If
                    If Iselement(Me.Argument("TITLE")) Then
                        title = Me.Argument("TITLE")
                    Else
                        title = "FormLetter Mail Merge"
                    End If
onemoretime:                
                    If Iselement(Me.Argument("FILTER")) Then
                        filterfield = Me.Argument("FILTER")                            ' Get field to filter on
                        filtervalue = sourcedoc.GetItemValue(filterfield)(0)        ' Get value of field on source document
                        Set pickcollection = ws.PicklistCollection(3, False, servername, dbname, viewname, title, prompt, filtervalue)
                    Else
                        Set pickcollection = ws.PicklistCollection(3, False, servername, dbname, viewname, title, prompt)
                    End If
                    If Isempty(pickcollection) Then
                        If Iselement(Me.Argument("REQUIRED")) Then
                            If Ucase(Me.Argument("REQUIRED")) <> "NO" Then
                                Msgbox "You need to select one item/document in the list.", , title
                                Goto onemoretime
                            End If
                        End If
                    Else
                        Set pickdoc = pickcollection.GetFirstDocument        
                    End If
                    If pickdoc Is Nothing Then
                        Msgbox "Error: No document returned.",,"MailMerge::PlaceHolder.ProcessPlaceHolder()"
                        Exit Sub
                    End If
                    Set picklist(Ucase(viewname)) = pickdoc
                End If
                If Iselement(Me.Argument("FIELD")) Then
                    fieldname = Me.Argument("FIELD")
                Else
                    Msgbox "Missing Required Argument - FIELD" & Chr$(13) & Me.PlaceHolderString,,"Missing Argument"                        
                    Exit Sub
                End If
                inputstr = pickdoc.GetItemValue(fieldname)(0)
                If formatstring <> "" Then
                    If Isdate(inputstr) Then                    ' Check if it might be a date/time value
                        inputstr = Format$(Cdat(inputstr),formatstring)
                    Elseif Isnumeric(inputstr) Then    ' Check if it might be a numeric value
                        inputstr = Format$(Cdbl(inputstr),formatstring)
                    End If
                End If
                Me.Text = inputstr
                ' *** Check for SETVAR argument
                If Iselement(Me.argument("SETVAR")) Then
                    variable(Ucase(Me.argument("SETVAR")))=Me.Text
                End If

            Case "DATE"            :         ' *** Current Date
                If formatstring = "" Then 
                    Me.Text = Format$(Now(),"mm/dd/yyyy")
                Else
                    Me.Text = Format$(Now(),formatstring)
                End If

            Case "TIME"            :         ' *** Current Time
                If formatstring = "" Then 
                    Me.Text = Format$(Now(),"hh:nn:ss")
                Else
                    Me.Text = Format$(Now(),formatstring)
                End If

            Case "GETVAR"    :    ' *** Get variable previously stored
                If Iselement(variable(Ucase(Me.argument("NAME")))) Then
                    Me.Text = variable(Ucase(Me.argument("NAME")))
                End If

            Case Else                :
                Me.Text = "**** undefined command ***"

            End Select
        End If

    End Sub

    ' *** Private supporting functions/subs

    Private Function GetNABField(user As String, fieldname As String) As String
        Dim session As New NotesSession
        Dim curdb As NotesDatabase    
        Dim nabdb As NotesDatabase
        Dim view As NotesView
        Dim col As NotesDocumentCollection
        Dim userdoc As NotesDocument

        Set curdb = session.CurrentDatabase
        Set nabdb = New Notesdatabase(curdb.Server, "names.nsf")
        Set view = nabdb.GetView("PeopleByFirstname")
        Set col = view.GetAllDocumentsByKey(user)
        If col Is Nothing Then
            GetNABField = ""
            Exit Function
        End If
        Set userdoc = col.GetFirstDocument
        If userdoc Is Nothing Then
            GetNABField = ""
            Exit Function
        End If
        GetNABField = userdoc.GetItemValue(fieldname)(0)
    End Function

End Class

Class MailMergeObject
    Public templatedoc As NotesDocument    ' Where to get layout from
    Public sourcefield As NotesRichTextItem    
    Public targetfield As NotesRichTextItem    ' Where to put the merged text
    Public placeholder List As PlaceHolderData
    Private sourcedoc As NotesDocument     ' The document containing data to be merged
    Private maindoc As NotesDocument        ' The main document for the processed document
    Private tempbody As NotesRichTextItem        ' Temporary copy of body field for this class/instance

    Public Sub New()

    End Sub

    Public Sub SetSourceDoc(doc As NotesDocument)
        Set sourcedoc = doc                
    End Sub

    Public Sub SetMainDoc(doc As NotesDocument)
        Set maindoc = doc
    End Sub

    Public Function LoadTemplate() As Integer
        Dim body As NotesRichTextItem
        Dim temp As String            
        Dim bodytext As String
        Dim startpos As Long
        Dim endpos As Long
        Set sourcefield = templatedoc.GetFirstItem("Body")    ' Put template body field (rich text) into global object
        Set body = sourcefield                                ' Put rich text into temporary body object
        bodytext = body.GetUnformattedText()
        startpos = Instr(bodytext,"{")
        Do While startpos > 0
            endpos = Instr(startpos,bodytext,"}")
            If endpos>0 Then
                temp = Mid$(bodytext,startpos,endpos-startpos+1)
                Set placeholder(temp & "~" & startpos) = New PlaceHolderData(temp)    ' Add to list of placeholder objects        
            End If
            startpos = Instr(endpos,bodytext,"{")
        Loop
    End Function

    Public Function MergedRichText() As NotesRichTextItem
        Dim range As NotesRichTextRange         
        Dim cnt As Integer
        Set tempbody = sourcefield
        Set range = tempbody.CreateRange 
        Forall p In placeholder
            Call p.ProcessPlaceHolder(sourcedoc, maindoc)
            If p.text = "" Then
                p.text = " -- "
            End If
            cnt =  range.FindAndReplace(p.placeholderstring, p.text, 1+4+8+16)            
        End Forall
        Call tempbody.Compact 
        Call tempbody.Update 
        Set targetfield = tempbody
        Set MergedRichText = tempbody
    End Function    

    Public Function Content() As NotesRichTextItem
        Set Content = targetfield
    End Function

End Class

I will try to post some sample code later, using this script library.

0 Comments

Samsung Galaxy S3 released – Will it live up to the hype?

Yesterday Samsung presented the new Samsung Galaxy S3 smartphone in London. Samsung had been very secretive about the new phone, and speculations on the internet were wild. Some of the rumors were true, while some were not. So will this be an iPhone contestor? I think so, for anyone who look at functionality, technology, etc. For anyone content with the iOS experience and being locked into the Apple eco-system, I am sure the next iPhone will be the given choice.

The predecessor, Galaxy S2, have been a big success for the company who recently took the title of biggest phone manufacturer in the world. Early reviews of the S3 have been mainly positive. The main complain is the plastic case, which makes the phone seem cheaper. There were rumors about aluminum or ceramic cases, but that did not end up being the case (pun intended).

The phone got impressive specifications, with a huge 4.8" screen (720×1280 pixel), quad-code Exynos 4 processor (at least for the European/international 3G model, the US 4G LTE model is rumored to get a dual code Snapdragon S4 instead), 1GB RAM, up to 64GB internal storage and expandable up to 64GB more though SD card. The camera is alos a little bit of a disappointment, instead of the rumored 12MP it ended up being 8MP, but with some nice functionality like burst mode and automatic selection of the best picture. The battery has a 2100mAh capacity, better than the S2 but with the faster and more power hungry processor, it will be interesting to see real numbers on how long the phone actually lasts.

NFC (near field communication) and proximity sensors are other interesting features. The proximity sensor allows the phone to detect that it is lifted to the user's ear, and if a text message is curently being viewed, the phone understand that the user want to dial the person and dial automatically. There is also voice control, similar to Apple's Siri, and the front camera use eye tracking to detect when a user is looking at the screen. That means that if you are reading a long text, you don't have to touch teh screen every 20 seconds to keep it from dimming/turning off, the phone know you are looking at it and keep it on until you look away.

The phone supports a number of formats for audio and video, including MP3, AAC, Flac, OGG, Divx, WMV, etc. It also supports full 1080p recording and playback thorugh an external HDMI-adapter. Another interesting option is a wireless charging station.

Availability: In Europe on May 27 and in the US "this summer", with a end-of-June date hinted at. Price has not been released, but it is expected to be $299 on a 2-year contract with US carriers, and $700 without contract.

It will be interesting to see how it compare to an upcoming iPhone 5, rumored to be released after the summer. Currently the Galaxy S3 looks like the phone to get, especially if you want an Android based phone.

Samsung Galaxy S3 - Press Picture

 

0 Comments

Ubuntu 12.04 to be released tomorrow

The next version of the Linux distribution Ubuntu is scheduled to be available for download tomorrow, April 26. Ubuntu 12.04 will be a so called LTS (Long Term Support) version, which means that it will be supported longer than the regular versions. For 12.04 the support will last for five years, both for the server and the desktop version. Previous LTS-releases were supported for five years for the server version, but only three years for desktop. Non-LTS-releases are supported for 18 months after release.

Ubuntu 12.04 is using version 3.2 of the Linux kernel. Below is a list of other changes, taken from the Ubuntu website:

New Applications and Defaults

  • The default music player has been switched to Rhythmbox, which again includes the UbuntuOne music store.

  • LibreOffice has been updated to 3.5.1.

 

Interface updates

  • The System Setting's "Appearance" panel now allows users to easily configure some properties of Unity.

  • Nautilus quicklist support has been added to Unity launcher.

  • There is a new way to quickly search and access any desktop application's and indicator's menu, called the "HUD". Tap the Alt key and enter some letters and words, and it will show the corresponding entries, including some fuzzy matching. Press enter to execute the action. This one is executed on the current focused application as well as all indicator facilities (like managing emails, sound list, quit…). Also it learns from your previous choices to make the search more and more accurate for you.

 

ClickPad support

ClickPad devices are trackpads where the physical button is integrated into the trackpad surface. Ubuntu Precise now has enhanced support for these devices. When the button is pressed on a ClickPad device, a second finger may be used to drag the cursor.

  • ClickPad support requires extra handling that conflicts with "Click Action" support. Click Actions allow for separate actions when multiple fingers are active on a trackpad. The default Ubuntu settings enable right button behavior when two fingers are in contact with the trackpad surface and the physical trackpad button is pressed. Because of conflicting behavior, ClickPad devices do not support Click Actions in this release.

  • Most Synaptics brand ClickPads are recognized out of the box. Apple MacBook trackpads are recognized as well. Support for Apple Magic Trackpads and more Synaptics brand ClickPads will follow in the next release.

 

Ubuntu One

  • All new Control Panel provides an installer, setup wizard, ability to add/remove folders to sync, and more

  • Proxy support is now fully functional

  • Ubuntu One music store in Rhythmbox

  • Ubuntu One contacts sync has been removed

  • Nautilus ribbon with enable sync check box has been removed

 

Other

  • Until Ubuntu 11.10, the Unix group for administrators with root privileges through sudo had been admin. Starting with Ubuntu 12.04 LTS, it is now sudo, for compatibility with Debian and sudo itself. However, for backwards compatibility, admin group members are still recognized as administrators.

  • Automatic Apport crash reporting now checks for duplicates on the client side, which will avoid uploading debug data and creating Launchpad bug reports unnecessarily in many cases now.

  • When installing new software through software-center, corresponding language support packages (translations, spell check modules particular to that software, help files, etc.) are now installed along automatically. This removes the need to open "Language Support" after installing new software.

  • pm-utils now has two new scripts to power down USB and various PCI devices in battery mode. A number of desktop packages were fixed to wake up less often. Both of these reduces power consumption and thus battery lifetime.

  • resolvconf is now used to manage /etc/resolv.conf on all Ubuntu systems. For systems using Network Manager DNS resolution is now done through dnsmasq, which should help split-DNS VPNs and faster DNS resolution. You can learn more here

  •  Output from Upstart jobs is now logged to per-job files in /var/log/upstart/, unless the job specifies otherwise by setting console to something other than the default of log (see init(5)).

 

You can download it (starting some time tomorrow) here. But be prepared thatthe servers might be busy for the first few days.

 

 

0 Comments

Google Drive released

Google's cloud storage product Google Drive has now been announced. I am however still on a waiting list, as it seems like Google is adding users little by little, so I have not been able to test it yet.

Google Drive is a service similar to Dropbox. You get 5GB storage for free, and additional 25GB for $2.49/month. Clients are available for Mac, PC and Android phones, and a version for iPad/iPhone is coming, according to Google. The service let you access your documents from different devices and on different platforms. You are also able to share files with friends, family and other people. Google Docs is integrated with Google Drive, allowing different users to edit documents.

It will be interesting to see what differentiate Google Drive from Dropbox, box.com and other similar services that already exists. The cost for additional storage is much lower than the competing products, Dropbox give you 2GB free and charge $9.99 for 50GB storage. Box.com give you 5GB free and charge $9.99 for 25GB storage.

 

0 Comments

Samsung Galaxy S3 to be announced May 3

After weeks of speculations, it seems like Samsung will unveil their latest smartphone, the Samsung Galaxy S3, at an event in London om May 3 called "Samsung Mobile Unpacked". Invitations have been sent out to media and a website with a teaser video is now available.

Samsung also released an app for the Unpacked event, where there is a reference to "Samsung Galaxy S3". The predecessor is of course Samsung Galaxy S II (with roman numerals), and there have been some discussions if Samsung will change the numbering from roman to latin numbers. Initially the phone was just referenced as "The Next Galaxy", leading some to speculate in Samsung doing like Apple and dropping the number from the name.

I guess we will see in 9 days. Then the specifications will be official as well. But rumors are talking about a quad-core processor (everything between 1.4 and 2.8GHz have been mentioned), a 4.6" to 4.8" screen with a resolution of 1280×720 pixel (but a 1920×1080 screen has also been mentioned), 16GB or 32GB memory, 8-12MP camera, and possible a ceramic body.

 

 

0 Comments

Swedish Government Departments Moving to Microsoft – IBM not allowed to compete

Fredrik Malmborg just posted an article (in Swedish) on his blog about how the Swedish government have been moving several departments (taxes, defence, etc) from an IBM/Lotus platform to the Microsoft stack. He noticed that a certain executive with sales responsibility for public sector at a big software company became Secretary of State (not the same as "Secretary of State" in the US) right before the government asked a certain software company (guess which one!) to write the specification for the new system. Coincidentally that same company (Microsoft)  was then choosen to deliver the solution. IBM was never offered to even compete.

A year ago Computer Sweden wrote (in Swedish) about several departments moving from IBM/Lotus to Microsoft, without IBM being allowed to compete, or in some cases select Microsoft despite IBM being less expensive. Google translation here.

Here are some arguments used in the studies presented to the government why the switch should be done:

* Outlook is used privately by many users and thus have a higher acceptance.
* The similar interface improves the user experience.

I know that IBM does not believe in those arguments, but the customers and the ones in charge (may it be politicians, civil servants or a CEO) buy that argument. Line, hook and sinker… Especially if the persons in change are among the ones that use Outlook at home (since it come bundled with many versions of Office). I personally know several people who use Outlook (not Outlook Express!) at home for their private mail, as they can easily aggregate several mail accounts into one client. I been building/rebuilding a number of computers for friends lately, and the request to use Outlook came up several times.

I believe that IBM should create a "IBM Mail" client, with support for POP/IMAP/SMTP as well as direct support for Gmail, Hotmail and Yahoo mail. Why not add Domino and Exchange support, to allow users to connect to work, without installing the full Notes client?
The client must be able to aggregate mail from multiple sources, and send mail using any of those services. When you compose a new mail, there should be a dropdown where you select Gmail, your ISP service or Yahoo mail (depending on what you have setup), the same way as it works on most smart phones today. If you reply to a mail, the service is was received on should be default, e.g. if the mail was received through one of my Gmail accountrs, the reply should be sent using the same account.

This client should look like Notes mail, contain a calendar, to-do, journal, perhaps an RSS feed and support for widgets. Why not throw in a couple of simple but useful applications? Show that "IBM Mail is not just mail". Strip away as much as possible when it comes to complicated menus, settings, etc. The properties/settings in the Notes client causes any normal user to get a headache instantly… Make it easy and quick to setup, and make it available as a free download, without any annoying registration. Most of all, make the client fast.

The market perception will not change overnight, but in the long run, showing that "IBM Mail" looks modern and has the functionality people need will benefit Notes.

 

 

0 Comments

Birthday Cake – Swedish Style

I wanted to share the recipe for the cake I made this weekend. It is very easy to make, and tastes great.

Mix 6 eggs and 3dl (a little over over 1 cup) of sugar, beet it until fluffy.
Mix 1.5 dl (9 tablespoons) flour and 1.5 dl corn starch (potato flour in Europe) in a bowl, add 3 tablespooons of baking powder and mix well. Fold this into the egg/sugar mix, stir gently until the batter is smooth.
Cover the inside of a baking pan with butter and then breadcrumbs. Pour in the batter and place in the lower part of the oven. Bake for 40 minutes in 325 degrees F (175 degrees C).
When done, turn it upside down on a cooling rack, let it cool down for a few monutes before attempting to remove the baking pan.

Slice through the cake twice so you get 3 equally think slices. On top of the first one, spead a jam, for example blueberry jam. Pend the extra $2 and get the best one you can get, low in sugar and high in fruit. If you have an IKEA nearby, theu got several good jams to choose from. On top of the jam, put a 1/2 inch thick layer of vanilla creme. I make it from Vanilla Sauce powder from Sweden, but here is a way to make it yourself. You can add some fresh fruit here, if you like. Why not fresh blueberries, to complement the jam?

Put the next layer of cake on top of the vanilla creme, then add another filling. I often mash 2 bananas and mix with whipped creme. Make sure the creme is nice and thick, it should be solid, not runny or soft. You can add fruit in here too, if you like. Perhaps chunks of fresh strawberries, they go well with teh bananas and creme. Add the last layer of cake, cover the whole thing with more whipped creme and decorate with fruit. Strawberries, rasberries, blackberries. Or why not go for a "mushroom cake", cut bananas in about 1.5 inch long pieces and place them standing up on top of the cake. Drain a can of apricots and put them on top of the bananas like mushrooms.

BirthdayCake

BirthdayCakeCut

 

2 Comments

Former Outlook User Who Loves Notes

The other week we had a new executive start at my work. I stopped by her office today and offered to help her with Notes if she had any problems. I asked if she had used Notes before, and she said no, she came from an Outlook shop. So I asked her what she thought about Notes this far.

She told me that the mail experience was very close to Outlook, with sortable columns, etc. She als told me that she really like the action buttons with dropdowns for reply, etc. The fact that different windows are available in different tabs was another thing she liked.

She then switched over to the workspace and told me how she loved it, and how it was much better than Outlook, easy to find things, etc. I then quickly showed her how she can name the different tabs, change color and organize her icons. She was very impressed, and liked that.

For the last week or so, she have been meeting with different departments, and yesterday she got to meet with IT. We went through the different applications we have, and we explained how the different Notes applications are tied together with each other, as well as with several other systems. This is something else she is very impressed about, and she told me that that level of integration was something she had not seen at her previous workplace.

She is very impressed with Lotus Notes, and she is still just running 8.5.2 Basic version…

 

0 Comments

Samsung vs Apple

This spring is gearing up to be very interesting. The rumors are flying about both an upcoming new iPad and a new Samsung Galaxy Tab.

According to the rumors, Samsung will launch the new Samsung Galaxy Tab 11.6 at Mobile World Contress in Barcelona at the end of this month. The new tablet will (again unconfirmed) have a 11.6 inch screen with a resolution of 2560×1600 and be powered by a 2GHz dual-core Exynos 5250 processor. Some rumors talk about a quad-core processor, but I personally find that unlikely in this first version.
The operating system will, not surprisingly, be Android 4.0 (Ice Cream Sandwich). Despite the bigger screen, the actual size of the tablet is said to not be much larger than the existing Galaxy Tab 10.1.

As soon as Apple releases one product, rumors start about the next generation. But it seems very plausible that an iPad3 will be released this spring (the rumors talk about March). Here rumors talk about a quad-core processor in the 1MHz range (but the rumors are all over the place which processor it will be and exact clock speed), and a new graphics chip driving the 9.7 inch display with a resolution of  2048×1536 pixels, double the resolution of iPad2. A redesigned interior to allow a bigger battery is also probably, based on leaked pictures of the case. 4G LTE support is also a pretty good bet. The iPad3 will supposedly be slightly more bulky that the existing version, about 1.5mm thicker.

I guess time will tell, but this spring could be very interesting for tablets, and the summer/fall will be interesting for smartphones. Expected launces of iPhone 5, Samsung Galaxy S3 and phones from RIM with Blackberry OS 10 (QNX-based and rumored to be able to run Android apps) are the ones I see as the most interesting.

 

 

0 Comments

Using Lotusscript Lists For Counters

How many times do you not want to count the number of documents you process, perhaps even a few different counters? Today I was working on a Lotusscript agent where I wanted to keep track of the total number of documents processed, as well as individual counters for a few different types of documents. Normally I would have used a handful of variables, but I realized that I could use lists for this.

This is what my old code would look like:

Dim cnt As Long
Dim totcnt As Long
Dim type1cnt as Long
Dim type2cnt as Long
Set view = claimdb.GetView("(LookupView)")
Set col = view.AllEntries
view.AutoUpdate = False
totcnt = col.Count
cnt = 0
Set entry = col.GetLastEntry()
Do While Not entry Is Nothing
    cnt = cnt + 1
    ' Do stuff here 
    If entry.ColumnValues(0) = "Type1" Then
        type1cnt = type1cnt + 1
    ElseIf entry.ColumnValues(0) = "Type2" Then
        type2cnt = type2cnt + 1
    End If
    Print "Processed " & cnt & " of " & totcnt
    Set entry = col.GetPrevEntry(entry) 
Loop

My new code would look like this:

Dim cnt List As Long
Dim doctype As String
Set view = claimdb.GetView("(LookupLargeLossSummary)")
Set col = view.AllEntries
view.AutoUpdate = False
cnt("Total") = col.Count
cnt("Processed") = 0
Set entry = col.GetLastEntry()
Do While Not entry Is Nothing
    cnt("Processed") = cnt("Processed") + 1
    ' Do stuff here
    doctype = entry.ColumnValues(0)
    cnt(doctype) = cnt(doctype) + 1
    Print "Processed " & cnt("Processed") & " of " & cnt("Total")
    Set entry = col.GetPrevEntry(entry) 
Loop

Note that the list tag is case sensitive. The example also assumes that the document type is displayed in the first column of the view. You can also use ForAll to get the values of all list elements:

ForAll c in cnt
    Print ListTag(c) & " = " & c
End ForAll

That’s it for today. Happy coding!

 

0 Comments

Robert A Heinlein: Revisiting a Childhood Favorite

rah_havespacDuring the last couple of weeks I have revisited some of the sci-fi classics I read when I was young. Robert A Heinlein was always one of my favorites. In what would be considered middle school in the US (4th-6th grade) we had one hour each week when the class was reading whatever book we had picked out in the library. At one time, I think it was in 5th grade, I read the Swedish translation of "Have Space Suit ?Will Travel". The other week I listened to this book as an audio book. This one was actually more of a radio theatre play, with different actors playing the different parts. I then followed this by listening to "Citizen of the Galaxy" and "Double Star".

The books were written in 1956, 1957 and 1958, and I noticed something interesting. Despite them taking place in the future, where space travel (even faster than light) is possible, and with all kinds of exotic technology available, many things we take for granted today are lacking.

In "Double Star", the main character is studying using an encyclopedia in the ships library. As we know today, online encyclopedias like wikipedia and internet searches have all but killed off the traditional printed encyclopedia. There is no way for a printed publication to stay current. If a celebrity or any other person dies, within minutes their wikipedia page will be updated with date/time and cause of death.

In "Citizen of the Galaxy" the missile control computers onboard the trade ships are manned by young adults with good math abilities. They seem to be somewhat aided by a rudimentary computer, but it is mainly the operator who calculate trajectory and time for release of the missiles. The result is recorded on a spool (which can be read by humans, so probably some kind of paper-like material). The concept of digital storage did not exist, and I am sure any PC (or even smart phone) today could perform the calculations needed much faster than any human, and with greater accuracy.

Some of the books also talk about huge archives, using micro film. Even if that still today is a great medium for long term storage, it is not the best choice for the kind of short term archiving used in the books. Again, the concept of digital storage does not appear in the books. The books basically build on the technology known in the 1950´s, but "enhanced" as imagined in the future.

However, there is on interesting thing in "Double Star". When recordings are made (for public broadcasts), they are "stereoscopic", i.e. 3D. It is not until the last year or two we have actually seen 3D television become common. Personally I believe that we soon will see 3D television sets where we don´t need to use special glasses (several manufacturers already have those) and that more and more tv shows and even news will be in 3D.

All this is not a slam on Robert A Heinlein or any other sci-fi writer from the past. It just illustrates how hard it is to predict a paradigm shift like PCs or the development of technology. For being almost 60 years old, the books are still very enjoyable. If you have not experienced Robert A Heinlein yet, pick up one of his books or an audiobook at the library, bookstore or favorite online retailer.

 

0 Comments

What’s in a Name?

The discussion about the IBM rebranding of different products, including removing "Lotus" from a number of products, have me got thinking. What is really in a name? Well, a product name is really not that different from a person name. We have a firstname/surname which is our identity, and a lastname/family which indicate what family or group we belong to. In some cultures the family name is listed first, but the idea is the same. Sometimes we also have a nickname that we are know as, or that our friends call us.

When a woman get married, she often takes the family name of her husband, or combine her family name with his. Jane Doe becomes Jane Smith or even Jane Doe-Smith. A product is often named the same way. Lotus Notes, Lotus Domino, Lotus Sametime. When IBM took over ("married") Lotus, eventually the name became "IBM Lotus Notes, IBM Lotus Domino, etc. We continued using the "nicknames" Notes, Domino and Sametime, as they are shorter and easier to say/write.

I am sure we all remember when Sametime was renamed "IBM Lotus Instant Messaging" and Quickr was renamed "IBM Lotus Team Workplace". The names were quickly changed back”…” Not that the names were bad, they actually explained much better the nature of the product. But they were much harder to remember and did not have the familiarity people needed. Compare that with if I would change my son´s name from Erik to say Allen (which happens to be his middle name). That would cause a lot of confusion.
And if you dropped the "family name" part ("IBM Lotus"), like we all do in normal conversations, the result did not provide any good branding. "Do you use Instant Messaging?"

Some products have already lost the Lotus part. We now have "IBM Sametime", and at Lotusphere, it was announced that "IBM Docs" is the new name for LotusLive Symphony. I think that is a great name, it explains the product and also have the family name in there. "IBM SmartCloud for Social Business" is a long name for LotusLive, and perhaps not the best name. But I never thought LotusLive was a good name. I know that a few years everything cloud was "Live" (Windows Live, etc), but it felt like just another buzzword.

I understand the need of IBM to group products into different families. That makes sense. But everything does not have to include "Smart". What about simply giving any cloud offering/product a "Cloud" designation? IBM Cloud Docs, IBM Cloud Mail (LotusLive Mail), etc. To me that is a no-brainer.

For the traditional client side products in the Lotus family it is a bit more complicated. We all love the Lotus brand, but it has a somewhat tainted or dated sound these days. It is simply old, and people still think "Lotus 1-2-3" when they hear it. I would have no problem with IBM Notes and IBM Domino. We already have "IBM Xwork Server". What about "IBM Smart Client" (for Notes) and "IBM Smart Server" (for Domino). There, IBM got their Smart-designation, and we got a good descriptive name on the products.

You are welcome, Ed.

 

0 Comments

Update – Ernst & Young moving to Exchange

As the article in Computer Sweden now have been published, I reposted my blog entry about Ernst & Young migrating 150,000 users world wide from Notes to Exchange.

IBM in Sweden is not commenting to Computer Sweden, but Ernst & Young have been using Lotus Notes since the mid-1990's and have been considered a major Notes account. In this first step only the email will be migrated, and it is unclear if applications will eventually be moved as well.

My personal analysis (as I wrote in my original post) is that IBM will not really lose very much revenue, but it is a prestigious win for Microsoft. Even if email might be less important than applications (many consider email a commodity), the market will probably see this as a loss for IBM, and in the long run I think this will be used as another example of "Notes is dead".
I think it is important for IBM to realize that perception is actually important. You can't always be logical. IBM need to keep as many of their big customers on Notes mail as possible, or the market will get the perception that customers are abandoning the platform, even if it is just email.

 

 

 

 

 

0 Comments

Apple Cake: The Drink

I brought some of my home-made Apple Cake drink to Lotusphere, and I had many people ask me how it is made. It is not hard at all, it just takes some time.

You need the following:

  • 75 cl vodka (that is one regular bottle), and I recommend Absolut 40% (or even 50% if you want it stronger).
  • 30 cl (that is about 10 fl oz) concentrated apple juice. I used one can of defrosted frozen juice concentrate.
  • 3-4 tablespoons granulated sugar.
  • 3 tablespoons of vanilla sugar. It can be purchased at the nearest IKEA in the US. You can also use vanilla extract.
  • 3 sticks of cinnamon.

 

Gently heat up the apple juice on the stove. Stir in the sugar and vanilla sugar/flavor until it is all dissolved. Pour in a big bottle that is just over 1 liter, a little over a quart. I use a 2 quart Rubber Maid MixerMate bottle. Add the cinnamon sticks and then the vodka. Shake well.

For the next 7 days, shake once or twice a day. After 7 days, remove the cinnamon sticks. It is now ready to serve.

Whip some cream together with a little vanilla sugar. Pour the drink in shot glasses, but don´t fill them to the rim. Add a spoon of whipped cream on top, and it is ready to drink. Skål!

AppleCakeDrink

 

0 Comments

Lotusphere 2012 – Day 4 (Wednesday)

The busiest day this far. The day started with a keynote session, featuring among others Tim Berners-Lee, the inventor of World Wide Web. He spoke out against the SOPA and PIPA laws, coincidentally on the same day that Wikipedia, Google and other sites went black in a protest against the proposed US censorship laws. He encouraged everyone to mail their representative to denounce the laws.
Then he procede to discuss the Semantic Web, and how data can be aggregated from many sources but must be tracked back to it’s origin.

The next speaker was Manoj Saxema, the General Manager of the newly founded IBM Watson Solutions Group. He talked about IBM’s plans to commercialize Watson. The first target is the medical fields, where Watson can help doctors in diagnosing patients. The next step is financial institutions and insurance companies.
He also mention that 90% of all data in the world was produced in the last two years, and that 80% of that information is unstructured, saved in documents, spreadsheets, etc. Watson is designed to work with unstructured data like that.

Finally Andy Miller, CEO and President of Polycom, talked about video conferencing, social functionality and mobile, and how the younger workforce demand access to that technology.

The it was off to sessions.

BP303 – I Smell a RAT — Rapid Application Testing, by Peter Presnell. This was a very interesting session. I got plenty of ideas and inspiration of things to do after I get back home.

BP101 – Adminblast 2012 by the always excellent and entertaining Paul Mooney. Even as a developer I always walk away with tons of useful tips from his Adminblast sessions, and this year was no exception.

AD112 – What’s New in the IBM Lotus Domino Objects: Version 8.5.3 in Demos, featuring James Cooper and Elizabeth Sawyer (both of IBM). A good session, with a few interruptions that slowed down the tempo somewhat. One of the most interesting new functions is agent.RunWithDocumentContext(), a way to pass and retrieve data from another agent. Previously we developers had to use a profile document or similar hack to get the same functionality.

BP121 – Performance Programming, by Andrew Pollack. Yet another very interesting session. This one covered different issues that can slow down your Lotus Notes applications, and showed different techniques to work around this.

After this it was off to get ready for the party at Seaworld. It had been raining some earlier in the day, and I think some long-time ‘spherians were worried about a repeat of the 2007 party at Animal Kingdom, when it was pouring down rain. But the rain stopped and I had a good time. My favorites were as always the sharks and the dolphins. I am not a big roller-coaster fan…

 

0 Comments

End of content

No more pages to load