<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Devalot - A weblog of hand-picked development content served hot.</title>
    <description>Software development articles found across the net and screened for your protection.</description>
    <link>http://www.devalot.com/</link>
    <lastBuildDate>Tue, 17 Apr 2012 21:43:29 +0000</lastBuildDate>
    
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/devalot-all" /><feedburner:info uri="devalot-all" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
        <title>Being explicit with your code</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/lmCfirsd6ps/explicit-code</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/04/explicit-code</guid>
        <pubDate>Tue, 17 Apr 2012 21:29:42 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;Christian Heilmann has a &lt;a href="http://christianheilmann.com/2012/04/16/of-parser-fetishists-and-semi-colons/"&gt;well reasoned gripe&lt;/a&gt; for
developers omitting semicolons in JavaScript:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Why would any intelligent person want to make it harder for others
to understand what they've done, keep booby-traps in their code that
will cause errors or deliberately write in a way that might make
others stumble? Is this some kind of code-trolling I don't get?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I have the same exact complaints when people don't use parentheses in
their Ruby code.  You can argue all day about your reasoning but when
you run your code through &lt;code&gt;ruby -w&lt;/code&gt; you'll see all sorts of warnings
about ambiguous code.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Developer_Skills" class="tag"&gt;Developer Skills&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Ruby" class="tag"&gt;Ruby&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=lmCfirsd6ps:CcwHb0Mm5MM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=lmCfirsd6ps:CcwHb0Mm5MM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=lmCfirsd6ps:CcwHb0Mm5MM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=lmCfirsd6ps:CcwHb0Mm5MM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=lmCfirsd6ps:CcwHb0Mm5MM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/lmCfirsd6ps" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/04/explicit-code</feedburner:origLink></item>
      <item>
        <title>RubyGem Version Specifiers</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/VLeOA49X1AA/gem-versions</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/04/gem-versions</guid>
        <pubDate>Tue, 03 Apr 2012 19:41:23 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;When writing an application in Ruby it's likely that you'll make use
of several open source libraries that come packaged as &lt;a href="http://docs.rubygems.org/"&gt;RubyGems&lt;/a&gt;.
But do you know which versions of those gems are getting loaded into
your application?  Will all versions work with your application?&lt;/p&gt;

&lt;p&gt;It doesn't matter if you are loading gems into your application
directly using &lt;code&gt;require&lt;/code&gt; statements or using a tool like &lt;a href="http://gembundler.com/"&gt;Bundler&lt;/a&gt;,
you should always use version specifiers to future proof your
application.&lt;/p&gt;

&lt;h2&gt;Using Version Specifiers&lt;/h2&gt;

&lt;p&gt;It's often tempting to load a library without regard for which version
you are about to use:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# In your application's source code
require('nokogiri')

# Or, in a Bundler Gemfile
gem('nokogiri')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But that's equivalent to using the following version specifiers:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# In your application's source code
gem('nokogiri', '&amp;gt;= 0.0')
require('nokogiri')

# Or, in a Bundler Gemfile
gem('nokogiri', '&amp;gt;= 0.0')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see, version specifiers are comprised of a version operator
and a version number.  Omitting the version specifier or using the
&lt;code&gt;&amp;gt;=&lt;/code&gt; version operator is almost always a bad idea.&lt;/p&gt;

&lt;p&gt;The code above means that you'll happily use any version of
the Nokogiri gem.  But is that a true statement?  Will your code
really work with any version?  What about really old versions of
Nokogiri?  What about the version of Nokogiri that's going to be
released in 2 years?&lt;/p&gt;

&lt;p&gt;It's easy to imagine a situation where you upgrade a gem to support a
new application and in the process break an old application.  If the
older application had a restrictive version specifier it would keep
working as long as you had a compatible version of the gem installed.&lt;/p&gt;

