OpenSolaris cheat sheet

26 01 2010

I’ve always been a big fan of the handy little utility cheat and recently became interested in OpenSolaris (which btw runs fine on my Thinkpad x200s), so I did the obvious and created an OpenSolaris cheat sheet:

http://cheat.errtheblog.com/s/open_solaris

It’s still missing information regarding ZFS, but I guess I’ll eventually add that too. And who knows, maybe I even get motivated enough for a nicely formatted Latex version…


Scary Ruby

12 01 2010

We all know that Ruby’s a flexible beast, but just how much you can bend it is almost scary. How about inheriting from a class randomly chosen at runtime? Sure, no problem:

I dare you to find a use case for this ;-)

And in case random isn’t good enough for you, why not have the user choose the superclass for you?


Bored? Don't worry, here's a new programming language...

11 01 2010

Recently – for various degrees of recent that is – people really seem to be into programming language design and development. You’ve probably all heard about Scala, Clojure and Go already, but here are some more new languages which may be new to you (descriptions taken from the projects’ websites):

  • ANI, the experimental, high-performance, statically-safe, fully implicitly parallel, object-oriented, general-purpose dataflow programming language.
  • CoffeeScript is a little language that compiles into JavaScript. [...] it compiles into clean JavaScript (the good parts) that can use existing JavaScript libraries seamlessly, and passes through JSLint without warnings. The compiled output is quite readable — pretty-printed, with comments preserved intact.
  • Factor is a concatenative programming language where references to dynamically-typed values are passed between words (functions) on a stack. [It] is expressive, fast, supports interactive development and has a full-featured library.
  • ooc, a modern, object-oriented, functional-ish, high-level, low-level, sexy programming language. It’s translated to pure C with a source-to-source compiler. It strives to be powerful, modular, extensible, portable, yet simple and fast.
  • Yeti, ML style functional programming language, that runs on the JVM.

2009 Reading list

02 01 2010

Here’s what I read in 2009, in the order I read them:

Brick Lane: Monica Ali
Die Angst des Tormanns beim Elfmeter: Peter Handke
Soweto Stories: Miriam Tzali
The Eighth Day: John Case
A Language in Common: Marion Molteno
The Lover: A. B. Yehoshua
Everything Is Illuminated: Jonathan Safran Foer
Ali Smith’s Supersonic 70s: Ali Smith
Die Memoiren des Rodriguez Fazantas: Helge Schneider
German Amok: Feridun Zaimoglu
Imaginings of Sand: Andre Brink
Leinwand: Feridun Zaimoglu
Bitter Fruit: Achmat Dangor
Die Betrogene: Thomas Mann
The Crow Road: Iain Banks
The White Tiger: Aravind Adiga
Kali: Eine Vorwintergeschichte: Peter Handke
The Icarus Girl: Helen Oyeyemi
Der Hund aus Terracotta: Andrea Camilleri
Ansichten eines Clowns: Heinrich Böll
Lust: Elfriede Jelinek
Transmission: Hari Kunzru
Zwölf Gramm Glück: Feridun Zaimoglu
Hokkaido Highway Blues: Will Ferguson
Never Let Me Go: Kazuo Ishiguro
Lunar Park: Bret Easton Ellis
The Burial Brothers: Simon Mayle
Ruby in Practice: Jeremy McAnally
An der Arche um Acht: Ulrich Hub
Ubik: Philip Kindred Dick
A Loyal Character Dancer: Qiu Xiaolong
Bartleby The Scrivener: Herman Melville
2 B R 0 2 B: Kurt Vonnegut
Handbuch des Kriegers des Lichts: Paulo Coelho
The Well-Grounded Rubyist: David A. Black
The Accidental: Ali Smith
Rice Boy: Evan Dahm
South Africa: The Rise and Fall of Apartheid: Nancy L. Clark
Squeak by Example: Andrew P. Black
Rabbit, Run: John Updike
Heartland: Joey Goebel
Guards! Guards!: Terry Pratchett
Die Girls von Riad: Rajaa Alsanea
Angela’s Ashes: Frank McCourt
Verblendung: Stieg Larsson
Der Tote im Sumida: Sujata Massey
Crime: Irvine Welsh
Interesting Times: Terry Pratchett
Sacred Games: Vikram Chandra
The God of Small Things: Arundhati Roy
Programming Clojure: Stuart Halloway
Armageddon: Leon Uris
Small Gods: Terry Pratchett
The Dice Man: Luke Rhinehart
Verdammnis: Stieg Larsson
Oranges Are Not the Only Fruit: Jeanette Winterson
Vergebung: Stieg Larsson
JavaScript: The Good Parts: Douglas Crockford
Going Postal: Terry Pratchett

