<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns: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/" xmlns:series="http://unfoldingneurons.com/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Nettuts+</title>
	
	<link>http://net.tutsplus.com</link>
	<description>Web Development &amp; Design Tutorials</description>
	<lastBuildDate>Sat, 11 Feb 2012 16:48:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/nettuts" /><feedburner:info uri="nettuts" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://nettuts.com</link><url>http://envato.s3.amazonaws.com/rss_images/nettuts.jpg</url><title>NETTUTS</title></image><feedburner:emailServiceId>nettuts</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Do You Exclusively Use webkit Prefixes?</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/0wbt6W3XcrU/</link>
		<comments>http://net.tutsplus.com/articles/editorials/do-you-exclusively-use-webkit-prefixes/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 16:55:00 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Editorials]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[prefixes]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24004</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24004&amp;c=13367409' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24004&amp;c=13367409' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;You&amp;#8217;ve undoubtedly read about the vendor prefix &lt;em&gt;web development drama of the week&lt;/em&gt;. If not, the &lt;a href="http://lists.w3.org/Archives/Public/www-style/2012Feb/0313.html"&gt;W3C mailing lists&lt;/a&gt; have been on fire ever since it was discussed (and essentially announced) that Microsoft, Opera, and Firefox will begin to &lt;em&gt;adopt&lt;/em&gt; and style webkit-prefixed properties. One of the reasons behind this decision is that we developers aren&amp;#8217;t being responsible when coding our stylesheets; we&amp;#8217;re applying too many webkit-specific properties, without considering other browsers. &lt;/p&gt;
&lt;p&gt;Upon hearing this, I was left thinking to myself: is this really true? &lt;/p&gt;
&lt;p&gt;&lt;span id="more-24004"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Huh? What&amp;#8217;s Going On? &lt;/h2&gt;
&lt;p&gt;To catch up on the hot drama, gives the following articles a read: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://remysharp.com/2012/02/09/vendor-prefixes-about-to-go-south/"&gt;Vendor Prefixes About to Go South&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://christianheilmann.com/2012/02/09/now-vendor-prefixes-have-become-a-problem-want-to-help-fix-it/"&gt;Now Vendor Prefixes Have Become a Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.brucelawson.co.uk/2012/on-the-vendor-prefixes-problem/"&gt;The Vendor Prefixes Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.webstandards.org/2012/02/09/call-for-action-on-vendor-prefixes/"&gt;Call For Action On Vendor Prefixes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;The basic gist is that non-webkit vendors are planning to recognize and style the &lt;code&gt;-webkit&lt;/code&gt; prefix on a number of CSS3 properties. This is partially due to the fact, they say, that too many developers have been lazy, relying too much on Webkit, and not updating older projects (especially so for mobile designs). As these competing browsers see it, they have no choice; their hands are being forced. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;#8217;s one thing to toy around with non-standard, Webkit-specific  properties for fun (such as &lt;code&gt;-webkit-text-stroke&lt;/code&gt;); we&amp;#8217;ve even posted similar articles on Nettuts+. However, it&amp;#8217;s another thing entirely if developers are, for example, exclusively using Webkit&amp;#8217;s prefix when applying CSS gradients or transitions. &lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; Prefixing Services &lt;/h2&gt;
&lt;p&gt;An often-touted &lt;em&gt;excuse&lt;/em&gt; for not properly prefixing all CSS3 properties is that it can be considerably difficult to keep track of which prefixes are necessary for any given property. This is certainly true, but has our community not provided a variety of solutions? &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://caniuse.com"&gt;Can I Use&lt;/a&gt;&lt;/h3&gt;
&lt;div class=tutorial_image&gt;
&lt;a href="http://caniuse.com"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1134_prefixes/caniuse.jpg" alt="CanIUse"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;To begin with the manual, look-up route, CanIUse.com is a fantastic reference when we need to determine if a particular browser supports a CSS3 property. If it is supported, but requires a prefix, CanIUse will tell you. &lt;/p&gt;
&lt;p&gt;It&amp;#8217;s an essential bookmark for all web developers (and is not limited to only CSS).&lt;/p&gt;
&lt;h3&gt;&lt;a href="http://compass-style.org"&gt;Compass&lt;/a&gt;&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;
&lt;a href="http://compass-style.org"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1134_prefixes/compass.jpg" alt="Compass"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Compass is a framework for &lt;a href="http://sass-lang.com"&gt;Sass&lt;/a&gt; that, among other things, will automatically handle the process of prefixing your CSS3 properties. For instance, to apply cross-browser, sanity-saving &lt;code&gt;box-sizing&lt;/code&gt; to a website, with CSS, we&amp;#8217;d write: &lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate"&gt;
* {
   -webkit-box-sizing: border-box;
   -moz-box-sizing: border-box;
   -ms-box-sizing: border-box;
   box-sizing: border-box;
}
&lt;/pre&gt;
&lt;p&gt;However, when using Compass, we can simply include a mixin, like so:&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate"&gt;
* {
  @include box-sizing(border-box);
}
&lt;/pre&gt;
&lt;p&gt;This way, designers never need to concern themselves with whether or not a particular browser provides a prefixed version of a new property; Compass does it for you. &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://prefixr.com"&gt;Nettuts+ Prefixr&lt;/a&gt;&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;
&lt;a href="http://prefixr.com"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1134_prefixes/prefixr.jpg" alt="Nettuts+ Prefixr"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;At Nettuts+, we&amp;#8217;ve, also, provided an easy way to &amp;#8220;auto-prefix.&amp;#8221; Either use the &lt;a href="http://prefixr.com"&gt;website&lt;/a&gt; or its &lt;a href="http://www.prefixr.com/api/usage/"&gt;API in your favorite code editor&lt;/a&gt; to automatically filter through your stylesheet, and update any CSS3 properties that are missing a prefixed version. This can even be integrated into your build script, so that you only ever code using the official syntax. &lt;/p&gt;
&lt;p&gt;The difference between Prefixr and Compass is that the former doesn&amp;#8217;t require a preprocessor, if you prefer to code all CSS by hand. Simply feed Prefixr a stylesheet, and it&amp;#8217;ll do the rest. &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://leaverou.github.com/prefixfree/"&gt;Prefix-Free&lt;/a&gt;&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;
&lt;a href="http://leaverou.github.com/prefixfree/"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1134_prefixes/prefixFree.jpg" alt="Prefix-Free"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Lea Verou&amp;#8217;s &lt;a href="http://leaverou.github.com/prefixfree/"&gt;Prefix-Free&lt;/a&gt; is a neat solution as well. It&amp;#8217;s unique in that it&amp;#8217;s a JavaScript-based solution that dynamically determines which browser is being used, and then assigns the necessary prefixes to the stylesheet. Simply import Prefix-free, use the official syntax for the new CSS3 properties, and it&amp;#8217;ll take care of the rest. &lt;/p&gt;
&lt;p&gt;While some may view the fact that it depends on JavaScript to function as a disadvantage, a considerable bonus to this method is that your stylesheets become both smaller and more maintainable. For development purposes, it&amp;#8217;s a great choice; however, for production, you might consider using a different tool, as there can be considerable performance consequences. &lt;/p&gt;
&lt;h3&gt;&lt;a href="http://css3please.com"&gt;CSS3 Please&lt;/a&gt;&lt;/h3&gt;
&lt;div class=tutorial_image&gt;
&lt;a href="http://css3please.com"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1134_prefixes/css3please.jpg" alt="CSS3 Please"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;CSS3Please is a nifty service that provides copy-and-paste, cross-browser CSS. Adjust the values according to your needs, and you instantly have a snippet that will correctly target all applicable browsers. &lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Are You Not Using These?&lt;/h2&gt;
&lt;p&gt;If you&amp;#8217;re a preprocessor user who prefers to create his or her own CSS3 mixins, then fantastic; however, otherwise, are some of you not using these services? If so, why not?  It&amp;#8217;s understandable that Firefox and Microsoft may feel forced into supporting the webkit prefix for some properties, despite their better judgment. Particularly for older and smaller projects, we&amp;#8217;re not always great about updating the stylesheets as needed. This is precisely why prefixed properties have hung around for so long, despite the fact that properties like &lt;code&gt;border-radius&lt;/code&gt; have long since been supported, unprefixed. Webkit doesn&amp;#8217;t want to &amp;#8220;break&amp;#8221; these websites. &lt;/p&gt;
&lt;p&gt;So what&amp;#8217;s the deal? Are we not being responsible? &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Christian Heilmann has launched a project, called &lt;a href="http://codepo8.github.com/prefix-the-web/"&gt;Prefix the Web&lt;/a&gt;; it encourages developers to update GitHub projects to include all necessary browser prefixes. Unfortunately, the initiative may be too late. What do you think?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/bOuSeddD2TLa8_lLsQeH4EtDRPQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bOuSeddD2TLa8_lLsQeH4EtDRPQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/bOuSeddD2TLa8_lLsQeH4EtDRPQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/bOuSeddD2TLa8_lLsQeH4EtDRPQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=0wbt6W3XcrU:BQuEXozA9N4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=0wbt6W3XcrU:BQuEXozA9N4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=0wbt6W3XcrU:BQuEXozA9N4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=0wbt6W3XcrU:BQuEXozA9N4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=0wbt6W3XcrU:BQuEXozA9N4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=0wbt6W3XcrU:BQuEXozA9N4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=0wbt6W3XcrU:BQuEXozA9N4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=0wbt6W3XcrU:BQuEXozA9N4:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/0wbt6W3XcrU" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/editorials/do-you-exclusively-use-webkit-prefixes/feed/</wfw:commentRss>
		<slash:comments>59</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/editorials/do-you-exclusively-use-webkit-prefixes/</feedburner:origLink></item>
		<item>
		<title>Using JavaScript’s Prototype with MVC</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/KSnbeZH73W0/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/using-javascripts-prototype-with-mvc/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 20:01:41 +0000</pubDate>
		<dc:creator>James Baker</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23977</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23977&amp;c=474675608' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23977&amp;c=474675608' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;In this article, we will review the process of using JavaScript, from an MVC-based perspective, to manipulate the DOM.  More specifically, we&amp;#8217;ll engineer our JavaScript objects, their properties and methods, and their instantiations parallel to the intended behavior of our Views (what the user sees).&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23977"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Consider Your Views As Objects, Not As Pages&lt;/h2&gt;
&lt;p&gt;At any point in the development of a web page, we are using a language that naturally promotes either class-based development or object-based development. In strongly-typed languages like Java and C#, we are usually writing our views in classes &amp;#8211; giving them state, scope, and context.  When we are working with languages like PHP or newer view engines, like Razor for ASP.NET, our views may simply be markup (HTML/CSS) mixed with templating.  However, this does not mean we have to change our perception on how the view behaves as its own stateful entity.&lt;/p&gt;
&lt;p&gt;Within Views, we are primarily working with HTML, which consists of nested elements; these elements have attributes which describe what their semantic purpose is or how they appear when rendered.  These elements then have children or parent elements that inherit/provide cascading (through CSS) and block/inline behaviors.  These elements can naturally be viewed from an OOP (Object-Oriented Programming) perspective. Consider, for example, the following markup:&lt;/p&gt;
&lt;pre class="brush: css; title: ; notranslate"&gt;
		div.container {
			border: 1px solid #333;
			padding: 5px;
			color: red;
		}
		&lt;/pre&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
			&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
				&amp;lt;h2&amp;gt;About Our Company&amp;lt;/h2&amp;gt;
			&amp;lt;/div&amp;gt;
		&lt;/pre&gt;
&lt;h3&gt;Result :&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;
			&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1132_mvc/layout-img/header-color.png" alt="Our header inherited a red border through CSS cascading" title="Our header inherited a red border through CSS cascading" /&gt;
		&lt;/div&gt;
&lt;p&gt;As you can see above, the header inherited its font color property from its parent container though the CSS behavior of cascading.  This behavior is quite similar to the concept of inheritance in OOP. We can also see that the header is a child of the container, inheriting certain properties, based on the behavior of the element.  When we see our elements from this perspective, we have a better definition of what we intend to do with our view elements and can encapsulate styles and functionality better.&lt;/p&gt;
&lt;p&gt;Inside a view, we will have markup. However, this markup may have nested partial views like sidebars, a header, a footer, a right (or left) rail, and one or more content sections. All of these partial views should be viewed as their own entity, capable of having their own state, context, and scope.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;When you conceive your views and partial views as objects, it makes writing your client-side code much easier.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Translating This Concept Into Your Styles and Scripts&lt;/h2&gt;
&lt;p&gt;Many developers tend to write JavaScript from a procedural or functional point of view, and often neglect to consider the natural tendencies offered in view-based development approaches and parallel instantiation (creating a new instance of the view as we create a new instance of a JavaScript object corresponding to that view) when working in MVC Frameworks.  It&amp;#8217;s often the case that I run into JavaScript files that are just one method after another.  Though this behavior works, and is common, it is not very efficient for code maintenance, debugging, or extension of current or future code when you are working extensively with views.&lt;/p&gt;
&lt;p&gt;To get away from this habit and begin writing better behavioral code, when you begin to lay out your View&amp;#8217;s scripting and styles, follow these general rules:&lt;/p&gt;
&lt;h3&gt;Golden Rules of View-based JavaScript Development&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Every view that is rendered from an action on a controller should have its own JavaScript object.&lt;/li&gt;
&lt;li&gt;Every Partial View that is loaded inside a View should have its own JavaScript object.&lt;/li&gt;
&lt;li&gt;Name your objects the same as your views (or partial views).  This will make more sense for you and everyone else that touches your code.&lt;/li&gt;
&lt;li&gt;Use Pascal case for all objects (i.e. About, Sidebar, etc.).  Your views should already, so why not do the same for your JavaScript objects?&lt;/li&gt;
&lt;li&gt;All constants of these objects should be stored in the constructor.  This means if your view has properties that will be used in multiple methods, these methods can all access these properties.&lt;/li&gt;
&lt;li&gt;All methods that will be called on a view (or partial view) should be bound to the prototype of the object that corresponds to that view.&lt;/li&gt;
&lt;li&gt;All event bindings for the view (or partial view) should be contained within their own event binding&amp;#8217;s method, which is placed on the prototype.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider the following diagram:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;
			&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1132_mvc/layout-img/file-layout.png" alt="Our MVC Layout viewed with styles and scripts" title="Our MVC Layout viewed with styles and scripts" /&gt;
		&lt;/div&gt;
&lt;p&gt;I generally create view-specific scripts and styles and then grab what I need from the main stylesheets and script libraries I&amp;#8217;ve created that would be used on many views.  This also reduces the amount of code that is used.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Creating View-based Objects&lt;/h2&gt;
&lt;p&gt;In this article, we will be laying out the structure for the About Us page on an MVC-based site.  To start, we will create the structure as shown above in the previous diagram.  From there, we will create an About object, and begin adding methods to the prototype.  First, consider the following visual layout:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;
			&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1132_mvc/layout-img/page-layout.png" alt="Sample About Us Page Layout" title="Sample About Us Page Layout" /&gt;
		&lt;/div&gt;
&lt;p&gt;This is a very logical and commonly used layout for a webpage.  We can segment our page into seperate visual objects.  For each of these views, we can create a logical object that will correspond to it.  I generally omit the repetitive information in the filename or classname that is used by MVC to determine the URI from the route and instead stick with something that is easy to keep consistent.&lt;/p&gt;
&lt;p&gt;For page views, I generally call my JavaScript objects by the name of the view.  Here is an example of my AboutView Object:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
		// View Filename: AboutView.cs (.NET MVC 1.0), About.cshtml (.NET MVC 3.0), or AboutView.php (PHP)

		var About = function(pageTitle) {
			this.pageTitle = pageTitle;
			// binding events as soon as the object is instantiated
			this.bindEvents();
		};
		&lt;/pre&gt;
&lt;p&gt;In the above example, we created a JavaScript object in the function format, giving it the capacity to serve as an Object constructor for all methods called for the about view.  By choosing this format, we can instantiate a new instance of &lt;em&gt;this&lt;/em&gt;, just as we do with our view Server-Side (by saying &lt;code&gt;new AboutView();&lt;/code&gt;).  From here, we can assign properties and methods to this object.  In order to assign methods to this object, we will need access to the object&amp;#8217;s prototype.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;JavaScript&amp;#8217;s Prototype is your Friend&lt;/h2&gt;
&lt;blockquote class=pullquote&gt;
&lt;p&gt;Developers are often thwarted by the elusiveness (and ambiguity) of JavaScript&amp;#8217;s Object Prototype.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Developers are often thwarted by the elusiveness (and ambiguity) of JavaScript&amp;#8217;s Object Prototype.  For many, it can be confusing to use and understand and adds another dimension to coding.  As JavaScript becomes more event-driven with HTML5, AJAX, and web 2.0 concepts, JavaScript tends to lean naturally to procedural development that is easy to develop but hard to maintain, scale, and replicate.&lt;/p&gt;
&lt;p&gt;Think of the word &lt;em&gt;Prototype&lt;/em&gt; as a misnomer for now.  When I think &lt;em&gt;Prototype&lt;/em&gt;, I think of a &amp;#8220;rough draft&amp;#8221; or a base for inheritance, but this isn&amp;#8217;t exactly the case. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8221; In reality, the better perspective for Prototype would be the Object&amp;#8217;s Pointer in memory.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; When we create an object, we then instantiate a new instance of it.  When we do that, we create a place in memory that the object can be referenced (remember, Objects in JavaScript are &lt;em&gt;reference types&lt;/em&gt;, not primitive types; creating another variable equal to that object and then changing its values will actually change the original object in the pointer).  When we create an object, instantiate a new instance of it, and then modify its &amp;#8220;Pointer,&amp;#8221; or &lt;em&gt;Prototype&lt;/em&gt;, we add fields and methods to that object in memory directly (obviously we want to add all of these things before instantiation).&lt;/p&gt;
&lt;p&gt;		Here&amp;#8217;s an example of creating methods on the &lt;code&gt;About&lt;/code&gt; object&amp;#8217;s prototype:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
		var About = function(pageTitle) {
			this.pageTitle = pageTitle;
			// binding events as soon as the object is instantiated
			this.bindEvents();
		};

		var About.prototype.bindEvents = function() {
			 // Current context: 'this' is the About object
			 // Place all your event bindings in one place and call them out
			 // in their own methods as needed.
			 $('ul.menu').on('click', 'li.search', $.proxy(this.toggleSearch, this));
		};

		var About.prototype.toggleSearch = function(e) {
			  //Toggle the search feature on the page
		};
		&lt;/pre&gt;
