Posts Tagged: ‘Quick-Tipp’

Quick-Tipp: VMware vSphere Hypervisor (ESXi): Umbenennung von VMDK-Dateien

30. Mai 2014 Posted by Thomas Bahn

Quick-Tipp
Da ich das Thema als kleiner Ordnungsfanatiker schon mehrfach hatte und mir das irgendwie nicht merken kann, obwohl es sehr einfach ist, schreibe ich es kurz in unser Blog: Wie benennt man VMDK-Dateien auf einem VMware vSphere Hypervisor aka ESXi-Server um?

Ich persönlich mag es, wenn die VMDK-Dateien einer VM sinnvolle Namen haben, etwa sda.vmdk, sdb.vmdk usw. für Linux oder Server-xxx-C, Server-xxx-D usw. bei Windows-Maschinen. So kann man auch von außen leicht erkennen, welche Datei welchem Laufwerk entspricht.

Spätestens, wenn man eine VM mit dem VMware Converter "umzieht", z. B. von einem Desktop auf einen ESXi-Server, werden sie nach dem Namen der VM benannt. Wenn man das ändern möchte, muss man in einer SSH- oder ESXi-Shell folgendes machen:
  • Die VM gegebenenfalls herunter fahren.
  • Die VMDK-Datei in den Eigenschaften der Virtuellen Maschine aus dieser entfernen.
  • Die Shell öffnen.
  • In das Verzeichnis wechseln:
    cd /vmfs/volumes/DatastoreName/VMName
  • vmkfstools -E "AlterName.vmdk" "NeuerName.vmdk"
  • Die VMDK-Datei wieder der VM zuweisen
  • Die Virtuelle Maschine neu starten

Die Umbenennung nur auf die "Basis-Datei" ohne "-flat" o.ä. anwenden. Die zugehörigen Dateien werden automatisch mit umbenannt.

Quelle:
Renaming a virtual machine and its files in VMware ESXi and ESX (1029513)

Quick-Tipp: Language Pack für IBM Domino 9.0.1 unter CentOS 6.5 x64 installieren

17. Januar 2014 Posted by Thomas Bahn

Quick-TippIBM Domino
Ich wollte gerade das deutsche Sprachpaket für den IBM Domino-Server 9.0.1 unter CentOS 6.5 x64 installieren. Leider brach der Installer - egal ob mit GUI oder in der CONSOLE einfach ohne Fehlermeldung ab.


Aber es gibt bereits eine IBM Tech Note zu dem Thema:
Domino 9 Language Pack install fails on RedHat 6 64-bit
http://www-01.ibm.com/support/docview.wss?rs=0&context=SSKTMJ&q1=language+pack&uid=swg21655030

Das RedHat Enterprise Linux (RHEL) und CentOS sind weitestgehend kompatibel, so dass die vorgeschlagene Lösung mir auch geholfen hat: glibc in der 32-bit-Version nach zu installieren.

Aber es brauchte auch noch die libgcc für diese Architektur, bis der Language-Pack-Installer wirklich lief.

Also als mit root-Berechtigung folgendes in ein Terminalfenster eingeben:
yum install -y glibc-*.i686 libgcc-*.i686

Quick-Tipp: Compact-Fehler: Unable to extend an ID table – insufficient memory

16. Dezember 2013 Posted by Thomas Bahn

Quick-TippIBM Domino
Ich habe gestern einen unserer Domino-Server auf die Version 9.0.1 in deutsch angehoben. Zu diesem Prozess gehört auch ein "Copy-Style Compact" auf alle Datenbanken von der Eingabeaufforderung aus bei gestopptem Server. Dabei ist leider ein mir bis dahin unbekannter Fehler aufgetreten:

Compacting domlog.nsf (Domino Web Server Log (6)),  -c -i -d -F domlog.nsf
Error compacting domlog.nsf,  -c -i -d -F domlog.nsf: Unable to extend an ID table - insufficient memory.
Warum muss der eigentlich überhaupt diese ID-Tabelle erweitern? Und wenn sie in die aktuelle Datenbank "gepasst" hat, warum dann nicht auch in der schlankeren Kopie?

Recovery Manager: Assigning new DBIID for /local/notesdata/domlog.nsf (need new backup for media recovery).
Compacted  domlog.nsf, 3491072K bytes recovered (85%),  -B domlog.nsf
Wunder über wunder, der Inplace-Compact mit Verkleinerung der Dateigröße läuft durch?!

Compacting domlog.nsf (Domino Web Server Log (6)),  -c -i -d -F domlog.nsf
Error compacting domlog.nsf,  -c -i -d -F domlog.nsf: Unable to extend an ID table - insufficient memory.
Aber der Copy-Style-Compact immer leider noch nicht.

Zeit für eine kurze Recherche:

Error: "...Insufficient memory" occurs when running fixup or compact
http://www-01.ibm.com/support/docview.wss?uid=swg21220384

Die beiden skizzierten Lösungsmöglichkeiten helfen mir leider nicht wirklich weiter.

Aber schließlich ist es doch auch Version 9! Und da gibt es etwas Neues:

Error: "Unable To Extend an ID Table - Insufficient Memory"
http://www-01.ibm.com/support/docview.wss?uid=swg21635439