Started in 2009 but not finished:
Gödel, Escher, Bach: Douglas R. Hofstadter
Brückenkurs Mathematik: Guido Walz

This list is not taking into account stuff that didn’t have ISBNs like some eBooks or scientific papers.


Simple AWS scripting with boto

28 12 2009

boto is a very nice Python interface to the Amazon Web Services which I can heartily recommend for your cloud scripting needs. Here’s a quick example program I whipped up around 2 weeks ago (be gentle, I’m not a Python guy and this is just a throwaway quickie), which will list all your AMIs (excluding public ones), used S3 buckets plus a list of currently running instances with some information like instance type, start time etc. The nice part is that you can connect to any instance via SSH directly from this lsit which I find more convenient than copy/pasting the public DNS name from the AWS console:


Android and me

17 12 2009

Last Monday I got an Android phone from work (unfortunately A1 still only has the HTC Magic, but I don’t want to be ungrateful) and I obviously had to get into the whole community firmware thing and all. Here are some links that I hope are interesting and/or useful:

One last word of advice: save your APN settings before you flash your phone!


happynerds.net is online!

13 12 2009

In my previous blog post I mentioned how much fun I have in creating a small web project with Sinatra, Heroku and MongoHQ and today said project finally went online:

Happynerds – Programming Links for Kids

If you wonder why I’m doing this, RailsBridge has a good summary on the topic.


Fun with Sinatra, Heroku and MongoDB

06 12 2009

I’ve been toying around with the idea for a small website lately, but never actually got around to do it. In an attempt to clear out my personal to do list I finally motivated myself to start yesterday, and I have to say the following combination of tools is not only insanely efficient, but also really fun to work with:


  • Sinatra, “a DSL for quickly creating web applications in Ruby with minimal effort”. I recommend using it in combination with Mongrel, Shotgun and Haml.

  • Heroku, a Ruby cloud hosting platform. Small sites are for free and Heroku’s git-based workflow just feels so natural. You can also manage your gem dependencies and set up environment variables, which made my life a whole lot easier.

  • MongoDB, “a scalable, high-performance, open source, schema-free, document-oriented database”. In this specific case I used MongoHQ for the database hosting, since they were nice enough to provide me with a beta account. I stored all the connection information for MongoHQ in environment variables as described above:


With this combination I was able to go from zero to mostly finished (I still need to write some of the content and make/steal a stylesheet) in very little time, while actually having fun! Thanks everybody for providing the Ruby community which such awesome tools! :-)


Gravedigging why the lucky stiff: Io Has A Very Clean Mirror

01 12 2009

Io is a small small, prototype-based OO programming language that’s fun to play with. Unfortunately there’s not too much information about it out there and quite predictably googling for “io” gets you lots of results you are not looking for. But today I remembered that why once did a nice little article on the language, and thanks to the amazing Internet Archive I actually managed to find it! So with out further ado, here we go:

Io Has A Very Clean Mirror


Fun with Twitter and Ruby

23 11 2009

I’m currently toying around with some ideas for Twitter bots etc. so I had a look at some of the available gems out there. Sometimes Ruby makes stuff almost too simple… ;-) Here are a few nice snippets of what you could do with a couple of minutes time and some Ruby:

Automatically translate all tweets for a given keyword:

Daemonize the above:
Alternatively you can also follow a userid instead of a keyword and daemonize the whole thing, thus making it super easy to create a bot which posts translations of Matz’s tweets:

If you put this into a file like transbot.rb, the command ruby transbot.rb will give you all the regular daemon commands like start, stop, etc.

Ruby is trendy
Curious of getting a list of current trends on Twitter, without hashtags? There you go:

Combining all these ideas you could easily write a bot that follows the current Twitter trends and posts translations of them in only a couple of lines. :-)


Fixing MacPorts on Snow Leopard

19 10 2009

After upgrading to Snow Leopard I had quite a bit of trouble with my MacPorts installation, since most builds just failed with configure errors. After the obvious first steps of installing a newer version for SL and making sure I have the most recent XCode, I was a bit stumped until I finally found this site:

Migrating a MacPorts install to a new major OS version or CPU architecture

After finding this guide – which btw really solved my problems – I felt a bit stupid, but since I didn’t have to do anything after the Tiger->Leopard upgrade, I really didn’t expect this.


Attempted peace

10 10 2009

Sideshow Bob: Attempted murder? Now honestly, what is that? Do they give a Nobel prize for attempted chemistry? Do they?
—-
Nope, only for attempted peace it seems.


What's new pussycat?

06 10 2009

Quite a bit actually:


unsavory now available as gem

08 09 2009

unsavory is now available as a gem, which means that you can comfortably install it like this:

# Only if GitHub isn't in your gem sources yet
$ gem sources -a http://gems.github.com 
$ sudo gem install citizen428-unsavory

Rubygems will automatically create a wrapper-script named “unsavory”, which you can use to start the program so you finally can get rid of all these outdated bookmarks.


Using Java libraries from Clojure

06 09 2009

After reading Scripting Java Libraries With Ruby on the Engine Yard blog, I decided to translate the two example programs to Clojure. Please keep in mind though that I'm pretty much a Clojure newbie myself, so the code shown here might not be very idiomatic. In case you have any suggestions on how to improve the code examples presented here, please leave a comment, thank you! To get the most out of this post, you should probably read the section on Java Interoperability in Mark Volkmann's excellent Clojure tutorial first.

A MIDI Keyboard

The first example listens for a line of text which then gets converted into a playable MIDI sequence. Let's start with importing the classes we need. (ns midi/keyboard (:import [javax.sound.midi MidiSystem Sequence MidiEvent ShortMessage]) (:use [clojure.contrib.seq-utils :only (indexed)]))
Next we set up a loop and an exit clause. In case the user enters the word "exit", we call System.exit to shut down all the threads that got started by Java's MIDI support. (loop [line (read-line)] (if (re-find #"exit" line) (System/exit 0)) ... other code snipped... (recur (read-line)))
The main part of the application constructs a new MIDI sequence by creating a NOTE_ON event for every character in the entered text and then finishing the sequence with a STOP event. The original article states that it favors simplicity over efficiency, so the same also holds true for my "translation". (def sq (Sequence. Sequence/PPQ 2)) (def track (.createTrack sq)) (doseq [[idx note] (indexed line)] (let [msg (ShortMessage.)] (.setMessage msg ShortMessage/NOTE_ON (int note) 64) (.add track (MidiEvent. msg idx)))) (let [msg (ShortMessage.)] (.setMessage msg ShortMessage/STOP) (.add track (MidiEvent. msg (+ (.length line) 1))))
To finish off our first program we play the sequence before prompting for more input (see the loop snippet above). (doto (MidiSystem/getSequencer) (.open) (.setSequence sq) (.start))
Full source for the first example

Making It More Interactive

While the first example was fun, it wasn't as interactive as it could be. Therefore the second program launches a GUI window to receive keystroke events, turning a note on or off when a key is pressed or released. Since we don't have to create MIDI sequences this time, our import statement becomes a lot shorter: (ns midi/interactive (:import [javax.sound.midi MidiSystem] [javax.swing JFrame] [java.awt.event KeyListener]))
This example directly accesses the system synthesizer. The following lines open the default synthesizer's channel 0 (and also create a JFrame object which we'll use later): (let [synth (MidiSystem/getSynthesizer) frame (JFrame. "Music Frame")] (.open synth) (let [channel (aget (.getChannels synth) 0)]
We then launch a GUI frame as a simple and cross-platform way to receive keystroke events. The KeyListener interface is implemented using Clojure's proxy macro, using keyPressed and keyReleased events to turn notes on or off. (doto frame (.setSize 300 300) (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE) (.addKeyListener (proxy [KeyListener] [] (keyPressed [e] (.noteOn channel (int (.getKeyChar e)) 64)) (keyReleased [e] (.noteOff channel (int (.getKeyChar e)))) (keyTyped [e])))
Last but not least we display our frame to let the fun begin. (.setVisible true)))) Full source for the second example

I hope this article helped to illustrate how easy it is to use the plethora of existing Java libraries from Clojure. In case you have any feedback or questions, please feel free to leave a comment!