<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://www.rubyinside.com/wp-atom.php">
	<title type="text">Ruby Inside</title>
	<subtitle type="text" />

	<updated>2012-02-01T02:47:25Z</updated>

	<link rel="alternate" type="text/html" href="http://www.rubyinside.com" />
	<id>http://www.rubyinside.com/feed/atom</id>
	

	<generator uri="http://wordpress.org/" version="3.2.1">WordPress</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/RubyInside" /><feedburner:info uri="rubyinside" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>RubyInside</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[This Week in Ruby: Rails 3.2, Rails Tutorial, and Why You Should Learn Smalltalk]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/NZQKkMtEnRM/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html" />
		<id>http://www.rubyinside.com/?p=5806</id>
		<updated>2012-01-28T01:35:19Z</updated>
		<published>2012-01-28T01:35:19Z</published>
		<category scheme="http://www.rubyinside.com" term="Compilation Posts" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p>It's the latest Web-based syndication of <a href="http://rubyweekly.com/">Ruby Weekly</a>, the weekly Ruby and Rails e-mail newsletter (which just tipped 11K subscribers). Ruby Weekly now has a 'tips' page where <a href="http://petercooper.wufoo.com/forms/w7x2x3/">you can submit links</a> for potential inclusion so if you're releasing something or have written a cool post, fill out the form and you may be in Ruby Weekly next week :-)</p>
<h3>Headlines</h3>

<p><a href="http://weblog.rubyonrails.org/2012/1/20/rails-3-2-0-faster-dev-mode-routing-explain-queries-tagged-logger-store" style="font-weight: bold;">Rails 3.2 Released</a>
DHH has unveiled Rails 3.2! Not quite as big a deal as 3.1 but has a faster development mode, faster route recognition, a tagged logger, and more. With Rails master now aiming at 4.0.0, it seems 3.2 may be the last version of Rails to support Ruby 1.8. <a href="http://www.rubyinside.com/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html">&lt;p&gt;It's the latest Web-based syndication of &lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt;, the weekly Ruby and Rails e-mail newsletter (which just tipped 11K subscribers). Ruby Weekly now has a 'tips' page where &lt;a href="http://petercooper.wufoo.com/forms/w7x2x3/"&gt;you can submit links&lt;/a&gt; for potential inclusion so if you're releasing something or have written a cool post, fill out the form and you may be in Ruby Weekly next week :-)&lt;/p&gt;
&lt;h3&gt;Headlines&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://weblog.rubyonrails.org/2012/1/20/rails-3-2-0-faster-dev-mode-routing-explain-queries-tagged-logger-store" style="font-weight: bold;"&gt;Rails 3.2 Released&lt;/a&gt;&lt;br /&gt;
DHH has unveiled Rails 3.2! Not quite as big a deal as 3.1 but has a faster development mode, faster route recognition, a tagged logger, and more. With Rails master now aiming at 4.0.0, it seems 3.2 may be the last version of Rails to support Ruby 1.8.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://news.railstutorial.org/ruby-on-rails-tutorial-second-edition-updated" style="font-weight: bold;"&gt;Ruby on Rails Tutorial, 2nd Edition (Updated for Rails 3.2)&lt;/a&gt;&lt;br /&gt;
Michael Hartl's "Rails Tutorial" site has been incredibly popular over the last year and he's now finishing up a 2nd edition that's fully updated to Rails 3.2 standards. The first 5 chapters are already good to go and can be read no-cost, as always, at railstutorial.org.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Articles and Tutorials&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://freelancing-gods.com/posts/backing_up_with_backup" style="font-weight: bold;"&gt;Backing Up with Backup: A Neat DSL for Backup Operations&lt;/a&gt;&lt;br /&gt;
Pat Allan loves Michael van Rooijen's 'backup' gem so much that he wants to to convince you to use it, by showing you two examples of why he finds it so useful. It does seem pretty handy..
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://victorsavkin.com/post/16375110741/why-smalltalk" style="font-weight: bold;"&gt;Why Every Ruby Developer Should Learn Smalltalk&lt;/a&gt;&lt;br /&gt;
Smalltalk was the first purely object oriented language (though Simula included objects before it) and it heavily inspired Ruby's initial development. Victor Savkin thinks that Rubyists could learn a lot from playing with Smalltalk.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://mikepackdev.com/blog_posts/24-the-right-way-to-code-dci-in-ruby" style="font-weight: bold;"&gt;The Right Way to Code DCI in Ruby&lt;/a&gt;&lt;br /&gt;
DCI (Data, Context and Interaction) is an interesting object oriented pattern that's been discussed in the Ruby community lately, but Mike Pack thinks most articles oversimplify its use. In this post, he digs into the idea.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://metaskills.net/2012/01/15/rails-and-spine-js-using-the-coffeescript-source/" style="font-weight: bold;"&gt;The 'Rails and Spine.JS' Series&lt;/a&gt;&lt;br /&gt;
Ken Collins is working on a series of posts about using the Spine.js JavaScript MVC framework alongside a Rails app. This is the first of three posts so far.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://ku1ik.com/2012/01/21/systemd-socket-activation-and-ruby.html" style="font-weight: bold;"&gt;systemd Socket Activation and Ruby&lt;/a&gt;&lt;br /&gt;
systemd is a system and service manager for Linux (and replacement for the System V init daemon). Here, Marcin Kulik looks at how a socket-based Ruby server can take advantage of systemd's socket activation feature.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.engineyard.com/blog/2012/rvm-stable-and-more/" style="font-weight: bold;"&gt;RVM Stable (and More)&lt;/a&gt;&lt;br /&gt;
Michal Papis of Engine Yard looks at the 'stable' release of RVM (Ruby Version Manager) and how to install and use it. Some handy RVM tips here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.hasmanythrough.com/2012/1/20/modularized-association-methods-in-rails-3-2" style=""&gt;Modularized Association Methods in Rails 3.2&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://whilefalse.net/2012/01/25/testing-rails-engines-rspec/" style=""&gt;Testing Rails Engines With RSpec&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://robots.thoughtbot.com/post/16196616388/factory-girl-2-5-gets-custom-constructors" style=""&gt;Factory Girl 2.5 Gets Custom Constructors&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://railscasts.com/episodes/318-upgrading-to-rails-3-2"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1738/thumb_318-upgrading-to-rails-3-2.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railscasts.com/episodes/318-upgrading-to-rails-3-2" style="font-weight: bold;"&gt;RailsCasts: Upgrading to Rails 3.2&lt;/a&gt;&lt;br /&gt;
In the latest RailsCasts episode, Ryan Bates looks at the newly released Rails 3.2 and shows off some of its new features. Short and sweet in just 9 minutes.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://rubyrogues.com/038-rr-web-programming-and-updating-frameworks-with-yehuda-katz/" style="font-weight: bold;"&gt;Web Programming and Updating Frameworks with Yehuda Katz&lt;/a&gt;&lt;br /&gt;
The Ruby Rogues sit down with Yehuda Katz to discuss Web frameworks, JavaScript, Rails, Merb, Sinatra, Rack, and more. And just why is to_json a problem? If you have a spare hour, find out :-)
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries and code&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/kjvarga/sitemap_generator" style="font-weight: bold;"&gt;SitemapGenerator: Generate XML Sitemaps from Ruby&lt;/a&gt;&lt;br /&gt;
Originally a Google idea, XML sitemaps are now used by several search engines and SitemapGenerator will generate Sitemap 0.9 compliant sitemaps for you from Ruby. Includes Rails integration too but is otherwise framework agnostic.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/commondream/tconsole" style="font-weight: bold;"&gt;tconsole: A MiniTest Testing Console for Rails&lt;/a&gt;&lt;br /&gt;
tconsole is a testing console for Rails based around MiniTest (also supporting Test::Unit). It allows you to issue commands concerning what tests to run, and see their test output.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.fogus.me/2012/01/25/lisp-in-40-lines-of-ruby/" style="font-weight: bold;"&gt;Lisp in 32 Lines of Ruby&lt;/a&gt;&lt;br /&gt;
Implementing a small Lisp interpreter is the super geeky equivalent of 'hello world' and Michael Fogus (author of The Joy of Clojure) deftly pulls it off in 32 lines of Ruby here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/sunaku/tork#readme" style=""&gt;Tork: Continuous Testing using Forked Processes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Ruby Jobs of the Week&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/634236"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1744/thumb_rackspace.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/634236" style="font-weight: bold;"&gt;Rubyist (or Pythonista) Required at RackSpace [San Antonio, Texas]&lt;/a&gt;&lt;br /&gt;
Hosting company Rackspace is looking for a developer with Ruby or Python experience (and maybe even Erlang!) to work in its foundation software development team. If Git, Capistrano, MongoDB, and Rails are all interesting to you, check it out.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/629274" style=""&gt;Ruby Framework Engineer Job at Zendesk [San Francisco]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.rubyinside.com/post-a-job" style="font-weight: bold;"&gt;Want your job featured in Ruby Weekly? Learn more here.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=NZQKkMtEnRM:Kd5cU0cNhEY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=NZQKkMtEnRM:Kd5cU0cNhEY:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=NZQKkMtEnRM:Kd5cU0cNhEY:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/NZQKkMtEnRM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/this-week-in-ruby-rails-3-2-rails-tutorial-and-why-you-should-learn-smalltalk-5806.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[This Week in Ruby: Nominate Your Ruby Heroes, Include/Extend, Ruby on Netbeans, Jekyll-Bootstrap, and more]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/3uTqrNu970s/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html" />
		<id>http://www.rubyinside.com/?p=5799</id>
		<updated>2012-01-20T16:32:12Z</updated>
		<published>2012-01-20T16:32:12Z</published>
		<category scheme="http://www.rubyinside.com" term="Compilation Posts" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p>Welcome to this week's Web-based syndication of <a href="http://rubyweekly.com/">Ruby Weekly</a>, my Ruby e-mail newsletter.</p>
<h3>Headlines</h3>

  <a href="http://rubyheroes.com/"><img src="http://s3.amazonaws.com/nlga/uploads/item/image/1679/thumb_rubyhero.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /></a>
<p><a href="http://rubyheroes.com/" style="font-weight: bold;">Vote for your 'Ruby Hero' in the Ruby Hero Awards</a>
The Ruby Heroes awards run each year and present 6 community nominated 'heroes' with an award at RailsConf. Nominations are now open so go and drop your nomination for the Rubyist whose code has brightened up your life the most in the past year.
</p>


