<?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>The True Tribe</title>
	<atom:link href="http://www.thetruetribe.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thetruetribe.com</link>
	<description>Vroom! That&#039;s us leaving IE in the dust.</description>
	<lastBuildDate>Fri, 22 Jan 2010 23:34:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>iPhone Click Event Delay</title>
		<link>http://www.thetruetribe.com/2010/01/iphone-click-event-delay/</link>
		<comments>http://www.thetruetribe.com/2010/01/iphone-click-event-delay/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 23:34:03 +0000</pubDate>
		<dc:creator>jdempcy</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=300</guid>
		<description><![CDATA[It appears that the iPhone has a built-in delay of about 300ms before firing the click event. This is most likely to give the user time to make a gesture, such as scrolling the page. In some cases, though, this may not be desired. For instance, if you make a mobile web app that doesn&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>It appears that the iPhone has a built-in delay of about 300ms before firing the click event. This is most likely to give the user time to make a gesture, such as scrolling the page. In some cases, though, this may not be desired. For instance, if you make a mobile web app that doesn&#8217;t scroll, there&#8217;s no reason to wait 300ms every time the user clicks.</p>
<p>In these cases, the trick is to <a href="http://cubiq.org/remove-onclick-delay-on-webkit-for-iphone/9">use ontouchstart instead of onclick</a>.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2010%2F01%2Fiphone-click-event-delay%2F&amp;linkname=iPhone%20Click%20Event%20Delay"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2010/01/iphone-click-event-delay/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Understanding Pointers in JavaScript</title>
		<link>http://www.thetruetribe.com/2010/01/understanding-pointers-in-javascript/</link>
		<comments>http://www.thetruetribe.com/2010/01/understanding-pointers-in-javascript/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 09:10:29 +0000</pubDate>
		<dc:creator>jdempcy</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=298</guid>
		<description><![CDATA[Pointers can sometimes be a confusing topic. In JavaScript, it is perhaps even moreso than in other languages. The confusion arises because the var keyword is serving double duty. It is used to define variables, as is commonly realized. But it is also used to make references&#8211; or point to&#8211; other variables, functions and properties.
In [...]]]></description>
			<content:encoded><![CDATA[<p>Pointers can sometimes be a confusing topic. In JavaScript, it is perhaps even moreso than in other languages. The confusion arises because the <em>var</em> keyword is serving double duty. It is used to define variables, as is commonly realized. But it is also used to make references&#8211; or point to&#8211; other variables, functions and properties.<span id="more-298"></span></p>
<p>In most programming languages, for example  C, pointers are symbolized with an asterisk. JavaScript relies on the developer to know which <em>var</em>s are references and which aren&#8217;t. Why is this important? To put it succinctly, it is the difference between a variable being immutable or dynamic.</p>
<p>An example may be in order. Here&#8217;s a simple script you can paste into Firebug to see how pointers work.</p>
<pre>var marxBros = ['Chico', 'Harpo', 'Groucho']
var marxBrosPointer = marxBros;
marxBrosPointer.push('Zeppo');
console.log(marxBros); // ['Chico', 'Harpo', 'Groucho', 'Zeppo']
console.log(marxBrosPointer); // ['Chico', 'Harpo', 'Groucho', 'Zeppo']</pre>
<p>As you can see, <em>marxBros</em> and <em>marxBrosPointer</em> are identical. Anything you do to <em>marxBrosPointer</em> will change <em>marxBros </em>and vice versa. You can think of them like aliases which both reference the same thing.</p>
<p>There is actually no difference now. <em>marxBros</em> is the original and <em>marxBrosPointer</em> is the pointer. But, for all intents and purposes, they are identical. One thing to note is that if you reassign one of them to something else, it does not affect the other.</p>
<pre>var marxBros = ['Chico', 'Harpo', 'Groucho']
var marxBrosPointer = marxBros;
marxBros = null;
console.log(marxBrosPointer); //  ["Chico", "Harpo", "Groucho"]
</pre>
<p>Now let&#8217;s look at a case where we are not dealing with pointers. Let&#8217;s do the same thing as our first example, but instead of using an array, we&#8217;ll use strings. Yes, this makes a big difference.</p>
<pre>var marxBros = 'Chico, Harpo, Groucho';
var marxBrosCopy = marxBros;
marxBrosCopy += ', Zeppo';
console.log(marxBros); // 'Chico, Harpo, Groucho'
console.log(marxBrosCopy); // 'Chico, Harpo, Groucho, Zeppo'
</pre>
<p>When using strings instead of arrays, we find that changes to one do not change the other. Whether you change the original or the copy, they are not linked in the same way arrays and objects are. In the first example, changing either the original or the pointer resulted in changes to both variables. In this case, because strings are immutable in JavaScript, the <em>var</em> keyword copies a string instead of referencing it.</p>
<p>The same is true of numbers:</p>
<pre>var numberOfMarxBros = 3;
var numberOfMarxBrosCopy = numberOfMarxBros;
++numberOfMarxBrosCopy;
console.log(numberOfMarxBros); // 3
console.log(numberOfMarxBrosCopy); // 4
</pre>
<p>Compare this to properties and functions, which use pointers:</p>
<pre>// First let's make a cleanHouse function which has an action property
var cleanHouse = function() {
 console.log(arguments.callee.action);
}
cleanHouse.action = 'Doing your dishes...';

// Let's test and make sure it works as expected.
cleanHouse(); // 'Doing your dishes'

// So far so good. Now let's make a pointer to this function.
var actionToTake = cleanHouse;
actionToTake(); // 'Doing your dishes...'

// Now actionToTake is identical to cleanHouse. Any changes to one affect the other.
cleanHouse.action = 'Vacauuming the rug...';
actionToTake(); // 'Vacauuming the rug...'

actionToTake.action = 'Watering the plants...';
cleanHouse(); // 'Watering the plants...';
</pre>
<p>Here&#8217;s an example where the reference is lost and it does not achieve the goal:</p>
<pre>var cleanHouse = function() {
    console.log('Doing your dishes...');
}

var actionToTake = cleanHouse;

actionToTake(); // 'Doing your dishes...'

// Off to a good start, but here's where it goes wrong:

cleanHouse = function() {
    console.log('Vacauuming the rug...');
};

// Now the reference has been broken and actionToTake no longer refers to cleanHouse.
// Instead, actionToTake refers to, literally, the anonymous function that cleanHouse previously referred to.

actionToTake(); // 'Doing your dishes...'

// cleanHouse now refers to a new separate function.
cleanHouse(); // 'Vacuuming the rug...'
</pre>
<p>As you can see, it&#8217;s important to know how to use pointers. It will help you decide when you need a copy or something, or when you need a reference to it.</p>
<p>Feel free to post clarifications or other explanations. This topic is certainly important to becoming an advanced JavaScript developer, yet it is not addressed too often. I think we could all benefit from more clarity on the subject, myself included.</p>
<p>I hope this article has helped shine some light on this issue. Happy coding!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2010%2F01%2Funderstanding-pointers-in-javascript%2F&amp;linkname=Understanding%20Pointers%20in%20JavaScript"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2010/01/understanding-pointers-in-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using the Amazon ECS Gem In Your Rails App</title>
		<link>http://www.thetruetribe.com/2010/01/amazon-ecs-gem-in-rails/</link>
		<comments>http://www.thetruetribe.com/2010/01/amazon-ecs-gem-in-rails/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 08:06:00 +0000</pubDate>
		<dc:creator>jdempcy</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=292</guid>
		<description><![CDATA[Amazon.com offers a tremendous amount of web services to developers looking to display their products. They benefit from this because developers make all sorts of cool apps for browsing Amazon. For example, nifty 3D Flash experience CoolIris (formerly known as &#8216;PicLens&#8217;) added Amazon functionality to their product. It&#8217;s a win-win for developers and Amazon because [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon.com offers a tremendous amount of web services to developers looking to display their products. They benefit from this because developers make all sorts of cool apps for browsing Amazon. For example, nifty 3D Flash experience <a href="http://www.cooliris.com/tab/#c=322&amp;f=Channels">CoolIris</a> (formerly known as &#8216;PicLens&#8217;) <a href="http://www.readwriteweb.com/archives/piclens_review_videos.php">added Amazon functionality to their product</a>. It&#8217;s a win-win for developers and Amazon because it drives traffic to the site while paying developers referral fees.<span id="more-292"></span></p>
<p>If you&#8217;re a Rails developer looking to tap into Amazon&#8217;s massive warehouse of product data, you&#8217;re in luck. <a href="http://www.pluitsolutions.com/projects/amazon-ecs">Pluit Solutions</a> has released the amazon-ecs gem exactly for this purpose. It&#8217;s as easy to install as:</p>
<pre>gem install amazon-ecs</pre>
<p>If that doesn&#8217;t work for you, you can always  <a href="http://github.com/jugend/amazon-ecs">download it from GitHub</a> then install it locally. Or you can clone it at this URL: git://github.com/jugend/amazon-ecs.git</p>
<p>It&#8217;s pretty straightforward to set up. The first thing you&#8217;ll need to do is get an Amazon Web Services account if you don&#8217;t already have one. You can <a href="http://aws.amazon.com/">sign up for AWS here</a>.</p>
<p>You&#8217;ll need to know your developer token to connect to AWS. They recently made it so you need to specify a secret token as well. It would be something like this in your <code>/config/environment.rb</code> file:</p>
<pre># Be sure to restart your server when you modify this file

# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION

# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')

Rails::Initializer.run do |config|
  config.gem "amazon-ecs", :lib =&gt; "amazon/ecs"
  config.time_zone = 'UTC'
  config.frameworks -= [ :active_record ]
end

require 'rubygems'
require 'amazon/ecs'
Amazon::Ecs.options = {:aWS_access_key_id =&gt; '************************', :aWS_secret_key =&gt; '**********************'}</pre>
<p>Just replace the asterisks with your actual AWS public and private keys and you&#8217;re set!</p>
<p>Say you want to run a search at the /amazon/ controller&#8217;s index action. Let&#8217;s generate the controller now:</p>
<pre>ruby script/generate controller Amazon</pre>
<p>Now in the /app/controllers/amazon_controller.rb file you can define the index action like so:</p>
<pre>class AmazonController &lt; ApplicationController
  def index
  end
end</pre>
<p>This is where we&#8217;ll be putting the service call to AWS to get our data back.</p>
<p>The next step is to add in a hard coded search query. You can make this based on user input later, but for now, let&#8217;s just search for &#8216;Ghostbusters&#8217; and see what we get back.</p>
<pre>class AmazonController &lt; ApplicationController
  def index
    query = params[:q]
    page = params[:p]
    @results = Amazon::Ecs.item_search('Ghostbusters', :response_group =&gt; 'Medium', :search_index =&gt; 'DVD', :item_page =&gt; page).items
   end
end</pre>
<p>To display the data, we&#8217;ll need to make a view for it. Let&#8217;s create a new file in <code>/views/amazon</code> called <code>index.html.erb</code>.</p>
<p>The view can look like this:</p>
<pre>  (
    {
    results:
      [
        &lt;% @results.each_with_index do |result, i| %&gt;
          {
            title: "&lt;%=h result.get('title') %&gt;",
            detailpageurl: "&lt;%=h result.get('detailpageurl') %&gt;",
            imageurl: "&lt;%=h result.get('mediumimage/url') %&gt;",
            largeimageurl: "&lt;%=h result.get('largeimage/url') %&gt;"
          }&lt;% if i != @results.length%&gt;,&lt;% end %&gt;
        &lt;% end %&gt;
      ]
    }
  )</pre>
<p>What&#8217;s that, you might ask? It&#8217;s just simple JSON actually. We get the data back as pure Ruby objects but for Ajax applications it&#8217;s much easier to work with as JSON. You can just as easily make it HTML, but I thought you might want to see the data displayed in JSON first.</p>
<p>Fire up the Ruby server with a <code>ruby script/server</code> call and hit up <code>localhost:3000/Amazon</code> in a browser. You should see a JSON response with a bunch of data pertaining to our query, namely, the movie Ghostbusters.</p>
<p>If you were to display this data as images and links on a page, you could do something like this:</p>
<pre>&lt;% @results.each_with_index do |result, i| %&gt;
	&lt;%= content_tag :li, link_to(image_tag(result.get('mediumimage/url'), {:alt =&gt; result.get('title')}), result.get('detailpageurl')) %&gt;
&lt;% end %&gt;</pre>
<p>If you change the view to be HTML it should render all of the images inside of <code>li</code> elements in the page. The thing is, it&#8217;s still always displaying Ghostbusters data. Now we can make it pull in from a query string so it dynamically displays data instead:</p>
<pre>class AmazonController &lt; ApplicationController
  def index
    query = params[:q]
    @results = Amazon::Ecs.item_search(query, :response_group =&gt; 'Medium', :search_index =&gt; 'DVD', :item_page =&gt; page).items
   end
end</pre>
<p>Now if you go to <code>localhost:3000/amazon?q=2001+a+space+odyssey</code> you should see results pertaining to that masterpiece instead.</p>
<p>And next we can even add a page specification:</p>
<pre>class AmazonController &lt; ApplicationController
  def index
    query = params[:q]
    page = params[:p]
    @results = Amazon::Ecs.item_search(query, :response_group =&gt; 'Medium', :search_index =&gt; 'DVD', :item_page =&gt; page).items
   end
end</pre>
<p>At this point you can get more than one page of results by specifying the q parameter, e.g.: <code>localhost:3000/amazon?q=2001+a+space+odyssey&amp;p=2</code> returns results 11-20.</p>
<p>It&#8217;s hard coded to searching in &#8216;DVD&#8217; right now. If we change it like so we can search everything:</p>
<pre>class AmazonController &lt; ApplicationController
  def index
    query = params[:q]
    page = params[:p]
    @results = Amazon::Ecs.item_search(query, :response_group =&gt; 'Medium', :item_page =&gt; page).items
   end
end</pre>
<p>I just removed the <code>:search_index</code> specification in the service call. It&#8217;s the same thing as specifying <code>:search_index =&gt; 'All'</code> so you can do that instead if you wish.</p>
<p>Valid search indexes are:</p>
<pre> 	%w[ All Apparel Automotive Baby Beauty Blended Books Classical DigitalMusic DVD Electronics ForeignBooks GourmetFood Grocery HealthPersonalCare Hobbies HomeGarden HomeImprovement Industrial Jewelry KindleStore Kitchen Magazines Merchants Miscellaneous MP3Downloads Music MusicalInstruments MusicTracks OfficeProducts OutdoorLiving PCHardware PetSupplies Photo Shoes SilverMerchants Software SoftwareVideoGames SportingGoods Tools Toys UnboxVideo VHS Video VideoGames Watches Wireless WirelessAccessories ]</pre>
<p>Enjoy and best of luck with your Amazon app!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2010%2F01%2Famazon-ecs-gem-in-rails%2F&amp;linkname=Using%20the%20Amazon%20ECS%20Gem%20In%20Your%20Rails%20App"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2010/01/amazon-ecs-gem-in-rails/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Best of 2009, Ruby on Rails Edition</title>
		<link>http://www.thetruetribe.com/2010/01/best-of-2009-ruby-on-rails-edition/</link>
		<comments>http://www.thetruetribe.com/2010/01/best-of-2009-ruby-on-rails-edition/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 06:13:31 +0000</pubDate>
		<dc:creator>jdempcy</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=267</guid>
		<description><![CDATA[It was a good year for Rails. In 2009, we saw a number of exciting developments and a lot of great tools were released. Rails 2.3 was released in March 2009 and met with much fanfare. Rails has seen the introduction of templates, engines and a lot of other great features. 
Thanks to the popularity [...]]]></description>
			<content:encoded><![CDATA[<p>It was a good year for Rails. In 2009, we saw a number of exciting developments and a lot of great tools were released. Rails 2.3 was released in March 2009 and met with much fanfare. Rails has seen the introduction of templates, engines and a lot of other great features. <span id="more-267"></span></p>
<p>Thanks to the popularity of high profile websites that use Rails such as Hulu and Twitter, it is now considered a viable option for large sites. This kind of exposure means a lot of new development and movement. Rails seems to have outgrown many of the scaling woes of yesteryear. Now that it&#8217;s recognized in the mainstream as a stable and feature-rich platform for making websites, adoption has taken off, which means more tutorials, more resources, less bugs, lower barrier to entry and an overall better experience all around.</p>
<p>Another great development occurred quite recently in the Rails community. Two days before Christmas, on December 23, 2009, it was announced that <a href="http://en.wikipedia.org/wiki/Merb">Merb</a> would be merged into Rails 3. This is another huge development which will end the duplication of efforts and fracturing of the developer community that occurred due to competition between Merb and Rails.</p>
<p>In the spirit of celebrating this current Rails renaissance, here are some of the best Rails resources we&#8217;ve come across in the past year. We hope you find these as useful as we did!</p>
<h3><a href="http://lesscss.org/">Less CSS</a></h3>
<p><a href="http://www.thetruetribe.com/wp-content/uploads/2010/01/less-logo.png"><img class="alignnone size-full wp-image-271" title="less-logo" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/less-logo.png" alt="" width="199" height="81" /></a></p>
<p>Less is an extension for CSS that allows you to use variables, perform operations such as mathematical calculations  and other neat features. It uses a Ruby script to read the .less file and generate a .css file to serve up to the browser.</p>
<p>Having variables is hugely helpful and it seems like an oversight in the CSS spec that it wasn&#8217;t included to begin with. Also, being able to add modifiers is nice. You can add, subtract, multiply, divide and even change colors. For instance, #FF0 + #00F would equal #FFF.</p>
<p>They also have mix-ins, which are classes that you can include in selectors, and it will include all of the properties from that class. This is the same thing functionally as adding that class to the elements matched by the selector, but without going into the HTML code. Mix-ins aren&#8217;t allowing us to do anything new that we couldn&#8217;t do already by adding the classes in HTML, but now it allows us to do this in CSS, without even touching the HTML. Some people will like this feature, others will deplore it&#8211; after all, we have a perfectly functional system where we can add multiple classes to a given element to achieve the same effect. But, I for one feel that this is a very useful feature to have. This is great for its reuse of code, and I love making modular CSS classes (for example, &#8220;rounded-corners&#8221;) that can be mixed into other CSS selectors.</p>
<h3><a href="http://git-scm.com/">Git</a> and <a href="http://github.com/">GitHub</a>, Social Coding</h3>
<p><a href="http://git-scm.com/"><img class="alignnone size-full wp-image-269" title="200px-Git-logo.svg" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/200px-Git-logo.svg_.png" alt="git" width="200" height="73" /></a></p>
<p>These are two of the most useful tools of the year, hands down. Git caused a paradigm shift in distributed development. GitHub has become the de facto standard for Git hosting. If you&#8217;re unfamiliar with Git, read up on <a href="http://en.wikipedia.org/wiki/Git_%28software%29">the Wikipedia page</a>. To summarize, it&#8217;s a code versioning system that is well-suited for distributed development groups and open source software. It encourages users to make a fork of the repository so that any useful bug fixes, additions and changes can be easily merged back in, should the developers so desire.</p>
<p><a href="http://github.com/"><img class="alignnone size-full wp-image-270" title="github" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/github.png" alt="github" width="100" height="45" /></a></p>
<p>I don&#8217;t see the advantage of using Git for personal projects or small in-house projects, but it is wonderful for open source efforts like Rails. It&#8217;s certainly a fine choice for any project, though I don&#8217;t see a big advantage over, say, Subversion, until you get into large scale distributed development situations like open source projects. Once you&#8217;re looking at open source projects, like those hosted on GitHub, we&#8217;re talking about a paradigm shift in efficiency.</p>
<p>Historically, most people would download zipped packages of code. Git encourages forking the repository instead. Let&#8217;s look at a quick example of how this works with Rails plugins.</p>
<p>Typically you could install a plugin by downloading some files somewhere and installing them, either with a script or by decompressing them directly to your vendor directory. This works fine but is unidirectional &#8212; you can only get the file from the developer, there is never an opportunity to submit code back, say, if you fix a bug.</p>
<p>The paradigm shift in efficiency that Git brings about is closing the loop: it allows you to easily submit code back to the trunk, thus capturing all those useful improvements to the code that would otherwise be lost on so many hard drives.</p>
<p>With GitHub, instead of downloading the Rails plugin, you fork the Git repositor to your vendor directory. Then, if you have to make changes to the plugin (which I almost always have to do, despite my best efforts to avoid it), you still retain the ability to update the code without losing your fixes. The old way was that if I wanted to upgrade a plugin that I had customized, I would have to download the new one and then manually go through and make whatever customizations I&#8217;d done. This way, you can automate the merging process and only have to go in if there are conflicts. That&#8217;s a big win to me. Then, if I actually do something with a plugin that others might find useful, I can offer up my own fork on GitHub, or submit it to the trunk if I think it&#8217;s useful enough to be included there.</p>
<p>Although Git was released in 2005 and GitHub in 2008, I included them on the 2009 list here because I think they have really broken through to the mainstream in a big way this past year. GitHub achieved meteoric rise during 2009. In January alone 17,000 new repositories were made, according to a talk given by GitHub founders at Yahoo in February of that year. In July of 2009 they had 90,000 unique repositories, double the previous year&#8211; and 45,000 forks of those repositories.</p>
<p>So, get on the bandwagon! Head over to GitHub and see what they have to offer. Or, if you don&#8217;t know where to start, check out this next useful resource for pointers &#8230;</p>
<h3><a href="http://www.ruby-toolbox.com/">The Ruby Toolbox</a></h3>
<p><a href="http://www.ruby-toolbox.com/"><img class="alignnone size-full wp-image-268" title="Toolbox_Red-256x256" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/Toolbox_Red-256x256.png" alt="" width="256" height="256" /></a></p>
<p>The Ruby Toolbox is a wonderful resource for finding out what is popular. It uses metrics such as SVN commits and GitHub forks to determine which Ruby scripts are most popular. You can find out about a lot of great tools this way. I&#8217;ve discovered plenty of useful Rails gems and plugins here. There are also some useful standalone Ruby scripts for a variety of development tasks, such as Less, which doesn&#8217;t depend on Rails to do it&#8217;s thing.</p>
<h3><a href="http://github.com/sandal/prawn">Prawn</a>, PDF Generation Made Easy</h3>
<p>Prawn is a gem for generating PDFs. Let me tell you, working with PDFs is never easy, but Prawn greatly reduces the pain.</p>
<p>Check out <a href="http://railstips.org/2008/10/14/how-to-generate-pdfs-in-rails-with-prawn">this tutorial at RailsTips</a> for more info.</p>
<h3><a href="http://www.ruby-toolbox.com/categories/prototype_replacements.html">jRails</a></h3>
<p>I think it&#8217;s pretty obvious that jQuery has hit the big time in popularity. Endorsements by Microsoft, Amazon.com and other major players have led it to become the go-to JavaScript library of 2009. While Prototype still hangs in there, and MooTools has a great offering, an article I read recently summed it up perfectly when they said &#8216;jQuery is the guitar.&#8217; It had a screen grab of Google search results for guitar versus banjo, along with similar numbers for jquery versus mootools. You get the idea. If you aren&#8217;t using jQuery, you&#8217;re playing the banjo. If you want to really rock out, get on the bandwagon!</p>
<p>I am being facetious here but there is certainly some truth to the fact that a web developer in 2010 must be well-versed in jQuery. It&#8217;s also a viable alternative to Prototype in Ruby on Rails. In fact, I&#8217;ve heard that Rails 3 will be JavaScript framework agnostic, but don&#8217;t quote me on that.</p>
<p>In any case, you don&#8217;t have to wait until Rails 3 to start using jQuery in your Rails app. Simply install the jRails gem and you can go along using all those nifty Rails helpers, completely unaware that they are now implemented in jQuery instead of Prototype. Isn&#8217;t encapsulation great?</p>
<h3><a href="http://haml-lang.com">HAML</a></h3>
<p><a href="http://haml-lang.com"><img class="alignnone size-full wp-image-273" title="haml" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/haml.gif" alt="" width="217" height="225" /></a></p>
<p>HAML (pronounced like Mark &#8220;Luke Skywalker&#8221; Hamill&#8217;s last name) is a great alternative to HTML. You write clean, concise HAML and the parser generates verbose and ugly HTML to serve up to the browser. Thus you can avoid typing those obnoxious closing tags that markup languages are so fond of. Keep your code simple, clean and pure. Or that&#8217;s the idea.</p>
<p>In practice, HAML can be a bit complex. Check out <a href="http://en.wikipedia.org/wiki/Haml">the HAML Wikipedia page</a> to see what I mean &#8212; look at all those obscure symbols. But once you learn what they all mean, it <em>is</em> a very concise, some might say beautiful language.</p>
<h3><a href="http://www.ruby-toolbox.com/categories/rails_file_uploads.html">Paperclip</a></h3>
<p>What can I say? Paperclip rocks. It is the standard for attachments in Rails and with good reason. It has been consistently updated, bug-fixed, and best of all, it is simple with not a bit of bloat. It requires the bare minimum of information from you, the developer, and does all the heavy lifting&#8211; even light lifting like database migrations&#8211; for you.</p>
<p>The next time you need to allow for file uploads in your Rails app, look no further than Paperclip.</p>
<h3><a href="http://github.com/mbleigh/acts-as-taggable-on">Acts_As_Taggable_On</a>, a Gem For Tagging</h3>
<p>Originally forked from Acts As Taggable On Steroids, the truncated form, has a number of improvements and goodies. Here is an excerpt from the Readme:</p>
<blockquote><p>This plugin was originally based on Acts as Taggable on Steroids by Jonathan Viney. It has evolved substantially since that point, but all credit goes to him for the initial tagging functionality that so many people have used.</p>
<p>For instance, in a social network, a user might have tags that are called skills, interests, sports, and more. There is no real way to differentiate between tags and so an implementation of this type is not possible with acts as taggable on steroids.</p>
<p>Enter Acts as Taggable On. Rather than tying functionality to a specific keyword (namely &#8220;tags&#8221;), acts as taggable on allows you to specify an arbitrary number of tag &#8220;contexts&#8221; that can be used locally or in combination in the same way steroids was used.</p></blockquote>
<p>Read more at <a href="http://github.com/mbleigh/acts-as-taggable-on">Github</a>.</p>
<h3><a href="http://ts.freelancing-gods.com/">Thinking Sphinx</a>, Front End to Sphinx Search Engine</h3>
<p><a href="http://ts.freelancing-gods.com/"><img class="alignnone size-medium wp-image-272" title="ts-logo" src="http://www.thetruetribe.com/wp-content/uploads/2010/01/ts-logo-300x64.gif" alt="" width="300" height="64" /></a></p>
<p>Thinking Sphinx is a great Ruby client to the Sphinx search engine that allows your Rails application to seamlessly integrate with Sphinx. This means you can get blazing-fast search results that are so fast because they&#8217;ve been optimized with filesystem-based indices, and even delta indices which only track changes to those indices, meaning they can avoid database calls when possible. Sounds fancy, huh? In practice, it&#8217;s a relatively painless set up that gets you professional quality search results. Sure, it can&#8217;t beat Google Mini, and feature for feature, heavy hitters like Java&#8217;s SOLR may win out, but for every project I&#8217;ve worked on, this has been sufficient. I like it a lot better than Ultrasphinx, the other Sphinx front end I&#8217;ve worked with.</p>
<p>All right, that&#8217;s all I have for now.  I&#8217;m sure I missed tons of great resources.</p>
<p>Please add your own favorite Ruby on Rails gems, plugins and resources in the comments!</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2010%2F01%2Fbest-of-2009-ruby-on-rails-edition%2F&amp;linkname=Best%20of%202009%2C%20Ruby%20on%20Rails%20Edition"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2010/01/best-of-2009-ruby-on-rails-edition/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Best Homepages of Top Interactive Agencies</title>
		<link>http://www.thetruetribe.com/2009/10/best-homepages-of-top-interactive-agencies/</link>
		<comments>http://www.thetruetribe.com/2009/10/best-homepages-of-top-interactive-agencies/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 04:06:04 +0000</pubDate>
		<dc:creator>grandecomplex</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=242</guid>
		<description><![CDATA[RPA*

Organic

Razorfish

Ogilvy &#38; Mather

akqa

pop

Tribal DDB

Publicis Modem

Sapient

Critical Mass*

LBi Icon Nicholson

Atmosphere BBDO

Nurun

Blast Radius

One to One Interactive

Genex

Arnold

dna

*Has Music
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rpa.com/">RPA</a>*</p>
<p><a href="http://www.rpa.com/"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/rpa.jpg" alt="rpa" width="560" height="301" /></a></p>
<p><a href="http://www.organic.com/" target="_blank">Organic</a></p>
<p><a href="http://www.organic.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/organic.jpg" alt="organic" width="560" height="301" /></a></p>
<p><a href="http://www.razorfish.com/" target="_blank">Razorfish</a></p>
<p><a href="http://www.razorfish.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/razorfish.jpg" alt="razorfish" width="560" height="301" /></a></p>
<p><a href="http://www.ogilvy.com/" target="_blank"><span id="more-242"></span>Ogilvy &amp; Mather</a></p>
<p><a href="http://www.ogilvy.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/ogilvy.jpg" alt="ogilvy and mather" width="560" height="301" /></a></p>
<p><a href="http://www.akqa.com/" target="_blank">akqa</a></p>
<p><a href="http://www.akqa.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/akqa.jpg" alt="akqa" width="560" height="301" /></a></p>
<p><a href="http://pop.us">pop</a></p>
<p><a href="http://pop.us" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/pop.jpg" alt="pop" width="560" height="301" /></a></p>
<p><a href="http://www.tribalddb.com/" target="_blank">Tribal DDB</a></p>
<p><a href="http://www.tribalddb.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/tribal-ddb.jpg" alt="tribal ddb" width="560" height="301" /></a></p>
<p><a href="http://www.publicismodem.com/" target="_blank">Publicis Modem</a></p>
<p><a href="http://www.publicismodem.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/publicis-modem.jpg" alt="publicis modem" width="560" height="301" /></a></p>
<p><a href="http://www.sapient.com/" target="_blank">Sapient</a></p>
<p><a href="http://www.sapient.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/sapient.jpg" alt="sapient" width="560" height="301" /></a></p>
<p><a href="http://www.criticalmass.com/" target="_blank">Critical Mass</a>*</p>
<p><a href="http://www.criticalmass.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/critical-mass.jpg" alt="critical mass" width="560" height="301" /></a></p>
<p><a href="http://www.lbiiconnicholson.com" target="_blank">LBi Icon Nicholson</a></p>
<p><a href="http://www.lbiiconnicholson.com" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/lbiiconnicholson.jpg" alt="lbiiconnicholson.com" width="560" height="301" /></a></p>
<p><a href="http://www.atmosphereddbo.com/">Atmosphere BBDO</a></p>
<p><a href="http://www.atmosphereddbo.com/"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/atmosphereddbo.jpg" alt="atmosphere ddbo" width="560" height="301" /></a></p>
<p><a href="http://www.nurun.com" target="_blank">Nurun</a></p>
<p><a href="http://www.nurun.com" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/nurun.jpg" alt="nurun" width="560" height="301" /></a></p>
<p><a href="http://www.blastradius.com" target="_blank">Blast Radius</a></p>
<p><a href="http://www.blastradius.com" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/blast-radius.jpg" alt="blast radius" width="560" height="301" /></a></p>
<p><a href="http://www.onetooneinteractive.com" target="_blank">One to One Interactive</a></p>
<p><a href="http://www.onetooneinteractive.com" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/one-to-one-interactive.jpg" alt="one to one interactive" width="560" height="301" /></a></p>
<p><a href="http://www.genex.com/" target="_blank">Genex</a></p>
<p><a href="http://www.genex.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/genex.jpg" alt="Genex" width="560" height="301" /></a></p>
<p><a href="http://www.arn.com/" target="_blank">Arnold</a></p>
<p><a href="http://www.arn.com/" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/arnold.jpg" alt="Arnold" width="560" height="301" /></a></p>
<p><a href="http://www.dnastudio.com" target="_blank">dna</a></p>
<p><a href="http://www.dnastudio.com" target="_blank"><img class="alignnone size-full wp-image-247" src="http://www.thetruetribe.com/wp-content/uploads/2009/10/dna.jpg" alt="dnastudio" width="560" height="301" /></a></p>
<p>*Has Music</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F10%2Fbest-homepages-of-top-interactive-agencies%2F&amp;linkname=Best%20Homepages%20of%20Top%20Interactive%20Agencies"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/10/best-homepages-of-top-interactive-agencies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript 1.8 forEach &#8211; supported in Safari, Firefox and beyond</title>
		<link>http://www.thetruetribe.com/2009/09/javascript-1-8-foreach-supported-in-safari-firefox-and-beyond/</link>
		<comments>http://www.thetruetribe.com/2009/09/javascript-1-8-foreach-supported-in-safari-firefox-and-beyond/#comments</comments>
		<pubDate>Tue, 22 Sep 2009 02:06:05 +0000</pubDate>
		<dc:creator>grandecomplex</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[webkit javascript1.8]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/2009/09/javascript-1-8-foreach-supported-in-safari-firefox-and-beyond/</guid>
		<description><![CDATA[If you don&#8217;t have to support IE, you can start taking advantage of JavaScript 1.8 features such as the forEach construct. It&#8217;s nicer than a conventional for loop when you are iterating over every item in an array.
console.log('The Beatles:');
['john','george','ringo','paul'].forEach(function(beatle, i) {
   console.log("name: " + beatle + "\n" + i);
});

// Result:
/*
 * The Beatles:
 [...]]]></description>
			<content:encoded><![CDATA[<p>If you don&#8217;t have to support IE, you can start taking advantage of JavaScript 1.8 features such as the <code>forEach</code> construct. It&#8217;s nicer than a conventional <code>for</code> loop when you are iterating over every item in an array.<span id="more-241"></span></p>
<pre class="js">console.log('The Beatles:');
['john','george','ringo','paul'].forEach(function(beatle, i) {
   console.log("name: " + beatle + "\n" + i);
});

// Result:
/*
 * The Beatles:
 * name: john 0
 * name: george 1
 * name: ringo 2
 * name: paul 3
*/</pre>
<p>This is a great technique when creating iPhone web apps. Since the iPhone sports a modern Webkit browser, we can use <code>forEach.</code></p>
<p>Compare the traditional <code>for</code> with <code>forEach:</code></p>
<pre>// Oldschool way using for
var beatles = ['john','george','ringo','paul'];
for (var i = 0, l = beatles.length; i &lt; l; i++) {
    console.log("name: " + beatles[i] + "\n" + i);
}

// Newschool JavaScript 1.8 forEach
['john','george','ringo','paul'].forEach(function(beatle, i) {
    console.log("name: " + beatle + "\n" + i);
});</pre>
<p>They are functionally the same, but as you can see, the newschool way is much cleaner.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F09%2Fjavascript-1-8-foreach-supported-in-safari-firefox-and-beyond%2F&amp;linkname=Javascript%201.8%20forEach%20%26%238211%3B%20supported%20in%20Safari%2C%20Firefox%20and%20beyond"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/09/javascript-1-8-foreach-supported-in-safari-firefox-and-beyond/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Random Integer Javascript snippet</title>
		<link>http://www.thetruetribe.com/2009/09/random-integer-javascript-snippet/</link>
		<comments>http://www.thetruetribe.com/2009/09/random-integer-javascript-snippet/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 00:31:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=236</guid>
		<description><![CDATA[returns a random number between two digits passed in as arguments.

function randomInteger(low, high)
{
    return low + Math.floor(Math.random() * (high - low));
}

]]></description>
			<content:encoded><![CDATA[<p>returns a random number between two digits passed in as arguments.</p>
<pre class="js" name="code">
function randomInteger(low, high)
{
    return low + Math.floor(Math.random() * (high - low));
}
</pre>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F09%2Frandom-integer-javascript-snippet%2F&amp;linkname=Random%20Integer%20Javascript%20snippet"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/09/random-integer-javascript-snippet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scrolling to an element when outside of the viewport with prototypejs</title>
		<link>http://www.thetruetribe.com/2009/08/scrolling-to-an-element-when-outside-of-the-viewport-with-prototypejs/</link>
		<comments>http://www.thetruetribe.com/2009/08/scrolling-to-an-element-when-outside-of-the-viewport-with-prototypejs/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 23:17:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Prototype]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=234</guid>
		<description><![CDATA[Often times you&#8217;ll have be playing, say, videos with a list of videos down the page. If the list gets too long the video player becomes out of sight as the user scrolls down. This can be a big confuser to users: they click on a link to see a video and they don&#8217;t see [...]]]></description>
			<content:encoded><![CDATA[<p>Often times you&#8217;ll have be playing, say, videos with a list of videos down the page. If the list gets too long the video player becomes out of sight as the user scrolls down. This can be a big confuser to users: they click on a link to see a video and they don&#8217;t see anything happen because the video player is out of sight. Here&#8217;s what you can do: scroll to the video player if it is out of sight like so:</p>
<pre class="js" name="code">
if ($("videoplayer").viewportOffset()[1] < 0) {
 Effect.ScrollTo('videoplayer', {duration: 0.2});
}
</pre>
<p>Requires both prototype and effects.js in scriptaculous.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F08%2Fscrolling-to-an-element-when-outside-of-the-viewport-with-prototypejs%2F&amp;linkname=Scrolling%20to%20an%20element%20when%20outside%20of%20the%20viewport%20with%20prototypejs"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/08/scrolling-to-an-element-when-outside-of-the-viewport-with-prototypejs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grab last item in XSLT for-each</title>
		<link>http://www.thetruetribe.com/2009/08/grab-last-item-in-xslt-for-each/</link>
		<comments>http://www.thetruetribe.com/2009/08/grab-last-item-in-xslt-for-each/#comments</comments>
		<pubDate>Fri, 28 Aug 2009 22:08:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/?p=228</guid>
		<description><![CDATA[This is simple and fun!
Here&#8217;s an example of doing something in all instances EXCEPT the last one. Reversing this is obvious:

 


  

 

Often times you want a horizontal rule in all instances except the last item. You can also use this method for adding a class name to the last item:


 
  [...]]]></description>
			<content:encoded><![CDATA[<p>This is simple and fun!</p>
<p>Here&#8217;s an example of doing something in all instances EXCEPT the last one. Reversing this is obvious:</p>
<pre name="code" class="xml">
 <xsl:if test="not(position() = last())">
<div class="hr">
<hr />
  </div>

 </xsl:if>
</pre>
<p>Often times you want a horizontal rule in all instances except the last item. You can also use this method for adding a class name to the last item:</p>
<pre name="code" class="xml">
<li>
 <xsl:if test="position()=last()">
  <xsl:attribute name="class">last</xsl:attribute>
 </xsl:if>
</li>
</pre>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F08%2Fgrab-last-item-in-xslt-for-each%2F&amp;linkname=Grab%20last%20item%20in%20XSLT%20for-each"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/08/grab-last-item-in-xslt-for-each/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Best Way to Get Gmail in Ruby on Rails</title>
		<link>http://www.thetruetribe.com/2009/08/best-way-to-get-gmail-in-ruby-on-rails/</link>
		<comments>http://www.thetruetribe.com/2009/08/best-way-to-get-gmail-in-ruby-on-rails/#comments</comments>
		<pubDate>Fri, 14 Aug 2009 07:27:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[gmail]]></category>

		<guid isPermaLink="false">http://www.thetruetribe.com/2009/08/best-way-to-get-gmail-in-ruby-on-rails/</guid>
		<description><![CDATA[Gmail is not as easy as sendmail, unless you have this tutorial. This gem/tutorial is by far the best solution.
action_mailer_tls
There are a lot of solutions out there so it can be hard to know which to choose. I have tried many and found this to be dead simple. Takes 5 minutes to setup. 
]]></description>
			<content:encoded><![CDATA[<p>Gmail is not as easy as sendmail, unless you have this tutorial. This gem/tutorial is by far the best solution.</p>
<p><a href="http://github.com/openrain/action_mailer_tls/tree/master">action_mailer_tls</a></p>
<p>There are a lot of solutions out there so it can be hard to know which to choose. I have tried many and found this to be dead simple. Takes 5 minutes to setup. </p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.thetruetribe.com%2F2009%2F08%2Fbest-way-to-get-gmail-in-ruby-on-rails%2F&amp;linkname=Best%20Way%20to%20Get%20Gmail%20in%20Ruby%20on%20Rails"><img src="http://www.thetruetribe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.thetruetribe.com/2009/08/best-way-to-get-gmail-in-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
