Jun 23

Upcoming changes in DominoToGo: Titanium 3.3 support and new documentation

Appcelerator announced that starting with Titanium SKD 3.3 the Ti.include() method will be deprecated. DominoToGo was added to each project with this single line of code:


So Appcelerator’s move to get rid of Ti.inlcude() means some refactoring work for me. But I see the advantages of the CommonJS model which should be used instead, so I’m not complaining.

On the contrary, I’m embracing the change and using the opportunity to refactor the DominoToGo code in various areas. So in a nutshell: DominoToGo will support Titanium SDK 3.3 and the CommonJS model soon.

And while I’m digging through tons of code, I’m improving inline documentation a lot so that it can be parsed by JSDuck. JSDuck is a very, very nice tool to create documentation from JavaScript code. Have a look at this Titanium SDK documentation. My DominoToGo documentation will look like this, too.

Here is a screenshot:



If you’re in the JavaScript business, I highly recommend having a look at JSDuck in order to document your code. It’s simple, creates results fast and produces beautiful documentation.


Jun 22

Mobile Apps: Offline First

The story of a company moving from hybrid mobile apps to native using Appcelerator Titanium. One reason: customer complains about bad performance in areas with poor network coverage. Therefore the new paradigm: offline first.

Interesting read: Four Benefits of Changing Our Technology Platform to Titanium

If you want a full offline enabled mobile app for IBM Notes and Domino, you need DominoToGo.


Jun 05

Why does not everyone use the Ytria tools?

I’m a heavy user of Ytria ScanEZ for years, and I’m using the other tools like viewEZ or databaseEZ occasionally – all in an relatively old version.

Recently, Ben of Ytria gave me a good demo of the most recent versions of all Ytria tools and I’m deeply impressed how many new and incredible useful features went into the products in the last years. I learned that the Ytria tools have many, many features I wasn’t aware of. And every single feature is capable of saving hours or even days of time.

That makes me wonder why there are still Domino developers and admins that are not using Ytria. Do they like to do repetitive, boring tasks? Do they like creating one-time agents just to fix some fields in documents? Do they like to adjust ACLs one after the other? Do they like to be puzzled by replication issues? Do they like to solve conflicts manually?

The list can go on and on. I can only think of one reason why anyone doesn’t use Ytria: because they don’t know what the tools are capable of.

Believe me, I am not paid by Ytria. I am not working for them. I am just convinced. Go, let someone of Ytria give you a demo. It will take some amount of time, but this will be the best amount of time you’ve ever invested.



May 22

Status update

It’s relatively quiet in this blog at the moment. Is it because I’m not doing any IBM Notes or XPages related work anymore?

No, that’s not the reason. On the contrary. I’m bound in several projects for several customers in the mobile space (Titanium and DominoToGo), XPages or even classic Notes development:

  • extending an Titanium and DominoToGo based CRM app for iOS with several new and complex functionality
  • building advanced stuff into a Titanium and DominoToGo based iOS app like push notifications and automatic synchronisation of Notes data into the app based on the device’s location
  • building a classic Notes workflow application
  • refactoring code in an existing complex class Notes app into an organized and object orientated structure and making this Notes app faster
  • checking how to deploy a Titanium and DominoToGo based app into a Good container
  • extending a complex, XPages based mail and workflow app
  • developing XPages based widgets for a Notes composite application

The mobile development assignments are getting more and more, and I’m still very, very happy with Appcelerator Titanium. It is a good platform, and the are many interesting things going on regarding Titanium’s future.

As I wrote before, DominoToGo just rocks and I’m very proud of it. It enables me to focus on the app’s UI and business logic, while synchronizing Notes data to the app just works.

While refactoring a classic Notes app I was deep into LotusScript again, and I still enjoy that, too. Furthermore, it’s fun to bring patterns I learned with JavaScript development into the LotusScript world – one can still do a lot of good stuff with object oriented LotusScript.

Beside work, summer has started in Germany, the sun is shining and temperatures are rising. Good times.

Apr 09

I am proud of DominoToGo. It. Just. Works.

(If you see a video about what I’m writing about, just scroll down…)

I’m just back from a customer in Zurich, Switzerland where we kickstarted a DominoToGo project.

A quite interesting project from my perspective: it’s about coroners that want to write reports about dead people on an iPad mini while they are on site.

So far they had a Notes application in the office, so that they needed to make notes somewhere, for example on a sheet of paper, and enter the information when they’re back in the office.

Since the Notes application should continue to be master of the data, the iPad app needs to push new reports to the Notes application. Furthermore, to create a report, several lists are needed from Notes, for example Notes user names and selection lists for fields like “cause of death”.

Does everyone die in places with good network coverage?