<p><a href="http://www.marketwatch.com/story/heroku-receives-infoworlds-technology-of-the-year-award-2012-01-18" style="font-weight: bold;">Heroku Receives InfoWorld's Technology of the Year Award</a>
Sorry it's just a press release but it's great to see a company that came up from the Ruby world continue to do well. <a href="http://www.rubyinside.com/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html">&lt;p&gt;Welcome to this week's Web-based syndication of &lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt;, my Ruby e-mail newsletter.&lt;/p&gt;
&lt;h3&gt;Headlines&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://rubyheroes.com/"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1679/thumb_rubyhero.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rubyheroes.com/" style="font-weight: bold;"&gt;Vote for your 'Ruby Hero' in the Ruby Hero Awards&lt;/a&gt;&lt;br /&gt;
The Ruby Heroes awards run each year and present 6 community nominated 'heroes' with an award at RailsConf. Nominations are now open so go and drop your nomination for the Rubyist whose code has brightened up your life the most in the past year.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.marketwatch.com/story/heroku-receives-infoworlds-technology-of-the-year-award-2012-01-18" style="font-weight: bold;"&gt;Heroku Receives InfoWorld's Technology of the Year Award&lt;/a&gt;&lt;br /&gt;
Sorry it's just a press release but it's great to see a company that came up from the Ruby world continue to do well. Congrats to the Heroku team.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Articles and Tutorials&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jonathanleighton.com/articles/2012/encapsulating-hashes/" style="font-weight: bold;"&gt;Hashes and Encapsulation&lt;/a&gt;&lt;br /&gt;
Jon Leighton demonstrates why accessing hash elements in a "obj.hashthings['foo']" style isn't the way to go and how to act in a way that respects encapsulation, a tenet of object orientation.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://ficate.com/explaining-include-and-extend" style="font-weight: bold;"&gt;Explaining Ruby's Include and Extend&lt;/a&gt;&lt;br /&gt;
Aaron Lasseigne gives a simple introduction to the ideas behind the 'include' and 'extend' methods.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://myronmars.to/n/dev-blog/2012/01/why-sinatras-halt-is-awesome" style="font-weight: bold;"&gt;Why Sinatra's Halt is Awesome&lt;/a&gt;&lt;br /&gt;
Myron Marston draws attention to Sinatra's 'halt' method which you can use to immediate stop a request within a filter or route, and explains why he likes it for handling exceptions in Sinatra apps.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.segment7.net/2012/01/10/replace-your-test-helpers-with-reusable-api" style="font-weight: bold;"&gt;Replace Your Test Helpers with a Reusable API&lt;/a&gt;&lt;br /&gt;
Eric Hodel makes an interesting argument that instead of leaning on test helper files all of the time, perhaps there are common bits of functionality you can bake into your library or app's own APIs.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.zenspider.com/2012/01/assert-nothing-tested.html" style="font-weight: bold;"&gt;assert_nothing_tested..&lt;/a&gt;&lt;br /&gt;
Ryan Davis demonstrates why his popular minitest testing library doesn't have an assert_nothing_raised assertion by picking on a relatively useless test in Rails.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.enebo.com/2012/01/workaround-for-ruby-support-on-netbeans.html" style="font-weight: bold;"&gt;A Workaround for Ruby Support on Netbeans 7.1&lt;/a&gt;&lt;br /&gt;
Back in February 2011, Netbeans (a popular IDE) dropped its official support for Ruby but the JRuby team offered to pick up the slack. Thomas Enebo has been working on it and has some code to make Ruby support work on Netbeans 7.1 here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://joshuadavey.com/post/15619414829/faster-tdd-feedback-with-tmux-tslime-vim-and" style=""&gt;Faster TDD Feedback With tmux, tslime.vim, and turbux.vim&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://rubysource.com/rails-or-sinatra-the-best-of-both-worlds/" style="font-weight: bold;"&gt;Rails or Sinatra: The Best of Both Worlds?&lt;/a&gt;&lt;br /&gt;
Over at RubySource, Darren Jones rounds up the opinions and assessments of several well known Rubyists when it comes to choosing Sinatra or Rails for a project. An interesting high level collection of ideas.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://numbers.brighterplanet.com/2012/01/18/fuzzy-match-in-ruby/" style=""&gt;How to do Fuzzy Matching in Ruby with fuzzy_match&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Media&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://rubyrogues.com/037-rr-versioning-and-releases/" style="font-weight: bold;"&gt;The Ruby Rogues on Versioning and Releases&lt;/a&gt;&lt;br /&gt;
The world's favorite Ruby podcast, Ruby Rogues, is back with an episode all about the versioning of code, Ruby libraries, gems, and more. This time out, James Edward Gray II takes the helm.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://railscasts.com/episodes/316-private-pub" style="font-weight: bold;"&gt;Private Pub (RailsCasts)&lt;/a&gt;&lt;br /&gt;
Private Pub is a gem for use with Rails to publish and subscribe to real-time messages through Faye. You get real-time updates through an open socket without tying up a Rails process. Ryan Bates shows you how to use it in a mere 7 minutes.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries and code&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="https://github.com/pda/roflbalt"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1659/thumb_roflbalt2.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/pda/roflbalt" style="font-weight: bold;"&gt;ROFLBALT: A Terminal-based ASCII Side Scroller Game&lt;/a&gt;&lt;br /&gt;
At RailsCamp X, Paul Annesley and Dennis Hotson built this nifty little side scrolling game which works straight from your terminal (256 color support needed though). Surprisingly good for a quick effort.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/charliesome/twostroke" style="font-weight: bold;"&gt;TwoStroke: A JavaScript Implementation Written in Ruby&lt;/a&gt;&lt;br /&gt;
Charlie Somerville presents an interesting working (but incomplete) JavaScript implementation, written entirely in Ruby. One of those projects that may seem useful somewhere down the line but for now is just a neat idea.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/netzpirat/guard-rspectacle" style="font-weight: bold;"&gt;Guard::RSpectacle: An RSpec Plugin for Guard&lt;/a&gt;&lt;br /&gt;
Guard::RSpectacle automatically tests your application with RSpec when files are modified. This sounds like guard-rspec on the surface, but RSpectacle acts as an 'embedded' runner within a running Rails app and reloads changed files on the fly.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/phusion/juvia" style="font-weight: bold;"&gt;Juvia: An Open Source Commenting System from Phusion&lt;/a&gt;&lt;br /&gt;
For a while now, Hongli Lai of Phusion (the geniuses behind Passenger and REE) has been working on a Rails-based open source commenting system that you can include into your site using JavaScript.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jekyllbootstrap.com/" style="font-weight: bold;"&gt;Jekyll-Bootstrap: A Quick Way to Start Off Your Own Jekyll-Powered Site&lt;/a&gt;&lt;br /&gt;
Jekyll is a blog-focused static site generator, and Jekyll users often recommend cloning an existing Jekyll blog to use as a starting point. Jekyll-Bootstrap takes this idea to the next level by attempting to be the definitive Jekyll framework to clone.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/cmer/socialization" style=""&gt;Socialization: Liking and Following for your Rails 3 Apps&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/agoragames/oembedr" style="font-weight: bold;"&gt;OEmbedr: Lightweight, Flexible OEmbed Consumer Library&lt;/a&gt;&lt;br /&gt;
oEmbed is a format for allowing an embedded representation of a URL on third party sites OEmbedr makes consuming oEmbed from any source simple.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/deadlyicon/hobson" style="font-weight: bold;"&gt;Hobson: A Resque-based Distributed Test Runner&lt;/a&gt;&lt;br /&gt;
Hobson distributes your test suite across N machines and aggregates the results live on a locally run webapp. I haven't tried it yet but on a trawl through the source code it seems to be for Cucumber and RSpec only.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://knoopx.net/2011/12/14/cracking-wpa-networks-with-macruby" style=""&gt;Cracking WPA networks with MacRuby&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://vesperapps.com/" style="font-weight: bold;"&gt;Vesper: A New Sinatra-based Webapp Framework&lt;/a&gt;&lt;br /&gt;
Yes, it's 'yet another' webapp framework but Vesper is based on top of Sinatra, already has several plugins, and features a handy 6 minute screencast on its homepage.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Ruby Jobs of the Week&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/629274"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1675/thumb_zendesk.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/629274" style="font-weight: bold;"&gt;Ruby Framework Engineer Job at Zendesk [San Francisco]&lt;/a&gt;&lt;br /&gt;
The fantastic folks over at Zendesk, the help desk and support ticket app, are looking for a creative and seasoned Ruby engineer to focus on improving their code base. They want full stack engineers who can improve and refactor their frameworks and lead an open source effort by publishing some of the resulting gems.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/626674" style=""&gt;Ruby on Rails Developer at Unpakt [New York City]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.rubyinside.com/post-a-job" style="font-weight: bold;"&gt;Want your job featured in Ruby Weekly? Learn more here.&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Last but not least..&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://owningrails.com/?ref=5905208113" style="font-weight: bold;"&gt;Owning Rails: Marc Andre Cournoyer's Online Rails Masterclass&lt;/a&gt;&lt;br /&gt;
 Marc Andre Cournoyer (of Create Your Own Programming Language fame) is running another of his highly praised 2 day, online Rails masterclasses. Marc's given me a discount code you can use to get 80 dollars off - it's 'rubyweekly'. I disclose that I make a commission on this but I won't promote trash and the testimonials speak for themselves :-)&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://proglangmasterclass.com/?ref=5905208113" style="font-weight: bold;"&gt;The Programming Language Masterclass: Another Marc-Andre Class&lt;/a&gt;&lt;br /&gt;
Along similar lines, Marc Andre Cournoyer also runs a more general class aimed at giving you an understanding of the inner workings of programming languages and programming language implementation. 'SAVEME50' gets you a discount and it's in mid February.
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=3uTqrNu970s:pUt4OXTHJXU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=3uTqrNu970s:pUt4OXTHJXU:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=3uTqrNu970s:pUt4OXTHJXU:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/3uTqrNu970s" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/this-week-in-ruby-nominate-your-ruby-heroes-includeextend-ruby-on-netbeans-jekyll-bootstrap-and-more-5799.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[The Last Week in Ruby: RSpec 2.8, Redcar 0.12, Torquebox 2.0 beta, articles and more]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/qSDxYrtbHdo/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html" />
		<id>http://www.rubyinside.com/?p=5787</id>
		<updated>2012-01-16T02:47:08Z</updated>
		<published>2012-01-16T11:36:36Z</published>
		<category scheme="http://www.rubyinside.com" term="Compilation Posts" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p>Welcome to this week's Web-based syndication of <a href="http://rubyweekly.com/">Ruby Weekly</a>, the Ruby e-mail newsletter. While I have you, be sure to <a href="http://twitter.com/rubyinside">follow @RubyInside</a> on Twitter as I'm going to be posting news more frequently there than on the Web site in future.</p>
<p><a href="https://twitter.com/RubyInside" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @RubyInside</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
<p>Also, if you're interested in getting one interesting programming related quote or link each day on Twitter, check out <a href="http://twitter.com/codewisdom">@codewisdom.</a></p>
<p><a href="https://twitter.com/CodeWisdom" class="twitter-follow-button" data-show-count="false" data-size="large">Follow @CodeWisdom</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script></p>
<h3>Headlines</h3>

