I am Christian Johansen. I make my living as a software developer. My hobbies include playing, recording and mixing music, baking, brewing, cooking, and board games. Check out my resume if you're interested in my work, or would consider hiring me for your project. I occasionally tweet as @cjno.

Blog posts

Stateless, data-driven UIs

A practical example of how to write stateless, data-driven UIs

Partitioning data

Functions like map, filter, and reduce are useful tools that many developers keep in their toolbox. partition may not be as commonly known, but in this post I'll show you why it should be.

Proper URLs for your SPA on S3 behind Cloudfront

In this post I'll show you how to use Lambda@Edge to give JavaScript frontends ("Single Page Applications") on AWS S3 behind Cloudfront proper URLs even when all you have is a single HTML file and some JavaScript.

Editing for cleaner merges

As we add new code to existing files, it feels natural to append – add new functions at the end of the file, new requires at the end of the list of requires, and so on. This approach introduces some friction, and in this post I'll share some pointers for improved editing and git workflow.

Devops! Dev? Ops!

Det skorter for tiden ikke på bedrifter i IT-sfæren som skryter av at de driver med Devops. Men gjør de egentlig det? Hvis løsningen er et "devops-team" eller stillingsutlysninger for "en devopser", er sjansen dessverre liten for at vi henter ut det beste devops har å by på.

JavaScript Coercion 101

Det er lite vi utviklere elsker mer enn å peke på galskap i JavaScript, så som [] + 2 === "2", men dersom jobben din er å skrive kode i dette språket, eller språk som kompilerer til JavaScript uten å skjule denne oppførselen (eksempelvis TypeScript og ClojureScript) vil du spare mye tid i feilsøking og koding ved å forstå hvorfor ting er som de er.

Når AWS-regninga blir skyhøy

Det er fort gjort å komme opp og gå i skyen, men før du får sukk for deg har du en løsning der du nærmest skuffer penger i retning Amazon. Hva gjør du den dagen du oppdager at AWS-regninga er mye høyere enn du hadde forventet?

AWS Free Tier

Dette er en liten historie om hvordan EFS nærmest tok livet av Kubernetes-clusteret vårt, og hvordan du kan unngå å havne i samme knipa — selvom du ikke bruker EFS.

CSS Grid

CSS grids har endelig gitt oss en enkel og fleksibel modell for layout på nett. Med bare noen få properties kan du stort sett pakke float helt bort, få full kontroll over kilde-rekkefølge og et kraftig verktøy for responsiv design på kjøpet.

A Better Playlist Shuffle with Go

Shuffling music playlists with less random and more cleverness, using Go.

Clojure in Production with tools.deps

A lean and fast setup for packaging Clojure applications for production using tools.deps

tools.deps, figwheel-main, Devcards, and Emacs

A primer on setting up a ClojureScript project with tools.deps, figwheel.main, devcards, and optionally Emacs.

A Unified Specification

An approach to describing the structure of data in ClojureScript applications in one place, and using it to power Datascript schemas, specs, and coercions for data from external sources.

Git Subtree for Multiple Directories

How to split Git repos.

Annotating Datomic transactions

Datomic creates a transaction entity every time you transact data. These entities can be freely extended for a multitude of use cases.

Querying across Datomic databases

Among its many, many unique and interesting features, Datomic supports datalog queries across multiple databases. I recently had a chance to actually use this feature, and thought I'd share an actual example of it.

Clojure to die for

A selection of the details that makes Clojure such an enjoyable language to work with.

Building static sites in Clojure with Stasis

An in-depth code-along guide to building static web sites powered by the Stasis library.

An introduction to Emacs Lisp

A long, thorough introduction to programming in Lisp in general, and Emacs Lisp in particular