Mirage hack retreat 2017

Written by Reynir Björnsson, Mar 20, 2017

Two weeks ago I was in Marrakech to attend the third Mirage hack retreat. It was the first time I was

After landing in the newly expanded airport I managed to meet up with a few other attendees. Luckily for me one of them had been to the hostel-turned-artist-collective(?) Priscilla Queen of the Medina. Otherwise I would have to find my own way! After about three walks I learned the route myself.

RAK airport (* TODO: scale image *)

In Marrakech the weather was really hot, and the sun strong. A week prior to arriving, I had had some pre-heating with 17 degrees in Vienna. It was still quite a big jump in temperatures; some days it was around 30 degrees, and with sun as strong as it gets on the warmest summer days in Denmark. The situation was made worse by me somehow forgetting to pack my shorts (I swear I put them out on the desk at home so as to not forget them!)

When not relaxing

When I was not relaxing, I spent most of my time working with Michele and others updating his Let's Encrypt / ACME client. Before arriving I had mentioned I had mentioned on the mailing list that the Let's Encrypt client was something I wanted to work on. My motives were, however, mostly about getting something I could start using rather an interest in working on this. It turned out to be a lot of fun to work with Michele and others on this. A lot of my time on this project went in to handling accepting the terms of service. To this day it's still a mystery how exactly you're supposed to do this. The implementation works for most use cases, but there is still a corner case where it doesn't work: A new client registration was initiated but not completed e.g. due to network errors - it's then a mystery to me how one is supposed to retrieve the terms of service. Besides the ToS handling, we managed to implement some cool features!

Getting distracted

While working on the Let's Encrypt client I had an idea and a sudden urge to implement this idea. In utop you can #show the type of values and the structure of modules. However, if you want to access the documentation strings you have to fire up another program called ocp-browser (from the package ocp-index; hit alt+h to access help information in ocp-browser). This is a distraction to my work flow. I thought to myself 'why is this not accessible from within utop?' So I started investigating how ocp-browser works, and I discovered ocp-index provides a library. Perfect!

So I spent half a day trying to figure out how to get the path to lib inside your current opam switch using opam-lib. After finally figuring this out I could query the doc strings of functions using the library. Next step was implementing this as a OCaml toplevel directive. Thanks to Rudi I avoided spending another half-day trying to figure out how to do something not-so-well-documented. It culminated in a repository which can be pinned and installed in opam as ocp-index-top. I ended up removing the opam-lib dependency and shelling out to opam config var lib instead as ocp-browser does. I found this inelegant, but unfortunately the opam-lib API seems to be unstable and resulted in a couple of version conflicts and downgrades when other people wanted to install my package. It's still a bit of a hack but It Works For Me

An SSH library

Another project I worked on (barely) was awa-ssh by Christiano. It's a SSH library in pure OCaml. It was a project I was excited about because SSH is a protocol I use often and many times a day, and I find the protocol itself interesting. For example, the protocol can be used as a chat client or for RPC. Christiano suggested I first read (some of) the RFCs for the protocol in order to get a basic understanding. I did so, and the next day I had read up some on the first steps in the protocol. He then showed me how the code was structured, and I played around with a test server. Immediately I found a bug! My client sends a version string SSH-2.0-OpenSSH_7.4p1 Debian-6. The bit before the space character is the version information while the bit after is a comment string. The dash (-) in the comment threw off the parser, and it deemed it an invalid version string. A test case was added and I then proceeded to fix the bug and got it merged. What a start! I hope to spend some more time looking, and hopefully contributing, to this library. … Once I find time!

Overall it was a pleasant experience, and I look forward to joining next year!