Rent-a-founder

How to write a text editor

One of the most requested features for my terminal user interface library tview (now at 8.6K stars, which is still mind-boggling to me) was a multi-line text editor. Before starting to work on this UI component, I collected my users’ requirements for it. They basically boiled down to this:

Read more...

Mocking APIs in Go - An Alternative Approach

It’s fairly common that one has to write unit tests for applications that access external systems. We don’t want to forgo the advantages of unit tests for these applications. So we need to find a way to run them self-contained, without depending on external systems.

Imagine we have a function which saves a user’s password in the database:

Read more...

Word wrapping in Go

It may seem that “word-wrapping” or “line-breaking” — the process of breaking a section of text into lines such that it will fit in the available width of a display area — is a simple thing to do: Find the last space character in a line of text and break after it. If you’re dealing with simple English text, that is, all ASCII characters, this will work reasonably well. But as soon as other languages or special characters like emojis need to be supported, you are dealing with the full complexity of Unicode. Read more...

The Problem with Perceptual Hashes

Apple just announced that they will use “perceptual hashing” to detect illegal photos on iPhones. I have some experience to share on this technology.

At my company, we use “perceptual hashes” to find copies of an image where each copy has been slightly altered. This is in the context of stock photography, where each stock agency (e.g. Getty Images, Adobe Stock, Shutterstock) adds their own watermark, the image file ID, or sharpens the image or alters the the colours slightly, for example by adding contrast. For our customers, i.e. the photographers who upload their photos to these agencies and sell them through their platform, we need to find all of their photos’ copies on those agencies. We use perceptual hashes to find them.

Read more...

Convert an Image to Grayscale in 2 Lines of Golang

If you turn to Google on how to convert an image (e.g. a JPEG) to grayscale, almost all solutions you will find will cycle through all pixels individually to convert them to a luminance value:

Read more...

Autonomous Driving - Not Happening Any Time Soon

Watch this video which I recorded two years ago while travelling in Madagascar:

If it looks crazy, that’s because it is.

Read more...

Die Corona App: Der erste Versuch muss sitzen

Nichts darf, aber jede Menge kann schief gehen.

Read more...

IATA SSIM Flight Schedule Parser

This post likely doesn’t affect most readers of this blog. But since I also write to document my work, this announcement will go here.

I implemented a new commercial software tool which can read IATA SSIM Flight Schedule files (Chapter 7). SSIM files follow a sophisticated fixed-width format and are used to describe an airline’s flight schedule over a specific period of time (usually 365 days into the future). These files are used to exchange schedule information among a large number of airline systems, some of which include:

Read more...

How to Count the Characters in a String (Unicode)

You would think that maintaining a mildly popular package such as tview would consist mostly of adding cool new features, maybe with the odd bugfixing sprinkled in. You would be wrong. If I had to guess, I would say 70% of my work on it was dedicated to making Unicode characters work. It’s all very simple when you just have to support the English language. But with the first requests for Chinese, Thai, Arabic, or emoji support, I realized I was in for a lot of trouble. (And I dread the day when users will ask for Hebrew which is written from right to left.)

Read more...

Making a Christmas Pyramid

Every now and then, I work on a project that doesn’t involve any electronics. A recent trip to the German Ore Mountains (“Erzgebirge”) inspired me to make a Christmas pyramid myself:

The finished pyramid

Read more...

Golang: Append Modifies Underlying Slices

Even after four years of programming in Go, there are still things I didn’t know about the language itself. The following example illustrates behaviour that surprised me. My (false) assumptions actually led to a bug which was very difficult to find as it happened only rarely and repeated reviews of the code didn’t turn up anything unusual. Here it is:

Read more...

My Go Package Reaches 1.4K Stars on GitHub

I was pleasantly surprised when I realized my recently published Go package tview had just passed 1400 stars on GitHub which is quite significant. It seems to have struck a nerve. As mentioned in my previous blog article, there are already a number of Go packages that allow you to create terminal-based user interfaces. But the focus on making it simple seems to have paid off. Naturally, with this popularity come new responsibilities: All of a sudden, I have to respond to feature requests, bug reports, and pull requests. Read more...