&lt;p&gt;As you can see above, we have contained the properties of the About object within the constructor, have created a single point of reference for binding events (in this case we are using jQuery to create the event bindings, but you can use any framework or JavaScript itself), and have placed the toggleSearch method on the prototype of the About object to contain that method to that object. We have also called the &lt;code&gt;bindEvents()&lt;/code&gt; method in the object so that it is called on instantiation.&lt;/p&gt;
&lt;p&gt;Now, consider the following code for the Sidebar Partial View:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
		var pSidebar = function(pageTitle) {
			this.pageTitle = pageTitle;

			// call the bindEvents method on instantiation of the pSidebar object.
			// this will bind the events to the object
			this.bindEvents();
		};

		var pSidebar.prototype.bindEvents = function() {
			 //current context: 'this' is the Sidebar object
			 $('ul.menu').on('click', 'li.has-submenu', $.proxy(this.toggleSubMenu, this));
			 $('input#search').on('click', $.proxy(this.openSearch, this));
		};

		var pSidebar.prototype.toggleSubMenu = function(e) {
			// toggle the submenus
			// current context:  'this' is the pSidebar obj
		};
		&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;NOTE: &lt;/strong&gt; I called the object &lt;code&gt;pSidebar&lt;/code&gt; because this is a &lt;em&gt;partial view&lt;/em&gt;, not a full view.  This is my preference to distinguish between the two, but makes things clearer.&lt;/p&gt;
&lt;p&gt;The beauty of using this approach is &amp;#8211; we can use the same method names we used in the About object and we will have no conflicts.  This is because these methods are bound to the object&amp;#8217;s &lt;em&gt;prototype&lt;/em&gt; itself, not the global namespace.  This simplifies our code and allows for a sort of &amp;#8220;templating&amp;#8221; for future scripting.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Instantiate Only as Needed&lt;/h2&gt;
&lt;p&gt;Once you have created your objects, calling them is simple.  No longer do you need to depend on your framework to fire events when your document is loaded or ready.  Now, you can simply instantiate your object and its events will be bound and executed as needed.  So, let&amp;#8217;s instantiate our &lt;code&gt;About&lt;/code&gt; object:&lt;/p&gt;
&lt;p&gt;Inside your view where you would call your view specific scripts (dependent upon your templating language), simply call a new instance of your object and include the file as follows:&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
		&amp;lt;script src=&amp;quot;/path/to/scripts/views/about.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script&amp;gt;
			new About(&amp;quot;About Us&amp;quot;);
		&amp;lt;/script&amp;gt;
		&lt;/pre&gt;
&lt;p&gt;As you can see, I passed in the page title for the view (which can be any argument for any need &amp;#8211; even &lt;strong&gt;Model Data&lt;/strong&gt;.  This gives you excellent context over your model data and allows you to manipulate that data in JavaScript very easily.&lt;/p&gt;
&lt;p&gt;Just like your &lt;code&gt;About&lt;/code&gt; Object, calling your partial views is just as easy.  I would highly recommend calling new instances of your partial view JavaScript objects within the object&amp;#8217;s constructor &amp;#8211; this ensures that you are only calling these as needed and that they are collectively in one place.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
		var About = function(pageTitle) {
			this.pageTitle = pageTitle;

			//assigning a new instance of the Sidebar Partial View to be referenced later
			this.sidebar = new pSidebar(pageTitle);

			//NOTE:  If you don't need to reference a partial view after the fact,
			//you can simply instantiate an instance of it without assigning it within the object's constructor, as so:
			new pSidebar(pageTitle);

			//doing the same for the Partial Footer View
			this.footer = new pFooter();

			// binding events as soon as the object is instantiated
			this.bindEvents();
		};
		&lt;/pre&gt;
&lt;p&gt;As you can see, by referencing the Sidebar object as a local property of the About object, we now bind that instance, which is a very natural behavior &amp;#8211; this instance is now the About Page&amp;#8217;s Sidebar.&lt;/p&gt;
&lt;p&gt;If you don&amp;#8217;t need to reference a partial view after the fact, you can simply instantiate an instance of it without assigning it within the object&amp;#8217;s constructor, as so:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
		var About = function(pageTitle) {
			this.pageTitle = pageTitle;

			new pSidebar(pageTitle);

			// binding events as soon as the object is instantiated
			this.bindEvents();
		};
		&lt;/pre&gt;
&lt;p&gt;From here, all we need to do is add another script to our scripts called in our view:&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
		&amp;lt;script src=&amp;quot;/path/to/scripts/views/about.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script src=&amp;quot;/path/to/scripts/partials/sidebar.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
		&amp;lt;script&amp;gt;
			new About(&amp;quot;About Us&amp;quot;);
		&amp;lt;/script&amp;gt;
		&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Why This Technique is Beneficial&lt;/h2&gt;
&lt;p&gt;Once this structure is in place, we can then tailor our JavaScript object to match our view and apply the needed methods to that object to maintain scope.  By creating a view-parallel object and working off that object&amp;#8217;s prototype, we see the following benefits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The nomenclature makes it easier to navigate through code&lt;/li&gt;
&lt;li&gt;We naturally namespace our objects, reducing the need for long method names and too much use of anonymous closure.&lt;/li&gt;
&lt;li&gt;Little to no conflict in other code because our methods are on the prototype of the object, not on the global level&lt;/li&gt;
&lt;li&gt;When instantiating our partial views within our View&amp;#8217;s object constructor and assigning them to a local variable reference, we effectively create a locally bound copy of that Partial View&amp;#8217;s object.&lt;/li&gt;
&lt;li&gt;We have a firm definition of context and are able to use the keyword &amp;#8216;this&amp;#8217; without worry.&lt;/li&gt;
&lt;li&gt;Debugging becomes clear because all methods shown in the stack are bound in one place.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As the MVC Design Pattern continues to become more popular in the design world, the development of JavaScript Objects to accompany DOM Element manipulation will change to be more tailored towards view-specific and event-specific manipulation.  By tailoring our JavaScript objects to instantiate in parallel with our Views, we can have a hand-in-hand stateful relationship between the two &amp;#8211; one that is symantically in good taste, easy to step through, simple to maintain, and perfect for expansion as the view grows or changes, creating a permeable and expandable relationship between markup and scripting.&lt;/p&gt;
&lt;p&gt;By utilizing an Object&amp;#8217;s Prototype, we are able to maintain a precise context on our View&amp;#8217;s scripting object and expand that object with a repetitive development frame-of-mind.  We can then replicate this format through our partial views, saving us time, brain power, and risk of bugs and unexpected behavior.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/h34WxNKmHjiZHx0AMKq20d3TVA8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h34WxNKmHjiZHx0AMKq20d3TVA8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/h34WxNKmHjiZHx0AMKq20d3TVA8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/h34WxNKmHjiZHx0AMKq20d3TVA8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=KSnbeZH73W0:gIatSVZnhJo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=KSnbeZH73W0:gIatSVZnhJo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=KSnbeZH73W0:gIatSVZnhJo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=KSnbeZH73W0:gIatSVZnhJo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=KSnbeZH73W0:gIatSVZnhJo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=KSnbeZH73W0:gIatSVZnhJo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=KSnbeZH73W0:gIatSVZnhJo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=KSnbeZH73W0:gIatSVZnhJo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/KSnbeZH73W0" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/using-javascripts-prototype-with-mvc/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/using-javascripts-prototype-with-mvc/</feedburner:origLink></item>
		<item>
		<title>Easy Script Loading with yepnope.js</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/hmxTJlCB4nE/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/easy-script-loading-with-yepnope-js/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 14:00:34 +0000</pubDate>
		<dc:creator>Nikola Malich</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[script loader]]></category>
		<category><![CDATA[yepnope]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=19002</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=19002&amp;c=329530308' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=19002&amp;c=329530308' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Officially released by &lt;a href="http://alexsexton.com/"&gt;Alex Sexton&lt;/a&gt; and &lt;a href="http://twitter.com/ralphholzmann"&gt;Ralph Holzmann&lt;/a&gt; in late February of 2011, the &lt;a href="http://yepnopejs.com/"&gt;yepnope.js&lt;/a&gt; resource loader features asynchronous, conditional loading and preloading of both JavaScript and CSS resources. This makes managing dependant, conditional code a breeze.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-19002"&gt;&lt;/span&gt;&lt;/p&gt;
March of 2011
&lt;p&gt;This nifty resource loader, which is only 1.6KB minified and gzipped, is now bundled with Modernizer and is great for loading polyfills, preloading or &amp;#8220;priming&amp;#8221; the users cache, or as a simple asynchronous resources loader / filter! &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt; For those of you unfamiliar with polyfills, they are essentially plugins, or shims, that enable the use of new or future technologies in older browsers, e.g. web sql databases, CSS3 transformations etc.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yepnope now also supports a number of prefixes and filters, which, when prepended to the resource url, add another layer of fine tuning or customization to its core functionality.  As if this weren&amp;#8217;t already great, yepnope also provides you with a mechanism to define your own prefixes and filters.  Let&amp;#8217;s have a look at what yepnope.js can do!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Background &amp;#8211; &lt;/span&gt; Asynchronous Script Loading&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;
    &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/944_yepnope/yepnope-big.jpg" alt="YepNope" /&gt;
&lt;/div&gt;
&lt;p&gt;Before we delve into yepnope and its features, it&amp;#8217;s important to understand a bit about how asynchronous script loading works, why it&amp;#8217;s useful and how it&amp;#8217;s different from vanilla script loading.&lt;/p&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;Asynchronous loaders remove the inherent blocking nature of a script. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Typically, JavaScript files loaded with the &lt;code&gt;&amp;lt;script&gt;&lt;/code&gt; tag, block the download of resources as well as the rendering of elements within the web page.  So, even though most modern browsers tend to support the parallel download of JavaScript files, image downloads and page rendering still have to wait for the scripts to finish loading.  In turn, the amount of time a user has to wait for the page to display increases.&lt;/p&gt;
&lt;p&gt;This is where asynchronous loaders come in to play.  Using one of several different load techniques, they remove the inherient blocking nature of a script, which allows for parallel downloading of both the JavaScripts and resources while not interfering with page rendering.  In many cases, this can reduce &amp;#8211; sometimes drastically &amp;#8211; page load times.&lt;/p&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;Most loaders preserve the order in which scripts are executed while providing a callback for when the script is loaded and ready.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Asynchronous loading doesn&amp;#8217;t come without its caveats, though.  When scripts are loaded the traditional way, inline code is not parsed or executed until the external scripts are fully loaded, sequentially.  This is not the case with asynchronous loading.  In fact, inline scripts will usually parse / execute &lt;strong&gt;while&lt;/strong&gt; the scripts are still being downloaded.  In like manner, the browser is also downloading resources and rendering the page as the scripts are being loaded.  Thus, we can arrive at situations where inline code, which is perhaps dependant on a script / library being loaded, is executed before its dependency is ready or before / after the DOM itself is ready. As such, most loaders preserve the order in which scripts are executed while providing a callback for when the script is loaded and ready.  This allows us to run any dependant inline code as a callback, perhaps, within a DOM ready wrapper, where applicable.&lt;/p&gt;
&lt;p&gt;Also, when dealing with a small or well optimized page, the DOM can actually be ready or even loaded before the scripts themselves have finished loading!  So, if the page in question isn&amp;#8217;t progressively enhanced, in that it relies heavily on JavaScript for styling, there may be a FOUC or flash of unstyled content.  Similarly, users may even experience a brief FUBC or flash of unbehaviored content.  It&amp;#8217;s important to keep these things in mind whenever you use a script / resource loader.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 1 &amp;#8211; &lt;/span&gt; The &lt;code&gt;yepnope&lt;/code&gt; Test Object&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;yepnope&lt;/code&gt; test object has seven basic properties, any of which are optional.  This object includes the actual test, resources which will be loaded as a result of the test, resources which will be loaded regardless of the test as well as callbacks.  Here&amp;#8217;s a look at the yepnope test object&amp;#8217;s props:&lt;/p&gt;
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;
&lt;h5&gt;test:&lt;/h5&gt;
&lt;p&gt;A boolean representing the condition we want to test.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;yep:&lt;/h5&gt;
&lt;p&gt;A string or an array / object of strings representing the url&amp;#8217;s of resources to load if the test is &lt;em&gt;truthy&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;nope:&lt;/h5&gt;
&lt;p&gt;A string or an array / object of strings representing the url&amp;#8217;s of resources to load if the test is &lt;em&gt;falsey&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;load:&lt;/h5&gt;
&lt;p&gt;A string or an array / object of strings representing the url&amp;#8217;s of resources to load regardless of the test result.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;both:&lt;/h5&gt;
&lt;p&gt;A string or an array / object of strings representing the url&amp;#8217;s of resources to load regardless of the test result.  This is, basically, syntactic sugar as its function is generally the same as the &lt;code&gt;load&lt;/code&gt; function.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;callback:&lt;/h5&gt;
&lt;p&gt;A function which will be called for &lt;strong&gt;each&lt;/strong&gt; resource as it is loaded sequentially.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;complete:&lt;/h5&gt;
&lt;p&gt;A function which will be called &lt;strong&gt;once&lt;/strong&gt; when all of the resources have been loaded.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, to get an idea of the syntax, let&amp;#8217;s take a look at the simplest possible use of yepnope: loading a single resource.&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope('resources/someScript.js');
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230; or perhaps loading an array of resources.&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope([
		'resources/someScript.js',
		'resources/someStyleSheet.css'
	]);
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;How about an object literal so that we can use named callbacks later?&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		'someScript'	 : 'resources/someScript.js',
		'someStyleSheet' : 'resources/someStyleSheet.css'
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;Remember, these resources will be loaded asynchronously as the page is downloading and rendering.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 2 &amp;#8211; &lt;/span&gt; Conditions &amp;#8211; Testing for the Features of the Future!&lt;/h2&gt;
&lt;p&gt;So, we can load resources asynchronously!  That&amp;#8217;s great, but, what if some pages don&amp;#8217;t require a certain resource?  Or, what if a resource is only needed in a particular browser which doesn&amp;#8217;t support a cutting edge new technology?&lt;/p&gt;
&lt;p&gt;No problem!  This is where yepnope&amp;#8217;s underlying purpose comes into focus.  Using the test property, we can conditionally load resources based on need.  For example, let&amp;#8217;s assume that the &lt;a href="http://www.modernizr.com"&gt;Modernizer&lt;/a&gt; library is loaded. &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt; For those of you unfamiliar with Modernizer, it&amp;#8217;s a nifty test suite used for detecting HTML5 and CSS3 feature support in browsers.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Modernizer adds appropriate classnames to the pages &lt;code&gt;html&lt;/code&gt; element, representing the features supported and not supported, e.g. &amp;#8220;&lt;code&gt;js flexbox no-canvas&lt;/code&gt;&amp;#8221; etc.  Additionally, you can access each of Modernizer tests, which return boolean values, individually, within your code.&lt;/p&gt;
&lt;p&gt;So, using Modernizer, let&amp;#8217;s test for &lt;code&gt;hashchange&lt;/code&gt; event support as well as session history support!&lt;/p&gt;
&lt;h3&gt;Here&amp;#8217;s a look at our test:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;amp;&amp;amp; Modernizr.history
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;This test will, of course, return &lt;code&gt;true&lt;/code&gt; only if the browser supports both of these features.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 3 &amp;#8211; &lt;/span&gt; Loading Resources Conditionally&lt;/h2&gt;
&lt;p&gt;With our test condition set, we&amp;#8217;ll now define which resources to load based on the result of this test.  In other words, if you only need to load a specific resource when the browser lacks a feature, or the test fails, you can simply define that resource in the &lt;code&gt;nope&lt;/code&gt; clause.  Conversely, you can load resources when the test passes, within the &lt;code&gt;yep&lt;/code&gt; clause.&lt;/p&gt;
&lt;p&gt;So, assuming the browser doesn&amp;#8217;t support one of these two features, we&amp;#8217;ll load up &lt;a href="http://benalman.com/projects/jquery-hashchange-plugin/"&gt;Ben Alman&amp;#8217;s jQuery hashchange plugin&lt;/a&gt;, which enables &lt;code&gt;hashchange&lt;/code&gt; and history support in older browsers which don&amp;#8217;t support either of these features.&lt;/p&gt;
&lt;h3&gt;Let&amp;#8217;s load up the hashchange plugin:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : 'resources/jquery.ba-hashchange.js'
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;In the above example, we won&amp;#8217;t use the &lt;code&gt;yep&lt;/code&gt; property as we&amp;#8217;re only providing a shim should it be needed.&lt;/p&gt;
&lt;p&gt;To illustrate the &lt;code&gt;yep&lt;/code&gt; clause, though, let&amp;#8217;s test for CSS3 transformation support and then load a stylesheet for browsers which support transformations and a vanilla stylesheet for browsers that don&amp;#8217;t.  Additionally, we&amp;#8217;ll load a jQuery plugin which mimics CSS3 transformations as well.&lt;/p&gt;
&lt;h3&gt;Using both yep and nope:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.csstransforms,
		yep	 : 'resources/cssTransform.css'
		nope : ['resources/noTransform.css', 'jQuery.pseudoTransforms.js']
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;		&lt;/p&gt;
&lt;p&gt;Note that both of these examples will load all resources asynchronously as the rest of the page downloads and renders!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 4 &amp;#8211; &lt;/span&gt; Loading Resources Regardless of the Test Condition&lt;/h2&gt;
&lt;p&gt;Yepnope also provides a way to load resources independently of the test results by way of the the &lt;code&gt;load&lt;/code&gt; property.  The &lt;code&gt;load&lt;/code&gt; function will always load any resource it&amp;#8217;s fed, regardless of the &lt;code&gt;test&lt;/code&gt; result.  Similarly, the &lt;code&gt;both&lt;/code&gt; prop, which is, again, essentially just syntactic sugar, also loads resources regardless of the test result, or more accurately, on either result.&lt;/p&gt;
&lt;h3&gt;Loading by default:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : 'resources/jquery.ba-hashchange.js',
		load : 'resources/somethingWhichIsAlwaysLoaded.css',
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;h3&gt;Loading on both conditions, syntactic sugar :&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : 'resources/jquery.ba-hashchange.js',
		both : 'resources/somethingWhichIsAlwaysLoaded.css',
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;In both of the above examples, resources will be loaded, asynchronously, no matter what.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 5 &amp;#8211; &lt;/span&gt; Callbacks &amp;#8211; Dependent Code After the Load&lt;/h2&gt;
&lt;p&gt;As mentioned earlier, we can&amp;#8217;t write in-line code in the usual manner if that code is dependant on one of the scripts being loaded.  Thus, we&amp;#8217;ll use yepnope&amp;#8217;s callback function which fires once for each resource &lt;em&gt;after&lt;/em&gt; it has finished loading.  The callback function accepts three parameters which are assigned the following:&lt;/p&gt;
&lt;ul id="parameter-list" class="list-items"&gt;
&lt;li&gt;
&lt;h5&gt;url&lt;/h5&gt;
&lt;p&gt;This string represent the url of the resource which was loaded&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;result&lt;/h5&gt;
&lt;p&gt;A boolean representing the status of the load.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;key&lt;/h5&gt;
&lt;p&gt;If using an array or object of resources, this will represent the index or the property name of the file which was loaded&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#8217;s take a look at a simple callback with the hashchange plugin example from earlier.  We&amp;#8217;ll use jQuery&amp;#8217;s bind method to bind a handler to the hashchange event of the &lt;code&gt;window&lt;/code&gt;:&lt;/p&gt;
&lt;h3&gt;A simple callback:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : 'resources/jquery.ba-hashchange.js',
		callback : function(url, result, key){

			$(function(){
				$(window).bind('hashchange', function(){
					console.info(location.hash);
				});
			});

		},
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;Regardless of what state the DOM is in, this callback, which in this particular case is within a document ready wrapper, will fire as soon as the resource is loaded.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say, however, that we are loading more than one script and that we need to fire off a callback for each script as it loads.  Specifying the code we need to run in the above manner would create a redundancy as the callback is fired each time a resource is loaded.  Yepnope, however, provides a great way to handle callbacks for each resource, independently of any other callbacks. &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt; By using an object literal to define the resources we are loading, we can reference each resource key, individually, within the callback. &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; Let&amp;#8217;s take a look at an example where we load jQuery as well as the jQuery hashchange plugin, which is dependant on jQuery being loaded first.  This time, however, we&amp;#8217;ll use object literals!&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : {
			'jquery' : 'resources/jquery-1.5.1.min.js',
			'hashch' : 'resources/jquery.ba-hashchange.js'
		},
		callback : {
			'jquery' : function(url, result, key){
				console.info('I will fire only when the jquery script is loaded');
			},
			'hashch' : function(url, result, key){
				console.info('I will fire only when the hashchange script is loaded');

				// This code will be added to jQuerys DOM ready call stack
				$(function(){
					$(window).bind('hashchange', function(){
						console.info(location.hash);
					});
				});
			}
		}
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;Using the above example as a reference, you can implement your own callbacks for each resource load in an orderly manner.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 6 &amp;#8211; &lt;/span&gt; Complete &amp;#8211; When all is Said and Done!&lt;/h2&gt;
&lt;p&gt;Lastly, we have the &lt;code&gt;complete&lt;/code&gt; callback which is only called once, after all the resources have finished loading.  So, for example, if you&amp;#8217;re &amp;#8220;bootstrapping&amp;#8221; a web application and the code you need to run is dependent on all the files you&amp;#8217;re loading, rather than specifying a &lt;code&gt;callback&lt;/code&gt; for each resource, you would write your code within the &lt;code&gt;complete&lt;/code&gt; callback so that it&amp;#8217;s only fired once, after all its dependencies have loaded.  Unlike the &lt;code&gt;callback&lt;/code&gt; function, &lt;code&gt;complete&lt;/code&gt; doesn&amp;#8217;t take any parameters or have access to the &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;result&lt;/code&gt; or &lt;code&gt;key&lt;/code&gt; props.&lt;/p&gt;
&lt;h3&gt;The &lt;code&gt;complete&lt;/code&gt; callback:&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope({
		test : Modernizr.hashchange &amp;#038;&amp;#038; Modernizr.history,
		nope : [
			'resources/jquery-1.5.1.min.js',
			'resources/jquery.ba-hashchange.js'
		],
		complete : function(){

			console.info('I will fire only once when both jquery and the hashchange script are loaded');

			// This code will be added to jQuerys DOM ready call stack
			$(function(){
				$(window).bind('hashchange', function(){
					console.info(location.hash);
				});
			});		

		}
	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;p&gt;So, essentially, the &lt;code&gt;complete&lt;/code&gt; callback is useful for anything which needs to be done once all the resources are loaded.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 7 &amp;#8211; &lt;/span&gt; Yepnope Plugins, Prefixes and More!&lt;/h2&gt;
&lt;p&gt;Yepnope also provides us with another nifty little feature: prefixes and filters!  The default prefixes provided by yepnope, which are always prepended to the beginning of a resource url, are used for defining a file as CSS, preloading a resource or targeting Internet Explorer or one of its versions, respectively.  Let&amp;#8217;s have a look:&lt;/p&gt;
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;
&lt;h5&gt;css!&lt;/h5&gt;
&lt;p&gt;This prefix is used for forcing yepnope to treat a resource as a stylesheet.  By default, yepnope treats .css files as stylesheets and everything else as a JavaScript file.  So, if you&amp;#8217;re serving up CSS dynamically, this prefix would force yepnope to treat that resource as a stylesheet.&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope('css!styles.php?colorscheme=blue');
					&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;preload!&lt;/h5&gt;
&lt;p&gt;This prefix allows you to load / cache a resource without executing it.&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope('preload!userInterface.js');
					&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;
				&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;ie!&lt;/h5&gt;
&lt;p&gt;There may be circumstances where you need to load specific resources only if you&amp;#8217;re working with Internet Explorer or a particular version of Internet Explorer.  Thus, the &lt;code&gt;ie&lt;/code&gt; prefixes help you target resource loading to &lt;code&gt;ie&lt;/code&gt; or specific versions of it.  Here&amp;#8217;s a list of the supported &lt;code&gt;ie&lt;/code&gt; prefixes where &lt;code&gt;gt&lt;/code&gt; stands for &amp;#8220;versions greater than&amp;#8221; and &lt;code&gt;lt&lt;/code&gt; stands for &amp;#8220;versions less than&amp;#8221;.&lt;/p&gt;
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;&lt;b&gt;Internet Explorer:&lt;/b&gt; &lt;br /&gt;&lt;code&gt;ie!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Internet Explorer by version number:&lt;/b&gt; &lt;br /&gt;&lt;code&gt;ie5!&lt;/code&gt;, &lt;code&gt;ie6!&lt;/code&gt;, &lt;code&gt;ie7!&lt;/code&gt;, &lt;code&gt;ie8!&lt;/code&gt;, &lt;code&gt;ie9!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Internet Explorer versions greater than:&lt;/b&gt; &lt;br /&gt;&lt;code&gt;iegt5!&lt;/code&gt;, &lt;code&gt;iegt6!&lt;/code&gt;, &lt;code&gt;iegt7!&lt;/code&gt;, &lt;code&gt;iegt8!&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Internet Explorer versions less than:&lt;/b&gt; &lt;br /&gt;&lt;code&gt;ielt7!&lt;/code&gt;, &lt;code&gt;ielt8!&lt;/code&gt;, &lt;code&gt;ielt9!&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;All of these filters are chainable and serve as a sort of &lt;code&gt;OR&lt;/code&gt; operator in that if one of them evaluates to &lt;code&gt;true&lt;/code&gt; the resource will be loaded.  So, should we need to target ie7 and ie8, we would simply prepend the appropriate filters to the url of the resource as follows:&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope('ie7!ie8!userInterface.js');
					&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;				&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Creating your own filters!&lt;/h3&gt;
&lt;p&gt;Should you ever need to, &lt;code&gt;yepnope&lt;/code&gt; also provides the means with which to create your own filters and prefixes by way of the &lt;code&gt;addFilter&lt;/code&gt; and &lt;code&gt;addPrefix&lt;/code&gt; methods.  Any filter or prefix you create is passed a &lt;code&gt;resourceObject&lt;/code&gt; containing a number of useful props.  Remember, though, to return the &lt;code&gt;resourceObject&lt;/code&gt; as yepnope requires that you do so.  Here&amp;#8217;s a look at the &lt;code&gt;resourceObject&lt;/code&gt;:&lt;/p&gt;
&lt;ul style="list-style-type:none"&gt;
&lt;li&gt;
&lt;h5&gt;url:&lt;/h5&gt;
&lt;p&gt;The url of the resource being loaded.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;prefixes&lt;/h5&gt;
&lt;p&gt;The array of applied prefixes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;autoCallback&lt;/h5&gt;
&lt;p&gt;A callback which runs after each script loads, separate from the others.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;noexec&lt;/h5&gt;
&lt;p&gt;A boolean value which forces preload without execution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;instead&lt;/h5&gt;
&lt;p&gt;An advanced function which takes the same parameters as the loader.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;forceJS&lt;/h5&gt;
&lt;p&gt;A boolean which forces the resource to be treated as javascript.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;forceCSS&lt;/h5&gt;
&lt;p&gt;A boolean which forces the resource to be treated as a stylesheet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;bypass&lt;/h5&gt;
&lt;p&gt;A boolean which determines whether or not load the current resource&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;#8217;s say, for example, you want the ability to toggle resource loading between your CDN and web server, on the fly.  Can we do that, though!? Yep! Let&amp;#8217;s create two prefixes, one for loading from the CDN and the other for loading from your web server.&lt;/p&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope.addPrefix('local', function(resourceObj) {

		resourceObj.url = 'http://mySite/resources/' + resourceObj.url;
		return resourceObj;

	});

	yepnope.addPrefix('amazon', function(resourceObj) {

		resourceObj.url = 'http://pseudoRepository.s3.amazonaws.com/' + resourceObj.url;
		return resourceObj;

	});
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;h3&gt;Using these prefixes, we can now easily switch between our CDN and web server!&lt;/h3&gt;
&lt;pre name="code" class="javascript"&gt;
	yepnope([
		'local!css/typography.css',
		'amazon!defaultStyle.css'
	]);
			&lt;/pre&gt;
