<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>has_many :thoughts: Tag ruby</title>
    <link>http://blog.kineticweb.com/articles/tag/ruby</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Musings from a Ruby on Rails development team</description>
    <item>
      <title>Attributr background style</title>
      <description>&lt;p&gt;I love incremental improvement.&lt;/p&gt;


	&lt;p&gt;New in &lt;a href="http://attributr.com"&gt;Attributr&lt;/a&gt;&amp;#8212;you can now choose the background style for your attribution overlay. The original black/white on transparent is still there but I&amp;#8217;ve added white on black and black on white options for photos where that is more appropriate.&lt;/p&gt;


	&lt;p&gt;There are several more ideas I want to flesh out such as:&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;Returning other sizes besides the default Flickr Medium.&lt;/li&gt;
		&lt;li&gt;Being able to position the attribution in someplace other than the bottom right.&lt;/li&gt;
		&lt;li&gt;Choosing different font styles. For some reason, the Coolvetica font I&amp;#8217;m using looks a lot jankier when rendered on the servers than when it&amp;#8217;s rendered from my local copy running on &lt;span class="caps"&gt;OS X&lt;/span&gt;.&lt;/li&gt;
		&lt;li&gt;Providing a list of more comprehensive attribution of all the photos you request so that a &amp;#8220;credits&amp;#8221; page can be pasted into your presentation, website, blog, whatever.&lt;/li&gt;
	&lt;/ul&gt;</description>
      <pubDate>Sat, 02 Aug 2008 19:25:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:3df46b6d-a39a-46d4-ace2-8f5f1c61368d</guid>
      <author>Colin A. Bartlett</author>
      <link>http://blog.kineticweb.com/articles/2008/08/02/attributr-background-style</link>
      <category>flickr</category>
      <category>attributr</category>
      <category>microapp</category>
      <category>ruby</category>
    </item>
    <item>
      <title>My first Sinatra app</title>
      <description>&lt;p&gt;While playing with &lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt; a bunch as part of the prep for my &lt;a href="http://blog.kineticweb.com/articles/2008/07/31/sinatra-talk-at-philly-on-rails"&gt;Philly on Rails talk&lt;/a&gt;, I came up with a few ideas for microapps that I thought would be perfect for Sinatra.&lt;/p&gt;


	&lt;p&gt;The first of these I call &lt;a href="http://attributr.com/"&gt;Attributr&lt;/a&gt;. It&amp;#8217;s a very simple app that accepts the &lt;span class="caps"&gt;URL&lt;/span&gt; of a &lt;a href="http://flickr.com"&gt;Flickr&lt;/a&gt; photo and returns that photo with proper attribution overlayed in the lower right corner. I often use photos from Flickr that are &lt;a href="http://www.flickr.com/creativecommons/"&gt;Creative Commons&lt;/a&gt; licensed. And I&amp;#8217;ve often thought it would be handy to get the image with attribution right from Flickr so it&amp;#8217;s ready to just drag into my presentation or whatever.&lt;/p&gt;


	&lt;p&gt;I used &lt;a href="http://www.graphicsmagick.org/"&gt;GraphicsMagick&lt;/a&gt; to add the text. In the past, I&amp;#8217;ve used &lt;a href="http://www.imagemagick.org"&gt;ImageMagick&lt;/a&gt; for such things, but I heard GM was easier to get installed. Indeed, it was pretty simple. On Ubuntu, it&amp;#8217;s as easy as apt-get.&lt;/p&gt;


	&lt;p&gt;This is running on our newest production server under &lt;a href="http://www.modrails.com/"&gt;Passenger&lt;/a&gt;. I couldn&amp;#8217;t believe how easy &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; and Passenger together make deploying tiny apps like this a breeze.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;d love some feedback on &lt;a href="http://attributr.com/"&gt;Attributr&lt;/a&gt; if you ever have occasion to use it.&lt;/p&gt;</description>
      <pubDate>Sat, 02 Aug 2008 12:07:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:21249994-d65c-4f5e-aea2-e3cf1ede5044</guid>
      <author>Colin A. Bartlett</author>
      <link>http://blog.kineticweb.com/articles/2008/08/02/my-first-sinatra-app</link>
      <category>flickr</category>
      <category>attributr</category>
      <category>microapp</category>
      <category>sinatra</category>
      <category>ruby</category>
      <category>graphicsmagick</category>
    </item>
    <item>
      <title>Sinatra talk at Philly on Rails</title>
      <description>&lt;p&gt;Last evening, I presented a short talk about Sinatra, the Ruby microframework at &lt;a href="http://www.phillyonrails.org"&gt;Philly on Rails&lt;/a&gt;, the Philadelphia Ruby user group. Overall, I like it and think it has a good place on the shelf of microapp tools. As with most tiny projects that begin as someone&amp;#8217;s itch-scratching, documentation is lacking. I hope that I can contribute in that regard as I use it more.&lt;/p&gt;


	&lt;p&gt;Here are my &lt;a href="http://blog.kineticweb.com/files/sinatra_slides.pdf"&gt;slides&lt;/a&gt; and &lt;a href="http://blog.kineticweb.com/files/sinatra_examples.zip"&gt;example files&lt;/a&gt;.&lt;/p&gt;


	&lt;p&gt;Thanks to all who came out last night!&lt;/p&gt;</description>
      <pubDate>Thu, 31 Jul 2008 06:38:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:ba263520-244e-48ee-964b-0e0dda65050e</guid>
      <author>Colin A. Bartlett</author>
      <link>http://blog.kineticweb.com/articles/2008/07/31/sinatra-talk-at-philly-on-rails</link>
      <category>microapp</category>
      <category>framework</category>
      <category>ruby</category>
      <category>phillyonrails</category>
      <category>sinatra</category>
    </item>
    <item>
      <title>RailsConf 2008 - Justin's Schedule</title>
      <description>&lt;p&gt;Below is the schedule I came up with when going over the sessions available this year at RailsConf&amp;#8230; Going to try to make these, if not switch with Colin so we cover the conference well&amp;#8230; very glad to see some advanced classes! Would have loved a &lt;span class="caps"&gt;REAL&lt;/span&gt; advanced Rspec session though.&lt;/p&gt;


	&lt;p&gt;8:30am Thursday, 05/29/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1862"&gt;Meta-programming Ruby for Fun &amp;amp; Profit&lt;/a&gt;