&lt;p&gt;I said it's &lt;em&gt;almost&lt;/em&gt; always a bad idea to use &lt;code&gt;&amp;gt;=&lt;/code&gt; because there's at
least one legitimate use for it.  RubyGems allows you to give more
than one version specifier and Bundler supports this as well:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem('nokogiri', '&amp;gt;= 1.0.0', '&amp;lt; 2.0.0')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Which means that you'll take any version of Nokogiri starting at 1.0.0
but not 2.0.0 or higher.  Combining version specifiers like this gives
you a lot of control over which version is going to be loaded into
your application, but it's a bit cumbersome.  If all you want to do is
restrict a gem to a specific major release (e.g. 1.x but not 2.x) then
you can use the pessimistic version operator (&lt;code&gt;~&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;The Pessimistic Version Operator&lt;/h2&gt;

&lt;p&gt;The pessimistic version operator (&lt;code&gt;~&amp;gt;&lt;/code&gt;) allows you to state that your
application works with future versions of a gem in a safe way.  Of
course this only works if the author of that gem introduces changes
that break backward compatibility in a predictable way (e.g. going
from version 1.0.0 to 1.0.1 doesn't break your application).&lt;/p&gt;

&lt;p&gt;For example, if you trust that the authors of the Nokogiri gem won't
break backwards compatibility until version 2.0.0 you can load the gem
using the pessimistic version operator:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem('nokogiri', '~&amp;gt; 1.0')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;But, if you only trusted them to maintain backwards compatibility in
the 1.5.x releases you could specify the version as:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem('nokogiri', '~&amp;gt; 1.5.0')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The pessimistic version operator can be controlled by how specific you
make the version number.  It works by stripping off the last digit you
specify and incrementing the remaining version.  So 1.5.0 becomes 1.6
and 1.0 becomes 2.0.  It then restricts the version of the gem
starting with the version you specified up to but not including the
incremented version.  Here are some examples:&lt;/p&gt;

&lt;table class="code"&gt;
&lt;col width="46%"&gt;
&lt;col width="53%"&gt;
&lt;thead&gt;&lt;tr class="header"&gt;
&lt;th align="left"&gt;Pessimistic Version&lt;/th&gt;
&lt;th align="left"&gt;Range Restriction&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '~&amp;gt; 1.0')&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '&amp;gt;= 1.0', '&amp;lt; 2.0')&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '~&amp;gt; 1.5.0')&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '&amp;gt;= 1.5.0', '&amp;lt; 1.6.0')&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '~&amp;gt; 1.5.3')&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;&lt;code&gt;gem('nokogiri', '&amp;gt;= 1.5.3', '&amp;lt; 1.6.0')&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Available Operators&lt;/h2&gt;

&lt;p&gt;RubyGems provides a complete set of version operators that allow you
to specify which versions of a gem your application can work with.  If
you don't use an operator and just use a version number you lock your
application to that specific version, it's shorthand for using the
equal (&lt;code&gt;=&lt;/code&gt;) operator.&lt;/p&gt;

&lt;p&gt;Here's a list of the of the operators supported in RubyGems:&lt;/p&gt;

