<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>the cloudspace blog</title>
	
	<link>http://www.cloudspace.com/blog</link>
	<description>All things cloudspacious</description>
	<lastBuildDate>Mon, 08 Feb 2010 19:53:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/cloudspace" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="cloudspace" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Agile Principle #9: Excellence</title>
		<link>http://www.cloudspace.com/blog/2010/02/08/agile-principle-9-excellence/</link>
		<comments>http://www.cloudspace.com/blog/2010/02/08/agile-principle-9-excellence/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 19:53:21 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=601</guid>
		<description><![CDATA[Continuous attention to technical excellence &#38; good design increases agility
To discuss this topic, we&#8217;ve got to start with an explanation of what &#8220;technical excellence&#8221; means. Technical excellence means maximizing technical value, which is distinct from business value.
When I say &#8220;business value,&#8221; I mean things that fall squarely in the category of being immediately and directly [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Continuous attention to technical excellence &amp; good design increases agility</p></blockquote>
<p>To discuss this topic, we&#8217;ve got to start with an explanation of what &#8220;technical excellence&#8221; means. Technical excellence means maximizing technical value, which is distinct from business value.</p>
<p>When I say &#8220;business value,&#8221; I mean things that fall squarely in the category of being immediately and directly valuable to the business. This includes:</p>
<ul>
<li>working features</li>
<li>the ability to add new features quickly (including the occasional &#8220;I need it yesterday&#8221; level of quick)</li>
<li>the ability to test new features shortly after they are produced</li>
<li>daily updates on progress from engineers</li>
<li>regular planning meetings between technical &amp; business people</li>
</ul>
<p>Technical value, the ying to business value&#8217;s yang, means things that are valuable to the engineers. This includes:</p>
<ul>
<li>clean &amp; easy-to-understand code</li>
<li>automatic tests</li>
<li>clear direction</li>
<li>good tools</li>
<li>snacks (ok, it&#8217;s not directly *technical value*, but it does help)</li>
</ul>
<p>By focusing on things that are valuable to us as engineers, we are able to quickly and effectively deliver business value to our clients.</p>
<p>Let&#8217;s take the first one as an example &#8212; readable code. As an engineer, I can tell you that once a project goes over a few thousand lines of code, there are sections of the code that I might not have to look at for weeks or even months. Without small, well-named functions, and good comments (those that explain the *why* and not *what*), I will have to spend time digging to figure out what I need to change to make the code deliver new business value. Think of these things as signposts that show the organization of the code, the same way that chapters and page numbers show the organization of a book. Finding things quickly is valuable, and if you disagree, then I dare you to not use Google for a month.</p>
<p>A metaphor that&#8217;s useful in understanding technical excellence is the idea of &#8220;technical debt&#8221;. This was proposed by Ward Cunningham to explain how technical excellence affects the ability to make forward progress.</p>
<p>Let&#8217;s take Project X. Project X has really well-written code. When a fast change (the &#8220;I need it yesterday&#8221; kind) comes in, it&#8217;s safe to incur a bit of technical debt. We&#8217;ll borrow from our good credit (good code) to hack a solution into place quickly; something only possible because we&#8217;re organized. Later, when we have the luxury of time, we&#8217;ll pay off the technical debt by fixing the hack and bringing it back to our usual standards.</p>
<p>The analogy to financial debt is simple: if you keep your credit score healthy, when time and money are important, you can borrow against your credit line. Also, if you have too much debt, you get trapped and spend most of your resources by paying off interest. Same thing goes for technical debt, where the team spends time working around bugs, and trying to figure out what code does, instead of making forward progress on new features.</p>
<p>That all being said, there are responsible ways of using debt, both financial and technical. Imagine a recent high school graduate who wants to go to college, but doesn&#8217;t have the cash up front. Is it a good idea to take out a student loan? Absolutely! Take the loan, incur the debt, then pay it off when the resources become available. In this case, the student is starting a new venture with future potential &#8212; they are a startup! Same goes for a startup company.</p>
<p>At the beginning of a project, in the prototyping phase, it&#8217;s ok to take on debt. In Cloudspace&#8217;s line of work, our clients are often startups. This means that at the beginning of a project, the important thing is for our clients to test out their idea, get feedback, learn what works, and make changes to their plan. In engineering parlance, this means that they need a prototype. It&#8217;s ok to incur technical debt at this stage, because the business value of being able to experiment and learn outweighs any amount of technical debt. Also, there&#8217;s so little code, it&#8217;s very easy to refactor. Recovering from debt is fast. This phase usually lasts for the first few months, until 10-20 people have been able to test the prototype. After that, the learning period starts ending, and like our high-school-now-college graduate, it&#8217;s time to pay the loan back.</p>
<p>This should give you a good idea of how technical excellence helps keep a project flexible. By having everything organized ahead of time, you can move quickly when it comes time. If you&#8217;ve got questions, drop me a line in the comments. I&#8217;d love to discuss them with you.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/02/08/agile-principle-9-excellence/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Free money to entrepreneurial students.</title>
		<link>http://www.cloudspace.com/blog/2010/02/04/free-money-to-entrepreneurial-students/</link>
		<comments>http://www.cloudspace.com/blog/2010/02/04/free-money-to-entrepreneurial-students/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 14:31:32 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[competition]]></category>
		<category><![CDATA[dell social innovation competition]]></category>
		<category><![CDATA[free money]]></category>
		<category><![CDATA[startups]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=599</guid>
		<description><![CDATA[Dell Computer is giving $50,000 to help a great student-led team of entrepreneurs who want to change the world. If you&#8217;ve got a great idea for an internet startup, here&#8217;s a great chance to get some money and publicity. There&#8217;s only 25 days left to get signed up, so check it out today! http://www.dellsocialinnovationcompetition.com/
]]></description>
			<content:encoded><![CDATA[<p>Dell Computer is giving $50,000 to help a great student-led team of entrepreneurs who want to change the world. If you&#8217;ve got a great idea for an internet startup, here&#8217;s a great chance to get some money and publicity. There&#8217;s only 25 days left to get signed up, so check it out today! <a href="http://www.dellsocialinnovationcompetition.com/">http://www.dellsocialinnovationcompetition.com/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/02/04/free-money-to-entrepreneurial-students/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is this gem installed?</title>
		<link>http://www.cloudspace.com/blog/2010/01/26/is-this-gem-installed/</link>
		<comments>http://www.cloudspace.com/blog/2010/01/26/is-this-gem-installed/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 15:28:02 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[installation]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=594</guid>
		<description><![CDATA[Ever find yourself deep in some code, wishing that you could figure out if a gem was installed, without trying to call against it and deal with the ensuing nastyness? Here&#8217;s how:

dependency = Gem::Dependency.new &#34;authlogic&#34;, &#34;&#62;2&#34;
specs = Gem.source_index.search dependency
puts &#34;the gem is not installed&#34; if specs.empty?

Thanks to rubygems-sing for the simple implementation.
]]></description>
			<content:encoded><![CDATA[<p>Ever find yourself deep in some code, wishing that you could figure out if a gem was installed, without trying to call against it and deal with the ensuing nastyness? Here&#8217;s how:</p>
<pre class="brush: ruby">
dependency = Gem::Dependency.new &quot;authlogic&quot;, &quot;&gt;2&quot;
specs = Gem.source_index.search dependency
puts &quot;the gem is not installed&quot; if specs.empty?
</pre>
<p>Thanks to rubygems-sing for the simple implementation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/01/26/is-this-gem-installed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sustainable development</title>
		<link>http://www.cloudspace.com/blog/2010/01/20/sustainable-development/</link>
		<comments>http://www.cloudspace.com/blog/2010/01/20/sustainable-development/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 22:43:29 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile development]]></category>
		<category><![CDATA[Agile Manifesto]]></category>
		<category><![CDATA[pace]]></category>
		<category><![CDATA[pace of work]]></category>
		<category><![CDATA[sustainability]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=587</guid>
		<description><![CDATA[The 8th principle of the Agile Manifesto is
Agile processes promote sustainable development.
The sponsors, developers, and users should be able
to maintain a constant pace indefinitely.
At a previous employer, I remember a coworker of mine. Let&#8217;s call him M.
M was a good guy, capable, and hard-working. He always put in what was required, and often more. On [...]]]></description>
			<content:encoded><![CDATA[<p>The 8th principle of the Agile Manifesto is</p>
<blockquote><p>Agile processes promote sustainable development.<br />
The sponsors, developers, and users should be able<br />
to maintain a constant pace indefinitely.</p></blockquote>
<p>At a previous employer, I remember a coworker of mine. Let&#8217;s call him M.</p>
<p>M was a good guy, capable, and hard-working. He always put in what was required, and often more. On one particular project, there was a deadline coming up, and his team wasn&#8217;t going to make it. So, he buckled down and put in over 100 hours that week to make sure that they got everything delivered. Then the deadline got pushed back, giving them a bit more time, but he had to put in another 100+ hour week. Then the deadline was pushed again, with the same result &#8212; another 100+ hour week. He didn&#8217;t even go home, he&#8217;d just go to sleep under his desk at night, then climb back into his chair and keep working (except for 2 showers each week). This kept happening for a number of weeks until he gave up and left the company.</p>
<p>This is a perfect case of unsustainablity. I&#8217;ve definitely watched the clock roll past 4 AM to find myself still hacking away at code, but that&#8217;s because of two things. One, I like hacking. Two, it&#8217;s not long-term. Everyone can redline themselves for a short period of time, as long as there are breaks (I&#8217;m a big fan of the strike team approach, myself). Paradoxically, time spent not working is almost as important as the time spent working. It&#8217;s the nature of humans.</p>
<p>Agile development acknowledges that longevity is good in software teams. Turnover within a team due to burnout is bad, not just because of the loss of key members, but also because there&#8217;s a decline in quality and performance leading up to the loss. At Cloudspace, we keep moving forward at a steady pace (see my post on velocity), which means we move forward at a predictable pace. We&#8217;ll work late if a last minute feature is needed for a launch. But these situations are the exceptions, and not the rule.</p>
<p>The same goes for the client role. It&#8217;s important that our clients be able to keep a reasonable pace too. Daily updates and weekly meetings help serve this purpose. This type of frequent communication between the stakeholders means there aren&#8217;t last minute surprises. Remember the lesson of Mr Aesop&#8217;s friends, the tortoise and the hare. Slow and steady wins the race.</p>
<p>Do you have any stories of how unsustainable engineering practices resulted in the failure of a project? Share them in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/01/20/sustainable-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Default scope with Sunspot</title>
		<link>http://www.cloudspace.com/blog/2010/01/15/default-scope-with-sunspot/</link>
		<comments>http://www.cloudspace.com/blog/2010/01/15/default-scope-with-sunspot/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 21:11:45 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[default scope]]></category>
		<category><![CDATA[lucene]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[solr]]></category>
		<category><![CDATA[sunspot]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=576</guid>
		<description><![CDATA[While I was DRYing up some code, I noticed that a lot of my Sunspot searches were using the same options over and over. Default scope is a nice option in ActiveRecord queries, why not in our searches?

class Item
  # simple default scope to add an order_by to all queries
  def self.default_search_scope(&#38;additional)
  [...]]]></description>
			<content:encoded><![CDATA[<p>While I was DRYing up some code, I noticed that a lot of my <a href="http://outoftime.github.com/sunspot/">Sunspot</a> searches were using the same options over and over. <a href="http://ryandaigle.com/articles/2008/11/18/what-s-new-in-edge-rails-default-scoping">Default scope</a> is a nice option in ActiveRecord queries, why not in our searches?</p>
<pre class="brush: ruby">
class Item
  # simple default scope to add an order_by to all queries
  def self.default_search_scope(&amp;additional)
    search = Sunspot.new_search(Item)
    search.build(&amp;additional)
    search.build do
      order_by :created_at, :desc
    end
    search.execute
    search.results
  end

  # pardon the contrived example
  def self.with_keywords(user, query)
    default_search_scope do
      keywords query
    end
  end
end
</pre>
<p>This way you can specify your search options in the Sunspot DSL from each method, while moving repetitive options to a single location. Clean, readable, and effective.</p>
<p>Great props to <a href="http://outofti.me/">Mr Mat</a> for his help</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/01/15/default-scope-with-sunspot/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to Do It Wrong</title>
		<link>http://www.cloudspace.com/blog/2010/01/11/how-to-do-it-wrong/</link>
		<comments>http://www.cloudspace.com/blog/2010/01/11/how-to-do-it-wrong/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 13:24:42 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[enterprise]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[tim bray]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=572</guid>
		<description><![CDATA[What I’m writing here is the single most important take-away from my Sun years, and it fits in a sentence: The community of developers whose work you see on the Web, who probably don’t know what ADO or UML or JPA even stand for, deploy better systems at less cost in less  time at [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>What I’m writing here is the single most important take-away from my Sun years, and it fits in a sentence: The community of developers whose work you see on the Web, who probably don’t know what ADO or UML or JPA even stand for, deploy <strong>better systems</strong> at <strong>less cost</strong> in <strong>less  time</strong> at <strong>lower risk</strong> than we see in the Enterprise. This is true even when you factor in the greater flexibility and velocity of startups.</p></blockquote>
<p>Tim Bray, <a href="http://www.tbray.org/ongoing/When/201x/2010/01/02/Doing-It-Wrong">Doing It Wrong</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2010/01/11/how-to-do-it-wrong/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Working software is the primary measure of progress</title>
		<link>http://www.cloudspace.com/blog/2009/12/14/working-software-is-the-primary-measure-of-progress/</link>
		<comments>http://www.cloudspace.com/blog/2009/12/14/working-software-is-the-primary-measure-of-progress/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 14:36:57 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[estimation]]></category>
		<category><![CDATA[principles]]></category>
		<category><![CDATA[software development]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=569</guid>
		<description><![CDATA[The 7th principle of the Agile Manifesto is:
Working software is the primary measure of progress.
Let&#8217;s talk what this principle means in real projects, and then get a bit more general as to why it&#8217;s good.
How does this principle show up in a real Agile process? There&#8217;s a concept we call &#8220;velocity&#8221;. We assign velocity points [...]]]></description>
			<content:encoded><![CDATA[<p>The 7th principle of the Agile Manifesto is:</p>
<blockquote><p>Working software is the primary measure of progress.</p></blockquote>
<p>Let&#8217;s talk what this principle means in real projects, and then get a bit more general as to why it&#8217;s good.</p>
<p>How does this principle show up in a real Agile process? There&#8217;s a concept we call &#8220;velocity&#8221;. We assign velocity points for new functionality &#8212; not tickets completed! The danger of using &#8220;tickets completed&#8221; as a proxy for project value is that fixing a bug means closing a ticket. But, fixing a bug means the original ticket wasn&#8217;t done right, a.k.a: the software produced wasn&#8217;t &#8220;working software&#8221;. So, if someone spends a day setting up user avatar uploads, they&#8217;ve gotten 2 points of velocity. If someone spends a few hours fixing the login system because it was supposed to use emails instead of usernames, they get no velocity points.</p>
<p>Velocity is very useful from a management perspective, and it also enhances productivity. When you give a system of rules for scoring &#8220;points&#8221; to a group of people, I promise you that their level of performance will go up. Really, there&#8217;s only one problem with velocity: the illusion that you can compare velocity across projects and teams.</p>
<p>Every group estimates every project differently. When estimating the complexity of a change (in order to give the ticket the point value), some people naturally estimate high and some estimate low. The great thing about velocity is that it doesn&#8217;t matter if you&#8217;re high or low, just that you are consistent. If the project and the team are relatively consistent, they&#8217;ll produce consistent estimates. Consistency is good, because it makes it possible to plan programming endeavors.</p>
<p>So, don&#8217;t think of velocity as &#8220;the bigger the number, the more functionality being added!&#8221; It&#8217;s only valuable for comparing a team and a project against itself, to answer questions like:</p>
<ul>
<li>The developers are busting their butts. Are we adding as much functionality as we did a month ago?</li>
<li>The developers are busting their butts. Are we spending all our time fixing bugs?</li>
<li>Did adding a developer improve our productivity? Roughly how much?</li>
<li>Did removing a developer decrease our productivity? Roughly how much?</li>
<li>Did a new process or tool affect productivity?</li>
</ul>
<p>One extra note: if the same team and project&#8217;s velocity is highly variable, or ever spikes/drops, it&#8217;s fair to ask why.</p>
<h2>Why does this work?</h2>
<p>This is a hugely important principle. There&#8217;s almost nothing more important than producing working software. Beautiful code that doesn&#8217;t work is like a band filled with technical experts that sound like crap. The problem tends to be people who absolutely love and are insanely great at doing the thing, are so focused on being in love and insanely great that they don&#8217;t focus on business value. Technical purists mixed with business makes for rocky waters, but you can sail between them.</p>
<p>On the flip side, the average person&#8217;s definition of &#8220;working software&#8221; usually just means &#8220;when I sat down for the demo and clicked the button, I saw the expected result&#8221;. That&#8217;s <strong>not</strong> working software. Other things that contribute to &#8220;working software&#8221; are:</p>
<ul>
<li>handling unusual but likely situations well (not rare and arcane situations &#8212; that&#8217;s premature optimization)</li>
<li>maintainability for the developers (present and future)</li>
<li>usability for the end user</li>
<li>free of bugs</li>
</ul>
<p>On the subject of working software: there are many times when someone is fully capable of producing working code, but doesn&#8217;t want to when the solution doesn&#8217;t feel beautiful. Every scientific and artistic field has certain definitions of beauty or purity &#8212; the times when it all comes together. No-hitters in baseball, hat tricks in hockey, drifting cars, and math equations that are simple but convey a fundamental law of the universe. Writing software is no different &#8212; there&#8217;s certain things that can make an algorithm or architecture simple and powerful. But idealism can kill. These things are best when they come about naturally. Sometimes it takes some extra work to make them, but don&#8217;t go too far out of your way. Nothing trumps working code. I used to be guilty of this, and I&#8217;ve gotten more done since getting past it than I ever did before. I know it&#8217;s a problem in our industry, and I want others to benefit from it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/12/14/working-software-is-the-primary-measure-of-progress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextMate extended attributes corrupting files</title>
		<link>http://www.cloudspace.com/blog/2009/11/24/textmate-extended-attributes-corrupting-files/</link>
		<comments>http://www.cloudspace.com/blog/2009/11/24/textmate-extended-attributes-corrupting-files/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 19:17:49 +0000</pubDate>
		<dc:creator>Josh Lindsey</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=561</guid>
		<description><![CDATA[My development setup right now is a VirtualBox Ubuntu Server x64 guest running on OS X Snow Leopard. I use the VBox shared folder feature to share the document root of the sites I&#8217;m working on from OS X to Ubuntu, and edit the files natively using TextMate on OS X. This setup has worked [...]]]></description>
			<content:encoded><![CDATA[<p>My development setup right now is a <a class="zem_slink" href="http://www.virtualbox.org/" title="VirtualBox" rel="homepage">VirtualBox</a> <a class="zem_slink" href="http://www.ubuntu.com/" title="Ubuntu" rel="homepage">Ubuntu</a> Server x64 guest running on OS X Snow Leopard. I use the VBox shared folder feature to share the document root of the sites I&#8217;m working on from OS X to Ubuntu, and edit the files natively using TextMate on OS X. This setup has worked very well for me, as I can emulate the server environment my apps will eventually deploy to (as well as reap the benefits of Ubuntu&#8217;s much-superior-to-Apple&#8217;s command line). I have no need to buy any third-party ssh-mounting software; it is a completely turnkey solution.</p>
<p>Except for one minor flaw: <span id="more-561"></span>TextMate saves files with <a href="http://en.wikipedia.org/wiki/Extended_file_attributes#Mac_OS_X">extended file attributes</a> &#8211; basically arbitrary metadata associated with an individual file. The vboxsf filesystem with which you must mount shared folders in the guest OS does not support extended attributes. This results in a basically corrupted file.</p>
<p>You can see if a file has these attributes by performing a long listing in a directory:</p>
<pre lang="bash">jlindsey-mbp:javascripts jlindsey$ ls -l
total 160
-rw-r--r--  1 jlindsey  staff  19145 Nov 24 10:53 jquery-ui.js
-rw-r--r--  1 jlindsey  staff  57254 Nov 24 10:53 jquery.js
-rw-r--r--@ 1 jlindsey  staff   1204 Nov 24 11:33 messages-table.js
</pre>
<p>Note the &#8220;@&#8221; symbol after the permissions for messages-table.js. This indicates that it has extended attributes associated with it:</p>
<pre lang="bash">jlindsey-mbp:javascripts jlindsey$ xattr -l messages-table.js
com.macromates.caret: {
    column = 31;
    line = 24;
}
</pre>
<p>Thankfully, the fix is simple. Simply close TextMate and run this command:</p>
<pre lang="bash">defaults write com.macromates.textmate OakDocumentDisableFSMetaData 1
</pre>
<p>If you have any files that are still corrupted, opening them and re-saving them in TextMate will not clear the attributes. To do this, you can either open them with an editor (such as vim) in the guest OS and save them again, or in OS X run this command:</p>
<pre lang="bash">xattr -d com.macromates.caret messages-table.js
</pre>
<p>Substituting of course your file name, which will delete the named attribute.</p>
<p>(Cross-posted from my personal blog for your enjoyment: <a href="http://www.joshualindsey.net/2009/11/textmate-extended-attributes-corrupting-files/">TextMate extended attributes corrupting files</a>)</p>
<div style="margin-top: 10px; height: 15px;" class="zemanta-pixie"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/89b3f05b-3e89-4c3c-a320-07666b7c6f71/" title="Reblog this post [with Zemanta]"><img style="border: medium none ; float: right;" class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=89b3f05b-3e89-4c3c-a320-07666b7c6f71" alt="Reblog this post [with Zemanta]"></a><span class="zem-script more-related pretty-attribution"><script type="text/javascript" src="http://static.zemanta.com/readside/loader.js" defer="defer"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/11/24/textmate-extended-attributes-corrupting-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Discounted Cash Flows and Software Development</title>
		<link>http://www.cloudspace.com/blog/2009/11/13/discounted-cash-flows-and-software-development/</link>
		<comments>http://www.cloudspace.com/blog/2009/11/13/discounted-cash-flows-and-software-development/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 13:59:31 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=556</guid>
		<description><![CDATA[In finance, there is a concept called discounting cash flows. The idea can be summed up as the following: since money earns interest over time, $1 today is worth more than $1 a year from now. Adjusting for the time value of money is called discounting a cash flow.
There&#8217;s a parallel here. When doing a [...]]]></description>
			<content:encoded><![CDATA[<p>In finance, there is a concept called discounting cash flows. The idea can be summed up as the following: since money earns interest over time, $1 today is worth more than $1 a year from now. Adjusting for the time value of money is called discounting a cash flow.</p>
<p>There&#8217;s a parallel here. When doing a startup (or nearly any type of software development), code written sooner is worth more than code written later. Discount your code flows. The sooner the code is written:</p>
<ul>
<li>the sooner you can start validating ideas internally</li>
<li>you can release to customers</li>
<li>you can get feedback from customers and iterate on it</li>
</ul>
<p>When it comes to building a new product, specs can be valuable, but even better is a prototype with working code. Spending a few minutes with working code will tell you more than four people in a meeting for hours speculating on the best way to do something. What can you do now that will provide returns as time passes?</p>
<p>Give me your thoughts in the comments below. What&#8217;s the most valuable thing you&#8217;ve learned by iterating early and often?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/11/13/discounted-cash-flows-and-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloudspace is Getting Ready for Halloween</title>
		<link>http://www.cloudspace.com/blog/2009/10/15/cloudspace-is-getting-ready-for-halloween/</link>
		<comments>http://www.cloudspace.com/blog/2009/10/15/cloudspace-is-getting-ready-for-halloween/#comments</comments>
		<pubDate>Thu, 15 Oct 2009 18:38:40 +0000</pubDate>
		<dc:creator>Todd Sampson</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Team Halloween Video Funny]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=551</guid>
		<description><![CDATA[
Try JibJab Sendables® eCards today!

I think that Roozbeh has a bit too much time on his hands&#8230;
]]></description>
			<content:encoded><![CDATA[<div style='background-color:#e9e9e9; width: 425px;'><object id='A64060' quality='high' data='http://aka.zero.jibjab.com/client/zero/ClientZero_EmbedViewer.swf?external_make_id=yXNzXG4tRbVpeHI3&#038;service=sendables.jibjab.com&#038;partnerID=JibJab' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' wmode='transparent' height='319' width='425'><param name='wmode' value='transparent'></param><param name='movie' value='http://aka.zero.jibjab.com/client/zero/ClientZero_EmbedViewer.swf?external_make_id=yXNzXG4tRbVpeHI3&#038;service=sendables.jibjab.com&#038;partnerID=JibJab'></param><param name='scaleMode' value='showAll'></param><param name='quality' value='high'></param><param name='allowNetworking' value='all'></param><param name='allowFullScreen' value='true' /><param name='FlashVars' value='external_make_id=yXNzXG4tRbVpeHI3&#038;service=sendables.jibjab.com&#038;partnerID=JibJab'></param><param name='allowScriptAccess' value='always'></param></object>
<div style='text-align:center; width:435px; margin-top:6px;'>Try JibJab Sendables® <a href='http://sendables.jibjab.com/ecards'>eCards</a> today!</div>
</div>
<p>I think that Roozbeh has a bit too much time on his hands&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/10/15/cloudspace-is-getting-ready-for-halloween/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
