<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>sam.github.com</title>
 
 <link href="http://sam.github.com/" />
 <updated>2012-01-26T19:03:31-08:00</updated>
 <id>http://sam.github.com</id>
 <author>
   <name>Sam Smoot</name>
   <email>ssmoot@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ssmoot" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="ssmoot" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Blog</title>
   <link href="http://sam.github.com/blog" />
   <updated>2012-01-26T00:00:00-08:00</updated>
   <id>http://sam.github.com/blog</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve got some server maintenance at midnight tonight. In the mean-time I&amp;#8217;m up here at work twiddling my thumbs with three hours to go. Yeah, there&amp;#8217;s work things I could be doing, but I&amp;#8217;ve already put in more than a full day and I&amp;#8217;ve got a cold. :-p&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve looked at &lt;a href="http://news.ycombinator.com"&gt;HackerNews&lt;/a&gt; already.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;m going to do something. Write some code.&lt;/p&gt;
&lt;p&gt;I like Jekyll. Mostly. It&amp;#8217;s just that the whole pull, type-out-an-awkward-filename, write some &lt;span class="caps"&gt;YAML&lt;/span&gt;, write some textile, commit, push dance is enough of a speed bump that I don&amp;#8217;t post enough. At least that&amp;#8217;s my excuse.&lt;/p&gt;
&lt;p&gt;So I&amp;#8217;m going to try my hand at whipping up a blog. There&amp;#8217;s lots of things I could write it in. &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt; is something I&amp;#8217;ve been meaning to give a go. &lt;a href="http://agentzh.blogspot.com/2012/01/ngxopenresty-stable-version-101024.html"&gt;ngx_openresty&lt;/a&gt; looks &lt;em&gt;really&lt;/em&gt; interesting. But for tonight I&amp;#8217;ll see what I can accomplish in three hours and stick with Ruby. I could go with &lt;a href="http://github.com/wiecklabs/harbor"&gt;Harbor&lt;/a&gt;, but I like Sinatra&amp;#8217;s router, and I think this is something I can manage in a single &amp;#8220;controller&amp;#8221; so I&amp;#8217;m going to give that a shot. I could persist to PostgreSQL and &lt;a href="http://sequel.rubyforge.org/"&gt;Sequel&lt;/a&gt; which is always a winning combination. But I think I&amp;#8217;ll go with Redis this time around. It&amp;#8217;s fast, and ought to suit the blog-post format well. At least initially. Not sure of the best fit, but I&amp;#8217;ll try a key for each post, and a List to track/retrieve them.&lt;/p&gt;
&lt;p&gt;Follow along &lt;a href="https://github.com/sam/blog"&gt;here&lt;/a&gt;, and with any luck I&amp;#8217;ll have something in the next few hours. :-)&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve got a disused Linode instance already, so if it works out, I&amp;#8217;ll deploy, update &lt;span class="caps"&gt;DNS&lt;/span&gt; and we&amp;#8217;ll see how it takes.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>My Biggest Shell Project</title>
   <link href="http://sam.github.com/my-biggest-shell-project" />
   <updated>2012-01-19T00:00:00-08:00</updated>
   <id>http://sam.github.com/my-biggest-shell-project</id>
   <content type="html">&lt;p&gt;&amp;#8216;Tis &lt;strong&gt;Bash&lt;/strong&gt; really. Because it&amp;#8217;s the default, or easy to get on FreeBSD, OpenBSD, &lt;span class="caps"&gt;OSX&lt;/span&gt;, Ubuntu and Solaris.&lt;/p&gt;
&lt;script src="https://gist.github.com/1644593.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;So how many lines is it?&lt;/p&gt;
&lt;p style="font-size:80px;color:#8af;text-align:center;"&gt;18,865&lt;/p&gt;
&lt;p&gt;Yes. I wrote this post just for that. Vanity. Sue me. ;-)&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a big collection of scripts to automate server configuration. It spans the gamut from compiling NGinx, to configuring &lt;span class="caps"&gt;LACP&lt;/span&gt; on FreeBSD, to generating HAProxy entries, to cloning git repositories and mounting &lt;span class="caps"&gt;NFS&lt;/span&gt; shares. Pretty much anything you&amp;#8217;d need to web-servers, load-balance them, setup replicated database servers, etc is in there.&lt;/p&gt;
&lt;p&gt;Why not &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt; or &lt;a href="http://puppetlabs.com/"&gt;Puppet&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Because they&amp;#8217;re complex. :-) Force yourself to learn shell-scripting, and soon enough you can fire off a script like the Github Migration in the previous post in a few minutes, saving days of manual labor when you&amp;#8217;re migrating over &lt;strong&gt;100&lt;/strong&gt; projects. You might be surprised at just how often you use it. I couldn&amp;#8217;t imagine doing half of what I used to do manually or with Ruby now.&lt;/p&gt;
&lt;p&gt;I mean, Ruby is great in many many ways. But it&amp;#8217;s no substitute for being able to fire off a quick for-loop right where your cursor is &lt;em&gt;now&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So if you decide to tackle one new language this year, and you spend a fair about of time on *nix or *bsd like systems, I heartily recommend Bash.&lt;/p&gt;
&lt;p&gt;By the way, I named that system&amp;#8217;s administration project after &lt;a href="http://www.oskarblues.com/the-brews/gubna"&gt;this beer&lt;/a&gt;. &lt;em&gt;Gubna&lt;/em&gt;. ;-)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Migrating to Github</title>
   <link href="http://sam.github.com/migrating-to-github" />
   <updated>2012-01-19T00:00:00-08:00</updated>
   <id>http://sam.github.com/migrating-to-github</id>
   <content type="html">&lt;p&gt;There&amp;#8217;s probably thousands of ways to do this out there, but here&amp;#8217;s mine. A quick little shell script I wrote up to migrate a repository from a local gem-server up to a &lt;a href="http://github.com"&gt;Github&lt;/a&gt; Organization, including your branches and tags. If you give it your login details it&amp;#8217;ll create the remote repository if it doesn&amp;#8217;t already exist.&lt;/p&gt;
&lt;script src="https://gist.github.com/1635893.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Once you tweak the exported variables at the top, you call it like so: &lt;code&gt;moveit my_repository_name&lt;/code&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>ls Filters</title>
   <link href="http://sam.github.com/ls-filters" />
   <updated>2012-01-19T00:00:00-08:00</updated>
   <id>http://sam.github.com/ls-filters</id>
   <content type="html">&lt;p&gt;Just a quick note. You might sometimes find yourself wanting to filter a list of files on your system. We&amp;#8217;ll use a clone of this blog for an example. You could use &lt;code&gt;grep&lt;/code&gt;:&lt;/p&gt;
&lt;script src="https://gist.github.com/1642129.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Regexps are obviously very powerful, and I often use something similar in my own scripts.&lt;/p&gt;
&lt;p&gt;For simple cases like this however, you might want to get familiar with the built-in Bash wildcards:&lt;/p&gt;
&lt;script src="https://gist.github.com/1642114.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Quick and easy. Hope you find it useful.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SmartOS Setup</title>
   <link href="http://sam.github.com/smartos-setup" />
   <updated>2012-01-16T00:00:00-08:00</updated>
   <id>http://sam.github.com/smartos-setup</id>
   <content type="html">&lt;p&gt;Here we&amp;#8217;re going to go over the basics of getting the latest &lt;a href="http://wiki.smartos.org/display/DOC/Download+SmartOS"&gt;SmartOS release&lt;/a&gt; (January 12, 2012 as of this post) running. Here&amp;#8217;s a screen-cast for the video inclined, but I&amp;#8217;ll also provide all the tweaky bits with some more detail below so you can follow along at home.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll need an &lt;strong&gt;Intel&lt;/strong&gt; &lt;span class="caps"&gt;CPU&lt;/span&gt; with the &lt;strong&gt;VT-x&lt;/strong&gt; extensions assuming you want to use &lt;span class="caps"&gt;KVM&lt;/span&gt; virtualization on SmartOS as it doesn&amp;#8217;t support &lt;span class="caps"&gt;AMD&lt;/span&gt; CPUs. You&amp;#8217;ll get VT-x support on any 2nd Gen i3 processor, the i5 or i7 processors, or a Nehalem or later Xeon. This should cover most any Intel system you might have at your office as long as it&amp;#8217;s not more than a couple years old. You can find out for sure on &lt;a href="http://ark.intel.com/VTList.aspx"&gt;Intel&amp;#8217;s Virtualization Technology List page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not already familiar with &lt;span class="caps"&gt;ZFS&lt;/span&gt;, I&amp;#8217;d suggest downloading the latest &lt;a href="http://freebsd.org"&gt;FreeBSD&lt;/a&gt;, running it under VirtualBox, and playing around with it there. For 99% of what you&amp;#8217;ll be doing, aside from standard device-name conventions for disks, it&amp;#8217;ll be identical to what you&amp;#8217;ll be doing in SmartOS. You might also want to buff up on the &lt;a href="http://en.wikipedia.org/wiki/ZFS"&gt;Wikipedia article on &lt;span class="caps"&gt;ZFS&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For everyone else, on with the show!&lt;/p&gt;