Portland Ballroom 252&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2650"&gt;Neal Ford&lt;/a&gt; (ThoughtWorks), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2751"&gt;Patrick Farley&lt;/a&gt; (ThoughtWorks)
Ruby is the revenge of the Smalltalkers. Not since Smalltalk has a language had such powerful meta-programming facilities. While this may seem like a minor feature, it turns out that surgical meta-programming allows solutions to problems that are clearer, more concise, more maintainable, and take orders of magnitudes fewer lines of code. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1862"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;1:30pm Thursday, 05/29/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1213"&gt;Powering &lt;span class="caps"&gt;AIR&lt;/span&gt; Applications with Rails&lt;/a&gt;
Portland Ballroom 252
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/467"&gt;Tony Hillerson&lt;/a&gt; (EffectiveUI), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2576"&gt;Daniel Wanja&lt;/a&gt; (Nouvelles Solutions, Inc.)
Adobe&amp;#8217;s &lt;span class="caps"&gt;AIR&lt;/span&gt; platform offers developers familiar with web technology the tools to create desktop applications. Come and learn how to drive an &lt;span class="caps"&gt;HTML&lt;/span&gt; and a Flex &lt;span class="caps"&gt;AIR&lt;/span&gt; application with Rails using RubyAMF. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1213"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;10:45am Friday, 05/30/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2495"&gt;Entrepreneurs On Rails&lt;/a&gt;
Portland Ballroom 251&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/4997"&gt;Dan Benjamin&lt;/a&gt; (Rails Machine)
Many of the people working with Rails are independent developers, doing freelance work or running small development shops. This makes sense &amp;#8211; Rails provides a great framework for an indy developer, making it easy to work with with designers and other developers. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2495"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;11:45am Friday, 05/30/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2043"&gt;Hosting and the Woes&lt;/a&gt;
Portland Ballroom 255&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/1583"&gt;Ezra Zygmuntowicz&lt;/a&gt; (EngineYard), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2863"&gt;Jamie van Dyke&lt;/a&gt; (Engine Yard), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2866"&gt;Tom Mornini&lt;/a&gt; (Engine Yard)
What are the day to day issues with Rails hosting. How can they be solved, and what are the best practise methods of avoiding them. Engine Yard have extensive experience with high volume Rails applications and would like to talk about what we&amp;#8217;ve learned and what our customers have learnt. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2043"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;1:50pm Friday, 05/30/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1883"&gt;Faster, Better, &lt;span class="caps"&gt;ORM&lt;/span&gt; with DataMapper&lt;/a&gt;
Portland Ballroom 256&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2686"&gt;Yehuda Katz&lt;/a&gt; (EngineYard)
This session will cover using the DataMapper &lt;span class="caps"&gt;ORM&lt;/span&gt; with Ruby on Rails, and go in-depth into its code. It will focus on integration with Ruby on Rails and provide an advanced-level overview of the codebase and design philosophy. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1883"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;2:50pm Friday, 05/30/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/4342"&gt;Rubinius &amp;#8211; Under the Hood and Behind the Curtain&lt;/a&gt;
&lt;span class="caps"&gt;D135&lt;/span&gt;-136&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/13749"&gt;Evan Phoenix&lt;/a&gt; (Engine Yard), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/22997"&gt;Brian Ford&lt;/a&gt; (Engine Yard), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/13767"&gt;Wilson Bilkovich&lt;/a&gt; (Engine Yard)
Rubinius is a virtual machine built from the ground up to provide a robust, high-performance runtime for Ruby code. The Rubinius team is guiding the development of 20,000+ specifications that define the Ruby language. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/4342"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;4:25pm Friday, 05/30/2008&lt;br&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1963"&gt;The Launch: Dos and Don&amp;#8217;ts of Real Life Deploys&lt;/a&gt;
Portland Ballroom 255&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2518"&gt;Chris Wanstrath&lt;/a&gt; (Err Free)
There&amp;#8217;s more to launching an app than &amp;#8220;cap deploy&amp;#8221;&amp;#8212;the process is as much a psychological challenge as a technical one. So, what does it take to launch an app you can depend on and be proud of? With a handful of production launches under his belt, Chris will talk about the big picture and little details of bringing your site to life. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1963"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;10:45am Saturday, 05/31/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2042"&gt;Assembling Pages Last: Edge Caching, &lt;span class="caps"&gt;ESI&lt;/span&gt; &amp;amp; Rails&lt;/a&gt;
Portland Ballroom 256&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2594"&gt;Aaron Batalion&lt;/a&gt; (Hungry Machine &lt;span class="caps"&gt;LLC&lt;/span&gt;)
When working on scaling Rails to millions of users/day with complex personalization, caching becomes essential. This talk will cover edge caching, edge side includes (ESI) in Rails, and partial page caching higher in the stack. It will also cover &lt;span class="caps"&gt;ESI&lt;/span&gt; as a fabric for assembling heterogeneous applications into a single, cacheable web experience. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2042"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;11:45am Saturday, 05/31/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1755"&gt;Advanced RESTful Rails&lt;/a&gt;
Portland Ballroom 252&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/1467"&gt;Ben Scofield&lt;/a&gt; (Viget Labs)
Designing RESTful systems in Rails carries many benefits. It is not a problem-free approach, however; there are accessibility issues with the standard conventions, and some functions are more difficult to map to resources than others. In this session, we&amp;#8217;ll look at solutions for these (and other) problems that arise when you take &lt;span class="caps"&gt;REST&lt;/span&gt; beyond the standard examples. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1755"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;1:50pm Saturday, 05/31/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2031"&gt;Build Your Own Distributed, Self-Configuring Rails Cluster&lt;/a&gt;
Portland Ballroom 251&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2833"&gt;Dave Fayram&lt;/a&gt; (Powerset, Inc), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2520"&gt;Tom Preston-Werner&lt;/a&gt; (Powerset, Inc.)
Fuzed is a Rails server stack written in Erlang that can replace standard mongrel/reverse proxy architectures. It focuses on reliability and ease of deployment in distributed environments. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2031"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;2:50pm Saturday, 05/31/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1871"&gt;Custom Nginx Modules: Accelerate Rails, &lt;span class="caps"&gt;HTTP&lt;/span&gt; Tricks&lt;/a&gt;
General Portland Ballroom 251&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2451"&gt;Adam Wiggins&lt;/a&gt; (Heroku)
Got a Rails app that needs even more speed? Adam Wiggins of Heroku will show you how to write a custom Nginx module to bring blinding speed to critical code paths (and do &lt;span class="caps"&gt;HTTP&lt;/span&gt; tricks that can&amp;#8217;t be done with Rails and Mongrel alone), using examples from Heroku&amp;#8217;s own authentication module ngx_heroku_gate. Dust off your C compiler and prepare to push the limits of nginx, Rails, and &lt;span class="caps"&gt;HTTP&lt;/span&gt;. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1871"&gt;Read more.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;4:25pm Saturday, 05/31/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1948"&gt;Metaprogramming and Ruby Internals for Rails Programmers&lt;/a&gt;
Portland Ballroom 256&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2751"&gt;Patrick Farley&lt;/a&gt; (ThoughtWorks)
Rails programmers are Ruby programmers. In this session we&amp;#8217;ll cover some useful Ruby metaprogramming techniques as used in real world Rails applications and extensions. Then we&amp;#8217;ll dig deep into &lt;span class="caps"&gt;MRI&lt;/span&gt; and JRuby source to gain a nuanced understanding of the implementation details of Singletons, Mixins and the Ruby Object model. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1948"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;10:45am Sunday, 06/01/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2021"&gt;Scaling Ruby from the Inside Out&lt;/a&gt;
Portland Ballroom 252&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/1583"&gt;Ezra Zygmuntowicz&lt;/a&gt; (EngineYard)
This is a talk about what it takes to &lt;strong&gt;really&lt;/strong&gt; scale Ruby applications. We will not only examine all the aspects of hardware and web server configurations, we will also look at scaling the ruby interpreter itself. Including performance quirks of &lt;span class="caps"&gt;MRI&lt;/span&gt; and how Rubinius is set to fix a lot of these problems. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2021"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;11:45am Sunday, 06/01/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1945"&gt;Everyday DTrace on &lt;span class="caps"&gt;OSX&lt;/span&gt;: A Guide To Using DTrace for Your Full Application Stack&lt;/a&gt;
Portland Ballroom 251&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2752"&gt;Scott Barron&lt;/a&gt; (EdgeCase), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2696"&gt;Chad Humphries&lt;/a&gt; (EdgeCase)
Have you ever wanted to know why a part of your application is slow? How about how long that query takes? Wouldn&amp;#8217;t it be nice if you could get this type of information for ruby, rails, and the database server in one place? You can now with DTrace on &lt;span class="caps"&gt;OSX 10&lt;/span&gt;.5. We&amp;#8217;ll show you how to best use this tool-chain to debug, profile, and gather more information about your application. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1945"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;


	&lt;p&gt;1:50pm Sunday, 06/01/2008&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1935"&gt;Building an app in 48 hours &amp;#8211; A Rails Rumble Case Study&lt;/a&gt;
Portland Ballroom 251&lt;br /&gt;
&lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2321"&gt;Josh Owens&lt;/a&gt; (Intridea, Inc/Web 2.0 Show Podcast), &lt;a href="http://en.oreilly.com/rails2008/public/schedule/speaker/2024"&gt;Chris Selmer&lt;/a&gt; (Intridea, Inc.)
So you want to build a Rails app quickly? Competitors in the Rails Rumble had 48 hours to design, develop, and deploy a complete application. We&#226;&#8364;&#8482;ll take you through the development processes of the winning four-man Tasty Planner team, and compare it with those of the one-man Your Pet Records team. We&#226;&#8364;&#8482;ll discuss techniques, short-cuts, helpers, and Rails plugins that helped speed development. &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/1935"&gt;Read more&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 28 May 2008 20:52:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:0ba193b0-24aa-467a-a485-9616d4296435</guid>
      <author>Justin Reagor</author>
      <link>http://blog.kineticweb.com/articles/2008/05/28/railsconf-2008-justins-schedule</link>
      <category>RailsConf</category>
      <category>Rails</category>
      <category>ruby</category>
    </item>
    <item>
      <title>Automagical RSpec: Shared Example Loading from Separate Files</title>
      <description>&lt;p&gt;I especially love Ruby because I can quickly customize it to my tastes and likes. With out regard for anyone else&amp;#8217;s feeling but my own. With that said, I do try and use this power for good. For the better of my office mates.&lt;/p&gt;


	&lt;p&gt;Earlier today I was doing some of this&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;describe Admin::ModelsController do
  shared_examples_for 'all admin pages' do
    code code code here...
  end

  describe 'when logged in' do
    more specific controller specs here...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;...and I thought to myself that I would really just love to do this&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;describe Admin::ModelsController do
  it_should_behave_like 'all admin pages'

  describe 'when logged in' do
    more specific controller specs here...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Loading it from some separated out module underneath the specific &lt;span class="caps"&gt;MVC&lt;/span&gt; spec/ sub directories.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll explain more in a second&amp;#8230; but using some code I was working on before, thanks to storing it in Yojimbo, I quickly wrote this into my spec_helper.rb&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;Dir[File.dirname(__FILE__)+'/**/shared/*'].each { |group| 
  require group
  include Object.const_get(group.match(/.*[\/]{1}([\w]*)[.rb]./).captures.first.camelize)
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;As you can tell from the code, it will go through all sub-directories of the current one (RAILS_ROOT/spec in this case) and rummage for &amp;#8220;shared/&amp;#8221; directories. It will then try and load modules, within these files, named after the file&amp;#8217;s file name.&lt;/p&gt;


	&lt;p&gt;Without having to require and include each single file/module throughout your spec files (or the parent spec_helper).&lt;/p&gt;


	&lt;p&gt;Examples:&lt;/p&gt;


spec/controllers/shared/all_admin_pages.rb
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;module AllAdminPages
  shared_examples_for 'all admin pages' do
    code code code here...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Of course this is a smallish hack that I think really cleans out my specs. I generally got the idea from app/views/shared or app/views/layouts/shared directories in Rails. Keeping small shared view partials in separate, nicely organized sub-directories.&lt;/p&gt;


	&lt;p&gt;Let the flaming commence! j/k ;)&lt;/p&gt;</description>
      <pubDate>Tue, 15 Apr 2008 21:05:00 -0400</pubDate>
      <guid isPermaLink="false">urn:uuid:f91f1f27-f4a2-4167-b2a1-580d1905bc27</guid>
      <author>Justin Reagor</author>
      <link>http://blog.kineticweb.com/articles/2008/04/15/automagical-rspec-shared-example-loading-from-separate-files</link>
      <category>rspec</category>
      <category>ruby</category>
      <category>hacks</category>
    </item>
    <item>
      <title>Highrise API and tagging</title>
      <description>&lt;p&gt;Like &lt;a href="http://forum.37signals.com/highrise/forums/15/topics/1312"&gt;many&lt;/a&gt;, I was disappointed that the &lt;a href="http://www.highrisehq.com/"&gt;Highrise&lt;/a&gt; &lt;a href="http://developer.37signals.com/highrise/"&gt;&lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; does not support tagging of people. However, I found a way to easily add the capability to the 37signals-supplied Ruby wrapper class, even if it is unsupported. I added a &lt;code&gt;#tag!&lt;/code&gt; instance method to the Person class and used a call directly to the site, not through the &lt;span class="caps"&gt;API&lt;/span&gt;.&lt;/p&gt;