Neu ist der Replica-Style-Compact:
Compacting domlog.nsf (Domino Web Server Log (6)),  -replica domlog.nsf
Compacted  domlog.nsf, 148992K bytes recovered (24%),  -replica domlog.nsf
Wow, nicht nur, dass der durchläuft, sondern er hat nach dem Compact -B sogar die Datenbank noch einmal um 24% verkleinert!

Compacting domlog.nsf (Domino Web Server Log (6)),  -c -i -d -F domlog.nsf
Compacted  domlog.nsf, 8704K bytes recovered (2%),  -c -i -d -F domlog.nsf
Danach läuft auch der Copy-Style-Compact wieder. Juhu!

Quick-Tipp: Umbenennung der Standardgruppen LocalDomainAdmins und LocalDomainServers

9. Oktober 2013 Posted by Bernd Garrels

Quick-Tipp
Vor einigen Tagen bin ich bei einer Migration eines Domino-Servers darauf gestoßen, dass der Kunde seine Gruppen LocalDomainAdmins und LocalDomainServers umbenannt hatte. Die Umbenennung dieser Gruppen hatte er vor einiger Zeit aufgrund einer Empfehlung vorgenommen. Mir erschließen sich die Gründe für diese Vorgehensweise nicht. Aber ich sehe eine ganze Reihe von Problemen und Gründen, warum man mit einer Umbenennung dieser Gruppen sehr vorsichtig sein sollte:

Da die Gruppen LocalDomainAdmins und LocalDomainServers standardgemäß in jeder (mitgelieferten) Datenbank verwendet werden oder verwendet werden sollten, zieht eine Umbenennung dieser Gruppen einen Rattenschwanz von Umbenennungen auf dem Domino-Server nach sich. Siehe dazu: Rename Group

Auch die meisten Dienstleister liefern ihre Notes-Produkte standardgemäß mit den Gruppen LocalDomainAdmins und LocalDomainServers aus. Wenn dann diese Schablonen so auf den Server gelegt werden, wie sie ausgeliefert werden, oder aus den nicht angepassten Schablonen Datenbanken erzeugt werden, sind die Standard-Gruppen quasi wirkungslos und Zugriffprobleme vorprogrammiert.

Bei einer Domino-Migration sollten System-Datenbanken, wie die mail.box, die log.nsf vor dem ersten Hochfahren des Servers gelöscht bzw. umbenannt werden. Diese Datenbanken werden beim Hochfahren des Servers automatisch erstellt. Hierbei erzeugt der  Domino-Server aus den in eckigen Klammern gesetzten Gruppen der Schablone die entsprechenden Gruppen, beispielsweise aus [LocalDomainAdmins] und [LocalDomainServers] die Gruppen LocalDomainAdmins und LocalDomainServers mit den entsprechend voreingestellten Rechten.

Findet der Server beim Anlegen einer Datenbank keine Person oder Personengruppe mit Manager-Zugriff, so trägt er automatisch den unter der Konfigurationseinstellung Admin in der notes.ini registrierten Administrator in die ACL ein. Findet er keinen Server oder Servergruppe mit Manager-Zugriff, so trägt er auch automatisch den unter den Konfigurationseinstellung ServerName in der notes.ini registrierten Server mit Managerrechten in die ACL ein.

Da die Schablonen während des Setup-Prozesses, also bei jeder Installation und wesentlichen Aktualisierung, im Data-Verzeichnis neu installiert werden, enthalten diese natürlich die Standardgruppen. Demzufolge müssen sie und die daraus neu erstellten Datenbanken ebenfalls entsprechend angepasst werden.


Spätestens an dieser Stelle sollte klar sein, dass eine Umbenennung der Standardgruppen LocalDomainAdmins und LocalDomainServers eine Reihe von fehlerträchtigen Nacharbeiten nach sich zieht, die ein hohes Maß an Aufmerksamkeit und Aufwand erfordern. Bleibt die Frage, durch welchen Vorteil dieser hohe Mehraufwand gerechtfertigt werden sollte.

automatische Telefonwahl über das Softphone “Phoner” aus IBM Notes heraus – eine einfache Anleitung

2. September 2013 Posted by Bernd Garrels

Phoner  ist ein Freeware-Programm von Heiko Sommerfeldt, das Gesprächsverbindungen in das Festnetz, zu Mobiltelefonen und zu VoIP-Gegenstellen ermöglicht. Das Programm kann als Softphone für analoge Teilnehmeranschlüsse, digitale ISDN-Teilnehmeranschlussleitungen oder für IP-Telefonie auf stationären und mobilen Computern benutzt werden.
Prinzipielle ist es möglich für den Phoner in einen Lotusscript-Script ein OLE Automation object "Phoner.CPhoner" anzulegen, diesem eine Nummer zu übergeben und eine Telefonruf zu starten. Dieses brachte uns auf die Idee die Widgets- und Live-Text-Funktionalität des Standard-Notes-Clients zu verwenden, um über Livetext erkannte Telefonnummern direkt für einen Telefon-Call zu nutzen.


Beschreibung der Lösung

Die Erstellung eines Notes-Widget aus einer Maske ist in der Notes-Hilfe beschrieben. Über ein solches Widget lässt sich ein Feld einer sich öffnende Notes-Maske mit der über Livetext identifizierte Telefonnummer befüllen. Prinzipiell muss abgewartet werden, bis das Widget das Feld befüllt hat. Dieses haben wir dann wie folgt gelöst:

