Showing posts with label Notes. Show all posts
Showing posts with label Notes. Show all posts

Tuesday, August 6, 2013

Holiday reading: IBM Redbooks: Lotus Domino Development Best Practices

I do not know why i did not read this redbook one year ago, but i am very happy that i read this redbook in this year holidays. It is full of very usefull informations how things in Notes/Domino work and what are the best practices to write good Domino Applications. In my opinion the best part is the performance chapter. So do not miss this part of the redbook.

Lotus Domino Development Best Practices

Performance Considerations




Thursday, June 20, 2013

Scott Souder has announced ODBC for Domino 9

Better late then never Scott Souder has announced the availability of the ODBC driver for Domino 9.

When you have an IBM id you can download the ODBC driver from the developerworks site

The part numbers for the 32 bit version is CIMW6EN and for the 64 bit version CIMW7EN.
 

Tuesday, June 18, 2013

Easy way to get the Url of an update site in Notes

If you want to create a new widget from a feature in an update site you can either type in the url of the update site in the new widget dialog manually (ServerName/ReplicaID/site.xml).



Tuesday, April 23, 2013

Notes Domino 9 group 1 language versions are availabe now.

The first national language versions (Group 1) for example Catalan, Italian and German of Notes Domino 9 are available in passport advantage now.

So there is no more reason to postpone your upgrade to the greatest version of Notes/Domino.

The GA2 languages like Finnish, Norwegian, Swedish, Danish, Dutch will be availabe on 04.06 and the remaining languages like Greek, Slovenian, Thai, Turkish, Russian, IB Portuguese, Hungarian, Slovakian, Hebrew, Kazakh, Polish, Czech should be available on 23.07



Sunday, April 14, 2013

Improve your Domino Server Performance on the System i

On Windows it is pretty clear that Domino Servers only perform well, when the admin regulary defragment the file system where the Domino data is stored. Unfortunatly many System i admins do not know that fragmentation of Domino databases is a problem on their system too. So they do not get the best performance possible and with every year of using the server the problem of framgentation gets bigger and bigger.

The defragmentation of the disks in a System i Server can be done with the command STRDSKRGZ.

So login into your System i with a 5250 Terminal client and execute the STRDSKRGZ command:

Sunday, March 31, 2013

Configure Domino to ignore whitespace during quota check.

When you have set quotas for your mail files on a server with transaction logging enabled (I really hope everyone has logging enabled.) your users have the problem, that after they have deleted some mails there is no possibility to remove  the whitespace from the database, because the option to compact is not available for databases which are transaction log enabled*. So many admins run "compact -c" regulary on all mail files to remove whitespace. But from a performance point of view copy style compacts are a really bad idea (I will provide more infos on this in a future blog post).

So the much better way to solve the problem is to change the "quota enforcement" setting on the "Transaction Logging" tab in your server document from the default "Check file size when extending the file" to "Check space used in file when adding a note". With this setting the white space is ignored on quota calculation and your users are happy again.


* The compact for user is disabled, because a copy style compact will generate a new DBIID and a change of the DBIID of a database make a new full backup of this database necessary.  

Wednesday, March 27, 2013

My Top 5 Notes 9 features

There are so many nice improvements in Notes 9, that it was very difficult to choose my top 5, but here they are:

1. The new theme.

First i was a little worried, about the new grey colour palette and the reduced colours of the icons. But after a short while i really liked the new design and every time i have to go back to my 8.5.3 Notes client at work i think the old theme looks very dated.




Tuesday, March 26, 2013

How to reports bugs in Notes 9 without a PMR?

Unfortunatly there are some nasty little bugs in Notes 9 and i am searching for an easy way to report this bugs to IBM Development. I do not want to open PMR's because they are to complicated for this little bugs. So does anyone know a way to report bugs like the following to the Development team:

The Typeahead in the new Quickfind dialog does not work, when the "TypeaheadShowServerFirst=1" notes.ini setting is present.

Without the notes.ini setting the typeahead works:

With "TypeaheadShowServerFirst=1" set the typeahead fails:


Friday, March 22, 2013

Notes 9 gold the first look is a little bit disappointing

Don't get me wrong, Notes 9 is a big progress over 8.5.3 and it is a good release, but many of the little rough edges i have already criticized in the beta are still in the final version. And this little UI quirks and inconsitences are this things which separate the good from the very good software products. This is especially disappointing because Scott Souder has promised, that significant improvements in this area will be made from beta to gold  in  a Q&A session at the Edcom Nachlese in munich.

So what are my main complaints about Notes 9 and why do i think that IBM should really work on this stuff.

