Practical Experience of Hajo Nils Krabbenhöft

No headhunters please

This page is meant for friends and acquaintances to know when they might ask me for help. If we don’t share a friend that I know and respect, please do not contact me. (DC is OK)

This page contains a list of projects I’ve worked on in the past. The list is not exhaustive, so if you’re looking for a specific skill set or practical experience, feel free to just ask me. Since this page is pretty long, I recommend using your browsers search function (Ctrl+F or Cmd+F).

3D Game Engines

In 2002 and 2003 (when GPUs were still becoming more powerful at an incredible rate) I built several 3D engines:

The first one was a portal-based renderer (like the Max Payne 2 engine) for Quake 2 levels. Out of this, I created a small third-person shooter including node-based pathfinding for AI characters.

My second (and way more ambitious) game engine project was the development of a multi-threaded GeoMod engine (like Red Faction) including a terrain renderer. This got me a job offer from a larger geman game company (which I declined to go on vacation instead).

Throughout the years, I’ve also built many C++, Java, Flash or C#-based game engines for various game jams or hobbyist game projects of friends. Google for me and “Nordic Game Jam” to see some of the games we built.

3D Printing

I have access to a 3D printer and I can work with Autodesk 3dsmax to desing the objects to be printed. In the past, I’ve used 3D printing to build a custom dice as a present and also to build custom tripods and calibration objects that I needed for my research on 3D object recognition.

3D Reconstruction

In 2013 I started working on a software toolkit written in C++ to reconstruct 3D geometry out of the perspective parallax shifts between multiple images of the same scene. In the research community, that process is also known as “Structure from Motion”.

App Development

I can build iOS, Android, Mac and Windows apps. Although I probably could build a Linux GTK application, I don’t have much experience there.

I have built iOS apps in pure C++ with a custom GUI toolkit called JUCE, as HTML5 with a custom WebKit and in the regular Objective C way with UIKit. I have built Android apps with C++ (JUCE again), HTML5 and the default Java libraries. I have built Mac applications with C++ (JUCE), HTML5 (WebKit) and Cocoa+Carbon. I have built Windows applications with JUCE, MFC, QT, GTK and HTML5.

Apple Mail.app Plugin

In 2009, I bought my MacBook Pro 17” and it came with the Apple Mail application pre-installed. I liked it mostly, but I was missing the Nostlagy plug-in that I had used in Thunderbird before. So I wrote my own plugin for Mail.app to provide the Nostalgy keyboard shortcuts and GUI for moving mails into folders.

Beat Detection

In 2006, I created a tool to automatically detect the average speed and drum beats in a music track. This was done using moving-window short-time fourier transforms and then using the Viterbi technique to estimate the “musical state” of the track from those FFT values.

BIOS Services / EFI Emulation

In 2009, I managed to write a terminate stay resident EFI emulator which is loaded by the stage 0 bootloader and offers BIOS-level services to the operating system. I integrated my EFI emulator into Chameleon such that my EFI layer could present a virtual NVRAM storage area to Mac OS X running on non-Apple machines.

CEO / CTO / Project Management

I’ve been a freelancer since 2004, a CEO since 2009 and a CTO since 2010. I’ve worked on my own, with local employees, with outsourced employees and in cooperation with other companies / freelances. I know how to lead projects through difficult times and ship them.

I’ve been managing the finances of my companies and their products on my own from 2010 to 2013 so I have a general feel of what works.

Chat Server

In 2011 (= before the encryption hype started), I wrote a completely encrypted chat server and client for Windows, Mac, iPhone and Linux. The server backend was written in C++ with the boost libraries and used SSL connection hijacking to tunnel through firewalls. While it works OK for me and my friends, this project sadly never got stable enough for a public release.

Content-based Image Retrieval

For my company spratpix, I wrote the AskBubo.com search engine, which will convert images into features, hash them efficiently and then use those hashes for content-based image retrieval. The whole system is implemented as several workflows based on Apache Hadoop, which will create a huge look-up-table stored on HDFS or S3.

AskBubo is actively used (2014) by companies to detect copyright infringement on the internet and to identify duplicates in private image collections.

Copy Protection