Dim uidoc As NotesUIDocument
Dim callTimer As NotesTimer

Sub Postopen(Source As Notesuidocument)
        Set uidoc = source
        ' erstelle und initialisiere Timer
        Set callTimer = New NotesTimer(1, "rufe Telefonnummer an")
        On Event Alarm From callTimer Call CallTimerHandler
End Sub

Sub CallTimerHandler(Source As NotesTimer)
        Dim telefonnummer As String
        ' nur einmal ausführen, deshalb Timer gleich deaktivieren
        source.Enabled = False
        ' Telefonnummer normalisieren
        telefonnummer = NormalisiereTelefonnummer(uidoc.FieldGetText("Telefonnummer"))
        Call uidoc.FieldSetText("Telefonnummer", telefonnummer)
        If telefonnummer <> "" Then
                Call RufeTelefonnummerAn(telefonnummer)
                ' und Dokument wieder schließen
                Call uidoc.Document.ReplaceItemValue("SaveOptions", "0")
                Call uidoc.Close
        End If
End Sub

Function NormalisiereTelefonnummer(Byval telefonnummer As String) As String
        ' entferne Leerzeichen, /, -, ( und )
        telefonnummer = Replace(telefonnummer, Split(" , /, -, (, )", ", "), "")
        ' entferne die 0 nach der Landesvorwahl (zumindest erst einmal für die deutsche Landesvorwahl)
        If Left$(telefonnummer, 3) = "+49" And Left$(telefonnummer, 4) = "+490" Then
                telefonnummer = "+49" & Mid$(telefonnummer, 5, 100)
        End If
        NormalisiereTelefonnummer = telefonnummer
End Function

Sub RufeTelefonnummerAn(telefonnummer As String)
        Dim Phoner As Variant
        If telefonnummer <> "" Then
                Set Phoner = CreateObject("Phoner.CPhoner")
                Phoner.MakeCall(telefonnummer)
        End If
End Sub

Und siehe da, der Phoner wählt die Nummer aus dem Livetext an:

A picture named M2

Hinweis: Der Phoner sollte schon geöffnet sein.

Quick-Tipp: Automatische Telefonwahl über das Softphone “Phoner” aus IBM Notes heraus – eine einfache Anleitung

2. September 2013 Posted by Bernd Garrels

Quick-Tipp
Phoner  ist ein Freeware-Programm von Heiko Sommerfeldt, das Gesprächsverbindungen in das Festnetz, zu Mobiltelefonen und zu VoIP-Gegenstellen ermöglicht. Das Programm kann als Softphone für analoge Teilnehmeranschlüsse, digitale ISDN-Teilnehmeranschlussleitungen oder für IP-Telefonie auf stationären und mobilen Computern benutzt werden.

Prinzipiell ist es möglich für den Phoner in einen Lotusscript-Script ein OLE Automation object "Phoner.CPhoner" anzulegen, diesem eine Nummer zu übergeben und eine Telefonruf zu starten. Dieses brachte uns auf die Idee die Widgets- und Live-Text-Funktionalität des Standard-Notes-Clients zu verwenden, um über Livetext erkannte Telefonnummern direkt für einen Telefon-Call zu nutzen.
 
Beschreibung der Lösung

Die Erstellung eines Notes-Widget aus einer Maske ist in der Notes-Hilfe beschrieben. Über ein solches Widget lässt sich ein Feld einer sich öffnende Notes-Maske mit der über Livetext identifizierte Telefonnummer befüllen. Prinzipiell muss abgewartet werden, bis das Widget das Feld befüllt hat. Dieses haben wir dann wie folgt gelöst:

Dim uidoc As NotesUIDocument
Dim callTimer As NotesTimer

Sub Postopen(Source As Notesuidocument)
        Set uidoc = source
        ' erstelle und initialisiere Timer
        Set callTimer = New NotesTimer(1, "rufe Telefonnummer an")
        On Event Alarm From callTimer Call CallTimerHandler
End Sub

Sub CallTimerHandler(Source As NotesTimer)
        Dim telefonnummer As String
        ' nur einmal ausführen, deshalb Timer gleich deaktivieren
        source.Enabled = False
        ' Telefonnummer normalisieren
        telefonnummer = NormalisiereTelefonnummer(uidoc.FieldGetText("Telefonnummer"))
        Call uidoc.FieldSetText("Telefonnummer", telefonnummer)
        If telefonnummer <> "" Then
                Call RufeTelefonnummerAn(telefonnummer)
                ' und Dokument wieder schließen
                Call uidoc.Document.ReplaceItemValue("SaveOptions", "0")
                Call uidoc.Close
        End If
End Sub

Function NormalisiereTelefonnummer(Byval telefonnummer As String) As String
        ' entferne Leerzeichen, /, -, ( und )
        telefonnummer = Replace(telefonnummer, Split(" , /, -, (, )", ", "), "")
        ' entferne die 0 nach der Landesvorwahl (zumindest erst einmal für die deutsche Landesvorwahl)
        If Left$(telefonnummer, 3) = "+49" And Left$(telefonnummer, 4) = "+490" Then
                telefonnummer = "+49" & Mid$(telefonnummer, 5, 100)
        End If
        NormalisiereTelefonnummer = telefonnummer
End Function

