<?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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Wes Bos</title>
	
	<link>http://wesbos.com</link>
	<description>Designer, Developer &amp; Entrepreneur making the web an awesome place.</description>
	<lastBuildDate>Tue, 06 Mar 2012 15:04:42 +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/wesbos/ZXAx" /><feedburner:info uri="wesbos/zxax" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Remote Debugging with Chrome for Android [video + tut]</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/V9aFY04oGMM/</link>
		<comments>http://wesbos.com/remote-debugging-mobile-chrome-android/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 14:32:21 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=522</guid>
		<description><![CDATA[Be sure to Follow @wesbos on twitter for more like this Earlier this week Chrome for Android was finally announced and web developers everywhere celebrated. Not only did we have one of the best browsers now on our phones, but &#8230; <a href="http://wesbos.com/remote-debugging-mobile-chrome-android/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Be sure to <a href="http://twitter.com/wesbos" target="_blank">Follow @wesbos on twitter</a> for more like this <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<p>Earlier this week Chrome for Android was finally announced and web developers everywhere celebrated. Not only did we have one of the best browsers now on our phones, but we had access to remote debugging, which we have been waiting for and talking about <em>forever</em>.</p>
<p>Remote debugging allows a developer to use the browsers developer tools from a desktop computer while inspecting and manipulating the website on the mobile device &#8211; all in real time! This means you no longer have to use alert boxes to debug a problem that only reproduces on the phone.</p>
<p>So, while there have been a <a href="http://phonegap.github.com/weinre/" target="_blank">few</a> <a href="http://www.opera.com/dragonfly/documentation/remote/" target="_blank">earlier</a> <a href="http://devblog.blackberry.com/2011/06/debugging-blackberry-web-apps/" target="_blank">implementations</a> of something similar, Chrome for android brings us the rock solid experience that we have been waiting for. Without further ado, here is a quick tutorial on how to get remote debugging up and running.</p>
<p>Update: I&#8217;d like to specifically point out that Opera Mobile has has this functionality for quite some time now and you&#8217;re able to do it without USB or a SDK (<a href="http://twitter.com/#!/miketaylr" target="_blank">miketaylr</a> had an awesome presentation on it at jQuer conf). So, develop in whatever browser you prefer and use both these tools when you&#8217;re debugging that specific mobile browser.<br />
<span id="more-522"></span></p>
<h3>What you&#8217;ll need</h3>
<ol>
<li>An android phone that runs Ice Cream Sandwhich</li>
<li>Google Chrome beta from the Android Market</li>
<li>A USB to plug in your phone </li>
<li>The <a title="Android SDK with Remote Debugging" href="http://developer.android.com/sdk" target="_blank">Android SDK </a>if you haven&#8217;t already installed it.</li>
</ol>
<p><iframe width="640" height="360" src="http://www.youtube.com/embed/n_7Wyj6DciY?fs=1&#038;feature=oembed" frameborder="0" allowfullscreen></iframe></p>
<h3>Installing the Android SDK</h3>
<p>This step is really quick because you either already have the android SDK installed or if you need to install it, we just need a tiny little part of it &#8211; nothing related to the native android development. These instructions are for OSX but they are very similar to Windows, the one differnce being that Windows users must install the <a href="http://developer.android.com/sdk/win-usb.html" target="_blank">USB Driver</a>. Go ahead and download the SDK, unzip it, and put the entire <code>android-sdk-macosx</code> folder somewhere other than your downloads folder. I reccomend keeping it in in <code>/Developer/android-sdk-macosx/</code>. Double click <code>android</code> file and the Android SDK manager will open up. Uncheck everything except the &#8220;Android SDK Platform-tools&#8221; and click &#8220;Install 1 Package&#8221;</p>
<p><img src="http://wesbos.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-11-at-11.30.02-AM3-650x464.png" alt="" title="Screen Shot 2012-02-11 at 11.30.02 AM" width="640" height="456" class="aligncenter size-large wp-image-533" /></p>
<p>You&#8217;ll also probably want to add the <code>/platform tools/</code> to your $PATH so you can access the <code>adb</code> command from any folder rather than just in the platform tools folder. Run the following command  from your terminal.</p>
<p><code>export PATH=$PATH:/Developer/android-sdk-macosx/platform-tools</code></p>
<h3>Preparing your phone</h3>
<p>There are two things you need to enable to make remote debugging. Plug your phone in via USB and set the following two options.</p>
<ol>
<li>Check the box for <code>Settings</code> &rarr; <code>Developer options</code> &#038;rarrl <code>USB debugging</code></li>
<li>Open Chrome on your phone &rarr; <code>Settings</code> &rarr; <code>Developer Tools</code> &rarr; <code>check Enable USB Web debugging</code></li>
</ol>
<h3>Starting the remote debugging!</h3>
<p>Now that we have everything in place and our phone is plugged in, we can start the remote debugging server. Fire open your terminal and type the following command and hit enter:</p>
<p><code>adb forward tcp:9222 localabstract:chrome_devtools_remote</code></p>
<p>Occasionally I&#8217;ll either get no response or a &#8220;device not found&#8221; error. I&#8217;ve found that running the command <code>adb kill-server</code> and then the code above resurrects the situation.</p>
<p><img src="http://wesbos.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-11-at-12.07.17-PM.png" alt="" title="adb forward tcp:9222 localabstract:chrome_devtools_remote" width="562" height="170" class="aligncenter size-full wp-image-538" /></p>
<p>Now browse to <a href="http://localhost:9222" target="_blank">http://localhost:9222</a> on your desktop version of chrome and you will see a list of currently open tabs on your phone, clicking one of them will reveal the Chrome dev tools interface that you&#8217;re used to. Instead of having the window above the tools, its on your phone!</p>
<p><img src="http://wesbos.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-11-at-12.39.28-PM-650x373.png" alt="" title="Chrome Remote Debugging" width="640" height="367" class="aligncenter size-large wp-image-540" /></p>
<p>You can use it just as if you were using your regular dev tools. Go ahead change the CSS background colour or send an alert over the console.</p>
<p><img src="http://wesbos.com/wp-content/uploads/2012/02/Screen-Shot-2012-02-11-at-12.44.50-PM-300x284.png" alt="" title="Remote Debugging Alert" width="300" height="284" class="alignleft size-medium wp-image-541" /><br />
<img src="http://wesbos.com/wp-content/uploads/2012/02/Screenshot_2012-02-11-12-54-40-180x300.png" alt="" title="Screenshot_2012-02-11-12-54-40" width="180" height="300" class="alignright size-medium wp-image-542" /></p>
<div class="clear"></div>
<h3>Thats all folks!</h3>
<p>Thats all, its an incredible useful tool that we have all been looking forward to. Now we wait with baited breath for Safari on IOS to turn on remote debugging.</p>
<p>If you liked this tutorial, be sure to give me a <a href="http://twitter.com/wesbos" target="_blank">follow on twitter</a> <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/V9aFY04oGMM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/remote-debugging-mobile-chrome-android/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://wesbos.com/remote-debugging-mobile-chrome-android/</feedburner:origLink></item>
		<item>
		<title>What I learned interviewing with Google</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/k-nLlaQb6wk/</link>
		<comments>http://wesbos.com/interviewing-with-google/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 05:29:59 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=508</guid>
		<description><![CDATA[Over the last few weeks I&#8217;ve been interviewing with Google for a job doing primarily JavaScript development. I didn&#8217;t end up getting the job but I thought I would share the process of interviewing for Google as it was both &#8230; <a href="http://wesbos.com/interviewing-with-google/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Over the last few weeks I&#8217;ve been interviewing with Google for a job doing primarily JavaScript development. I didn&#8217;t end up getting the job but I thought I would share the process of interviewing for Google as it was both very exciting and a humbling experience. I can&#8217;t reveal everything as I&#8217;m under a few NDAs. I&#8217;m not going to mention the products or teams that I was interviewing for but you may be able to guess.</p>
<p>For those that don&#8217;t know me, I&#8217;m an independent developer/designer. A majority of my work falls into the four categories of  JavaScript development, WordPress development, HTML5/CSS3 or UI/UX design. I absolutely love running my own show and it would take quite a bit to get me to switch out.</p>
<p><strong>In the beginning</strong></p>
<p>So, a few months ago I had a Google employee ask me if I was interested in joining their team. As I said, I&#8217;m super happy with what I&#8217;m doing at the moment but I didn&#8217;t want to turn down the chance to interview or even work for Google. I happily passed along my resume and that was the end of that for about 5-6 months.<br />
<span id="more-508"></span><br />
Cut to about 3 weeks ago, I received an email from a Google recruiter asking if I was interested in a software engineer job down in Boston. I told her I was and we arranged a phone interview.</p>
<p>At this point I was really excited because its always been a bit of a dream of mine to work for Google but I have always assumed two things:</p>
<ul>
<li>Google only hires those with an educational background in Computer Science</li>
<li>Google only hires people with a well versed background in many programming languages.</li>
</ul>
<p>I went to school for Information Technology Management at Ryerson University where I graduated with a bComm. My schooling was more about development methodologies, project management, systems analysis and other high level IT skills combined with way too much math and management approaches. I took one course on development which gave me an excellent primer to C and Unix but it was far from what those in Computer science learn. I&#8217;ve been coding since I can remember and have just picked up my chops along the way mainly focusing on PHP development and the last few years, JavaScript.</p>
<p>So, needless to say I wasn&#8217;t as well versed in some algorithms and big O as someone who spent 4 years in Comp Sci but I have a pretty good handle on the languages I do know.</p>
<p><strong>The First Interview</strong></p>
<p>The first interview was over the phone with a Google HR rep. It was a fairly quick 20 minute interview where I talked about what sort of projects I liked to work on, what langages were my favourite and my background in both employment and schooling. I also told her I&#8217;d be willing to move down to Boston but would love a spot at their Waterloo office (which is about a 1.5 hour drive from Toronto). She told me they primarily hire strong C++ and Java developers, something which I have very little experience with. After I talked about how much I enjoyed front end devleopment, she said that I would be a good fit for a spot in their waterloo office.</p>
<p>We arranged to do two interviews in one day in about a week and a half. The HR rep sent over an email with some guidelines and things to brush up on which included comp sci 101 things such as sorting algos, hash tables, binary trees and so on.  I was familiar with a few things on the list, but I definitely had to do a lot of reading in the week and a half before my interview.</p>
<p><strong>Meeting with Google engineers and coding on a whiteboard</strong></p>
<p>After a few late, panicked nights and handfulls of really fun Javascript problems from my good friend <a href="http://darcyclarke.me" target="_blank">Darcy Clarke</a> who did his best to prepare me, I was ready for my two interviews with the engineers.</p>
<p>My first interview was with a mobile developer and it lasted around an hour. He started off discussing different types of sorts, explaining what algorithms would be more performant, which situations I would use a specific algorithm and a whole smattering of comp sci terminology which I had to explain. I tripped over quite a few of these and felt pretty embarrassed. After that we moved onto talking about JavaScript performance, I wish I could say more here but not revealing the questions asked was a large part of the NDA. After that we moved into talking about design for mobile devices. After this and the JavaScript questions I started to feel pretty good about it. We ended the interview with a 25 minute coding question that had to do with efficiently sorting arrays. I had never coded on a whiteboard before and I felt like I made a few stupid mistakes.</p>
<p>Next up was another mobile developer from another product that they work on in the Google Waterloo office. We started off talking JavaScript performance again and then jumped right into the coding problem on the whiteboard. I was pretty nervous at this point in time and I made a few more silly mistakes that I wouldn&#8217;t have done in a proper IDE. We finished the interview talking about some HTML5 video stuff I was working on and talked a little bit about typed javascript compression.</p>
<p>I left after that feeling that I totally slam dunked parts of the interview and bombed other parts.</p>
<p><strong>Whew, its over.</strong></p>
<p>A few days later I got a call from the HR person at Google and she told me in the nicest way possible that I wasn&#8217;t a fit for the position. She said she would keep me in mind for future positions, which is nice whether they meant it or not <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Coming out of this I&#8217;m not particularly bummed out, it was a fantastic experience to interview with Google, I&#8217;m honoured they had me come in and interview; its something I never would have thought would happen to me. I still have a really awesome job where I work on some really awesome projects and I have an incredible drive to keep learning more about web development. To sum it up what I learned in a few points:</p>
<ol>
<li>Comp sci problems are a ton of fun to solve in JavaScript. I practiced a lot with Nicholas Zakas&#8217; <a href="http://www.nczonline.net/blog/tag/computer-science/" target="_blank">computer science in JavaScript </a> posts.</li>
<li>Even if you aren&#8217;t a leet C++ or Java dev, Google still takes interest</li>
<li>Learning another language helps you become a more rounded developer. This experience hasn&#8217;t made me want to go back to writing C but I may take interest in another language that isn&#8217;t as forgiving as JavaScript.</li>
<li>Coding Chops &gt; Comp Sci degree</li>
<li>A Comp Sci degree is very helpful when trying to explain Hash tables, Vectors and Big O</li>
<li>Always be hustlin&#8217; A few years ago I would have never of though I would be interviewing at google just 9 months fresh out of school. Anything can happen.</li>
</ol>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/k-nLlaQb6wk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/interviewing-with-google/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		<feedburner:origLink>http://wesbos.com/interviewing-with-google/</feedburner:origLink></item>
		<item>
		<title>HTML5 Shirt Giveaway!</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/-JA5LkKDaNc/</link>
		<comments>http://wesbos.com/html5-shirt-giveaway/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 16:36:13 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=471</guid>
		<description><![CDATA[Happy New Year! I hope everyone had an awesome holidays. To celebrate, I&#8217;m going to be giving away 5 of these kickass HTML5 shirts that the folks at Microsoft have kindly provided. These aren&#8217;t your regular HTML5 shirts, they come &#8230; <a href="http://wesbos.com/html5-shirt-giveaway/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Happy New Year! I hope everyone had an awesome holidays. To celebrate, I&#8217;m going to be giving away 5 of these kickass HTML5 shirts that the folks at Microsoft have kindly provided.</p>
<p>These aren&#8217;t your regular HTML5 shirts, they come from Canada so naturally they involve a polar bear, a beaver and a moose.</p>
<p><img class="aligncenter size-full wp-image-472" title="html53" src="http://wesbos.com/wp-content/uploads/2012/01/html53.png" alt="" width="650" height="400" /><img class="aligncenter size-full wp-image-474" title="html2" src="http://wesbos.com/wp-content/uploads/2012/01/html21.png" alt="" width="650" height="400" /></p>
<p><strong>How To Enter</strong></p>
<p>To enter, simply sent out a tweet with the hashtag #HTML5shirt and a link to this post.</p>
<p>&#8220;Win a #HTML5shirt from @wesbos http://wesbos.com/html5-shirt-giveaway&#8221;</p>
<p><a href="https://twitter.com/share" class="twitter-share-button" data-url="http://wesbos.com/html5-shirt-giveaway/" data-text="Win a #HTML5shirt from @wesbos" data-size="large" data-related="wesbos">Tweet</a></p>
<p>I will be giving them away to 5 random tweeters and using <a href="http://twittertwitterchickendinner.com" target="_blank">twittertwitterchickendinner.com</a> to pick the winners. I&#8217;ll ship you the shirt anywhere in the world. I have them in most sizes but is first come first serve.</p>
<p>Thats it, good luck and if you so please, follow me on twitter for more on HTML5. <a href="https://twitter.com/wesbos" class="twitter-follow-button" data-show-count="false">Follow @wesbos</a></p>
<p><strong>Update: Winners!</strong><br />
First off, thanks to everyone who entered the draw, having almost 2,000 enter is pretty nuts! I&#8217;ll have to find a way I can do this again because you guys love your free shirts <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Drumroll please&#8230; The Winners are: </p>
<p>@steno, @sheppy, @csixty4, @oscargodson and @PatridgeDev</p>
<p>Congrats! Contact me wes@wesbos.com within 24 hours with a mailing address and shirt size to claim you prize.</p>
<p>Thanks again everyone, I have some really cool HTML5 stuff coming down the pipe so stay tuned!</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/-JA5LkKDaNc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/html5-shirt-giveaway/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		<feedburner:origLink>http://wesbos.com/html5-shirt-giveaway/</feedburner:origLink></item>
		<item>
		<title>Upcoming Talks and Workshops!</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/B9BulwQIXBk/</link>
		<comments>http://wesbos.com/upcoming-talks-and-workshops/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 00:46:49 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[HTML5]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[devto]]></category>
		<category><![CDATA[ladies learning code]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=464</guid>
		<description><![CDATA[This November I have two development related talks coming up and I thought I would take a second to formally invite you! The first is an all day workshop on WordPress development which is being done with the great folks &#8230; <a href="http://wesbos.com/upcoming-talks-and-workshops/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This November I have two development related talks coming up and I thought I would take a second to formally invite you!</p>
<p>The first is an all day workshop on WordPress development which is being done with the great folks at <a href="http://ladieslearningcode.com/" target="_blank">Ladies Learning Code</a>. If you haven&#8217;t heard yet, LLC is an awesome initiative started by a few<a href="http://ladieslearningcode.com/about/" target="_blank"> Toronto ladies</a> with the purpose of creating a comfortable environment where women can learn basic web development skills. I will be leading the upcoming WordPress workshop where I will take you from installing WordPress to making your very own theme. The workshop is on Saturday, November 26 and costs $40. The first round of tickets sold out in a heart beat, so be sure to <a href="http://ladieslearningcodenov26.eventbrite.com/" target="_blank">sign up for the second round </a>if you&#8217;re interested!</p>
<p>The second is quick talk on HTML5 Canvas at the <a href="http://devto.ca/" target="_blank">#devTo</a> meetup. This event is held once a month and is open to anyone who is interested in chatting about development. I&#8217;ve been to the last few meetups and I&#8217;ve found them pretty awesome. There a good mix of designers, developers (of all languages) and industry folk which always allows for good conversation (the free pizza and beer aren&#8217;t bad either!). I&#8217;ll be doing a quick introduction to the HTML5 Canvas element, what it is, what we can do with it, how to work with it as well as showing a few examples of stuff I&#8217;ve done with it. Canvas really is one of the most exciting parts of HTML5 so I&#8217;m looking forward to sharing what I&#8217;ve done so far. This event is always super popular and has already sold out, so get on the <a href="http://atendy.com/event/240747" target="_blank">wait list</a> and cross your fingers!</p>
<p>Thats all for now, hope to see you at one of the upcoming events!</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/B9BulwQIXBk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/upcoming-talks-and-workshops/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wesbos.com/upcoming-talks-and-workshops/</feedburner:origLink></item>
		<item>
		<title>Hide iOS5 Newsstand Icon on the iPhone</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/IE77IJJ8n1c/</link>
		<comments>http://wesbos.com/hide-newsstand-icon-iphone/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 20:09:47 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=453</guid>
		<description><![CDATA[Many people, myself included, were annoyed that you aren&#8217;t able to put the new Newsstand Icon in a folder. Well a quick little hack I found today lets you do just that! Turns out you can trick iOS5 by creating &#8230; <a href="http://wesbos.com/hide-newsstand-icon-iphone/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Many people, myself included, were annoyed that you aren&#8217;t able to put the new Newsstand Icon in a folder. Well a quick little <a href="http://thecodingmassacre.wordpress.com/2011/10/13/newsstand-folder-no-jailbreak-ios-5/" target="_blank">hack</a> I found today lets you do just that! Turns out you can trick iOS5 by creating a folder with other icons and then quickly drag it into that folder.</p>
<p>This doesn&#8217;t require you to jail break, but it does take a quick finger! Watch this video to see how to do it:</p>
<p><object width="640" height="480"><param name="movie" value="http://www.youtube.com/v/mSM1_gzi4yI?version=3&#038;feature=oembed"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/mSM1_gzi4yI?version=3&#038;feature=oembed" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Note</h3>
<p>This should only be done if you are no using newsstand. Trying to launch newsstand from within a folder crashes springboard!</h3>
<p>Cool eh? Follow me on <a href="http://twitter.com/wesbos">Twitter</a> for more like this <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/IE77IJJ8n1c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/hide-newsstand-icon-iphone/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://wesbos.com/hide-newsstand-icon-iphone/</feedburner:origLink></item>
		<item>
		<title>Code Folding in Sublime Text 2</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/WMVy6O-JC9g/</link>
		<comments>http://wesbos.com/sublime-text-code-folding/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 03:20:08 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Sublime Text]]></category>
		<category><![CDATA[Text Editors]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=437</guid>
		<description><![CDATA[To continue on with my string of blog posts on Sublime Text 2, I&#8217;m going to show you a short but handy feature that was just pushed to the stable build. Code Folding! Unfortunately, collapsing of code in sublime text &#8230; <a href="http://wesbos.com/sublime-text-code-folding/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>To continue on with my string of blog posts on Sublime Text 2, I&#8217;m going to show you a short but handy feature that was just pushed to the stable build. Code Folding!</p>
<p>Unfortunately, collapsing of code in sublime text isn&#8217;t exactly the same as textmate, so you dont get the little arrows in the sidebar. The code is also folded into a single character which makes it easy to delete an entire block of folded code without noticing you have done so. This is the first iteration of code folding in sublime text 2, so I&#8217;m sure it will only get better. With those cautions in mind lets take a look at how to work code folding in Sublime.<br />
<span id="more-437"></span></p>
<p><object width="640" height="480"><param name="movie" value="http://www.youtube.com/v/80UUPMUAP-g?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/80UUPMUAP-g?version=3" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Practice Code</h3>
<p>Code folding works in all languages. I&#8217;ve created a small snippet of JavaScript which we can use to practice. Copy and paste this into Sublime and set the document mode as JavaScript.</p>
<pre class="brush:js">var obj = {
	myStr: "Hello",
	myFunc : function() {
		console.log("hello");
		$('.someDiv').animate({height: 500}, function(){}
			// trigger the callback
			console.log('Done');
		});
	},
	myFunc2 : function() {
		return "Just another Level 2 function";
	},
	myNum : function() {
		return "Level 2 function";
	}
}</pre>
<h3>Folding Selected Text</h3>
<p>This is probably what you came here looking for. you want to select a few lines of text and fold them out of the way. Easy!</p>
<p>Select the text you want to fold and hit <code> Command + Option + [</code>. You'll now see you have a little icon indicating you have folded some code.</p>
<p><img class="alignleft size-full wp-image-423" title="Screen Shot 2011-10-03 at 5.32.13 PM" src="http://wesbos.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-03-at-5.32.13-PM.png" alt="" width="244" height="124" /></p>
<p>To unfold your code, hit the opposite <code> Command + Option + ]</code>.</p>
<p><strong>*Note:  Windows users, substitute command and option for CTRL + SHIFT</strong></p>
<h3>Block level code folding is where its at!</h3>
<p>Selecting the code you want to fold can be a pain. If you maintain nice, clean indenting within your document, you&#8217;ll be able to quickly fold and unfold several levels of code in just a few key strokes.</p>
<p>To fold a block, place your cursor anywhere within the block you want to fold. For our example, lets place it in the myFunc function. Now you just hit the folding keys to collapse that block.<br />
<code> Command + Option + [</code></p>
<p><img class="aligncenter size-full wp-image-424" title="Sublime Text Block Code Folding" src="http://wesbos.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-03-at-5.37.27-PM.png" alt="" width="432" height="245" /></p>
<h3>Fold Multiple blocks at once</h3>
<p>Another handy feature of Sublime Text 2 code folding is being able to fold all blocks that are indented with a certain level. For this example, I want to fold all the and just see the the properties/functions of <code>obj</code>.</p>
<p>The keyboard shortcut for this is a little different. We need to hold down <code>Command</code> and then tap <code>k</code>.<br />
While you are still holding down <code>Command</code> tap the level of code block you want to fold. In this case 2.</p>
<p>Confused? <code>CMD + K, CMD + 2</code></p>
<p>We now see that everything beyond 2nd level blocks are hidden. To unfold everything again, we do the same thing but with 0.</p>
<p><code>CMD + K, CMD + 0</code></p>
<h3>Folding Tag attributes</h3>
<p><img class="alignright size-full wp-image-427" title="Sublime Text Attribute Folding" src="http://wesbos.com/wp-content/uploads/2011/10/Screen-Shot-2011-10-03-at-5.50.54-PM.png" alt="" width="275" height="378" />When working with an HTML document that is heavy on attributes, it can be helpful to hide everything but the element type. This is extremely useful when working with something like jQuery UI that have long class names, titles, data, and aria attribues. Now, this one is all or nothing, so you can&#8217;t hide them case-by-case.</p>
<p>To hide:<br />
<code>CMD + K, CMD + T</code></p>
<p>To show again:<br />
<code>CMD + K, CMD + 0</code></p>
<p><br/></p>
<h4>You&#8217;re now a cold folding master</h4>
<p>Do each of these folding steps a few times to get the hang of it and you will find it very useful in your day to day development.</p>
<p>Let me know if you have any questions. If you like this stuff please <a href="http://twitter.com/wesbos">Follow Me on Twitter</a>.</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/WMVy6O-JC9g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/sublime-text-code-folding/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://wesbos.com/sublime-text-code-folding/</feedburner:origLink></item>
		<item>
		<title>Sublime Text 2 Build System Scripts: CoffeeScript &amp; Node</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/JPB6aiTdVoI/</link>
		<comments>http://wesbos.com/sublime-text-build-scripts/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 00:32:48 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[Sublime Text]]></category>
		<category><![CDATA[Text Editors]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=408</guid>
		<description><![CDATA[A really great feature of Sublime Text 2 is the ability to create your own build scripts. A build script is helpful when you are writing in a language that needs to be compiled or executed from terminal / command &#8230; <a href="http://wesbos.com/sublime-text-build-scripts/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>A really great feature of <a href="http://www.sublimetext.com/2" target="blank">Sublime Text 2</a> is the ability to create your own build scripts. A build script is helpful when you are writing in a language that needs to be compiled or executed from terminal / command line. I personally use build scripts to compile the current file into CoffeeScript as well as run the current file in Node JS.</p>
<p>Watch the tutorial or continue reading to learn how to make Sublime Text 2 build scripts.<br />
<span id="more-408"></span></p>
<p><object width="640" height="480"><param name="movie" value="http://www.youtube.com/v/iejQvQF-vZo?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/iejQvQF-vZo?version=3" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Creating a Build Script</h3>
<p>To get started, go to <code>Tools->Build System -> New Build System... </code> and you will be presented with the boilerplate for a build script. </p>
<p>We have four lines to feed into our <code>.sublime-build</code> file:</p>
<ul>
<li><strong>cmd</strong> is an array of commends that will be run.
<li>
<li><strong>selector</strong> is an optional way to scope the build script to a specific filetype</li>
<li><strong>path</strong> is where the command is to be executed. Because sublime executes it in the python console, we need to specify where on our system the compliler we want to use lies.</li>
<li><strong>file_regex</strong> specifies where the error lines are and what to be returned.</li>
</ul>
<p>For a complete list of all the variables available within a build script, check the <a href="http://sublimetext.info/docs/en/reference/build_systems.html" target="_blank">variable reference</a>. </p>
<h3>CoffeeScript Build Script</h3>
<p>So, to create our CoffeeScript build file, we simply fill in the following three lines. Keep in mind that with the Node.js coffeescript compiler we would normally execute something similar to this in the terminal:</p>
<p><code>coffee -c /path/to/file.coffee</code></p>
<pre class="brush:js">
{
	"cmd": ["coffee","-c", "$file"],
	"selector" : "source.coffee",
	"path" : "/usr/local/bin"
}
</pre>
<p>Save your file in your user packages folder and restart Sublime Text. On OSX its located at:<br />
<code> ~/Library/Application Support/Sublime Text 2/Packages/User</code></p>
<p>Now every time we hit <strong>CMD + B</strong> our coffeescript file will be compiled with the build script. If you want to watch the file for changes after the first compile, simply switch the first line to <code>"cmd": ["coffee","-wc", "$file"],</code>. If anyone is using my <a href="https://github.com/wesbos/coffeescript-growl" target="_blank">CoffeeScript-Growl plugin</a>, change your first line to <code>"cmd": ["coffee", "-r", "coffeescript-growl", "-wc", "$file"],</code> to get growl notifications.</p>
<h3>Node.js Files</h3>
<p>Another use for Sublime Text build scripts is launching the nodejs file you are currently working on. Our build script now looks something like this:</p>
<pre class="brush:js">
{
	"cmd": ["node", "$file"],
	"selector" : "source.js",
	"path" : "/usr/local/bin"
}
</pre>
<h3>Thats is!</h3>
<p>Pretty simple, eh? There is a lot of room for expanding these builds and making them do a lot of the manual work for you. If you have anything to add, please post it in the comments and I&#8217;ll be sure to add it to the post.</p>
<p>As always be sure to <a href="http://www.twitter.com" target="_blank">Follow me on Twitter</a></p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/JPB6aiTdVoI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/sublime-text-build-scripts/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://wesbos.com/sublime-text-build-scripts/</feedburner:origLink></item>
		<item>
		<title>JavaScript Face Detection + Canvas + Video = HTML5 Glasses!</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/9Z7QJV7hCkE/</link>
		<comments>http://wesbos.com/html5-video-face-detection-canvas-javascript/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 02:50:19 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=388</guid>
		<description><![CDATA[This morning I saw this link on youtube which was a little mashup of some HTML5 technologies. I thought it would be funny if I could do the same, but with goofy pair of glasses. I&#8217;ve also been itching to &#8230; <a href="http://wesbos.com/html5-video-face-detection-canvas-javascript/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This morning I saw <a href="http://www.youtube.com/watch?v=EBxDyr--HIY" target="_blank">this</a> link on youtube which was a little mashup of some HTML5 technologies. I thought it would be funny if I could do the same, but with goofy pair of glasses. I&#8217;ve also been itching to put the <a title="JavaScript Face Detection" href="https://github.com/liuliu/ccv" target="_blank">CCV</a> JavaScript Face Detection library to use. This library shows a few examples on static images, but after a quick look at the code, it shows that the underlying element to the script is a canvas element. So instead of running it on a single image, I am running it on a feed of frames coming from an HTML5 video element.</p>
<p>I&#8217;ll go into the technical details further on in the post, but here is a demo as well as a youtube video showing the effect as it can be a little sluggish on older machines. Currently tested and working in Google Chrome 14 and Firefox 6.0. <span id="more-388"></span></p>
<p><a href="http://wesbos.com/demos/html5-face-detection/" target="_blank">Try the Demo</a>   |  <a href="https://github.com/wesbos/HTML5-Face-Detection" target="_blank">Download the Source</a></p>
<p><object width="640" height="480"><param name="movie" value="http://www.youtube.com/v/YYES9Qd094o?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/YYES9Qd094o?version=3" type="application/x-shockwave-flash" width="640" height="480" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Setting up our document</h3>
<p>To get started, we dont really need that much. Only two of the files from the CCV Library are required are <a title="CCV.JS Face Detection" href="https://github.com/liuliu/ccv/blob/stable/js/ccv.js" target="_blank">CCV.js</a> which does the acutal detection of the the face, and <a href="https://github.com/liuliu/ccv/blob/stable/js/face.js" target="_blank">face.js</a> which holds the data for what faces look like. We will also need an empty canvas element, a HTML5 video element with .MP4 and .OGG encoded files  (I used <a href="http://www.mirovideoconverter.com/" target="_blank">Miro</a> to convert mine), and a blank scripts.js file. Things will look like this when we are setup:</p>
<pre class="brush:xml">&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
&lt;title&gt;HTML5 Face Detection&lt;/title&gt;
&lt;link rel="stylesheet" href="style.css"/&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class="wrapper"&gt;
	&lt;h1&gt;HTML5 GLASSES&lt;/h1&gt;
	&lt;p&gt;Created by &lt;a href="http://twitter.com/wesbos" target="_blank"&gt;Wes Bos&lt;/a&gt;. See full details &lt;a href=""&gt;here.&lt;/a&gt;&lt;/p&gt;
	&lt;!-- Our Main Video Element --&gt;
	&lt;video height="426" width="640" controls="false"&gt;
		&lt;source src="videos/wes4.ogg" /&gt;
		&lt;source src="videos/wes4.mp4" /&gt;
	&lt;/video&gt;

	&lt;!-- Out Canvas Element for output --&gt;
	&lt;canvas id="output"  height="426" width="640" &gt;&lt;/canvas&gt;

	&lt;!-- div to track progress --&gt;
	&lt;div id="elapsed_time"&gt;Press play for HTML5 Glasses!&lt;/div&gt;
&lt;/div&gt;
&lt;script type="text/javascript" src="scripts/ccv.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="scripts/face.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="scripts/scripts.js"&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>&nbsp;</p>
<h3>Let&#8217;s write some JavaScript!</h3>
<p>The core of this application is just a single function called <code>html5glasses()</code> that runs every 200 miliseconds. The function grabs the current frame from the window, spits it onto the canvas and then lets the CCV JS library detect the face. When it  returns the data we loop through each of the found faces and and apply the silly glasses.</p>
<p>I should note that this isn&#8217;t the fastest thing in the world, and it is blocking. In the CCV examples, they provide a web worker example so we could do this asynchronously, but in my tests it was significantly slower. This is new technology and will only get better. On my computer I see a new frame about every 300 miliseconds, or 3 times a second.</p>
<h3>Setup the JavaScript Variables</h3>
<p>I&#8217;ve commented these inline.</p>
<pre class="brush:js">
var
		// Store the first HTML5 video element in the document
		video = document.querySelector('video'),
		// We use this to time how long things are taking. Not that important..
		time_dump = document.getElementById("elapsed_time"),
		// Create a new image that will be our goofy glasses
		glasses = new Image(),
		// Store the canvas so we can write to it
		canvas = document.getElementById("output"),
		// Get the canvas 2d Context
		ctx = canvas.getContext("2d");
		// Finally set the source of our new glasses img element
		glasses.src = "i/glasses.png";
</pre>
<h3>Create our main html5glasses() function</h3>
<p>This is where all the magic happens. Read through each line and realize what is happening. Pay specific attenton to the <code>ccv.detect_objects()</code> function.</p>
<pre class="brush:js">
function html5glasses() {
	// Start the clock
	var elapsed_time = (new Date()).getTime();

	// Draw the video to canvas
	ctx.drawImage(video, 0, 0, video.width, video.height, 0, 0, canvas.width, canvas.height);

	// use the face detection library to find the face
	var comp = ccv.detect_objects({ "canvas" : (ccv.pre(canvas)),
									"cascade" : cascade,
									"interval" : 5,
									"min_neighbors" : 1 });

	// Stop the clock
	time_dump.innerHTML = "Process time : " + ((new Date()).getTime() - elapsed_time).toString() + "ms";

	// Draw glasses on everyone!
	for (var i = 0; i < comp.length; i++) {
		ctx.drawImage(glasses, comp[i].x, comp[i].y,comp[i].width, comp[i].height);
	}
}
</pre>
<h3>Finally, trigger it!</h3>
<p>We trigger the detection when the video element is played and stop it when it reaches the end. </p>
<pre class="brush:js">
/* Events */ 

video.addEventListener('play', function() {
	vidInterval = setInterval(html5glasses,200);
});

video.addEventListener('ended', function() {
	clearInterval(vidInterval);
	time_dump.innerHTML = "finished";
});
</pre>
<h3> Pretty cool, eh? </h3>
<p>I'm just getting into CCV, but the library can be extended to recognize much more than just faces. If you take at look at the github repo, they have examples for detecting all kinds of things.</p>
<h3>What else?</h3>
<p>Next time I'm in the mood for a little hack, I'll try and hook this up to a flash webcam app or <a href="http://mozillalabs.com/rainbow/" target="_blank">Mozilla's Rainbow</a> to stream the data right from the device itself, giving us realtime funny glasses!</p>
<p>Let me know if you have any ideas or questions. I'm <a href="http://twitter.com/wesbos" target="_blank">@wesbos on twitter</a> and have hosted the source on Git Hub</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/9Z7QJV7hCkE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/html5-video-face-detection-canvas-javascript/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		<feedburner:origLink>http://wesbos.com/html5-video-face-detection-canvas-javascript/</feedburner:origLink></item>
		<item>
		<title>5 Helpful Tips for moving to Sublime Text 2</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/VqIwlG8gbxI/</link>
		<comments>http://wesbos.com/sublime-text-2-tips/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 20:54:03 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[Text Editors]]></category>
		<category><![CDATA[Wes]]></category>
		<category><![CDATA[sublime]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=359</guid>
		<description><![CDATA[I&#8217;m a long time Coda user. A few months ago I, like everyone else, decided to switch over to vim. I really liked Vim but just couldn&#8217;t get the hang of it for whatever reason. After shamefully crawling back to &#8230; <a href="http://wesbos.com/sublime-text-2-tips/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a long time <a href="http://www.panic.com/coda/" target="_blank">Coda</a> user. A few months ago I, like everyone else, decided to switch over to vim. I really liked Vim but just couldn&#8217;t get the hang of it for whatever reason. After shamefully crawling back to Coda, I found myself realizing that Coda fell short in a few areas. It was then I decided to give Sublime Text 2 a shot as it had been touted as the sucessor to Text Mate.  Its taken me a few weeks to get used to, but I can happily say I&#8217;m a Sublime Text 2 user now. Here are a few tips that make switching over easier.</p>
<p><span id="more-359"></span></p>
<h2>1. Install the command line utility</h2>
<p><img class="aligncenter size-full wp-image-364" title="Sublime Text 2 Command Line Utility" src="http://wesbos.com/wp-content/uploads/2011/09/Screen-Shot-2011-09-22-at-4.00.21-PM.png" alt="Sublime Text 2 Command Line Utility" width="634" height="440" /></p>
<p>If you do a lot of work in bash, its helpful to open up a file or entire folder in your editor right from the command line.</p>
<p><strong>To Install:</strong><br />
Run the following line in your terminal.<br />
<code>sudo ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /bin/subl</code><br />
This will then give you access to the bash command <strong>subl</strong> with a number of arguments.</p>
<p>The most basic usage is to open the current folder in Sublime Text 2. Simply Type <code>subl .</code></p>
<p><code>subl -ab tutorial.html </code> opens the file tutorial.html in the current window but keeps terminal in focus. This is handy if you need to traverse a few directories and cherry pick a number of files to be opened.</p>
<p><strong>Arguments</strong>:<br />
&#8211;project : Load the given project<br />
&#8211;command : Run the given command<br />
-n or &#8211;new-window:  Open a new window<br />
-a or &#8211;add:         Add folders to the current window<br />
-w or &#8211;wait:        Wait for the files to be closed before returning<br />
-b or &#8211;background:  Don&#8217;t activate the application<br />
-s or &#8211;stay:        Keep the application activated after closing the file<br />
-h or &#8211;help:        Show help (this message) and exit<br />
-v or &#8211;version:     Show version and exit</p>
<p>&nbsp;</p>
<h2>2. Open files in current sublime text window</h2>
<p>This was one of the biggest annoyances for me when switching over from coda. Whenever I would drag a file into the sublime dock icon it would open a brand new instance of sublime when I just wanted to view it along with the rest of my files. Turns out this is a super simple fix.</p>
<p>Hit<code>Command + Shift + P</code> to bring up the sublime launcher type <strong>&#8220;user global settings</strong> and hit enter. This file is similar to a .vimrc file and holds all of your custom settings. This file wont be written over when you upgrade like <strong>default global settings</strong>. Once you have this file open, add the following line:</p>
<p><code>"open_files_in_new_window": false</code></p>
<p>&nbsp;</p>
<h2>3. Get Code Hinting in Sublime Text 2</h2>
<p><img class="alignleft size-full wp-image-368" title="Sublime Text 2 Code Hinting" src="http://wesbos.com/wp-content/uploads/2011/09/Screen-Shot-2011-09-22-at-4.21.45-PM.png" alt="Sublime Text 2 Code Hinting" width="289" height="159" />One feature that Coda has just slam dunked is their code hinting. I rarely ever have to type entire key words. A solution for getting code completion working in Sublime Text is to install SublimeCodeIntel, a port of the Komodo editor code  completion engine. It isn&#8217;t perfect, particularly in CSS file, but its pretty good and gets the job done.  <a title="Sublime Code Completion" href="https://github.com/Kronuz/SublimeCodeIntel" target="_blank">Download the repo here </a> and drop it into your packages folder at<code> ~/Library/Applications/Sublime Text 2/Packages</code></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>4. Upload with Transmit shortcut</h2>
<p>If you are working on a code n&#8217; upload project you need to be able to edit a file and quickly FTP it up to your server. Since sublime doesn&#8217;t have this built in like Coda does, you&#8217;ll need to use the Transmit FTP client.</p>
<p>First, set up your project folders in transmit.</p>
<p>Next, install <a href="https://github.com/jeffturcotte/sublime_transmit_docksend" target="_blank">Sublime Transmit Docksend</a>, The way this package works is by simulating a docksend (drag and drop a linked local file) to transmit when a key combination is pressed.</p>
<p>Finally, when editing a local file that is linked up in transmit, hit<code>Command + Shift + U</code> and the file will upload. If you are editing /js/scripts.js locally, the file will be uploaded to /js/scripts.js on your server in split second.</p>
<h2>5. Create your own snippets!</h2>
<p>Its a given that you should have already installed <a title="Zen Coding for Sublime Text" href="http://code.google.com/p/zen-coding/" target="_blank">Zen Coding</a>, but there are always snippets that are developer specific that you use on a daily basis. For me, I use<code>j + tab </code> to expand into a jQuery selector <code>$(' ');</code> To setup your own snippets, go to tools->New Snippet. The XML markup is fairly straightforward so I wont go into it. Just plop your code inbetween <code><!--[CDATA[</code--></code> and <code>]]&gt;</code>. You can even set areas to tab through the snippet as well as defaults.</p>
<p>Here a basic snippet using the letter j as the tab trigger. When I tab, the cursor will be place inside the jQuery selector, tab again and I&#8217;m outside the selector ready to call a method on it.</p>
<pre class="brush:xml">&lt;snippet&gt;
	&lt;content&gt;&lt;![CDATA[\$('${1}')${2};]]&gt;&lt;/content&gt;
	&lt;tabTrigger&gt;j&lt;/tabTrigger&gt;
&lt;/snippet&gt;</pre>
<h3>Thats is!</h3>
<p>There is a lot more to Sublime Text 2 and many cool new features such as code folding and Vim support are currently in development. I will go into many more features in coming blog posts. Want to know how to do something? Just ask in the comments below! Be sure to also <a href="http://twitter.com/wesbos">Follow me on Twitter</a>.</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/VqIwlG8gbxI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/sublime-text-2-tips/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://wesbos.com/sublime-text-2-tips/</feedburner:origLink></item>
		<item>
		<title>Customizing the WordPress TinyMCE Editor for your clients</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/sAj3kpN5CkA/</link>
		<comments>http://wesbos.com/custom-wordpress-tinymce-wysiwyg-classes/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 03:21:32 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=342</guid>
		<description><![CDATA[We have all been there. You finish up the most beautiful design with perfectly picked colours, font sizes and page style and pass it off to the client. A few days later you check back at the site and they have happily splattered underlined &#8230; <a href="http://wesbos.com/custom-wordpress-tinymce-wysiwyg-classes/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>We have all been there. You finish up the most beautiful design with perfectly picked colours, font sizes and page style and pass it off to the client. A few days later you check back at the site and they have happily splattered underlined neon green h1 tags with inline styles. Why why why? Because the WordPress WYSIWYG editor is hard to use and by default it temps you with a basic colour pallet and basic h1-h6 tags.<br />
<span id="more-342"></span><br />
Not to worry! With a few lines of code we can remove the harmful parts of TinyMCE and supply a few useful features! Pop open your theme&#8217;s functions.php file and create a basic function and hook like this:</p>
<pre class="brush:php">function make_mce_awesome( $init ) {
	// our Options will go here..
	return $init;
}

add_filter('tiny_mce_before_init', 'make_mce_awesome');</pre>
<h3>Only allow certain block level elements</h3>
<p>Out of the box WordPress has a bunch of elements which you can use to style your text. Chances are your client doesnt need most of them. Also, they certainly do not need access to h1 and h2 elements as they should be already coded into your theme.</p>
<pre class="brush:php">
$init['theme_advanced_blockformats'] = 'h3,h4,h5,h6,p';
</pre>
<h3>Remove Unnecessary Buttons</h3>
<p>This is totally up to you, but I like to remove the underline as its ugly, the spellchecker as this is now built into most browsers and the WordPress Help button. You can find the names of all the buttons by opening up dev tools and looking at the title attribute of each button.</p>
<pre class="brush:php">
	$init['theme_advanced_disable'] = 'underline,spellchecker,wp_help';
</pre>
<h3>Create a custom Colour Pallet based on the themes colours.</h3>
<p>Changes are the default colours in WordPress arent the same as your theme&#8217;s colours. Feed in a comma separated list of hex colours and you&#8217;re off the the races!</p>
<pre class="brush:php">
	$init['theme_advanced_text_colors'] = '0f3156,636466,0486d3';
</pre>
<h3>Add Custom Classes to mirror your CSS</h3>
<p>When you want to move past your basic heading and paragraph tags, it can be helpful to append custom classes to your elements from within TinyMCE. First you want to enable the style select drop down: </p>
<pre class="brush:php">
	$init['theme_advanced_buttons2_add'] = 'styleselect';
</pre>
<p>Then you can specify a list of labels and associated CSS classes. </p>
<pre class="brush:php">
$init['theme_advanced_styles'] = "bigTitle=bigTitle;Call To Action Button=ctaButton,Rounded Corners=rounded";
</pre>
<p>Our Final function looks like this:</p>
<pre class="brush:php">
function make_mce_awesome( $init ) {
	$init['theme_advanced_blockformats'] = 'h2,h3,h4,p';
	$init['theme_advanced_disable'] = 'underline,spellchecker,wp_help';
	$init['theme_advanced_text_colors'] = '0f3156,636466,0486d3';
	$init['theme_advanced_buttons2_add'] = 'styleselect';
   	$init['theme_advanced_styles'] = "bigTitle=bigTitle;Call To Action Button=ctaButton,Rounded Corners=rounded";
	return $init;
}

add_filter('tiny_mce_before_init', 'make_mce_awesome');
</pre>
<h3>Style the editor on the backend</h3>
<p>Your theme&#8217;s styles should mirror on the backend. You can add in a custom stylesheet for the backend with the following line. This is helpful for getting an accurate idea of what size/colour/alignment your page will have.</p>
<pre class="brush:php">
	add_editor_style('editor-style.css');
</pre>
<p>I found that passing in editor-style.css (which should be found in the root of your theme) busted any cache that add_editor_style() was giving me. </p>
<h3>Have more tips? </h3>
<p>I would love to hear them! Leave them in the comments below and I&#8217;ll update this list as we go along.</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/sAj3kpN5CkA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/custom-wordpress-tinymce-wysiwyg-classes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://wesbos.com/custom-wordpress-tinymce-wysiwyg-classes/</feedburner:origLink></item>
		<item>
		<title>Realtime HTML5 Canvas Drawing with WebSockets, Node.JS &amp; Socket.io</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/zEB87JWsAMA/</link>
		<comments>http://wesbos.com/html5-canvas-websockets-nodejs/#comments</comments>
		<pubDate>Tue, 16 Aug 2011 03:46:34 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[NodeJS]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=320</guid>
		<description><![CDATA[Web sockets and Canvas are two really cool features that are currently being implemented into browsers. This tutorial will give you a short rundown of how they both work as well as create a realtime drawing canvas that is powered &#8230; <a href="http://wesbos.com/html5-canvas-websockets-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Web sockets and Canvas are two really cool features that are currently being implemented into browsers. This tutorial will give you a short rundown of how they both work as well as create a realtime drawing canvas that is powered by Node.js and web sockets. For simplicity&#8217;s sake, I&#8217;ll be writing all the code in coffeescript. If you prefer regular &#8216;ol JavaScript, take a look at the corresponding .js files. I&#8217;ve also left out the CSS for the same reason.</p>
<ul>
<li><a href="https://github.com/wesbos/websocket-canvas-draw" target="_blank">Download the code on GitHub</a> </li>
<li><a href="http://twitter.com/wesbos">Follow @wesbos on Twitter</a></li>
</ul>
<h3>Quick Screencast detailing tutorial</h3>
<p><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/n7wQsLu_k00?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/n7wQsLu_k00?version=3" type="application/x-shockwave-flash" width="640" height="385" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Cross Device / Browser compatibility </h3>
<p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/oI9AahO9vDY?version=3"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/oI9AahO9vDY?version=3" type="application/x-shockwave-flash" width="640" height="505" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<h3>Server Side</h3>
<p>The first thing we need to do is create a web socket server. For this we will be using <a href="http://nodejs.org/" target="_blank">Node.js</a> and the module <a href="http://socket.io" target="_blank">Socket.io</a>. Socket.io makes its super easy to get a web socket server up and running. It even provides a flash fallback for browsers that don&#8217;t support native web sockets. In this tutorial we will only be working with browsers that support the canvas element.</p>
<p>If you don&#8217;t have Socket.io installed yet, make sure you do so by typing <code>npm install socket.io</code> into your terminal.</p>
<p>For now, lets just set up the web socket server. Create your <code>server.coffee</code> file with the following configuration. </p>
<pre class="brush:js">
io = require('socket.io').listen(4000)
io.sockets.on 'connection', (socket) ->
</pre>
<p>Compile your coffeescript and hop back into your terminal and type <code>node server.js</code>. You now have a web socket server running on port 4000.<br />
<img src="http://cl.ly/9F2H/Screen_Shot_2011-08-12_at_7.35.45_PM.png" alt="" /></p>
<p>If you go to localhost:4000 you&#8217;ll see the following:</p>
<p><img src="http://cl.ly/9Ez4/Screen_Shot_2011-08-12_at_7.36.08_PM.png" alt="" /></p>
<h3>Client Side</h3>
<p>First, lets quickly get our <code>index.html</code> file up and running. In addition to some bare bones markup, I&#8217;m also including jQuery, our Socket.io JS file which is now being served up from our server, a jQuery plugin for drag events, and our own scripts.js file which will hold all the magic.</p>
<pre class="brush:plain">&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta charset="UTF-8"&gt;
	&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/jquery.event.drag-2.0.js"&gt;&lt;/script&gt;
	&lt;script src="http://localhost:4000/socket.io/socket.io.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="scripts.js"&gt;&lt;/script&gt;
	&lt;link rel="stylesheet" href="style.css" /&gt;

	&lt;title&gt;HTML5 Canvas + Node.JS Socket.io&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;article&gt;&lt;!-- our canvas will be inserted here--&gt;&lt;/article&gt;

	&lt;!-- Scripts required --&gt;
	&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="js/jquery.event.drag-2.0.js"&gt;&lt;/script&gt;
	&lt;script src="http://localhost:4000/socket.io/socket.io.js"&gt;&lt;/script&gt;
	&lt;script type="text/javascript" src="scripts.js"&gt;&lt;/script&gt;
&lt;/body&gt;</pre>
<p>Now that we have our server up and running, we can write some code which will draw to the canvas. Create a new file called <code>scripts.coffee</code>.  All of the following code happens within the App.init() method which we will trigger on the jQuery document ready. </p>
<h4>Create our Canvas Element</h4>
<pre class="brush:js">
# setup our application with its own namespace
App = {}

###
	Init
###
App.init = ->
	App.canvas = document.createElement 'canvas' #create the canvas element
	App.canvas.height = 400
	App.canvas.width = 800  #size it up
	document.getElementsByTagName('article')[0].appendChild(App.canvas) #append it into the DOM 

	App.ctx = App.canvas.getContext("2d") # Store the context 

	# set some preferences for our line drawing.
	App.ctx.fillStyle = "solid"
	App.ctx.strokeStyle = "#bada55"
	App.ctx.lineWidth = 5
	App.ctx.lineCap = "round"

	# Draw Function
	App.draw = (x,y,type) ->
		if type is "dragstart"
			App.ctx.beginPath()
			App.ctx.moveTo(x,y)
		else if type is "drag"
			App.ctx.lineTo(x,y)
			App.ctx.stroke()
		else
			App.ctx.closePath()
	return
</pre>
<h4>Draw to canvas function</h4>
<p>Since drawing to canvas involves beginning, moving and closing paths, i&#8217;ve create a short little function that hooks into the jQuery dragstart and drag events.</p>
<pre class="brush:js">
# Draw Function
App.draw = (x,y,type) ->
	if type is "dragstart"
		App.ctx.beginPath()
		App.ctx.moveTo(x,y)
	else if type is "drag"
		App.ctx.lineTo(x,y)
		App.ctx.stroke()
	else
		App.ctx.closePath()
return
</pre>
<h4>Setup our client side web socket</h4>
<p>Since we included our file at <code>http://localhost:4000/socket.io/socket.io.js</code> we are able to create an object which we can send our data over. With just a few lines, we create our App.socket object and bind to any incoming web socket events called &#8216;draw&#8217;. We will go over this more soon. </p>
<pre class="brush:js">
# Sockets!
App.socket = io.connect('http://localhost:4000')

App.socket.on 'draw', (data) ->
	App.draw(data.x,data.y,data.type)
</pre>
<h4>Canvas Drawing Event</h4>
<p>This is where things gets exciting. Now we want to bind a few events to our canvas element. The way this works is when someone draws on the canvas, we immediately use our draw() function to draw to the current canvas as well as send the x and y ordinates over the web socket with socket.io&#8217;s <code>emit</code>. In just a bit we will take a look at the server side part of this event and see how the server sends out this data to all open windows.</p>
<pre class="brush:js">
###
	Draw Events
###
$('canvas').live 'drag dragstart dragend', (e) ->
	type = e.handleObj.type
	offset = $(this).offset()

	e.offsetX = e.layerX - offset.left
	e.offsetY = e.layerY - offset.top
	x = e.offsetX
	y = e.offsetY
	App.draw(x,y,type)
	App.socket.emit('drawClick', { x : x, y : y, type : type})
	return
</pre>
<h3>Jump back to server side</h3>
<p>Now that we know we are sending the x, y and type of event over the web socket, we need to do something with that on our server. What we want to do, is take that data and send it back out to everyone else that has a browser open.</p>
<p>Our updated server.coffee file now looks like this. We first wait for a connection event, then wait for a &#8216;drawClick&#8217; event to be sent by a browser. When that happens we take the data and send it out to everyone else with a browser open. THe server side script we wrote earlier will then paint the canvas.</p>
<pre class="brush:js">
io = require('socket.io').listen(4000)

io.sockets.on 'connection', (socket) ->
	socket.on 'drawClick', (data) ->
		socket.broadcast.emit 'draw',{ x : data.x, y : data.y, type: data.type}
		return
	return
</pre>
<p>You&#8217;ll now need to restart your web socket server as we have made changes to it. Hit control-c to kill it, and node type <code>node server.js</code> to restart it.</p>
<h3>Get Drawing!</h3>
<p>One you fully understand how this all works, open your index.html file in any web browser that supports web sockets and canvas (at the time of writing Chrome, Firefox, Safari, Opera and IE9). Check <a href="http://caniuse.com/#search=canvas" target="_blank">http://caniuse.com/#search=canvas</a> for more support info.</p>
<h4>Limitations</h4>
<p>As this is a very basic demo, there are a few limitations which can easily be solved with a little more code. Currently the canvas only supports one person drawing at a time, if two or more are drawing, the canvas will be painted sporadically. Also, there is definitely a lot of room to add tools such as brushes, colours, erasers and PNG export. If there is interest, I&#8217;ll expand this tutorial series to cover them.</p>
<p>If you&#8217;re interested in getting this up and running in the real world and off of your localhost, I was able to get mine running on <a href="http://aws.amazon.com/ec2/" target="_blank">Amazons free micro instance of EC2</a> although this involves installing Node and NPM all over again. Also note you should run your server on port 80 rather than 4000.</p>
<p>Please feel free to download, hack, complain, fork or contribute to the project on <a href="https://github.com/wesbos/websocket-canvas-draw">my github account.</a> </p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/zEB87JWsAMA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/html5-canvas-websockets-nodejs/feed/</wfw:commentRss>
		<slash:comments>29</slash:comments>
		<feedburner:origLink>http://wesbos.com/html5-canvas-websockets-nodejs/</feedburner:origLink></item>
		<item>
		<title>Growl notifications for the Node.js CoffeeScript complier</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/LgIil5iwqDs/</link>
		<comments>http://wesbos.com/growl-notifications-coffeescript-nodejs/#comments</comments>
		<pubDate>Tue, 19 Jul 2011 15:47:53 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[CoffeeScript]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[NodeJS]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=311</guid>
		<description><![CDATA[Two things I&#8217;ve been working with lately have been Node.js and CoffeeScript. If you haven&#8217;t heard of either, Node.js is server side javascript and CoffeeScript is a ruby/python like langage that compiles down to regular javascript. The way I develop &#8230; <a href="http://wesbos.com/growl-notifications-coffeescript-nodejs/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Two things I&#8217;ve been working with lately have been <a href="http://nodejs.org">Node.js</a> and <a href="http://jashkenas.github.com/coffee-script/">CoffeeScript</a>. If you haven&#8217;t heard of either, Node.js is server side javascript and CoffeeScript is a ruby/python like langage that compiles down to regular javascript.</p>
<p>The way I develop my CoffeeScript is by using the Node.js compiler to watch my `scripts.coffee` for any changes and compile it into normal JavaScript every time I save my file. The process is instant, but I need to watch my terminal window to see if there were any compiling errors. As you can imagine, this can get fairly annoying especially if you aren&#8217;t on dual monitors.</p>
<p>So, my solution was to write a Node.js module that would send a growl notification to the user when the compile was finished. I made use of the <a href="http://growl.info/extras.php#growlnotify">growlnotify</a> command line plugin for OSX.</p>
<p><img src="http://f.cl.ly/items/2t1H2r0i0u3x0k2Z1E2v/Screen%20shot%202011-07-19%20at%201.34.40%20AM.png" alt="" /></p>
<p>To use, you need to first install <a href="http://growl.info/extras.php#growlnotify">growlnotify</a>.</p>
<p>Then use NPM to install the package `npm install coffeescript-growl`</p>
<p>Finally, require (with -r or &#8211;require) the module when you compile your script. I like to use something like this:</p>
<p>`coffee -r coffeescript-growl &#8211;watch &#8211;compile ~/sites/my_project/scripts.coffee`</p>
<p>Thats it! If you have any suggestions or fixes, please<a title="CoffeeScript Growl" href="https://github.com/wesbos/coffeescript-growl" target="_blank"> fork me on github </a> and <a href="https://twitter.com/#!/wesbos">follow me on twitter.</a></p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/LgIil5iwqDs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/growl-notifications-coffeescript-nodejs/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://wesbos.com/growl-notifications-coffeescript-nodejs/</feedburner:origLink></item>
		<item>
		<title>Link within a jQuery Cycle slideshow with the hashchange event</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/5zSVOd5YNeg/</link>
		<comments>http://wesbos.com/jquery-cycle-link-within-hashchange/#comments</comments>
		<pubDate>Tue, 17 May 2011 17:00:14 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[cycle]]></category>
		<category><![CDATA[hashchange]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[slider]]></category>
		<category><![CDATA[slideshow]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=293</guid>
		<description><![CDATA[Two of my favorite jQuery plugins are Mike Alsup&#8217;s Cycle and Ben Alman&#8217;s Hashchange. Cycle allows you to create really flexible sliders /slideshows and Hashchange allows you to create an event that triggers on hash change. When you&#8217;re using jQuery &#8230; <a href="http://wesbos.com/jquery-cycle-link-within-hashchange/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Two of my favorite jQuery plugins are <a href="http://jquery.malsup.com/cycle/">Mike Alsup&#8217;s Cycle</a> and <a href="http://benalman.com/projects/jquery-hashchange-plugin/" target="_blank">Ben Alman&#8217;s Hashchange</a>. Cycle allows you to create really flexible sliders /slideshows and Hashchange allows you to create an event that triggers on hash change. When you&#8217;re using jQuery cycle for a large slideshow, its a good idea to let users link within that slideshow to a specific slide so that they can share and bookmark them.</p>
<p>A great example of this is for a photographer that may have 50 pictures in their portfolio, they often do not let you share the link to that specific picture but rather just the page with the slideshow embedded in it. Additionally, the user can now use the browsers back/forward buttons to navigate through your slideshow<span id="more-293"></span></p>
<p>Not to fear! We can set a hash on the url every time we change the slide and then check for a hash when the page loads, sending them to that specific slide.</p>
<p>The code isn&#8217;t too complex, so if you&#8217;re comfortable with cycle, head on over to <a href="http://wesbos.com/demos/jquery-cycle-link-within/index.html#photo-6" target="_blank">view the demo</a> or download it at the <a href="https://github.com/wesbos/jQuery-Cycle-hashchange-" target="_blank">github repo</a>.</p>
<p><a href="http://wesbos.com/demos/jquery-cycle-link-within/index.html#photo-2" target="_blank"><img class="aligncenter size-full wp-image-301" title="Screen shot 2011-05-17 at 12.55.00 PM" src="http://wesbos.com/wp-content/uploads/2011/05/Screen-shot-2011-05-17-at-12.55.00-PM1.png" alt="" width="603" height="414" /></a></p>
<p><strong>First we start off with some basic markup</strong></p>
<pre class="brush:applescript">	&lt;a href="#" id="prev"&gt;Prev&lt;/a&gt;
	&lt;a href="#" id="next"&gt;Next&lt;/a&gt;

	&lt;div class="slideshow"&gt;
		&lt;img src="http://farm5.static.flickr.com/4029/4646753786_4a219fbbe3_z.jpg" alt="" /&gt;
		&lt;img src="http://farm4.static.flickr.com/3472/3817281628_d5933948db_z.jpg" alt="" /&gt;
		&lt;img src="http://farm1.static.flickr.com/199/476514422_0c1424fb06_z.jpg?zz=1" alt="" /&gt;
		&lt;img src="http://farm2.static.flickr.com/1311/909213290_161035cf47.jpg" alt="" /&gt;
		&lt;img src="http://farm4.static.flickr.com/3088/2688916488_1a125cd0e7_z.jpg" alt="" /&gt;
		&lt;img src="http://farm1.static.flickr.com/215/520495246_22da7d843b.jpg" alt="" /&gt;
		&lt;img src="http://farm4.static.flickr.com/3537/3492378275_fceca7bf0e_z.jpg?zz=1" alt="" /&gt;
	&lt;/div&gt;</pre>
<p><strong>Then be sure to include <a href="http://jquery.com/">jQuery</a>, <a href="http://jquery.malsup.com/cycle/">jQuery Cycle</a> and <a href="http://benalman.com/projects/jquery-hashchange-plugin/">Hashchange</a>.</strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<pre class="brush:js"><strong>&lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript" src="plugins.js"&gt;&lt;/script&gt;</strong></pre>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p><strong>Finally, we write a little JavaScript</strong></p>
<p>This can be broken down into three parts:</p>
<p><strong>1. Setup your document </strong><br />
We write a small function that will determin the current slide, so if a user visits <a href="http://wesbos.com/demos/jquery-cycle-link-within/index.html#photo-3" target="_blank">http://wesbos.com/demos/jquery-cycle-link-within/index.html#photo-3</a> we know they want to see photo 3.</p>
<pre class="brush:js">	// get current slide's number
	function currentSlide() {
		var hash = window.location.hash || '#photo-1';
		return parseInt(hash.replace(/[A-Za-z#\-\/!]/g, '') - 1);
	}
	// global vars
	var	cycleSelector = $('.slideshow'),
			startSlide = currentSlide(),
			hasSlid = 0;</pre>
<p><strong>2. Build our jQuery Cycle slideshow </strong><br />
Here we are doing two important things. First we set the browsers hash to the current slide that was either clicked on the thumbnails or using the next/prev buttons. Next we set the variable hasSlid to 1. This is our way of telling the hashchange event not to fire the slide change since we have already done it here. More on this below.</p>
<pre class="brush:js">// append some markup for the controls
	cycleSelector.before('

')
	// start jQuery Cycle
	.cycle({
		 startingSlide: startSlide,
		 // when using the next/prev links
   	 onPrevNextEvent: function(isNext, idx, slide) {
   	 	hasSlid = 1;
   	 	window.location.hash = "photo-"+ (parseInt(idx) + 1) + "";
   	 	return false;
   	 },
   	 // when using the pager thumbnails
   	 onPagerEvent: function(idx, slide) {
   	 	hasSlid = 1;
   	 	window.location.hash = "photo-"+ (parseInt(idx) + 1) + ""; 

   	 	return false;
   	 },
   	 timeout: 0,
   	 pager:  '#nav ul',
   	 next: '#next',
   	 prev: '#prev',
   	 speed: 500,
   	 // build the thumbnails
   	 pagerAnchorBuilder: function(idx, slide) {
       return '
<li><a href="#photo-'+ (idx+1) +'"><img src="' + slide.src + '" alt="" width="50" height="50" /></a></li>

';
    }
	});</pre>
<p><strong>3. Bind to hashchange </strong><br />
Finally, we need to listen for the hashchange event. This means that the code within this event will execute whenever the hash in the url is changed. So, for example, if a user changes the url from #photo-2 to #photo-4, this event will be fired and change the current slide to slide 4.</p>
<p>Again, we only want to change the slide if our variable hasSlid is set to 0, if its set to 1 we know that either the prev/next controls or the thumbnails have taken care of this.  If a user visits the url from a link or is using their browsers back/next buttons, then we use this to change the slide.</p>
<pre class="brush:js">	// bind to the hashchange event
	$(window).bind('hashchange', function () {
			var slideNo = currentSlide();
			// we only want to fire the slide change if the next button or the pager hasn't done it for us
			if (hasSlid === 0) { cycleSelector.cycle(slideNo); }
			// return it back to zero
			hasSlid = 0;
	}); 

	// when the page loads, we need to trigger a hashchange
	$(window).trigger( "hashchange" );</pre>
<p>And thats it. You&#8217;re now able to link within a jQuery Cycle slideshow, bookmark and share certain slides, and use your browsers back/forward button. Let me know if you have any questions or improvements. Please fork the <a href="https://github.com/wesbos/jQuery-Cycle-hashchange-">github repo</a> and send me a pull request.<br />
<strong>Want more like this? Be sure to <a href="http://twitter.com/wesbos" >Follow me on twitter</a> for the latest <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </strong> </p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/5zSVOd5YNeg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/jquery-cycle-link-within-hashchange/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://wesbos.com/jquery-cycle-link-within-hashchange/</feedburner:origLink></item>
		<item>
		<title>Get All Angry Birds Levels in Chrome HTML5 Version with a quick hack</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/4UwN29Um9c4/</link>
		<comments>http://wesbos.com/all-levels-html5-angry-birds/#comments</comments>
		<pubDate>Wed, 11 May 2011 19:11:07 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=280</guid>
		<description><![CDATA[Just about an hour ago Rovio and Chrome released Angry Birds for Chrome. As a JavaScript / HTML5 guy, I quickly jumped into the code to see how things worked. I was quickly able to find a hack that gave &#8230; <a href="http://wesbos.com/all-levels-html5-angry-birds/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just about an hour ago Rovio and Chrome released <a href="http://chrome.angrybirds.com/?version=hd" target="_blank">Angry Birds for Chrome</a>. As a JavaScript / HTML5 guy, I quickly jumped into the code to see how things worked.</p>
<p>I was quickly able to find a hack that gave me access to all the levels, even the special Chrome levels!  So to  get access to all levels in Chrome Angry Birds, just copy and paste the following line into your browser&#8217;s address bar.</p>
<p><span id="more-280"></span></p>
<pre class="brush:js">javascript: var i = 0; while (i&lt;=69) { localStorage.setItem('level_star_'+i,'3'); i++; } window.location.reload();</pre>
<p>To set all levels to locked, simply copy and paste this into your address bar:</p>
<pre class="brush:js">javascript: var i = 1; while (i&lt;=69) { localStorage.setItem('level_star_'+i,'-1'); i++; } window.location.reload();</pre>
<h3>How?</h3>
<p>In the talk Rovio did at Google IO, they mentioned they were using HTML5&#8242;s LocalStorage. If you open up Web Inspector in chrome, you&#8217;ll see they are keeping track of your score and stars with localstorage. Lucky for us, that means we can use <a href="https://developer.mozilla.org/en/DOM/Storage#localStorage" target="_blank">setItem(</a>) set all 70 levels to 3 and get access to them all.</p>
<p>If you like this kind of stuff, be sure to <a href="http://twitter.com/wesbos" target="_blank">follow me on twitter</a> for more <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>&nbsp;</p>
<p><a href="http://wesbos.com/wp-content/uploads/2011/05/Screen-shot-2011-05-11-at-3.08.52-PM.png"><img class="aligncenter size-medium wp-image-283" title="Screen shot 2011-05-11 at 3.09.21 PM" src="http://wesbos.com/wp-content/uploads/2011/05/Screen-shot-2011-05-11-at-3.09.21-PM-300x225.png" alt="" width="300" height="225" /></a><img class="aligncenter size-medium wp-image-282" title="Screen shot 2011-05-11 at 3.08.52 PM" src="http://wesbos.com/wp-content/uploads/2011/05/Screen-shot-2011-05-11-at-3.08.52-PM-300x225.png" alt="" width="300" height="225" /></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/4UwN29Um9c4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/all-levels-html5-angry-birds/feed/</wfw:commentRss>
		<slash:comments>181</slash:comments>
		<feedburner:origLink>http://wesbos.com/all-levels-html5-angry-birds/</feedburner:origLink></item>
		<item>
		<title>Dropbox your MAMP MySQL Databases</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/mZN8lL1qJGQ/</link>
		<comments>http://wesbos.com/dropbox-your-mamp-mysql-databases/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 18:04:35 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[mamp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[phpmyadmin]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=271</guid>
		<description><![CDATA[I&#8217;m a backup fanatic and not having a few backups of files makes me uneasy. Today I had a little scare where I couldn&#8217;t find a few of my databases when viewing PHPmyAdmin through MAMP. Turns out sometimes MAMP likes &#8230; <a href="http://wesbos.com/dropbox-your-mamp-mysql-databases/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a backup fanatic and not having a few backups of files makes me uneasy. Today I had a little scare where I couldn&#8217;t find a few of my databases when viewing PHPmyAdmin through MAMP. Turns out sometimes MAMP likes to sometimes grab the databases from the MAMP Pro location and sometimes the MAMP location.</p>
<p>So, I decided it was time to figure out how to automatically backup my databases. The problem is that my MySQL databases are not in the same folder as my Dropbox folder.</p>
<p>The answer to this is very simple! First, if you haven&#8217;t already, <a target="_blank" href="http://db.tt/87Zmy6yJ">sign up for dropbox</a>. Then we just need to create a simple symlink that will allow the databases to be stored in their location and still be backed up to the DropBox folder.</p>
<p><span id="more-271"></span>First, figure out where MAMP stores your databases. If you are on good old MAMP, they will be located at /Applications/MAMP/db/ and if you are on MAMP Pro, they are located at /Library/Application Support/appsolute/MAMP PRO/db/mysql/</p>
<p>Next, pop open terminal so we can create our symlink. We will be using the link folders command (ln) and the -s argument to specify that its a symbolic link.</p>
<pre class="brush:shell">ln -s  /Applications/MAMP/db/ ~/Dropbox/symlinks/db</pre>
<p>If your dropbox folder is different, make sure to change the last argument. Other than that, you&#8217;re setup. No more database loss nightmares!</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/mZN8lL1qJGQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/dropbox-your-mamp-mysql-databases/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://wesbos.com/dropbox-your-mamp-mysql-databases/</feedburner:origLink></item>
		<item>
		<title>List WordPress Posts by Category</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/Ry1Munn_7zg/</link>
		<comments>http://wesbos.com/wordpress-list-posts-by-category/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 18:21:05 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[custom templates]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[the_loop]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=259</guid>
		<description><![CDATA[I saw on twitter that John Gardner was looking for a way to loop through his WordPress categories and then display all posts that belonged to that category below it.  I thought it was a great question / problem to &#8230; <a href="http://wesbos.com/wordpress-list-posts-by-category/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I saw on twitter that <a href="http://twitter.com/j_gardner/status/52762151860965376#">John Gardner</a> was looking for a way to loop through his WordPress categories and then display all posts that belonged to that category below it.  I thought it was a great question / problem to solve so I did a quick tutorial on how to do so.</p>
<p><span id="more-259"></span></p>
<span style="text-align:center; display: block;"><a href="http://wesbos.com/wordpress-list-posts-by-category/"><img src="http://img.youtube.com/vi/tiLKGPhUEpM/2.jpg" alt="" /></a></span>
<p>Make sure to view video in HD <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>First thing you need to do is setup a new page with a custom page template. It can be as simple as below but may vary depending on your theme structure. I&#8217;m using the default WordPress 2010 theme.</p>
<pre class="brush:php">&lt;?php
/* template name: Posts by Category! */
get_header(); ?&gt;
		&lt;div id="container"&gt;
			&lt;div id="content" role="main"&gt;
			&lt;/div&gt;&lt;!-- #content --&gt;
		&lt;/div&gt;&lt;!-- #container --&gt;
&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;</pre>
<p>Then We need to get all of our categories into a variable called $cats. Once they are setup, we&#8217;ll just loop through the categories, setup a new WordPress loop for each of them, and echo out the information needed.</p>
<p>Here is the final code, I&#8217;ve commended each line as needed.</p>
<pre class="brush:php">&lt;?php
/* template name: Posts by Category! */
get_header(); ?&gt;

		&lt;div id="container"&gt;
			&lt;div id="content" role="main"&gt;

			&lt;?php
			// get all the categories from the database
			$cats = get_categories(); 

				// loop through the categries
				foreach ($cats as $cat) {
					// setup the cateogory ID
					$cat_id= $cat-&gt;term_id;
					// Make a header for the cateogry
					echo "&lt;h2&gt;".$cat-&gt;name."&lt;/h2&gt;";
					// create a custom wordpress query
					query_posts("cat=$cat_id&amp;post_per_page=100");
					// start the wordpress loop!
					if (have_posts()) : while (have_posts()) : the_post(); ?&gt;

						&lt;?php // create our link now that the post is setup ?&gt;
						&lt;a href="&lt;?php the_permalink();?&gt;"&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;
						&lt;?php echo '&lt;hr/&gt;'; ?&gt;

					&lt;?php endwhile; endif; // done our wordpress loop. Will start again for each category ?&gt;
				&lt;?php } // done the foreach statement ?&gt;

			&lt;/div&gt;&lt;!-- #content --&gt;
		&lt;/div&gt;&lt;!-- #container --&gt;

&lt;?php get_sidebar(); ?&gt;
&lt;?php get_footer(); ?&gt;</pre>
<p>Thats it! You can obviously customize this to your own likings. I suggest you check out and read <a href="http://codex.wordpress.org/The_Loop">The Loop</a> and <a href="http://codex.wordpress.org/Function_Reference/query_posts">query_posts()</a>.</p>
<p>Please leave any questions or commend below!</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/Ry1Munn_7zg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/wordpress-list-posts-by-category/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		<feedburner:origLink>http://wesbos.com/wordpress-list-posts-by-category/</feedburner:origLink></item>
		<item>
		<title>Defeat the New York Times Paywall with 2 lines of CSS (or a Chrome Extension)</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/ylPLf1kmhPQ/</link>
		<comments>http://wesbos.com/remove-new-york-times-paywall-css/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 17:04:19 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=230</guid>
		<description><![CDATA[If you haven&#8217;t heard, the New York Times has implemented a paywall where you can only view 20 articles a month. After that they throw an overlay on top of the content so you can&#8217;t view it. Since they still &#8230; <a href="http://wesbos.com/remove-new-york-times-paywall-css/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t heard, the New York Times has implemented a paywall where you can only view 20 articles a month. After that they throw an overlay on top of the content so you can&#8217;t view it.</p>
<p>Since they still want to be indexed by search engines, they don&#8217;t bother to hide the content once you have reached your 20 max. Two simple lines of CSS will hide this. I&#8217;ve also made it into a <a href="https://chrome.google.com/extensions/detail/medmifohjnpmbkjbodbckhlgofiffgpm">Chrome Extension</a><br />
<span id="more-230"></span></p>
<p><strong>Update: </strong>Just want to be clear that this is not about the NYT business model or getting stuff for free. If you want  to view the NYT, pay for it. This also isn&#8217;t a hack or a security intrusion, its simply hiding a div that is overlaying the content. The same results can be achieved by disabling javascript or selecting &#8220;no style&#8221; in your favorite browser. This is simply a tutorial on how to style the content of a page to your liking.</p>
<p><strong>Update 2: </strong>Looks like New York Times have updated their CSS classes from #gatewayCreative to #gatewayUnit in an effort to thwart cheaters.  I will not be updating the extension as this wasn&#8217;t intended to get around the wall for free but rather to expose how hilarious their pay wall security was. I think that point has been made, feel free to fork this plugin.</p>
<p><strong>Update 3: </strong>Now Google has taken down the extension. Not sure why, may have been for using the NYT logo, may be more serious. Either way, it was fun while it lasted <img src='http://wesbos.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-268" title="Screen shot 2011-03-29 at 2.33.59 PM" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-29-at-2.33.59-PM.png" alt="" width="658" height="130" /></p>
<h3><strong>Video</strong></h3>
<span style="text-align:center; display: block;"><a href="http://wesbos.com/remove-new-york-times-paywall-css/"><img src="http://img.youtube.com/vi/qxM-Cu9OLJI/2.jpg" alt="" /></a></span>
<h3>Code</h3>
<pre class="brush:css">#overlay, #gatewayCreative { display: none !important; visibility: hidden !important; }
body { 	overflow: scroll !important; }</pre>
<p>Then create a manifest.json file to register the Google Chrome Extension</p>
<pre class="brush:js">{
	"name" : "New York Times Paywall Smasher",
	"version"  : "1.0",
	"description" : "Disables the New York Times Paywall",
	"browser_actions" : {
		"icons" : {
			"128" : "icon128.png",
			"48" : "icon48.png",
			"16" : "icon16.png"
		}
	},
	"content_scripts" : [{
		"matches": ["http://www.nytimes.com/*"],
		"css" : ["nyt.css"]
 	}]
}</pre>
<p>Load the chrome extension into developer view and say goodbye to the paywall (at least until they implement something that isn&#8217;t defeated with display: none). <a href="https://chrome.google.com/extensions/detail/medmifohjnpmbkjbodbckhlgofiffgpm"> Install Chrome Extension.</a></p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/ylPLf1kmhPQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/remove-new-york-times-paywall-css/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://wesbos.com/remove-new-york-times-paywall-css/</feedburner:origLink></item>
		<item>
		<title>Run two versions of Firefox on Mac OSX</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/gb2Y9ZXEHHw/</link>
		<comments>http://wesbos.com/run-two-versions-of-firefox-on-mac-osx/#comments</comments>
		<pubDate>Wed, 23 Mar 2011 06:56:58 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[browsers]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=222</guid>
		<description><![CDATA[Yesterday Firefox 4.0 was released and web developers everywhere celebrated a really great browser.  The browser comes packed with a super fast JavaScript engine called JägerMonkey. Now don&#8217;t get too excited just yet! We still need to keep that old version of &#8230; <a href="http://wesbos.com/run-two-versions-of-firefox-on-mac-osx/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Yesterday Firefox 4.0 was released and web developers everywhere celebrated a really great browser.  The browser comes packed with a super fast JavaScript engine called JägerMonkey. Now don&#8217;t get too excited just yet! We still need to keep that old version of Firefox around for testing; we can&#8217;t assume everyone has upgraded to Firefox 4. So, to run both Firefox 3.6 and Firefox 4.0 on the same machine, just follow these simple steps:<span id="more-222"></span></p>
<ol>
<li>Open up your Applications folder and find your old version of Firefox</li>
<li>Right click-&gt; get info.</li>
<li>Rename to &#8220;Firefox36.app&#8221;</li>
<li>Download Firefox 4.0 and install as normal</li>
<li>Celebrate that you now have 1 more browser to test in!</li>
</ol>
<p>Really simple! If someone knows how to do this on the Windows and Linux side, I would love to hear how.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/gb2Y9ZXEHHw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/run-two-versions-of-firefox-on-mac-osx/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://wesbos.com/run-two-versions-of-firefox-on-mac-osx/</feedburner:origLink></item>
		<item>
		<title>Import Large MySQL Databases into PHPMyAdmin with BigDump.php</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/arFmH6Gq2NY/</link>
		<comments>http://wesbos.com/import-large-mysql-database-bigdump-php/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 18:17:33 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[databases]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpmyadmin]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=211</guid>
		<description><![CDATA[When migrating a site that has been around for a while, I often run into the problem where my MySQL Database is just too large to import via the web interface of PHPMyAdmin. Often times its to a server that &#8230; <a href="http://wesbos.com/import-large-mysql-database-bigdump-php/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When migrating a site that has been around for a while, I often run into the problem where my MySQL Database is just too large to import via the web interface of PHPMyAdmin. Often times its to a server that doesn&#8217;t allow remote access to their databases. What is a poor dev to do?<span id="more-211"></span></p>
<h3>Take a big dump</h3>
<p>Although this script has been around for almost 9 years, its still an essential tool for every developers toolbox. <a href="http://www.ozerov.de/bigdump.php" target="_blank">Big Dump</a> staggers the database import so your server does not timeout. Here is a quick tutorial on how to use Big Dump.</p>
<h3>Video</h3>
<span style="text-align:center; display: block;"><a href="http://wesbos.com/import-large-mysql-database-bigdump-php/"><img src="http://img.youtube.com/vi/2JEkLMKAUZc/2.jpg" alt="" /></a></span>
<h3>Instructions</h3>
<ol>
<li>Download the latest version of Big Dump <a href="http://www.ozerov.de/bigdump.zip" target="_blank">here</a>.</li>
<li>Open up bigdump.php and configure: Server, database name, username, password, and the file name.</li>
<li>Upload both your SQL file and bigdump.php to your server</li>
<li>Browse to bigdump.php and click import</li>
</ol>
<p>Thats it! Wait a few minutes and you will see a confirmation screen similar to the one below. Make sure to delete bigdump.php off your server when you are finished.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-214" title="BigDump PHPmyadmin" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-22-at-2.09.25-PM.png" alt="" width="557" height="321" /></p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/arFmH6Gq2NY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/import-large-mysql-database-bigdump-php/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://wesbos.com/import-large-mysql-database-bigdump-php/</feedburner:origLink></item>
		<item>
		<title>Reset a WordPress Admin Password (Video and Guide)</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/XjEDE4su-Ys/</link>
		<comments>http://wesbos.com/reset-a-wordpress-admin-password/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 19:58:17 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=189</guid>
		<description><![CDATA[Had someone ask me today how to reset a password for a user (Admin or other) on a WordPress account. Its acutally very easy to do, so here is a quick guide! 1. Log into your host&#8217;s backend and find &#8230; <a href="http://wesbos.com/reset-a-wordpress-admin-password/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Had someone ask me today how to reset a password for a user (Admin or other) on a WordPress account. Its acutally very easy to do, so here is a quick guide!<span id="more-189"></span></p>
<span style="text-align:center; display: block;"><a href="http://wesbos.com/reset-a-wordpress-admin-password/"><img src="http://img.youtube.com/vi/39IiTnNhgyY/2.jpg" alt="" /></a></span>
<p><span style="font-size: 15px; font-weight: bold;">1. Log into your host&#8217;s backend and find the spot to edit your databases</span></p>
<p>If you are unsure of which database is your WordPress install. Open up your FTP client and browse to /wp-config.php. This file will contain your database name as well as the username and password of it.</p>
<p><img class="aligncenter size-full wp-image-191" title="Screen shot 2011-03-21 at 3.38.40 PM" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-21-at-3.38.40-PM.png" alt="" width="442" height="149" /></p>
<h3>2.  Login to your database and you will be presented with PHPMyAdmin.</h3>
<p>On the side, you will see a list of  tables. Click the one that says &#8220;wp_users&#8221;. Once that loads, click the &#8220;Browse&#8221; tab.</p>
<h3>3. Edit the specified WordPress User</h3>
<p>You should now see a list of users in your WordPress install. Click the pencil icon to edit the user you wish to reset the password for.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-192" title="Screen shot 2011-03-21 at 3.44.29 PM" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-21-at-3.44.29-PM.png" alt="" width="584" height="262" /></p>
<h3>4.  Set the new password</h3>
<p>Finally, delete the data from the &#8220;user_pass&#8221; field, enter in a new password, and select MD5 from the dropdown to the left of it. When done, click go.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-193" title="Screen shot 2011-03-21 at 3.47.37 PM" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-21-at-3.47.37-PM.png" alt="" width="586" height="112" /></p>
<h3>5. You&#8217;re done! Log in as normal with your new password</h3>
<p style="text-align: left;">&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/XjEDE4su-Ys" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/reset-a-wordpress-admin-password/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wesbos.com/reset-a-wordpress-admin-password/</feedburner:origLink></item>
		<item>
		<title>Burstn and Google Maps Mashup – Photo Map!</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/5L_PQAtUTt4/</link>
		<comments>http://wesbos.com/burstn-google-maps-photos-mashup/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 18:44:57 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[Burstn]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google-maps]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=157</guid>
		<description><![CDATA[Every now and then I like to play with the API of a social networking site. Burstn is an photo sharing website that allows users to quick snap photos and upload them to their website. Lucky for me, their API &#8230; <a href="http://wesbos.com/burstn-google-maps-photos-mashup/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Every now and then I like to play with the API of a social networking site. <a href="http://burstn.com">Burstn</a> is an photo sharing website that allows users to quick snap photos and upload them to their website. Lucky for me, their API is fairly wide open, allows to easy calling, and returns a super nice JSON response. My idea is to ping the <a href="http://groups.google.com/group/burstn/web/api-documentation">Burstn API</a> for a timeline of public photos, parse the JSON response, and plot them on a Google Map based on their Lat and Long positions.  Sound fun? Lets go!<span id="more-157"></span></p>
<p><a href="http://wesbos.com/demos/burstn-map">View Demo</a> <a href="http://wesbos.com/demos/burstn-map.zip">Download Files</a></p>
<h3>Setting up</h3>
<p>You&#8217;ll need three files: index.html, wb.js, and style.css. The bulk of our content will go into wb.js as we are loading everything in via JavaScript.Your index.html file should look like this:</p>
<pre class="brush:php">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8" /&gt;
  &lt;title&gt;Google Maps Burstn Mashup&lt;/title&gt;
  &lt;script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"&gt;&lt;/script&gt;
  &lt;script src="http://maps.google.com/maps/api/js?sensor=false"    type="text/javascript"&gt;&lt;/script&gt;
  &lt;script type="text/javascript" src="wb.js" &gt;&lt;/script&gt;
  &lt;link rel="stylesheet" href="style.css" /&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div id="map" style="width: 100%; height: 100%; position: absolute;"&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p><span style="font-size: 15px; font-weight: bold;">Getting the data from Burstn API</span></p>
<p>Pulling the data from Burstn couldn&#8217;t be easier. A quick look at their documentation shows that we need to make a GET request to http://api.burstn.com/1/timeline/global. Since we want to load quite a few photos, we are going to set our limit to 400. We also need to append &amp;callback=? to the end of our url so we can get around the &#8220;Origin null is not allowed by Access-Control-Allow-Origin.&#8221; browser security.</p>
<p>Using jQuery&#8217;s AJAX method, we pull in the JSON data as so:</p>
<pre class="brush:js">	$.getJSON('http://api.burstn.com/1/timeline/global?limit=400&amp;callback=?', function(data) {
		console.log(data);
	});</pre>
<p>Now if we take a look at our console. we&#8217;ll see an object that was returned that looks like this:</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-176" title="Screen shot 2011-03-21 at 2.23.34 PM" src="http://wesbos.com/wp-content/uploads/2011/03/Screen-shot-2011-03-21-at-2.23.34-PM.png" alt="" width="586" height="317" /></p>
<p>This is all the data we need to start plotting it on our map. Using the Google Maps JavaScript 3.0 API, we will now modify the code above to be able to plot these pictures on a map.</p>
<h3>First, setup your scripts file to populate with a map</h3>
<pre class="brush:js">// check that the document is ready
$(function() {
	// setup a few vars
	var marker, i; 

	// setup our map
	 var map = new google.maps.Map(document.getElementById('map'), {
      zoom: 3,
      center: new google.maps.LatLng(43, 20),
      mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    // setup the info window (the popup bubble that display the info
    var infowindow = new google.maps.InfoWindow();</pre>
<h3>Next, Pull in data from Burstn and plot on mapa</h3>
<p>You&#8217;ll see in this chunk of code that we use jQuery&#8217;s $.each() to loop over each of the results, check for a latitude coordinate, and then plot it on the map.</p>
<pre class="brush:js">	$.getJSON('http://api.burstn.com/1/timeline/global?limit=400&amp;callback=?', function(data) {
		console.log(data);
		$.each(data['body']['data'], function(i,v) {
			// setup some variables
			var coords = data['body']['data'][i]['coordinates'],
				imgsrc = data['body']['data'][i]['image'],
				caption = data['body']['data'][i]['caption'];

				 // setup the image markers
				var image = new google.maps.MarkerImage(imgsrc['square'],
					new google.maps.Size(20, 32),
					new google.maps.Point(0, 32)
				);

				// check if this image has a lat set, if not, we skip it.
				if (coords.latitude) { 

					marker = new google.maps.Marker({
						position: new google.maps.LatLng(coords.latitude, coords.longitude),
						icon : image,
						map: map
					});

					google.maps.event.addListener(marker, 'click', (function(marker, i) {
						return function() {
							infowindow.setContent('&lt;div class="picture"&gt; &lt;span class="title"&gt;'+caption+'&lt;/span&gt;&lt;img src="'+imgsrc['medium']+'" alt="" /&gt;&lt;/div&gt;');
							infowindow.open(map, marker);
						}
					})(marker, i));

				} // end if

			});
	});
});</pre>
<h3>Thats it! Just add some style</h3>
<p>Thats it! Just add a quick dash of style to make things look good and we are off to the races.</p>
<pre class="brush:css">#map {
	overflow: hidden;
}
.picture {
	background: yellow;
	overflow: hidden;
	position: relative;
	}

	.picture span {
		position: absolute;
		width: 100%;
		bottom: 0;
		padding: 4px;
		background: #000;
		color: #fff;
		font-size: 12px;
		font-family: Arial;}

	.picture img {
		height: 400px;}</pre>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/5L_PQAtUTt4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/burstn-google-maps-photos-mashup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wesbos.com/burstn-google-maps-photos-mashup/</feedburner:origLink></item>
		<item>
		<title>Using jQuery, JSON and Google’s Visualization Geo API Together</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/qJQT4FDvHnM/</link>
		<comments>http://wesbos.com/jquery-json-google-visualization-api/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 03:44:23 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=147</guid>
		<description><![CDATA[Was helping someone out in the jQuery IRC channel today and they were having some trouble with a JSON api that they were using. To simply put it they wanted to: Load a JSON file via Ajax Parse the results &#8230; <a href="http://wesbos.com/jquery-json-google-visualization-api/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Was helping someone out in the jQuery IRC channel today and they were having some trouble with a JSON api that they were using. To simply put it they wanted to:</p>
<ol>
<li>Load a JSON file via Ajax</li>
<li>Parse the results</li>
<li>Pass it to <a href="http://code.google.com/apis/ajax/playground/?type=visualization#geo_map" target="_blank">Google&#8217;s Visualization</a> into a data table</li>
<li>Create a map based on that data.</li>
</ol>
<p>Now the example given is great, however it doesn&#8217;t jive well when you want to add in a friendly library like jQuery. So here is how we fixed it:<span id="more-147"></span></p>
<h3>The JSON Data in regiontop10.json</h3>
<pre class="brush:js">[
    {
        "DisplayName": "United States",
        "Name": "US",
        "population": 307006550
    },
    {
        "DisplayName": "Canada",
        "Name": "CA",
        "population": 33739900
    },
    {
        "DisplayName": "United Kingdom",
        "Name": "GB",
        "population": 61838154
    },
    {
        "DisplayName": "Mexico",
        "Name": "MX",
        "population": 107431225
    }
]</pre>
<p>Then we just needed load the data from this file and create the map. Comments on how this code works are inline.</p>
<pre class="brush:js">    google.load('visualization', '1', {packages: ['geomap']});

    $(function() {
    		// when document loads, grab the json
			$.getJSON('regiontop10.json', function(data) {
				// once grabbed, we run this callback

				// setup the new map and its variables
				var map = new google.visualization.DataTable();
					map.addRows(data.length);  // length gives us the number of results in our returned data
					map.addColumn('string', 'Country');
	      		map.addColumn('number', 'Population');

				// now we need to build the map data, loop over each result
				$.each(data, function(i,v) {
					// set the values for both the name and the population
					map.setValue(i, 0, v.DisplayName);
					map.setValue(i, 1, v.population);
				});
				// finally, create the map!
				var geomap = new google.visualization.GeoMap(
		          document.getElementById('visualization'));
		     		 geomap.draw(map, null);

			});
   });</pre>
<p>And that is it! <a href="http://wesbos.com/demos/google-geo-map-visualization/">Take a look at the demo</a> and view source for the rest of the HTML markup.</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/qJQT4FDvHnM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/jquery-json-google-visualization-api/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://wesbos.com/jquery-json-google-visualization-api/</feedburner:origLink></item>
		<item>
		<title>The Cobbler’s Children Finally Have Shoes – New Site Launched!</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/8swbmNJZuRA/</link>
		<comments>http://wesbos.com/wes-bos-new-site/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 15:00:38 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Wes]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=90</guid>
		<description><![CDATA[This is a phrase I will no longer have to joke about when telling someone about my website. I&#8217;ve finally taken the time to create myself a brand spakin&#8217; new website. Its been almost 2.5 years since I launched the &#8230; <a href="http://wesbos.com/wes-bos-new-site/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3 style="text-align: left;"><span style="font-size: 13px; font-weight: normal;">This is a phrase I will no longer have to joke about when telling someone about my website. I&#8217;ve finally taken the time to create myself a brand spakin&#8217; new website. Its been almost 2.5 years since I launched the last one and a lot has changed. I&#8217;m very proud to launch this site as I think it reflects who I am a lot better than the old one.<span id="more-90"></span></span></h3>
<p><strong><span style="font-size: 13px;">I&#8217;m Blogging!</span></strong></p>
<p style="text-align: left;">Over the past couple of years I&#8217;ve gathered up so much knowledge, so many code snippets and many more insights on everything from web development to entrepreneurship. These were all great, but I never had a spot to put them! With the start of this blog, I hope to further establish myself by helping the community who I&#8217;ve learned so much from over the years.</p>
<h3>Ingredients</h3>
<p style="text-align: left;">Incase you were wondering, the site, which is fairly simple in its make up, is run on WordPress with hints of HTML5, CSS3 and some jQuery.</p>
<h3 style="text-align: left;">Suggestions</h3>
<p>I am often asked questions by friends who are just getting into something like WordPress or jQuery. They are usually asking how I did something on a certain website, or how to get started with a certain lanaguage. If there is anything you want to ask me, please get in touch right now. I&#8217;m always looking for ideas to do tutorials and blog posts on, so I would love to hear from you!</p>
<p>&nbsp;</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/8swbmNJZuRA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/wes-bos-new-site/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wesbos.com/wes-bos-new-site/</feedburner:origLink></item>
		<item>
		<title>Simple PHP Page Caching Technique</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/zbzeXQ_t2Ds/</link>
		<comments>http://wesbos.com/simple-php-page-caching-technique/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 14:17:20 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Code Snippets]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[example]]></category>
		<category><![CDATA[page-cache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[snippet]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=68</guid>
		<description><![CDATA[This is a little code snippet that I use in almost every project that isn&#8217;t based on a popular CMS. Since its fairly expensive to hit the database on every page load, its a smart idea to cache the plain &#8230; <a href="http://wesbos.com/simple-php-page-caching-technique/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This is a little code snippet that I use in almost every project that isn&#8217;t based on a popular CMS. Since its fairly expensive to hit the database on every page load, its a smart idea to cache the plain HTML markup of your page and serve that up. You can set how often the page cache is flushed out depending on how often you update your site&#8217;s content.<span id="more-68"></span></p>
<pre class="brush:php">&lt;?php
	// define the path and name of cached file
	$cachefile = 'cached-files/'.date('M-d-Y').'.php';
	// define how long we want to keep the file in seconds. I set mine to 5 hours.
	$cachetime = 18000;
	// Check if the cached file is still fresh. If it is, serve it up and exit.
	if (file_exists($cachefile) &amp;&amp; time() - $cachetime &lt; filemtime($cachefile)) {
   	include($cachefile);
    	exit;
	}
	// if there is either no file OR the file to too old, render the page and capture the HTML.
	ob_start();
?&gt;
	&lt;html&gt;
		output all your html here.
	&lt;/html&gt;
&lt;?php
	// We're done! Save the cached content to a file
	$fp = fopen($cachefile, 'w');
	fwrite($fp, ob_get_contents());
	fclose($fp);
	// finally send browser output
	ob_end_flush();
?&gt;</pre>
<p>Have some others tricks? Leave a comment below!</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/zbzeXQ_t2Ds" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/simple-php-page-caching-technique/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://wesbos.com/simple-php-page-caching-technique/</feedburner:origLink></item>
		<item>
		<title>Web apps I pay for monthly</title>
		<link>http://feedproxy.google.com/~r/wesbos/ZXAx/~3/jxVPkr__2Ok/</link>
		<comments>http://wesbos.com/web-apps-i-pay-for-monthly/#comments</comments>
		<pubDate>Tue, 15 Mar 2011 14:14:54 +0000</pubDate>
		<dc:creator>wesbos</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[basecamp]]></category>
		<category><![CDATA[cloud app]]></category>
		<category><![CDATA[dropbox]]></category>
		<category><![CDATA[freshbooks]]></category>
		<category><![CDATA[grooveshark]]></category>
		<category><![CDATA[reinvigorate]]></category>
		<category><![CDATA[tutsplus]]></category>

		<guid isPermaLink="false">http://wesbos.com/?p=75</guid>
		<description><![CDATA[The web is filled with with online applications and services that &#8220;Only cost a few bucks a month!&#8221;. While they are certainly a lot cheaper than buying desktop software, not all of them area always worth it. These are the &#8230; <a href="http://wesbos.com/web-apps-i-pay-for-monthly/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>The web is filled with with online applications and services that &#8220;Only cost a few bucks a month!&#8221;. While they are certainly a lot cheaper than buying desktop software, not all of them area always worth it. These are the apps that I feed a few bucks to each month.<span id="more-75"></span></p>
<h3><a href="http://www.freshbooks.com/" target="_blank">Freshbooks</a></h3>
<p>Freshbooks makes invoicing clients easy. Dealing with poorly formatted excel documents and keeping track of payments are a thing of the past when you use freshbooks. At around $15/ month, the service pays for itself even if you are sending just a few invoices a month.</p>
<h3><a href="http://getcloudapp.com/" target="_blank">Cloud App</a></h3>
<p>Could App is a new addition to my paid services as I only signed up for the premium membership a month ago after using a free account for 7+ months. The app is very simple, take a screenshot and it automatically uploads it to the cloud and embeds a short URL into your clipboard &#8211; all within about 2 seconds. The premium account (at $5/ month) allows me to upload any type of file up to 250MB as well as use my own snazzy domain name &#8216;b-w.es&#8217;.</p>
<h3><a href="http://basecamphq.com/" target="_blank">Basecamp</a></h3>
<p>Basecamp is a project management and collaboration tool created by 37 Signals. Ask any developer, designer or team lead what tools are in their toolbox, and they will likely say Basecamp. The premium service allows me to manage large projects, collaborate communication, organize to-dos among other time savers. If you&#8217;re pulling your hair out because your email inbox is in disarray, its time to check out Basecamp.</p>
<h3><a href="https://www.dropbox.com/" target="_blank">Dropbox</a></h3>
<p>Dropbox is a file syncing service that has grown to become the standard in the web design and development industry. I work right out of my Dropbox folder and always maintain a safe backup both in the cloud as well as on my other computers. It even acts as sort of a source control system when working on a project with more than one developer. The revert history function has saved my ass many times over to make it worth the $100/year.</p>
<h3><a href="http://tutsplus.com/" target="_blank">Tuts Plus Membership</a></h3>
<p>Keeping your skills sharp is an important part of being a developer. The TutsPlus network provides an array of sites that offer up premium tutorials to paying subscribers. The tutorials are always top quality and definitely worth the few bucks a month I pay. I check <a href="http://net.tutsplus.com/" target="_blank">NetTuts</a> daily but also keep an eye on <a href="http://webdesign.tutsplus.com/" target="_blank">Web Design Tuts Plus</a>, <a href="http://mobile.tutsplus.com/" target="_blank">Mobile Tuts</a>, and <a href="http://psd.tutsplus.com/" target="_blank">PSD Tuts</a></p>
<h3><a href="http://reinvigorate.net/" target="_blank">Reinvigorate</a></h3>
<p>Website analytics company Reinvigorate fills in the gaps where Google Analytics falls short. With realtime tracking and really awesome heatmaps, the data I get from them is worth the $10/month.</p>
<h3><a href="http://listen.grooveshark.com/" target="_blank">Groove Shark</a> (Almost)</h3>
<p>I&#8217;m a huge Groove Shark user and have considered their premium plan many times. The only thing that is holding me back at the moment is the ability to use the forward and back media keys on my laptop. The day they implement this, I&#8217;ll be first to sign up</p>
<img src="http://feeds.feedburner.com/~r/wesbos/ZXAx/~4/jxVPkr__2Ok" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://wesbos.com/web-apps-i-pay-for-monthly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://wesbos.com/web-apps-i-pay-for-monthly/</feedburner:origLink></item>
	</channel>
</rss><!-- This Quick Cache file was built for (  wesbos.com/feed/ ) in 8.25630 seconds, on Apr 4th, 2012 at 12:26 pm UTC. --><!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Apr 4th, 2012 at 1:26 pm UTC --><!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --><!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  wesbos.com/feed/ ) in 0.00131 seconds, on Apr 4th, 2012 at 1:12 pm UTC. -->