Terminal-Based User Interfaces in Go

Recently, a number of Go packages to create terminal-based user interfaces popped up. This is great because it allows you to run semigraphical applications on the server. It’s also more secure than implementing a dedicated admin area in your web app because it reduces the attack surface by hiding behind an ssh login. Here’s an example from Stock Performer where we can monitor the analytics precomputations that happen on the server: Read more...

My Gopher Academy Blog Post on Web Sessions and User Workflows

I’ve released two new Golang packages on GitHub: github.com/rivo/sessions and github.com/rivo/users. They will help you write web apps in Golang.

Read more...

Graceful Server Stop and Restart in Go

A blog post from 2014 explains quite nicely how one can achieve graceful server stops and restarts in Go, that is, how to implement a server process that allows running requests to finish before exiting the application. We will also want to deploy new binaries without interrupting running requests and without any noticeable server downtime. There are tools for this and in the past, I’ve used a combination of manners and goagain, along with some additional code on my end. Read more...

Laser-Cutting Custom Fidget Spinners

The fidget spinner trend is pretty much over, as can be easily seen by the fact that they can now be bought virtually everywhere for as little as €1. At the time everybody was still talking about them, I thought, why not design and build my own? I guess I just wanted to find a reason to use Formulor, a service which lets you order custom laser-cut materials, in this case acrylic glass, by uploading a simple Illustrator file. Read more...

The iPhone 7 Headphone Jack

It was a huge controversy when the iPhone 7 was released. Apple dropped the 3.5mm headphone jack in favour of their Lightning port. That is, their earphones now come with a Lightning jack. I usually like to give changes like this a try for a while before getting all upset, as the rest of the Internet appears to do sometimes. A few months have passed since I’ve got my iPhone 7 and my verdict is out: I don’t like it. Read more...

Textured Gradients in Pure CSS

We’re going to create a background like this in pure CSS:

Screenshot of result

Read more...

Maintaining a Secure Server

Having to run your own server, whether it’s in the cloud or rented as a physical machine in a data center, is inevitable once you try to do more than just host a few HTML files. It seems easy at first: Install Linux and the LAMP stack and you’re ready to go. But even with the best intentions, chances are you will quickly find that your server has been hacked and is now serving porn to the world and emailing viruses to unsuspecting internet users.

Read more...

Generating Colour Palettes for Charts

I recently had to find a way to generate colours for charts. Specifically, the series in a chart — typically visualized using bars, lines, dots, or areas — are often distinguished using different colours which, for the most part, should be generated and assigned automatically. And while d3.js (on which the chart code was based) offers some pre-defined colour schemes which consequently happen to be used in most d3.js-based projects, they were quite limited for what I needed.

Read more...

Visualizing Data Using d3.js (With Examples)

The web browser has become our preferred user interface of choice. But even in 2015, I bump into fellow developers who view the web as nothing more than a bunch of companies’ online presences. Surely, a native Windows client or a Java SWT app must be more powerful than your average web browser. I would have agreed in the days of Internet Explorer 6 (which, by the way, already supported AJAX requests) but luckily, we are long past IE6 and there are now so many web technologies available to us it’s even hard to keep up.

Read more...

Find Similar Images with Duplo

I’ve released a Go library Github: Duplo. The library can be used to detect image duplicates or to find similars in a set of images. It is an implementation of Fast Multiresolution Image Querying by Jacobs et al. It works surprisingly well if you want to find duplicate images which may have been modified slightly (e.g. colour correction, different compression / file format, watermarks). Applications may include: Recognize copyright violations Save disk space by detecting and removing duplicate images Search for images by similarity The images themselves are not stored in the data structure. Read more...

My Talk at the Golang User Group Berlin Meetup

I gave a talk at Berlin’s Golang User Group (which is supposedly the biggest one in Europe at the moment). It was a quick overview of the duplicate image detection software I wrote in Go for Stock Performer. You can find the slides here. I will put the code on my Github profile very soon. There will also be a more extensive blog post about it.

