<?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>blogt✪sk1</title>
	
	<link>http://blog.jerodsanto.net</link>
	<description>with Jerod Santo</description>
	<lastBuildDate>Fri, 10 Jul 2009 01:43:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/nomeanblog" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Sass Never Forgets</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/7YF9OBnAErs/</link>
		<comments>http://blog.jerodsanto.net/2009/07/sass-never-forgets/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 01:43:54 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[mixins]]></category>
		<category><![CDATA[sass]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=518</guid>
		<description>Some CSS techniques require me to Google about like a chicken with its head cut off. One such technique is placing a div in the dead center of a page (vertically and horizontally). Since I&amp;#8217;m using Sass pretty much exclusively these days, I decided to define this technique as a mixin so I don&amp;#8217;t have [...]


No related posts.</description>
			<content:encoded><![CDATA[<p>Some CSS techniques require me to Google about like a chicken with its head cut off. One such technique is placing a div in the dead center of a page (vertically and horizontally). Since I&#8217;m using <a href="http://sass-lang.com">Sass</a> pretty much exclusively these days, I decided to define this technique as a mixin so I don&#8217;t have to look it up anymore.</p>
<p>Hopefully this can be of use to others. YMMV:</p>
<p>The mixin definition:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #00AA00;">=</span>dead-<span style="color: #993333;">center</span><span style="color: #00AA00;">&#40;</span>!<span style="color: #000; font-weight: bold;">height</span><span style="color: #00AA00;">,</span>!<span style="color: #000; font-weight: bold;">width</span><span style="color: #00AA00;">&#41;</span>
  <span style="color: #00AA00;">:</span><span style="color: #000; font-weight: bold;">height</span><span style="color: #00AA00;">=</span> !<span style="color: #000; font-weight: bold;">height</span>
  <span style="color: #3333ff;">:margin-</span>top<span style="color: #00AA00;">=</span> -<span style="color: #00AA00;">&#40;</span>!<span style="color: #000; font-weight: bold;">height</span> / <span style="color: #cc66cc;">2</span><span style="color: #00AA00;">&#41;</span>
  <span style="color: #00AA00;">:</span><span style="color: #000; font-weight: bold;">top</span> <span style="color: #933;"><span style="color: #cc66cc;">50</span>%</span>
  <span style="color: #00AA00;">:</span><span style="color: #000; font-weight: bold;">width</span><span style="color: #00AA00;">=</span> !<span style="color: #000; font-weight: bold;">width</span>
  <span style="color: #3333ff;">:margin-</span>left<span style="color: #00AA00;">=</span> -<span style="color: #00AA00;">&#40;</span>!<span style="color: #000; font-weight: bold;">width</span> / <span style="color: #cc66cc;">2</span><span style="color: #00AA00;">&#41;</span>
  <span style="color: #00AA00;">:</span><span style="color: #000; font-weight: bold;">left</span> <span style="color: #933;"><span style="color: #cc66cc;">50</span>%</span>
  <span style="color: #3333ff;">:<span style="color: #000; font-weight: bold;">position</span> </span>absolute
  <span style="color: #3333ff;">:<span style="color: #000; font-weight: bold;">text-align</span> </span>center</pre></div></div>

<p>To use it on an element:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#centered</span>
  <span style="color: #00AA00;">+</span>dead-<span style="color: #993333;">center</span><span style="color: #00AA00;">&#40;</span><span style="color: #933;">200px</span><span style="color: #00AA00;">,</span><span style="color: #933;">500px</span><span style="color: #00AA00;">&#41;</span></pre></div></div>

<p>Now I&#8217;ll never forget how. Thanks Sass!</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/07/sass-never-forgets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/07/sass-never-forgets/</feedburner:origLink></item>
		<item>
		<title>On WordPress Plugin Release Notes</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/mSTdzXCLq70/</link>
		<comments>http://blog.jerodsanto.net/2009/07/on-wordpress-plugin-release-notes/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 19:31:13 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=504</guid>
		<description>Plugin upgrade notifications and one-click installs are great for both developers and users alike, but there is one thing about them that I find irritating as a user, and easily avoidable as a developer: displaying reasons to upgrade.

I love, love, love new software and usually can&amp;#8217;t wait to install the latest shiny update. However, before [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/06/introducing-the-wordpress-console/' rel='bookmark' title='Permanent Link: Introducing the WordPress Console'&gt;Introducing the WordPress Console&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/04/clean-wp-dashboard/' rel='bookmark' title='Permanent Link: Clean WP Dashboard'&gt;Clean WP Dashboard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/02/debian-50-lenny-released/' rel='bookmark' title='Permanent Link: Debian 5.0 (Lenny) Released'&gt;Debian 5.0 (Lenny) Released&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>Plugin upgrade notifications and one-click installs are great for both developers and users alike, but there is one thing about them that I find irritating as a user, and easily avoidable as a developer: <strong>displaying reasons to upgrade</strong>.<br />
<span id="more-504"></span><br />
I love, love, love new software and usually can&#8217;t wait to install the latest shiny update. However, before I put myself at risk and click the <strong>upgrade automatically</strong> button, I&#8217;d like to know what the new release is going to do differently than what I already have. I&#8217;m pretty sure I&#8217;m not alone in this desire, as the WordPress developers have implemented a nice <strong>View Version [x] Details</strong> button right there in the plugin admin page. You know, this one:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/07/update_notification.png" alt="update_notification" title="update_notification" width="640" height="89" class="aligncenter size-full wp-image-506" /></p>
<p>Awesome!! Well, kinda.</p>
<p>The problem is that most plugin developers don&#8217;t include release notes with each version, rendering the awesomeness of no effect. For instance, I have <strong>no idea</strong> what I&#8217;m getting by upgrading the <a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">Google XML Sitemaps</a> plugin. This is what you see after clicking the &#8220;View Version 3.1.4 Details&#8221; button:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/07/update_no_info.png" alt="update_no_info" title="update_no_info" width="640" height="393" class="aligncenter size-full wp-image-508" /></p>
<p>The closest thing offered there is a link to the Changelog, which opens in a new tab/window. Totally lame. Check out the <a href="http://www.arnebrachhold.de/projects/wordpress-plugins/google-xml-sitemaps-generator/changelog/">Changelog</a>. It is filled with totally useful information. Make it accessible! </p>
<p>Slap your users in the face with reasons to upgrade!</p>
<p>Contrast that with what is displayed to potential upgraders (not sure if that&#8217;s even a word) of my <a href="http://wordpress.org/extend/plugins/wordpress-console/">WordPress Console</a> plugin:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/07/update_info.png" alt="update_info" title="update_info" width="640" height="405" class="aligncenter size-full wp-image-510" /></p>
<p>Two things to notice:</p>
<ol>
<li>WordPress provides a special tab called <strong>Changelog</strong> that will be loaded right inside this window by adding a <strong>Changelog</strong> section to your plugin&#8217;s readme.txt. USE IT!! (<a href="http://wordpress.org/extend/plugins/about/readme.txt">more readme info</a>)</li>
<li>For some people, even clicking the Changelog tab is asking too much of them. Including what&#8217;s new since the last release of your plugin right in the description is a big win for everybody involved.</li>
</ol>
<p>There are many plugins that handle this just fine, but many more that do not. My hope is that other WordPress plugin developers will adopt this practice, to the benefit of their users and the community as a whole.</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2009/06/introducing-the-wordpress-console/' rel='bookmark' title='Permanent Link: Introducing the WordPress Console'>Introducing the WordPress Console</a></li><li><a href='http://blog.jerodsanto.net/2009/04/clean-wp-dashboard/' rel='bookmark' title='Permanent Link: Clean WP Dashboard'>Clean WP Dashboard</a></li><li><a href='http://blog.jerodsanto.net/2009/02/debian-50-lenny-released/' rel='bookmark' title='Permanent Link: Debian 5.0 (Lenny) Released'>Debian 5.0 (Lenny) Released</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/07/on-wordpress-plugin-release-notes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/07/on-wordpress-plugin-release-notes/</feedburner:origLink></item>
		<item>
		<title>jQuery Tools 101: Nested Tabs</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/u4kFfF90LiI/</link>
		<comments>http://blog.jerodsanto.net/2009/07/jquery-tools-101-nested-tabs/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 22:25:43 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[jQuery]]></category>
		<category><![CDATA[101]]></category>
		<category><![CDATA[jquerytools]]></category>
		<category><![CDATA[tabs]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=494</guid>
		<description>jQuery Tools is the new kid on the block when it comes to jQuery-based user interface libraries. What it offers is a solid foundation of widgets at an extremely small file size (5.8 KB minified).
I decided to ditch jQuery UI on a recent project when I couldn&amp;#8217;t get tabs &amp;#038; accordions to play nice together [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/08/great-jquery-reference/' rel='bookmark' title='Permanent Link: Great jQuery Reference'&gt;Great jQuery Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/06/rails-nested-layouts/' rel='bookmark' title='Permanent Link: Rails: Nested Layouts'&gt;Rails: Nested Layouts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/05/jquery-open-external-links-in-new-windowtab/' rel='bookmark' title='Permanent Link: jQuery &amp;#8211; Open External Links In New Window/Tab'&gt;jQuery &amp;#8211; Open External Links In New Window/Tab&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p><a href="http://flowplayer.org/tools/index.html">jQuery Tools</a> is the new kid on the block when it comes to jQuery-based user interface libraries. What it offers is a solid foundation of widgets at an extremely small file size (5.8 KB minified).</p>
<p>I decided to ditch <a href="http://jqueryui.com">jQuery UI</a> on a recent project when I couldn&#8217;t get tabs &#038; accordions to play nice together (also, their site was down when I needed it so I took that as a sign). This was a great opportunity to try jQuery Tools and I have been very impressed thus far.</p>
<p>To use the minimal tabs interface you can simply <a href="http://flowplayer.org/tools/demos/tabs/index.html">follow the instructions on their site</a>, but if you want to nest tabs inside one another you&#8217;ll need to change things slightly. I&#8217;ll demonstrate below:<br />
<span id="more-494"></span></p>
<h3>the Mark Up</h3>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;ul class=&quot;tabs main&quot;&gt;
  &lt;li&gt;&lt;a class=&quot;main&quot; href=&quot;#1&quot;&gt;Main Tab 1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a class=&quot;main&quot; href=&quot;#1&quot;&gt;Main Tab 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&nbsp;
&lt;div class=&quot;panes main&quot;&gt;
  &lt;div&gt;this is main tab 1 content. it includes another set of tabs
&nbsp;
    &lt;ul class=&quot;tabs nested&quot;&gt;
      &lt;li&gt;&lt;a class=&quot;nested&quot; href=&quot;#2&quot;&gt;Nested Tab 1&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a class=&quot;nested&quot; href=&quot;#2&quot;&gt;Nested Tab 2&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
&nbsp;
    &lt;div class=&quot;panes nested&quot;&gt;
      &lt;div&gt;this is my nested tab 1 content&lt;/div&gt;
      &lt;div&gt;this is my nested tab 2 content&lt;/div&gt;
    &lt;/div&gt;
&nbsp;
  &lt;/div&gt;
  &lt;div&gt;this is my main tab 2 content&lt;/div&gt;
&lt;/div&gt;</pre></div></div>

<p>The key in this sequence is that the seemingly arbitrary href attribute on the tab anchors has different content for the main tabs (#1) than the nested tabs (#2). This is required or your nested tabs will keep returning to the main tabs when you click on a tab link.</p>
<h3>the JavaScript</h3>
<p>To configure the nested tabs, you can define the JavaScript as simply as this:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #0086B3;">ready</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #ff2806;">&quot;ul.main.tabs&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #0086B3;">tabs</span><span style="color: #009900;">&#40;</span><span style="color: #ff2806;">&quot;div.main.panes &gt; div&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>tabs<span style="color: #339933;">:</span> <span style="color: #ff2806;">'a.main'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  $<span style="color: #009900;">&#40;</span><span style="color: #ff2806;">&quot;ul.nested.tabs&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #0086B3;">tabs</span><span style="color: #009900;">&#40;</span><span style="color: #ff2806;">&quot;div.nested.panes &gt; div&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span>tabs<span style="color: #339933;">:</span> <span style="color: #ff2806;">'a.nested'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>the tabs() function is called on a jQuery selector that matches the unordered list and it takes as its first argument a selector for where to find the tab&#8217;s content panes. It&#8217;s second argument is a single option that tells tabs() which elements to use as links for the tabs. The default is &#8216;a&#8217;, but to differentiate the main tabs from the nested tabs, it needs to be passed explicitly with the correct class for the anchor.</p>
<h3>the Style</h3>
<p>Of course, to make these look cool you&#8217;ll need some nice CSS applied to the elements at play. I&#8217;ll leave that to you, but you can get a decent start from the <a href="http://flowplayer.org/tools/tabs.html">demo page</a> for the library.</p>
<p>Enjoy!</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2008/08/great-jquery-reference/' rel='bookmark' title='Permanent Link: Great jQuery Reference'>Great jQuery Reference</a></li><li><a href='http://blog.jerodsanto.net/2008/06/rails-nested-layouts/' rel='bookmark' title='Permanent Link: Rails: Nested Layouts'>Rails: Nested Layouts</a></li><li><a href='http://blog.jerodsanto.net/2009/05/jquery-open-external-links-in-new-windowtab/' rel='bookmark' title='Permanent Link: jQuery &#8211; Open External Links In New Window/Tab'>jQuery &#8211; Open External Links In New Window/Tab</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/07/jquery-tools-101-nested-tabs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/07/jquery-tools-101-nested-tabs/</feedburner:origLink></item>
		<item>
		<title>Introducing the WordPress Console</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/oKTMJYInXIg/</link>
		<comments>http://blog.jerodsanto.net/2009/06/introducing-the-wordpress-console/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 03:13:19 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=475</guid>
		<description>One killer feature of Ruby on Rails (for me) is script/console. Being able to interact with your code and data inside the full Rails environment is a powerful tool for development. Some days I practically live there, and if I get carried away, I do a lot of my testing there too (bad, I know).
I [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/07/on-wordpress-plugin-release-notes/' rel='bookmark' title='Permanent Link: On WordPress Plugin Release Notes'&gt;On WordPress Plugin Release Notes&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/04/clean-wp-dashboard/' rel='bookmark' title='Permanent Link: Clean WP Dashboard'&gt;Clean WP Dashboard&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/07/rails-screen-awesome/' rel='bookmark' title='Permanent Link: Rails + Screen = Awesome'&gt;Rails + Screen = Awesome&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>One killer feature of Ruby on Rails (for me) is <strong>script/console</strong>. Being able to interact with your code and data inside the full Rails environment is a powerful tool for development. Some days I practically live there, and if I get carried away, I do a lot of my testing there too (bad, I know).</p>
<p>I love Ruby and Rails, but being a contract developer means I go where the money is and recently that has been in WordPress plugin development. I enjoy developing for WordPress, but I&#8217;ve been spoiled by Rails and I often long for an interactive console for WordPress.</p>
<p>As a result, I&#8217;ve been developing (and using) a Wordpress plugin built for Wordpress developers. It provides an in-browser console where you can &#8220;play&#8221; with the code you&#8217;re working on.</p>
<p>If a picture is worth 1,000 words, this screencast will be worth at least a bazillion of &#8216;em:<br />
<span id="more-475"></span><br />
<object width="640" height="368"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5300607&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5300607&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="368"></embed></object></p>
<p>So there you have it. It is currently version <strong>0.1.0</strong> (very young) and I would love some help to make it even more awesome. The source code is hosted on <a href="http://github.com/sant0sk1/wordpress-console">GitHub</a>, so please fork away and I&#8217;d be happy to merge in your changes.</p>
<p>Or, simply go <a href="http://wordpress.org/extend/plugins/wordpress-console/">download</a> the plugin and try it.</p>
<p><strong>*NOTE*</strong><br />
In developing this plugin, I leaned on a few other open-source projects for inspiration (and in some cases, code). They are:</p>
<ul>
<li><a href="http://pear.php.net/package/PHP_Shell/">PHP_Shell</a></li>
<li><a href="http://code.google.com/p/htsh/">htsh</a></li>
</ul>
<p>I thank the authors for opening their source.</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2009/07/on-wordpress-plugin-release-notes/' rel='bookmark' title='Permanent Link: On WordPress Plugin Release Notes'>On WordPress Plugin Release Notes</a></li><li><a href='http://blog.jerodsanto.net/2009/04/clean-wp-dashboard/' rel='bookmark' title='Permanent Link: Clean WP Dashboard'>Clean WP Dashboard</a></li><li><a href='http://blog.jerodsanto.net/2008/07/rails-screen-awesome/' rel='bookmark' title='Permanent Link: Rails + Screen = Awesome'>Rails + Screen = Awesome</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/06/introducing-the-wordpress-console/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/06/introducing-the-wordpress-console/</feedburner:origLink></item>
		<item>
		<title>Sniff Your iPhone’s Network Traffic</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/N5vp735mskQ/</link>
		<comments>http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 15:33:22 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[iPhone]]></category>
		<category><![CDATA[network]]></category>
		<category><![CDATA[paros]]></category>
		<category><![CDATA[proxy]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=450</guid>
		<description>Ever wanted (or needed) to see your iPhone&amp;#8217;s network traffic? All you need is a wireless LAN and the cross-platform proxy application, Paros. There are other proxy server&amp;#8217;s that can be used, but Paros was built for web application security assessments, so it provides an intimate hook into the HTTP request/response flow. Let&amp;#8217;s get started!

1) [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/08/configure-network-time-protocol-ntp-in-debian/' rel='bookmark' title='Permanent Link: Configure Network Time Protocol (NTP) in Debian'&gt;Configure Network Time Protocol (NTP) in Debian&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/05/dreamy-now-with-100-api-coverage/' rel='bookmark' title='Permanent Link: Dreamy: Now With 100% API Coverage'&gt;Dreamy: Now With 100% API Coverage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/08/ruby-to-the-rescue/' rel='bookmark' title='Permanent Link: Ruby to the Rescue'&gt;Ruby to the Rescue&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>Ever wanted (or needed) to see your iPhone&#8217;s network traffic? All you need is a wireless LAN and the cross-platform proxy application, <a href="http://www.parosproxy.org/index.shtml">Paros.</a> There are other proxy server&#8217;s that can be used, but Paros was built for web application security assessments, so it provides an intimate hook into the HTTP request/response flow. Let&#8217;s get started!<br />
<span id="more-450"></span></p>
<h3>1) Download and Install Paros</h3>
<p>Grab the download from the <a href="http://www.parosproxy.org/download.shtml">Paros site</a>. Your install process will differ depending on your O/S, but they&#8217;ve provided some install instructions <a href="http://www.parosproxy.org/install.shtml">here</a>. Everybody will need the Java Runtime Environment 1.4 or above.</p>
<h3>2) Configure Paros</h3>
<p>Once installed, launch Paros and find the configuration options (on OS X they are under Tools -> Options). Paros is configured by default to listen on localhost only, but we are going to route our iPhone&#8217;s traffic through Paros, so we need to set it to listen on the IP address of the interface connected to the same LAN as the iPhone.</p>
<p>My LAN&#8217;s network is 1.1.1.0/16, so I&#8217;ll configure the Local Proxy address accordingly:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/paros_config.png" alt="paros_config" title="paros_config" width="640" height="292" class="aligncenter size-full wp-image-452"/></p>
<p>That should be the only setting that we need to fuss with. Paros is all set and listening on port 8080, let&#8217;s configure the iPhone to route its traffic through our proxy!</p>
<h3>3) Configure iPhone</h3>
<p>On the iPhone, open the &#8220;<strong>Settings</strong>&#8221; app and navigate to the Wi-Fi page. Once there, edit the settings for the wireless network you are currently connected to (this needs to be the same network where your proxy is running). To do this, click the little blue arrow on the right side of the screen.</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/config_wifi.png" alt="config_wifi" title="config_wifi" width="322" height="480" class="aligncenter size-full wp-image-455" /></p>
<p>Now, scroll all the way to the bottom of the settings page and change the <strong>&#8220;HTTP Proxy&#8221;</strong> setting to manual. Enter the IP address and port number of your Paros Proxy.</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/config_proxy.png" alt="config_proxy" title="config_proxy" width="320" height="480" class="aligncenter size-full wp-image-456" /></p>
<p>All set! Now all web traffic to and from the iPhone is routed through Paros. Let&#8217;s go see what we can see.</p>
<h3>4) Using Paros</h3>
<p>The main section of Paros is the &#8220;<strong>Request/Response/Trap</strong>.&#8221; As the iPhone talks through Paros to Internet sites, it will display the iPhone&#8217;s request and the server&#8217;s response. The &#8220;<strong>trap</strong>&#8221; functionality allows you to stop either the request or the response and view/modify it before sending it along to the recipient. Trapping is very cool, and why Paros is used for security auditing, but for our purposes we just want to see what is going on, so I won&#8217;t explain it any further.</p>
<p>For now, let&#8217;s see what happens when we fire up my iPhone&#8217;s &#8220;<strong>App Store</strong>&#8221; app:</p>
<p>In the bottom section of the screen is the history viewer. There we can see that my iPhone made 4 requests to different servers ( 3 GETs and 1 POST):</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/history.png" alt="history" title="history" width="640" height="80" class="aligncenter size-full wp-image-468" /></p>
<p>Highlighting the first GET in the history list shows its details. The iPhone&#8217;s HTTP request header looked like this:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/request.png" alt="request" title="request" width="640" height="400" class="aligncenter size-full wp-image-470" /></p>
<p>One noteworthy tidbit is that the iPhone is sending a custom header (X-Apple-Connection-Type) which tells the server that it is connected to WiFi. Next, let&#8217;s take a look at the server&#8217;s response:</p>
<p><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/06/response.png" alt="response" title="response" width="640" height="484" class="aligncenter size-full wp-image-471" /></p>
<p>Notice that in the response we see both the headers that the server returned AND the response data itself, in this case an xml plist file.</p>
<p>Sniffing traffic like this can help you understand how different iPhone apps work behind the scenes or it can help debug interaction for an app that you&#8217;re writing. Hope this helps you get started!</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2008/08/configure-network-time-protocol-ntp-in-debian/' rel='bookmark' title='Permanent Link: Configure Network Time Protocol (NTP) in Debian'>Configure Network Time Protocol (NTP) in Debian</a></li><li><a href='http://blog.jerodsanto.net/2009/05/dreamy-now-with-100-api-coverage/' rel='bookmark' title='Permanent Link: Dreamy: Now With 100% API Coverage'>Dreamy: Now With 100% API Coverage</a></li><li><a href='http://blog.jerodsanto.net/2008/08/ruby-to-the-rescue/' rel='bookmark' title='Permanent Link: Ruby to the Rescue'>Ruby to the Rescue</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/</feedburner:origLink></item>
		<item>
		<title>PHP5 with readline support on OS X</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/4qStcsrSuUI/</link>
		<comments>http://blog.jerodsanto.net/2009/06/php5-with-readline-support-on-os-x/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 16:38:53 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[OS X]]></category>
		<category><![CDATA[macports]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[readline]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=442</guid>
		<description>OS X ships with PHP5 installed but it does not have readline() support compiled in. Anybody using PHP from the command-line will want this, as it allows handy things such as tab completion and scrolling through command history using the up arrow.
Thankfully, MacPorts has a readline variant that can be easily installed:

sudo port install php5 [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/08/debian-quickie-mailutils/' rel='bookmark' title='Permanent Link: Debian Quickie: MailUtils'&gt;Debian Quickie: MailUtils&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>OS X ships with PHP5 installed but it does not have readline() support compiled in. Anybody using PHP from the command-line will want this, as it allows handy things such as tab completion and scrolling through command history using the up arrow.</p>
<p>Thankfully, <a href="http://www.macports.org/">MacPorts</a> has a readline variant that can be easily installed:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">sudo port install php5 +readline</pre></div></div>

<p>If you execute the command above, apache2 will come along for the ride because it&#8217;s a default variant for the PHP5 port. If you don&#8217;t want apache2 (OS X ships with apache2 anyways), modify the command to look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">sudo port install php5 -apache2 +readline</pre></div></div>

<p>Not sure if your PHP install has readline support? Execute this one-liner to find out:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span> <span style="color: #000; font-weight: bold;">echo</span> <span style="color: #0086B3;">function_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'readline'</span><span style="color: #009900;">&#41;</span> ? <span style="color: #ff2806;">&quot;yes<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: #339933;">:</span> <span style="color: #ff2806;">&quot;no<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>



<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2008/08/debian-quickie-mailutils/' rel='bookmark' title='Permanent Link: Debian Quickie: MailUtils'>Debian Quickie: MailUtils</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/06/php5-with-readline-support-on-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/06/php5-with-readline-support-on-os-x/</feedburner:origLink></item>
		<item>
		<title>Let Capistrano Compile Ruby 1.9 For You</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/xPlOLV58fcI/</link>
		<comments>http://blog.jerodsanto.net/2009/06/let-capistrano-compile-ruby-19-for-you/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 20:46:17 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[ruby19]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=434</guid>
		<description>A Capistrano task to install Ruby 1.9.1 to &amp;#8220;/opt/ruby-1.9.1&amp;#8221; on Debian:


With this task, you can quickly upgrade all your Debian machines to Ruby 1.9.1 without having to go through the process each time. Just:

cap ruby:install_19



Related posts:Debian 5.0 (Lenny) Released


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/02/debian-50-lenny-released/' rel='bookmark' title='Permanent Link: Debian 5.0 (Lenny) Released'&gt;Debian 5.0 (Lenny) Released&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>A Capistrano task to install Ruby 1.9.1 to &#8220;<strong>/opt/ruby-1.9.1</strong>&#8221; on Debian:<br />
<span id="more-434"></span><br />
<script src="http://gist.github.com/122553.js"></script></p>
<p>With this task, you can quickly upgrade all your Debian machines to Ruby 1.9.1 without having to go through the process each time. Just:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">cap ruby:install_19</pre></div></div>



<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2009/02/debian-50-lenny-released/' rel='bookmark' title='Permanent Link: Debian 5.0 (Lenny) Released'>Debian 5.0 (Lenny) Released</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/06/let-capistrano-compile-ruby-19-for-you/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/06/let-capistrano-compile-ruby-19-for-you/</feedburner:origLink></item>
		<item>
		<title>Dead Simple Rails Deployment</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/rvBSHG54S58/</link>
		<comments>http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/#comments</comments>
		<pubDate>Sun, 31 May 2009 22:45:28 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[passenger]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=399</guid>
		<description>Deploying a Rails app used to suck. Reverse proxies, Mongrel clusters, Monit, etc. Capistrano helped out a lot (once you set it up the first time), but all in all the process was still pretty painful.
Thankfully, a couple of technologies have come along and made my deployment process a whole lot easier.


Passenger
This was the big [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/05/git-clone-pull-without-changing-directories/' rel='bookmark' title='Permanent Link: git clone &amp;#038; pull without changing directories'&gt;git clone &amp;#038; pull without changing directories&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/05/rename-a-gitosis-repository/' rel='bookmark' title='Permanent Link: Rename A Gitosis Repository'&gt;Rename A Gitosis Repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/08/date-range-goodies-in-rails/' rel='bookmark' title='Permanent Link: Date Range Goodies in Rails'&gt;Date Range Goodies in Rails&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>Deploying a Rails app used to suck. Reverse proxies, Mongrel clusters, Monit, etc. <a href="http://www.capify.org/">Capistrano</a> helped out a lot (once you set it up the first time), but all in all the process was still pretty painful.</p>
<p>Thankfully, a couple of technologies have come along and made my deployment process a whole lot easier.<br />
<span id="more-399"></span></p>
<ol>
<li><a href="http://modrails.com/">Passenger</a></li>
<p>This was the big one. The <a href="http://www.phusion.nl/">Phusion</a> guys&#8217; &#8220;Hello World&#8221; app (as they called it) has really had a positive impact on the Rails community, and me personally. Suddenly my Rails (and Rack) web apps are first class citizens to Apache (and Nginx), which means I can just point a virtual host at the public directory and go. I had almost forgotten how good it feels to just drop some files in a directory and have Apache serve them.</p>
<li><a href="http://git-scm.com">Git</a></li>
<p>Ok, so maybe Subversion allows a similar workflow, but for some reason Git is one of those tools that is so much fun to use that it makes me think of <a href="/2009/05/git-informed-when-your-site-is-hacked/">different ways</a> I can use it.
</ol>
<h2>My Flow</h2>
<p>How I deploy these days (when I&#8217;m not deploying to <a href="/2009/05/3-reasons-why-heroku-is-a-game-changer/">Heroku</a>) is dead simple. I host my private Git repos using <a href="http://eagain.net/gitweb/?p=gitosis.git;a=summary">Gitosis</a>, but the same would work with <a href="http://github.com">GitHub</a> or any Git server.</p>
<h3>Initial Setup</h3>
<ol>
<li>Clone the repository on production server.</li>
<li>Create database.yml and any other production-specific configs</li>
<li>Configure an Apache virtual host pointing to &#8220;public&#8221; folder of the repository</li>
</ol>
<h3>Deploys</h3>
<ol>
<li><strong>locally:</strong>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">git push origin master</pre></div></div>

</li>
<li><strong>remotely:</strong>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">git pull origin master &amp;&amp; touch tmp/restart.txt</pre></div></div>

</li>
</ol>
<p>I know what you&#8217;re thinking, &#8220;Wow, that <em>is</em> dead simple&#8221;. It&#8217;s even easier by using Capistrano to execute the remote commands. Here is an example Capistrano task from one of my Rails apps:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">task <span style="color:#ff3333; font-weight:bold;">:deploy</span>, <span style="color:#ff3333; font-weight:bold;">:roles</span>  <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:production</span> <span style="color: #000; font-weight: bold;">do</span>
  <span style="color: #0086B3;">system</span> <span style="color: #ff2806;">&quot;git push origin master&quot;</span>
  cmd = <span style="color:#006600; font-weight:bold;">&#91;</span> <span style="color: #ff2806;">&quot;cd #{root_dir}&quot;</span>, <span style="color: #ff2806;">&quot;git pull&quot;</span>, <span style="color: #ff2806;">&quot;touch tmp/restart.txt&quot;</span> <span style="color:#006600; font-weight:bold;">&#93;</span>
  run cmd.<span style="color: #0086B3;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #ff2806;">&quot; &amp;&amp; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color: #000; font-weight: bold;">end</span></pre></div></div>

<p>This task can be extended to automatically install required gems, update Git submodules, migrate the database, and so on.</p>
<h3>Other Benefits</h3>
<p>Besides the simplicity and ease of deployment in this process, I have also enjoyed the ability to make edits in production and pull them back in to my development environment. And because my production environment has a complete history of code changes, it is trivial to revert commits that cause major problems.</p>
<p>This work flow is by no means a panacea. How do you handle deployment?</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2008/05/git-clone-pull-without-changing-directories/' rel='bookmark' title='Permanent Link: git clone &#038; pull without changing directories'>git clone &#038; pull without changing directories</a></li><li><a href='http://blog.jerodsanto.net/2009/05/rename-a-gitosis-repository/' rel='bookmark' title='Permanent Link: Rename A Gitosis Repository'>Rename A Gitosis Repository</a></li><li><a href='http://blog.jerodsanto.net/2008/08/date-range-goodies-in-rails/' rel='bookmark' title='Permanent Link: Date Range Goodies in Rails'>Date Range Goodies in Rails</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/</feedburner:origLink></item>
		<item>
		<title>Rename A Gitosis Repository</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/c76eKtmHXRw/</link>
		<comments>http://blog.jerodsanto.net/2009/05/rename-a-gitosis-repository/#comments</comments>
		<pubDate>Thu, 28 May 2009 12:49:36 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[gitosis]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=403</guid>
		<description>I use gitosis for private git repository hosting (and it&amp;#8217;s awesome). If you are interested, this great tutorial will walk you through setting it up yourself.
I recently needed to rename one of my repositories and couldn&amp;#8217;t find any info on how to do it, so here is a walk-thru. I will demonstrate the steps of [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/' rel='bookmark' title='Permanent Link: Dead Simple Rails Deployment'&gt;Dead Simple Rails Deployment&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>I use <a href="http://eagain.net/gitweb/?p=gitosis.git;a=summary">gitosis</a> for private git repository hosting (and it&#8217;s awesome). If you are interested, this<a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way"> great tutorial</a> will walk you through setting it up yourself.</p>
<p>I recently needed to rename one of my repositories and couldn&#8217;t find any info on how to do it, so here is a walk-thru. I will demonstrate the steps of renaming a repository called &#8220;<strong>tk</strong>&#8221; to &#8220;<strong>show-time</strong>&#8220;.</p>
<ol>
<li>Rename project in gitosis.conf and push changes</li>
<p>Before:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">[group main]
writable = tk</pre></div></div>

<p>After:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">[group main]
writable = show-time</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">git push origin master</pre></div></div>

<li>Connect to gitosis server and rename correct folder</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">cd /home/git/repositories
mv tk show-time</pre></div></div>

<li>Change the remote reference in all repository clones</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">cd /src/show-time
git remote rm origin
git remote add origin git@example-git-server.com:show-time.git</pre></div></div>

</ol>
<p>Done and done.</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/' rel='bookmark' title='Permanent Link: Dead Simple Rails Deployment'>Dead Simple Rails Deployment</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/05/rename-a-gitosis-repository/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/05/rename-a-gitosis-repository/</feedburner:origLink></item>
		<item>
		<title>3 Reasons Why Heroku is a Game Changer</title>
		<link>http://feedproxy.google.com/~r/nomeanblog/~3/9eSs_HZnfFQ/</link>
		<comments>http://blog.jerodsanto.net/2009/05/3-reasons-why-heroku-is-a-game-changer/#comments</comments>
		<pubDate>Tue, 26 May 2009 09:55:19 +0000</pubDate>
		<dc:creator>Jerod</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[opinion]]></category>

		<guid isPermaLink="false">http://blog.jerodsanto.net/?p=379</guid>
		<description>For the uninitiated, Heroku is a &amp;#8220;cloud&amp;#8221; (hate that term) hosting service for Ruby applications. Their claim, which I believe they have substantiated, is to be an &amp;#8220;instant ruby platform&amp;#8221; and their success changes the game. Here is why.

1) Microwavesque Deployment
When Heroku claims that you can deploy your Ruby app instantly, they&amp;#8217;re pretty much not [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/' rel='bookmark' title='Permanent Link: Dead Simple Rails Deployment'&gt;Dead Simple Rails Deployment&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2008/05/git-clone-pull-without-changing-directories/' rel='bookmark' title='Permanent Link: git clone &amp;#038; pull without changing directories'&gt;git clone &amp;#038; pull without changing directories&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://blog.jerodsanto.net/2009/04/new-gem-rack-noie6/' rel='bookmark' title='Permanent Link: New Gem: Rack-noIE6'&gt;New Gem: Rack-noIE6&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</description>
			<content:encoded><![CDATA[<p>For the uninitiated, <a href="http://heroku.com">Heroku</a> is a &#8220;cloud&#8221; (hate that term) hosting service for Ruby applications. Their claim, which I believe they have substantiated, is to be an &#8220;<strong>instant ruby platform</strong>&#8221; and their success changes the game. Here is why.<br />
<span id="more-379"></span></p>
<h3>1) Microwavesque Deployment</h3>
<p>When Heroku claims that you can deploy your Ruby app instantly, they&#8217;re pretty much not exaggerating. Seriously, you should try it. It&#8217;s so fast I had to ignore my spell-checker and describe it as microwavesque. Remember when microwaves first hit the scene and people couldn&#8217;t believe how fast they could &#8220;deploy&#8221; a meal? Yah me either, but the microwave changed the game big time.</p>
<p>If you haven&#8217;t tried deploying a Rails app to Heroku, just go do it. Here are the steps from start to finish:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">rails myapp
 cd myapp
 git init
 git add .
 git commit -m &quot;my new app&quot;
 heroku create myapp
 git push heroku master</pre></div></div>

<p>If that looks like too much work for you, have Remi walk you through it in <a href="http://remi.org/2009/04/23/deploying-rails-and-rack-applications-to-heroku.html">this nice screencast</a>.</p>
<h3>2) Drag To Scale</h3>
<p>Scaling is a problem we all want to have, but few of us do. The rest of us spend way too much time thinking about it. With Heroku&#8217;s architecture, you don&#8217;t have to think about scaling. You just do it. If you&#8217;re fortunate enough to have your app featured on TechCrunch, Slashdot, Digg, HN, Reddit, etc, etc, you simply log in to the Heroku admin panel and &#8220;crank your dynos&#8221; (love that term) to handle the load. How do you do that? By dragging a little bar vertically. How&#8217;s that for a learning curve?</p>
<p><a href="http://blog.jerodsanto.net/wp-content/uploads/2009/05/dyno.png"><img src="http://blog.jerodsanto.net/wp-content/uploads/2009/05/dyno-189x300.png" alt="dyno" title="dyno" width="189" height="300" class="aligncenter size-medium wp-image-381" /></a></p>
<p>Note: This isn&#8217;t the only way to ensure your app scales. You should still optimize your code for performance, but Heroku takes care of all the server configuration (compression, caching, memory allocation, etc) and you just ask for more power when you need it.</p>
<h3>3) Rack Support</h3>
<p>Heroku isn&#8217;t just a Rails platform, it&#8217;s a Ruby platform. They support any <a href="http://rack.rubyforge.org/">Rack-enabled</a> Ruby app. Check out how many Ruby web frameworks have Rack adapters:</p>
<ul>
<li>Camping</li>
<li>Coset</li>
<li>Halcyon</li>
<li>Mack</li>
<li>Maveric</li>
<li>Merb</li>
<li>Racktools::SimpleApplication</li>
<li>Ramaze</li>
<li>Ruby on Rails</li>
<li>Rum</li>
<li>Sinatra</li>
<li>Sin</li>
<li>Vintage</li>
<li>Waves</li>
<li>Wee</li>
</ul>
<p>That&#8217;s a long frickin&#8217; list! Developers can pick the right tool for their need (or write their own Rack-enabled app) and not have to worry about deployment gotchas.</p>
<p>For example, I wanted a way to quickly resolve the public IP address of any machine I&#8217;m using (including servers) so I wrote <a href="http://my-ip.heroku.com">and deployed</a> this trivial Sinatra app in less than 5 minutes.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color: #6F6F6F;"># public_ip.rb</span>
<span style="color: #0086B3;">require</span> <span style="color: #ff2806;">'rubygems'</span>
<span style="color: #0086B3;">require</span> <span style="color: #ff2806;">'sinatra'</span>
&nbsp;
get <span style="color: #ff2806;">'/'</span> <span style="color: #000; font-weight: bold;">do</span>
  raw = <span style="color:#0066ff; font-weight:bold;">@request</span>.<span style="color: #0086B3;">env</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color: #ff2806;">&quot;REMOTE_ADDR&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  raw.<span style="color: #0086B3;">match</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/</span>^<span style="color:#006600; font-weight:bold;">&#40;</span>\d<span style="color:#006600; font-weight:bold;">+</span>\.\d<span style="color:#006600; font-weight:bold;">+</span>\.\d<span style="color:#006600; font-weight:bold;">+</span>\.\d<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span>,?<span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#0066ff; font-weight:bold;">@ip</span> = $<span style="color:#006666;">1</span>
  haml <span style="color: #ff2806;">'=@ip'</span>
<span style="color: #000; font-weight: bold;">end</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color: #6F6F6F;"># config.ru</span>
<span style="color: #0086B3;">require</span> <span style="color: #ff2806;">'public_ip.rb'</span>
run <span style="color:#6666ff; font-weight:bold;">Sinatra::Application</span></pre></div></div>

<p>The rackup file (config.ru) tells Heroku to use Sinatra to run my application. Rails would have been overkill for this, don&#8217;t you think? (Heck, Sinatra may be overkill too. You could probably write a raw Rack application in even fewer LOC, post in the comments if you have a better solution).</p>
<p><strong>UPDATE:</strong> Blake Mizerany provided a few shorter examples <a href="http://gist.github.com/118217">here</a>.</p>
<h3>So</h3>
<p>What Heroku offers Ruby web developers is instant deployment, fast &#038; easy scaling, and vast tool selection. Now we can concentrate on building our applications and forget the tedious deployment and server administration tasks that used to strangle our productivity. We can deploy fast, scale quickly, and adjust to circumstance as needs arise. The game is changing, and Heroku (and others like them) are changing it.</p>
<p><strong>**disclaimer**</strong><br />
I am only affiliated with Heroku as a customer, and receive no recompense from the ridiculous amount of props I&#8217;m throwing their way. They do have a few drawbacks, one that is a show stopper for many apps, which I will detail in a future post.</p>


<p>Related posts:<ol><li><a href='http://blog.jerodsanto.net/2009/05/dead-simple-rails-deployment/' rel='bookmark' title='Permanent Link: Dead Simple Rails Deployment'>Dead Simple Rails Deployment</a></li><li><a href='http://blog.jerodsanto.net/2008/05/git-clone-pull-without-changing-directories/' rel='bookmark' title='Permanent Link: git clone &#038; pull without changing directories'>git clone &#038; pull without changing directories</a></li><li><a href='http://blog.jerodsanto.net/2009/04/new-gem-rack-noie6/' rel='bookmark' title='Permanent Link: New Gem: Rack-noIE6'>New Gem: Rack-noIE6</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.jerodsanto.net/2009/05/3-reasons-why-heroku-is-a-game-changer/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://blog.jerodsanto.net/2009/05/3-reasons-why-heroku-is-a-game-changer/</feedburner:origLink></item>
	</channel>
</rss>
