Two weeks ago I was in Marrakech to attend the third [Mirage](https://mirage.io/) [hack retreat](http://marrakech2017.mirage.io/).
It was the first time I was
* attending the hack retreat,
* in Morocco,
* and outside Europe (although just barely)!
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](http://www.queen-of-the-medina.com/en/index.html).
Otherwise I would have to [find my own way](https://www.youtube.com/watch?v=zgzwmyxlKBE)!
After about three walks I learned the route myself.
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](https://github.com/mmaker) and others updating his [Let's Encrypt / ACME client](https://github.com/mmaker/ocaml-letsencrypt).
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](https://github.com/rgrinberg) 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](https://github.com/reynir/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](https://github.com/haesbaert/awa-ssh) by [Christiano](https://github.com/haesbaert).
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](https://medium.com/@shazow/ssh-how-does-it-even-9e43586e4ffc).
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](https://github.com/haesbaert/awa-ssh/pull/2).
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!