Adventures in Clojure: The Font Manager

I’ve contributed to Github projects before but I’ve just now uploaded my first own Github repository: The Font Manager. It combines two things I’ve been wanting to do for a quite a while: Learn to program in Clojure Write a font manager / viewer that can look into ZIP archives There are lots of font viewers out there. But for some reason, I wasn’t able to find one that could search ZIP files. Read more...

Management, Leadership, Motivation, and SCRUM

I’ve worked as a project manager for about 8 years. While it involves a lot of politics, especially when the company or the customer you work for is a larger enterprise, a major part of a project’s success can be attributed to the project team. You definitely want the best team. And that does not necessarily mean the best individual players but people who can work together — comparisons with team sports usually hold. Read more...

Developers Unhappy at Berlin Startups

At many of these Berlin meetups that are happening almost every day now, I bump into developers employed at startups. Maybe it is the nature of these events but I have yet to meet someone who is happy with their employer and who is not looking for a new job. Naturally, I ask them what it is that they dislike so much about their job. The answers are surprisingly uniform. Read more...

Learning Swift

Started learning Swift. This seems to be a good moment to finally get into iOS programming. What I’ve seen so far looks ok, although I’ve recently started to really enjoy simpler languages (more on that later). The trend in the last few years seemed to be to add more and more “features” to a language based on whatever the trend is at the time. Generics, closures, features from functional languages. I don’t really think it’s needed — I’d like an OO language to remain OO, I don’t need it to become a functional language. Read more...

Are You Looking for a Technical Co-Founder?

Every day, I see job postings for “technical co-founders” or CTOs. Almost all of them from non-technical founders. I have to say I don’t know the overall success rate in hiring that person. But I’ve talked to many of them at meetups and the complaint that it is impossible to find that CTO is widespread. Part of it is certainly the limited supply of programmers, especially those willing to step into a founder role. Read more...

It’s Still Alive

I’m reactivating this blog. Initially, it was meant to be a joint effort between Luis and I, to document our path to becoming startup founders. We became those founders much faster than expected so that path wasn’t very long. Also, Luis feels he can’t invest that much time into writing for this blog so he’ll drop out. I will keep it up and it will be more or less my personal, professional blog. Read more...

Germany’s “Startup Incubators”

Since YCombinator came on the scene, a number of investors have also started to call themselves “startup incubators”. In Germany, there is a group of people who became quite successful with the ever-discussed copycat. Many of them have since gone on to become an incubator. The biggest ones are probably “Rocket Internet” and “FoundersLink” but there are more which may fall into this category. They basically have a list of copycat “ideas” which they would like to implement. Read more...

Hacker News Meetup #2

Meetup #2 We’ll have our second meetup on Tuesday, Dec 13, 2011 in Berlin. Here are the details: Date: Tuesday, December 13, 2011 Time: 20:30 (open-end) Location: Spreegold, Rosa-Luxemburg-Str. 2, 10178 Berlin Mitte (at Alexanderplatz) Spreegold Website http://www.goldapfel-berlin.de/ Link to Google Maps We want to get together to chat and to demo the projects we’re working on. (So bring a laptop.) There is also a post on Hacker News now for you to upvote. Read more...

Starting a Company (in Germany)

We’re at a point now with Stock Performer where we can take money for the service. If it was that easy. Sure, I could put my private PayPal account up there and risk a complete mixup with my personal purchases and Stock Performer subscriptions. And how would I deal with Luis’s part? He’d need to send me an invoice. And I would somehow do my taxes from that which I don’t even know how. Read more...

How Was Our First Hacker News Meetup Berlin?

I think we’re off to a good start! A bunch of us came out for a nice chat about Berlin’s startup scene, about technology, and generally to get to know each other. Since this was my “minimum viable meetup” I certainly wanted to know what everyone’s expectations were so we could develop it from there (and pivot if necessary). Simon suggested to take cues from the Berlin fine arts scene and throw more parties. Read more...