Unfortunately, people do not always die in places with good network coverage, so offline functionality is essential. Therefore a web based app is out of the question, just as in so many other projects I recently worked on.

About the app

So basically the app needs to:

– get a list of all Notes users from the Domino Directory
– get several selection lists from one NSF
– get a list of customer records from another NSF
– offer a form to enter the data
– offer several selection dialogs in the form, something like a view pick list in Notes
– save the data to a new document
– upload the document to a third NSF in Domino, when the device is online
– if the device is offline, the data needs to be queued locally and uploaded sometime later

What we did

In Appcelerator Titanium we started with a template that is delivered with the DominoToGo package. This template contains an app with basic functionality like

– layout for iPad, iPhone and Android
– a configuration dialog for entering the Domino username and password
– an HTML based “about” page
– basic navigation
– a skeleton for synchronization functionality

This template app already has the DominoToGo libraries included so we could start immediately with the business logic.
Futhermore, this template app already uses Titanium’s Alloy framework, which is a system where layout, logic and data is organized separately and the app code is very well structured. The layout is defined with simple XML tags while the logic is written with JavaScript.

First step: synchronization

We started with the synchronization logic. As written above, several Notes views needed to be synchronized to the app. With DominoToGo, this was a no-brainer, here is a piece of the code:

function sync_personen(success, e) {
if (!success) {
DTG.log("Sync von names fehlgeschlagen: "+e.error);
var view = Alloy.Globals.notesdb_adressen.getView("(iLotus_Personen)");
view.update(sync_adressen, false, 'Synchronisation fehlgeschlagen: %s');

function sync_names(success, e) {
if (!success) {
DTG.log("Sync von fehlgeschlagen: "+e.error);
var view = Alloy.Globals.notesdb_names.getView("(iLotus_People)");
view.update(sync_personen, false, 'Synchronisation fehlgeschlagen: %s');

Regarding the amount of data, we counted some hundred Notes users from the Domino Directory, some 500 customer records and about one hundred keywords used in selection lists.

The synchronization took about one second to complete. It is so fast, that we simply let the synchronization run everytime the app starts, the user doesn’t notice it at all.

Second step: designing the form

The basic form was done very quick thanks to the great Titanium Alloy framework. For example, have a look at this code:

and now look what this kind of tag produces in the app:

It’s a generalized view picker dialog which displays the content of a Notes view in a picker dialog in the app (of course, even when the iPad is offline). I wrote code for various generalized picker dialogs, like a date picker, a view picker and a selection list picker. My customer now only needs one line of XML code like the one above to use such dialogs. Not that bad, isn’t it?

Third step: uploading data to Notes

Data entered in the form in the app should be uploaded to a Notes application in Domino. Nothing simpler than that, look here (no, that’s not LotusScript! It’s JavaScript in Titanium);

var notesdb = Alloy.Globals.notesdb_ereignisse;
var doc = notesdb.createDocument();
doc.replaceItemValue("form", "FM-LN");
doc.replaceItemValue("Name", $.fields1.c_getValue1());
doc.replaceItemValue("Vorname", $.fields1.c_getValue2());

But there was one additional requirement: the documents need to get a number based on special numbering rules. This numbering could only be done on the Domino side. A problem? Hell no!

In DominoToGo there is a SSJS library on the Domino side that provides extension points, for example when a new document has been uploaded from the app to Notes,

So we simply needed to write some server side JavaScript code in this library which computes a new number and stores it in the new document that just has been uploaded by the app. Simple and clean.

My job was done and I am proud

After developing and explaining all this functionality my job was done. Now the customer has all the functionality and pieces needed to finish the app by himself.

I’m proud of DominoToGo. All the synchronization functionality needed in this project was implemented in minutes and just worked. Reliable and fast.

Yes, since I developed the DominoToGo framework by myself such a statement seems to be selfish. Nevertheless, I’m still proud of my work 🙂

If you want to read more about DominoToGo, have a look here.

Apr 04

Die Deutsche Bahn und die Schweizer Bahn.

Ich fahre gerne Bahn. Fliegen finde ich hochgradig nervig und anstrengend, und Auto fahren geht gar nicht.

Also fahre ich nicht nur gerne Bahn, sondern auch oft. Verspätungen gibt es eigentlich immer, und das kalkuliere ich schon mit ein. Über ein paar Minuten spreche ich gar nicht mehr, und wenn ich umsteigen muss und die Umsteigezeit weniger als 10 Minuten beträgt, ist es hoch wahrscheinlich, dass das nicht klappt und ich dann den nächsten Zug nehmen muss.

So ist es halt, bei der Fliegerei gibt es auch tausend mögliche Probleme und mit dem Auto steht man auch häufig im Stau.

Nun war ich ein paar Tage in der Schweiz und habe mich mit Schweizern über die Bahn unterhalten. Die können meine Geschichten über die Bahn schlicht nicht verstehen. Die Schweizer Bahn ist wohl tatsächlich sehr, sehr pünktlich. Wenn eine Schweizer Bahn eine Minute Verspätung hat, hört man schon eine Entschuldigung… bei der Deutschen Bahn gilt jeder Fernzug mit einer Verspätung von bis zu 5:59 Minuten noch als pünktlich, das sagt eigentlich alles.

Unbestritten ist, dass ohne Ende Mist auf deutschen Strecken passiert, gegen den man einfach nix machen kann: Bekloppte laufen auf den Schienen rum, Diebe stehlen Kabel (das passiert mittlerweile ziemlich oft), Bäume fallen im Sturm auf die Schienen und so weiter.

Aber eine Menge Dinge sind einfach auch vermeindbar: Signalstörungen, Weichenstörungen, zu spät bereitgestellte Züge und so was. Einen Höhepunkt erlebe ich jetzt gerade: der ICE 74 ist gerade aus Zürich abgefahren und nach 20 Minuten steht der Zug. Triebwagenstörung. Wann es weiter geht, ist völlig unklar, es werden bereits Evakuierungsvorbereitungen getroffen. Seufz.

Das sind schlicht die Folgen von vernachlässigter Infrastruktur. Und das wäre vermeidbar gewesen, wenn man mehr Geld in die Wartung und gesteckt und weniger auf die Börse geschaut hätte.

Eine weitere Kleinigkeit mit großer Wirkung könnte man sich im übrigen auch von der Schweiz abschauen: die Schweizer Bahn hält in Bahnhöfen viel länger als die Deutsche Bahn. Wenn ein Schweizer Zug also mal ein Verspätung hat, kann er die im nächsten Bahnhof ganz leicht wieder aufholen, wenn er dann nicht z.B. 10 Minuten sondern nur 5 Minuten hält. Es ist einfach mehr Puffer da, um Netzstörungen abzufedern. Klingt für mich nach einem sinnvollen System.

Mar 21


Auch wenn ich teilweise den Eindruck mache, das Leben besteht nur aus Arbeit, ist das genaue Gegenteil der Fall. Ich liebe meine Arbeit, keine Frage. Ich investiere viel Zeit und Energie, um meine Kunden glücklich zu machen, und das schafft ein großes Maß an Zufriedenheit bei mir. Trotzdem findet das eigentliche Leben woanders statt.

Wer es noch nicht kennt, hier ist ein guter Text zu diesem Thema:

Mar 21

New Apple Website about iPhone and iPad in the enterprise

This new website from Apple contains a lot of well structured information about using iOS devices in the enterprise. Click here to open Apple’s “New IT” website.

And you know, if you want to create custom enterprise apps my recommendation is to use Appcelerator Titanium and DominoToGo, do you?

Mar 20

Entwicklercamp 2014

Das Entwicklercamp 2014 ging gestern zu Ende. Bei den Camps 2012 und 2013 konnte ich nicht dabei sein, umso mehr hat es mich gefreut, dieses Jahr wieder hingehen zu können.

Auch dieses Mal war ich Referent und habe zwei Sessions zum Thema “Native Apps, die mit Notes synchronisieren” gehalten. Teilnehmer der Sessions können das Material hier herunterladen.

Kurzgefasst habe ich in meinen Sessions die Möglichkeit aufgezeigt, mit Appcelerator Titanium native Apps für verschiedene Plattformen (iOS, Android…) relativ einfach zu entwickeln, und dann Daten aus Notes in die App und zurück zu synchronisieren. Letztendlich also das, was das von mir entwickelte Framework DominoToGo fix und fertig liefert.

Während ich in der ersten Sessions Grundlagen gelegt habe, ging es in der zweiten Session dann zu Sache: dort habe ich echten, lauffähigen Code gezeigt sowohl für die Domino Seite (via XPages) als auch für die Titanium Seite. In drei Beispielen habe ich gezeigt, wie man

  • den Inhalt einer Ansicht lesen, in der App speichern, verarbeiten und anzeigen
  • ein Dokument als XML Repräsentation in die App synchronisieren, speichern und verwenden
  • ein Dokument als HTML Repräsentation in die App synchronisieren, speichern und anzeigen

kann. Beide Sessions waren sehr gut besucht und ich habe viele sehr positive Bewertungen bekommen – danke dafür!

Ich bin ziemlich sicher, dass ich nächstes Jahr auch wieder zum Camp komme. Und jedem, der eine Konferenz mit gehaltvollen Vorträgen zu den Themen Notes, Domino, XPages, JavaScript etc. sucht, kann ich das Entwicklercamp sehr empfehlen.