<?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 Devver Blog</title>
	
	<link>http://devver.net/blog</link>
	<description>building cloud tools to radically improve the way developers work</description>
	<lastBuildDate>Tue, 02 Feb 2010 19:09:33 +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" type="application/rss+xml" href="http://feeds.feedburner.com/devver/blog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="devver/blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Announcing Gemcutter/Caliper integration</title>
		<link>http://devver.net/blog/2010/02/announcing-caliper-gemcutter-integration/</link>
		<comments>http://devver.net/blog/2010/02/announcing-caliper-gemcutter-integration/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 19:09:33 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[Gemcutter]]></category>
		<category><![CDATA[RubyGems]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1729</guid>
		<description><![CDATA[We're extremely happy to announce that Caliper is now generating metrics for all gems pushed to Gemcutter!
By taking advantage of the new webhooks feature in Gemcutter, Caliper is alerted whenever a new version of a gem is pushed. At that point, we automatically generate metrics. In addition, every gem page on Gemcutter now features a [...]]]></description>
			<content:encoded><![CDATA[<p>We're extremely happy to announce that <a href="http://getcaliper.com">Caliper</a> is now generating metrics for all gems pushed to <a href="http://gemcutter.org">Gemcutter</a>!</p>
<p>By taking advantage of the <a href="http://gemcutter.org/pages/gem_docs">new webhooks feature</a> in Gemcutter, Caliper is alerted whenever a new version of a gem is pushed. At that point, we automatically generate metrics. In addition, every gem page on Gemcutter now features a 'Metrics' link to the Caliper metrics.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-1730" title="metrics_link" src="http://devver.net/blog/wp-content/uploads/2010/02/metrics_link.jpg" alt="metrics_link" width="569" height="225" /></p>
<p>We're thrilled to be generating metrics for so many great Ruby projects. As always, please <a href="http://support.getcaliper.com/">send us feedback</a> about how we can improve Caliper!</p>
<p>For more details on webhooks, check out the <a href="http://update.gemcutter.org/2010/02/01/january-changelog.html">Changelog screencast</a> by Nick Quaranto.</p>
<p>Many, many thanks to <a href="http://litanyagainstfear.com/">Nick Quaranto</a>, <a href="http://chadfowler.com/">Chad Fowler</a>, and all the other supremely awesome Gemcutter contributors!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/02/announcing-caliper-gemcutter-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Help us improve Caliper by taking a short survey</title>
		<link>http://devver.net/blog/2010/01/help-us-improve-caliper-by-taking-a-short-survey/</link>
		<comments>http://devver.net/blog/2010/01/help-us-improve-caliper-by-taking-a-short-survey/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 20:49:44 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[customer development]]></category>
		<category><![CDATA[survey]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1726</guid>
		<description><![CDATA[If you have tried Caliper, it would help us immensely if you filled out this short, eight-question survey at Survey.io. Thanks!
]]></description>
			<content:encoded><![CDATA[<p>If you have tried Caliper, it would help us immensely if you filled out this <a href="http://survey.io/survey/e007a">short, eight-question survey</a> at <a href="http://survey.io">Survey.io</a>. Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/01/help-us-improve-caliper-by-taking-a-short-survey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avdi Grimm on Confident Code</title>
		<link>http://devver.net/blog/2010/01/avdi-grimm-on-confident-code/</link>
		<comments>http://devver.net/blog/2010/01/avdi-grimm-on-confident-code/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 14:02:42 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1721</guid>
		<description><![CDATA[Recently Avdi, gave a talk on Confident Code at B’More on Rails. I enjoyed the talk and recommend giving it a listen, if you are interested in better structured code. The slides are available here, if you want to follow along.

Avdi Grimm on Confident Code at B'More on Rails from Avdi Grimm on Vimeo.
]]></description>
			<content:encoded><![CDATA[<p>Recently Avdi, gave a talk on <a href="http://avdi.org/devblog/2010/01/20/confident-code-at-bmore-on-rails/">Confident Code at B’More on Rails</a>. I enjoyed the talk and recommend giving it a listen, if you are interested in better structured code. The <a href="http://avdi.org/talks/confident-code-2010-01-12/confident-code.html">slides are available here</a>, if you want to follow along.</p>
<p><object width="400" height="225"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=8856299&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=8856299&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object>
<p><a href="http://vimeo.com/8856299">Avdi Grimm on Confident Code at B'More on Rails</a> from <a href="http://vimeo.com/avdi">Avdi Grimm</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/01/avdi-grimm-on-confident-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upcoming improvements for Caliper</title>
		<link>http://devver.net/blog/2010/01/upcoming-improvements-for-caliper/</link>
		<comments>http://devver.net/blog/2010/01/upcoming-improvements-for-caliper/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 00:21:47 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1714</guid>
		<description><![CDATA[For the past several weeks, you may have noticed that not much has changed on Caliper. The reason for this is that we've been working hard to allow you to use Caliper on your private GitHub repositories (we're currently in private beta for that feature. If you are interested, you can sign up for a [...]]]></description>
			<content:encoded><![CDATA[<p>For the past several weeks, you may have noticed that not much has changed on <a href="http://getcaliper.com">Caliper</a>. The reason for this is that we've been working hard to allow you to use Caliper on your private GitHub repositories (we're currently in private beta for that feature. If you are interested, you can sign up for a <a href="http://getcaliper.com/beta">beta invitation</a>).</p>
<p>However, we realize that we have much to improve on Caliper. We've been talking with our users to identify the biggest problems and most-requested features. In addition, we're getting help from the folks at <a href="http://viget.com">Viget Labs</a> to make Caliper easier to understand, more intuitive to use, and all around better.</p>
<p>In our first batch of work, we'll be focusing on three improvements. </p>
<p>First, we'll be developing an improved project dashboard. Our current dashboard isn't terribly useful. We'd like to better represent the state of the project, important trends, and areas that need the most help. We're working now to come up with a concrete design that addresses these issues. In the meantime, what data would you find most helpful on the dashboard?</p>
<p>We'll also be changing the way you navigate to specific tools. Users have told us that the specific tool names ('Reek', 'Flog') are not, by themselves, very helpful for navigation. As a result, we'll be increasingly highlighting their function. For example, even if you aren't familiar with Flog, we'll make it obvious that it is a tool for measuring complexity.</p>
<p>We're considering eventually merging tools that have a similar function. So instead of going to two different pages for Reek and Roodi results, we might just have a 'code smells' report. Similarly, Flog and Saikuro might be presented within the same page. Would this be helpful?</p>
<p>To be clear, it isn't our intention to obscure the fact that Caliper is built on great tools like metric_fu, Reek, Flog, etc. We will still make it easy to understand where the data is coming from and highlight the work being done by the dedicated open-source developers who write them. However, we think that grouping by function will make Caliper easier to use and understand.</p>
<p>Did you know that you can set up Caliper to automatically generate metrics using GitHub post-receive hooks? Did you know that, by default, up to 15 of your latest commits are automatically run through Caliper when you set up a project? Or that with one click, you can generate metrics for up to 40 commits throughout the history of your project?</p>
<p>Many users don't know this, because our UI for these features is currently pretty terrible. The last task in the current batch of work will be to make these features more visible and easier to use. Our goal is to make it simple to see trends in your project over time.</p>
<p>(Incidentally, many users also don't know that you can view a <a href="http://getcaliper.com/caliper/revision?previous_revision=e14c700b1814540fb70702cead90e222eedfd6a8&#038;repo=git%3A%2F%2Fgithub.com%2Fsinatra%2Fsinatra.git&#038;revision=e20797047d0f0de925810892942411e27ea9cf19">metrics diff</a> for two commits to see how a commit has changed the metrics, but making this more noticeable may or may not get tackled in the first set of changes). </p>
<p>What's next for Caliper after we complete these changes? We're currently talking to users about what features and improvements matter most to them. One possibility is to display some or all of our metric data directly on a view of source code itself, so you don't have to open up an editor (or click through to GitHub) to see the code. How important is this feature to you?</p>
<p>As always, feedback from our users is hugely helpful. If you have ideas about features that you'd like to see, please let us know in the comments or start a discussion at our <a href="http://support.getcaliper.com">support site</a>. Thanks!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/01/upcoming-improvements-for-caliper/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Churn, a gem for class and method level churn rates</title>
		<link>http://devver.net/blog/2010/01/churn-a-gem-for-class-and-method-level-churn-rates/</link>
		<comments>http://devver.net/blog/2010/01/churn-a-gem-for-class-and-method-level-churn-rates/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 22:30:01 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1692</guid>
		<description><![CDATA[There are many metrics that can help identify potentially problematic code. One metric that has a high correlation with buggy code is high-churn code. 
Code churn metrics were found to be among the most highly correlated with problem reports
-- Predicting Bugs from History, Microsoft Research
Through metric_fu, Ruby devs have had access to information about high-churn [...]]]></description>
			<content:encoded><![CDATA[<p>There are many metrics that can help identify potentially problematic code. One metric that has a high correlation with buggy code is high-churn code. </p>
<blockquote style="font-style: italic; padding: 0em 2em;"><p>Code churn metrics were found to be among the most highly correlated with problem reports</p></blockquote>
<p>-- <a href="http://www.springer.com/cda/content/document/cda_downloaddocument/9783540764397-c1.pdf?SGWID=0-0-45-515407-p173780334">Predicting Bugs from History, Microsoft Research</a></p>
<p>Through <a href="http://metric-fu.rubyforge.org/">metric_fu</a>, Ruby devs have had access to information about high-churn files, but that is a bit too high level. Often with Rails apps the few controllers you have bubble up to the top, as do your most commonly edited model files. Often this isn't because old code is being modified and fixes being applied, often it is new features and methods are being added. What you really want to find is the classes and methods that seem to require updates every time the code is changed. Often this means a method needs to be refactored as it is doing too much, and is tightly coupled with many other parts of the code. If code is changing to often it is likely to be violating the <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Single Responsibility Principle</a>.</p>
<blockquote style="font-style: italic; padding: 0em 2em;"><p>Martin defines a responsibility as a reason to change, and concludes that a class or module should have one, and only one, reason to change.</p></blockquote>
<p> -- <a href="http://en.wikipedia.org/wiki/Single_responsibility_principle">Wikipedia, Single Responsibility Principle</a></p>
<p>In our own projects we have noticed this and sometimes recognized the problem. Often this leads to a bit of refactoring which separates the code in more logical and easier to debug and test pieces. Often though we haven't noticed until many bugs keep popping up in the same area of the application. If there were a tool to identify these areas of the code base before a single person on the team notices the problem that would be great. Well, now with our <a href="http://github.com/danmayer/churn">Churn</a> gem you can.</p>
<p>Churn analyzes each commit to your Git repo and notes which files, classes, and methods were changed. If you run Churn over a series of commits it will begin to build up a list of the highest churn classes and methods (it can always give you the high-churn files, since it can get that straight from Git log with no analysis). Currently the gem is just set up to output the information to the command line. Once we finish up a bit more testing it will be integrated into metric_fu, as well as <a href="http://getcaliper.com">Caliper</a>. On Caliper it will be easy to go back and generate the current high-churn methods and classes for the projects history.</p>
<p>Give it a shot on your projects, and let me know if there are any feature requests, bugs, or problems. I hope this helps identify some places you can improve your projects.</p>
<p>Instructions:</p>
<pre class="brush: text;">&gt; gem install churn
&gt; cd PROJECT_ROOT_DIRECTORY
&gt; churn</pre>
<p>example output:</p>
<pre class="brush: text;">
**********************************************************************
* Revision Changes
**********************************************************************
files:
 * &quot;lib/churn/churn_calculator.rb&quot;

classes:
 * {&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}

methods:
 * {&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#calculate_revision_data&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}
 * {&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#filters&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}
 * {&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#display_array&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}
 * {&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#initialize&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}
**********************************************************************
* Project Churn
**********************************************************************
files:
 * {:file_path=&gt;&quot;lib/churn/churn_calculator.rb&quot;, :times_changed=&gt;13}
 * {:file_path=&gt;&quot;README.rdoc&quot;, :times_changed=&gt;7}
 * {:file_path=&gt;&quot;lib/tasks/churn_tasks.rb&quot;, :times_changed=&gt;6}
 * {:file_path=&gt;&quot;Rakefile&quot;, :times_changed=&gt;5}
 * {:file_path=&gt;&quot;VERSION&quot;, :times_changed=&gt;4}
 * {:file_path=&gt;&quot;lib/churn/git_analyzer.rb&quot;, :times_changed=&gt;4}
 * {:file_path=&gt;&quot;test/test_helper.rb&quot;, :times_changed=&gt;4}
 * {:file_path=&gt;&quot;test/unit/churn_calculator_test.rb&quot;, :times_changed=&gt;3}
 * {:file_path=&gt;&quot;test/churn_test.rb&quot;, :times_changed=&gt;3}

classes:
 * {&quot;klass&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;9}
 * {&quot;klass&quot;=&gt;{&quot;klass&quot;=&gt;&quot;LocationMapping&quot;, &quot;file&quot;=&gt;&quot;lib/churn/location_mapping.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;klass&quot;=&gt;{&quot;klass&quot;=&gt;&quot;GitAnalyzer&quot;, &quot;file&quot;=&gt;&quot;lib/churn/git_analyzer.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;klass&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnTest&quot;, &quot;file&quot;=&gt;&quot;test/churn_test.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;klass&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculatorTest&quot;, &quot;file&quot;=&gt;&quot;test/unit/churn_calculator_test.rb&quot;}, &quot;times_changed&quot;=&gt;1}

methods:
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#initialize&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;3}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#to_h&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;3}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#analyze&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;2}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#report&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;2}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#display_array&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;2}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#calculate_revision_data&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;2}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#emit&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#calculate_revision_changes&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#get_changes&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#calculate_changes!&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;ChurnCalculator&quot;, &quot;method&quot;=&gt;&quot;ChurnCalculator#set_source_control&quot;, &quot;file&quot;=&gt;&quot;lib/churn/churn_calculator.rb&quot;}, &quot;times_changed&quot;=&gt;1}
 * {&quot;method&quot;=&gt;{&quot;klass&quot;=&gt;&quot;GitAnalyzer&quot;, &quot;method&quot;=&gt;&quot;GitAnalyzer#date_range&quot;, &quot;file&quot;=&gt;&quot;lib/churn/git_analyzer.rb&quot;}, &quot;times_changed&quot;=&gt;1}
</pre>
<p>Visit <a href="http://github.com/danmayer/churn">Churn on github</a>, and view the current <a href="http://getcaliper.com/caliper/project?repo=git://github.com/danmayer/churn.git">Churn metrics</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/01/churn-a-gem-for-class-and-method-level-churn-rates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shutting down the Devver Test Accelerator</title>
		<link>http://devver.net/blog/2010/01/shutting-down-the-devver-test-accelerator/</link>
		<comments>http://devver.net/blog/2010/01/shutting-down-the-devver-test-accelerator/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 21:17:57 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Devver]]></category>
		<category><![CDATA[Accelerator]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[lessons]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1674</guid>
		<description><![CDATA[After much deliberation, we've decided to shut down our Test Accelerator product on January 22nd, 2010. (the Accelerator was previously just known as "Devver", but to clarify between our old product and Caliper, we're referring to it as the "Accelerator" or the "Test Accelerator").
This has been a difficult decision for us. Understandably, some people have [...]]]></description>
			<content:encoded><![CDATA[<p>After much deliberation, we've decided to shut down our Test Accelerator product on January 22nd, 2010. (the Accelerator was previously just known as "Devver", but to clarify between our old product and <a href="http://getcaliper.com">Caliper</a>, we're referring to it as the "Accelerator" or the "Test Accelerator").</p>
<p>This has been a difficult decision for us. Understandably, some people have been confused and disappointed by this news, so I wanted to take some time to explain our decision.</p>
<p>For over a year, we worked to build our vision of accelerated Ruby testing in the cloud. We made our share of mistakes and learned a lot in the process. Ultimately, we found the demand was too small to warrant overcoming all the technical challenges that were harder than we anticipated.</p>
<p>We had many different technical challenges, but it boils down to this: we underestimated the difficulty of making it simple to run Ruby/Rails tests in the cloud.</p>
<p>When we began working on the Accelerator, we knew we would need many features: automatic installation of gems, automatic setup of common databases, and support for Test:Unit, Shoulda, and RSpec. However, other features caught us by surprise. For instance, many projects required running daemons, such as memcached or Solr to be running when the tests executed. Also, it was common for projects to work fine on a user's machine, but fail in the cloud due to undeclared RubyGem dependencies (or dependencies that lacked sufficient version information). Some problems were extra difficult because, due to costs, we needed to be able to run many projects on a single EC2 instance (and it's currently not possible to create virtual machines within EC2 Xen instances).</p>
<p>We worked hard to overcome these challenges, but it was still too common for users to discover that running tests in the cloud required additional work on their part (or, in some cases, that their project was not supported). And even worse, users had to jump through these hoops <em>before</em> they could assess whether or not the Accelerator would speed up their tests enough to make the process worth it. Because the potential benefit and possible configuration time were both unknown, many users understandably gave up before they experienced the time savings of running tests in parallel. And unfortunately, the projects that were most likely to need acceleration (those with large test suites), were also the most likely to have complex dependencies and require the most setup work. </p>
<p>While we may have been able to solve these problems with a lot of additional engineering, we also found that only a small percentage of teams really needed test acceleration. Some teams loved our solution, because they had test suites that took 10, 20, or even 45 minutes to run. However, most projects had smaller test suites. We found that many teams didn't mind waiting for suites that took 3-5 minutes (or, more accurately, didn't mind enough to justify the considerable time investment of setting up tests on the Accelerator).</p>
<p>So, after much discussion, we decided that we needed to create a product that would help a larger set of Ruby teams and require significantly less setup to provide value. Those discussions led to <a href="http://getcaliper.com">Caliper</a>, a tool to identify risky code and technical debt in Ruby code.</p>
<p>Focus is key in a startup, especially a small one like ours. While we considered keeping the Accelerator running in maintenance mode, we realized we could not provide the level of support our users deserve while executing effectively on Caliper. As a result, we've decided to shut down the Accelerator indefinitely. </p>
<p>We deeply appreciate each and every person who helped us with the Accelerator, either by using it, or giving us ideas, feedback, and encouragement. We could not have gotten as far as we did without the help from users, friends, and mentors.</p>
<p>It pains us to shut down the service and we apologize for any inconvenience this causes our users. We hope that you understand our decision and we look forward to helping you improve your code with <a href="http://getcaliper.com">Caliper</a>.</p>
<p>(Accelerator users: if you need to speed up your tests, here are some possible alternatives to Devver: <a href="http://github.com/ngauthier/multitest">multitest</a>, <a href="http://github.com/jasonm/parallel_specs">parallel_specs</a>, <a href="http://github.com/brynary/testjour/">Testjour</a>, and <a href="http://github.com/qxjit/deep-test">DeepTest</a>. I don't have experience with these tools, so I can't comment on how well they work myself, but you may want to check them out.)</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2010/01/shutting-down-the-devver-test-accelerator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Playing with Processing, Making Snow</title>
		<link>http://devver.net/blog/2009/12/playing-with-processing-making-snow/</link>
		<comments>http://devver.net/blog/2009/12/playing-with-processing-making-snow/#comments</comments>
		<pubDate>Thu, 24 Dec 2009 03:16:19 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1659</guid>
		<description><![CDATA[What is Processing? 
"Processing is an open source programming language and environment for people who want to program images, animation, and interactions."
 -Processing.org
I wanted to play around with doing some visual programming and had played with Processing in the past. I recently had been reading about Ruby-Processing and wanted to give it a shot. First, [...]]]></description>
			<content:encoded><![CDATA[<p>What is Processing? </p>
<p>"Processing is an open source programming language and environment for people who want to program images, animation, and interactions."<br />
 -<a href='http://processing.org/'>Processing.org</a></p>
<p>I wanted to play around with doing some visual programming and had played with Processing in the past. I recently had been reading about <a href="http://ashkenas.com/codework/ruby-processing.html">Ruby-Processing</a> and wanted to give it a shot. First, I went to look for some Ruby-Processing tutorials, and I had recently heard about the presentation by Jeff Casimir about the '<a href='http://rubyconf2009.confreaks.com/19-nov-2009-11-15-code-of-art-jeff-casimir.html'>Art of Code</a>' (<a href='http://www.meetup.com/dcruby/messages/8233735/'>slides and code</a>), using Ruby-Processing. I went through those examples and decided I wanted to modify it to display snowflakes in the spirit of winter. After a bit of searching I found a project that <a href='http://learning-ruby-processing.blogspot.com/2009/11/penrose-snowflake-l-systems-using-ruby.html'>generated a Penrose snow flake</a> using Ruby-Processing. I figured I could modify the programs to get a nice snow flake screen saver type app. The result is my app <a href='http://github.com/danmayer/Processing-Snow'>Processing-Snow</a>, and is shown in the screen shot below.</p>
<div id="attachment_1661" class="wp-caption alignnone" style="width: 1290px"><a href="http://devver.net/blog/wp-content/uploads/2009/12/frame12061.jpg"><img src="http://devver.net/blog/wp-content/uploads/2009/12/frame12061.jpg" alt="Processing-Snow" title="frame12061" width="600" /></a><p class="wp-caption-text">Processing-Snow</p></div>
<p>Playing around with Ruby-Processing is a lot of fun, I highly recommend spending a couple hours to make a tiny app. I built my Snow app in about an hour and a half. Then I spent a bit of time using <a href='http://getcaliper.com'>Caliper</a> to improve the metrics. For such a small project there wasn't a lot to improve, but it still helped me to do some refactoring. To get an idea of the code you can view <a href="http://getcaliper.com/caliper/project?repo=git://github.com/danmayer/Processing-Snow.git">Processing-Snow's Metrics</a>.</p>
<p>Feel free to fork <a href='http://github.com/danmayer/Processing-Snow'>Processing-Snow</a> on GitHub and read about how to run it with in the projectss README.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/12/playing-with-processing-making-snow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making Rack::Reloader work with Sinatra</title>
		<link>http://devver.net/blog/2009/12/making-rackreloader-work-with-sinatra/</link>
		<comments>http://devver.net/blog/2009/12/making-rackreloader-work-with-sinatra/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 22:20:55 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Rack::Reloader]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1644</guid>
		<description><![CDATA[According to the Sinatra FAQ, source reloading was taken out of Sinatra in version 0.9.2 due to "excess complexity" (in my opinion, that's a great idea, because it's not a feature that needs to be in minimal a web framework like Sinatra). Also, according to the FAQ, Rack::Reloader (included in Rack) can be added to [...]]]></description>
			<content:encoded><![CDATA[<p>According to the <a href="http://www.sinatrarb.com/faq.html#reloading">Sinatra FAQ</a>, source reloading was taken out of Sinatra in version 0.9.2 due to "excess complexity" (in my opinion, that's a great idea, because it's not a feature that needs to be in minimal a web framework like Sinatra). Also, according to the FAQ, <a href="http://rack.rubyforge.org/doc/classes/Rack/Reloader.html">Rack::Reloader</a> (included in <a href="http://rack.rubyforge.org/">Rack</a>) can be added to a Sinatra application to do source reloading, so I decided to try it out. </p>
<p>Setting up Rack::Reloader is easy:</p>
<pre class="brush: ruby;">
require 'sinatra'
require 'rack'

configure :development do
  use Rack::Reloader
end

get &quot;/hello&quot; do
  &quot;hi!&quot;
end
</pre>
<pre class="brush: text;">
$ ruby hello.rb
== Sinatra/0.9.4 has taken the stage on 4567 for development with backup from Thin
&gt;&gt; Thin web server (v1.2.4 codename Flaming Astroboy)
&gt;&gt; Maximum connections set to 1024
&gt;&gt; Listening on 0.0.0.0:4567, CTRL+C to stop
[on another terminal]
$ curl http://localhost:4567/hello
hi!
</pre>
<p>If you add another route, you can access it without restarting Sinatra:</p>
<pre class="brush: ruby;">
get &quot;/goodbye&quot; do
  &quot;bye!&quot;
end
</pre>
<pre class="brush: text;">
$ curl http://localhost:4567/goodbye
bye!
</pre>
<p>But what happens when you <em>change</em> the contents of a route? </p>
<pre class="brush: ruby;">
get &quot;/hello&quot; do
  &quot;greetings!&quot;
end
</pre>
<pre class="brush: text;">
$ curl http://localhost:4567/hello
hi!
</pre>
<p>You still get the old value! What is going on here?</p>
<p>Rack::Reloader simply looks at all files that have been required and, if they have changed on disk, re-requires them. So each Sinatra route is re-evaluated when a reload happens.</p>
<p>However, identical Sinatra routes do NOT override each other. Rather, the first route that is evaluated is used (more precisely, all routes appended to a list and the first matching one is used, so additional identical routes are never run). </p>
<p>We can see this with a simple example:</p>
<pre class="brush: ruby;">
require 'sinatra'

get &quot;/foo&quot; do
 &quot;foo&quot;
end

get &quot;/foo&quot; do
 &quot;bar&quot;
end
</pre>
<pre class="brush: text;">
$ curl http://localhost:4567/foo
foo   # The result is 'foo', not 'bar'
</pre>
<p>Clearly, Rack::Reloader is not very useful if you can't change the contents of any route. The solution is to throw away the old routes when the file is reloaded using <code>Sinatra::Application.reset!</code>, like so:</p>
<pre class="brush: ruby;">
configure :development do
  Sinatra::Application.reset!
  use Rack::Reloader
end
</pre>
<pre class="brush: text;">
$ curl http://localhost:4567/hello
greetings!
</pre>
<p>Success!</p>
<p>A word of caution: you MUST call <code>reset!</code> very early in your file - before you add any middleware, do any other configuration, or add any routes.</p>
<p>This method has worked well enough for our Sinatra application. However, code reloading is always tricky and is bound to occasionally produce some weird results. If you want to significantly reduce the chances for strange bugs (at the expense of code loading time), try <a href="http://rtomayko.github.com/shotgun/">Shotgun</a> or <a href="http://github.com/alexch/rerun">Rerun</a>. Happy reloading!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/12/making-rackreloader-work-with-sinatra/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Caliper: Next Steps</title>
		<link>http://devver.net/blog/2009/11/caliper-next-steps/</link>
		<comments>http://devver.net/blog/2009/11/caliper-next-steps/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 23:57:47 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Devver]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[survey]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1630</guid>
		<description><![CDATA[We released the first version of Caliper just under two months ago. Since then, we've fixed bugs, made improvements, and rolled out new features. The feedback we've gotten from the community has been encouraging and your suggestions have helped up improve Caliper each week.
Initially, we simply wanted to take an existing tool (namely, metric_fu) and [...]]]></description>
			<content:encoded><![CDATA[<p>We released the first version of <a href="http://devver.net/caliper">Caliper</a> just under two months ago. Since then, we've fixed bugs, made improvements, and rolled out new features. The feedback we've gotten from the community has been encouraging and your suggestions have helped up improve Caliper each week.</p>
<p>Initially, we simply wanted to take an existing tool (namely, <a href="http://metric-fu.rubyforge.org/">metric_fu</a>) and make it dead simple to set up, so that all open-source projects could get access to metric data. However, our larger goal is to improve the usability, features, and data presentation in Caliper so it becomes an indispensable part of your regular Ruby development process.</p>
<p>To that end, I'm happy to announce that support for private projects is on the road map. We're still working out the details, but we plan to release this feature within the next thirty days.</p>
<p>At the same time, we'll work with users to figure out how we can make metrics useful enough to be a regular part of your process (by "regular", we mean that we hope you use metrics at least once a week).</p>
<p>We recently put out a <a href="http://www.surveygizmo.com/s/206800/caliper-features-survey">short survey</a> (<a href="http://app.sgizmo.com/reports/53602/205892/6TJHFDWC624UBESVZDN03VP15CXXB5/?ts=1259104858">results here</a>) to try to assess what features are most important for our users. By looking at the results (somewhat limited, likely due to overly wordy questions on my part) and based on some conversations I had at RubyConf, we see a few possible scenarios for where to take Caliper next.</p>
<p><strong><em>"Code exploration"</em></strong><br />
In this scenario, you'd primarily use Caliper to jump into an existing code base, in order to help you better understand where the problematic areas are. This might be used by consultants for a project-level code review, for understanding how to start contributing to an open-source project, or even to periodically do a survey of problems of your own project. The primary features for this scenario would be our Hot Spots feature (which list the worst methods, classes, and files in the project). Important new features include a display that shows the source code with the problems displayed alongside the source.</p>
<p><strong><em>"Quality monitoring"</em></strong><br />
In this scenario, the primary usage for Caliper is to set and maintain certain metrics thresholds within your code base. You'd set levels for the various tools and then get alerts when those thresholds are reached. Key features would include an ability to customize thresholds for each tool, a dashboard that displays offending classes and methods, and customizable notifications.</p>
<p><strong><em>"Refactoring assistant"</em></strong><br />
In this scenario, a single developer uses Caliper to assist them in refactoring up his/her code, perhaps after reviewing a commit that will be pushed, or because a specific section of code is known to be overly complex. Caliper would both find the biggest problems and provide feedback on how refactorings change the metrics. Key features would include an improved commit-based view of metric changes as well as the ability to push code directly to Caliper before merge that code into a shared 'master' branch.</p>
<p>Do any of these scenarios resonate with you? Would you prefer one over another? Is there another scenario that would be more useful? If you are currently using metrics in your project, how do you use them and what features do you want? If you don't currently use metrics, what features would make you change your mind? Please make your voice heard in the comments, so we can make Caliper a valuable addition to your toolbox.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/11/caliper-next-steps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing Caliper Community Statistics</title>
		<link>http://devver.net/blog/2009/11/announcing-caliper-community-statistics/</link>
		<comments>http://devver.net/blog/2009/11/announcing-caliper-community-statistics/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 15:37:31 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[caliper]]></category>
		<category><![CDATA[metrics]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1599</guid>
		<description><![CDATA[For the past few months, we've been building Caliper to help you easily generate code metrics for your Ruby projects. We've recently added another dimension of metrics information: community statistics for all the Ruby projects that are currently in Caliper. 
The idea of community statistics is two-fold. From a practical perspective, you can now compare [...]]]></description>
			<content:encoded><![CDATA[<p>For the past few months, we've been building <a href="http://devver.net/caliper">Caliper</a> to help you easily generate code metrics for your Ruby projects. We've recently added another dimension of metrics information: <a href="http://devver.net/caliper/community">community statistics</a> for all the Ruby projects that are currently in Caliper. </p>
<p>The idea of community statistics is two-fold. From a practical perspective, you can now compare your project's metrics to the community. For example, Flog measures the complexity of methods. Many people wonder exactly defines a good Flog score for an individual method. In <a href="http://jakescruggs.blogspot.com/2008/08/whats-good-flog-score.html">Jake Scruggs' opinion</a>, a score of 0-10 is "Awesome", while a score of 11-20 is "Good enough". That sounds correct, but with Caliper's community metrics, we can also compare the <a href="http://devver.net/caliper/community#flog"><em>average</em> Flog scores</a> for entire projects to see what defines a good average score.</p>
<p>To do so, we calculate the average Flog method score for each project and plot those averages on a histogram, like so:</p>
<p><a href="http://devver.net/caliper/community#flog"><img src="http://devver.net/blog/wp-content/uploads/2009/11/flog_average_method_histogram.jpg" alt="flog_average_method_histogram" title="flog_average_method_histogram" width="600" class="aligncenter size-full wp-image-1603" /><br />
</a><br />
Looking at the data, we see that a lot of projects have an average Flog score between 6 and 12 (the mean is 10.3 and the max is is 21.3).</p>
<p>If your project's average Flog score is 9, does that mean it has only "Awesome" methods, Flog-wise? Well, remember that we're looking at the <em>average</em> score for each project. I suspect that in most projects, lots of tiny methods are pulling down the average, but there are still plenty of big, nasty methods. It would be interesting to look at the community statistics for maximum Flog score per project or see a histogram of the Flog scores for all methods across all projects (watch this space!).</p>
<p>Since several of the metrics (like Reek, which detects code smells) have scores that grow in proportion to the number of lines of code, we divide the raw score by each project's lines of code. As a result, we can sensibly compare your project to other projects, no matter what the difference in size.</p>
<p>The second reason we're calculating community statistics is so we can discover trends across the Ruby community. For example, we can compare the <a href="http://devver.net/caliper/community#stats">ratio of lines of application code to test code</a>. It's interesting to note that a significant portion of projects in Caliper have no tests, but that, for the projects that do have tests, most of them have a code:test ratio in the neighborhood of 2:1.</p>
<p><a href="http://devver.net/caliper/community#stats"><img src="http://devver.net/blog/wp-content/uploads/2009/11/code_to_test_ratio_histogram.jpg" alt="code_to_test_ratio_histogram" title="code_to_test_ratio_histogram" width="600" class="aligncenter size-full wp-image-1604" /><br />
</a><br />
Other interesting observations from our initial analysis:<br />
* A lot of projects (mostly small ones) have <a href="http://devver.net/caliper/community#flay">no Flay duplications</a>.<br />
* Many smaller projects have <a href="http://devver.net/caliper/community#reek">no Reek smells</a>, but the average project has about 1 smell per 9 lines of code.</p>
<p>Want to do your own analysis? We've built a <a href="http://devver.net/caliper/scatter_community">scatter plotter</a> so you can see if any two metrics have any correlation. For instance, note the <a href="http://devver.net/caliper/scatter_community?x_tool=flog&#038;y_tool=reek&#038;x_value=total_score&#038;y_value=total_code_smells">correlation between code complexity and code smells</a>.</p>
<p>Here's a scatter plot of that data (zoomed in):</p>
<p><a href="http://devver.net/caliper/scatter_community?x_tool=flog&#038;y_tool=reek&#038;x_value=total_score&#038;y_value=total_code_smells"><img src="http://devver.net/blog/wp-content/uploads/2009/11/scatter_plot.jpg" alt="scatter_plot" title="scatter_plot" width="600" class="aligncenter size-full wp-image-1624" /></a></p>
<p>Over the coming weeks, we'll improve the graphs we have and add new graphs that expose interesting trends. But we need your help! Please let us know if you spot problems, have ideas for new graphs, or have any questions. Additionally, please add your project to <a href="http://devver.net/caliper">Caliper</a> so it can be included in our community statistics. Finally, feel free to grab the raw stats from our alpha API* and play around yourself!</p>
<p>* Quick summary: <code>curl http://api.devver.net/metrics</code> for JSON, <code>curl -H 'Accept:text/x-yaml' http://api.devver.net/metrics</code> for YAML. <a href="http://gist.github.com/227163">More details</a>. API is under development, <a href="http://support.devver.net/discussions/suggestions#new_topic_form">so please send us feedback</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/11/announcing-caliper-community-statistics/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
