<?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>Brierwood Design</title>
	<atom:link href="http://www.brierwooddesign.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brierwooddesign.com</link>
	<description>The craft of great software</description>
	<lastBuildDate>Fri, 04 Jan 2013 19:44:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Brierwood on CBC Morning</title>
		<link>http://www.brierwooddesign.com/brierwood-on-cbc-morning/</link>
		<comments>http://www.brierwooddesign.com/brierwood-on-cbc-morning/#comments</comments>
		<pubDate>Wed, 05 Sep 2012 12:19:59 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>

		<guid isPermaLink="false">http://www.brierwooddesign.com/?p=926</guid>
		<description><![CDATA[We had a great opportunity to be on the CBC Morning show and talk about worker co-operatives in the hi-tech. It was a very suitable interview for Labour Day. Take a listen and please get in touch if you have any questions or thoughts about worker co-operatives in hi-tech.]]></description>
			<content:encoded><![CDATA[<p>We had a great opportunity to be on the CBC Morning show and <a href="http://www.cbc.ca/player/Radio/Local+Shows/Ontario/Ottawa+Morning/ID/2275464418/" title="Worker Co-ops on CBC Morning" target="_blank">talk about worker co-operatives in the hi-tech</a>.  It was a very suitable interview for Labour Day.</p>
<p>Take a listen and please get in touch if you have any questions or thoughts about worker co-operatives in hi-tech.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/brierwood-on-cbc-morning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brierwood Relaunch</title>
		<link>http://www.brierwooddesign.com/brierwood-relaunch/</link>
		<comments>http://www.brierwooddesign.com/brierwood-relaunch/#comments</comments>
		<pubDate>Thu, 24 May 2012 15:25:45 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.brierwooddesign.com/?p=710</guid>
		<description><![CDATA[We&#8217;re thrilled to present our new logo, company branding, and website. We&#8217;ve been very lucky to share some office space with some of the design team from Jessica Rousseau Design who have helped us develop our new look. It is an exciting time at Brierwood Design. We&#8217;ve settled into our office location in Westboro, and we&#8217;ll be taking the entire [...]]]></description>
			<content:encoded><![CDATA[<p>We&#8217;re thrilled to present our new logo, company branding, and website. We&#8217;ve been very lucky to share some office space with some of the design team from <a title="Jessica Rousseau Design" href="http://jessicarousseaudesign.com/" target="_blank">Jessica Rousseau Design</a> who have helped us develop our new look.</p>
<p>It is an exciting time at Brierwood Design. We&#8217;ve settled into our office location in Westboro, and we&#8217;ll be taking the entire team down to WWDC 2012 in the next few weeks. We have some excellent clients and some great products to be launched in 2012.</p>
<p>We hope you enjoy our new site.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/brierwood-relaunch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Objective-C bit.ly API implementation using SBJson and ASI</title>
		<link>http://www.brierwooddesign.com/an-objective-c-bit-ly-api-implementation-using-sbjson-and-asi/</link>
		<comments>http://www.brierwooddesign.com/an-objective-c-bit-ly-api-implementation-using-sbjson-and-asi/#comments</comments>
		<pubDate>Wed, 14 Sep 2011 02:41:21 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://www.brierwooddesign.com/?p=473</guid>
		<description><![CDATA[I was in a need of a bit.ly integration for URL shortening for a client recently. I found a great one called ILBitly, but it was built on top of AFNetworking and JSONKit. Since I didn&#8217;t want to introduce these additional dependencies into the app, I created an updated version of ILBitly called BRBitly. It has an identical interface to [...]]]></description>
			<content:encoded><![CDATA[<p>I was in a need of a bit.ly integration for URL shortening for a client recently. I found a great one called <a href="https://github.com/InfiniteLoopDK/ILBitly">ILBitly</a>, but it was built on top of AFNetworking and JSONKit. Since I didn&#8217;t want to introduce these additional dependencies into the app, I created an updated version of ILBitly called <a href="https://github.com/brierwood/BRBitly">BRBitly</a>. It has an identical interface to ILBitly but relies on a difference set of 3rd party dependencies (namely SBJson and ASI).</p>
<p>Thanks to Claus for his great work. If you are starting a new project, I would go with ILBitly, but BRBitly is another option.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/an-objective-c-bit-ly-api-implementation-using-sbjson-and-asi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quickstart for Django Piston API on Dotcloud</title>
		<link>http://www.brierwooddesign.com/quickstart-for-django-piston-api-on-dotcloud/</link>
		<comments>http://www.brierwooddesign.com/quickstart-for-django-piston-api-on-dotcloud/#comments</comments>
		<pubDate>Wed, 18 May 2011 18:05:31 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://www.brierwooddesign.com/?p=466</guid>
		<description><![CDATA[I&#8217;ve been checking out several of the new Django hosting services including gondor.io in a previous post and now dotcloud. My overall goal is to evaluate them in the context of building very quick and lightweight mobile web services / APIs. The setup and installation went very well except when I tried to deviate from the recommended directory structure at [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been checking out several of the new Django hosting services including gondor.io in a previous post and now dotcloud.  My overall goal is to evaluate them in the context of building very quick and lightweight mobile web services / APIs.</p>
<p>The setup and installation went very well except when I tried to deviate from the recommended directory structure at which point I had to open a support ticket with my weird error and got an excellent response that was 100% on the money.  I don&#8217;t want to repeat a lot of the basic setup instructions because I think that has been handled adequately by the <a href="http://docs.dotcloud.com/tutorials/django/">dotcloud django documentation</a> and by Ken Cochrane&#8217;s excellent blog post <a href="http://kencochrane.net/blog/2011/04/deploying-my-django-application-to-dotcloud/">Deploying My Django Application to Dotcloud</a>.</p>
<p>The thing that I wanted to give people was a starting repot with the correct layout and setup that worked for me.  Most of the instructions and commands are included in the README for my public bitbucket repot <a href="https://bitbucket.org/rvanmelle/dotcloud_starter">dotcloud_starter</a>.  The project is based around using <a href="https://bitbucket.org/jespern/django-piston/wiki/Home">django-piston</a> and even includes a working sample app with fixtures.</p>
<p>Please note that this project makes several mildly opinionated assumptions to get started quickly:  use sqlite for DB, use south for migrations, use piston for mobile API.  Please feel free to drop me a note or comment if you find this useful.</p>
<p>Overally, I was quite impressed with the dotcloud offering and the flexibility of the services which you can mix and match.  I may extend this starter project in the future with support for push notifications or even redis pub/sub.  We&#8217;ll see &#8212; I also want to use this for some real-world examples.</p>
<p>Good luck.  I&#8217;m also hoping to try out ep.io soon or apphosted.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/quickstart-for-django-piston-api-on-dotcloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quickstart for Django mobile API on gondor.io</title>
		<link>http://www.brierwooddesign.com/quickstart-for-django-mobile-api-on-gondor-io/</link>
		<comments>http://www.brierwooddesign.com/quickstart-for-django-mobile-api-on-gondor-io/#comments</comments>
		<pubDate>Sun, 15 May 2011 15:19:06 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=449</guid>
		<description><![CDATA[I&#8217;ve been meaning to check out several of the new Django hosting services including gondor.io, dotcloud, and ep.io. I haven&#8217;t received invitations to all of them yet, so I&#8217;ll start with gondor since I received that invitation quite a while ago. My overall goal is to evaluate them in the context of building very quick and lightweight mobile web services [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been meaning to check out several of the new Django hosting services including gondor.io, dotcloud, and ep.io.  I haven&#8217;t received invitations to all of them yet, so I&#8217;ll start with gondor since I received that invitation quite a while ago.  My overall goal is to evaluate them in the context of building very quick and lightweight mobile web services / APIs.</p>
<p>Overall, the setup and installation went relatively smoothly, but definitely a few rough edges.  Ken Cochrane has a nice blog post about getting started with an existing blog project <a href="http://kencochrane.net/blog/2011/04/my-day-gondorio/">My Day in Gondor.io</a>.  I used that post extensively.</p>
<p>I started with a brand new project and used familiar tools such as virtualenv and pip.  This was my first new project since Django 1.3 was released so there were some hiccoughs around the new static files module.  The other blog posts and gondor docs cover things pretty well, but what I thought was missing was a simple starting repot with the directory layout and setup that worked for me.  To this end, I created a public repot on bitbucket:  <a href="https://bitbucket.org/rvanmelle/gondor_starter">gondor_starter</a>.</p>
<p>Please note that this project makes several mildly opinionated assumptions to get started quickly:  use sqlite for DB, use south for migrations, use django-tokenapi for mobile authentication.  You can find more documentation on this in the project README.  Please feel free to drop me a note or comment if you find this useful.</p>
<p>Good luck.  I&#8217;m hoping to try out dotcloud next and paired with piston.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/quickstart-for-django-mobile-api-on-gondor-io/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Brierwood @ HackOtt</title>
		<link>http://www.brierwooddesign.com/brierwood-hackott/</link>
		<comments>http://www.brierwooddesign.com/brierwood-hackott/#comments</comments>
		<pubDate>Wed, 11 May 2011 02:33:07 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=442</guid>
		<description><![CDATA[Brierwood sent a little contingent down to participate at HackOtt. It was a great event with lots of energy and tech stars from the local community. Shawn and I formed a team to create an application using the Yellow API (one of the official APIs) and Urban Airship (an unofficial but also very useful API). The Yellow API provides various [...]]]></description>
			<content:encoded><![CDATA[<p>Brierwood sent a little contingent down to participate at <a href="http://hackdays.ca/category/hackott/">HackOtt</a>.  It was a great event with lots of energy and tech stars from the local community.</p>
<p>Shawn and I formed a team to create an application using the Yellow API (one of the official APIs) and Urban Airship (an unofficial but also very useful API).  The Yellow API provides various business searches including a location aware search.  The idea for the app was pretty simple: you want to find a nearby business such as a local coffee shop and would like to get a recommendation from one of your friends who knows both YOU and the local business.</p>
<p>The flow through the app is pretty simple:</p>
<ol>
<li>You enter a search term for a local business such as &#8220;coffee shop&#8221; and view the results from Yellow API on a map</li>
<li>You decide to ask for help from one or more of your friends by selecting them from a list within the app.</li>
<li>Your friend receives an instant notification popup on their phone which indicates you are asking for help to find a coffee shop.</li>
<li>Your friend agrees to help and is immediately viewing the exact same map and local coffee shops that you are seeing on your phone.</li>
<li>Your friend selects one that he would like to recommend and hits &#8220;Send recommendation&#8221;</li>
<li>You receive an instant notification on your phone with the recommendation from your friend.  You can view the business on the map and proceed to get directions etc.</li>
</ol>
<p>It was a real challenge to get this app working over the course of the day which seemed to fly by.  Fortunately, we did get a working prototype and were able to demo it at the end of the day.  The judges seemed to like the app and the idea and awarded us 2nd place.  It was a great result and we were thrilled to get a new Android phone.</p>
<p>Congrats to Jevin and Brad for their awesome 1st place web app &#8220;Reservely&#8221; (which you should definitely check out).</p>
<p>We haven&#8217;t figured out when/whether/how we are going to commercialize this idea, but it is definitely percolating within the virtual corridors of Brierwood.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/brierwood-hackott/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Simple Extension to timeline_fu &#8212; fires_manually</title>
		<link>http://www.brierwooddesign.com/a-simple-extension-to-timeline_fu-fires_manually/</link>
		<comments>http://www.brierwooddesign.com/a-simple-extension-to-timeline_fu-fires_manually/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 13:32:30 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=109</guid>
		<description><![CDATA[Shawn and I have been working on a great Rails project over the last six months called Givv.org. It is the best way to contribute to your favourite charities, non-profits, open-source projects, or even friends and family. You should go check it out and I highly recommend signing up. Unfortunately, it&#8217;s limited to US-based organizations currently, so keep that in [...]]]></description>
			<content:encoded><![CDATA[<p>Shawn and I have been working on a great Rails project over the last six months called <a href="http://givv.org">Givv.org</a>.  It is the best way to contribute to your favourite charities, non-profits, open-source projects, or even friends and family.  You should go check it out and I highly recommend signing up.  Unfortunately, it&#8217;s limited to US-based organizations currently, so keep that in mind when you&#8217;re deciding your monthly budget.</p>
<p>The project is a bit like an iceberg in that a large part of the work is hidden beneath the surface on the admin side.  There are a lot of people and organizations to keep track of, and all sorts of crazy things happen that need to be recorded.</p>
<p>Fortunately, the folks over at <a href="http://giraffesoft.ca/">Giraffe Soft</a> have a really nice plugin for exactly this type of thing called <a href="http://github.com/giraffesoft/timeline_fu/tree/master">timeline_fu</a>.  It makes it very easy to create simple events with associated actors and subjects&#8230; just go and read the documentation.</p>
<p>For example, we often need to contact organizations and get them to claim a profile on the site that one or more users have selected as a recipient.  With timeline_fu, we can declare these events directly in the model file to get triggered when an invitation is created and destroyed.</p>
<pre class="src">fires <span class="constant">:new_invitation</span>, <span class="constant"> <img src='http://www.brierwooddesign.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> n</span> =&gt; <span class="constant">:create</span>, <span class="constant">:actor</span> =&gt; <span class="constant">:sender</span>,
    <span class="constant">:secondary_subject</span> =&gt; <span class="constant">:recipient_profile</span>
fires <span class="constant">:cancel_invitation</span>, <span class="constant"> <img src='http://www.brierwooddesign.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> n</span> =&gt; <span class="constant">:destroy</span>, <span class="constant">:actor</span> =&gt; <span class="constant">:sender</span>,
    <span class="constant">:secondary_subject</span> =&gt; <span class="constant">:recipient_profile</span></pre>
<p>These events can be triggered on new, destroy, and update events.  However, one case that is not handled is when there is an event that does not involve any changes to the model object.  For example, when we resend an invitation to a user, it is just an email going off.  We would like to have something like the following:</p>
<pre class="src">fires_manually <span class="constant">:resend_invitation</span>, <span class="constant">:actor</span> =&gt; <span class="constant">:sender</span>,
    <span class="constant">:secondary_subject</span> =&gt; <span class="constant">:recipient_profile</span></pre>
<p>We would like to keep the same declaration syntax and everything&#8230; nice and DRY.  In order to use it, we could call it from the controller as shown below:</p>
<pre class="src"><span class="type">AdminMailer</span>.deliver_recipient_reminder(<span class="variable-name">@invitation</span>)
<span class="variable-name">@invitation</span>.fire_resend_invitation</pre>
<p>Of course, this is easily accomplished with some typical Rails monkey patching.  I hate it just as much as you do, but at least I&#8217;m patching a plugin and not, for example, modifying the behaviour of Rails or the Ruby core libraries.</p>
<p>I created a new file called <code>timeline_fu_additions.rb</code> and put it in our <code>lib</code> directory.  In <code>config/initializers</code> I placed a file to load our extension:</p>
<pre class="src">require <span class="string">'timeline_fu_additions'</span> 

<span class="type">ActiveRecord</span>::<span class="type">Base</span>.send <span class="constant">:include</span>, <span class="type">TimelineFu</span>::<span class="type">Fires</span></pre>
<p>The source for the <code>timeline_fu_additions</code> is shown below.  It is a clone of the standard &#8220;fires&#8221; class method, with a couple minor modifications.</p>
<pre class="src"><span class="keyword">module</span> <span class="type">TimelineFu</span>
  <span class="keyword">module</span> <span class="type">Fires</span>
    <span class="keyword">def</span> <span class="function-name">self.included</span>(klass)
      klass.send(<span class="constant">:extend</span>, <span class="type">ClassMethods</span>)
    <span class="keyword">end</span> 

    <span class="keyword">module</span> <span class="type">ClassMethods</span>
      <span class="keyword">def</span> <span class="function-name">fires_manually</span>(event_type, opts)
        opts[<span class="constant">:subject</span>] = <span class="constant">:self</span> <span class="keyword">unless</span> opts.has_key?(<span class="constant">:subject</span>)

        method_name = :<span class="string">"fire_</span><span class="variable-name">#{event_type}</span><span class="string">"</span>
        define_method(method_name) <span class="keyword">do</span>
          create_options = [<span class="constant">:actor</span>, <span class="constant">:subject</span>, <span class="constant">:secondary_subject</span>].inject({}) <span class="keyword">do</span> |memo, sym|
            <span class="keyword">case</span> opts[sym]
            <span class="keyword">when</span> <span class="constant">:self</span>
              memo[sym] = <span class="variable-name">self</span>
            <span class="keyword">else</span>
              memo[sym] = send(opts[sym]) <span class="keyword">if</span> opts[sym]
            <span class="keyword">end</span>
            memo
          <span class="keyword">end</span>
          create_options[<span class="constant">:event_type</span>] = event_type.to_s

          <span class="type">TimelineEvent</span>.create!(create_options)
        <span class="keyword">end</span>
      <span class="keyword">end</span>
    <span class="keyword">end</span>
  <span class="keyword">end</span>
<span class="keyword">end</span></pre>
<p>That&#8217;s it.  It seems to work great.  We&#8217;re in the process of rolling it out on our admin interface, so if there are any bugs, I probably haven&#8217;t found them yet.  I might be motivated to throw this up on github if there is any interest from the peanut gallery.</p>
<p><!-- empty for now --></p>
<p class="entry-info">&nbsp;</p>
<div class="entry">
<h3 class="entry-title"><a href="/2009/6/4/no-really-why-a-coop">No Really, Why a Coop?</a></h3>
<p class="tag-info">Tags:<br />
<a href="/category/software development">software development</a>, <a href="/category/business">business</a>, <a href="/category/cooperatives">cooperatives</a></p>
<p class="entry-info"><span class="updated">04 Jun ’09</span><br />
from<br />
<span class="author">Alan Falloon</span><br />
<span><br />
<a class="comments_link" href="/2009/6/4/no-really-why-a-coop#disqus_thread">Comments</a><br />
</span></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/a-simple-extension-to-timeline_fu-fires_manually/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No Really, Why a Coop?</title>
		<link>http://www.brierwooddesign.com/no-really-why-a-coop/</link>
		<comments>http://www.brierwooddesign.com/no-really-why-a-coop/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 13:34:39 +0000</pubDate>
		<dc:creator>alan</dc:creator>
				<category><![CDATA[Al Falloon]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[cooperatives]]></category>
		<category><![CDATA[software development]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=112</guid>
		<description><![CDATA[&#34;So, what are you up to nowadays?&#34; Its the professional equivalent of talking about the weather, but since starting our worker cooperative, it triggers a lot more than the usual light banter. This is how it usually goes: &#34;So, what are you working on these days?&#34; &#34;Shawn, Reid, and I started a co-op.&#34; &#34;A co-op? Like MEC?&#34; &#34;Well its a [...]]]></description>
			<content:encoded><![CDATA[<p>&quot;So, what are you up to nowadays?&quot;</p>
<p>Its the professional equivalent of talking about the weather, but<br />
since <a href="http://brierwooddesign.com/2009/3/12/becoming-a-worker-cooperative">starting our worker cooperative</a>, it triggers a lot more than the<br />
usual light banter. This is how it usually goes:</p>
<p>&quot;So, what are you working on these days?&quot;</p>
<p>&quot;Shawn, Reid, and I started a co-op.&quot;</p>
<p>&quot;A co-op? Like <a href="http://www.mec.ca">MEC</a>?&quot;</p>
<p>&quot;Well its a workers co-op, so instead of customers being the<br />
shareholders, the employees are. Every employee is an equal owner.&quot; I<br />
say.</p>
<p>&quot;So if you hire someone, they become an equal owner?&quot;</p>
<p>&quot;Well, there is a probation period, but yes, they become an equal<br />
owner.&quot;</p>
<p>&quot;But..&quot;, they hesitate, &quot;how does that work?&quot;</p>
<p>&quot;How does that work?&quot;, is code for:</p>
<ul>
<li>&quot;How do you maintain control of your company?&quot;</li>
<li>&quot;How will you ever make decisions without a head honcho?&quot;</li>
<li>&quot;How will you become rich?&quot;</li>
<li>&quot;You are crazy!&quot;</li>
</ul>
<p>These questions are borne from an assumption that the founders of tech<br />
start-ups start with some sort of great idea, then hire some people to<br />
help them turn this winning idea into cash. In that picture, the idea<br />
is the real value, and the obvious difference between the employees<br />
and the owners, is that the owners had the idea.</p>
<p>But, the truth is that <a href="http://www.paulgraham.com/ideas.html">ideas are a dime a dozen</a>, and the original idea<br />
is always wrong in some critical way that is only obvious in<br />
hindsight. No tech start-up succeeds following the original plan.</p>
<p>The real value is in vision and execution. In other words, the value is in the<br />
team. And a successful team is made from excellent individuals with a<br />
clear shared vision.</p>
<p>Every company says that &quot;our employees are our strength&quot; or some<br />
equivalent platitude, and it&#8217;s really true whether they believe it or<br />
not.</p>
<p>So the answer to the questions about control and decision making is<br />
not that it doesn&#8217;t apply to co-ops, but that corporations have the<br />
exact same issues, except they don&#8217;t see them. As the major<br />
shareholder of a company, I can force it to take whatever actions I<br />
want. But, if I don&#8217;t have buy-in from the team, all those initiatives<br />
will fail and take the vitality of the company with it.<br />
So, sure, I can force the company down some path, but then<br />
I destroy the company. What kind of a choice is that? Who is really in<br />
control?</p>
<p>Control of a tech company boils down to shared<br />
vision. That&#8217;s true whether its a co-op or a large corporation with a<br />
majority shareholder. However, in a co-op, the issue is in plain sight<br />
where it has to be dealt with.</p>
<p>So, as the founders of a co-op, how do we control our company?<br />
<a href="http://www.fastcompany.com/magazine/28/ge.html">We don&#8217;t</a>. But that was never an<br />
option. All we can do is collaborate to build a vision, and execute on<br />
that.</p>
<p>But vision is only half the equation, you still need excellent<br />
individuals, and that&#8217;s where a worker co-op has a clear advantage. We<br />
offer real ownership, all they can offer is a salary and a 5-year<br />
pin.</p>
<p>Even compared to starting your own company, co-ops look pretty good:</p>
<ul>
<li><a href="http://www.paulgraham.com/prcmc.html">pooled risk</a>.</li>
<li>co-owners to ride out the ups and downs.</li>
<li>spend much less time on the <a href="http://www.joelonsoftware.com/articles/DevelopmentAbstraction.html">petty details of day-to-day operation</a>.</li>
<li>working in a <a href="http://www.cracked.com/article_14990_what-monkeysphere.html">small team</a> of people who care as much as you do.</li>
</ul>
<p>And when your done, you can cash-out and <a href="http://thedailywtf.com/Articles/Up-or-Out-Solving-the-IT-Turnover-Crisis.aspx">graduate</a> on to something else.</p>
<p>We can attract the people who are considering leaving their lucrative<br />
big-company job to start their own company, or the people who have<br />
already made the leap, but are tired of doing it on their own. These<br />
people represent the cream-of-the-crop in this field. With people like<br />
that on board, we can&#8217;t help but succeed.</p>
<p>Which brings us finally to money. The major objection to becoming a<br />
co-op is you lose your opportunity to really cash-in if you are<br />
successful. The key is: &quot;if&quot;. Would you rather $1000 for sure, or a<br />
1/10 shot at $2000?</p>
<p>If you get a team of talented individuals with vision, there will be<br />
money enough to go around. If you try to do it with whatever team you can<br />
scrape together cheap, you can keep most of it yourself, but it<br />
will take a lot of luck to make anything at all.</p>
<p>As Shawn pointed out in a previous post, <a href="http://brierwooddesign.com/2009/5/29/the-new-socialism">the barrier to entry is low, and the value is in the labour</a>.</p>
<blockquote>
<p class="quoted">In other words, the talented<br />
people <a href="http://www.paulgraham.com/hiring.html">don&#8217;t need your job any more</a>, and they aren&#8217;t going to settle<br />
for a small slice of the pie.</p>
</blockquote>
<p>The landscape of tech companies is changing. I think that we are ahead<br />
of the curve, it won&#8217;t be long before the advantages of co-ops become<br />
widely understood. Soon, when you tell people you started a co-op,<br />
they will say, &quot;like Brierwood?&quot;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/no-really-why-a-coop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The New Socialism?</title>
		<link>http://www.brierwooddesign.com/the-new-socialism/</link>
		<comments>http://www.brierwooddesign.com/the-new-socialism/#comments</comments>
		<pubDate>Fri, 29 May 2009 13:36:50 +0000</pubDate>
		<dc:creator>shawn</dc:creator>
				<category><![CDATA[Shawn Hyam]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[cooperatives]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=115</guid>
		<description><![CDATA[A few days ago, I read The New Socialism: Global Collectivist Society Is Coming Online by Kevin Kelly. I found the article very relevant to me, because we are essentially living it. The article is actually about the shift to a peer-production society, where business is carried out by free exchange between individuals, small or impromptu groups, etc., like what [...]]]></description>
			<content:encoded><![CDATA[<p>A few days ago, I read <a href="http://www.wired.com/culture/culturereviews/magazine/17-06/nep_newsocialism?currentPage=all">The New Socialism: Global Collectivist Society Is Coming Online</a> by Kevin Kelly.  I found the article very relevant to me, because we are essentially <a href="http://brierwooddesign.com/2009/3/12/becoming-a-worker-cooperative">living it</a>.  The article is actually about the shift to a <strong>peer-production society</strong>, where business is carried out by free exchange between individuals, small or impromptu groups, etc., like what you see with sites like <a href="http://wikipedia.org">Wikipedia</a>.</p>
<p>By far the most controversial part of the article is calling this <strong>New Socialism</strong>.  It seems to me that the word socialism is a pejorative, especially in the United States, where most of the discussion about socialism seems to be carried out by people who don&#8217;t know what it is.  Even the article&#8217;s description of &#8220;Old Socialism&#8221; seems quite strange to me, not really resembling the socialism <a href="http://en.wikipedia.org/wiki/Saskatchewan_New_Democratic_Party">I grew up under</a>.  But I suppose that the term is broad and vague, and socialism itself has taken on many forms around the world.</p>
<p>What the author is basically talking about, however, is the marriage of the <a href="http://en.wikipedia.org/wiki/Cooperative">cooperative movement</a>, and more specifically the worker coop movement, with the enabling technologies of the internet.  Oddly, this is called <strong>collectivism</strong> in the article and the term cooperation is relegated to <strong>collaboration</strong>, the level below.  This movement has a fairly long history, including Leland Stanford if you believe <a href="http://dynamics.org/~altenber/PAPERS/BCLSFV/">this article</a> (there&#8217;s nothing at all about it on <a href="http://en.wikipedia.org/wiki/Leland_Stanford">wikipedia</a>, so I&#8217;m in need of clarification here), and most notably the <a href="http://en.wikipedia.org/wiki/Mondrag�n_Cooperative_Corporation">Mondragon</a> corporation in Spain.  I really believe that the advanced communication technologies we have now make this vision of peer-production more realistic and practical than it ever was in the past.  Simple, peer-to-peer tools to aid in <a href="http://thedecider.brierwooddesign.com">consensus-making</a> and the sharing and distribution of information means that a workplace that is much more radically democratic and autonomous is now possible.</p>
<p>We took the following view in founding Brierwood Design: with products like <a href="http://aws.amazon.com/ec2/">Amazon EC2</a>, the capital costs of entering the marketplace are almost nil.  Value is created by combining highly skilled labor with a small amount of capital (such as my laptop and an internet connection).  Therefore, it is the <strong>labor investment</strong> that is the most important factor to the company, and so it is that investment that takes the risk (I&#8217;ll explain how another time) and should be poised to reap the rewards.  So in our case, we decided that the control and largest upside would not rest with investors, or with founders, but with the people taking the risk and creating the value &#8212; the employees.  And this is the logic that led us to becoming a worker cooperative, and in my opinion is very much in the spirit of modern creations such as Wikipedia, Creative Commons, etc.</p>
<p>So, is it right to call this New Socialism?  Maybe, although the term is probably too loaded to mean anything anymore.  If you think that socialism means control of industry by the state, then it definitely isn&#8217;t.  On the other hand, if you see the intent of socialism as putting control of industry in the hands of individual producers, then it most certainly is.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/the-new-socialism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XML Database Migration using ElementTree &amp; Decorators</title>
		<link>http://www.brierwooddesign.com/xml-database-migration-using-elementtree-decorators/</link>
		<comments>http://www.brierwooddesign.com/xml-database-migration-using-elementtree-decorators/#comments</comments>
		<pubDate>Thu, 21 May 2009 13:39:01 +0000</pubDate>
		<dc:creator>rvanmelle</dc:creator>
				<category><![CDATA[Reid van Melle]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.brierwood.webfactional.com/?p=118</guid>
		<description><![CDATA[I have been working on a website conversion recently. Part of the work involves migrating an existing database schema into a slightly different schema. Exactly why this is required is not important. In addition, I don&#8217;t really want to talk about it in case this is work I&#8217;ve created for myself out of ignorance. I&#8217;ve been fortunate to be back [...]]]></description>
			<content:encoded><![CDATA[<p>I have been working on a website conversion recently.  Part of the work involves migrating an existing database schema into a slightly different schema.  Exactly why this is required is not important.  In addition, I don&#8217;t really want to talk about it in case this is work I&#8217;ve created for myself out of ignorance.</p>
<p>I&#8217;ve been fortunate to be back working with one my favourite langugages&mdash;- Python.  However, things have changed with Python since I was in my py-programming peak; both in terms of language features and some of the standard libraries.  I&#8217;m also happy to add that all of the changes seem to be for the better.</p>
<p>My starting point was a mySQL database.  I extracted the data using a simple <code>mysqldump</code> with the XML feature turned on:</p>
<pre class="src">
$ mysqldump -X ---user=&lt;db_user&gt; --password &lt;database_name&gt; &gt; dump.xml
</pre>
<p>The result was a massive XML file.  That is actually a remarkable side-note.  Emacs warned me about loading a file this large, and took a bit of time to bring it up, but afterwards, it was incredibly responsive and searchable.  I wouldn&#8217;t even attempt something like this with my other favourite editor Textmate.</p>
<p>A typical record from the database looks something like this:</p>
<pre class="src">
  &lt;<span class="function-name">table_data</span> <span class="variable-name">name</span>=<span class="string">"user"</span>&gt;
    &lt;<span class="function-name">row</span>&gt;
      &lt;<span class="function-name">field</span> <span class="variable-name">name</span>=<span class="string">"user_id"</span>&gt;59&lt;/<span class="function-name">field</span>&gt;
      &lt;<span class="function-name">field</span> <span class="variable-name">name</span>=<span class="string">"user_name"</span>&gt;Kent Barber&lt;/<span class="function-name">field</span>&gt;
      &lt;<span class="function-name">field</span> <span class="variable-name">name</span>=<span class="string">"user_username"</span>&gt;shamal&lt;/<span class="function-name">field</span>&gt;
    &lt;/<span class="function-name">row</span>&gt;
  &lt;/<span class="function-name">table_data</span>&gt;
</pre>
<p>The last time I did XML processing in Python, things were very different.  I tended to simple SAX-based parsers back then.  Nowadays, there are fancy alternative like <a href="http://effbot.org/zone/element-index.htm">ElementTree</a> which make many things easier.</p>
<p>My end goal was to be able to write simple little functions which know how to construct the objects in my shiny new Django database:</p>
<pre class="src">
<span class="preprocessor">@with_rows_from</span>(<span class="string">"user"</span>)
<span class="keyword">def</span> <span class="function-name">process_user</span>(fields):
  u = User(name=fields[<span class="string">'user_name'</span>], username=fields[<span class="string">'user_username'</span>])
  u.save()
</pre>
<p>To accomplish this, I wrote a little decorator class that takes the name of a table from the database, collects all of the fields, and then calls the decorated function.  I know there are other ways to accomplish this same thing that are arguably better, but I really like decorators.  I like the way they make the code look and read.</p>
<pre class="src">
<span class="keyword">class</span> <span class="type">with_rows_from</span>(object):
  <span class="keyword">def</span> <span class="function-name">__init__</span>(<span class="keyword">self</span>, table_name):
    <span class="keyword">self</span>.table = table_name

  <span class="keyword">def</span> <span class="function-name">__call__</span>(<span class="keyword">self</span>, fn):
    <span class="keyword">def</span> <span class="function-name">wrapped</span>(records):
      <span class="keyword">for</span> data <span class="keyword">in</span> records.findall(<span class="string">"//database/table_data"</span>):
        <span class="keyword">if</span> data.get(<span class="string">'name'</span>) == <span class="keyword">self</span>.table:
          <span class="keyword">for</span> row <span class="keyword">in</span> data.findall(<span class="string">".//row"</span>):
            fields = {}
            <span class="keyword">for</span> f <span class="keyword">in</span> row.findall(<span class="string">".//field"</span>):
              fields[f.get(<span class="string">'name'</span>)] = f.text
            fn(fields)

    <span class="keyword">return</span> wrapped
</pre>
<p>At the top-level, I can extract all the user objects with something like this:</p>
<pre class="src">
<span class="keyword">from</span> xml.etree <span class="keyword">import</span> ElementTree <span class="keyword">as</span> ET
<span class="variable-name">records</span> = ET.parse(<span class="string">'dump.xml'</span>)
process_user(records)
</pre>
<p>I love this language.  Now, back to my migration.  There are obviously some other complications that I&#8217;ll have to deal with, but maybe that will be another post.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brierwooddesign.com/xml-database-migration-using-elementtree-decorators/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