Sub RufeTelefonnummerAn(telefonnummer As String)
        Dim Phoner As Variant
        If telefonnummer <> "" Then
                Set Phoner = CreateObject("Phoner.CPhoner")
                Phoner.MakeCall(telefonnummer)
        End If
End Sub

Und siehe da, der Phoner wählt die Nummer aus dem Livetext an:

A picture named M2

Hinweis: Der Phoner muss dazu schon vorher gestartet worden sein.

Quick-Tipp: Ein paar Tricks für BlackBerry 10 Nutzer

27. Juni 2013 Posted by Manuel Nientit

Mobile Device Management
Ich bin gerade zufällig über eine nette Liste von Tipps und Tricks zur Bedienung von BlackBerry 10 Geräten gestolpert.

Dachte, die könnte den Ein oder Anderen interessieren : Klick

Wenn hier jemand welche kennt, die da nicht enthalten sind - immer her damit .

Fehler im PostSave Event bei neuen Dokumenten

18. Juni 2013 Posted by Manuel Nientit

Lotus Notes
Kürzlich hat einer unserer Kunden die Notes-Version von 7.x auf 8.5.3 FP3 aktualisiert, was an sich eine gute Idee ist .
In Folge dessen sind zwei unserer Anwendungen auf die Nase gefallen, da es offenbar mit Notes-Versionen > 8.5.x einen Fehler im PostSave-Event gibt. Da wir in unseren Anwendungen recht selten auf das PostSave-Event überhaupt zurück greifen, ist das auch nicht vorher schon bei anderen Kunden oder Anwendungen aufgefallen.

Das Problem betrifft offenbar NotesDocument-LotusScript-Objekte von Dokumenten, die gerade erst neu angelegt wurden und vor dem PostSave das erste Mal gespeichert wurden. Offenbar ist dieses Objekt zum Zeitpunkt, in dem das PostSave ausgelöst wird, noch nicht vollständig initialisiert, so dass einige Properties oder Funktionen fehlerhafte Werte zurück geben oder gleich Fehler werfen.

Die Reihenfolge ist also folgendermaßen:
  1. Das Dokument wird neu erzeugt. Bei der Erzeugung wird im QueryOpen gemäß "unserem" Model-View-Controller-Konzept das Model mitsamt dem Document-Object erzeugt
  2. Nach einigen Eingaben wird die Speicherung ausgelöst
  3. Im QuerySave wird das Dokument validiert
  4. Das Dokument wird (nach erfolgreicher Validierung) gespeichert
  5. Im PostSave greifen wird auf Eigenschaften und Funktionen des Document-Objects zu, das wir im QueryOpen erzeugt haben. Dabei passieren die besagten Fehler.

Die folgenden zwei Fehler sind dabei konkret (in jeweils einer anderen Anwendung) aufgetreten, aber es mag natürlich noch mehr geben:

NotesDocument.NoteID gibt den Wert "0"


Wir rufen in einer Anwendung einen Agenten aus dem PostSave heraus auf, weil dieser den Out-of-Office-Agenten (oder Service) aktivieren soll. Beim Aufruf wird die NoteID als Kontext übergeben:
agent.runOnServer(source.document.noteID)
Die NoteID wird dann im Agenten selbst wieder aus dem Kontext ausgelesen:
session.currentAgent.ParameterDocNoteID
Aber - oh weh - die NoteID ist "0", so dass der Agent natürlich mit Fehlermeldung aussteigt. Das hat in früheren Notes-Versionen noch funktioniert, aber war auch mit Notes 9 noch reproduzierbar. Dass es sich hier um nicht beabsichtigtes Verhalten handeln muss, zeigt sich auch daran, dass es einen leicht krummen aber einfachen Workaround gibt. Wir holen uns die NoteID einfach mit Formelsprache:
noteID = Evaluate(|@Right(@NoteID;"NT")|, source.document)
und übergeben diese einfach an den Agenten:
agent.runOnServer(noteID(0))

Nun mag man kein Freund davon sein, Formelsprache mit Evaluate in LotusScript auszuführen, aber zumindest funktioniert es.

Fehler mit NotesDocument.CopyToDatabase


In einer anderen Anwendung werden Dokumente im PostSave (auf Nachfrage hin) in eine Archivdatenbank kopiert. Dazu nutzen wir die Funktion:
NotesDocument.copyToDatabase(NotesDatabase)
Diese Funktion wirft allerdings den Fehler "Invalid or nonexistent document". Wenn man nach dieser Fehlermeldung im Kontext mit copyToDatabase bei Gugl sucht, findet man auch. Allerdings funktioniert der vorgeschlagene Lösungsweg, den Code in das PostSave zu verschieben, eben nicht - oder nicht ohne Weiteres.
Und die Lösung dafür ist ähnlich Facepalm-tauglich, wie die Obige.
Man hole sich die UniqueID des aktuellen Dokumentes und erzeuge sich davon ein neues Notesdocument Objekt, um darauf die Operation auszuführen. Das könnte ungefähr so aussehen:
unid = source.Document.Universalid
Set newDocumentObject = notesDatabase.getDocumentByUNID(unid)
Set archiveDoc = newDocumentObject.CopyToDatabase(archiveDB)

Ich bin nicht begeistert, aber es läuft . Dieses zweite Problem war übrigens mit Notes 9 nicht mehr reproduzierbar.