&lt;p&gt;&lt;!-- pre.javascript --&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Step 8 &amp;#8211; &lt;/span&gt; A few Caveats&lt;/h2&gt;
&lt;p&gt;So, while maintaining a very small footprint, the yepnope conditional loader is power-packed with a number of useful features!  There are, however, a few things you should be aware of before using it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h5&gt;No &lt;code&gt;document.write&lt;/code&gt;&lt;/h5&gt;
&lt;p&gt;As with any asynchronous loader, you can&amp;#8217;t use &lt;code&gt;document.write&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;Internet Explorer less than 9 and callback execution&lt;/h5&gt;
&lt;p&gt;Internet Explorer versions less than nine don&amp;#8217;t guarantee that callbacks run &lt;em&gt;immediately&lt;/em&gt; after the related script fires.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;Be careful with the DOM&lt;/h5&gt;
&lt;p&gt;Your script may be loaded and executed before the DOM is ready.  So, if you&amp;#8217;re manipulating the DOM, it&amp;#8217;s advisable to use a DOM ready wrapper.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;You should still combine where you can&lt;/h5&gt;
&lt;p&gt;Just because you&amp;#8217;re using an asynchronous loader doesn&amp;#8217;t mean that you shouldn&amp;#8217;t combine your resources where you can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h5&gt;Internet Explorer asynchronous load limits&lt;/h5&gt;
&lt;p&gt;Older versions of Internet Explorer can only load two resources from the same domain at the same time, where as other versions can load up to six.  So, if you&amp;#8217;re loading multiple files, consider using a sub-domain or CDN.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Conclusion &amp;#8211; &lt;/span&gt; Thoughts on yepnope.js&lt;/h2&gt;
&lt;p&gt;All in all, I found yepnope to be a great utility!  Not only does it support the asynchronous loading of both scripts and stylesheets, but it provides you with a nice, clean way to load HTML5 and CSS3 polyfills conditionally.  The callback mechanism is well thought out and the ability to add your own prefixes and filters is just great!  Performance wise, I found yepnope to be somewhat on par with other loaders, such as &lt;a href="http://labjs.com/"&gt;Getify Solutions&amp;#8217; LABjs&lt;/a&gt; and &lt;a href="http://requirejs.org/"&gt;James Burke&amp;#8217;s require.js&lt;/a&gt;.  Obviously, each loader is different and suits a different need but if you haven&amp;#8217;t yet, I encourage you to give &lt;a href="http://yepnopejs.com/"&gt;yepnope.js&lt;/a&gt; a go!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/q_XE0vLQZuf-m5MEalbuougSIk4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q_XE0vLQZuf-m5MEalbuougSIk4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/q_XE0vLQZuf-m5MEalbuougSIk4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/q_XE0vLQZuf-m5MEalbuougSIk4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hmxTJlCB4nE:NUh3sRQgPuo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hmxTJlCB4nE:NUh3sRQgPuo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hmxTJlCB4nE:NUh3sRQgPuo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hmxTJlCB4nE:NUh3sRQgPuo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hmxTJlCB4nE:NUh3sRQgPuo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hmxTJlCB4nE:NUh3sRQgPuo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hmxTJlCB4nE:NUh3sRQgPuo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hmxTJlCB4nE:NUh3sRQgPuo:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/hmxTJlCB4nE" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/easy-script-loading-with-yepnope-js/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/easy-script-loading-with-yepnope-js/</feedburner:origLink></item>
		<item>
		<title>Turbocharge Your Website With Memcached</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/t48g03Jl-qA/</link>
		<comments>http://net.tutsplus.com/tutorials/php/faster-php-mysql-websites-in-minutes/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 17:49:19 +0000</pubDate>
		<dc:creator>Nicolas Sebban</dc:creator>
				<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23939</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23939&amp;c=443287072' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23939&amp;c=443287072' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Your latest PHP/MySQL website is finally online. And it&amp;#8217;s awesome. But it&amp;#8217;s not as fast as you want it to be, because of the many SQL queries running every time a page is generated. And above that, you have the feeling it will not scale well under heavy loads. And you are most likely right.&lt;/p&gt;
&lt;p&gt;In this tutorial, we will see how you can greatly improve your website&amp;#8217;s responsiveness, and help it scale to handle many simultaneous visitors, by implementing a cache layer between your code and your database. The good news is it is fairly easy, and can be done in a few minutes!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23939"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; Introducing Memcached&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1131_faster_websites/pre.png" border="0" /&gt;&lt;/div&gt;
&lt;blockquote&gt;&lt;p&gt;Memcached is a high-performance in-memory data caching system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Modern websites and web applications use a lot of data, and it&amp;#8217;s not uncommon to count as many as 20 or even 30 SQL queries in a single page generation. Multiply this amount by a big number of visitors, and you often get an overloaded database, and pages that take seconds to be generated and sent to the client.&lt;/p&gt;
&lt;p&gt;The tool we are going to use today to improve performance is called Memcached. It&amp;#8217;s a high-performance in-memory data caching system. Or to put it another way, a very fast application that runs on your server and uses a fraction of the available memory to store an associative array of data. You can ask Memcached to do two things :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Store the value &lt;code&gt;V&lt;/code&gt; with the key &lt;code&gt;K&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Retrieve the value &lt;code&gt;V&lt;/code&gt; stored with the key &lt;code&gt;K&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This looks minimalist, but there&amp;#8217;s a lot you can do thanks to these two features, as we will see very soon. In fact, Memcached can do a few more things, but they&amp;#8217;re all tied to storing or retrieving data.&lt;/p&gt;
&lt;p&gt;Installing Memcached on modern Linux distributions is quite simple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ubuntu : &lt;code&gt;sudo apt-get install memcached&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gentoo : &lt;code&gt;sudo emerge install memcached&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Redhat : &lt;code&gt;sudo yum install memcached&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once installed, Memcached will be automatically started every time your server boots. You can set the amount of memory reserved for Memcached, along with other options, in the configuration file (&lt;code&gt;/etc/memcached.conf&lt;/code&gt;). 64Mb is allocated by default. The configuration file also contains the IP address and the port Memcached will be bound to. Default values (&lt;code&gt;127.0.0.1&lt;/code&gt; and &lt;code&gt;11211&lt;/code&gt;) are fine for a standard setup.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Accessing Memcached from PHP&lt;/h2&gt;
&lt;p&gt;We want to store and retrieve data from your PHP scripts. This means we are going to need a way to connect to Memcached from PHP. For that, we&amp;#8217;re going to install the &amp;#8220;Memcache&amp;#8221; extension for PHP. As it is a PECL extension, it is very easy to install with the &amp;#8220;pecl&amp;#8221; by typing the following command :&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;
sudo pecl install memcache
&lt;/pre&gt;
&lt;p&gt;There are two PHP extensions related to Memcache : &amp;#8220;Memcache&amp;#8221; and &amp;#8220;Memcached&amp;#8221; (notice the &amp;#8220;d&amp;#8221; in the second one). Both are very similar, but the first one has a smaller footprint. In this tutorial, we will use the lighter &lt;a href="http://pecl.php.net/package/memcache" target="_blank"&gt;Memcache&lt;/a&gt;. Once installed, this extension should be enabled and the Memcache-related functions should now be available to your PHP scripts.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How does Caching Work?&lt;/h2&gt;
&lt;p&gt;Our work here is based on the following assumptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;retrieving data from the database takes resources (CPU + i/o)&lt;/li&gt;
&lt;li&gt;retrieving data from the database takes time&lt;/li&gt;
&lt;li&gt;we often retrieve the very same data over and over&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote class="pullquote pqRight"&gt;&lt;p&gt;We also want to store our data it in a way that allows us to retrieve it efficiently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Generally speaking, we want to save our data in a persistent environment (our MySQL database for instance). But we also want to store our data it in a way that allows us to retrieve it efficiently, even if the storage is non-persistent. So in the end, we will have &lt;strong&gt;two copies of our data&lt;/strong&gt; : one being stored in MySQL and the other being stored in Memcache.&lt;/p&gt;
&lt;p&gt;Here are the steps we have to take to make this happen :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every write operation (SQL &lt;code&gt;INSERTs&lt;/code&gt; and &lt;code&gt;UPDATEs&lt;/code&gt;) will be performed in both MySQL and Memcached&lt;/li&gt;
&lt;li&gt;Every read operation (SQL &lt;code&gt;SELECTs&lt;/code&gt;) will be performed in Memcached, and will fall back to MySQL in case of error&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, you probably see which parts of your code need to be modified : parts where you write data and parts where you read data. If your PHP code is well structured, you should have wrapped your data access code in functions or &amp;mdash;even better&amp;mdash; classes. If so, updating your site should be very fast. If not, you might have a little more work.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Connecting to our Cache Server&lt;/h2&gt;
&lt;p&gt;First of all, let&amp;#8217;s create a connection to our Memcached server. Here is the code you should use, early in your PHP scripts :&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	// Connection constants
	define('MEMCACHED_HOST', '127.0.0.1');
	define('MEMCACHED_PORT', '11211');

	// Connection creation
	$memcache = new Memcache;
	$cacheAvailable = $memcache-&amp;gt;connect(MEMCACHED_HOST, MEMCACHED_PORT);
