<?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/" 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>
	<pubDate>Thu, 09 Jul 2009 20:08:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</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/devver/blog" type="application/rss+xml" /><item>
		<title>Screencast: Setting up Devver on a non-Rails project</title>
		<link>http://devver.net/blog/2009/07/screencast-setting-up-devver-on-a-non-rails-project/</link>
		<comments>http://devver.net/blog/2009/07/screencast-setting-up-devver-on-a-non-rails-project/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 20:02:45 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Devver]]></category>

		<category><![CDATA[DataMapper]]></category>

		<category><![CDATA[howot]]></category>

		<category><![CDATA[screencast]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1342</guid>
		<description><![CDATA[In order to show how easy it is to configure Devver for a project, we've made a short screencast to walk you through the steps. We've used DataMapper as an example application. As you can see, it only takes a few minutes to set up Devver and then the specs complete in a fraction of [...]]]></description>
			<content:encoded><![CDATA[<p>In order to show how easy it is to configure Devver for a project, we've made a short screencast to walk you through the steps. We've used DataMapper as an example application. As you can see, it only takes a few minutes to set up Devver and then the specs complete in a fraction of the time. In fact, the whole process - setup and Devver run - takes less time than running 'rake spec'.</p>
<p>In order to see the commands clearly, you'll want to enter full-screen mode. Or, if you prefer, you can <a href="http://devver.net/blog/wp-content/uploads/2009/07/devver_datamapper_screencast.m4v">download the high-quality version</a>.</p>
<p><object width="560" height="340" data="http://www.youtube.com/v/_X8I1uTLy00&amp;hl=en&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/_X8I1uTLy00&amp;hl=en&amp;fs=1&amp;rel=0" /><param name="allowfullscreen" value="true" /></object></p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/07/screencast-setting-up-devver-on-a-non-rails-project/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Announcments! (via video)</title>
		<link>http://devver.net/blog/2009/07/announcments-via-video/</link>
		<comments>http://devver.net/blog/2009/07/announcments-via-video/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 23:25:36 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Devver]]></category>

		<category><![CDATA[announcments]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1337</guid>
		<description><![CDATA[Our friend Andrew Hyde recently helped us film a short video of us announcing some of the recent developments here at Devver. Check it out!

Devver Announces Funding from Andrew on Vimeo.
]]></description>
			<content:encoded><![CDATA[<p>Our friend <a href="http://andrewhyde.net/">Andrew Hyde </a>recently helped us film a short video of us announcing some of the recent developments here at Devver. Check it out!</p>
<p><object width="400" height="225" data="http://vimeo.com/moogaloop.swf?clip_id=5513401&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"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=5513401&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /></object></p>
<p><a href="http://vimeo.com/5513401">Devver Announces Funding</a> from <a href="http://vimeo.com/andrewhyde">Andrew</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/07/announcments-via-video/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Devver adds Postgres and SQLite database support</title>
		<link>http://devver.net/blog/2009/07/devver-adds-postgres-and-sqlite-database-support/</link>
		<comments>http://devver.net/blog/2009/07/devver-adds-postgres-and-sqlite-database-support/#comments</comments>
		<pubDate>Mon, 06 Jul 2009 19:24:15 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Devver]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1326</guid>
		<description><![CDATA[We are working hard to quickly expand our compatibility on Ruby projects. With that goal driving us, we are happy to announce support for Postgres and SQLite databases. With the addition of these database options, along with our existing support for MySQL, Devver now supports all of the most popular databases commonly used with Ruby. [...]]]></description>
			<content:encoded><![CDATA[<p>We are working hard to quickly expand our compatibility on Ruby projects. With that goal driving us, we are happy to announce support for <a href="http://www.postgresql.org/">Postgres</a> and <a href="http://www.sqlite.org/">SQLite</a> databases. With the addition of these database options, along with our existing support for <a href="http://www.mysql.com">MySQL</a>, Devver now supports all of the most popular databases commonly used with Ruby. These three databases are the default databases tested against ActiveRecord and we expect will cover the majority of the Ruby community.</p>
<p>To begin working with Postgres or SQLite on Devver all you need to do is have a database.yml with the test environment set to the adapter of your choice. If we don't support your favorite database, you can still <a href="http://devver.list-manage.com/subscribe?u=6c02b2dd047356eb15f0d9905&amp;id=0c5a78df69&amp;group[2]=1">request a beta invite</a> and let us know which database you want us to support. If we just added support for your database, perhaps we can speed up your project on Devver, so <a href="http://devver.list-manage.com/subscribe?u=6c02b2dd047356eb15f0d9905&amp;id=0c5a78df69&amp;group[2]=1">request a beta invite</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/07/devver-adds-postgres-and-sqlite-database-support/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A dozen (or so) ways to start sub-processes in Ruby: Part 1</title>
		<link>http://devver.net/blog/2009/06/a-dozen-or-so-ways-to-start-sub-processes-in-ruby-part-1/</link>
		<comments>http://devver.net/blog/2009/06/a-dozen-or-so-ways-to-start-sub-processes-in-ruby-part-1/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 15:57:19 +0000</pubDate>
		<dc:creator>Avdi</dc:creator>
		
		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Tips & Tricks]]></category>

		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1291</guid>
		<description><![CDATA[Introduction
It is often useful in Ruby to start a sub-process to run a particular chunk of Ruby code.  Perhaps you are trying to run two processes in parallel, and Ruby's green threading doesn't provide sufficient concurrency.  Perhaps you are automating a set of scripts.  Or perhaps you are trying to isolate some [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>It is often useful in Ruby to start a sub-process to run a particular chunk of Ruby code.  Perhaps you are trying to run two processes in parallel, and Ruby's green threading doesn't provide sufficient concurrency.  Perhaps you are automating a set of scripts.  Or perhaps you are trying to isolate some untrusted code while still getting information back from it.</p>
<p>Whatever the reason, Ruby provides a wealth of facilities for interacting with sub-processes, some better known than others.  In this series of articles I will be focusing on running Ruby as a sub-process of Ruby, although many of the techniques I'll be demonstrating are applicable to running any type of program in a sub-process.   I'll also be keeping the focus on UNIX-style platforms, such as Linux and Mac OS X.  Sub-process handling on Windows differs significantly, and we'll leave that for another series.</p>
<p>In the first and second articles, I'll demonstrate some of the facilities for starting sub-processes that Ruby possesses out-of-the-box, no<code> require</code>s needed.  In the third article we'll look at some tools provided in Ruby's Standard Library which build on the methods introduced in part one.  And in the fourth instalment I'll briefly survey a few of the many Rubygems which simplify sub-process interactions.</p>
<h3>Getting Started</h3>
<p>To begin, let's define a few helper methods and constants which we'll refer back to throughout the series.  First, let's define a simple method which will serve as our "slave" code - the code we want to execute in a sub-process.  Here it is:</p>
<p><code></p>
<pre class="brush: ruby;">
def hello(source, expect_input)
  puts &quot;[child] Hello from #{source}&quot;
  if expect_input
    puts &quot;[child] Standard input contains: \&quot;#{$stdin.readline.chomp}\&quot;&quot;
  else
    puts &quot;[child] No stdin, or stdin is same as parent's&quot;
  end
  $stderr.puts &quot;[child] Hello, standard error&quot;
end
</pre>
<p></code><br />
(Note: The full source code for this article can be found at <a href="http://gist.github.com/137705">http://gist.github.com/137705</a>)</p>
<p>This method prints a message to the standard output stream, a message to the standard error stream, and optionally reads and prints a message from the standard input stream.  One of the things we'll be exploring in this series is the differing ways in which the various sub-process-starting methods handle standard I/O streams.</p>
<p>Next, let's define a couple of helpful constants.</p>
<pre class="brush: ruby;">
require 'rbconfig'
THIS_FILE = File.expand_path(__FILE__)

RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
</pre>
<p>The first, <code>THIS_FILE</code>, is simply the fully-qualified name of the file containing our demo source code.  <code>RUBY</code>, the second constant, is set to the fully-qualified path of the running Ruby executable. These constants will come in handy with sub-process methods which require an explicit shell command to be run.</p>
<p>In order to make the order of events clearer, we'll force the standard output stream into synchronised mode.  This will cause it to flush its buffer after every write.</p>
<pre class="brush: ruby;">$stdout.sync = true</pre>
<p>Finally, we'll be surrounding all of the code which follows in the following protective IF-statement:</p>
<pre class="brush: ruby;">
if $PROGRAM_NAME == __FILE__
# ...
end
</pre>
<p>This will ensure that the demo code won't be re-executed when we <code>require</code> the source file within sub-processes.</p>
<h3>Method #1: The Backtick Operator</h3>
<p>The simplest way to execute a sub-process in Ruby is with the backtick (<code>`</code>).  This method, which harks back to Bourne Shell scripting and Perl, is concise and often gives us exactly as much interaction as we need with a sub-process.  The backtick, while it may look like a part of Ruby's core syntax, is technically an operator defined by <code>Kernel</code>.  Like most Ruby operators it can be redefined in your own code, although that's beyond the scope of this article.  <code>Kernel</code> defines the backtick operator as a method which executes its argument in a subshell.</p>
<p><code></p>
<pre class="brush: ruby;">
puts &quot;1. Backtick operator&quot;
output = `#{RUBY} -r#{THIS_FILE} -e'hello(&quot;backticks&quot;, false)'`
output.split(&quot;\n&quot;).each do |line|
  puts &quot;[parent] output: #{line}&quot;
end
puts
</pre>
<p></code></p>
<p>Here, we use backticks to execute a child Ruby process which loads our demo source code and executes the <code>hello</code> method.  This yields:</p>
<pre class="brush: plain;">
1. Backtick operator
[child] Hello, standard error
[parent] output: [child] Hello from backticks
[parent] output: [child] No stdin, or stdin is same as parent's
</pre>
<p>The backtick operator doesn't return until the command has finished. The sub-process inherits its standard input and standard error streams from the parent process.  The process' ending status is made available as a <a href="http://www.ruby-doc.org/core/classes/Process/Status.html"><code>Process::Status</code></a> object in the <code>$?</code> global (aka <code>$CHILD_STATUS</code> if the <a href="http://www.ruby-doc.org/stdlib/libdoc/English/rdoc/index.html">English</a> library is loaded).</p>
<p>We can use the <code>%x</code> operator as an alternate syntax for backticks, which enables us to select arbitrary delimiters for the command string.  E.g. <code>%x{echo `which cowsay`}</code>.</p>
<h3>Method #2: Kernel#system</h3>
<p><code>Kernel#system</code> is similar to the backtick operator in operation, with one important difference.  Where the backtick operator returns the STDOUT of the finished command, <code>system</code> returns a Boolean value indicating the success or failure of the command.  If the command exits with a zero status (indicating success), <code>system</code> will return <code>true</code>.  Otherwise it returns false.</p>
<pre class="brush: ruby;">
puts &quot;2. Kernel#system&quot;
success = system(RUBY, &quot;-r&quot;, THIS_FILE, &quot;-e&quot;, 'hello(&quot;system()&quot;, false)')
puts &quot;[parent] success: #{success}&quot;
puts
</pre>
<p>This results in:</p>
<pre class="brush: plain;">
2. Kernel#system
[child] Hello from system()
[child] No stdin, or stdin is same as parent's
[child] Hello, standard error
[parent] success: true
</pre>
<p>Just like the backtick operator, <code>system</code> doesn't return until its process has exited, and leaves the process exit status in <code>$?</code>. The sub-process inherits the parent process' standard input, output, and error streams.</p>
<p>As we can see in the example above, when <code>system()</code> is given multiple arguments they are assembled into a single command for execution.  This feature can make <code>system()</code> a little more convenient than backticks for executing complex commands.  For this reason and because it's more visually apparent in the code, I prefer to use <code>Kernel#system</code> over backticks unless I need to capture the command's output.  Note that there are some other ways <code>system()</code> can be called; see the <a href="http://www.ruby-doc.org/core/classes/Kernel.html#M002529">Kernel#exec</a> documentation for the details.</p>
<h3>Method #3: Kernel#fork (aka Process.fork)</h3>
<p>Ruby provides access to the *NIX <code>fork()</code> system call via <code>Kernel#fork</code>.  On UNIX-like OSes, <code>fork</code> splits the currently executing Ruby process in two.  Both processes run concurrently and independently from that point on.  Unlike the methods we've examined so far, <code>fork</code> enables us to execute <em>in-line</em> Ruby code in a sub-process, rather than explicitly starting a new Ruby interpreter and telling it to load our code.</p>
<p>Traditionally we would need to put in some conditional code to examine the return value of <code>fork</code> and determine whether the code was executing in the parent or child process. Ruby makes it easy to specify what code should be run in the child by allowing us to pass a block to <code>fork</code>.  The contents of the block will be run in the child process, after which it will exit.  The parent will continue running at the point where the block ends.</p>
<pre class="brush: ruby;">
puts &quot;3. Kernel#fork&quot;
pid = fork do
hello(&quot;fork()&quot;, false)
end
Process.wait(pid)
puts &quot;[parent] pid: #{pid}&quot;
puts
</pre>
<p>This produces the following output:</p>
<pre class="brush: plain;">
3. Kernel#fork
[child] Hello from fork()
[child] No stdin, or stdin is same as parent's
[child] Hello, standard error
[parent] pid: 19935
</pre>
<p>Note the call to <code>Process.wait</code>.  Since the process spawned by <code>fork</code> runs concurrently with the parent process, we need to explicitly wait for the child process to finish if we want to synchronize with it.  We use the child process ID, returned by <code>fork</code>, as the argument to <code>Process.wait</code>.</p>
<p>The sub-process inherits its standard error and output streams from the parent.  Since <code>fork</code> is a *NIX-only syscall, it will only reliably work on UNIX-style systems.</p>
<h3>Conclusion</h3>
<p>In this first installment in the Ruby Sub-processes series we've looked at three of the simplest ways to start another Ruby process from inside a Ruby program.  Stay tuned for part 2, in which we'll delve into some methods for doing more complex communication with spawned sub-processes.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/06/a-dozen-or-so-ways-to-start-sub-processes-in-ruby-part-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SimpleDB DataMapper Adapter: Progress Report</title>
		<link>http://devver.net/blog/2009/06/simpledb-datamapper-adapter-progress-report/</link>
		<comments>http://devver.net/blog/2009/06/simpledb-datamapper-adapter-progress-report/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 18:27:40 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
		
		<category><![CDATA[Amazon Web Services]]></category>

		<category><![CDATA[Development]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[AWS]]></category>

		<category><![CDATA[metrics]]></category>

		<category><![CDATA[SimpleDB]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1271</guid>
		<description><![CDATA[From the beginning of Devver, we decided we wanted to work with some new technologies and we wanted to be able to scale easily. After looking at options AWS seemed to have many technologies that could help us build and scale a system like Devver. One of these technologies was SimpleDB. One of the other [...]]]></description>
			<content:encoded><![CDATA[<p>From the beginning of <a href="http://devver.net">Devver</a>, we decided we wanted to work with some new technologies and we wanted to be able to scale easily. After looking at options <a href="http://aws.amazon.com/">AWS</a> seemed to have many technologies that could help us build and scale a system like Devver. One of these technologies was <a href="http://aws.amazon.com/simpledb/">SimpleDB</a>. One of the other new things we decided to try was <a href="http://datamapper.org/doku.php">DataMapper</a> (DM) rather than the more familiar ActiveRecord. This eventually let me to work on my own <a href="http://github.com/danmayer/dm-adapter-simpledb/tree/right_aws">SimpleDB DataMapper adapter</a>.</p>
<p>Searching for ways to work with SDB using Ruby, we found a <a href="http://github.com/jeremyboles/dm-adapter-simpledb/tree/master">SimpleDB DM adapter by Jeremy Boles</a>. It worked well initially but as our needs grew (and to make it compatible with the current version of DM) it became necessary to add and update the features of the adapter. These changes lived hidden in our project's code for awhile, for no other reason than we were too lazy to really commit it all back on <a href="http://github.com">GitHub</a>. Recently though there has been a renewed interest about working with on SimpleDB with Ruby. I started pushing the code updates on GitHub, then I got a couple requests and suggestions here and there to improve the adapter. One of these suggestions cam from <a href="http://drawohara.com/">Ara Howard</a>, who is doing impressive work of his own on <a href="http://github.com/ahoward/helene/tree/master">Ruby and AWS</a>, specifically SimpleDB. His suggestion on moving from the aws_sdb gem to <a href="http://rightaws.rubyforge.org/">right_aws</a>, which along with other changes improved performance significantly (1.6x on write, up to 36x on reading large queries over the default limit of 100 objects). Besides performance improvements, we have recently added limit and sorting support to the adapter.</p>
<p><script src="http://gist.github.com/133812.js"></script></p>
<p>As I added features, testing the adapter also became slow, (over a minute a run) because the functional tests actually connect to and use SimpleDB. Since <a href="http://devver.net/documentation/performance">Devver is all about speeding up Ruby tests</a>, I decided to get the tests running on Devver. It was actually very easy and sped up the test suite from 1 minute and 8 seconds down to 28 seconds. You can check out how much <a href="http://gist.github.com/128755">Devver speeds up the results</a> yourself.</p>
<p>We are currently using the SimpleDB adapter to power our Devver.net website as well as the Devver backend service. It has been working well for us, but we know that it doesn't cover everyone's needs. Next time you are creating a simple project, give SimpleDB a look, we would love feedback about the DM adapter, and it would be great to get some other people contributing to the project. If anyone does fork my <a href="http://github.com/danmayer/dm-adapter-simpledb/tree/right_aws">SDB Adapter Github repo</a>, feel free to send me pull requests. Also, let me know if you want to try using Devver as you hack on the adapter, it can really speed up testing, and I would be happy to give out a free account.</p>
<p>Lastly, at a recent <a href="http://boulderruby.org/">Boulder Ruby users group</a> meet up, the group did a code review for the adapter. It went well and I should finish cleaning up the code and get the improvements suggested by the group committed to GitHub soon.</p>
<p>Update: The refactorings suggested at the code review are now live <a href="http://github.com/danmayer/dm-adapter-simpledb/tree/right_aws">on GitHub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/06/simpledb-datamapper-adapter-progress-report/feed/</wfw:commentRss>
		</item>
		<item>
		<title>We’re hiring!</title>
		<link>http://devver.net/blog/2009/06/were-hiring/</link>
		<comments>http://devver.net/blog/2009/06/were-hiring/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 21:05:29 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[jobs devver]]></category>

		<guid isPermaLink="false">http://devver.net/blog/2009/06/were-hiring/</guid>
		<description><![CDATA[We're looking for an awesome Ruby developer to join our team. Get more details at http://devver.net/jobs.
]]></description>
			<content:encoded><![CDATA[<p>We're looking for an awesome Ruby developer to join our team. Get more details at <a href="http://devver.net/jobs">http://devver.net/jobs</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/06/were-hiring/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Boulder CTO Lunch with Matt McAdams</title>
		<link>http://devver.net/blog/2009/06/boulder-cto-lunch-with-matt-mcadams/</link>
		<comments>http://devver.net/blog/2009/06/boulder-cto-lunch-with-matt-mcadams/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 19:08:52 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Boulder]]></category>

		<category><![CDATA[CTO]]></category>

		<category><![CDATA[metrics]]></category>

		<category><![CDATA[pricing]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1250</guid>
		<description><![CDATA[Dan usually goes to the Boulder CTO lunches, but he was out of town this month, which meant I had the pleasure of hanging out with some of Boulder's best and brightest.
This month's guest was Matt McAdams of TrackVia. TrackVia is an online database that is powerful yet simple enough to be used by people [...]]]></description>
			<content:encoded><![CDATA[<p>Dan usually goes to the Boulder CTO lunches, but he was out of town this month, which meant I had the pleasure of hanging out with some of Boulder's best and brightest.</p>
<p>This month's guest was <a href="http://www.mattmcadams.com/">Matt McAdams</a> of <a href="http://www.trackvia.com/">TrackVia</a>. TrackVia is an online database that is powerful yet simple enough to be used by people who are used to keeping data in spreadsheets (primarily business people). Matt gave a candid and often hilarious talk that touched on both both technical topics, and, luckily for me, a discussion of pricing and metrics, which are two topics that I'm currently very interested in.</p>
<p><strong>On technology decisions:<br />
</strong></p>
<p>Matt wasn't a database guy originally, but used his practical knowledge he gained working on a previous startup</p>
<p>Went with the simplest design that could work and it's continued to scale well</p>
<p>Smart technology decisions have allowed TrackVia to compete with a small, lean development team</p>
<p><strong>On product development:</strong></p>
<p>TrackVia started as a contract project for a single customer, but they saw the broader appeal</p>
<p>One of the earliest databases in TrackVia is the bug database (still around).  In other words, they've been dogfooding since day one.</p>
<p>They don't worry about the competition. Instead, they focus on building the features that get people to sign up and pay.</p>
<p><strong>On pricing:</strong></p>
<p>You've got try stuff and iterate. TrackVia has changed their pricing several times.</p>
<p>Customers on the old pricing models have always been grandfathered in.</p>
<p>Sometimes raising your price can actually gain customers because some people assume that a cheap product or service must be low-quality (even if it's actually very high quality).</p>
<p>If big customers really want feature X, it's OK to ask them to pay extra to accelerate the development of that feature (or to customize their experience).</p>
<p><strong>On metrics:</strong></p>
<p>Good metrics allow you to try different strategies and measure their effect.</p>
<p>You must measure, tweak, and iterate.</p>
<p>If you can iterate on a weekly basis and your competition can iterate on a quarterly basis, you'll win.</p>
<p>Metrics must continually be improved. TrackVia spends a lot of time tracking useful metrics, but even they know they need to add additional metrics in some key areas.</p>
<hr />As usual, the CTO lunch was a great place to hear from other Boulder companies and I learned a lot. Thanks for everyone who attended and special thanks to Matt for leading our discussion.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/06/boulder-cto-lunch-with-matt-mcadams/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Spellcheck your files with Aspell and Rake</title>
		<link>http://devver.net/blog/2009/05/spellcheck-your-files-with-aspell-and-rake/</link>
		<comments>http://devver.net/blog/2009/05/spellcheck-your-files-with-aspell-and-rake/#comments</comments>
		<pubDate>Tue, 26 May 2009 15:33:54 +0000</pubDate>
		<dc:creator>Dan</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[Tips & Tricks]]></category>

		<category><![CDATA[Tools]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1242</guid>
		<description><![CDATA[We recently redid our website. The new site included a new design and much more content explaining what we do. We wanted a quick way to check over everything and make sure we didn't miss any spelling errors or typos. First I started looking for a web service that could scan the site for spelling [...]]]></description>
			<content:encoded><![CDATA[<p>We recently redid our website. The new site included a new design and much more content explaining what we do. We wanted a quick way to check over everything and make sure we didn't miss any spelling errors or typos. First I started looking for a web service that could scan the site for spelling errors. I found <a href="http://spellr.us/">spellr.us</a>, which is nice but would only catch errors once they were live. It also can't scan all of the pages which require being logged in.</p>
<p>I was pairing with Avdi who thought we should just run <a href="http://aspell.net/">Aspell</a>, which worked out great. We were originally trying to just create a simple Emacs macro to go through all our HTML files and check them but in the end created simple Rake tasks, which makes it really easy to integrate spellcheck into CI. After Avdi figured out the commands we needed to use on each file to get the information we needed from Aspell, it was easy to just wrap the command using Rake's FileList. To keep everyone on the same setup, we created a local dictionary of words to ignore or accept and keep that checked into source control as well.</p>
<p>The final solution grabs all the files you want to spell check, then runs them through Aspell with HTML filtering. We have two tasks: one that runs in interactive mode the the user can fix mistakes and one mode for CI that just fails if it finds any errors.</p>
<p><script src="http://gist.github.com/116858.js"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/05/spellcheck-your-files-with-aspell-and-rake/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Devver.net has a new look!</title>
		<link>http://devver.net/blog/2009/05/devvernet-has-a-new-look/</link>
		<comments>http://devver.net/blog/2009/05/devvernet-has-a-new-look/#comments</comments>
		<pubDate>Fri, 15 May 2009 03:40:52 +0000</pubDate>
		<dc:creator>Ben</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Devver]]></category>

		<category><![CDATA[website]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1240</guid>
		<description><![CDATA[Tonight we just launched the brand new version of Devver at http://devver.net. It's not perfect (yeah, yeah, we know the blog doesn't match - that should be fixed in the next week or so), but we're trying to "release early, release often." Let us know how you like the new look and how we can [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight we just launched the brand new version of Devver at http://devver.net. It's not perfect (yeah, yeah, we know the blog doesn't match - that should be fixed in the next week or so), but we're trying to "release early, release often." Let us know how you like the new look and how we can improve it!</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/05/devvernet-has-a-new-look/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Single-file Sinatra apps with specs baked-in</title>
		<link>http://devver.net/blog/2009/05/single-file-sinatra-apps-with-specs-baked-in/</link>
		<comments>http://devver.net/blog/2009/05/single-file-sinatra-apps-with-specs-baked-in/#comments</comments>
		<pubDate>Wed, 13 May 2009 16:00:40 +0000</pubDate>
		<dc:creator>Avdi</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<category><![CDATA[Hacking]]></category>

		<category><![CDATA[Ruby]]></category>

		<category><![CDATA[rspec]]></category>

		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://devver.net/blog/?p=1235</guid>
		<description><![CDATA[It's so easy to create little single-file apps in Sinatra that it almost seems a shame to start a second file just for tests.  The other day Dan and I decided to see if we could create a Sinatra app with everything - including the tests - baked right in.  Here's what we came up [...]]]></description>
			<content:encoded><![CDATA[<p>It's so easy to create little single-file apps in Sinatra that it almost seems a shame to start a second file just for tests.  The other day Dan and I decided to see if we could create a Sinatra app with <strong>everything</strong> - including the tests - baked right in.  Here's what we came up with.<br />
<script src="http://gist.github.com/110881.js"></script><br />
The code switches modes on the name of the executable used to run the file.  If we run it with the <code>spec</code> command, we get a test run:<br />
<tt><br />
$ spec -fs sinatra-tests-baked-in.rb </tt></p>
<p><tt>Example App<br />
- should serve a greeting<br />
- should serve content as text/plain</tt></p>
<p><tt>Finished in 0.007221 seconds</tt></p>
<p><tt>2 examples, 0 failures<br />
</tt><br />
Otherwise, if we call it as a Ruby program, it runs the Sinatra server as we would expect:<br />
<tt><br />
$ ruby sinatra-tests-baked-in.rb<br />
== Sinatra/0.9.1.1 has taken the stage on 4567 for development with backup from Thin<br />
&gt;&gt; Thin web server (v1.0.0 codename That's What She Said)<br />
&gt;&gt; Maximum connections set to 1024<br />
&gt;&gt; Listening on 0.0.0.0:4567, CTRL+C to stop<br />
</tt><br />
And there you have it: a true single-file application, specs and all.</p>
]]></content:encoded>
			<wfw:commentRss>http://devver.net/blog/2009/05/single-file-sinatra-apps-with-specs-baked-in/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
