<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Atomic Spin</title>
	<atom:link href="http://spin.atomicobject.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://spin.atomicobject.com</link>
	<description>Atomic Object&#039;s Blog On Software Design &#38; Development</description>
	<lastBuildDate>Tue, 15 May 2012 05:30:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Inspiration: The Water Clocks of Bernard Gitton</title>
		<link>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/</link>
		<comments>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/#comments</comments>
		<pubDate>Tue, 15 May 2012 05:30:09 +0000</pubDate>
		<dc:creator>Mike English</dc:creator>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[beauty]]></category>
		<category><![CDATA[bernard-gitton]]></category>
		<category><![CDATA[childhood]]></category>
		<category><![CDATA[clock]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[fluids]]></category>
		<category><![CDATA[gitton]]></category>
		<category><![CDATA[inspiration]]></category>
		<category><![CDATA[learning]]></category>
		<category><![CDATA[physics]]></category>
		<category><![CDATA[sculpture]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[timekeeping]]></category>
		<category><![CDATA[water]]></category>
		<category><![CDATA[water-clock]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86177</guid>
		<description><![CDATA[	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/2688908378_1e064cbbb1_b/" rel="attachment wp-att-86188"><img src="http://spin.atomicobject.com/wp-content/uploads/2688908378_1e064cbbb1_b-546x800.jpg" alt="" title="Water clock" width="546" height="800" class="size-medium wp-image-86188" /></a></p>

	<p>Not long ago, I had an interesting lunchtime discussion with <a href="http://spin.atomicobject.com/author/vranish/">Job Vranish</a>. I don&#8217;t recall exactly how we got on the topic, but we were discussing how mesmerizing <a href="http://en.wikipedia.org/wiki/Siphon">siphons</a> are. As the discussion progressed to imagining a fluid-based computer (that&#8217;s another story&#8230;), I remembered something I had seen as a child at the <a href="http://www.childrensmuseum.org/">Indianapolis Children&#8217;s museum</a>: an immense clock that kept time with the flow of water through glass tubes.</p>

<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/" class="more-link">Read more on Inspiration: The Water Clocks of Bernard Gitton <span class="meta-nav">&#187;</span></a></p>]]></description>
			<content:encoded><![CDATA[	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/2688908378_1e064cbbb1_b/" rel="attachment wp-att-86188"><img src="http://spin.atomicobject.com/wp-content/uploads/2688908378_1e064cbbb1_b-546x800.jpg" alt="" title="Water clock" width="546" height="800" class="size-medium wp-image-86188" /></a></p>

	<p>Not long ago, I had an interesting lunchtime discussion with <a href="http://spin.atomicobject.com/author/vranish/">Job Vranish</a>. I don&#8217;t recall exactly how we got on the topic, but we were discussing how mesmerizing <a href="http://en.wikipedia.org/wiki/Siphon">siphons</a> are. As the discussion progressed to imagining a fluid-based computer (that&#8217;s another story&#8230;), I remembered something I had seen as a child at the <a href="http://www.childrensmuseum.org/">Indianapolis Children&#8217;s museum</a>: an immense clock that kept time with the flow of water through glass tubes.</p>

	<p><span id="more-86177"></span></p>

	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/2568448161_18b8ebf746_b/" rel="attachment wp-att-86183"><img src="http://spin.atomicobject.com/wp-content/uploads/2568448161_18b8ebf746_b-532x800.jpg" alt="" title="Water Clock - Indy Children&#039;s Museum" width="532" height="800" class="size-medium wp-image-86183" /></a></p>

	<p>Later I did some research into what I discovered is one of the largest water clocks ever made by the French physicist-turned-artist, <a href="http://en.wikipedia.org/wiki/Bernard_Gitton">Bernard Gitton</a>.</p>

	<p>Gitton&#8217;s water clock begins, as many clocks do, with a pendulum. This pendulum is attached to a small scoop into which a constant stream of water flows. As the pendulum swings, the scoops spills its contents into another vessel at regular intervals.</p>

	<p>These &#8220;dollops&#8221; of water must then be transformed into the displayed minute and hour values along the sides of the clock.</p>

	<p>First, the dollops drain from the collection vessel down a piece of glass tubing where they settle into the &#8220;trap&#8221; of an S-shaped siphon. The siphon is calibrated such that multiple dollops collect before the siphon triggers, suctioning the entirety of the contents down into the next component. These siphons are triggered when the fluid reaches the height of the top of the S-shaped curve and begins to be pulled downward by gravity. Once this process begins, the fluid continues to drain from the siphon until it is empty.</p>

	<p>In the case of Gitton&#8217;s water clock, the fluid drains into a series of additional siphons, calibrated to hold increasing volumes of water before triggering. These siphons act as frequency dividers for the initial signal provided by the pendulum. (i.e. If a dollop comes every two seconds, and the first siphon can hold three dollops, then the first siphon will drain only every 6 seconds, the second siphon in the series may hold several of these larger dollops, dividing the frequency still more, and so forth.)</p>

	<p>The last siphon in the series has a very interesting property &#8211; the low pressure created by draining of the vessel is &#8220;captured&#8221; by a sort of &#8220;vacuum locking&#8221; device that keeps the &#8220;vacuum&#8221; from &#8220;traveling&#8221; back up the input channel. Instead, the lower pressure is carried by another piece of tubing over to a vessel with a siphon on the brink of draining. (Just how this balance is calibrated is not clear to me.) When the &#8220;vacuum locked&#8221; siphon triggers and transfers this lower pressure to the other vessel, it triggers that siphon and drains the fluid into the minutes counter.</p>

	<p>This minutes counter is column of stacked globes that contain the colored fluid. The height of the fluid in the column fills a number of the globes corresponding to the minutes past the hour. Alongside the column of minute-globes is another S-shaped siphon that triggers just before the hour, draining the entire column and triggering another vessel to drain into the hours column. This process takes several minutes, during which the observer has the distinct impression that time itself is being lost down the drain. The Greek idiom used to refer to water clocks is &#8220;Clepsydra&#8221;, which translates more literally to &#8220;water thief&#8221;. Gitton calls these clocks (of which there are several around the world), Time-Flow Clocks or &#8220;Horloges à voir le temps couler&#8221; (roughly translated: clocks for viewing the passing of time).</p>

	<p><a href="http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/85912031_1299d2385b_b/" rel="attachment wp-att-86199"><img src="http://spin.atomicobject.com/wp-content/uploads/85912031_1299d2385b_b-590x786.jpg" alt="" title="Crazy Water Clock at the Children&#039;s Museum" width="590" height="786" class="aligncenter size-medium wp-image-86199" /></a></p>

	<p>If you&#8217;re as fascinated by this device as I am, you can read more at <a href="http://www.marcdatabase.com/~lemur/dm-gitton.html#clocktheory">this page</a>, put together by David M. MacMillan, where you can find a much more detailed technical explanation along with a number of helpful diagrams. I also recommend watching the fantastic nine minute documentary, <a href="https://vimeo.com/28461780">Bernard Gitton &#8211; Physics and Art</a>, done by <a href="http://www.magee.ch/">Michael Magee</a>. Another explanation of the water clock, produced by The Children&#8217;s Museum of Indianapolis, can be viewed <a href="http://youtu.be/tdGEVZ6zdyM">on YouTube</a>. There are a few other videos on YouTube of these water clocks in operation, but most of them are not very clear. You can get a better sense of what is happening by watching this <a href="http://www.cadrans-solaires.fr/gitton/animation-horloge-gitton.html">intricately animated illustration</a> created by Roland Barth. Additionally, Gitton&#8217;s studio has a small webpage with contact information at <a href="http://www.bernard-gitton.com">www.bernard-gitton.com</a>. (You may need to scroll sideways to reach the content in the frames on the Gitton site.)</p>

	<p>What beautiful artifacts inspire you? If you have children, do you try to expose them to things that inspire? What feats of engineering are still impressed upon your memory from childhood?</p>]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/15/inspiration-the-water-clocks-of-bernard-gitton/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Dangerous Liaisons</title>
		<link>http://spin.atomicobject.com/2012/05/14/dangerous-liaisons/</link>
		<comments>http://spin.atomicobject.com/2012/05/14/dangerous-liaisons/#comments</comments>
		<pubDate>Mon, 14 May 2012 16:43:47 +0000</pubDate>
		<dc:creator>Phil Kirkham</dc:creator>
				<category><![CDATA[Testing]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86114</guid>
		<description><![CDATA[<p>A project that I&#8217;m currently testing is a management system that has things like resources, timelines and tasks. There are different types of tasks; one such type is a &#8216;liaison&#8217; task.</p>
<p><a href="http://spin.atomicobject.com/2012/05/14/dangerous-liaisons/" class="more-link">Read more on Dangerous Liaisons <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>A project that I&#8217;m currently testing is a management system that has things like resources, timelines and tasks. There are different types of tasks; one such type is a &#8216;liaison&#8217; task.</p>
<p>I wanted to test the performance of the system to see how well it handled hundreds of items so I created a couple of hundred tasks, all of which happened to be &#8216;liaison&#8217; type.</p>
<p><span id="more-86114"></span></p>
<p>There was no problem with speed in getting them loaded up and displaying, and scrolling was fine.</p>
<p>Chrome, however, did have a problem with the page&#8211;it thought the page was in French and offered to translate it. I let it and all the occurrences of &#8216;liaison&#8217; were replaced with &#8216;link&#8217;. Even though liaison is now a commonly-used English word (with Old French roots,) Chrome thought that with so many of them used it must be a French page. After all, who else but the French would have so many liaisons?</p>
<p>When I have a spare few minutes I might run some tests to find what the threshold is for the number of liaisons that tips Chrome into thinking that the page is French rather than English&#8230;</p>
<p>It turned out to be a simple fix&#8211;add a meta tag of <code>&lt;meta name="google" value="notranslate"/&gt;</code> to the page.</p>
<p>I&#8217;m filing this in my Amusing Bugs list&#8211;and also my &#8220;What test case would find that defect?&#8221; list. I did not expect to find a translation bug whilst running a performance test.</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/14/dangerous-liaisons/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Safe Usage of /bin/rm</title>
		<link>http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/</link>
		<comments>http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/#comments</comments>
		<pubDate>Fri, 11 May 2012 12:00:24 +0000</pubDate>
		<dc:creator>Justin Kulesza</dc:creator>
				<category><![CDATA[Unix, Linux, and Bash]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[rm]]></category>
		<category><![CDATA[rm -rf]]></category>
		<category><![CDATA[safe rm]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=85926</guid>
		<description><![CDATA[<p>Those of you out there familiar with <a href="http://en.wikipedia.org/wiki/Unix">UNIX</a>/<a href="http://en.wikipedia.org/wiki/Linux">Linux</a> systems know that operating system tools and utilities that you have at your disposal are incredibly powerful.  Arguably, this is one of the great strengths of UNIX/Linux systems. Basically, these systems give you unlimited control, and you can do anything you want without being bothered by pop-up windows, dialogs, etc.</p>
<p><a href="http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/" class="more-link">Read more on Safe Usage of /bin/rm <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Those of you out there familiar with <a href="http://en.wikipedia.org/wiki/Unix">UNIX</a>/<a href="http://en.wikipedia.org/wiki/Linux">Linux</a> systems know that operating system tools and utilities that you have at your disposal are incredibly powerful.  Arguably, this is one of the great strengths of UNIX/Linux systems. Basically, these systems give you unlimited control, and you can do anything you want without being bothered by pop-up windows, dialogs, etc.</p>
<p><a href="http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/not-so-safe-rm/" rel="attachment wp-att-85931"><img src="http://spin.atomicobject.com/wp-content/uploads/not-so-safe-rm.png" alt="" title="not-so-safe-rm" width="532" height="256" class="aligncenter size-full wp-image-85931" /></a><br />
<span id="more-85926"></span><br />
I recently did a <code>rm -rf *</code> on the wrong directory.</p>
<p>That&#8217;s how all good stories start, right?</p>
<p>You always hear about <code>rm -rf *</code> horror stories.  You know <a href="http://justpasha.org/folk/rm.html">what I&#8217;m talking about</a>.  Everyone laughs and jokes about such things.  It&#8217;s very amusing, unless you have just mistakenly done it to data rather important to you.  But you have <a href="http://spin.atomicobject.com/2012/01/27/safeguarding-your-productivity/">backups</a>, right?</p>
<p>There are countless utilities and scripts out there to &#8220;make <code>rm</code> safe&#8221;.  A <a href="http://www.google.com/webhp?hl=en&#038;tab=ww#hl=en&#038;output=search&#038;sclient=psy-ab&#038;q=safe+rm&#038;oq=safe+rm">quick Google search</a> turned up several &#8212; mostly written in <a href="http://en.wikipedia.org/wiki/Perl">Perl</a>.  Unfortunately, I&#8217;m <a href="http://stackoverflow.com/questions/1885800/how-can-i-obfuscate-my-perl-script-to-make-it-difficult-to-reverse-engineer#comment-1786231">not very fluent in Perl</a>.  While the safe removal tools written in Perl were functional, they did not meet my more specific desires, and I did not feel comfortable modifying them to make them do so.</p>
<p>So, I wrote my own little script in Bash.  Basically, I wanted my script to detect (and stop) any attempt to delete important directories directly (e.g. <code>rm -rf /boot)</code>, as well as through globbing (e.g. <code>rm -rf *</code>).  This is an important distinction as doing <code>rm -rf /</code> is just as bad as doing <code>rm -rf *</code> in the root directory. (Not all of the safe removal tools prevent the latter).</p>
<p>Basically, my script checks if the arguments to <code>rm</code> are absolute paths to important directories, or if globbed arguments match a certain number of keywords for important directories.  Additionally, it throws in a short delay before even running.  In my experience, I&#8217;ve hit executed <code>rm -rf *</code> only to immediately realize my error and hit ^C (Ctrl + c).  But, of course, this is never faster enough.  The short pause should give me a fighting chance at catching the mistake. (Of course, this may be a slight hindrance if you are doing something which uses <code>rm</code> in an automated fashion, like <code>./configure &#038;&#038; make &#038;&#038; make install</code>. If that&#8217;s the case, recommend you comment out the <code>sleep</code> command.)</p>
<p><div id="gist-2523251" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c">#!/bin/bash</span></div><div class='line' id='LC2'>sleep 2</div><div class='line' id='LC3'><span class="nv">args</span><span class="o">=(</span> <span class="nv">$@</span> <span class="o">)</span></div><div class='line' id='LC4'><span class="nv">preserve_paths</span><span class="o">=(</span> / /bin /boot /dev /etc /home /initrd /lib /proc /root /sbin /sys /usr /usr/bin /usr/include /usr/lib /usr/local /usr/local/bin /usr/local/include /usr/local/sbin /usr/local/share /usr/sbin /usr/share /usr/src /var /opt <span class="o">)</span></div><div class='line' id='LC5'><span class="nv">preserve_keywords</span><span class="o">=(</span> bin boot dev etc home initrd lib proc root sbin sys usr include <span class="nb">local </span>share src opt var <span class="o">)</span></div><div class='line' id='LC6'><span class="k">for </span>path in <span class="s2">&quot;${preserve_paths[@]}&quot;</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC8'><span class="k">    for </span>arg in <span class="s2">&quot;${args[@]}&quot;</span></div><div class='line' id='LC9'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC10'><span class="k">      if</span> <span class="o">[[</span> <span class="nv">$arg</span> <span class="o">=</span> <span class="nv">$path</span> <span class="o">]]</span>;</div><div class='line' id='LC11'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">then</span></div><div class='line' id='LC12'><span class="k">        </span><span class="nb">echo</span> <span class="s2">&quot;I refuse to delete: $path&quot;</span></div><div class='line' id='LC13'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">echo</span> <span class="s2">&quot;It seems too important. If you want to do it anyway, use /bin/rm&quot;</span></div><div class='line' id='LC14'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">exit </span>100</div><div class='line' id='LC15'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">fi</span></div><div class='line' id='LC16'><span class="k">    done</span></div><div class='line' id='LC17'><span class="k">done</span></div><div class='line' id='LC18'><span class="nv">counter</span><span class="o">=</span>0</div><div class='line' id='LC19'><span class="nv">matches</span><span class="o">=()</span></div><div class='line' id='LC20'><span class="k">for </span>keyword in <span class="s2">&quot;${preserve_keywords[@]}&quot;</span></div><div class='line' id='LC21'>&nbsp;&nbsp;<span class="k">do </span></div><div class='line' id='LC22'><span class="k">    for </span>arg in <span class="s2">&quot;${args[@]}&quot;</span></div><div class='line' id='LC23'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">do</span></div><div class='line' id='LC24'><span class="k">      if</span> <span class="o">[[</span> <span class="nv">$arg</span> <span class="o">=</span> <span class="nv">$keyword</span> <span class="o">]]</span>;</div><div class='line' id='LC25'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">then</span></div><div class='line' id='LC26'><span class="k">        </span><span class="nv">counter</span><span class="o">=</span><span class="k">$((</span><span class="nv">$counter</span> <span class="o">+</span> <span class="m">1</span><span class="k">))</span></div><div class='line' id='LC27'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nv">matches</span><span class="o">=(</span> <span class="k">${</span><span class="nv">matches</span><span class="p">[@]</span><span class="k">}</span> <span class="nv">$keyword</span> <span class="o">)</span></div><div class='line' id='LC28'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">fi</span></div><div class='line' id='LC29'><span class="k">      if</span> <span class="o">[[</span> <span class="nv">$counter</span> -gt 1 <span class="o">]]</span>;</div><div class='line' id='LC30'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">then</span></div><div class='line' id='LC31'><span class="k">        </span><span class="nb">echo</span> <span class="s2">&quot;I refuse to delete: ${matches[@]}&quot;</span></div><div class='line' id='LC32'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">echo</span> <span class="s2">&quot;They seem too important. If you want to do it anyway, use /bin/rm&quot;</span></div><div class='line' id='LC33'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="nb">exit </span>100</div><div class='line' id='LC34'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">fi</span></div><div class='line' id='LC35'><span class="k">  done</span></div><div class='line' id='LC36'><span class="k">done</span></div><div class='line' id='LC37'>/bin/rm <span class="s2">&quot;$@&quot;</span></div><div class='line' id='LC38'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2523251/cb7c1a2b0e1c1e78c066e257ac30bb4d0b122e9e/safe-rm.sh" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2523251#file_safe_rm.sh" style="float:right;margin-right:10px;color:#666">safe-rm.sh</a>
            <a href="https://gist.github.com/2523251">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<p>As you can see, it&#8217;s a simple script.  I&#8217;m sure there are more efficient ways to accomplish the same thing &#8212; but I was able to throw this together quickly, and be confident it would stop me from repeating my error.</p>
<p><a href="http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/safe-rm/" rel="attachment wp-att-85932"><img src="http://spin.atomicobject.com/wp-content/uploads/safe-rm.png" alt="" title="safe-rm" width="535" height="161" class="aligncenter size-full wp-image-85932" /></a></p>
<p>I&#8217;ve quickly installed this on my local computer and several other servers that I access regularly. To install it, I simply place it in <code>/usr/local/bin</code>, and make it executable:</p>
<pre>
sudo mv safe-rm.sh /usr/local/bin/rm
sudo chmod +x /usr/local/bin/rm
</pre>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/11/safe-usage-of-binrm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>User Experience for Lean Startups: A workshop that will help you create the right product</title>
		<link>http://spin.atomicobject.com/2012/05/10/user-experience-for-lean-startups-a-workshop-that-will-help-you-create-the-right-product/</link>
		<comments>http://spin.atomicobject.com/2012/05/10/user-experience-for-lean-startups-a-workshop-that-will-help-you-create-the-right-product/#comments</comments>
		<pubDate>Thu, 10 May 2012 13:10:25 +0000</pubDate>
		<dc:creator>Brittany Hunter</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86129</guid>
		<description><![CDATA[<p><center><a href="http://www.flickr.com/photos/lane_halley/6851508474/" title="IMG_5825 by Lane Halley, on Flickr"><img src="http://farm7.staticflickr.com/6111/6851508474_6e2c10120c.jpg" width="500" height="375" alt="IMG_5825"/></a></center></p>
<p>On Saturday, May 19, Lane Halley of <a href="http://luxr.co/">LUXr</a> will teach a 1-day workshop on <a href="http://ux4leanstartupmay19-eorg.eventbrite.com/"><strong>User Experience for Lean Startups.</strong></a> The event will be held right here at AO&#8217;s offices.  User Experience is one of the most challenging and least understood aspects of creating a product&#8230;and yet it will make or break your product. During this workshop, Lane will teach you Lean Startup methods that help you make the right product, and make your product right.<br />
<span id="more-86129"></span><br />
Whether you are a designer, a programmer, a product manager, or just somebody with a great idea, this workshop will introduce you to tools and techniques that help you deliver an experience that really shines. To see more of what happens at this workshop, take a look at the <a href="http://www.flickr.com/photos/lane_halley/sets/72157629621970109/>UX for Lean Startups flickr set and check out <a href="http://www.youtube.com/watch?v=Sy-LKLl35f8&#038;feature=related">Lane&#8217;s Ignite talk.</a></p>
<p><a href="http://spin.atomicobject.com/2012/05/10/user-experience-for-lean-startups-a-workshop-that-will-help-you-create-the-right-product/" class="more-link">Read more on User Experience for Lean Startups: A workshop that will help you create the right product <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p><center><a href="http://www.flickr.com/photos/lane_halley/6851508474/" title="IMG_5825 by Lane Halley, on Flickr"><img src="http://farm7.staticflickr.com/6111/6851508474_6e2c10120c.jpg" width="500" height="375" alt="IMG_5825"></a></center></p>
<p>On Saturday, May 19, Lane Halley of <a href="http://luxr.co/">LUXr</a> will teach a 1-day workshop on <a href="http://ux4leanstartupmay19-eorg.eventbrite.com/"><strong>User Experience for Lean Startups.</strong></a> The event will be held right here at AO&#8217;s offices.  User Experience is one of the most challenging and least understood aspects of creating a product&#8230;and yet it will make or break your product. During this workshop, Lane will teach you Lean Startup methods that help you make the right product, and make your product right.<br />
<span id="more-86129"></span><br />
Whether you are a designer, a programmer, a product manager, or just somebody with a great idea, this workshop will introduce you to tools and techniques that help you deliver an experience that really shines. To see more of what happens at this workshop, take a look at the <a href="http://www.flickr.com/photos/lane_halley/sets/72157629621970109/>UX for Lean Startups flickr set</a> and check out <a href="http://www.youtube.com/watch?v=Sy-LKLl35f8&#038;feature=related">Lane&#8217;s Ignite talk.</a></p>
<p><a href="http://luxr.co/about/team/">Lane Halley</a>, program director of LUXr, is a good friend of Atomic Object. She is a product designer infused with entrepreneurial energy. As an agile coach and design consultant, Lane helps cross-functional teams understand their project domain, develop empathy with users, and engage in creative collaboration. She is delighted to bring the LUXr program to Grand Rapids and looks forward to meeting you soon!</p>
<p>Plan now to attend. <a href="http://ux4leanstartupmay19-eorg.eventbrite.com/">Register Here</a>&#8230;and use the discount code &#8220;AOFriend&#8221; for 10% off. Space is limited! </p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/10/user-experience-for-lean-startups-a-workshop-that-will-help-you-create-the-right-product/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Raspberry Pi: Prototyping Potential</title>
		<link>http://spin.atomicobject.com/2012/05/10/raspberry-pi-prototyping-potential/</link>
		<comments>http://spin.atomicobject.com/2012/05/10/raspberry-pi-prototyping-potential/#comments</comments>
		<pubDate>Thu, 10 May 2012 12:46:48 +0000</pubDate>
		<dc:creator>Scott Vokes</dc:creator>
				<category><![CDATA[Design & Development]]></category>
		<category><![CDATA[Embedded Software]]></category>
		<category><![CDATA[Hardware Design]]></category>
		<category><![CDATA[Prototyping]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Unix, Linux, and Bash]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86127</guid>
		<description><![CDATA[<p>Recently, the <a href="http://www.raspberrypi.org/">Raspberry Pi Foundation</a> started shipping its Raspberry Pi boards. (And I got one!) They&#8217;re tiny, low-power computers, originally designed so that schoolkids could afford a personal Linux computer for learning programming. Despite selling at the same price point as an <a href="http://arduino.cc">Arduino</a> ($25), they have almost as much processing power as a netbook.</p>
<p><a href="http://spin.atomicobject.com/2012/05/10/raspberry-pi-prototyping-potential/" class="more-link">Read more on Raspberry Pi: Prototyping Potential <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Recently, the <a href="http://www.raspberrypi.org/">Raspberry Pi Foundation</a> started shipping its Raspberry Pi boards. (And I got one!) They&#8217;re tiny, low-power computers, originally designed so that schoolkids could afford a personal Linux computer for learning programming. Despite selling at the same price point as an <a href="http://arduino.cc">Arduino</a> ($25), they have almost as much processing power as a netbook.</p>
<p>Once you have the main board, most of the other peripherals are cheap and readily available. It uses 5v micro-USB for power (from a spare cell phone charger), and <a href="http://en.wikipedia.org/wiki/SD_card">SD cards</a> for storage. They gave it both HDMI and RCA video output, so it could use the old TV in the attic as a display. It has a USB port for keyboards, mice, network adapters, and the like. (The &#8220;B&#8221; Pi, $10 more than the standard &#8220;A&#8221;, includes a second USB port and built-in ethernet.)<br />
<span id="more-86127"></span><br />
While it&#8217;s easy to gush about the technical stats, and it certainly has a lot of power for the price, that&#8217;s not why the Raspberry Pi excites me. There are many cool projects that never happened because the hardware to prototype them was too expensive to bother. $25 is reasonable for a spontaneous experiment, though, and that&#8217;s where much innovation happens.</p>
<p>An RP and a USB wireless adapter could easily run a jukebox or a monitoring device like a <a href="http://www.kickstarter.com/projects/supermechanical/twine-listen-to-your-world-talk-to-the-internet">Twine</a>; an RP and a spare monitor could be an information radiator for <a href="http://spin.atomicobject.com/2011/04/20/don-t-forget-the-real-time-web-analytics/">live web traffic</a> or continuous integration, or a home arcade.</p>
<p>Like the Arduino, its <a href="http://en.wikipedia.org/wiki/GPIO">GPIO</a> pins can connect it to all kinds of electronic sensors, but it&#8217;s also powerful enough to host several web services that display their input. It could be the foundation for many home automation devices, and accessible over the internet. Also, it can be programmed in scripting languages like Python (after which it is named), Ruby, or Lua, making it very accessible for exploratory hacking.</p>
<p>The RPF is still catching up to heavy demand, but I&#8217;m eager to see what other projects come from such a versatile prototyping platform.</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/10/raspberry-pi-prototyping-potential/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clueless Leadership</title>
		<link>http://spin.atomicobject.com/2012/05/04/clueless-leadership-2/</link>
		<comments>http://spin.atomicobject.com/2012/05/04/clueless-leadership-2/#comments</comments>
		<pubDate>Fri, 04 May 2012 18:28:11 +0000</pubDate>
		<dc:creator>Mary O'Neill</dc:creator>
				<category><![CDATA[Company]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Reviews]]></category>
		<category><![CDATA[challenge]]></category>
		<category><![CDATA[culture]]></category>
		<category><![CDATA[leadership]]></category>
		<category><![CDATA[sustainable]]></category>
		<category><![CDATA[transparency]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86080</guid>
		<description><![CDATA[<p><img src="/wp-content/uploads/6887799145_23c54fa6be_b-590x392.jpg" alt="" title="6887799145_23c54fa6be_b" width="590" height="392" class="alignleft size-medium wp-image-86091" style="margin-bottom: 15px;" /></p>
<p><a href="http://greatnotbig.com/about/">Carl</a> has written about <a href="http://greatnotbig.com/2011/06/some-downsides-of-a-transparent-company/">the good, the bad and the ugly of transparency</a>, but he has always stood by his conviction that <a href="http://greatnotbig.com/2011/05/openness-is-about-more-than-just-a-cool-workspace/ ">a culture of openness</a> is essential to sustainable business success. </p>
<p><a href="http://spin.atomicobject.com/2012/05/04/clueless-leadership-2/" class="more-link">Read more on Clueless Leadership <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/6887799145_23c54fa6be_b-590x392.jpg" alt="" title="6887799145_23c54fa6be_b" width="590" height="392" class="alignleft size-medium wp-image-86091" style="margin-bottom: 15px;" /></p>
<p><a href="http://greatnotbig.com/about/">Carl</a> has written about <a href="http://greatnotbig.com/2011/06/some-downsides-of-a-transparent-company/">the good, the bad and the ugly of transparency</a>, but he has always stood by his conviction that <a href="http://greatnotbig.com/2011/05/openness-is-about-more-than-just-a-cool-workspace/ ">a culture of openness</a> is essential to sustainable business success. </p>
<blockquote><p>I believe in transparency as a philosophical basis from which to run a company. The resulting trust, loyalty, buy-in and contributions of your employees more than make up for the downsides. But there are indeed some downsides.</p></blockquote>
<p>I regularly read Mark Henson’s <a href="http://www.sparknewthinking.com/">newsletter</a>. Some of his articles resonate more than others, but I&#8217;ve come to appreciate the clarity and truth shared in all of his writing, regardless of topic. Mark’s recent post lays out a perhaps counter-intuitive, yet spot-on perspective on the challenges of leadership and growth. He argues for transparency:<br />
<span id="more-86080"></span></p>
<blockquote><p><strong>Leadership IS clueless</strong></p>
<p>You see, we mistakenly think leadership means having all the answers. In fact, leadership actually means having NONE of the answers. It doesn&#8217;t mean they can&#8217;t figure out the answers, but leadership, by definition, involves actually leading people somewhere they&#8217;ve never been before.</p>
<p>People don&#8217;t need to be led somewhere they&#8217;ve already been. They need leaders to take them somewhere new &#8212; to battle a new enemy, to accomplish a new goal, to explore new territory. And there is typically no map for new territory. And if there is a map, it&#8217;s out of date the moment it is printed.</p>
<p>Being clueless is not a bad thing. Trying new approaches is not a bad thing. Exploring new territory is not a bad thing. Unless you don&#8217;t have the support of the people who work for you. Then it&#8217;s a horrible, horrible thing for everybody.</p></blockquote>
<p>Read the whole post: <a href="http://www.sparknewthinking.com/2012/04/yes-your-companys-leadership-is.html">Yes, Your Company&#8217;s Leadership Is Clueless</a>. </p>
<p>So, just as we all want awareness, support and encouragement from our leaders, they need the same from us in equal share. Successful leaders are confident enough to chart the unknowns of new territory and humble enough to admit they may be clueless at times. </p>
<p>A company culture that fosters openness and transparency will grow leaders and teams with all the confidence they need to succeed together.</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/04/clueless-leadership-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Bias in Computer Systems, and beyond</title>
		<link>http://spin.atomicobject.com/2012/05/04/bias-in-computer-systems-and-beyond/</link>
		<comments>http://spin.atomicobject.com/2012/05/04/bias-in-computer-systems-and-beyond/#comments</comments>
		<pubDate>Fri, 04 May 2012 12:44:04 +0000</pubDate>
		<dc:creator>Jason Porritt</dc:creator>
				<category><![CDATA[Design & Development]]></category>
		<category><![CDATA[User Experience]]></category>
		<category><![CDATA[bias]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[user experience]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86047</guid>
		<description><![CDATA[<p>I enjoy reading a good academic paper every now and then. Recently, I was prompted by an email from a former Atomic Object coworker, <a href="http://notethesmile.org/">Mike Karlesky</a>, to read through &#8220;Bias in Computer Systems&#8221; by Friedman &#38; Nissenbaum. I recommend reading it for yourself (<a href="http://vsdesign.org/publications/pdf/64_friedman.pdf"><span class="caps">PDF</span> available here</a>).</p>
<p><a href="http://spin.atomicobject.com/2012/05/04/bias-in-computer-systems-and-beyond/" class="more-link">Read more on Bias in Computer Systems, and beyond <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>I enjoy reading a good academic paper every now and then. Recently, I was prompted by an email from a former Atomic Object coworker, <a href="http://notethesmile.org/">Mike Karlesky</a>, to read through &#8220;Bias in Computer Systems&#8221; by Friedman &amp; Nissenbaum. I recommend reading it for yourself (<a href="http://vsdesign.org/publications/pdf/64_friedman.pdf"><span class="caps">PDF</span> available here</a>).</p>
<p>Bias isn&#8217;t always negative, but the focus of the research presented in this paper is bias of the decidedly unfair variety:</p>
<blockquote cite="http://vsdesign.org/publications/pdf/64_friedman.pdf">
<p>&#8230; we use the term bias to refer to computer systems that systematically and unfairly discriminate against certain individuals or groups of individuals in favor of others. A system discriminates unfairly if it denies an opportunity or a good or if it assigns an undesirable outcome to an individual or group of individuals on grounds that are unreasonable or inappropriate.</p>
</blockquote>
<p>They outline three classifications for unfair bias in computer systems: Preexisting Bias, Technical Bias, and Emergent Bias.</p>
<p><span id="more-86047"></span></p>
<h2>Types of bias</h2>
<h3>Preexisting Bias</h3>
<p>Bias that gets built into a software system because the organization determining the requirements for the software is biased. The software reflects their own bias.</p>
<h3>Technical Bias</h3>
<p>Technical bias emerges as a consequence of technical constraints or decisions. Limited space on a display, input devices, and specific algorithms can bias a system in one way or another.</p>
<h3>Emergent Bias</h3>
<p>Use of a software system changes over time. Through the addition of new users, new types or sources of data, or a myriad of other possibilities, bias can emerge in ways that would have been difficult, if not impossible, to predict when the system was built.</p>
<h2>Bias spotting</h2>
<p>Since reading their work I&#8217;ve been much more aware of bias in computer systems, and pretty much everywhere else. In this case, being aware of the problem is the first step to preventing bias in the systems you build.</p>
<p>The following two are non-software examples I spotted in the physical world. I&#8217;m not sure physical-world biases always fit in the classification system outlined in the paper, but they&#8217;re interesting to consider.</p>
<h3>Apple&#8217;s release of <span class="caps">WWDC</span> tickets for 2012</h3>
<p>Apple opened their ticket purchasing for <span class="caps">WWDC</span> at a time when people on the West Coast were less likely to be awake and able to purchase tickets. They sold out very quickly, leaving many West Coast residents crying foul because of the unfair bias against them.</p>
<h3>Getting teeth cleaned at the dentist</h3>
<p>I noticed that the rooms used for dental cleanings are set up for right-handed people. The room can&#8217;t be easily rearranged and I imagine a left-handed dental hygienist would be at a notable disadvantage.</p>
<p>What examples of bias have you noticed recently, in software or elsewhere?</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/04/bias-in-computer-systems-and-beyond/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Measuring CPU Utilization</title>
		<link>http://spin.atomicobject.com/2012/05/02/measuring-cpu-utilization/</link>
		<comments>http://spin.atomicobject.com/2012/05/02/measuring-cpu-utilization/#comments</comments>
		<pubDate>Wed, 02 May 2012 12:59:45 +0000</pubDate>
		<dc:creator>Nick Christensen</dc:creator>
				<category><![CDATA[Embedded Software]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[embedded]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=85937</guid>
		<description><![CDATA[<p><strong id="internal-source-marker_0.7657869942486286"><br />
</strong>Understanding processor load in an embedded system is important, yet often overlooked. It’s a step toward analyzing your processor’s ability to meet system deadlines. I have provided a <a href="https://github.com/chrishonson/Arduino_CPU_Usage">sample arduino sketch</a> to show how you can add real-time CPU utilization measurements to your embedded project.</p>
<p><a href="http://spin.atomicobject.com/2012/05/02/measuring-cpu-utilization/" class="more-link">Read more on Measuring CPU Utilization <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p><strong id="internal-source-marker_0.7657869942486286"><br />
</strong>Understanding processor load in an embedded system is important, yet often overlooked. It’s a step toward analyzing your processor’s ability to meet system deadlines. I have provided a <a href="https://github.com/chrishonson/Arduino_CPU_Usage">sample arduino sketch</a> to show how you can add real-time CPU utilization measurements to your embedded project.</p>
<p><span id="more-85937"></span>CPU utilization is simply the ratio of time a processor spends doing real work over a given period of time. The time of measurement can be arbitrary. Ideally, it&#8217;s better to align your measurement time with the shortest deadline time in your project; it depends on the goals of the CPU utilization measurement. If you have to service a communication bus 10ms after receiving an input, and it takes 9ms to perform the necessary processing, then you may want to measure utilization over 10ms so that you can capture this 90% worst case, critical path. For the purpose of simplicity and illustration I will measure over 1s.</p>
<p>The first thing we are going to need is a reliable timing source. I recommend setting up a timer interrupt. I could explain how to, but luckily someone else already has <a href="http://www.engblaze.com/microcontroller-tutorial-avr-and-arduino-timer-interrupts/">here</a>. In my example I chose to use timer 2 since timer 1 is used by the servo library and I might actually use that in the future.</p>
<p>The next step in setting up your project is defining what 0% utilization is. The most basic way of doing this is by incrementing a counter in your idle task (in this case loop()) and seeing how many idle counts occur during a measurement period. If no work is being done (besides the timer interrupt) then this represents the maximum number of idle counts and 0% utilization. One might argue that the act of calculating idle counts is work and that 0% utilization is not achievable with the instrumentation code in place. That’s true, but I think such concerns are negligible when the CPU utilization measurement period is sufficiently large.</p>
<p>Anyway, it’s important to note, here, that once you determine the maximum idle counts, no code can be added to the idle task. This would change the maximum idle counts. In general, I think the idle task should do essentially nothing. Where then can you get useful work done?</p>
<p>My example provides a very simple, round robin, periodic task scheduler. Here you can perform calculations as fast or as slow as required. It’s also noteworthy that I used the ISR only to notify tasks that they are ready to run. It’s good practice to keep ISR’s as fast as possible and to keep application code out in order to prevent <a href="http://www.cs.washington.edu/education/courses/cse466/02au/Lectures/Interrupts-II.pdf">problems with shared data</a>.</p>
<p>To test my example I simply add a delay(50) to my 100ms task. This will run 10 times in one second. 10*50ms=500ms I should calculate 50% utilization and if I run the example I see that it does.</p>
<p>Feel free to use my template as you wish. I recommend moving any activity out of loop() and putting it into one of the task functions.</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/02/measuring-cpu-utilization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Conject &#8211; Modern Dependency Injection in Ruby</title>
		<link>http://spin.atomicobject.com/2012/05/01/conject-modern-dependency-injection-in-ruby/</link>
		<comments>http://spin.atomicobject.com/2012/05/01/conject-modern-dependency-injection-in-ruby/#comments</comments>
		<pubDate>Tue, 01 May 2012 16:57:06 +0000</pubDate>
		<dc:creator>David Crosby</dc:creator>
				<category><![CDATA[Design & Development]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=86016</guid>
		<description><![CDATA[<p>Dependency Injection is relevant in Ruby.  I say this because solving problems with highly decomposed systems of collaborating, narrow-purpose objects is still the best way I know, if I want to drive my code with tests and be able to change it later.  DI tools help enable this type of design by carrying the burden of object instantiation and locking it outside our actual domain code.  </p>
<p><a href="http://spin.atomicobject.com/2012/05/01/conject-modern-dependency-injection-in-ruby/" class="more-link">Read more on Conject &#8211; Modern Dependency Injection in Ruby <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Dependency Injection is relevant in Ruby.  I say this because solving problems with highly decomposed systems of collaborating, narrow-purpose objects is still the best way I know, if I want to drive my code with tests and be able to change it later.  DI tools help enable this type of design by carrying the burden of object instantiation and locking it outside our actual domain code.  </p>
<p>(There&#8217;s a strange history of opinions revolving around DI in Ruby, and they&#8217;re worth discussing&#8230; sometime soon.)</p>
<p>I&#8217;ve been having a hard time finding a good DI tool for Ruby.  I&#8217;m ready to move forward from <a href="https://github.com/atomicobject/diy"><span class="caps">DIY</span></a> and enjoy some of the great conveniences that tools like Guice provide, such as automatic instantiation of object trees based on constructor and type info.  So I wrote <a href="https://github.com/dcrosby42/conject">Conject</a>, and though it&#8217;s still young, it&#8217;s working and showing promise.</p>
<ul>
<li><code>gem install conject</code></li>
</ul>
<p><span id="more-86016"></span></p>
<h2>ObjectContext</h2>
<p>Conject&#8217;s power hinges on the usage of ObjectContexts: essentially, a home for objects keyed by name, which are accessed via <code>#put</code>, <code>#get</code> and convenient hash-like indexing via <code>#[]</code>.  An ObjectContext may have another ObjectContext as a parent; a parent context will be consulted as a fall back if a requested object is not available in the child.  </p>
<p>The interesting part is: when an object is not available in an ObjectContext (nor any of its ancestors), a new instance of the requested object will be created, cached and returned.  Any dependencies the object declares will be fulfilled at creation time (before #initialize is called) by recursively searching for the required objects within the ObjectContext itself, or in ancestor contexts as needed.</p>
<h2>Declare dependencies with .construct_with</h2>
<p>Classes may declare their need for collaborators by enumerating them by name, using <code>.construct_with</code>.</p>
<p>	<div id="gist-2568642" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Car</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="n">construct_with</span> <span class="ss">:chassis</span><span class="p">,</span> <span class="ss">:engine</span><span class="p">,</span> <span class="ss">:highway</span></div><div class='line' id='LC3'><span class="k">end</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'><span class="n">car</span> <span class="o">=</span> <span class="no">Conject</span><span class="o">.</span><span class="n">default_object_context</span><span class="o">[</span><span class="ss">:car</span><span class="o">]</span></div><div class='line' id='LC6'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2568642/1ced599288ac24d65719ea23c519b34b803cc46c/car_sample.rb" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2568642#file_car_sample.rb" style="float:right;margin-right:10px;color:#666">car_sample.rb</a>
            <a href="https://gist.github.com/2568642">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<p>In this example, the default object context will create a new instance of Car, store it with the key :car.   A :chassis and :engine will also be created and stored as needed.  (Note: objects are cached by default within an ObjectContext; they are &#8220;singletons&#8221; within their context and repeated reference to a named object via #get, #[], or from .construct_with will return the same instance.)</p>
<p><code>.construct_with</code> does three things of importance:</p>
<ul>
<li>It formally declares that any instance of the decorated class must be built with a certain set of named objects</li>
<li>It provides a pre-constructor that will accept the required components (in the form of a HashMap)</li>
<li>It defines private reader methods for each component.  In the above example, #chassis and #engine now exist as private methods within the Car class.</li>
</ul>
<p>If you&#8217;re referring to classes who are namespaced beneath a module, eg, <code>Graphics::ChartComponent</code>, your dependency declaration should assume the name for such an object would be <code>&quot;graphics/chart_component&quot;</code>, and the internal reader method would be <code>#chart_component</code>.  (<code>.construct_with</code> will treat strings and symbols equally.)  The next release of Conject should support classes that are themselves in a module refering to companion classes within that same module without having to include the object name prefix and slash characters.</p>
<h2>Configuring objects</h2>
<p>For many cases, using <code>.construct_with</code> (and retrieving top-level objects from the ObjectContext) will be all you need to do to get your objects talking.</p>
<p>For others, you may occasionally need to do special configuration.  The options for configuration are still under development, but so far you can:</p>
<p>	<div id="gist-2568642" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="c1"># Disable caching for specific objects:</span></div><div class='line' id='LC2'><span class="n">my_context</span><span class="o">.</span><span class="n">configure_object</span> <span class="n">engine</span><span class="p">:</span> <span class="p">{</span><span class="n">cache</span><span class="p">:</span> <span class="kp">false</span><span class="p">}</span></div><div class='line' id='LC3'><br/></div><div class='line' id='LC4'><span class="c1"># Custom object construction via proc or lambda:</span></div><div class='line' id='LC5'><span class="n">my_context</span><span class="o">.</span><span class="n">configure_object</span> <span class="n">chassis</span><span class="p">:</span> <span class="p">{</span><span class="n">construct</span><span class="p">:</span> <span class="nb">lambda</span> <span class="k">do</span> <span class="s2">&quot;The Chassis&quot;</span> <span class="k">end</span><span class="p">}</span></div><div class='line' id='LC6'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2568642/51d2323d5aed5c3bbeb2375f13e1866adb54fc73/config_sample.rb" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2568642#file_config_sample.rb" style="float:right;margin-right:10px;color:#666">config_sample.rb</a>
            <a href="https://gist.github.com/2568642">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<h2>Subcontexts</h2>
<p>Some designs call for the creation of microcosms of objects, which desire to refer to instances by name, and have those references be shared amongst multiple collaborators in the same context, even though many copies of this microcosm may coexist in the system.  An example of this would be a Model-View-Presenter triad for an on-screen widget:</p>
<p>	<div id="gist-2568642" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">ChartPresenter</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="n">construct_with</span> <span class="ss">:chart_model</span><span class="p">,</span> <span class="ss">:chart_view</span></div><div class='line' id='LC3'><span class="k">end</span></div><div class='line' id='LC4'><br/></div><div class='line' id='LC5'><span class="n">main_context</span><span class="o">.</span><span class="n">in_subcontext</span> <span class="k">do</span> <span class="o">|</span><span class="nb">sub</span><span class="o">|</span></div><div class='line' id='LC6'>&nbsp;&nbsp;<span class="nb">sub</span><span class="o">[</span><span class="ss">:chart_model</span><span class="o">]</span></div><div class='line' id='LC7'><span class="k">end</span> </div><div class='line' id='LC8'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2568642/114ab8f0867449fa272439718589707abf608c17/subcontext_sample.rb" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2568642#file_subcontext_sample.rb" style="float:right;margin-right:10px;color:#666">subcontext_sample.rb</a>
            <a href="https://gist.github.com/2568642">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<p>Subcontexts have implicit access to ancestral objects.  If an object constructued within a subcontext refers to an object that already exists in an ancestor, the existing object will be provided.  For example, if you&#8217;re building <code>Cars</code> in a subcontext, you could provide a <code>Highway</code> in the supercontext that all <code>Cars</code> would share a reference to.</p>
<h2>Using your context directly</h2>
<p>When an object needs explicit access to its owning ObjectContext, it can be constructed with <code>this_object_context</code>.  One obvious use for this is writing code that needs to generate subcontexts in reaction to some command or event.</p>
<p>	<div id="gist-2568642" class="gist">

        <div class="gist-file">
          <div class="gist-data gist-syntax">
              <div class="highlight"><pre><div class='line' id='LC1'><span class="k">class</span> <span class="nc">Galaxy</span></div><div class='line' id='LC2'>&nbsp;&nbsp;<span class="n">construct_with</span> <span class="ss">:this_object_context</span></div><div class='line' id='LC3'>&nbsp;&nbsp;<span class="k">def</span> <span class="nf">spawn_new_solar_system</span></div><div class='line' id='LC4'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">this_object_context</span><span class="o">.</span><span class="n">in_subcontext</span> <span class="k">do</span> <span class="o">|</span><span class="n">subcontext</span><span class="o">|</span></div><div class='line' id='LC5'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="n">subcontext</span><span class="o">[</span><span class="ss">:sun</span><span class="o">].</span><span class="n">genesis</span></div><div class='line' id='LC6'>&nbsp;&nbsp;&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC7'>&nbsp;&nbsp;<span class="k">end</span></div><div class='line' id='LC8'><span class="k">end</span></div><div class='line' id='LC9'><br/></div></pre></div>
          </div>

          <div class="gist-meta">
            <a href="https://gist.github.com/raw/2568642/2bfbee8313be98be4c00579c824c74708911f78f/this_object_context_sample.rb" style="float:right;">view raw</a>
            <a href="https://gist.github.com/2568642#file_this_object_context_sample.rb" style="float:right;margin-right:10px;color:#666">this_object_context_sample.rb</a>
            <a href="https://gist.github.com/2568642">This Gist</a> brought to you by <a href="http://github.com">GitHub</a>.
          </div>
        </div>
</div>
</p>
<h2>Notable <span class="caps">TODO</span>s</h2>
<ul>
<li>Implied modules for classes namespaced beneath the same module</li>
<li>Explicit Rails support</li>
<li>Auto-requiring&#8230;?</li>
<li>Make it convenient for objects within a Module namespace to refer to each other without specifying the module name each and every time.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/01/conject-modern-dependency-injection-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Research the extremes of a user community</title>
		<link>http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/</link>
		<comments>http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/#comments</comments>
		<pubDate>Tue, 01 May 2012 16:35:07 +0000</pubDate>
		<dc:creator>Carl Erickson</dc:creator>
				<category><![CDATA[User Experience]]></category>

		<guid isPermaLink="false">http://spin.atomicobject.com/?p=85922</guid>
		<description><![CDATA[<p>Atomic is currently collaborating with <a href="http://ideo.com"><span class="caps">IDEO</span></a> on a consumer-facing web app. The integration of <span class="caps">IDEO</span>&#8217;s user-centered design practices with Atomic&#8217;s software design and build practices is a powerful combination for our client. Working with an old friend and getting to know some more of the smart, talented people at <span class="caps">IDEO</span> have been great. We&#8217;re learning new things and refining our own UX practices.</p>
<p><a href="http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/" class="more-link">Read more on Research the extremes of a user community <span class="meta-nav">&#187;</span></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Atomic is currently collaborating with <a href="http://ideo.com"><span class="caps">IDEO</span></a> on a consumer-facing web app. The integration of <span class="caps">IDEO</span>&#8217;s user-centered design practices with Atomic&#8217;s software design and build practices is a powerful combination for our client. Working with an old friend and getting to know some more of the smart, talented people at <span class="caps">IDEO</span> have been great. We&#8217;re learning new things and refining our own UX practices.</p>
<p>Studying potential users of the app we&#8217;re creating is an important part of the project. The research being done is a clear example of <span class="caps">IDEO</span>&#8217;s &#8220;start with people&#8221;, design thinking process, as described by <a href="http://www.ideo.com/people/tom-kelley">Tom Kelley</a> at a recent <a href="http://www.designwestmichigan.com/">Design West Michigan</a> meeting. At our project kickoff, I had one of those delightful moments of finding my intuition entirely at odds with what was being presented, when our <span class="caps">IDEO</span> colleagues described how they selected research subjects.</p>
<p><span id="more-85922"></span></p>
<p>If you drew a distribution of people&#8217;s behavior (or expertise or passion or knowledge in the domain you&#8217;re studying), you might find it looks like the curve below. It doesn&#8217;t matter whether this distribution is actually Gaussian or not&#8212;I doubt anyone actually knows, and it probably varies by domain. The point I&#8217;m describing doesn&#8217;t depend on the specific distribution.</p>
<p><a href="http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/most-people-are-here/" rel="attachment wp-att-86001"><img src="http://spin.atomicobject.com/wp-content/uploads/most-people-are-here.jpg" alt="" title="most-people-are-here" width="600" height="336" class="aligncenter size-full wp-image-86001" /></a></p>
<p>The question is, where should the people you select for research lie on this distribution?</p>
<p>The answer which seems obvious to me is you would want typical users, or the ones that clump up around the middle of the distribution. After all, for a broad, consumer-facing app these people represent most of your potential users. You may never have budget to build features for the &#8220;outliers&#8221;. Your business success depends on delighting the majority of people. So of course, to understand the problem and design the best app, you should concentrate your research on the middle of the distribution. Makes sense to me.</p>
<p>What the <span class="caps">IDEO</span> researcher surprised me with is the sketch below showing how they look instead to the extremes of the user population:</p>
<p><a href="http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/study-the-experience/" rel="attachment wp-att-86002"><img src="http://spin.atomicobject.com/wp-content/uploads/study-the-experience.jpg" alt="" title="study-the-experience" width="600" height="345" class="aligncenter size-full wp-image-86002" /></a></p>
<p>The point our colleague made is that since research is all about learning, a very fast and efficient way to learn is by studying the extremes. The issues that are relevant to all users are most clearly visible in the extremes of the population. In the great middle the &#8220;signals&#8221; you&#8217;re looking for will be a lot less obvious and buried in more &#8220;noise&#8221;. By closely observing the extremes of the community you learn more quickly what&#8217;s relevant to everybody, and hence to the application you&#8217;re building. Counter-intuitive, but it made a lot of sense once I heard it.</p>
<p>Here&#8217;s how this approach might work for <a href="http://www.atomicobject.com/pages/">Kidtelligent</a>, a web app we built last year. The users of Kidtelligent are parents of 7-10 year olds. The app helps parents, mostly mothers, understand their kid&#8217;s personalities and gives practical advice on how to help them succeed in relationships, school, sports, etc. If the dimension of consideration for researching moms was &#8220;familiarity with behavior profiles and web tools&#8221;, then going to the extremes would mean finding moms who had never heard about such profiles and seldom used computers, on one end of the spectrum, and moms who were clinical psychologists and expert computer users, on the other. </p>
<p>What would we learn from each group? I wish I could say. We didn&#8217;t use this technique on that project. Maybe, from the naive group, we would have learned more quickly the issues moms worry most about for their kids, independent of the behavior assessment. Maybe, from the expert group, we&#8217;d learn the most valuable measures to provide in the report (which did they put the most emphasis on, given their expertise?) In any case, by studying the extremes, we might have learned more quickly. The important issues might have been surfaced more distinctly compared to observing average moms who were typical computer users somewhat familiar with behavior profiles.</p>
]]></content:encoded>
			<wfw:commentRss>http://spin.atomicobject.com/2012/05/01/research-the-extremes-of-a-user-community/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached

Served from: spin.atomicobject.com @ 2012-05-17 03:29:54 -->
