jump to article
...intermittent thoughts

so zeigt man Professionalität

Image:so zeigt man Professionalität

gesehen nach der Support-Zufriedenheitsumfrage von Pinnacle. Die selbst war übrigens auch ganz lustig - wirklich schlechte Bewertungen sind nicht zugelassen - das hilft der Tendenz....

URLs fixed

After fixing the page name generation in the application behind this website I had a look into the articles I had already written and found some elder articles with a malformed pagename causing all links to be broken, URLs to be generated wrongly and other silly phenomenons. Well, to fix that I did not even needed to code an agent, because it were only 10 or 15 documents. I just created a new View, generated some "intelligent" @Formula in column one and got all the bad documents were automagically listed in a category showing me those documents having an ä,ö,ü or ß in the pagename. After that, I simply needed to open the documents and to resave them.

It has not even a dark side - creating links to those malformed pagenames was impossible (unless you actually only did it and took the pill of having dirty html), so nobody is hurt by the changed pagenames and links in this site.

Binary Conversion using Val()

The other day I was playing around with number system conversions in LotusScript. It came to the point I was converting a 32 bit binary value to a decimal long. By defintion long is a 32bit signed integer value in LotusScript. That means the 32nd bit is used to inidcate if the number represents a positive or negative number. Knowing that I was pretty sure I only need to take care for the 32nd bit in the binary representation I wanted to convert:
Val ( "&b00000000000000001000000000000000" )

should return 32768.
My surprise was high when I got the result form that statement: -32768.
After sticking around for quite a bit of time, I realized this number is exactly the end of the Integer datatype representable number range. The LotusScript Integer datatype is defined to be a 2 bytes signed integer value, leading to a representable range from -32768 to 32768. Then it hit me. Val() seems to be trying to convert a number to the smallest fitting datatype and then returning it as a double value. In this particular case
Val ( "&b00000000000000001000000000000000" )

looks like requiring only the first 16 digits of the boolean value, that is only two bytes. By LotusScript defintion, only the Integer datatype uses two bytes. The LotusScript Integer is a signed datatype and there's now unsigned 2 bytes datatype in LotusScript. So if you assign this value to a LotusScript Integer variable, the 16th digit is representing the sign bit and the other 15 are representing the real number. The first fifteen bits are set to zero so they represent a zero. Adding the sign bit to that number leads to the lowest possible representable number in a two byte signed integer: -32768.
Well, that was the reason. Now that I kew that I just needed a way to make sure, the value is positive and a long value. At first I was thinking about checking the return value of Val, but then realized this must be way too much work for just converting a value from one number system to another. There must be another way to do that: Finally I found the way to do that: simply add a datatype shortcut to the binary expression and the Val Function gets a directive to convert the value to the appropriate datatype. See the overview of how to accomplis this:
DatatypeLotusScript ShortcutExample
Integer%
Val ( "&b00000000000000001000000000000000" + "%" )
Long&
Val ( "&b00000000000000001000000000000000" + "&" )
Single!
Val ( "&b00000000000000000000000000001000" + "!" )
Double#
Val ( "&b00000000000000001000000000000000" + "#" )


Suchmaschine umgestellt

Nachdem ich nun den ganzen Tag an der Seite gebastelt habe und so einiges hier angefasst habe, ist zuguterletzt auch die Suchmaschine nicht verschont geblieben. Ich habe einfach festgestellt, daß die anwendungseigene Suchmaschine schicht nicht funktioniert und eigentlich auf jede Anfrage 0 Treffer sendet. Normalerweise eine Herausforderung, der ich mich stelle - wäre nicht die erste Scuhe, die ich in einer Notes-Datenbank repariere. Ein kleiner Blick in den Suchmechanismus hat mich dann aber dazu gebracht, die Sache nicht weiter anzusehen und fürs erste lieber Google als Suchmaschine einzublenden - nichts für einen entspannten Sonntag Nachmittag.

Die Suchergebnisse kommen nun über Google, d.h. nicht im selben Layout und in Sachen Index ein wenig verzögert. Alleridngs schreibe ich ja nun auch nicht so häufig, dass dadurch infromationen von der Suche ausgeschlossen wären... Vielleicht nehme ich mir aber den Suchmechanismus doch noch einmal vor...