Many important parts of Notes still look like software from the last century.

The first impression a user gets from the Notes Client is the password dialog. The password dialog has not changed since version 6. It looks like a Windows 2000 dialog and looks really foreign on Windows Vista upwards.

 
The window tdecoration does not use the style from windows and the dropdown boxes and push button are looking like we are running this software on a very old windows version. By the way all screenshots are from my Windows 7 computer.

And there are many other places with the same old dialogboxes. And i am not talking from seldom used dialogs. For example look at the  "Open Application" dialog.


Again the icons are from Notes 6 or older and are complete different to the rest of the icons Notes 9 is using. The window decorators are complete wrong again becaue they are still from Windows 2000 and not fromWindows 7. And the funniest thing is that there is already a new designed "Open Application" dialog and new icons for Applications and folders in the product. This new dialog is used in the Designer client.


This dialog uses the correct window decorators. The widget set is from Windows 7 and the icons have a fresher look than the old icons in designer. Although there is still room for improvement in the designer dialog too, it would be a good replacement for the open dialog in the client.

Or lets look at the preferences dialog. Is IBM really thinking that it is a good idea to put an old style notes dialog in an eclipse dialog with scrollbars? I do not think that this is the "exceptional experience" IBM is always promising.

 
And i can not imagine a reason why the properties dialogs are still not resizable and not redesigned in 2013. Every power user in our company is complaining that it is really ridiculous to use such small and somtimes bad designed dialogs when you want to change a text property or even worse a table property. And again IBM has already proofed that they can do it better with the property sidebars in the productivity editors (Oh if forgot they are discontinued and all my investment in them is gone with them).



So my question is, why has IBM redesigned the already good looking parts like the CA Views and the sidebar if there are still so many very old parts of the product?

The second problem in Notes 9 is that there are so many inconsistencies in the UI.

First of all, i do not know an other application which is using at minimum four different widget styles in one application. For example look at the buttons in Notes:


 
 

This mix from different widget styles in the same application is a big problem in Notes, because it looks really unprofessional.

And now an easy one to solve. Notes 9 gold uses still different icons for the same thing.

For example follow up flags in Java View, Dialog, Old View and iNotes. Three different icons for the same purpose in four different places.  
 Or the application and doclinks (Notes client vs. iNotes)


And unfortunatly there are behavior inconsistences all over the whole application. 

For example in the new find dialog (by the way, why is this dialog not resizable?) you get help by hovering over the question mark icons and in the mail preferences on the signature tab there is the same question mark icon, but there you have to click the icon to get the tooltip. 

Or in the Notes Client you can find the open dialog in "File->Open->IBM Notes Application" and in the designer the same function is under "File->Application->Open". This and many more little differences in behavior make the Notes 9 unpleasant to use.

What is really annoying for customers which use many Eclipse plugins in the notes client is, that the IBM Development team has fogotten to adjust the colour palette in the Eclipse ui framework. So third party plugins look really alien with their blue colours compared to the new grey colour style used in the Notes 9 client.


And this would be really easy to change for IBM. I have written a little patch to some of the Notes Client plugins which changes only a few lines of code and third party plugins will look much nicer in Notes 9.



And this is not only a problem in thirdparty plugins . It looks like the same problem is in the Designer Client that some parts of the ui have still the old blue based colour palette.




So the first look is unfortunately a little bit disappointing for me, but i know from the beta that there are many great improvements in the new version. I will show some of this feature in future blog posts.








Thursday, March 21, 2013

Scott Souder has started his blog.

Scott Souder the successor of ed brill in the IBM Messaging and Collaboration division has started his new blog on sssouder.com. I hope his blog will get as informative as the blog of ed brill which was one of the most valuable information source in the IBM collaboration bubble. So good luck to scott souder in his new role and with his new blog.

And by the way, the blog he is using runs on Domino and looks really well.


Lotus Notes 9 final is available in passport advantage

I am so excited that Lotus Notes 9 is available. Now i am downloading the code and will post what has changed since the public beta later today.



The product codes for the most important downloads are:

IBM Notes, Domino Designer and Admin V9.0 for Windows XP,Vista and Windows 7 32 Bit English(CIB9AEN)

IBM Notes Client V9.0 for Windows English(CIB8LEN)

IBM Notes Client V9.0 for Mac English(CIB8PEN)

IBM Notes Client V9.0 for Linux (RPM Install) English(CIB8MEN)

IBM Notes Client V9.0 for Linux (Debian Install) English(CIB8NEN)

IBM Notes Traveler V9.0 for Windows Multilingual(CIB95ML)