&lt;pre&gt;
class Person &amp;lt; Subject
  ...
  def tag!(tag_name)
    `curl -s -d 'name=#{tag_name}' #{ENV['HIGHRISE_URL']}parties/#{id}/tags`
  end
end
&lt;/pre&gt;

	&lt;p&gt;The output is a bunch of javascript to update the page to reflect the change, but one can safely ignore this. The tag is added and everything works great. Not sure how well this would work on Windows, as the &lt;code&gt;curl&lt;/code&gt; command-line program is likely unavailable.&lt;/p&gt;


	&lt;p&gt;We use this method in our latest project to add appropriate tags to people as they are created. It helps us segment people added to Highrise for the project from the rest of our contacts in Highrise.&lt;/p&gt;</description>
      <pubDate>Mon, 18 Feb 2008 13:28:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:8162daad-bcb1-4b7f-a3df-e1c8c8a840e0</guid>
      <author>Colin A. Bartlett</author>
      <link>http://blog.kineticweb.com/articles/2008/02/18/highrise-api-and-tagging</link>
      <category>highrise</category>
      <category>ruby</category>
      <category>Rails</category>
      <category>37signals</category>
    </item>
    <item>
      <title>Starting to Get Thin, v0.6.3</title>
      <description>&lt;p&gt;When I first heard about Thin I was slightly intrigued, but less enthusiastic when I attempted to run it (not sure what version). Anyway, now that Thin has matured a bit more, and Merb 0.9 is bringing the love of &lt;a href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; to the masses&amp;#8230; I&amp;#8217;m &lt;strong&gt;really&lt;/strong&gt; &lt;strong&gt;really&lt;/strong&gt; &lt;strong&gt;really&lt;/strong&gt; starting to see what all the fuss is about. 3000+ requests a second of fuss.&lt;/p&gt;


	&lt;h2&gt;The Skinny&lt;/h2&gt;


	&lt;p&gt;Thin is actually a mash-up of current back-end web serving technologies.&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;the Mongrel parser, I&amp;#8217;m &lt;strong&gt;speculating&lt;/strong&gt; its the &lt;a href="http://www.cs.queensu.ca/~thurston/ragel/"&gt;Ragel executable state machine&lt;/a&gt; portion&lt;/li&gt;