more work on the database

Today was another day to work on the blog. I changed the XHTML construct of the page to make it better readable to non CSS devices. Unfortunately that broke up the CSS. So I fixed that too. After replicating that I was quite happy and told some friend about it. His answer was shocking: he told me it looks abominable. Well, it turned out, he was using Internet Explorer and the CSS was not able to display the CSS I generated (don't knwo why I was on the idea, my CSS would work on IE - maybe because the changed values were that simple). Unfortunately I had no safe copy anymore. So I had to fix the messed layout for InternetExplorer too. I was not that lucky :-( Well, you are able to see the page but it looks much better on Firefox. I think I will need another session on my CSS.

The other thing was some more work on the Client functions. My new pagename function had a stupid bug, forcing every pagename to start with an underscore. In addition to that fix I extended the handling class and have put some more functions into it. My client form now does everything in the object and does not require to allocate new objects all the way - again a slight performance improvement.

valid again

Today I did some work in the application design of this database. The main background: the last article, showing a LotusScript Source was dispalyed quite malformed. In addition I found myself being angry about the invalid XHTML of tis site - I was certain it had been valid a while ago. Pretty annoying to me. So I decided to have a look for it.

With a cup of coffee and a spare morning, I started to investiagte the reason for the malformed html. First goal: get the LotusScript-Source formatted correctly. It turned out, Julian Robichaux incredible ls2html library worked very well but the input was terribly wrong. In succession to this the code had to be malformed. So I started a deeper investigation and after a short time I found the reason - somewhere in the deep deep backend of this system, the pages source is retrieved from a MIME enabled RichTextField. The values retrieved from that field are randomly salted with newlines. Unfortunately one of these random newlines was placed just in the middle of a comment line of my LotusScript example, causing the ls2html library to correctly interpret all characters after that newline as a new LotusScript line and so colorize it as if they were normal LotusScript statements - very odd. My solution was simple: remove any CRLF character from the source, replace every br tag by the same br tag plus a CRLF and get happy again.

Unfortunately the HTML was still not valid - but since I managed to remove more than 160 of the complained errors I was quite certain to get the rest done too.

The next complained errors were the links in the source. The were all invalid because none of them used quotes for enclosing its attribute values. Well, quotes are mandatory for values, at least if you are going to produce something else than loose HTML 4.0.1. So I wrote a little function to parse the links from the source and to assure the're valid. This function will be able to parse any link and assuere it's a valid one now - well, as long as it contains attributes, valid for an a tag after the W3C specification.

I then found one some more errors on the page and found out, it was always the pagename value of some of the stories I had written. All these pagename values had special characters in them. Because of my first language, tehy were umlauts. I then had a look into the programming behind these values - and saw the original author of this template fell into the same trap as we did with our Web Applications in the office before: he parses some values and replaces them by special tags. While this is ok for a native english speaker, this algorithm is simply wrong. If you are using special characters in your language like in German, Swedish or Danish, you always find one more character not being replaced by this algorithm. The right way to accomplish this, is of course to parse the text and leave only those characters allwoed by URLS - and these are even fewer than the first 127 of the US-ASCII charset. So changed this and added some more efficient way to work with the backend document in the Notes client. This would be a help for the IBM Blog added to Domino 7.0.2 too - because it has the same problem.

As a result, this page is valid again, and working in the client is much more fluent because faster :-)

Image:valid again

Existence of a Notes Encryption Key

Today I was enhancing an existing application which requires an encryption key to work correctly. One of the problems to fix was how the application responded if that required encryption key was missing: the application stopped with an error message showing a callstack. While this was very bad, I was not that much concerned, because the application is used only by some of my developer colleagues. Well, thats no excuse for a runtime error, but I know they are not that shocked like an enduser if they see an error message.

Tho fix the problem I simply had to check, whether the current user has the required encryption key or not. To accomplish that simple sounding demand I checked the Designer Help but did not find a solution. So I asked the Google oracle but it came up with tons of PGP stuff and I got bored very fast. I then asked Daniel but he he also had no prompt answer (but an idea). While chatting about it, I came to a solution - I want to share with you. It's a simple function you may use in your own Scripts. With that function, it is possible to ask if the current user has the encryption key given by the only on eparameter of the function. It retunrs only true or false - so it is really simple to use:


Private Function IsEncryptionKeyAvailable( Byval key$ ) As Boolean
'/**
' * Checks whether the current user has an Encryption Key or not
' * check results are cached during runtime of the module, so multiple requests to the same key are very performant
' * @param key the name of the Key to check
' * @error Every Error is thrown by the repeater callstack technique
' * @author Michael Gollmick
' * @Version 1.0
' */
On Error Goto Repeater

Static doc As NotesDocument
Static encryptionkeyList List As Boolean
Dim it As NotesItem
Dim keyIndex$
Dim s As NotesSession
Dim testValue As Boolean

key = Trim( key )
If Len( key ) = 0 Then
IsEncryptionKeyAvailable = True
Exit Function
End If

keyIndex = Ucase( Key )
If Not Iselement( encryptionkeyList( keyIndex ) ) Then
' we did not check this key yet, so we do it now!
If doc Is Nothing Then
Set s = New NotesSession
Set doc = New NotesDocument( s.CurrentDatabase )
Set it = doc.ReplaceItemValue( "Key", "" )
it.IsProtected = True
it.IsSigned = True
it.IsEncrypted = True
End If
doc.EncryptionKeys = key
Call doc.Encrypt
' if the previous line did not throw an error, we have the key,
' so we set the test value top true (which defaults to false)
testValue = True
KeyNotAvailableForUser:
' if we have run into an error, testValue is still on false and we can store that value      
encryptionkeyList( keyIndex ) = testValue
End If

' now that we surely have the requested key in the list, we return it from the list
' that's slightly slower than returning from within the code, but is better readable and
' maintainable
IsEncryptionKeyAvailable = encryptionkeyList( keyIndex )

Exit Function
Repeater:
If Err = 4000 Then Resume KeyNotAvailableForUser
Error Err, Error & {
::}
& Getthreadinfo(1) & {():} & Erl
End Function


The function is quite handy - results are even cached, so calling it several times with the same key is quite performant (lists used the right way are sooo performant). Well, some parts could possibly be even more performant (we speak about just a few CPU ticks) but I have chosen the current coding style to keep it readable for others.

Simply copy, paste and use it - but drop me a note then.

eine ernstgemeinte Lösungsstrategie

Vor kurzen hatte ich mich mit Problemen an den Hersteller eines DVB-T-Sticks gewendet. Das Problem ist an sich ganz leicht beschrieben: die Software läuft äußerst instabil und die von der Anwendung installierten Background-Tasks stürzen ab, ohne das jemand am Computer arbeitet oder die Anwendung auch nur gestartet ist. Zudem hat die Software derartige Reaktionslatenzen, dass sie auch im der letzetn c't-Test unangenehm aufgefallen ist (leider hatten alle Windows-Programme dieses Problem).

Nach numehr mehr als einer Woche seit meiner Anfrage hat sich der Hersteller doch wieder bei mir gemeldet und allen ernstes folgenden Lösungsvorschlag:

Laut der Systeminformation beenden Sie bitte Antivierenprogramme, Hintergrundprogramme und andere alle Anwendungen, die automatisch starten und für Windows nicht notwendig sind. Gehen Sie bitte wie folgt vor:
1. Drücken Sie gleichzeitig auf STRG-ALT-ENTF.
2. Öffnen Sie die Registerkarte "Prozesse"
3. Beenden Sie alle Prozesse, die Ihren Benutzernamen haben (außer taskmgr.exe und explorer.exe)
Die anderen Prozesse (SYSTEM, LOKALER DIENST, NETZWERKDIENST) sollten Sie NICHT beenden.


Zudem war noch folgende nette Nachricht in der Mail, die nicht einmal eine Anrede (geschweige denn eine persönliche) enthielt:
Wenn wir innerhalb der nächsten 48 Stunden nichts von Ihnen hören, werden wir das Problem als gelöst einstufen.