IBM Domino Sever V9.0 64 bit for Windows English(CIBM1EN)

IBM Domino Sever V9.0 32 Bit for Windows English(CIBM0EN) 





Saturday, March 16, 2013

How to activate and use the expressions view in the SSJS debugger

The "expressions" view in the java debugger is one of the most valuable tool for debugging java code. With this view you can deeply inspect the values of all objects you are using in your code at runtime and you can even run methods on this object to get values not visible in the standard "variables" view. For example when you have a document object you can invoke getItemValueString on this object to get the value of a field from the document. Knowing this you will understand my disappointment when i first try the SSJS Debugger in Desinger 9, because it looks like there is no expression view in the java script debugger. But fortunately the view is only hidden and can be activated in Designer 9.

Go to the "Window->Show Eclipse View" menu and activate the "expressions" view.
After that we can use the expressions view to analyze the state of all objects available in our code when the execution is stopped at a breakpoint in the debugger.

For example we have the following serverside java script code in our xPage.

 
var view=session.getCurrentDatabase().getView("Employees");
var doc=view.getFirstDocument();
var money=0;
while(doc!=null){
 money=money+100/doc.getItemValueDouble("value");
 doc=view.getNextDocument(doc);
}
getComponent("result").setValue(money);

The following screenshot shows what is possible with the expressions view in SSJS Debugger at a brekpoint inside the loop.

You can access every field from the doc Object with getItemValueString() or every java script variable. You can get every information from the session, for example the effective username running this script. From the session you can acces databases and from the databases you cann acess views and so on and on. The possibilitys are endless.

To add, change or remove expressions in the expression view simply right click the view and select the appropriate menu action. Or use the actions in the toolbar. When you hove over a toolbar icon you get a simple description of the action.

So i hope IBM will activate the expressions view by default in future service packs of Designer 9 so that every xPage developer knows about this great tool. A right click Option "Watch this expression" in the source editor would be nice too.

Reference to all my posts about the SSJS Debugger

Tuesday, March 12, 2013

IBM announces general availability of Domino 9 on March 21th

The wait is over. IBM has announced the GA of Domino for delivery on March 21th 2013. I am really looking forward to test the final release of Domino and Notes Social Editon.

Sunday, March 3, 2013

Aktivieren des REST Api der Domino Data Services am Server

Seit 8.5.3 Upgrade Pack 1 gibt es mit dem Domino Data Services eine neue Methode um auf die Daten eines Lotus IBM Domino Server zuzugreifen. Ein Teil dieser Domino Data Services ist ein REST Api mit dem man Daten aus Domino Datenbanken über eine einfache URL als JSON Objekte zurückbekommt. Dies sieht wirklich nach einer sehr viel versprechenden Technologie aus, da man in einem Clientprogramm egal ob es sich jetzt um einen Rich client, einen Webclient oder einen Mobilen Client keine Librarys wie notes.jar installieren muss, um auf Daten von Domino Servern zugreifen zu können.

Die Voraussetzungen für die Verwendung der Domino Data Services sind ein installiertes Upgrade Pack 1 auf 8.5.3 oder natürlich noch besser ein Domino 9 Server. Ich habe alle meine Tests mit einem 9er Server durchgeführt. Die Domino Data Services sind standardmäßig nicht aktiviert und müssen über den Admninistrator freigeschalten werden.

Konfiguration ohne Internet Site Dokument

Im Server Dokument im Tab "Internet Protocols/Domino Web Engine" befindet sich ganz unten der Punkt "Domino Access Services" Bei dem Feld "Enabled Services" muss der Punkt "Data angehakt werden. Danach muss man mit "tell nhttp quit" und "load nhttp" den Http Task von Domino durchstarten und die Data Services sollten funktionieren.



Konfiguration mit Internet Site Dokument

In dem Internet Site Dokument befindet sich die Einstellung für die Domino Data Services auf dem Tab "Configuration". Bei dem Feld "Enabled Services" muss der Punkt "Data angehakt werden. Danach muss man mit "tell nhttp quit" und "load nhttp" den Http Task von Domino durchstarten und die Data Services sollten funktionieren.

Nach der Konfiguration des Servers kann man schon verschiedene Informationen wie z.b. eine Übersicht aller Datenbanken auslesen. Um aber Daten aus einzelnen Datenbanken abrufen zu könnenn müssen diese Datenbanken noch für die Verwendung von Domino Data Services konfiguriert werden. Dazu muss man in den Datenbankeinstellungen unter Erweitert ganz unten den Zugriff erlauben. Man hat dabei die Auswahl ob man nur den Zugriff auf Ansichten, oder auch den Zugriff auf Dokumente erlauben will.
Falls man diese Einstellung nicht setzt erhält man beim Zugriff die Meldung "The Domino data service is not enabled for this database"