Ergänzungen zu weiteren Fehlern ähnlicher Natur oder Anregungen zu Lösungsstrategien sind immer herzlichst willkommen .

Quick-Tipp: IBM (Lotus) Domino unter CentOS 6.x installieren

30. April 2013 Posted by Thomas Bahn

Quick-TippLotus Domino
Ich habe alle meine Domino-Test- und -Demo-Server in VMs installiert, die unter CentOS 6.x laufen. Diese Linux-Distribution ist dem offiziell unterstützten RedHat Enterprise Linux (RHEL)-Server 6 sehr, sehr ähnlich (sie strebt danach, 100% binär-kompatibel zu sein) und ich hatte bis jetzt noch keine größeren Probleme damit.

Es gab nur eine kleinere Ungereimtheit: Ich konnte den grafischen Installer für den Domino-Server nie starten. Alle Installationen habe ich deshalb im Konsolenmodus durchgeführt. Heute habe ich herausgefunden, dass mir lediglich ein Paket fehlte: libXp. Ein schnelles yum -y install libXp und ich kann endlich auch den grafischen Installer benutzen. Yay!  

Quelle: Domino 8.5 - Required Linux packages and updates

Quick-Tipp: Feiertage und Ferien im Notes-Kalender anzeigen

30. April 2013 Posted by Thomas Bahn

Quick-Tipp
Ich habe ja schon gezeigt, wie man sich die Wettervorhersage und den Facebook-Geburtstagskalender in seinen Notes-Kalender einblenden lassen kann, was aber noch fehlte waren die Feiertage und Ferien. Das möchte ich jetzt kurz nachholen:

Zunächst braucht man einen Dienst, der die gewünschten Informationen als iCal-Feed anbietet. Ich nehme dafür http://www.feiertage-online.de/ical/,

Ein Rechtsklick auf die Verknüpfung öffnet das Kontextmenü, in dem man "Link-Adresse kopieren" ("Adresse des Links kopieren", "Verknüpfung kopieren", o. ä.) aufruft:
A picture named M2


Im Notes-Client kann man dann in seinem Kalender einen "Kalender hinzufügen...":
A picture named M3


Im erscheinenden Dialogfenster wählt man "iCalendar-Feed", gibt eine passende Bezeichnung ein und fügt mit Strg-V die zwischengespeicherte URL in das entsprechende Feld ein. Den Rest kann man nach eigenen Gutdünken ausfüllen:
A picture named M4


Für die Ferien in Schleswig-Holstein 2013 sieht das dann ganz ähnlich aus. Schließlich sieht der Navigator im Kalender bei mir so aus:
A picture named M5


Die letzte Woche 2013 in meinem Kalender:
A picture named M6

 

Quick-Tipp: Ein Feld namens URL

26. März 2013 Posted by Thomas Bahn

Quick-Tipp
Wenn man hybride Notes-Web-Anwendungen entwickelt, auf die einige Benutzer vielleicht ausschließlich über die Web-Oberfläche zugreifen können, möchte man trotzdem ganz schnell und einfach Verknüpfungen auf die Dokumente erzeugen können, die auch von diesen nur-Browser-Benutzern verwendet werden können.

In eine klassischen Notes-Anwendung kann man über Bearbeiten - Kopieren als... - Dokumentlink (oder über das Kontextmenü via Rechtsklick) sehr leicht eine Verknüpfung in die Zwischenablage kopieren und dann z. B. in eine E-Mail einfügen.


Wenn man das bei einer hybride Notes-Web-Anwendung macht, geht das natürlich auch, die Verknüpfung ist aber für die Benutzer, die nur über die Web-Oberfläche auf diese Anwendung zugreifen sollen oder dürfen, obwohl sie aber sonst vielleicht einen Notes-Client haben, nicht so einfach nutzbar. Auch hat man keine Kontrolle darüber, wie die erzeugte Verknüpfung genau aufgebaut ist.

Aber auch dafür gibt es natürlich bei Notes eine sehr einfache, leicht zu implementierende Lösung:  

Enthält das Dokument ein Item namens URL, wird bei Bearbeiten - Kopieren als... - Dokumentlink (bzw. dem entsprechenden Kontextmenü-Eintrag) der Inhalt dieses Items in die Zwischenablage kopiert.

So kann man ganz einfach selbst eine URL zusammenbauen, sei es eine notes://- oder eine http://-URL, egal ob man damit das Dokument direkt aufruft, einen Agenten oder gar eine XPage, und ob man das Dokument direkt referenziert oder  z. B. den eindeutigen (fachlichen) Schlüssel des Dokuments als Parameter übergibt.

Wenn man dann doch mal eine "normale" Notes-Verknüpfung braucht, kann man - wie auch sonst immer - einfach den Reiter des Dokuments in das gewünschte Notes-RichText-Feld ziehen.

Quick-Tipp: Dynamisches HTML in Notes-Masken

21. Februar 2013 Posted by Thomas Bahn

Quick-Tipp
Ein Punkt in der Wunschliste eines Notes-Entwicklers brachte mich zum Nachdenken: Ist es möglich, in einer Notes-Maske dynamisch HTML, z. B. eine Tabelle, zu berechnen und darzustellen? Gibt es einen Weg, den HTML-Teil zu aktualisieren, während das Dokument offen bleibt?