Ja, genau so macht man das:
1. den Kunden mit kostenpflichtigem Support möglichst abhalten, sich zu melden
2. wenn er trotzdem clever ist und Support beansprucht, ihn für dioese Unverschämtheit mit inkompetenten unfreundlichen Mitarbeitern abstrafen
3. wenn er es trotzdem schaffen sollte, einen der wenigen bemühten Mitarbeiter zu finden und eine Anfrage im Support-Prozess einzunisten, ihn unendlich lange warten lassen und mit einer fehlerhaften Antwort aus der Knowledgebase abspeisen.
4. Dem Kunden natürlich wesentlich weniger Zeit geben, auf diese Mail zu reagieren und im Nichtreaktionsfall die Sache als gelöst einstufen

Ich wette, die haben derartig dramatisch viele gelöste Benutzerprobleme pro Jahr, dass sich die Support-Abteilung krankfeiert weil sie so unglaublich gut sind...

Keyboard Lock on a Blackberry Pearl

When I got a brand new Blackberry Pearl this week, I first missed the user guide for the device. Ok, there is one but that is not worth the word guide - it simply helps you in starting the device for the first time and nothign more.

What was more important to me was how to lock the keyboard of the Blackberry Pearl manually. I found the program to do that but I could not believe this is the solution of choice intendet from RIM -  simply too many steps to do that, who would ever run through the underground doing some stuff with the device and then call Applications, look up the Screen Lock application, start it and the wait a couple of seconds to see if the screen really turns off just to put the device back to the pocket in a locked state?

Well I the found out about a small application called AutoLock - quite handy and working on the Pearl too. It locks the device after the screen has turned off from itself (that time is set in the preferences). Well taht piece of software does, what I wanted, but not really in teh way I wanted. But it was quite little help for me.

Then yesterday I tried some other key combinations for a different purpose. When I hit the symbol key (that one with the star on it) for more than one second - the device suddenly turned the screen off. Another press and it came back with the call to unlock the keyboard. Et voilà - that was the seeked secret!

It then turned out, the locking mechanism does not work in every application. It seems to work from mail application and from the start screen which is enough for me and does also make sense.

Remember:
To lock the keyboard of a BlackBerry Pearl, simply press the SYM-Key for more than a second.

Microsoft .NET Framework v1.1.4322 Update

Seit dem letzten Update von Microsoft bekomme ich leider bei jedem Versuch, meinen Laptop in den Ruhezustand zu versetzen die Meldung:

Der Dienst "Microsoft .NET Framework v1.1.4322 Update" verhindert, dass der Computer in den Ruhezustand wechselt. Versuchen Sie, den Dienst anzuhalten, und wiederholen Sie den Vorgang.

Die Meldung ist ausnahmsweise mal halbwegs aussagekräftig, die Schaltfläche OK da drauf find ich aber mal wieder einen echten Brüller! Was soll daran bitte ok sein? Ein logisch denkender Mensch würde doch nun erwarten, dass man nun die Möglichkeit bekommt, diesen komischen Dienst zu deaktivieren. Statt dessen wird mir als Enduser aber zugemutet auf Start->Einstellungen->Systemsteuerung->Verwaltung->Dienste zu gehen, den Dienst schön selber aus der Liste herauszusuchen und ihn dann zu stoppen. Ich vermute mal, wenn ich mein XP aus Sicherheitsgründen mit eingeschränkten Nutzerrechten laufen lassen würde, würde ich das gar nicht können...

Also als erstes mal bei Microsoft angerufen. Die haben mich wie nicht anders zu erwarten an Lenovo verwiesen, weil die ja den Laptop mit Windows XP ausgestattet haben. Ganz klar, ich bin mir auch ganz sicher, dass sich Lenovo unglaublich freuen wird, die Software von Microsoft zu unterstützen - üblicherweise bekommt man ja in letzter Zeit noch nicht einmal mehr für die Lenovo-eigene Software Support wenn man nicht einen zusätzlichen Supportvertrag abschließt, der die besonderen Option des Software-Supports enthält. Ob ich da jetzt anrufe, werd ich mir noch überlegen - normalerweise sind die Leute dort sehr freundlich, aber in einem solchen Fall befürchte ich den durchaus ernst gemeinten Vorschlag doch einmal die Produkt-Recovery durchzuführen...

