jwinter.org

A place for everything and everything in its place

I Miss anywhere.fm

anywhere.fm was my favorite web application.  If you weren’t lucky enough to use it while it was around, it was like a Web-based iTunes.  You could upload all of your music to it and then play it from anywhere you had an internet connection and a Flash player. 

The UI bore a strong resemblance to iTunes, but its best UI feature was that everything was fast.  Searching for a song in your collection was fast, switching to a new playlist was fast, creating a new playlist was fast.  There are very few (maybe GMail?) Web apps where I could do what I wanted to as quickly.

Their import process had two features that I haven’t seen anywhere else: a) a convenient desktop app to upload your music in the background and b) the ability to upload all of your music.  The OS X native app to upload your music worked perfectly for me.  It took a few days to get it all, but eventually I had several thousand songs uploaded to anywhere.fm. 

I want to emphasize how happy it made me to have all of my music anywhere I was in front of a computer.

The anywhere story had a happy ending for the founders, but a sad one for their users.  They were bought by imeem, which had an abysmal, sluggish interface and never migrated all of my music.  Imeem was then acquired my MySpace Music which claims to have plans to migrate the music from Imeem.  But there’s no chance MySpace will produce anything like anywhere.

I’m interested to see what the anywhere founders will build next, but they and YCombinator, the incubator that helped them get started, have lost a bit of my trust.  I appreciate their hard work in building anywhere.  But I’d like them to understand what it felt like when anywhere was taken away.

JOGL and Clojure

JOGL is an OpenGL implementation in Java. Clojure is a Lisp that runs
on the JVM.
 
Install JOGL
 
Install Clojure
 
Shortest code to draw a triangle on the screen. Use this to test that
everything was installed correctly.
 
(ns bb
 (:import (java.awt Frame BorderLayout)
  (javax.swing JFrame)
  (java.awt.event WindowAdapter WindowEvent)
  (javax.media.opengl GL GLAutoDrawable GLDrawableFactory
  GLCanvas GLEventListener GLCapabilities)
  (com.sun.opengl.util Animator)
))
 ;;Add a .dispose to this frame's windowClosing event
(defn window-closer [frame]
 (proxy [WindowAdapter] []
  (windowClosing [event]
  (.start (new Thread
  (fn []
  (.dispose frame)))))))
 (defn gl-listener []
 (proxy [GLEventListener] []
  (init [drawable]
  (doto (.getGL drawable)
  (.glClearColor 0.0 0.0 0.0 1.0)
  (.glColor3f 0.0 0.0 0.0)
  ))
  (display [drawable]
  (doto (.getGL drawable)
  (.glClear GL/GL_COLOR_BUFFER_BIT)
  (.glColor3f 1, 0, 0)
  (.glRecti 0 0 1 1)
  (.glColor3f 0.0 0.0 0.0)
  (.glMatrixMode GL/GL_MODELVIEW)
  (.glLoadIdentity)
  ))
  (displayChanged [drawable mode device])
  (reshape [drawable x y w h])
  ))
 ;; Draw the scene
(defn main []
 (let [frame (new Frame "Hey dere Joe")
  gl-canvas (new GLCanvas)
  ]
  (.addGLEventListener gl-canvas (gl-listener))
  (.setSize frame 600 600)
  (.add frame gl-canvas)
  (.setVisible frame true)
  (.addWindowListener frame (window-closer frame))))