Zusätzlich zu der generellen Erlaubnis des Zugriffs auf die Datenbank muss dann auch noch bei jeder View bzw. Folder auf den man mittels REST Api zugreifen will der Zugriff mittels den Domino Data Services freigeschalten werden. Der Punkt befindet sich wieder in den erweiterten Einstellungen der Ansicht oder des Ordners.


Falls die Ansicht nicht freigeschalten wurde, bekommt man die Fehlermeldung "The Domino data service is not enabled for this view" beim Zugriff auf die Ansicht.


Im nächsten Post möchte ich dann zeigen wie einfach es ist auf Daten in einer Datenbank über die REST API zuzugreifen.

Sunday, February 24, 2013

Wichtige Gruppen sind im Domino Administrator 9 vor dem Löschen geschützt.

Im Domino Administrator 9 wurde eine neue Funktion hinzugefügt, die bestimmte systemrelevante Gruppen vor der unabsichtlichen Löschung schützt. Dies ist wirklich eine gute Neuerung, da eine versehentlich gelöschte LocalDomainServers Gruppe eine mittlere Katastrophe auslösen kann. Der neue Schutz betrifft aber nur das UI das Administrators, denn über API's können die Gruppen nach wie vor gelöscht werden.


Dieses Feature wird über das Directory Profile konfiguriert. Dort kann man für eine Gruppe den Schutz entfernen, oder für eigene sehr wichtige Gruppen den Löschschutz aktivieren.



Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9

Domino 9 neue Optionen beim Datenbank compact

In der Version 9 wurde der compact Task um einige sehr praktische Features erweitert. Leider sind die Features in der Admin Hilfe noch nicht dokumentiert. Deshalb habe ich hier soweit bekannt die wichtigsten Infos zusammengetragen.

Compact mit mehreren Threads durchführen.

Mein absolutes Lieblingsfeature. Heutige Server mit vielen Prozessorcores und vielen Platten haben das Problem, dass bei einem Compact über alle Datenbanken Compact zwar ewig läuft, der Server jedoch nur minimal ausgelastet ist. Man hat sich dann mit .ind Files beholfen um mehr als einen Compact Task laufen lassen zu können. Die Pflege der .ind Files hat aber einen relativ großen Aufwand bedeutet und immer wieder wurden Datenbanken nicht in die .ind Files eingetragen und deshalb beim Compact nicht komprimiert. Jetzt kann man jeden Compact Befehl die Option "-# X" anhängen und es werden automatisch X Threads erzeugt die die Komprimierung ausführen. Die maximale Anzahl von Threads ist 20.

Load compact -c -# 5 z.B. führt ein copy style compact mit 5 gleichzeitig laufenden Thread durch.

Schade das ich kein Admin mehr bin. Der nächste Upgrade der ODS wird soviel einfacher und schneller sein. Ebenfalls eine große Erleichterung bei der Einführung von DAOS, da dann auch gleichzeitig in mehreren Threads Anhänge aus den Datenbanken extrahiert werden können.

Compact mit Hilfe einer neuen Replik.

In einer sehr großen Notesdatenbank kann es passieren, dass die Note ID Tabelle  zu groß, bzw. extrem fragmentiert wird. Es kann dann zu der Fehlermeldung "Unable to extend an ID table - insufficient memory" kommen. Diese ID Table wird nur beim erstellen einer neuen Replik reorganisiert. Dieses erstellen einer neuen Replik kann nun mit dem Compact Task und der neuen Option "-REPLICA" ausgeführt werden. Dabei wird ähnlich wie beim copy style compact eine neue Replik angelegt, die mit der Originaldatenbank synchronisiert wird. Dann werden alle Verbindungen zu der Original Datenbank gedroped und auf .orig  sowie die neue auf den alten Namen umbenannt. Danach werden nocheinmal etwaige Änderungen von der orig in die neue Replik synchroniesiert. Falls die Umbennenung nicht klappt, da die Datenbank trotz drop noch immer in Verwendung ist, wird ein Trigger gesetzt, dass die Umbennennung beim Server Neustart gemacht wird. Um die "-REPLICA" Funktion zu verwenden, muss das ODS auf der neuesten Version sein. Sonst bekommt man die Fehlermeldung, dass die ODS Version zu alt ist. Zusätzlich zu "-REPLICA" kann man noch mit "-IDS_FULL X" angeben, ab welchen Prozentsatz x eine Bereinigung der ID Tabelle mit Replica durchgeführt werden soll. Mit "-REN_WAIT=X" kann angegeben werden, wie viele Minuten Domino versuchen soll die Datenbank nach dem Erstellen der Replica umzubenennen, damit ein Serverneuststart vermieden werden kann. Falls die Datenbank weiter in Verwendung ist, kann man mit der Option "-RESTART" einen automatischen Serverneustart auslösen. Beim Serverneustart wird dann die neue Replik in die alte umbenannt. Das ist praktisch bei Systemdatenbanken die permanent in Verwendung sind.