Leider weiss ich ja auch nicht wozu dieser Dienst gut ist, vielleicht wärs ja ne sinnvolle Option, den zu deaktivieren, wie so viele andere Dienste auch...

Naja, da mich das ganze ja wohl des öfteren nerven wird, habe ich mir vorsorglich eine kleine Batch-Datei geschrieben, die ich mir auf den Desktop gelegt habe.

DotNetFlawHibernate.cmd


Diese Datei hat eigentlich nur einen Befehl:
net stop "Microsoft .NET Framework v1.1.4322 Update"

Aber zumindest spar ich mir damit die Klickorgie...

a new Home

Today this blog got a new home. We finally managed to move this database from its old server to a bigger machine, running a newer Domino release and being better monitored than the old one (that was just a development server, so monitoring was not that important for the machine). First experience shows up quite a reasonable speed improvement - wohoo! ;-)

Pinnacle Support

gerade eben habe ich erfahren können, wie sich Pinnacle lästige Kunden vom hals hält - eigentlich keine schlechte Idee:

Auf der WebSite von Pinnacle ist ausschließlich ein Support übers Web zu finden - als Gegenleistung muss man natürlich seine kompletten Daten hinterlassen. Nach aufwändigem suchen findet man endlich eine Telefonnummer in München, bei der man allerdings nur weiterkommt, wenn man die Zentrale aufruft - alle anderen Optionen führen leider ins Leere (Montag 14:00 Uhr: Sie rufen außerhalb unserer Geschäftszeiten an...) Die Zentrale hingegen wird von einer wirklich freundlichen Dame repräsentiert. Sie kann tatsächlich auch ein wenig weiterhelfen - mit der Nummer der technischen Hotline für Pinnacle Produkte. Leider ist die durchaus sehr teuer und zudem von meinem Anschluss aus gesperrt. Allerdings weiß sie auch dafür eine Hilfe: eine Nummer in Frankfurt, die man allerdings nicht anrufen kann ohne vorher bei Pinnacle einen Service-Voucher zu kaufen. Immerhin 6 Euro. Und ich müsste eine Bestellung im WebShop von Pinnacle machen - also wieder den kompletten Daten-Strip. Außerdem glaube ich nicht, dass mir geholfen werden kann - die Software von Pinnacle ist derart abartig schlecht, dass ich nicht glaube, dass man mir helfen kann. Warum glaube ich nun, dass die Software schlecht ist?
  • der Start des Pinnacle TVCenter 4 liegt auf meinem nagelneuen Rechner aktuellster Geschwindigkeit im Minutenbereich
  • Die Anwendung strotzt vor Darstellungs-, Rechtschreib- und Lokalisierungsfehlern
  • Die Hälfte der in der Anwendung gezeigten Optionen funktioniert schlichtweg nicht
  • Die Anwendung wechselt selbständig die Sender - einfach so, an fernsehen ist dadurch nicht zu denken
  • nach ein paar Stunden Fernsehen stürzt die Anwendung ohne erkennbaren Grund ab - während der Zeit ist es auch nicht nötig, dass auch nur eine einzige andere Anwendung läuft
  • sämtliche Schaltflächen haben eine Reaktionsgeschwindigkeit wie ein Patient unter eingeleiteter Vollnarkose - man kann zusehen, wie die Änderungen in der Oberfläche nach einem Klick gezeichnet werden - und nein, meine Grafikkarte ist nicht lahm - sie zählt zu den schnellsten derzeit verfügbaren Grafikkarten
Nachdem die Applikation eigentlich den Eindruck einer frühen alpha-Version hinterlässt, habe ich mir dann auch die neueste Version herunter geladen - um die tollen Features endlich einmal benutzen zu können. Dumm nur, dass sich bei den offensichtlichen Fehlern schlichtweg nichts, aber auch wirklich rein gar nichts getan hat. Umso schlimmer - verwendet man die aktuellste Version der Software funktioniert die überhaupt nicht - es kommt nur eine Meldung: "unbekannter Fehler" und das wars.

Bleibt nur eine Lösung: neue Hardware kaufen - und die Finger ein für alle Mal von Pinnacle lassen!