&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ZLcJb1u0yKQ&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/ZLcJb1u0yKQ&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;h3&gt;Single Disk Configurations&lt;/h3&gt;
&lt;p&gt;First, an issue with SmartOS configuration common to all installations. &lt;strong&gt;No swap is created.&lt;/strong&gt; If you create a &lt;em&gt;zones/swap&lt;/em&gt; device, it&amp;#8217;ll be used automatically at boot. The device should be a &lt;em&gt;zvol&lt;/em&gt;, the same size as your physical memory. So in my case:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622208.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;The &lt;em&gt;primarycache&lt;/em&gt; setting is your &lt;span class="caps"&gt;ZFS&lt;/span&gt; Adaptive Read Cache (in-memory cache). It obviously doesn&amp;#8217;t make sense to cache data stored on a swap device since if you had memory to cache it, you&amp;#8217;d be better served using that memory for the data directory instead of pushing it out to disk.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;secondarycache&lt;/em&gt; is the &lt;span class="caps"&gt;ZFS&lt;/span&gt; L2ARC, ie: a cache device (&lt;span class="caps"&gt;SSD&lt;/span&gt;) attached to the pool. Again, caching swap doesn&amp;#8217;t really make much sense, so make sure that it&amp;#8217;s not.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve seen it mentioned on &lt;span class="caps"&gt;IRC&lt;/span&gt; that disabling the caches for swap is automatic, but without confirmation, so no harm in making sure.&lt;/p&gt;
&lt;h3&gt;Multiple Disk Configurations&lt;/h3&gt;
&lt;p&gt;Now we move onto multi-disk configurations. If this is you, then hold off on adding the swap above. We&amp;#8217;ll get around to it in a bit after a few other things. The SmartOS configuration script has a bug that ignores extra disks you pass it. It&amp;#8217;ll only use the first.&lt;/p&gt;
&lt;p&gt;On our staging system we have a &lt;span class="caps"&gt;JBOD&lt;/span&gt; with 24 drives on it, and 3 drives in the server itself. We want to use that &lt;span class="caps"&gt;JBOD&lt;/span&gt; for our &lt;em&gt;zones&lt;/em&gt; zpool. Because &lt;strong&gt;you can&amp;#8217;t remove a top-level vdev in &lt;span class="caps"&gt;ZFS&lt;/span&gt;&lt;/strong&gt;, you&amp;#8217;re in a bit of a pickle though. If you use one of those disks right off the bat, you won&amp;#8217;t be able to get the end result/configuration you want. &lt;strong&gt;Unless&lt;/strong&gt; the disk you use is ultimately intended to be a spare as you can add/remove those at will.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;So if you&amp;#8217;ve already configured SmartOS, you want a redundant multi-disk configuration (mirrored, raidz, etc) and you don&amp;#8217;t have a spare disk, this is probably where you stop and go dig up some old disks you can temporarily use while we shuffle things around.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve already configured your install, and you chose one of the disks you ultimately want to use in your pool, then you&amp;#8217;ll need to delete it, and reconfigure it to use one of your spare disks instead.&lt;/p&gt;
&lt;p&gt;The easiest way to blow the pool away so you can get back to the configuration is to run the &lt;code&gt;format&lt;/code&gt; command, and blow away the partition on the disk with fdisk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Making Things Complicated:&lt;/strong&gt; As an alternative to the fdisk/reboot, you could swap out the disk by adding your spare as a mirror, then removing the original disk like so:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622225.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Once that&amp;#8217;s done and your running setup is on a spare disk, we can continue.&lt;/p&gt;
&lt;p&gt;First up, you can&amp;#8217;t configure a dump device on your pool if:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;It&amp;#8217;s going to include log or cache devices&lt;/li&gt;
	&lt;li&gt;If it&amp;#8217;s going to span multiple raidz vdevs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So you&amp;#8217;re going to want to dedicate a raw physical device. As an aside, because of an issue in a critical service (&lt;code&gt;vmadmd&lt;/code&gt;) when you have more than one zpool, you can&amp;#8217;t put the dump device on a secondary pool. You&amp;#8217;re going to want to make sure your system only has the &amp;#8220;zones&amp;#8221; pool when all is said and done, so that&amp;#8217;s why we use a raw device here.&lt;/p&gt;
&lt;script src="https://gist.github.com/1622239.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;You can&amp;#8217;t use this device for anything now else mind you. So in the multi-disk setup you need:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;The initial disk you&amp;#8217;ll install to (this could be a device you don&amp;#8217;t intend to use, or it could ultimately be intended to be add to the pool as a spare)&lt;/li&gt;
	&lt;li&gt;The disk for the dump device&lt;/li&gt;
	&lt;li&gt;The disk(s) for your multi-device &amp;#8220;zones&amp;#8221; zpool&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now we&amp;#8217;ll create the multi-device zpool that we&amp;#8217;ll eventually turn into our &amp;#8220;zones&amp;#8221; zpool:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622242.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Note, this is a &lt;span class="caps"&gt;JBOD&lt;/span&gt; in my case. Each of these is a 1TB 7200RPM disk, so this will create about 15TB of usable space after subtracting the spares (3TB) and parity (6TB).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;#8217;s really a bit of a silly setup for a production VM host.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you need that much storage for guest content, it should probably be on &lt;span class="caps"&gt;NFS&lt;/span&gt; or something so you can eventually have redundant, load-balanced guests. If you needed it for performance, you&amp;#8217;d use smaller, higher-&lt;span class="caps"&gt;RPM&lt;/span&gt; disks in conjunction with SSDs.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m just using this setup here because this is a host for our non-production staging sites. By comparison the production setup consists of twelve 10,000RPM 300GB disks (two of those reserved for spares, and the other ten split into two raidz sets), two mirrored 50GB SSDs for log devices, and one 100GB &lt;span class="caps"&gt;SSD&lt;/span&gt; as a L2ARC cache device. A lot less storage space, but a lot more performance (and guest &lt;em&gt;content&lt;/em&gt; is on &lt;span class="caps"&gt;NFS&lt;/span&gt; anyway, this is just for OS installs, swap, logs, etc). When you&amp;#8217;re running a lot of VMs, disk IO performance is going to be pretty high up there when it comes to keeping things snappy.&lt;/p&gt;
