<?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>Wed, 16 May 2012 20:51:17 +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>Meet Crockford’s JSCheck</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/elFnjAFtJ_Q/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/meet-crockford%e2%80%99s-jscheck/#comments</comments>
		<pubDate>Wed, 16 May 2012 20:50:33 +0000</pubDate>
		<dc:creator>Andrew Burgess</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[crockford]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=25044</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25044&amp;c=1425535234' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25044&amp;c=1425535234' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;There are dozens of JavaScript testing frameworks, but most of them function in, more or less, the same way. However, Douglas Crockford&amp;#8217;s &lt;a href='http://www.jscheck.org/'&gt;JSCheck&lt;/a&gt; is considerably different from most. In this tutorial, I&amp;#8217;ll show you how it&amp;#8217;s different and why you should consider using it!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-25044"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote class=pullquote&gt;&lt;p&gt;
Crockford describes &lt;a href='http://www.jscheck.org/'&gt;JSCheck&lt;/a&gt; as a &amp;#8220;specification-driven testing tool.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Crockford describes &lt;a href='http://www.jscheck.org/'&gt;JSCheck&lt;/a&gt; as a &amp;#8220;specification-driven testing tool.&amp;#8221; When using the frameworks you&amp;#8217;re used to, you would write a test for a given piece of functionality, and, if that test passes, declare that the given functionality is working correctly. However, it&amp;#8217;s possible that you might miss some of edge cases or exceptions that your tests don&amp;#8217;t cover.&lt;/p&gt;
&lt;p&gt;While uncovering edge cases isn&amp;#8217;t the express purpose of JSCheck, it is a nice side benefit. The main idea behind JSCheck is this: the specification you write will actually describe how the code you are testing should work. Then, JSCheck will take that specification (called a &lt;strong&gt;claim&lt;/strong&gt; in JSCheck-lingo), and generate random tests to prove the claim. Finally, it will report the results to you.&lt;/p&gt;
&lt;p&gt;Sounds interesting? Read on! Sounds familiar? You might have used the Haskell testing tool, &lt;a href="http://www.haskell.org/haskellwiki/Introduction_to_QuickCheck"&gt;QuickCheck&lt;/a&gt;, on which JSCheck was based.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Some Code to Test&lt;/h2&gt;
&lt;p&gt;Of course, before actually writing our claim, we&amp;#8217;ll want to have some code to test. Recently, I wrote a mini-password scorer, similar to the functionality on &lt;a href='http://howsecureismypassword.net/'&gt;HowSecureIsMyPassword.net&lt;/a&gt;. It really isn&amp;#8217;t fancy: you just pass the function a password and get a score back. Here&amp;#8217;s the code:&lt;/p&gt;
&lt;h3&gt;passwordScorer.js&lt;/h3&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;(function () {
    var PasswordScorer = {};

    PasswordScorer.score = function (password) {
        var len = password.length,
            lengthScore = 0,
            letterScore = 0,
            chars = {}

        if      (len &amp;gt;= 21) { lengthScore = 7; }
        else if (len &amp;gt;= 16) { lengthScore = 6; }
        else if (len &amp;gt;= 13) { lengthScore = 5; }
        else if (len &amp;gt;= 10) { lengthScore = 4; }
        else if (len &amp;gt;=  8) { lengthScore = 3; }
        else if (len &amp;gt;=  5) { lengthScore = 2; }

        var re = [ null, /[a-z]/g, /[A-Z]/g, /\d/g, /[!@#$%\^&amp;amp;amp;\*\(\)=_+-]/g];

        for (var i = 1; i &amp;lt; re.length; i++) {
            letterScore += (password.match(re[i]) || []).length * i;
        }

        return letterScore + lengthScore;
    };

    (typeof window !== 'undefined' ? window : exports).PasswordScorer = PasswordScorer;
}());&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s pretty simple code, but here&amp;#8217;s what&amp;#8217;s going on: the score is made up of two sub-scores. There&amp;#8217;s a starting score, that&amp;#8217;s based on the length of the password, and then an additional score for each character, 1 point for each lowercase letter, 2 points for each uppercase letter, 3 points for each number, and 4 points for each symbol (from a limited set).&lt;/p&gt;
&lt;p&gt;So, this is the code we&amp;#8217;re going to test: we&amp;#8217;ll randomly generate some passwords with JSCheck and make sure they get an appropriate score.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Writing our Claim&lt;/h2&gt;
&lt;p&gt;Now we&amp;#8217;re ready to write our claims. First, head over the &lt;a href='https://github.com/douglascrockford/JSCheck'&gt;JSCheck Github page&lt;/a&gt; and download the &lt;code&gt;jscheck.js&lt;/code&gt; file. I like to run my tests in the terminal, via NodeJS, so add this single line to the very bottom of the file:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;(typeof window !== 'undefined' ? window : exports).JSC = JSC;&lt;/pre&gt;
&lt;p&gt;This won&amp;#8217;t affect the way the file behaves in the browser at all, but it will make it work as a module within Node. Notice that the &lt;code&gt;jscheck.js&lt;/code&gt; file exposes &lt;code&gt;JSC&lt;/code&gt; as the single global variable for the whole library. If we weren&amp;#8217;t making this adjustment, that&amp;#8217;s how we&amp;#8217;d access it.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s open &lt;code&gt;passwordScorerSpec.js&lt;/code&gt; and start things:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;JSC = require(&amp;quot;./../vendor/jschec&amp;quot;;).JSC;
PasswordScorer = require(&amp;quot;./../lib/passwordScore&amp;quot;;).PasswordScorer;&lt;/pre&gt;
&lt;p&gt;Since I&amp;#8217;m running these tests in NodeJS, we&amp;#8217;ll have to require the modules we want. Of course, you&amp;#8217;ll want to make sure that paths match your file locations.&lt;/p&gt;
&lt;p&gt;Now, we&amp;#8217;re ready to write our first claim. Of course, we use the &lt;code&gt;JSC.claim&lt;/code&gt; method. This method accepts three parameters, with an optional fourth. The first parameter is just a string, a &lt;strong&gt;name&lt;/strong&gt; for the claim. The second parameter is called the &lt;strong&gt;predicate&lt;/strong&gt;: it&amp;#8217;s the actual testing function. Very simply, this function should return &lt;code&gt;true&lt;/code&gt; if the claim is true, and &lt;code&gt;false&lt;/code&gt; if the claim is false. The random values that JSCheck will generate for the test will be passed as parameters to the predicate.&lt;/p&gt;
&lt;p&gt;But how does JSCheck know what type of random values to hand the predicate? That&amp;#8217;s where the third parameter, the &lt;strong&gt;specifier&lt;/strong&gt; comes into play. This is an array, with an item for each parameter for predicate. The items in the array specify what types to give the predicate, using JSCheck&amp;#8217;s specifier functions. Here are a few of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;JSC.boolean()&lt;/code&gt; returns either true or false.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC.character()&lt;/code&gt; takes a min and max character and returns a single character from that range. It can also take a single character code and return that character.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;JSC.integer()&lt;/code&gt; will return a prime number. Or, pass it a single parameter to get an integer (whole number) between 1 and the parameter, or two parameters for an integer in that range.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You get the idea. There are other specifiers, and we&amp;#8217;ll use some now as we write our first claim.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;JSC.claim(&amp;quot;All Lowercase Password&amp;quot;;, function (password, maxScore) {
  return PasswordScorer.score(password) &amp;lt;= maxScore;
}, [
  JSC.string(JSC.integer(10, 20), JSC.character('a', 'z')),
  JSC.literal(26)
]);&lt;/pre&gt;
&lt;p&gt;Our first parameter is a name. The second is the testing function: it receives a password and a max score, and returns true if the score for that password is less than or equal to the max score. Then, we have our specifier array. Our first parameter (the password) should be a string, so we use the &lt;code&gt;JSC.string()&lt;/code&gt; method: it can take two parameters, the number of characters in the string, and value for those characters. As you can see, we&amp;#8217;re asking for a password between 10 and 20 characters. For the value, we&amp;#8217;re using the &lt;code&gt;JSC.characters()&lt;/code&gt; method to get random characters between &amp;#8216;a&amp;#8217; and &amp;#8216;z&amp;#8217;.&lt;/p&gt;
&lt;p&gt;The next value is our &lt;code&gt;maxScore&lt;/code&gt; parameter. Sometimes, we don&amp;#8217;t want the randomness that JSCheck offers, and this is one of those times. That&amp;#8217;s why there&amp;#8217;s &lt;code&gt;JSC.literal&lt;/code&gt;: to pass a literal value the predicate. In this case, we&amp;#8217;re using 26, which should be the max score for any all-lowercase password between 10 and 20 characters.&lt;/p&gt;
&lt;p&gt;Now we&amp;#8217;re ready to run the test.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Running our Claim&lt;/h2&gt;
&lt;p&gt;Before we actually run the claim and get the report, we have to setup the function that will receive the report. JSCheck passes the report to a callback function of &lt;code&gt;JSC.on_report&lt;/code&gt;. Hence:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;JSC.on_report(function (str) {
  console.log(str);
});&lt;/pre&gt;
&lt;p&gt;Nothing fancy. Now, all that&amp;#8217;s left is to call &lt;code&gt;JSC.check()&lt;/code&gt;. Now, we can head to our terminal and run this:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;node path/to/passwordScorerSpec.js&lt;/pre&gt;
&lt;p&gt;Behind the scenes, JSCheck runs the predicate 100 times, generating different random values each time. You should see your report printed out.&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;All Lowercase Passwords 100 of 100
 pass 100&lt;/pre&gt;
&lt;p&gt;They all passed, but that&amp;#8217;s not much of a report, eh? Well, if any of our tests had failed, they would have been included in the report. However, you can adjust the level of output with the &lt;code&gt;JSC.detail&lt;/code&gt; function: pass it a number between 0 and 4 (inclusive) to get anything for no output to all the test cases. The default value is 3.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Adding a Classifier&lt;/h2&gt;
&lt;p&gt;Remember how I said that &lt;code&gt;JSC.claim&lt;/code&gt; could take a fourth parameter? It&amp;#8217;s called a &lt;strong&gt;classifier&lt;/strong&gt;, and it receives the same parameters that the predicate receives. Then, it can returns a string to classify, or group, our test cases. I&amp;#8217;ll admit I wasn&amp;#8217;t really sure where this would be useful until I was creating the above example claim. See, I made a mistake in the predicate and compared the score to the &lt;code&gt;maxScore&lt;/code&gt; with the &lt;code&gt;&lt;&lt;/code&gt; operator instead of the &lt;code&gt;&lt;=&lt;/code&gt; operator, so any passwords that scored 26 points were failing. I was seeing reports that looked something like this:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;All Lowercase Passwords 96 of 100
 FAIL [12] (&amp;quot;vqfqkqqbwkdjrvplkrx&amp;quot;;,26)
 FAIL [21] (&amp;quot;nhgkznldvoenhqqlfza&amp;quot;;,26)
 FAIL [62] (&amp;quot;eclloekuqhvnsyyuekj&amp;quot;;,26)
 FAIL [78] (&amp;quot;rvrkfivwtdphrhjrjis&amp;quot;;,26)
 pass 96 fail 4&lt;/pre&gt;
&lt;p&gt;It&amp;#8217;s still entirely obvious why some tests are failing. So I added a classifier function that grouped the test cases by score: like I said, the function takes the same parameters as the predicate, and it returns a string. Every test case that gets the same string back from the classifier will be grouped together in the report.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;function (password, maxScore) {
	return PasswordScorer.score(password) + &amp;quot; points&amp;quot;;;
}&lt;/pre&gt;
&lt;p&gt;This function should be the last parameter of our claim. Now, you&amp;#8217;ll get a report that&amp;#8217;s something like this:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;All Lowercase Passwords 96 of 100
 FAIL [4] 26 points:(&amp;quot;illqbtiubsmrhxdwjfo&amp;quot;;,26)
 FAIL [22] 26 points:(&amp;quot;gruvmmqjzqlcyaozgfh&amp;quot;;,26)
 FAIL [34] 26 points:(&amp;quot;chhbevwtjvslprqczjg&amp;quot;;,26)
 FAIL [65] 26 points:(&amp;quot;kskqdjhtonybvfewdjm&amp;quot;;,26)
14 points: pass 8
15 points: pass 5
16 points: pass 12
18 points: pass 10
19 points: pass 12
20 points: pass 11
22 points: pass 12
23 points: pass 8
24 points: pass 10
25 points: pass 8
26 points: pass 0 fail 4
&lt;/pre&gt;
&lt;p&gt;You can see how the tests are grouped by how many points the passwords are worth. Now, it&amp;#8217;s easy to see that the only passwords that fail the tests are the passwords that score 26 points. And while the problem here was with the test, and not the code, it still shows how it can be useful to add a classifier function to your claims.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;So, at the end of the day, it JSCheck worth using? Here&amp;#8217;s what I think: it&amp;#8217;s not something you&amp;#8217;re necessarily going to use with every code base, but sometimes you&amp;#8217;ll find it useful to be able to create random test cases that will rigorously test a given piece of code. When that&amp;#8217;s what you want to do, I haven&amp;#8217;t seen a tool better for that than JSCheck.&lt;/p&gt;
&lt;p&gt;JSCheck has a few other options and a bunch of specifiers that we haven't reviewed in this tutorial; head over to &lt;a href='http://www.jscheck.org/'&gt;JSCheck.og&lt;/a&gt; to read about those. Otherwise, I&amp;#8217;d love to hear your thoughts about JSCheck in the comments!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-qanUQQyK854Kada9mckqwaOq-g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-qanUQQyK854Kada9mckqwaOq-g/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/-qanUQQyK854Kada9mckqwaOq-g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-qanUQQyK854Kada9mckqwaOq-g/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=elFnjAFtJ_Q:SrpB9skSgzk: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=elFnjAFtJ_Q:SrpB9skSgzk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=elFnjAFtJ_Q:SrpB9skSgzk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=elFnjAFtJ_Q:SrpB9skSgzk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=elFnjAFtJ_Q:SrpB9skSgzk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=elFnjAFtJ_Q:SrpB9skSgzk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=elFnjAFtJ_Q:SrpB9skSgzk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=elFnjAFtJ_Q:SrpB9skSgzk: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/elFnjAFtJ_Q" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/meet-crockford%e2%80%99s-jscheck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/meet-crockford%e2%80%99s-jscheck/</feedburner:origLink></item>
		<item>
		<title>How to Super-Scale Magento in the Cloud</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/gCVIO2Y0hy4/</link>
		<comments>http://net.tutsplus.com/tutorials/php/how-to-super-scale-magento-in-the-cloud/#comments</comments>
		<pubDate>Tue, 15 May 2012 17:31:25 +0000</pubDate>
		<dc:creator>Jed Galbraith</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[magento]]></category>
		<category><![CDATA[pagoda box]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=25037</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25037&amp;c=434101790' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25037&amp;c=434101790' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;This tutorial will help you prepare a &lt;a href="http://www.magentocommerce.com/"&gt;Magento&lt;/a&gt; install for high traffic, better load times, and simpler ongoing site management. Ready?&lt;/p&gt;
&lt;p&gt;&lt;span id="more-25037"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;p&gt;You can &lt;a target="_blank" href="https://github.com/pagodabox/magento-install-basic/tarball/tutorial"&gt;download the finished code&lt;/a&gt; for this tutorial, or launch the &amp;#8220;magento-basic&amp;#8221; Quickstart from your Pagoda Box account to test a working site.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Pagoda Box Account (free)&lt;/li&gt;
&lt;li&gt;A functional local &lt;a target="_blank" href="http://www.magentocommerce.com/product/community-edition"&gt;Magento Install&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Local Development Software (&lt;a target="_blank" href="http://www.mamp.info"&gt;MAMP&lt;/a&gt; or &lt;a target="_blank" href="http://www.wampserver.com"&gt;WAMP&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://git-scm.com/download"&gt;Git&lt;/a&gt; Installed (Can use SFTP)&lt;/li&gt;
&lt;li&gt;The Pagoda Terminal Client Installed&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;&lt;p&gt;Fair Warning: This tutorial may change your life. &lt;a href="http://pagodabox.com/"&gt;Pagoda Box&lt;/a&gt; is not traditional hosting. The teachings in this article will not only help scale Magento, but it alos lays the groundwork for a progressive development-to-production workflow. &lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 1:&lt;/span&gt; Set Up Git Locally (SFTP will work as an alternate)&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Note: If you already use Git, you can skip this section. If not, the guide &lt;a target="_blank" href="http://help.pagodabox.com/customer/portal/articles/202225-setting-up-git"&gt; Setting Up Git&lt;/a&gt; provides specific instructions for creating an SSH Key, as well as links for downloading and installing Git (also below).&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;While it is possible to use just &lt;a target="_blank" href="http://help.pagodabox.com/customer/portal/articles/401507"&gt;SFTP&lt;/a&gt; on Pagoda Box, the officially recommended (and most efficient) workflow integrates Git into your daily development. Git enables features like collaboration, uniform code distribution, deploys, deploy history and rolling back code. While most of these features are available to FTP users, using Git makes integration seamless.&lt;/p&gt;
&lt;p&gt;If you want to fully take advantage of Pagoda Box, &lt;a target="_blank" href="http://git-scm.com/download"&gt;download Git&lt;/a&gt;, and &lt;a target="_blank" href="http://git-scm.com/book/ch1-3.html"&gt;Learn the Basics&lt;/a&gt;. Depending on your operating system, set up may vary slightly. Regardless of your OS, the commands are identical once Git is installed.&lt;/p&gt;
&lt;p&gt;Using Git to manage collaboration and version control may involve a brief learning curve. However, there are generally only three commands we&amp;#8217;ll use on an ongoing basis to commit changes locally, then deploy to Pagoda Box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git add . &lt;/code&gt; &amp;#8211; Adds local files to your repository&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m "some message about what you've done"&lt;/code&gt; &amp;#8211; Commits your changes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push pagoda --all&lt;/code&gt; &amp;#8211; Pushes changes to Pagoda Box Repository (auto-deployed by default)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;#8217;ll use these later.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 2:&lt;/span&gt; Install the Pagoda Box Terminal Client&lt;/h2&gt;
&lt;pre name="code" class="php"&gt;

                             *
                           /   \
                         /       \
                     +_/ / / | \ \ \_+
                         ||*|||*||
                         |+||*||+|
                         /       \
                     +_/ / / | \ \ \_+
                         ||*|||*||
                         |+||*||+|
     ____   _    ____  ___  ____    _    ____   _____  __
    |  _ \ / \  / ___|/ _ \|  _ \  / \  | __ ) / _ \ \/ /
    | |_) / _ \| |  _| | | | | | |/ _ \ |  _ \| | | \  /
    |  __/ ___ \ |_| | |_| | |_| / ___ \| |_) | |_| /  \
    |_| /_/   \_\____|\___/|____/_/   \_\____/ \___/_/\_\

       Welcome To Your Pagoda Box Terminal Client.
      -----------------------------------------------
          -----------------------------------------
             ---------------------------------
                          Enjoy.&lt;/pre&gt;
