Core.Command (and the closely-related Async.Command) is an OCaml library for creating command line programs with nice interfaces (including help text and argument parsing). This article is an overview of Command.Param, the newer interface for defining your command’s arguments (replacing Command.Spec).
FreeTDS 0.91’s TDS 7.1 support is buggy
This is a short post to document an issue we ran into at work so it will show up in search results for people who have this problem in the future.
tl;dr:
- Use FreeTDS 1.0 if you can.
- If you’re stuck on FreeTDS 0.91 (and possibly other pre-1.0 versions), don’t use any TDS version above 7.0.
The minimum viable XLSX reader
I recently finished a basic XLSX reader for OCaml and I thought it would be a good time to summarize what’s necessary to make a library like this, since the documentation is complicated and sometimes hard to find.
What is a monad?
From a non-theoretical engineer perspective, a monad is a kind of container that you can apply functions to to get a new monad. In particular, you need a way to put something into your monad and a way to apply changes to it. These are called return and bind. There is also a third operation, map, which is a combination of the two. Note that monads are allowed to be empty, which will make bind and map not do anything; and they can also contain more than one thing (in which case bind and map will call the function you give them more than once and merge the results).
ZIP vs tar for compressed archives
The main difference between the two formats is that in ZIP, compression is built-in and happens independently for every file in the archive, but for tar, compression is an extra step that compresses the entire archive. This means ZIP has better random access while tar+compression will generally provide better compression.