<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Yan Pritzker &#187; rails</title>
	<atom:link href="http://yanpritzker.com/category/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://yanpritzker.com</link>
	<description>photographer, entrepreneur, software engineer, musician, skier</description>
	<lastBuildDate>Sat, 21 Jan 2012 01:18:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
	<atom:link rel="next" href="http://yanpritzker.com/category/rails/feed/?page=2" />

		<item>
		<title>Convert rspec pending to xit with vim</title>
		<link>http://yanpritzker.com/2012/01/03/convert-rspec-pending-to-xit-with-vim/</link>
		<comments>http://yanpritzker.com/2012/01/03/convert-rspec-pending-to-xit-with-vim/#comments</comments>
		<pubDate>Tue, 03 Jan 2012 17:52:31 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[rspec]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://yanpritzker.com/?p=434</guid>
		<description><![CDATA[RSpec has two ways of disabling tests: pending and xit. Except one of them is truly evil. Pending actually still runs the before block even when it&#8217;s disabled. This is bad when you have a test with a very expensive before block. Changing the pending to xit is a great strategy, but tedious. Vimscript to [...]]]></description>
			<content:encoded><![CDATA[<p>RSpec has two ways of disabling tests: pending and xit. Except one of them is truly evil. Pending actually still runs the before block even when it&#8217;s disabled. This is bad when you have a test with a very expensive before block. Changing the pending to xit is a great strategy, but tedious. Vimscript to the rescue! The functionality is available as part of my dotfiles repo, but you can just <a href="https://raw.github.com/skwp/dotfiles/master/vim/plugin/settings/rspec_pending_to_xit.vim">grab the script by itself</a> and type <em>,rxit</em> to use it on a file. </p>
<p>For more awesomeness, check out my dotfiles repo called <a href="http://github.com/skwp/dotfiles">YADR (Yet Another Dotfiles Repo)</a>, featuring 100% clean vimrc with all custom keymapping done in well factored scripts inside vim/plugin/settings, and a list of plugins perfectly tailored for Rails development, currently in alpha preview.</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2012/01/03/convert-rspec-pending-to-xit-with-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dotfiles for insane productivity in bash, git, and vim</title>
		<link>http://yanpritzker.com/2011/11/17/dotfiles-for-ultimate-productivity-in-bash-and-vim/</link>
		<comments>http://yanpritzker.com/2011/11/17/dotfiles-for-ultimate-productivity-in-bash-and-vim/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 22:59:57 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://yanpritzker.com/?p=356</guid>
		<description><![CDATA[Following the principles of insane productivity that I blogged about earlier, I am releasing my dotfile repository, containing customizations for bash, git, and vim. The guiding principles are two letter mnemonics for everything bash and git related, and single letter capital letter actions for all common Vim commands. The selection of vim plugins is best [...]]]></description>
			<content:encoded><![CDATA[<p>Following the principles of <a href="http://yanpritzker.com/2006/10/03/five-ways-to-get-insane-productivity-boosts/">insane productivity</a> that I blogged about earlier, I am releasing my <a href="http://github.com/skwp/dotfiles">dotfile repository</a>, containing customizations for bash, git, and vim.</a> The guiding principles are two letter mnemonics for everything bash and git related, and single letter capital letter actions for all common Vim commands. The selection of vim plugins is best of breed for navigation, color highlighting, and git integration. The vim setup is optimized for rails and git development. The vimrc contains my custom single-letter aliases and is pretty well commented, so that you can easily take or reject my modifications as you need. and I will continue to clean up the repo and move everything into tpope&#8217;s pathogen plugin format over time. Enjoy and please send feedback!</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2011/11/17/dotfiles-for-ultimate-productivity-in-bash-and-vim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>vim/rails/git: find references to current partial</title>
		<link>http://yanpritzker.com/2011/10/31/vimrailsgit-find-references-to-current-partial/</link>
		<comments>http://yanpritzker.com/2011/10/31/vimrailsgit-find-references-to-current-partial/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 16:34:57 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://yanpritzker.com/?p=344</guid>
		<description><![CDATA[Update 12/15/2011: Released as a plugin on github Blazing fast way of finding references to the current partial you&#8217;re viewing using this simple script. Requires git-grep.vim. Bonus: at the bottom of the script I also define &#8220;K&#8221; to git grep the current word. Very handy for fast function reference finding. Like this post? Here are [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update 12/15/2011: Released as a plugin <a href="https://github.com/skwp/vim-git-grep-rails-partial">on github</a></strong></p>
<p>Blazing fast way of finding references to the current partial you&#8217;re viewing using this simple script. Requires <a href="https://github.com/tjennings/git-grep-vim">git-grep.vim</a>. Bonus: at the bottom of the script I also define &#8220;K&#8221; to git grep the current word. Very handy for fast function reference finding.</p>
<p><script src="https://gist.github.com/1327904.js?file=git_grep_partial.vim"></script></p>
<p>Like this post? Here are some more you might enjoy:</p>
<ul>
<li><a href="http://yanpritzker.com/2006/10/03/five-ways-to-get-insane-productivity-boosts/">Five ways to get insane productivity boosts</a></li>
<li><a href="http://yanpritzker.com/2011/10/26/colorful-vim-ruby-tests-and-debugging/">Colorful ruby tests and debugging</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2011/10/31/vimrailsgit-find-references-to-current-partial/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Long running Threads in Rails and metaprogramming fun</title>
		<link>http://yanpritzker.com/2008/06/11/long-running-threads-in-rails-and-metaprogramming-fun/</link>
		<comments>http://yanpritzker.com/2008/06/11/long-running-threads-in-rails-and-metaprogramming-fun/#comments</comments>
		<pubDate>Wed, 11 Jun 2008 03:07:41 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[background]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://skwpspace.com/?p=166</guid>
		<description><![CDATA[Disclaimer: This post contains evil (but highly fun!) code. Proceed at your own peril&#8230; I was recently designing an application that needed to execute some long running requests against an external host. If you&#8217;ve ever tried doing something like this in Rails, you&#8217;ll find your mongrels will block up waiting for the request to complete, [...]]]></description>
			<content:encoded><![CDATA[<p>Disclaimer: This post contains evil (but highly fun!) code. Proceed at your own peril&#8230;</p>
<p>I was recently designing an application that needed to execute some long running requests against an external host. If you&#8217;ve ever tried doing something like this in Rails, you&#8217;ll find your mongrels will block up waiting for the request to complete, bringing the experience for all other users to a halt. </p>
<p>I wanted to dispatch my long running request, return to the user, and then poll for results using AJAX. There are many ways to do background tasks in Rails, most of which require running an out of process background server with which you will communicate over some sort of queue or memcached. There&#8217;s <a href="http://backgroundrb.rubyforge.org/">BackgroundRb</a>, <a href="http://agilewebdevelopment.com/plugins/bj">Bj</a>, <a href="http://playtype.net/past/2008/2/6/starling_and_asynchrous_tasks_in_ruby_on_rails/">workling</a>, and so on, but this seemed overkill for my problem.</p>
<p>After reading a <a href="http://bibwild.wordpress.com/2007/08/28/threading-in-rails/">post on using Ruby Threads</a>, I decided to be brave and try this approach. I implemented a simple action which would spawn a thread and proceed to return the result whether it was ready or not. This action is polled via AJAX and on the next poll the result will be correct. The pseudocode looks something like</p>
<pre class="textmate-source black_pearl"><span class="source source_ruby"><span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">long_running_action</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span>spawn a thread
</span>  precache_the_results

<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> This action throws DataNotAvailableException
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> if file is missing/unreadable
</span>  results <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> read_cached_results

<span class="keyword keyword_control keyword_control_ruby">rescue</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">DataNotAvailableException</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> This tells me that when I load the page
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> I should invoke an ajax a couple seconds
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> later to check for results again
</span>  flash<span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">[</span><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>update_right_away</span><span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby">]</span> <span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby">=</span> <span class="constant constant_language constant_language_ruby">true</span>
<span class="keyword keyword_control keyword_control_ruby">ensure</span>
  respond_to <span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby">do </span><span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby">|</span><span class="variable variable_other variable_other_block variable_other_block_ruby">wants</span><span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby">|</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> render an RJS update with the results
</span>  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>

<span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">precache_the_results</span></span>
  <span class="support support_class support_class_ruby">Thread</span><span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span> <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">{</span><span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block">
</span>    expensive_action_outputs_to<span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">(</span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>file.txt<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span><span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby">)</span>
  <span class="punctuation punctuation_section punctuation_section_scope punctuation_section_scope_ruby">}</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Because I didn&#8217;t <code>join</code> the Thread to the request thread, it lives on after the request completes, which is just what I needed. Since the code inside my Thread is a call to an external provider and doesn&#8217;t write to the database, I am not concerned with ActiveRecord threading issues.</p>
<p><b>The only problem</b> with this approach is that in development mode, Rails likes to reload your classes on every request. But if your thread runs past the request lifetime, the class that&#8217;s running it may be unloaded while it&#8217;s running, wreaking all sorts of havoc. But Ruby allows us the power to be <em>truly evil:</em>. What if I just prevent Threads from doing what they want to in development mode? Turns out I can!</p>
<pre class="textmate-source black_pearl"><span class="source source_ruby source_ruby_rails"><span class="keyword keyword_control keyword_control_ruby">if</span> <span class="meta meta_environment-variable meta_environment-variable_ruby"><span class="variable variable_other variable_other_constant variable_other_constant_ruby">ENV</span>[<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>RAILS_ENV<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>]</span> <span class="keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_ruby">==</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>development<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
<span class="meta meta_class meta_class_ruby">  <span class="keyword keyword_control keyword_control_class keyword_control_class_ruby">class</span> <span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby">Thread</span></span>
    <span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">initialize</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">(</span><span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"><span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby">&amp;</span>block</span><span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby">)</span></span>
      block<span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby">.</span>call
    <span class="keyword keyword_control keyword_control_ruby">end</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span>
</span></pre>
<p>This code is defined in the class where I&#8217;m doing the magic. Do NOT just slap this into your environment.rb as you&#8217;ll horribly break the Rails startup logic. There&#8217;s probably a slightly smarter and safer way to do this by using a Factory pattern to create the threads and explicitly specifying the implementation you want. But this is my party and I&#8217;ll monkeypatch if I want to.</p>
<p>So..comments, suggestions, complaints? Is this going to die horribly in production? I guess we&#8217;ll have to see!</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/06/11/long-running-threads-in-rails-and-metaprogramming-fun/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Testing your ActiveRecord migrations</title>
		<link>http://yanpritzker.com/2008/06/09/testing-your-activerecord-migrations/</link>
		<comments>http://yanpritzker.com/2008/06/09/testing-your-activerecord-migrations/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 17:00:11 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[testing]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://skwpspace.com/?p=164</guid>
		<description><![CDATA[Sometimes you have a data migration that creates or modifies records in some way, and you would like to test it in your unit tests right? Except that Rails typically just clones the structure of your dev database, not its data. So how do you test that a migration succeeded? Simple, just invoke it during [...]]]></description>
			<content:encoded><![CDATA[<p>Sometimes you have a data migration that creates or modifies records in some way, and you would like to test it in your unit tests right? Except that Rails typically just clones the structure of your dev database, not its data. So how do you test that a migration succeeded? Simple, just invoke it during your test:</p>
<p>This code is written using the <a href="http://www.thoughtbot.com/projects/shoulda">shoulda</a> plugin which gives a slightly more verbose breakdown of the setup and the test, but it can be done with test/unit just as well.</p>
<pre><code>
context "orphan user migration" do
  setup do
    require "#{RAILS_ROOT}/db/migrate/163_create_orphan_owner"
    CreateOrphanOwner.up
  end
  should "create the orphan user" do
    assert orphan = User.orphan_owner
    assert orphan.role?(User::ORPHAN_OWNER)
  end
end
</code></pre>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/06/09/testing-your-activerecord-migrations/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Rails tagging plugins overview and comparison</title>
		<link>http://yanpritzker.com/2008/05/14/rails-tagging-plugins-overview-and-comparison/</link>
		<comments>http://yanpritzker.com/2008/05/14/rails-tagging-plugins-overview-and-comparison/#comments</comments>
		<pubDate>Wed, 14 May 2008 08:16:10 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[social web]]></category>

		<guid isPermaLink="false">http://skwpspace.com/2008/05/14/rails-tagging-plugins-overview-and-comparison/</guid>
		<description><![CDATA[span.pro, li.pro { color: green; } span.con, li.con { color: red; } span.maybe, li.maybe { color: orange; } table.separated td { border-bottom: 1px solid #eee; vertical-align:top; line-height:1.2em; } ul.narrow li, table.separated ul li { margin:0; padding:0; margin-left:1em; } There are way too many tagging plugins for Rails. I&#8217;ve produced this post as an attempt to [...]]]></description>
			<content:encoded><![CDATA[<style type="text/css" media="screen">
  span.pro, li.pro {
    color: green;
  }
  span.con, li.con {
    color: red;
  }
  span.maybe, li.maybe {
    color: orange;
  }
  table.separated td {
    border-bottom: 1px solid #eee;
    vertical-align:top;
    line-height:1.2em;
  }
  ul.narrow li, table.separated ul li {
    margin:0;
    padding:0;
    margin-left:1em;
  }
</style>
<p>There are way too many tagging plugins for Rails. I&#8217;ve produced this post as an attempt to summarize the differences between them. Disclaimer: I didn&#8217;t actually try all the plugins but I did peruse their code when deciding which one I would use.</p>
<p>My criteria for choosing a plugin was:</p>
<ul class='narrow'>
<li>Important: Supports user-owned tagging</li>
<li>Important: Supports tag cloud generation</li>
<li>Less important: Code as clean as possible for extending</li>
<li>Somewhat important: ability to contribute patches. I had been stuck with a heavily customized 2006 acts_as_taggable before and didn&#8217;t want the same thing with the new plugin.</li>
<li>Not important: Related tags, and other complex tag searches</li>
</ul>
<table class='separated'>
  <Tr></p>
<th>Title</th>
<th>Pros &amp; Cons</th>
</tr>
<tr>
<td style='padding-right:1em'>
      <a href="http://rubyforge.org/projects/taggable/" title="RubyForge: acts_as_taggable: Project Info">acts_as_taggable</a> gem<br/><br />
      <label>Last Modified:</label> <span class='con'>8/13/2006</span>
    </td>
<td>
<ul>
<li class='con'>may have (minor) issues with Rails 2.0</li>
<li class='con'>no longer maintained and way too old to be taken seriously</li>
<li class='con'>code is pretty messy, but tagging can be a messy business</li>
<li class='maybe'>distributed as a gem; I want a plugin</li>
</ul>
</td>
</tr>
<tr>
<td>
      <a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids">acts_as_taggable_on_steroids</a><br />
      <br/><label>Last Modified:</label> <span class='maybe'>3/30/2008</span>
    </td>
<td>
<ul>
<li class='pro'>supports tag caching with a column on the tagged object</li>
<li class='con'>does not support user owned taggings</li>
<li class='con'>lives in svn</li>
<li class='con'>has lots of value add methods: find related tags, etc&#8230;builds on messy code from original plugin</li>
<li class='con'>plugin page has way too many comments indicating bugs or quirks</li>
</ul>
</td>
</tr>
<tr>
<td>
      <a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on">acts_as_taggable_on</a><br />
      <br/><label>Last Modified:</label> <span class='pro'>5/3/2008</span>
    </td>
<td>
<ul>
<li class='pro'>lives at github, easy to contribute, and recently entered active development</li>
<li class='con'>based on the steroids plugin above with similar messy code</li>
<li class='con'>does not support user owned tags</li>
<li class='maybe'>supports multiple tagging contexts per object, which is a special case that I didn&#8217;t require for my project</li>
</ul>
</td>
</tr>
<tr>
<td>
      <a href="http://github.com/monki/acts_as_taggable_redux/tree/master">acts_as_taggable_redux</a><br />
      <br/><label>Last Modified:</label> <span class='pro'>5/14/2008</span> (by me), previously <span class='maybe'>07/2007</span>
    </td>
<td>
<ul>
<li class='pro'>recently moved to <a href="http://github.com/monki/acts_as_taggable_redux/tree/master">github</a>, so it&#8217;s easy to contribute.</li>
<li class='pro'>supports user owned tags out of the box.</li>
<li class='maybe'>does not provide many special methods like finding related tags, but has simpler code.</li>
<li class='maybe'>was not actively maintained by original maintainer, but I am going to be contributing more to it.</li>
<li class='pro'>recently added support for scoping Tag searches by taggable type</li>
</ul>
</td>
</tr>
<tr>
<td>
      <a href="http://agilewebdevelopment.com/plugins/spraypaint">spraypaint</a><br />
      <br/><label>Last Modified:</label> <span class='maybe'>12/12/2007</span>
    </td>
<td>
<ul>
<li class='con'>not as recently touched as some of the others and lives in svn.</li>
<li class='con'>does not support user owned tags.</li>
<li class='maybe'>has a complex data structure with a special table for tag counts and support for tag namespaces.</li>
<li class='maybe'>namespaces seem like overkill to me as they can be done with simple strings, but can make sense in very large tagspaces to narrow searches.</li>
<li class='maybe'>several interesting methods for related tags,etc, but some commented as not ready for primetime.</li>
</ul>
</td>
</tr>
</table>
<p>After reviewing the options, <a href="http://github.com/monki/acts_as_taggable_redux/tree/master" title="monki's acts_as_taggable_redux at master &mdash; GitHub">acts_as_taggable_redux</a> seemed like the best candidate. I immediately had a couple contributions, which I first emailed to Wes, and later he moved the plugin to github and I am now a direct comitter. </p>
<p>I plan to continue to enhance this plugin, and possibly add some features to it from the other plugins, such as tag caching which becomes important for scalability. As it&#8217;s the most minimal of the plugins I feel it&#8217;s a good base to start with building clean code that doesn&#8217;t have a lot of legacy stuff from the 2006 plugin, which was the dark ages of Ruby coding with lots of ugly code produced :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/05/14/rails-tagging-plugins-overview-and-comparison/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Twitter opens the floodgates of FUD</title>
		<link>http://yanpritzker.com/2008/05/02/twitter-opens-the-floodgates-of-fud/</link>
		<comments>http://yanpritzker.com/2008/05/02/twitter-opens-the-floodgates-of-fud/#comments</comments>
		<pubDate>Fri, 02 May 2008 02:03:48 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[performance]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[scalability]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://skwpspace.com/?p=149</guid>
		<description><![CDATA[TechCrunch is reporting on rumors that twitter is leaving Ruby on Rails. Of course the comment threads are covered by a heated debate by people either bashing RoR, suggesting their favorite language and platform as the &#8216;only possible solution&#8217;, or both. Nevermind that Friends For Sale, with 630k active daily users scales just fine on [...]]]></description>
			<content:encoded><![CDATA[<p>TechCrunch is reporting on <a href="http://www.techcrunch.com/2008/05/01/twitter-said-to-be-abandoning-ruby-on-rails/">rumors that twitter is leaving Ruby on Rails</a>. Of course the comment threads are covered by a heated debate by people either bashing RoR, suggesting their favorite language and platform as the &#8216;only possible solution&#8217;, or both. Nevermind that Friends For Sale, with 630k active daily users scales just fine on RoR. Let&#8217;s ignore that scribd and yellowpages.com use RoR and most developers would only dream of having the traffic these apps have.</p>
<p>Of course, only Enterprise Java scales, and we know this because the word Enterprise is right there in the name. Of course, the only platform you should consider is .NET because it has built in caching and hundreds of thousands of college graduates know it. Of course, you need to use PHP because Facebook is written in PHP and Facebook scales. The fallacy of these arguments should be painfully obvious, yet people are shouting these things as if they were gospel truth.</p>
<p>I&#8217;d like to offer here, the scalability manifesto. Please repeat these items aloud to yourself every time you want to say something about language X or framework Y not scaling.</p>
<p><B>The Scalability Manifesto</b></p>
<ol>
<li> Scalability means the ability to handle increasing load by increasing resources.</li>
<li> Scalability <em>does not mean being &#8216;fast&#8217;</em>. </li>
<li> Choice of language does not guarantee scalability. </li>
<li> Hardware costs decrease exponentially, developer salaries do not.</li>
<li> Only <em>you</em> can make your system scale.</li>
</ol>
<p>Trading performance for development time is generally not a good idea. It&#8217;s likely that by the time your application reaches serious traffic levels (if ever), hardware will cost half of what it did when you started. Now does spending twice as much dev time with a lower level language seem justified? Now this is not always the case, but my bet is if you do the math and realize your team of 4 Ruby hackers is doing what a team of 10 Java programmers used to do, you might conclude that linear performance gains due to language choice are not as relevant as hiring smart people who can get work done quickly, and design scalable systems. </p>
<p>There&#8217;s no such thing as a free lunch, and that includes scalability. </p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/05/02/twitter-opens-the-floodgates-of-fud/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rails moves to Lighthouse</title>
		<link>http://yanpritzker.com/2008/04/16/rails-moves-to-lighthouse/</link>
		<comments>http://yanpritzker.com/2008/04/16/rails-moves-to-lighthouse/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 16:39:26 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[bugtracking]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://skwpspace.com/2008/04/16/rails-moves-to-lighthouse/</guid>
		<description><![CDATA[In a series of dev infrastructure changes, the Rails team is moving to Lighthouse as its bugtracking system. I wrote about Lighthouse more than a year ago as an application to watch in the bugtracking space, and now they&#8217;re coming into the limelight with official support from the Rails team. I&#8217;m really happy to see [...]]]></description>
			<content:encoded><![CDATA[<p>In a series of dev infrastructure changes, the <a href="http://weblog.rubyonrails.com/2008/4/15/rails-and-family-on-lighthouse">Rails team is moving to Lighthouse as its bugtracking system.</a> I <a href="http://skwpspace.com/2007/04/02/ui-matters/">wrote about Lighthouse</a> more than a year ago as an application to watch in the bugtracking space, and now they&#8217;re coming into the limelight with official support from the Rails team. </p>
<p>I&#8217;m really happy to see that the Rails team and 37 Signals are making this move because it will force Lighthouse to become an even better application as it meets demands of many projects that are sure to follow Rails. </p>
<p>Too many teams put up with products that have terrible usability like Bugzilla because many programmers tend not to think about usability as an important factor. We are used to command line interfaces and white text on black backgrounds. But believe it or not, using something like <a href="http://lighthouseapp.com/">Lighthouse</a> over say, Bugzilla, boosts your productivity because it is well designed and lets you get to the information you need more quickly and with less frustration. That said, <a href="http://trac.edgewall.org/">Trac</a> is still many levels above Bugzilla in usability and design so if you&#8217;re using an in-house product, I don&#8217;t know of many better ones.</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/04/16/rails-moves-to-lighthouse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails moves to GitHub; Git is the new black</title>
		<link>http://yanpritzker.com/2008/04/11/rails-moves-to-github-git-is-the-new-black/</link>
		<comments>http://yanpritzker.com/2008/04/11/rails-moves-to-github-git-is-the-new-black/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 14:26:03 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rcs]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[thoughts]]></category>

		<guid isPermaLink="false">http://skwpspace.com/2008/04/11/rails-moves-to-github-git-is-the-new-black/</guid>
		<description><![CDATA[Rails has officially moved to GitHub. The GitHub guys have done an awesome job capitalizing on the growing trend of git usage, especially in the Rails community, and of course getting &#8216;official blessing&#8217; from the Rails core team themselves means that many more projects are sure to follow. I&#8217;ve been using git-svn to work on [...]]]></description>
			<content:encoded><![CDATA[<p><A href="http://weblog.rubyonrails.com/2008/4/11/rails-premieres-on-github">Rails has officially moved to GitHub</a>. The <a href="http://github.com">GitHub</a> guys have done an awesome job capitalizing on the growing trend of git usage, especially in the Rails community, and of course getting &#8216;official blessing&#8217; from the Rails core team themselves means that many more projects are sure to follow.</p>
<p>I&#8217;ve been using git-svn to work on a local branch of our svn when I work on  <a href="http://planyp.us">Planypus</a> and have enjoyed the ability to do local commits on the go. I can&#8217;t say I&#8217;ve quite mastered all the ins and outs of it yet but working with git via git-svn is pretty smooth and it&#8217;s fun to see all the output that shows your changes being played back when you do &#8216;git svn rebase&#8217;. Other than that, working with git does require a bit of a paradigm shift because the primary entity is the changeset rather than the file. I hope to get a better handle on things like reverting in the near future and am watching the progress of GitHub and friends with great enthusiasm.</p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/04/11/rails-moves-to-github-git-is-the-new-black/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fix for TextMate Ruby tests broken with stack level too deep</title>
		<link>http://yanpritzker.com/2008/04/11/fix-for-textmate-ruby-tests-broken-with-stack-level-too-deep/</link>
		<comments>http://yanpritzker.com/2008/04/11/fix-for-textmate-ruby-tests-broken-with-stack-level-too-deep/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 01:37:33 +0000</pubDate>
		<dc:creator>yan</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[textmate]]></category>

		<guid isPermaLink="false">http://skwpspace.com/2008/04/11/fix-for-textmate-ruby-tests-broken-with-stack-level-too-deep/</guid>
		<description><![CDATA[If you experience problems running single unit tests in TextMate with Rails 2, it may be due to a bug. The problem has something to due with conflicting builder.rb instances in Rails and TextMate. The simplest and least intrusive fix is to add this to the top of your test_helper.rb $LOAD_PATH.reject! { &#124;e&#124; e.include? 'TextMate' [...]]]></description>
			<content:encoded><![CDATA[<p>If you experience problems running single unit tests in TextMate with Rails 2, it may be due to <a href="http://macromates.com/ticket/show?ticket_id=F4DA8B03">a bug</a>. The problem has something to due with conflicting builder.rb instances in Rails and TextMate. The simplest and least intrusive fix is to add this to the top of your test_helper.rb</p>
<p><code><br />
$LOAD_PATH.reject! { |e| e.include? 'TextMate' }<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://yanpritzker.com/2008/04/11/fix-for-textmate-ruby-tests-broken-with-stack-level-too-deep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