&lt;/pre&gt;
&lt;p&gt;At this point, we have established a connection to our Memcache server. It may have failed, but we know so thanks to the &lt;code&gt;$cacheAvailable&lt;/code&gt; variable.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Storing Data in our Cache&lt;/h2&gt;
&lt;p&gt;Let&amp;#8217;s dive into data storage. We are going to take an example to make things clearer &amp;#8211; an online shop. We have a script called &lt;code&gt;edit_product.php&lt;/code&gt; whose purpose is to save a product&amp;#8217;s data into our database. Each one of our products has the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;id&lt;/li&gt;
&lt;li&gt;name&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;price&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At some point in our &lt;code&gt;edit_product.php&lt;/code&gt; code, we run an &lt;code&gt;INSERT&lt;/code&gt; or &lt;code&gt;UPDATE&lt;/code&gt; SQL query whose purpose is to write this product&amp;#8217;s data to our MySQL database. It could look just like this :&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	// We have validated and sanitized our data
	// We have escaped every risky char with mysql_real_escape_string()
	// Now we want to save it into our database
	$sql = &amp;quot;INSERT INTO products (id, name, description, price) VALUES ($id, '$name', '$description', $price)&amp;quot;;
	$querySuccess = mysql_query($sql, $db);
&lt;/pre&gt;
&lt;p&gt;As I mentioned above, we want to store our data both in our MySQL database and Memcached server. Here is how we are going to proceed :&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	// We have validated and sanitized our data
	// We have escaped every risky char with mysql_real_escape_string()
	// Now we want to write them to our database :
	$sql = &amp;quot;INSERT INTO products (id, name, description, price) VALUES ($id, '$name', '$description', $price)&amp;quot;;
	$querySuccess = mysql_query($sql, $db);

	// We have written our data into our database
	// Now let's store the product name, description and price into our cache
	// The method &amp;quot;set&amp;quot; tells our Memcached server to store the data associated to a specific key
	if ($querySuccess === true)
	{
		// We build a unique key that we can build again later
		// We will use the word 'product' plus our product's id (eg. &amp;quot;product_12&amp;quot;)
		$key = 'product_' . $id;

		// We store an associative array containing our product data
		$product = array('id' =&amp;gt; $id, 'name' =&amp;gt; $name, 'description' =&amp;gt; $description, 'price' =&amp;gt; $price);

		// And we ask Memcached to store that data
		$memcache-&amp;gt;set($key, $product);
	}
&lt;/pre&gt;
&lt;p&gt;At this point, both our database and cache contain our product data.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Retrieving Data from our Cache&lt;/h2&gt;
&lt;blockquote class="pullquote pqRight"&gt;&lt;p&gt;In case our cache is unavailable, we want to fall back to MySQL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now let&amp;#8217;s retrieve our data. In the same example, let&amp;#8217;s say our online shop has a script called &lt;code&gt;product.php&lt;/code&gt; that displays a specific product. Accessing the page &lt;code&gt;product.php?id=12&lt;/code&gt; will display the product whose identifier is 12.&lt;/p&gt;
&lt;p&gt;At some point in our &lt;code&gt;product.php&lt;/code&gt; code, we run a &lt;code&gt;SELECT&lt;/code&gt; SQL query whose purpose is to retrieve a product&amp;#8217;s data from our MySQL database. It could look just like this :&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	// We have validated and sanitized our data
	// We have escaped every risky char with mysql_real_escape_string()
	// Now we want to read from our database :
	$sql = &amp;quot;SELECT id, name, description, price FROM products WHERE id = &amp;quot; . $id;
	$queryResource = mysql_query($sql, $db);
	$product = mysql_fetch_assoc($queryResource);
&lt;/pre&gt;
&lt;p&gt;As we said above, we want to retrieve our data from our Memcached server if possible, because it&amp;#8217;s faster than getting it from MySQL. But in case our cache server can&amp;#8217;t be reached, or if it simply doesn&amp;#8217;t store the data we need, we want to fall back to MySQL. Here is how we are going to proceed :&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	// Initialize our $product variable
	$product = null;

	// First we check that our cache server is available
	// The $cacheAvailable variable was initialized when we connected to our cache server
	if ($cacheAvailable == true)
	{
		// We build the key we associated to our product data
		$key = 'product_' . $id;

		// Now we get the data from our cache server
		$product = $memcache-&amp;gt;get($key);
	}

	// do we need to access MySQL ?
	if (!$product)
	{
		// In case we do...because our $product variable is still null
		// We have validated and sanitized our data
		// We have escaped every risky char with mysql_real_escape_string()
		// Now we want to read from our database :
		$sql = &amp;quot;SELECT id, name, description, price FROM products WHERE id = &amp;quot; . $id;
		$queryResource = mysql_query($sql, $db);
		$product = mysql_fetch_assoc($queryResource);
	}
&lt;/pre&gt;
&lt;p&gt;At this point, we have retrieved the data we needed. It was most likely done from our cache, but could be from MySQL if the cache was not filled or couldn&amp;#8217;t be accessed for some reason.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We have seen how Memcached can be used to speed up your website and limit your database load. Our example above was based on PHP and MySQL because these techologies are widely deployed, but this principle is universal and works just the same with many other technologies : C/C++, Java, Python, Ruby, Perl, .Net, MySQL, Postgres, Erlang, Lua, Lisp, Cold Fusion, Ocaml and io are listed along with PHP on &lt;a href="http://code.google.com/p/memcached/wiki/Clients" target="_blank"&gt;the official Memcached wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As I briefly mentioned earlier, Memcached provides more features than the simple set and get methods we&amp;#8217;ve seen above. Two useful additional features are increment/decrement updates, and the ability to set an expiration time to a specific stored data. Both are available in PHP, along with a few others, as you can see in &lt;a href="http://fr2.php.net/manual/en/book.memcache.php" target="_blank"&gt;the Memcache documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have fun implementing this on your websites, and enjoy the &amp;mdash;free&amp;mdash; performances improvement. Thank you so much for reading and please let me know if you have any questions in the comments below.&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IvC7RM8sd1xwkgX1zcCatwNTid4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IvC7RM8sd1xwkgX1zcCatwNTid4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IvC7RM8sd1xwkgX1zcCatwNTid4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IvC7RM8sd1xwkgX1zcCatwNTid4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=t48g03Jl-qA:5Ibm0DzqRV8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=t48g03Jl-qA:5Ibm0DzqRV8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=t48g03Jl-qA:5Ibm0DzqRV8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=t48g03Jl-qA:5Ibm0DzqRV8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=t48g03Jl-qA:5Ibm0DzqRV8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=t48g03Jl-qA:5Ibm0DzqRV8:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=t48g03Jl-qA:5Ibm0DzqRV8:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=t48g03Jl-qA:5Ibm0DzqRV8:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/t48g03Jl-qA" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/php/faster-php-mysql-websites-in-minutes/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/php/faster-php-mysql-websites-in-minutes/</feedburner:origLink></item>
		<item>
		<title>JavaScript Testing From Scratch: New on Premium</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/r5rmgQFQnpY/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/javascript-testing-from-scratch-new-on-premium/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 20:30:53 +0000</pubDate>
		<dc:creator>Andrew Burgess</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[Premium]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[Videos]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23927</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23927&amp;c=1245804352' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23927&amp;c=1245804352' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;This likely isn&amp;#8217;t the first tutorial on testing that you&amp;#8217;ve ever seen. But perhaps you&amp;#8217;ve had your doubts about testing, and never took the time to read them. After all, it can seem like extra work for no reason.
&lt;/p&gt;
&lt;p&gt;
This tutorial (with screencasts) intends to change your views. We&amp;#8217;re going to start at the very beginning: what is testing and why should you do it? Then, we&amp;#8217;ll talk briefly about writing testable code, before actually, you know, doing some testing! Let&amp;#8217;s get to it.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://net.tutsplus.com/about/join-plus/" &gt;Become a Premium member&lt;/a&gt; to read this tutorial/screencast, as well as hundreds of other advanced tutorials and screencasts from the Tuts+ network.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23927"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Tuts+ Premium&lt;/h2&gt;
&lt;p&gt;&lt;a style="float: right; margin-left: 20px;" href="http://tutsplus.com/take-the-tour/"&gt;&lt;img src="http://tutsplus.s3.amazonaws.com/banners/250x250.jpg"&gt;&lt;/a&gt;The recently re-launched &lt;a href="http://tutsplus.com"&gt;Tuts+ Premium&lt;/a&gt; is a service that provides top-tier training in a variety of creative fields. Whether you prefer &lt;a href="http://tutsplus.com/ebook/getting-good-with-javascript-2/"&gt;books&lt;/a&gt;, &lt;a href="http://tutsplus.com/course/wordpress-plugin-development-essentials/"&gt;visual training&lt;/a&gt;, or &lt;a href="http://tutsplus.com/tutorial/a-guide-to-custom-theming-jquery-ui-widgets/"&gt;in depth tutorials&lt;/a&gt;, we have you covered. While we unfortunately can&amp;#8217;t afford to provide the service for free, it&amp;#8217;s only $19 a month &amp;#8211; less than you&amp;#8217;d spend on dinner. &lt;/p&gt;
&lt;p&gt;I hope you&amp;#8217;ll consider &lt;a href="http://tutsplus.com"&gt;checking it out&lt;/a&gt;! In addition to learning a huge variety of new skills, it&amp;#8217;s also a fantastic way to say thank you to Nettuts+. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/3lfV5MXvNqkV89ToOnv39mwNirU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3lfV5MXvNqkV89ToOnv39mwNirU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/3lfV5MXvNqkV89ToOnv39mwNirU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/3lfV5MXvNqkV89ToOnv39mwNirU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=r5rmgQFQnpY:7NrnBfJ9w-Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=r5rmgQFQnpY:7NrnBfJ9w-Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=r5rmgQFQnpY:7NrnBfJ9w-Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=r5rmgQFQnpY:7NrnBfJ9w-Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=r5rmgQFQnpY:7NrnBfJ9w-Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=r5rmgQFQnpY:7NrnBfJ9w-Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=r5rmgQFQnpY:7NrnBfJ9w-Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=r5rmgQFQnpY:7NrnBfJ9w-Y:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/r5rmgQFQnpY" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/javascript-testing-from-scratch-new-on-premium/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/javascript-testing-from-scratch-new-on-premium/</feedburner:origLink></item>
		<item>
		<title>Best of Tuts+ in January 2012</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/JtBVW0IlEaE/</link>
		<comments>http://net.tutsplus.com/articles/news/best-of-tuts-in-january-2012/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:37:09 +0000</pubDate>
		<dc:creator>David Appleyard</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[bestof]]></category>
		<category><![CDATA[monthlypicks]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23918</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23918&amp;c=176699626' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23918&amp;c=176699626' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Each month, we bring together a selection of the best tutorials and articles from across the whole &lt;a href="http://tutsplus.com/"&gt;Tuts+ network&lt;/a&gt;. Whether you&amp;#8217;d like to read the top posts from your favourite site, or would like to start learning something completely new, this is the best place to start!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23918"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Psdtuts+ — Photoshop Tutorials&lt;/h2&gt;
&lt;ul class="webroundup"&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
			&lt;img src="http://d2f8dzk2mhcqts.cloudfront.net/0808_Truck/preview.jpg" alt="Create a Pimped Out Truck Using Photoshop and Point and Shoot Photos" width="200" height="200" /&gt;
		&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/pimped-out-truck/'&gt;Create a Pimped Out Truck Using Photoshop and Point and Shoot Photos&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Making modifications to your car or truck in Photoshop can be a lot of fun. In this tutorial we will demonstrate how to create a pimped out truck modification using photos taken with a simple point and shoot camera, with no advanced lighting setup. Let&amp;#8217;s get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/pimped-out-truck/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
			&lt;img src="http://d2f8dzk2mhcqts.cloudfront.net/0806_Elephant/preview.jpg" alt="Create an Elephant Sundae Using Photo Manipulation Techniques" width="200" height="200" /&gt;
		&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/elephant-sundae/'&gt;Create an Elephant Sundae Using Photo Manipulation Techniques&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Photoshop is great at seamlessly combing photos to create an entirely new scene. In this tutorial we will create an elephant sundae using several stock photos. Let&amp;#8217;s get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/elephant-sundae/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
			&lt;img src="http://d2f8dzk2mhcqts.cloudfront.net/0818_Michaelo/preview.jpg" alt="The Incredible Digital Art of Michael Oswald" width="200" height="200" /&gt;
		&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/articles/inspiration/michael-oswald/'&gt;The Incredible Digital Art of Michael Oswald&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this article we will be featuring the work of &lt;a href="http://www.bymichaelo.com/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.bymichaelo.com']);"&gt;Michael Oswald&lt;/a&gt;. Oswald is a digital artist with a unique style. His technique involves a combination of photo manipulation and digital painting techniques and the results are often stunning. Let&amp;#8217;s take a look!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/articles/inspiration/michael-oswald/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Nettuts+ — Web Development Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1038_sublime/sublime-text-2-tips-and-tricks.jpg" alt="Sublime Text 2 Tips and Tricks (Updated)" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/tools-and-tips/sublime-text-2-tips-and-tricks/'&gt;Sublime Text 2 Tips and Tricks (Updated)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.sublimetext.com/dev" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.sublimetext.com']);"&gt;Sublime Text 2&lt;/a&gt; is one of the fastest and most incredible code editors to be released in a long time! With a community and plugin ecosystem as passionate as this one, it just might be impossible for any other editor to catch up. I&amp;#8217;ll show you my favorite tips and tricks today. &lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/tools-and-tips/sublime-text-2-tips-and-tricks/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1119_html5/html5-media-and-accessibility.jpg" alt="An In Depth Analysis of HTML5 Multimedia and Accessibility" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/html-css-techniques/an-in-depth-overview-of-html5-multimedia-and-accessibility/'&gt;An In Depth Analysis of HTML5 Multimedia and Accessibility&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial, youll learn how HTML5 helps to provide you with several ways of presenting your media content to users. As a result, youll increase the availability of your media to users with different&lt;br /&gt;
