<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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"
	>

<channel>
	<title>The Life and Times of Michael Shadle</title>
	<atom:link href="http://michaelshadle.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://michaelshadle.com</link>
	<description></description>
	<pubDate>Thu, 02 Oct 2008 09:11:32 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.1</generator>
	<language>en</language>
			<item>
		<title>Changing the WordPress $table_prefix - a word of caution</title>
		<link>http://michaelshadle.com/2008/10/02/changing-the-wordpress-table-prefix-a-word-of-caution/</link>
		<comments>http://michaelshadle.com/2008/10/02/changing-the-wordpress-table-prefix-a-word-of-caution/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 08:20:30 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=107</guid>
		<description><![CDATA[I just changed the table prefix from "wp_" to "wp_en_us_" to support multiple installs in the same database, one for each locale. This seemed pretty straightforward - just rename the table names and change the table prefix in wp-config.php, right?
Wrong.
The WP code is littered with references to $table_prefix - including columns in the "usermeta" and [...]]]></description>
			<content:encoded><![CDATA[<p>I just changed the table prefix from "wp_" to "wp_en_us_" to support multiple installs in the same database, one for each locale. This seemed pretty straightforward - just rename the table names and change the table prefix in wp-config.php, right?</p>
<p>Wrong.</p>
<p>The WP code is littered with references to $table_prefix - including columns in the "usermeta" and "options" table. Key columns such as "wp_capabilities" in the "options" table need to be renamed appropriately, or your user roles are totally broken. In "usermeta" you need to make sure the "wp_user_level" and "wp_capabilities" meta_keys are updated too.</p>
<p>Sadly, after spending a couple hours var_dump() and exit()'ing throughout the code I realized the issue. I am not exactly sure the prefix of some of these keys needs to be aligned with the $table_prefix - maybe WPMU uses that or something. But anyway, what an annoying headache.</p>
<p>I am not sure but I think -all- "wp_" keys might need this same treatment. I've only really cared about the user roles and such since I had a lot of users trying to figure out why they can't post anymore. At least that's fixed.</p>
<p>Note: I don't know if this is clearly documented anywhere. If it is, I should be embarrased. However, I still want to voice a complaint that this isn't very straightforward. Maybe put a comment in wp-config.php?</p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/10/02/changing-the-wordpress-table-prefix-a-word-of-caution/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I thought Republicans Hated Spam?</title>
		<link>http://michaelshadle.com/2008/09/17/i-thought-republicans-hated-spam/</link>
		<comments>http://michaelshadle.com/2008/09/17/i-thought-republicans-hated-spam/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 01:08:41 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Consumerism]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=100</guid>
		<description><![CDATA[Today I received an email to an OLD email alias I had used in the late 90's for one of those browser bars that pays you to surf (Spedia) - that address has obviously been resold to various people and companies, but this is pretty nuts. The marketeers behind the McCain/Palin campaign have actually purchased [...]]]></description>
			<content:encoded><![CDATA[<p>Today I received an email to an OLD email alias I had used in the late 90's for one of those browser bars that pays you to surf (Spedia) - that address has obviously been resold to various people and companies, but this is pretty nuts. The marketeers behind the McCain/Palin campaign have actually purchased a list that includes that email alias, which means they're not really sending out emails to so-called "targeted" folks. The email alias I had registered has no context related to it; they're just sending out emails to anyone on a list they've purchased.</p>
<p>Pretty weak. I checked the headers too. This is legitimately from his campaign email marketing!</p>
<blockquote><p><code>Delivered-To: email@removed.com<br />
Received: by 10.142.104.5 with SMTP id b5cs104203wfc;<br />
        Wed, 17 Sep 2008 17:02:21 -0700 (PDT)<br />
Received: by 10.150.97.19 with SMTP id u19mr247318ybb.24.1221696140048;<br />
        Wed, 17 Sep 2008 17:02:20 -0700 (PDT)<br />
Return-Path: <bounce -95-5944-2427115@bounces.johnmccain.com><br />
Received: from sm1.johnmccain.com (sm1.johnmccain.com [64.203.105.81])<br />
        by mx.google.com with ESMTP id 6si22813870ywn.0.2008.09.17.17.02.19;<br />
        Wed, 17 Sep 2008 17:02:20 -0700 (PDT)<br />
Received-SPF: pass (google.com: domain of bounce-95-5944-2427115@bounces.johnmccain.com designates 64.203.105.81 as permitted sender) client-ip=64.203.105.81;<br />
Authentication-Results: mx.google.com; spf=pass (google.com: domain of bounce-95-5944-2427115@bounces.johnmccain.com designates 64.203.105.81 as permitted sender) smtp.mail=bounce-95-5944-2427115@bounces.johnmccain.com<br />
Received: from unknown (unknown [192.168.201.181])<br />
	by sm1.johnmccain.com (Postfix) with QMQP id 4A6E3490F6<br />
	for <email @removed.com>; Wed, 17 Sep 2008 20:02:19 -0400 (EDT)<br />
Errors-To: <bounce -95-5944-2427115@bounces.johnmccain.com><br />
X-Bounce-Track: <email @removed.com><br />
From: "McCain Palin 2008" <ecampaign @johnmccain.com><br />
To: <email @removed.com><br />
Subject: Get Your Oregon Absentee Ballot<br />
MIME-Version: 1.0<br />
Content-Type: multipart/alternative;<br />
	boundary="----=_NextPart_5A3_E4DD8AB6.47E75371"<br />
Message-Id: &lt;20080918000219.4A6E3490F6@sm1.johnmccain.com><br />
Date: Wed, 17 Sep 2008 20:02:19 -0400 (EDT)<br />
</email></ecampaign></email></bounce></email></bounce></code></p></blockquote>
<p>The text of the email?</p>
<blockquote><p>
Your vote in this election is more critical than ever as the polls show John McCain and Governor Palin in a virtual tie. Voting early by absentee ballot or in person is the best way to get your vote counted now and avoid the long lines on Election Day.</p>
<p>... more stuff hoping to rope in absentee votes for their party ...</p>
<p>P.S. If you are not yet registered to vote, please register right away by following this link. [link to johnmccain.com]</p>
<p>...</p>
<p>Please visit this page if you want to remove yourself from the email list. [link to johnmccain.com]</p>
<p>...</p>
<p>Paid for by McCain-Palin 2008
</p></blockquote>
<p>It even has a proper SPF record. So yes, they have officially sent me unsolicited email from an email list sold to them... However, they use Postfix - I'll give them props for that.</p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/09/17/i-thought-republicans-hated-spam/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Large File Uploads Over HTTP - The Final Solution (I Think)</title>
		<link>http://michaelshadle.com/2008/08/26/large-file-uploads-over-http-the-final-solution-i-think/</link>
		<comments>http://michaelshadle.com/2008/08/26/large-file-uploads-over-http-the-final-solution-i-think/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 03:18:11 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=87</guid>
		<description><![CDATA[Problem statement: HTTP sucks for file uploads.
You know it. I know it. The problems?

No resuming
POST multipart/form-data bloats the size of the file due to encoding
Slow connections typically time out on large files
Any server resets or any other network "burps" on the path from client to server effectively kills the upload
People have had moderate success by [...]]]></description>
			<content:encoded><![CDATA[<p>Problem statement: HTTP sucks for file uploads.</p>
<p>You know it. I know it. The problems?</p>
<ul>
<li>No resuming</li>
<li>POST multipart/form-data bloats the size of the file due to encoding</li>
<li>Slow connections typically time out on large files</li>
<li>Any server resets or any other network "burps" on the path from client to server effectively kills the upload</li>
<li>People have had moderate success by tuning their webserver and PHP to accept large POSTs, and in general, it works - but not for everyone and it suffers from everything previously noted.</li>
</ul>
<p>What would the ideal file upload experience support?</p>
<ul>
<li>It should resume after manual pause, a server reset, a timeout, or any other error.</li>
<li>It should allow for multiple files being uploaded at once.</li>
<li>It should work transparently over HTTP - which means proxies will support it like any normal web request, it can be done over HTTPS (SSL), it will reuse cookies and standard HTTP authentication methods.</li>
<li>(Ideally!) the browser would handle this itself without requiring Java, Flash, or any other applets.</li>
</ul>
<p>With all this in mind, I somehow stumbled across the idea (roughly posted <a href="http://news.php.net/php.general/278711" target="_blank">here</a>) based on the time-tested learnings from Usenet and NZB files, and BitTorrent. The main idea? Splitting the file up into manageable segments. There's also some other logic too, but that's the main idea.</p>
<p>Why do I claim this is the final solution?</p>
<ul>
<li>It can reuse the same HTTP/HTTPS connection, so proxies and HTTP authentication can be honored.</li>
<li>It doesn't care what speed of your connection - due to the small size of the files, it's easier to get them to the server and each piece can be confirmed one step at a time. No more having to start from the beginning due to a failure or timeout.</li>
<li>It will support multiple files at once. The server <em>could</em> (although we might not implement it this way) support multi-threaded uploading of the same file, too, just like BitTorrent or Usenet downloading - upload multiple pieces at the same time and assemble them in the end. We're trying to make a decision whether or not we want to do that right now. The fundamental difference is an implementation detail on the server end.</li>
<li>It allows for any client that can split a file up, hash it, encode it and upload it via POST</li>
<li>It will still require an applet, since browsers have no support for anything but standard file upload semantics (Although this would be a neat thing to get into a specification)</li>
</ul>
<p>What's required, how does it work?</p>
<p>As of right now, this is what I have down (it has changed already since the PHP post):</p>
<ol>
<li>The client contacts the server to begin the transaction. It supplies the following information:
<ul>
<li>Action = "begin"</li>
<li>Final filesize</li>
<li>Final filename</li>
<li>Final file hash (SHA256 or MD5, still haven't determined which one)</li>
<li>A list of all the segments - their segment id, byte size, hash (again SHA256 or MD5) - XML or JSON or something</li>
</ul>
</li>
<li>Server sends back "server ready, here's your $transaction_id"</li>
<li>Client starts sending the file, one segment at a time, with the following information:
<ul>
<li>Action = "process"</li>
<li>Transaction ID = $transaction_id</li>
<li>Segment ID = $segment_id</li>
<li>Content = base64 or uuencoded segment (for safe transit)</li>
</ul>
</li>
<li>Server replies back "segment received, transaction id $transaction_id, segment id $segment_id, checksum $checksum"</li>
<li>Client compares the checksum for $segment_id, if it matches, move on to the next segment. If not, retransmit.</li>
<li>When the client is done sending all the segments, client sends message to the server:
<ul>
<li>Action = "finish"</li>
<li>Transaction ID = $transaction_id</li>
</ul>
</li>
<li>Server assembles all the segments (if they're separate) and sends to the client:
<ul>
<li>Transaction ID = $transaction_id</li>
<li>Checksum = $checksum of the final file</li>
</ul>
</li>
<li>Client compares the checksum to it's own checksum. If it matches, client sends message to server:
<ul>
<li>Action = "complete"</li>
<li>Transaction ID = $transaction_id</li>
</ul>
</li>
</ol>
<p>Viola, done. I think the "protocol" transmits some extra information that isn't needed; so some of this might need to be cleaned up. This is the initial idea though. Props to Newzbin for inventing NZB files which was a big influence in this concept.</p>
<p>I'm somewhat rushing this post out, hopefully it solicits some feedback. I'm going to be revising this and working with a Java developer to work on a client written in Java. Hopefully someday we'll get one with less overhead. I'll post PHP code as I write it too to handle the server portion of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/08/26/large-file-uploads-over-http-the-final-solution-i-think/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Updates on Home Storage Solutions</title>
		<link>http://michaelshadle.com/2008/08/17/updates-on-home-storage-solutions/</link>
		<comments>http://michaelshadle.com/2008/08/17/updates-on-home-storage-solutions/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 09:25:28 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=80</guid>
		<description><![CDATA[For a while I was looking into and hoping to go the eSATA route. Immature chipsets and lack of OS support have somewhat kept that idea frozen.
I want to use ZFS for a filesystem. Or a filesystem -like- ZFS. Currently there are no others out there like it. There is Btrfs, and there is another [...]]]></description>
			<content:encoded><![CDATA[<p>For a while I was looking into and hoping to go the eSATA route. Immature chipsets and lack of OS support have somewhat kept that idea frozen.</p>
<p>I want to use ZFS for a filesystem. Or a filesystem -like- ZFS. Currently there are no others out there like it. There is Btrfs, and there is another one I thought picking up steam (although I can't remember it now for the life of me) - both of those however aren't stable yet. ZFS is still not as stable as I wish on FreeBSD. It won't run natively on Linux, and I don't think it's very stable either. The only true way to get a stable filesystem like ZFS is to in fact run ZFS on Solaris.</p>
<p>I was not excited to try Solaris. It used to be a joke to call it "Slowaris" - I remember the old days of using random UNIX shells and hating Solaris boxes because I couldn't run hardly anything or compile anything. However, that's changed somewhat now. I took the plunge and installed SXCE (Nevada build 94) since Solaris 10u5 did not support the new CIFS implementation. So far, I've learned a little bit here and there about Solaris system administration and I've been using ZFS to create some snapshots, filesystems, etc. It is so easy even my mom could handle it. Not to mention Solaris has some pretty neat tools like the Solaris Fault Manager, which I have crontabbed to run every 30 minutes and email me if -any- hardware/faults get reported. So I have this great box sitting there running the best filesystem possible integrity-wise, and it is also damn quiet. It's not a small form factor which I would have liked, though.</p>
<p>So I begin looking into trying to get a small form factor ZFS box. I might be able to, if I want to hack up a Shuttle style case (see <a href="http://mashie.org/casemods/udat1.html">Udat at Mashie Design</a> - there are mini-itx motherboards now with 6 SATA ports onboard which would allow for a 5 drive RAIDZ1 + maybe use a Compact Flash card for a boot drive. However, that requires case modding and can only fit 5 drives. I'm not sure I really want to try all that.</p>
<p>Instead, even Mashie himself has admitted to moving into larger form factors for storage boxes (I believe he's using a CM Stacker nowadays) - and from a space perspective, it probably does make the most sense.</p>
<p>Currently I'm exploring going with a full-size case that could hold 15 drives, or a mid-size case that could hold 10 drives (not including optical + boot)</p>
<p>I think I may have found a winner, for the mid-size option. <a href="http://lian-li.com/v2/en/product/product06.php?pr_index=143&#038;cl_index=1&#038;sc_index=26&#038;ss_index=66&#038;g=spec">Lian-li</a> has a self-proclaimed "silent" chassis that has 9 bays (which means 6 bays for 2x5-in-3 modules) + optical + 1 boot disk in the spare 5.25" bay. Roughly 8-9TB usable in a mid-size case that would be about as silent as it can get. It even has a front door on it. Actually, there's a second place one - this one is much more extensible, but has no door on it, which I think would help shield any noise coming from these 5-in-3 modules. See <a href="http://www.lian-li.com/v2/en/product/product06.php?pr_index=135&#038;cl_index=1&#038;sc_index=25&#038;ss_index=62">here</a>. Cooler Master also has a case like that too - again, no door on the front. I wish I had local access to all of these cases to try each of them out. Right now I have to order them online, and then pay possible restocking fees, and at least the cost of shipping the product back. I'm tired of that back and forth game. I've had to do it too many times in the past.</p>
<p>Lian-li also has a full-size chassis that already includes 10 internal drive bays, + 5x 5.25" front bays. Those extra bays could be used for more drives too. So many options... I'm trying to determine the amount of space I want to use in my office and how large and bulky I want these machines to be. Ideally I would like as little CPUs as possible - no need to have full-out operating systems installed and having to manage all that. I'm just tired of all my equipment making noise, getting hot, failing, and data corrupting due to failure or bit-rot. It's time to upgrade and streamline.</p>
<p>I've pretty much examined every chassis at Lian-li, Coolermaster and Antec. I have an Antec P182 right now. It's great and quiet, but does not support as many drives as I want for these next boxes. Stay tuned as I pull the trigger and build another storage box soon. Perhaps I'll share some pictures and specifications with my existing storage box I just built, which is for "off site" daily snapshots of my hosting infrastructure and some other servers I administer.</p>
<p>These next machines will be for my own personal use... and now I've gained some good knowledge on what to expect. It's been a while since I've built a normal-sized machine, as I've been a Shuttle XPC user for years now <img src='http://michaelshadle.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/08/17/updates-on-home-storage-solutions/feed/</wfw:commentRss>
		</item>
		<item>
		<title>nginx + WordPress - Redux</title>
		<link>http://michaelshadle.com/2008/08/17/nginx-wordpress-redux/</link>
		<comments>http://michaelshadle.com/2008/08/17/nginx-wordpress-redux/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 08:52:48 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=76</guid>
		<description><![CDATA[There's been a minor tweak required in my original WordPress+nginx rewrite rule post.
I think we've finally got it right now. I've been exchanging emails ad nauseum with Igor and I believe the behavior now works properly (part of the exchange was regarding PHP+basic http auth, there were some bugs around the regexps/nested location blocks or [...]]]></description>
			<content:encoded><![CDATA[<p>There's been a minor tweak required in my <a href="http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/">original WordPress+nginx rewrite rule post</a>.</p>
<p>I think we've finally got it right now. I've been exchanging emails ad nauseum with Igor and I believe the behavior now works properly (part of the exchange was regarding PHP+basic http auth, there were some bugs around the regexps/nested location blocks or something)</p>
<p>Anyway, here is a perfect working example, running this very website:</p>
<blockquote><pre>server {
   listen 80;
   server_name michaelshadle.com;
   index index.php;
   root /home/mike/web/michaelshadle.com/;
   include /etc/nginx/defaults.conf;
   include /etc/nginx/expires.conf;
   error_page 404 = /wordpress/index.php?q=$request_uri;
   location ^~ /wordpress/wp-admin {
      auth_basic "wordpress";
      auth_basic_user_file /home/mike/web/michaelshadle.com/.htpasswd;
      location ~ \.php$ {
         fastcgi_pass 127.0.0.1:11000;
      }
   }
   location ~ \.php$ {
      fastcgi_pass 127.0.0.1:11000;
   }
}
</pre>
</blockquote>
<p>Likewise, you can also omit the basic HTTP authentication if you don't think you need it:</p>
<blockquote><pre>
server {
   listen 80;
   server_name michaelshadle.com;
   index index.php;
   root /home/mike/web/michaelshadle.com/;
   include /etc/nginx/defaults.conf;
   include /etc/nginx/expires.conf;
   error_page 404 = /wordpress/index.php?q=$request_uri;
   location ~ \.php$ {
      fastcgi_pass 127.0.0.1:11000;
   }
}</pre>
</blockquote>
<p>Note: this does require a patched version of 0.7.10 - I assume he will put these changes into 0.7.11. Some of the changes required include the basic HTTP auth stuff. Also, when using error_page 404, it generated logfile noise in the error log. That was fixed as of 0.7.9 or 0.7.10, so no longer will you receive script-handled 404's in your error log.</p>
<p>This should be the last and final need to run WordPress properly under nginx. This has the approval of Igor, the creator - you cannot get better than that. (Note: this is WordPress 2.6.1, but I have not seen any reason the rewrite rule would be different since even before 2.x)</p>
<p>Let me know if it doesn't work! Or better yet, let the <a href="http://wiki.codemongers.com/MailinglistSubscribe" target="_blank">nginx mailing list</a> know <img src='http://michaelshadle.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/08/17/nginx-wordpress-redux/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Simple WordPress Hack - Redirect the index.php!</title>
		<link>http://michaelshadle.com/2008/08/16/simple-wordpress-hack-redirect-the-indexphp/</link>
		<comments>http://michaelshadle.com/2008/08/16/simple-wordpress-hack-redirect-the-indexphp/#comments</comments>
		<pubDate>Sat, 16 Aug 2008 08:05:42 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=69</guid>
		<description><![CDATA[I don't know how or when, but I wound up getting indexed with index.php in some of my URLs.
For some reason, WordPress hasn't decided that they should parse and remove that. So for the interim, I've decided to finally throw in a couple quick lines of code to do the trick. Throw it in any [...]]]></description>
			<content:encoded><![CDATA[<p>I don't know how or when, but I wound up getting indexed with index.php in some of my URLs.</p>
<p>For some reason, WordPress hasn't decided that they should parse and remove that. So for the interim, I've decided to finally throw in a couple quick lines of code to do the trick. Throw it in any plugin you want or make a standalone file, it works fine with my 2.6.1 so far.</p>
<blockquote><pre>add_action('init', 'chop_index');

function chop_index() {
   if(preg_match('/index\.php$/', $_SERVER['REQUEST_URI'])) {
        $url = preg_replace('/index\.php$/', '/', $_SERVER['REQUEST_URI']);
        $url = preg_replace('/\/\/$/', '/', $url);
        header("Location: http://".$_SERVER['HTTP_HOST'].$url, true, 301); exit();
   }
}</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/08/16/simple-wordpress-hack-redirect-the-indexphp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Netflix - The Company That Actually Gives A Crap</title>
		<link>http://michaelshadle.com/2008/08/13/netflix-the-company-that-actually-gives-a-crap/</link>
		<comments>http://michaelshadle.com/2008/08/13/netflix-the-company-that-actually-gives-a-crap/#comments</comments>
		<pubDate>Thu, 14 Aug 2008 07:53:42 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Consumerism]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/?p=64</guid>
		<description><![CDATA[You know, Netflix is neat. Not only is their website pretty simple and clean, the company itself seems to "do right" by its customers too. Today is the second time they've made me feel warm and fuzzy being a customer. The first time was when they decided to change their rate plans to be cheaper [...]]]></description>
			<content:encoded><![CDATA[<p>You know, Netflix is neat. Not only is their website pretty simple and clean, the company itself seems to "do right" by its customers too. Today is the second time they've made me feel warm and fuzzy being a customer. The first time was when they decided to change their rate plans to be cheaper and automatically started charging me less. A lot of companies drop the price on their monthly rates and you have to re-signup or call and complain, etc...</p>
<blockquote><p>Dear Michael,</p>
<p>Great news! We're lowering the price of your 3 DVDs out at-a-time plan to $16.99 a month plus applicable taxes. Now you can enjoy Netflix for less!</p>
<p>You don't need to do a thing - except pay less. Your membership will automatically move to the lower price and be reflected in your Membership Terms and Details. The lower price will take effect beginning with your statement on or after July 23, 2007.</p>
<p>Membership Terms and Details: http://www.netflix.com/Terms</p>
<p>Your $16.99 plan not only gives you 3 DVDs out at-a-time but you can also watch 17 hours of movies and TV episodes instantly on your PC each month - for no additional charge.</p>
<p>Check it out: http://www.netflix.com/WatchNow</p>
<p>Enjoy!<br />
Your friends at Netflix</p></blockquote>
<p>Now <em>that</em> is cool. But then they've given me another reason to praise them. They're reporting disc shipment issues, and being nice about it, they've just decided to issue a credit since we're technically losing a few days of service. They didn't <em>have</em> to do that, but they did.</p>
<p>I just received this email today:</p>
<blockquote><p>We're Sorry DVD Shipments Are Delayed  </p>
<p>Dear Michael,</p>
<p>Our shipping system is unexpectedly down. We received a DVD back from you and should have shipped you a DVD, but we likely have not. Our goal is to ship DVDs as soon as possible, and we will keep you posted on the status of your DVD shipments.</p>
<p>We are sorry for any inconvenience this has caused. If your DVD shipment is delayed, we will be issuing a credit to your account in the next few days. You don't need to do anything. The credit will be automatically applied to your next billing statement.</p>
<p>Again, we apologize for the delay and thank you for your understanding. If you need further assistance, please call us at 1-888-638-3549.</p>
<p>-The Netflix Team</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/08/13/netflix-the-company-that-actually-gives-a-crap/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Windows Never Ceases To Amaze...</title>
		<link>http://michaelshadle.com/2008/06/15/windows-never-ceases-to-amaze/</link>
		<comments>http://michaelshadle.com/2008/06/15/windows-never-ceases-to-amaze/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 07:04:10 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Consumerism]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/2008/06/15/windows-never-ceases-to-amaze/</guid>
		<description><![CDATA[I think I keep my machines pretty well up to date. I'm fixing up my girlfriend's computer right now, and I finally got all the updates applied except apparently one got missed. Okay, simple enough right?
Step #1: Install .NET Framework 1.0, click "Check for updates" - what? there's another update?
Step #2: Install .NET Framework 1.1 [...]]]></description>
			<content:encoded><![CDATA[<p>I think I keep my machines pretty well up to date. I'm fixing up my girlfriend's computer right now, and I finally got all the updates applied except apparently one got missed. Okay, simple enough right?</p>
<p>Step #1: Install .NET Framework 1.0, click "Check for updates" - what? there's another update?</p>
<p>Step #2: Install .NET Framework 1.1 Service Pack 1, click "Check for updates" - what? ANOTHER one?</p>
<p>Step #3: Install .NET Framework 1.1 Service Pack 1 security update, click "Check for updates" ...</p>
<p>Really? Why couldn't we have a pre-packaged full install? Why do I have to run this "check for updates" over and over (and why does it take so goddamn long nowadays?)</p>
<p>Okay, looks like that really was the last update and this machine is now 100% up to date. At least for the moment...</p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/06/15/windows-never-ceases-to-amaze/feed/</wfw:commentRss>
		</item>
		<item>
		<title>RK: Igor Sysoev</title>
		<link>http://michaelshadle.com/2008/06/14/rk-igor-sysoev/</link>
		<comments>http://michaelshadle.com/2008/06/14/rk-igor-sysoev/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 17:41:03 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Respect Knuckles]]></category>

		<category><![CDATA[igor sysoev]]></category>

		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/2008/06/14/rk-igor-sysoev/</guid>
		<description><![CDATA[At first I thought Lighttpd was the cat's meow. After talking with Andrei (who maintains PHP-FPM) I thought - if he got PHP-FPM right, he must know his stuff. He recommended I try nginx - and boy am I glad I did.
Igor is an interesting character to me. He is very matter-of-fact, he has no [...]]]></description>
			<content:encoded><![CDATA[<p>At first I thought Lighttpd was the cat's meow. After talking with Andrei (who maintains PHP-FPM) I thought - if he got PHP-FPM right, he must know his stuff. He recommended I try nginx - and boy am I glad I did.</p>
<p>Igor is an interesting character to me. He is very matter-of-fact, he has no problem issuing patches almost instantly to enhance his product, and he also has no problem being short with people when rejecting an idea or informing them they're wrong. To me it seems like sometimes people who maintain projects try to be more politically correct, but from what I've seen, Igor seems to be extremely technical by heart, and does not really stop to smell the flowers (at least on the mailing list...)</p>
<p>Igor gets mad props for creating nginx - quite possibly the most efficient web/proxy server on earth. For a bit I was using it to proxy 4+ million web requests a day (small php, html, graphics and even larger file and video downloads) through a single server, doing gzip as well - and it handled it all without using more than 14 megs of physical RAM. Nginx is such an engineering feat that I've actually started contemplating how to re-do my architecture since it is totally viable now to have a single frontend server proxying all the dynamic requests to dedicated FastCGI servers. No need really to be running multiple nginx instances anymore... one handles everything!</p>
<p>Anyway, back to Igor - my new goal in life is not only to help promote PHP-FPM but now nginx as well. There's only a couple minor things I wish nginx would do a bit better, but otherwise, it is my web solution and possibly even my proxy solution to replace LVS. Who would have thought a userland daemon could be so efficient? Even though Igor maintains nginx almost 100% by himself, releases come out often, he can produce patches to fix bugs or add features within a couple hours, and he usually replies to emails within the same day on the mailing list. I haven't seen that level of support from any other open source project, much less commercial products. "Want a patch? Wait for our next release in six months!"</p>
<p>Igor's website is at <a href="http://sysoev.ru/en/">http://sysoev.ru/en/</a>, however it doesn't really have much info on it - and you'll probably be looking for nginx at <a href="http://nginx.net/">http://nginx.net/</a> anyway. Thanks Igor <img src='http://michaelshadle.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/06/14/rk-igor-sysoev/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WordPress+nginx Rewrite Rules - Stop The Insanity!</title>
		<link>http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/</link>
		<comments>http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/#comments</comments>
		<pubDate>Thu, 01 May 2008 16:00:20 +0000</pubDate>
		<dc:creator>mike</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<category><![CDATA[WordPress]]></category>

		<category><![CDATA[nginx rewrite rules wordpress mod_rewrite]]></category>

		<guid isPermaLink="false">http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/</guid>
		<description><![CDATA[Note: this has been outdated now. I have an updated post with the latest and Igor-approved method here.
When I was switching over to nginx, I found a handful of random and overkill config examples to make it work. I thought I had found the simplest solution already, but Igor (the creator of nginx) actually gave [...]]]></description>
			<content:encoded><![CDATA[<p>Note: this has been outdated now. I have an updated post with the latest and Igor-approved method <a href="http://michaelshadle.com/2008/08/17/nginx-wordpress-redux/">here</a>.</p>
<p><strike>When I was switching over to nginx, I found a handful of random and overkill config examples to make it work. I thought I had found the simplest solution already, but Igor (the creator of nginx) actually gave me an even "better" solution in nginx.</p>
<p>This is assuming WordPress is physically installed in /wordpress, and pages are served up using friendly URLs, /2008/02/03/post-title/ - just like this site. All the rewrites are off the root. I assume you've already got PHP setup to parse properly and you have a working server {} block. I'll post that info too if people really need it.</p>
<p>1st example (seems like overkill, can't figure out a reason why people are splitting up the rewrite rules - I guess because they assume "wp-anything" is all static?):</p>
<blockquote><p>if (!-e $request_filename) {<br />
      rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2  break;<br />
      rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;<br />
      rewrite ^ /index.php last;<br />
}</p></blockquote>
<p>2nd example (this was as good as I thought it could be, but I was wrong):</p>
<blockquote><p>if (!-e $request_filename) {<br />
   rewrite ^(.+)$ /wordpress/index.php?q=$1 last;<br />
}</p></blockquote>
<p>3rd example (this is the best, according to Igor):</p>
<blockquote><p>error_page 404 = /wordpress/index.php?q=$uri;</p></blockquote>
<p>(Ref: <a href="http://article.gmane.org/gmane.comp.web.nginx.english/4739">http://article.gmane.org/gmane.comp.web.nginx.english/4739</a>)</strike></p>
]]></content:encoded>
			<wfw:commentRss>http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
