The Touch-Portal page to control PointerFocus, got even better with direct network communication to PointerFocus!

Tags: : After Hours

A couple of days ago, I wrote a post titled Whoo! How powerful Touch-Portal, AutoHotKey and PointerFocus turned out to be! That post describes a solution where I can control PointerFocus-features such as highlight, spotlight and magnify, by triggering the global hotkeys in PointerFocus (F8 to F12) . It worked very good, for the most part. However, it stumbled a little inside Visual Studio CODE (remember, the previous post targeted another sibling IDE, Visual Studio 2019).

In the PointerFocus page https://www.pointerfocus.com/androidapp.html I saw an Android-application acting as a remote control to PointerFocus. In order to work, you have to turn on the PointerFocus’ Remote Server in it’s settings, like shown below. Also note how I now have turned OFF the global hotkeys;



If you are interested, please read on



Whoo! How powerful Touch-Portal, AutoHotKey and PointerFocus turned out to be!

Tags: : After Hours

In these COVID-19 times I use tremendously more time in net-meetings, and one thing I have been missing on Windows 10 computer, is the ability to highlight my mouse for my viewers.

This post focus on how I got the nice tool PointerFocus (which have nice features to highlight, magnify, spotlight and even draw on the screen), working together with the super-cool Touch-Portal app on an old iPhone, making me a “Elgato Stream Deck-like” experience. The glue between Touch-Portal and PointerFocus is a small snippet made with AutoHotKey. Below you see how my iPhone looks tih the Touch-Portal app running;


These Touch-Portal buttons quickly let me choose the PointerFocus-features without making a fuzz with other shortcuts Smile

If you are interested, please read on.



Tutorial - How to create an installable package in Python - Part 2

Tags: : Python

This post continues the first part Tutorial – How to create an installable package in Python – Part 1.



Tutorial - How to create an installable package in Python - Part 1

Tags: : Python

This article describes why you might want to create a Python-package and how to do it. In the end you will end up with an installable package that can be distributed and installed on other computers, and used in all your other projects.




Do your server send mails asking for e-mail confirmations? Then ensure the receiver knows which domain the confirmation-mail origin from!

Tags: : After Hours

Have you ever wanted to sign up for a newsletter, or enroll into something on the net using your e-mail address?

Then the chances that you have received “Please confirm your e-mail address”-mails is pretty high. But what if the web server uses one domain, and the mail server uses another?

Sometimes you don’t receive the confirmation-emails since they are rejected by your mail server. Actually, the sender receives an error-message telling him or her that your main server won’t accept the mail. It may look like this for the sender;

Mail delivery to the following recipient has finally failed: bob@vcode.no

Last reason: 500 5.0.0
Explanation: host vcode.no [] said: Message Rejected for Policy Reasons

Transcript of session:
   ... while talking to vcode.no []:
   >>> DATA (EOM)
   <<< 500 Message Rejected for Policy Reasons

This is a typical sign that some sort of spam-filter has analyzed the inbound message and rejected it for some reason.

For example – you want to sign up for the newsletter at www.acme.com and enter your e-mail address. Since I know I am going to receive future newsletters from @acme.com, I have beforehand entered the domain @acme.com into my spam-filter’s white-list. The white-list ensures that any mails from @acme.com should be received without hick-ups.

Then it turns out that Acme is using a mail-letter-service and it is actually the mailletter-domain that sends the confirmation-mail. For example the newsletter-service sends mail from newsletter_acme@thesupermailservice.com . The domain @thesupermailservice.com wasn’t known to me up front, and my spam-filter finds that highly suspicious Smile And, wham! Error 500 and “Rejected for Policy Reasons” is a fact.

Wouldn’t it be nice it Acme informed me about that in the first place, and the very page where I signed up in the first place? I think so.

Perhaps, in the future, we might even get a protocol or some technical handshake, making the white-listing process a breeze. I hope so Smile


New top quality web camera - using the EpocCam App, an old iPhone 8 and a Gorilla Pod

Tags: : After Hours

Whilst my laptop do have a nice web camera, I wanted a web camera right in front of my face on the external screen. Why? Twisting my neck hard left to make occasional eye-contact with the laptop web camera was very tiring for my neck.

Read on to see how I ended up with an old iPhone 8, running the app EpocCam Pro, mounted on a Gorilla Pod, like this;


Note the “lowered mode”, where my web camera now is almost in eye-height Smile