Das ist, wenn man den letzten Punkt nicht beachtet, ziemlich einfach:
  • Erstelle eine Maske mit ausgewählter Option "Render pass through HTML in Notes"
  • Erstelle einen Berechneten Text, in dessen Formel das HTML berechnet wird, und markiere den Absatz (im Text-Menü) als "Pass-Thru HTML".
Das war's schon.

Wenn du jetzt ein neues Dokument mit dieser Maske erstellst, wird das HTML berechnet und dargestellt. Wenn du ein vorhandenes Dokument öffnest, kann du sogar die Items des Dokuments in der Formel des Berechneten Textes benutzen.

Aber - und das ist jetzt ein großes ABER: Das HTML wird nur neu berechnet und dargestellt, wenn die Maske geöffnet wird; es wird nicht aktualisiert, wenn sich die Feldwerte im Dokument ändern.

Und es gibt eine Lösung für dieses Problem:
Folgende Schritte sind dazu notwendig:
  • Erstelle eine Maske mit gesetzter "Render pass through HTML in Notes"-Eigenschaft:

  • Erstelle ein "Berechnet zur Anzeige"-Textfeld namens "SaveOptions" mit "0" als konstantem Wert:

  • Erstelle ein "Berechnet beim Anlagen"-Textfeld namens "Form" mit dem Namen (oder dem Alias) der Maske als konstantem Wert:

  • Erstelle einige weitere Felder auf der Maske, deren Werte später benutzt werden können. Danach füge einen Berechneten Text hinzu und markiere den Absatz (im Text-Menü) als "Pass-Thru HTML":

  • In seiner Formel berechne das gewünschte HTML, z. B. eine HTML-Tabelle ähnlich dieser:

  • Und jetzt kommt die Magie: Füge eine Schaltfläche, eine Aktion, eine Prozedur (z. B. im Exiting-Ereignis) mit folgendem  LotusScript-Code hinzu:

Ein Verweis auf das aktuelle Backend-Dokument (NotesDocument) wird in der doc-Variable zwischengeparkt (ohne das es richtig in der Datenbank gespeichert wird!), dann wird das geöffnete Frontend-Dokument (NotesUIDocument) geschlossen und das Backend-Dokument doc wieder neu geöffnet.

Das "Form"-Feld ist notwendig, damit der Notes-Client weiß, in welcher Maske das Dokument wieder geöffnet werden soll. Es wird beim Speichern automatisch erstellt, da wir aber das Dokument hier nicht speichern, müssen wir selbst dafür sorgen.

Das "SaveOptions"-Feld ist wichtig, damit der Benutzer beim Schließen des Dokuments nicht gefragt wird, ob der das Dokument speichern möchte.
  • Um das Dokument zu speichen, müssen wir daher das Feld vorher entfernen:


Du kannst eine sehr kleine Beispiel-Datenbank mit der gezeigten HTML-Maske hier herunterladen: DynamicHTMLInNotes.zip.

Quick-Tipp: Traveler Problem(e) bei Update auf Android 4.2 (Jelly Bean) mit IF2 gelöst

20. Dezember 2012 Posted by Manuel Nientit

Bei uns ist gerade vor einer Woche ein Problem aufgetreten, das bei IBM offensichtlich schon bekannt und gelöst ist.

Wenn ein Android-Gerät, bei uns ein Samsung Galaxy Nexus, das mit einem Traveler-Server der Version 8.5.3.x synchronisiert, auf die im Moment aktuellste Version 4.2 (JellyBean) aktualisiert wird, kann es danach zu dem Problem kommen, das hier unter Issue #1 beschrieben wird.

Das Gerät löscht alle synchronisierten Daten und fragt dann nach einem Passwort, um einen erneuten Prime-Sync durchzuführen. Dummerweise sind wir dann in einer Endlosschleife gelandet, die erst durch Aktualisierung des Traveler-Servers mit dem Interim Fix 2 für Traveler 8.5.3.3 beendet werden konnte. (Suche und finde hier)
Zum Glück ist das denkbar unkompliziert.

Ich kann an dieser Stelle nur die dringende Empfehlung aussprechen, beim Traveler-Server selbst bei den Punk-Punkt-Punkt-Releases immer auf dem Laufenden zu bleiben. Mit jedem dieser Releases werden nicht nur Probleme behoben, sondern auch immer neue Funktionen hinzugefügt. Das geht noch schneller als neue Android/iOS Betriebssystemversionen erscheinen.

Quick-Tipp: Weißt du, was deine App letzten Sommer getan hat?

20. September 2012 Posted by Thomas Bahn

Quick-Tipp
Auch wenn iOS 6 Verbesserungen beim Datenschutz bringt bzw. bringen wird (oder auch nicht, wenn man ein zu altes iDevice sein eigen nennt): Generell haben Apps unter iOS, also auf iPhones, iPads und iPods, normalerweise recht weit reichende Rechte. Sie können z. B. auf die Kontakt zugreifen, ohne dass man es ihnen erst explizit erlaubt hätte, oder Daten zum Hersteller oder gar beliebig ins Internet senden.

Wäre es nicht toll, wenn man vor der Installation einer App nachschauen könnte, was die so tun wird? Wenn es ein Verzeichnis gäbe, wo ganz viele Apps mit ihren "Risiken" aufgelistet wären?