&lt;p&gt;Pagoda Box provides a Terminal Client that lets you clone, create, deploy, destroy, rename and rollback an application from the command line. Later in this tutorial, we&amp;#8217;ll use the client to create a secure tunnel to the live Magento database with Sequel Pro (the process is similar for other database managment tools like HeidiSQL).&lt;/p&gt;
&lt;p&gt;The Pagoda Box Terminal Client is a rubygem, so installation is pretty simple. First off, Ruby needs to be installed. Installation is different for each operating system.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mac &amp;#8211; Ruby and RubyGems come pre-installed on Mac OSX. As long as you are running v10.5 or later, you should be good to go.&lt;/li&gt;
&lt;li&gt;Windows &amp;#8211; There are a couple of different ways to install Ruby in Windows. We recommend this &lt;a target="_blank" href="http://rubyinstaller.org/"&gt;auto-installer&lt;/a&gt;. If it doesn&amp;#8217;t work for your set-up, a Google search will give you a pretty good list of installation walk-throughs.&lt;/li&gt;
&lt;li&gt;Linux &amp;#8211; Use your preferred package manager to download the Ruby package. For Ubuntu users, the gem is available through &lt;a target="_blank" href="http://www.getdeb.net/software/Pagoda%20Terminal%20Client"&gt;getdeb.net.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Install and Verify Terminal Client&lt;/h3&gt;
&lt;p&gt;Once Ruby is installed, simply run the following command to install the Pagoda RubyGem:&lt;/p&gt;
&lt;p&gt; On Mac or Linux:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ sudo gem install pagoda
&lt;/pre&gt;
&lt;p&gt; On Windows:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ gem install pagoda
&lt;/pre&gt;
&lt;p&gt;Then, to verify you have the Pagoda Gem installed properly, run:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ pagoda list
&lt;/pre&gt;
&lt;p&gt;If this is the first time you&amp;#8217;ve used the Gem, it will ask for your Pagoda Box Username and Password. After you&amp;#8217;ve entered those, expect to see a list of your Pagoda Box applications. If you haven&amp;#8217;t created any applications, the list will be blank.&lt;/p&gt;
&lt;p&gt;If you get an error, it&amp;#8217;s most likely invalid credentials. You can verify or change which credentials the gem uses by editing the file located on your local computer at &lt;code&gt;~/.pagodarc&lt;/code&gt;. Make sure to exactly match the credentials you use in your Pagoda Box account. (Note: this is a hidden file, so you&amp;#8217;ll need to enable hidden files or open via the terminal. Also note that the file stores your credentials twice, so edit both if needed.)&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 3:&lt;/span&gt; Install Magento Locally&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Note: Skip this step if you already have a working local Magento install.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;If you don&amp;#8217;t have it already, ensure you are using local webserver and database management software. There are several options available, depending on your operating system. A common option for Mac is &lt;a target="_blank" href="http://www.mamp.info"&gt;MAMP&lt;/a&gt;, or &lt;a target="_blank" href="http://www.wampserver.com"&gt;WAMP&lt;/a&gt; for Windows. Both are free and easily set up.&lt;/p&gt;
&lt;p&gt;Once your local development environment is set up, go ahead and &lt;a target="_blank" href="http://www.magentocommerce.com/download"&gt;download Magento,&lt;/a&gt; then follow the &lt;a target="_blank" href="http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/magento_installation_guide"&gt;official guide&lt;/a&gt; to install Magento locally.&lt;/p&gt;
&lt;p&gt;Feel free to use Magento&amp;#8217;s auto install script to set up the application in your local environment. However, due to Pagoda Box&amp;#8217;s distributed cloud architecture, the script will not install Magento directly in your production environment. The Pagoda Box workflow and architecture requires you to make code modifications locally, commit, then deploy to production. This workflow accommodates collaboration and development &gt; staging &gt; production best practices.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-magento-installation.jpg" border="0" /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 4:&lt;/span&gt; Configure PHP Using a Boxfile&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;Note: On Pagoda Box, a YAML &lt;a target="_blank" href="http://help.pagodabox.com/customer/portal/articles/175475-understanding-the-boxfile"&gt;Boxfile&lt;/a&gt; can be included in the root of your code repository. While the Boxfile is optional, it does provide advanced features, like manipulating your hosted environment on each deploy. We&amp;#8217;ll use the Boxfile extensively in this Tutorial to simplify tasks, and to make the respository reusable on Pagoda Box.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Create a file named &amp;#8220;Boxfile&amp;#8221; in the root of your local Magento installation, then copy the following into your Boxfile (explanation below):&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
web1:
  name: mag-app
  shared_writable_dirs:
    - media
    - var
  php_version: 5.3.8
  php_extensions:
    - pdo_mysql
    - mysql
    - simplexml
    - mcrypt
    - hash
    - gd
    - dom
    - iconv
    - curl
    - soap
&lt;/pre&gt;
&lt;h3&gt;Create / Name the Web Cluster&lt;/h3&gt;
&lt;p&gt;This Boxfile serves several purposes. First, it creates a &lt;code&gt;web1&lt;/code&gt; component, then names it &lt;code&gt;mag-app&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Shared Writable Directories&lt;/h3&gt;
&lt;p&gt;Second, the Boxfile identifies &lt;code&gt;media&lt;/code&gt; and &lt;code&gt;var&lt;/code&gt; as shared writable directories. This allows users to upload images, video, and other media to a distributed Magento cloud site without instances writing themselves out of sync.&lt;/p&gt;
&lt;p&gt;When a directory is marked as writable, the contents are no longer deployed to Pagoda Box from your local repository. Any time local files need to be deployed to these directories, they must be manually copied via SSH or SFTP. You may also &lt;a target="_blank" href="http://help.pagodabox.com/customer/portal/articles/175418-shared-writable-storage-management"&gt;use SSH/SFTP to transfer files&lt;/a&gt; from Pagoda Box to your local machine as needed.&lt;/p&gt;
&lt;h3&gt;PHP Version and Extensions&lt;/h3&gt;
&lt;p&gt;The Boxfile also declares which PHP version and extensions will be included in your web instances as they deploy. This way, both the environment and the application are versioned together, so rolling back to a previous deploy includes the correct PHP version and extensions. The list of PHP extensions in this Boxfile was taken from Magento&amp;#8217;s official system requirements.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Tip: Once Git is installed in your local environment, use the &lt;code&gt;.gitignore&lt;/code&gt; file to ignore the writable directories specified in your Boxfile. Identifying these directories inside the &lt;code&gt;.gitignore&lt;/code&gt; file helps reduce the size of your repo, and your deploy time. In addition to the writable directories, you can also add the &lt;code&gt;downloader&lt;/code&gt; directory to the &lt;code&gt;.gitignore&lt;/code&gt; file, since it&amp;#8217;s used locally, and not on Pagoda Box.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Once you&amp;#8217;ve installed Git and the Terminal Client, configured the Boxfile and finalized your local source code, you&amp;#8217;re ready to launch on Pagoda Box.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 5:&lt;/span&gt; Create a Free Pagoda Box Account&lt;/h2&gt;
&lt;p&gt;If you don&amp;#8217;t already have one, create a free &lt;a target="_blank" href="http://www.pagodabox.com/account/register"&gt;Pagoda Box account.&lt;/a&gt; You will not need to enter a credit card to install Magento for testing.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-box-register.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;If you have not already done so, follow this guide to &lt;a target="_blank" href="http://help.pagodabox.com/customer/portal/articles/200927#add-ssh-pagoda"&gt;Add an SSH Key&lt;/a&gt; in your Pagoda Box Admin panel. The guide will provide specific instructions for setting up an SSH Key on either Mac or Windows.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 6:&lt;/span&gt; Upload Magento to Pagoda Box&lt;/h2&gt;
&lt;p&gt;Once you&amp;#8217;ve created a Pagoda Box account and set up an SSH Key, go to the Home Page in your new account and click the &amp;#8220;New Application&amp;#8221; button to create a new application.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Note: This tutorial names our sample application &amp;#8220;magento&amp;#8221;. The app name is also used for the Pagoda Box repository, the subdomain for the freshly deployed application (magento.pagodabox.com), and the username in SFTP mode. Replace &amp;#8220;magento&amp;#8221; with &amp;#8220;your-app-name-here&amp;#8221; where appropriate throughout the remainder of this tutorial.&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-new-app-button.jpg" border="0" /&gt;&lt;/div&gt;
&lt;h3&gt;Upload to an Empty Repo (recommended for this tutorial)&lt;/h3&gt;
&lt;p&gt;Next, choose from the 3 options to launch your Magento site. Since you already have a customized version of Magento locally, select &amp;#8216;Empty Repo&amp;#8217; to deploy using SFTP or Git, name your application, and click &amp;#8220;Launch Application&amp;#8221;.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-empty-repo.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;You&amp;#8217;ll be asked to select your preferred deployment method (Git or SFTP). Click on your preference, and follow the instrutions on-screen.&lt;/p&gt;
&lt;h3&gt;Git Option&lt;/h3&gt;
&lt;p&gt;You can copy and paste the on-screen instructions from the Pagoda Box dashboard to your terminal after using Terminal to change directory (cd) to the root of your project.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-choice.png" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;The pasted commands do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git init &lt;/code&gt; &amp;#8211; Initialize your Magento project as a Git Repository&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add . &lt;/code&gt; &amp;#8211; Add all files from the project to the repo&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit -m 'your commit message' &lt;/code&gt; &amp;#8211; Commit files with a message that allows you to quickly scan deploy history in the future, in case you need to revert or modify changes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote add pagoda git@git.pagodabox.com:magento.git &lt;/code&gt; &amp;#8211; Add Pagoda Box as a remote (the specific git url for your application appears on both this screen, and in your app dashboard&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push pagoda --all &lt;/code&gt; &amp;#8211; Push your local code to the Pagoda Box remote repository. As long as you&amp;#8217;re on the &amp;#8220;master&amp;#8221; branch (which is the default), Pagoda Box will automatically deploy your code, and carry out the instructions we set in the Boxfile. Auto-deploy can be turned off in the Admin dashboard, or configured to deploy automatically from a Git branch other than Master.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SFTP Option&lt;/h3&gt;
&lt;p&gt;If you opted for SFTP, Pagoda Box will guide you through establishing credentials and a password. Connect via SFTP to Pagoda Box, and upload your Magento source code in the &lt;code&gt;code&lt;/code&gt; directory.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-sftp.jpg" border="0" /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 7:&lt;/span&gt; Create a Database&lt;/h2&gt;
&lt;p&gt;There are two ways to create a database on Pagoda Box. Each has benefits, explained below:&lt;/p&gt;
&lt;h3&gt;Create a DB in the Boxfile&lt;/h3&gt;
&lt;p&gt;The Boxfile will automatically create a database component on deploy, as long as that component (&lt;code&gt;db1&lt;/code&gt;, &lt;code&gt;db2&lt;/code&gt;, etc.) doesn&amp;#8217;t already exist. Declaring the database in the Boxfile saves a bit of time now, and makes deploying multiple Magento sites from a standardized code base much simpler in the future. (Note: Only cloud DBs can be deployed from the Boxfile. If you need a larger, dedicated or redundant database, see the Dashboard option later in this Step.) Add the following to your Boxfile: &lt;/p&gt;
&lt;pre name="code" class="php"&gt;
db1:
  name: mag-db
  type: mysql
  &lt;/pre&gt;
&lt;p&gt;Your updated Boxfile should look like this:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
web1:
  name: mag-app
  shared_writable_dirs:
    - media
    - var
  php_version: 5.3.8
  php_extensions:
    - pdo_mysql
    - mysql
    - simplexml
    - mcrypt
    - hash
    - gd
    - dom
    - iconv
    - curl
    - soap
db1:
  name: mag-db
  type: mysql
  &lt;/pre&gt;
&lt;p&gt;Then commit changes to the updated file and push changes to Pagoda Box:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ git commit -m "pagoda config"
$ git push pagoda --all
&lt;/pre&gt;
&lt;h3&gt;Alternate: Create a DB in the Dashboard&lt;/h3&gt;
&lt;p&gt;You can also create a database from the Pagoda Box Dashboard. This is where you add a larger, dedicated or redundant database.&lt;/p&gt;
&lt;p&gt;First, click &amp;#8220;Add Database&amp;#8221; in the Dashboard.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-add-db.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;Pagoda Box will step through a series of screens to configure your database, depending on your choices. If you&amp;#8217;ve chosen the Dedicated option, you will be asked to size your database as follows:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-dedicated-db.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;Cloud databases usually deploy within minutes. If you chosen Dedicated, don&amp;#8217;t get impatient. You may wait for up to 90 minutes for a big server to be provisioned to your specifications.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 8:&lt;/span&gt; Configure DB Credentials for Production&lt;/h2&gt;
&lt;p&gt;Your database automatically generates credentials when it&amp;#8217;s created on Pagoda Box. We&amp;#8217;ll use those credentials to configure Magento in production.&lt;/p&gt;
&lt;p&gt;However, since Magento will be used in both local environments and in production, we need to supply different database credentials for each. We&amp;#8217;ll use Deploy Hooks in the Boxfile to simplify this process by executing scripts or commands during deploy.&lt;/p&gt;
&lt;p&gt;In the case of Magento, we&amp;#8217;ll swap the &lt;code&gt;local.xml&lt;/code&gt; file upon deploy. That way, without manually switching credentials, the &lt;code&gt;app/etc/local.xml&lt;/code&gt; file will automatically have local database credentials in development, but production database credentials on Pagoda Box.&lt;/p&gt;
&lt;h3&gt;Create a local.xml for Production&lt;/h3&gt;
&lt;p&gt;First, create a directory named &lt;code&gt;pagoda&lt;/code&gt; in root, then copy Magento&amp;#8217;s &lt;code&gt;app/etc/local.xml&lt;/code&gt; to the new directory.&lt;/p&gt;
&lt;p&gt;Next, edit &lt;code&gt;local.xml&lt;/code&gt; to include Pagoda Box database credentials from your account dashboard. Note that Pagoda Box uses 3 levels of authentication, so that even if your credentials are compromised, other users cannot access your database.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-db-credentials.jpg" border="0" /&gt;&lt;/div&gt;
&lt;h3&gt;Swap local.xml Configs on Deploy&lt;/h3&gt;
&lt;p&gt;Add the following into your Boxfile, under the &lt;code&gt;web1&lt;/code&gt; section to create the Deploy Hook.&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
after_build:
  "mv pagoda/local.xml app/etc/local.xml"
&lt;/pre&gt;
&lt;p&gt;Your updated Boxfile should look like this:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
web1:
  name: mag-app
  shared_writable_dirs:
    - media
    - var
  php_version: 5.3.8
  php_extensions:
    - pdo_mysql
    - mysql
    - simplexml
    - mcrypt
    - hash
    - gd
    - dom
    - iconv
    - curl
    - soap
  after_build:
  - "mv pagoda/local.xml app/etc/local.xml"
db1:
  name: mag-db
  type: mysql
  &lt;/pre&gt;