&lt;li&gt;Event Machine, and the tough, concurrent service request handling of the &lt;a href="http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf"&gt;Reactor Pattern&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;and Rack, our new hero which brings a common &lt;a href="http://en.wikipedia.org/wiki/Web_Server_Gateway_Interface"&gt;web server gateway interface&lt;/a&gt; to all of our favorite Ruby web frameworks.&lt;/li&gt;
&lt;/ol&gt;

	&lt;p&gt;Fancy technologies (and citations), but how&amp;#8217;s this going to help good&amp;#8217;ole &lt;a href="http://www.peepcode.com"&gt;Geoffrey Grosenbach&lt;/a&gt;?&lt;/p&gt;


	&lt;h2&gt;Installation&lt;/h2&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;$ sudo gem install thin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; 

	&lt;p&gt;...or if you know what your doing&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;$ git clone git://github.com/macournoyer/thin.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&lt;small&gt;If not, go directly to &lt;span class="caps"&gt;FAIL&lt;/span&gt;&amp;#8230;&lt;/small&gt;&lt;/p&gt;


	&lt;h2&gt;Show&amp;#8217;em Some Ruby&lt;/h2&gt;


	&lt;p&gt;Lets take a quick glimpse at the adapter example that is included with the gem (&lt;small&gt;examples/adapter.rb&lt;/small&gt;).&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ll try not to ramble on about Rack too long but&amp;#8230; This really shows you how damn simple it can be to plug and play applications into a Rack stack, and the power that Thin brings along with its speed!&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;dirname&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="constant"&gt;__FILE__&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/../lib/thin&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;