Bitdefender, bekannter Hersteller von Anti-Viren-Programmen, hat sie die Mühe gemacht, genau so einen Katalog aufzubauen und der Allgemeinheit kostenlos zur Verfügung zu stellen: Clueful - Really know your iOS apps.

Quick-Tipp: E-Mails per POP3 (oder IMAP) abholen und per SMTP an Domino-Server zustellen

18. September 2012 Posted by Thomas Bahn

Quick-Tipp
Manchmal kommt es vor, dass man E-Mails nicht direkt per SMTP aus dem Internet empfangen will (Sicherheit) oder kann (z. B. kein Zugriff auf MX-Eintrag bei Domänen-Provider). Dann kann man entweder die E-Mails mit dem Notes-Client abholen oder man verwendet ein Hilfprogramm wie fetchmail, um die E-Mails per POP3 oder IMAP beim Provider abzuholen und dann (im lokalen Netz) per SMTP an den Domino-Server zu senden.

Wenn man sowieso einen Linux-Server am Laufen hat, bietet es sich an, Fetchmail aus der Distribution zu installieren. Hat man jedoch nur Windows-Server oder man möchte das Verfahren auf einem Windows-Desktop oder -Notebook implementieren, hat man ein Problem: Es gibt keine native fetchmail-Version für Windows. Aber zum Glück gibt es Cygwin für solche Fälle...

Zunächst muss man den aktuellen Cygwin-Installer herunterladen und installieren:
 
A picture named M2

A picture named M3

A picture named M4

A picture named M5

A picture named M6

A picture named M7


Eine Download-Site möglichst in der Nähe auswählen:
A picture named M8

A picture named M9


Wenn man unter Search den Namen, hier also "fetchmail" eingibt, wird die Liste gefiltert. Mit einem Linksklick auf "Skip" in der Spalte "New" schaltet man die Installation der aktuellen Version an und die Versionsnummer wird in der Spalte "New" angezeigt.
A picture named M10

Bei der Gelegenheit kann man noch andere Linux-Programme, wie z. B. den Editor "nano" und den Archiver "bzip2" auswählen und mit installieren.
A picture named M11



Als nächstes konfigurieren wir fetchmail. Wie unter Linux üblich, geht das über eine einfache Text-Datei, die man z. B. mit "nano /etc/fetchmailrc" anlegt und gleich zum Bearbeiten öffnet:
 
# globale Optionen
set postmaster "postmaster@assono.de"


# Vorgabekonfiguration für alle Polls
defaults
# Server-Optionen
protocol pop3
# User-Optionen
to "tbahn"
smtpname "tbahn@assono.de"
smtphost "smtp.assono.de"


# 1. Poll
poll "pop.gmx.net"
# Server-Optionen
uidl
# User-Optionen
username "******@gmx.de"
password "**********"
sslfingerprint "A6:57:BC:4A:97:AD:DB:99:00:E9:3A:B8:81:55:D7:B6"
# keep

# 2. Poll
poll "pop.web.de"
# Server-Optionen
uidl
# User-Optionen
username "******@web.de"
password "**********"
sslfingerprint "48:FC:ED:0A:EB:4F:DF:A3:F3:4A:C5:DB:8B:E4:D6:6A"

Da in dieser Datei Passworte gespeichert werden (müssen), verlangt fetchmail zur Sicherheit, dass nur der Besitzer (Owner) selbst darauf zugreifen kann, also: chmod 600 /etc/fetchmailrc im Cygwin-Terminal eingeben.

Ganz zu Beginn stehen die globalen Optionen. In diesem Fall nur die Einstellung postmaster: Wenn fetchmail nicht ermitteln kann, an wen eine E-Mail gehen soll, wird sie Notfalls an diese Adresse geschickt.

Im Abschnitt defaults können Voreinstellungen für alle Polls, d.h. alle Server und Benutzer, von bzw. für die E-Mails abgeholt werden, definiert werden.
Hier hole ich also immer per POP3 ab (protocol, IMAP ginge auch) und alle E-Mails sind für Benutzer "tbahn" (to), werden an "tbahn@assono.de" gesendet (smtpname) und dafür wird der SMTP-Server smtp.assono.de (smtphost) verwendet.

Der erste Poll soll vom Server pop.gmx.net gemacht werden.

Die Server-Option uidl besagt, dass die gelesen-Markierungen client-seitig verwaltet werden sollen. Greift man abwechelnd mit mehreren Mail-Clients auf das POP3-Konto zu, werden E-Mails, die mit einem anderen Client gelesen wurden, auf dem Server als gelesen markiert und würden ohne diese Einstellung nicht mehr von fetchmail abgeholt werden.

Die Benutzer-Optionen username und password sind wahrscheinlich klar, nur sslfingerprint ist wohl erklärungsbedürftig.
Wenn man nichts anderes angibt (wie ich hier), wird eine unverschlüsselte POP3-Verbindung aufgebaut und danach versucht, mittels STARTTLS auf eine verschlüsselte Verbindung umzustellen. Dabei wird auch das SSL-Zertifikat vom Server heruntergeladen und verifiziert. Das hat bei mir nicht geklappt, da die übergeordneten Zertifikate nicht vorlagen. Statt diese zu besorgen und im richtigen Verzeichnis abzulegen, habe ich nur den SSL-Fingerabdruck ermittelt und in die Konfiguration eingetragen. Jetzt wird der Fingerabdruck des Servers mit dem in der Konfiguration verglichen und nur E-Mails abgeholt, wenn er übereinstimmt. So beuge ich Man-in-the-Middle-Attacken vor.

