Taking Your Pick Of Global Launch Events #Domino10

PartnerReady

The countdown is now only 10 days – on October 9th the new version of Domino and Notes v10, the first major release in several years and the first since HCL took over ownership of development has a huge launch. You can attend the launch event in person in Frankfurt (yay  Europe!) or attend via livestream.

To attend the October 9th launch event either in person or remotely register here

The next day on October 10th there are several global post launch events including many in cities across Europe hosted by IBM, HCL and partners to answer your questions in person.

I will be attending the London event at IBM South Bank which is hosted by Andrew Manby, Worldwide Director, Offering Management, IBM.  Turtle have recently become certified as a Domino 10 Partner Ready company and we’ve been working heavily with the latest beta,  I look forward to seeing and talking to you there.  You can register for the London event here

Theo Heselmans and Engage will be hosting an event in Belgium with presenters from both IBM and HCL as well as a presentation from Theo himself. Uffe Sorensen leads IBM’s Notes/Domino Messaging & Collaboration Business world wide and Barry Rosen is the Director for Products and Platforms at HCL Technologies. Register for the Belgium event here

Belsoft and Icon Switzerland will be hosting the event in Zurich with Bob Schultz (Watson Talent & Collaboration General Manager) and Richard Jefts (Vice President and General Manager Collaborative Workflow Platform) from HCL.  Register for the Swiss event here

For a full list of global events you can attend at no cost as well as the speakers in each location on October 10th see (and register) here

 

Apple Mojave and IBM Notes 9.0.1

If you have trouble installing Notes 9.0.1 on Mojave with the installer erroring with

“File /Applications/Notes.app/Contents/MacOS/rcp/rcplauncher not found. Provisioning process failed to launch or was terminated before status could be determined.”

a very quick reminder for this error that occured first on the APFS file system using High Sierra – make sure you have downloaded the 9.0.1 installer from March 9th this year (passport advantage code CNQY7EN) and not the original one from 2015.  The one from March will install correctly and then let you install the IF16 fix  (901IF16) from IBM Fix Central that was released on September 24th on top to support Mojave.

If you already had Notes installed prior to upgrading to Mojave the IF16 fix installed on top should just work, this is primarily for new installs.

I would suggest going ahead and get rid of your 2015 9.0.1 client installers and get the new 2018 one in place just to be safe

Adminlicious – My Favourite TCO Features in Domino 10

This is my presentation from Icon UK on Thursday 13th September.  There are lots of TCO features coming in Domino 10 that I’ve been working with and look forward to putting into production.  In this presentation I cover things like cluster symmetry, pre send mail checking, deletion logs and the newrelic statistics reporting.

Say it with me….

28 days until the Domino 10 release.

The story of Async in JavaScript

By Tim Davis – Director of Development

In my last post I talked about some Javascript concepts that will be useful when starting out with Node.js. This time I would like to talk about a potentially awkward part of JavaScript, i.e. asynchronous (async) operations. It is a bit of a long story, but it does have a happy ending.

So what is an asynchronous operation? Basically, it means a function or command that goes off and does its own thing while the rest of the code continues. It can be really useful or really annoying depending on the circumstances.

You may have used async code if you ever did AJAX calls to Domino web agents for lookups on web pages. The rest of the page loads while the lookup to the web agent comes back, and the user is happy because part of the page updates in the background. This is brilliant and is the classic use case for an async function.

This asynchronous behaviour is built into JavaScript through and through and you need to bear it in mind when you do any programming in Node.

So how does this async behaviour manifest itself? Lets look at an example. Suppose we have an asynchronous function that goes and does a lookup somewhere.

function doAsyncLookup() {
    ... do the lookup ...
    console.log("got data");
}

Then suppose we call this function from our main code, something like this:

console.log("start");
doAsyncLookup();
console.log("finish");

The output will be this:

start
finish
got data

By the time the lookup has completed it is too late, the code has moved on.

So how do you handle something like this? How can you possibly control your processes if things finish on their own?

The original way JavaScript async functions allowed you to handle this was with ‘callbacks’.

A callback is a function that the async function calls when it is finished. So instead of your code continuing after the async function is called, it continues inside the async function.

In our example a callback could look something like this:

function myCallback() {
    console.log("finish");
}

console.log("start");
doAsyncLookup( myCallback );

Now, the output would be this:

start
got data
finish

This is much better. Usually, the callback function receives the results of the async function as a parameter, so it can act on those results. So in examples of callbacks around the web, you might see something like:

function myCallback( myResults ) { 
    displayResults( myResults );
    console.log("finish"); 
} 

console.log("start"); 
doAsyncLookup( myCallback );

Often the callback function doesn’t need to be defined separately and is defined inside the async function itself as a sort of shorthand, so you will probably see a lot of examples looking like this:

console.log("start"); 
doAsyncLookup( function ( myResults ) { 
    displayResults( myResults ); 
    console.log("finish"); 
} );

This is all great, but the problem with callbacks is that you can easily get a confusing chain of callbacks within callbacks within callbacks if you want to do other asynchronous stuff with the results.

For example, suppose you do a lookup to get a list, then want to look up something else for each item in the list, and then maybe update a record based on that lookup, and finally write updates to the screen in a UI framework. In a JavaScript environment it is highly likely that each of these operations is asynchronous. You end up with a confusing chain of functions calling functions calling functions stretching off to the right, with all the attendant risk of coding errors that you would expect:

console.log("start"); 
doAsyncLookup( function ( myResults ) { 
    lookupItemDetails( myResults, function ( myDetails ) {
        saveDetails( myDetails, function ( saveStatus ) {
            updateUIDisplay( saveStatus, function ( updatedOK ) {
                console.log("finish");
            } );
        } );
    } );    
} );

