mime-types 3.0 for Ruby

It’s almost a week later than I had planned, but I released mime-types for Ruby versions 2.99 and 3.0 today. These are hard releases to describe succinctly—there are no new features added to either one, but both are important and I am excited about what will come next.

mime-types 3.0

The release of mime-types 3.0 is a bit more complex. In mime-types 2.6, Jeremy Evans (of Sequel and Roda) implemented a columnar data store for the registry. This reduced the mime-types memory footprint on average 25% percent and in some cases much more. There was much rejoicing by people using Rails or the Mail gem. It’s a good change—but I still marked it experimental. I felt that there could be further improvements, and I was in the process of trying to figure out what mime-types 3.0 would look like.

Over the last few months, the changes and features for version 3 have been considered and reconsidered, and it came down to the following changes:

  1. Remove all data, methods, and parameters deprecated in mime-types 2.x.
  2. Move forward on Ruby compatibility, requiring Ruby 2.0 syntax support or better to run (issue #97).
  3. Relicense mime-types as MIT (issue #95).
  4. Extract the data from mime-types to permit independent iteration on the releases (as mime-types-data).
  5. As the release date was approaching, I also decided that it was important to add a code of conduct to the projects under the mime-types organization.

All of these objectives were achieved, and a number of issues were resolved in the process. More code was changed than is visible1, but there are no new features added in this release.

mime-types 2.99

The release of mime-types 2.99 is easier to describe: this release is made to establish the end of life timeframe and to prepare users of the mime-types library for mime-types 3.0 while getting the benefit of modern data. It falls under the code of conduct adopted by the project, and all fields that were deprecated under mime-types 2.x have been modified to return empty or nil responses. It also marks the first of nine planned releases before mime-types 2.x reaches end of life (there may be additional releases if there is a security issue found in mime-types 2.x). Those additional releases will be:

  • 2.99.1 - February 2016
  • 2.99.2 - May 2016
  • 2.99.3 - August 2016
  • 2.99.4 - November 2016
  • 2.99.5 - February 2017
  • 2.99.6 - May 2017
  • 2.99.7 - August 2017
  • 2.99.8 - November 2017 (EOL release for 2.x)

After 2.99.8, there will be no further releases of mime-types 2.x for any reason, and security release support ends on 2017-11-21.

mime-types 2.99 is still licensed under the original triple disjunctive license (MIT, Perl, and GNU GPL).


  1. The tests were completely rewritten so that I understood what my tests were actually doing. Some of the tests were ten years old and weren’t entirely relevant to mime-types 2.x or 3.x.

The mime-types Project

I am making changes to how I’m going to be running the Ruby mime-types project moving forward, and I made the first step in those changes last night. These changes won’t be fully finalized until later this year. This article outlines those changes that have been started and where they will be finished.

A Message from the Ansible

Have you gotten the Ansible working yet?

Not quite yet. Just a little more tweaking. Ah, there we go.

Yes, that’s much better. We’re now back online.

Markdown: Generating Heading IDs

In late October, I submitted a pull request (#125) to blackfriday, a Go package for processing Markdown, in order to satisfy a feature request deemed useful for Hugo (GitHub-style header generation).

Bastille in Toronto, October 2014

I saw Bastille last night at the Air Canada Centre, and “Bad Blood: The Last Stand” was a pretty damned good show.

Plumage: A RubyMotion CLI App

I wanted to play with terminal.sexy1 recently to see if I wanted a different terminal colour scheme—but as I use Terminal.app, I needed to convert the colour scheme to the iTerm 2 format for import.

Ruby Net::LDAP Under New Management

TL;DR: Net::LDAP for Ruby is under new management: Michael Schaarschmidt (@schaary). Back in 2003, I registered the net-ldap project on RubyForge. I had time available, and I thought I needed LDAP for a project I was working on. As I started looking at the implementation of LDAP, I found that there were things more interesting and more pressing that I could work on. Then, as now, I wasn’t sure that I wanted to understand LDAP.

New GPG Key


This article was modified from its original published form. The most recent modification was on2016-05-15.


I lost the passphrase to my old GPG key (0xA9A860E2) and have replaced it with a new key (0xD0EAF204). It’s available on Keybase.io.

I have also put it on a dedicated PGP/GPG Key page.


  • 2016-05-15: In my most recent site restructuring, I moved my PGP key from my About and have placed it on the its own PGP/GPG Key page. This post has been updated to point to it in the appropriate location and the embedded version has been removed.[ back ]

mime-types for Io

Welcome back. I haven’t posted here in five and a half years and the website has been offline for at least two years, but that will be changing, starting now.

I recently finished reading Seven Languages in Seven Weeks. As an exercise, I ported mime-types for Ruby to Io on the 17th of September.

Series: Seven Languages

FOSSLC Panels and Me

I’ve been extraordinarily fortunate recently to be invited to participate in two panels presented by FOSSLC and hosted by the University of Toronto.

Mac Recipe Management Programs, Planning a Revisit

Mostly through a couple of bundles that I’ve purchased recently, I have acquired full licences to Acacia Tree Software’s SousChef and MacGourmet Deluxe (which is, remember, MacGourmet with all of the plug-ins included).

Mac Recipe Management Programs

Aw, Damn (Au Revoir, M Decoux)

Vacationing with the iPhone

A Legend Passes

More Old Magazines

Amnesty International Condemns Canada on Death Penalty

Medical Office Magazine Collections

There’s a Ruby debugger?

Why I (now) wholeheartedly support MMP

Andrew Coyne: Why conservatives should support proportional representation

Is there anybody going to listen to my story…

On Derek Sivers’s return to PHP…

Ontario Votes: Voting Format Referendum

Beyond time

RubyConf 2006—Day 3 (Sunday, 22 October 2006)

RubyConf 2006—Day 2 (Matz’s keynote, Saturday, 21 October 2006

RubyConf 2006—Day 2 (Saturday, 21 October 2006)

RubyConf 2006—Day 1 (Friday evening, 20 October 2006)

RubyConf 2006—Day 1 (Friday, 20 October 2006)

RubyConf 2006—Day 0 (Thursday, 19 October 2006)

Ruby on Windows: A Note for Microsoft

D*ck T*ping and Semantics

ARIEL: A Mentor’s Mini-Review

Vacation Rubyist Meet Wrapup

Deutsches Rubyists

London Ruby Users Group

Rubyists in London, Germany, Amsterdam?

Eggplant Curry

Pumpkin Cheesecake

Complex Data Structures in PL/SQL

An Extremely Brief Introduction to PL/SQL