&lt;p&gt;Then commit changes and push to Pagoda Box:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ git add .
$ git commit -m "pagoda config"
$ git push pagoda --all
&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 9:&lt;/span&gt; Migrate the Database&lt;/h2&gt;
&lt;blockquote&gt;&lt;p&gt;With the same tools you use to manage a local database, you can securely manage a live database on Pagoda Box. We&amp;#8217;ll use Sequel Pro for this example, but the process is similar for tools like HeidiSQL.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;Export Your Local DB&lt;/h3&gt;
&lt;p&gt;When the Magento install script ran locally, it created several tables in the local database. Those tables need to be migrated to production.&lt;/p&gt;
&lt;p&gt;First, export your local database using your database manager: File &gt; Export.&lt;/p&gt;
&lt;p&gt;Now choose a location, and Save the export.&lt;/p&gt;
&lt;h3&gt;Establish a Secure DB Connection&lt;/h3&gt;
&lt;p&gt;Now establish a database tunnel. Using the Pagoda Box Terminal Client, specify the app whose database you are trying to access, and the ID of the database component (e.g. db1), as in this example:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
$ pagoda -a magento tunnel -c db1
--OR--
$ pagoda --app=magento tunnel --component=db1
&lt;/pre&gt;
&lt;p&gt;Once the tunnel is established, use Sequel Pro (or similar) to connect to the database using the Host and Port provided by the Pagoda Terminal Client&amp;#8230;&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-host-port.png" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;And the username and password in your Pagoda database credentials. These were automatically created with your database, and may be found in the Pagoda Box Dashboard under the database component (see example in Step 8).&lt;/p&gt;
&lt;h3&gt;Import and Update the Production DB&lt;/h3&gt;
&lt;p&gt;Next, import your database into production using Sequel Pro (or similar): File &gt; Import. Now select the database export file, and Open.&lt;/p&gt;
&lt;p&gt;Finally, since we ran the install script locally, it&amp;#8217;s necessary to adjust the base url directly in the database before browsing the site. While you are still connected to the Pagoda Box database in Sequel Pro, navigate/filter to the &lt;code&gt;core_config_data&lt;/code&gt; table and edit the value for the following paths:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
web/unsecure/base_url
web/secure/base_url
&lt;/pre&gt;
&lt;/p&gt;
&lt;p&gt;The values for each should look something like this:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-sequel-pro.jpg" border="0" /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 10:&lt;/span&gt; Configure Mail&lt;/h2&gt;
&lt;p&gt;To protect your IPs from being flagged as spam, Pagoda Box uses the SMTP mail protocol to send email via third party mail provider SMTP credentials. In English, that means you need a company (like Gmail) that provides mail services.&lt;/p&gt;
&lt;p&gt;Regardless of which mail provider you choose, enter account credentials from that provider in your Pagoda Box dashboard. It should look something like this:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-mail-dash.jpg" border="0" /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 11:&lt;/span&gt; Cron Jobs (Optional)&lt;/h2&gt;
&lt;p&gt;A few recurring tasks in Magento (e.g. sending newsletters, log cleaning, customer notifications, etc.) need to happen periodically. The &lt;code&gt;cron.php&lt;/code&gt; file located in Magento&amp;#8217;s root will trigger these tasks. We&amp;#8217;ll set up a Cron Job in the Pagoda Box admin panel to run &lt;code&gt;cron.php&lt;/code&gt; every 15 minutes. (Note: To configure Magento specific tasks, see their &lt;a target="_blank" href="http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/how_to_setup_a_cron_job#unixbsdlinux"&gt;Official Guide.&lt;/a&gt;)&lt;/p&gt;
&lt;h3&gt;Cron Jobs in the Boxfile&lt;/h3&gt;
&lt;p&gt;Cron Jobs can be added or updated via the Boxfile, then deployed to Pagoda Box. To schedule a task at 15 minute intervals, add the following to your Boxfile under the &lt;code&gt;web1:&lt;/code&gt; component (change the &amp;#8220;magento&amp;#8221; to point to your own app name / subdomain):&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
  cron:
    - "*/15 * * * *": "curl -s -o /dev/null http://magento.pagodabox.com/cron.php"
    &lt;/pre&gt;
&lt;p&gt;Your updated Boxfile should look like this:&lt;/p&gt;
&lt;pre name="code" class="php"&gt;
web1:
  name: mag-app
  shared_writable_dirs:
    - media
    - var
  php_version: 5.3.8
  php_extensions:
    - pdo_mysql
    - mysql
    - simplexml
    - mcrypt
    - hash
    - gd
    - dom
    - iconv
    - curl
    - soap
  after_build:
  - "mv pagoda/local.xml app/etc/local.xml"
cron:
    - "*/15 * * * *": "curl -s -o /dev/null http://magento.pagodabox.com/cron.php"
db1:
  name: mag-db
  type: mysql
  &lt;/pre&gt;
&lt;h3&gt;Alternate: Cron Jobs in the Dashboard&lt;/h3&gt;
&lt;p&gt;In the Pagoda Box admin panel under the Cron tab, add the following (change the &amp;#8220;magento&amp;#8221; to point to your own app name):&lt;/p&gt;
&lt;p&gt;Command: &lt;code&gt;curl -s -o /dev/null http://magento.pagodabox.com/cron.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Schedule:  &lt;code&gt;*/15 * * * *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It should look like this:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2038_magentoScale/pagoda-cron-dash.jpg" border="0" /&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Part 2 &amp;#8211; Optimization:&lt;/span&gt; Redis, Scaling &amp;#038; Benchmarking&lt;/h2&gt;
&lt;p&gt;You&amp;#8217;ve already gotten the heavy lifting out of the way. Your Magento application is scalable, and changes are easily deployed across all instances with &lt;code&gt;$ git push pagoda --all&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In the follow-up article, we&amp;#8217;ll optimize Magento, add a Redis cache, SSL and Domain aliases, then scale the application for benchmarking and production. See you soon!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1OdT8LdpaogNCO6HShnsrFZuHRA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1OdT8LdpaogNCO6HShnsrFZuHRA/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/1OdT8LdpaogNCO6HShnsrFZuHRA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1OdT8LdpaogNCO6HShnsrFZuHRA/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=gCVIO2Y0hy4:iklNFAMdN6o: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=gCVIO2Y0hy4:iklNFAMdN6o:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gCVIO2Y0hy4:iklNFAMdN6o:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gCVIO2Y0hy4:iklNFAMdN6o:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gCVIO2Y0hy4:iklNFAMdN6o:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gCVIO2Y0hy4:iklNFAMdN6o:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gCVIO2Y0hy4:iklNFAMdN6o:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gCVIO2Y0hy4:iklNFAMdN6o: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/gCVIO2Y0hy4" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/php/how-to-super-scale-magento-in-the-cloud/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/php/how-to-super-scale-magento-in-the-cloud/</feedburner:origLink></item>
		<item>
		<title>Lots Of New Premium Content!</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/FDs5xPovxac/</link>
		<comments>http://net.tutsplus.com/articles/news/lots-of-new-premium-content/#comments</comments>
		<pubDate>Mon, 14 May 2012 19:57:16 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Premium]]></category>
		<category><![CDATA[Videos]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=25004</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25004&amp;c=756316549' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=25004&amp;c=756316549' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;As &lt;a href="http://tutsplus.com"&gt;Tuts+ Premium&lt;/a&gt; continues to sky-rocket, our ability to post better, more frequent, content has improved dramatically as well. This week, we have a variety of fun new things available to members! &lt;/p&gt;
&lt;p&gt;&lt;span id="more-25004"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Course &amp;#8211; &lt;/span&gt;&lt;a href="http://tutsplus.com/course/how-to-be-a-terminal-pro/"&gt;How To Be A Terminal Pro&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2037_premiumPromo/Newsletter_Termpro.png" style="float: left; margin-right: 20px; margin-bottom: 40px; border: 1px solid #c5c5c5;"&gt;&lt;/p&gt;
&lt;p style="margin-top: -20px;"&gt;In this fifteen-episode course, you’ll learn how to take advantage of that scary app you never touch: Terminal! We’ll begin with the obligatory “hello world” command, and work our way up to advanced usage.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Course &amp;#8211; &lt;/span&gt;&lt;a href="http://tutsplus.com/course/javascript-testing-with-jasmine-2/"&gt;JavaScript Testing With Jasmine&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2037_premiumPromo/NewsletterJasmine.png" style="float: left; margin-right: 20px; border: 1px solid #c5c5c5;"&gt;&lt;/p&gt;
&lt;p style="margin-top: -20px;"&gt;Admit it: you say that you test your JavaScript, but, in reality, you…don’t. That’s okay; the idea of testing JavaScript is a relatively new thing. And unfortunately, there aren’t too many “hold your hand” resources for getting up and running. Well, that all changes with this course. We start from scratch, and slowly work our way up the testing chain.&lt;/p&gt;
&lt;p&gt;
Along the way, we’ll take advantage of the fantastic Jasmine BDD (Behavior-Driven Development) framework to make our tests as readable as possible. Upon completion of the course, you’ll not only have a robust test suite at your fingertips, but your tests will also make for fantastic documentation!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;eBook -&lt;/span&gt; &lt;a href="http://tutsplus.com/ebook/client-centric-web-design/" alt="Client Centric Web Design"&gt;Client Centric Web Design&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://tutsplus.com/wp-content/uploads/2012/05/clientcentric.png" style="float: left; padding-right: 20px; padding-bottom: 20px;"&gt;&lt;/p&gt;
&lt;p style="margin-top: -20px;"&gt;Other than Internet Explorer, what is the most challenging part of your job? Did you answer clients? If so, this eBook, by Paul Boag, is for you. Discover how to keep your clients happy, maintain your own sanity and produce the most effective websites you have ever built, resulting in happier clients, better websites, and improved job satisfaction.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;eBook -&lt;/span&gt; &lt;a href="http://tutsplus.com/ebook/building-websites-for-return-on-investment/"&gt;Building Websites for Return on Investment&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://tutsplus.com/wp-content/uploads/2012/05/websiteforreturninvest.png" style="float: left; padding-right: 20px; padding-bottom: 20px;" alt="Building Websites For Return on Investment"&gt;&lt;/p&gt;
&lt;p style="margin-top: -20px;"&gt;‘Building Websites for Return on Investment’ uncovers the secrets of sites that successfully generate real return on investment. This book will enable you to transform your website from an expense to a measurable source of income.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;Article &amp;#8211; &lt;/span&gt;&lt;a href="http://tutsplus.com/tutorial/are-you-using-coffeescript/"&gt;Are You Using CoffeeScript?&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src="http://tutsplus.com/wp-content/uploads/2012/05/coffeescript-1-100x100.jpg" style="float: left; padding-right: 20px; padding-bottom: 20px;"&gt;&lt;/p&gt;
&lt;p style="margin-top: -20px;"&gt;For those who haven&amp;#8217;t yet had the chance to dig into CoffeeScript, this article will get you up and running in no time!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Coming Soon to Tuts+ Premium&lt;/h2&gt;
&lt;p&gt;Nothing above pique your interest? That&amp;#8217;s okay; we have plenty of amazing new content on the near horizon, including the following courses: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP Fundamentals
&lt;li&gt;What&amp;#8217;s New in PHP 5.4?
&lt;li&gt;Cleaner Code With CoffeeScript
&lt;li&gt;Backbone.js Fundamentals
&lt;li&gt;The Sublime Text 2 Guide
&lt;li&gt;Test-Driven Development in Ruby
&lt;/ul&gt;
&lt;p&gt;Already a member? What requests do you have? Haven&amp;#8217;t signed up yet? Well now&amp;#8217;s &lt;a href="http://tutsplus.com/take-the-tour/"&gt;the perfect time&lt;/a&gt;! &lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6dxolMlpsu1J29KnbohpQRhZ05c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6dxolMlpsu1J29KnbohpQRhZ05c/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/6dxolMlpsu1J29KnbohpQRhZ05c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6dxolMlpsu1J29KnbohpQRhZ05c/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=FDs5xPovxac:9af7cCluTRA: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=FDs5xPovxac:9af7cCluTRA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=FDs5xPovxac:9af7cCluTRA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=FDs5xPovxac:9af7cCluTRA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=FDs5xPovxac:9af7cCluTRA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=FDs5xPovxac:9af7cCluTRA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=FDs5xPovxac:9af7cCluTRA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=FDs5xPovxac:9af7cCluTRA: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/FDs5xPovxac" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/lots-of-new-premium-content/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/lots-of-new-premium-content/</feedburner:origLink></item>
		<item>
		<title>How to Convert a Widget into a Joomla Module</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/14W81V-2kSo/</link>
		<comments>http://net.tutsplus.com/tutorials/how-to-convert-a-widget-into-a-joomla-module/#comments</comments>
		<pubDate>Fri, 11 May 2012 13:00:25 +0000</pubDate>
		<dc:creator>KazKarizmatic</dc:creator>
				<category><![CDATA[CMSs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[joomla]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[widgets]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24993</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24993&amp;c=579049213' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24993&amp;c=579049213' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;This tutorial will cover the process of creating a basic Joomla module from an existing widget. We&amp;#8217;re going to take a widget from &lt;a href="http://mixcloud.com"&gt;Mixcloud&lt;/a&gt;, learn how to convert it into a Joomla module and, finally, distribute the extension to JED (Joomla Extension Directory).&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve never created a Joomla module before, this article is the best place to start!&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24993"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 1:&lt;/span&gt; Setting up Our Files&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/file_struc.jpg" border="0" /&gt;&lt;/div&gt;
&lt;h3&gt; Basic Files &lt;/h3&gt;
&lt;p&gt;For every module created for Joomla, there are two files that absolutely need to be present. One file is a configuration XML file that will hold the module details and parameters and a PHP file that will control our module. For the purpose of this tutorial, we will create a folder called &lt;code&gt;mod_mixcloud_widget&lt;/code&gt; and, within it, using your favorite code editor, create &lt;code&gt;mod_mixcloud_widget.php&lt;/code&gt; and &lt;code&gt;mod_mixcloud_widget.xml&lt;/code&gt;. Before we move on to the next step, create a single  HTML file named &lt;code&gt;index.html&lt;/code&gt;.The &lt;code&gt;index.html&lt;/code&gt; file that was created will be used to hide the contents of the module folder when viewing via a browser.&lt;/p&gt;
&lt;h3&gt; Template Files &lt;/h3&gt;
&lt;p&gt;
Now that you&amp;#8217;ve added the core files, it&amp;#8217;s time to add the template files. We do this by creating a folder called &lt;code&gt;tmpl&lt;/code&gt;. Within that folder, we create &lt;code&gt;default.php&lt;/code&gt; and &lt;code&gt;index.html&lt;/code&gt;. The file &lt;code&gt;default.php&lt;/code&gt; will be the module template that will take generated information and output them into clean HTML format on the page.
&lt;/p&gt;
&lt;h3&gt; Language Files &lt;/h3&gt;
&lt;p&gt;
Lastly, while inside our root module folder, we create a new folder called &lt;code&gt;language&lt;/code&gt;. This folder will have two files: &lt;code&gt;en-GB.mod_mixcloud_widget.ini&lt;/code&gt; and &lt;code&gt;en-GB.mod_mixcloud_widget.sys.ini&lt;/code&gt; which will be used to make our module internationable with the option of having different languages.
&lt;/p&gt;
&lt;h3&gt; Final File Structure &lt;/h3&gt;
&lt;p&gt;
After following each step, you should have the following file structure&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;language/en-GB.mod_mixcloud_widget.ini&lt;/li&gt;
&lt;li&gt;language/en-GB.mod_mixcloud_widget.sys.ini&lt;/li&gt;
&lt;li&gt;tmpl/default.php&lt;/li&gt;
&lt;li&gt;tmpl/index.html&lt;/li&gt;
&lt;li&gt;index.html&lt;/li&gt;
&lt;li&gt;mod_mixcloud_widget.php&lt;/li&gt;
&lt;li&gt;mod_mixcloud_widget.xml&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 2:&lt;/span&gt; Setting Up Our XML File&lt;/h2&gt;
&lt;p&gt;Each Joomla Extension installed has an XML file, which is referred to as a &lt;em&gt;manifest&lt;/em&gt; or &lt;em&gt;Install&lt;/em&gt; file. This file contains metadata details, such as author, version, description etc. It is also used as a configuration file for module prameters. For the purpose of this tutorial, we will be creating a manifest file for a Joomla 2.5 module. Add the following snippet to your XML file.&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;extension 	type=&amp;quot;module&amp;quot;	version=&amp;quot;2.5&amp;quot;	client=&amp;quot;site&amp;quot;	method=&amp;quot;upgrade&amp;quot;&amp;gt;
	&amp;lt;name&amp;gt;MOD_MIXCLOUD_WIDGET&amp;lt;/name&amp;gt;
	&amp;lt;author&amp;gt;B4ucode&amp;lt;/author&amp;gt;
	&amp;lt;creationDate&amp;gt;May 2012&amp;lt;/creationDate&amp;gt;
	&amp;lt;copyright&amp;gt;Copyright (C) 2011 - 2012. All rights reserved.&amp;lt;/copyright&amp;gt;
	&amp;lt;license&amp;gt;GNU General Public License version 2 or later;&amp;lt;/license&amp;gt;
	&amp;lt;authorEmail&amp;gt;info@b4ucode.com&amp;lt;/authorEmail&amp;gt;
	&amp;lt;authorUrl&amp;gt;www.b4ucode.com&amp;lt;/authorUrl&amp;gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
	&amp;lt;description&amp;gt;MOD_MIXCLOUD_WIDGET_XML_DESCRIPTION&amp;lt;/description&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The primary tag &lt;code&gt;extension&lt;/code&gt; has a few attributes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;type: Tells Joomla what type of extension is being installed, in this case &lt;code&gt;module&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;version: Instructs the installer what version of Joomla we are creating the module for.&lt;/li&gt;
&lt;li&gt;method: There are two options: &lt;code&gt;new&lt;/code&gt; and &lt;code&gt;upgrade&lt;/code&gt;. We will be using upgrade, in case of any future updates to the module, it will simply upgrade what is currently there.&lt;/li&gt;
&lt;li&gt;client: Instructs whether the module is a front-end or back-end module.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The other set of tags are metadata tags which hold information about the module which will be used during installation and the administration of the module.&lt;/p&gt;
&lt;h3&gt; Module Files &lt;/h3&gt;
&lt;p&gt;As mentioned before, the manifest file holds information about the files used in the module. During installation, Joomla checks the manifest file for all the files that should be added to the system. If any of the files are missing, then Joomla will give an error explaining the files that are missing. Any files found in the module, that aren&amp;#8217;t listed in the XML file are not added to the system with the others. Add the following snippet to your manifest file.&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
	&amp;lt;files&amp;gt;
		&amp;lt;filename module=&amp;quot;mod_mixcloud_widget&amp;quot;&amp;gt;mod_mixcloud_widget.php&amp;lt;/filename&amp;gt;
		&amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;
		&amp;lt;filename&amp;gt;index.html&amp;lt;/filename&amp;gt;
		&amp;lt;filename&amp;gt;mod_mixcloud_widget.xml&amp;lt;/filename&amp;gt;
	&amp;lt;/files&amp;gt;
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;
Instead of writing a line for each file in a folder, we simply use the folder element. This element will instruct the installer to install all the files in this folder.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt; Language Files &lt;/h3&gt;
&lt;p&gt;This element holds the language files that are to be installed with the module. For the purpose of this tutorial, only one language will be used. When there are more languages, you can simply change the prefix of the files and the tag attribute to the exact language based on the Joomla framework.&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
	&amp;lt;languages&amp;gt;
		&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB.mod_mixcloud_widget.ini&amp;lt;/language&amp;gt;
		&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB.mod_mixcloud_widget.sys.ini&amp;lt;/language&amp;gt;
	&amp;lt;/languages&amp;gt;
&lt;/pre&gt;
&lt;h3&gt; Adding Parameters &lt;/h3&gt;
&lt;p&gt;Some extensions don&amp;#8217;t work right out of the box, but need certain settings added: these settings are called, parameters, and are defined in the manifest file.&lt;/p&gt;
&lt;p&gt;The first element is &lt;code&gt;config&lt;/code&gt; which holds other elements that will be displayed in HTML format.  The element called &lt;code&gt;field&lt;/code&gt; is the meat of our parameters where you can define what type of form data you wish to display. This element at its basic level is made up of some core attributes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;type:&lt;/strong&gt; Type of form field  like text, textarea, checkboxes, radio and calendar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;name:&lt;/strong&gt; The name element of the form field to displayed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;default:&lt;/strong&gt; Default value of the field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;label:&lt;/strong&gt; Text displayed at the beginning of our form field.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;description:&lt;/strong&gt; Description that will be shown in a tooltip when hovering on our form field&lt;/li&gt;
&lt;p&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;There are different attributes as they vary per form field type like size, filter, exclude, directory and more.&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
	&amp;lt;config&amp;gt;
		&amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;
			&amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;
				&amp;lt;field type=&amp;quot;text&amp;quot; name=&amp;quot;feed&amp;quot; default=&amp;quot;&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_FEED_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_FEED_DESC&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;color&amp;quot; type=&amp;quot;color&amp;quot; default=&amp;quot;&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_COLOR_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_COLOR_DESC&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;width&amp;quot; type=&amp;quot;text&amp;quot; default=&amp;quot;300&amp;quot; size=&amp;quot;40&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_WIDTH_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_WIDTH_DESCRIPTION&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;height&amp;quot; type=&amp;quot;text&amp;quot; default=&amp;quot;300&amp;quot; size=&amp;quot;40&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_HEIGHT_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_HEIGHT_DESCRIPTION&amp;quot; /&amp;gt;
			&amp;lt;/fieldset&amp;gt;
			&amp;lt;fieldset
				name=&amp;quot;advanced&amp;quot;&amp;gt;
				&amp;lt;field
					name=&amp;quot;layout&amp;quot;
					type=&amp;quot;modulelayout&amp;quot;
					label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;
					description=&amp;quot;JFIELD_ALT_module_LAYOUT_DESC&amp;quot; /&amp;gt;
				&amp;lt;field
					name=&amp;quot;moduleclass_sfx&amp;quot;
					type=&amp;quot;text&amp;quot;
					label=&amp;quot;COM_moduleS_FIELD_moduleCLASS_SFX_LABEL&amp;quot;
					description=&amp;quot;COM_moduleS_FIELD_moduleCLASS_SFX_DESC&amp;quot; /&amp;gt;
				&amp;lt;field
					name=&amp;quot;owncache&amp;quot;
					type=&amp;quot;list&amp;quot;
					default=&amp;quot;1&amp;quot;
					label=&amp;quot;COM_moduleS_FIELD_CACHING_LABEL&amp;quot;
					description=&amp;quot;COM_moduleS_FIELD_CACHING_DESC&amp;quot;&amp;gt;
					&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;
					&amp;lt;option	value=&amp;quot;0&amp;quot;&amp;gt;COM_moduleS_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;
				&amp;lt;/field&amp;gt;
			&amp;lt;/fieldset&amp;gt;
		&amp;lt;/fields&amp;gt;
	&amp;lt;/config&amp;gt;
&amp;lt;/extension&amp;gt;
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;
You may notice that we have written labels and description in some uppercase characters like &lt;code&gt;MOD_MIXCLOUD_WIDGET_FEED_TITLE&lt;/code&gt;. These are strings that we will make translatable when creating our language files.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt; Finished XML File &lt;/h3&gt;
&lt;p&gt;If you&amp;#8217;ve followed thus far, you should have a completed XML File like following
&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;extension 	type=&amp;quot;module&amp;quot;	version=&amp;quot;2.5&amp;quot;	client=&amp;quot;site&amp;quot;	method=&amp;quot;upgrade&amp;quot;&amp;gt;
	&amp;lt;name&amp;gt;MOD_MIXCLOUD_WIDGET&amp;lt;/name&amp;gt;
	&amp;lt;author&amp;gt;B4ucode&amp;lt;/author&amp;gt;
	&amp;lt;creationDate&amp;gt;May 2012&amp;lt;/creationDate&amp;gt;
	&amp;lt;copyright&amp;gt;Copyright (C) 2011 - 2012 Open Source Matters. All rights reserved.&amp;lt;/copyright&amp;gt;
	&amp;lt;license&amp;gt;GNU General Public License version 2 or later;&amp;lt;/license&amp;gt;
	&amp;lt;authorEmail&amp;gt;info@b4ucode.com&amp;lt;/authorEmail&amp;gt;
	&amp;lt;authorUrl&amp;gt;www.b4ucode.com&amp;lt;/authorUrl&amp;gt;
	&amp;lt;version&amp;gt;1.0.0&amp;lt;/version&amp;gt;
	&amp;lt;description&amp;gt;MOD_MIXCLOUD_WIDGET_XML_DESCRIPTION&amp;lt;/description&amp;gt;
	&amp;lt;files&amp;gt;
		&amp;lt;filename module=&amp;quot;mod_mixcloud_widget&amp;quot;&amp;gt;mod_mixcloud_widget.php&amp;lt;/filename&amp;gt;
		&amp;lt;folder&amp;gt;tmpl&amp;lt;/folder&amp;gt;
		&amp;lt;filename&amp;gt;index.html&amp;lt;/filename&amp;gt;
		&amp;lt;filename&amp;gt;mod_mixcloud_widget.xml&amp;lt;/filename&amp;gt;
	&amp;lt;/files&amp;gt;
	&amp;lt;languages&amp;gt;
		&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB.mod_mixcloud_widget.ini&amp;lt;/language&amp;gt;
		&amp;lt;language tag=&amp;quot;en-GB&amp;quot;&amp;gt;language/en-GB.mod_mixcloud_widget.sys.ini&amp;lt;/language&amp;gt;
	&amp;lt;/languages&amp;gt;
	&amp;lt;config&amp;gt;
		&amp;lt;fields name=&amp;quot;params&amp;quot;&amp;gt;
			&amp;lt;fieldset name=&amp;quot;basic&amp;quot;&amp;gt;
				&amp;lt;field type=&amp;quot;text&amp;quot; name=&amp;quot;feed&amp;quot; default=&amp;quot;&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_FEED_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_FEED_DESC&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;color&amp;quot; type=&amp;quot;color&amp;quot; default=&amp;quot;&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_COLOR_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_COLOR_DESC&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;width&amp;quot; type=&amp;quot;text&amp;quot; default=&amp;quot;300&amp;quot; size=&amp;quot;40&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_WIDTH_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_WIDTH_DESCRIPTION&amp;quot; /&amp;gt;
				&amp;lt;field name=&amp;quot;height&amp;quot; type=&amp;quot;text&amp;quot; default=&amp;quot;300&amp;quot; size=&amp;quot;40&amp;quot; label=&amp;quot;MOD_MIXCLOUD_WIDGET_HEIGHT_TITLE&amp;quot; description=&amp;quot;MOD_MIXCLOUD_WIDGET_HEIGHT_DESCRIPTION&amp;quot; /&amp;gt;
			&amp;lt;/fieldset&amp;gt;
			&amp;lt;fieldset
				name=&amp;quot;advanced&amp;quot;&amp;gt;
				&amp;lt;field
					name=&amp;quot;layout&amp;quot;
					type=&amp;quot;modulelayout&amp;quot;
					label=&amp;quot;JFIELD_ALT_LAYOUT_LABEL&amp;quot;
					description=&amp;quot;JFIELD_ALT_module_LAYOUT_DESC&amp;quot; /&amp;gt;
				&amp;lt;field
					name=&amp;quot;moduleclass_sfx&amp;quot;
					type=&amp;quot;text&amp;quot;
					label=&amp;quot;COM_moduleS_FIELD_moduleCLASS_SFX_LABEL&amp;quot;
					description=&amp;quot;COM_moduleS_FIELD_moduleCLASS_SFX_DESC&amp;quot; /&amp;gt;
				&amp;lt;field
					name=&amp;quot;owncache&amp;quot;
					type=&amp;quot;list&amp;quot;
					default=&amp;quot;1&amp;quot;
					label=&amp;quot;COM_moduleS_FIELD_CACHING_LABEL&amp;quot;
					description=&amp;quot;COM_moduleS_FIELD_CACHING_DESC&amp;quot;&amp;gt;
					&amp;lt;option value=&amp;quot;1&amp;quot;&amp;gt;JGLOBAL_USE_GLOBAL&amp;lt;/option&amp;gt;
					&amp;lt;option	value=&amp;quot;0&amp;quot;&amp;gt;COM_moduleS_FIELD_VALUE_NOCACHING&amp;lt;/option&amp;gt;
				&amp;lt;/field&amp;gt;
			&amp;lt;/fieldset&amp;gt;
		&amp;lt;/fields&amp;gt;
	&amp;lt;/config&amp;gt;
&amp;lt;/extension&amp;gt;
&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 3:&lt;/span&gt; Creating &lt;code&gt;mod_mixcloud_widget.php&lt;/code&gt;  &lt;/h2&gt;
&lt;p&gt;The first thing you want to with your module is to add your copyright notice. If you intend to submit your module to JED [Joomla Extension Directory], you should add some GPL license information.&lt;/p&gt;
&lt;p&gt; This is one of the checks done before approving a module into the directory. Directly below this, I use the statement &lt;code&gt;defined('_JEXEC') or die;&lt;/code&gt; which is used in most PHP files to protect against hackers. This is also another requirement for approval on JED.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt;?php
/**
 * @package		B4ucode
 * @subpackage	mod_mixcloud_widget
 * @copyright	Copyright (C) 2011 - 2012 B4ucode, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later;
 */
// no direct access
defined('_JEXEC') or die;
&lt;/pre&gt;
&lt;p&gt;Next, we define our paramaters as variables. Developers sometimes define their paramaters as variables in order to have cleaner template files. In order to call a paramaters we use the &lt;code&gt;$params-&gt;get()&lt;/code&gt; function and get the param &lt;code&gt;name&lt;/code&gt; defined in our manifest file. Finally, we call the module Helper function, &lt;code&gt;getLayoutPath&lt;/code&gt;, which will render our module template. The first argument of the function takes the module name that we are trying to call, then the second argument looks for the template we intend to render for that module. In this case, we get the parameter &lt;code&gt;layout&lt;/code&gt; and in the second argument we set the default layout to be &lt;code&gt;default&lt;/code&gt;. This layout is the exact name of the file that we have in our &lt;code&gt;tmpl&lt;/code&gt; folder.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
$width = $params-&amp;gt;get('width',300);
$height = $params-&amp;gt;get('height',300);
$feed = $params-&amp;gt;get('feed');
$color = $params-&amp;gt;get('color');
$moduleclass_sfx = htmlspecialchars($params-&amp;gt;get('moduleclass_sfx'));
require JmoduleHelper::getLayoutPath('mod_mixcloud_widget', $params-&amp;gt;get('layout', 'default'));
?&amp;gt;
&lt;/pre&gt;
&lt;h3&gt; Finished File &lt;/h3&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	&amp;lt;?php
/**
 * @package		B4ucode
 * @subpackage	mod_mixcloud_widget
 * @copyright	Copyright (C) 2011 - 2012 B4ucode, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later;
 */
// no direct access
defined('_JEXEC') or die;
    $width = $params-&amp;gt;get('width',300);
    $height = $params-&amp;gt;get('height',300);
    $feed = $params-&amp;gt;get('feed');
    $color = $params-&amp;gt;get('color');
    $moduleclass_sfx = htmlspecialchars($params-&amp;gt;get('moduleclass_sfx'));
    require JmoduleHelper::getLayoutPath('mod_mixcloud_widget', $params-&amp;gt;get('layout', 'default'));
?&amp;gt;
&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 4:&lt;/span&gt; Creating &lt;code&gt;default.php&lt;/code&gt;  &lt;/h2&gt;
&lt;p&gt;At this point, we have created our manifest file with paramaters, took those same parameters and turned them into variables. In this step, we are going to use those variables in our template file. The template file will render all of our HTML for the module. Edit &lt;code&gt;default.php&lt;/code&gt; from your &lt;code&gt;tmpl&lt;/code&gt; folder and add the following snippets:&lt;/p&gt;
&lt;h3&gt;Copyright Notice and Restricted Access Script&lt;/h3&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt;?php
  /**
 * @package		B4ucode
 * @subpackage	mod_mixcloud_widget
 * @copyright	Copyright (C) 2011 - 2012 B4ucode, Inc. All rights reserved.
 * @license		GNU General Public License version 2 or later;
 */
 // no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;
It is recommended that you add the Copyright Notice and Restricted Access line to your PHP files.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Adding our HTML&lt;/h3&gt;
&lt;p&gt;For this tutorial, we will need the embed code from Mixcloud. &lt;a href="http://www.mixcloud.com/widgets/" target="_blank"&gt;Here &lt;/a&gt; is an example on getting the code . Our module&amp;#8217;s purpose is to make the code reusable without having to get the embed each  time we want to create or modify a Mixcloud Widget on our site. The default embed code comes with some extra information about the widget content which we don&amp;#8217;t need. So for this tutorial, I have stripped it down to just the embed script. Paste this embed code to your &lt;code&gt;default.php&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
&amp;lt;div&amp;gt;&amp;lt;object width=&amp;quot;480&amp;quot; height=&amp;quot;480&amp;quot;&amp;gt;&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?feed=http%3A%2F%2Fwww.mixcloud.com%2FMaryAnneHobbs%2Fthom-yorke-moneyback-mix-xfm-music-response-150911%2F&amp;amp;amp;embed_uuid=5d6c18a4-a837-409e-8cec-23ab44372842&amp;amp;amp;stylecolor=&amp;amp;amp;embed_type=widget_standard&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;wmode&amp;quot; value=&amp;quot;opaque&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowscriptaccess&amp;quot; value=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src=&amp;quot;http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?feed=http%3A%2F%2Fwww.mixcloud.com%2FMaryAnneHobbs%2Fthom-yorke-moneyback-mix-xfm-music-response-150911%2F&amp;amp;amp;embed_uuid=5d6c18a4-a837-409e-8cec-23ab44372842&amp;amp;amp;stylecolor=&amp;amp;amp;embed_type=widget_standard&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; wmode=&amp;quot;opaque&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; allowfullscreen=&amp;quot;true&amp;quot; width=&amp;quot;480&amp;quot; height=&amp;quot;480&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Making the Script Configurable&lt;/h3&gt;
&lt;p&gt;If we wanted to embed one widget permanently, we could just zip up the module right now. However we don&amp;#8217;t, so we are going to replace some of the attributes with our module params . We&amp;#8217;re going to change the &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt; and &lt;code&gt;feed&lt;/code&gt;. Paste the following snippet over your embed script.&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
	&amp;lt;div&amp;gt;&amp;lt;object width=&amp;quot;&amp;lt;?php echo $width; ?&amp;gt;&amp;quot; height=&amp;quot;&amp;lt;?php echo $height; ?&amp;gt;&amp;quot;&amp;gt;
&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?feed=&amp;lt;?php echo $feed; ?&amp;gt;&amp;amp;amp;embed_uuid=&amp;amp;amp;stylecolor=&amp;lt;?php echo $color; ?&amp;gt;&amp;amp;amp;embed_type=widget_standard&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowFullScreen&amp;quot; value=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;wmode&amp;quot; value=&amp;quot;opaque&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;param name=&amp;quot;allowscriptaccess&amp;quot; value=&amp;quot;always&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&amp;lt;embed src=&amp;quot;http://www.mixcloud.com/media/swf/player/mixcloudLoader.swf?feed=&amp;lt;?php echo $feed; ?&amp;gt;&amp;amp;amp;embed_uuid=&amp;amp;amp;stylecolor=&amp;lt;?php echo $color; ?&amp;gt;&amp;amp;amp;embed_type=widget_standard&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; wmode=&amp;quot;opaque&amp;quot; allowscriptaccess=&amp;quot;always&amp;quot; allowfullscreen=&amp;quot;true&amp;quot; width=&amp;quot;&amp;lt;?php echo $width; ?&amp;gt;&amp;quot; height=&amp;quot;&amp;lt;?php echo $height; ?&amp;gt;&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&amp;lt;/object&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;
Take note of how we are just calling the variables from our controller file.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 5:&lt;/span&gt; Creating Language Files &lt;/h2&gt;
&lt;p&gt;In step one, you might have noticed that we created a folder, called language, with two files. Then, in step two, we added some translatable text. In this section, we are going to translate that text to English. Insert the following snippet to the ini files, &lt;code&gt;en-GB.mod_mixcloud_widget.sys.ini&lt;/code&gt; and &lt;code&gt;en-GB.mod_mixcloud_widget.ini&lt;/code&gt;. &lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
; B4ucode
; Copyright (C) 2011 - 2012 B4ucode. All rights reserved.
; License GNU General Public License version 2 or later;
; Note : All ini files need to be saved as UTF-8 - No BOM

MOD_MIXCLOUD_WIDGET=&amp;quot;Mixcloud Widget&amp;quot;
MOD_MIXCLOUD_WIDGET_XML_DESCRIPTION=&amp;quot;This module displays the Mixcloud Widget using feed and other paramaters&amp;quot;
MOD_MIXCLOUD_WIDGET_ITEMS_LAYOUT_DEFAULT=&amp;quot;Default&amp;quot;
MOD_MIXCLOUD_WIDGET_FEED_TITLE=&amp;quot;Feed Url&amp;quot;
MOD_MIXCLOUD_WIDGET_FEED_DESC=&amp;quot;Add the link to single/cloudcast&amp;quot;
MOD_MIXCLOUD_WIDGET_COLOR_TITLE=&amp;quot;Color&amp;quot;
MOD_MIXCLOUD_WIDGET_COLOR_DESC=&amp;quot;Add Style color&amp;quot;
MOD_MIXCLOUD_WIDGET_WIDTH_TITLE=&amp;quot;Width&amp;quot;
MOD_MIXCLOUD_WIDGET_WIDTH_DESCRIPTION=&amp;quot;Width of Widget&amp;quot;
MOD_MIXCLOUD_WIDGET_HEIGHT_TITLE=&amp;quot;Height&amp;quot;
MOD_MIXCLOUD_WIDGET_HEIGHT_DESCRIPTION=&amp;quot;Height of Widget&amp;quot;
&lt;/pre&gt;
&lt;p&gt;If you look closely, you will notice that the text I used for the parameters now have an English translation. You can add other files and create translations in other languages!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 6:&lt;/span&gt; Packaging the Module &lt;/h2&gt;
&lt;p&gt;After following all the steps thoroughly, your module is now installable, but we&amp;#8217;d like to make a checklist of things to do before installation and distribution.&lt;/p&gt;
&lt;h3&gt;Add &lt;code&gt;index.html&lt;/code&gt; to Folders&lt;/h3&gt;
&lt;p&gt;It is recommended that you add a &lt;code&gt;index.html&lt;/code&gt; file to each folder. This file, as mentioned previously, stops users from viewing the contents of a module folder directly in a browser. Add the following snippet to your files:&lt;/p&gt;
&lt;pre class="brush: xml; title: ; notranslate"&gt;
	&amp;lt;html&amp;gt;&amp;lt;body bgcolor=&amp;quot;#FFFFFF&amp;quot;&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;h3&gt;Comparing our File Structure to the Manifest File&lt;/h3&gt;
&lt;p&gt;At this stage, it is recommended that you look  at the files and folder defined in your manifest file, and make sure they exist in your module folder. Any file that does not exist can stop the installer from installing files, or, it may throw an error.&lt;/p&gt;
&lt;h3&gt;Packaging&lt;/h3&gt;
&lt;p&gt;After our little checklist, we can package the module into a zip file, and install it.&lt;/p&gt;
&lt;p&gt;By navigating to the modules manager, and selecting the module, you can modify the paramaters with your desired width, height, color and song feed.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/mod-params1.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt; Enable the module and check to see if it operates the way that it should.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;Step 7:&lt;/span&gt; Submitting to JED &lt;/h2&gt;
&lt;h3&gt;Locating the Category&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-1.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;After registering to JED, one of the main things to note is that you cannot add an extension to multiple sections. So, choosing the appropriate section is very important. Find a suitable section by browsing the site then looking at the top left cornder you will see Submit Extension&lt;/p&gt;
&lt;h3&gt;Filling Out the Details&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-2.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;Once you&amp;#8217;ve chosen to submit an extension, there will be a form to fill in all the details about your submission. Review the screenshots below to see the different fields to be filled out, and read the instructions carefully.&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-3.jpg" border="0" /&gt;&lt;/div&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-4.jpg" border="0" /&gt;&lt;/div&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-5.jpg" border="0" /&gt;&lt;/div&gt;
&lt;h3&gt;Success Image&lt;/h3&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/1157_joomla/jdistrib-6.jpg" border="0" /&gt;&lt;/div&gt;
&lt;p&gt;Once all the appropriate fields and files have been submitted, you will see a message like the screenshot above; it will explain how many submissions are in the queue to be checked prior to yours.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Now that you&amp;#8217;ve learned how to create a Joomla module from a widget, go forth and code. With the basics of this tutorial, the same idea can be applied to &lt;a href="http://developers.facebook.com/docs/plugins/" target="_blank"&gt;Facebook plugins&lt;/a&gt;, &lt;a href="http://twitter.com/about/resources/widgets" target="_blank"&gt;Twitter widgets&lt;/a&gt;, Social bookmarkers, Youtube video embeds, and so much more.  Happy Coding!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/tddO-njA34nFE_qBXx73G0YGVnU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tddO-njA34nFE_qBXx73G0YGVnU/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/tddO-njA34nFE_qBXx73G0YGVnU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/tddO-njA34nFE_qBXx73G0YGVnU/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=14W81V-2kSo:MV-8Qcb4ATw: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=14W81V-2kSo:MV-8Qcb4ATw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=14W81V-2kSo:MV-8Qcb4ATw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=14W81V-2kSo:MV-8Qcb4ATw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=14W81V-2kSo:MV-8Qcb4ATw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=14W81V-2kSo:MV-8Qcb4ATw:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=14W81V-2kSo:MV-8Qcb4ATw:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=14W81V-2kSo:MV-8Qcb4ATw: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/14W81V-2kSo" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/how-to-convert-a-widget-into-a-joomla-module/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/how-to-convert-a-widget-into-a-joomla-module/</feedburner:origLink></item>
		<item>
		<title>Aspect-Oriented Programming in PHP</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/PaOT5KlRv10/</link>
		<comments>http://net.tutsplus.com/tutorials/php/aspect-oriented-programming-in-php/#comments</comments>
		<pubDate>Thu, 10 May 2012 14:01:13 +0000</pubDate>
		<dc:creator>Chris Peters</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[aspect-oriented programming]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24974</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24974&amp;c=1088191177' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24974&amp;c=1088191177' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;There&amp;#8217;s a new player in town, and he brought new toys: The PHP World welcomes &lt;a href="http://flow3.typo3.org/"&gt;FLOW3&lt;/a&gt;, an enterprise application framework written and backed by the community of the &lt;a href="http://typo3.org/"&gt;TYPO3 CMS&lt;/a&gt;. FLOW3 can be used as standalone full-stack framework for your applications. It&amp;#8217;s interesting, because it introduces some concepts of software development that haven&amp;#8217;t been adapted to PHP before.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24974"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
 Among these new concepts is &amp;#8220;Aspect Oriented Programming&amp;#8221;. We will have a look on the theory of the pattern, and will set up a basic FLOW3 Application and weave in our own aspect!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why Should I Care?&lt;/h2&gt;
&lt;p&gt;If a new framework hits stable, an excellent question to rise might be: What can it do that the tools that I love can&amp;#8217;t?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      PHP already has an armada of excellent frameworks and most of them claim to be written with separation of concerns in mind. So does FLOW3.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In terms of software development this means, that the classes that are implementing the logic of your application should only care about one thing. For example, a mailer class should send mails. It should not retrieve potential receivers from a database.&lt;/p&gt;
&lt;p&gt;
All modern frameworks (including FLOW3) push a lot of patterns into the software stack that do a great job at separating the concerns of your business logic;  among them the famous MVC that is separating your logic into different layers.&lt;/p&gt;
&lt;p&gt; However, an application is not only built on business logic alone. As it grows, you may want to implement additional services, features, plugins or plugins of plugins. You surely don&amp;#8217;t want this stuff in your business logic! But what are your options?&lt;/p&gt;
&lt;p&gt;
Let&amp;#8217;s say you want to implement a logging service that writes some stuff to a text file every time a specific set is deleted from the database. Naturally, the logging service is not part of your database layer. But in order to make it work, you have to place some code right there, like this:
&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * Delete a user
 * @param UserModel $user
 * @return void
 */
public function deleteUser(UserModel $user) {
$this-&amp;gt;loggingService-&amp;gt;log('removing user ' . $user-&amp;gt;getName());
$this-&amp;gt;users-&amp;gt;remove($user);
}
&lt;/pre&gt;
&lt;p&gt;Horrible, isn&amp;#8217;t it? Let&amp;#8217;s face it: The logging service adds dirt to your code. You have to touch the original code in order to implement it and you add an additional dependency, in this case an instance of the LoggingService.&lt;/p&gt;
&lt;p&gt;
Hence, you&amp;#8217;re adding complexity. And you likely will have to add it all over your app (depending on what else you want to log).
&lt;/p&gt;
&lt;p&gt;
You may come up with an pattern like an event dispatcher or a hook system like it&amp;#8217;s implemented in Drupal and WordPress and then have your logger listen for events:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * Delete a user
 * @param UserModel $user
 * @return void
 */
public function deleteUser(UserModel $user) {
$this-&amp;gt;eventDispatcher-&amp;gt;dispatch(self::USER_DELETED);
$this-&amp;gt;users-&amp;gt;remove($user);
}
&lt;/pre&gt;
&lt;p&gt;
This is better, but it&amp;#8217;s still not cool. You&amp;#8217;re code is still dependency aware: it has some code with the sole purpose of informing other parties that something happens.&lt;/p&gt;
&lt;p&gt;This has some bad side-effects: What if you want to log something, but there&amp;#8217;s not an event dispatched at that time? What if you haven&amp;#8217;t written that code because you are writing a plugin? You&amp;#8217;d have to change the original code – not once, but every time an update is available.
&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s call the logging service an aspect and see how FLOW3 takes care of the problem.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Aspect Weaving&lt;/h2&gt;
&lt;p&gt;
Our logging service is only interested in one thing regarding the existing code: It wants to intercept it in some classes at various points (e .g. when something is deleted). With the implementation discussed above, the existing code controls the points of execution. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      Wouldn&amp;#8217;t it be nice if the service could define a set of rules at which point it would want to inject itself into the class?
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a software development concept named Inversion of control. It decouples classes from another, because there&amp;#8217;s no need to change existing code when you&amp;#8217;re changing the service. The service takes care of this itself.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say we simply want to execute logging on every method in every class that starts with delete, like &lt;code&gt;deleteUser()&lt;/code&gt;, &lt;code&gt;deleteEntry()&lt;/code&gt; or whatever. A convenient way would be to write a rule into the logging service and let the framework take care of the correct execution of the code. This is remarkably easy in FLOW3:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * An aspect that is executed on all methods that start with &amp;quot;delete&amp;quot;.
 *
 * @FLOW3\Before(&amp;quot;method(.*-&amp;gt;delete.*())&amp;quot;)
 */
 public function logginMethod() {
// Do some logging here.
 }
&lt;/pre&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
FLOW3 performs some really advanced PHP techniques under the hood.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The rule is named pointcut in AOP and there are some easy-to-learn ways to define them. The one above tells FLOW3 to inject the logging code in every class before every method that starts with delete.&lt;/p&gt;
&lt;p&gt;It does so by using the method keyword and by adding wildcards (*) for the class and for parts of the method name. If you&amp;#8217;re adding this code in an Aspect Class (as we do later), you&amp;#8217;re good to go. You will be able to access properties of the class that you are targeting as well. The targeted class itself remains untouched. It may not yet be written – if it&amp;#8217;s added to your app in the future, the rule will then match and the code will be injected.&lt;/p&gt;
&lt;p&gt;Maybe you have read the above paragraph twice and are asking yourself: Is this magic? What&amp;#8217;s the damn trick? &amp;#8211; I sure did, when I was first introduced to AOP!&lt;/p&gt;
&lt;p&gt;Well, AOP has been around for some time in the Java world. FLOW3 is heavily inspired by the AOP implementation of Spring, a Java Framework. The word was on the street, that the pattern can&amp;#8217;t be transferred to interpreted languages, because it requires compilation.&lt;/p&gt;
&lt;p&gt;The trick is, that the framework – or some tools like JAspect – intercepts the compilation process (from Java code to bytecode, that can be executed by the Java runtime) and do an analysis of the defined aspects. Whenever a set of rules (aka the pointcut) matches a method, it is weaved directly into the compiled code. Hence, the framework takes care of merging the code parts together:&lt;/p&gt;
&lt;div class="tutorial_image"&gt;
   &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2036_aspectOrientedProgramming/1-3.jpg"&gt;
&lt;/div&gt;
&lt;p&gt;FLOW3 did adapt that concept to the world of PHP by introducing an advanced cache. While most frameworks offer caching to increase performance, FLOW3 additionally uses the cache to weave aspects into the original classes. &lt;/p&gt;
&lt;p&gt;If you are running your app, FLOW3 delivers the cached classes instead the ones you&amp;#8217;ve written. Hence, your original code remains untouched.&lt;/p&gt;
&lt;p&gt;This sounds complex – and it is: FLOW3 performs some really advanced PHP techniques under the hood, that are well worth to be explored! But: To you as an application developer, it&amp;#8217;s not complicated at all. You don&amp;#8217;t have to care, if you don&amp;#8217;t want to: FLOW3 monitors your files for changes and if you make some, FLOW3 auto-commits them to the cache upon your next request. If an aspect matches to a method, it&amp;#8217;s automatically weaved in – no further configuration needed.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a complex pattern conveniently at your service!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;A Few Words About the Cache&lt;/h2&gt;
&lt;p&gt;Every cool feature comes with a downside – so does FLOW3. At the moment, we just scratched the surface of what FLOW3&amp;#8242;s caching-mechanism is capable of, but I want to give you an idea.&lt;/p&gt;
&lt;p&gt;Take a look at the following code:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * @FLOW3\Inject
 * @var \YourApp\MailerServiceInterface
 */
 protected $mailer;
/**
 * Sends a mail.
 *
 * @param \YourApp\Model\User $user
 * @param string $message
 */
 protected function sendMail(\YourApp\Model\User $user, $message) {
     // Sends a mail.
 }
&lt;/pre&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
The consequence is that PHP is to some degree no longer an interpreted language.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This may look like some code that is just well documented. But it&amp;#8217;s much more. &lt;/p&gt;
&lt;p&gt;The first property annotation (FLOW3\Inject) tells FLOW3 to look for some class in your app that implements the MailerServiceInterface and injects it here (and maybe configure it before). This pattern is known as &lt;em&gt;Dependency Injection&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The second class defines some type definitions in its comment&amp;#8217;s annotations &amp;#8211; and FLOW3 uses them. If you&amp;#8217;re giving the method some data that can be used to build a User object of your model  (for example an array with pure strings from a HTML form), FLOW3 auto-transforms the data safely to a User object and applies some security and validation rules to the second parameter (in this case a string).&lt;/p&gt;
&lt;p&gt;This is (among some other tricks) done by weaving in some code into the cache.&lt;/p&gt;
&lt;p&gt;The consequence is that PHP is to some degree no longer an interpreted language. The process of caching is somewhat similar to compiling and it has the same downsides: You can&amp;#8217;t just save &amp;#038; refresh your browser, you have to wait for the cache to be warmed up during development. If you are committing code to your production environment, you have to flush the cache in order to see the changes. &lt;/p&gt;
&lt;p&gt;On top of that, FLOW3 adds some kind of type-validation at runtime: You can&amp;#8217;t pass an integer as second argument in the example above – it&amp;#8217;ll throw an error. I really like this, because I have a background in strictly typed languages like Java and ActionScript. It also adds a lot of security to your application. But if you&amp;#8217;re a PHP purist, this may be something that you don&amp;#8217;t want.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Setting Up Flow3&lt;/h2&gt;
&lt;p&gt;Alright, enough with theory. Let&amp;#8217;s get our hands dirty.&lt;/p&gt;
&lt;p&gt;Setting up FLOW3 is pretty straightforward, if you already have a PHP-capable server like XAMP or MAMP installed. Just grab a copy of the framework from &lt;a href="http://flow3.typo3.org/download.html"&gt;FLOW3&amp;#8242;s download site&lt;/a&gt; (or clone from &lt;a href="http://git.typo3.org/FLOW3/Distributions/Base.git"&gt;git&lt;/a&gt;) and unpack it into your htdocs directory.&lt;/p&gt;
&lt;p&gt;You should already be done now on Windows machines. Unix-based systems like MAC or Linux need to grant the required rights for building the cache. FLOW3 ships with a powerful command line tool, that packs this task into a one-liner:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;
# On linux:
./flow3 core:setfilepermissions chris www-data www-data
# On Mac:
./flow3 core:setfilepermissions chris _www _www
&lt;/pre&gt;
&lt;p&gt;Please replace &lt;em&gt;chris&lt;/em&gt; with your username! This should be enough. However, I&amp;#8217;ve installed FLOW3 on&lt;br /&gt;
various machines and have run into some problems. The most common ones are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&amp;#8217;re on MAC and FLOW3 complains “index.php not found “, open the .htaccess in the webdir and add a # before the line Rewrite Base /“–
&lt;li&gt;If you&amp;#8217;re on Windows and the command line tool does not work, open Settings.yaml.example in FLOW3&amp;#8242;s configuration directory, uncomment and adjust the phpBinaryPathAndFilename variable to the correct path (e.g. C:\xampp\php\php.exe) and save the file as Settings.yaml&lt;/p&gt;
&lt;li&gt;On some machines, if FLOW3 is very slow, you have to increase the memory limit of PHP in the php.ini
&lt;/ul&gt;
&lt;p&gt;If you run into problems, that are not listed here, please post them in the comments!&lt;/p&gt;
&lt;p&gt;Now fire up your favorite browser and navigate to http://localhost/flow3/Web! FLOW3 should welcome you with an introduction screen: &lt;/p&gt;
&lt;div class="tutorial_image"&gt;
   &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2036_aspectOrientedProgramming/2-3.jpg" alt="The first run may take a while, as FLOW3 has to index your code and build all caches." /&gt;
&lt;/div&gt;
&lt;p&gt;This is the Welcome Package. Every application in FLOW3 (and FLOW3 itself) is a package and packages can share code with each other. For example, once the new TYPO3 Version is finished, you can add it as a package and your application will then have an enterprise-ready CMS on top! &lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s start our own package. It&amp;#8217;s an easy task, because FLOW3&amp;#8242;s command line tool will handle most of the work! Type in the following command:&lt;/p&gt;
&lt;pre class="brush: bash; title: ; notranslate"&gt;
# On linux / MAC
./flow3 kickstart:package Nettuts.AspectDemo
# On Windows
flow3 kickstart:package Nettuts.AspectDemo
&lt;/pre&gt;
&lt;p&gt;This will create a ready-to-go package named &lt;code&gt;Nettuts.AspectDemo&lt;/code&gt; in FLOW3&amp;#8242;s Packages/Application folder. If you review the file structure, you will find many folders that do follow a specific convention. &lt;/p&gt;
&lt;p&gt;The important ones are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Classes:&lt;/strong&gt; The home of your PHP Code,  a first Controller is already created in the Classes/Controller Folder: the StandardController!
&lt;li&gt;&lt;strong&gt;Resources/Private:&lt;/strong&gt; The home of all templates that are fired into Fluid, FLOW3&amp;#8242;s powerful Templating Engine. It hosts some other stuff like localization files as well.
&lt;li&gt;&lt;strong&gt;Resources/Public:&lt;/strong&gt; This has not been created yet, but every file in the Resources/Public folder will be directly accessible from the web. This is a good place for images, CSS, Javascript etc.
&lt;/ul&gt;
&lt;p&gt;Building a full-featured app is beyond the scope of this tutorial, so we&amp;#8217;ll go with the defaults. Please open the following URL: &lt;code&gt;http://localhost/flow3/Web/index.php/Nettuts.AspectDemo&lt;/code&gt;&lt;/p&gt;
&lt;div class="tutorial_image"&gt;
   &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2036_aspectOrientedProgramming/3-3.jpg" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;This is not much, but it&amp;#8217;s a start. We want to write something to a logfile, every time this site is called. We do this by weaving in an aspect into the StandardController!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Writing a First Aspect&lt;/h2&gt;
&lt;p&gt;Take a look at the StandardController in theClasses/Controller Folder in your &lt;code&gt;Nettuts.AspectDemo&lt;/code&gt; Package.&lt;/p&gt;
&lt;p&gt;It implements a method, named &lt;code&gt;indexAction()&lt;/code&gt;. FLOW3 has automatically configured our app in a way, that this method inside the StandardController gets called when we enter the URL above. &lt;/p&gt;
&lt;p&gt;For the moment, we see that this method assigns some strings to the view:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * Index action
 *
 * @return void
 */
public function indexAction() {
$this-&amp;gt;view-&amp;gt;assign('foos', array(
'bar', 'baz'
));
}
&lt;/pre&gt;
&lt;p&gt;If you open the file index.html of this view in  Resources/Private/Templates/Standard inside our package, you&amp;#8217;ll see how these strings are processed by the templating engine. &lt;/p&gt;
&lt;p&gt;However, our goal is to intercept the code execution before this method gets called.&lt;/p&gt;
&lt;p&gt;At first, create an empty file named Access.log in FLOW3&amp;#8242;s Log folder at flow3/Data/Logs. You may save this file wherever you want, but this is a nice place for log files.&lt;/p&gt;
&lt;p&gt;Next, create a folder named Service in your Nettuts.AspectDemo/Classes Folder and inside of it, create another folder, and name it Logging. Then create a PHP file named LoggingAspect.php inside of it. It should have the following content:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
&amp;lt;?php
namespace Nettuts\AspectDemo\Service\Logging;
use TYPO3\FLOW3\Annotations as FLOW3;
/**
 * @FLOW3\Aspect
 */
class LoggingAspect {
   /**
    * Log a message if this site is called.
    *
    * @param \TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint
    * @FLOW3\Before(&amp;quot;method(Nettuts\AspectDemo\Controller\StandardController-&amp;gt;indexAction())&amp;quot;)
    * @return void
    */
   public function logSiteAccess(\TYPO3\FLOW3\AOP\JoinPointInterface $joinPoint) {
           $filePath = '/home/chris/www/flow3/Data/Logs/Access.log';
     $message = 'The site has been accessed at ' . time() . '.' . PHP_EOL;
     file_put_contents($filePath, $message, FILE_APPEND);
   }
}
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This is a very basic class, and if you&amp;#8217;d like to have an advanced logger, you may want to separate the logging from the intercepting aspect.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s going on here? At first, we define a namespace, which is your package name and the path to the actual class (without the class folder itself). Next, we import FLOW3&amp;#8242;s annotation namespace. Thus, we can use FLOW3&amp;#8242;s powerful annotation parser to configure our class. &lt;/p&gt;
&lt;p&gt;That&amp;#8217;s exactly what we do in the class comments. We define the class as aspect with the following annotation:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
/**
 * @FLOW3\Aspect
 */
&lt;/pre&gt;
&lt;p&gt;From now on, FLOW3 is aware that this class may define rules for the interception of the code flow and watches our codebase for matches.&lt;/p&gt;
&lt;p&gt;This is the rule:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
@FLOW3\Before(&amp;quot;method(Nettuts\AspectDemo\Controller\StandardController-&amp;gt;indexAction())&amp;quot;)
&lt;/pre&gt;
&lt;p&gt;We could use regular expressions or &lt;a href="http://flow3.typo3.org/documentation/guide/partiii/aspectorientedprogramming.html#pointcut-expressions"&gt;some other techniques&lt;/a&gt; to match multiple methods or classes, but we know exactly where we want to go: Before the &lt;code&gt;indexAction()&lt;/code&gt; Method in the StandardController – and that&amp;#8217;s exactly what we&amp;#8217;re telling FLOW3. &lt;/p&gt;
&lt;p&gt;Note the &lt;code&gt;$jointInterface&lt;/code&gt; Parameter of the &lt;code&gt;logSiteAccess()&lt;/code&gt; Method, that is provided to us by FLOW3. We don&amp;#8217;t use it here, but it contains some useful data about the actual context. For example, if the intercepted method would have arguments, that we may want to use, we could access them like this:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
$argument = $joinPoint-&amp;gt;getMethodArgument('argumentName');
&lt;/pre&gt;
&lt;p&gt;The code in our &lt;code&gt;logSiteAccess()&lt;/code&gt; method, itself, is fairly simple. Just adjust the path to the Access.log to your environment and you&amp;#8217;re good to go!&lt;/p&gt;
&lt;p&gt;Now, again, open &lt;code&gt;http://localhost/flow3/Web/index.php/Nettuts.AspectDemo&lt;/code&gt; – nothing should have changed. But when you open the Access.log file, you should see the following entry:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
The site has been accessed at 1335715244.
&lt;/pre&gt;
&lt;p&gt;If you can read this, the aspect has been weaved into the cache. Let&amp;#8217;s have a look at the magic!&lt;/p&gt;
&lt;p&gt;FLOW3 stores the cache at &lt;code&gt;flow3/Data/Temporary/Development/Cache/Code/FLOW3_Object_Classes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You will find a class named &lt;code&gt;Nettuts_AspectDemo_Controller_StandardController_Original.php&lt;/code&gt;. This is the original class from our codebase. &lt;/p&gt;
&lt;p&gt;But there is another class:  &lt;code&gt;Nettuts_AspectDemo_Controller_StandardController.php&lt;/code&gt;. This class extends our original class and it is build up purely by generated code. Among the many lines you&amp;#8217;ll find something like this:&lt;/p&gt;
&lt;pre class="brush: php; title: ; notranslate"&gt;
$this-&amp;gt;FLOW3_Aop_Proxy_targetMethodsAndGroupedAdvices = array(
   'indexAction' =&amp;gt; array(
      'TYPO3\FLOW3\Aop\Advice\BeforeAdvice' =&amp;gt; array(
         new \TYPO3\FLOW3\Aop\Advice\BeforeAdvice(
         'Nettuts\AspectDemo\Service\Logging\LoggingAspect', 'logSiteAccess'
         $objectManager, NULL),
         ),
      ),
);
&lt;/pre&gt;
&lt;p&gt;This is were FLOW3 initiates the aspect and it&amp;#8217;s weaved in directly into your class. The aspect gets executed right where we want it – without touching the original controller.&lt;/p&gt;
&lt;p&gt;The code snippet  initiates an instance of the &lt;code&gt;BeforeAdvice&lt;/code&gt; class, with our aspect, the respective method and the &lt;code&gt;$objectManager&lt;/code&gt; as arguments. The object manager contains the needed information to build the &lt;code&gt;jointInterface&lt;/code&gt;, that is passed to the aspect.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re interested in the details, have a look at the AOP Folder in the FLOW3 package!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
The aspect oriented approach has many advantages waiting to be discovered.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The aspect oriented approach has many advantages waiting to be discovered. For example, FLOW3 uses AOP to intercept its own bootstrap to build up a firewall if you choose to use FLOW3&amp;#8242;s security framework. Apart from that, we haven&amp;#8217;t yet discussed the specific terminology that is commonly used in AOP.&lt;/p&gt;
&lt;p&gt;However, FLOW3 ships with some other unique concepts like Domain-Driven-Design. It has a powerful Doctrine integration and a smart Templating Engine. We have only seen the tip of the iceberg!&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s your opinion? Are you eager to learn more about the philosophy behind FLOW3? What&amp;#8217;s your impression of AOP? Are you excited to have a robust port for the PHP world or do you think it&amp;#8217;s too much overhead for an interpreted language?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oBK6yfKFjtrXUL5H4RTMRnb8pCU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oBK6yfKFjtrXUL5H4RTMRnb8pCU/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/oBK6yfKFjtrXUL5H4RTMRnb8pCU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oBK6yfKFjtrXUL5H4RTMRnb8pCU/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=PaOT5KlRv10:Z9zPRLFyxHY: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=PaOT5KlRv10:Z9zPRLFyxHY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=PaOT5KlRv10:Z9zPRLFyxHY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=PaOT5KlRv10:Z9zPRLFyxHY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=PaOT5KlRv10:Z9zPRLFyxHY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=PaOT5KlRv10:Z9zPRLFyxHY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=PaOT5KlRv10:Z9zPRLFyxHY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=PaOT5KlRv10:Z9zPRLFyxHY: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/PaOT5KlRv10" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/php/aspect-oriented-programming-in-php/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/php/aspect-oriented-programming-in-php/</feedburner:origLink></item>
		<item>
		<title>Which Tuts+ Site Should We Launch Next?</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/GFTCdYIsnCg/</link>
		<comments>http://net.tutsplus.com/articles/news/which-tuts-site-should-we-launch-next/#comments</comments>
		<pubDate>Wed, 09 May 2012 13:18:40 +0000</pubDate>
		<dc:creator>David Appleyard</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[launch]]></category>
		<category><![CDATA[poll]]></category>
		<category><![CDATA[tuts]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24962</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24962&amp;c=844159521' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24962&amp;c=844159521' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;We&amp;#8217;re planning our next few Tuts+ sites, and would love your opinion and advice on which topics you think we should cover next! We&amp;#8217;d be really grateful if you could take a minute to answer our quick poll and share your thoughts&amp;#8230;&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24962"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Have Your Say&lt;/h2&gt;
&lt;div style="float:right; margin:0 0 0 20px;"&gt;&lt;script type="text/javascript" charset="utf-8" src="http://static.polldaddy.com/p/6211900.js"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;noscript&gt;&lt;a href="http://polldaddy.com/poll/6211900/"&gt;Nettuts+ Readers: Which Tuts+ Site Should We Launch Next?&lt;/a&gt;&lt;/noscript&gt;&lt;/div&gt;
&lt;p&gt;We&amp;#8217;ve been considering lots of different ideas for our next Tuts+ sites over the past few weeks, and wanted to also ask the opinion of our awesome community!&lt;/p&gt;
&lt;p&gt;A selection of different concepts are included in the poll to the right, along with the option for you to submit your own ideas as well.&lt;/p&gt;
&lt;p&gt;The important thing to note is that these are just ideas. Some of these are close to making our final cut, and others aren&amp;#8217;t&amp;#8230; We&amp;#8217;d love to hear what you think, to help guide our decision.&lt;/p&gt;
&lt;p&gt;Thanks for taking the time to offer your suggestion — I can&amp;#8217;t wait to see what you have to say!&lt;/p&gt;
&lt;h3&gt;Win a 6-Month Tuts+ Premium Membership&lt;/h3&gt;
&lt;p&gt;Our poll will be running for the next couple of weeks, and we&amp;#8217;ll be choosing one respondent at random to receive a six-month Tuts+ Premium membership!&lt;/p&gt;
&lt;p&gt;To be entered into the giveaway, just leave a comment on this post to go into a bit more detail about your site suggestion. We&amp;#8217;ll choose one comment at random to win the Tuts+ Premium membership when the poll ends.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Best of luck!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/kKJ7-xsgdY7sozUYypLMAdAKQ90/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kKJ7-xsgdY7sozUYypLMAdAKQ90/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/kKJ7-xsgdY7sozUYypLMAdAKQ90/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/kKJ7-xsgdY7sozUYypLMAdAKQ90/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=GFTCdYIsnCg:oNwB1w8cFJI: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=GFTCdYIsnCg:oNwB1w8cFJI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=GFTCdYIsnCg:oNwB1w8cFJI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=GFTCdYIsnCg:oNwB1w8cFJI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=GFTCdYIsnCg:oNwB1w8cFJI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=GFTCdYIsnCg:oNwB1w8cFJI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=GFTCdYIsnCg:oNwB1w8cFJI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=GFTCdYIsnCg:oNwB1w8cFJI: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/GFTCdYIsnCg" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/which-tuts-site-should-we-launch-next/feed/</wfw:commentRss>
		<slash:comments>354</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/which-tuts-site-should-we-launch-next/</feedburner:origLink></item>
		<item>
		<title>Prototypes in JavaScript</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/JMdjcqupCZ0/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/#comments</comments>
		<pubDate>Wed, 09 May 2012 11:00:55 +0000</pubDate>
		<dc:creator>Leigh Kaszick</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[prototypes]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24949</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24949&amp;c=1892098954' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24949&amp;c=1892098954' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;When you define a function within JavaScript, it comes with a few pre-defined properties; one of these is the illusive prototype. In this article, I&amp;#8217;ll detail what it is, and why you should use it in your projects.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24949"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;What is Prototype?&lt;/h2&gt;
&lt;p&gt;The prototype property is initially an empty object, and can have members added to it &amp;#8211; as you would any other object.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;var myObject = function(name){
    this.name = name;
    return this;
};

console.log(typeof myObject.prototype); // object

myObject.prototype.getName = function(){
    return this.name;
};
&lt;/pre&gt;
&lt;p&gt;In the snippet above, we’ve created a function, but if we call &lt;code&gt;myObject()&lt;/code&gt;, it will simply return the &lt;code&gt;window&lt;/code&gt; object, because it was defined within the global scope. &lt;code&gt;this&lt;/code&gt; will therefore return the global object, as it has not yet been instantiated (more on this later).&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;console.log(myObject() === window); // true&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;The Secret Link&lt;/h2&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
Every object within JavaScript has a “secret” property.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before we continue, I&amp;#8217;d like to discuss the “secret” link that makes prototype work the way it does.&lt;/p&gt;
&lt;p&gt;Every object within JavaScript has a “secret” property added to it when it is defined or instantiated, named &lt;code&gt;__proto__&lt;/code&gt;; this is how the prototype chain is accessed. However, it is not a good idea to access &lt;code&gt;__proto__&lt;/code&gt; within your application, as it is not available in all browsers. &lt;/p&gt;
&lt;p&gt;The &lt;code&gt;__proto__&lt;/code&gt; property shouldn’t be confused with an object&amp;#8217;s prototype, as they are two separate properties; that said, they do go hand in hand. It&amp;#8217;s important to make this distinction, as it can be quite confusing at first! What does this mean exactly? Let me explain. When we created the &lt;code&gt;myObject&lt;/code&gt; function, we were defining an object of type &lt;code&gt;Function&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;console.log(typeof myObject); // function&lt;/pre&gt;
&lt;p&gt;For those unaware, &lt;code&gt;Function&lt;/code&gt; is a predefined object in JavaScript, and, as a result, has its own properties (e.g. &lt;code&gt;length&lt;/code&gt; and &lt;code&gt;arguments&lt;/code&gt;) and methods (e.g. &lt;code&gt;call&lt;/code&gt; and &lt;code&gt;apply&lt;/code&gt;). And yes, it, too, has its own prototype object, as well as the secret &lt;code&gt;__proto__&lt;/code&gt; link. This means that, somewhere within the JavaScript engine, there is a bit of code that could be similar to the following:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
Function.prototype = {
    arguments: null,
    length: 0,
    call: function(){
        // secret code
    },
    apply: function(){
        // secret code
    }
    ...
}
&lt;/pre&gt;
&lt;p&gt;In truth, it probably wouldn’t be quite so simplistic; this is merely to illustrate how the prototype chain works.&lt;/p&gt;
&lt;p&gt;So we have defined &lt;code&gt;myObject&lt;/code&gt; as a function and given it one argument, &lt;code&gt;name&lt;/code&gt;; but we never set any properties, such as &lt;code&gt;length&lt;/code&gt; or methods, such as &lt;code&gt;call&lt;/code&gt;. So why does the following work?&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;console.log(myObject.length); // 1 (being the amount of available arguments)&lt;/pre&gt;
&lt;p&gt;This is because, when we defined &lt;code&gt;myObject&lt;/code&gt;, it created a &lt;code&gt;__proto__&lt;/code&gt; property and set its value to &lt;code&gt;Function.prototype&lt;/code&gt; (illustrated in the code above). So, when we access &lt;code&gt;myObject.length&lt;/code&gt;, it looks for a property of &lt;code&gt;myObject&lt;/code&gt; called &lt;code&gt;length&lt;/code&gt; and doesn’t find one; it then travels up the chain, via the &lt;code&gt;__proto__ link&lt;/code&gt;, finds the property and returns it.&lt;/p&gt;
&lt;p&gt;You might be wondering why &lt;code&gt;length&lt;/code&gt; is set to &lt;code&gt;1&lt;/code&gt; and not &lt;code&gt;0&lt;/code&gt; &amp;#8211; or any other number for that fact. This is because &lt;code&gt;myObject&lt;/code&gt; is in fact an instance of &lt;code&gt;Function&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;console.log(myObject instanceof Function); // true
console.log(myObject === Function); // false&lt;/pre&gt;
&lt;p&gt;When an instance of an object is created, the &lt;code&gt;__proto__&lt;/code&gt; property is updated to point to the constructor’s prototype, which, in this case, is &lt;code&gt;Function&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;console.log(myObject.__proto__ === Function.prototype) // true&lt;/pre&gt;
&lt;p&gt;Additionally, when you create a new &lt;code&gt;Function&lt;/code&gt; object, the native code inside the &lt;code&gt;Function&lt;/code&gt; constructor will count the number of arguments and update &lt;code&gt;this.length&lt;/code&gt; accordingly, which, in this case, is &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If, however, we create a new instance of &lt;code&gt;myObject&lt;/code&gt; using the &lt;code&gt;new&lt;/code&gt; keyword, &lt;code&gt;__proto__&lt;/code&gt; will point to &lt;code&gt;myObject.prototype&lt;/code&gt; as &lt;code&gt;myObject&lt;/code&gt; is the constructor of our new instance.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
var myInstance = new myObject(“foo”);
console.log(myInstance.__proto__ === myObject.prototype); // true&lt;/pre&gt;
&lt;p&gt;In addition to having access to the native methods within the &lt;code&gt;Function&lt;/code&gt;.prototype, such as &lt;code&gt;call&lt;/code&gt; and &lt;code&gt;apply&lt;/code&gt;, we now have access to &lt;code&gt;myObject&lt;/code&gt;’s method, &lt;code&gt;getName&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
console.log(myInstance.getName()); // foo

var mySecondInstance = new myObject(“bar”);

console.log(mySecondInstance.getName()); // bar
console.log(myInstance.getName()); // foo
&lt;/pre&gt;
&lt;p&gt;As you can imagine, this is quite handy, as it can be used to blueprint an object, and create as many instances as needed &amp;#8211; which leads me onto the next topic!&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Why is Using Prototype Better?&lt;/h2&gt;
&lt;p&gt;Say, for instance, that we are developing a canvas game and need several (possibly hundreds of) objects on the screen at once. Each object requires its own properties, such as &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; coordinates, &lt;code&gt;width&lt;/code&gt;,&lt;code&gt;height&lt;/code&gt;, and many others.&lt;/p&gt;
&lt;p&gt;We might do it as follows:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
var GameObject1 = {
    x: Math.floor((Math.random() * myCanvasWidth) + 1),
    y: Math.floor((Math.random() * myCanvasHeight) + 1),
    width: 10,
    height: 10,
    draw: function(){
        myCanvasContext.fillRect(this.x, this.y, this.width, this.height);
    }
   ...
};

var GameObject2 = {
    x: Math.floor((Math.random() * myCanvasWidth) + 1),
    y: Math.floor((Math.random() * myCanvasHeight) + 1),
    width: 10,
    height: 10,
    draw: function(){
        myCanvasContext.fillRect(this.x, this.y, this.width, this.height);
    }
    ...
};
&lt;/pre&gt;
&lt;p&gt;&amp;#8230; do this 98 more times &amp;#8230;&lt;/p&gt;
&lt;p&gt;What this will do is create all these objects within memory &amp;#8211; all with separate definitions for methods, such as &lt;code&gt;draw&lt;/code&gt; and whatever other methods may be required. This is certainly not ideal, as the game will bloat the browsers allocated JavaScript memory, and make it run very slowly&amp;#8230; or even stop responding. &lt;/p&gt;
&lt;p&gt;While this probably wouldn’t happen with only 100 objects, it still can serve to be quite a performance hit, as it will need to look up one hundred different objects, rather than just the single &lt;code&gt;prototype&lt;/code&gt; object.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;How to Use Prototype&lt;/h2&gt;
&lt;p&gt;To make the application run faster (and follow best practices), we can (re)define the prototype property of the &lt;code&gt;GameObject&lt;/code&gt;; every instance of &lt;code&gt;GameObject&lt;/code&gt; will then reference the methods within &lt;code&gt;GameObject.prototype&lt;/code&gt; as if they were their own methods.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
// define the GameObject constructor function
var GameObject = function(width, height) {
    this.x = Math.floor((Math.random() * myCanvasWidth) + 1);
    this.y = Math.floor((Math.random() * myCanvasHeight) + 1);
    this.width = width;
    this.height = height;
    return this;
};

// (re)define the GameObject prototype object
GameObject.prototype = {
    x: 0,
    y: 0,
    width: 5,
    width: 5,
    draw: function() {
        myCanvasContext.fillRect(this.x, this.y, this.width, this.height);
    }
};
&lt;/pre&gt;
&lt;p&gt;We can then instantiate the GameObject 100 times.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
var x = 100,
arrayOfGameObjects = [];

do {
    arrayOfGameObjects.push(new GameObject(10, 10));
} while(x--);
&lt;/pre&gt;
&lt;p&gt;Now we have an array of 100 GameObjects, which all share the same prototype and definition of the &lt;code&gt;draw&lt;/code&gt; method, which drastically saves memory within the application. &lt;/p&gt;
&lt;p&gt;When we call the &lt;code&gt;draw&lt;/code&gt; method, it will reference the exact same function.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
var GameLoop = function() {
    for(gameObject in arrayOfGameObjects) {
        gameObject.draw();
    }
};
&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Prototype is a Live Object&lt;/h2&gt;
&lt;p&gt;An object&amp;#8217;s prototype is a live object, so to speak. This simply means that, if, after we create all our GameObject instances, we decide that, instead of drawing a rectangle, we want to draw a circle, we can update our &lt;code&gt;GameObject.prototype.draw&lt;/code&gt; method accordingly.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
GameObject.prototype.draw = function() {
    myCanvasContext.arc(this.x, this.y, this.width, 0, Math.PI*2, true);
}
&lt;/pre&gt;
&lt;p&gt;And now, all the previous instances of &lt;code&gt;GameObject&lt;/code&gt; and any future instances will draw a circle.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Updating Native Objects Prototypes&lt;/h2&gt;
&lt;p&gt;Yes, this is possible. You may be familiar with JavaScript libraries, such as &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;, which take advantage of this method.&lt;/p&gt;
&lt;p&gt;Let’s use a simple example:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, ‘’);
};
&lt;/pre&gt;
&lt;p&gt;We can now access this as a method of any string:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;“ foo bar   “.trim(); // “foo bar”&lt;/pre&gt;
&lt;p&gt;There is a minor downside to this, however. For example, you may use this in your application; but a year or two down the road, a browser may implement an updated version of JavaScript that includes a native &lt;code&gt;trim&lt;/code&gt; method within the &lt;code&gt;String&lt;/code&gt;&amp;#8216;s prototype. This means that your definition of &lt;code&gt;trim&lt;/code&gt; will override the native version! Yikes! To overcome this, we can add a simple check before defining the function.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
if(!String.prototype.trim) {
    String.prototype.trim = function() {
        return this.replace(/^\s+|\s+$/g, ‘’);
    };
}
&lt;/pre&gt;
&lt;p&gt;Now, if it exists, it will use the native version of the &lt;code&gt;trim&lt;/code&gt; method.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      As a rule of thumb, it&amp;#8217;s generally considered a best practice to avoid extending native objects. But, as with anything, rules can be broken, if needed.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Hopefully, this article has shed some light on the backbone of JavaScript that is prototype. You should now be on your way to creating more efficient applications. &lt;/p&gt;
&lt;p&gt;If you have any questions regarding prototype, let me know in the comments, and I&amp;#8217;ll do my best to answer them.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/mqHbVGY-aK89XilV5v9wUIJ5vfY/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mqHbVGY-aK89XilV5v9wUIJ5vfY/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/mqHbVGY-aK89XilV5v9wUIJ5vfY/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/mqHbVGY-aK89XilV5v9wUIJ5vfY/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=JMdjcqupCZ0:buyzJCRF90c: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=JMdjcqupCZ0:buyzJCRF90c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JMdjcqupCZ0:buyzJCRF90c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JMdjcqupCZ0:buyzJCRF90c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JMdjcqupCZ0:buyzJCRF90c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JMdjcqupCZ0:buyzJCRF90c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=JMdjcqupCZ0:buyzJCRF90c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=JMdjcqupCZ0:buyzJCRF90c: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/JMdjcqupCZ0" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/</feedburner:origLink></item>
		<item>
		<title>14 Reasons Why Nobody Used Your jQuery Plugin</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/utCsWyPhaNI/</link>
		<comments>http://net.tutsplus.com/tutorials/javascript-ajax/14-reason-why-nobody-used-your-jquery-plugin/#comments</comments>
		<pubDate>Mon, 07 May 2012 10:45:18 +0000</pubDate>
		<dc:creator>Jonathan Cutrell</dc:creator>
				<category><![CDATA[JavaScript & AJAX]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugin development]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24932</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24932&amp;c=1024277535' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24932&amp;c=1024277535' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;With so many folks developing jQuery plugins, it&amp;#8217;s not uncommon to come across one that just plain &amp;#8211; for lack of better words &amp;#8211; sucks. There&amp;#8217;s no examples or documentation, the plugin doesn&amp;#8217;t follow best practices, etc. But you&amp;#8217;re one of the lucky ones: this article will detail the pitfalls that you must avoid.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24932"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;jQuery is no stranger to those of you frequent Nettuts+. Jeffrey Way&amp;#8217;s awesome &lt;a href="http://learnjquery.tutsplus.com"&gt;30 Days to Learn jQuery&lt;/a&gt; (and various other tutorials here and elsewhere) have led us all down the path to Sizzle-powered awesomesauce. In all the hype (and a lot of leaps in JavaScript adoption by developers and browser vendors), plenty of plugins have come onto the scene. This is partially why jQuery has become the most popular JavaScript library available! The only problem is that many of them aren&amp;#8217;t too great.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;#8217;ll focus less on the JavaScript specifically, and more on best practices for plugin delivery.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;1 &amp;#8211; &lt;/span&gt; You Aren&amp;#8217;t Making a jQuery Plugin&lt;/h2&gt;
