An Architect's View

Clojure, Software Design, Frameworks and more...

Clojure 1.10's Datafy and Nav

| Comments

One of the more mysterious new features in Clojure 1.10 seems to be the pairing of datafy and nav (and their underlying protocols, Datafiable and Navigable). Interest in these new functions has been piqued after Stuart Halloway showed off REBL at Clojure/conj (video). Stu presented this functionality as “generalized laziness”: datafy produces a “data representation” of things and nav lets you (lazily) navigate around that data.

Excited About Clojure/conj

| Comments

It has been a crazy busy year, both at work and personally, and it’s hard for me to believe my last blog post was in April!

Clojure/conj is coming up fast and the schedule was posted today, which has made me even more excited about it. Here’s a run down of the sessions I plan to attend – I’ll write up my thoughts on everything shortly after the conference.

  • Welcome Event – I’m hoping my flight is on time and Lyft can get me there in time to chill and network with all the interesting Clojurians!
  • Stuart Halloway – In his recent Apropos podcast, he hinted that this talk would be about new tooling he has been using. Maybe prepl-related?
  • Christopher Small – Clojure on the cyberpunk frontier of democracy – This sounds fascinating.
  • Chris Johnson Bidler – Serverless-ish: Zero to App with Datomic Cloud and GraphQL.
  • Ghadi Shayban – Java Made (Somewhat) Simple – Although Ghadi told me this might be a beginner/intermediate-level talk, he’s a great speaker and I look forward to hearing his insights about the platform.
  • Boris Kourtoukov – Machines that Judge Us.
  • Tiago Luchini – Declarative Domain Modeling for Datomic Ion/Cloud.
  • Lily Goh + Dom Kiva-Meyer – Robust APIs with clojure.spec & GraphQL – I’m a huge advocate of spec and we’re also using GraphQL at work so this should be very applicable.
  • Rich Hickey – Maybe Not – Rich is always worth the price of entry!
  • Unsessions – Looking forward to seeing the schedule for these. Past years' unsessions have included some real diamonds!
  • David Chelimsky – AWS, meet Clojure.
  • Ben Kamphaus – AI Systems: Foundations for Artificial Minds or Aaron Cummings – Making Memories: Clojure For Hardware Engineers (And Others). I’m undecided but leaning toward the AI talk.
  • Elena Machkasova – Babel: middleware for beginner-friendly error messages – Anything that helps with Clojure’s error messages (much improved in Clojure 1.10!) is always worth learning about!
  • Wilker Lucio da Silva – Scaling Full-Stack Applications Over Hundreds of Microservices or Daniel Gregoire – Tables Considered Helpful. Undecided again but leaning toward the table talk.
  • Nikolas Göbel – Reactive Datalog for Datomic or Tyler Hobbs – Code goes in, Art comes out. Undecided but leaning toward the Datalog talk (because I’m not hugely interested in art/computing).
  • Gary Fredericks – What Are All These Class Files Even About? And Other Stories – Having been repeatedly bitten by AOT, I’m looking forward to this!
  • Tomomi Livingstone + Hans Livingstone – Party REPL — A multi-player REPL built for pair-programming – This looks very, very interesting!
  • Rebecca Parsons – Closing day two keynote.
  • (Party!)
  • Carin Meier – Can you GAN? – No idea about the topic but Carin is always an engaging speaker.
  • Dave Fetterman – Learning and Teaching Clojure on the job at Amperity – Because coming up to speed (and bringing others up to speed) is important.
  • Vikash Mansinghka – Probabilistic programming and meta-programming in Clojure – WAT?
  • Alex Engelberg and Derek Slager – Every Clojure Talk Ever – Cryptically enticing…

All the Paths

| Comments

With the recent arrival of clj and tools.deps.alpha as a “standard” lightweight way to run Clojure programs and the seed for tooling based on deps.edn dependency files, it’s time to take a look at the terminology used across Clojure’s various tools.

Boot Localrepo?

| Comments

Sometimes you just can’t help having a “random 3rd part JAR file” in your project. The best practice is, of course, to upload it to your preferred Maven-compatible repository via whatever service or software you use for all your in-house shared artifacts. But sometimes you just want to play with that JAR file locally, or you haven’t gotten around to running your own shared repository.

If you’re using Leiningen, you’ll probably reach for the excellent lein-localrepo which lets you “install” your random JAR file into your local Maven cache (in ~/.m2/repository).

What do you do if you’re using Boot instead?

Release 0.7.0 of

| Comments

The stable 0.7.0 release of java.jdbc – the Clojure Contrib JDBC library – has been baking for over a year, across of a trail of alpha and beta releases, and is now, finally, available!

While you could read the java.jdbc Change Log to figure out what is new in this release, I thought it would be easier to consolidate all the changes into a blog post, with changes organized by category, and provide justification for the various changes.

Seancorfield/boot-new Has Moved to Boot/new

| Comments

I’m pleased to announce that the “Boot new” task formerly known as seancorfield/boot-new has moved to the Boot organization, as boot-clj/boot-new and that the group/artifact ID is now boot/new.

You can use this to easily create a new Boot-based project:

boot -d boot/new new -t app -n my-new-boot-app

Clojure, New Relic, and Slow Application Startup

| Comments

A couple of years ago, I blogged about instrumenting Clojure for New Relic monitoring and we’ve generally been pretty happy with New Relic as a service overall. A while back, we had tried to update our New Relic Agent (used with our Tomcat-based web applications) from 3.21.0 to 3.25.0 and we ran into exceedingly long application start times, so we rolled back and continued on with 3.21.0. Recently, we decided to update the Agent to 3.30.1 to take advantage of advertised performance improvements and security enhancements. Once again we ran into exceedingly long application start times.

An application that took just over four minutes to start up fully with 3.21.0 was taking around forty minutes to start up with 3.30.1 – an order of magnitude slower!

Start Your Engine

| Comments

Today I’m inspired by the latest issue of Eric Normand’s Clojure Gazette which talks about why his “Joy of Programming” comes from learning and exploration.

I got into programming as a child because I was curious about solving puzzles and problems: given the (relatively) limited vocabulary of a programming language and its input and output features, and some interesting problem that came to mind, can I solve it in a usable (and hopefully elegant) way?

Over the years, I’ve written a lot of fun little programs to solve all sorts of interesting puzzles and problems that I’ve either run across or invented just to amuse myself. I learn different programming languages to learn new vocabularies for solving problems, and new ways of looking at problems.

Some of those programs become libraries that I’ve ended up using at work in one form or another, some become open source projects where I’m pretty much the only user, a very small number become widely used projects.

More Boot

| Comments

Back in February I talked about boot-new and talked about a “future 1.0.0 release”. We’re not there yet, but generators got added in release 0.4.0 and, in the four minor releases since, the focus has been on refactoring to match the core Boot task structure and improving compatibility with Leiningen templates. At World Singles, we’ve continued to extend our usage of Boot until we have only a couple of Ant tasks left and we expect those to be within Boot’s reach soon. In this post, I want to cover some of the things we’ve been doing with Boot recently.