<p><a href="http://www.rubyinside.com/rspec-2-8-released-5772.html" style="font-weight: bold;">RSpec 2.8: The Popular Ruby BDD Tool Goes Supersonic</a>
RSpec 2.8 and rspec-rails 2.8.1 have been released and some users have been reporting significant performance improvements. Other tweaks include improved documentation, better tag and filtering options, random example execution, and 'rspec --init' for adding RSpec to an empty Ruby project. <a href="http://www.rubyinside.com/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html">&lt;p&gt;Welcome to this week's Web-based syndication of &lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt;, the Ruby e-mail newsletter. While I have you, be sure to &lt;a href="http://twitter.com/rubyinside"&gt;follow @RubyInside&lt;/a&gt; on Twitter as I'm going to be posting news more frequently there than on the Web site in future.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/RubyInside" class="twitter-follow-button" data-show-count="false" data-size="large"&gt;Follow @RubyInside&lt;/a&gt;&lt;br /&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;&lt;/p&gt;
&lt;p&gt;Also, if you're interested in getting one interesting programming related quote or link each day on Twitter, check out &lt;a href="http://twitter.com/codewisdom"&gt;@codewisdom.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/CodeWisdom" class="twitter-follow-button" data-show-count="false" data-size="large"&gt;Follow @CodeWisdom&lt;/a&gt;&lt;br /&gt;
&lt;script&gt;!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");&lt;/script&gt;&lt;/p&gt;
&lt;h3&gt;Headlines&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.rubyinside.com/rspec-2-8-released-5772.html" style="font-weight: bold;"&gt;RSpec 2.8: The Popular Ruby BDD Tool Goes Supersonic&lt;/a&gt;&lt;br /&gt;
RSpec 2.8 and rspec-rails 2.8.1 have been released and some users have been reporting significant performance improvements. Other tweaks include improved documentation, better tag and filtering options, random example execution, and 'rspec --init' for adding RSpec to an empty Ruby project.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://torquebox.org/news/2012/01/06/torquebox-2-0-0-beta2-released/" style="font-weight: bold;"&gt;TorqueBox 2.0 Beta 2 Released&lt;/a&gt;&lt;br /&gt;
Torquebox is a popular JBoss-powered application server for Ruby webapps that provides a smorgasbord of useful backend features. This beta of the 2.0 release boasts the latest versions of JRuby and JBoss and new support for WebSockets/STOMP.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://redcareditor.com/blog/2012/01/redcar-012/" style="font-weight: bold;"&gt;Redcar 0.12 Released: An Editor Built in Ruby&lt;/a&gt;&lt;br /&gt;
Redcar is a programmers' text editor written in Ruby and this latest release has streamlined its installation and added Mac OS X Lion support.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Articles and Tutorials&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://solnic.eu/2012/01/10/ruby-datamapper-status.html" style="font-weight: bold;"&gt;The Status of DataMapper&lt;/a&gt;&lt;br /&gt;
DataMapper is a popular Ruby ORM and an interesting alternative to ActiveRecord. In this post, Piotr Solnica explains what's happening with DataMapper 2.0 and how it aims to implement the Data Mapper pattern in full. The systems outlined in this post could resolve a lot of issues people have been having with ActiveRecord, it seems.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.carbonfive.com/2012/01/10/does-my-rails-app-need-a-service-layer/" style="font-weight: bold;"&gt;Does My Rails App Need A Service Layer?&lt;/a&gt;&lt;br /&gt;
Jared Carroll picks up on a common thread being discussed in the Rails world lately: service layers. He explains what 'services' are, what types of service can exist, and tries to briefly explain his opinion on their usage within the context of Rails. I'm not entirely comfortable with his conclusion but it's a good introduction nonetheless.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.flyingmachinestudios.com/programming/minimax/" style="font-weight: bold;"&gt;An Exhaustive Explanation of Minimax: A Staple AI Algorithm&lt;/a&gt;&lt;br /&gt;An appealing explanation of an algorithm that can be used to 'intelligently' play Tic Tac Toe, complete with a simple Ruby implementation.&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://nerds.airbnb.com/upgrading-airbnb-from-rails-23-to-rails-30" style=""&gt;How Airbnb Upgraded from Rails 2.3 to Rails 3.0&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.rubypluspl.us/2012/01/new-year-updated-ubuntu-rails-setup.html" style="font-weight: bold;"&gt;Rails Development on Ubuntu 11.10: Setting Up a Dev Environment&lt;/a&gt;&lt;br /&gt;
Eric Proctor wanted to refresh his setup for 2012 so sat down to install a Rails development stack from scratch on Ubuntu 11.10. He shares the process here in case you want to repeat it for yourself.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://aslamnajeebdeen.com/blog/how-to-create-your-own-local-copy-of-rails-api-doc-and-guides" style="font-weight: bold;"&gt;How to Create A Local Copy of the Rails API Docs and Guides&lt;/a&gt;&lt;br /&gt;
If you're like many Rails developers, you might frequently hit the Rails docs and guides via Google searches, but if you want access to these useful resources when offline, Aslam Najeebdeen has the answer.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://2beards.net/2012/01/hosting-your-own-rubygem-server/" style="font-weight: bold;"&gt;Hosting Your Own Local RubyGems Server&lt;/a&gt;&lt;br /&gt;
Want to have your own in-house RubyGems server? It's easy and Michael Erasmus shows you how in this post.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.rails-troubles.com/2011/12/ruby-float-quirks.html" style="font-weight: bold;"&gt;Ruby Float Quirks&lt;/a&gt;&lt;br /&gt;
Clemens Helm stumbles across a rudimentary floating point representation issue, but one that can trip you up nonetheless if you're not aware of it.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://semanteks.com/blog/installing-refinerycms-with-rails-313" style=""&gt;Installing RefineryCMS with Rails 3.1.3&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://collectiveidea.com/blog/archives/2012/01/05/capybara-cucumber-and-how-the-cookie-crumbles/" style="font-weight: bold;"&gt;Capybara, Cucumber and How the Cookie Crumbles&lt;/a&gt;&lt;br /&gt;
Steve Richert of Collective Idea wanted to punch through Capybara and be able to set cookies that would "Just Work" from anywhere in his Cucumber suite. Here, he shows you how he did it.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jessedearing.com/nodes/16-ddd-aggregates-in-rails-with-activerecord" style=""&gt;DDD Aggregates in Rails with ActiveRecord&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Screencasts&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://railscasts.com/episodes/314-pretty-urls-with-friendlyid"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1543/thumb_314-pretty-urls-with-friendlyid.png" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railscasts.com/episodes/314-pretty-urls-with-friendlyid" style="font-weight: bold;"&gt;Pretty URLs with FriendlyId (RailsCasts)&lt;/a&gt;&lt;br /&gt;
If you are tired of model ids in the URL, overriding to_param can only get you so far. The friendly_id plugin can help by making it easy to generate a URL slug and maintain a history. Ryan Bates shows us how in a mere 7 minutes.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries and code&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/evanphx/puma" style="font-weight: bold;"&gt;Puma: A Ruby Web Server Built For Concurrency&lt;/a&gt;&lt;br /&gt;
Puma is a simple, fast, and highly concurrent HTTP 1.1 server for Ruby webapps. It can be used with any application that supports Rack and makes the audacious claim that it 'is considered the replacement for WEBrick and Mongrel.'
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/mbklein/confstruct" style="font-weight: bold;"&gt;confstruct: Yet Another Configuration Object for Ruby&lt;/a&gt;&lt;br /&gt;
Confstruct optimistically bills itself as 'yet another configuration gem.' It's definable and configurable by hash, struct, or block and aims to provide the flexibility to do things your way, while keeping things simple and intuitive.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/charliesome/coffee-script-pure" style="font-weight: bold;"&gt;coffee-script-pure: A Pure Ruby CoffeeScript Compiler&lt;/a&gt;&lt;br /&gt;
CoffeeScript was originally implemented in Ruby so it's interesting to see Charlie Somerville bring it full circle by reimplementing the current CoffeeScript compiler in pure Ruby.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/gazay/gon-sinatra" style=""&gt;gon-sinatra: Get Your Sinatra Variables in your JavaScript&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/railsware/rack_session_access" style="font-weight: bold;"&gt;rack_session_access: Rack Middleware for 'rack.session' Environment Management&lt;/a&gt;&lt;br /&gt;
rack_session_access makes it possible to change values within the application session of your Rack-backed app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/wtaysom/rglpk" style=""&gt;Rglpk: Ruby Wrapper for the GNU Linear Programming Kit&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/tchype/liquid.js" style=""&gt;liquid.js: A JS, In-Browser Implementation of the Liquid Templating Language&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Ruby Jobs of the Week&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/625475" style="font-weight: bold;"&gt;Ruby and Rails Entwickler bei blau Mobilfunk GmbH [Hamburg, Deutschland]&lt;/a&gt;&lt;br /&gt;Unfortunately I don't speak German but it's great to see a wider variety of locations in the jobs. So if you're looking for a Rails job in Germany or know someome who is, check this out.&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/626668" style=""&gt;Lead Rails Developer at Unpakt [New York, New York]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Last but not least..&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://exceptionalruby.com/"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1584/thumb_exceptional.gif" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://exceptionalruby.com/" style="font-weight: bold;"&gt;Exceptional Ruby: Master The Art of Handling Failure in Ruby&lt;/a&gt;&lt;br /&gt;
I can't help but continue to recommend Avdi Grimm's awesome 'Exceptional Ruby' e-book if you want to dig deep into the world of exceptions and error handling in Ruby. I enjoyed it a lot (and I'm not even making a bean on this recommendation :-))
&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=qSDxYrtbHdo:q4RiDIDk3oA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=qSDxYrtbHdo:q4RiDIDk3oA:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=qSDxYrtbHdo:q4RiDIDk3oA:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/qSDxYrtbHdo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html#comments" thr:count="4" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html/feed/atom" thr:count="4" />
		<thr:total>4</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/the-last-week-in-ruby-rspec-2-8-redcar-0-12-torquebox-2-0-beta-articles-and-more-5787.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[RSpec 2.8: The Popular Ruby BDD Tool Goes Supersonic]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/QpsHKddlqPE/rspec-2-8-released-5772.html" />
		<id>http://www.rubyinside.com/?p=5772</id>
		<updated>2012-01-07T13:55:11Z</updated>
		<published>2012-01-07T13:53:27Z</published>
		<category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p><a href="http://blog.davidchelimsky.net/2012/01/04/rspec-28-is-released/">RSpec 2.8</a> has been released, along with <a href="http://blog.davidchelimsky.net/2012/01/05/rspec-rails-281-is-released/">rspec-rails 2.8.1</a> for the full Rails 3.x integration experience.</p>
<p>RSpec is a BDD-focused testing tool that's particularly popular in the Rails world where everyone <a href="http://www.rubyinside.com/dhh-offended-by-rspec-debate-4610.html">except DHH</a> is using it (if you believe the hoopla). RSpec has faced accusations of being less than speedy in the past, but it seems 2.8 has had a performance firework shoved up its tailpipe:</p>
<p><img src="http://www.rubyinside.com/wp-content/uploads/2012/01/rspec28.gif" alt="" title="rspec28" width="502" height="411" style="border: 3px solid #ccc" class="alignnone size-full wp-image-5781" /></p>
<p>David Chelimsky, the creator of RSpec, also <a href="http://blog.davidchelimsky.net/2012/01/04/rspec-28-is-released/">notes</a> that in RSpec 2.8:</p>
<ul>
<li>the documentation has been significantly improved</li>
<li>there's improved support for tags and filtering</li>
<li>random example running order support (with user definable seed)</li>
<li>rspec --init will create a spec directory and some starter code on a blank project - ideal for Ruby library development!</li> <a href="http://www.rubyinside.com/rspec-2-8-released-5772.html" class="read_more">Read More</a></ul>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/rspec-2-8-released-5772.html">&lt;p&gt;&lt;a href="http://blog.davidchelimsky.net/2012/01/04/rspec-28-is-released/"&gt;RSpec 2.8&lt;/a&gt; has been released, along with &lt;a href="http://blog.davidchelimsky.net/2012/01/05/rspec-rails-281-is-released/"&gt;rspec-rails 2.8.1&lt;/a&gt; for the full Rails 3.x integration experience.&lt;/p&gt;
&lt;p&gt;RSpec is a BDD-focused testing tool that's &lt;em&gt;particularly&lt;/em&gt; popular in the Rails world where everyone &lt;a href="http://www.rubyinside.com/dhh-offended-by-rspec-debate-4610.html"&gt;except DHH&lt;/a&gt; is using it (if you believe the hoopla). RSpec has faced accusations of being less than speedy in the past, but it seems 2.8 has had a performance firework shoved up its tailpipe:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2012/01/rspec28.gif" alt="" title="rspec28" width="502" height="411" style="border: 3px solid #ccc" class="alignnone size-full wp-image-5781" /&gt;&lt;/p&gt;
&lt;p&gt;David Chelimsky, the creator of RSpec, also &lt;a href="http://blog.davidchelimsky.net/2012/01/04/rspec-28-is-released/"&gt;notes&lt;/a&gt; that in RSpec 2.8:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the documentation has been significantly improved&lt;/li&gt;
&lt;li&gt;there's improved support for tags and filtering&lt;/li&gt;
&lt;li&gt;random example running order support (with user definable seed)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rspec --init&lt;/code&gt; will create a &lt;code&gt;spec&lt;/code&gt; directory and some starter code on a blank project - ideal for Ruby library development!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, 2.8 seems like a good step forward, and if you've been feeling a little constipated in the spec running department lately, RSpec 2.8 might help you get things flowing again (though as with Ruby 1.9 vs 1.8, your mileage may vary depending on your usage.)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=QpsHKddlqPE:qkT0tE5BZp4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=QpsHKddlqPE:qkT0tE5BZp4:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=QpsHKddlqPE:qkT0tE5BZp4:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/QpsHKddlqPE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/rspec-2-8-released-5772.html#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/rspec-2-8-released-5772.html/feed/atom" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/rspec-2-8-released-5772.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[The Past 2 Weeks in the World of Ruby: 40 Links to Bring You Up to Speed (January 2012)]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/KX7eBGOMuiA/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html" />
		<id>http://www.rubyinside.com/?p=5766</id>
		<updated>2012-01-06T15:03:41Z</updated>
		<published>2012-01-06T15:03:41Z</published>
		<category scheme="http://www.rubyinside.com" term="Compilation Posts" /><category scheme="http://www.rubyinside.com" term="Miscellaneous" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p><a href="http://rubyweekly.com/">Ruby Weekly</a> has just tipped over 10,000 subscribers but I know not everyone is into getting their news via e-mail, so here's the latest frequent roundup of the latest Ruby and Rails news for you, all on the Web :-)</p>
<h3>Key News, Releases, and Headlines</h3>

<p><a href="http://hungryacademy.com/" style="font-weight: bold;">Hungry Academy Application Process Closes This Weekend</a>
LivingSocial's 'Hungry Academy' will provide a paid, on-site 5 month Ruby and Rails learning experience and mentorship program to a small group of lucky applicants. Interested? You've only got a few days left to apply.
</p>


<p><a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/391607" style="font-weight: bold;">DOS Attack Vulnerability Found in Ruby 1.8's Hash Algorithm</a>
Ruby 1.8.7-p352 and earlier are affected by a wide reaching (as in Python and Java are also affected!) hash related vulnerability. <a href="http://www.rubyinside.com/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html">&lt;p&gt;&lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt; has just tipped over 10,000 subscribers but I know not everyone is into getting their news via e-mail, so here's the latest frequent roundup of the latest Ruby and Rails news for you, all on the Web :-)&lt;/p&gt;
&lt;h3&gt;Key News, Releases, and Headlines&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://hungryacademy.com/" style="font-weight: bold;"&gt;Hungry Academy Application Process Closes This Weekend&lt;/a&gt;&lt;br /&gt;
LivingSocial's 'Hungry Academy' will provide a paid, on-site 5 month Ruby and Rails learning experience and mentorship program to a small group of lucky applicants. Interested? You've only got a few days left to apply.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/391607" style="font-weight: bold;"&gt;DOS Attack Vulnerability Found in Ruby 1.8's Hash Algorithm&lt;/a&gt;&lt;br /&gt;
Ruby 1.8.7-p352 and earlier are affected by a wide reaching (as in Python and Java are also affected!) hash related vulnerability. Ruby 1.9 is entirely unaffected.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jruby.org/2011/12/27/jruby-1-6-5-1" style="font-weight: bold;"&gt;JRuby 1.6.5.1 Released: Fixes the Hashing Vulnerability&lt;/a&gt;&lt;br /&gt;
JRuby 1.6.5.1 is a minor patchlevel release of JRuby that's mostly interesting because of the potential hash-based DOS vulnerability it papers over. Plenty of info in this post.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://kidsruby.com/" style="font-weight: bold;"&gt;KidsRuby 1.0 Released&lt;/a&gt;&lt;br /&gt;
KidsRuby is a kid-focused (but just as useful for adults!) Ruby editor aimed at being an environment for teaching the Ruby language. It includes tutorials and a Logo-esque turtle graphics system for more visual types of learning.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://groups.google.com/group/rack-devel/browse_thread/thread/7dec9712a1a8acf5" style="font-weight: bold;"&gt;Rack 1.4.0 Released&lt;/a&gt;&lt;br /&gt;
Rack is the modular Ruby Web server interface that sits between servers like Apache and nginx and systems like Rails or Sinatra. Rack 1.4 drops support for Ruby 1.8.6 and includes a bevy of tweaks, bug fixes and minor new features (including support for the 'teapot' HTTP status code ;-)).
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released" style=""&gt;Rails 3.2.0 RC2 Released: Rails 3.2 Gets A Step Closer&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/sstephenson/rbenv" style=""&gt;rbenv 0.3.0 Released: Minor Updates and Fixes&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Articles and Tutorials&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://patshaughnessy.net/2012/1/4/never-create-ruby-strings-longer-than-23-characters" style="font-weight: bold;"&gt;Never Create Ruby Strings Longer Than 23 Characters&lt;/a&gt;&lt;br /&gt;
A linkbaity title but an interesting article nonetheless by Pat Shaughnessy about a curiosity of how MRI Ruby 1.9 handles strings. Why are 24 byte strings far slower to process than 23 byte ones? Find out here.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://pivotallabs.com/users/dwfrank/blog/articles/1972-giving-rails-2-the-asset-pipeline" style="font-weight: bold;"&gt;Giving Rails 2 the Rails 3.1 Asset Pipeline&lt;/a&gt;&lt;br /&gt;
Not quite ready for Rails 3.1 yet but still want an asset pipeline on your Rails 2 app? Davis W Frank was in that situation and in this post explains how he sorted it out.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://ablogaboutcode.com/2012/01/04/the-ampersand-operator-in-ruby/" style="font-weight: bold;"&gt;The &amp;#038; Operator in Ruby&lt;/a&gt;&lt;br /&gt;
Pan Thomakos looks at the uses for the &amp;amp; operator and its associated methods in Ruby, including bitwise ANDing, set intersection, and the unary &amp;amp;.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://collectiveidea.com/blog/archives/2012/01/04/the-big-three-oh/" style=""&gt;DelayedJob 3.0 Release Rundown&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://aws.typepad.com/aws/2012/01/how-collections-work-in-the-aws-sdk-for-ruby.html" style=""&gt;How Collections Work in the AWS SDK for Ruby&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://apigee.com/console/rubygems" style="font-weight: bold;"&gt;Ruby Gems API Console: Play with RubyGems.org's API on the Web&lt;/a&gt;&lt;br /&gt;
An interesting API console that's set up to play with the RubyGems.org JSON API. Click the drop down to the left to see all of the prebuilt requests.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://www.mattsears.com/articles/2011/12/10/minitest-quick-reference?" style="font-weight: bold;"&gt;MiniTest Quick Reference&lt;/a&gt;&lt;br /&gt;
MiniTest is the unit testing library that comes in the Ruby 1.9 standard library and which also acts as a compatibility layer for test/unit on 1.9. Matt Sears has put together a handy round up of the assertions and matchers offered by MiniTest::Unit and MiniTest::Spec.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.rubybestpractices.com/posts/gregory/060-issue-26-structural-design-patterns.html" style="font-weight: bold;"&gt;Structural Design Patterns in Ruby&lt;/a&gt;&lt;br /&gt;
Gregory Brown looks at seven structural design patterns laid out by the Gang of Four, the Adapter, Bridge, Composite, Proxy, Decorator, Facade and Flyweight.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://blog.wyeworks.com/2011/12/27/bundle-exec-rails-executes-bundler-setup-3-times" style="font-weight: bold;"&gt;'bundle exec rails' Executes Bundler.setup 3 Times&lt;/a&gt;&lt;br /&gt;
Rails core team member Santiago Pastorino notes that running 'bundle exec rails' is an inefficient mistake and explains why. (TLDR: Just use 'rails', it'll work out the particulars.)
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://afreshcup.com/home/2011/12/28/one-and-two-letter-gems.html" style="font-weight: bold;"&gt;1 and 2 Letter Ruby Gems&lt;/a&gt;&lt;br /&gt;
Mike Gunderloy looks at Ruby gems that only have a single letter as their name. It's a mixture of junk and curiosities.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://leanpub.com/combinators" style="font-weight: bold;"&gt;'Kestrels, Quirky Birds, and Hopeless Egocentricity' by Reg Braithwaite&lt;/a&gt;&lt;br /&gt;
Ruby's own 'Raganwald' has compiled his essays about combinatory logic, method combinators and Ruby meta-programming into a handy and inexpensive e-book. Cerebral stuff.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in" style=""&gt;Evaluating Alternative Decorator Implementations in Ruby&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://myronmars.to/n/dev-blog/2011/12/deprecating-a-legacy-subsystem-in-rails" style=""&gt;Deprecating a Legacy Subsystem in Rails&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Libraries and code&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/jonasschneider/momentum" style="font-weight: bold;"&gt;Momentum: A Rack Handler for SPDY Clients&lt;/a&gt;&lt;br /&gt;
SPDY is a experimental networking protocol developed by Google (and already used in Chrome) for delivering Web content more quickly. Momentum is a Rack handler that can receive connections from SPDY clients and run Rack apps. Lots of info in the README.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/seancribbs/webmachine-ruby" style="font-weight: bold;"&gt;Webmachine: Expose Your App's Resources Via HTTP Declaratively&lt;/a&gt;&lt;br /&gt;
webmachine-ruby is a port of Erlang's Webmachine. Both projects aim to expose parts of the HTTP protocol to your application in a declarative way, so you're less concerned with handling requests directly and more with describing the behavior of the resources in your app.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/jamesotron/emberjs-rails" style="font-weight: bold;"&gt;EmberJS-Rails: Ember.js for Rails 3.1 Developers&lt;/a&gt;&lt;br /&gt;
Ember.js is the new name for the Sproutcore 2.0 framework, a powerful system for building rich JavaScript-driven Web applications.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://celluloid.github.com/" style="font-weight: bold;"&gt;Celluloid 0.7: Actors for Concurrent Programming in Ruby&lt;/a&gt;&lt;br /&gt;
Celluloid provides a simple and natural way to build fault-tolerant concurrent programs in Ruby. With Celluloid, you can build systems out of concurrent objects just as easily as you build sequential programs out of regular objects. 0.7 has just been released.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://github.com/leshill/hogan_assets" style=""&gt;hogan_assets: Compiles Mustache Templates with Hogan.js on Sprockets&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://gitview.logicalcognition.com/" style="font-weight: bold;"&gt;Gitview: A JS Widget to List GitHub Repositories&lt;/a&gt;&lt;br /&gt;
Gitview is a JavaScript widget you can include on any page to show off your GitHub repositories. Github-badge has done this for years, but Gitview has an interesting GitHub style presentation format including the weekly commit bars.
&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Screencasts, Presentations, and Podcasts&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/34522837" style="font-weight: bold;"&gt;Some Thoughts on Ruby Classes After 18 Months of Clojure&lt;/a&gt;&lt;br /&gt;
An enjoyable 25 minute romp through Brian Marick's thoughts on structuring objects in Ruby based on his experiences with the Clojure Lisp dialect.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://railscasts.com/episodes/312-sending-html-email" style="font-weight: bold;"&gt;Sending HTML Email (RailsCasts)&lt;/a&gt;&lt;br /&gt;
Ryan Bates is back for his weekly RailsCasts episode, this time looking at how to not only send HTML e-mail, but how to put it together (along with the obligatory inline CSS) too.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://rubini.us/2012/01/04/debugging-rubinius/" style="font-weight: bold;"&gt;Debugging Scary Crashes of Rubinius&lt;/a&gt;&lt;br /&gt;
Dirkjan Bussink has been debugging memory corruption in Rubinius and has put together a 55 minute video explaining how he debugged it. Surely a must watch for any wannabe Rubinius hackers. A 453MB download though..
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://confreaks.net/videos/759-rubymidwest2011-keynote-architecture-the-lost-years" style="font-weight: bold;"&gt;'Architecture the Lost Years' by Robert Martin at Ruby Midwest 2011&lt;/a&gt;&lt;br /&gt;
I really enjoyed this keynote by 'Uncle Bob' at the recent Ruby Midwest 2011 conference. He talks about application architecture and how the typical 'Rails way' of approaching it has key disadvantages compared to a decoupled approach.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://confreaks.net/videos/752-rubymidwest2011-activerecord-anti-patterns-for-fun-and-profit" style="font-weight: bold;"&gt;ActiveRecord Anti-Patterns for Fun and Profit&lt;/a&gt;&lt;br /&gt;
At November's Ruby Midwest 2011, Ethan Gunderson gave a talk on common mistakes made when working with ActiveRecord and how to make everything all better.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://confreaks.net/videos/645-gogaruco2011-smalltalk-on-rubinius-or-how-to-implement-your-own-programming-language" style="font-weight: bold;"&gt;Smalltalk On Rubinius (or How to Implement Your Own Programming Language)&lt;/a&gt;&lt;br /&gt;
At September's Golden Gate Ruby Conference, Konstantin Haase gave a talk about implementing a programming language using Ruby and the Rubinius compiler tool chain.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://railscasts.com/episodes/310-getting-started-with-rails" style="font-weight: bold;"&gt;Getting Started with Rails: RailsCasts&lt;/a&gt;&lt;br /&gt;
Ryan Bates takes it back to basics this week with a quick 7 minute sweep through some of the sites, tools, and books you'll find useful when starting out with Rails as of late 2011.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="https://workshops.thoughtbot.com/vim" style="font-weight: bold;"&gt;Vim for Rails Developers Screencast&lt;/a&gt;&lt;br /&gt;
An inexpensive 34 minute screencast by Ben Orenstein that teaches you how to use the popular Vim text editor when working with Rails projects. Ben has a lot of experience in this area.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://rubyrogues.com/034-rr-benchmarking-and-profiling/" style="font-weight: bold;"&gt;The Ruby Rogues on Benchmarking and Profiling&lt;/a&gt;&lt;br /&gt;
Aaron 'tenderlove' Patterson rejoins the Rogues for an hour long chat about benchmarking and profiling Ruby code. There's a lot of depth here and it makes for a typically good and roguish listen.
&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://bostonrb.org/presentations/macruby-for-fun-and-profit" style=""&gt;MacRuby for Fun and Profit by Joshua Ballanco (55 minutes)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Ruby Jobs&lt;/h3&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
  &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/624627"&gt;&lt;img src="http://s3.amazonaws.com/nlga/uploads/item/image/1468/thumb_newrelic-logo-square-rgbhex4.jpeg" width="133" height="100" style="float: right; margin-left: 14px; margin-bottom: 16px; border: 1px solid #1173c7" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/624627" style="font-weight: bold;"&gt;C/Unix Agent Engineer [Portland, Oregon]&lt;/a&gt;&lt;br /&gt;New Relic, the Web app performance monitoring and management folks, are looking for someone who loves Ruby but is an experienced C or C++ developer who understands multithreading, database contention, and object-oriented design.&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/621519" style=""&gt;Senior Java/Ruby Software Engineer at Outbid.com [Oakland, California]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/616741" style=""&gt;Software Developer at Geoforce, Inc. [Lewisville, Texas]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style="margin: 16px 0px;" class="item"&gt;
&lt;p&gt;&lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/618778" style=""&gt;Network Software Engineer at Carnegie Mellon University [Pittsburgh, Pennsylvania]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=KX7eBGOMuiA:xMVdQz_apbs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=KX7eBGOMuiA:xMVdQz_apbs:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=KX7eBGOMuiA:xMVdQz_apbs:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/KX7eBGOMuiA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/the-past-2-weeks-in-the-world-of-ruby-40-links-to-bring-you-up-to-speed-january-2012-5766.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[9 Ruby and Rails Jobs for January 2012]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/hM_2__bo8aM/9-ruby-and-rails-jobs-for-january-2012-5759.html" />
		<id>http://www.rubyinside.com/?p=5759</id>
		<updated>2012-01-02T22:06:14Z</updated>
		<published>2012-01-02T22:06:14Z</published>
		<category scheme="http://www.rubyinside.com" term="Miscellaneous" />		<summary type="html"><![CDATA[<p><img src="http://www.rubyinside.com/wp-content/uploads/2011/01/jobs.png" width="97" height="111" alt="jobs.png" style="float:right; margin-bottom:12px; margin-left:12px; border:1px #000000 solid;" />Recently Forbes <a href="http://www.forbes.com/sites/venkateshrao/2011/12/05/the-rise-of-developeronomics/">wrote about the rise of 'developernomics'</a>, noting that companies are seeing programmers as a 'safe haven' investment in otherwise troubled times. Maybe.. <a href="http://www.knowing.net/index.php/2011/12/09/forbes-is-wrong-about-developernomics/">maybe not..</a> but the Ruby and Rails job market is as hot as ever, so if you're looking for a new position, be sure to negotiate well! ;-)</p>
<p>To promote a job, <a href="http://www.rubyinside.com/post-a-job">see our Post A Job page.</a> Your listing not only ends up on the Ruby Inside and RubyFlow sidebars but also in the 10114 subscriber <a href="http://rubyweekly.com/">Ruby Weekly</a> for free (as a bonus) and on our 7305 follower <a href="twitter.com/rubyinside">@rubyinside</a> Twitter account.</p>
<h3>Senior Engineer - Edinburgh, United Kingdom</h3>
<p>FreeAgent, the pioneers in web-based accounting, is <a href="http://jobs.rubyinside.com/a/jbb/job-details/609455">looking for a senior engineer</a> to join their engineering team in a brand new office in beautiful Edinburgh. <a href="http://www.rubyinside.com/9-ruby-and-rails-jobs-for-january-2012-5759.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/9-ruby-and-rails-jobs-for-january-2012-5759.html">&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/01/jobs.png" width="97" height="111" alt="jobs.png" style="float:right; margin-bottom:12px; margin-left:12px; border:1px #000000 solid;" /&gt;Recently Forbes &lt;a href="http://www.forbes.com/sites/venkateshrao/2011/12/05/the-rise-of-developeronomics/"&gt;wrote about the rise of 'developernomics'&lt;/a&gt;, noting that companies are seeing programmers as a 'safe haven' investment in otherwise troubled times. Maybe.. &lt;a href="http://www.knowing.net/index.php/2011/12/09/forbes-is-wrong-about-developernomics/"&gt;maybe not..&lt;/a&gt; but the Ruby and Rails job market is as hot as ever, so if you're looking for a new position, be sure to negotiate well! ;-)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To promote a job, &lt;a href="http://www.rubyinside.com/post-a-job"&gt;see our Post A Job page.&lt;/a&gt; Your listing not only ends up on the Ruby Inside and RubyFlow sidebars but also in the 10114 subscriber &lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt; for free (as a bonus) and on our 7305 follower &lt;a href="twitter.com/rubyinside"&gt;@rubyinside&lt;/a&gt; Twitter account.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Senior Engineer - &lt;/span&gt;Edinburgh, United Kingdom&lt;/h3&gt;
&lt;p&gt;FreeAgent, the pioneers in web-based accounting, is &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/609455"&gt;looking for a senior engineer&lt;/a&gt; to join their engineering team in a brand new office in beautiful Edinburgh. It's a fantastic opportunity to join a young, exciting and fast-growing company, and help develop a much-loved and high-traffic customer-facing web app &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/609455"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Ruby Developers (Jr and Sr) for Awesome Social Media Tech Co. - &lt;/span&gt;Redwood City, California&lt;/h3&gt;
&lt;p&gt;Wildfire Interactive is &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/616654"&gt;looking for a Ruby Developers (both junior and senior)&lt;/a&gt; to work on social media technology (lots of working with the Twitter API, for example). They want truly talented Ruby developers with a passion for clean code and great products. Their current technology stack includes Ruby on Rails &amp;#038; Sinatra, and they're in the process of building a number of pure Ruby components so it's not just a Rails job &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/616654"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Ruby on Rails Developer - &lt;/span&gt;Austin, Texas&lt;/h3&gt;
&lt;p&gt;Facilities Technology Group is a small company with a software product used by thousands of hospitals around the country to manage and maintain the maintenance of equipment. They're busy migrating an old ASP classic based version of their product to Rails and are &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/607339"&gt;looking for a Ruby on Rails Developer&lt;/a&gt; to help join the team to make it happen &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/607339"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Back and Front End Developers at New Relic - &lt;/span&gt;Portland, Oregon&lt;/h3&gt;
&lt;p&gt;If you've been reading Ruby Inside for a while, you'll already know New Relic, the leaders in webapp performance management and monitoring. They've got a couple of different positions open, first they're &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/610689"&gt;looking for a back end Rails developer&lt;/a&gt; and.. &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/610733"&gt;a front-end Rails developer too!&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Software Engineer and Generalist - &lt;/span&gt;San Francisco, California&lt;/h3&gt;
&lt;p&gt;Samasource is an award-winning technology social enterprise that provides dignified, internet-based work to people living in poverty. They're &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/612330"&gt;looking for a Software Engineer / generalist&lt;/a&gt; to join their team and write code that meaningfully impacts the human condition &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/612330"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Software Developer - &lt;/span&gt;Lewisville, Texas&lt;/h3&gt;
&lt;p&gt;Geoforce, Inc. is &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/616741"&gt;looking for a Ruby and JavaScript Developer&lt;/a&gt; to work in a team environment to write and maintain Ruby and Javascript code. Experience with geospatial tools is a big plus &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/616741"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Senior Java/Ruby Software Engineer - &lt;/span&gt;Oakland, California&lt;/h3&gt;
&lt;p&gt;Outbid.com is a unique peer-to-peer auctioning platform designed to allow users to host their very own live online auctions. They're &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/621519"&gt;looking for a senior Java/Ruby Software Engineer&lt;/a&gt; to join their growing product development team &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/621519"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;span style="color: #999"&gt;Network Software Engineer - &lt;/span&gt;Pittsburgh, Pennsylvania&lt;/h3&gt;
&lt;p&gt;Carnegie Mellon University is &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/618778"&gt;looking for a Network Software Engineer&lt;/a&gt; to be responsible for the design and development of network-related systems and services that operate, automate, and protect Carnegie Mellon's campus and global data networks &amp;mdash; &lt;a href="http://jobs.rubyinside.com/a/jbb/job-details/618778"&gt;click here to learn more.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To promote a job, &lt;a href="http://www.rubyinside.com/post-a-job"&gt;see our Post A Job page.&lt;/a&gt; Your listing not only ends up on the Ruby Inside and RubyFlow sidebars but also in the 10114 subscriber &lt;a href="http://rubyweekly.com/"&gt;Ruby Weekly&lt;/a&gt; for free (as a bonus) and on our 7305 follower &lt;a href="twitter.com/rubyinside"&gt;@rubyinside&lt;/a&gt; Twitter account.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=hM_2__bo8aM:0E2QCYS0cXM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=hM_2__bo8aM:0E2QCYS0cXM:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=hM_2__bo8aM:0E2QCYS0cXM:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/hM_2__bo8aM" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/9-ruby-and-rails-jobs-for-january-2012-5759.html#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/9-ruby-and-rails-jobs-for-january-2012-5759.html/feed/atom" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/9-ruby-and-rails-jobs-for-january-2012-5759.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[Let&#8217;s Build a Simple Video Game with JRuby: A Tutorial]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/JnT3ecf6gXo/video-game-ruby-tutorial-5726.html" />
		<id>http://www.rubyinside.com/?p=5726</id>
		<updated>2011-12-15T01:51:30Z</updated>
		<published>2011-12-15T00:34:25Z</published>
		<category scheme="http://www.rubyinside.com" term="Cool" /><category scheme="http://www.rubyinside.com" term="JRuby" /><category scheme="http://www.rubyinside.com" term="Tutorials" />		<summary type="html"><![CDATA[<p>Ruby isn't known for its game development chops despite having a <a href="http://mon-ouie.github.com/projects/ray.html">handful</a> <a href="http://rubygame.org/">of</a> <a href="http://www.libgosu.org/">interesting</a> <a href="https://github.com/ippa/chingu">libraries</a> suited to it. Java, on the other hand, has a thriving and popular game development scene flooded with powerful libraries, tutorials and <a href="http://www.java-gaming.org/">forums.</a> Can we drag some of Java's thunder kicking and screaming over to the world of Ruby? Yep! - thanks to <a href="http://jruby.org/">JRuby.</a> Let's run through the steps to build a simple 'bat and ball' game now.</p>
<p><img src="http://www.rubyinside.com/wp-content/uploads/2011/12/mast.jpg" alt="" title="mast" width="640" height="324" class="alignnone size-full wp-image-5742" /></p>
<h3>The Technologies We'll Be Using</h3>
JRuby
<p>If you're part of the "meh, JRuby" brigade, suspend your disbelief for a minute. JRuby is easy to install, easy to use, and isn't going to trample all over your system or suck up all your memory. <a href="http://www.rubyinside.com/video-game-ruby-tutorial-5726.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/video-game-ruby-tutorial-5726.html">&lt;p&gt;Ruby isn't known for its game development chops despite having a &lt;a href="http://mon-ouie.github.com/projects/ray.html"&gt;handful&lt;/a&gt; &lt;a href="http://rubygame.org/"&gt;of&lt;/a&gt; &lt;a href="http://www.libgosu.org/"&gt;interesting&lt;/a&gt; &lt;a href="https://github.com/ippa/chingu"&gt;libraries&lt;/a&gt; suited to it. Java, on the other hand, has a thriving and popular game development scene flooded with powerful libraries, tutorials and &lt;a href="http://www.java-gaming.org/"&gt;forums.&lt;/a&gt; Can we drag some of Java's thunder kicking and screaming over to the world of Ruby? Yep! - thanks to &lt;a href="http://jruby.org/"&gt;JRuby.&lt;/a&gt; Let's run through the steps to build a simple 'bat and ball' game now.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/mast.jpg" alt="" title="mast" width="640" height="324" class="alignnone size-full wp-image-5742" /&gt;&lt;/p&gt;
&lt;h3&gt;The Technologies We'll Be Using&lt;/h3&gt;
&lt;h4&gt;JRuby&lt;/h4&gt;
&lt;p&gt;If you're part of the "meh, JRuby" brigade, suspend your disbelief for a minute. JRuby is easy to install, easy to use, and isn't going to trample all over your system or suck up all your memory. It will be OK!&lt;/p&gt;
&lt;p&gt;One of &lt;a href="http://jruby.org/"&gt;JRuby's&lt;/a&gt; killer features is its ability to use Java libraries and generally dwell as a first class citizen on the &lt;a href="http://en.wikipedia.org/wiki/Java_Virtual_Machine"&gt;JVM.&lt;/a&gt; JRuby lets us use performant Java powered game development libraries in a Rubyesque way, lean on Java-based tutorials, and basically &lt;em&gt;have our cake and eat it too.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;To install JRuby, I recommend &lt;a href="http://beginrescueend.com/"&gt;RVM&lt;/a&gt; (Ruby Version Manager). I think the JRuby core team prefer you to use their own installer but &lt;code&gt;rvm install jruby&lt;/code&gt; has always proven quick and effective for me. Once you get it installed, &lt;code&gt;rvm use jruby&lt;/code&gt; and you're done.&lt;/p&gt;
&lt;h4&gt;Slick and LWJGL&lt;/h4&gt;
&lt;p&gt;The &lt;a href="http://slick.cokeandcode.com/"&gt;Slick&lt;/a&gt; library is a thin layer of structural classes over the top of &lt;a href="http://lwjgl.org/"&gt;LWJGL&lt;/a&gt; (Lightweight Java Game Library), a mature and popular library that abstracts away most of the boring system level work.&lt;/p&gt;
&lt;p&gt;Out of the box LWJGL gives us OpenGL for graphics, OpenAL for audio, controller inputs, and even OpenCL if we wanted to do heavy parallelism or throw work out to the GPU. Slick gives us constructs like game states, geometry, particle effects, and SVG integration, while allowing us to drop down to using LWJGL for anything we like. &lt;/p&gt;
&lt;h3&gt;Getting Started: Installing Slick and LWJGL&lt;/h3&gt;
&lt;p&gt;Rather than waste precious time on theory, let's get down to the nitty gritty of getting a basic window and some graphics on screen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, create a folder in which to store your game and its associated files. From here I'll assume it's &lt;code&gt;/mygame&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Go to the &lt;a href="http://slick.cokeandcode.com/"&gt;Slick homepage&lt;/a&gt; and choose "Download Full Distribution" (&lt;a href="http://slick.cokeandcode.com/downloads/slick.zip"&gt;direct link to .zip here&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Unzip the download and copy the &lt;code&gt;lib&lt;/code&gt; folder into your &lt;code&gt;/mygame&lt;/code&gt; as &lt;code&gt;/mygame/lib&lt;/code&gt; - this folder includes both LWGWL and Slick.&lt;/li&gt;
&lt;li&gt;In &lt;code&gt;/mygame/lib&lt;/code&gt;, we need to unpack the &lt;code&gt;natives-[your os].jar&lt;/code&gt; file and move its contents directly into &lt;code&gt;/mygame&lt;/code&gt;.
&lt;p&gt;&lt;strong&gt;Mac OS X:&lt;/strong&gt; Right click on the &lt;code&gt;natives-mac.jar&lt;/code&gt; file and select to unarchive it (if you have a problem, grab the awesome free &lt;em&gt;The Unarchiver&lt;/em&gt; from the App Store) then drag the files in &lt;code&gt;/mygame/lib/native-mac/*&lt;/code&gt; directly into &lt;code&gt;/mygame&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Linux and Windows:&lt;/em&gt; Running &lt;code&gt;jar -xf natives-linux.jar&lt;/code&gt; or &lt;code&gt;jar -xf natives-win32.jar&lt;/code&gt; and copying the extracted files back to &lt;code&gt;/mygame&lt;/code&gt; should do the trick.&lt;/li&gt;
&lt;li&gt;Now your project folder should look a little like this:
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/files.png" alt="" title="files" width="422" height="452" class="alignnone size-full wp-image-5739" /&gt;&lt;/p&gt;
&lt;p&gt;If so, we're ready to code.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;A Bare Bones Example&lt;/h3&gt;
&lt;p&gt;Leaping in with a bare bones example, create &lt;code&gt;/mygame/verybasic.rb&lt;/code&gt; and include this code:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="vg"&gt;$:&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../lib&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;java&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lwjgl.jar&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;slick.jar&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicGame&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GameContainer&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SlickException&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AppGameContainer&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Demo&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;BasicGame&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;JRuby Demo (ESC to exit)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# Due to how Java decides which method to call based on its&lt;/span&gt;
  &lt;span class="c1"&gt;# method prototype, it&amp;#39;s good practice to fill out all necessary&lt;/span&gt;
  &lt;span class="c1"&gt;# methods even with empty definitions.&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Grab input and exit if escape is pressed&lt;/span&gt;
    &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_input&lt;/span&gt;
    &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_key_down&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;KEY_ESCAPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;AppGameContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Demo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SlickDemo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_display_mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Ensure &lt;span&gt;that &lt;code&gt;ruby&lt;/code&gt; actually runs JRuby (using &lt;code&gt;ruby -v&lt;/code&gt;) and then run it from the command line with &lt;code&gt;ruby verybasic.rb&lt;/code&gt;. Assuming all goes well, you'll see this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/demo1.jpg" alt="" title="demo1" width="640" height="507" class="alignnone size-full wp-image-5738" /&gt;&lt;/p&gt;
&lt;p&gt;If you don't see something like the above, feel free to comment here, but your problems most likely orient around not having the right 'native' libraries in the current directory or from not running the game in its own directory in the first place (if you get &lt;code&gt;probable missing dependency: no lwjgl in java.library.path&lt;/code&gt; - bingo).&lt;/p&gt;
&lt;h4&gt;Explanation of the demo code&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$:.push File.expand_path('../lib', __FILE__)&lt;/code&gt; pushes the 'lib' folder onto the load path. (I've used &lt;code&gt;push&lt;/code&gt; because my preferred &amp;lt;&amp;lt; approach breaks WordPress ;-))&lt;/li&gt;
&lt;li&gt;&lt;code&gt;require 'java'&lt;/code&gt; enables a lot of JRuby's Java integration functionality.&lt;/li&gt;
&lt;li&gt;Note that we can use &lt;code&gt;require&lt;/code&gt; to load the .jar files from the lib directory.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;java_import&lt;/code&gt; lines bring the named classes into play. It's a &lt;em&gt;little&lt;/em&gt; like &lt;code&gt;include&lt;/code&gt;, but not quite.&lt;/li&gt;
&lt;li&gt;We lean on Slick's &lt;code&gt;BasicGame&lt;/code&gt; class by subclassing it and adding our own functionality.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;render&lt;/code&gt; is called frequently by the underlying game engine. All activities relevant to rendering the game window go here.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt; is called when a game is started.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update&lt;/code&gt; is called frequently by the underlying game engine. Activities related to updating game data or processing input can go here.&lt;/li&gt;
&lt;li&gt;The code at the end of the file creates a new &lt;code&gt;AppGameContainer&lt;/code&gt; which in turn is given an instance of our game. We set the resolution to 640x480, ensure it's not in full screen mode, and start the game.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Fleshing Out a Bat and Ball Game&lt;/h3&gt;
&lt;p&gt;The demo above is &lt;em&gt;something&lt;/em&gt; but there are no graphics or a game mechanic, so it's far from being a 'video game.' Let's flesh it out to include some images and a simple pong-style bat and ball mechanic.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Note: I'm going to ignore most structural and object oriented concerns to flesh out this basic prototype. The aim is to get a game running and to understand how to use some of Slick and LWJGL's features. We can do it again properly later :-)&lt;/p&gt;
&lt;p&gt;All of the assets and code files demonstrated here are also available &lt;a href="http://ruby-inside.s3.amazonaws.com/mygame.zip"&gt;in an archive&lt;/a&gt; if you get stuck. Doing it all by hand to start with will definitely help though.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;A New Code File&lt;/h4&gt;
&lt;p&gt;Start a new game file called &lt;code&gt;pong.rb&lt;/code&gt; and start off with this new bootstrap code (very much like the demo above but with some key tweaks):&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="vg"&gt;$:&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expand_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;../lib&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;java&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lwjgl.jar&amp;#39;&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;slick.jar&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BasicGame&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GameContainer&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Graphics&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Image&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SlickException&lt;/span&gt;
&lt;span class="n"&gt;java_import&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newdawn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AppGameContainer&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PongGame&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;BasicGame&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;RubyPong (ESC to exit)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_input&lt;/span&gt;
    &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_key_down&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;KEY_ESCAPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;AppGameContainer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;PongGame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;RubyPong&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_display_mode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Make sure it runs, then move on to fleshing it &lt;span&gt;out.&lt;/p&gt;
&lt;h4&gt;A Background Image&lt;/h4&gt;
&lt;p&gt;It'd be nice for our game to have an elegant background. I've created one called &lt;code&gt;bg.png&lt;/code&gt; which you can drag or copy and paste from here (so it becomes &lt;code&gt;/mygame/bg.png&lt;/code&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rubyinside.com/wp-content/uploads/2011/12/bg.png"&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/bg.png" alt="" title="bg" width="640" height="480" class="alignnone size-full wp-image-5737" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now we want to load the background image when the game starts and render it constantly.&lt;/p&gt;
&lt;p&gt;To load the game at game start, update the &lt;code&gt;init&lt;/code&gt; and &lt;code&gt;render&lt;/code&gt; methods like so:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@bg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;RubyPong (ESC to exit)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@bg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bg.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;@bg&lt;/code&gt; instance variable picks up an image and then we issue its &lt;code&gt;draw&lt;/code&gt; method to draw it on to the window every time the game engine demands that the game render itself. Run &lt;code&gt;pong.rb&lt;/code&gt; and check it out.&lt;/p&gt;
&lt;h4&gt;Adding A Ball and Paddle&lt;/h4&gt;
&lt;p&gt;Adding a ball and paddle is similar to doing the background. So let's give it a go:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@bg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@ball&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@ball_y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@paddle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@paddle_x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;RubyPong (ESC to exit)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@bg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bg.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@ball&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ball.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@paddle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;paddle.png&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;The graphics for &lt;code&gt;ball.png&lt;/code&gt; and &lt;code&gt;paddle.png&lt;/code&gt; are here. Place them directly in &lt;code&gt;/mygame&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rubyinside.com/wp-content/uploads/2011/12/ball.png"&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/ball.png" alt="" title="ball" width="30" height="30" class="alignnone size-full wp-image-5736" /&gt;&lt;/a&gt; &lt;a href="http://www.rubyinside.com/wp-content/uploads/2011/12/paddle.png"&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/paddle.png" alt="" title="paddle" width="120" height="30" class="alignnone size-full wp-image-5743" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We now have this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/game2.jpg" alt="" title="game2" width="640" height="497" class="alignnone size-full wp-image-5741" /&gt;&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Note: As I said previously, we're ignoring good OO practices and structural concerns here but in the long run having separate classes for paddles and balls would be useful since we could encapsulate the position information and sprites all together. For now, we'll 'rough it' for speed.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h4&gt;Making the Paddle Move&lt;/h4&gt;
&lt;p&gt;Making the paddle move is pretty easy. We already have an input handler in &lt;code&gt;update&lt;/code&gt; dealing with the Escape key. Let's extend it to allowing use of the arrow keys to update &lt;code&gt;@paddle_x&lt;/code&gt; too:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_input&lt;/span&gt;
  &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_key_down&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;KEY_ESCAPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_key_down&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;KEY_LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_key_down&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;KEY_RIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vi"&gt;@paddle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;
    &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;It's crude but it works! (P.S. I'd normally use &lt;code&gt;&amp;#038;&amp;&lt;/code&gt; instead of &lt;code&gt;and&lt;/code&gt; but WordPress is being a bastard - I swear I'm switching one day.)&lt;/p&gt;
&lt;p&gt;If the left arrow key is detected and the paddle isn't off the left hand side of the screen, &lt;code&gt;@paddle_x&lt;/code&gt; is reduced by &lt;code&gt;0.3 * delta&lt;/code&gt; and vice versa for the right arrow.&lt;/p&gt;
&lt;p&gt;The reason for using &lt;code&gt;delta&lt;/code&gt; is because we don't know how often &lt;code&gt;update&lt;/code&gt; is being called. &lt;code&gt;delta&lt;/code&gt; contains the number of milliseconds since &lt;code&gt;update&lt;/code&gt; was last called so we can use it to 'weight' the changes we make. In this case I want to limit the paddle to moving at 300 pixels per second and 0.3 * 1000 (1000ms = 1s) == 300.&lt;/p&gt;
&lt;h4&gt;Making the Ball Move&lt;/h4&gt;
&lt;p&gt;Making the ball move is similar to the paddle but we'll be basing the &lt;code&gt;@ball_x&lt;/code&gt; and &lt;code&gt;@ball_y&lt;/code&gt; changes on &lt;code&gt;@ball_angle&lt;/code&gt; using a little basic trigonometry.&lt;/p&gt;
&lt;p&gt;If you stretch your mind back to high school, you might recall that we can use sines and cosines to work out the offset of a point at a certain angle within a &lt;a href="http://en.wikipedia.org/wiki/Unit_circle"&gt;unit circle.&lt;/a&gt; For example, our ball is currently moving at an angle of &lt;code&gt;45&lt;/code&gt;, so:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# =&amp;gt; 0.707106781186547&lt;/span&gt;
&lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# =&amp;gt; 0.707106781186548&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: The &lt;code&gt;* Math::PI / 180&lt;/code&gt; is to convert degrees into radians.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We can use these figures as deltas by which to move our ball based upon a chosen ball speed and the &lt;code&gt;delta&lt;/code&gt; time variable that Slick gives us.&lt;/p&gt;
&lt;p&gt;Add this code to the end of &lt;code&gt;update&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="vi"&gt;@ball_y&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;If you run the game now, the ball will move up and right at an angle of 45 degrees, though it will continue past the game edge and never return. We have more logic to do!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: We use &lt;code&gt;-=&lt;/code&gt; with &lt;code&gt;@ball_y&lt;/code&gt; because sines and cosines use regular cartesian coordinates where the y axis goes from bottom to top, not top to bottom as screen coordinates do.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Add some more code to &lt;code&gt;update&lt;/code&gt; to deal with ball reflections:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vi"&gt;@ball&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;This code is butt ugly and pretty naive (get ready for a nice OO design assignment later) but it'll do the trick for now. Run the game again and you'll notice the ball hop through a couple of bounces off of the walls and then off of the bottom of the &lt;span&gt;screen.&lt;/p&gt;
&lt;h4&gt;Resetting the Game on Failure&lt;/h4&gt;
&lt;p&gt;When the ball flies off of the bottom of the screen, we want the game to restart. Let's add this to &lt;code&gt;update&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@ball_y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;
  &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;It's pretty naive again, but does the trick. Ideally, we would have a method specifically designed to reset the game environment, but our game is so simple that we'll stick to the basics.&lt;/p&gt;
&lt;h4&gt;Paddle and Ball Action&lt;/h4&gt;
&lt;p&gt;We want our paddle to hit the ball! All we need to do is cram another check into &lt;code&gt;update&lt;/code&gt; (poor method - promise to refactor it later!) to get things going:&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="vi"&gt;@ball_x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@paddle_x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="vi"&gt;@paddle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="vi"&gt;@ball_y&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;round&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vi"&gt;@ball&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@ball_angle&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: WordPress has borked the less than operator in the code above. Eugh. Fix that by hand ;-)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And bingo, we have it. Run the game and give it a go. We have a simple, but performant, video game running on JRuby.&lt;/p&gt;
&lt;p&gt;If you'd prefer everything packaged up and ready to go, &lt;a href="http://ruby-inside.s3.amazonaws.com/mygame.zip"&gt;grab this archive file of my /mygame directory.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;What Next?&lt;/h3&gt;
&lt;h4&gt;Object orientation&lt;/h4&gt;
&lt;p&gt;As I've taken pains to note throughout this article, the techniques outlined above for maintaining the ball and paddle are naive - an almost C-esque approach.&lt;/p&gt;
&lt;p&gt;Building separate classes to maintain the sprite, position, and the logic associated with them (such as bouncing) will clean up the &lt;code&gt;update&lt;/code&gt; method significantly. I leave this as a task for you, dear reader!&lt;/p&gt;
&lt;h4&gt;Stateful Games&lt;/h4&gt;
&lt;p&gt;Games typically have multiple states, including menus, game play, levels, high score screens, and so forth. Slick includes a &lt;code&gt;StateBasedGame&lt;/code&gt; class to help with this, although you could rig up your own on top of &lt;code&gt;BasicGame&lt;/code&gt; if you really wanted to.&lt;/p&gt;
&lt;p&gt;The Slick wiki has &lt;a href="http://slick.cokeandcode.com/wiki/doku.php?id=tutorials"&gt;some great tutorials&lt;/a&gt; that go through various elements of the library, including a &lt;a href="http://slick.cokeandcode.com/wiki/doku.php?id=02_-_slickblocks"&gt;Tetris clone that uses game states.&lt;/a&gt; The tutorials are written in Java, naturally, but the API calls and method names are all directly transferrable (I'll be writing an article about 'reading' Java code for porting to Ruby soon).&lt;/p&gt;
&lt;h4&gt;Packaging for Distribtion&lt;/h4&gt;
&lt;p&gt;One of the main reasons I chose JRuby over the Ruby alternatives was the ability to package up games easily in a .jar file for distribution. The Ludum Dare contest involves having other participants judge your game and since most participants are probably not running Ruby, I wanted it to be relatively easy for them to run my game.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/jruby/warbler"&gt;Warbler&lt;/a&gt; is a handy tool that can produce .jar files from a Ruby app. I've only done basic experiments so far but will be writing up an article once I have it all nailed.&lt;/p&gt;
&lt;h4&gt;Ludum Dare&lt;/h4&gt;
&lt;p&gt;I was inspired to start looking into JRuby and Java game libraries by the &lt;a href="http://www.ludumdare.com/compo/"&gt;Ludum Dare game development contest.&lt;/a&gt; They take place every few months and you get 48 hours to build your own game from scratch. I'm hoping to enter for the first time in just a couple of days and would love to see more Rubyists taking part.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=JnT3ecf6gXo:4PSrzz16bMA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=JnT3ecf6gXo:4PSrzz16bMA:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=JnT3ecf6gXo:4PSrzz16bMA:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/JnT3ecf6gXo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/video-game-ruby-tutorial-5726.html#comments" thr:count="16" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/video-game-ruby-tutorial-5726.html/feed/atom" thr:count="16" />
		<thr:total>16</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/video-game-ruby-tutorial-5726.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[A Lagom Review of O&#8217;Reilly&#8217;s &#8216;Sinatra Up and Running&#8217;]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/etQaTZ7hYC4/sinatra-book-review-5704.html" />
		<id>http://www.rubyinside.com/?p=5704</id>
		<updated>2011-12-14T15:19:03Z</updated>
		<published>2011-12-14T15:15:47Z</published>
		<category scheme="http://www.rubyinside.com" term="Miscellaneous" />		<summary type="html"><![CDATA[<p><a href="http://shop.oreilly.com/product/0636920019664.do"><img src="http://www.rubyinside.com/wp-content/uploads/2011/12/sinatra-up.jpeg" alt="" title="sinatra-up" width="300" style="margin-left: 18px; margin-bottom: 18px; border: 2px solid #ccc; float: right" /></a><a href="http://shop.oreilly.com/product/0636920019664.do">Sinatra Up and Running</a> is a new book published by O'Reilly and written by Alan Harris and Konstantin Hasse that covers the popular <a href="http://www.sinatrarb.com/">Sinatra</a> web application DSL in a brisk 103 pages, acting as a tutorial to newcomers and a handy reference for old hands.</p>
<p>TLDR: It's a short, sweet, relatively cheap and very well written book about Sinatra. Recommended. <a href="http://shop.oreilly.com/product/0636920019664.do">Buy here.</a></p>
<p>An interesting quirk of Scandinavian society is the concept of <a href="http://en.wikipedia.org/wiki/Jante_Law">Jante Law.</a> It knocks down standing out and being individual, in favor of communal harmony. It's typically used in a negative context to lament restrictions and lack of risk taking within Nordic society (DHH touched on this briefly <a href="http://mixergy.com/david-heinemeier-hansson-37signals-intervie/">in a recent Mixergy interview</a>) but the flip side of the Jante coin is <a href="http://en.wikipedia.org/wiki/Lagom">lagom</a>: the idea and ideal of having just the right amount of something. <a href="http://www.rubyinside.com/sinatra-book-review-5704.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/sinatra-book-review-5704.html">&lt;p&gt;&lt;a href="http://shop.oreilly.com/product/0636920019664.do"&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/sinatra-up.jpeg" alt="" title="sinatra-up" width="300" style="margin-left: 18px; margin-bottom: 18px; border: 2px solid #ccc; float: right" /&gt;&lt;/a&gt;&lt;a href="http://shop.oreilly.com/product/0636920019664.do"&gt;Sinatra Up and Running&lt;/a&gt; is a new book published by O'Reilly and written by Alan Harris and Konstantin Hasse that covers the popular &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; web application DSL in a brisk 103 pages, acting as a tutorial to newcomers and a handy reference for old hands.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR: It's a short, sweet, relatively cheap and very well written book about Sinatra. Recommended. &lt;a href="http://shop.oreilly.com/product/0636920019664.do"&gt;Buy here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;An interesting quirk of Scandinavian society is the concept of &lt;a href="http://en.wikipedia.org/wiki/Jante_Law"&gt;Jante Law.&lt;/a&gt; It knocks down standing out and being individual, in favor of communal harmony. It's typically used in a negative context to lament restrictions and lack of risk taking within Nordic society (DHH touched on this briefly &lt;a href="http://mixergy.com/david-heinemeier-hansson-37signals-intervie/"&gt;in a recent Mixergy interview&lt;/a&gt;) but the flip side of the Jante coin is &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Lagom"&gt;lagom&lt;/a&gt;&lt;/em&gt;: the idea and ideal of having &lt;em&gt;just the right amount&lt;/em&gt; of something.&lt;/p&gt;
&lt;p&gt;Sinatra Up and Running is, second to &lt;a href="http://www.amazon.com/gp/product/0131103628/ref=as_li_ss_tl?ie=UTF8&amp;#038;tag=rubins-20&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=390957&amp;#038;creativeASIN=0131103628"&gt;K&amp;#038;R&lt;/a&gt;, the most &lt;em&gt;lagom&lt;/em&gt; technical book I've read. At a mere 102 pages you may wonder whether it's worth buying - it is. Unlike most technical books - yes, including mine - it skips the waffle and provides a perfect level of detail going through from what Sinatra is, to how it works, and on to an example project that covers just 13 pages. Don't be fooled, though, this isn't one of those tiny format O'Reilly handbooks; it's a regular, full size book - just a thin one!&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/bookinside.jpg" alt="" title="bookinside" width="640" height="465" class="alignnone size-full wp-image-5720" /&gt;&lt;/p&gt;
&lt;h3&gt;Structure&lt;/h3&gt;
&lt;p&gt;The book is split into three key sections:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Sinatra's "fundamentals."&lt;/strong&gt; We cover similar ground to the Sinatra &lt;a href="http://www.sinatrarb.com/intro"&gt;README&lt;/a&gt; but I prefer the less generic examples in the book. How to build routes, use views, use sessions, caching, HTTP headers, and even Sinatra 1.3's new streaming functionality.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Behind the curtain.&lt;/strong&gt; The bulk of the book takes a peak under the kimono into areas where online documentation occasionally trips over or fails to mention. How is Sinatra implemented and what is its basic execution model? How do you create extensions for it? How does it integrate with Rack middleware? And how can you use Sinatra in a modular style?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blog engine project.&lt;/strong&gt; A snappy run through a simple Git and Sinatra powered 'blogging' system.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As a core piece of printed documentation for a project, the book does a great job at sharing the basics, inspiring you to dig further and, of course, its short length puts Sinatra into context with the gargantuan Rails framework, where even a 400 page book would struggle to cover the essentials.&lt;/p&gt;
&lt;h3&gt;So, should you buy it?&lt;/h3&gt;
&lt;p&gt;Sinatra Up and Running is a good book and well written. I enjoyed it and picked up or was reminded of quite a few interesting bits and pieces. I'll probably refer to it from time to time. If your Sinatra experiences are rather on and off or you've not played with it for a while, it's a great, well-paced introduction.&lt;/p&gt;
&lt;p&gt;If, however, you're already a Sinatra guru and/or working with Sinatra on a day by day basis and have all of the main patterns memorized, there's not a great deal you're going to get out of it. Buy it to be a completionist or to support the authors, but if you want a book demonstrating in depth how to integrate Sinatra with everything or how to big giant Web applications, this isn't for you.&lt;/p&gt;
&lt;p&gt;Inexperienced Rubyists may also find the book's direct no-nonsense style intimidating. If you know what a code block is, you're good to go. This may seem like a bizarre observation to most Rubyists, but I've encountered many beginners who've wanted to "build a Web site" and immediately leapt into an advanced Rails book, only to be confused. If you're still new to Ruby, read &lt;a href="http://www.manning.com/black2/"&gt;The Well Grounded Rubyist&lt;/a&gt; or &lt;a href="http://beginningruby.org/"&gt;Beginning Ruby&lt;/a&gt; first.&lt;/p&gt;
&lt;p&gt;And I'm going to stop here, because that would be lagom :-)&lt;/p&gt;
&lt;h3&gt;Where to buy&lt;/h3&gt;
&lt;p&gt;There are several options for buying the book. Check out &lt;a href="http://shop.oreilly.com/product/0636920019664.do"&gt;O'Reilly&lt;/a&gt; (print, PDF, Mobi, and ePub), &lt;a href="http://www.amazon.com/gp/product/1449304230/ref=as_li_ss_tl?ie=UTF8&amp;#038;tag=rubins-20&amp;#038;linkCode=as2&amp;#038;camp=1789&amp;#038;creative=390957&amp;#038;creativeASIN=1449304230"&gt;Amazon.com&lt;/a&gt; (print and Kindle), and &lt;a href="http://www.amazon.co.uk/Sinatra-Up-Running-Alan-Harris/dp/1449304230/"&gt;Amazon.co.uk&lt;/a&gt; (print and Kindle) or your own favorite local bookstore.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=etQaTZ7hYC4:cD6fQkEh5do:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=etQaTZ7hYC4:cD6fQkEh5do:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=etQaTZ7hYC4:cD6fQkEh5do:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/etQaTZ7hYC4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/sinatra-book-review-5704.html#comments" thr:count="7" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/sinatra-book-review-5704.html/feed/atom" thr:count="7" />
		<thr:total>7</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/sinatra-book-review-5704.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[Ludum Dare for Rubyists: An Online 48 Hour Game Coding Competition]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/wsZ-KtRbf28/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html" />
		<id>http://www.rubyinside.com/?p=5687</id>
		<updated>2011-12-14T02:45:12Z</updated>
		<published>2011-12-13T14:55:15Z</published>
		<category scheme="http://www.rubyinside.com" term="Events" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p><a href="http://ludumdare.com/">Ludum Dare</a> is an online accelerated game development event that focuses on regular 48 hour competitions. Think Rails Rumble but for games! It's been around since 2002 but has had a big publicity boost recently due to the participation of Notch, the creator of the mind-bogglingly popular indie game <a href="http://www.minecraft.net/">Minecraft.</a></p>
<p><a href="http://ludumdare.com/"><img src="http://www.rubyinside.com/wp-content/uploads/2011/12/ludum-dare.jpg" alt="" title="ludum-dare" width="640" height="127" class="alignnone size-full wp-image-5688" /></a></p>
<p>The next Ludum Dare contest is taking place this coming weekend between December 16-19, 2011 and I want to encourage Rubyists to take part. The competition tends to be dominated by Java, Flash, Microsoft XNA developers, and HTML5 developers, so it'd be great to see more Ruby entries (of which there have only been a couple so far). <a href="http://www.rubyinside.com/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html">&lt;p&gt;&lt;strong&gt;&lt;a href="http://ludumdare.com/"&gt;Ludum Dare&lt;/a&gt; is an online accelerated game development event that focuses on regular 48 hour competitions.&lt;/strong&gt; Think Rails Rumble but for games! It's been around since 2002 but has had a big publicity boost recently due to the participation of Notch, the creator of the mind-bogglingly popular indie game &lt;a href="http://www.minecraft.net/"&gt;Minecraft.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ludumdare.com/"&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2011/12/ludum-dare.jpg" alt="" title="ludum-dare" width="640" height="127" class="alignnone size-full wp-image-5688" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The next Ludum Dare contest is taking place this coming weekend between December 16-19, 2011 and I want to encourage Rubyists to take part.&lt;/strong&gt; The competition tends to be dominated by Java, Flash, Microsoft XNA developers, and HTML5 developers, so it'd be great to see more Ruby entries (of which there have only been a couple so far).&lt;/p&gt;
&lt;p&gt;During August's event, I, along with hundreds of others, was glued to Notch's livestream watching him code his game, Prelude of the Chambered (a &lt;a href="http://www.youtube.com/watch?v=KcfFJ6pNEZk"&gt;6 minute version is on YouTube&lt;/a&gt;). I was inspired enough to port his Java code into Ruby using JRuby, producing&lt;br /&gt;
&lt;a href="https://github.com/peterc/potc-jruby"&gt;potc-jruby&lt;/a&gt; (sadly far slower than the original Java version). This time, I plan to enter for real and build my own original game.&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/KcfFJ6pNEZk" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;How to Take Part in Ludum Dare&lt;/h3&gt;
&lt;p&gt;Go to the Ludum Dare homepage, read &lt;a href="http://www.ludumdare.com/compo/rules/"&gt;the rules and guide&lt;/a&gt;, &lt;a href="http://www.ludumdare.com/compo/wp-admin/"&gt;register&lt;/a&gt; on their WordPress blog, wait until the 'theme' has been decided, and start coding once the countdown is finished.&lt;/p&gt;
&lt;p&gt;During the 48 hours (or 72 if you do the 'jam' version), you can post blog entries directly to the main Ludum Dare site (if you want) and submit your entry via a special link at the end. Entrants play and judge each other's entries for a period of three weeks before the winners are announced. Having more Rubyists involved would be useful since our games may be less likely to work cross platform or without Ruby installed.. (more on this shortly)&lt;/p&gt;
&lt;p&gt;A quick summary of the rules:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You have to work alone. (If you want to do a team effort, you need to enter the less restrictive 'jam' contest.)&lt;/li&gt;
&lt;li&gt;All content and code must be created within the 48 hours (except for libraries, legally licensed fonts and drum/instrument samples).&lt;/li&gt;
&lt;li&gt;Your game has to be based on the theme given out before the contest.&lt;/li&gt;
&lt;li&gt;You must share the source code with the other participants at the end of the contest though you do &lt;strong&gt;not&lt;/strong&gt; have to give it an open source license.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The contest has a popular IRC channel (which is already quite active) at &lt;strong&gt;#ludumdare&lt;/strong&gt; on &lt;strong&gt;irc.afternet.org.&lt;/strong&gt; I'm &lt;strong&gt;petercooper&lt;/strong&gt; on there - say hi! I'll be lurking in there a lot over the next week. Also, &lt;a href="http://twitter.com/ludumdare"&gt;follow @ludumdare&lt;/a&gt; on IRC for more updates and info.&lt;/p&gt;
&lt;p&gt;To get a feel for the contest, check out this "keynote" from the &lt;em&gt;last&lt;/em&gt; Ludum Dare. There'll be a new one for this year soon:&lt;/p&gt;
&lt;p&gt;&lt;iframe width="640" height="480" src="http://www.youtube.com/embed/aHD1QBP4ww8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;h3&gt;Building a Game in Ruby?&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.rubyinside.com/wp-content/uploads/2009/05/rubystein-300x247.png" style="float: right; border: 2px solid #ccc" /&gt;Building games in Ruby isn't popular but it's not frontier country either. &lt;a href="http://www.rubyinside.com/rubystein-wolfenstein-3d-recreated-in-ruby-1751.html"&gt;Rubystein&lt;/a&gt;, a Wolfenstein 3D pastiche by the Phusion guys, remains a favorite of mine and it even runs on 1.9 with only a few tweaks.&lt;/p&gt;
&lt;p&gt;There's a &lt;a href="http://www.oreillynet.com/pub/a/ruby/2007/12/04/creating-games-in-ruby.html"&gt;great series by Andrea Wright&lt;/a&gt; that dates from 2007 but still has some handy pointers. We also have &lt;a href="http://mon-ouie.github.com/projects/ray.html"&gt;Ray&lt;/a&gt;, &lt;a href="http://rubygame.org/"&gt;RubyGame&lt;/a&gt;, and &lt;a href="http://www.libgosu.org/"&gt;Gosu&lt;/a&gt; which all have their fans (Ray is the most recent Ruby game library I'm aware of).&lt;/p&gt;
&lt;h3&gt;Or.. JRuby!&lt;/h3&gt;
&lt;p&gt;My choice for the contest is none of the above. Instead, it's &lt;a href="http://jruby.org/"&gt;JRuby.&lt;/a&gt; As part of the 'warmup process' for the contest, I've been playing with JRuby and the popular &lt;a href="http://slick.cokeandcode.com/"&gt;Slick2D&lt;/a&gt; Java library. The performance is amazing and the development process pretty straightforward.&lt;/p&gt;
&lt;p&gt;Being a popular library in the Java world, I can use a lot of the Java-based tutorials and code samples for Slick2D to get a feel for how it all works. And.. I'll be writing an article for Ruby Inside in the next day or two showing you how to get started with it for yourself :-)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=wsZ-KtRbf28:t1dhfQGgYM8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=wsZ-KtRbf28:t1dhfQGgYM8:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=wsZ-KtRbf28:t1dhfQGgYM8:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/wsZ-KtRbf28" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html/feed/atom" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/ludum-dare-for-rubyists-an-online-48-hour-game-coding-competition-5687.html</feedburner:origLink></entry>
		<entry>
		<author>
			<name>Peter Cooper</name>
						<uri>http://twitter.com/peterc</uri>
					</author>
		<title type="html"><![CDATA[Ruby News and Releases in 2011: A Retrospective]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/RubyInside/~3/6A63FVD_r9s/ruby-news-and-releases-in-2011-a-retrospective-5665.html" />
		<id>http://www.rubyinside.com/?p=5665</id>
		<updated>2011-12-08T23:14:45Z</updated>
		<published>2011-12-07T03:36:44Z</published>
		<category scheme="http://www.rubyinside.com" term="Compilation Posts" /><category scheme="http://www.rubyinside.com" term="News" />		<summary type="html"><![CDATA[<p>2011 is drawing to a close and I have been reminded of a post I made about a year ago: <a href="http://www.rubyinside.com/ruby-in-2010-a-retrospective-4059.html">Ruby in 2010: A Retrospective of a Great Year for Ruby</a>. 2010 was a stunning year with the release of Ruby 1.9.2, MacRuby 0.5, Sinatra 1.0, Rubinius 1.0, and DataMapper 1.0!</p>
<p>This year, MagLev, Capybara, Cucumber, RefineryCMS, OmniAuth and TorqueBox all hit their 1.0 milestones, but I've dug through the archives to see what else 2011 brought for the Ruby scene.</p>
<h3>January</h3>
<p><a href="http://www.rubyinside.com/rails-installer-ruby-and-rails-on-windows-in-a-single-install-4201.html">Rails Installer: Ruby and Rails on Windows in a Single, Easy Install</a> - Wayne E Seguin, of RVM, released a super simple Rails, Git, SQLite, and Ruby installer for Windows. <a href="http://www.rubyinside.com/ruby-news-and-releases-in-2011-a-retrospective-5665.html" class="read_more">Read More</a></p>]]></summary>
		<content type="html" xml:base="http://www.rubyinside.com/ruby-news-and-releases-in-2011-a-retrospective-5665.html">&lt;p&gt;2011 is drawing to a close and I have been reminded of a post I made about a year ago: &lt;a href="http://www.rubyinside.com/ruby-in-2010-a-retrospective-4059.html"&gt;Ruby in 2010: A Retrospective of a Great Year for Ruby&lt;/a&gt;. 2010 was a stunning year with the release of Ruby 1.9.2, MacRuby 0.5, Sinatra 1.0, Rubinius 1.0, and DataMapper 1.0!&lt;/p&gt;
&lt;p&gt;This year, MagLev, Capybara, Cucumber, RefineryCMS, OmniAuth and TorqueBox all hit their 1.0 milestones, but I've dug through the archives to see what else 2011 brought for the Ruby scene.&lt;/p&gt;
&lt;h3&gt;January&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/rails-installer-ruby-and-rails-on-windows-in-a-single-install-4201.html"&gt;Rails Installer: Ruby and Rails on Windows in a Single, Easy Install&lt;/a&gt;&lt;/b&gt; - Wayne E Seguin, of RVM, released a super simple Rails, Git, SQLite, and Ruby installer for Windows. It's now an &lt;a href="http://railsinstaller.org/"&gt;Engine Yard project&lt;/a&gt; and going strong.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.cleveralgorithms.com/"&gt;Clever Algorithms: Free E-book of Nature-Inspired AI Recipes for Ruby&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;February&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/happy-18th-birthday-ruby-4416.html"&gt;Ruby Turns 18&lt;/a&gt;&lt;/b&gt; - Matz had previously said Ruby was "born" on February 24, 1993, so "she" turned 18 years old in February. Yes, I'm sad enough to have had that in my calendar ever since I read about it ;-)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://netbeans.org/community/news/show/1507.html"&gt;Netbeans Drops Ruby Support (And JRuby Picks It Up)&lt;/a&gt;&lt;/b&gt; - The Netbeans IDE team announced they were dropping support for the Ruby and Rails specific features in their popular IDE. Separately, though, Thomas Enebo of the JRuby core team said that they had spoken to the Netbeans team and they would be adopting the project.&lt;/p&gt;
&lt;h3&gt;March&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/jruby-1-6-released-ruby-1-9-2-support-and-more-4524.html"&gt;JRuby 1.6 Released&lt;/a&gt;&lt;/b&gt; - JRuby 1.6 was released with, significantly, Ruby 1.9.2 support. JRuby has continued its role as a formidable and leading Ruby implementation throughout 2011.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/macruby-0-10-released-xcode-4-support-and-app-store-submissions-4542.html"&gt;MacRuby 0.10 Released&lt;/a&gt;&lt;/b&gt; - Apple's MacRuby got XCode 4 support (although some have complained it's been a bit shaky since) and the ability to put together apps suitable for Mac App Store submission. There are now at least several MacRuby powered apps on the store.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/dhh-offended-by-rspec-debate-4610.html"&gt;DHH Offended by RSpec, Says Test::Unit is Just Great&lt;/a&gt;&lt;/b&gt; - Rails creator David Heinemeier Hansson inadvertently kicked off a relatively interesting discussion about testing tools.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://groups.google.com/group/datamapper/browse_thread/thread/8381daffded378f5?pli=1"&gt;DataMapper 1.1 Released&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://infoether.com/livingsocial"&gt;LivingSocial Acquires Ruby/Rails Consultancy InfoEther&lt;/a&gt;&lt;/b&gt; - This wasn't your typical boring acquisition. LivingSocial, a daily deals site, purchased InfoEther, the US's first significant Ruby consultancy and home to Chad Fowler, Rich Kilmer, Tom Copeland, and others. Ruby recruitment in overdrive!&lt;/p&gt;
&lt;h3&gt;April&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.railshotline.com/"&gt;The Rails Hotline launched&lt;/a&gt;&lt;/b&gt; - The Rails Hotline is a free helpline run by volunteer Ruby and Rails developers. It was very popular early on and while I haven't heard much about it lately, there still seem to be people staffing it.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://nex-3.com/posts/104-haml-and-sass-3-1-are-released"&gt;Haml and Sass 3.1 Released (Separately)&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h3&gt;May&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://torquebox.org/news/2011/04/29/torquebox-ruby-appserver-1-0-0-available-now/"&gt;TorqueBox 1.0.0 Released: A Java Platform for Rack Apps&lt;/a&gt;&lt;/b&gt; - Almost three years in the making, Torquebox 1.0 arrived. It's a popular JBoss-powered application server for Rack apps (including Rails apps) that provides a smorgasbord of useful backend features.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://blog.segment7.net/2011/05/04/rubygems-1-8-0"&gt;RubyGems 1.8.0 Released&lt;/a&gt;&lt;/b&gt; - Significant because 1.8 is still the version that comes with Ruby 1.9.3 in late 2011. After a raft of slightly temperamental releases, 1.8 has been a champ.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/ruby-rogues-ruby-podcast-4745.html"&gt;The Ruby Rogues Podcast Launches&lt;/a&gt;&lt;/b&gt; - A new discussion based podcast made it into the Ruby world in May. It's still going and has frequent episodes with great discussions on all sorts of Ruby related topics. Much recommended.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://exceptionalruby.com/"&gt;Avdi Grimm's "Exceptional Ruby" Book Released&lt;/a&gt;&lt;/b&gt; - Avdi Grimm released a PDF e-book about error and exception handling in Ruby, based on his 'Exceptional Ruby' talk at Magic Ruby 2011. It has proven to be quite a talking point since.&lt;/p&gt;
&lt;h3&gt;June&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/ruby-1-9-3-faster-loading-times-require-4927.html"&gt;The Story Behind Ruby 1.9.3 Getting 36% Faster Loading Times&lt;/a&gt;&lt;/b&gt; - Perhaps the story I spent the most time on in 2011. Two different solutions to speeding up Ruby 1.9.2's notoriously slow &lt;code&gt;require&lt;/code&gt;s were tabled, only one made the cut. Ruby 1.9.3 has since proven to be somewhat swifter.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://refinerycms.com/blog/refinery-cms-10-released"&gt;Refinery CMS 1.0 Released&lt;/a&gt;&lt;/b&gt; - Version 1.0 of Refinery CMS arrived 2 years after it first became an open source project. Refinery is one of the most popular Rails-based content management systems and the 1.0 release boasts full Rails 3 support and a solid stable base built up by over 100 contributors.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://groups.google.com/group/ruby-capybara/browse_thread/thread/b4568c21b36225ff"&gt;Capybara 1.0 Released&lt;/a&gt;&lt;/b&gt; - It was certainly the year for Capybara. The acceptance test framework for webapps is now perhaps the most popular tool in its field.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://aslakhellesoy.com/post/6734058541/cucumber-one-oh"&gt;Cucumber 1.0.0 Released&lt;/a&gt;&lt;/b&gt; - Continuing with the testing theme, Cucumber also hit a significant milestone in 2011.&lt;/p&gt;
&lt;h3&gt;July&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/rubys-creator-matz-joins-heroku-5101.html"&gt;Ruby's Creator, Matz, Joins Heroku&lt;/a&gt;&lt;/b&gt; - Surprise in the Ruby community as Yukihiro 'matz' Matsumoto took up a Chief Architect position with Heroku, the Salesforce-owned Ruby application hosting company.&lt;/p&gt;
&lt;h3&gt;August&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://weblog.rubyonrails.org/2011/8/31/rails-3-1-0-has-been-released"&gt;Rails 3.1.0 Released&lt;/a&gt;&lt;/b&gt; - A full year after Rails 3.0, Rails 3.1 was released to much fanfare, adding key features like the asset pipeline, roles, reversible migrations, jQuery as the new default JavaScript library, and a new focus on CoffeeScript. I &lt;a href="http://www.rubyinside.com/rails-3-1-adopts-coffeescript-jquery-sass-and-controversy-4669.html"&gt;explained the controversy&lt;/a&gt; behind some of the changes when they were announced back in April.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/rbenv-a-simple-new-ruby-version-management-tool-5302.html"&gt;rbenv: A Simple, New Ruby Version Management Tool&lt;/a&gt;&lt;/b&gt; - Sam Stephenson of 37signals unveiled his new lightweight Ruby version management tool and.. well, there was quite a bit of drama around it. Now, though, it seems people have fallen into sticking with the tool they like best and both RVM and rbenv seem to be going from strength to strength.&lt;/p&gt;
&lt;h3&gt;September&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.engineyard.com/blog/2011/railsinstaller-2-for-windows-released/"&gt;RailsInstaller 2.0 Shipped&lt;/a&gt;&lt;/b&gt; - The Windows-based RailsInstaller hit its 2.0 milestone and became a great way to get Ruby 1.9.2 and Rails 3.1 on Windows in a single install.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/19walkthrough/"&gt;The Ruby 1.9 Walkthrough Released&lt;/a&gt;&lt;/b&gt; - I released my epic 3 hour Ruby 1.9 screencast guide in September. It's been a fun ride!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://github.com/tombell/trollscript"&gt;TrollScript Released&lt;/a&gt;&lt;/b&gt; - A significant new entrant to the world of programming languages arrived in the shape of a Ruby-based interpreter for a new Brainf**k dialect by Tom Bell.&lt;/p&gt;
&lt;h3&gt;October&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.ruby-lang.org/en/news/2011/10/31/ruby-1-9-3-p0-is-released/"&gt;Ruby 1.9.3p0 Released&lt;/a&gt;&lt;/b&gt; - The official production release of Ruby 1.9.3 finally hit in October and brought faster Rails app loading times to millions. Hurrah! I made &lt;a href="http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html"&gt;a more detailed roundup of the changes.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.rubyinside.com/ruby-2-0-release-schedule-announced-roll-on-2013-5536.html"&gt;Ruby 2.0 Release Schedule Announced&lt;/a&gt;&lt;/b&gt; - It was announced that Ruby 2.0 would be coming along in 2013, but I also put together &lt;a href="http://www.rubyinside.com/ruby-2-0-implementation-work-begins-what-is-ruby-2-0-and-whats-new-5515.html"&gt;some info about what Ruby 2.0 is and what it might contain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.jamesbritt.com/2011/10/3/ruby-doc-org-officially-updated"&gt;Ruby-doc.org Got A Facelift&lt;/a&gt;&lt;/b&gt; - James Britt gave Ruby-doc.org a significant facelift this year and unveiled his work in October. It's certainly been a major improvement so far.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://railscasts.com/pro"&gt;Ryan Bates Unveils RailsCasts Pro&lt;/a&gt;&lt;/b&gt; - Ruby's most popular screencasting legend (other than Geoffrey Grosenbach, of course!) 'went pro' and started to charge for extra episodes of his popular weekly screencast series.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://www.sinatrarb.com/2011/09/30/sinatra-1.3.0"&gt;Sinatra 1.3 Released&lt;/a&gt;&lt;/b&gt; - Sinatra, the popular webapp DSL / microframework, reached version 1.3.0. The significant addition this time around was a 'streaming API' for streaming data to clients instead of delivering it all in one big package.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://techcrunch.com/2011/10/10/spree-raises-1-5-million-from-true-ventures-aol-for-open-source-ecommerce-platform/"&gt;Spree (Open Source Rails E-commerce System) Raises $1.5 Million&lt;/a&gt;&lt;/b&gt; - Spree is a popular open source Rails e-commerce system and its creator raised $1.5m in venture capital to take it even further (as well as offer Spree-based consulting). Tom Preston Werner (GitHub) and James Lindenbaum (Heroku) also joined as advisors.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://datamapper.org/articles/datamapper-120-released.html"&gt;DataMapper 1.2.0 Released&lt;/a&gt;&lt;/b&gt; - DataMapper is a popular ORM (Object Relational Mapper) and a powerful alternative to ActiveRecord for many developers. Version 1.2 brought all-important support for Rails 3.1 amongst other things.&lt;/p&gt;
&lt;h3&gt;November&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://github.com/MagLev/maglev"&gt;MagLev 1.0 Released&lt;/a&gt;&lt;/b&gt; - Two years &lt;a href="http://www.rubyinside.com/maglev-alpha-released-2807.html"&gt;after its alpha released&lt;/a&gt;, one of the most intriguing alternative Ruby implementations made to its big 1.0.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="http://intridea.com/2011/11/2/omniauth-1-0"&gt;OmniAuth 1.0: Authentication APIs Reach A New Level&lt;/a&gt;&lt;/b&gt; - OmniAuth is a popular library for performing authentication against numerous external authentication systems (like OAuth, OpenID, Facebook, and Twitter). Version 1.0 brought massive structural changes (for the better) and introduced capabilities to do local/internal authentication too.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;a href="https://twitter.com/#!/dhh/status/141452357308391424"&gt;DHH Got Married&lt;/a&gt;&lt;/b&gt; - Dashing the dreams of women everywhere.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=6A63FVD_r9s:4HSuscBzXts:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/RubyInside?a=6A63FVD_r9s:4HSuscBzXts:3H-1DwQop_U"&gt;&lt;img src="http://feeds.feedburner.com/~ff/RubyInside?i=6A63FVD_r9s:4HSuscBzXts:3H-1DwQop_U" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/RubyInside/~4/6A63FVD_r9s" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.rubyinside.com/ruby-news-and-releases-in-2011-a-retrospective-5665.html#comments" thr:count="3" />
		<link rel="replies" type="application/atom+xml" href="http://www.rubyinside.com/ruby-news-and-releases-in-2011-a-retrospective-5665.html/feed/atom" thr:count="3" />
		<thr:total>3</thr:total>
	<feedburner:origLink>http://www.rubyinside.com/ruby-news-and-releases-in-2011-a-retrospective-5665.html</feedburner:origLink></entry>
	</feed>