&lt;p&gt;So now we have our &amp;#8220;backup&amp;#8221; zpool. Let&amp;#8217;s replicate our data to it:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622261.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Now that our dump device is off of the &amp;#8220;zones&amp;#8221; pool, and we&amp;#8217;ve backed up our install, we can delete it:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622264.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Finally, we&amp;#8217;ll export our &amp;#8220;backup&amp;#8221; pool, and reimport it with the &amp;#8220;zones&amp;#8221; name:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622268.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;If the disk for the original configure-time &amp;#8220;zones&amp;#8221; pool was intended as a spare, and you had left it off earlier in the &lt;code&gt;zpool create backup&lt;/code&gt; since it was in-use, now is when you&amp;#8217;d add it back:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622273.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Now we&amp;#8217;ll loop back around to the issue we mentioned at the beginning, and create the swap device that the configuration script missed creating for us:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622208.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Finally your zpool is how you wanted it. All disks where they belong, and a dedicated dump device humming along. Go ahead and reboot now to ensure everything&amp;#8217;s properly mounted, and afterwards ensure that &lt;code&gt;swap -l&lt;/code&gt; lists your swap device and &lt;code&gt;dumpadm&lt;/code&gt; displays your dedicated device.&lt;/p&gt;
&lt;p&gt;If you run a &lt;code&gt;zfs list&lt;/code&gt; you&amp;#8217;ll probably notice that the backup retained a &lt;em&gt;zones/dump&lt;/em&gt; file-system. That&amp;#8217;s no longer used since we moved it to a dedicated device, so let&amp;#8217;s do a little house-cleaning and delete it:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622281.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Ultimately we&amp;#8217;ve ended up with something like this:&lt;/p&gt;
&lt;script src="https://gist.github.com/1622279.js?file=gistfile1.sh"&gt;&lt;/script&gt;&lt;p&gt;Now you&amp;#8217;re ready to rock, creating your own base image, and provisioning new guests. You&amp;#8217;ll find help on that in the SmartOS wiki article: &lt;a href="http://wiki.smartos.org/display/DOC/How+to+create+a+Virtual+Machine+in+SmartOS"&gt;How to create a Virtual Machine in SmartOS&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SmartOS Enhancements</title>
   <link href="http://sam.github.com/smartos-enhancements" />
   <updated>2012-01-16T00:00:00-08:00</updated>
   <id>http://sam.github.com/smartos-enhancements</id>
   <content type="html">&lt;p&gt;Here&amp;#8217;s a list of things, in no particular order, I&amp;#8217;d like to see in SmartOS:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FIX&lt;/span&gt;: Create zones/swap during configuration&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FIX&lt;/span&gt;: Create raidz vdevs during configuration (pending pull request: https://github.com/joyent/smartos-overlay/pull/4)&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;ENHANCEMENT&lt;/span&gt;: Provide ability to specify dump device&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;ENHANCEMENT&lt;/span&gt;: Provide ability to define &amp;#8220;aggr&amp;#8221; (&lt;span class="caps"&gt;LACP&lt;/span&gt;) interface during configuration&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;FIX&lt;/span&gt; (low priority): Patch vmadmd/sysinfo to allow multiple zpools&lt;/li&gt;
	&lt;li&gt;&lt;span class="caps"&gt;DOCUMENTATION&lt;/span&gt;: /opt/custom examples and use-cases&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&amp;#8217;s about it off the top of my head. Most of these things have work-arounds. I wouldn&amp;#8217;t consider any of them blocking issues, but they&amp;#8217;re the things I most frequently run into. If I find the time I&amp;#8217;d like to contribute back. Most of these appear to just require a little scripting knowledge, and maybe a bit of node.js.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>GeminaboxPlus</title>
   <link href="http://sam.github.com/geminaboxplus" />
   <updated>2012-01-13T00:00:00-08:00</updated>
   <id>http://sam.github.com/geminaboxplus</id>
   <content type="html">&lt;p&gt;I just released a quick project to help you get quickly started running your own local Gem server. It&amp;#8217;s faster than going out to Gemcutter all the time when you&amp;#8217;re bundling a project and you can keep private gems private. The Gemcutter project itself assumes Amazon S3 integration, so &lt;a href="https://github.com/cwninja/geminabox"&gt;Geminabox&lt;/a&gt; is really a better fit for most local installations I think.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/sam/geminaboxplus"&gt;GeminaboxPlus&lt;/a&gt; is just a default app for Geminabox &lt;strong&gt;with a patch to move reindexing offline to a &lt;a href="https://github.com/defunkt/resque"&gt;Resque&lt;/a&gt; worker&lt;/strong&gt;. Geminabox is great on it&amp;#8217;s own, and easy to setup; it&amp;#8217;s only real weakness is when you have a lot of Gems (we&amp;#8217;ve got ~2400 on our system at the office) because then reindexing takes quite awhile.&lt;/p&gt;
&lt;p&gt;How do you get to 2400 Gems? You push everything you need for your projects to your own Gem server. ;-) That way you don&amp;#8217;t have to worry about gems you depend on dissapearing at some point in the future, and you don&amp;#8217;t need to source http://gemcutter.org in your Gemfiles so your &lt;code&gt;bundle install&lt;/code&gt;s are much quicker.&lt;/p&gt;
&lt;p&gt;With this you can have a solid setup going in just a few minutes. If you want to increase your project&amp;#8217;s Bundler performance, or could use a private Gem server, there&amp;#8217;s really no excuse not to just clone and fire up your own. :-)&lt;/p&gt;
&lt;p&gt;The &lt;span class="caps"&gt;README&lt;/span&gt; has the full details, but if you want the 2-minute-and-running version I&amp;#8217;ve copy/pasted the meat here:&lt;/p&gt;
&lt;script src="https://gist.github.com/1607465.js?file=gistfile1.sh"&gt;&lt;/script&gt;</content>
 </entry>
 
 <entry>
   <title>SmartOS Guest Provisioning</title>
   <link href="http://sam.github.com/smartos-guest-provisioning" />
   <updated>2012-01-12T00:00:00-08:00</updated>
   <id>http://sam.github.com/smartos-guest-provisioning</id>
   <content type="html">&lt;p&gt;Here&amp;#8217;s a quick screen-cast demonstrating provisioning in SmartOS. I restarted a dozen times to try to keep from rambling. ;-)&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re new to SmartOS you can start here: &lt;a href="http://smartos.org"&gt;http://smartos.org&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This demonstration assumes you already have a base image setup that you&amp;#8217;re happy with, and you&amp;#8217;re ready to go to town cloning up new Guests based on it.&lt;/p&gt;
