<?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>Thu, 15 Oct 2009 18:38:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</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" href="http://feeds.feedburner.com/cloudspace" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><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>
		<item>
		<title>Agile Principles #6: Say it to my face.</title>
		<link>http://www.cloudspace.com/blog/2009/10/08/agile-principles-6-say-it-to-my-face/</link>
		<comments>http://www.cloudspace.com/blog/2009/10/08/agile-principles-6-say-it-to-my-face/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 12:07:16 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=542</guid>
		<description><![CDATA[The most efficient and effective method of
conveying information to and within a development
team is face-to-face conversation.
I&#8217;ve previously mentioned we have an IRC channel. That&#8217;s due to practical considerations. When we need to frequently and quickly share information among a group of people who deal with each other often throughout the day (and are generally on [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>The most efficient and effective method of<br />
conveying information to and within a development<br />
team is face-to-face conversation.</p></blockquote>
<p>I&#8217;ve previously mentioned we have an IRC channel. That&#8217;s due to practical considerations. When we need to frequently and quickly share information among a group of people who deal with each other often throughout the day (and are generally on the same page to begin with), IRC will work. Notice how many qualifiers I put on that sentence <img src='http://www.cloudspace.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>It would be unsuitable for multiple teams to physically interrupt one another&#8217;s thoughts numerous times per day. IRC has another advantage because it is a &#8220;pull&#8221; channel. When I finish a feature or need a mental break, I can switch to IRC for a moment, and address any questions. When we need to have an extended talk, we walk over to that person&#8217;s room or jump on Skype/iChat video. Nothing beats seeing a face. Babies are known to stare at faces within days of birth, and our brains are hardwires to see faces and extract information from them constantly. Look at how well-known and recognized the &#8220;<a href="http://en.wikipedia.org/wiki/Cydonia_%28region_of_Mars%29">face on Mars</a>&#8221; has become.</p>
<p>When we&#8217;re talking client-engineer communications, the whole goal is to get people who have different mental states to be thinking the same way. Engineers need to understand the product and what drives business value, and the product owner needs to understand the technical requirements to make the system work. To do that requires more bandwidth than short text messages. This is another facet of <a href="http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/">businesspeople working with engineers on a daily basis</a>. You need frequent, high-bandwidth communication.</p>
<p>At the start of a new project, I always prefer an in-person meeting. There&#8217;s nothing that beats shaking someone&#8217;s hand, getting a meal with them, and learning about their project. It gets a great sense of who they are, where they&#8217;re coming from, and it helps build the trust that is mentioned in <a href="http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/">Principle #5</a> (&#8221;A Team Of Motivated Individuals&#8221;). Once we get going, video chat usually replaces in-person meetings, since our clients are spread across the country. It&#8217;s not reasonable to physically travel to weekly planning meetings, and we&#8217;ve adjusted our process to accommodate this need.</p>
<p>That&#8217;s all there is to this principle. Communication from businesspeople to a team, and among team members is vital, and the best way to communicate is face-to-face. If you&#8217;d like to discuss it more, I&#8217;d prefer to go grab a coffee or lunch with you, but I&#8217;ll settle for a comment on this blog post. Next post, I&#8217;ll be talking about progress in a project, and how it gets measured.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/10/08/agile-principles-6-say-it-to-my-face/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing the Halting Problem</title>
		<link>http://www.cloudspace.com/blog/2009/09/29/testing-the-halting-problem/</link>
		<comments>http://www.cloudspace.com/blog/2009/09/29/testing-the-halting-problem/#comments</comments>
		<pubDate>Tue, 29 Sep 2009 12:56:08 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Halting problem]]></category>
		<category><![CDATA[hey it works]]></category>
		<category><![CDATA[Language]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=534</guid>
		<description><![CDATA[I wrote a piece of code recently to follow a linked list. We were linking records together in a way that a few records would normally be grouped together in a tree, with one parent above them all. However, because of the way the records were linked, it was also possible for a loop to [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a piece of code recently to follow a linked list. We were linking records together in a way that a few records would normally be grouped together in a tree, with one parent above them all. However, because of the way the records were linked, it was also possible for a loop to occur &#8212; that is A would reference B, B would reference C, and C would reference A. </p>
<p>If there was a loop, it would be a small one (less than 5 records total). Our code that read the loop would run forever if it were to encounter a loop (and eventually overflow the stack). Since it would be a very small loop, and it was not reasonably possible to prevent a loop from happening, we had to handle it in the reader. Our reader was recursive, so we passed in an array to the recursive call, and it would constantly add the ID being looked at. At each recursive step, we&#8217;d check if we had already seen the ID we were about to look at, and if we found a loop, we exited accordingly.</p>
<pre class="brush: ruby">
def reader(record, previous_ids = [])
  raise &quot;loop&quot; if previous_ids.include?(record.id)
  ...
  return reader(next_record, previous_ids + [record.id])
end
</pre>
<p>We wanted to write a test to ensure that our code would never follow a loop. The only way to do this was to write a test that created a loop of records, and run the function on the loop. If the loop-blocking code worked, it exited instantly. But if the code were to not work, our test would run for a very long time before we overflow the stack. This is essentially testing the <a href="http://en.wikipedia.org/wiki/Halting_problem">halting problem</a>, a famous computer science problem with no real solution, and no chance of ever being solved.</p>
<p>The most straightforward solution available was this:</p>
<pre class="brush: ruby">
it &quot;doesn&#039;t loop forever&quot; do
  # setup test and create loop
  puts &quot;This is a test of the halting problem. If you see this message for more than a few seconds, it means the test has failed.&quot;
  # run test on the loop
end
</pre>
<p>If you want to put this in a CI system, a more heavy-duty way of doing this would be to start two processes: one that runs the possible infinite loop, and one that raises an exception after N seconds if the first process hasn&#8217;t completed.</p>
<p>Filed under: hey it works</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/09/29/testing-the-halting-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Database.yml and multi-stage Capistrano deployment</title>
		<link>http://www.cloudspace.com/blog/2009/09/18/database-yml-and-multi-stage-capistrano-deployment/</link>
		<comments>http://www.cloudspace.com/blog/2009/09/18/database-yml-and-multi-stage-capistrano-deployment/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 13:55:56 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=528</guid>
		<description><![CDATA[If you&#8217;re using Capistrano&#8217;s multi-stage deploy addon, it makes things work really well. Staging servers are excellent for testing and demoing new features and code before releasing it to your users. If you need to change your database.yml files, or another config file, here&#8217;s a technique for changing passwords or API keys depending on which [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re using <a href="http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage">Capistrano&#8217;s multi-stage deploy addon</a>, it makes things work really well. Staging servers are excellent for testing and demoing new features and code before releasing it to your users. If you need to change your database.yml files, or another config file, here&#8217;s a technique for changing passwords or API keys depending on which stage you are deploying to.</p>
<p>In your main deploy.rb, add an</p>
<pre class="brush: ruby">after &quot;deploy:symlink&quot;, :update_config_file
after &quot;deploy:symlink&quot;, :update_database_yml</pre>
<p>And just throw as many of these in as you need. This will call these tasks no matter which stage you are deploying to (and as an added benefit, if you forget to define a method for a stage, it will error and alert you). Next step is to define an &#8220;update_config_file&#8221; or &#8220;update_database_yml&#8221; file for each stage. In your /config/deploy/ path, you&#8217;ll have a file for each stage that you deploy to. Go in there and add something like this:</p>
<pre class="brush: ruby">PRODUCTION_DB_INTERNAL_IP = &quot;1.2.3.4&quot;

desc &quot;Update database.yml with production information&quot;
task :update_database_yml do
  replacements = { &quot;DATABASE_IP&quot; =&gt; PRODUCTION_DB_INTERNAL_IP }

  replacements.each_pair do |pattern, sub|
    run &quot;sed -i &#039;s/#{pattern}/#{sub}/&#039; /path/to/deploy/current/config/database.yml&quot;
  end
end</pre>
<p>Just define as many of these tasks as you need, and change your config files to contain whatever values you need them to. Clean and simple, happens 100% automatically with each deploy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/09/18/database-yml-and-multi-stage-capistrano-deployment/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Principle #5: A team of motivated individuals</title>
		<link>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/</link>
		<comments>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 12:58:47 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[motivation]]></category>
		<category><![CDATA[trust]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=523</guid>
		<description><![CDATA[Build projects around motivated individuals.
Give them the environment and support they need,
and trust them to get the job done.
This Agile principle is such good business advice, I could approach it from many other non-Agile directions. It almost transcends business and applies to all human endeavors.
Starting with the motivation issue. Larry Bossidy, one of the world&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Build projects around motivated individuals.<br />
Give them the environment and support they need,<br />
and trust them to get the job done.</p></blockquote>
<p>This Agile principle is such good business advice, I could approach it from many other non-Agile directions. It almost transcends business and applies to all human endeavors.</p>
<p>Starting with the motivation issue. Larry Bossidy, one of the world&#8217;s top CEOs, says that when hiring, a person with absolute determination to succeed will always do better than someone with a high IQ and elite education who is cruising.</p>
<p>Approaching this from a different direction, I recently read a football coaching book, and one of NCAA coaches who contributed to the book said that given the choice between a player with solid technique and a player who is 100% motivated, he will pick the motivated player 9 out of 10 times. This advice is coming from a top performer in an industry that is incredibly well-scrutinized with clear outcomes and performance metrics. This gives me good reason to trust it.</p>
<p>So, speaking of trust, let&#8217;s move to that. I think that motivation can be universally agreed on as valuable, and if you don&#8217;t believe me, you&#8217;re probably not motivated enough to post a comment and debate it. <img src='http://www.cloudspace.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Trust is tricky. A favorite Warren Buffet quote of mine is that &#8220;it takes 20 years to build a reputation and five minutes to ruin it.&#8221; How can you quickly decide if a team is trustworthy? Of course we&#8217;ve all got markers for trust, but I think that a track record of similar and successful projects is a good place to start developing trust. If you can get access to the person who filled the &#8220;product guy&#8221; or client roles, ask them how they felt the team handled it. Did they feel that the team made intelligent decisions, but kept the client in the loop? Most importantly, did the team provide good value for the dollar spent?</p>
<p>Another thing that can help identify trustworthy people is talking directly to them. Are their answers clear and specific, or vague and filled with jargon? Do they make an effort to understand the client&#8217;s business and perspective, or do they insist on a particular solution no matter what the context?</p>
<p>Since trust is something that naturally has to build over time, don&#8217;t wait for 100% trust. If you&#8217;re always waiting for the perfect conditions, you&#8217;ll never get anything done. Jump in and give them a shot. This is one place where Cloudspace takes advantage of fast delivery and iterative development. Our process is based off single weeks of work. Of course, we&#8217;d love to work with you for several months, but if you have 10 weeks of work, start off for a week or two and see if you&#8217;re happy. Our clients are free to leave at any point, so this makes for an environment where we consistently perform and deliver. It also makes for an incredibly simple contract.</p>
<p>The last parts of this principle relate to the environment and support. I think this primarily involves internal teams, although a smooth client relationship is always helped when the client trusts the technology decisions and doesn&#8217;t second guess how things are constructed. There&#8217;s a balance between understanding the infrastructure and guiding the project, versus micromanaging and dictating. If you were going for surgery, you wouldn&#8217;t tell the doctor to use a #5 scalpel because you read an article on WebMD. You&#8217;d ask the doctor what is going on, expect clear and intelligent answers, then give the doctor space to work.</p>
<p>With respect to internal teams: Cloudspace helps create a healthy environment for our engineers by treating them both as engineers whose skills need to be kept current, and as human beings who have higher needs (think Maslow&#8217;s hierarchy). Because we treat our people well, our clients get great results from them.</p>
<p>To keep technical skills sharp and communication healthy, we have daily standups that last about 15 minutes where everyone gets a turn to share what they did since yesterday&#8217;s standup, and anything new they learned. We have weekly &#8220;hack sessions&#8221; where we review a new technology, or spend time cross-training (teaching things that are immediately relevant to our projects). We constantly talk to people and make sure they are happy with the progress of their project, and to identify things that may limit progress. We&#8217;re all in a private IRC channel so that we can instantly tap collective team knowledge, or jump to a public channel and tap the knowledge of the community.</p>
<p>Also, good milk comes from happy cows (I know this; I saw them gazing out at the ocean at Point Reyes a few weeks ago in California before eating some of the amazing cheese their milk produced at Cowgirl Creamery). We have team outings where we&#8217;ll go out for beers, bowling, laser tag, go-karting, or a movie. We have a comfortable dress code &#8212; sandals and shorts are common in our Florida summers &#8212; but we still respect our clients enough to put on a collar to greet them. Since we pair program our Agile projects and have to communicate, we don&#8217;t wear headphones, but it&#8217;s typical to trade off on choosing music to put on the speakers (I personally love <a href="http://www.pandora.com">Pandora</a>, <a href="http://listen.grooveshark.com/">Grooveshark</a>, and <a href="http://hypem.com">The Hype Machine</a>).</p>
<p>All of these things add up to a lean and effective team that has what it needs to execute client strategy and deliver great code. We trust our engineers to do a great job &#8212; we don&#8217;t micromanage them. Our turnover is virtually zero and we&#8217;re proud of it. That&#8217;s the value of a good environment and healthy support.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/09/08/agile-principle-5-a-team-of-motivated-individuals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agile Principles #4: Product Owner and Engineer relationships</title>
		<link>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/</link>
		<comments>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/#comments</comments>
		<pubDate>Mon, 31 Aug 2009 16:53:28 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[team cloudspace]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[engineers]]></category>
		<category><![CDATA[product owners]]></category>
		<category><![CDATA[Project management]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=508</guid>
		<description><![CDATA[Time for Agile principle number four, where we talk about the relationship between product owner and engineer:
Business people and developers must work
together daily throughout the project.
In the post on agile principle number two, I gave the example of a Secret Santa management system, as an example of how being able to accommodate changing requirements can [...]]]></description>
			<content:encoded><![CDATA[<p>Time for Agile principle number four, where we talk about the relationship between product owner and engineer:</p>
<blockquote><p>Business people and developers must work<br />
together daily throughout the project.</p></blockquote>
<p>In the post on <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">agile principle number two</a>, I gave the example of a Secret Santa management system, as an example of how being able to accommodate changing requirements can benefit a project. As a refresher, here&#8217;s the key story points of the project:</p>
<ul>
<li> A user should be able to sign up</li>
<li>A user should be able to log in</li>
<li>A user should be able to get a recipient assigned</li>
<li>A user should be able to add notes to their recipient</li>
<li>There should be an &#8220;Add Amazon product&#8221; link that searches on Amazon</li>
<li>There should be a &#8220;Buy on Amazon&#8221; button</li>
</ul>
<p>I&#8217;m going to reuse this example to show the value of business people working closely with developers. You can refer to <a href="http://www.cloudspace.com/blog/2009/03/24/agile-principles-2-change/">the original blog post</a> if you like. I&#8217;m going to be counting the number of product owner-engineering interactions in the Agile scenario:</p>
<ol>
<li> Meeting with the dev team to decide that sign up and login functionality are essential</li>
<li>Being notified of the sign up and login completion/deployment</li>
<li>Verifying sign up and login</li>
<li>Being notified of the recipient selection completion/deployment</li>
<li>Verifying recipient selection</li>
<li>Being notified of the notes completion/deployment</li>
<li>Verifying notes</li>
<li>Having developers stop work</li>
</ol>
<p>That&#8217;s 8 different product manager-engineer interactions, and this is a tiny hypothetical product &#8212; we only did 4 story points! This doesn&#8217;t include questions or clarifications that inevitably come up in all projects while the developers are at work. You show me a client that thinks it&#8217;s okay for each of these interactions to wait for the weekly (or longer) review and I&#8217;ll show you a client who is overpaying for bored developers.</p>
<p>So what if you&#8217;re concerned that these interactions suck up time? Given that other than planning meetings (which occur in waterfall too) the interactions generally last 30 seconds for a quick question or notification, or 5-15 minutes for verification. I&#8217;ve never met a client who was too busy for this. Also these frequent interactions give you frequent input. That lets you guide your project &#8212; think about driving a car that you can only steer every 30 seconds. It&#8217;s worth it.</p>
<p>This is actually one area where Cloudspace adds it&#8217;s own flavor to Agile. Pure Agile processes mean an onsite customer, working as a product manager full time. We realize that when working with startups, they don&#8217;t always have the time or resources to devote a full person to being available immediately. So we give our clients flexibility. We find out why the software is valuable and what the business goals are so that we can make good decisions if we reach a point where the product manager is unavailable but we need to move forward. Of course, sometimes the good decision is to hold off on one ticket and be productive on another. Clients are always consulted on key decisions. We&#8217;re also good at batching these interactions into the daily meetings &#8212; a 15 minute meeting or email where we update the client on the day.</p>
<p>From the developer side of things, having easy access to answers is great. There&#8217;s nothing worse than trying to guess how an entire feature should work, and then having to rewrite the whole feature due to a difference in perspectives. Remember: happy engineers are productive engineers.</p>
<p>Speaking of happy engineers and productive engineers, in my next post we&#8217;ll be talking about the 5th principle of Agile: trusting a team of motivated engineers.</p>
<p>P.S.  If you are one of those rocking motivated engineers, <a href="http://www.cloudspace.com/careers.php">Cloudspace is hiring!</a></p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/a53d885a-4386-4726-b517-565250bb8eb0/"><img class="zemanta-pixie-img" style="border: medium none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=a53d885a-4386-4726-b517-565250bb8eb0" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/08/31/agile-principles-4-product-owner-and-engineer-relationships/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cloudspace Testimonials – United for Families</title>
		<link>http://www.cloudspace.com/blog/2009/08/14/cloudspace-testimonials-united-for-families/</link>
		<comments>http://www.cloudspace.com/blog/2009/08/14/cloudspace-testimonials-united-for-families/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 20:31:59 +0000</pubDate>
		<dc:creator>Dixie Daniels</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[cloudspace]]></category>
		<category><![CDATA[testimonials]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=505</guid>
		<description><![CDATA[“United for Families has worked with the excellent staff at Cloudspace for over 5 years. Their work is consistently high quality – whether it be in coding or graphics – and they often know what we need better than we do!”
Tammy Tappan, PMP
Systems Administrator,
 United for Families

]]></description>
			<content:encoded><![CDATA[<p>“United for Families has worked with the excellent staff at Cloudspace for over 5 years. Their work is consistently high quality – whether it be in coding or graphics – and they often know what we need better than we do!”</p>
<p>Tammy Tappan, PMP<br />
Systems Administrator,<br />
<a href="http://uff.us" target="_blank"> United for Families</a></p>
<div class="zemanta-pixie" style="margin-top: 10px; height: 15px;"><a class="zemanta-pixie-a" title="Reblog this post [with Zemanta]" href="http://reblog.zemanta.com/zemified/c90d8f07-0647-421f-b78d-d191d8686341/"><img class="zemanta-pixie-img" style="border: none; float: right;" src="http://img.zemanta.com/reblog_e.png?x-id=c90d8f07-0647-421f-b78d-d191d8686341" alt="Reblog this post [with Zemanta]" /></a><span class="zem-script more-related pretty-attribution"><script src="http://static.zemanta.com/readside/loader.js" type="text/javascript"></script></span></div>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/08/14/cloudspace-testimonials-united-for-families/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fast MySQL InnoDB count. Really fast</title>
		<link>http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/</link>
		<comments>http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 14:56:57 +0000</pubDate>
		<dc:creator>Tim Rosenblatt</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[count]]></category>
		<category><![CDATA[Database engine]]></category>
		<category><![CDATA[Databases]]></category>
		<category><![CDATA[FAQs  Help  and Tutorials]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Table]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=497</guid>
		<description><![CDATA[Last night I was pairing with John on a feature for an upcoming release. I wanted to count the number of rows in a table so we could run analytics and track performance. I &#60;3 metrics, ya know?
&#8220;Tim, this is simple. Why are you writing about this?&#8221;

select count(*) from messages;

And it is simple. If this [...]]]></description>
			<content:encoded><![CDATA[<p>Last night I was pairing with John on a feature for an upcoming release. I wanted to count the number of rows in a table so we could run analytics and track performance. I &lt;3 metrics, ya know?</p>
<p>&#8220;Tim, this is simple. Why are you writing about this?&#8221;</p>
<pre class="brush: sql">
select count(*) from messages;
</pre>
<p>And it is simple. If this were MyISAM. See, MyISAM always stores the number of rows on the table header. So, whenever we ask &#8220;how many rows are there?&#8221;, it can just grab the count and return it. Not InnoDB.</p>
<p>In InnoDB (for internal reasons), the number of rows has to be counted. Every single time. One of the tables we were counting was over 1.2 million rows. On a small EC2 instance with no other queries/major processes, this takes 1 minute and 20 seconds. This is unacceptable.</p>
<p>We looked at another command that will estimate the number of rows, but according to MySQL, <a href="http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html">it can be off by up to 50%</a></p>
<pre class="brush: sql">
show table status;
</pre>
<p>Being off by up to 50% is unacceptable, even if it is fast. So we kept looking. Most of the recommendations were &#8220;make a table that stores the count, and add to/subtract from it every time you do a write/delete from the actual table&#8221;. Also not helpful. We&#8217;ve got over a million rows, and this is a prototype that&#8217;s only been online for a few weeks. I refuse to double the number of writes to our DB.</p>
<p>John points out that since our table is so huge, we&#8217;ve already got indices on it. Why not make the query use one of them?</p>
<pre class="brush: sql">
mysql&gt; select count(*) from messages use index (index_messages_on_remote_created_at);
+----------+
| count(*) |
+----------+
|  1276831 |
+----------+
1 row in set (3.19 sec)
</pre>
<p>Win. The trick is to hint it at a specific index. So, if you&#8217;re getting poor response times from InnoDB count, it means you&#8217;ve got lots of rows that have to be counted one at a time. And since you&#8217;ve got a lot of rows, you have at least one index. Just pick an index that will never contain a NULL value, and tell MySQL to &#8216;use index (index_name)&#8217;. Also, thanks to <a href="http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/">Wallace</a>, who commented on the MySQL Performance Blog</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/08/06/fast-mysql-innodb-count-really-fast/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jeremiah Joins the Team</title>
		<link>http://www.cloudspace.com/blog/2009/07/24/jeremiah-joins-the-team/</link>
		<comments>http://www.cloudspace.com/blog/2009/07/24/jeremiah-joins-the-team/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 16:00:09 +0000</pubDate>
		<dc:creator>Theresa Sampson</dc:creator>
				<category><![CDATA[Team Member]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=495</guid>
		<description><![CDATA[Jeremiah Hemphill was hired a little over four weeks ago as an engineer here at Cloudspace. He comes to us from the University of Rochester where he graduated with a double major in Computer Science and Music.  He plays the Euphonium, it looks like a tuba but smaller, and is big into robotics.  [...]]]></description>
			<content:encoded><![CDATA[<p>Jeremiah Hemphill was hired a little over four weeks ago as an engineer here at Cloudspace. He comes to us from the University of Rochester where he graduated with a double major in Computer Science and Music.  He plays the Euphonium, it looks like a tuba but smaller, and is big into robotics.  If the last name sounds familiar that because his brother, Jacob Hemphill, is also an engineer at Cloudspace. He is going to UCF in the fall for a Computer Science Masters degree. Welcome Jeremiah!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cloudspace.com/blog/2009/07/24/jeremiah-joins-the-team/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mashable Impressed by Tweetpo.st</title>
		<link>http://www.cloudspace.com/blog/2009/07/23/486/</link>
		<comments>http://www.cloudspace.com/blog/2009/07/23/486/#comments</comments>
		<pubDate>Thu, 23 Jul 2009 15:07:38 +0000</pubDate>
		<dc:creator>Theresa Sampson</dc:creator>
				<category><![CDATA[agile development]]></category>
		<category><![CDATA[Facebook Connect]]></category>
		<category><![CDATA[Mashable]]></category>
		<category><![CDATA[Tweetpo.st]]></category>

		<guid isPermaLink="false">http://www.cloudspace.com/blog/?p=486</guid>
		<description><![CDATA[This week Mashable featured Tweetpo.st on their &#8220;10 Impressive New Implementations of Facebook Connect&#8221; list.


]]></description>
			<content:encoded><![CDATA[<p>This week Mashable featured <a href="http://www.tweetpo.st">Tweetpo.st</a> on their <a href="http://mashable.com/2009/07/21/facebook-connect-new/?utm_campaign=snowball&amp;utm_content=site-basic&amp;utm_medium=awe.sm-twitter&amp;utm_source=twitter.com">&#8220;10 Impressive New Implementations of Facebook Connect&#8221;</a> list.</p>
<p><img class="aligncenter size-full wp-image-485" title="Tweetpo.st" src="http://www.cloudspace.com/blog/wp-content/uploads/2009/07/tweetpost.jpg" alt="Tweetpo.st" width="490" height="361" style="border:1px solid black"></p>
<div class="zemanta-pixie" style="margin-top:10px;height:15px"><a class="zemanta-pixie-a" href="http://reblog.zemanta.com/zemified/6d2596f5-7c22-4e59-922b-f839ae2ac7ed/" title="Reblog this post [with Zemanta]"><img class="zemanta-pixie-img" src="http://img.zemanta.com/reblog_e.png?x-id=6d2596f5-7c22-4e59-922b-f839ae2ac7ed" alt="Reblog this post [with Zemanta]" style="border:none;float:right"></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/07/23/486/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