I developed a custom copy protection for one of my products which is based on RSA (private key + public key) signatures for authenticating a customer’s machine through hardware-locked machine IDs. Later, I extended the copy protection mechanims to also authenticate against USB key drives. The copy protection can detect and prevent binary modifications of the executable through self-reference of the binary and it also provides encrypted storage for proprietary data.

Distributed eQTL Management System

For my bachelor’s thesis, I created a distributed system based on Apache Cassandra and the Google Web Toolkit, which would distribute management and processing of expression QTL data over multiple nodes. I used Nginx as the load balancer.

Distributed Locking

For the spratshop product, we needed a way to enforce that cronjobs are only executed mutually exclusive on our server cluster. To solve that problem, I built a small commandline tool which uses ZooKeeper to implement a distributed lock which encloses the cronjob being executed.

E-Mail to Dropbox Service

Because I really dislike doing it and sometimes forget to store invoices coming in by email into the Dropbox for my tax advisor, I developed a service to automate that. This service is currently not publicly available or being sold, but instead I’m only using it for my own companies.

The service offers a specialized email address that you can forward emails to (for example using Outlook Rules) and you can include a tag and a file extension in the recipient email adress. All files attached to your email using the given file extension are then stored into your Dropbox into a pre-defined folder with the tag given in the recipient email address.

Foreign Software Modification

I’ve had numerous encounters with foreign software for Windows or Mac which behaved in a way that I found inappropriate or annoying. So I learned the skills needed to reverse-engineer and modify such software.

For example the regular german telephone book software from TVG has an incredibly annoying export limit of a maximum of 75 records per file. I needed to export all 300 results and I didn’t want to do that in 4 runs … so I changed the limit.

Fractal Scene Generation

Throughout the years, I’ve built various tools to generate 3D geometry or 3D voxel grids or 3D particle simulations out of mathematical fractals (3D mandelbrot) and cellular automata (game of life + custom rules).

In 2013, I also built a 3D version of the popular “Game of Life” with ruleset editor, grid editor and support for 3D beamers.

FTP Distribution System

I built an internal distribution system for a photo agency to swiftly send their pictures to partners by uploading the images to FTP servers. The system went live in 2004 and was used until 2009 when I founded spratpix together with their owner. I’m now building and maintaining the SaaS spratshop.com (german only) which includes my FTP distribution system.

Game Boy Advance

For a software development competition, I developed a christmas-themed single-level 2D racing game for Game Boy Advance. Technically, I used the community GCC toolchain, GBAemu for testing and a Visoley flash card for testing on actual hardware.

I also had a lot of fun patching commercial GBA games to make them work like I want ;) Yes I know that’s cheating :p

German Legal Stuff

I’ve been running companies in germany since 2004 and liability-limited ones since 2009. I also did all of the bookkeeping and tax papers (Jahresabschluss + Körperschaftsteuer + Gewerbesteuer + Umsatzsteuer) myself for a year, so I think I have a pretty firm grip on the day-to-day legal suituation of running an incorporated company in germany.

Graphics API Redirection

As a kid, I enjoyed playing japanese video games. Sadly, I never learnt japanese. So I took on the programmer’s way of fixing the problem: I wrote a custom Windows DLL and executable loader which would inject my own set of standard Windows APIs (such as GDI32.dll) into the starting program. That way, all text drawing requests from the japanese game are going into my own software which allows me to send the text on-the fly through the Google Translator and then display the result instead of the original text.

The result? I could play japanese text adventures with the original text being replaced in real-time and in-game with a broken translation from Google…

Hardware Design

I can soldier and design electric circuits and get them produced. I have access to a CNC mill and a 3D printer. I can also program microcontrollers such as the PIC series, for example for building an in-flight stabilization control system for model airplanes.

Image Database

From 2007 to 2008 I built the first version of the spratshop image database which was the first product being sold by spratpix, which I founded in 2009. The spratshop image database uses Ruby on Rails for the back-end (along with many custom Java services) and Google Web Toolkit for the front-end.

IRC Bot

In 2006 I built a customer IRC chat bot to distribute files to users using the mIRC client. The bot listens in a pre-defined IRC channel and sends private chat messages to users when they enter keywords such as !list and !get <number>.

Mac Kernel Drivers

