Clojure Start Time in 2019

From 2011 to 2015, I wrote an annual Clojure Year in Review post, attempting to summarize all the interesting things that happened in Clojure in the last year. After 2015, I gave up. There was just too much happening, and I couldn’t keep track of it all.

A couple of years ago, I got tired of the “Clojure start-up is slow” meme so I decided to measure it. I found that, yes, Clojure does take a measurable amount of time to boot, but the actual start time is dominated by tooling and libraries.

Since then, new ways of running Clojure have been popping up all over the net. I decided to repeat the experiment with all the ones I could find. Think of this as the “Clojure Runtime Platforms Year in Review” for 2019.

Continue reading →

Old Fashioned Web Analytics in a Newfangled Serverless World

In case you didn’t know, I started a podcast this year: No Manifestos.

One of the interesting things about podcasting is that it’s difficult to know who’s listening. This has even been suggested as the reason for the genre’s success, as it prevents the aggressive tracking and reductionist analytics that have made such a cesspool of the rest of the web.

But occasionally I am curious. At the least, I want to know, roughly, how many people are listening. How can I find out?

Continue reading →

Clojure Don’ts: Thread as

A brief addendum to my last post about Clojure’s threading macros.

As I was saying …

I said you could use as-> to work around the placement of an argument that doesn’t quite fit into a larger pattern of ->. My example was:

(-> results
    :matches
    (as-> matches (filter winning-match? matches))
    (nth 3)
    :scores
    (get "total_points"))

This is not a good example, because filter is a lazy sequence function that should more properly be used with ->>. And I warned explicitly against mixing -> and ->>.

Here’s a better example.

Continue reading →