First Hacker News Meetup Berlin on May 17, 2011!

Meetup #1 We’ll have a Hacker News Meetup on Tuesday, May 17, 2011 in Berlin. A number of people have already announced that they’ll join us on that date. These are mostly people working at local startups, founders, and people generally interested in coding and working on interesting projects. We don’t have a specific agenda for that day so it’ll simply be an event where you can get to know other likeminded people. Read more...

We Already Launched!

You may wonder why there have been few posts in the last few weeks. Part of it has to do with my amazement how other founders can spend so much time writing thoughtful blog posts while running a startup. When I’m working on something intensely, blogging, tweeting, facebook-status-updating, even the hourly check of the HN front page comes as a distraction. And if I do need a healthy dose of distraction, I’d rather not spend it in front my computer, too. Read more...

The Fear of Burning Bridges

Is the act of leaving a well-paid, safe job behind to become an entrepreneur really such a small thing to do? I do read the occasional “I finally did it” blog post but there’s not much out there on the topic. Maybe it’s just me thinking about it too much (I’m pretty sure it is). But at the same time, I know so many people stuck in corporate jobs who dream about doing their own thing. Read more...

Business is Simple

There is something I still don’t quite understand. It is the observation that some people manage to always give confusing replies to simple questions. Apart from the obvious I-don’t-want-to-answer tactic, I think it boils down to two reasons: They either don’t notice that the listener is coming from a different point of view or their thinking is simply too complex. The latter one is dangerous and I’ll side with Scott Adams when he claims that after a certain complexity threshold, failure is inevitable. Read more...

Measuring Your Way to Success

The following story will remind some German readers of the great Loriot. As a teenager, I wanted to eat the perfect egg for breakfast. So naturally, I set up an experiment where I would vary the time the egg would cook in the boiling water as well as the heat setting of the stove. It took me about five or six tries to find the perfect procedure. My eggs came out consistently perfect. Read more...

A Few Startup Areas We’re Currently Discussing

In our search for a good place to start our venture, we’ve been discussing a number of ideas and areas. I’ll list them here although I know the discussion is far from finished. We haven’t done much research yet either. This is for you to join the discussion. Analytics: It seems people are data hungry. Money is being made by scraping statistics off sites such as iStockphoto and presenting them in a better way than what’s already available. Read more...

Here is Luis

Update May 12, 2014: I’m taking Luis’s “About” page off this blog. We agreed for me to continue this blog by myself. (I’ve been writing most entries anyway.) No worries, Luis and I are still running Stock Performer together. -Oliver I’m on this adventure too. I spent quite a few years at a big company with a solid job. But after accidentally transforming my photography hobby into a business, I realized how much fun it can be to do your own thing and see it succeed. Read more...

All You Need to Know About Oliver

The following text will be added to the “About us” page: As you can see, I have black hair and brown eyes. I haven’t played much soccer in my life. Nor did I drink much beer. But I’m still German. I am and have been a hacker for about 30 years now. My M.Sc. degree in CompSci got me some fancy job titles such as project manager and product manager. During my quarter-life crisis, I quit my secure, well-paid corporate job to become a full-time musician. Read more...

Four Ways to Start Up – Where Do You Stand?

There are four common ways to start an Internet business: The dot-com method: Come up with a revolutionary idea, write up a business plan, get VC money, hire a team of 50 people, burn through your millions in funding, and launch your fully developed website a year later. Lately, there is typically an intermediate step of getting angel money first. The bootstrapping / MVP method: Build an MVP — minimum viable product — first. Read more...

Welcome to Rent-a-Founder!

With this post, on August 17, 2010, we’re officially launching our blog “Rent-a-Founder”. Luis and I have long been talking about starting a company together. This is an attempt to document that journey and provide any insights gained along the way. The company does not exist yet. Heck, we don’t even have a business idea yet. Hence the name “Rent-a-Founder” which is an invitation to join in on the discussion and maybe even the ride itself. Read more...