&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/AdPMSCp9k1A&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/AdPMSCp9k1A&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>NGinx ModZip</title>
   <link href="http://sam.github.com/nginx-mod_zip" />
   <updated>2012-01-12T00:00:00-08:00</updated>
   <id>http://sam.github.com/nginx-mod_zip</id>
   <content type="html">&lt;p&gt;I had trouble getting NGinx 1.0.11 building under Ubuntu 11.10 yesterday. We use a module called &lt;a href="https://github.com/evanmiller/mod_zip"&gt;ModZip&lt;/a&gt; and it appears &lt;span class="caps"&gt;GCC&lt;/span&gt; 4.6.1 (and maybe Ubuntu&amp;#8217;s default flags for it) has introduced some checks to detect if a variable is defined and set, but then unused. This causes build errors.&lt;/p&gt;
&lt;p&gt;So I dove in to fix it. I&amp;#8217;m not a C developer, so my first attempt messed it up. I removed an iconv call providing a bit of critical functionality because the result wasn&amp;#8217;t used. What I missed was that two pointers were passed within the call. &lt;a href="https://github.com/sam/mod_zip/commit/eb9fa0f532fa2123c2b30c86c99431564178656a"&gt;So here&amp;#8217;s my second attempt&lt;/a&gt;. This one fixes the build, and doesn&amp;#8217;t break anything.&lt;/p&gt;
&lt;p&gt;With this patch I can build everything on &lt;span class="caps"&gt;GCC&lt;/span&gt; 4.6.1 and keep ModZip around, which is critical to many of our projects. Here&amp;#8217;s why:&lt;/p&gt;
&lt;p&gt;ModZip operates similarly to X-Send-File. You might have a fixed, or limited pool of application servers. Especially in a single-threaded environment like most Ruby deployments. So if someone requests to download a 1GB file that&amp;#8217;s not in your web-root you&amp;#8217;d have to tie up an application server for the duration of the download. If the client has a slow connection this could be a good long while. Enough clients request such a download, and your small pool of application servers can quickly be exhausted, effectively causing an unintentional Denial Of Service.&lt;/p&gt;
&lt;p&gt;Instead of this, X-Send-File allows you to set a header that tells the upstream web-server (Apache, NGinx, etc) where the file is that you want to serve, and what name to give it at download time (many of our files are represented by UUIDs internally for example, though we want something friendly and descriptive to be used for downloads). That way your application server is just setting a header and quickly returning back to the pool to serve other requests. The upstream web-server then reads and strips the header, and does the actual sending of the file.&lt;/p&gt;
&lt;p&gt;ModZip is similar, but for (you guessed it!) zip files. You pass multiple paths/filenames in a special header in your application server, and then it, handles creating a zip file and streaming it to the client. While your application server would first need to zip everything up before sending a single byte to the upstream, ModZip can almost immediately begin streaming the zip. This frees up your application server, and ModZip efficiently tackles the rest for you.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a great tool. I definitely recommend it. With this patch, you should have no trouble getting it going in your own NGinx setup.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bootstrapping</title>
   <link href="http://sam.github.com/bootstrapping" />
   <updated>2012-01-08T13:00:00-08:00</updated>
   <id>http://sam.github.com/bootstrapping</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m finally getting around to bootstrapping this site. &lt;a href="http://twitter.github.com/bootstrap/"&gt;Bootstrap&lt;/a&gt; itself seems fairly easy so far. Figuring out the best way to override some of the defaults is going to require an actual bit of reading. It&amp;#8217;s all there at the project home-page I think; I just glossed over it the first time through.&lt;/p&gt;
&lt;p&gt;Reproducing an existing layout is going to take some practice. Otherwise it seems like a nice framework so far. The basic layout didn&amp;#8217;t take any thought about floats, clearing them properly, or any effort at all really. I wonder how well the abstraction holds up with something more complex.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Jekyll and Bootstrap</title>
   <link href="http://sam.github.com/jekyll-and-bootstrap" />
   <updated>2011-12-13T23:08:00-08:00</updated>
   <id>http://sam.github.com/jekyll-and-bootstrap</id>
   <content type="html">&lt;p&gt;Overall I like Jekyll so far. It&amp;#8217;s simple and that counts for a lot. I&amp;#8217;m wondering how I&amp;#8217;ll implement a live-search for the site, but something for the back-burner.&lt;/p&gt;
&lt;p&gt;I really prefer Textile syntax to Markdown, so I&amp;#8217;ll be making that switch &lt;span class="caps"&gt;ASAP&lt;/span&gt;. With this post actually. We&amp;#8217;ll see how that works out.&lt;/p&gt;
&lt;p&gt;Other than that, I want to see about reimplementing this design with &lt;a href="http://twitter.github.com/bootstrap/"&gt;Twitter&amp;#8217;s Bootstrap&lt;/a&gt; framework just to get familiar with it. The markup in this design is actually pretty nice in my opinion, but it&amp;#8217;s an excuse to give Bootstrap a spin.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s about it for tonight. Let&amp;#8217;s push this and see how it looks!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Chocolat to TextMate</title>
   <link href="http://sam.github.com/chocolatapp-to-textmate" />
   <updated>2011-12-13T23:00:00-08:00</updated>
   <id>http://sam.github.com/chocolatapp-to-textmate</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been using &lt;a href="http://chocolatapp.com"&gt;ChocolatApp&lt;/a&gt; for about a month now. It&amp;#8217;s pretty good. I&amp;#8217;m going back to TextMate (1.x) though.&lt;/p&gt;
&lt;h3&gt;Likes&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;Out of the box it&amp;#8217;s prettier, with a standard Drawer, more polished Find&lt;/li&gt;
	&lt;li&gt;The default set of light-on-dark themes feels a little more robust&lt;/li&gt;
	&lt;li&gt;The &amp;#8220;Active&amp;#8221; documents area is a bit more functional than tabs when you&amp;#8217;re jumping around between a lot of files&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Dislikes&lt;/h3&gt;
&lt;ul&gt;
	&lt;li&gt;TextMate will auto outdent standard closing syntax structures for you, like &amp;#8220;end&amp;#8221; in Ruby or &amp;#8220;fi&amp;#8221; in Bash; Chocolat, not so much&lt;/li&gt;
	&lt;li&gt;There is no &amp;#8220;block-comment&amp;#8221; functionality for the Shell Script syntax, which I spend a good bit of time in&lt;/li&gt;
	&lt;li&gt;There is no bundle editor for simple fixes&lt;/li&gt;
	&lt;li&gt;You can&amp;#8217;t tab over to the &amp;#8220;Don&amp;#8217;t Save&amp;#8221; option when closing an unsaved file (I find myself hitting CMD+T a lot inadvertently, which in Chocolat creates a new blank file/tab)&lt;/li&gt;
	&lt;li&gt;It&amp;#8217;s text-selection seems a bit off, doesn&amp;#8217;t respect periods in hostnames for example, so a keyboard OPTION+SHIFT+ARROW highlight more often than not ends up highlighting way too much and you have to bang at the arrow keys a lot to compensate&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regarding the bundle editor, I&amp;#8217;m no tweaker, but it would be nice to fix some of the more glaring oversights, like the lack of a shortcut for the HTML5 doctype snippet in the &lt;span class="caps"&gt;HTML&lt;/span&gt; bundle.&lt;/p&gt;
&lt;p&gt;So for now, until the Chocolat folks sort out some of the issues, I&amp;#8217;m heading back to TextMate. Overall I do think Chocolat is a significant improvement over TextMate in most ways, but the ways in which it falls short are really annoying/distracting.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hello World</title>
   <link href="http://sam.github.com/hello-world" />
   <updated>2011-12-13T22:25:00-08:00</updated>
   <id>http://sam.github.com/hello-world</id>
   <content type="html">&lt;p&gt;This is my first post with Jekyll.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve used &lt;a href="https://github.com/sirupsen/sirupsen.github.com"&gt;sirupsen.github.com&lt;/a&gt; as a design basis for this blog for now. Let&amp;#8217;s see if I can reboot this thing.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>My "Fail Rated" Jeep Grand Cherokee</title>
   <link href="http://sam.github.com/fail-rated-jeep" />
   <updated>2010-12-29T00:00:00-08:00</updated>
   <id>http://sam.github.com/fail-rated-jeep</id>
   <content type="html">&lt;p&gt;Days in the shop/Days owned:&lt;/p&gt;
&lt;p style="font-size: 14em;"&gt;&lt;span style="color: #d22;"&gt;44&lt;/span&gt;/75&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jack at the Zoo" src="/static/images/fail-rated-jeep/jack.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I drove a 2009 Volvo C70 Convertible. I&amp;#8217;ve owned and loved several Volvos. The dealership always treated us right. No complaints. Enter Jack.&lt;/p&gt;
&lt;p&gt;This little guy needed something more family friendly. My wife has a Volvo XC90, which is truly a great family hauler, but it&amp;#8217;s a lease and we were burning through the miles far too quickly. My next car needed to be a purchase so we didn&amp;#8217;t have to worry about lease exits and someday maybe even pay it off. ;-)&lt;/p&gt;
&lt;p&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/1uIBL_ei5VM" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;This commercial got me into the Jeep dealer. No kidding, it&amp;#8217;s the best commercial I&amp;#8217;ve ever seen. After the test-drive I was hooked.&lt;/p&gt;
&lt;h3&gt;October 15th, 2010&lt;/h3&gt;
&lt;p&gt;A couple weeks later my wife, Jack and I were able to make it down to &lt;a title="Dealership Website" href="http://www.dodgecityofmckinney.net/"&gt;Dodge City Dodge&lt;/a&gt;. I spotted a 2011 Jeep Grand Cherokee Laredo X.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jeep at the dealer lot" src="/static/images/fail-rated-jeep/at-the-lot.jpg"&gt;&lt;/p&gt;
&lt;p&gt;It had a V8. Everything I wanted but a sun-roof really. It was kitted out with all the off-roading features. I&amp;#8217;ve never been off-roading before, but the idea of camping with the family, maybe hitting some light trails was exciting. If I was going to give up the Convertible, I was going camping damnit.&lt;/p&gt;
&lt;p&gt;We were comparing against a Volvo XC60 we had already worked out the numbers on with the Volvo dealer. After tacking on the extended warranty to get rental coverage (which we&amp;#8217;d always got from Volvo for free), the Jeep came in a few (within $10) bucks cheaper. We signed the paperwork that evening and went home with our new Jeep.&lt;/p&gt;
&lt;p&gt;So now I was the proud owner of a &lt;strong&gt;2011 Jeep Grand Cherokee Laredo X&lt;/strong&gt;. It had:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Hemi V8&lt;/li&gt;
	&lt;li&gt;Leather&lt;/li&gt;
	&lt;li&gt;Quadra Lift Air-Suspension&lt;/li&gt;
	&lt;li&gt;Quadra Drive II traction-control system&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;October 16th, 2010&lt;/h3&gt;
&lt;p&gt;Camping! The closest &lt;span class="caps"&gt;OHV&lt;/span&gt; (&lt;em&gt;Off-Highway-Vehicle&lt;/em&gt;) park I could find was &lt;a title="Barnwell Mountain Recreation Area" href="http://www.barnwellmountainra.com/"&gt;Barnwell Mountain&lt;/a&gt;. 2-1/2 hours away. My buddy Scott and I loaded up our sons, and hit the road. We got there just after dark. The next morning we drove around on the access roads a bit, looking for the easiest trail we could find.&lt;/p&gt;
&lt;p&gt;At a camp-site just at the mouth of a trail we bumped into a couple friendly guys in an older Land Rover Range Rover, lifted and with some big tires on it. Some of the body panels had seen better days. Clearly the truck had seen some fun. You can just spot it (and one of them standing in front of the Jeep, spotting the trail for us to lead us through) in this picture:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jeep hit the apex" src="/static/images/fail-rated-jeep/jeep-hit-the-apex.jpg"&gt;&lt;/p&gt;
&lt;p&gt;We caught the off-roading bug immediately. Three-wheelin&amp;#8217;, crossing creaky old bridges, the dusty red dirt that turned to paint if you ran across a puddle. It was a blast!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jeep approaching a rut" src="/static/images/fail-rated-jeep/jeep-approach.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Scott traded in his Chevy Silverado and went out and bought a Toyota FJ Cruiser Trail Teams Edition about a month later.&lt;/p&gt;
&lt;h3&gt;October 23rd, 2010&lt;/h3&gt;
&lt;p&gt;The very next weekend, right after Jack&amp;#8217;s swim-class, my wife, Jack and I went out again. It was awesome. A bit brisk Sunday morning, but a bit of coffee to warm us up did the trick.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Camp Smoot" src="/static/images/fail-rated-jeep/camp-smoot.jpg"&gt;&lt;/p&gt;
&lt;p&gt;We went out on the same trails, took &amp;#8216;em a bit better this time. My wife decided she didn&amp;#8217;t care for the off-roading bit. Three wheels on the ground and leans on rutted trails just weren&amp;#8217;t her cup o&amp;#8217; tea. Still, the camping was great.&lt;/p&gt;
&lt;p&gt;Sunday evening a thunderstorm rolled in. Things got a bit sloshy getting out, and the under-carriage was liberally painted with the red dust, but we made it out before the worst of it hit. We stopped by Bodacious &lt;span class="caps"&gt;BBQ&lt;/span&gt; on the way out:&lt;/p&gt;
&lt;div style="text-align: center; margin: auto;"&gt;
&lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=bbq+in+gilmer,+tx&amp;sll=33.157188,-96.716924&amp;sspn=0.015934,0.018947&amp;ie=UTF8&amp;hq=bbq&amp;hnear=Gilmer,+Upshur,+Texas&amp;layer=c&amp;cbll=32.739837,-94.942048&amp;panoid=UbyHsJs41YdR6Dp1En4MFg&amp;cbp=12,333.05,,0,14.99&amp;ll=32.739999,-94.942002&amp;spn=0.031116,0.037894&amp;output=svembed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;source=embed&amp;hl=en&amp;geocode=&amp;q=bbq+in+gilmer,+tx&amp;sll=33.157188,-96.716924&amp;sspn=0.015934,0.018947&amp;ie=UTF8&amp;hq=bbq&amp;hnear=Gilmer,+Upshur,+Texas&amp;layer=c&amp;cbll=32.739837,-94.942048&amp;panoid=UbyHsJs41YdR6Dp1En4MFg&amp;cbp=12,333.05,,0,14.99&amp;ll=32.739999,-94.942002&amp;spn=0.031116,0.037894" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;
&lt;p&gt;Best Ribs I&amp;#8217;ve had. Seriously. If you&amp;#8217;re even in East Texas do yourself a favor and stop here!&lt;/p&gt;
&lt;h3&gt;November 6th, 2010&lt;/h3&gt;
&lt;p&gt;My wife&amp;#8217;s sister joined us and the four of us headed out to Barnwell again for camping. Hit a few more trails with my sister-in-law. Found some more scenic ones this time. Some nice rides. Came up to a rock shelf we couldn&amp;#8217;t get past. The Grand Cherokee&amp;#8217;s wheel-base was just too long for it to avoid getting high-centered on it. Pretty sure about the only thing that could get past that is a Wrangler. Turning around in the dark is a bit scary. Thankfully there&amp;#8217;s spots for just that all over the trails, especially right before challenges like that.&lt;/p&gt;
&lt;p&gt;The tent was a bit chilly that evening, but camp-eggs and bacon in the morning made it all right. Jack loves camping since it&amp;#8217;s one of the few times we can let him run a bit free in a big area without worrying about cars or him getting into danger.&lt;/p&gt;
&lt;p&gt;Sunday my wife decided to give off-roading another shot and we hit the trails.&lt;/p&gt;
&lt;p&gt;We drove around on one of the more scenic trails and everyone had a good time. Hit the access roads in the park and decided to strike out in some new territory. Most of the two-diamond trails are pretty easy going for the big Jeep, so when we came across one named &lt;em&gt;&amp;#8220;The Angry Jeep&amp;#8221;&lt;/em&gt;, we turned in, ready to tackle it.&lt;/p&gt;
&lt;p&gt;You enter the trail in some little trees, and then just beyond a clearing is a good sized hill. My wife took one look and said &amp;#8220;take me back to camp&amp;#8221;. Well, the least I was going to do at that point was get a good picture. I put the transmission in Park and took my foot off the brake. The Jeep started rolling back slowly (we were on a bit of an incline at the foot of the hill). Odd, but if I&amp;#8217;d ever lived in San Francisco I guess I would&amp;#8217;ve known that that&amp;#8217;s normal. I put the parking brake on and hopped out to snap off a couple pictures.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Jeep at the mouth of the Hill of Doom!" src="/static/images/fail-rated-jeep/hill-of-doom.jpg"&gt;&lt;/p&gt;
  &lt;p&gt;Since we had just entered the trail, there was a spot to turnaround just about 20&amp;#8217; back. When I hopped back&lt;br /&gt;
    in, I put the Jeep in Reverse and started backing up. It was a little sluggish, and needed more gas than&lt;br /&gt;
    seemed normal, but it was moving so I didn&amp;#8217;t think much of it.&lt;/p&gt;
  &lt;p&gt;Keep in mind that the traction-control knob is set to &lt;b&gt;Rock Crawling&lt;/b&gt;, and the transfer-case is in&lt;br /&gt;
    &lt;b&gt;4-Low&lt;/b&gt;. When I say &amp;#8220;moving&amp;#8221;, I mean just barely. &lt;b&gt;2MPH&lt;/b&gt; maybe. Out on the access roads I didn&amp;#8217;t&lt;br /&gt;
    generally break 5MPH since with all the stones laying about the suspension would hit the bump-stops (it was set to&lt;br /&gt;
    it&amp;#8217;s tallest &amp;#8220;Off-road 2&amp;#8221; height) pretty easily. No rush though.&lt;/p&gt;
  &lt;p&gt;A little more gas, we&amp;#8217;d probably moved about 10&amp;#8217; so far&amp;hellip;&lt;/p&gt;
  &lt;div style="font-size:12em; color: #a22; font-weight: bold; text-align: center;"&gt;&lt;span class="caps"&gt;PING&lt;/span&gt;!&lt;/div&gt;
  &lt;p&gt;It sounded like a small rock just ricochetted against a skid-plate or something. I hadn&amp;#8217;t heard anything&lt;br /&gt;
    close out on the trails yet, but I&amp;#8217;m new at this so. I hop out and look under the vehicle. About a foot of&lt;br /&gt;
    clearance with the air-suspension lifting it, so I&amp;#8217;m able to get a good look around. No dents. No pings. The&lt;br /&gt;
    skid plates look fine, no way anything touched. Well, that&amp;#8217;s a bit of a relief.&lt;/p&gt;
  &lt;p&gt;Shortly after we get back to camp we pack up and head on out. When we get back to the drive up to the park,&lt;br /&gt;
    and hit asphalt again I turn off 4-Low and put the traction-control back on &lt;i&gt;Auto&lt;/i&gt;. The drive-train&lt;br /&gt;
    starts slipping something awful. If I turn the traction-control knob to &lt;i&gt;Snow/Mud&lt;/i&gt; it gets moving again.&lt;br /&gt;
    So issue with the traction-control system I think. I&amp;#8217;m convinced something to do with forgetting the parking&lt;br /&gt;
    brake. Either way, it&amp;#8217;s a Sunday, not dealers are open and we&amp;#8217;re 100 miles from home. I hit the road and keep&lt;br /&gt;
    it at 55MPH just in case. Under hard acceleration there&amp;#8217;s a knocking sound. Loose brake pads? I don&amp;#8217;t know. We&lt;br /&gt;
    make it home without further issue though.&lt;/p&gt;

  &lt;h4&gt;November 8th, 2010&lt;/h4&gt;

  &lt;p&gt;I take the Jeep into the shop. I explain I forgot about the parking brake when the trouble started so I&amp;#8217;m&lt;br /&gt;
    keeping my fingers crossed that it&amp;#8217;s covered. In hind-sight who hasn&amp;#8217;t driven a car for a block or two and&lt;br /&gt;
    forgot about the parking brake? Of course it&amp;#8217;s covered.&lt;/p&gt;
  &lt;p&gt;I also asked them to fit the missing pins for the front air-dam. It&amp;#8217;s held on by large thumb screws. &lt;i&gt;The&lt;br /&gt;
    vehicle was missing a couple from the factory&lt;/i&gt;. The problem is they also hold up the felt-like sound&lt;br /&gt;
    insulation in the wheel wells and since the one on the driver&amp;#8217;s side was soaked through and weighed down with&lt;br /&gt;
    the clay like mud the tire rubbed through it and chewed it up.&lt;/p&gt;
  &lt;p&gt;I&amp;#8217;m out &lt;b&gt;$237.19&lt;/b&gt;.&lt;/p&gt;
  &lt;p&gt;I&amp;#8217;m a bit annoyed about that one since it&amp;#8217;s not like I lost those pins. They were definitely &lt;span class="caps"&gt;MIA&lt;/span&gt; when I&lt;br /&gt;
    examined the air-dam during removal. The air-dam is made to be removed for extra &lt;i&gt;approach&lt;/i&gt;, so I wanted&lt;br /&gt;
    to figure out how. It&amp;#8217;s not as easy as it sounds since there are some snap-in clips to pop out as well. It&amp;#8217;s&lt;br /&gt;
    definitely not something you&amp;#8217;ll be messing with on a routine basis.&lt;/p&gt;
  &lt;p&gt;Anyways, my service guy Stephen calls me back the next day and says the axle is snapped.&lt;/p&gt;
  &lt;p&gt;You read that right, that loud ping wasn&amp;#8217;t a rock. It was the driver&amp;#8217;s side rear half-shaft snapping! :o&lt;/p&gt;
  &lt;p&gt;The dealer says it clear wasn&amp;#8217;t the parking brake and the repairs are covered. The theory of the engineers&lt;br /&gt;
    they talked to is the wheel got spinning, free-wheelin&amp;#8217;, touched down, caught a rock edge or something that&lt;br /&gt;
    stopped it instantly, and the sudden jarring snapped it.&lt;/p&gt;
  &lt;p&gt;Take a look at the picture again, I&amp;#8217;ll wait. See how all four wheels are on the ground? Remember how I said I&lt;br /&gt;
    had the vehicle in 4-Low with the most aggressive traction-control setting (rock-crawling) on? Obviously the&lt;br /&gt;
    engineers aren&amp;#8217;t considering all the facts. It shouldn&amp;#8217;t even be possible with those settings to reproduce&lt;br /&gt;
    their theory.&lt;/p&gt;
  &lt;p&gt;Back to the repairs then. I&amp;#8217;m waiting around about a week for the axle to be replaced, and then I get a call.    &lt;/p&gt;
  &lt;p&gt;They&amp;#8217;ve removed the axle to replace it and discovered that the air-bag (for the air-suspension) and brakes&lt;br /&gt;
    also need to be replaced. On top of that the end of the axle in the rear-differential is fused to the&lt;br /&gt;
    differential housing so the Jeep needs a new differential.&lt;/p&gt;

&lt;div&gt;&lt;img alt="Incompetent Mechanic" src="/static/images/fail-rated-jeep/incompetent-mechanic.jpg"&gt;&lt;/div&gt;
  &lt;p&gt;Seriously? You see that there&amp;#8217;s a snapped axle and it never occurs to you to pull it out and check to see if&lt;br /&gt;
    there&amp;#8217;s any further damage?!? You&amp;#8217;ve got to be kidding me.&lt;/p&gt;
  &lt;p&gt;Fine. So the part is on order. New vehicle, none have had this issue, the part isn&amp;#8217;t in the supply-line yet.&lt;br /&gt;
    No &lt;span class="caps"&gt;ETA&lt;/span&gt;.&lt;/p&gt;
  &lt;p&gt;So I&amp;#8217;ll keep driving around the rental Chevy Cobalt until I hear back. Next thing I know Enterprise&lt;br /&gt;
    Rent-a-Car is calling me saying I owe them $200 or something. Remember when I said we bought the extended&lt;br /&gt;
    warranty for the rental coverage? So I call back the dealer and ask what the deal is. They can&amp;#8217;t locate my&lt;br /&gt;
    warranty. Ok. The vehicle is only a few weeks old by this point. I&amp;#8217;ll give them the benefit of a doubt. I tell&lt;br /&gt;
    him to walk across the shop floor to the sales office, and talk to the finance guy who sold us the coverage.&lt;br /&gt;
    Stephen says he&amp;#8217;ll handle it.&lt;/p&gt;
  &lt;p&gt;A couple days later Enterprise calls back saying they&amp;#8217;re about to bill my card on file.&lt;/p&gt;
  &lt;div style="font-size:12em; color: #d22; text-align: center;"&gt;&lt;span class="caps"&gt;WTF&lt;/span&gt;?!?&lt;/div&gt;
  &lt;p&gt;So I call Stephen back. He never talked to the finance guy. Fine, I&amp;#8217;ll sort it out myself. I call the finance&lt;br /&gt;
    guy, Julian. He says I&amp;#8217;m covered, he&amp;#8217;ll talk to Stephen. I call Enterprise up later that day and they say no&lt;br /&gt;
    one from Dodge City Dodge has called. This is getting old. I talk to Julian again, he follows up with&lt;br /&gt;
    Enterprise, and it&amp;#8217;s settled. After talking to Stephen again I learn that the coverage is only for 5 days in a&lt;br /&gt;
    rental.&lt;/p&gt;

  &lt;p&gt;Shame on me for not reading the fine print I guess? Forget that:&lt;/p&gt;

  &lt;blockquote style="color: #22c;"&gt;I want rentals covered.&lt;/blockquote&gt;
  &lt;blockquote style="color: #c22;"&gt;Buy this extended warranty and they will be.&lt;/blockquote&gt;
  &lt;blockquote style="color: #22c;"&gt;We were told the same thing by Mazda a few years ago on our Mazda 6 only to&lt;br /&gt;
    find out that it required it to be in the shop for diagnosis before we&amp;#8217;d get a rental, and that could take&lt;br /&gt;
    more than a day. I don&amp;#8217;t want any gotchas, I just want the loaner.&lt;/blockquote&gt;
  &lt;blockquote style="color: #c22;"&gt;Don&amp;#8217;t worry about it. Full coverage. You bring your Jeep in, you get a&lt;br /&gt;
    loaner.&lt;/blockquote&gt;
  &lt;p&gt;5 days of coverage? Unacceptable. Stephen talked to his manager, who talked to Chrysler I understand, and&lt;br /&gt;
    they got it covered.&lt;/p&gt;
  &lt;p&gt;Just after Thanksgiving I&amp;#8217;m swapped into a Chrysler Town &amp;amp; Country minivan for my rental. Not in time to&lt;br /&gt;
    keep us from having to put more miles on my wife&amp;#8217;s vehicle over the holiday, but still a lot better than a&lt;br /&gt;
    Cobalt.&lt;/p&gt;


&lt;h3&gt;December 8th, 2010&lt;/h3&gt;
  &lt;p&gt;The Jeep is ready, I can pick it up. 30 days in the shop. Pretty crazy, but it did sound like a lot of work&lt;br /&gt;
    and they did eventually get the part in after pulling some strings so I appreciated the effort the dealer went&lt;br /&gt;
    through to get the thing put back together despite the hiccups with the mechanics. I pay the $237.19 to get&lt;br /&gt;
    that insulation replaced in the wheel well and the air-dam clips.&lt;/p&gt;
  &lt;p&gt;I get the Jeep back and I&amp;#8217;m in love with it as ever. Still singing it&amp;#8217;s praises to anyone who&amp;#8217;ll listen.&lt;br /&gt;
    First thing I do is take it to get it detailed since I had to put it in the shop with the spatter and trail&lt;br /&gt;
    dust all over it.&lt;/p&gt;

&lt;h3&gt;December 9th, 2010&lt;/h3&gt;
  &lt;p&gt;It&amp;#8217;s been a long week at work, with a couple very late nights. I&amp;#8217;m ready for the weekend and some camping. On&lt;br /&gt;
    the way back to the office after stepping out for dinner and coffee I decide I&amp;#8217;d better test the 4WD system&lt;br /&gt;
    since I didn&amp;#8217;t get a chance to the evening I picked it up. In the Starbucks parking lot I put the transmission&lt;br /&gt;
    into neutral, turn the traction-control knob to rock-crawling, and hit the 4-Low button. Everything engages&lt;br /&gt;
    smoothly. I feather on the gas and in just a couple feet a red light comes on on the traction-control panel,&lt;br /&gt;
    my dash is displaying &amp;#8220;4WD &lt;span class="caps"&gt;SRV&lt;/span&gt;&amp;#8221;, &amp;#8220;Service 4WD System&amp;#8221; and &amp;#8220;Service Air Suspension&amp;#8221; lights.&lt;/p&gt;
  &lt;p&gt;Damnit.&lt;/p&gt;
  &lt;div&gt;&lt;img alt="10MPH" src="/static/images/fail-rated-jeep/10-miles.jpg"&gt;&lt;/div&gt;
  &lt;p&gt;I push the 4-Low button again and turn the traction-control dial back to &lt;i&gt;Auto&lt;/i&gt; to disable everything.&lt;br /&gt;
    No joy. It&amp;#8217;s stuck in 4-Low. Ok, now I&amp;#8217;m pissed. The vehicle was &amp;#8220;fixed&amp;#8221; and the mechanic never thought to&lt;br /&gt;
    confirm it actually worked?&lt;/p&gt;
  &lt;p&gt;So I work near the &amp;#8220;High Five&amp;#8221; in Dallas. That&amp;#8217;s a 30 mile or so ride home. The manual tells me to keep it&lt;br /&gt;
    under 25MPH in 4-Low. When I&amp;#8217;m done at work for the evening I drive home at 20MPH up Coit Rd with my hazard&lt;br /&gt;
    lights on the whole way. I get home around 3AM.&lt;/p&gt;

&lt;h3&gt;December 11th, 2010&lt;/h3&gt;
&lt;p&gt;Less than 48 hours after picking it up, the Jeep is back in the shop and I&amp;#8217;m back in a rental. This time the rental is a Chevy Silverado. So that&amp;#8217;s better. Not to knock on the Cobalt, it&amp;#8217;s a much nicer little car than I expected, but I&amp;#8217;m not paying Jeep Grand Cherokee money to drive around a Cobalt.&lt;/p&gt;
  &lt;p&gt;Or a Silverado for that matter, but you can&amp;#8217;t win &amp;#8217;em all I guess.&lt;/p&gt;
&lt;img style="float: right;" alt="Nissan Xterra" src="/static/images/fail-rated-jeep/xterra.jpg"&gt;
  &lt;p&gt;A week later or so Enterprise calls me saying they need the Silverado because they&amp;#8217;ve sold it. A bit odd, but&lt;br /&gt;
    OK. I drop it off and exchange it for a Nissan Xterra. The Xterra is a lot more powerful than I expected.&lt;br /&gt;
    Probably about the same acceleration as the Grand Cherokee I&amp;#8217;d guess. It&amp;#8217;s towing capacity is much lower but&lt;br /&gt;
    still, it&amp;#8217;s got me questioning if I actually need a vehicle that costs twice as much if I just want a nice&lt;br /&gt;
    family hauler and camper.&lt;/p&gt;
  &lt;p&gt;I&amp;#8217;m pissed this time. I get my sales-guy involved, as well as the service manager. The Service Manager&lt;br /&gt;
    (Scott) acts like they did me a favor fixing it the first time since I was clearly &amp;#8220;muddin&amp;#8217; it&amp;#8221;. Let&amp;#8217;s get a&lt;br /&gt;
    couple things straight:&lt;br /&gt;
&lt;br /&gt;
* I wasn&amp;#8217;t &amp;#8220;muddin&amp;#8217; it&amp;#8221;&lt;br /&gt;
* If I had, I would&amp;#8217;ve been stuck. The stock &amp;#8220;off-road&amp;#8221; tires aren&amp;#8217;t even AT tires, much less MT tires&lt;br /&gt;
&lt;br /&gt;
  &lt;p&gt;I call up Chrysler Customer Care. I emphasize that they need to call my number. The following week they call&lt;br /&gt;
    my wife&amp;#8217;s. She tells them to call me as she&amp;#8217;s walking into a meeting, they say OK and we never hear back&lt;br /&gt;
    again.&lt;/p&gt;
  &lt;p&gt;I call them again a few days later. I expect to have the same rental coverage issues. They promise a call&lt;br /&gt;
    from someone in that department before the end of the day, as well as the follow up I never actually got&lt;br /&gt;
    within 48 hours. I never get the call about the rental but the dealership got it sorted this time anyway.&lt;/p&gt;
&lt;p&gt;Friends suggest I open up a Twitter account and post to &lt;a href="http://twitter.com/Chrysler"&gt;@Chrysler&lt;/a&gt;. So I do. I&amp;#8217;m asked if Chrysler Customer Care has contacted me. Nope. Later that day I get a call from &lt;span class="caps"&gt;CCC&lt;/span&gt;. I explain the original issue and the guy tells me it&amp;#8217;s abuse since the parking brake was on.&lt;/p&gt;
  &lt;p&gt;The &lt;span class="caps"&gt;CCC&lt;/span&gt; rep is seriously trying to tell me I shouldn&amp;#8217;t be surprised when this Trail Rated Jeep snaps an axle,&lt;br /&gt;
    because the parking brake was left on for a few feet.&lt;/p&gt;
  &lt;p&gt;Obviously he&amp;#8217;s a jack-ass. He says he&amp;#8217;ll talk to the dealer. I never hear back.&lt;/p&gt;
  &lt;p&gt;A few more days pass, and the Jeep is ready again. I drive by the dealer to pick it up the following day.&lt;/p&gt;

  &lt;h4&gt;December 21st&lt;/h4&gt;

  &lt;p&gt;Picked up the Jeep, and it seems to be working this time. Apparently the clutch on the transfer-case had&lt;br /&gt;
    burned out.&lt;/p&gt;
  &lt;p&gt;I talk to Scott, the Service Manager. He admits they checked out the tow-hooks and there&amp;#8217;s no evidence the&lt;br /&gt;
    vehicle was towed out of a mud trap, I obviously wasn&amp;#8217;t muddin&amp;#8217;. He says even though I kept it under the&lt;br /&gt;
    recommended speed for 4-Low the drive home from work could&amp;#8217;ve contributed to the transfer case failure. Please&lt;br /&gt;
    call customer assistance and get a tow next time.&lt;/p&gt;
  &lt;p&gt;Fair enough.&lt;/p&gt;
  &lt;p&gt;I wonder about Sundays or when it&amp;#8217;s 3AM though? I need to ask &amp;#8217;em&amp;hellip;&lt;/p&gt;
  &lt;p&gt;Anyway, the tone of this conversation is different. He brings up the theory on why the axle snapped again,&lt;br /&gt;
    and I explain to him the traction-control setting and 4-Low. At this point it seems the only plausible&lt;br /&gt;
    explanation I&amp;#8217;ve heard is that the axle was simply weak/defective from the factory.&lt;/p&gt;
  &lt;p&gt;So I take the Jeep home.&lt;/p&gt;
  &lt;p&gt;A day or two later I try out the air-suspension on my way out of the office. I hit the &lt;i&gt;UP&lt;/i&gt; button a couple&lt;br /&gt;
    times to raise it to it&amp;#8217;s highest setting, &lt;i&gt;Off-road 2&lt;/i&gt;. On the way past the &lt;i&gt;Off-road 1&lt;/i&gt; height a&lt;br /&gt;
    warning pops up on the dash saying the system needs to cool off.&lt;/p&gt;
  &lt;p&gt;That&amp;#8217;s odd. Never seen it before and I hadn&amp;#8217;t exercised the system at all. I might understand if it was&lt;br /&gt;
    really hot outside, or if I&amp;#8217;d been using it continuously, but I&amp;#8217;d just got in the Jeep and it was in the low&lt;br /&gt;
    40&amp;#8217;s outside. Coldest weather since I&amp;#8217;d bought it.&lt;/p&gt;
  &lt;p&gt;Still, maybe just a fluke. Nothing too alarming so I resolve to take it into the shop after the holiday and&lt;br /&gt;
    head home.&lt;/p&gt;
&lt;p&gt;Over the weekend I try it a few more times. I get the message maybe once more, but mostly it just seems to be degrading overall.&lt;/p&gt;
&lt;h3&gt;December 27th, 2010&lt;/h3&gt;
&lt;p&gt;By Monday morning when I take it into the shop it has trouble reaching Normal Ride Height (after sitting overnight at Loading Height) and won&amp;#8217;t go into either of the taller off-road settings. The light on the button just blinks continuously, the dash indicator showing the car raising doesn&amp;#8217;t come on and there&amp;#8217;s no movement.&lt;/p&gt;
&lt;p&gt;Also the driver&amp;#8217;s seat warmer keeps turning itself off after a few seconds.&lt;/p&gt;
&lt;p&gt;At the dealer the mechanic comes out and checks it out with me. He explains that the seat warmer shuts off after awhile automatically to avoid overheating. Seat warmers can get uncomfortably warm if you leave them on. This definitely wasn&amp;#8217;t overheating. It was simply faulting.&lt;/p&gt;
&lt;p&gt;He told me about the warning I&amp;#8217;d mentioned on the air-suspension, and while it did make it to Normal Ride Height while at the dealership, it didn&amp;#8217;t make it to either of the off-road heights and even the &lt;span class="caps"&gt;NRH&lt;/span&gt; setting took minutes where normally it takes seconds. Something clearly wasn&amp;#8217;t right.&lt;/p&gt;
&lt;p&gt;So Enterprise was called to pick me up.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m out at Enterprise and the Dodge dealership calls saying send me on back, the car is ready. That&amp;#8217;s weird but whatever. OK. So Enterprise drops me back off at the dealership.&lt;/p&gt;
&lt;p&gt;The mechanic sits in the Jeep with me while I test it. &lt;em&gt;Off-road 1&lt;/em&gt;: Success. Kinda. It takes a minute. Something&amp;#8217;s definitely not right. &lt;em&gt;Off-road 2&lt;/em&gt;: Nothing. I made sure to film it on my phone.&lt;/p&gt;
&lt;blockquote style="color: #c22;"&gt;I&amp;#8217;m sorry, I thought you were worried about the Off-road 1 setting.&lt;/blockquote&gt;
&lt;p&gt;Seriously? Is this also the guy that didn&amp;#8217;t take the broken axle off for a week? I want the damn car to work like new. It&amp;#8217;s two months old at this point and has been in the shop for 41 days! Obviously nobody would buy the Quadra Lift system if it was going to be considered normal for it to degrade to the point it took minutes to work and half the heights were unavailable just a couple months off the dealer lot.&lt;/p&gt;
&lt;h3&gt;December 28th, 2010&lt;/h3&gt;
&lt;p&gt;So there we are. I just got a call back from Stephen to pick it up. Day 75 of ownership. 44 days in the shop so far.&lt;/p&gt;
&lt;h3&gt;Epilogue&lt;/h3&gt;
&lt;p&gt;So what do I want from Chrysler at this point?&lt;/p&gt;
&lt;p&gt;Well, after the first 30 days I would&amp;#8217;ve hoped they&amp;#8217;d perform something like the re-certification that used cars get. After the second time at least. I had to ask the dealership a number of times to check the transmission fluid to make sure it wasn&amp;#8217;t toast and the next thing to go (they did, and it looked fine to my untrained eyes, not visibly scorched or anything).&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve got a vague explanation about Chrysler&amp;#8217;s specs on the air-suspension settings being wrong and working with the service department at Dodge City Dodge to sort it all out. I guess something to do with the &amp;#8220;fill&amp;#8221; of the system since one of the air-bags was replaced earlier in the whole ordeal. I&amp;#8217;d put money down that nobody&amp;#8217;s even looked at the seat-warmer.&lt;/p&gt;
&lt;p&gt;At this point though, that&amp;#8217;s someone else&amp;#8217;s problem.&lt;/p&gt;
&lt;h3&gt;December 29th, 2010&lt;/h3&gt;
&lt;p&gt;After picking my Jeep up this morning it appears the dealer didn&amp;#8217;t identify the problem. So instead of simply admitting that and asking me to keep an eye out for it, they pretended like it didn&amp;#8217;t exist. As if they hadn&amp;#8217;t seen the issue with the Air Suspension with their own eyes just a couple days before.&lt;/p&gt;
&lt;p&gt;The pickup paperwork, which in hindsight I probably shouldn&amp;#8217;t have acknowledged with a signature, says that &amp;#8220;I was using it too much&amp;#8221; and causing it to overheat. Which is complete BS. Turning the car on from a cold start, and trying to get it into &lt;i&gt;Off-road 2&lt;/i&gt; height is not using it too much.&lt;/p&gt;
&lt;p&gt;Chrysler really needs to do something about making sure people get calls back and that the dealership isn&amp;#8217;t trying to sweep genuine issues under the rug. Especially when the customer has it on video. Maybe I&amp;#8217;ll post it to Youtube, but I&amp;#8217;m a bit busy right now, and all I really care about is getting some results. I&amp;#8217;m not interested in bad-mouthing Chrysler for the sake of it. There&amp;#8217;s no such thing as a manufacturer that never makes a mistake when they&amp;#8217;re putting millions of cars on the road. I just got unlucky with one vehicle that happened to ship with a bad axle. It had to happen to someone I guess. It&amp;#8217;s how you respond to such mistakes that matters though.&lt;/p&gt;
&lt;p&gt;This morning the dealer is right though, the system appears to work flawlessy. It responds instantly, and doesn&amp;#8217;t overheat even after a couple full up/down cycles. Which is what I expect. Might I get it to overheat trying to push it further? Maybe, I don&amp;#8217;t know. I&amp;#8217;m not expecting miracles though, getting a couple cycles out of it is what I had before, it&amp;#8217;s what I expect it to do, I&amp;#8217;m fine with that.&lt;/p&gt;
&lt;p&gt;That said, the outside temperature readout on the dash from the previous video says 37&amp;deg;. This morning it was 63&amp;deg;. What do you want to bet that when it dips into the low 30&amp;#8217;s again this weekend the issue comes right back? Perhaps when the airbag was replaced they just used the air-compressor on the shop-floor, introducing moisture, causing excess strain to the system at lower temperatures? It&amp;#8217;s just a theory, but it seems plausible, and is more than I got from the dealer who decided to simply pretend the issue several people there saw with their own eyes simply didn&amp;#8217;t exist a couple days later.&lt;/p&gt;</content>
 </entry>
 
</feed>

