My Ideal Kolab

We live in the age of the Internet. Here is how I would like to see some of my favorite software libre Internet applications grow.

Combine Tiny Tiny RSS and Kolab/Roundcube. This would allow for reading news feeds from any browser and also from SpaRSS, with read and unread items synchronized. Perhaps audio broadcasts could be supported as well, synchronizing AntennaPod with browser based listening.

Combine the Kolab Notes Android application with AnkiDroid, giving the latter a libre network service to synchronize with.

Email parsing, calendar event creation, and spreadsheet-like math capabilities on the calendar. These I’ve been trying to do a little something about with my finctrl project and cashflow calendar posts.

Featured on Hacker Public Radio

This fall I wrote a script to find random libre licensed songs on Jamendo (as opposed to what I’ve started calling the “fractional freedom” -NC and -ND licenses). Downloading 35 songs, I listened to them during my commute.  Leaving the ones I thought I would enjoy listening to again marked as unread, I made several passes through the list. The final cut left only 8 songs, for an acceptance rate of 23%. I added introductions and stitched them together during ConleyCon 6 in San Diego, using the Sound Recorder application on my phone and Audacity on my laptop. Hacker Public Radio episode 1928, was published on the Web about a week after ConleyCon 6! I wish I had known a little more ahead of time exaxtly what to include (Title, Author, Source, License) in the show notes and how I could input them, but Klaatu of HPR helped fill them out my fumbling first time and now I know what to do for the next edition!

finctrl Goes Live

After working on many prototypes, setting up cgit, receiving permission from my employer to publish, presenting the idea at ConleyCon 2015, and finally switching from shell scripts to Python, I am pleased to present the first code commit to “finctrl”, my attempt at automating financial control. Please find the repository at It currently works by downloading email notifications of transactions from a “Cashflow” IMAP folder and parses them assuming the winter 2015 format. Support for additional input and output formats will hopefully follow soon. (I’ve got shell scripts for Chase; it should be quick and easy to port that to Python, but making a generic framework may take significant work.)

Setting Up Cgit on Debian

In order to publish the source code for the personal finance scripts I’ve been working on, I needed to set up a git repository. I don’t want to use a proprietary service like Github to publish my libre software. So until the project is popular enough to justify inclusion into an umbrella project like GNU or Kolab, I figured I’d host it myself on my inexpensive Scaleway ARM server.

I like content addressable networks, and it would be really neat to host the git repository on something like IPFS. But my experience to date with IPFS is that it’s not production ready. So for now, cgit via HTTP seems to be the path of least resistance.

The process of setting up cgit on a Debian server wasn’t as well documented as I had hoped. So here is a brief, after-the-fact writeup to hopefully improve the available documentation. I wasn’t exact in recording my steps, so there may be typos or omissions. Please let me know if you find any and I’ll try to quickly fix them.

First, I installed Apache and cgit. (If both were equally easy to deploy, I might prefer nginx to Apache, but the cgit Debian package ships an Apache configuration file, making it the easier-to-deploy option.)

sudo apt-get install apache2 cgit

Next, I needed to enable CGI. This is an essential step that I didn’t see documented in many of the blog howtos that my searches found, but it was mentioned on the excellent Arch Wiki article.

cd /etc/apache2/mods-enabled
ln -s ../mods-available/cgi.load

The last essential configuration step was to enable the cgit configuration file.

cd /etc/apache2/conf-enabled
ln -s ../conf-available/cgit.conf

This is optional, but I edited the default configuration to use /git/ instead of /cgit/. Restarting Apache was necessary to have the configuration changes take effect.

service apache2 restart

Here is the result: I may try to set up DNS to point to that one day, but the static IP should suffice for now.

Featured on

I made a puzzle out of one of David Revoy‘s excellent Pepper and Carrot libre web comic illustrations a while back and wrote in to the author. Here is his post about my libre licensed Pepper and Carrot puzzle. (Apologies for the poor picture quality–it’s what we had on hand.)

I regret to say that my little boy has since slobbered and munched on the pieces so much that, while they held up for a long time, at least one of them has come apart (and another piece is missing). I had a few copies made with the foreknowledge that the first one would eventually be lost, destroyed, or both. I’ve already given one away and now I plan to hand out the other to friends with kids as well. So I guess I’ll have to make a new one with a different picture for the replacement. Suggestions welcome.

My Inter Planetary File System

I’ve long found peer-to-peer networking interesting. Some time ago, I realized that in the context of peer-to-peer networks, libre licensed content has a compelling advantage over proprietary content. Sharing libre licensed works on a peer-to-peer network is clearly legal, while the situation for proprietary content is murky at best.

So, to experiment with a new (at least to me) peer-to-peer network, IPFS, I’ve set up node on my recently rented Scaleway (ARM-based) private server. You can find a few libre licensed songs I like at the link below. If it works out, I’ll add more down the road.

Update: The server is crashing. I’m not sure if the IPFS code, libraries, ARM Go port or what is to blame. Until further notice, the following URL is probably unreachable.

I also wonder how difficult it would be to resurrect or build upon the DebTorrent effort, this time using IPFS. While I must admit ignorance on the details of how IPFS compares to BitTorrent, from what little I’ve read, IPFS uses many of the good ideas from BitTorrent while providing better backwards compatibility with the ubiquitously supported HTTP.

The Future of Programming

I have read that children are far more capable than adults at learning languages. I value being able to communicate with machines pretty highly, so I’ve set an arbitrary goal of teaching my children to program by age three. It seems like the most popular way to teach children to code is with Scratch or a derivative. While searching and reading about that, I stumbled across Catrobat Pocket Code. I think this is the future of programming. For many people, smartphones are either the only general purpose computer available or the most available general purpose computer.

I just wrote a simple glide-and-change-the-picture-on-touch application as a hello world and am excited. I how that hitherto successful libre projects such as Mozilla and GNU start to take mobile more seriously. I hear view source is in the works for Fennec and that’s a great move in the right direction. Now to just suggest to F-Droid that they include Catrobat Pocket Code and Pocket Paint, although it looks like an Iceweasel style renaming may be required.

Scripting Kolab Calendar Interactions

As mentioned previously, I would like to be able to do spreadsheet like calculations on my Kolab groupware calendar. Here is how I’m currently attempting that. There were a couple challenges that made this take longer than I had hoped. The first was making sure that, given two processes communicating via a pipe, closing the upstream process didn’t prematurely end the downstream process. This is what the funny redirection is for. The second issue that caused me grief was the carriage return character echo -en '\x0d', present in IMAP results. It caused bash -x output to be really confusing. An extra operation while sed’ing took care of it.

#!/bin/bash -x

username="[email protected]"

rm -f out result
mkfifo out result

  echo "1 login ${username} ${password}"
  echo '2 select Cashflow'
  echo "3 search sentsince ${lastsunday}"
  echo '4 logout'
  sed -nr '/^\* search.*/I {
             s/^\* search +//I
             s/ *\r$//
             s/ /,/g
           }' out > result
) | openssl s_client -starttls imap -connect &> out &

msgs="$(cat result)"

  echo "1 login ${username} ${password}"
  echo '2 select Cashflow'
  echo "3 fetch ${msgs} body[2]"
  echo '4 logout'
  cat out > result
) | openssl s_client -starttls imap -connect &> out &

cat result

#do math
#use imap append command to create new (or what else to modify?) entry

Next steps are to use string processing (probably sed) utilities to extract the icalendar XML and xmlstarlet to parse it (beware the namespace).