The March edition of the London Clojurians coding dojo all the suggested dojo challenges were to be carried out with ClojureScript. After a long list of ideas we voted to do either Conway’s Game of Life or Monty Carlo graphics.
Getting started with ClojureScript seemed reminiscent of the challenge the group faced a couple of years ago when first trying out Clojure. Although getting started with Clojure itself is pretty easy these days, it feels like ClojureScript still has a way to go in terms of a great developer experience.
I looked at ClojureScript One and was put off a little by the amount of git projects it was downloading as part of its bootstrap process. I am sure its a great project, but seemed too much for the dojo and my netbook!
lein ring server-headless 3000
In hindsight, perhaps we should have looked at the advanced example that came with lein-cljsbuild, although we would probably have also run out of time with that too…
Perhaps if we had spent a bit of time before the dojo with the basics things would have gone better, however it was good to discover as a group the level of challenge involved and it made it easier to get started as we could draw from a range of experiences.
So what else did I learn?
Google Closure libraries
The Google Closure library looks really great, but there seems to be a few challenges to get it to work with ClojureScript. Again this is down to our limited time to get to grips with several APIs, so we had little luck finding something that worked.
Where’s my DOM
Our group got stuck on trying to find elements in the DOM via ClojureScript, repeatedly getting nil when asking for elements in the DOM. We postulated that is was a timing problem, but were not able to code around the problem.
Find an example that works
Find an example ClojureScript project that works and is easy enough to understand - without having to spend an hour setting up Leiningen plugins and dependencies or having to download lots of things from the Internet. This was tricky to find in the time we had.
So first impressions of the experience suggest I need to read some good tutorials on the subject and review code of some more projects. I plan on doing some more projects around Noir, so I’ll try and see where the advantages of using ClojureScript are when using a set of Clojure web frameworks.
I am still excited about ClojureScript, but its one of those things where I need to find more time than I have to get to grips with it. If anyone has any other blog or project recomendations, please let me know.
Another chance to practice Clojure with the help of the great people that are part of the London Clojurians community. Each person at the dojo has a different experience with Clojure and functional programming, so there is always something different to learn. It still amazes me how much I learn and how confident each dojo makes me (by the end of the night anyway).
The coldest night in London of 2012 so far was the warm up to a symphony of music by a collection of unstoppable Clojure hackers. As it was my first hackday with Overtone there was lots of new things to learn, from setting up the environment to a whole load of interesting music theory.
I cant really cant do justice to how much fun it is working with Overtone. Its like getting your hands on a Stylophone for the first time, just after seeing Rolf Haris demo it on TV! The only difference being you can make much better music with Overtone.
There is something just so ultimately geeky and fun in creating music using a functional programming language like Clojure.
I first tried Overtone at a London Clojurian coding dojo and with the help of the rest of the team we were quickly creating weird and wonderful sounds - although not quite in the same leaguge of
Thanks to some great documentation on the overtone github site it was pretty easy to set up my lubuntu laptop with an audio server, Overtone server and a nice lightweight clojure development environment (emacs, leiningen). I am afraid it will take me a bit longer to absorb music theory!
Setting up the audio for Overtone
In order to get sounds out of your overtone project on Linux, you need to add a few packages.
sudo apt-get install jack-tools ant openjdk-6-jdk fftw3 qjackctl
As you grow your overtone project you may want to switch to a linux kernel set up for real time processing, but to start with this is not necessary. If you do get more involved projects, its probably a good idea to also look at Ubuntu studio which provides a great selection of audio, video and graphics tools.
_Mac OSX already has a suitable sound server, so nothing extra is required. If you are using windows, overtone is supported also (not sure if you need to set anything up though).
Create a new overtone project
An overtone project is just like any other clojure project, with the overtone dependency added.
Create a new clojure project with your build management tool of choice: maven, cake or leiningen. I used leiningen as my tool of choice.
lein new tutorial
Add the Overtone dependencies to the project configuration file tutorial/project.clj
(defproject tutorial "1.0"
:dependencies [[org.clojure/clojure "1.3.0"]
With the overtone dependencies added to the project file, used leiningen to download the jars that make up overtone itself.
Leiningen will download about 16 jar files for overtone 0.6.0 and places them in the project lib folder. This gives you all the libraries you need to start creating things in overtone, including an appropriate version of clojure.
Fire up your environment
Emacs not only has great support for the Clojure language, its a great way to try out your code by evaluating individual functions (s-expressions).
My preferred way to launch emacs is to change directory to the project top level and fire off emacs with the project file
emacs project.clj &
Using the dynamic environment of Clojure, the REPL, is a great time saver for trying out functions as well as running your project code. To fire up a repl inside emacs I use the new emacs 24 approach, running Meta-x (clojure-jack-in) to start up and connect to a repl using the underlying lein project file.
I have set up a keyboard shortcut of C-c C-j to make this even easier.
For my initial experiments I run an overtone server on my laptop, that way I can also play on the train home. You can also use an external overtone server called the SuperCollider (no not the LHC)
In the repl, I fired up the internal server (dont try to fire off both servers in the same repl, it crashed my repl)
in the REPL
/ __ /_ _____ _____/ /_____ ____ ___
/ / / / | / / _ \/ ___/ __/ __ \/ __ \/ _ \
/ /_/ /| |/ / __/ / / /_/ /_/ / / / / __/
\____/ |___/\___/_/ \__/\____/_/ /_/\___/
Programmable Music. v0.6
Hello jr0cket, may this be the start of a beautiful music hacking session...
# Defining my first instrument
I soon discovered that it does take a little time to build your instruments. Its like any good programming challenge, there are many ways to do things and there are always lots of surprises. Reading the [getting started guide](https://github.com/overtone/overtone/wiki/Getting-Started) helped me with my first instrument.
(definst annoying-tone  (saw 220))
This is a simple and rather annoying tone that uses the saw function to create the sound. To play the sound I simply call its name:
The easiest way to end your experiment in sound quickly is to use the (stop) function.
Quickly testing out your instruments with emacs
Many cool things were done at the hack day and it was great fun to play with the Ableon Novation Lauchpad. Its a midi controller that can be used to help you play your instruments and make it easier to turn overtone into a song maker.
I got as far as creating a few basic instruments and borrowing a few others, such as the one to create Jingle Bells!
Thanks to Phil Potter for having the energy to organise this event, Thoughtworks for supporting us with the venue and everyone there for making it a great day.
To have a whole day focused on overtone really helped me accomplish something and its going to be easier now to keep the learning going. All my experiments are now uploaded to my github account.
Hope you find the time to make music with Clojure and Overtone, you will love it.
Its not quite Global Thermo Nuclear War, but battleships was a great choice for a coding dojo topic. Its a simple enough game and therefore a challenge that you feel you can tackle within one evening. Its also a game that most people know and have fond memories, so the discussions have lots of context.
At the January 2012 dojo we used a battleships server created by Neill Alexander and Robert Rees kindly facilitated the night. The battleships server allows you to submit your “player” and proceeds to play battleship games against is own player - CPU1 (shame the player is not called Master Control Program so I could slip in a Tron reference).
To get started with the dojo I forked the project on Github to my own account and cloned the project repository to my local machine. I still use the command line to clone remote repositories, its pretty straight forward:
git clone url local-folder-name
For my fork of the battleships game the command becomes
git clone https://github.com/jr0cket/battleships
When I clone a github repository that I have forked from someone elses repository I prefix the local folder name with my username so I know its my fork and not the original - saves a lot of hassle wondering why I cant push changes back to github directly
The project is on my local computer I can fire up leiningen build tool and get the project running. First thing to do is to make sure I have all the libraries the project depends upon. Leiningen will download the Internet of jars for me (just like maven) with the following command:
The battleships project uses Clojail to create a sandbox, so its important to set the Java runtime environment security permissions. There is a handy lein task for this courtesy of Robert Rees that creats a .java-policy document in the … file:
Or you can just create the file with any handy text editor.
I then fire up Emacs from within the top level project directory (makes it quicker to find my project files) and opened emacs with the project.clj file to see how the project is set up.
emacs project.clj &
Clojure has a repl for working with the language dynamically, so I fire the REPL server up using emacs (of course). Adding clojure-mode to emacs 24 gives you the swank REPL server - allowing you to call clojure-jack-in and fire up a swank REPl server using the lein project.clj project definition. I defined a keyboard shortcut Ctrl-c, Ctrl-j for the M-x clojure-jack-in command in the .emacs.d/config.el emacs configuration file.
I then open the relevant clojure code using the keyboard shortcut Ctrl-c Ctrl-f. For the dojo I just needed to work with the demo.clj file that defines a battleship player: jr0cket-battleships/src/battleships/demo.clj
Once the project is loaded into emacs and swank is running, load the battleships namespace into the swank server using the (use ...) function.
Note that (use) will load in all the required dependencies at once whereas (requires) will also require you add all the dependencies yourself.
For the dojo we had a central server that we all submitted to. I also spun up a local battleships server so I could do some testing.
lein ring server
Now I am in the namespace I can submit the player I created - initially this was just the default demo.clj player as I was interested in a baseline player to work with. By default the demo.clj player will shoot and place your ships at random, with no intelligence to these actions
When submitting your “enhanced” player you should give it a name you will remember, different from other players. As the game does not replay any matches, its probably worth submitting a new player rather than updating an existing one (there would have to be a lot of players to overload the server!).
As always the dojo started with a feast of pizza and drinks courtesy of ThoughWorks, the perennial favorite it seems with developers (I use it at my Scala dojos for the same effect). A good turn out tonight meant the pizza went down quickly and we got onto the intros, with the monthly mystery question “If your names’ not Bruce, what would it be” nicely stolen from Monty Python.
Here are the details of what happend at the dojo this time around.
According to @UncleBobMartin the last programming language ever created was C, back in the days before I was just a twinkle in the milkmans eye. All the “new” languages such as Java, Scala, Clojure, C#, F#, etc are rehashes of existing ones.
Clojure and Scala are two very exciting functional programming languages on the Java virtual machine (JVM) which provide many of the features than Java7 and Java8 have been working toward. There has already been a lot of activity around these functional languages in the UK, from financial services clients, media companies and developers who want to keep ahead of the game, all are getting involved with these languages now. Some of the top jobs are even mentioning these technologies by name.
With a long history of support for open source projects, it is no surprise that Atlassian support the development of Clojure and Scala by providing Confluence and JIRA to the project teams and wider community.