Skip to content

Instantly share code, notes, and snippets.

Zach Oakes oakes

Block or report user

Report or block oakes

Hide content and notifications from this user.

Learn more about blocking users

Contact Support about this user’s behavior.

Learn more about reporting abuse

Report abuse
View GitHub Profile
View dueling_banjos.alda
guitar: o3 b8 > c8 d4 < b > c < a b g a %1
banjo: @1 o3 b8 > c8 d4 < b > c < a b g a %2
guitar: @2 o3 b8 > c8 d4 < b > c < a b g a %3
guitar: @3 d1 g4 g a b g b a1 %4
banjo: @4 g4 g a b g1 %5

Boot and deps.edn

At some point, we all decided that scripting builds with executable code was a bad idea, so we tossed out makefiles in favor of specifying our builds in a data file (package.json, build.xml, project.clj, etc) and having a build tool do the heavy lifting. These data files could be leveraged by IDEs and other tools. When projects inevitably need to do things their build tool couldn't anticipate, they use plugins or bash scripts in order to...script their build with executable code. Oops.

The truth is, we never stopped scripting builds, we just made it more annoying. In Clojure land, the things Leiningen can't do just end up in a plugin or an ad hoc bash script. To make matters worse, the project.clj format isn't even technically static data, because it is very willing to execute code. It is the worst of both worlds: more restrictive and idiosyncratic than normal code,


How Clojure's documentation can leapfrog other languages


I made a documentation generator that cashes in on Clojure's dynamism. See the play-cljs docs (a ClojureScript game library) for an example of its output.

The Problem

Like many of you, I've often wondered what my final regret will be on my deathbed. My best guess came to me in a dream recently. I was walking across the charred earth of an apocalyptic future world, maneuvering around the remains of the less fortunate. I was startled to find a young girl, barely holding onto her life. She murmured something to me. I asked her to repeat it, and she said more loudly: "I...wish your Clojure projects didn't have such crappy documentation."

oakes /
Last active Jul 10, 2018
Running a JAR on Digital Ocean
  • Create a Digital Ocean account
  • In the OS X terminal, run ssh-keygen, then hit enter until it is done
  • Create a droplet
    • Select Ubuntu 16.10 x64
    • In Finder, Go -> Go to Folder... then type ~/.ssh
    • Open with TextEdit
    • Copy the contents of the file and paste them in the "New SSH Key" text field
    • Click "Create"
  • In the Terminal app, run ssh root@YOUR_IP_ADDRESS
  • Run apt-get update
oakes / core.clj
Last active May 28, 2016
Minimal 3D
View core.clj
(defscreen main-screen
(fn [screen entities]
(update! screen
:renderer (model-batch)
:attributes (let [attr-type (attribute-type :color :ambient-light)
attr (attribute :color attr-type 0.8 0.8 0.8 1)]
(environment :set attr))
:camera (doto (perspective 75 (game :width) (game :height))
(position! 0 0 3)
oakes / core.clj
Last active Jul 15, 2017
Standalone Nightmod Template
View core.clj
(ns my-game.core
(:require [clojure.edn :as edn]
[ :as io]
[play-clj.core :refer :all]
[play-clj.g2d :refer :all]
[play-clj.g3d :refer :all]
[play-clj.math :refer :all]
[play-clj.physics :refer :all]
[play-clj.ui :refer :all])
(:import [ StringWriter]))
oakes / core.clj
Created May 27, 2014
3D Physics
View core.clj
(print "Click the screen to create a new block.")
(def ^:const mass 10)
(defn get-environment
(let [attr-type (attribute-type :color :ambient-light)
attr (attribute :color attr-type 0.3 0.3 0.3 1)]
(environment :set attr)))
oakes / core.clj
Last active Aug 29, 2015
2D Physics
View core.clj
(def ^:const pixels-per-tile 32)
(defn create-ball-body!
[screen radius]
(let [body (add-body! screen (body-def :dynamic))]
(->> (circle-shape :set-radius radius)
(fixture-def :density 1 :friction 0 :restitution 1 :shape)
(body! body :create-fixture))
You can’t perform that action at this time.