<?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, 21 Jan 2012 01:22:36 +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>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>
		<item>
		<title>Code For Oakland Barcamp</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/NcXAW7TtrGY/</link>
		<comments>http://www.g9labs.com/2011/06/04/code-for-oakland-barcamp/#comments</comments>
		<pubDate>Sun, 05 Jun 2011 01:43:19 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Andrew 2.0]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1058</guid>
		<description><![CDATA[A few notes from this one-day barcamp/hackfest. The goal was to create mobile apps for Oakland, with a special emphasis on serving underserved&#160;populations. Text messaging is still king. While smartphones and their apps are at the leading edge and grabbing all the attention these days, most underserved populations don&#8217;t have access to these services. Lots [...]]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 510px"><a title="DSC04950 by Oakland Local, on Flickr" href="http://www.flickr.com/photos/oaklandlocal/5804304389/"><img title="Hackers congregating" src="http://farm4.static.flickr.com/3527/5804304389_e539db36a2.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Is that Jon Chan I see? Yes it is. Photo credit Oakland&nbsp;Local.</p></div>
<p>A few notes from this <a href="http://codeforoakland.org/">one-day barcamp/hackfest</a>. The goal was to create mobile apps for Oakland, with a special emphasis on serving underserved&nbsp;populations.</p>
<ul>
<li>Text messaging is still king. While smartphones and their apps are at the leading edge and grabbing all the attention these days, most underserved populations don&#8217;t have access to these services. Lots of apps today are using <a href="http://www.twilio.com/">Twilio</a> or <a href="http://www.tropo.com">Tropo</a> APIs as their <span class="caps">SMS</span>/voice&nbsp;gateways.</li>
<li>Open data is awesome. I learned about <a href="http://www.scraperwiki.com">ScraperWiki</a>, which basically puts site scraping code into the cloud so people can maintain your scraper script long after you&#8217;ve tossed it. Some staff from maplight.org are&nbsp;here.</li>
<li>Open data is also difficult to maintain. One presenter mentioned how Oakland keeps a database of social services&thinsp;&#8212;&thinsp;that&#8217;s great, but what if the organization shuts down and/or changes its hours? Who&#8217;s responsible for updating the information? <span class="caps">IIRC</span>, the estimate was that 30% of the listings kept by the City are no longer valid. There need to be active efforts to combat dataset&nbsp;decay.</li>
<li>By the way, here&#8217;s a <a href="http://codeforoakland.org/data-sets/">list of Oakland <span class="caps">GIS</span> datasets</a>. Some of it really sucks (filled with garbage spam data). Some of it is&nbsp;useful.</li>
</ul>
<h4>Today&#8217;s&nbsp;Projects:</h4>
<ul>
<li><a href="http://comtxt.nodester.com/">comtxt</a>: text gateway for community organizers.&nbsp;<a href="http://github.com/ryanjarvinen/comtxt">github.com/ryanjarvinen/comtxt</a></li>
<li>freexchange.org. mobile interface to donated&nbsp;goods.</li>
<li>oakland:pm. get oakland high-schoolers connected to afterschool programs.&nbsp;<a href="http://github.com/jedp/oakland.pm">github.com/jedp/oakland.pm</a></li>
<li>txt2wrk: text-based job matching. this one is unique because it is a complete <span class="caps">SMS</span>/voice based interface. connects to craigslist. call it and it reads back craigslist job postings. targeted for&nbsp;parolees.</li>
<li>Oakland Food Finder: helping people find healthy, locally-grown&nbsp;food.</li>
<li>BettaSTOP: help people find buses, access bus schedules. in oakland, many underserved communities depend on making and finding the right bus. it also allows users to give feedback on buses, remark on their timeliness, and talk about bus route features. Live &amp; in production:&nbsp;http://www.bettastop.net.</li>
</ul>
<h4>What I&nbsp;did</h4>
<p>I&#8217;m helping out the Oakland:<span class="caps">PM</span> team, which is in the process of building out a service to get high schoolers connected to city-funded afterschool programs. The idea is that they can pull up their mobile phones and see what&#8217;s available to them while they&#8217;re kicking it with friends and bored out of their&nbsp;minds.</p>
<p>While the others hacked on wireframes and some code, I worked on a few user stories and resolved to interview a few of my contacts who work for the <span class="caps">YMCA</span> in East Oakland. We won a $500 grant from the City to see this thing through in July. Here&#8217;s hoping that we&#8217;ll make&nbsp;it.</p>
<p>So far the app is a <a href="http://nodejs.org">nodejs</a> app with pages served with the <a href="http://expressjs.com/">Express</a> framework. We threw around ideas of using <a href="http://www.sencha.com/products/touch/">Sencha Touch</a>, but I think that decision is out of my hands. We&#8217;ll see how we&nbsp;proceed.</p>
<p>Source code can be found at: <a href="http://github.com/jedp/oakland.pm">http://www.github.com/jedp/oakland.pm</a></p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/NcXAW7TtrGY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/06/04/code-for-oakland-barcamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/06/04/code-for-oakland-barcamp/</feedburner:origLink></item>
		<item>
		<title>UN Declaration of Human Rights (Visualization)</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/Qfrjb3bA0p0/</link>
		<comments>http://www.g9labs.com/2011/03/22/un-declaration-of-human-rights-visualization/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 00:16:32 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1053</guid>
		<description><![CDATA[This design was created from a Processing sketch that breaks up the preamble to the UN Declaration of Human Rights and connects adjacent words together with lines. More frequent word associations can be noted by darker, thicker&#160;lines. The source code (albeit messy) can be found at www.github.com/andrewhao/freedom-sunday. I&#8217;m running the sketch in full Java mode, [...]]]></description>
			<content:encoded><![CDATA[<p><a title="UN Declaration of Human Rights (Visualization) by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5548186559/"><img src="http://farm6.static.flickr.com/5186/5548186559_70e047238c.jpg" alt="UN Declaration of Human Rights (Visualization)" width="500" height="500" /></a></p>
<p>This design was created from a Processing sketch that breaks up the preamble to the <a href="http://www.un.org/en/documents/udhr/index.shtml"><span class="caps">UN</span> Declaration of Human Rights</a> and connects adjacent words together with lines. More frequent word associations can be noted by darker, thicker&nbsp;lines.</p>
<p>The source code (albeit messy) can be found at <a rel="nofollow" href="http://www.github.com/andrewhao/freedom-sunday">www.github.com/andrewhao/freedom-sunday</a>. I&#8217;m running the sketch in full Java mode, so be sure to compile with your Java <span class="caps">IDE</span> of choice (rather than the Processing&nbsp;<span class="caps">IDE</span>).</p>
<p>Inspiration taken from the designs of Harry Kao (<a href="http://www.hairycow.name">http://www.hairycow.name</a>) and Jer Thorp (<a href="http://blog.blprnt.com">http://blog.blprnt.com</a>).</p>
<p>My fellow interns and I are headed off to Cebu for 10 days to observe organizations involved in anti-trafficking efforts. More info:&nbsp;<a rel="nofollow" href="http://interns.regenerationweb.com">interns.regenerationweb.com</a></p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/Qfrjb3bA0p0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/03/22/un-declaration-of-human-rights-visualization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/03/22/un-declaration-of-human-rights-visualization/</feedburner:origLink></item>
		<item>
		<title>Slavery Today (Infographic)</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/3C2aF1cefuM/</link>
		<comments>http://www.g9labs.com/2011/03/14/slavery-today-infographic/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 06:15:14 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Art]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[God]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1049</guid>
		<description><![CDATA[An infographic for Freedom Sunday at Regeneration. Download as&#160;PDF.]]></description>
			<content:encoded><![CDATA[<p><a title="Slavery Today Infographic (Freedom Sunday) by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5523317386/"><img style="display: inline;" src="http://farm6.static.flickr.com/5134/5523317386_1b2c6967c4.jpg" alt="Slavery Today Infographic (Freedom Sunday)" width="193" height="500" /></a><a title="Slavery Today Infographic (Freedom Sunday) by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5522731659/"><img style="display: inline;" src="http://farm6.static.flickr.com/5092/5522731659_4bfa77761f.jpg" alt="Slavery Today Infographic (Freedom Sunday)" width="193" height="500" /></a></p>
<p>An infographic for <a href="http://www.freedomsunday.org/">Freedom Sunday</a> at <a href="http://www.regenerationweb.com">Regeneration</a>. <a href="http://www.andrewhao.com/wp-content/uploads/2011/03/Slavery-Today-Flyer.pdf">Download as&nbsp;<span class="caps">PDF</span></a>.</p>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/3C2aF1cefuM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/03/14/slavery-today-infographic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/03/14/slavery-today-infographic/</feedburner:origLink></item>
		<item>
		<title>Save our souls – a Twitter art installation</title>
		<link>http://feedproxy.google.com/~r/g9labs/VpWG/~3/Y3Qxqm67ntY/</link>
		<comments>http://www.g9labs.com/2011/02/23/save-our-souls-a-twitter-art-installation/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 17:51:37 +0000</pubDate>
		<dc:creator>andrewhao</dc:creator>
				<category><![CDATA[Andrew 2.0]]></category>
		<category><![CDATA[Art]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[God]]></category>
		<category><![CDATA[SOS]]></category>

		<guid isPermaLink="false">http://www.g9labs.com/?p=1038</guid>
		<description><![CDATA[Here&#8217;s how the installation looked on the day of the art&#160;show. Save our souls - Twitter art installation from Andrew Hao on&#160;Vimeo. What are people saying about the ashes in the world today? This installation visualizes a live Twitter stream on heartache, injustice, loss, and our city and matches them up with the redemptive promises [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s how the installation looked on the day of the art&nbsp;show.</p>
<div class="wp-caption alignnone" style="width: 343px"><a title="Installation by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5467033003/"><img src="http://farm6.static.flickr.com/5180/5467033003_c1c14c5dc0.jpg" alt="Installation" width="333" height="500" /></a><p class="wp-caption-text">We mounted the installation on the inside of the Regeneration cafe. The Arduino lies behind the Macbook behind the&nbsp;monitor.</p></div>
<div class="wp-caption alignnone" style="width: 343px"><a title="Mounted LED array by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5471602272/"><img src="http://farm6.static.flickr.com/5296/5471602272_85203b475e.jpg" alt="Mounted LED array" width="333" height="500" /></a><p class="wp-caption-text">The LEDs are mounted on breadboards suspended on fishing wire, binder clips, rubber bands, chopsticks, and a&nbsp;prayer.</p></div>
<div class="wp-caption alignnone" style="width: 343px"><a title="In action by andrewhao, on Flickr" href="http://www.flickr.com/photos/andrewhao/5471598060/"><img src="http://farm6.static.flickr.com/5057/5471598060_f1bb64a83f.jpg" alt="In action" width="333" height="500" /></a><p class="wp-caption-text">Finished it just in&nbsp;time.</p></div>
<p><iframe src="http://player.vimeo.com/video/20267056?byline=0&amp;portrait=0" width="505" height="379" frameborder="0"></iframe>
<p><a href="http://vimeo.com/20267056">Save our souls - Twitter art installation</a> from <a href="http://vimeo.com/user807863">Andrew Hao</a> on&nbsp;<a href="http://vimeo.com">Vimeo</a>.</p>
<blockquote><p>
What are people saying about the ashes in the world today? This installation visualizes a live Twitter stream on heartache, injustice, loss, and our city and matches them up with the redemptive promises of&nbsp;Isaiah.</p>
<p>Life is difficult, and redemption is something we all long for. What changes do you hope for in your life or in the world? Send a response from your Twitter account to @sos_61 and watch the installation react. If you&#8217;d like to be kept anonymous, send your response in a <span class="caps">DM</span> to&nbsp;@sos_61.</p>
<p><span class="dquo">&#8220;</span>I hope for ____&#8221;<br />
&#8220;I wish that ____&#8221;<br />
&#8220;I want to see&nbsp;____&#8221;
</p></blockquote>
<h3>A few&nbsp;notes</h3>
<ul>
<li>Web interface is a fullscreen Google Chrome window. <a href="http://socket.io/">socket.io</a> is the Websocket interface to the <a href="http://nodejs.org">node.js</a> backend. The slide transition is animated via a <span class="caps">CSS3</span> animation, and the red overlay is a simple <span class="caps">SVG</span> shape plotted with the help of&nbsp;<a href="http://raphaeljs.com">RaphaëlJS</a>.</li>
<li>The Twitter backend is a collection of four self-updating Twitter searches, one for heartache (&#8220;i feel lonely, sad, depressed&#8221;), injustice (&#8220;violence, war, oppression, justice&#8221;), death (&#8220;rest in peace, passed away&#8221;), and Oakland (&#8220;oakland&#8221;). A blacklist filters out undesirable tweet keywords (&#8220;justin&nbsp;bieber&#8221;).</li>
<li>Additionally, the backend connects to Twitter via the <a href="http://dev.twitter.com/pages/streaming_api">Streaming <span class="caps">API</span></a> and displays a special animation for users who reply via tweet to the <a href="http://www.twitter.com/sos_61">@sos_61</a>&nbsp;account.</li>
<li>The installation picks a tweet to display and pulses the <span class="caps">LED</span> array corresponding to the right&nbsp;tweet.</li>
<li>Communication to the Arduino happens via a python script over the Firmata protocol, using the <a href="https://github.com/lupeke/python-firmata">python-firmata</a> library. The nodejs server signals the script over a socket connection which will run the pulse animation on the correct&nbsp;pin.</li>
<li>I printed the graphic on an oversize printer with the good folks at <a href="http://alamedacopy.com">Alameda Copy</a>. Friendly service, fast turnaround, very reasonable prices. Ask for&nbsp;Joe.</li>
</ul>
<h3>Links</h3>
<ul>
<li><a href="http://www.github.com/andrewhao/isaiah-61-project">Source code on&nbsp;github.</a></li>
<li><a href="http://www.flickr.com/photos/andrewhao/sets/72157626107989740/">Flickr photos from the art&nbsp;show.</a></li>
<li><a href="http://www.flickr.com/photos/andrewhao/sets/72157625956085386/">Photos of the creation&nbsp;process.</a></li>
<li>Other posts on the process: <a href="http://www.g9labs.com/2011/02/01/the-making-of-sos-intro/">[1]</a>, <a href="http://www.g9labs.com/2011/02/11/update/">[2]</a>, <a href="http://www.g9labs.com/2011/02/12/currently-frustrated/">[3]</a>,&nbsp;<a href="http://www.g9labs.com/2011/02/15/arduino-and-python-firmata/">[4]</a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/g9labs/VpWG/~4/Y3Qxqm67ntY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.g9labs.com/2011/02/23/save-our-souls-a-twitter-art-installation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.g9labs.com/2011/02/23/save-our-souls-a-twitter-art-installation/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1328033977.801 seconds -->