&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;SimpleAdapter&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;call&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;env&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="ident"&gt;body&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;hello!&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]&lt;/span&gt;
      &lt;span class="punct"&gt;[&lt;/span&gt;      &lt;span class="number"&gt;200&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  
        &lt;span class="punct"&gt;{&lt;/span&gt;
          &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Content-Type&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;   &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;text/plain&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
          &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Content-Length&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;join&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="punct"&gt;},&lt;/span&gt; &lt;span class="ident"&gt;body&lt;/span&gt;
      &lt;span class="punct"&gt;]&lt;/span&gt;  
   &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt; 

&lt;span class="constant"&gt;Thin&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Server&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;start&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;0.0.0.0&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="number"&gt;3000&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;  

  &lt;span class="ident"&gt;use&lt;/span&gt; &lt;span class="constant"&gt;Rack&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;CommonLogger&lt;/span&gt;

  &lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/test&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;    
    &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="constant"&gt;SimpleAdapter&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;  
  &lt;span class="keyword"&gt;end&lt;/span&gt;  

  &lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;/files&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;    
    &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="constant"&gt;Rack&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;File&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;.&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;  
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="constant"&gt;Rack&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Adapter&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Rails&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:root&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &#8216;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;Users&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;justin&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;apps&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;whatsyomammabeensmokin&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;com&#8216;&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Very briefly, this example is a thin/Thin adapter specification and server initialization. Its also an insanely small example of a Rack adapter (&lt;small&gt;which may, or may not work; reference the real examples in the gem&lt;/small&gt;).&lt;/p&gt;


	&lt;p&gt;We can see, after loading our necessary library file, we create a class used as an adapter, called SimpleAdapter.&lt;/p&gt;


	&lt;p&gt;This holds in it a means to handle status code 200 requests. With a simple output of plain text content-type, set in its header hash. It also includes a simple body of text, &amp;#8220;hello!&amp;#8221; to be returned as content. Literally the Rack adapter, handling a request, need only return this sort of array as a response. [status, header, body].&lt;/p&gt;


	&lt;p&gt;Finishing up the script is Thin&amp;#8217;s server stack initialization. Resembling a Rack config.ru configuration file, Thin initializes a server for our localhost on port 3000. As well as some middle ware setups using our SimpleAdapter.&lt;/p&gt;


	&lt;p&gt;First, inside the setup block you should quickly notice a few &amp;#8220;map&amp;#8221; method calls that resemble Rails routes. &amp;#8220;map&amp;#8221; is actually just that, a simple way to set Rack::URLMap&amp;#8217;s, or web &lt;span class="caps"&gt;URI&lt;/span&gt; paths, inside the main server start block.&lt;/p&gt;


	&lt;p&gt;Second, the &amp;#8220;use&amp;#8221; method actually adds middle ware to the stack.&lt;/p&gt;


	&lt;p&gt;Finally, notice &amp;#8220;run&amp;#8221;. This literally dispatches middle ware logic to the server.&lt;/p&gt;


	&lt;p&gt;I&amp;#8217;ve taken the liberty of adding a call to a local Rails application to point out how easy it is to include new applications straight into a running Rack/Thin server stack. Pretty much just as easy as it is to &amp;#8220;include&amp;#8221; a mix-in into a class in Ruby.&lt;/p&gt;


	&lt;p&gt;If you would like to work more closely with some real code, take a look &lt;a href="http://macournoyer.wordpress.com/2008/02/09/the-flexible-thin-anorexic-gymnast-that-democratized-deployment/"&gt;here&amp;#8230;&lt;/a&gt;&lt;/p&gt;


	&lt;h2&gt;Thin Rails&lt;/h2&gt;


	&lt;p&gt;Ok&amp;#8230; woosh, back to the easy stuff&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Since Thin supports Rails natively through what I believe is an included Rack adapter&amp;#8230; you can start playing with it right out of the box on any of your current Rails projects.&lt;/p&gt;


	&lt;p&gt;Once you have the Thin gem installed, simply do a&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;$ thin start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;If you&amp;#8217;d like to explicitly set your Rails environment&amp;#8230;&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;$ thin start -e development&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;&amp;#8220;&amp;#8212;help&amp;#8221; provides more information as usual. Thin&amp;#8217;s main site has a lovely amount of info with a beautiful web design. Be it tiny lil text (get it, thin).&lt;/p&gt;


	&lt;p&gt;You can also try out a middle ware script that comes with Thin called &amp;#8220;stats&amp;#8221;.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;$ thin --stats=/public_thin/stats start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;This will give you a technical details of your Thin server stats, map&amp;#8217;d to &amp;#8220;localhost:3000/public_thin/stats&amp;#8221;.&lt;/p&gt;


	&lt;h2&gt;To Deployment, and Beyond&lt;/h2&gt;


	&lt;p&gt;I have yet to really attempt a deployment with Thin, but I have one coming up shortly to assist with and will definitely be trying this out.&lt;/p&gt;


	&lt;p&gt;From what I&amp;#8217;ve read you can just as easily replace mongrel_cluster with thin like so.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_shell "&gt;# thin config -C config/thin.yml --servers 3 --port 5000 --chdir ...