Load compact -REPLICA -IDS_FULL 50 z.B. führt ein compact mithilfe einer Replik zum bereinigen der ID-Table durch, wenn die IT-Table bereits zu mehr als 50 % voll ist.

In der Public Beta hat bei mir der Parameter "-IDS_FULL" nicht funktioniert. Er hat den Compact immer gemacht, obwohl ich es an einer ganz kleinen Datenbank probiert habe. Ich habe dieses Problem im Betaforum gemeldet.

Compact upgrade

Ebenfalls neu ist die Option -upgrade die laut Hilfe die DB Classes upgraden kann. Leider konnte ich noch nicht herausbekommen was das bedeutet. Falls da jemand Infos hat bitte um einen kurzen Kommentar.

Für weitere Infos zur neuen Version schauen Sie auch auf meine Übersicht über alle Postings zum Thema Notes/Domino 9



Wednesday, February 20, 2013

Gedanken zur Edcom Nachlese 2013

Die letzten zwei Tage war ich auf der Edcom Nachlese in München. Zwei Tage vollgepackt mit interessanten Sessions, vielen Gesprächen mit anderen Anwendern von IBM Produkten und einer gemütlichen Abendveranstaltung mit sehr gutem Essen.

Einige Punkte die ich von der Veranstaltung mitnehmen konnte:

Die Sessions zu Connections waren teilweise eher weniger besucht. Im Vergleich dazu waren die Sessions zu Neuerungen in Notes/Domino 9 so voll, dass gar nicht alle sitzen konnten. Man sieht also, dass das Interesse an Notes nachwievor sehr groß ist.

In Notes und Domino 9 gibt es noch mehr Neuigkeiten als ich bisher kannte. Vielleicht kann ich noch den einen oder anderen Blogpost dazu erfassen, wenn ich auch diese Features getestet habe.

xPages ist noch immer ein großes Thema bei der IBM, auch wenn ich nach wie vor eher skeptisch bin was xPages betrifft. Der neue Serverside Javascript Debugger von xPages in Notes 9 sieht nicht schlecht aus.  Auch die Managed Beans die man in xPages verwenden kann, sind eine gute Erweiterung der Möglichkeiten des xPages Entwicklers.

Connections ist ein interessantes Produkt mit vielen Möglichkeiten, dass aber aufwendig einzurichten und vor allem zu administrieren ist. Was sich die IBM dabei denkt, dass es keine UI für die Administration gibt und man sämtliche Administrierungstätigkeiten in XML Dateien bzw über kryptische Befehle auf der Commandline erledigen soll, erschließt sich mir nicht wirklich.

Die TimetoAct hat mit dem Connections Administration Toolkit (CAT) ein sehr interessantes Werkzeug zur Administration von Connections im Angebot, dass die Defizite der IBM ausgleichen kann.

Scott Souder und Chris Crummney haben die Keynotes gehalten und konnten eine sehr positive Stimmung verbreiten. Scott Souder präsentierte erfreuliche Nachrichten für den Bereich Notes/Domino. Die Anzahl der Kunden mit aktiven Wartungsverträge ist 2012 wieder gestiegen. 1500 Kunden die Ihre Verträge früher nicht mehr verlängert hatten, sind 2012 wieder zurückgekehrt. Ich denke Scott Souder der Notes seit Version 1 kennt, hat die Fähigkeiten die Lücke die der Wechsel von Ed Brill zur mobility Sparte hinerlassen hat zu schließen. Ein Blog von Scott, ählich dem von Ed Brill ist bereits in Vorbereitung und soll demnächst online gehen.