Ahhh, of course I should know that "An unspecified error occurred (696e647863686b2e 9cb)" actually means "hey, your USB disk is drawing too much power from the USB-port"!

Tags: : Configuration Thoughts


  • Suspect your USB connections – allways!!
  • Expect to spend hours on the forums looking for symptoms, hints and stuff to try out!
  • DON’T EVER THINK about getting the Microsoft Surface Dock … piece of heavy junk!


Disk operations onto the BitLocker-drive reports tons of errors1!

Isn’t it great when Windows (and most other software too Smile) gives you completely other symptoms to problems?

In my previous post I tried to get BitLocker to play nicely on my machine. Huge problems with drop-outs, perhaps not even the fault of BitLocker itself, but it turned out that I couldn’t even connect the disk anymore without Windows going completely haywire! Lot’s of messages in the event log like;

“Reset to device, \Device\RaidPort3, was issued”

"The IO operation at logical block address xxx was retried"

"A timeout (30000 millisec) was reached while waiting for a transaction response from the WSearch service"

Trying to salvage the drive – and as a result of reading loads of forum-posts on the net, I saw that I could try to use the old CHKDSK again. Run in as an Administrator with the parameters /F /R and /X (well, F should be automatically implied by R). The most important parameter is the X, which tells CHKDSK to unmount the drive for processing. The first run yesterday evening ran for a full 6-7 hours, and when I returned to the computer this morning, I couldn’t get in touch with Windows at all. Something was stalling the machine 100%!

Disconnecting the USB drive docking and Windows came up (pheew!) without problems. Connect the USB drives again, and boom – everything was stuck.

After many attempts I finally was able to issue the CHKDSK command. It ran for a while, and boink – “An unspecified error occurred”?!?!




How to configure BitLocker so it doesn"t need 72 hours to encrypt 2 TB!

Tags: : Software Thoughts Configuration


  • Setting up BitLocker the wrong way can be extermely slow. For example – after 72 hours my 4 TB-drive was only 49% finished!
  • Don’t encrypt harddisks full of files. Start with empty drive and enable BitLocker with “Encrypt used disk space only”
  • Use USB 3 – otherwise BitLocker will be extremely slow!

My backup-regime

Albeit I – as a programmer – shouldn’t care too much about backup (haha!), I have always been at the cowards side and backuped everything. Over the years I have been trying out most ways to backup, such as;

  • 1,44 MB diskettes – stacks of them!
  • CD and DVD burners
  • Zip and Jazz drives
  • External harddisks of all kinds and sizes
  • FTP to my NAS
  • Online cloud backup such as Acronis True Image

Even though most of the technologies above does work to some extent, they have allways meant labor, time and cost of different degrees.

This post is about my latest backup-regime. It consists of an USB harddisk docking station for ordinary internal harddisks;


My model is the ICY BOX from RaidSonic. It swallows two harddisks, either 3,5” or 2,5”. By using these types of harddisks, the price goes down a whole lot, plus I already have a stack of older disks. One of the really cool features about this box, is that it can clone a harddisk, even without the hosting computer running.

The ability to clone is where the backup-aspect comes to play for me. By using a huge 4 TB harddisk as my main backup disk, I clone this from time to time to another similar 4 TB disk. I clone at intervals such as once a week. Then I store the cloned harddisk outside the premises.

This is where the need to protect the disk comes in. I don’t want unprotected disks lie around.

Searching the net brings up several candidates to protect an external harddisk. If you search around for best solutions to protect your external drive, you see that for example applications such as VeraCrypt or StorageCrypt are mentioned a lot. If you have Windows 10 Professional or Enterprise, you already have Microsoft’s own BitLocker. Note that you also need a fairly new computer with a security module in place (the so called “Trusted Platform Module” or TPM). Note that the BitLocker wizard will tell you if you miss anything.

Protection provided by tools like BitLocker comes with a price – mainly since protection is in the form of encryption. And that is time. Time to encrypt (and later decrypt) your stuff as you move files to and from your harddisk.

Read on to see how I have configured BitLocker now …



How a SmartNSF custom route can be used to create a redirector, in my case to open the corresponding Notes-document

Tags: : SmartNSF Java