# thin start -C config/thin.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;If anyone has tried this yet please let me know how it went.&lt;/p&gt;


	&lt;h2&gt;The Year 2000&lt;/h2&gt;


	&lt;p&gt;Hopefully your interested now and will check into this speedy fast Mongrel replacement. Did I even mention it was fast&amp;#8230;? &amp;gt;;)&lt;/p&gt;


	&lt;p&gt;In the near future I&amp;#8217;ll attempt to report back on deployments and middle ware scripts. I&amp;#8217;m eager to see what useful little apps I can come up with that sit between the web server and my actual Rails application. But I can imagine 8 bazillion possibilities (especially logging and transparent statistics harvesting).&lt;/p&gt;


	&lt;p&gt;So yeah&amp;#8230; cheers to the author!!&lt;/p&gt;</description>
      <pubDate>Tue, 12 Feb 2008 22:16:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:2dbbe8c9-a52c-4652-b5f3-6ad131491c12</guid>
      <author>Justin Reagor</author>
      <link>http://blog.kineticweb.com/articles/2008/02/12/starting-to-get-thin-v0-6-3</link>
      <category>thin</category>
      <category>rack</category>
      <category>ruby</category>
      <category>mongrel</category>
    </item>
    <item>
      <title>Capistrano Twitter task</title>
      <description>&lt;p&gt;Justin had an idea that we should post to &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; whenever we deploy a new version of our apps to either a staging site or the production app. Turns out, this is really easy with the &lt;a href="http://twitter4r.rubyforge.org/"&gt;twitter4r gem&lt;/a&gt;. I used a twitter account that Justin created expressly for our internal notices and set its updates to be private. Then I created this task:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;posts to twitter that something was deployed&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:send_tweet&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;rubygems&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;gem&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;twitter4r&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;twitter&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;twitter/console&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
  &lt;span class="ident"&gt;twitter&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Twitter&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Client&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;from_config&lt;/span&gt;&lt;span class="punct"&gt;('&lt;/span&gt;&lt;span class="string"&gt;config/twitter.yml&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;&lt;span class="ident"&gt;rails_env&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="ident"&gt;status&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;twitter&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;status&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:post&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;deployed &lt;span class="expr"&gt;#{application}&lt;/span&gt; to &lt;span class="expr"&gt;#{rails_env}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;The twitter4r library loads a simple yaml file that contains the username and password of the twitter account to use. And one line of code posts the status update with the name of the app and the environment from previously-defined variables.&lt;/p&gt;


	&lt;p&gt;That&amp;#8217;s it! The great thing about using Twitter for this, as Justin pointed out, is that each one of us developers can consume this information how we choose: IM, Growl messages with &lt;a href="http://iconfactory.com/software/twitterrific"&gt;Twitterific&lt;/a&gt;, &lt;span class="caps"&gt;SMS&lt;/span&gt;, etc. So it&amp;#8217;s really just the syndication technology that we&amp;#8217;re taking advantage of.&lt;/p&gt;


	&lt;h2&gt;Update&lt;/h2&gt;


	&lt;p&gt;Chris&amp;#8217;s comment below prompted me to come up with a &lt;a href="http://blog.kineticweb.com/articles/2008/02/16/capistrano-twitter-task-take-2"&gt;new version&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 10 Feb 2008 10:37:00 -0500</pubDate>
      <guid isPermaLink="false">urn:uuid:c9889033-88a8-4c6a-a2cb-23b2bf7694c5</guid>
      <author>Colin A. Bartlett</author>
      <link>http://blog.kineticweb.com/articles/2008/02/10/capistrano-twitter-task</link>
      <category>capistrano</category>
      <category>ruby</category>
      <category>twitter</category>
      <category>Rails</category>
    </item>
  </channel>
</rss>