&lt;table&gt;
&lt;col width="13%"&gt;
&lt;col width="58%"&gt;
&lt;thead&gt;&lt;tr class="header"&gt;
&lt;th align="left"&gt;Operator&lt;/th&gt;
&lt;th align="left"&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Equal to (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;&lt;code&gt;!=&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Not equal to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Greater than&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;&lt;code&gt;&amp;lt;&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Less than&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;&amp;gt;=&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Greater than or equal to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;&lt;code&gt;&amp;lt;=&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Less than or equal to&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;&lt;code&gt;~&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td align="left"&gt;Pessimistically greater than or equal to&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Ruby" class="tag"&gt;Ruby&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/RubyGems" class="tag"&gt;RubyGems&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=VLeOA49X1AA:Ga0JaIFkeh4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=VLeOA49X1AA:Ga0JaIFkeh4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=VLeOA49X1AA:Ga0JaIFkeh4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=VLeOA49X1AA:Ga0JaIFkeh4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=VLeOA49X1AA:Ga0JaIFkeh4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/VLeOA49X1AA" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/04/gem-versions</feedburner:origLink></item>
      <item>
        <title>Ruby/Rails Compatibility Matrix</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/s7ea4hlpX1s/ror-compatibility</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/03/ror-compatibility</guid>
        <pubDate>Wed, 14 Mar 2012 21:36:09 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;I found myself needing to figure out which versions of Ruby on Rails
run under which versions of Ruby.  I couldn't find a compatibility
chart so I put this together:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;&lt;tr class="header"&gt;
&lt;th align="left"&gt;Rails Version&lt;/th&gt;
&lt;th align="left"&gt;Possible Ruby Versions&lt;/th&gt;
&lt;th align="left"&gt;Recommended Ruby Version&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;1.0--2.1&lt;/td&gt;
&lt;td align="left"&gt;1.8.6&lt;/td&gt;
&lt;td align="left"&gt;1.8.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;2.2&lt;/td&gt;
&lt;td align="left"&gt;1.8.6 or 1.8.7&lt;/td&gt;
&lt;td align="left"&gt;1.8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;2.3&lt;/td&gt;
&lt;td align="left"&gt;1.8.6, 1.8.7, or 1.9.1&lt;/td&gt;
&lt;td align="left"&gt;1.8.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td align="left"&gt;3.0--3.2&lt;/td&gt;
&lt;td align="left"&gt;1.8.7, 1.9.2, or 1.9.3&lt;/td&gt;
&lt;td align="left"&gt;1.9.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td align="left"&gt;4.0--...&lt;/td&gt;
&lt;td align="left"&gt;1.9.3&lt;/td&gt;
&lt;td align="left"&gt;1.9.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Ruby" class="tag"&gt;Ruby&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Ruby_on_Rails" class="tag"&gt;Ruby on Rails&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=s7ea4hlpX1s:mJ5UX24NXA8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=s7ea4hlpX1s:mJ5UX24NXA8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=s7ea4hlpX1s:mJ5UX24NXA8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=s7ea4hlpX1s:mJ5UX24NXA8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=s7ea4hlpX1s:mJ5UX24NXA8:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/s7ea4hlpX1s" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/03/ror-compatibility</feedburner:origLink></item>
      <item>
        <title>Ruby's catch/throw, goto's little brother</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/9-wpKEovMSQ/ruby-goto</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/03/ruby-goto</guid>
        <pubDate>Fri, 09 Mar 2012 16:54:10 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;Last week Pat Shaughnessy discovered that there's a pre-processor
definition in the Ruby 1.9 source code to
&lt;a href="http://patshaughnessy.net/2012/2/29/the-joke-is-on-us-how-ruby-1-9-supports-the-goto-statement"&gt;enable goto and label statements&lt;/a&gt; in a rather ugly
way:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The &lt;code&gt;__goto__&lt;/code&gt; statement will cause the MRI Ruby 1.9 interpreter to
jump up to the &lt;code&gt;__label__&lt;/code&gt; statement on the first line, since they
both refer to the same symbol &lt;code&gt;:loop&lt;/code&gt;.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I don't think there's much use for &lt;code&gt;goto&lt;/code&gt; in a language like Ruby
considering that it's garbage collected and you can release resources
using closures and &lt;code&gt;ensure&lt;/code&gt; blocks.  However, if you're dying to play
with this, why not use goto's little brother, &lt;code&gt;catch&lt;/code&gt; and &lt;code&gt;throw&lt;/code&gt;:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; &lt;span class="class"&gt;Test&lt;/span&gt;
  &lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;foo&lt;/span&gt;
    throw(&lt;span class="symbol"&gt;:label&lt;/span&gt;, &lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;foo&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;)
    &lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;should never get here&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;bar&lt;/span&gt;
    &lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;bar&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

test = &lt;span class="constant"&gt;Test&lt;/span&gt;.new

puts(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;foo -&amp;gt; &lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt; + catch(&lt;span class="symbol"&gt;:label&lt;/span&gt;) {test.foo})
puts(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;bar -&amp;gt; &lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt; + catch(&lt;span class="symbol"&gt;:label&lt;/span&gt;) {test.bar})
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;There's not much to know about &lt;code&gt;catch&lt;/code&gt; and &lt;code&gt;throw&lt;/code&gt;.  You give a symbol
and a block to &lt;code&gt;catch&lt;/code&gt;, which acts like a goto label.  Any code that
uses &lt;code&gt;throw&lt;/code&gt; in that block, no matter how deep, will unwind and cause
the &lt;code&gt;catch&lt;/code&gt; block to terminate, returning the value given to throw.&lt;/p&gt;

&lt;p&gt;You can nest multiple &lt;code&gt;catch&lt;/code&gt; and &lt;code&gt;throw&lt;/code&gt; expressions using different
values for the label symbol.  Here's another example:&lt;/p&gt;

&lt;div class="CodeRay"&gt;
  &lt;div class="code"&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def&lt;/span&gt; &lt;span class="function"&gt;thrower&lt;/span&gt;
  &lt;span class="integer"&gt;10&lt;/span&gt;.times &lt;span class="keyword"&gt;do&lt;/span&gt; |i|
    &lt;span class="integer"&gt;10&lt;/span&gt;.times &lt;span class="keyword"&gt;do&lt;/span&gt; |j|
      &lt;span class="global-variable"&gt;$stdout&lt;/span&gt;.puts(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;#{&lt;/span&gt;i&lt;span class="inline-delimiter"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="content"&gt;.&lt;/span&gt;&lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;#{&lt;/span&gt;j&lt;span class="inline-delimiter"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;)
      throw(&lt;span class="symbol"&gt;:label&lt;/span&gt;, j) &lt;span class="keyword"&gt;if&lt;/span&gt; i &amp;gt; &lt;span class="integer"&gt;2&lt;/span&gt; &lt;span class="keyword"&gt;and&lt;/span&gt; j &amp;gt; &lt;span class="integer"&gt;2&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;

val = catch(&lt;span class="symbol"&gt;:label&lt;/span&gt;) &lt;span class="keyword"&gt;do&lt;/span&gt;
  thrower
  raise(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;should never get here&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;)
&lt;span class="keyword"&gt;end&lt;/span&gt;

&lt;span class="global-variable"&gt;$stdout&lt;/span&gt;.puts(&lt;span class="string"&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;span class="content"&gt;val is &lt;/span&gt;&lt;span class="inline"&gt;&lt;span class="inline-delimiter"&gt;#{&lt;/span&gt;val&lt;span class="inline-delimiter"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="delimiter"&gt;"&lt;/span&gt;&lt;/span&gt;)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Ruby" class="tag"&gt;Ruby&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=9-wpKEovMSQ:UINq6FygGtM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=9-wpKEovMSQ:UINq6FygGtM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=9-wpKEovMSQ:UINq6FygGtM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=9-wpKEovMSQ:UINq6FygGtM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=9-wpKEovMSQ:UINq6FygGtM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/9-wpKEovMSQ" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/03/ruby-goto</feedburner:origLink></item>
      <item>
        <title>Fun stuff for Friday Feb. 24</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/4vxOAFNZrGs/fun-friday-24</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/02/fun-friday-24</guid>
        <pubDate>Fri, 24 Feb 2012 22:03:35 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;It's Friday, and an especially good one at that.  At least for me
since it marks the start of a much needed vacation.  Hopefully this
weekend will be good for everyone, and what better way to kick it off
than some fun and geeky articles and videos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;If you're in the market for a new keyboard and think you want to
create one yourself, look no further than the
&lt;a href="http://humblehacker.com/keyboard/"&gt;Humble Hacker Keyboard&lt;/a&gt;.  This thing looks very cool.
And if you think the layout is a bit crazy then you need to watch
&lt;a href="http://www.youtube.com/watch?v=9yg3s77nAMQ"&gt;this video&lt;/a&gt; of Tim Tyler's keyboard. Via &lt;a href="http://hackaday.com/2012/02/16/microswitch-keyboard-gives-those-lazy-thumbs-a-workout/"&gt;Hack a Day&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nathan Rice posted some pictures comparing
&lt;a href="http://machinegestalt.posterous.com/if-programming-languages-were-cars"&gt;programming languages to cars&lt;/a&gt; which is cute.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eric Moritz put together a list of books that
&lt;a href="http://eric.themoritzfamily.com/books-every-self-taught-computer-scientist-should-read.html"&gt;every self-taught developer should read&lt;/a&gt;.  It seems
like a pretty reasonable list.  Of course, I would add
&lt;a href="http://pragprog.com/the-pragmatic-programmer"&gt;The Pragmatic Programmer&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There's a fairly interesting article over at the BBC about
&lt;a href="http://www.bbc.co.uk/news/magazine-16964783"&gt;the myth of the eight-hour sleep&lt;/a&gt;.  For whatever reason
I've found that software developers seem to be interested in sleep
patterns and sleep experiments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Longtime fans of Apache will be glad to hear that version 2.4
&lt;a href="http://www.apache.org/dist/httpd/Announcement2.4.html"&gt;has been release&lt;/a&gt; with some interesting features and
performance changes that match up with Nginx.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, you may want to &lt;a href="https://www.eff.org/deeplinks/2012/02/how-remove-your-google-search-history-googles-new-privacy-policy-takes-effect"&gt;remove your search history&lt;/a&gt;
from Google before their new privacy policy goes into effect on
3/1.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As always, have a wonderful weekend.  Recharge your batteries and
prepare yourself for a return to hacking on Monday.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Fun_Friday" class="tag"&gt;Fun Friday&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4vxOAFNZrGs:EvX-H99acm4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=4vxOAFNZrGs:EvX-H99acm4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4vxOAFNZrGs:EvX-H99acm4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=4vxOAFNZrGs:EvX-H99acm4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4vxOAFNZrGs:EvX-H99acm4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/4vxOAFNZrGs" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/02/fun-friday-24</feedburner:origLink></item>
      <item>
        <title>Fun stuff for Friday Feb. 10</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/25QcdmZrhVo/fun-friday-10</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/02/fun-friday-10</guid>
        <pubDate>Fri, 10 Feb 2012 21:43:28 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;This is going to be fun.  I haven't written a Fun Friday article this
year and my queue of things to share is sizable.  To top it off, I
haven't been keeping my self-imposed quota of at least one article a
day, so my general queue of articles to comment on has grown out of
control.  This post will contain some fun things I want to share as
well as a few backlogged articles that are pretty interesting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Want to relive the fun of rebooting older operating systems?
&lt;a href="http://www.therestartpage.com/"&gt;The Restart Page&lt;/a&gt; has you covered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers are religious about the text editor they use, that's no
surprise.  Need to vent your anger for &lt;a href="http://www.eclipse.org/eclipse/"&gt;Eclipse&lt;/a&gt;?  Look no further
than &lt;a href="http://www.ihateeclipse.com/"&gt;I Hate Eclipse&lt;/a&gt;.  If you're looking for a new
text editor &lt;a href="http://www.sublimetext.com/blog/articles/sublime-text-2-beta"&gt;Sublime Text 2 Beta&lt;/a&gt; is out.  Oh, and
&lt;a href="http://www.devalot.com/tags/Emacs"&gt;Emacs&lt;/a&gt; is the one true editor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Parse has found an interesting way to filter through resume
overload often accompanied by job postings.  To apply you have to
&lt;a href="https://www.parse.com/jobs"&gt;submit JSON to their API&lt;/a&gt;.  Smart.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ash Moran wrote an article to help you &lt;a href="http://blog.patchspace.co.uk/why-you-shouldnt-hire-more-developers"&gt;get your crap together&lt;/a&gt; instead of just throwing more developers at the problem.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you're not up on your &lt;code&gt;diff&lt;/code&gt; and &lt;code&gt;patch&lt;/code&gt; ninja skills
&lt;a href="http://www.cocoanetics.com/2011/12/how-to-make-and-apply-patches/"&gt;this article&lt;/a&gt; walks you through creating and
applying patches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Do you find the Java syntax to be too verbose?  Eleftheria
Drosopoulou says &lt;a href="http://www.javacodegeeks.com/2012/01/why-i-like-verbosity-of-java.html"&gt;she likes the verbosity of Java&lt;/a&gt; because
it forces you to understand the code you are using.  I can see
where she's coming from but I think the verbosity of the syntax
actually impedes its readability.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Speaking of Java, Marc Kuo has wrote a series of articles about
why he loves &lt;a href="http://common-lisp.net/"&gt;Common Lisp&lt;/a&gt; and hates Java.  &lt;a href="https://kuomarc.wordpress.com/2012/01/27/why-i-love-common-lisp-and-hate-java/"&gt;Part 1&lt;/a&gt; and
&lt;a href="http://kuomarc.wordpress.com/2012/02/02/why-i-love-common-lisp-and-hate-java-part-ii-code-examples/"&gt;Part 2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://jgneuf.wordpress.com/2011/12/20/all-programmers-are-self-taught/"&gt;All Programmers Are Self-Taught&lt;/a&gt; is short post
about how a computer science education doesn't actually teach you
how to program.  I tend to agree but the author is still a
student, so maybe he needs to take a few more classes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That should give you plenty to read over the weekend.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Fun_Friday" class="tag"&gt;Fun Friday&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=25QcdmZrhVo:m8aeJWL4hJE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=25QcdmZrhVo:m8aeJWL4hJE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=25QcdmZrhVo:m8aeJWL4hJE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=25QcdmZrhVo:m8aeJWL4hJE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=25QcdmZrhVo:m8aeJWL4hJE:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/25QcdmZrhVo" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/02/fun-friday-10</feedburner:origLink></item>
      <item>
        <title>Using Haskell to improve your C++</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/4fvSAITpoDk/haskell-cxx</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/02/haskell-cxx</guid>
        <pubDate>Mon, 06 Feb 2012 20:00:23 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;I find myself drawn more and more to &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;.  Any language that
helps a developer write solid code without making you feel like you're
using training wheels is a huge plus in my book.  Functional
programming has also opened my eyes to all sorts of pitfalls with
imperative programming.&lt;/p&gt;

&lt;p&gt;Even if you're put off by Haskell or functional programming there's a
lot you can learn and both can have a positive influence on your
imperative programming skills.  At least that's what they say.&lt;/p&gt;

&lt;p&gt;The folks over at Valletta Ventures have a &lt;a href="http://vallettaventures.com/post/17090296373/haskells-effect-on-my-c-exploit-the-type-system"&gt;short blog post&lt;/a&gt;
about how their C++ code has changed for the better after thinking
about problems functionally:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There is no doubt that time spent playing with Haskell has taught me
to exploit the type system when coding in C++, but the most lasting
effect may be when I abandon C++ altogether.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I would have liked to see a &lt;em&gt;lot&lt;/em&gt; more code and a more complete
discussion on how functional thinking can improve imperative code.  As
I dig deeper into Haskell I'll post some thoughts on how it's making
my daily imperative programming better or just different.&lt;/p&gt;

&lt;p&gt;If you haven't exposed yourself to Haskell yet I highly recommend
watching &lt;a href="http://ontwik.com/haskell/simon-peyton-jones-a-taste-of-haskell/"&gt;A Taste of Haskell&lt;/a&gt; the next time you have 3 hours to
completely geek off.  Make sure you download the slides and follow
along.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/C++" class="tag"&gt;C++&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Haskell" class="tag"&gt;Haskell&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4fvSAITpoDk:nlA9SEipBy0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=4fvSAITpoDk:nlA9SEipBy0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4fvSAITpoDk:nlA9SEipBy0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=4fvSAITpoDk:nlA9SEipBy0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=4fvSAITpoDk:nlA9SEipBy0:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/4fvSAITpoDk" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/02/haskell-cxx</feedburner:origLink></item>
      <item>
        <title>Rails 4.0 will drop support for Ruby 1.8.7</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/RMrJg22lbis/rails-drops-ruby18</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/02/rails-drops-ruby18</guid>
        <pubDate>Thu, 02 Feb 2012 20:04:15 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;Back in 2010 when Ruby on Rails 3.0 was released the core team
&lt;a href="http://guides.rubyonrails.org/3_0_release_notes.html#rails-3-requires-at-least-ruby-1-8-7"&gt;dropped&lt;/a&gt; support for Ruby 1.8.x except for version 1.8.7.
With 4.0 scheduled for a release sometime in the Summer of 2012 all
versions of Ruby 1.8 will &lt;a href="http://weblog.rubyonrails.org/2011/12/20/rails-master-is-now-4-0-0-beta"&gt;officially be dropped&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;There's not a lot of details about what we're going to include in
Rails 4.0 yet as the primary purpose for bumping the major version
number is to drop Ruby 1.8.7 support.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;This coincides with the Ruby core team &lt;a href="http://www.devalot.com/articles/2011/10/ruby-18"&gt;dropping support for 1.8&lt;/a&gt; this Summer as well.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Ruby" class="tag"&gt;Ruby&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Ruby_on_Rails" class="tag"&gt;Ruby on Rails&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=RMrJg22lbis:xY6w4crqCbo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=RMrJg22lbis:xY6w4crqCbo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=RMrJg22lbis:xY6w4crqCbo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=RMrJg22lbis:xY6w4crqCbo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=RMrJg22lbis:xY6w4crqCbo:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/RMrJg22lbis" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/02/rails-drops-ruby18</feedburner:origLink></item>
      <item>
        <title>Why estimating is hard</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/yyYlDYheiEA/estimating</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/01/estimating</guid>
        <pubDate>Tue, 31 Jan 2012 19:49:17 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;Software developers are notoriously bad at estimating, to the point
where project managers and bosses regularly double or even triple our
estimates.  Tools like calculating developer velocities help average
out these errors but also tend to cover them up.  So why is it so hard
to estimate development work?&lt;/p&gt;

&lt;p&gt;Diego Basch &lt;a href="http://diegobasch.com/why-software-development-estimations-are-regu"&gt;hits the nail on the head&lt;/a&gt; in his opposition to the
idea that we get better at estimating over time because we're doing
the same sort of things over and over again:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Real software development is about doing something that you've never
done before. That's why all stupid analogies about routine real-life
stuff break.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;As a freelance software developer I tend to do a lot of the same
things over and over again but with small changes in the details.
This has probably given me a false sense of being a good estimator.  I
think I need better problems to solve.&lt;/p&gt;

&lt;p&gt;Speaking of estimating, if software developers are so bad at
estimating why do managers and stakeholders think they are so much
better?  How often does your boss/client suggest that your current
task should only take you 30 minutes?  What insight do they have that
we don't?&lt;/p&gt;

&lt;p&gt;I used to work in the cube next to my manager.  I would hear him on
the speakerphone with other managers committing me to tasks and giving
them estimates.  This guy could barely use a computer yet here he was
saying stuff like "that should take a day".&lt;/p&gt;

&lt;p&gt;Maybe that's why we have such a bad reputation for estimating.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Developer_Skills" class="tag"&gt;Developer Skills&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=yyYlDYheiEA:FzeFIHL43Xk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=yyYlDYheiEA:FzeFIHL43Xk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=yyYlDYheiEA:FzeFIHL43Xk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=yyYlDYheiEA:FzeFIHL43Xk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=yyYlDYheiEA:FzeFIHL43Xk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/yyYlDYheiEA" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/01/estimating</feedburner:origLink></item>
      <item>
        <title>Fixing programming by besting current languages</title>
        <link>http://feedproxy.google.com/~r/devalot-all/~3/vkuNkaZNJ38/besting-declarative-programming</link>
        <guid isPermaLink="false">http://www.devalot.com/articles/2012/01/besting-declarative-programming</guid>
        <pubDate>Thu, 26 Jan 2012 20:46:09 +0000</pubDate>
        <dc:creator>Peter Jones</dc:creator>
        <description>&lt;p&gt;Jon BeltranDeHeredia's rant on &lt;a href="http://jonbho.net/2012/01/24/i-want-to-fix-programming/"&gt;why programming is broken&lt;/a&gt; has
turned into a very interesting thought experiment.  First, Jon
describes why he thinks programming is broken:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Every step of the way, in every statement, line of code, function
call or sequence-point, if you want to write good code, you need to
think about all the different possible states of the whole
program. This is invisible and impossible to
define. Provably. Always. In all existing languages. That's the
reason 100% code-coverage unit-testing doesn't guarantee bug-free
code, and it never will. This is also the reason bad programmers
don't become good: they just can't think about all those possible
cases in a structured way.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Then he describes his vision for a new programming language that looks
like the love child of Haskell and Prolog.&lt;/p&gt;

&lt;p&gt;If you're looking for something geeky to spend your free time on I
suggest taking some ideas from the comments on Jon's article.  Readers
are posting links to all sorts of interesting things such as
executable specifications, the failures of Prolog, proof management
systems, and the 4GL fiasco.&lt;/p&gt;
          &lt;p&gt;
  Tags:

    &lt;a href="http://www.devalot.com/tags/Declarative" class="tag"&gt;Declarative&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Functional" class="tag"&gt;Functional&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Haskell" class="tag"&gt;Haskell&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Imparative" class="tag"&gt;Imparative&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Prolog" class="tag"&gt;Prolog&lt;/a&gt;
    &lt;a href="http://www.devalot.com/tags/Provable_Code" class="tag"&gt;Provable Code&lt;/a&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=vkuNkaZNJ38:9cSyJVaN34w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=vkuNkaZNJ38:9cSyJVaN34w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=vkuNkaZNJ38:9cSyJVaN34w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?i=vkuNkaZNJ38:9cSyJVaN34w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/devalot-all?a=vkuNkaZNJ38:9cSyJVaN34w:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/devalot-all?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/devalot-all/~4/vkuNkaZNJ38" height="1" width="1"/&gt;</description>
      <feedburner:origLink>http://www.devalot.com/articles/2012/01/besting-declarative-programming</feedburner:origLink></item>
  </channel>
</rss>

