Andrew Hao’s thoughts on design, Web development, and anything shiny.
About Andrew
Andrew's a design jockey, code monkey as well as one of the guys behind Wejoinin.
He loves design & development, programming & photography. He aspires to one day write in the first person.
One thing the Blurb devs have been discussing is how we can speed up our test feedback cycles without sacrificing coverage. There’s some good tips (mainly Rails+Rspec/Cucumber) in the presentation such as:
Don’t run all the tests when developing (tag your tests by function)
Parallelize, chunk tests over machines/cores using Testjour/Specjour, Hydra
Don’t run all the tests at once. Tests that never fail should nightly.
Instead of spinning up a browser for acceptance tests, can you use a js/DOM simulator (e.g. envjs via capybara-envjs, or celerity)
Well, the inevitable happened: I finally experienced a hard drive failure. It’s pretty incredible that in the twenty-odd years I’ve been around computers I’ve never had the horror of losing a drive.
Friday rolls around and my Macbook Pro decides to freeze up on me. Strange, I think to myself. It’s making a clicking noise. Crap.
Luckily, I’ve been fairly good about making backups and copies of my work. Here’s my general strategy:
Work/code: keeping local changes on a separate branch and pushing it to a remote Git branch every so often.
Everything else: I keep one local copy here with me in Oakland, and have another copy offsite. I rsync my files out to my server at home, which has a cronjob set up to sync with the offsite copy at my parents’ home (I run a Pogoplug with Archlinux and a couple of external drives connected to it — fantastic and totally recommended for a cheap and low-power server setup).
There was a minor scare this time around though — I had some photography work (and an engagement photoshoot!) lying around that almost didn’t make it to the first stage rsync with my local server. Fortunately, I had the foresight to keep my photos backed up to a random local hard disk, and the rest remained on the memory cards (and some even on a shared Dropbox folder that saved my butt!). Most frustrating thing was learning that I had forgotten to back up my Lightroom catalog, so all my edits were lost. At least I have the original shots.
One thing I think I’ll try doing from here on out — saving my Develop settings/presets directly to the DNGs themselves before backing up. That way if I ever lose my LR catalog, the edit settings are still embedded in the original files.
Jeff Atwood reminds us to keep backups around on multiple disks. With the price of storage so low, what’s your data worth to you? How are you keeping your backups?
Here’s a list of things that have been annoying, or at least a bit frustrating using Ohm, the Redis ORM, in a Rails app. Beware to those who assume Ohm is ActiveRecord in new clothes. It is, but it’s not:
CRUD
Don’t make the mistake of treating your Ohm objects like AR:
ActiveRecord
Ohm
destroy
delete
self.find(id)
self[id]
update_attributes
update
create
create
Also note that Ohm’s update_attributes behaves differently from Rails` — it doesn’t persist the updates to DB. That owned me for the good part of the day.
Callbacks
Thankfully, these are ActiveRecord-like with the addition of ohm/contrib.
Associations
ActiveRecord
Ohm
has_a or belongs_to
reference
has_many
collection
Read this article if you’re considering creating associations from AR objects to Ohm objects and the other way ‘round.
I should have mentioned this long ago, but I started work at Blurb in early August. It’s been a quick ramp-up and I’m loving it there, surrounded by smart engineers and great designers. I do Rails/JS work there, and I’m building a lot of chops around Agile/TDD methodologies.
mmtss is a loop station built for live performances.
Let’s make music together! This project simplifies a traditional loop tracking station and is designed for interactive collaborative music performances.
The idea: Everybody adds or modifies one “part” of a 32-bar loop. The user gets to play an instrument over the existing mix and record the 32-bar phrase when she or he is ready. Once the person is finished, the project selects another instrument at random for the next viewer to record.
It’s an Ableton Live controller serving a Webkit view, backed by node.js on the backend and socket.io + RaphaelJS on the front. Communication is done through a LiveOSC Live plugin via sockets.
Displayed at the Regeneration “We Collaborate” art show in Oakland, CA. 9/24/2011.
Screenshots
mmtss in practice/playback mode. Here the user is able to practice/mess around with the current instrument to prepare to record the next track.
Pressing “record” puts the user in a wait state. They are prompted to begin recording when all the black boxes count down and disappear.
mmtss in record mode.
More screenshots: http://www.flickr.com/photos/andrewhao/sets/72157627640840853/
Copy lib/LiveOSC into /Applications/Live x.y.z OS X/Live.app/Contents/App-Resources/MIDI\ Remote\ Scripts/ folder
Set it as your MIDI remote in the Ableton Live Preferences pane, in the “MIDI Remote” tab.
Running it
Open Mmtss_0.als as a sample Live project.
Install all project dependencies with npm install from the project root.
Start the Node server with node app.js from the root directory.
Open a Web browser and visit localhost:3000
Modifying the sample project
You can modify this project to suit your own needs. Note that there are two sets of tracks; instrument (MIDI input) tracks and loop tracks that actually store clips.
For n tracks, you can add or remove your own instruments. Just make sure that instrument at track x corresponds to track x + n.
Credits
Design and architectural inspiration taken from vtouch, a HTML5/Node/Canvas Ableton controller.
My friends were complaining that wedding photobooths were too expensive to rent. Could we make one for them?
Glen and I from the Porkbuns Initiative stepped up in full armor, ready to help.
What is it? It’s a self-running photobooth that uses your Mac for brains and DSLR for eyes and a Webkit browser for its clothes and a photo printer for… a printer. You can connect an iPad as the frontend for a nice visual touch (pun intended).
We built it on a backend Rails instance, pushing SVG+HTML5 in the frontend and using the gphoto4ruby gem as a camera library wrapper.
Some UI work I did for a stealth startup in early ‘11. Responsible for look & feel and frontend chat interactions. jQuery/UI communicating to a CakePHP/nodejs backend.
We developed this prototype with statecharts, a concept commonly found in event-driven programming and with which I first learned from Sproutcore. I found it really helped map out all the complex user interactions we had to deal with on the page.
I’m on a team with BRUTELABS, a volunteer-led design agency working on StudentsConnect, a prototype project making chatroulette-style interactions connecting students from the global North and South. Here’s a UX flow we worked on:
Let's Get in Touch