As part of my “Spatial Sound Card” product, I developed a Mac OS X kernel driver in 2012/2013 that creates a virtual sound card which internally processes the audio data with my spatial audio simulation engine before delivering the processed signal to a real sound card for output.

Mail Client with Automation

As I grew more and more disappointed with the overall sluggishness of Google Mail and of Outlook, I decided to write my own email client.

To get an instant display of my INBOX, hajomail consists of a client that will continuously run in the background and synchronize a local database with the server-side gateway. The GUI is based on Google Web Toolkit and WebKit and is only started on-demand.

The server-side is an IMAP client, which will continuously synchronize between its internal database and the IMAP server. To get real-time updates between multiple clients, I wrote said internal database from scratch and implemented real- time messaging and history replication/merge. That way, as soon as an email comes in, all listening computers will be notified immediately.

For the technical side, I used Google Go because its concurrency model was a very good fit for my intended architecture of multiple independent agents, which communicate with each other through messages.

My little info page hajomail.com is still online, but I’ve since given away the source code to a friendly company and I’m not maintaining hajomail anymore. However, the launch of the hajomail beta in Feb 2013 resulted in a job offer from a fortune 500 company (which I turned down to finish university instead).

Massively Multiplayer Online Games

Throughout my bachelors degree from 2007 to 2009, I developed a multi-threaded, multi-server MMORTS (massively multiplayer online realtime strategy game) with pathfinding, a persistent online world and AI takeover (if a player leaves). The game used a custom network protocol for which I created a helper script to generate the serialization and deserialization code both in C++ (for the server) and in Java (for the client). The game was live in 2009 and my server scaled pretty well to a world map with 20.000 tanks driving around and using real-time path finding.

Object Tracking

For my scripting language TenFex I needed the capability to “glue” text translations to moving objects in the underlying scene. To make this possible, I built an object tracker supporting affine translations. I implemented the well-known KLT paper and then built a matrix estimation system on top using RANSAC with statistical priors (to keep movement smooth).

Online Web Page Editor

We needed a way to quickly modify long sales landing pages and assemble newsletters out of pre-defined blocks for spratpix. So I built a client-side web page editor running as JavaScript inside the web browser which does precisely that: assemble web pages or HTML newsletters out of pre-defined blocks. Basically this is like MadMimi but a lot less polished because it’s only used internally.

Photoshop Plugin

One of the first software development tasks I got payed to do was to create a custom plugin for Adobe Photoshop to integrate my clients proprietary C++ image processing library into Photoshop.

PlayStation 2 OS Modifications

When I got my PS2 I just had to glue in a modchip to get full access to the hardware… And then I used the GCC C compiler and a lot of RISC assembler to create my own modifications to the PlayStation2 operating system. The PS2 was an exceptionally fun target for hardware hacking because it has two processors running different software concurrently and I think they even used slightly different instruction sets.

So here’s what I did: Using the PS2’s main processor, I patched the code running inside the IO co-processor to replace the system restart with my own patched implementation :) Then, I would “reset” the system and start a game, thereby injecting my own OS-level code and system drivers into the IO processor while the game booting on the regular processor doesn’t notice ^^

Have you ever wondered how the internal in-memory data structures for Final Fantasy change as you’re playing it? I did. Did you ever want to see the internal debugging system of Tekken 3? I did. Did you ever want to start PS2 games from a simulated disk driver over your home network? I did. Did you ever want to make your PS2 store it’s save games on a (much faster) FTP file server instead of the slow memory card? I did. Ahh the good times :) I probably spent way too much time on making unofficial PS2 modifications.. but hey, it gave me a pretty solid grasp on embedded systems, hardware-level hacking and OS architecture.

Printer Calibration for Commercial Printing

In 2013, I developed a software to automatically identify the location (or locations) of a pre-defined template on a scanned-in print sheet. For example if you’re mass producing cigarette boxes and you are printing 10 of them onto one sheet, then you can use my tool to identify where those boxes are in the image you get out of the calibration scanner. So using a tool such as mine you can automatically monitor and re-calibrate the ink density across the sheet during production.

Proxy Server

