Goodbye and thanks for all the fish

On 30th April 2014 I said goodbye to GoLease.com1.
I’ve enjoyed working with, it has been a nice challenge and I’ve had some wonderful colleagues, who I’ll miss in the future.

Today 19th May 2014 I’ve started my new job as a web-developer with Nota2.

I’ll be working on tools for people with reading impairment (Dyslexia and visual impairment). I’m looking forward to the new challenges and my new colleagues.

  1. []
  2. []

Announcing WebPerfM

WebPerfM1 (horrible name I know) is a performance test tool for websites.

The idea came from the need for reliable performance test to know if a given site can handle a certain number of concurrent users.

For it to be a reliable performance test, it must act as close to real user behavior as possible.
The presents the problem of writing these tests, there have to be many different tests and they all have to be written like real user behavior.

Luckily we can create these tests without having to invent them.
Open Web Analytics (OWA)2 is a analytic tool like Google Analytics that you can host on your own server. OWA stores complete real life user sessions on the site in a accessible MySQL database.

So the idea is that WebPerfM reads the OWA database and crawls the website just the users did.

Each session is a list of what pages the user visited and what the delay between each pageview were.
WebPerfM runs multiple sessions at a time.

So far WebPerfM is just over the proof-of-concept stage and there a few things missing:

  • Scaling of how many concurrent sessions
  • Set number of sessions
  • Set age of session from the tests are created
  • Statistics
  • Proper caching of js-, css- og image-files with handling of ETAG, expire-date etc.

There are some limitations:
I can’t simulate logged in users.
No JavaScript from the pages are not executes during the test, this means no AJAX requests.

WebPerfM is written in JavaScript and runs on NodeJS, using various libraries available through NPM.

  1. WebPerfM project page on Github []
  2. []


On the 12th August 2013, I’ve started working for as their new webdeveloper. is Denmark’s largest trade portal for leasing equipment to companies and individuals.

I’m looking for to my time with this new company and hope it will be as great a time as I had working for Peercraft.

I started my new job back in February.

It’s “bit” delayed, but back in February I started a new job.

I was employed with the Birkerød (north of Copenhagen) based company AdMad, as a backend developer and systems administrator.

During my time with AdMad I’ve had the pleasure of working on a many different systems as well as kept the Linux servers up and running.

Amongst the highlights I can mention:
I’ve written a distributed mail delivery system meant for promotional emails, which have been used for sending out millions of mails.
Before spotify and wimp came around, I had the pleasure of maintaining the systems for one of the first music streaming services in Denmark. It was called TouchDiva.
I’ve written a document parser for the e-magazine AdMagz, that converts PDF-files into SWF (Flash) and image-files for online viewing.
And I’ve enjoyed working on chanti’s site, where I played a key part in developing their new HTML-based site which replaced their old flash-based site.

The new job (which isn’t so new anymore) is as a Systems Developer at PeerCraft located near the center of Copenhagen.
I’m looking forward to spending a long time working with these wonderful people.

PS.: It’s good to be popular I’ve been on most popular images for about 6 months. :)

Varnish, Ispconfig and apache2′s access-log

My web server that hosts this site, is running on Debian GNU/Linux with Apache2, Varnish and the management software Ispconfig.

This combination means that the default access log, logged as the remote address (Varnish’s IP). This simple change to the file /etc/apache2/sites-available/ispconfig.conf


LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig


SetEnvIf X-Forwarded-For "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" is-forwarder

LogFormat "%v %{X-Forwarded-For}i %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig_forwarded
LogFormat "%v %h %l %u %t \"%r\" %>s %B \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig

CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig env=!is-forwarder
CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" -d \"/etc/vlogger-dbi.conf\" /var/log/ispconfig/httpd" combined_ispconfig_forwarded env=is-forwarder

And add these lines to

sub vcl_fetch {
    ## Remove the X-Forwarded-For header if it exists.
    remove req.http.X-Forwarded-For;

    set    req.http.X-Forwarded-For = client.ip;