<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>The Sweet Spot</title>
	
	<link>http://www.g9labs.com</link>
	<description>Andrew Hao’s thoughts on design, Web development, and anything shiny.</description>
	<lastBuildDate>Sat, 28 Apr 2012 00:32:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/g9labs/VpWG" /><feedburner:info uri="g9labs/vpwg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Speeding up Rspec/Cucumber feedback times without sacrificing coverage</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/XJXTc0z1eDw/</link>
		<comments>http://www.g9labs.com/2012/04/27/speeding-up-rspeccucumber-feedback-times-without-sacrificing-coverage/#comments</comments>
		<pubDate>Sat, 28 Apr 2012 00:27:17 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1155</guid>
		<description><![CDATA[Rocket Fuelled Cucumbers View more presentations from Joseph Wilk One thing the Blurb devs have been discussing is how we can speed up our test feedback cycles without sacrificing coverage. There&#8217;s some good tips (mainly Rails+Rspec/Cucumber) in the presentation such as: Don&#8217;t run all the tests when developing (tag your tests by&#160;function) Parallelize, chunk tests [...]]]></description>
			<content:encoded><![CDATA[<div style="width:510px" id="__ss_4479466"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/josephwilk/rocket-fuelled-cucumbers" title="Rocket Fuelled Cucumbers" target="_blank">Rocket Fuelled Cucumbers</a></strong> <object id="__sse4479466" width="510" height="426"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rc2010-100611192022-phpapp02&#038;stripped_title=rocket-fuelled-cucumbers&#038;userName=josephwilk" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"/><embed name="__sse4479466" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=rc2010-100611192022-phpapp02&#038;stripped_title=rocket-fuelled-cucumbers&#038;userName=josephwilk" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="510" height="426"></embed></object>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/josephwilk" target="_blank">Joseph Wilk</a> </div>
</p></div>
<div>One thing the Blurb devs have been discussing is how we can speed up our test feedback cycles without sacrificing coverage. There&#8217;s some good tips (mainly Rails+Rspec/Cucumber) in the presentation such as:</div>
<div>
<ul>
<li>Don&#8217;t run all the tests when developing (tag your tests by&nbsp;function)</li>
<li>Parallelize, chunk tests over machines/cores using Testjour/<a href="https://github.com/sandro/specjour" target="_blank">Specjour</a>, <a href="https://github.com/ngauthier/hydra" target="_blank">Hydra</a></li>
<li>Don&#8217;t run all the tests at once. Tests that never fail should&nbsp;nightly.</li>
<li>Instead of spinning up a browser for acceptance tests, can you use a js/<span class="caps">DOM</span> simulator (e.g. <a href="https://github.com/thatcher/env-js" target="_blank">envjs</a> via <a href="https://github.com/smparkes/capybara-envjs" target="_blank">capybara-envjs</a>, or <a href="https://github.com/jarib/celerity" target="_blank">celerity</a>)</li>
</ul>
</div>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/XJXTc0z1eDw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2012/04/27/speeding-up-rspeccucumber-feedback-times-without-sacrificing-coverage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2012/04/27/speeding-up-rspeccucumber-feedback-times-without-sacrificing-coverage/</feedburner:origLink></item>
		<item>
		<title>Backup, backup, backup</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/owbAmk_bMuw/</link>
		<comments>http://www.g9labs.com/2012/04/23/backup-backup-backup/#comments</comments>
		<pubDate>Mon, 23 Apr 2012 15:02:05 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Andrew 2.0]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[adobe lightroom]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dng]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lightroom]]></category>
		<category><![CDATA[photography]]></category>
		<category><![CDATA[Photos]]></category>
		<category><![CDATA[rsync]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1142</guid>
		<description><![CDATA[Well, the inevitable happened: I finally experienced a hard drive failure. It&#8217;s pretty incredible that in the twenty-odd years I&#8217;ve been around computers I&#8217;ve never had the horror of losing a&#160;drive. Friday rolls around and my Macbook Pro decides to freeze up on me. Strange, I think to myself. It&#8217;s making a clicking noise.&#160;Crap. Luckily, [...]]]></description>
			<content:encoded><![CDATA[<p>Well, the inevitable happened: I finally experienced a hard drive failure. It&#8217;s pretty incredible that in the twenty-odd years I&#8217;ve been around computers I&#8217;ve never had the horror of losing a&nbsp;drive.</p>
<p>Friday rolls around and my Macbook Pro decides to freeze up on me. <em>Strange, </em>I think to myself. It&#8217;s making a clicking noise.&nbsp;Crap.</p>
<p>Luckily, I&#8217;ve been fairly good about making backups and copies of my work. Here&#8217;s my general&nbsp;strategy:</p>
<ul>
<li>Work/code: keeping local changes on a separate branch and pushing it to a remote Git branch every so&nbsp;often.</li>
<li>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&#8217; home (I run a <a href="http://pogoplug.com/">Pogoplug</a> with <a href="http://archlinuxarm.org/platforms/armv6/pogoplug-provideov3">Archlinux</a> and a couple of external drives connected to it&thinsp;&#8212;&thinsp;fantastic and totally recommended for a cheap and low-power server&nbsp;setup).</li>
</ul>
<p>There was a minor scare this time around though&thinsp;&#8212;&thinsp;I had some photography work (and an engagement photoshoot!) lying around that almost didn&#8217;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&nbsp;shots.</p>
<p>One thing I think I&#8217;ll try doing from here on out&thinsp;&#8212;&thinsp;saving my Develop settings/presets directly to the DNGs themselves before backing up. That way if I ever lose my <span class="caps">LR</span> catalog, the edit settings are still embedded in the original&nbsp;files.</p>
<p>Jeff Atwood reminds us to <a href="http://www.codinghorror.com/blog/2008/01/whats-your-backup-strategy.html">keep backups around on multiple disks</a>. With the price of storage so low, what&#8217;s your data worth to you? How are you keeping your&nbsp;backups?</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/owbAmk_bMuw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2012/04/23/backup-backup-backup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2012/04/23/backup-backup-backup/</feedburner:origLink></item>
		<item>
		<title>HAML object references</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/FGLRYg1ajiQ/</link>
		<comments>http://www.g9labs.com/2012/04/12/haml-object-references/#comments</comments>
		<pubDate>Thu, 12 Apr 2012 21:40:09 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[HAML]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[haml]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1143</guid>
		<description><![CDATA[Did you guys know that you can use the &#8216;[ ]&#8217; brackets in HAML to automatically set the id and class on a tag, kind of like Rails&#8217; tag helper? # file: app/controllers/users_controller.rb def show @user = CrazyUser.find(15) end -# file: app/views/users/show.haml %div[@user, :greeting] %bar[290]/ Hello! is compiled&#160;to: &#60;div class='greeting_crazy_user' id='greeting_crazy_user_15'&#62; &#60;bar class='fixnum' id='fixnum_581' /&#62; Hello! &#60;/div&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Did you guys know that you can use the &#8216;[ ]&#8217; brackets in <span class="caps">HAML</span> to automatically set the id and class on a tag, kind of like Rails&#8217; <span style="font-family: 'courier new', monospace;"><a href="http://api.rubyonrails.org/classes/ActionView/Helpers/TagHelper.html#method-i-tag">tag</a></span> helper?</p>
<div>
<pre># file: app/controllers/users_controller.rb

def show
  @user = CrazyUser.find(15)
end

-# file: app/views/users/show.haml

%div[@user, :greeting]
  %bar[290]/
  Hello!</pre>
<p>is compiled&nbsp;to:</p>
<pre>&lt;div class='greeting_crazy_user' id='greeting_crazy_user_15'&gt;
  &lt;bar class='fixnum' id='fixnum_581' /&gt;
  Hello!
&lt;/div&gt;</pre>
<div>
<p>Keeps things nice, concise and <span class="caps">DRY</span>. See the <a href="http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#object_reference_  "><span class="caps">HAML</span>&nbsp;documentation</a>.</p>
</div>
</div>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/FGLRYg1ajiQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2012/04/12/haml-object-references/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2012/04/12/haml-object-references/</feedburner:origLink></item>
		<item>
		<title>RSpec order-agnostic array matching</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/QRNBa4Ejncc/</link>
		<comments>http://www.g9labs.com/2012/03/23/rspec-order-agnostic-array-matching/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 01:09:40 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Andrew 2.0]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[matcher]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1140</guid>
		<description><![CDATA[What&#8217;s that? You want to write an expectation for an array but your method returns the Array in a nondeterministic&#160;ordering? Simple.&#160;Write: my_method.should =~ &#60;my_expectation&#62; See the&#160;source.]]></description>
			<content:encoded><![CDATA[<p>What&#8217;s that? <a href="http://stackoverflow.com/questions/2978922/rspec-array-should-another-array-but-without-concern-for-order">You want to write an expectation for an array but your method returns the Array in a nondeterministic&nbsp;ordering</a>?</p>
<p>Simple.&nbsp;Write:</p>
<pre>my_method.should =~ &lt;my_expectation&gt;</pre>
<p>See the&nbsp;<a href="https://github.com/dchelimsky/rspec/blob/master/lib/spec/matchers/match_array.rb">source</a>.</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/QRNBa4Ejncc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2012/03/23/rspec-order-agnostic-array-matching/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2012/03/23/rspec-order-agnostic-array-matching/</feedburner:origLink></item>
		<item>
		<title>Ohm gotchas</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/5R0kBzt2ITU/</link>
		<comments>http://www.g9labs.com/2012/01/20/ohm-gotchas/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 01:19:50 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Andrew 2.0]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[blurb]]></category>
		<category><![CDATA[orm]]></category>
		<category><![CDATA[redis]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1119</guid>
		<description><![CDATA[Here&#8217;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&#8217;s&#160;not: CRUD Don&#8217;t make the mistake of treating your Ohm objects like&#160;AR: ActiveRecord Ohm destroy delete self.find(id) self[id] [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a list of things that have been annoying, or at least a bit frustrating using <a href="http://ohm.keyvalue.org">Ohm</a>, the Redis <span class="caps">ORM</span>, in a Rails app. Beware to those who assume Ohm is ActiveRecord in new clothes. It is, but it&#8217;s&nbsp;not:</p>
<h2><span class="caps">CRUD</span></h2>
<p>Don&#8217;t make the mistake of treating your Ohm objects like&nbsp;<span class="caps">AR</span>:</p>
<table>
<thead>
<tr>
<th>ActiveRecord</th>
<th>Ohm</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>destroy</code></td>
<td><code>delete</code></td>
</tr>
<tr>
<td><code>self.find(id)</code></td>
<td><code>self[id]</code></td>
</tr>
<tr>
<td><code>update_attributes</code></td>
<td><code>update</code></td>
</tr>
<tr>
<td><code>create</code></td>
<td><code>create</code></td>
</tr>
</tbody>
</table>
<p>Also note that Ohm&#8217;s <code>update_attributes</code> behaves differently from Rails`&thinsp;&#8212;&thinsp;it doesn&#8217;t persist the updates to DB. That owned me for the good part of the&nbsp;day.</p>
<h2>Callbacks</h2>
<p>Thankfully, these are ActiveRecord-like with the addition of&nbsp;<a href="http://cyx.github.com/ohm-contrib/doc/"><code>ohm/contrib</code></a>.</p>
<h2>Associations</h2>
<table>
<thead>
<tr>
<th>ActiveRecord</th>
<th>Ohm</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>has_a</code> or <code>belongs_to</code></td>
<td><code>reference</code></td>
</tr>
<tr>
<td><code>has_many</code></td>
<td><code>collection</code></td>
</tr>
</tbody>
</table>
<p>Read <a href="http://blog.citrusbyte.com/2010/04/12/mixing-ohm-with-activerecord-datamapper-and-sequel/">this article</a> if you&#8217;re considering creating associations from <span class="caps">AR</span> objects to Ohm objects and the other way&nbsp;&#8216;round.</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/5R0kBzt2ITU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2012/01/20/ohm-gotchas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2012/01/20/ohm-gotchas/</feedburner:origLink></item>
		<item>
		<title>Now at Blurb</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/6BpJZHW9hJ4/</link>
		<comments>http://www.g9labs.com/2011/11/21/now-at-blurb/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 19:12:53 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Work]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1117</guid>
		<description><![CDATA[I should have mentioned this long ago, but I started work at Blurb in early August. It&#8217;s been a quick ramp-up and I&#8217;m loving it there, surrounded by smart engineers and great designers. I do Rails/JS work there, and I&#8217;m building a lot of chops around Agile/TDD&#160;methodologies. Anyways, they had me do a Camera Thursdays [...]]]></description>
			<content:encoded><![CDATA[<p>I should have mentioned this long ago, but I started work at Blurb in early August. It&#8217;s been a quick ramp-up and I&#8217;m loving it there, surrounded by smart engineers and great designers. I do Rails/<span class="caps">JS</span> work there, and I&#8217;m building a lot of chops around Agile/<span class="caps">TDD</span>&nbsp;methodologies.</p>
<p>Anyways, they had me do a Camera Thursdays blog post, which I <a href="http://blog.blurb.com/index.php/2011/11/17/blurberati-with-cameras-nikon-d80-with-f1-8-50mm-prime/">wrote about my Nikon/1.8 camera&nbsp;combo</a>:</p>
<p><a href="http://blog.blurb.com/index.php/2011/11/17/blurberati-with-cameras-nikon-d80-with-f1-8-50mm-prime/"><img class="alignnone" title="Me on Blurb" src="http://blog.blurb.com/wp-content/uploads/2011/11/andrew.jpg" alt="" width="306" height="306" /></a></p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/6BpJZHW9hJ4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/11/21/now-at-blurb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/11/21/now-at-blurb/</feedburner:origLink></item>
		<item>
		<title>mmtss, a collaborative loop station</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/vkCc8huUslM/</link>
		<comments>http://www.g9labs.com/2011/10/02/mmtss-a-collaborative-loop-station/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 17:53:45 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1113</guid>
		<description><![CDATA[mmtss is a loop station built for live&#160;performances. Let&#8217;s make music together! This project simplifies a traditional loop tracking station and is designed for interactive collaborative music&#160;performances. The idea: Everybody adds or modifies one &#8220;part&#8221; of a 32-bar loop. The user gets to play an instrument over the existing mix and record the 32-bar phrase [...]]]></description>
			<content:encoded><![CDATA[<h2>mmtss is a loop station built for live&nbsp;performances.</h2>
<p>Let&#8217;s make music together! This project simplifies a traditional loop tracking station and is designed for interactive collaborative music&nbsp;performances.</p>
<p>The idea: Everybody adds or modifies one &#8220;part&#8221; 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&nbsp;record.</p>
<p><iframe width="480" height="360" src="http://www.youtube.com/embed/a2c-rCfR5XU" frameborder="0" allowfullscreen></iframe></p>
<p>It&#8217;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&nbsp;sockets.</p>
<p>Displayed at the Regeneration &#8220;We Collaborate&#8221; art show in Oakland, <span class="caps">CA</span>.&nbsp;9/24/2011.</p>
<h3>Screenshots</h3>
<p><img src="https://a248.e.akamai.net/assets.github.com/img/64abaefb0d10744dda42f362b6cd991522a88da4/687474703a2f2f6661726d372e7374617469632e666c69636b722e636f6d2f363136392f363138383336363537375f376261343864333864315f7a2e6a7067" alt="Practice mode" /></p>
<p>mmtss in practice/playback mode. Here the user is able to practice/mess around with the current instrument to prepare to record the next&nbsp;track.</p>
<p><img src="https://a248.e.akamai.net/assets.github.com/img/3f0c633b9b8d9d35970efe73f84c0f67bf68c6a8/687474703a2f2f6661726d372e7374617469632e666c69636b722e636f6d2f363132312f363138383838363131345f396436643531393937325f7a2e6a7067" alt="Cued mode" /></p>
<p>Pressing &#8220;record&#8221; puts the user in a wait state. They are prompted to begin recording when all the black boxes count down and&nbsp;disappear.</p>
<p><img src="https://a248.e.akamai.net/assets.github.com/img/650dc62a52d8ca6441eff57e697307325390caaa/687474703a2f2f6661726d372e7374617469632e666c69636b722e636f6d2f363137372f363138383336373135315f636135623738323733355f7a2e6a7067" alt="Record mode" /></p>
<p>mmtss in record&nbsp;mode.</p>
<p>More&nbsp;screenshots: http://www.flickr.com/photos/andrewhao/sets/72157627640840853/</p>
<h3>Source&nbsp;code</h3>
<p>Github:&nbsp;http://www.github.com/andrewhao/mmtss.</p>
<p><span class="caps">MIT</span>/<span class="caps">GPL</span>-sourced for your coding&nbsp;pleasure.</p>
<h3>Installation</h3>
<ul>
<li>Make sure you have npm installed: <a href="http://www.npmjs.org/">http://www.npmjs.org</a></li>
<li>Copy <code>lib/LiveOSC</code> into <code>/Applications/Live x.y.z OS X/Live.app/Contents/App-Resources/MIDI\ Remote\&nbsp;Scripts/</code> folder</li>
<li>Set it as your <span class="caps">MIDI</span> remote in the Ableton Live Preferences pane, in the &#8220;<span class="caps">MIDI</span> Remote&#8221;&nbsp;tab.</li>
</ul>
<h3>Running&nbsp;it</h3>
<ul>
<li>Open <code>Mmtss_0.als</code> as a sample Live&nbsp;project.</li>
<li>Install all project dependencies with <code>npm install</code> from the project&nbsp;root.</li>
<li>Start the Node server with <code>node app.js</code> from the root&nbsp;directory.</li>
<li>Open a Web browser and visit <code>localhost:3000</code></li>
</ul>
<h3>Modifying the sample&nbsp;project</h3>
<p>You can modify this project to suit your own needs. Note that there are two sets of tracks; instrument (<span class="caps">MIDI</span> input) tracks and loop tracks that actually store&nbsp;clips.</p>
<p>For <code>n</code> tracks, you can add or remove your own instruments. Just make sure that instrument at track <code>x</code> corresponds to track <code>x</code> + <code>n</code>.</p>
<h3>Credits</h3>
<ul>
<li>Design and architectural inspiration taken from <a href="http://github.com/vnoise/vtouch">vtouch</a>, a <span class="caps">HTML5</span>/Node/Canvas Ableton&nbsp;controller.</li>
<li>Original LiveOSC source is found at: <a href="http://monome.q3f.org/browser/trunk/LiveOSC">http://monome.q3f.org/browser/trunk/LiveOSC</a>. We use a different fork of the project at:<a href="http://github.com/vnoise/vtouch">http://github.com/vnoise/vtouch</a>.</li>
<li>Super sweet <span class="caps">CSS3</span> rocker widgets courtesy of <a href="http://www.simurai.com/">Simurai</a>: <a href="http://lab.simurai.com/css/umbrui/">UmbrUI</a></li>
</ul>
<h3>License</h3>
<p><a href="http://www.opensource.org/licenses/mit-license.php"><span class="caps">MIT</span></a> and <a href="http://www.gnu.org/copyleft/gpl.html">GPLv3</a> licensed. Go for&nbsp;it.</p>
<p>You will, however, need to get a license for <a href="http://www.ableton.com/live">Ableton Live</a>&nbsp;yourself.</p>
<h3>The handsome&nbsp;collaborators</h3>
<ul>
<li>Andrew Hao: <a href="http://www.g9labs.com/">http://www.g9labs.com</a></li>
<li>David Luoh: <a href="http://www.inkproj.com/">http://www.inkproj.com</a></li>
</ul>
<h3></h3>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/vkCc8huUslM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/10/02/mmtss-a-collaborative-loop-station/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/10/02/mmtss-a-collaborative-loop-station/</feedburner:origLink></item>
		<item>
		<title>Introducing Boink, a photobooth for the rest of us.</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/mhTEDsvKvDo/</link>
		<comments>http://www.g9labs.com/2011/08/10/introducing-boink-a-photobooth-for-the-rest-of-us/#comments</comments>
		<pubDate>Wed, 10 Aug 2011 16:25:10 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[project]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1104</guid>
		<description><![CDATA[My friends were complaining that wedding photobooths were too expensive to rent. Could we make one for&#160;them? Glen and I from the Porkbuns Initiative stepped up in full armor, ready to&#160;help. What is it? It&#8217;s a self-running photobooth that uses your Mac for brains and DSLR for eyes and a Webkit browser for its clothes [...]]]></description>
			<content:encoded><![CDATA[<p>My friends were complaining that wedding photobooths were too expensive to rent. Could we make one for&nbsp;them?</p>
<p>Glen and I from the <a href="http://porkbuns.net">Porkbuns Initiative</a> stepped up in full armor, ready to&nbsp;help.</p>
<p>What is it? It&#8217;s a self-running photobooth that uses your Mac for brains and <span class="caps">DSLR</span> for eyes and a Webkit browser for its clothes and a photo printer for&#8230; a printer. You can connect an iPad as the frontend for a nice visual touch (pun&nbsp;intended).</p>
<p>We built it on a backend Rails instance, pushing <span class="caps">SVG</span>+<span class="caps">HTML5</span> in the frontend and using the gphoto4ruby gem as a camera library&nbsp;wrapper.</p>
<div id="attachment_1105" class="wp-caption alignnone" style="width: 510px"><a rel="attachment wp-att-1105" href="http://www.g9labs.com/2011/08/10/introducing-boink-a-photobooth-for-the-rest-of-us/284852_10100607611957573_1201208_60011361_805844_n/"><img class="size-medium wp-image-1105" title="Boink photobooth at Jeff and Tiff's wedding." src="http://www.g9labs.com/wp-content/uploads/2011/08/284852_10100607611957573_1201208_60011361_805844_n-500x333.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">All dressed up and ready to&nbsp;go.</p></div>
<div class="wp-caption alignnone" style="width: 510px"><a title="Boink Preview by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/6006564205/"><img src="http://farm7.static.flickr.com/6029/6006564205_60fda1b366.jpg" alt="Boink Preview" width="500" height="313" /></a><p class="wp-caption-text">An early <span class="caps">UI</span>&nbsp;prototype.</p></div>
<div id="attachment_1106" class="wp-caption alignnone" style="width: 510px"><a rel="attachment wp-att-1106" href="http://www.g9labs.com/2011/08/10/introducing-boink-a-photobooth-for-the-rest-of-us/gen_219/"><img class="size-medium wp-image-1106" title="Finished print" src="http://www.g9labs.com/wp-content/uploads/2011/08/gen_219-500x348.jpg" alt="" width="500" height="348" /></a><p class="wp-caption-text">This comes out of the&nbsp;printer.</p></div>
<h3>Try it&nbsp;out</h3>
<p>Check it out on&nbsp;<a href="http://www.github.com/andrewhao/boink">Github</a>.</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/mhTEDsvKvDo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/08/10/introducing-boink-a-photobooth-for-the-rest-of-us/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/08/10/introducing-boink-a-photobooth-for-the-rest-of-us/</feedburner:origLink></item>
		<item>
		<title>Chat App – Frontend Prototype</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/pmPUKFmqsnQ/</link>
		<comments>http://www.g9labs.com/2011/07/01/chat-app-frontend-prototype/#comments</comments>
		<pubDate>Sat, 02 Jul 2011 01:21:05 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1092</guid>
		<description><![CDATA[Some UI work I did for a stealth startup in early &#8216;11. Responsible for look &#38; feel and frontend chat interactions. jQuery/UI communicating to a CakePHP/nodejs&#160;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 [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Chat View - 1 by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5885861130/"><img src="http://farm6.static.flickr.com/5261/5885861130_71e25f2beb.jpg" alt="Chat View - 1" width="500" height="341" /></a></p>
<p><a title="Interview View by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5885860254/"><img src="http://farm7.static.flickr.com/6053/5885860254_a2aa7f7895.jpg" alt="Interview View" width="500" height="276" /></a></p>
<p>Some <span class="caps">UI</span> work I did for a stealth startup in early &#8216;11. Responsible for look &amp; feel and frontend chat interactions. jQuery/<span class="caps">UI</span> communicating to a CakePHP/nodejs&nbsp;backend.</p>
<p>We developed this prototype with <a href="http://www.wisdom.weizmann.ac.il/~dharel/SCANNED.PAPERS/Statecharts.pdf">statecharts</a>, a concept commonly found in event-driven programming and with which I first learned from <a href="http://frozencanuck.wordpress.com/2011/03/09/sproutcore-statecharts-vs-controllers/">Sproutcore</a>. I found it really helped map out all the complex user interactions we had to deal with on the&nbsp;page.</p>
<p><a href="http://www.flickr.com/photos/andrewhao/sets/72157626954648391/with/5885860254/">See more screenshots from the&nbsp;set</a>.</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/pmPUKFmqsnQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/07/01/chat-app-frontend-prototype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/07/01/chat-app-frontend-prototype/</feedburner:origLink></item>
		<item>
		<title>BRUTE LABS UX project: StudentsConnect</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/3Vp84kX5ubw/</link>
		<comments>http://www.g9labs.com/2011/06/15/brute-labs-ux-project-studentsconnect/#comments</comments>
		<pubDate>Wed, 15 Jun 2011 16:01:42 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[Interfaces]]></category>
		<category><![CDATA[UX]]></category>
		<category><![CDATA[project]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1065</guid>
		<description><![CDATA[I&#8217;m on a team with BRUTE LABS, a volunteer-led design agency working on StudentsConnect, a prototype project making chatroulette-style interactions connecting students from the global North and South. Here&#8217;s a UX flow we worked&#160;on: BRUTE LABS - StudentsConnect UX View more presentations from Andrew Hao]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m on a team with <a href="http://www.brutelabs.org"><span class="caps">BRUTE</span> <span class="caps">LABS</span></a>, a volunteer-led design agency working on StudentsConnect, a prototype project making chatroulette-style interactions connecting students from the global North and South. Here&#8217;s a <span class="caps">UX</span> flow we worked&nbsp;on:</p>
<div style="width:425px" id="__ss_8126486"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/andrewhao/brute-labs-wireframes" title="BRUTE LABS - StudentsConnect UX"><span class="caps">BRUTE</span> <span class="caps">LABS</span> - StudentsConnect <span class="caps">UX</span></a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/8126486" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/andrewhao">Andrew Hao</a> </div>
</p></div>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/3Vp84kX5ubw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/06/15/brute-labs-ux-project-studentsconnect/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/06/15/brute-labs-ux-project-studentsconnect/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1336513186.878 seconds -->