During my time at university, I wrote a custom proxy server running on Heroku which filters retrieves our mensa food plan and re-formats the content into a responsive template suitable for smartphones. I wonder why my university never managed to make their official food page work at least somewhat on smartphones, but creating a proxy seemed to be a faster way to get to my goal then annoying them about it.

I also wrote a proxy server that retrieves a blog or web page and removes all superfluous content (like advertisements) and then reduces formatting to a minimalistic and standardized theme. I used this in the ReadItLater apps I developed for Mac and Android to convert links to articles into a HTML that my Sony PRS-T1 ebook reader could display well.

Real-time Audio Filtering

In 2007, I built a Windows Driver to apply real-time modification to the signal before routing it to applications such as Skype. Apart from the usual “funny effects” like making a voice sound robotic, this also included real-time pitch detection, pitch shifting and spectral modification to make (for example) a female voice sound male.

In 2010 I started research on the real-time audio filtering suite that would later become the “Spatial Audio Designer” product line from “New Audio Technology GmbH”. I did the intial research, mathematical modelling of the problem and also lead the team that does the implementation in vectorized and multi-threaded C++. The SAD (Spatial Audio Designer) engine can do real-time routing and panning of up to 500 channels on a regular workstation (2013 performance level) and can then simulate rooms and the acoustic interaction between directional sound and the ears. The result is that producers can use calibrated headphones to work in a virtual studio with up to 44 virtual speakers and up to 2 virtual subwoofers. The SAD is actively used in production of audiobooks, music and also Hollywood movies.

Reverse Engineering

I reverse engineered the closed-source japanese file-sharing client Winny2 in 2009 and wrote my own C++ client speaking their protocols. Later, I extended my client with a web interface so we could run it on a dedicated server and use it to remotely download files from the Winny2 network through HTTP.

Scripting Language / Compiler Design

Somewhere around 2000 I created my first scripting language including parser and interpreter. It even supported calling DLLs. I learned assembler to make that work. In 2004, I built an interpreted scripting language to automate the creation of karaoke effects for Animes out of word timing tables.

From 2005 to 2008, I built and supported a custom scriptiong language for generating visual effects. This scripting language would compile C-like source code into an intermediary bytecode with embedded data, which could than later be run on another machine without needing the source script. This allowed me to distribute the compiled effect files along with my player plugin to users without disclosing how the effects work. I also created an optimized version of the virtual machine, which used the graphics card to improve rendering speed.

Stream Download Proxy

In 2006 I built a small HTTP proxy server which will collect URLs and credentials for all video streams that pass through it so the customer can just browse YouTube (for example) with my proxy turned on and then later decide which of the videos to download as MP4 movies to his hard drive.

Structural Similarity Search

For my master’s thesis, I developed a hashing system for searching for similarities in biomolecules and their movements. The system is based on asynchronous message passing between multiple workers and thus easily scales from one processor to multiple threads on multiple nodes.

User Interface Design

I’ve been building apps for so long that I had to learn how to design a reasonably-looking UI in Photoshop. These days, most of my UI design make it through to the final product.

I can also whip up functional web UI concepts (with static fake data) in a few minutes which allows me to try out many different user interface concepts when building a new website. Together with the Bootstrap 3 CSS toolkit, that allows me to produce a presentable (although generic-looking) GUI very fast.

Video Flow and Cut Detection

In 2006, I also built a software to analyze the (affine) camera movement of videos and to detect scene cuts. This software was used together with my beat detection tool from the same year to fully automatically generate music videos for unknown tracks out of a pool of generic movie stock footage.

Virtual Files and Registry

I just hate it when Windows programs think they are allowed to spam my whole hard drive with their files. So I built a small DLL-injector which replaces the Windows file and registry API with my own variant, thereby redirecting all those pesky paths into one folder. Something very similar is being used by Thinstall to package system-wide installations up for distribution into a single folder.

This also works nicely for presenting virtual files or registry entries to an application. For example, I built a small tool to inject a virtual movie.mkv file into the VLC video player which I could then fill dynamically with data. That way, I can start watching a RAR-compressed movie before the download is finished. By 2013, my approach has become useless here because VLC now supports RAR archives directly.

VNC Capture and Replay