&lt;p&gt;There are some patterns that are, more or less, universally accepted as &amp;#8220;The Right Way&amp;#8221; to create jQuery plugins. If you aren&amp;#8217;t following these conventions, your plugin may&amp;#8230; suck! Consider one of the most common patterns:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
(function($, window, undefined){
$.fn.myPlugin = function(opts) {
	var defaults = {
		// setting your default values for options
	}

  // extend the options from defaults with user's options
  var options = $.extend(defaults, opts || {});

	return this.each(function(){ // jQuery chainability
	  // do plugin stuff
	});
})(jQuery, window);
&lt;/pre&gt;
&lt;p&gt;First, we are creating a self-invoking anonymous function to shield ourselves from using global variables. We pass in &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;window&lt;/code&gt;, and &lt;code&gt;undefined&lt;/code&gt;. The arguments the self invoking function is called with are &lt;code&gt;jQuery&lt;/code&gt; and &lt;code&gt;window&lt;/code&gt;; nothing is passed in for undefined, so that if we decide to use the undefined keyword within the plugin, &amp;#8220;undefined&amp;#8221; actually will be undefined. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      This shields from other scripts potentially assigning a malicious value to &lt;code&gt;undefined&lt;/code&gt;, such as &lt;code&gt;true&lt;/code&gt;!
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt; &lt;code&gt;$&lt;/code&gt; is passed as jQuery; we do it this way to ensure that, outside of the anonymous function, &lt;code&gt;$&lt;/code&gt; can still refer to something else entirely, such as Prototype.&lt;/p&gt;
&lt;p&gt;Passing the variable for the globally accessible &lt;code&gt;window&lt;/code&gt; object allows for more compressed code through the minification processes (which you should be doing, as well).&lt;/p&gt;
&lt;p&gt;Next, we are using the jQuery plugin pattern, &lt;code&gt;$.fn.PluginName&lt;/code&gt;. This is a way of registering your plugin to be used with the &lt;code&gt;$(selector).method()&lt;/code&gt; format. It simply extends jQuery&amp;#8217;s prototype with your new method. If you want to instead create a plugin that defines a function on the jQuery object, add it directly, like so:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$.PluginName = function(options){
	// extend options, do plugin stuff
}
&lt;/pre&gt;
&lt;p&gt;This type of plugin won&amp;#8217;t be chainable, as functions that are defined as properties of the jQuery object typically don&amp;#8217;t return the jQuery object. For instance, consider the following code:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$.splitInHalf = function(stringToSplit){
	var length = stringToSplit.length;
	var stringArray = stringToSplit.split(stringToSplit[Math.floor(length/2)]);
	return stringArray;
}
&lt;/pre&gt;
&lt;p&gt;Here, we are returning an array of strings. It makes sense to simply return this as an array, as this is likely what users will want to use (and they can easily wrap it in the jQuery object if they wish). In contrast, consider the following contrived example:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$.getOddEls = function(jQcollection){ //
	return jQcollection.filter(function(index){
		var i = index+1;
		return (index % 2 != 0);
	});
}
&lt;/pre&gt;
&lt;p&gt;In this case, the user is probably expecting the jQuery object to return from &lt;code&gt;$.getOddEls&lt;/code&gt;; so, we return the &lt;a href="http://api.jquery.com/filter"&gt;filter&lt;/a&gt; method, which returns the jQuery collection defined by the function that is passed. A good rule of thumb is to wrap returned elements in the jQuery function, especially if they can be chained; if you are returning arrays, strings, numbers, functions, or other data types, leave them unwrapped.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;2 -&lt;/span&gt; You Aren&amp;#8217;t Documenting Your Code (Correctly)&lt;/h2&gt;
&lt;p&gt;Arguably, the most important thing you can do when publishing your code is add the necessary documentation. The gap between what you explain to developers and what the code actually does or can do is the time that users don&amp;#8217;t want to waste figuring out the ins and outs of your code.&lt;/p&gt;
&lt;p&gt;Documentation is a practice that doesn&amp;#8217;t have any hard-fast rules; however, it is generally accepted that the more (well organized) documentation you have, the better.&lt;/p&gt;
&lt;p&gt;This process should be both an internal practice (within/interspersed throughout your code) as well as an external practice (explaining every public method, option, and multiple use cases thoroughly in a wiki or readme).&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;3 &amp;#8211; &lt;/span&gt; You Aren&amp;#8217;t Providing Enough Flexibility or Customizability&lt;/h2&gt;
&lt;p&gt;The most popular plugins offer full access to variables (what most plugins refer to as &amp;#8220;options&amp;#8221; objects) that a user may want to control. They also may offer many different configurations of the plugin so that it is reusable in many different contexts. For instance, let&amp;#8217;s consider a simple slider plugin. Options that the user might wish to control include the speed, type, and delay of the animation.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s good practice to also give the user access to classnames/ID names which are added to the DOM elements inserted or manipulated by the plugin. But beyond this, they may also want to have access to a callback function every time the slide transitions, or perhaps when the slide transitions back to the beginning (one full &amp;#8220;cycle&amp;#8221;). &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      It&amp;#8217;s your job to think of all possible uses and needs for the plugin.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&amp;#8217;s consider another example: a plugin that makes a call to an API should provide access to the API&amp;#8217;s returned object. Take the following example of a simple plugin concep:.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$.fn.getFlickr = function(opts) {
	return this.each(function(){ // jQuery chainability
		var defaults = { // setting your default options
			cb : function(data){},
			flickrUrl : // some default value for an API call
		}
	    // extend the options from defaults with user's options
	    var options = $.extend(defaults, opts || {});

	    // call the async function and then call the callback
	    // passing in the api object that was returned
	    $.ajax(flickrUrl, function(dataReturned){
			options.cb.call(this, dataReturned);
		});
	});
}
&lt;/pre&gt;
&lt;p&gt;This allows us to do something along the lines of:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
	$(selector).getFlickr(function(fdata){ // flickr data is in the fdata object });
&lt;/pre&gt;
&lt;p&gt;Another way of publicizing this is to offer &amp;#8220;hooks&amp;#8221; as options. As of jQuery 1.7.1 and up, we can use &lt;code&gt;.on(eventName, function(){})&lt;/code&gt; after our plugin call to separate the behaviors into their own functions. For instance, with the plugin above, we could change the code to look like this:&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$.fn.getFlickr = function(opts) {
	return this.each(function(i,el){
		var $this = el;
		var defaults = { // setting your default options
			flickrUrl : &amp;quot;http://someurl.com&amp;quot; // some default value for an API call
		}
	    var options = $.extend(defaults, opts || {});

	    // call the async function and then call the callback
	    // passing in the api object that was returned
	    $.ajax(flickrUrl, function(dataReturned){
	    	// do some stuff
			$this.trigger(&amp;quot;callback&amp;quot;, dataReturned);
		}).error(function(){
				$this.trigger(&amp;quot;error&amp;quot;, dataReturned);
			});
	});
}
&lt;/pre&gt;
&lt;p&gt;This allows us to call the &lt;code&gt;getFlickr&lt;/code&gt; plugin and chain other behavior handlers.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$(selector).getFlickr(opts).on(&amp;quot;callback&amp;quot;, function(data){ // do stuff }).on(&amp;quot;error&amp;quot;, function(){ // handle an error });
&lt;/pre&gt;
&lt;p&gt;You can see that offering this kind of flexibility is absolutely important; the more complex actions your plugins have, the more complex the control that should be available.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;4 &amp;#8211; &lt;/span&gt; You&amp;#8217;re Requiring Too Much Configuration&lt;/h2&gt;
&lt;p&gt;Ok, so tip number three suggested that the more complex actions your plugins have, the more complex control that should be &lt;em&gt;available&lt;/em&gt;. A big mistake, however, is making too many options required for plugin functionality. For instance, it is ideal for UI based plugins to have a no-arguments default behavior.&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$(selector).myPlugin();
&lt;/pre&gt;
&lt;p&gt;Certainly, sometimes this isn&amp;#8217;t realistic (as users may be fetching a specific feed, for instance). In this case, you should do some of the heavy lifting for them. Have multiple ways of passing options to the plugin. For instance, let&amp;#8217;s say we have a simple Tweet fetcher plugin. There should be a default behavior of that Tweet fetcher with a single required option (the username you want to fetch from).&lt;/p&gt;
&lt;pre class="brush: jscript; title: ; notranslate"&gt;
$(selector).fetchTweets(&amp;quot;jcutrell&amp;quot;);
&lt;/pre&gt;
&lt;p&gt;The default may, for instance, grab a single tweet, wrap it in a paragraph tag, and fill the selector element with that html. This is the kind of behavior that most developers expect and appreciate. The granular options should be just that: options.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;5 &amp;#8211; &lt;/span&gt; You&amp;#8217;re Mixing External CSS Rules and Inline CSS Rules&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s inevitable, depending upon the type of plugin, of course, that you will have to include a CSS file if it is highly based on UI manipulations. This is an acceptable solution to the problem, generally speaking; most plugins come bundled with images and CSS. But don&amp;#8217;t forget tip number two &amp;#8211; documentation should also include how to use/reference the stylesheet(s) and images. Developers won&amp;#8217;t want to waste time looking through your source code to figure these things out.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
Things should just&amp;#8230;work.  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With that said, it is definitely a best practice to use either injected styles (that are highly accessible via plugin options) or class/ID based styling. These IDs and classes should also be accessible, via options as previously mentioned. Inline styles override external CSS rules, however; the mixing of the two is discouraged, as it may take a developer a long time to figure out why their CSS rules aren&amp;#8217;t being respected by elements created by your plugin. Use your best judgment in these cases.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
As a rule of thumb, inline CSS is bad &amp;#8211; unless it&amp;#8217;s so minimal to the point that it doesn&amp;#8217;t warrant its own external stylesheet.  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;6 &amp;#8211; &lt;/span&gt; You Don&amp;#8217;t Offer Examples&lt;/h2&gt;
&lt;p&gt;The proof is in the pudding: if you can&amp;#8217;t provide a practical example of what your plugin does with accompanying code, people will quickly be turned off to using your plugin. Simple as that. Don&amp;#8217;t be lazy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A good template for examples:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &amp;#8220;hello world&amp;#8221; example &amp;#8211; usually the plugin call with the minimum configuration/options passed, and it&amp;#8217;s accompanying html/css&lt;/li&gt;
&lt;li&gt;A few more involved examples &amp;#8211; usually with examples of full functionality of multiple options&lt;/li&gt;
&lt;li&gt;An integration example &amp;#8211; if someone might use another plugin with your plugin, here is where you can show how to do that. (This gets you bonus points in the open-source development world, too. Kudos.)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;7 &amp;#8211; &lt;/span&gt; Your Code Doesn&amp;#8217;t Match Their jQuery Version&lt;/h2&gt;
&lt;p&gt;jQuery, like any good code library, grows with every release. Most methods are kept even after support is deprecated. However, new methods are added on; a perfect example of this is the &lt;code&gt;.on()&lt;/code&gt; method, which is jQuery&amp;#8217;s new all-in-one solution for event delegation. If you write a plugin that uses &lt;code&gt;.on()&lt;/code&gt;, people using jQuery 1.6 or earlier will be out of luck. Now I&amp;#8217;m not suggesting that you code for the lowest common denominator, but, in your documentation, be sure to explain which version of jQuery your plugin supports. If you introduce a plugin with support for jQuery 1.7, you should strongly consider maintaining support for 1.7 even once 1.8 comes out. You should also consider taking advantage of new/better/faster features in jQuery as they come out. &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      Encourage developers to upgrade, but don&amp;#8217;t break your plugin too often! One option is to offer a &amp;#8220;legacy&amp;#8221; deprecated, non-supported versions of your plugin.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;8 -&lt;/span&gt; Where&amp;#8217;s the Changelog?&lt;/h2&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
 It&amp;#8217;s time to bite the bullet if you haven&amp;#8217;t learned how to use version control yet.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Along with keeping your jQuery version support/compatibility a part of your documentation, you should also be working in version control. Version control (specifically, via &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;) is largely the home of social coding. If you are developing a plugin for jQuery that you want to eventually publish in the official repository, it must be stored in a GitHub repository anyway; it&amp;#8217;s time to bite the bullet if you haven&amp;#8217;t learned how to use version control. There are countless benefits to version control, all of which are beyond the scope of this article. But one of the core benefits is that it allows people to view the changes, improvements, and compatibility fixes you make, and when you make them. This also opens the floor for contribution and customization/extension of the plugins you write.&lt;/p&gt;
&lt;h3&gt;Additional Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://git-scm.com/book"&gt;The Git Book&lt;/a&gt;
&lt;li&gt;&lt;a href-"http://net.tutsplus.com/tutorials/other/easy-version-control-with-git/"&gt;Easy Version Control With Git&lt;/a&gt;
&lt;li&gt;&lt;a href="http://net.tutsplus.com/tutorials/other/the-perfect-workflow-with-git-github-and-ssh/"&gt;The Perfect Workflow With Git, GitHub, and SSH&lt;/a&gt;
&lt;li&gt;&lt;a href="http://tutsplus.com/ebook/getting-good-with-git/"&gt;Getting Good With Git ($19)&lt;/a&gt;
&lt;li&gt;&lt;a href="http://gitcasts.com/"&gt;GitCasts&lt;/a&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;9 &amp;#8211; &lt;/span&gt;Nobody Needs Your Plugin&lt;/h2&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
The world doesn&amp;#8217;t need another slider plugin.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ok, we&amp;#8217;ve ignored it long enough here: some &amp;#8220;plugins&amp;#8221; are useless or too shallow to warrant being called a plugin. The world doesn&amp;#8217;t need another slider plugin! It should be noted, however, that internal teams may develop their own plugins for their own uses, which is perfectly fine. However, if you&amp;#8217;re hoping to push your plugin into the social coding sphere, find a reason to write more code. As the saying goes, there&amp;#8217;s no reason to reinvent the wheel. Instead, take someone else&amp;#8217;s wheel, and build a racecar. Of course, sometimes there are new and better ways of doing the same things that have already been done. For instance, you very well might write a new slider plugin if you are using faster or new technology.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;10 &amp;#8211; &lt;/span&gt; You Aren&amp;#8217;t Providing a Minified Version&lt;/h2&gt;
&lt;p&gt;This one is fairly simple: offer a minified version of your code. This makes it smaller and faster. It also ensures that your Javascript is error free when compiled. When you minify your code, don&amp;#8217;t forget to offer the uncompressed version as well, so that your peers can review the underlying code. Free and cheap tools exist for front-end developers of all levels of experience.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      Refer to tip number thirteen for an automated solution.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;11 &amp;#8211; &lt;/span&gt; Your Code is Too Clever&lt;/h2&gt;
&lt;p&gt;When you write a plugin, it is meant to be used by others, right? For this reason, the most effective source code is highly readable. If you&amp;#8217;re writing countless clever one-liner lambda style functions, or your variable names aren&amp;#8217;t semantic, it will be difficult to debug errors when they inevitably occur. Instead of writing short variable names to save space, follow the advice in tip number nine (minify!). This is another part of good documentation; decent developers should be able to review your code and understand what it does without having to expend too much energy.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      If you find yourself calling variables &amp;#8220;&lt;code&gt;a&lt;/code&gt;&amp;#8221; or &amp;#8220;&lt;code&gt;x&lt;/code&gt;&amp;#8220;, you&amp;#8217;re doing it wrong.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Additionally, if you find yourself consulting documentation to remember what &lt;em&gt;your own&lt;/em&gt; strange looking code is doing, you also likely need to be less concise and more explanatory. Restrict the number of lines in each function to as few as possible; if they stretch for thirty or more lines, there might be a code smell.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;11.&lt;/span&gt;You Don&amp;#8217;t Need jQuery&lt;/h2&gt;
&lt;p&gt;As much as we all love using jQuery, it is important to understand that it is a library, and that comes with a small cost. In general, you don&amp;#8217;t need to worry too much about things like jQuery selector performance. Don&amp;#8217;t be obnoxious, and you&amp;#8217;ll be just fine. jQuery is highly optimized. That said, if the sole reason why you need jQuery (or a plugin) is to perform a few queries on the DOM, you might consider removing the abstraction entirely, and, instead, sticking with vanilla JavaScript, or Zepto.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
&lt;strong&gt;Note: &lt;/strong&gt;if you decide to stick with vanilla JavaScript, &lt;a href="http://caniuse.com"&gt;ensure&lt;/a&gt; that you&amp;#8217;re using methods that are cross-browser. You might potentially need a small polyfill for the newer APIs.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt; &lt;span&gt;13 &amp;#8211; &lt;/span&gt; You&amp;#8217;re Not Automating the Process&lt;/h2&gt;
&lt;blockquote class="pullquote pqRight"&gt;
&lt;p&gt;
Use Grunt. Period.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://gruntjs.com/"&gt;Grunt&lt;/a&gt; is a &amp;#8220;task-based command line build tool for JavaScript projects&amp;#8221;, which was covered in detail recently &lt;a href="http://net.tutsplus.com/tutorials/javascript-ajax/meeting-grunt-the-build-tool-for-javascript/"&gt;here on Nettuts+&lt;/a&gt;. It allows you to do things like this:&lt;/p&gt;
&lt;pre class="brush: plain; title: ; notranslate"&gt;
grunt init:jquery
&lt;/pre&gt;
&lt;p&gt;This line (executed in the command line) will prompt you with a set of questions, such as the title, description, version, git repository, licenses, etcetera. These pieces of information help to automate the process of setting up your documentation, licensing, etc. &lt;/p&gt;
&lt;p&gt;Grunt does far more than just make some customized boilerplate code for you; it also offers built in tools, like the code linter &lt;a href="http://www.jshint.com/"&gt;JSHint&lt;/a&gt;, and it can automate &lt;a href="http://docs.jquery.com/QUnit"&gt;QUnit&lt;/a&gt; tests for you as long as you have &lt;a href="http://phantomjs.org/"&gt;PhantomJS&lt;/a&gt; installed (which Grunt takes care of). This way, you can streamline your workflow, as tests run instantly in the terminal on save. &lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;&lt;span&gt;14 &amp;#8211; &lt;/span&gt;You&amp;#8217;re Not Testing&lt;/h2&gt;
&lt;p&gt;Oh, by the way &amp;#8211; you &lt;em&gt;do&lt;/em&gt; test your code, right? If not, how can you ensure/declare that your code works as expected? Manual testing has its place, but, if you find yourself refreshing the browser countless times every hour, you&amp;#8217;re doing it wrong. Consider using tools, such as &lt;a href="http://docs.jquery.com/QUnit"&gt;QUnit&lt;/a&gt;, &lt;a href="http://pivotal.github.com/jasmine/"&gt;Jasmine&lt;/a&gt;, or even &lt;a href="http://visionmedia.github.com/mocha/"&gt;Mocha&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;Testing is particularly useful when merging in pull requests on GitHub. You can require that all requests provide tests to ensure that the new/modified code does not break your existing plugin.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
      If the concept of testing jQuery plugins is brand new to you, consider watching our Premium-exclusive screencast, &lt;a href="http://tutsplus.com/tutorial/techniques-for-test-driving-jquery-plugins/"&gt;Techniques For Test-Driving jQuery Plugins&lt;/a&gt;. Additionally, we&amp;#8217;re launching a new &amp;#8220;JavaScript Testing With Jasmine&amp;#8221; course later this week on &lt;a href="http://tutsplus.com/courses"&gt;the site&lt;/a&gt;!
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;Some Helpful Resources&lt;/h2&gt;
&lt;p&gt;We wouldn&amp;#8217;t be doing you any favors by just telling you what you&amp;#8217;re doing wrong. Here are some links that will help get you back on the right path!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://learnjquery.tutsplus.com"&gt;30 Days To Learn jQuery&lt;/a&gt;
&lt;li&gt;&lt;a href="http://coding.smashingmagazine.com/2011/10/11/essential-jquery-plugin-patterns/"&gt;Essential jQuery Plugin Patterns &amp;#8211; Smashing Magazine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://alexsexton.com/blog/2010/02/using-inheritance-patterns-to-organize-large-jquery-applications/"&gt;Using Inheritance Patterns to Organize Large jQuery Applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank"href="http://docs.jquery.com/Plugins/Authoring"&gt;Official jQuery Documentation for Plugin Authoring&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank"href="http://jqueryboilerplate.com/"&gt;jQuery Boilerplate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank"href="http://stefangabos.ro/jquery/jquery-plugin-boilerplate-oop/"&gt;OOP jQuery Plugin Boilerplate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank"href="http://www.websanova.com/tutorials/jquery/10-coding-tips-to-write-superior-jquery-plugins"&gt;10 Coding Tips to Write Superior jQuery Plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing Thoughts&lt;/h2&gt;
&lt;p&gt;If you are writing a jQuery plugin, it is vital that you stray away from the pitfalls listed above. Did I miss any key signs of a poorly executed plugin?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ji_lQwFgLBoKC3M91S4bEwd0ZnE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ji_lQwFgLBoKC3M91S4bEwd0ZnE/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/ji_lQwFgLBoKC3M91S4bEwd0ZnE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ji_lQwFgLBoKC3M91S4bEwd0ZnE/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=utCsWyPhaNI:3iP1K3gXAIg: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=utCsWyPhaNI:3iP1K3gXAIg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=utCsWyPhaNI:3iP1K3gXAIg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=utCsWyPhaNI:3iP1K3gXAIg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=utCsWyPhaNI:3iP1K3gXAIg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=utCsWyPhaNI:3iP1K3gXAIg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=utCsWyPhaNI:3iP1K3gXAIg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=utCsWyPhaNI:3iP1K3gXAIg: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/utCsWyPhaNI" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/tutorials/javascript-ajax/14-reason-why-nobody-used-your-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/tutorials/javascript-ajax/14-reason-why-nobody-used-your-jquery-plugin/</feedburner:origLink></item>
		<item>
		<title>Best of Tuts+ in April 2012</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/5cFGV4E7a_U/</link>
		<comments>http://net.tutsplus.com/articles/news/best-of-tuts-in-april-2012/#comments</comments>
		<pubDate>Mon, 07 May 2012 00:20:24 +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=24898</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24898&amp;c=1195074847' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24898&amp;c=1195074847' 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-24898"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;We&amp;#8217;ve Been in Kuala Lumpur!&lt;/h2&gt;
&lt;p&gt;This month we&amp;#8217;ve been attending an Envato company meet-up in Malaysia. We&amp;#8217;ve had a fun time working together as a team, made lots of exciting plans for the future of Tuts+, and also had the chance to meet up with lots of our readers! Thanks to everyone who took the time to attend our community meet-up and, if you&amp;#8217;re interested, you can &lt;a href="http://webdesign.tutsplus.com/articles/news/envatos-kuala-lumpur-conference/"&gt;find out a bit more about our trip here&lt;/a&gt; (and see a few photos!)&lt;/p&gt;
&lt;div class="tutorial_image"&gt;&lt;img src="http://aetuts.s3.amazonaws.com/735_malay/malay_work.jpg" /&gt;&lt;/div&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/0683_Micro/preview.jpg" alt="Use Photoshop CS6 to Create a Micro Machines Inspired Scene" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/micro-machines-inspired-scene/'&gt;Use Photoshop CS6 to Create a Micro Machines Inspired Scene&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Photoshop CS6 is packed with new features and effects that you can use in your work. In this tutorial we will utilize Photoshop&amp;#8217;s new 3D capabilities as well as its new content aware features to create a Micro Machines inspired composition. Let&amp;#8217;s get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/micro-machines-inspired-scene/'&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/Premium_159_Snow/preview.jpg" alt="Create a Snowy Landscape From Desert Photography in Photoshop &amp;#8211; Tuts+ Premium Tutorial" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/snowy-landscape-using-desert-photography/'&gt;Create a Snowy Landscape From Desert Photography in Photoshop &amp;#8211; Tuts+ Premium Tutorial&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Photoshop is a great tool because it allows us to be creative and produce imagery that would be impossible to create otherwise. In this &lt;a href="http://tutsplus.com/?WT.mc_id=premium_psdtuts_ed" &gt;Tuts+ Premium&lt;/a&gt; tutorial, author Tony Aub&amp;eacute; will create a snowy landscape from desert photography and photos of sand. This tutorial is available exclusively to Tuts+ Premium Members. If you are looking to take your photo manipulation skills to the next level then &lt;a href="http://tutsplus.com/?WT.mc_id=premium_psdtuts_ed" &gt;Log in&lt;/a&gt; or &lt;a href="http://tutsplus.com/join/?WT.mc_id=premium_psdtuts_ed" &gt;Join Now&lt;/a&gt; to get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/tutorials/photo-effects-tutorials/snowy-landscape-using-desert-photography/'&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/0866_Light_Bulb/preview.jpg" alt="Create a Light Bulb Inspired Text Effect in Photoshop" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://psd.tutsplus.com/tutorials/text-effects-tutorials/light-bulb-text-effect/'&gt;Create a Light Bulb Inspired Text Effect in Photoshop&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Layer styles are a powerful and time saving feature that can help you apply amazing effects to your designs. In this tutorial we will use layer styles to create a light bulb inspired text effect in Photoshop. Let&amp;#8217;s get started!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://psd.tutsplus.com/tutorials/text-effects-tutorials/light-bulb-text-effect/'&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/1155_grunt/preview.jpg" alt="Meet Grunt: The Build Tool for JavaScript" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/javascript-ajax/meeting-grunt-the-build-tool-for-javascript/'&gt;Meet Grunt: The Build Tool for JavaScript&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you&amp;#8217;re working on a large project, you&amp;#8217;ll no doubt have a build script or a bunch of task scripts to help with some of the repetitive parts of the process. You might use Ant or Rake, depending on the language the project is written in.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/javascript-ajax/meeting-grunt-the-build-tool-for-javascript/'&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/2027_borders/images/css-borders-preview.jpg" alt="CSS Refreshers: Borders" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/html-css-techniques/css-refreshers-borders/'&gt;CSS Refreshers: Borders&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Sure, we&amp;rsquo;re all familiar with borders. Is there anything new that could possibly be introduced? Well, I bet there&amp;rsquo;s quite a few things in this article that you never knew about!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/html-css-techniques/css-refreshers-borders/'&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/2031_stFileCreation/lightning_file_creation_in_sublime_text_2.jpg" alt="Lightning Fast Folder and File Creation in Sublime Text 2" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://net.tutsplus.com/tutorials/tools-and-tips/lightning-fast-folder-and-file-creation-in-sublime-text-2/'&gt;Lightning Fast Folder and File Creation in Sublime Text 2&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;I&amp;#8217;m frequently asked about how I&amp;#8217;m able to create new directory structures and files so quickly in Sublime Text 2. Well the answer is that this functionality is not offered natively; instead, I use a helpful &lt;a href="https://github.com/xobb1t/Sublime-AdvancedNewFile" onclick="javascript:_gaq.push(['_trackEvent','outbound-article','github.com']);"&gt;plugin&lt;/a&gt;. I&amp;#8217;ll demonstrate it in this video.&lt;br /&gt;
&lt;span id="more-24774"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://net.tutsplus.com/tutorials/tools-and-tips/lightning-fast-folder-and-file-creation-in-sublime-text-2/'&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/qt/2012_QT/qt_49_character_poses/preview.jpg" alt="Quick Tip: The Line of Action, Make Your Character Poses More Dynamic!" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/quick-tip-the-line-of-action-make-your-character-poses-more-dynamic/'&gt;Quick Tip: The Line of Action, Make Your Character Poses More Dynamic!&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The line of action is a key ingredient to making your character&amp;#8217;s poses look more dynamic. In this guide, we will explore what the line of action is and how it can be used to make your character poses come alive.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/tutorials/illustration/quick-tip-the-line-of-action-make-your-character-poses-more-dynamic/'&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-free-vector-grunge/preview.jpg" alt="200+ Free Vector Grunge Graphics for Designers and Illustrators" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/articles/web-roundups/free-vector-grunge-graphics/'&gt;Free Vector Grunge Graphics for Designers and Illustrators&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;If you&amp;#8217;re looking for free vector grunge graphics, such as distressed backgrounds, worn textures, dirty paint splatter, and more, then you&amp;#8217;ve found a compilation worth downloading. We&amp;#8217;ve collected an assortment of vector grunge illustrations, free vector grunge textures, and wickedly worn graphics available for free download. Jump in and grab these free grunge vectors now and start making grunge vector art for your next project.&lt;span id="more-5541"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/articles/web-roundups/free-vector-grunge-graphics/'&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/504-retro-flyer/preview.jpg" alt="Vintage Vector Design Workflow: Creating a Retro Flyer Design" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://vector.tutsplus.com/tutorials/designing/retro-flyer-design/'&gt;Vintage Vector Design Workflow: Creating a Retro Flyer Design&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This tutorial will cover the process of creating a vintage inspired retro flyer design. There are four main areas of concentration to achieve this look and feel: color, type, character and texture. We&amp;#8217;ll review a complete vintage vector design workflow to create this retro flyer design. Let&amp;#8217;s get started.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://vector.tutsplus.com/tutorials/designing/retro-flyer-design/'&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/tuts/318_adi_QT/preview_actions.png" alt="Quick Tip: Speed Up Your Workflow With Photoshop Actions" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/workflow-tutorials/quick-tip-speed-up-your-workflow-with-photoshop-actions/'&gt;Quick Tip: Speed Up Your Workflow With Photoshop Actions&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Avoiding repetitive tasks is always going to speed up your workflow. In today&amp;#8217;s Quick Tip we&amp;#8217;ll do just that, by utilizing Photoshop&amp;#8217;s actions panel and combining it with hotkeys. Watch this quick screencast and I &lt;em&gt;guarantee&lt;/em&gt; you&amp;#8217;ll save tons of time next time you&amp;#8217;re designing!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/workflow-tutorials/quick-tip-speed-up-your-workflow-with-photoshop-actions/'&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/320_skeleton/preview.png" alt="Building a Responsive Layout With Skeleton: Finishing Off" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/complete-websites/building-a-responsive-layout-with-skeleton-finishing-off/'&gt;Building a Responsive Layout With Skeleton: Finishing Off&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;During previous screencasts in this series we&amp;#8217;ve covered a lot of ground, building our responsive (or adaptive) layout with the Skeleton boilerplate. It&amp;#8217;s now time to finish all the final details; arguably the most time-consuming part of any website build!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/tutorials/complete-websites/building-a-responsive-layout-with-skeleton-finishing-off/'&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/articles/074_ps_cs6/preview.png" alt="Adobe Photoshop CS6: Improvements for Web and UI Designers" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://webdesign.tutsplus.com/articles/workflow/adobe-photoshop-cs6-improvements-for-web-and-ui-designers/'&gt;Adobe Photoshop CS6: Improvements for Web and UI Designers&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Photoshop CS6 has been hailed as a huge improvement for web and UI designers. Im going to share with you some of the features that Photoshop CS6 Beta has to offer and demonstrate how they can help you in your web or UI design workflow.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://webdesign.tutsplus.com/articles/workflow/adobe-photoshop-cs6-improvements-for-web-and-ui-designers/'&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/868_realestatephoto/preview.jpg" alt="A How-To Guide to Getting Started in Real Estate Photography" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/articles/shooting-articles/a-how-to-guide-to-getting-started-in-real-estate-photography/'&gt;A How-To Guide to Getting Started in Real Estate Photography&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Real estate is one of the world&amp;#8217;s most competitive industries. Dominated by ambitious agents looking for the next big sale, selling real estate is all about setting yourself apart from the competition. What better way to catch a buyer&amp;#8217;s eye than the perfect photo of the perfect home? In today&amp;#8217;s article, we&amp;#8217;re taking a look at the exciting world of real estate photography.&lt;span id="more-8947"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/articles/shooting-articles/a-how-to-guide-to-getting-started-in-real-estate-photography/'&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/878_graycard/preview.jpg" alt="A Simple Solution to White Balance and Exposure: The 18% Gray Card" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/articles/hardware/a-simple-solution-to-white-balance-and-exposure-the-18-gray-card/'&gt;A Simple Solution to White Balance and Exposure: The 18% Gray Card&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;An 18% gray card is a handy accessory that every serious photographer should keep in their bag. It doesn&amp;#8217;t cost much and it barely takes up any space. If you encounter a situation where you have mixed lights, this unassuming piece of plastic helps you determine the white balance. It can also be used to determine the correct exposure.&lt;span id="more-9019"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/articles/hardware/a-simple-solution-to-white-balance-and-exposure-the-18-gray-card/'&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/875_framematte/preview.jpg" alt="An Expert Guide to Matting and Framing a Photo" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://photo.tutsplus.com/tutorials/post-processing/an-expert-guide-to-matting-and-framing-a-photo/'&gt;An Expert Guide to Matting and Framing a Photo&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;The final printed image is the culmination of my journey in creating a piece of artwork that represents my view of the world around me. As photographers in the digital age we spend far too much time staring at our photographs on our computer screens and very little time holding them in our hands. I still take great pride in every print I produce. There are a myriad of options for printing your work today, from canvas wraps to Metal prints, however for me there is something timeless and classic about a finely Matted and Framed print.&lt;span id="more-9001"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://photo.tutsplus.com/tutorials/post-processing/an-expert-guide-to-matting-and-framing-a-photo/'&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/381_Maya_Voodoo_Doll_Rigging_Pt1/Thumb.jpg" alt="Rigging A Voodoo Doll Character In Maya Using Setup Machine &amp;#038; Face Machine" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/autodesk-maya/rigging-a-voodoo-doll-character-in-maya-using-setup-machine-face-machine/'&gt;Rigging A Voodoo Doll Character In Maya Using Setup Machine &amp;#038; Face Machine&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial you’ll learn how to create a complete character rig for a voodoo doll character in Maya using the Setup Machine and Face Machine plugins from Anzovin studios. You’ll learn how these plugins can save you valuable time during rigging by allowing you to utilize pre-built body and face rigs which can then be customized to fit you and your character’s specific needs.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/autodesk-maya/rigging-a-voodoo-doll-character-in-maya-using-setup-machine-face-machine/'&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/375_C4D_Stylish_Countdown/Thumb.jpg" alt="Creating A Stylish 3D Countdown Animation In Cinema 4D" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/maxon-cinema-4d/creating-a-stylish-3d-coundown-animation-in-cinema-4d/'&gt;Creating A Stylish 3D Countdown Animation In Cinema 4D&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial we’re going to create a smooth, stylish countdown animation. You can use words, letters, logos or whatever you want to make this type of animation. As you can see it’s easy to set up and looks very stylish and attractive.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/maxon-cinema-4d/creating-a-stylish-3d-coundown-animation-in-cinema-4d/'&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/374_ZBrush_MicroBionic_War/Thumb.jpg" alt="Create a 3D Micro Robotic Insect in ZBrush" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://cg.tutsplus.com/tutorials/pixologic-zbrush/create-a-3d-micro-robotic-insect-in-zbrush/'&gt;Create a 3D Micro Robotic Insect in ZBrush&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;This week, Cgtuts+ has teamed up with our sister site &lt;a href="http://psd.tutsplus.com/" &gt;Psdtuts+&lt;/a&gt; to bring you this amazing two part, in-depth tutorial from Nacho Riesco. In this tutorial we are going to sculpt a Micro Bionic Insect with chemical war purposes using simple hard-surface modelling techniques with the Clipping Brush, Masking and much more. Head over to &lt;a href="http://psd.tutsplus.com/?p=16555" &gt;Psdtuts+&lt;/a&gt; for the conclusion of this project where we&amp;#8217;ll composite our render passes from Zbrush, and create the final image in Photoshop!&lt;span id="more-14543"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://cg.tutsplus.com/tutorials/pixologic-zbrush/create-a-3d-micro-robotic-insect-in-zbrush/'&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://ae.tutsplus.com/wp-content/uploads/2012/04/dimmerthumb1.jpg" alt="Make Your Own Durable Light Dimmers For Less Than $30" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/tutorials/production/make-your-own-durable-light-dimmers-for-less-than-30/'&gt;Make Your Own Durable Light Dimmers For Less Than $30&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In today&amp;#8217;s tutorial we&amp;#8217;re going to take you step by step through everything you need to know to build your own rugged light dimmers. We use these exact dimmers on all our studio and on location shoots. Besides being extremely durable, these little devices provide a wider range of lighting options and are surprisingly valuable when you have to light a scene in a tight location.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/tutorials/production/make-your-own-durable-light-dimmers-for-less-than-30/'&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/725_psdae/preview.png" alt="Is Working On Stills Easier in After Effects or Photoshop?" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/articles/in-depth/is-working-on-stills-easier-in-after-effects-or-photoshop/'&gt;Is Working On Stills Easier in After Effects or Photoshop?&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;We always tend to go to Photoshop for working with still images, but today I&amp;#8217;d like to bring up a few thoughts about why working in After Effects might be a better solution for your next project.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/articles/in-depth/is-working-on-stills-easier-in-after-effects-or-photoshop/'&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/734_skate/200x200.png" alt="Show A Motion Path With The StroMotion Effect" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://ae.tutsplus.com/tutorials/vfx/show-a-motion-path-with-the-stromotion-effect/'&gt;Show A Motion Path With The StroMotion Effect&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial we will track freeze frames into a hand-held scene utilizing The Foundry&amp;#8217;s CameraTracker to achieve an effect that is often referred to as &amp;#8220;StroMotion&amp;#8221;. We&amp;#8217;ll be talking about different methods of how to remove the subject from the background and how to line everything up. Enjoy! &lt;img src='http://ae.tutsplus.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href='http://ae.tutsplus.com/tutorials/vfx/show-a-motion-path-with-the-stromotion-effect/'&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/740_loops/preview.jpg" alt="30+ Sites That Serve Up Great Loops and Samples" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/articles/general/30-sites-that-serve-up-great-loops-and-samples/'&gt;Sites That Serve Up Great Loops and Samples&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Loops can form the foundation of a track, and are useful for quickly putting some ideas together when sketching out an arrangement. Samples provide us with sounds and colors to create our music with. But where can you download great loops and samples? Here are 30+ great places to start.&lt;br /&gt;
&lt;span id="more-13963"&gt;&lt;/span&gt;&lt;br /&gt;Every music producer worth his salt is in the process of building up a useful collection of useable sounds.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/articles/general/30-sites-that-serve-up-great-loops-and-samples/'&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_178_morphing/preview.jpg" alt="Morphing in Pro Tools" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/morphing-in-pro-tools/'&gt;Morphing in Pro Tools&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;We&amp;#8217;ve all seen how you can morph one face into another in the graphical world. In this screencast Rishabh Rajan shows us how to achieve the same thing with audio using Pro Tools.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/tutorials/production/morphing-in-pro-tools/'&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/528_3drouting/preview.jpg" alt="3D Mixing Part 7: Mastering, The Final Chapter (Part 1)" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://audio.tutsplus.com/tutorials/mixing-mastering/3d-mixing-part-7-mastering-the-final-chapter-part-1/'&gt;D Mixing Part 7: Mastering, The Final Chapter (Part 1)&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Although this is a series on mixing, it feels incomplete not to get into at least a brief discussion on master bus options and to discuss what exactly goes on when you print all your hard work to a single and final stereo file.  Due to the depth of this topic, I am splitting it into two parts.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://audio.tutsplus.com/tutorials/mixing-mastering/3d-mixing-part-7-mastering-the-final-chapter-part-1/'&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/articles/093_introToDart/Intro_to_Dart.png" alt="What Is Dart, and Why Should You Care?" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/articles/explanatory/what-is-dart-and-why-should-you-care/'&gt;What Is Dart, and Why Should You Care?&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial, I&amp;#8217;ll introduce you to Google&amp;#8217;s new web programming language, Dart, and explain why you should like it and what you need to know about it.  Learn about this new language and form some opinions about it &amp;#8211; will it really replace JavaScript?&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/articles/explanatory/what-is-dart-and-why-should-you-care/'&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/430_externalInterface/FlashJSHTML5.png" alt="Accessing the Same Saved Data With Separate Flash and JavaScript Apps" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/tutorials/actionscript/accessing-the-same-saved-data-with-separate-flash-and-javascript-apps/'&gt;Accessing the Same Saved Data With Separate Flash and JavaScript Apps&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial I will show you how to access the same saved data in separate Flash and JavaScript apps, by storing it in HTML5 LocalStorage and using ExternalInterface to reach it with AS3. We will create the same app in both JavaScript and Flash to demonstrate that it is platform agnostic.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/tutorials/actionscript/accessing-the-same-saved-data-with-separate-flash-and-javascript-apps/'&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/435_impactJS/ImpactJS-JesseFreman-Series.png" alt="An ImpactJS Overview: Introduction" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/an-impactjs-overview-introduction/'&gt;An ImpactJS Overview: Introduction&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Impact is an incredibly powerful HTML5 game framework which takes advantage of modern browser&amp;#8217;s canvas element and can also run on mobile or be compile into a native iOS app. In this video I will go over the framework, how to set up a project, some background into how to create classes in it and finally go over the core classes that make up the framework. This is a high level overview which will give you a general sense for how things work.&lt;/p&gt;
&lt;p&gt;&lt;a href='http://active.tutsplus.com/tutorials/games/an-impactjs-overview-introduction/'&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/241_Mini_Guide_to_Contact_Form_7/preview-image.jpg" alt="Mini Guide to Contact Form 7" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/tutorials/plugins/mini-guide-to-contact-form-7/'&gt;Mini Guide to Contact Form 7&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;Usually a website needs a contact form to communicate with the site owner. One of our favorites is Contact Form 7. Let&amp;#8217;s see what it can do!&lt;span id="more-25086"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/tutorials/plugins/mini-guide-to-contact-form-7/'&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/243_Custom_Post_Type_Helper_Class/thumbnail.jpg" alt="Custom Post Type Helper Class" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/tutorials/creative-coding/custom-post-type-helper-class/'&gt;Custom Post Type Helper Class&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;For a lot of WordPress projects these days we use custom post types. The WordPress development team created some handy methods to integrate them into your projects. But when you use custom post types, taxonomies and meta boxes frequently, it&amp;#8217;s quite probable that you&amp;#8217;re going to repeat yourself. That&amp;#8217;s why we are going to use the power of these WordPress functions to build a more powerful class, which we can use to quickly register post types, taxonomies and meta boxes.&lt;span id="more-25104"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/tutorials/creative-coding/custom-post-type-helper-class/'&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/258_Using_WordPress_as_an_Intranet/WPasIntranet.jpg" alt="Using WordPress as an Intranet" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://wp.tutsplus.com/tutorials/business/using-wordpress-as-an-intranet/'&gt;Using WordPress as an Intranet&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;When we talk about WordPress we usually associate it with either being a blogging platform or just another content management system, but what about as an Intranet? This tutorial will show you how you can turn your basic installation of WordPress into a robust Intranet for your business.&lt;span id="more-25260"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://wp.tutsplus.com/tutorials/business/using-wordpress-as-an-intranet/'&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="Create an Awesome Carousel, Version 2.0" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/create-an-awesome-carousel-version-2-0/'&gt;Create an Awesome Carousel, Version 2.0&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, and buttons.&lt;br /&gt;
&lt;span id="more-10476"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/create-an-awesome-carousel-version-2-0/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="https://d339vfjsz5zott.cloudfront.net/Corona-SDK_Alphabet/preview.png" alt="Corona SDK: Create an Alphabet Soup Game" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/corona/corona-sdk-create-an-alphabet-soup-game/'&gt;Corona SDK: Create an Alphabet Soup Game&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;In this tutorial series, you will learn how to create a minimalistic Alphabet Soup game. The goal of this game is to allow the player to pick words out from a jumbled set of letters. Read on!&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/corona/corona-sdk-create-an-alphabet-soup-game/'&gt;Visit Article&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li class='clear'&gt;
&lt;div&gt;
		&lt;img src="https://d339vfjsz5zott.cloudfront.net/iOS-Web-Services/web-services.png" alt="iOS Quick Tip: Interacting with Web Services" width="200" height="200" /&gt;
	&lt;/div&gt;
&lt;h4&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-interacting-with-web-services/'&gt;iOS Quick Tip: Interacting with Web Services&lt;/a&gt;&lt;/h4&gt;
&lt;p&gt;At some point in your iOS development career, you will have the need to interact with a web service from within your app. You may need to access remote data, parse a social network feed, or even download some assets into your application. This quick tip will teach you to do so without using third party libraries!&lt;br /&gt;
&lt;span id="more-10278"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href='http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-interacting-with-web-services/'&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/Z2uvWGBHBu2wzgF00QyEQDEiiao/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z2uvWGBHBu2wzgF00QyEQDEiiao/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/Z2uvWGBHBu2wzgF00QyEQDEiiao/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/Z2uvWGBHBu2wzgF00QyEQDEiiao/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=5cFGV4E7a_U:gVAp0RQoFlU: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=5cFGV4E7a_U:gVAp0RQoFlU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=5cFGV4E7a_U:gVAp0RQoFlU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=5cFGV4E7a_U:gVAp0RQoFlU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=5cFGV4E7a_U:gVAp0RQoFlU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=5cFGV4E7a_U:gVAp0RQoFlU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=5cFGV4E7a_U:gVAp0RQoFlU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=5cFGV4E7a_U:gVAp0RQoFlU: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/5cFGV4E7a_U" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/news/best-of-tuts-in-april-2012/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/news/best-of-tuts-in-april-2012/</feedburner:origLink></item>
		<item>
		<title>Reshaping Our Perception of Success</title>
		<link>http://feedproxy.google.com/~r/nettuts/~3/gUx_DWfrzvk/</link>
		<comments>http://net.tutsplus.com/articles/editorials/reshaping-our-perception-of-success/#comments</comments>
		<pubDate>Sat, 05 May 2012 02:02:34 +0000</pubDate>
		<dc:creator>Jeffrey Way</dc:creator>
				<category><![CDATA[Editorials]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[success]]></category>
		<guid isPermaLink="false">http://net.tutsplus.com/?p=24908</guid>
		<description>&lt;a href='http://rss.buysellads.com/click.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24908&amp;c=1746021342' target='_blank'&gt;&lt;img src='http://rss.buysellads.com/img.php?z=1260013&amp;k=d754f1e9ba63a736ba8ff5ece958f7dd&amp;a=24908&amp;c=1746021342' border='0' alt='' /&gt;&lt;/a&gt;&lt;p&gt;Over the course of these last two weeks, I had the pleasure of attending an Envato meetup/conference in Malaysia. As you might expect, Envato is composed of ridiculously smart and talented folks…folks so smart that it quickly becomes intimidating!&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;m not here to talk about the conference specifically; instead, I&amp;rsquo;d prefer to ramble a bit on one of my largest takeaways from the event.&lt;/p&gt;
&lt;p&gt;&lt;span id="more-24908"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;The Old-Fashioned &amp;#8220;Path&amp;#8221;&lt;/h2&gt;
&lt;div class="tutorial_image"&gt;
   &lt;img src="http://d2o0t5hpnwv4c1.cloudfront.net/2034_success/advancement-1.jpg" alt="The Path" /&gt;
&lt;/div&gt;
&lt;p&gt;One day during the conference, I had a chat with Envato&amp;rsquo;s current (temporary) lead development manager, Pete, about the traditional concept of advancement in a company. In many ways, we&amp;rsquo;re designed/brainwashed from an early age to follow a very specific path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Begin at the bottom.&lt;/li&gt;
&lt;li&gt;Slowly work your way up to your target position (meaning the job in which you are most content and fullfilled).&lt;/li&gt;
&lt;li&gt;Finally, despite your instincts advising you otherwise, you disregard your current contentment, and instead continue once again up the stairs… to management.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;rsquo;s a good thing, right? Well, in our industry, specifically, maybe not. &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Management can be a bit of a scary word. It indicates Excel, not code. It indicates&amp;#8230; management, not development.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
Our life-long training tells us that this is what&amp;rsquo;s supposed to happen.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But, nonetheless, it&amp;rsquo;s still a higher level (hopefully higher paying) job. Our life-long training tells us that this is what&amp;rsquo;s supposed to happen, if we desire to be successful. You&amp;rsquo;ve worked hard; now you get to manage others (and maybe drink scotch). This is the path.&lt;/p&gt;
&lt;p&gt;For creatives, though, does this sort of role make us happy?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Is this what kept us up late at night learning how to code?
&lt;li&gt;Are we selling our souls (to be dramatic) for slightly more money?
&lt;li&gt;Are we addicted to some silly notion of control or power or respect?
&lt;/ul&gt;
&lt;p&gt;Sure, we may have a bit more input into the direction of the business, but does it make us happier? For the last year or so, I&amp;rsquo;ve struggled with this very thing. I adore my current job: I&amp;rsquo;m able to help shape the future of education in the creative fields (more on that later this year), and spend all of my spare/free time learning how to be a more efficient developer. What could be better than that?&lt;/p&gt;
&lt;p&gt;Still, though, that lingering feeling always rested in the back of my mind: I&amp;rsquo;m only &amp;ldquo;advancing&amp;rdquo; in the world if my job title/rank increases sporadically. I had (and have) no desire to change my current involvement/role in the company (Envato), but, nevertheless, felt that I &lt;em&gt;should&lt;/em&gt; reach for these more traditional managerial roles.&lt;/p&gt;
&lt;blockquote class="pullquote"&gt;
&lt;p&gt;
This old-fashioned notion of advancement is a silly metric for success.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;The Lesson&lt;/h3&gt;
&lt;p&gt;Pete taught me that this old-fashioned notion of advancement is a silly metric for success. Instead, we have to reshape our perception of what both success and fulfillment are. Remember when I noted that Pete was the development manager at Envato? Well, technically, at his own choosing, he&amp;rsquo;s the &lt;em&gt;temporary&lt;/em&gt; manager, while we search for a new development manager. Despite the fact that he&amp;rsquo;s certainly qualified for the job, he doesn&amp;rsquo;t want it &amp;#8211; which I find incredibly admirable. Instead, his skills/desires rest firmly in things like software architecture. In his own words, that is where he is able to contribute most effectively to the company. So, a bit oddly, perhaps, he is currently in the position of finding and hiring his future manager. &lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Closing Thoughts&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s interesting how the older I get, the more and more I come back to this one word: &amp;ldquo;contentment.&amp;rdquo; It&amp;rsquo;s not about job titles, or vanity, or even money (to some extent); it&amp;rsquo;s simply about contentment. Do what you love, and forget those old-fashioned job titles and notions of success. Or&amp;#8230; &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
       Figure out where you&amp;#8217;re most effective in your company, and do&amp;#8230;that. Period.
  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/noxOOqMWktfOUd5fhKs9Z_gwnGI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/noxOOqMWktfOUd5fhKs9Z_gwnGI/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/noxOOqMWktfOUd5fhKs9Z_gwnGI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/noxOOqMWktfOUd5fhKs9Z_gwnGI/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=gUx_DWfrzvk:QIbKa9Euslc: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=gUx_DWfrzvk:QIbKa9Euslc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gUx_DWfrzvk:QIbKa9Euslc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gUx_DWfrzvk:QIbKa9Euslc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gUx_DWfrzvk:QIbKa9Euslc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gUx_DWfrzvk:QIbKa9Euslc:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/nettuts?i=gUx_DWfrzvk:QIbKa9Euslc:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/nettuts?a=gUx_DWfrzvk:QIbKa9Euslc: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/gUx_DWfrzvk" height="1" width="1"/&gt;</description>
		<wfw:commentRss>http://net.tutsplus.com/articles/editorials/reshaping-our-perception-of-success/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		<feedburner:origLink>http://net.tutsplus.com/articles/editorials/reshaping-our-perception-of-success/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.834 seconds -->