needs and requirements, making it more accessible.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/html-css-techniques/an-in-depth-overview-of-html5-multimedia-and-accessibility/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1129_api_wrapper_tdd/api-wrapper-for-dribbble.png" alt="Writing an API Wrapper in Ruby with TDD" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/'&gt;Writing an API Wrapper in Ruby with TDD&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Sooner or later, all developers are required to interact with an API. The most difficult part is always related to reliably testing the code we write, and, as we want to make sure that everything works properly, we continuosly run code that queries the API itself. This process is slow and inefficient, as we can experience network issues and data inconsistencies (the API results may change). Let&amp;#8217;s review how we can avoid all of this effort with Ruby.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Vectortuts+ — Illustrator Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://dsmy2muqb7t4m.cloudfront.net/tuts/000-2012/477-microscope/preview.jpg" alt="How to Illustrate a Microscope in Illustrator" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/illustrate-a-microscope/'&gt;How to Illustrate a Microscope in Illustrator&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The microscopes is a symbol of our civilization. Throughout this tutorial on how to illustrate a vector microscope you&amp;#8217;ll take advantage of numerous Illustrator tools. You will learn how to use blends, art brushes and 3D rendering in Adobe Illustrator. Let&amp;#8217;s get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/illustrate-a-microscope/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://dsmy2muqb7t4m.cloudfront.net/tuts/000-2012/471-gallery/preview.jpg" alt="Create a Picture Gallery in Illustrator" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/create-a-picture-gallery/'&gt;Create a Picture Gallery in Illustrator&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This work is a common project created together with &lt;a href="http://vector.tutsplus.com/author/iaroslav-lazunov/" &gt;Iaroslav Lazunov&lt;/a&gt; and &lt;a href="http://vector.tutsplus.com/author/alexander-egupov/" &gt;Alexander Egupov&lt;/a&gt;. We have used 3D rendering, Blends, Opacity masks, making this three-dimensional stage with vanishing points. Learn every step in how to create this picture gallery work.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/create-a-picture-gallery/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://dsmy2muqb7t4m.cloudfront.net/articles/2012/article-tutorials-typeface-font-design/preview.jpg" alt="13 Important Resources for Learning How to Design Typefaces and Full Fonts" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/articles/web-roundups/how-to-design-typefaces-fonts/'&gt;Important Resources for Learning How to Design Typefaces and Full Fonts&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you&amp;#8217;re serious about creating a typeface design, then you&amp;#8217;ll need some solid resources to get started. Learn effective typeface design workflows, how to take an initial spark of an idea from sketch, through Illustrator, into Fontlab, and then work your creation into a complete and custom font design. Here are multiple tutorials that show you how to create fonts in Illustrator and Fontlab, and you can also dive into articles that describe the foundation of quality type design with ample inspirational examples.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/articles/web-roundups/how-to-design-typefaces-fonts/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Webdesigntuts+ — Web Design Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3pr5r64n04s3o.cloudfront.net/articles/062_pairing_fonts/preview.png" alt="A Beginner&amp;#8217;s Guide to Pairing Fonts" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/articles/typography-articles/a-beginners-guide-to-pairing-fonts/'&gt;A Beginner&amp;#8217;s Guide to Pairing Fonts&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Pairing fonts can be a challenge. Selecting two or more fonts which work well is one thing &amp;#8211; selecting two which work &lt;em&gt;together&lt;/em&gt; to achieve your typographic aims may have you reaching for the aspirin. Let&amp;#8217;s see if we can alleviate any headaches. This guide will help you get started with font pairing for the web.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/articles/typography-articles/a-beginners-guide-to-pairing-fonts/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3pr5r64n04s3o.cloudfront.net/tuts/235_banner_ads/preview.png" alt="Design a Series of Smart Banner Ads in Photoshop" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/visuals/design-a-series-of-smart-banner-ads-in-photoshop/'&gt;Design a Series of Smart Banner Ads in Photoshop&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;With the continuous growth of the Internet, online marketing has gotten bigger every year, and along with it, the advertising industry. One major factor in all this craziness is buying and selling ads. &lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/visuals/design-a-series-of-smart-banner-ads-in-photoshop/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="https://d3pr5r64n04s3o.cloudfront.net/tuts/231_twitter_bootstrap_101/bootstrap.png" alt="Twitter Bootstrap 101: Introduction" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/complete-websites/twitter-bootstrap-101-introduction/'&gt;Twitter Bootstrap 101: Introduction&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Twitter&amp;#8217;s Bootstrap is an excellent set of carefully crafted user interface elements, layouts, and javascript tools, freely available to use in your next web design project. This video series aims to introduce you to Bootstrap; taking you all the way from downloading the resources, to building a complete Bootstrap-based website.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/complete-websites/twitter-bootstrap-101-introduction/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Phototuts+ — Photography Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2f29brjr0xbt3.cloudfront.net/805_hdrtakeleave/preview.jpg" alt="HDR: Love it or Leave It?" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/articles/post-processing-articles/hdr-love-it-or-leave-it/'&gt;HDR: Love it or Leave It?&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;There are few techniques in the photography world that divide our community as much as HDR. High dynamic range images, or HDR images, are a special type of composite image that combines several images at different exposure settings in order to create an image with increased dynamic range. The look provided by HDR is loved by many, and disliked by perhaps just as many. In today&amp;#8217;s article, we&amp;#8217;re going to take a better look at what HDR is, and get some opinions from photographers using HDR.&lt;span id="more-8505"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/articles/post-processing-articles/hdr-love-it-or-leave-it/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2f29brjr0xbt3.cloudfront.net/807_motorsportRU/preview.jpg" alt="50 Inspiring Images of Cars and Motorcycles" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/articles/inspiration/50-inspiring-images-of-cars-and-motorcycles/'&gt;Inspiring Images of Cars and Motorcycles&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Cars and motorbikes have been around for 100 years. Throughout the century, they have looked beautiful, satisfied our need for speed and become a symbol for thrill seeking. Today, we&amp;#8217;ll look at photos ranging from brand new Ferrari&amp;#8217;s to classic muscle cars.&lt;span id="more-8519"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/articles/inspiration/50-inspiring-images-of-cars-and-motorcycles/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2f29brjr0xbt3.cloudfront.net/822_gimpQT/preview.jpg" alt="Quick Tip: GIMP Portable &amp;#8211; Take Your Editing Software With You" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/articles/post-processing-articles/quick-tip-gimp-portable-take-your-editing-software-with-you/'&gt;Quick Tip: GIMP Portable &amp;#8211; Take Your Editing Software With You&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;While a number of smartphones now offer photo editing basics (and a plethora of apps to expand things even more), the portability of a solid photo editing program has been hard to come by. Photoshop is a monster in regards to space requirements and its ability to work on any system where it is not expressively installed. Picasa can be fairly &amp;#8216;lightweight&amp;#8217; but lacks many of the more advanced photo editing tools. So what about GIMP?&lt;span id="more-8627"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/articles/post-processing-articles/quick-tip-gimp-portable-take-your-editing-software-with-you/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Cgtuts+ — Computer Graphics Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2d04grx5ahzvh.cloudfront.net/336_Blender_TRex_Modeling/Thumb.png" alt="Modeling, UVmapping And Texturing A Low Poly T-Rex In Blender, Part 1" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/blender/modeling-uvmapping-and-texturing-a-low-poly-t-rex-in-blender-part-1/'&gt;Modeling, UVmapping And Texturing A Low Poly T-Rex In Blender, Part 1&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In the first tutorial of 2012 you’ll learn how to create an awesome low-poly dinosaur using Blender and Gimp. In today’s post artist Karan Shah will walk you through the entire modeling process step by step, and show you how to create an optimized model suitable for use in any game engine.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/blender/modeling-uvmapping-and-texturing-a-low-poly-t-rex-in-blender-part-1/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2d04grx5ahzvh.cloudfront.net/337_Maya_Fluids_Explosion/Thumb.jpg" alt="Create A Realistic Explosion In Maya Using Maya Fluids" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/autodesk-maya/create-a-realistic-explosion-in-maya-using-maya-fluids/'&gt;Create A Realistic Explosion In Maya Using Maya Fluids&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Today you’ll learn to animate and shade fluids, understand all of the major attributes, learn how adding fields will allow you to gain better control over your simulation, and how to light and render the final animation.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/autodesk-maya/create-a-realistic-explosion-in-maya-using-maya-fluids/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2d04grx5ahzvh.cloudfront.net/339_UDK_Speedtree_Part_1/Thumb.jpg" alt="SpeedTree To UDK: The Complete Workflow, Part 1 Creating The Tree" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/game-dev/speedtree-to-udk-the-complete-workflow-part-1/'&gt;SpeedTree To UDK: The Complete Workflow, Part 1 Creating The Tree&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Due to the shear number of polygons often required to make believable 3D trees, creating realistic ones for use &amp;#8220;in-game&amp;#8221; can be a challenging, time consuming task. SpeedTree from IDV aims to change all that with it&amp;#8217;s intuitive UI, ease of use and powerful toolset. Making believable trees and plants has literally never been easier!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/game-dev/speedtree-to-udk-the-complete-workflow-part-1/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Aetuts+ — After Effects Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3gphd0pfuxn95.cloudfront.net/694_dominoes/dominoes_thumbnail.jpg" alt="&amp;#8220;Dominoes&amp;#8221; CameraTracker and Cinema 4d Case Study &amp;#8211; Day 1" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/tutorials/workflow/dominoes-cameratracker-and-cinema-4d-case-study-day-1/'&gt;Dominoes&amp;#8221; CameraTracker and Cinema 4d Case Study &amp;#8211; Day 1&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial we&amp;#8217;re going to go over the principle functionality of &lt;a href="http://www.thefoundry.co.uk/products/cameratracker/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.thefoundry.co.uk']);"&gt;CameraTracker&lt;/a&gt; from The Foundry, learning basic workflow, optimizing results, aligning the ground plane and exporting this data from After Effects to &lt;a href="http://www.maxon.net/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','www.maxon.net']);" rel="external"&gt;Cinema 4d&lt;/a&gt;.&lt;span id="more-18522"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/tutorials/workflow/dominoes-cameratracker-and-cinema-4d-case-study-day-1/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://tutsplus.s3.amazonaws.com/tutspremium/after-effects/59_flame_react/Flame_Reactant_Thumbnail.jpg" alt="Make An Amazing Motion Reactant Flame &amp;#8211; Tuts+ Premium" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/tutorials/vfx/make-an-amazing-motion-reactant-flame-tutsplus-premium/'&gt;Make An Amazing Motion Reactant Flame &amp;#8211; Tuts+ Premium&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Using just a few video elements of torch flames, we composite a burning hand by using a series of null objects and expressions to drive a &lt;strong&gt;time lagged displacement effect&lt;/strong&gt; to simulate fire burning from a moving source. We use the Puppet tool for the distortion and throw on some tracked lighting effects and a displacement map for the Heat. This principle can be used to &lt;strong&gt;add realistic, fluid motion to any tracked object&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/tutorials/vfx/make-an-amazing-motion-reactant-flame-tutsplus-premium/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3gphd0pfuxn95.cloudfront.net/misc/freelancer.jpg" alt="10 Key Tips To Becoming A Successful Video Freelancer" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/articles/in-depth/10-key-tips-to-becoming-a-successful-video-freelancer/'&gt;Key Tips To Becoming A Successful Video Freelancer&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Youve watched thousands of tutorials. Youve put in countless hours and spent many late nights working on personal projects. Youve finally come to the conclusion that this may just be something you would like to do for a career. It can seem a little intimidating at first, because how are you going to convince someone to pay you to do this? Up until now youve been your only client. How do you get more?  Im going to share my insight and experiences on how to successfully launch your freelance career this year!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/articles/in-depth/10-key-tips-to-becoming-a-successful-video-freelancer/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Audiotuts+ — Audio &amp;#038; Production Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3vvl31cy8gagb.cloudfront.net/713_8free/Preview Image.jpg" alt="8 Free Professional Quality Audio Unit Plug-ins for Mac" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/articles/general/8-free-professional-quality-audio-unit-plug-ins-for-mac/'&gt;Free Professional Quality Audio Unit Plug-ins for Mac&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Lets face it, software is expensive. While there are hundreds of free plug-ins available online, more often than not two problems will arise: One, most of them are for PCs leaving us Mac users feeling left out. Two, most of them are vary poor quality.&lt;/p&gt;
&lt;p&gt;While I do agree with the saying, &amp;#8220;The tools are only as good as the artist,&amp;#8221; I also believe the opposite is true; that at some point the artist can only be as good as his tools are.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/articles/general/8-free-professional-quality-audio-unit-plug-ins-for-mac/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3vvl31cy8gagb.cloudfront.net/qt_168_drums4/Thumbnail.jpg" alt="Quick Tip: Drum Processing Part 4: Tips and Tricks" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/quick-tip-drum-processing-part-4-tips-and-tricks/'&gt;Quick Tip: Drum Processing Part 4: Tips and Tricks&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This short series of quick tips is designed to give you a good overview of the audio processing techniques involved in creating a professional sounding drum beat for use in house, electro and breaks in Cubase. In this final part we will look at a few ways to add even more life to your drums.&lt;br /&gt;
&lt;span id="more-13319"&gt;&lt;/span&gt;&lt;br /&gt;
Here is a sample of the type of beat you could expect to end up with at the end of this series of tips:&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/quick-tip-drum-processing-part-4-tips-and-tricks/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d3vvl31cy8gagb.cloudfront.net/qt_164_math/preview.jpg" alt="Quick Tip: Use the Doubling Technique for Quick Drums" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/quick-tip-use-the-doubling-technique-for-quick-drums/'&gt;Quick Tip: Use the Doubling Technique for Quick Drums&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;It&amp;#8217;s 3:30 in the afternoon when your phone rings. The head of a music library is calling and she needs your help. They have a commercial for an A-list client that needs music, and they want you to submit an entry. You&amp;#8217;ll get $10,000 if you land the gig.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/quick-tip-use-the-doubling-technique-for-quick-drums/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Activetuts+ — Flash, Flex &amp;#038; ActionScript Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2fhka9tf2vaj2.cloudfront.net/tuts/394_microphoneGameCode/preview.jpg" alt="Create a Microphone-Controlled Flash Game: Code" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/create-a-microphone-controlled-flash-game-code/'&gt;Create a Microphone-Controlled Flash Game: Code&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this mini-series, we&amp;#8217;re creating a spaceship game where the main control is via the microphone: shout louder to make the ship fly higher. &lt;a href="http://active.tutsplus.com/tutorials/games/create-a-microphone-controlled-flash-game-design/" &gt;So far&lt;/a&gt;, we&amp;#8217;ve created all the required graphical elements for the game. Now, it&amp;#8217;s time to work on our code. We&amp;#8217;ve got a lot to do, so let&amp;#8217;s get started!&lt;span id="more-10562"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/create-a-microphone-controlled-flash-game-code/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2fhka9tf2vaj2.cloudfront.net/articles/084_whyBotherWithjQuery/why_bother_with_jquery.png" alt="Why Bother With jQuery? A Guide for (Former) Flash Developers" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/articles/explanatory/why-bother-with-jquery-a-guide-for-former-flash-developers/'&gt;Why Bother With jQuery? A Guide for (Former) Flash Developers&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you, like many Flash developers, are looking into using HTML5 for your web apps, you&amp;#8217;ll almost certainly have come across jQuery. It&amp;#8217;s a very popular JavaScript library, used by &lt;a href="http://trends.builtwith.com/javascript/JQuery" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','trends.builtwith.com']);" rel="external"&gt;a large percentage&lt;/a&gt; of the most visited websites &amp;#8211; but what&amp;#8217;s all the fuss about, and should you use it?&lt;span id="more-10723"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/articles/explanatory/why-bother-with-jquery-a-guide-for-former-flash-developers/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d2fhka9tf2vaj2.cloudfront.net/tuts/398_gamepadAPIIntro/gamepadAPI-preview.jpg" alt="An Introduction to the HTML5 Gamepad API" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/an-introduction-to-the-html5-gamepad-api/'&gt;An Introduction to the HTML5 Gamepad API&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;As HTML games begin to gradually increase in popularity, vendors are starting to introduce some exciting new APIs to make gaming that little bit sweeter for both us developers and our end players. One of these is the GamepadAPI, which allows you to connect your good old console gamepad into your computer and use it for browser based games, plug and play style. Let&amp;#8217;s dive in!&lt;span id="more-10686"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/an-introduction-to-the-html5-gamepad-api/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Wptuts+ — WordPress Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://wptutsplus.s3.amazonaws.com/159_RiseHTML5/html5.jpg" alt="The Rise of HTML5 in WordPress" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/articles/the-rise-of-html5-in-wordpress/'&gt;The Rise of HTML5 in WordPress&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;2011 was a big year for the advancement of HTML5 in the web development community. It became pretty widely adopted, especially for the mobile web. There have been major projects that help developers use HTML5, like Paul Irish&amp;#8217;s &lt;a href="http://html5boilerplate.com/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','html5boilerplate.com']);"&gt;HTML5 Boilerplate&lt;/a&gt; (technically 2010, but popularized in 2011) and books galore!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/articles/the-rise-of-html5-in-wordpress/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://wptutsplus.s3.amazonaws.com/131_MetaBoxPt1/metabox_0.jpg" alt="Reusable Custom Meta Boxes Part 3: Extra Fields" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-3-extra-fields/'&gt;Reusable Custom Meta Boxes Part 3: Extra Fields&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In &lt;a href="http://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-1-intro-and-basic-fields/" &gt;Part 1&lt;/a&gt; and &lt;a href="http://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-2-advanced-fields/" &gt;Part 2&lt;/a&gt; of our custom meta box template tutorial series, we learned how to create a field array to loop through and create a custom meta box with your standard fields. Now let&amp;#8217;s throw in a bit of JavaScript for some fancy, but highly useful fields.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/tutorials/reusable-custom-meta-boxes-part-3-extra-fields/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://wptutsplus.s3.amazonaws.com/167_ySlowTut/img/uwo.png" alt="The Ultimate Quickstart Guide to Speeding Up Your WordPress Site" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/tutorials/the-ultimate-quickstart-guide-to-speeding-up-your-wordpress-site/'&gt;The Ultimate Quickstart Guide to Speeding Up Your WordPress Site&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Give your site a boost! Implement crucial optimization techniques that will improve not only your &lt;strong&gt;&lt;a href="http://developer.yahoo.com/yslow/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','developer.yahoo.com']);"&gt;ySlow &lt;/a&gt;&lt;/strong&gt;score, but your Google rank too. In this tutorial we will cover all aspects of W3 caching, ySlow, Google page speed, CSS sprites &amp;#038; htaccess rules, to achieve a high ySlow score like i have done on &lt;a href="http://imattic.com/" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','imattic.com']);"&gt;my blog.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/tutorials/the-ultimate-quickstart-guide-to-speeding-up-your-wordpress-site/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;hr /&gt;
&lt;h2&gt;Mobiletuts+ — Mobile Development Tutorials&lt;/h2&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d339vfjsz5zott.cloudfront.net/iOS-SDK_Creating-A-Carousel/carousel.jpg" alt="iOS SDK: Creating an Awesome Carousel" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-creating-an-awesome-carousel/'&gt;iOS SDK: Creating an Awesome Carousel&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Engage your users with stunning carousels.  We&amp;#8217;ll look at how easy and clean it can be to implement scrollable, interactive carousels in your iOS applications.  With high configurability, you can have 3D, flat, rotating, and endless scrolling arrays for data, images, or buttons.&lt;br /&gt;
&lt;span id="more-9302"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-creating-an-awesome-carousel/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d339vfjsz5zott.cloudfront.net/PhoneGap-From-Scratch/phonegap.jpg" alt="PhoneGap From Scratch: Introduction" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/phonegap/phonegap-from-scratch/'&gt;PhoneGap From Scratch: Introduction&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Want to learn how to use PhoneGap, but don&amp;#8217;t know where to get started? Join us as we put together &amp;#8220;Sculder&amp;#8221;, not only a tribute to an excellent science fiction TV series, but a fully-fledged native mobile application for the believer in you!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/phonegap/phonegap-from-scratch/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="http://d339vfjsz5zott.cloudfront.net/Mobile-Flash-Is-Far-From-Dead/mobile-flash.png" alt="Mobile Flash is Far From Dead: Setting the Record Straight" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/?p=9436'&gt;Mobile Flash is Far From Dead: Setting the Record Straight&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In light of recent announcements from Adobe, there has been a lot of confusion over the state of the Flash Platform &amp;#8211; specifically in regard to Flash content on mobile devices. This article seeks to clarify many of the misconceptions that exist by addressing the main points of confusion around these announcements regardless of the initial, monumental, and absolutely unbelievable blunders from failed public (and private) relations messaging and general marketing surrounding these announcements.&lt;span id="more-9436"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/?p=9436'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Kyf7LySzY0WX3MyyeDoW0xH6Haw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kyf7LySzY0WX3MyyeDoW0xH6Haw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Kyf7LySzY0WX3MyyeDoW0xH6Haw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Kyf7LySzY0WX3MyyeDoW0xH6Haw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JtBVW0IlEaE:CeiJ0V3T4Gg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JtBVW0IlEaE:CeiJ0V3T4Gg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JtBVW0IlEaE:CeiJ0V3T4Gg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JtBVW0IlEaE:CeiJ0V3T4Gg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JtBVW0IlEaE:CeiJ0V3T4Gg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JtBVW0IlEaE:CeiJ0V3T4Gg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JtBVW0IlEaE:CeiJ0V3T4Gg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JtBVW0IlEaE:CeiJ0V3T4Gg:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/JtBVW0IlEaE" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/best-of-tuts-in-january-2012/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/best-of-tuts-in-january-2012/</feedburner:origLink></item>
		<item>
		<title>Learn jQuery in 30 Days</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/hI3XrFMnqw8/</link>
		<comments>http://net.tutsplus.com/articles/news/learn-jquery-in-30-days/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 04:47:14 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[News]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23901</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23901&amp;c=1710917988' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23901&amp;c=1710917988' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Sometimes, it&amp;#8217;s easy to become overwhelmed by how much there is to learn in this industry. If jQuery happens to be on your personal &amp;#8220;need to learn soon&amp;#8221; list, then I&amp;#8217;m happy to announce my new course: &lt;a href="http://learnjquery.tutsplus.com"&gt;&amp;#8220;Learn jQuery in 30 Days&amp;#8221;&lt;/a&gt;. If you&amp;#8217;ll give me fifteen minutes a day for the next month, I&amp;#8217;ll help you become a jQuery pro &amp;#8211; &lt;strong&gt;and it&amp;#8217;s free!&lt;/strong&gt;&lt;span id="more-23901"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; How Does it Work? &lt;/h2&gt;