From 2006 to 2010, I built and maintained a proxy server for the VNC remote control protocol that would capture the screen contents and the operator’s keyboard and mouse commands into a logfile. Later, a supervisor could then play back (at increased speed) the whole VNC session to verify that the operator didn’t do anything wrong. This product was used by a german remote-support company to monitor their employees.

VST, RTAS and AU Plugins

Since I’m selling professional audio software, I need to deliver my work as plugins for the common audio workstations. As such, I have years of practical experience developing VST, RTAS and AU plugins. I’m still learning AAX. I also already shipped an RTAS plugin with support for hardware remote controls (such as D-Control) and I’ve worked my way through the page tables documentation.

Web Crawler

In 2014 I am working on a custom web crawler utilizing my AskBubo search technology to identify copyright infringements on a set of high-value pages in near real-time.

Web Development

My companies sell various SaaS products which I’ve mostly built myself. My preferred tools are:

  • Heroku as a platform
  • Hetzner (germany) for high-performance servers
  • Amazon S3 for storage
  • MySQL or PostgreSQL as database
  • Redis or RabbitMQ for task management
  • Java or C++ or Google Go for back-end services with inversion of control: Back-end services connect to HTTPS REST API on front-end
  • Rails for web back-end
  • Google Web Toolkit or AngularJS for JavaScript front-end
  • Bootstrap CSS
  • Mailgun and MadMimi for emails
  • HTTP(s) REST JSON for all APIs

Whole Genome Analysis

During my time at university, I performed a statistical analysis to identify differences in the human genome between affected and unaffected patient groups. We used Affymetrix chips to measure SNPs and I successfully identified a set of SNPs with a high predictive value for a patients tendency to develop Sepsis after severe injuries.

Windows Kernel Drivers

In 2005 and 2006, I built a Windows kernel driver that can be remote-controlled from C# or C++ and allows the developer to present arbitrary data as a virtual folder structure on a virtual hard drive. If you’ve ever used one of those “mount FTP servers as hard drive” tools for Windows, that is precisly what my driver does.

In 2006, I also built a Windows kernel driver that can be used to present arbitrary binary blocks as virtual hard drives and mount their contents as file systems. Think of this as Daemon Tools for virtual hard drives. I think something similar was officially added to Windows 7. A similar technology is also used in VMware to mount their virtual hard drives.

From 2005 to 2006 I also built a Windows kernel driver to monitor a file system for changes in real-time and copy those changes to another PC over the network. This was used in a product very similar to Norton Ghost (= hard drive backup over network). You can imagine this functionality like a one-way Dropbox (PC –> Web only). Yes, I wrote real-time file synchronization software way before Dropbox ;)

In 2007, I built a Windows kernel driver to intercept audio data from the microphone and apply real-time modifications to the audio signal before it reaches applications such as Skype. Our product was a tool to make females sound like a male so they don’t get hit on in online games.

Workflow Automation

In 2008, my university hired me to write an execution service to integrate command-line tools invoked through SSH or through the ARC grid middleware into the workflow management software Taverna. Later on, I extended this to include the Taverna UseCase repository where users can share automatable recipes for using standard Linux software from within Taverna. At the end of 2008, I did an internship in Geneva to automate their medical image classification software on KnowARC clusters using my plugin for Taverna. Later, I was also invited to present my work in front of an EU research commitee in Brussels.

Other cases of workflow automation are my FTP Distribution System or my E-Mail to Dropbox Gateway.

For my company spratpix, I also built an automated invoicing and payment collection system. In 2014, I’m working on a screenshot taking service to automate more of the internal tasks in one of my companies.

In most cases, I can replace a workflow involving specialist employees with generic tools (like Excel) with a specialized task-oriented tool that enables the use of generic employees. So If you have tasks that occur often and as a result cost much employee time, feel free to ask me about automation possibilities.

Xbox360 Game

After one of the Nordic Game Jams that I participated in with friends, I ported our game “Honeymoon” over to Xbox360 just to learn the process. I had to remove some of our superfluous visual effects (such as the full-screen 720p PNG video of sun rays) because of memory limitations on the Xbox360, but apart from that the game is fully playable with two controllers.

Yacc, Flex, Bison

These are tools used to generate your own scripting language grammar or your own compiler. I used them on various projects such as my two interpreted scripting languages and also for implementing the compilers of my two C-like dialects.