Scott Souder hat in der Fragestunde gemeint, dass der Designer und der Notesclient getrennt werden sollen, damit die Eclipseversion des Designer schon früher aktualisiert werden kann. Aber auch der Client soll in der nächsten Major Version nach 9 auf die aktuelle Eclipseversion gebracht werden. Dies ist mir als Pluginentwickler von sehr großer Bedeutung Ebenfalls auf meine Frage hin wurde versprochen, dass auch die Bereiche die derzeit noch im alten Design sind an die neue Designsprache angepasst werden. z.B. der Anwendungs Öffnendialog wurde von ihm explizit erwähnt. Er meinte auch, dass seit der öffentlichen Beta im Dezember noch viele Verbesserungen eingebaut wurden.

Volker Weber hat seine neuesten Handys Blackberry Z10 und Nokia Lumia 920 vorgezeigt und erklärt. Blackberry 10 sieht wirklich sehr gut aus und vor allem die perfekte Trennung zwischen geschäftlicher und privater Umgebung ist ein echtes Alleinstellungsmerkmal von Blackberry. Blackberry 10 wird vom Traveler 9 unterstützt. Ein Blackberry Enterprise Server ist für Blackberry 10 nur notwendig, wenn ich die Trennung zwischen geschäftlich und privat haben möchte. Sonst kann man das Z10 auch ohne BES betreiben. Der BES 10 ist wesentlich ressourcenschonender, da er eigentlich nur mehr ein Provider für eine sichere Verbindung ins Firmennetzwerk ist. Die eigentliche Synchronisation mit Domino erfolgt ebenfalls über Activesync und dem Traveler. Auch das Lumia 920 macht einen extrem guten Eindruck und wird ebenfalls ab Traveler 9 unterstützt. Die Kamera des Lumia ist ein echtes Highlight und macht vor allem bei wenig Licht für eine Handykamera fantastische Fotos. Auch sonst läuft Windows Phone 8 extrem flüssig und ist auf jeden Fall eine Alternative zu iOS und Android.

Alles in allem eine rundum gelungene Veranstaltung, die sich auf jeden Fall ausgezahlt hat.




Sunday, February 17, 2013

Notes ist eine relationale Datenbank!

Natürlich ist der Standardspeicher NSF von Notes nach wie vor keine relationale Datenbank und auch NSFDB2 ist schon lange kein Thema mehr. Jedoch gibt es seit der Version 8 gut versteckt im Expeditor Framework eine leichtgewichtige aber nicht desto trotz sehr leistungsfähige relationale Datenbank (Apache Derby) die über eine umfangreiche SQL Unterstützung verfügt. Diese Datenbank ist sehr praktisch, wenn man Daten lokal in einer relationalen Form ablegen will. Ein Beispiel wäre man will ein Plugin, dass normalerweise nur mit einem SQL Server funktioniert offline fähig machen. Man kann aber auch Daten aus einer NSF in die Derby Datenbank kopieren und dort dann mit SQL Auswertugen über die Daten machen die mit der Notes API nur schwer oder beinahe unmöglich sind.

Wie kann man nun Apache Derby aus einem Plugin ansprechen? Als erste muss man das Derby Plugin zu den Abhängigkeiten seines Plugins hinzufügen.


Dann kann man auch schon von seinem Code auf Apache Derby zugreifen. Der folgende Code erstellt eine Datenbank mit dem Namen testDB mit einer Mitarbeitertabelle die mit ein paar Namen befüllt wird. Nachher kommt ein Query auf die neu erstellten Daten das Ergebnis wird in eine Messagebox ausgegeben. Natürlich nicht sehr sinnvoll, aber es zeigt alle notwendigen Befehle die man für die Verwendung von Derby braucht. Natürlich wird man die Initialisierung und Erstellung der Datenbank in eine eigenes Plugin auslagern, aus denen sich dann alle Plugins die Derby verwenden wollen die Connection holen. Ebenso sollte man die stmt.execute in einer Echtanwendung durch PreparedStatements ersetzen.