I am – to nobody’s surprise – a big fan of SmartNSF. Here the other day I had to come up with a solution to make a web-URL redirect to a Notes-URL (you know, notes://…) and thus open a document in the Notes client. Why? A modernized Notes application surface it’s data on the web, but the users still needs to be able to see the real document in the Notes client. There are several ways to do this with traditional Notes development. However, I wanted to see how I can do this with a simple java class, all controlled by a SmartNSF custom rule.

For example, the URL http://someserver.com/DocumentDatabase.nsf/xsp/.xrest/doc_v1/5921-A4 will grab the document ID “5921-A4” and lookup the document behind the scenes, and grab the NotesURL such as Notes://SomeDominoServerName/C12573EF007A4D9D/B3612539371CB37AC125830D002A4BF9/67FD0734318B98A4C12582B900208F1F. The latter URL will normally open the specified document UNID in the Notes client, at least after you have confirmed security warnings like these;


How is it done?



How SmartNSF came to rescue in a heavily surveilled little (bird) house

Tags: : Lotus Domino SmartNSF

One small hobby project of mine is a birdbox with an wifi enabled IP Camera. Much more fun to watch those small house sparrows build their nest and see how hard they work to bring up new kiddo-birds Smile


The images from the web camera surfaces on an web page, and everything worked fine last year.


However, firing up the camera this year, nothing showed up! After a quick look at the Chrome console, I quickly realized that the old and trusty IFRAME no longer worked as it used to. First and foremost I have enabled SSL on the site (with Let's Encrypt, using Windows ACME Simple (WACS), I'll create a blog post on that too in the near future) and it turns out that HTTPS won't allow IFRAMEs to use HTTP-based content at all. The concept is called "Mixed Active Content", read more about that here if interested. The built in web server on the web camera can't use anything else but plain old http …

While there probably are many other solutions to this challenge (feel free to chime in if you know!), this article describes how I used SmartNSF to call a small java-class, wrapping the whole HTTP-call nice and easy. A side effect was that I also could hide the inner workings of the IP camera completely! No more user name and password exposed in HTML Smile.

If you don't know SmartNSF, it is very briefly an extension to both your Domino server and to your Designer client, enabling you to create powerful REST Services supporting full CRUD in minutes! While you of course can do much of the same with the built-in Domino Access Services (DAS), you have much better control with SmartNSF. In my opinion, one of the most important things to happen with Notes/Domino in years.

Read more to see how I enabled SmartNSF to solve this challenge!



How to redirect an URL in Domino and break the Domino-server's attempt to append any URL-parameter like "?OpenDocument" to the target URL!!

Tags: : Configuration Lotus Domino
This is a story of something that I anticipated should take 5 minutes to fix. It turned out to take a couple of hours instead!

Very briefly - using the redirect web site rules, Domino will transfer any URL parameters (like ?OpenDocument, ?OpenForm etc) from the source URL-pattern to the target URL. If the target URL doesn't like OpenDocument very well, this ends up in an "HTTP Web Server: Invalid URL Exception". This article describes how I struggled worked to break this behaviour!

A picture named M2


The quest to avoid SMTP Hacking and "Authentication Failed" on Domino-server continues

Tags: : Lotus Domino Configuration

Update Nov, 11th, 2017: If your are using the sample database, you need a configuration first. Go to the configuration-view and press the "Configuration" button to create one.


This blog-post is about a combination of my own agent creating an IP-address list and a product named "IP Blocker". The combination automatically pumps bad IP addresses from Domino log to IP Blocker – and gone are the bad IP address.

Even though I have some sort of control on the numerous SMTP hacking attempts happening every day, I still feel uncomfortable just seeing that they keep on pounding my server. What do I mean?

The log gets lots of messages like this;

07.11.2017 05:00:06   SMTP Server: Authentication failed for user stevens ; connecting host

Back in March 2017 I wrote the blog-post Finally I managed to stop the SMTP hacking, generating tons of "SMTP Server: Authentication failed for user ..."-messages. Back then I was using the Windows Firewall to trap the bad IP addresses, and that worked. Every IP address registered was effectively blocked from ever reaching my server. The down-side was to keep up with all the new IP addresses, and somewhat cumbersome user interface to register IP addresses. My blog post goes into detail how that was done.

A reader named David Brown commented on the blog-post and referred to his blog-post Disable SMTP-AUTH To Stop Relay Hackers In Their Tracks, which suggested the somewhat strange tip to turn off the SMTP Authentication server in order to actually automatically fence out the bad IP addresses.

Here the other day I came across another Windows tool named IP Blocker from BeeThink-software. It looks a little outdated, but it turned out to be quite powerful! Below you see it in action on my Windows machine;


All the red dots are blocked addresses! What was the most important selling point to me was the ability to automatically load IP-address lists.

What if I created an agent retrieving all the "Authentication Failed" messages, extracting the IP addresses and automatically created an IP-address list file to IP Blockere to read?

Read on to meet "Authentication Failed Extractor" database Smile



Wow! SmartNSF (BETA-5) can now call java directly, and work with the parameters with ease!

Tags: : Lotus Domino Java SmartNSF

This evening it was time to test the latest and greatest version of SmartNSF – BETA 5. When you have installed it (via an updatesite database for the server) and via a local update site in your Designer, you get some cool new features. First of all, intellisense seems to work very good so now it is much easier to get the available methods etc.

But, the really cool feature in this version is the support for CUSTOM strategies. This means that you can define a route like this (the example below is directly from the discussion.nsf sample database enclosed in the SmartNSF zip);


The URI infos will call the Info-class in the package org.opennrf.smartnsf. This means that an URL like  http://www.vcode.no/test/discussion.nsf/xsp/.xrest/infos (note; URL is shown just for illustration purposes, and is not active) will call the java code shown below;


(Click on image to enlarge)



What!!! Notes 10 is coming 2018!

Tags: : Lotus Notes

What a fantastic twist!! While IBM has done a fairly good job with Domino over the years, the Notes client has been left somewhat in the void. But head over to this announcement and see for yourself!


Bark-bark!! The LotusScript CWebContentConsumer now support REST Service POSTs with files++

Tags: : LotusScript Java

A couple of days ago I wrote the blog-post Teach the old dog some new tricks: Let LotusScript consume REST Services the easy way. I thank you all for the good feedback! Nice to see that some old school, classic Notes development, still got some traction Smile

Well, I was in the spirit to add some features today too!

First and foremost you now have the ability to add a payload to the PostJson, PostXML and PostHTML. By payload I mean a text string of any kind, but typically a JSON or XML. In a way you can think of it as a way of uploading a file or text together with other request headers or URL parameters.

This means that code like this;


… results in this;


Note that the payload isn't tagged a a proper multipart MIME or anything, but perhaps you can add that yourself with a combination of the new support methods for base64 encoding and decoding? You now have these additional methods;

  • EncodeStringAsBase64. Encode a string as base64. Build your own multipart XML or MIME structure, and combine that with one or more AddRequestHeaders? Or stuff the base64-encoded string as a payload directly with SetPayload.
  • EncodeFileAsBase64. Encode a whole file as base64. Remember that this hasn't been tested on huge files or anything Smile
  • DecodeBase64String. Decode a base64-encoded string back to it's textual form.
  • DecodeBase64StringToFile. Finally decode a base64-encoded string directly into a file on your disk.

I also added DownloadFileFromURL which can download any file from the specified URL and store it on disk as a file.

The demo-agents in the downloadable sample-database has been updated to use SetPayload, and the other methods are now demoed in a third agent with the name "Test Support Methods".

Happy coding!


Teach the old dog some new tricks: Let LotusScript consume REST Services the easy way

Tags: : LotusScript Java

This article shows you how to consume REST Services in LotusScript like this:


You can both GET and POST with the classes.

Behind the scenes this is accomplished with two script libraries. One back-end worker class made with Java (class:CWebContentConsumerJava) which does all the heavy lifting, and a LotusScript wrapper class (class:CWebContentConsumer) which uses the LotusScript-to-Java bridge LS2J to interface the back-end java directly.

Click on “Read more” to read the details.



Unexpected results reading a plain text file with NotesStream in LotusScript (or when strings contain MORE than meet the eye)

Tags: : LotusScript

This is a little LotusScript experiment with a plain text file and a LotusScript agent using NotesStream. After reading the text from the file I try to use the string to locate a document with a corresponding key in a NotesView. While everything looks fine in the debugger, something is not correct and the lookups fail. This article has some suggestions for solutions at the end but they are not state-of-the-art! Perhaps you know other ways?

First off, I have a super-simple plain text file with a single number in it;


Then I have a super-simple LotusScript agent reading this text file, and trying to locate a Notes document with the same number from a NotesView.


The documents have all their numbers stored as text, like this;


Why stored as text? Because this is how I found the (to me) abnormality in the first place Smile And why NotesStream? Because code with the concept herein also runs on an iSeries, where it works fine …

The LotusScript-code looks like this;


The code uses a NotesView (1) and a NotesStream (2) to open the file and read out the contents with the ReadText-method (3). Finally the code tries to locate the document in the NotesView first by a hardcoded key (4), and then by the value retrieved via NotesStream (5). In a moment you will see how the first works and the second not.



Is Bluetooth degrading?

Tags: : Thoughts


Being a programmer I know how hard it can be to get software right. Sometimes it never “get right” and the software have to soar in the flux between working and not working.

I my case I have an Apple iPhone 6S, connected to several Bluetooth devices such as a Garmin 235 watch, a couple of cars and a couple of headsets.

Over the years I experience that the Bluetooth connections have more and more problems. For example I can see that my Garmin 235 watch suddenly has a severe battery problem if it looses the connection the phone. In fact it can drain an ordinary 7-10-day battery life in just some hours, if it looses Bluetooth. Other symptoms are like “hey, shouldn’t the phone be connected with my car now?” or “Ooops, there died the sound in the headset”. Often the solution is to turn off the Bluetooth on my phone, turn off the other device, and then restart everything again. Then everything may work fine … for a while!

Who is to blame? Very difficult to say! It can be a hardware, software or both problem – on both sides of the communication chain! Every Bluetooth enabled device have a physical Bluetooth-radio. The radio have some features that often can be controlled by it’s software, the Bluetooth-driver. Read more about Bluetooth-basics here if you are interested. The quality and reliability of both the radio and the software can of course greatly vary. In other words, you can have crappy hardware with shitty software alongside, and the result is a crappy Bluetooth device. Vise versa you can have top-notch radio with brilliant software, and of course you can have anything in the middle.

Then you want to fix your Bluetooth-problem and start to search the net. Hundreds of pages from forums and blogs suggest all kinds of solutions. All from “install this” and “upgrade that” to “reinstall” etc etc. Of course it is often very difficult to see if you have the exact same problem, and thus if the fixes will actually work for you. Often you end up trying out some of them, and sometimes it works, and sometimes it doesn’t. Perhaps you after a while experience SBM – or “Solved By Magic”? SBM happens when you have done lots of changes, and suddenly things seem to work, but you have no idea which of the tricks that actually nailed it! Believe me, over the years I have probably used hundreds of hours trying to fix hardware- and software problems.

The challenge is – for a layman: Does anybody know of a way to debug your Bluetooth-devices? Just being able to tell which of the components that is the cuprit would be great! I wish there was some kind of “Reference Bluetooth Checker” somewhere. Something that you could connect your device to. After a while, the checker could say how well the device has implemented Bluetooth or not. What if there was Bluetooth “middleman” radio that intercepted Bluetooth-communication between a communication chain, and analyzed the quality and reliability? By the way - I found the company NTS on the net, offering their Bluetooth Testing services. Seems to be a marked for such testing then.

Like it is now, Bluetooth is taking on more and more devices and it is becoming more and more important as a connection-protocol. Unfortunately its performace and reliability is sadly – in my view – degrading.


ISBG Spring Seminar Success!

Tags: : Thoughts


ISBG (The Norwegian IBM Software User Group) has just finished it’s 19th Spring Seminar (“Vår seminar”) in Oslo, Norway. For two, intense days, the 50+ attendees has witnessed 15 top-notch sessions. The conference were staged in the offices of PwC in Oslo, very close to the main railway station, and just two blocks away from the hotel. In other words, pretty easy to get to the conference.



How a recent Windows 10 update shoots itself in the foot with IPv6 :-)

Tags: : Thoughts

In the start of May 2017, one family-member suddenly experienced “No internet, secured” message hovering over the network icon down in the tray icon area. Sure enough, her machine wasn’t visible on my TeamViewer control panel either, so she was definitely off the grid. Why did her Windows 10 machine suddenly decide to drop network connection?

As always, I start to search the net for similar cases, and as always, tons of different results pop up. All sorts of suggestions too, with some of them pretty lame (“download this and that”, buy hey, we don’t have network access in the first place Smile). Well, searching the net and reading tons of answers, and then trying them out, is just the modus operandi in problem-solving.

The quick answer in our case was that Windows suddenly decide to favor the new address-regime in internet (the IPv6) over the old one (IPv4), and along the way, obviously introduce some errors! In our case we have an old router (DLINK 652) which knows nada about IPv6, and the result was that Windows 10 tries to connect/discover/communicate with some protocol that doesn’t exist on the other side of the line. The end-result is that Windows effectivly shoots itself in the foot, and can’t connect or communicate anymore!

Read more to see the details