Clients @ 10 August 2010, “No Comments”

Working with jTribe & DT Digital for Honda to build a bespoke iPad-based interactive brochure for the Sydney Motor Show. Around 50 devices were mounted in custom made stands around the various car models.

  • Use of Quartz and CoreGraphics to provide a intuatively interactive and highly dynamic image gallery. Utilizing pinch, drag and rotation gestures to manupulate images and basic physics to add momentum.
  • Extensive testing, bug-hunting and memory-leak plugging in order to allow the app to run constantly for 12+ hours on over 50 devices for every day of the motor show
  • Implemented a continuous integration system using Hudson, xcodebuild and various shell scripts to provide continuous build feedback and versioned artifacts.
  • Implemented an Agile process to manage and make visible the outstanding tasks. I also started to measure velocity to better estimate upcoming work.

Installation at Motorshow

Home Screen

Image Gallery

Interior Spin

Exterior Spin

Home Screen

I spent quite a bit of time playing with Processing.org a few years back, mainly using it for video processing (video effects, blob detection, etc) but also for 3D. I recently stumbled across a javascript port of Processing called, logically, Processing.js. This is a really nice idea, taking the established processing syntax (a subset of Java) and rendering it to a HTML5 Canvas. The Processing framework uses a “dont call me, i’ll call you” inversion-of-control pattern which makes it very easy to get something up and running but that, and the fact that it is not standard javascript, can make it tricky to integrate.

I also found a very slick library called three.js which I used to create the header animation on rayh.com.au. It provides a basic set of 3d concepts such as points, lines, renderer, camera, etc which can use to draw and animate basic 3d scenes. There is no special loop function, you just use setInterval to trigger your animation to update every once in a while.

My personal site, rayh.com.au, was in need of dire attention. I had originally made it a flat html/js/css site to show off some jQuery skills. However, even though I really like the idea of a site built entire from static files (damn fast) and using javascript to drive the dynamic elements, it is not search engine friendly.

Biting the bullet, I decided that I needed some sort of server-side scripting. By day, I mainly use Java and sometimes Ruby. So my choices seemed to be Java, Ruby or PHP. Many moons ago, I was a PHP developer and I bailed out of that technology in favour Java. For me, PHP just sucks in far too many areas for me to adopt it for a one-off tiny website, but the reasons why is another story. Java seems way to heavyweight and verbose for my needs and so Ruby seemed like the natural choice.

Previously I had used Rails for projects, but it’s full-stack solution was still too much for my needs as my site has no database access. This led me to look at Sinatra, a super lightweight and declarative approach to a web application. I simply converted my existing html file to a .erb and told Sinatra:

require 'rubygems'
require 'sinatra'

get '/' do 
  erb :index
end

This code is pretty much all that is needed to get up and running. It tells Sinatra that when a user accesses the root of the site using GET, serve the index.erb file from the views/ directory. This approach allowed me to just add the features I needed to perform the simple set of requirements I had rather than trying to convince Rails to do less.

When it came to deploying the app, I used Passenger (AKA mod_rails) with apache which was an absolute breeze. I highly recommend this approach if you need something more powerful than simple javascript & html without resorting to full-stack web application frameworks or ugly php scripts embedded in html.

Clients @ 01 June 2009, “No Comments”

Consulting for Sensis, I worked on the Australian version of the Yellow Pages. This long-term project involved maintaining an existing J2EE (Struts, Spring, Hibernate, DWR, FAST) and migrating to newer technologies such as replacing Struts 1.0 with Spring MVC 2.5 and replacing DWR with jQuery/AJAX. Various other internal tools and websites were written in Ruby (including Rails, Capistrano) and test systems utilised tools such as JUnit, Mockito, TestNG.

yellowpages.com.au

Over the last couple of days I’ve been working on a Criteria for ActiveRecord. The concept is quite simple; rather than writing strings of SQL to pass to the find() method, we build the criteria using an object-orientated approach. Anyone who has used Hibernate, Torque, Propel et al will know how powerful and useful this can be.

For example, imagine you have a series of filters, all of which may, or may not, add constraints or expressions to your query. Each filter will need to append it’s own SQL to the end of any previously generated SQL and may even need to introspect the existing SQL to determine if its doubling up on statements or resolve potential conflicts.

With Criteria this becomes simpler. For example:

criteria = Criteria.new
criteria.and do |c|
  c.or User.role.eq(:admin)
  c.or User.active.eq(false)
  c.or User.createdAt.gt(10.hours.ago)
end
criteria.and do |c|
  c.or User.role.eq(:editor)
  c.or User.active.eq(true)
  c.or do |c2|
    c2.and User.createdAt.gt(20.days.ago)
    c2.and User.createdAt.lt(10.hours.ago)
  end
end
users = User.find(:all, criteria)

We could, at any point, introspect the state of criteria by calling:

criteria.ands.each do |c|
  put "AND #{c}"
end
criteria.ors.each do |c|
  put "OR #{c}"
end

And, finally, we can remove arbitrary bits of criteria:

criteria.ands.delete_at 2

I hope to have a release out very soon, but for the time being some more examples and API docs are on the Criteria project page on RubyForge

Development @ 30 September 2007, “No Comments”

I have been looking around for a way in which to set Swing client properties easily in JavaFX, without subclassing the whole widget. This seems like the simplest (and most obvious, in hindsight) way of doing this. Documentation is still a bit thin on the ground so I am unsure if this is the proper way to do things:

trigger on (new Button) { button.putClientProperty("Quaqua.Button.style", "placard"); }

The above code allows me to inform the underlying Quaqua LookAndFeel that I wish to use the placard button style. If I wanted to use this selectively, I would have to subclass Button.fx, provide an additional attribute (say style) and then apply the property if the attribute is set.

Obviously, you need to know the internal name for the Swing component you are trying to access, this API documentation is pretty helpful for that.

Clients @ 10 August 2007, “No Comments”

I have been intimately involved with SmeshUp for some time, building a large scale crawl-index-search system for extracting meaningful metrics from social & mainstream media. The system made use of various forms of Lucene, originally Ferret (Ruby/C port of Lucene) and, more recently, Solr Cloud. The majority of the system was written in Ruby (Rails, God, Mongrel and many hand-rolled solutions) with some heavy lifting in Java.

[From their website] Smesh pulls it all together. Not just mainstream sources but blogs, both established and brand spanking new ones. Because if there’s any brand-spanking going on where your clients are concerned, you want to know about it and Smesh wants to find it.

smeshup.com

I have just decided to upgrade Eclipse, and thought it best to start from scratch. I do a lot of work in Java, PHP as well as Ruby on Rails and so I tried to set up an integrated environment using Eclipse. I have documented the steps here as much as a reminder for myself as a guide for other people trying to something similar.

First, download and unzip the Ecipse + J2EE package from http://www.eclipse.org/downloads/. You do not need to ‘install’ Eclipse as such, just put the uncompressed directory somewhere logical (/Applications on a Mac, for example).

  1. Launch Eclipse :P
  2. Select: Help -> Software Update -> Final and Install.
  3. Select Search for new features to install
  4. Check the Europa Discovery Service
  5. Select Add Remote Site
  1. Type in name: Aptana (For javascript support)
  2. Type in url: http://update.aptana.com/install/3.2/
  3. Select OK
  • Select Add Remote Site (For Ruby on Rails support)

    1. Type in name: RadRails
    2. Type in url: http://update.aptana.com/install/rails/3.2/
    3. Select OK
  • Select Add Remote Site (For SVN integration)
    1. Type in name: Subclipse
    2. Type in url: http://subclipse.tigris.org/update_1.2.x
    3. Select OK
  • Select Add Remote Site (for PHP support)

    1. Type in name: PDT
    2. Type in url: http://download.eclipse.org/tools/pdt/updates/
    3. Select OK
  • Select Add Remove Site (for Hibernate support)
    1. Type in name: Hibernate Tools
    2. Type in url: http://download.jboss.org/jbosside/updates/development
    3. Select OK
  • Select Finish
  • Select your nearest mirror, when prompted
  • Select Eurpoa Discovery Site -> Programming Languages -> Ruby Development Tools
  • Select PDT
  • Select Aptana
  • Select RadRails
  • Select Subclipse
  • Select Hibernate Tools
  • Select Select Required (to resolve dependencies)
  • Select Next
  • Accept the agreement(s) and select Next
  • Select Finish
  • Go for a walk.
  • Phew, so after all that, you should have an Eclipse IDE set up to support PHP, Ruby, Rails, Javascript, Java, Hibernate and Subversion. You can, of course, select many other tools from the Europa discovery site for other development tools, graphical editing and the like.

    Windy Road has a nice article on the use of Javascript And Hidden Applets, what they call JAHA.  This is similar to the technique I have used in Robonobo, however I am having all sorts of issues on Mactel Firefox, possibly due to the Apple MRJ / Firefox integration.

    It would be nice to have a small js library that allowed you to dynamically instantiate and destroy embedded, hidden applets.

    “Elmo is a JavaBean pool implementation for the Sesame RDF repository. Specifically, Elmo is a subject-oriented RDF Bean pool that allows JavaBeans to be cast to different roles and provides a unique context specific view of the subject.”

    Basically, you can annotate your classes with url’s describing the RDF namespace of the class or property. You can then use SPARQL to query/retrieve the beans, and serialize them to/from XML. Serialization can be acheived through the Sesame framework.

    Elmo User Guide

    Additionally, there is another project, JRDF, that builds upon Sesame and Jena. I have yet to use it, but sounds like in encompasses the best of all worlds.