try {
    // Derby Datenbankverzeichnis in das Datenverzeichnis des Plugins
    // legen.
 // Dies sollte natürlich immer das gleiche sein und am besten in ein
 // Initialisierungsplugin verlegt werden.
 System.setProperty("derby.system.home", Activator.getDefault()
   .getStateLocation().toFile().getAbsolutePath());
 // Treiber für Apache Derby laden.
 Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
 // Eine Konnection zu Apache Derby erstellen und bei Bedarf die
 // Datenbank testDB erstellen.
 Connection con = DriverManager
   .getConnection("jdbc:derby:testDB;create=true");
 // Ein SQLStatement Objekt erstellen.
 Statement stmt = con.createStatement();
 // Eine Tabelle in der Datenbank erstellen.
 stmt.execute("create table mitarbeiter (name1 varchar(30), name2 varchar(30), department varchar(30))");
 // Ein paar Sätze hinzufügen.
 stmt.execute("insert into mitarbeiter values('Ralf','Petter','IT')");
 stmt.execute("insert into mitarbeiter values('Max', 'Mustermann','IT')");
 stmt.execute("insert into mitarbeiter values('Lieschen', 'Müller','Sales')");
 // Ein Query auf die Datenbank absetzen.
 ResultSet rs = stmt
   .executeQuery("Select * from mitarbeiter where department='IT'");
 // Ergebnis verarbeiten und als Messagebox anzeigen.
 StringBuilder result = new StringBuilder();
 while (rs.next()) {
  result.append((rs.getString("name1").trim() + " "
    + rs.getString("name2").trim() + "\n"));
 }
 MessageBox box = new MessageBox(PlatformUI.getWorkbench()
   .getActiveWorkbenchWindow().getShell());
 box.setMessage(result.toString());
 box.open();
 // Mitarbeiter Tabelle wieder löschen.
 stmt.execute("Drop table mitarbeiter");
 // Derby wieder herunterfahren.
 DriverManager.getConnection("jdbc:derby:;shutdown=true");
} catch (Exception e) {
 e.printStackTrace();
}

Eine SQL Datenbank kann in vielen Projekten sehr nützlich sein und mit dem Notesclient hat man eine sehr leistungsfähige immer bei der Hand.

Saturday, February 16, 2013

Lotusscript Code aus Java plugin aufrufen

In bestehenden Notesanwendungen steckt jede Menge Lotusscript Code der über viele Jahre aufwendig entwickelt wurde, deshalb möchte man bei der Entwicklung von Plugins nicht das Rad neu erfinden, sondern bestehenden Code auch aus Eclipse plugins aufrufen. Wie dies geht möchte ich heute gerne zeigen:

Als erstes muss man die Notes API (com.ibm.notes.java.api und com.ibm.java.ui) dem Plugin als Abhängigkeit hinzufügen.

Als Beispiel habe ich eine scriptlibrary mit einer Funktion getUmsatz mit den Parametern Kundennummer und Jahr hergenommen. In der Funktion der Scriptlibrary werden aufwendige Datenbankzugriffe und Berechnungen durchgeführt, die wir in java nicht nachprogrammieren wollen.

Da man von Java nicht direkt auf die Library zugreifen kann, braucht man als erstes einen kleinen Agent der als Brücke zwischen dem Plugin und der Scriptlibrary fungiert.



Option Public
Option Declare
Use "UmsatzScriptLibrary"
Sub Initialize
 Dim ses As New NotesSession
 Dim context As NotesDocument
 Set context=ses.Documentcontext
 Call context.Replaceitemvalue("umsatz", getUmsatz(context.Getitemvalue("kundenNummer")(0), context.getItemValue("jahr")(0)))
 Print context.Getitemvalue("umsatz")(0)
 context.save True,false
End Sub


Der Agent macht nichts anderes, als dass er ein in Memory Dokument über den Dokumentcontext holt. Die Aufrufparameter für die getUmsatz Funktion ausliest und das Ergebnis der Funktion in der Variable Umsatz speichert. Natürlich konnte man den Agent auch dahingehend erweitern, dass in dem in Memory Dokument auch ein Parameter für die auzurufende Funktion mitgegeben wird und er dann die richtige Funktion aus der Scriptlibrary aufruft.

Wichtig bei dem Agent ist, dass man das Ziel auf "None" setzt. Sonst funktioniert der Zugriff auf das übergebene Dokument nicht zuverlässig.


Der Javateil ist etwas aufwendiger:


public static void berechneKundenUmsatz(String kundenNummer, int jahr) {
  try {
   // Starte den Zugriff auf den Workspace und erstelle ein
   // NotesAgentDataobjekt mit unserem Brückenagent.
   NotesUIWorkspace ws = new NotesUIWorkspace();
   NotesAgentData data = new NotesAgentData(new NotesDatabaseData("",
     "test.nsf"), "agent");
   // Füge die Aufrufparameter für die Scriptlibrary dem data Objekt
   // hinzu. Diese werden später im documentcontext als Items
   // verfügbar.
   data.addItem("kundenNummer", kundenNummer);
   data.addItem("jahr", new Integer(jahr).toString());
   // Erstelle ein Callback Objekt. die Methode done dieses Objekts
   // wird nach Ausführung des Brücken Agent aufgerufen.
   NotesDocumentDataCallback callBack = new NotesDocumentDataCallback() {
    @Override
    public void done(final NotesDocumentDataEvent event) {
     // Erstelle einen Notessessionjob in dem wir auf das
     // zurückgegebene Dokument zugreifen können.
     NotesSessionJob job = new NotesSessionJob(
       "verarbeite Ergebnis") {
      @Override
      protected IStatus runInNotesThread(Session session,
        IProgressMonitor arg1) throws NotesException {
       // Lade das Dokument, dass der Agent mit dem
       // Ergebnis befüllt hat.
       Document doc = event.getDocumentData()
         .open(session);
       // Speichere das Resultat in einer Finalen Variable,
       // dass wir es im UIThread weiterverwenden können.
       final double result = doc
         .getItemValueDouble("umsatz");
       // Mache irgendetwas im UI mit dem Resultat. In
       // unserem Beispiel eine Dialogbox anzeigen.
       Display.getDefault().asyncExec(new Runnable() {
        @Override
        public void run() {
         MessageBox box = new MessageBox(PlatformUI
           .getWorkbench()
           .getActiveWorkbenchWindow()
           .getShell());
         box.setMessage("Das Ergebnis ist: "
           + result);
         box.open();
        }
       });
       return Status.OK_STATUS;
      }
     };
     // starte den Notesjob
     job.schedule();
    }
   };
   // Führe den Agent mit dem data und callback Objekt aus. Der letzte
   // Parameter bedeutet, das der UIContext keine Rolle spielt. Das
   // heißt es ist egal auf welches Dokument im UI derzeit geöffnet
   // ist.
   ws.runAgent(data, callBack, false);
  } catch (NotesException e) {
   e.printStackTrace();
  }

 }
Das ist jetzt natürlich nur ein kleines Beispiel, bei dem der Aufwand vielleicht nicht dafür steht, aber in dem Lotusscript agent kann auch auf das UI zugegriffen werden. Das heißt der Agent kann Dialoge anzeigen und er kann auch mehrere Werte oder eine ganze Liste als Ergebnis zurückliefern. Damit kann man auch bei der Entwicklung von Plugins sehr leicht bestehenden Code wieder verwenden.

Monday, February 4, 2013

Lösen von Notes Performanceproblemen mit dem NRPC Parser

Der Notes Client besitzt eine eingebaute Tracefunktion um die NRPC (Notes Remote Procedure Call) Kommunikation zwischen einem Client und dem Server zu tracen. Leider ist das Log, dass diese Tracefunktionalität zur Verfügung stellt, etwas unübersichtlich und kryptisch. Jedoch gibt es auf OpenNTF eine Datenbank mit der man die Analyse vereinfachen kann.

Hier die Schritte um eine Performanceanalyse mit der Datenbank durchzuführen:

Downloaden Sie den NRPC Parser von OpenNTF und signieren Sie die Datenbank mit einer Developer id, damit Sie keine Probleme mit der ECL haben.

Öffnen Sie die Parserdatenbank und klicken Sie auf die

 Schaltfläche. Damit werden in Ihrer notes.ini die Einträge
  • Client_Clock=1
  • Debug_Console=1
  • Debug_Outfile=c:\Program Files (x86)\IBM\Lotus\Notes\Data\RPC.txt
  • CONSOLE_LOG_ENABLED=1
gesetzt. Diese bewirken, dass in die Datei RPC.txt  nach dem Neustart des Clients jeder RPC protokolliert wird.

Jetzt muss der Notesclient neu gestart werden und man kann die Funktion in Notes durchführen mit der man ein Performanceproblem hat. z.B. eine Datenbank öffnen, oder ein Dokument aufmachen.

Danach sollte man die Notes.ini Einträge mit

wieder deaktivieren und den Notesclient neu starten.

Danach kann man mit der Schaltfläche
die erstellte Datei analysieren lassen und bekommt dann für jeden Aufruf einer Funktion auf dem Server eine Zeile in der genau  steht was gemacht wurde, wie lange dieser Aufruf gedauert hat und wieviele Daten vom Server gesendet und empfangen wurden.


Aufwendige Operationen sind rot markiert. Die Spalte Sent gibt die Datenmenge in Bytes an die der Server gesendet hat. Die Spalte Rec'd gibt an, wieviel Daten der Server vom Client empfangen hat.

Update 11.11.2013 Wie in den Kommentaren angeführt hat Andrew Magerman eine neue Version des NRPC Parser veröffentlicht, die jetzt auch mit aktuellen Version von Notes korrekt funktioniert. Die Angabe von Debug_ThreadID=0 die man in älteren Versionen des NRPC Parsers benötigte ist daher nicht mehr notwendig. Vielen Dank für dieses Update und das fantastische Tool.











ad