Mittels der auskommentierten keep-Option wäre es möglich, die abgeholten E-Mails auf dem Server zu belassen. Ohne diese Einstellung werden abgeholte E-Mails gelöscht.

In einer Konfiguration können beliebig viele Polls, also Server, und pro Server beliebig viele Benutzer abgefragt werden. Für Details sei auf die Hilfeseiten und die FAQ des fetchmail-Projekts verwiesen. Auch Sammelpostfächer, die E-Mails von verschiedenen Benutzern gleichzeitig enthalten, sind möglich (siehe Multidrop Mailboxes auf den Hilfeseiten).


Als Nächstes erstellen wir ein Shell-Skript, um fetchmail bequem aufzurufen und dabei gleich die Protokolldateien zu verwalten. Ich baue dabei auf die Arbeit von Andreas Rehm, ITsolution² auf, dem ich hiermit vielmals für seine großartige Arbeit danken möchte.

Also: nano /usr/bin/fetchmail.sh:
 
#!/bin/bash
# fetchmail.sh:Andreas Rehm ITsolution², Thomas Bahn <tbahn@assono.de>
# Stand 0.3
#
# Diese Script muss mit einer bash/cygwin oder auf einem Unix Rechner
# gestartet werden.
# Es wird automatisch pro Tag ein Logfile angelegt.
# Es wird nur einmal fetchmail gestartet, wenn es bereits läuft wird
# abgebrochen.
# Archivierung alter Logfiles nach 7 Tagen mit bzip2 und automatische
# Löschung nach einem Jahr.
#
# Bitte beachten: Sie brauchen fetchmail und bzip2
#
# Geplant für die nächste Version:
#
###########################################################################
# History
# V0.1 - Initiale Version
# V0.2 - Fehlerbereinigung Löschen alter Logdateien
# V0.3 - Anpassungen von Thomas Bahn
#          Protokolle in /var/log
#          -v (verbose) bei fetchmail-Aufruf
#
###########################################################################

# Abbruch, wenn fetchmail noch läuft
ps -a | grep fetchmail && exit;

# Start
echo "Starte E-Mail-Abholung"

# Neue Logdatei ja / nein
NEWLOGFILE=0

# Log-Datei erstellen - LOGDATE ist das aktuelle Datum
LOGDATE=`date +'%Y-%m-%d'`
# Logdir ist der Ordner mit den Logdateien - dieser wird ggf. erstellt
LOGDIR='/var/log'
# Logfile ist die Logdatei, die sich aus den vorhergehenden Daten zusammensetzt
LOGFILE="${LOGDIR}/${LOGDATE}-fetchmail.log"

# Logdir erstellen wenn nötig
if [ ! -d ${LOGDIR} ]
then
       echo "Erstelle Logdir = ${LOGDIR}"
       mkdir -p ${LOGDIR}
fi

# Logfile anlegen, da sonst fetchmail kein Log schreibt
if [ ! -f ${LOGFILE} ]
then
       echo "Logdatei ${LOGFILE} erstellen..."
       touch ${LOGFILE}
       NEWLOGFILE=1
fi

# Anfang protokollieren
DATE=`date +'%d.%m.%Y %H:%M:%S'`
echo "Start der E-Mail-Abholung am ${DATE}" >> ${LOGFILE}

# E-Mail abholen
fetchmail -v -f /etc/fetchmailrc -L ${LOGFILE}

# Ende protokollieren
DATEEND=`date +'%d.%m.%Y %H:%M:%S'`
echo -e "Ende der E-Mail-Abholung am ${DATEEND}\n" >> ${LOGFILE}

# Logrotation wenn eine neue Datei angelegt wurde
if [ "${NEWLOGFILE}" == "1" ];
then
       # Dateien die älter als 7 Tage sind werden komprimiert
       find ${LOGDIR} -name \*.log -ctime 7 -exec bzip2 {} \;
       
       # Dateien die älter als 365 Tage sind werden gelöscht
       find ${LOGDIR} -name \*.log.bz2 -ctime 365 -exec rm {} \;
fi


Ein Shell-Skript muss ausführbar sein, also: chmod 755 /usr/bin/fetchmail.sh im Cygwin-Terminal eingeben.

Es bleibt der regelmäßige Aufruf des Shell-Skript, wofür es unter Windows 7 die Aufgabenplanung gibt:
 
A picture named M12


Dort kann man eine neue Aufgabe erstellen:
 
A picture named M13

A picture named M14

A picture named M15

A picture named M16

A picture named M17


Programm: C:\cygwin\bin\mintty.exe
Argumente: -h error -e /usr/bin/bash --login -i /usr/bin/fetchmail.sh
 
A picture named M18

A picture named M19


Der Start der Aufgabe macht nur Sinn, wenn überhaupt eine Netzwerkverbindung besteht.
 
A picture named M20


Man kann die Aufgabe dann einmal gleich ausführen lassen und im Cygwin-Terminal mit less /var/log/*-fetchmail.log nachschauen, wie es denn so lief.