&lt;div class="tutorial_image"&gt;
&lt;a href="http://learnjquery.tutsplus.com"&gt;&lt;img src="http://tutsplus.s3.amazonaws.com/tutspremium/courses_$folder$/30DaysJquery/images/learnjQuerySite.jpg" alt="Learn jQuery"&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;blockquote class=pullquote&gt;
&lt;p&gt;Sporadically, your skills will be put to the test, when you take the interactive quizzes! &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Once you &lt;a href="http://learnjquery.tutsplus.com"&gt;enroll (free) via email&lt;/a&gt;, each day, you&amp;#8217;ll receive a 10-15 minute video lesson. As you might expect, every episode will build upon the one it proceeds, and, sporadically, your skills will be put to the test, when you take the interactive quizzes! &lt;/p&gt;
&lt;p&gt;Along the way, you&amp;#8217;ll learn the essentials (querying and manipulating the DOM), while incrementally working your way up to more advanced topics, such as jQuery&amp;#8217;s AJAX methods and plugin development. &lt;/p&gt;
&lt;p&gt;I worked particularly hard to make the process of picking up this new skill as easy as possible for everyone &amp;#8211; even if you have very, very little JavaScript experience. So&amp;#8230;&lt;a href="http://learnjquery.tutsplus.com"&gt;do you want to join me?&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/Z0fTBWQu9jX1kiNRNYPLuRt7aek/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z0fTBWQu9jX1kiNRNYPLuRt7aek/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/Z0fTBWQu9jX1kiNRNYPLuRt7aek/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z0fTBWQu9jX1kiNRNYPLuRt7aek/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hI3XrFMnqw8:9H-58M5y3RI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hI3XrFMnqw8:9H-58M5y3RI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hI3XrFMnqw8:9H-58M5y3RI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hI3XrFMnqw8:9H-58M5y3RI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hI3XrFMnqw8:9H-58M5y3RI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hI3XrFMnqw8:9H-58M5y3RI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=hI3XrFMnqw8:9H-58M5y3RI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=hI3XrFMnqw8:9H-58M5y3RI:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/hI3XrFMnqw8" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/learn-jquery-in-30-days/feed/</wfw:commentRss>
		<slash:comments>116</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/learn-jquery-in-30-days/</feedburner:origLink></item>
		<item>
		<title>Recently in Web Development (January ’12 Edition)</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/CZhjBpTuRuM/</link>
		<comments>http://net.tutsplus.com/articles/news/recently-in-web-development-january-12-edition/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 20:37:02 +0000</pubDate>
		<dc:creator>Siddharth</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[community links]]></category>
		<category><![CDATA[release]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23889</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23889&amp;c=66833421' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23889&amp;c=66833421' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Web development is an industry that&amp;#8217;s in a state of constant flux with technologies and jargon changing and mutating in an endless cycle. Not to mention the sheer deluge of information one has to process everyday.&lt;/p&gt;
&lt;p&gt;In this series, published monthly, we&amp;#8217;ll seek to rectify this by bringing you all the important news, announcements, releases and interesting discussions within the web development industry in a concise package. Join me after the jump for an extra dose of community content this month!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23889"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;hr style="clear: both;"/&gt;News and Releases&lt;/h2&gt;
&lt;p&gt;All of the important news in a single place: releases, announcements, companies bickering, security issues and all related hoopla.&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/html.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;&amp;#8216;HTML5 Please&amp;#8217; Helps Devs Make Informed Decisions&lt;/h3&gt;
&lt;p&gt;HTML5 is a beast of a spec with no one &lt;em&gt;truly&lt;/em&gt; knowing everything there is to know. This shiny new site gives you all the information you need to use HTML5 features on your site, right now.&lt;/p&gt;
&lt;p&gt;The site provides you with recommendations as to whether you should be using that specific facet of HTML5 right now and provides you with helpful links to polyfills, when necessary. Time saver!&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://html5please.us/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/enyo.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;HP Open Sources Enyo&lt;/h3&gt;
&lt;p&gt;Enyo is the engine that powers webOS. But what exactly is Enyo, you ask? Well, it&amp;#8217;s a spiffy JavaScript framework that helps you build better performing, easier to maintain application.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure you&amp;#8217;ve heard this plenty of times before so why don&amp;#8217;t you check out the link below to find out for yourself?&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://enyojs.com/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1112_riwd7/sopa.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Tech Giants Protest SOPA&lt;/h3&gt;
&lt;p&gt;Last month saw a figurative deluge of protests against SOPA. If you have no idea what SOPA is, hit the link below to find out.&lt;/p&gt;
&lt;p&gt;While many services merely blackened out their logo, many others, including Wikipedia and Reddit, went the extra length and completely blacked out their sites. The proposed bill has been shelved but I predict that we&amp;#8217;ll see another in a different skin soon&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://en.wikipedia.org/wiki/SOPA" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/vim.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Vim on a Tablet? Yes, Please!&lt;/h3&gt;
&lt;p&gt;I understand not everyone uses a tablet but the number is growing, quite rapidly. Wouldn&amp;#8217;t it be great to SSH into your server to fix that pesky bug? Get a proper laptop, you say? I&amp;#8217;m going to ask you to shush for now and go with the flow.&lt;/p&gt;
&lt;p&gt;This month saw the release of Vim for the iOS platform. And no, it&amp;#8217;s not a gimped version. From a quick run through, it seems that all the nice bits are still in there. If you&amp;#8217;re in the intersection between developers and iPad users, let us know in the comments below as to whether it fits your needs.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://applidium.com/en/applications/vim/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/ctr.jpg" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Cut the Rope Ported to the Browser&lt;/h3&gt;
&lt;p&gt;I&amp;#8217;m sure a lot of you have played this ridiculously cute &amp;#8216;aww&amp;#8217; inducing game. What brings the game to our list is the fact that it has been ported to the browser by the newly cool Internet Explorer team. &lt;/p&gt;
&lt;p&gt;And true to their current vision, they&amp;#8217;ve ported it using JavaScript and the magic of HTML5. The link below leads you to a write up about the game development instead of the game itself to protect your productivity.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://www.cuttherope.ie/dev/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1002_riwd1/rails.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;The Rails Tutorial, Version Two, Inches Towards Completion&lt;/h3&gt;
&lt;p&gt;&amp;#8216;The&amp;#8217; Rails tutorial? Indeed it is! Michael Hartl&amp;#8217;s &lt;em&gt;free&lt;/em&gt; has helped many learn the voodoo that is Rails and Michael is slowly updating his ebook for Ruby 1.9 and Rails 3.2&lt;/p&gt;
&lt;p&gt;Thus far, six chapters are out with a chapter expected every week in the future. Make sure to check the site out! &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://news.railstutorial.org/ruby-on-rails-tutorial-second-edition-updated" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/st2.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Sublime Text 2 Piles on More Features with New Beta&lt;/h3&gt;
&lt;p&gt;Sublime Text 2 is a grand piece of work and every build only reaffirms this. This new build introduces a ton of features including auto complete, performance improvements, a new UI theme and a ton more.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://www.sublimetext.com/blog/articles/sublime-text-2-build-2165" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;hr style="clear: both;"/&gt;New Kids on the Block&lt;/h2&gt;
&lt;p&gt;As web developers, the sheer amount of resources we can tap into increases exponentially with time. Here is just a quick look at some recently created resources that deserve your attention &amp;#8212; everything from new books to scripts and frameworks.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;wrap.js&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;My wrap.js plugin handles the nested require based on a config, and takes it to the next level by generating an actual AMD module for you during the build. So now you don’t have to write wrappers around scripts that you wish were modules, wrap.js does that for you. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/geddesign/wrap.js" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Resumable.js&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;Resumables is a JavaScript library providing multiple simultaneous, stable and resumable uploads via the HTML5 File API.&lt;br /&gt;
The library is designed to introduce fault-tolerance into the upload of large files through HTTP. This is done by splitting each files into small chunks; whenever the upload of a chunk fails, uploading is retried until the procedure completes.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/23/resumable.js" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;IcedCoffeeScript&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;IcedCoffeeScript is a fork of CoffeeScript. It is superset of the CoffeeScript language. The iced interpreter is a drop-in replacement for the standard coffee interpreter since it will interpret all existing CoffeeScript programs. IcedCoffeeScript (ICS) adds two new keywords: await and defer. These additions simply and powerfully streamline asynchronous control flow, both on the server and on the browser. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://maxtaco.github.com/coffee-script/" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Banking.js&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt; Banking.JS retrieves all of your bank transactions similiar to how quickbooks does it. There is no need to depend on or pay for third party services. The bank statement results are in JSON or Valid XML and supports all financial institutions.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/euforic/banking.js" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Roy&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;Roy is a small functional language that compiles to JavaScript. The main features include whitespace significant syntax, compile-time meta-programming, structural typing and monad syntax&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/pufuwozu/roy" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;jsgif&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;jsgif an animated GIF player bookmarklet with support for pausing, going frame-by-frame, playing in reverse, and other features that one might expect from a video player. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/shachaf/jsgif" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;zip.js&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;zip.js offers a low-level API for writing and reading large zip files (up to 4GB) with a stable RAM use. It also offers a Filesystem API in order to manipulate zip file structure.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://gildas-lormeau.github.com/zip.js/" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;Seriously.js&lt;/h3&gt;
&lt;blockquote&gt;&lt;p&gt;Seriously.js is a real-time, node-based video compositor for the web. Inspired by professional software such as After Effects and Nuke, Seriously.js renders high-quality video effects, but allows them to be dynamic and interactive.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/brianchirls/Seriously.js" &gt;Github Repo&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;hr style="clear: both;"/&gt;Best of the Internet&lt;/h2&gt;
&lt;p&gt;Often, you&amp;#8217;re not really looking for a tutorial as much as you&amp;#8217;re looking for a rant, an opinion or the musings of a tired developer or just something cool with absolutely zero real world use. This sections contains links to precisely those &amp;#8212; interesting and cool stuff from the developer community. &lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/749_WebHostFeatures/preview.jpg" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;The Five Stages of Hosting&lt;/h3&gt;
&lt;p&gt;Five common options for hosting a web business, ranked in decreasing order of &amp;#8216;cloudiness&amp;#8217;. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://blog.pinboard.in/2012/01/the_five_stages_of_hosting/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/913_jsDevs/yehuda_katz.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;JavaScript Needs Blocks&lt;/h3&gt;
&lt;p&gt;Yehuda Katz talks about why he wants to see block lambdas in JavaScript. It&amp;#8217;s a bit technical but well worth a read. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://yehudakatz.com/2012/01/10/javascript-needs-blocks/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1002_riwd1/ror.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;How I Learned Enough Ruby On Rails In 12 Weeks To Launch Freelancify&lt;/h3&gt;
&lt;p&gt;A Non-Developer explains how&amp;#8230; I think you know already. Just click the darn link and move on.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://www.webstartup.me/learned-ruby-rails-12-weeks-launch-freelancify" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1096_riwd6/cfn.gif" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Why are software development task estimations regularly off by a factor of 2-3?&lt;/h3&gt;
&lt;p&gt;Is it the developer&amp;#8217;s fault? Is it a management issue? Bad methodology, or lack thereof? Or is it ingrained in the nature of the process?&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://www.quora.com/Engineering-Management/Why-are-software-development-task-estimations-regularly-off-by-a-factor-of-2-3" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/wat.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Explanation for the &amp;#8216;Wat&amp;#8217; Talk &amp;#8211; CodeMash 2012&lt;/h3&gt;
&lt;p&gt;This StackOverflow question, along with the well written answers below, explore the code that was demonstrated in the talk mentioned in the title. Provides a quick look at the quirkier portions of JavaScript. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://stackoverflow.com/questions/9032856/can-anyone-explain-these-bizarre-javascript-behaviours-mentioned-in-the-wat-ta" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/db.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Why are column oriented databases so much faster than row oriented databases?&lt;/h3&gt;
&lt;p&gt;A quick little read that explains why, and how, different databases perform differently. There isn&amp;#8217;t much jargon there and gets the point quite clearly. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://siganakis.com/using-bitmap-indexes-in-query-processing" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/734_oop/200x200.jpg" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;PHP Mind Love&lt;/h3&gt;
&lt;p&gt;The link below points to some PHP code. Figure out what the output is and you get a cookie!&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="https://github.com/TheFox/JaPHPh/blob/master/japhph.php" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1096_riwd6/2d.jpg" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Testing Socket.IO With Mocha, Should.js and Socket.IO Client&lt;/h3&gt;
&lt;p&gt;A clean writeup that details how the author got all the named technologies working together. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://liamkaufman.com/blog/2012/01/28/testing-socketio-with-mocha-should-and-socketio-client/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1019_riwd2/js.jpg" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;What is the difference between semicolons in JavaScript and in Python?&lt;/h3&gt;
&lt;p&gt;Ever had to think about the question above? How exactly do they each handle semicolons and newlines? Read up below.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://stackoverflow.com/questions/7219541/what-is-the-difference-between-semicolons-in-javascript-and-in-python" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/dj.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;The Programming Djinn&lt;/h3&gt;
&lt;p&gt;The Least Boring Programming Book teaches Ruby programming to beginners in an unconventional way. &lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://ethanfast.com/2012/01/the-least-boring-programming-book-chapter-1-excerpt/" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;div style="float:left; margin-right:20px; margin-top: 25px; padding: 5px; border: 1px solid #E8E8E8; "&gt;&lt;img alt="Nettuts image" src="http://d2o0t5hpnwv4c1.cloudfront.net/1130_riwd8/hg.png" width="250" /&gt;&lt;/div&gt;
&lt;h3&gt;Non-Canvas Wizardry&lt;/h3&gt;
&lt;p&gt;I don&amp;#8217;t really have much context to go on here so just give the link below a click. Pretty smooth stuff for something that&amp;#8217;s not canvas or Flash based.&lt;/p&gt;
&lt;p&gt;&lt;a style="display: block; text-align: right" style="display: block; text-align: right" href="http://scorcher.de/palette/palette.html?fps=10&amp;#038;colors=500&amp;#038;pixels=30&amp;#038;container=680" &gt;Read more&lt;/a&gt;&lt;/p&gt;
&lt;div style="clear: both;"&gt;&lt;/div&gt;
&lt;h2&gt;
&lt;hr style="clear: both;"/&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Well, that&amp;#8217;s about all the major changes that happened in our industry lately. &lt;/p&gt;
&lt;p&gt;Do you want us to cover more standard news? A focus on upcoming scripts maybe? Or just more interesting posts and discussions from the community? Let us know in the comments and thank you so much for reading! &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/O5-Urm1UT84U2DdDzY29Cj64tv4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O5-Urm1UT84U2DdDzY29Cj64tv4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/O5-Urm1UT84U2DdDzY29Cj64tv4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/O5-Urm1UT84U2DdDzY29Cj64tv4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=CZhjBpTuRuM:8hIim0ry3ZU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=CZhjBpTuRuM:8hIim0ry3ZU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=CZhjBpTuRuM:8hIim0ry3ZU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=CZhjBpTuRuM:8hIim0ry3ZU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=CZhjBpTuRuM:8hIim0ry3ZU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=CZhjBpTuRuM:8hIim0ry3ZU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=CZhjBpTuRuM:8hIim0ry3ZU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=CZhjBpTuRuM:8hIim0ry3ZU:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/CZhjBpTuRuM" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/recently-in-web-development-january-12-edition/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/recently-in-web-development-january-12-edition/</feedburner:origLink></item>
		<item>
		<title>Writing an API Wrapper in Ruby with TDD</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/UkklRP6FQRY/</link>
		<comments>http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 23:18:32 +0000</pubDate>
		<dc:creator>Claudio Ortolina</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[TDD]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23875</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23875&amp;c=202183550' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23875&amp;c=202183550' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Sooner or later, all developers are required to interact with an API. The most difficult part is always related to reliably testing the code we write, and, as we want to make sure that everything works properly, we continuosly run code that queries the API itself. This process is slow and inefficient, as we can experience network issues and data inconsistencies (the API results may change). Let&amp;#8217;s review how we can avoid all of this effort with Ruby.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23875"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Our Goal&lt;/h2&gt;
&lt;blockquote class="pullquote pqRight"&gt;
&lt;p&gt;&amp;#8220;Flow is essential: write the tests, run them and see them fail, then write the minimal implementation code to make them pass. Once they all do, refactor if needed.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Our goal is simple: write a small wrapper around the &lt;a href="http://dribbble.com/api"&gt;Dribbble API&lt;/a&gt; to retrieve information about a user (called &amp;#8216;player&amp;#8217; in the Dribbble world).&lt;br /&gt;
As we will be using Ruby, we will also follow a TDD approach: if you&amp;#8217;re not familiar with this technique, Nettuts+ has a &lt;a href="http://net.tutsplus.com/tutorials/ruby/ruby-for-newbies-testing-with-rspec/"&gt;good primer on RSpec&lt;/a&gt; you can read. In a nutshell, we will write tests before writing our code implementation, making it easier to spot bugs and to achieve a high code quality. Flow is essential: write the tests, run them and see them fail, then write the minimal implementation code to make them pass. Once they all do, refactor if needed.&lt;/p&gt;
&lt;h3&gt;The API&lt;/h3&gt;
&lt;p&gt;The Dribbble API is fairly straightforward. At the time of this   it supports only GET requests and doesn&amp;#8217;t require authentication: an ideal candidate for our tutorial. Moreover, it offers a 60 calls per minute limit, a restriction that perfectly shows why working with APIs require a smart approach.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Key Concepts&lt;/h2&gt;
&lt;p&gt;This tutorial needs to assume that you have some familiarity with testing concepts: fixtures, mocks, expectations. Testing is an important topic (especially in the Ruby community) and even if you are not a Rubyist,  I&amp;#8217;d encourage you to dig deeper into the matter and to search for equivalent tools for your everyday language. You may want to read &lt;a href="http://pragprog.com/book/achbd/the-rspec-book"&gt;&amp;#8220;The RSpec book&amp;#8221; by David Chelimsky et al.&lt;/a&gt;, an excellent primer on Behavior Driven Development. &lt;/p&gt;
&lt;p&gt;To summarize here, here are three key concepts you must know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mock&lt;/strong&gt;: also called double, a mock is &amp;#8220;an object that stands in for another object in an example&amp;#8221;. This means that if we want to test the interaction between an object and another, we can mock the second one. In this tutorial, we will mock the Dribbble API, as to test our code we don&amp;#8217;t need the API, itself, but something that behaves like it and exposes the same interface.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixture&lt;/strong&gt;: a dataset that recreates a specific state in the system. A fixture can be used to create the needed data to test a piece of logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expectation&lt;/strong&gt;: a test example written the from the point of view of the result we want to achieve.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Our Tools&lt;/h2&gt;
&lt;blockquote class="pullquote pqRight"&gt;
&lt;p&gt;&amp;#8220;As a general practice, run tests every time you update them.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/bblimke/webmock"&gt;WebMock&lt;/a&gt; is a Ruby mocking library that is used to mock (or stub) http requests. In other words, it allows you to simulate any HTTP request without actually making one. The primary advantage to this is being able to develop and test against any HTTP service without needing the service itself and without incurring in related issues (like API limits, IP restrictions and such).&lt;br /&gt;
&lt;a href="https://github.com/myronmarston/vcr"&gt;VCR&lt;/a&gt; is a complementary tool that records any real http request and creates a fixture, a file that contains all the needed data to replicate that request without performing it again. We will configure it to use WebMock to do that. In other words, our tests will interact with the real Dribbble API just once: after that, WebMock will stub all the requests thanks to the data recorded by VCR. We will have a perfect replica of the Dribbble API responses recorded locally. In addition, WebMock will let us test edge cases (like the request timing out) easily and consistently. A wonderful consequence of our setup is that everything will be extremely fast.&lt;/p&gt;
&lt;p&gt;
As for unit testing, we will be using &lt;a href="https://github.com/seattlerb/minitest"&gt;Minitest&lt;/a&gt;. It&amp;#8217;s a fast and simple unit testing library that also supports expectations in the RSpec fashion. It offers a  smaller feature set, but I find that this actually encourages and pushes you to separate your logic into small, testable methods. Minitest is part of Ruby 1.9, so if you&amp;#8217;re using it (I hope so) you don&amp;#8217;t need to install it. On Ruby 1.8, it&amp;#8217;s only a matter of &lt;code&gt;gem install minitest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;
I will be using Ruby 1.9.3: if you don&amp;#8217;t, you will probably encounter some issues related to &lt;code&gt;require_relative&lt;/code&gt;, but I&amp;#8217;ve included fallback code in a comment right below it. As a general practice, you should run tests every time you update them, even if I won&amp;#8217;t be mentioning this step explicitly throughout the tutorial.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Setup&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;
  &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1129_api_wrapper_tdd/images/01_setup.jpg" alt="Setup"&gt;
&lt;/div&gt;
&lt;p&gt;We will use the conventional &lt;code&gt;/lib&lt;/code&gt; and &lt;code&gt;/spec&lt;/code&gt; folder structure to organize our code. As for the name of our library, we&amp;#8217;ll call it &lt;b&gt;Dish&lt;/b&gt;, following the Dribbble convention of using basketball related terms.&lt;/p&gt;
&lt;p&gt;The Gemfile will contain all our dependencies, albeit they&amp;#8217;re quite small.&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
source :rubygems

gem 'httparty'

group :test do
  gem 'webmock'
  gem 'vcr'
  gem 'turn'
  gem 'rake'
end
&lt;/pre&gt;
&lt;p&gt;&lt;a href="https://github.com/jnunemaker/httparty"&gt;Httparty&lt;/a&gt; is an easy to use gem to handle HTTP requests; it will be the core of our library. In the test group, we will also add &lt;a href="https://github.com/TwP/turn"&gt;Turn&lt;/a&gt; to change the output of our tests to be more descriptive and to support color.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;/lib&lt;/code&gt; and &lt;code&gt;/spec&lt;/code&gt; folders have a symmetrical structure: for every file contained in the &lt;code&gt;/lib/dish&lt;/code&gt; folder, there should be a file inside &lt;code&gt;/spec/dish&lt;/code&gt; with the same name and the &amp;#8216;_spec&amp;#8217; suffix.&lt;/p&gt;
&lt;p&gt;
Let&amp;#8217;s start by creating a &lt;code&gt;/lib/dish.rb&lt;/code&gt; file and add the following code:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
require &amp;quot;httparty&amp;quot;
Dir[File.dirname(__FILE__) + '/dish/*.rb'].each do |file|
  require file
end
&lt;/pre&gt;
&lt;p&gt;It doesn&amp;#8217;t do much: it requires &amp;#8216;httparty&amp;#8217; and then iterates over every &lt;code&gt;.rb&lt;/code&gt; file inside &lt;code&gt;/lib/dish&lt;/code&gt; to require it. With this file in place, we will be able to add any functionality inside separate files in &lt;code&gt;/lib/dish&lt;/code&gt; and have it automatically loaded just by requiring this single file.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s move to the &lt;code&gt;/spec&lt;/code&gt; folder. Here&amp;#8217;s the content of the &lt;code&gt;spec_helper.rb&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
#we need the actual library file
require_relative '../lib/dish'
# For Ruby &amp;lt; 1.9.3, use this instead of require_relative
# require(File.expand_path('../../lib/dish', __FILE__))

#dependencies
require 'minitest/autorun'
require 'webmock/minitest'
require 'vcr'
require 'turn'

Turn.config do |c|
 # :outline  - turn's original case/test outline mode [default]
 c.format  = :outline
 # turn on invoke/execute tracing, enable full backtrace
 c.trace   = true
 # use humanized test names (works only with :outline format)
 c.natural = true
end

#VCR config
VCR.config do |c|
  c.cassette_library_dir = 'spec/fixtures/dish_cassettes'
  c.stub_with :webmock
end
&lt;/pre&gt;
&lt;p&gt;There&amp;#8217;s quite a few things here worth noting, so let&amp;#8217;s break it piece by piece:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At first, we require the main lib file for our app, making the code we want to test available to the test suite. The &lt;code&gt;require_relative&lt;/code&gt; statement is a Ruby 1.9.3 addition.
&lt;li&gt;We then require all the library dependencies: &lt;code&gt;minitest/autorun&lt;/code&gt; includes all the expectations we will be using, &lt;code&gt;webmock/minitest&lt;/code&gt; adds the needed bindings between the two libraries, while &lt;code&gt;vcr&lt;/code&gt; and &lt;code&gt;turn&lt;/code&gt; are pretty self-explanatory.
&lt;li&gt; The Turn config block merely needs to tweak our test output. We will use the outline format, where we can see the description of our specs.
&lt;li&gt;The VCR config blocks tells VCR to store the requests into a fixture folder (note the relative path) and to use WebMock as a stubbing library (VCR supports some other ones).&lt;/p&gt;
&lt;/ul&gt;
&lt;p&gt;Last, but not least, the &lt;code&gt;Rakefile&lt;/code&gt; that contains some support code:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
require 'rake/testtask'

Rake::TestTask.new do |t|
  t.test_files = FileList['spec/lib/dish/*_spec.rb']
  t.verbose = true
end

task :default =&amp;gt; :test
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;rake/testtask&lt;/code&gt; library includes a &lt;code&gt;TestTask&lt;/code&gt; class that is useful to set the location of our test files. From now on, to run our specs, we will only type &lt;code&gt;rake&lt;/code&gt; from the library root directory.&lt;/p&gt;
&lt;p&gt;As a way to test our configuration, let&amp;#8217;s add the following code to &lt;code&gt;/lib/dish/player.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
module Dish
  class Player
  end
end
&lt;/pre&gt;
&lt;p&gt;Then &lt;code&gt;/spec/lib/dish/player_spec.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
require_relative '../../spec_helper'
# For Ruby &amp;lt; 1.9.3, use this instead of require_relative
# require (File.expand_path('./../../../spec_helper', __FILE__))

describe Dish::Player do

  it &amp;quot;must work&amp;quot; do
    &amp;quot;Yay!&amp;quot;.must_be_instance_of String
  end

end
&lt;/pre&gt;
&lt;p&gt;Running &lt;code&gt;rake&lt;/code&gt; should give you one test passing and no errors. This test is by no means useful for our project, yet it implicitly verifies that our library file structure is in place (the &lt;code&gt;describe&lt;/code&gt; block would throw an error if the &lt;code&gt;Dish::Player&lt;/code&gt; module was not loaded).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;First Specs&lt;/h2&gt;
&lt;p&gt;To work properly, Dish requires the Httparty modules and the correct &lt;code&gt;base_uri&lt;/code&gt;, i.e. the base url of the Dribbble API. Let&amp;#8217;s write the relevant tests for these requirements in &lt;code&gt;player_spec.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
describe Dish::Player do

  describe &amp;quot;default attributes&amp;quot; do

    it &amp;quot;must include httparty methods&amp;quot; do
      Dish::Player.must_include HTTParty
    end

    it &amp;quot;must have the base url set to the Dribble API endpoint&amp;quot; do
      Dish::Player.base_uri.must_equal 'http://api.dribbble.com'
    end

  end

end
&lt;/pre&gt;
&lt;p&gt;As you can see, Minitest expectations are self-explanatory, especially if you are an RSpec user: the biggest difference is wording, where Minitest prefers &amp;#8220;must/wont&amp;#8221; to &amp;#8220;should/should_not&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Running these tests will show one error and one failure. To have them pass, let&amp;#8217;s add our first lines of implementation code to &lt;code&gt;player.rb&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
module Dish

  class Player

    include HTTParty

    base_uri 'http://api.dribbble.com'

  end

end
&lt;/pre&gt;
&lt;p&gt;Running &lt;code&gt;rake&lt;/code&gt; again should show the two specs passing. Now our &lt;code&gt;Player&lt;/code&gt; class has access to all Httparty class methods, like &lt;code&gt;get&lt;/code&gt; or &lt;code&gt;post&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Recording our First Request&lt;/h2&gt;
&lt;p&gt;As we will be working on the &lt;code&gt;Player&lt;/code&gt; class, we will need to have API data for a player. The Dribbble API documentation page shows that the endpoint to get data about a specific player is &lt;code&gt;http://api.dribbble.com/players/:id&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;As in typical Rails fashion, &lt;code&gt;:id&lt;/code&gt; is either the &lt;em&gt;id&lt;/em&gt; or the &lt;em&gt;username&lt;/em&gt; of a specific player. We will be using &lt;code&gt;simplebits&lt;/code&gt;, the username of Dan Cederholm, one of the Dribbble founders.&lt;/p&gt;
&lt;p&gt;To record the request with VCR, let&amp;#8217;s update our &lt;code&gt;player_spec.rb&lt;/code&gt; file by adding the following &lt;code&gt;describe&lt;/code&gt; block to the spec, right after the first one:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
  ...

  describe &amp;quot;GET profile&amp;quot; do

  before do
    VCR.insert_cassette 'player', :record =&amp;gt; :new_episodes
  end

  after do
    VCR.eject_cassette
  end

  it &amp;quot;records the fixture&amp;quot; do
    Dish::Player.get('/players/simplebits')
  end

  end

end
&lt;/pre&gt;
&lt;blockquote class="pullquote pqRight"&gt;
&lt;p&gt;After running &lt;code&gt;rake&lt;/code&gt;, you can verify that the fixture has been created. From now on, all our tests will be completely network independent.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;code&gt;before&lt;/code&gt; block is used to execute a specific portion of code before every expectation: we use it to add the VCR macro used to record a fixture that we will call &amp;#8216;player&amp;#8217;. This will create a &lt;code&gt;player.yml&lt;/code&gt; file under &lt;code&gt;spec/fixtures/dish_cassettes&lt;/code&gt;. The &lt;code&gt;:record&lt;/code&gt; option is set to record all new requests once and replay them on every subsequent, identical request. As a proof of concept, we can add a spec whose only aim is to record a fixture for simplebits&amp;#8217;s profile. The &lt;code&gt;after&lt;/code&gt; directive tells VCR to remove the cassette after the tests, making sure that everything is properly isolated. The &lt;code&gt;get&lt;/code&gt; method on the &lt;code&gt;Player&lt;/code&gt; class is made available, thanks to the inclusion of the &lt;code&gt;Httparty&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;After running &lt;code&gt;rake&lt;/code&gt;, you can verify that the fixture has been created. From now on, all our tests will be completely network independent.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Getting the Player Profile&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1129_api_wrapper_tdd/images/02_dribbble.jpg" alt="Dribbble"&gt;&lt;/div&gt;
&lt;p&gt;Every Dribbble user has a profile that contains a pretty extensive amount of data. Let&amp;#8217;s think about how we would like our library to be when actually used: this is a useful way to flesh out our DSL will work. Here&amp;#8217;s what we want to achieve:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
simplebits = Dish::Player.new('simplebits')
simplebits.profile
  =&amp;gt; #returns a hash with all the data from the API
simplebits.username
  =&amp;gt; 'simplebits'
simplebits.id
  =&amp;gt; 1
simplebits.shots_count
  =&amp;gt; 157
&lt;/pre&gt;
&lt;p&gt;Simple and effective: we want to instantiate a Player by using its username and then get access to its data by calling methods on the instance that map to the attributes returned by the API. We need to be consistent with the API itself.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s tackle one thing at a time and write some tests related to getting the player data from the API. We can modify our &lt;code&gt;"GET profile"&lt;/code&gt; block to have:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
describe &amp;quot;GET profile&amp;quot; do

  let(:player) { Dish::Player.new }

  before do
    VCR.insert_cassette 'player', :record =&amp;gt; :new_episodes
  end

  after do
    VCR.eject_cassette
  end

  it &amp;quot;must have a profile method&amp;quot; do
    player.must_respond_to :profile
  end

  it &amp;quot;must parse the api response from JSON to Hash&amp;quot; do
    player.profile.must_be_instance_of Hash
  end

  it &amp;quot;must perform the request and get the data&amp;quot; do
    player.profile[&amp;quot;username&amp;quot;].must_equal 'simplebits'
  end

end
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;let&lt;/code&gt; directive at the top creates a &lt;code&gt;Dish::Player&lt;/code&gt; instance available in the expectations. Next, we want to make sure that our player has got a profile method whose value is a hash representing the data from the API. As a last step, we test a sample key (the username) to make sure that we actually perform the request.&lt;/p&gt;
&lt;p&gt;
Note that we&amp;#8217;re not yet handling how to set the username, as this is a further step. The minimal implementation required is the following:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
class Player

  include HTTParty

  base_uri 'http://api.dribbble.com'

  def profile
    self.class.get '/players/simplebits'
  end

end
...
&lt;/pre&gt;
&lt;p&gt;A very little amount of code: we&amp;#8217;re just wrapping a get call in the &lt;code&gt;profile&lt;/code&gt; method. We then pass the hardcoded path to retrieve simplebits&amp;#8217;s data, data that we had already stored thanks to VCR.&lt;/p&gt;
&lt;p&gt;All our tests should be passing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Setting the Username&lt;/h2&gt;
&lt;p&gt;Now that we have a working profile function, we can take care of the username. Here are the relevant specs:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
describe &amp;quot;default instance attributes&amp;quot; do

  let(:player) { Dish::Player.new('simplebits') }

  it &amp;quot;must have an id attribute&amp;quot; do
    player.must_respond_to :username
  end

  it &amp;quot;must have the right id&amp;quot; do
    player.username.must_equal 'simplebits'
  end

end

describe &amp;quot;GET profile&amp;quot; do

  let(:player) { Dish::Player.new('simplebits') }

  before do
    VCR.insert_cassette 'base', :record =&amp;gt; :new_episodes
  end

  after do
    VCR.eject_cassette
  end

  it &amp;quot;must have a profile method&amp;quot; do
    player.must_respond_to :profile
  end

  it &amp;quot;must parse the api response from JSON to Hash&amp;quot; do
    player.profile.must_be_instance_of Hash
  end

  it &amp;quot;must get the right profile&amp;quot; do
    player.profile[&amp;quot;username&amp;quot;].must_equal &amp;quot;simplebits&amp;quot;
  end

end
&lt;/pre&gt;
&lt;p&gt;We&amp;#8217;ve added a new describe block to check the username we&amp;#8217;re going to add and simply amended the &lt;code&gt;player&lt;/code&gt; initialization in the &lt;code&gt;GET profile&lt;/code&gt; block to reflect the DSL we want to have. Running the specs now will reveal many errors, as our &lt;code&gt;Player&lt;/code&gt; class doesn&amp;#8217;t accept arguments when initialized (for now).&lt;/p&gt;
&lt;p&gt;Implementation is very straightforward:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
class Player

  attr_accessor :username

  include HTTParty

  base_uri 'http://api.dribbble.com'

  def initialize(username)
    self.username = username
  end

  def profile
    self.class.get &amp;quot;/players/#{self.username}&amp;quot;
  end

end
...
&lt;/pre&gt;
&lt;p&gt;The initialize method gets a username that gets stored inside the class thanks to the &lt;code&gt;attr_accessor&lt;/code&gt; method added above. We then change the profile method to interpolate the username attribute.&lt;/p&gt;
&lt;p&gt;We should get all our tests passing once again.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Dynamic Attributes&lt;/h2&gt;
&lt;p&gt;At a basic level, our lib is in pretty good shape. As profile is a Hash, we could stop here and already use it by passing the key of the attribute we want to get the value for. Our goal, however, is to create an easy to use DSL that has a method for each attribute.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s think about what we need to achieve. Let&amp;#8217;s assume we have a player instance and stub how it would work:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
player.username
  =&amp;gt; 'simplebits'
player.shots_count
  =&amp;gt; 157
player.foo_attribute
  =&amp;gt; NoMethodError
&lt;/pre&gt;
&lt;p&gt;Let&amp;#8217;s translate this into specs and add them to the &lt;code&gt;GET profile&lt;/code&gt; block:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
describe &amp;quot;dynamic attributes&amp;quot; do

  before do
    player.profile
  end

  it &amp;quot;must return the attribute value if present in profile&amp;quot; do
    player.id.must_equal 1
  end

  it &amp;quot;must raise method missing if attribute is not present&amp;quot; do
    lambda { player.foo_attribute }.must_raise NoMethodError
  end

end
...
&lt;/pre&gt;
&lt;p&gt;We already have a spec for username, so we don&amp;#8217;t need to add another one. Note a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;we explicitly call &lt;code&gt;player.profile&lt;/code&gt; in a before block, otherwise it will be nil when we try to get the attribute value.&lt;/li&gt;
&lt;li&gt;to test that &lt;code&gt;foo_attribute&lt;/code&gt; raises an exception, we need to wrap it in a lambda and check that it raises the expected error.&lt;/li&gt;
&lt;li&gt;we test that &lt;code&gt;id&lt;/code&gt; equals &lt;code&gt;1&lt;/code&gt;, as we know that that is the expected value (this is a purely data-dependent test).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Implementation-wise, we could define a series of methods to access the &lt;code&gt;profile&lt;/code&gt; hash, yet this would create a lot of duplicated logic. Moreover, the would rely on the API result to always have the same keys.&lt;/p&gt;
&lt;blockquote class="pullquote pqLeft"&gt;
&lt;p&gt;&amp;#8220;We will rely on &lt;code&gt;method_missing&lt;/code&gt; to handle this cases and &amp;#8216;generate&amp;#8217; all those methods on the fly.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Instead, we will rely on &lt;code&gt;method_missing&lt;/code&gt; to handle this cases and &amp;#8216;generate&amp;#8217; all those methods on the fly. But what does this mean? Without going into too much metaprogramming, we can simply say that every time we call a method not present on the object, Ruby raises a &lt;code&gt;NoMethodError&lt;/code&gt; by using &lt;code&gt;method_missing&lt;/code&gt;. By redefining this very method inside a class, we can modify its behaviour.&lt;/p&gt;
&lt;p&gt;In our case, we will intercept the &lt;code&gt;method_missing&lt;/code&gt; call, verify that the method name that has been called is a key in the profile hash and in case of positive result, return the hash value for that key. If not, we will call &lt;code&gt;super&lt;/code&gt; to raise a standard &lt;code&gt;NoMethodError&lt;/code&gt;: this is needed to make sure that our library behaves exactly the way any other library would do. In other words, we want to guarantee the least possible surprise.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s add the following code to the &lt;code&gt;Player&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
def method_missing(name, *args, &amp;amp;block)
  if profile.has_key?(name.to_s)
    profile[name.to_s]
  else
    super
  end
end
&lt;/pre&gt;
&lt;p&gt;The code does exactly what described above. If you now run the specs, you should have them all pass. I&amp;#8217;d encorage you to add some more to the spec files for some other attribute, like &lt;code&gt;shots_count&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This implementation, however, is not really idiomatic Ruby. It works, but it can be streamlined into a ternary operator, a condensed form of an if-else conditional. It can be rewritten as:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
def method_missing(name, *args, &amp;amp;block)
  profile.has_key?(name.to_s) ? profile[name.to_s] : super
end
&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s not just a matter of length, but also a matter of consistency and shared conventions between developers. Browsing source code of Ruby gems and libraries is a good way to get accustomed to these conventions.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Caching&lt;/h2&gt;
&lt;p&gt;As a final step, we want to make sure that our library is efficient. It should not make any more requests than needed and possibly cache data internally. Once again, let&amp;#8217;s think about how we could use it:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
player.profile
  =&amp;gt; performs the request and returns a Hash
player.profile
  =&amp;gt; returns the same hash
player.profile(true)
  =&amp;gt; forces the reload of the http request and then returns the hash (with data changes if necessary)
&lt;/pre&gt;
&lt;p&gt;How can we test this? We can by using WebMock to enable and disable network connections to the API endpoint. Even if we&amp;#8217;re using VCR fixtures, WebMock can simulate a network Timeout or a different response to the server. In our case, we can test caching by getting the profile once and then disabling the network. By calling &lt;code&gt;player.profile&lt;/code&gt; again we should see the same data, while by calling &lt;code&gt;player.profile(true)&lt;/code&gt; we should get a &lt;code&gt;Timeout::Error&lt;/code&gt;, as the library would try to connect to the (disabled) API endpoint.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s add another block to the &lt;code&gt;player_spec.rb&lt;/code&gt; file, right after &lt;code&gt;dynamic attribute generation&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
describe &amp;quot;caching&amp;quot; do

  # we use Webmock to disable the network connection after
  # fetching the profile
  before do
    player.profile
    stub_request(:any, /api.dribbble.com/).to_timeout
  end

  it &amp;quot;must cache the profile&amp;quot; do
    player.profile.must_be_instance_of Hash
  end

  it &amp;quot;must refresh the profile if forced&amp;quot; do
    lambda { player.profile(true) }.must_raise Timeout::Error
  end

end
&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;stub_request&lt;/code&gt; method intercepts all calls to the API endpoint and simulates a timeout, raising the expected &lt;code&gt;Timeout::Error&lt;/code&gt;. As we did before, we test the presence of this error in a lambda.&lt;/p&gt;
&lt;p&gt;Implementation can be tricky, so we&amp;#8217;ll split it into two steps. Firstly, let&amp;#8217;s move the actual http request to a private method:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
def profile
  get_profile
end

...

private

def get_profile
  self.class.get(&amp;quot;/players/#{self.username}&amp;quot;)
end
...
&lt;/pre&gt;
&lt;p&gt;This will not get our specs passing, as we&amp;#8217;re not caching the result of &lt;code&gt;get_profile&lt;/code&gt;. To do that, let&amp;#8217;s change the &lt;code&gt;profile&lt;/code&gt; method:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
def profile
  @profile ||= get_profile
end
...
&lt;/pre&gt;
&lt;p&gt;We will store the result hash into an instance variable. Also note the &lt;code&gt;||=&lt;/code&gt; operator, whose presence makes sure that &lt;code&gt;get_profile&lt;/code&gt; is run only if @profile returns a falsy value (like &lt;code&gt;nil&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Next we can add the forced reload directive:&lt;/p&gt;
&lt;pre class="brush: ruby; title: ; notranslate"&gt;
...
def profile(force = false)
  force ? @profile = get_profile : @profile ||= get_profile
end
...
&lt;/pre&gt;
&lt;p&gt;We&amp;#8217;re using a ternary again: if &lt;code&gt;force&lt;/code&gt; is false, we perform &lt;code&gt;get_profile&lt;/code&gt; and cache it, if not, we use the logic written in the previous version of this method (i.e. performing the request only if we don&amp;#8217;t have already an hash).&lt;/p&gt;
&lt;p&gt;Our specs should be green now and this is also the end of our tutorial.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;Our purpose in this tutorial was to write a small and efficient library to interact with the Dribbble API; we&amp;#8217;ve laid the foundation for this to happen. Most of the logic we&amp;#8217;ve written can be abstracted and reused to access all the other endpoints. Minitest, WebMock and VCR have proven to be valuable tools to help us shape our code.&lt;/p&gt;
&lt;p&gt;
We do, however, need to be aware of a small caveat: VCR can become a double-edged sword, as our tests can become too much data-dependent. If, for any reason, the API we&amp;#8217;re building against changes without any visible sign (like a version number), we may risk having our tests perfectly working with a dataset, which is no longer relevant. In that case, removing and recreating the fixture is the best way to make sure that our code still works as expected.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/l_6Z0oH23iDsFb5ZP4dDszL6n70/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l_6Z0oH23iDsFb5ZP4dDszL6n70/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/l_6Z0oH23iDsFb5ZP4dDszL6n70/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/l_6Z0oH23iDsFb5ZP4dDszL6n70/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=UkklRP6FQRY:yOuKNfaF-Xw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=UkklRP6FQRY:yOuKNfaF-Xw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=UkklRP6FQRY:yOuKNfaF-Xw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=UkklRP6FQRY:yOuKNfaF-Xw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=UkklRP6FQRY:yOuKNfaF-Xw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=UkklRP6FQRY:yOuKNfaF-Xw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=UkklRP6FQRY:yOuKNfaF-Xw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=UkklRP6FQRY:yOuKNfaF-Xw:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/UkklRP6FQRY" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/ruby/writing-an-api-wrapper-in-ruby-with-tdd/</feedburner:origLink></item>
		<item>
		<title>24 Extremely Useful Ruby Gems for Web Development</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/TQXIcZXrplk/</link>
		<comments>http://net.tutsplus.com/articles/web-roundups/24-extremely-useful-ruby-gems-for-web-development/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 21:38:56 +0000</pubDate>
		<dc:creator>Siddharth</dc:creator>
				<category><![CDATA[Web Roundups]]></category>
		<category><![CDATA[gems]]></category>
		<category><![CDATA[must have]]></category>
		<category><![CDATA[Ruby]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=23863</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23863&amp;c=112858839' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=23863&amp;c=112858839' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;One of the nicer things about developing on the Ruby platform is the sheer amount of meticulously categorized, highly reusable code wrapped up in the form of aptly named &amp;#8216;gems&amp;#8217;. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure you&amp;#8217;ve heard of popular frameworks like Sinatra or the super popular Rails that ship as gems but you&amp;#8217;re missing an entire spectrum of others that handle issues at a much lower level. Start using these and watch your productivity shoot through the roof!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-23863"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Quick Note&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m well aware that some of the gems listed here have Rails, or parts of Rails, as a dependency. That doesn&amp;#8217;t mean that they are any less useful or need to be sneered at. &lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;CarrierWave&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Upload files in your Ruby applications, map them to a range of ORMs, store them on different backends. It works well with Rack based web applications, such as Ruby on Rails.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jnicklas/carrierwave" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2011/a-gentle-introduction-to-carrierwave/" &gt;A Gentle Introduction to CarrierWave&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&lt;br /&gt;
&lt;h2&gt;Kaminari&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Kaminari is a Scope &amp;#038; Engine based, clean, powerful, customizable and sophisticated paginator. Kaminari supports multiple ORMs (ActiveRecord, Mongoid, MongoMapper) multiple web frameworks (Rails, Sinatra), and multiple template engines (ERB, Haml).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/amatsuda/kaminari" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/254-pagination-with-kaminari" &gt;Railscasts #254 Pagination with Kaminari&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;HAML&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Haml (HTML Abstraction Markup Language) is a layer on top of XHTML or XML that&amp;#8217;s designed to express the structure of XHTML or XML documents in a non-repetitive, elegant, easy way, using indentation rather than closing tags and allowing Ruby to be embedded with ease. It was originally envisioned as a plugin for Ruby on Rails, but it can function as a stand-alone templating engine.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://haml-lang.com/" &gt;HAML website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/ruby/an-introduction-to-haml-and-sinatra/" &gt;An Introduction to Haml and Sinatra &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubysource.com/an-introduction-to-haml/" &gt;An Introduction to Haml &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Authlogic&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;A simple, unobtrusive model based Ruby authentication solution. Authlogic is very flexible, it has a strong public API and a plethora of hooks to allow you to modify behavior and extend it.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/binarylogic/authlogic" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/160-authlogic" &gt;Railscasts #160 Authlogic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Shoulda&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Shoulda is a gem that allows you to create more understandable tests for your Ruby application. Shoulda allows you to provide context to your tests enabling you to categorize tests according to a specific feature or scenario you&amp;#8217;re testing.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thoughtbot/shoulda" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railstips.org/blog/archives/2009/02/21/shoulda-looked-at-it-sooner/" &gt;Shoulda Looked At It Sooner&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;factory_girl&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;factory_girl provides a framework and DSL for defining and using factories &amp;#8211; less error-prone, more explicit, and all-around easier to work with than fixtures. It has straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/thoughtbot/factory_girl" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.agileweboperations.com/real-world-example-using-factory_girl-to-simplify-our-test-setup" &gt;Using factory_girl to simplify our test setup&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;RMagick&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;RMagick is an interface between the Ruby programming language and the ImageMagick and GraphicsMagick image processing libraries.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/rmagick/rmagick" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.imagemagick.org/RMagick/doc/rvgtut.html" &gt;Drawing with RVG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Cancan&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;CanCan is an authorization library for Ruby on Rails which restricts what resources a given user is allowed to access and is decoupled from user roles. All permissions are stored in a single location and not duplicated across controllers, views, and database queries.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/ryanb/cancan" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/192-authorization-with-cancan" &gt;Railscasts #192 Authorization with CanCan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Nokogiri&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Nokogiri is an HTML, XML, SAX, and Reader parser. Among Nokogiri’s many features is the ability to search documents via XPath or CSS3 selectors. Nokogiri parses and searches XML/HTML very quickly, and also has correctly implemented CSS3 selector support as well as XPath support.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tenderlove/nokogiri" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.engineyard.com/blog/2010/getting-started-with-nokogiri/" &gt;Getting Started with Nokogiri&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/190-screen-scraping-with-nokogiri" &gt;Railscasts #190 Screen Scraping with Nokogiri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;SASS&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Sass makes CSS fun again. Sass is an extension of CSS3, adding nested rules, variables, mixins, selector inheritance, and more. It’s translated to well-formatted, standard CSS using the command line tool or a web-framework plugin.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nex3/sass" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/268-sass-basics" &gt;Railscasts #268 Sass Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Formtastic&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Formtastic is a Rails FormBuilder DSL (with some other goodies) to make it far easier to create beautiful, semantically rich, syntactically awesome, readily stylable and wonderfully accessible HTML forms in your Rails applications.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/justinfrench/formtastic/" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/184-formtastic-part-1" &gt;Railscasts #184 Formtastic Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/185-formtastic-part-2" &gt;Railscasts #185 Formtastic Part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Capistrano&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Capistrano is a utility and framework for executing commands in parallel on multiple remote machines, via SSH. It uses a simple DSL (borrowed in part from Rake) that allows you to define tasks, which may be applied to machines in certain roles. It also supports tunneling connections via some gateway machine to allow operations to be performed behind VPN&amp;#8217;s and firewalls.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/capistrano/capistrano/" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/133-capistrano-tasks" &gt;Railscasts #133 Capistrano Tasks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Omniauth&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;OmniAuth is a Ruby authentication framework that provides a standardized interface to many different authentication providers such as Facebook, OpenID, and even traditional username and password.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/intridea/omniauth" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/ruby/how-to-use-omniauth-to-authenticate-your-users/" &gt;How to Use Omniauth to Authenticate your Users &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/241-simple-omniauth" &gt;Railscasts #241 Simple OmniAuth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Bundler&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Bundler is a tool that manages gem dependencies for your ruby application. It takes a gem manifest file and is able to fetch, download, and install the gems and all child dependencies specified in this manifest. It can manage any update to the gem manifest file and update the bundle&amp;#8217;s gems accordingly. It also lets you run any ruby code in context of the bundle&amp;#8217;s gem environment.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/carlhuda/bundler" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yehudakatz.com/2009/11/03/using-the-new-gem-bundler-today/" &gt;Using the New Gem Bundler Today&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;resque&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Resque (pronounced like &amp;#8220;rescue&amp;#8221;) is a Redis-backed library for creating background jobs, placing those jobs on multiple queues, and processing them later. Resque is heavily inspired by DelayedJob.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/defunkt/resque" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="rubylearning.com/blog/2010/11/08/do-you-know-resque/" &gt;Do YOU know Resque?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/271-resque" &gt;Railscasts #271 Resque&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Jammit&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Jammit is an industrial strength asset packaging library for Rails, providing both the CSS and JavaScript concatenation and compression that you&amp;#8217;d expect, as well as YUI Compressor and Closure Compiler compatibility, ahead-of-time gzipping, built-in JavaScript template support, and optional Data-URI / MHTML image embedding.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://documentcloud.github.com/jammit/" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.ruby-on-rails-outsourcing.com/articles/2011/07/21/using-jammit-in-rails/" &gt;Using Jammit in Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;capybara&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Capybara helps you test Rails and Rack applications by simulating how a real user would interact with your app. It is agnostic about the driver running your tests and comes with Rack::Test and Selenium support built in. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jnicklas/capybara" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://opinionatedprogrammer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/" &gt;Capybara (and Selenium) with RSpec &amp;#038; Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Active Merchant&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Active Merchant is an extraction from the e-commerce system Shopify. Shopify&amp;#8217;s requirements for a simple and unified API to access dozens of different payment gateways with very different internal APIs was the chief principle in designing the library. It was developed for usage in Ruby on Rails web applications and integrates seamlessly as a plugin but it also works excellently as a stand alone library.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shopify/active_merchant" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/144-active-merchant-basics" &gt;Railscasts #144 Active Merchant Basics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;eventmachine&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;EventMachine implements a fast, single-threaded engine for arbitrary networkcommunications. It&amp;#8217;s extremely easy to use in Ruby. EventMachine wraps all interactions with IP sockets, allowing programs to concentrate on the implementation of network protocols. It can be used to create both network servers and clients.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/eventmachine/eventmachine" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://rubylearning.com/blog/2010/10/01/an-introduction-to-eventmachine-and-how-to-avoid-callback-spaghetti/" &gt;An introduction to eventmachine, and how to avoid callback spaghetti&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;mustache&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Inspired by ctemplate, Mustache is a framework-agnostic way to renderlogic-free views.As ctemplates says, &amp;#8220;It emphasizes separating logic from presentation:it is impossible to embed application logic in this templatelanguage.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/defunkt/mustache" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Passenger&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Phusion Passenger™ — a.k.a. mod_rails or mod_rack — makes deployment of Ruby web applications, such as those built on the revolutionary Ruby on Rails web framework, a breeze.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/FooBarWidget/passenger" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/122-passenger-in-development" &gt;Railscasts #122 Passenger in Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Chef&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Chef is a system integration framework designed to bring the benefits of configuration management to your entire infrastructure. With Chef, you can manage your servers by writing code, not by running commands. &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/opscode/chef" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.themomorohoax.com/2010/07/31/ruby-chef-tutorial" &gt;Getting started with Chef tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Thinking Sphinx&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;A concise and easy-to-use Ruby library that connects ActiveRecord to the Sphinx search daemon, managing configuration, indexing and searching.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Related reading&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/freelancing-god/thinking-sphinx" &gt;Github repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/120-thinking-sphinx-revised" &gt;Railscasts #120 Thinking Sphinx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Wrapping Up&lt;/h2&gt;
&lt;p&gt;So those were some of the awesome gems I&amp;#8217;ve found extremely useful when I&amp;#8217;m whipping up a web app in Ruby. I&amp;#8217;m a 100% sure I&amp;#8217;m missing a metric butt load of others though. Let me know about your favorite gems in the comments below and thank you so much for reading!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/422oQC7-HVCEGtPbVG_jPsYZ-fE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/422oQC7-HVCEGtPbVG_jPsYZ-fE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/422oQC7-HVCEGtPbVG_jPsYZ-fE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/422oQC7-HVCEGtPbVG_jPsYZ-fE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=TQXIcZXrplk:FMeideHSUKQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=TQXIcZXrplk:FMeideHSUKQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=TQXIcZXrplk:FMeideHSUKQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=TQXIcZXrplk:FMeideHSUKQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=TQXIcZXrplk:FMeideHSUKQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=TQXIcZXrplk:FMeideHSUKQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=TQXIcZXrplk:FMeideHSUKQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=TQXIcZXrplk:FMeideHSUKQ:TzevzKxY174"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?d=TzevzKxY174" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/nettuts/~4/TQXIcZXrplk" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/web-roundups/24-extremely-useful-ruby-gems-for-web-development/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/web-roundups/24-extremely-useful-ruby-gems-for-web-development/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.584 seconds -->

