Projects

matthias on 2017/12/05

Introduction

Over the years, I have been active in many software projects. Here, I mostly talk about the projects I worked on outside a structured environment like a university lab or a job. They feel like valuable contributions to me but without this page, they would be under-represented on my resume. Since most of these projects are open-source, you may also be interested in this list because you are trying to solve problems that are similar to mine.

I first present the most relevant projects: those are either still useful (to me) or contain significant contributions. Later, we go over other projects that I either don’t use anymore or where my input feels small.

Major projects

tim - a commandline-based time tracker

In 2015, I set out to track how I used my time. The goal was to hold myself accountable for and thus ultimately reduce all sorts of side-tracking and random research during the day. When I looked around for helper applications, I found them either unnecessarily complicated, not private enough or lacking in query functionality.

To address that, I took the application with the smallest interface I could find, ti, simplified that further and combined it with the powerful query engine from hledger which I already knew. That’s how tim was born. You can find it at github/MatthiasKauer/tim.

Today, I still believe in tim’s simplicity. There are, however, some alternatives that track computer usage automatically now and I want to look into those. ActivityWatch seems like a good starting point if you are interested in that as well.

croncoat - a cron job wrapper with timeout and email behavior that keeps you sane

Cron is the main scheduling mechanism on Linux. By default, output from cron jobs is sent to the local email account of the user that ran the job. This is not helpful on small servers where you did not bother to setup an email server. Even if you did set everything up to receive these emails correctly, you may be frustrated by the amount of emails you receive.

When you have many tasks running, it becomes difficult to see which emails are relevant. Like cronwrap and cronic, croncoat hence implements email filtering: By default you will only receive email for tasks that actually failed.

In addition, croncoat

  • can kill and report on tasks that do not terminate in a timely fashion.
  • uses Python for emailing instead of system tools that turned out to be more platform-dependent than expected.

You can find croncoat at github/MatthiasKauer/croncoat.

Pybumper - a self-hosted email reminder service

Pybumper is one of my first Python projects. I wrote it because I liked the idea behind followupthen but didn’t like the idea of having my email data stored on someone else’s server. You can send emails to, say, “7d.bp@yourdomain.com” and Bumper will send your email back to you in 7 days.

The setup is involved, the code should be cleaned, and I have lots of ideas for it. On the other hand, I am reluctant to make changes because this service is helping me greatly and without issues since late 2014 now.

Other open-source contributions

codeforces-parser

Codeforces is a competitive programming platform. I go there every once in a while to practice my understanding of algorithms and to explore the corners of new programming languages that I am learning.

To interact with the the codeforces website, I use codeforces-parser, a tool to download the problems of a contest to work on them locally.

Over the years, I have contributed the following features.

  • Made programming language selectable and added templates for: C++ 14, Kotlin, and Go.
  • Added debug prints that can be selectively activated with a flag but normally do not disturb.

hledger - a plain text accounting tool

Plain text accounting is a movement started by ledger back in 2003. Realizing that double-entry quickly becomes overwhelming with Excel, people typically use databases for accounting. For the user, this means that his data is typically hidden behind a graphical or web interface.

Personally, I have slowly converted all my accounting to hledger, a ledger-compatible tool written in Haskell. Besides using hledger, I have also written documentation about tracking investments and attempted to improve its csv import functionality. That improvement didn’t work out, however, because my Haskell experience was limited and because we couldn’t agree on the behavior in certain corner cases.

2017

hs-duktape - embedded Javascript in Haskell

Duktape is “an embeddable Javascript engine” in C. It is wrapped for use in Haskell in hs-duktape. I wanted to know whether this project cleanly compiled on Windows so I tried it out and contributed a configuration for continuous integration with AppVeyor.

sncli - a commandline client for simplenote

Simplenote is a text-based notetaking application with excellent synchronization and clients for the web as well as major mobile and PC operating systems. sncli is a commandline client for this system. Besides bug reports, I contributed the initial implementation for opening the user text editor at the correct position.

Julia - dynamic programming language for numerical computing

I have been enamored with Julia as early as 2014. In 2017, I explored it again and realized that it is now robust enough to consider it for smaller production applications. During my experimentation, I fixed a small issue in the documentation.

2015

pyalgotrade - algorithmic trading in Python

pyalgotrade is an event-driven algorithmic trading library for Python. I used this library extensively for back-testing as well as for semi-automated trading. Along the way, I found some bugs that I fixed and contributed back.

Rust - a safe systems programming language

I made a small documentation change in the rust programming language repository that I am unreasonably proud about.

2013

Flatex report parser - extracting accounting data from PDF files

flatex_report_parser is an early attempt to automate my accounting woes. Here is the article I wrote when I released it.

At the time, Flatex, a German broker, did not offer csv downloads yet so I tried to gather the data from PDF files. The regex approach I took for that turned out to be rather brittle. When Flatex finally offered csv files, this project became obsolete.

Recently, I found that the csv files from Flatex do not contain all the data I need. Maybe it is time to revive this project.