It gets even worse if you add in error handling. We may have solved the async problem, but at the penalty of terrible code patterns.

Well, after putting up with this for a while the JavaScript world came up with a better version of callbacks, called Promises.

Promises are much more readable than callbacks and have some useful additional features. You pass the results of each function to the next with a ‘then’, and you can just add more ‘thens’ on the end if you have more async things to do.

Our nightmare-indented example above becomes something like this (here I am using the popular arrow notation for functions, see my previous article for more on them):

console.log("start"); 
doAsyncLookup()
.then( (myResults) => { return lookupItemDetails(myResults) } )
.then( (myDetails) => { return saveDetails(myDetails) } )
.then( (saveStatus) => { return updateUIDisplay(saveStatus) } )
.then( (updatedOK) => { console.log("finish") } );

This is much nicer. We don’t have all that ugly nesting.

Error handling is easier, too, because you can add a ‘catch’ to the end (or in the middle if you need) and it is all still much more clear and understandable:

console.log("start"); 
doAsyncLookup() 
.then( (myResults) => { return lookupItemDetails(myResults) } ) 
.then( (myDetails) => { return saveDetails(myDetails) } ) 
.then( (saveStatus) => { return updateUIDisplay(saveStatus) } ) 
.then( (updatedOK) => { console.log("finish") } )
.catch( (err) => { ... handle err ... } );

What is really neat is that you can create your own promises from existing callbacks, so you can tidy up any older messy async functions.

Promises also have some great added features which help with other async problems. For example, with ‘Promises.all’ you can force a list of async calls to be made in order.

So promises solved the callback nesting problem, but The Gods of JavaScript were still not satisfied.

Even with all these improvements, this code is still too ‘asynchronous’. It is still a chain of function after function and you have to pay attention to what is passed from one to the next, and remember that these are all asynchronous and be careful with your error handling.

Once upon a time, Willy Wonka gave us ‘square sweets that look round’, and so now TGOJ have given us ‘asynchronous functions that look synchronous’.

The latest and greatest advance in async handling is Async/Await.

All you need to do is make your main function ‘async’, and you can ‘await’ all your promises:

async function myAsyncStuff() {
    console.log("start"); 
    let myResults = await doAsyncLookup();
    let myDetails = await lookupItemDetails(myResults);
    let saveStatus = await saveDetails(myDetails);
    let updatedOK = await updateUIDisplay(saveStatus); 
    console.log("finish");
 }

How cool is this? Each asynchronous function runs in order, with no messy callbacks or chains of ‘thens’. They all sit in their own line of code just like regular functions. You can do things in between them, and you can wrap them in the usual try/catch error handling blocks. All the async handling stuff is gone, and this is done with just two little keywords.

Plus, the functions are all still promises, so you can do promise-y things with them if you want to, and you can create and ‘await’ your own promises to refactor and revive old callback code.

Async/Await is fully supported by Node.js, by popular UI frameworks like Angular and React, and by all modern browsers.

One of the biggest headaches in JavaScript development now has an elegant and usable solution and they all lived happily ever after.

I hope you enjoyed this little story. I told you it had a happy ending.

A Solution For Time Tracking

I’ve always struggled with tracking time.  It’s partly because of my work where I’ll often leap between three or four things at once “oh compact is running, whilst that continues I’ll just do this..” and partly because I disappear down a rabbit hole and forget to “stop” whatever timer I start.  I  have had various time tracking tools integrated to my Mac where a key press starts a timer and another stops it.  It’s the stopping that’s the problem. Tim is much more diligent and carefully logs all his time in a tiny moleskine (analog ftw!) and our friend Mark Myers has long advocated for the pomodoro method where time is broken out into 25 minute chunks.  In fact Mark’s approach to work most closely aligns to mine in that he is often juggling multiple phone calls and pieces of development at the same time and so when he showed me his new Zei tool from Timeular I was convinced enough that we bought one for Tim.  Within a week of him getting it I decided to get one for myself.

Long story short.. it’s the first time tracking tool that I find easy to use and fits into how I work.  The Zei is actually an octohedran (or a D8 for those of you that way inclined) that fits nicely into your hand, you simply label each side,  tell the app what each side is labelled for and then turn that side “face up” when you start work on that project.  The bluetooth connection to my Mac or phone detects when I turn another side face up and stops the timer on the previous project, starting it on the new one.  There are apps for just about every platform and the reporting is really nice.  The cost is 49 Euro and then 9 Euro a month for unimited projects but we both spent 99 Euro as a one off cost that limits you to 8 projects on the device which suits us fine.  You can (and we do) erase and rewrite the sides of the device regularly (well every few weeks) as work changes.

You can see on my timeular below that I’m currently writing a blog – the terrible scrawl is mine and I have erased / written over badly a few times.  I have left one side entirely blank so if I’m doing “nothing” such as shopping for books online I just turn that face up and I’m not logging time.  You can add more activities in the actual app but I like having the 7 most important ones to track.  When you turn a side face up the app detects that and stops the previous timer, startimg a new one for the new face up side but if you turn it again in less than a minute it doesn’t log anything at all.  The battery on the Zei is meant to last 10,000 hours

IMG_0623

This a sample report from the app on my phone showing activities logged.  I’ve obviously  badly replaced the actual ones with sample ones so I can share it here.  You can see how well it tracks even small amounts of time.  If I’m answering emails I wouldn’t usually start a timer but I can easily turn the timeular face up and it will log all the small increments of time that usually disappear.  For my own reference even on fixed price projects I find it incredibly useful.

IMG_2347

As an additional bonus I know Mark has spoken to them several times about features he’d like and they are very keen to work with customers. So..

a beautifully built product

from a small company that cares about their solution

at a good price point

that actually works

I can’t say better than that http://timeular.com