<?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" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>warwickp.com: Warwick Poole</title>
 
 <link href="http://warwickp.com/" />
 <updated>2010-09-02T14:43:18-04:00</updated>
 <id>http://warwickp.com/</id>
 <author>
   <name>Warwick Poole</name>
   <email>wpoole@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/warwickp" /><feedburner:info uri="warwickp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Ultimate wakeup device: The Skype-enabled coffee machine</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/P6-70DuPkUM/ultimate-wakeup-device" />
   <updated>2010-09-02T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/09/ultimate-wakeup-device</id>
   <content type="html">&lt;p&gt;Do you enjoy fresh coffee? Ever sleep through a wakeup alarm and miss something important? I have an idea and I think I could get &lt;a href="http://sports.espn.go.com/golf/news/story?id=5495576"&gt;Jim Furyk&lt;/a&gt; to fund the development of it.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/ipad_coffee_pot.png" alt="Skype enabled auto grinding coffee machine" /&gt;&lt;/p&gt;

&lt;p&gt;This is the iPad version. This auto-grinding coffee pot has a built-in charging iPad dock and comes with a free iPad app. You also need &lt;a href="http://www.skype.com/intl/en-us/prices/"&gt;Skype&lt;/a&gt; installed and Skype out credits. This is how it works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At night you put your iPad in the dock and start the iPad app.&lt;/li&gt;
&lt;li&gt;Insert a new vacuum-sealed coffee bean cartridge in the top of the machine. This is our revenue stream.&lt;/li&gt;
&lt;li&gt;In the app: Set the time you want to wake up.&lt;/li&gt;
&lt;li&gt;In the app: Set your phone number.&lt;/li&gt;
&lt;li&gt;In the app: Set your emergency phone number(s). Could be your office, your boss, your Mom or your caddy (&lt;a href="http://en.wikipedia.org/wiki/Mike_Cowan"&gt;Fluff?&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;5 mins before your wakeup time, the app starts the bean grinder and starts to make the coffee.&lt;/li&gt;
&lt;li&gt;At your wakeup time the app calls your phone number via Skype with a wake up message.&lt;/li&gt;
&lt;li&gt;A timer starts, you now need to lift the coffee pot and pour out a cup of coffee before the timer runs out.&lt;/li&gt;
&lt;li&gt;A weight scale detects if you have poured coffee or not.&lt;/li&gt;
&lt;li&gt;If you fail to pour coffee before the timer ends the app will &lt;em&gt;call your emergency number(s)&lt;/em&gt; and report you are sleeping.&lt;/li&gt;
&lt;li&gt;If you lift the coffee pot in time, the app quits and opens up your &lt;a href="http://www.glasshouseapps.com/apps.html#t1"&gt;RSS reader&lt;/a&gt; for you to read over coffee.&lt;/li&gt;
&lt;/ul&gt;


&lt;br/&gt;


&lt;p&gt;Note:
The machine could also be available as a Linux enabled device (no need for an iPad), have onboard Wi-Fi and use something like &lt;a href="http://skype4py.sourceforge.net/doc/html/"&gt;Skype4Py&lt;/a&gt; for the telephony.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/P6-70DuPkUM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/09/ultimate-wakeup-device</feedburner:origLink></entry>
 
 <entry>
   <title>Is UCEPROTECT running a protection racket?</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/zX6N_Q3CiN8/uceprotect-protection-racket" />
   <updated>2010-08-19T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/uceprotect-protection-racket</id>
   <content type="html">&lt;p&gt;There may be a bulkmail flyer business operating out of your suburb somewhere. Assume there is, just humor me. Imagine then if a mail carrier standing in front of a mailbox in Alaska is about to deposit the Christmas card you wrote to your pal in Anchorage into your pal's mailbox. But before the mail carrier opens the mailbox, he looks at your return address and then he takes out his cellphone and calls someone who we'll call Scumbag Bob. He asks Scumbag Bob if there has ever been a report of junkmail originating from your zipcode. Turns out there has been. In fact, Scumbag Bob tells him, your zipcode is a source of lots of junkmail because remember you've got a junkmail business down the road from you. The mail carrier then refuses to deliver your postcard to your pal, instead he returns it to you with a note to contact Scumbag Bob.&lt;/p&gt;

&lt;p&gt;All is not lost though! You can easily fix the situation. You can complain to your city council. Once they have had some meetings, eaten some donuts, maybe had a few fist fights and finally closed down all junkmail businesses in your zipcode, they can then talk to Scumbag Bob and get your zipcode removed from his list. Then your cookie recipes will be zipping around the world again.&lt;/p&gt;

&lt;p&gt;OR... If YOU PAY Scumbag Bob $20/month, he will remember to tell mail carriers that even though your zipcode is a known source of junkmail, they should allow your (and only yours) letters through because you are a decent enough fellow.&lt;/p&gt;

&lt;p&gt;Of course everyone knows that a scam like this would never fly. First of all, why should your entire zipcode suffer because of the junkmail business down the road from you? Secondly, no self respecting mail carrier would subscribe to that kind of service, right? And thirdly, Scumbag Bob would be put out of business because it's just a ridiculous (and borderline illegal) idea anyway.&lt;/p&gt;

&lt;p&gt;Well, ladies and gentlemen, I present to you Scumbag Bob. He is known as &lt;a href="http://www.uceprotect.net/en/index.php?m=7&amp;s=8"&gt;UCEPROTECT-network&lt;/a&gt; and he sells his services as &lt;a href="http://www.whitelisted.org/"&gt;whitelisted.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is UCEPROTECT trying to get me to pay them $18/month to whitelist my own specific IPs because they have blacklisted my entire ISP. That's every IP address at my entire datacenter apparently.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://img.skitch.com/20100820-dejkqesa9ks5c2i7gjm4d2n8mn.jpg"&gt;&lt;img src="http://img.skitch.com/20100820-dejkqesa9ks5c2i7gjm4d2n8mn.jpg" width="750" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Based on the above, I have to urge reasonable email server administrators to NOT subscribe to &lt;a href="http://www.uceprotect.net/en/index.php?m=7&amp;amp;s=8"&gt;UCEPROTECT Level-3&lt;/a&gt;, which seems like a massive scam to me.&lt;/p&gt;

&lt;p&gt;My ISP reports endless problems trying to get removed from this UCEPROTECT RBL. In fact, given the shady extortion fee system they have going here, I suspect UCEPROTECT are in the business of keeping innocent bystander IPs on their blacklists, and getting paid to remove them.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/zX6N_Q3CiN8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/uceprotect-protection-racket</feedburner:origLink></entry>
 
 <entry>
   <title>Ezra leaves Engine Yard</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/gQTrxY4QUYQ/230" />
   <updated>2010-08-14T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/230</id>
   <content type="html">&lt;a href="http://brainspl.at/articles/2010/08/13/4-years-at-engine-yard-what-a-long-strange-trip-its-been"&gt;Classy exit&lt;/a&gt; from Engine Yard by Ezra. When my wife and I were thinking of names for our son, she really wanted to name him &lt;i&gt;Ryland&lt;/i&gt;. I said something akin to &lt;i&gt;"No reasonable human being has ever named their son Ryland"&lt;/i&gt;. I stand corrected. Related: I met &lt;a href="http://www.linkedin.com/in/tmornini"&gt;Tom Mornini&lt;/a&gt; at &lt;a href="http://bizconf.org/"&gt;BizConf&lt;/a&gt; recently in an inauspicious way. Standing outside a conference room chatting to this interesting guy, I asked him what he does. &lt;i&gt;"Oh, founder of Engine Yard"&lt;/i&gt; said Tom. &lt;i&gt;"Oh"&lt;/i&gt; said I, and felt like an idiot.&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/gQTrxY4QUYQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/230</feedburner:origLink></entry>
 
 <entry>
   <title>Never Work For Free</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/OFQeSyI9gNc/never-work-for-free" />
   <updated>2010-08-12T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/never-work-for-free</id>
   <content type="html">&lt;p&gt;&lt;img src="/images/billboardfamily-are-spammers.jpg" alt="billboardfamily-are-spammers" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.knowhr.com/blog/2010/06/03/have-some-dignity-never-work-for-nothing/"&gt;Never work for free&lt;/a&gt;. I don't do consulting work anymore. However, about an hour ago I got a little email...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: (no subject)&lt;/p&gt;

&lt;p&gt;I need a plugin that does EXACTLY what the calendar here does:  &lt;a href="http://www.iwearyourshirt.com/calendar"&gt;www.iwearyourshirt.com/calendar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am also interested in possibly another simple plugin that uses innerHTML, and your SEO services.&lt;/p&gt;

&lt;p&gt;This is a start-up business, so there is not a lot of $$ to go around as of now. I have done all the web design so far, but modifying/writing plugins is something that will be a bit too time consuming for someone with limited experience, like myself. I am really looking for someone, or some company, who is interested in doing this project for me in exchange for a one year spot as a partner on our homepage (this is valued at $12,000...that is what we are charging for these spots, just like our competitor), and the pick of any day of the year for advertising (Up to a $800 value depending on the day). If you want to see what we do (i know the site is not too informative yet), go to &lt;a href="www.iwearyourshirt.com"&gt;www.iwearyourshirt.com&lt;/a&gt; . They do the same thing we do, but we are an entire family, and we are more visible than they are overall. I can say that people will see your work on our site first hand, and you will get a lot of exposure from this project. Let me know what you think.  Thanks.&lt;/p&gt;

&lt;p&gt; Carl Martin | &lt;a href="www.billboardfamily.com"&gt;www.billboardfamily.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Follow Us On Twitter: &lt;a href="http://www.twitter.com/billboardfamily"&gt;http://www.twitter.com/billboardfamily&lt;/a&gt;&lt;br/&gt;
Become A Fan On Facebook: http://www.facebook.com/BillboardFamily&lt;br/&gt;
Facebook (Carl): http://www.facebook.com/CarlMartin.BillboardFamily&lt;br/&gt;
Facebook (Amy): http://www.facebook.com/AmyMartin.BillboardFamily&lt;br/&gt;
Follow Us On Tumblr: http://billboardfamily.tumblr.com/&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;Hi Carl Martin (AND FAMILY!)&lt;/p&gt;

&lt;p&gt;Yes, I'd love to do some work for you for a promise of exposure on your site, especially since your idea is so original! $12,000 value? Count me in.&lt;/p&gt;

&lt;p&gt;Thanks for the unsolicited mail. You make the Internet a much better place.&lt;/p&gt;

&lt;p&gt;Best,&lt;br/&gt;
Warwick Poole&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;Are you being sarcastic?&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;The message sounded a bit sarcastic. Sorry if I misunderstood you. If you are really interested in designing these plugins for us, let me know how you want to proceed. Have you developed any other Wordpress plugins?&lt;/p&gt;

&lt;p&gt;Thanks&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;I did a plugin which is featured on this page: &lt;a href="http://www.27bslash6.com/p2p2.html"&gt;http://www.27bslash6.com/p2p2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you ever seen it?&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;No....what is the plugin called, and what does it do?&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;The plugin is called OneSmallChange.&lt;br/&gt;
Essentially you take an existing original idea, make one small change, and wait for success.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;ok, so when can you have the plugins I need finished?&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;Sorry I misspoke earlier.
When you asked:&lt;/p&gt;

&lt;p&gt;&gt; &lt;em&gt;Are you being sarcastic?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I meant to say "yes". But I typed "no" for some reason.
My mistake.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;Way to run a business...what a douche bag&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Martin Family&lt;/em&gt;&lt;br/&gt;
Carl, Amy, Carrera, Layne, and Kaitlyn&lt;br/&gt;
martinfamily2005@yahoo.com&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/aline.jpg" alt="line" /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: Warwick Poole&lt;br/&gt;
&lt;strong&gt;Date&lt;/strong&gt;: Thu, Aug 12, 2010 at 2:17 PM&lt;br/&gt;
&lt;strong&gt;To&lt;/strong&gt;: Martin Family&lt;br/&gt;
&lt;strong&gt;Subject&lt;/strong&gt;: re: (no subject)&lt;/p&gt;

&lt;p&gt;Good luck Martin Family!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/OFQeSyI9gNc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/never-work-for-free</feedburner:origLink></entry>
 
 <entry>
   <title>Navarro, the cat with <del>Buffalo</del> Butterfly wings</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/CzckPPkRz0I/marinating-cat" />
   <updated>2010-08-12T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/marinating-cat</id>
   <content type="html">&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Butterfly_effect"&gt;Butterfly effect&lt;/a&gt;. &lt;em&gt;Small differences in the initial condition of a dynamical system may produce large variations in the long term behavior of the system&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;To illustrate: A clearly insane person in Buffalo, and his unfortunate (but ultimately lucky) cat Navarro, &lt;a href="http://www.buffalonews.com/city/article97630.ece"&gt;conspire together&lt;/a&gt; to flap their butterfly wings through Google indices directly to my browser's search bar.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/google_cat.jpg" title="Poor cat" alt="marinating cat in my browser" /&gt;&lt;/p&gt;

&lt;p&gt;Of course, that's not really how the &lt;a href="http://www.boston.com/bostonglobe/ideas/articles/2008/06/08/the_meaning_of_the_butterfly/?page=full"&gt;the Butterfly effect was actually first described&lt;/a&gt; by Edward Lorenz. Neat, correlating pairs of cause and effect are not implied.&lt;/p&gt;

&lt;p&gt;Regardless, perhaps the person who let Mr. Korkuc adopt little Navarro from the SPCA should have a quick bath in &lt;a href="http://www.davesgourmet.peachhost.com/ct_PRdain.htm"&gt;Dave's Insanity Sauce&lt;/a&gt;?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/CzckPPkRz0I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/marinating-cat</feedburner:origLink></entry>
 
 <entry>
   <title>Calling out the spammers</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/M8tXs72Q9ks/calling-out-the-spammers" />
   <updated>2010-08-10T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/calling-out-the-spammers</id>
   <content type="html">&lt;p&gt;It's not going to help. Not even one bit. Regardless, I'm going to maintain a little list here of the companies who call me at home, unsolicited, or who spam me in other obvious ways.&lt;/p&gt;

&lt;p&gt;I've had Comcast voice for 5 months, never really use it. I don't even know the number, so I've never given it to anyone, or signed up for any service using it. I didn't pay the &lt;a href="http://img.skitch.com/20100227-9rjc1bpdt3ya1hdh43kqy3ed2.jpg"&gt;Comcast extortion fee&lt;/a&gt; to not go into their list they sell to the charlatans of the world. The price I pay is around 8 spam calls a week.&lt;/p&gt;

&lt;p&gt;Without further ado, I present to you the bottom feeders of the world. Here are the companies our world would be a better place without.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://www.synovate.com/"&gt;Synovate&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Oh my God, just the name. You can feel the lizardy skin. Seriously, this is the name that &lt;a href="http://en.wikipedia.org/wiki/Bill_Lumbergh"&gt;Lumbergh&lt;/a&gt; would have called &lt;a href="http://www.google.com/images?q=initech+logo"&gt;Initech&lt;/a&gt; had he founded it. They called me to ask my opinion on some bullshit for their global opinion poll. I was off the phone before I could hear the Earth shattering topic of the poll. My opinion: Life is short and you, Synovate employees, spend your time making the world a worse place FOR ALL OF US. Do you get calls at home? Go and do something else. And Synovate customers: It occurs to me you may not know the source of the data in those pretty charts Synovate hand you, in the same way you may not know the source of the "meat" in your hotdog. Well, I'll tell you: The data comes from people in their homes at 8:30pm, trying to put their 11 month old son to sleep, and after finally getting him to sleep after two hours, guess who calls to wake him up? Nope, not Grandpa Joe, it's Bob from Synovate to ask me if I use some kind of dish detergent you make. Well guess what, I do now, and it's to make bombs. &lt;em&gt;(Side note: I don't know if detergent can make bombs. Please don't make bombs, I don't make bombs. FBI: I don't make bombs.)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://www.localedgemedia.com/"&gt;LocalEdge Media&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Most people have heard of the &lt;a href="http://www.rain-tree.com/facts.htm"&gt;disappearing rainforests&lt;/a&gt;. Let me present to you the people who don't give a shit: The owners of LocalEdge, &lt;a href="http://www.hearst.com/our-brands/index.php"&gt;Hearst Corporation&lt;/a&gt;. These people dropped a massive deadtree "Yellow Pages" (I don't care to know the various types of spambooks) directory on every driveway in the whole Charleston area. Even if you ask them not to. Near as I can tell, they then get some call center in India to call you up and GET YOU TO PAY THEM FOR IT. Wow. Soak that in. Holy crap, these people walk among us. And so thousands of companies must be paying these people to print these books. And so when your grandchild sits on your knee and says &lt;em&gt;"Grandpa, what did you put gifts under before there were Christmas carbon fiber poles?"&lt;/em&gt;, I hope you, dear tax accountant in Mount Pleasant, treasure that ad you paid the devil to chop down a tree and print in the blood of our planet. I am building a retaliatory slingshot which will propel deadtree books back at the vehicle which tossed them on my driveway, but at 400 feet per second. &lt;em&gt;PS: You are reading this on the Internet. &lt;a href="https://adwords.google.com"&gt;The Internet can be used to advertise your business&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;To be continued...&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/M8tXs72Q9ks" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/calling-out-the-spammers</feedburner:origLink></entry>
 
 <entry>
   <title>Migrated off WordPress to Jekyll on Heroku</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/IG9dPq-pppg/289" />
   <updated>2010-08-09T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/289</id>
   <content type="html">Two hours work and this blog is now managed with &lt;a href="http://github.com/mojombo/jekyll"&gt;Jekyll&lt;/a&gt;, currently running on &lt;a href="http://heroku.com"&gt;Heroku&lt;/a&gt;. Easy. No more WordPress updates and my life moves closer to total immersion in Git. No doubt some things are broken, and I've yet to move a few image galleries. Some day soon I'll make this blog not ugly.&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/IG9dPq-pppg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/289</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Afrikaans on 'Three Wishes'</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/rVS9VpE2nd4/288" />
   <updated>2010-08-09T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/08/288</id>
   <content type="html">Does anyone know the background to the Afrikaans woman on the Roger Waters track &lt;a href="http://rd.io/x/QHdIK25ugw"&gt;Three Wishes&lt;/a&gt; on Amused to Death? &lt;a href="http://thinkfloyd.free.fr/paroles/amused.htm#amused12"&gt;Creepy&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/rVS9VpE2nd4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/08/288</feedburner:origLink></entry>
 
 <entry>
   <title>Debugging Rails processes under Phusion Passenger with nginx.</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/WKbYcdXhpeE/debugging-rails-processes-under-phusion-passenger-with-nginx" />
   <updated>2010-06-14T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/06/debugging-rails-processes-under-phusion-passenger-with-nginx</id>
   <content type="html">&lt;p&gt;If you are involved in web operations you'll no doubt be familiar with this problem: Everything is running along smoothly and suddenly an anomalous load spike occurs which does not correlate to a traffic spike or any problem on which you have any data. Last week this very thing occurred in a mature Rails application which runs under &lt;a href="http://www.modrails.com/"&gt;Phusion Passenger&lt;/a&gt; on &lt;a href="http://nginx.org/"&gt;nginx&lt;/a&gt;. The initial symptom was a rapid CPU spike (Rails processes in user space) and then Rails processes becoming stuck on a single request. This rapidly brought on a typical web server death spiral: Increasing CPU usage, increasing memory usage, eventually swapping occurs and/or the application server runs out of available processes in the pool. Frustrated users hit refresh and the issue compounds.
&lt;/p&gt;


&lt;p&gt;
&lt;img class="size-full wp-image-415" title="web_load-1" src="/images/web_load-1.jpg" alt="" width="414" height="228" /&gt;
&lt;/p&gt;


&lt;p&gt;
In my experience the order of likely causes of a problem goes like this: Buggy code recently deployed, large and expensive reports being run, or network (or firewall) problems causing processes to hang on IO operations. How to troubleshoot this problem on Passenger?
&lt;/p&gt;


&lt;p&gt;
Checking the output of &lt;a href="http://modrails.com/documentation/Users%20guide%20Nginx.html#_inspecting_phusion_passenger_8217_s_internal_status"&gt;passenger-status&lt;/a&gt; we were seeing Rails processes not completing requests, the "Processed" column for certain Rails processes were not incrementing, indicating these processes were somehow stuck, thereby decreasing the pool of available processes for subsequent requests. Attaching to these stuck processes with &lt;a href="http://linux.die.net/man/1/strace"&gt;strace&lt;/a&gt; revealed no activity in the process at all. Similarly, using &lt;a href="http://github.com/tmm1/gdb.rb"&gt;gdb.rb&lt;/a&gt; revealed nothing immediately useful. Strangely we were seeing some Rails processes continuing to run even after they were no longer being actively managed by Passenger, at least according to the output of passenger-status, in which these processes no longer appeared.
&lt;/p&gt;


&lt;p&gt;
First I upgraded Passenger (using &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt;, of course) to the latest version on one server, to see if there was a Passenger bug causing this problem. The issue persisted. Making things a bit more complicated we had recently moved a &lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt; instance to a different part of the network, and all the stuck Rails processes had open network connections to this memcached instance, leading me to wonder if it was this network IO which was somehow causing the Rails process to hang. I could find no problems between the application servers and the memcached port and no logs of any network issues there. So what are the stuck Rails processes stuck on?
&lt;/p&gt;


&lt;p&gt;
The way to troubleshoot this problem on Passenger is to  &lt;strong&gt;issue a &lt;/strong&gt;&lt;a href="http://modrails.com/documentation/Users%20guide%20Nginx.html#debugging_frozen"&gt;&lt;strong&gt;kill -SIGABRT&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; to the stuck Rails processes&lt;/strong&gt;, and find their backtrace in the Rails log. Looking at the backtraces we were able to track the issue down to a bug in a Ruby gem which was being used to generate certain types of reports. Disabling this reporting prevented new occurrences of the problem until the underlying issue can be resolved. An interesting combination of two usual suspects: Reporting and code library bugs.

&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/WKbYcdXhpeE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/06/debugging-rails-processes-under-phusion-passenger-with-nginx</feedburner:origLink></entry>
 
 <entry>
   <title>Vodafone / Vodacom 3G in South Africa</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/J6RtfeWDYSg/vodafone-vodacom-3g-in-south-africa" />
   <updated>2010-05-17T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/05/vodafone-vodacom-3g-in-south-africa</id>
   <content type="html">&lt;p&gt;I’m in South Africa for 2 weeks and am using a Vodafone Huawei USB 3G card on my Macbook Pro with Snow Leopard. Here are a few tips I found useful:&lt;/p&gt;

&lt;p&gt;Brandon West’s &lt;a href="http://brandonmwest.com/hardware/using-a-vodacomvodafone-3g-card-on-mac-os-x"&gt;post&lt;/a&gt; was very useful in getting started.&lt;/p&gt;

&lt;p&gt;Summary: Download and install &lt;a href="http://www.vodacom4me.co.za/vodacom4me-personal-resources/downloads/vodacom/VodafoneMCInstaller.2.11.04.00.dmg.zip"&gt;VodafoneMCInstaller&lt;/a&gt; then add the 3G card as a network interface and change the settings as mentioned in Brandon’s post.&lt;/p&gt;

&lt;p&gt;To get online you’ll need to open the Vodafone application, and use the 3G card’s pin number to Activate your modem every time you connect. Once activated, you need to then dial up the modem using the Network panel in System Preferences.&lt;/p&gt;

&lt;p&gt;Because your Vodacom 3G account is a metered account, and I’m not used to conserving bandwidth in any way, I found &lt;a href="http://www.skoobysoft.com/utilities/utilities.html#surplusmeter"&gt;SurplusMeter&lt;/a&gt; very useful to watch my usage.&lt;/p&gt;

&lt;p&gt;&lt;img src="/images/surplus-meter.jpg"&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/J6RtfeWDYSg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/05/vodafone-vodacom-3g-in-south-africa</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby self-throttling Nagios alerts</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/8i3FTPRPtDg/ruby-self-throttling-nagios-alerts" />
   <updated>2010-03-19T00:00:00-04:00</updated>
   <id>http://warwickp.com/2010/03/ruby-self-throttling-nagios-alerts</id>
   <content type="html">&lt;p&gt;If you use &lt;a href="http://www.nagios.org/"&gt;Nagios&lt;/a&gt; no doubt you've experienced a situation where a network issue has triggered an alert on every service on every server. There are a few ways to deal with this in Nagios, but after spending 10 minutes deleting SMS messages on my iPhone I decided to implement an alert system which will self throttle and not allow a gigantic flood of alerts.&lt;/p&gt;

&lt;p&gt;In Nagios I created 2 notify commands, one for host notifications and another for service notifications:&lt;/p&gt;

&lt;script src="http://gist.github.com/470448.js?file=gistfile1.sh"&gt;&lt;/script&gt;


&lt;p&gt;Then throttle_alert.rb uses a control file to determine how long it has been since the previous alert, and will redirect alerts to a secondary (non-SMS) email address (and note the throttling in the alert itself) if an alert occurs inside the throttled window (90 seconds in this example):&lt;/p&gt;

&lt;script src="http://gist.github.com/470449.js?file=gistfile1.rb"&gt;&lt;/script&gt;


&lt;p&gt;Not rocket science and not perfect but it works to prevent draining my iPhone battery in a single incident.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/8i3FTPRPtDg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/03/ruby-self-throttling-nagios-alerts</feedburner:origLink></entry>
 
 <entry>
   <title>Configuration Management with Chef on Debian, Part 2</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/yPdm9C9Ktsc/configuration-management-with-chef-on-debian-part-2" />
   <updated>2010-01-09T00:00:00-05:00</updated>
   <id>http://warwickp.com/2010/01/configuration-management-with-chef-on-debian-part-2</id>
   <content type="html">&lt;p&gt;At &lt;a href="http://www.getharvest.com/"&gt;Harvest&lt;/a&gt; we are working on putting Chef into production use rapidly. &lt;img class="size-full wp-image-349 alignleft" title="Chef" src="/images/ratatouille_skinner-e1263074683907.jpg" alt="" width="27" height="49" /&gt;In &lt;a href="http://warwickp.com/2009/12/configuration-management-with-chef-on-debian-part-1/"&gt;part 1&lt;/a&gt; I gave you an overview of how to get your &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt; server and client installed. There wasn't anything really Chefy in that post. In fact, some of the things in that post were done in a decidedly un-Cheflike manor. Seven lashings for me. Let's look now at getting a first basic configuration task done with Chef.&lt;/p&gt;

&lt;p&gt;&lt;img class="alignright size-full wp-image-341" src="/images/2781703346_f56bb0cf70-e1263045165651.jpg" alt="No hands" width="80" height="80" /&gt;Previously we installed Chef from the &lt;a href="http://www.opscode.com/"&gt;Opscode&lt;/a&gt; Debian packages and then replaced the Chef server URL in the Chef client configuration with &lt;a href="http://www.gnu.org/software/sed/"&gt;sed&lt;/a&gt; so that we could register and validate the Chef client with the Chef server for the first time. This obviously won't do, we need to manage all configuration files properly without little post-installation hacks in them. That is a core idea of the Chef. So let's now take control of the Chef client configuration files themselves with Chef.&lt;/p&gt;

&lt;p&gt;To do this we need to create a Chef cookbook called "chef" in our repo, in this cookbook we will create a recipe called "client" to handle the client stuff (as opposed to the Chef server stuff which can live happily side by side in the same cookbook but in different recipes), then we need to assign the Chef client recipe to a role (which we will call something like "base" because we are going to add it to all servers) and lastly we need to add that "base" role to our 2 nodes we have. Let's &lt;a href="http://en.wikipedia.org/wiki/Tim_Gunn"&gt;make it work, people&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img class="alignleft size-full wp-image-330" title="rake" src="/images/Bunker_Rake1-e1263045032406.gif" alt="Rake it like it's 1990" width="80" height="126" /&gt;My workflow right now is to have my Chef Git repo cloned on my local Mac and to work in there, then commit to this repo and push it to our origin. Then I login to the Chef server, which has it's own clone of the same repo on it, and then use Rake to pull the latest Git changes down and install them into the Chef server directories.&lt;/p&gt;

&lt;p&gt;So on my local Mac, lets create the skeleton dir structure for this new cookbook of ours. You could use Rake for this (rake new_cookbook COOKBOOK=chef) but where's the fun in letting someone else do all the menial labor for you?&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;git clone git@yourgitserver.yourdomain.com:your_chef_repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your_chef_repo
mkdir -p cookbooks/chef/attributes
mkdir -p cookbooks/chef/templates/default
mkdir -p cookbooks/chef/recipes
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now let's first define the attributes of our Chef client configuration. These are basically the values which we want in our config files. What we will now do is create some default values, which can be overridden in other places if we ever needed specific Chef client settings to be different on different servers for some reason.&lt;/p&gt;

&lt;p&gt;Here is our barebones cookbooks/chef/attributes/chef.rb&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_fqdn&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;chef.yourdomain.com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_port&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;4000&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:openid_port&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;4001&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:log&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/var/log/chef/client.log&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:log_level&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;debug&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:filecache&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/var/cache/chef&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;set_unless&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:pid&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/var/run/chef/client.pid&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, we need a template file, which is an &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/"&gt;ERB&lt;/a&gt; template, which our recipe will use to make these dreamy attributes appear on the filesystem somewhere in a fully cooked configuration file.&lt;/p&gt;

&lt;p&gt;This is what our cookbooks/chef/templates/default/client.erb looks like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="n"&gt;log_level&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= @node[:chef][:log_level] %&amp;gt;&lt;/span&gt;
&lt;span class="sx"&gt;log_location       &amp;quot;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:log&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&amp;quot;&lt;/span&gt;

&lt;span class="sx"&gt;ssl_verify_mode    :verify_none&lt;/span&gt;

&lt;span class="sx"&gt;registration_url   &amp;quot;http://&amp;lt;%= @node[:chef][:server_fqdn] %&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= @node[:chef][:server_port] %&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="sx"&gt;openid_url         &amp;quot;http://&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_fqdn&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;:&amp;lt;%= @node[:chef][:openid_port] %&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;template_url       &amp;quot;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= @node[:chef][:server_fqdn] %&amp;gt;:&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_port&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="sx"&gt;remotefile_url     &amp;quot;http://&amp;lt;%= @node[:chef][:server_fqdn] %&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= @node[:chef][:server_port] %&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="sx"&gt;search_url         &amp;quot;http://&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_fqdn&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;:&amp;lt;%= @node[:chef][:server_port] %&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;role_url           &amp;quot;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="ss"&gt;:/&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;%= @node[:chef][:server_fqdn] %&amp;gt;:&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:server_port&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="sx"&gt;%&amp;gt;&amp;quot;&lt;/span&gt;

&lt;span class="sx"&gt;file_cache_path    &amp;quot;&amp;lt;%= @node[:chef][:filecache] %&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;pid_file           &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="vi"&gt;@node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:chef&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="ss"&gt;:pid&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;%&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;OK, now let's create a chef::client recipe which will take the attributes and the template and combine them into cold hard configuration files. This is our cookbooks/chef/recipes/client.rb&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt; 
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:platform&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
 &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;debian&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ubuntu&amp;quot;&lt;/span&gt;

 &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/chef/client.rb&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;client.erb&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="mo"&gt;0644&lt;/span&gt;
    &lt;span class="n"&gt;owner&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;backup&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;OK, so now we have the attributes, the template and the recipe. Doesn't do us much good unless we somehow tell the Chef server that our nodes need to execute the chef::client recipe when the Chef client runs. So let's create our role, called "base". Here is roles/base.rb&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;All systems to get this role&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;recipes&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;chef::client&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;override_attributes&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;chef&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="s2"&gt;&amp;quot;server_fqdn&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;chef.yourdomain.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;log_level&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;info&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Something to notice here. In our attributes file earlier, we used set_unless to define a few attributes of this cookbook. But here in the role we are overriding them (with the same values in this case). The utility here is that using the exact same chef cookbook, we could create a new role, called something like base_london and use override_attributes in the Role definition to give those nodes a different value for server_fqdn.&lt;/p&gt;

&lt;p&gt;Now let's commit all of this new code we have written to our Chef git repo.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;git add *
git commit -a -m &lt;span class="s2"&gt;&amp;quot;adding our chef cookbook and role, first pass&amp;quot;&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, let's login to our Chef server, pull down all these new changes in our git repo and actually get this stuff into our running Chef server.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;ssh chef.yourdomain.com
git clone git@yourgitserver.yourdomain.com:your_chef_repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your_chef_repo
rake install
sudo /etc/init.d/chef-server restart
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;(The last step, the restart of the Chef server, is needed because we have added a new role. Your role you defined in the Ruby file above gets compiled to &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; and then is stored in &lt;a href="http://couchdb.apache.org/"&gt;CouchDB&lt;/a&gt;, and we need to bounce the CouchDB server in the 0.7 Chef series for your changes to become effective).&lt;/p&gt;

&lt;p&gt;&lt;img class="alignright size-full wp-image-370" src="/images/voodoo_knife_holder-e1263077860547.jpg" alt="Knife" width="90" height="90" /&gt;OK. So, now we have everything in place, except one. We haven't told the Chef server to actually apply the "base" role to our nodes. Now you would expect to use an elegant CLI tool which would use the Chef API to perform these types of operations on the Chef server. The good news is that &lt;a href="http://wiki.opscode.com/display/chef/Knife"&gt;Knife&lt;/a&gt; is that tool. The bad news is that I haven't tested Knife yet, and because you are on my blog you are &lt;a href="http://www.urbandictionary.com/define.php?term=S.O.L."&gt;SOL&lt;/a&gt;. So we'll be using the Chef web UI for this task until I get to try the Knife.&lt;/p&gt;

&lt;p&gt;So, login to http://chef.yourdomain.com:4000 using your OpenID login. Go to Nodes and click on "edit" next to one of your nodes listed there if both chef.yourdomain.com and web1.yourdomain.com are registered on the server, or whichever node you have been working on. What you need to do now is drag "base" from the Available Roles into the Run List and Save Node.&lt;/p&gt;

&lt;p&gt;So the final step you need to do is actually run chef-client on your server to actually fetch and apply the base role to it.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;sudo chef-client -l debug
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;If all went according to plan, then you should see that Chef is now managing the contents of /etc/chef/client.rb.&lt;/p&gt;

&lt;p&gt;This was a very simple quick example of how a Chef cookbook, recipe, role and runlist work together to Get Things Done. There is a whole lot more to a Chef cookbook than this. The next thing to do is to forget everything I just told you, thank the heavens for &lt;a href="http://twitter.com/jtimberman"&gt;jtimberman&lt;/a&gt; and &lt;a href="http://twitter.com/kallistec"&gt;kallistec&lt;/a&gt; and all the other fine Chefs who hang out in #chef on freenode. Take a look at some &lt;a href="http://github.com/opscode/cookbooks"&gt;real Cookbooks&lt;/a&gt; from these guys which really start to leverage the power of Chef.&lt;/p&gt;

&lt;p&gt;In part 3 of this series, coming out to coincide with &lt;a href="http://www.3drealms.com/duke4/"&gt;Duke Nukem Forever&lt;/a&gt;, I'll talk about a more advanced cookbook, and hopefully Knife. Thanks for staying this long.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/yPdm9C9Ktsc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/01/configuration-management-with-chef-on-debian-part-2</feedburner:origLink></entry>
 
 <entry>
   <title>Using multiple EC2 accounts with the EC2 API tools</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/qm5x7k_R23w/using-multiple-ec2-accounts-with-the-ec2-api-tools" />
   <updated>2010-01-04T00:00:00-05:00</updated>
   <id>http://warwickp.com/2010/01/using-multiple-ec2-accounts-with-the-ec2-api-tools</id>
   <content type="html">&lt;p&gt;Various projects I am involved with each have their own &lt;a href="http://aws.amazon.com/ec2/"&gt;Amazon EC2&lt;/a&gt; accounts. This means I have a few sets of certificates/keys to access and manage these different instances. My previous solution was a different user account on my Macbook Pro for each project. That is not very elegant at all. This is my new solution, which involves a set of dynamic bash aliases and a script to create them.&lt;/p&gt;

&lt;p&gt;To start, create a directory structure like this (preferably in a Git or SVN repo)&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;base/
accounts/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Then in accounts/, create a subdirectory for each project/client/ec2 account, and add 3 things to each subdirectory: the EC2 X.509 certificate, the EC2 private key and a single SSH private key to use for SSH access. So end up with a directory structure something like this, separated by client/project/account:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;base/
accounts/project1/cert-TYTYTHJHDJHDJHDJHDJH.pem
accounts/project1/pk-DNKJNFKDJNFFKJNDFKNSDFJ.pem
accounts/project1/id_dsa_project1
accounts/client55/cert-SASDASDASDASDASDASD.pem
accounts/client55/pk-UYWYWUYWUYNNSNSNS.pem
accounts/client55/mykey_client55
accounts/myappx/cert-XCMLKMLKMLKMLKM.pem
accounts/myappx/pk-CCJKJDKPOPOPOPPOP.pem
accounts/myappx/awskey_appx
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now we'll &lt;a href="http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip"&gt;download the latest EC2 API tools&lt;/a&gt; and expand them into base/, so we will have a directory structure like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;base/THIRDPARTYLICENSE.TXT
base/bin/ec2-add-group
base/bin/ec2-add-group.cmd
base/bin/ec2-add-keypair
base/bin/ec2-add-keypair.cmd
-- ETC -- OMITTING THE REST OF bin/
base/lib/activation-1.1.jar
base/lib/bcprov.jar
-- ETC -- OMITTING THE REST OF lib/
base/license.txt
base/notice.txt
accounts/project1/cert-TYTYTHJHDJHDJHDJHDJH.pem
accounts/project1/pk-DNKJNFKDJNFFKJNDFKNSDFJ.pem
accounts/project1/id_dsa_project1
-- ETC -- OMITTING THE REST OF accounts/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, we will use a simple bash script to generate a bash alias for each EC2 operation for each EC2 account we have. It essentially maps each EC2 command to the appropriate key and cert for each of our projects/clients.&lt;/p&gt;

&lt;p&gt;NOTE: This version sets up some environment variables which are specific to a Mac OS X &gt; Leopard environment. Yours may need different JAVA_HOME, if you are on a different OS, etc.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;JAVA_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/System/Library/Frameworks/JavaVM.framework/Home/
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EC2_TOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; dirname &lt;span class="nv"&gt;$BASH_SOURCE&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;EC2_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$EC2_TOP&lt;/span&gt;/base

&lt;span class="nv"&gt;ALL_ACCOUNTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; ls &lt;span class="nv"&gt;$EC2_TOP&lt;/span&gt;/accounts &lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;EC2_TOOLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; ls &lt;span class="nv"&gt;$EC2_HOME&lt;/span&gt;/bin | grep -v .cmd &lt;span class="k"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;THIS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="nv"&gt;THIS_CERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;a in &lt;span class="nv"&gt;$ALL_ACCOUNTS&lt;/span&gt;; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;THIS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; ls &lt;span class="nv"&gt;$EC2_TOP&lt;/span&gt;/accounts/&lt;span class="nv"&gt;$a&lt;/span&gt;/pk-*.pem &lt;span class="k"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;THIS_CERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; ls &lt;span class="nv"&gt;$EC2_TOP&lt;/span&gt;/accounts/&lt;span class="nv"&gt;$a&lt;/span&gt;/cert-*.pem &lt;span class="k"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;THIS_SSH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; ls &lt;span class="nv"&gt;$EC2_TOP&lt;/span&gt;/accounts/&lt;span class="nv"&gt;$a&lt;/span&gt;/* | grep -v .pem &lt;span class="k"&gt;)&lt;/span&gt;

        &lt;span class="nb"&gt;alias &lt;/span&gt;ssh-ec2-&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ssh -i $THIS_SSH&amp;quot;&lt;/span&gt;

        &lt;span class="k"&gt;for &lt;/span&gt;e in &lt;span class="nv"&gt;$EC2_TOOLS&lt;/span&gt;; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="k"&gt;                &lt;/span&gt;&lt;span class="nb"&gt;alias &lt;/span&gt;ec2-&lt;span class="nv"&gt;$a&lt;/span&gt;-&lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$EC2_HOME/bin/$e -K $THIS_KEY -C $THIS_CERT&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="k"&gt;        &lt;/span&gt;&lt;span class="nv"&gt;THIS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
        &lt;span class="nv"&gt;THIS_CERT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;This base script (I've called mine setup_env.sh) needs to live at the top level, so again, we have a structure like this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;base/
accounts/
setup_env.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, simply source setup_env.sh as part of your login procedure, by putting something like this in .bash_profile:&lt;/p&gt;

&lt;p&gt;NOTE: My top level directory lives at ~/Tools/Amazon&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/Tools/Amazon/setup_env.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, when I login, I can create an instance on the correct EC2 account with something like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;ec2-project1-ec2run &amp;lt;options&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;And I can SSH to a running EC2 instance with something like:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;ssh-ec2-project1 root@myinstance.address.com
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Simple, possibly inelegant, but very functional. Do you have anything which works better than this? Please share..&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/qm5x7k_R23w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/01/using-multiple-ec2-accounts-with-the-ec2-api-tools</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Stranger</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/pgunH8z-1nc/287" />
   <updated>2010-01-02T00:00:00-05:00</updated>
   <id>http://warwickp.com/2010/01/287</id>
   <content type="html">&lt;p&gt;&lt;a href="http://pdxcell.com/"&gt;"The image comparison below indicates that I have something to offer in this area."&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/pgunH8z-1nc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/01/287</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Virgin Islands</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/8VU6k_cTKy8/284" />
   <updated>2010-01-01T00:00:00-05:00</updated>
   <id>http://warwickp.com/2010/01/284</id>
   <content type="html">&lt;p&gt;Residents in the Virgin Islands &lt;a href="http://www.vimovingcenter.com/talk/read.php?4,128453"&gt;sharing the important information&lt;/a&gt; online.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/8VU6k_cTKy8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2010/01/284</feedburner:origLink></entry>
 
 <entry>
   <title>Side Project. I need one. Help me decide, idea 1: HPIT</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/08wJf9cT0Dc/side-project-i-need-one-help-me-decide-idea-1-hpit" />
   <updated>2009-12-30T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/side-project-i-need-one-help-me-decide-idea-1-hpit</id>
   <content type="html">&lt;p&gt;I want to write a another web application in early 2010. Here is the first idea I had. Rain some criticism down or heap some praise. I haven't seen this service out there, so if I missed it somewhere, please tell me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idea 1: The Hosting Provider Incident Tracker (HPIT)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A real time database where we track major (and minor) incidents at hosting providers around the world. Too many times I have asked hosting providers about their history of incidents only to receive vague assertions about 100% uptime and heroic stories surviving the &lt;a href="http://en.wikipedia.org/wiki/Northeast_Blackout_of_2003"&gt;great blackout&lt;/a&gt;s of our time. This always fails to impress me. What would REALLY impress me is a provider who would give me a link to their incident history with detailed technical explanations around the root causes (ugh, hate that word) and mitigation steps. Sadly, providers still want to sell the snakeoil of &lt;a href="http://www.rackspace.com/whyrackspace/network/index.php?CMP=Google_100+uptime"&gt;100% uptime&lt;/a&gt;. This isn't the point, because there isn't 100% uptime. There is only honest and timely response to inevitable outages. This is what matters. This, however, opens the door for an independent tracker of these incidents. This service will vet incident reports, seek and post responses from hosting providers, or simply link to their own responses, and be your source for evaluating how a hosting company responds to critical issues.&lt;/p&gt;

&lt;p&gt;BTW: I don't know why &lt;a href="http://pingdom.com/"&gt;Pingdom&lt;/a&gt; isn't providing this service today. It has most of the data required already.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/08wJf9cT0Dc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/side-project-i-need-one-help-me-decide-idea-1-hpit</feedburner:origLink></entry>
 
 <entry>
   <title>Configuration Management with Chef on Debian, Part 1</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/z1Zb7pQvG6Q/configuration-management-with-chef-on-debian-part-1" />
   <updated>2009-12-17T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/configuration-management-with-chef-on-debian-part-1</id>
   <content type="html">&lt;p&gt;UPDATE: &lt;a href="http://warwickp.com/2010/01/configuration-management-with-chef-on-debian-part-2/"&gt;Part 2 now online&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm familiar with configuration management tools like &lt;a href="http://www.cfengine.org/"&gt;Cfengine&lt;/a&gt;, &lt;a href="http://reductivelabs.com/products/"&gt;Puppet&lt;/a&gt; and &lt;a href="http://code.google.com/p/slack/"&gt;slack&lt;/a&gt;. I am also familiar with using homebrewed tools which leverage trees of shell scripts to apply and manage a bunch of configuration files stored in version control. I am going to teach myself to use &lt;a href="http://www.opscode.com/chef/"&gt;Chef&lt;/a&gt; on &lt;a href="http://www.debian.org/releases/stable/"&gt;Debian&lt;/a&gt; Lenny. Follow along.&lt;/p&gt;

&lt;p&gt;Firstly, &lt;strong&gt;idempotent&lt;/strong&gt;. Chef is &lt;a href="http://en.wikipedia.org/wiki/Idempotence"&gt;idempotent&lt;/a&gt;. Wha? This means that if you run the chef client on a &lt;strong&gt;node&lt;/strong&gt; multiple times, you should never get a gradually changing state. Given the same &lt;strong&gt;recipes&lt;/strong&gt;, the system should always return to an identical state after the Chef tools run on the system. Think about those shell scripts you have written in the past. Sometimes they are appending strings to files, or removing strings from files, or moving files around based on some algorithm. Well, Chef doesn't perform a single action out of context. It does every action, every time. And the actions Chef performs are defined in &lt;strong&gt;recipes&lt;/strong&gt;. Collections of recipes are called &lt;strong&gt;cookbooks&lt;/strong&gt;. These recipes are written in &lt;a href="http://ruby-lang.org"&gt;Ruby&lt;/a&gt;. Recipes can be grouped together in &lt;strong&gt;roles&lt;/strong&gt;, so when you apply a role to a &lt;strong&gt;node&lt;/strong&gt; that node will receive all the recipes in that role. Recipes can reference &lt;strong&gt;attributes&lt;/strong&gt; in other recipes, and also apply other recipes.&lt;/p&gt;

&lt;p&gt;The bulk of the Chef work is done by the &lt;strong&gt;chef-client&lt;/strong&gt; which runs on the host you are managing with chef. It may or may not contact a &lt;strong&gt;chef-server&lt;/strong&gt;. Using &lt;a href="http://wiki.opscode.com/display/chef/Chef+Solo"&gt;chef-solo&lt;/a&gt; you can do a bunch of useful things without needing a central chef-server.&lt;/p&gt;

&lt;p&gt;There are quite a few different tools in use in the complete Chef stack. Wonderful tools like &lt;a href="http://couchdb.apache.org/"&gt;couchdb&lt;/a&gt;, &lt;a href="http://stompserver.rubyforge.org/"&gt;Stomp&lt;/a&gt;, &lt;a href="http://www.merbivore.com/"&gt;Merb&lt;/a&gt;. Luckily, thanks to great packages from Opscode, you can get all of this stuff installed without too much trouble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note on versions:&lt;/strong&gt; Chef 0.8 branch is currently getting some very interesting sounding features. In fact, I remarked in &lt;a href="http://wiki.opscode.com/display/chef/IRC"&gt;IRC&lt;/a&gt; today that I fully expect Chef 0.8 to file my taxes and walk my dog. However, I am not going there yet. This post will be all about Chef 0.7 branch, specifically the version of Chef provided in the Opscode apt repositories. By the way, you should totally hang out in #chef on &lt;a href="http://freenode.net/"&gt;Freenode&lt;/a&gt;. The people in there are awesome, helpful and very very good looking.&lt;/p&gt;

&lt;p&gt;This is it. Let's do things.&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Set up your Git repository&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The various pieces which end up becoming files on the filesystem are stored in version control. You can apparently use SVN, but we'll go with Git. You'll need a nice fresh Git repo. To this repo you'll add your Chef cookbooks and roles, etc. So you could either host your Git repo with &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt; (you'll probably want to use a private repo, the repo will most likely contain some private things) or you could &lt;a href="http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way"&gt;set up you own Git repo&lt;/a&gt; using &lt;a href="http://eagain.net/gitweb/?p=gitosis.git"&gt;Gitosis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have your Chef repo setup, get the contents of the Opscode Chef Repository into your own repo. I'm not going to go into the details of how to do this using Git, mostly because you don't want Git advice from me. Nevertheless, you want to grab the contents of this repo, and merge them in your new repo:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;git clone git://github.com/opscode/chef-repo.git
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;When all is said and done, your repo should have a structure similar to this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;certificates/
config/
config/client.rb.example
config/server.rb.example
config/rake.rb
config/solo.rb.example
cookbooks/
Rakefile
roles/
site-cookbooks/
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;More detailed info on the &lt;a href="http://wiki.opscode.com/display/chef/Chef+Repository"&gt;Chef Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Setup your 2 servers and your DNS&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;For the purposes of this tutorial, we'll assume you have 2 servers. You could have 17 servers, that would be fine too. We'll call server 1 &lt;em&gt;chef.yourdomain.com&lt;/em&gt; and server 2 will be &lt;em&gt;web1.yourdomain.com&lt;/em&gt;. Make sure these servers have Debian Lenny installed and you have created proper working DNS entries for the hostnames chef.yourdomain.com and web1.yourdomain.com&lt;/p&gt;

&lt;p&gt;We'll be installing Chef server AND a Chef client on chef.yourdomain.com
We'll be installing only a Chef client on web1.yourdomain.com&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Setup your Chef server&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;There are Chef cookbooks which will allow Chef to bootstrap itself, which is a fairly cool concept. This isn't necessary, however, when using the Opscode chef packages for Debian, since they will provide everything we need for our Chef server in the packages. So we'll simply install the packages and be on our way.&lt;/p&gt;

&lt;p&gt;First, we'll need these:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;apt-get update
apt-get install -y curl git-core sudo
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now let's set up the Opscode repo and install Chef:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;deb http://apt.opscode.com/ debian contrib&amp;quot;&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/opscode.list
curl http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
apt-get update
apt-get install -y rubygems libshadow-ruby1.8 ohai chef chef-server
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Done. Buy Opscode some beer! OK, now let's do some configuration of the Chef server. Firstly, Chef uses &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; extensively for authentication. We need to have an OpenID provider, which we trust defined in the chef server config. If you don't have an OpenID provider that you use, head over to &lt;a href="https://www.myopenid.com/"&gt;myOpenID&lt;/a&gt; and sign up for an account. You'll get an OpenID URL. Now we'll put that into the chef config at /etc/chef/server.rb by adding the following line at the bottom of that file:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;authorized_openid_providers &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://chef.localdomain&amp;quot;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;quot;https://chef&amp;quot;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;quot;https://whateveryourswas.myopenid.com&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now we are going to generate a validation token for our Chef clients to use to auto-register themselves against the Chef server. You need a nice random string. If you lack the creativity to make one up, try this:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nv"&gt;thedate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; date &lt;span class="k"&gt;)&lt;/span&gt;; &lt;span class="nv"&gt;thehost&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; hostname &lt;span class="k"&gt;)&lt;/span&gt;; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$thedate$thehost&lt;/span&gt; | sha256sum
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now put the string you came up with above into /etc/chef/server.rb by finding the validation_token line, uncommenting it and giving it a value:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;validation_token   &lt;span class="s2"&gt;&amp;quot;2d926b251e18cb39b00350bb956d44ef8639b4ed33809194a7e2ed60ac5d772c&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Restart Chef server:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;/etc/init.d/chef-server restart
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Setup your &lt;a href="http://wiki.opscode.com/display/chef/Chef+Repository"&gt;Chef Repository&lt;/a&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Now we need our Git repository created earlier. We are going to use this repository to store our recipes, and we are going to use tools inside this repository to manage Chef itself. How meta. So on your newly installed chef server, in your home directory, or whereever else, clone your git repo:&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;git clone git@yourgitserver.yourdomain.com:your_chef_repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your_chef_repo
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;We are now going to use &lt;a href="http://rake.rubyforge.org/"&gt;Rake&lt;/a&gt; to install the initial (blank) Chef cookbooks into place, and also to set up the SSL certificates which Chef uses when communicating between components. Obviously you'll want to use your Chef server's proper FQDN here.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;rake install
rake ssl_cert &lt;span class="nv"&gt;FQDN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;chef.yourdomain.com&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Now, try logging into the Chef web UI, at http://chef.yourdomain.com:4000&lt;/p&gt;

&lt;p&gt;In the login field, enter the openID URL you configured earlier, eg: https://whateveryourswas.myopenid.com you'll be forwarded to the OpenID provider, asked to authenticate and sent back to Chef. You should now be logged in.&lt;/p&gt;

&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;Set up your Chef client&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;OK, now that we have a working, albeit currently fairly useless, Chef server let's install our first Chef client. On your other host, web1.yourdomain.com, you could use this script I quickly put together to go from a freshly installed server to a working Chef client. Obviously you should substitute your auth_token you created earlier and your chef's DNS location.&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;### VARIABLES ##########################################################&lt;/span&gt;
&lt;span class="nv"&gt;chef_server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;chef.yourdomain.com&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;chef_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/chef-client
&lt;span class="nv"&gt;chef_client_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/etc/chef/client.rb&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;chef_auth_token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2d926b251e18cb39b00350bb956d44ef8639b4ed33809194a7e2ed60ac5d772c&amp;quot;&lt;/span&gt;

&lt;span class="nv"&gt;opscode_apt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;deb http://apt.opscode.com/ debian contrib&amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;### ACTIONS ############################################################&lt;/span&gt;
apt-get update
apt-get install -y curl git-core sudo

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$opscode_apt&lt;/span&gt; &amp;gt; /etc/apt/sources.list.d/opscode.list
curl http://apt.opscode.com/packages@opscode.com.gpg.key | apt-key add -
apt-get update
apt-get install -y rubygems ohai chef libshadow-ruby1.8

&lt;span class="c"&gt;### SETUP CHEF CLIENT AND REGISTER #####################################&lt;/span&gt;
sed -i &lt;span class="s2"&gt;&amp;quot;s/localhost/$chef_server/g&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;$chef_client_config&lt;/span&gt;
&lt;span class="nv"&gt;$chef_client&lt;/span&gt; -t &lt;span class="nv"&gt;$chef_auth_token&lt;/span&gt;

&lt;span class="c"&gt;### REMOVE THYSELF #####################################################&lt;/span&gt;
rm &lt;span class="nv"&gt;$0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;If all went according to plan, this should now be a working chef client which knows where the chef server is, and has auto registered itself with the Chef server. Have a look at http://chef.yourdomain.com:4000/registrations and see if web1.yourdomain.com is listed there. If so you are halfway to Nirvana. So now we actually want to start doing things by creating cookbooks, roles, ie: actually doing shit.&lt;/p&gt;

&lt;p&gt;Stay tuned for part 2 in this enthralling series. Contact me for movie rights.&lt;/p&gt;

&lt;p&gt;UPDATE: &lt;a href="http://warwickp.com/2010/01/configuration-management-with-chef-on-debian-part-2/"&gt;Part 2 now online&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/z1Zb7pQvG6Q" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/configuration-management-with-chef-on-debian-part-1</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Villa</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/DNTcVbCUYxQ/199" />
   <updated>2009-12-14T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/199</id>
   <content type="html">&lt;p&gt;Nice little &lt;a href="http://www.homeaway.com/vacation-rental/p7029971hi"&gt;villa in Peter Bay &lt;/a&gt;for $45,000/week.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/DNTcVbCUYxQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/199</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Nginx mailing list</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/sbCstLYXIcI/198" />
   <updated>2009-12-11T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/198</id>
   <content type="html">&lt;p&gt;The &lt;a href="http://forum.nginx.org/read.php?2,27636,27808"&gt;Nginx mailing list&lt;/a&gt; is the best techlist I subscribe to.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/sbCstLYXIcI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/198</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: superbad.com</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/BSBf40vKL5E/197" />
   <updated>2009-12-10T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/197</id>
   <content type="html">&lt;p&gt;Who else used to marvel at the weirdness of &lt;a href="http://superbad.com"&gt;superbad.com&lt;/a&gt;?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/BSBf40vKL5E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/197</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: DRBD</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/M5fABv6579c/194" />
   <updated>2009-12-08T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/194</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.drbd.org/"&gt;DRBD&lt;/a&gt; is now &lt;a href="http://marc.info/?l=linux-kernel&amp;amp;m=125302593323927&amp;amp;w=2"&gt;in the Linux kernel&lt;/a&gt; expected to arrive in 2.6.33. Wow.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/M5fABv6579c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/194</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: water bear</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/JjUwwLeSrUs/188" />
   <updated>2009-12-02T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/12/188</id>
   <content type="html">&lt;p&gt;The &lt;a href="http://en.wikipedia.org/wiki/Water_bear"&gt;water bear&lt;/a&gt;, a.k.a moss piglet or Tardigrade, is a serious creature.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/JjUwwLeSrUs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/12/188</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Frank Oz</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/HEzO4OgF5Lk/186" />
   <updated>2009-11-29T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/186</id>
   <content type="html">&lt;p&gt;Frank Oz &lt;a href="http://www.avclub.com/articles/frank-oz,14141/"&gt;being fairly frank&lt;/a&gt; on Brando, Yoda, Hollywood and his career.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/HEzO4OgF5Lk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/186</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: cats</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/rfJvPVrmKFg/177" />
   <updated>2009-11-28T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/177</id>
   <content type="html">&lt;p&gt;Someone will &lt;a href="http://www.craigslist.org/about/best/min/1396845130.html"&gt;teach your cats&lt;/a&gt; to walk on a leash.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/rfJvPVrmKFg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/177</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Gibbs</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/giPI-K-Ob8k/175" />
   <updated>2009-11-27T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/175</id>
   <content type="html">&lt;p&gt;Herschelle Gibbs, &lt;a href="http://www.youtube.com/watch?v=qwqBoVhOwas"&gt;36 runs in an over&lt;/a&gt; in St. Kitts during the World Cup, 2007.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/giPI-K-Ob8k" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/175</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: A plane</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/v3CIFShr8X4/169" />
   <updated>2009-11-21T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/169</id>
   <content type="html">&lt;p&gt;For Christmas, please: NJ Devils &lt;a href="http://www.aircraftdealer.com/aircraft_for_sale_detail/Boeing_727/1976_BOEING_727-247/26407.htm"&gt;1976 Boeing 727&lt;/a&gt; with bar and cabins.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/v3CIFShr8X4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/169</feedburner:origLink></entry>
 
 <entry>
   <title>Cliff Notes from Founder Factory 2009</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/aG-01cDn3zw/cliff-notes-from-founder-factory-2009" />
   <updated>2009-11-20T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/cliff-notes-from-founder-factory-2009</id>
   <content type="html">&lt;p&gt;Yesterday the &lt;a href="http://www.founderfactory.com"&gt;Founder Factory&lt;/a&gt; took place at the &lt;a href="http://www.worldcafelive.com/"&gt;World Cafe Live&lt;/a&gt; in Philadelphia. I love the venue and there were some interesting speakers and discussions. Here are the things I found most interesting from the talks:&lt;/p&gt;

&lt;h4&gt;&lt;a href="http://www.founderfactory.com/speakers/doug-alexander-president-internet-capital-group/"&gt;Doug Alexander&lt;/a&gt;, President - &lt;a href="http://www.internetcapital.com/"&gt;Internet Capital Group&lt;/a&gt;&lt;/h4&gt;


&lt;ul&gt;
&lt;li&gt;If you have a B2B product or service, figure out which budget you come out of. Don't come out of the IT budget, which is heavily pressurized and quickly trimmed. Come out of the marketing, or &lt;a href="http://en.wikipedia.org/wiki/Cost_of_goods_sold"&gt;COGS&lt;/a&gt; budget, which are generally more sacrosanct.&lt;/li&gt;
&lt;li&gt;Again with a B2B product or service, you want to be solving a problem that keeps a senior executive (at your target client) up at night. &lt;em&gt;By inference (if it were indeed a b2b product), I declare &lt;a href="http://en.wikipedia.org/wiki/Sildenafil"&gt;sildenafil citrate&lt;/a&gt; the greatest product of all time.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Avoid &lt;a href="http://www.knowthis.com/principles-of-marketing-tutorials/types-of-selling-roles/order-influencers/"&gt;missionary selling&lt;/a&gt;, which is to say, avoid spending money to educate influencers in your market that they need your product or service. This missionary work usually has the effect of educating the market on behalf of your competitors as well.&lt;/li&gt;
&lt;li&gt;Advice to a &lt;a href="http://www.founderfactory.com/fishbowl-panel/"&gt;fishbowl&lt;/a&gt; company: If seeking outside funding, ensure you have a concrete vision (with detail) of what success looks like for your company. Instead of relying on the potential investor to create their own vision of this scenario, paint this picture in detail and sell this vision to the investor.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;&lt;a href="http://www.jeremysiegel.com/"&gt;&lt;strong&gt;Dr Jeremy Siegel&lt;/strong&gt;&lt;/a&gt;, Professor - &lt;a href="http://www.wharton.upenn.edu"&gt;Wharton School&lt;/a&gt;&lt;/h4&gt;


&lt;ul&gt;
&lt;li&gt;While the dollar has slumped recently, it slumped after a spectacular and unnatural rise, setting it's current value still above the levels it was in 2007 &lt;em&gt;(I believe, I need references, since I do not follow currencies at all)&lt;/em&gt;. Essentially, view current value in a broader context before declaring disaster. &lt;em&gt;I've had this sentiment expressed to me before about the stock market in general.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Focusing on the deficit and foreign debt as threats to the US economy ignores far larger threats, such as social security and medicare, which represent buckets orders of magnitude larger than the deficit.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;&lt;a href="http://brussin.com/David_Brussin.html"&gt;&lt;strong&gt;David Brussin&lt;/strong&gt;&lt;/a&gt;, CEO - &lt;a href="http://monetate.com/"&gt;Monetate&lt;/a&gt;&lt;/h4&gt;


&lt;ul&gt;
&lt;li&gt;Use external QA resources. It's a triple win of fresh eyes with more perspective and no emotional ties to the product.&lt;/li&gt;
&lt;li&gt;Cloud, cloud, cloud. And CDN. &lt;a href="http://blog.sciencelogic.com/ellisons-cloud-computing-rant/09/2009"&gt;With cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Interesting tactic: don't upgrade your software in the cloud. Deploy new infrastructure and move traffic over, your rollback being the previous setup. &lt;em&gt;(IMHO this is only practical to a threshold. What happens where your 'setup' is hundreds/thousands of nodes?)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If your product imposes management overhead on your customer, becoming "full service", ie: providing a product as well as management of the product as a combined offering, might be a solid commercial solution and an easier sell. &lt;em&gt;"The work on your part will be limited to banking all this money we create for you".&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;The Fishbowl&lt;/h4&gt;


&lt;p&gt;&lt;em&gt;In the fishbowl, three companies in various phases of development, asked a panel of experts (and the audience) for advice on certain issues.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kendra Gaeta of &lt;a href="http://www.kidzillions.com"&gt;Kidzillions&lt;/a&gt; &lt;/strong&gt;was unfortunate enough to be the person who taught some of the speakers (and me) a valuable lesson, which is: If you cannot do your presentation without your presentation, then you might want to rethink your appearance. Nothing cooperated with her, yet she soldiered on and won the support of the audience, sans slides. It may have been &lt;em&gt;better&lt;/em&gt; without slides. The most valuable advice I took from her feedback is while certain products may lend themselves to &lt;a href="http://en.wikipedia.org/wiki/White-label_product"&gt;white-labeling&lt;/a&gt;, sometimes a strong brand is more valuable to the business, and should remain in tact through all markets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ryan Meinzer of &lt;a href="http://www.playsay.com/"&gt;PlaySay&lt;/a&gt; &lt;/strong&gt;asked for advice, mainly on a strategy to deal with potential threat from the very large players in markets adjacent to his. The consensus among the panel seemed to (to me anyway) be that when you can profitably serve multiple smaller niches with a predictable formula, you don't need to be overly concerned about the Walmarts of your space. I appreciate the candor of an entrepreneur who tells you that a business &lt;a href="http://www.brainyquote.com/quotes/quotes/l/larryking106582.html"&gt;"landed in his lap"&lt;/a&gt; and he ran with it. Also, there is &lt;a href="http://en.wikipedia.org/wiki/Eating_one%27s_own_dog_food"&gt;dogfooding&lt;/a&gt; going on here where PlaySay evolved out of his own need to learn Japanese. There was discussion of patents, and all I could hear was Paul Graham talking about how the value of patents for a startup really is &lt;a href="http://www.paulgraham.com/softwarepatents.html"&gt;"&lt;/a&gt;&lt;a href="http://www.paulgraham.com/softwarepatents.html"&gt;as an element of the mating dance with acquirers"&lt;/a&gt;. I was hoping one of the panelists would say&lt;em&gt; (warning, my $0.02 ahead) &lt;/em&gt;that should PlaySay's immediate strategy be acquisition by one of those neighboring 800 pound gorillas, then by all means invest in those patents, which can be line items in the inventory to sell an acquirer. Alternatively, focus resources on product development.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The three guys from &lt;a href="http://www.revzilla.com/"&gt;RevZilla&lt;/a&gt;&lt;/strong&gt; have built an impressive business. They bootstrapped heavily, are passionate about their products and the space, and were seeking advice on growth. I was (pleasantly) surprised to hear a panel of VCs suggest to these guys not take take external funding, and thereby introduce a whole new set of circumstances into their business, when they have such demonstrable growth. It seems that the powersports industry suffers from a common problem (is Ludditry a word?) which is that equipment distributors and manufacturers generally will not sell to Internet-only retailers. I found this in the golf equipment industry too, when I looked into it. The Revzilla solution is an impressive looking &lt;a href="http://www.revzilla.com/philadelphia-motorcycle-store"&gt;store front/warehouse&lt;/a&gt; in South Philly. In general, it seemed that the advice to RevZilla was that the curve they are on seems very promising, so ride&lt;em&gt; (oh no a motorcycle pun)&lt;/em&gt; it as 3 founders to a great life, rather than try to engineer it as 3 founders + VC money and complex priorities. This may be a serious over simplification, of course.&lt;/p&gt;

&lt;h4&gt;During the course of the day, the following diagram began to form in my mind:&lt;/h4&gt;


&lt;p&gt;&lt;img class="size-full wp-image-157" title="How VCs, engineers and customers view a business" src="/images/3-views.png" alt="How VCs, engineers and customers view a business" width="716" height="431" /&gt;&lt;/p&gt;

&lt;p&gt;At every conference I have been to, the best speakers are the ones who provide a few select nuggets of advice, for problems they assume the audience has. If, as a speaker, you need to turn around and read a bullet point off your own PowerPoint slide, then you may as well be part of the audience yourself. Also, if you are simply detailing the a story about something you have done, then a book or a blog post is a better format, since you hold a different type of attention from the audience when up on stage. It's generally not a very patient type of attention, either. &lt;em&gt;Unscripted-ness&lt;/em&gt;, or even the illusion of it, goes a long way in winning attention. Speakers are getting better and better at this, but we are &lt;a href="http://www.slideshare.net/thecroaker/death-by-powerpoint"&gt;still not there&lt;/a&gt;. If you've ever delivered a presentation which included more than 6 PowerPoint slides, each with more than 2 bullet points per page &lt;em&gt;(that group includes me, by the way)&lt;/em&gt;, I can't recommend an evening at &lt;a href="http://www.themoth.org/"&gt;The Moth&lt;/a&gt; enough.&lt;/p&gt;

&lt;p&gt;A big thank you to &lt;a href="http://phillystartupleaders.org/"&gt;Philly Startup Leaders&lt;/a&gt; for doing this important work in the Philly area. I personally enjoyed the day, and took home some interesting advice and thoughts to write rambling blog posts about.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/aG-01cDn3zw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/cliff-notes-from-founder-factory-2009</feedburner:origLink></entry>
 
 <entry>
   <title>WP Memcached Manager </title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/MrbjkJQUJNw/wp-memcached-manager" />
   <updated>2009-11-18T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/wp-memcached-manager</id>
   <content type="html">&lt;p&gt;If you use &lt;a href="http://memcached.org/"&gt;Memcached&lt;/a&gt; and &lt;a href="http://wordpress.org"&gt;WordPress&lt;/a&gt; you may find this little plugin handy. Version 0.1 of wp-memcached-manager allows you to test your connection to a Memcached server, see some basic Memcached server stats and perform a cache flush. There is also a very rudimentary tool to see some of the cached data stored, however, it is super basic and not massively useful. In future releases you will be able to walk through data and perform updates on specific keys etc.&lt;/p&gt;

&lt;p&gt;Plugin home: &lt;a href="http://warwickp.com/projects/wp-memcached-manager/"&gt;http://warwickp.com/projects/wp-memcached-manager/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On WordPress.org repository: &lt;a href="http://wordpress.org/extend/plugins/wp-memcached-manager/"&gt;http://wordpress.org/extend/plugins/wp-memcached-manager/&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/MrbjkJQUJNw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/wp-memcached-manager</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: idea enemies</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/oPQFhptV68s/136" />
   <updated>2009-11-18T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/136</id>
   <content type="html">&lt;p&gt;Your idea and it's &lt;a href="http://didier.zip.net/images/ideia.JPG"&gt;natural enemies&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/oPQFhptV68s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/136</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: Jung</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/BQRgnZqSGQA/110" />
   <updated>2009-11-17T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/110</id>
   <content type="html">&lt;p&gt;&lt;a href="http://www.humanmetrics.com/cgi-win/JTypes2.asp"&gt;Jung&lt;/a&gt;'s conclusion: &lt;a href="http://en.wikipedia.org/wiki/INFP"&gt;INFP&lt;/a&gt;. Like &lt;a href="http://www.neildiamond.com/"&gt;Neil&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/John_F._Kennedy"&gt;Jack&lt;/a&gt; and &lt;a href="http://shakespeare.mit.edu/"&gt;Bill&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/BQRgnZqSGQA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/110</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: PECL Bug</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/pd52FG5W33I/108" />
   <updated>2009-11-16T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/108</id>
   <content type="html">&lt;p&gt;A fairly annoying &lt;a href="http://us2.php.net/manual/en/function.memcache-delete.php#94536"&gt;PECL memcache client bug&lt;/a&gt; that wasted 30 mins of my time&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/pd52FG5W33I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/108</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: LIOLI</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/eMxpXp1piMY/106" />
   <updated>2009-11-16T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/106</id>
   <content type="html">&lt;p&gt;Blackmail yourself into losing weight at &lt;a href="http://loseitorloseit.com"&gt;loseitorloseit.com&lt;/a&gt;. Love it.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/eMxpXp1piMY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/106</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: memcache-top</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/FbPj4ydn5lE/87" />
   <updated>2009-11-13T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/87</id>
   <content type="html">&lt;p&gt;&lt;a href="http://code.google.com/p/memcache-top/"&gt;memcache-top&lt;/a&gt; is &lt;a href="http://en.wikipedia.org/wiki/Top_%28Unix%29"&gt;top&lt;/a&gt; for &lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/FbPj4ydn5lE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/87</feedburner:origLink></entry>
 
 <entry>
   <title>Elsewhere: GEN H-4</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/vjw_HLa07Jk/81" />
   <updated>2009-11-13T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/81</id>
   <content type="html">&lt;p&gt;The GEN H-4 is a &lt;a href="http://www.gen-corp.jp/product/pages/movie04.html"&gt;personal helicopter&lt;/a&gt;.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/vjw_HLa07Jk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/81</feedburner:origLink></entry>
 
 <entry>
   <title>Getting to know our Amazon Kindle</title>
   <link href="http://feedproxy.google.com/~r/warwickp/~3/dAx6DEhAuLw/getting-to-know-our-amazon-kindle" />
   <updated>2009-11-12T00:00:00-05:00</updated>
   <id>http://warwickp.com/2009/11/getting-to-know-our-amazon-kindle</id>
   <content type="html">&lt;p&gt;
I'm always sneaking cool gadgets in as birthday gifts to my wife. &lt;em&gt;"Happy birthday, honey, here is your electronic grill scrubber."&lt;/em&gt; But this time she actually asked for a &lt;a href="http://www.amazon.com/kindle"&gt;Kindle&lt;/a&gt;, so I didn't need to be too sneaky. The idea is that she can read while trying to hold &lt;a href="http://bitsofhope.com/"&gt;junior&lt;/a&gt;. She reads a lot, so theoretically this thing should pay for itself through the lower book costs. Right?
&lt;/p&gt;


&lt;p&gt;
First thoughts, as I unwrap this thing.
&lt;ul&gt;
    &lt;li&gt;So Amazon hired someone from the Apple packaging team then? Nicely done.&lt;/li&gt;
    &lt;li&gt;I thought it had a paper screen covering on in the box. Turns out that's the screen. Amazing display. Looks like paper. Amazing! I said that.&lt;/li&gt;
    &lt;li&gt;There is significant lag on most operations, even typing on the keypad. The screen refresh rate is low. I guess that's the very idea of this device.&lt;/li&gt;
    &lt;li&gt;The keypad is a little finicky (used that word in two consecutive posts. Need a prize). Particularly the enter/return key which needs to be bigger IMHO.&lt;/li&gt;
    &lt;li&gt;There is a browser, and most pages render like it's 1995 and you just fired up Mosaic. Nostalgia.&lt;/li&gt;
    &lt;li&gt;The Amazon wireless network is called Whispernet. I immediately thought of &lt;a href="http://www.dailymotion.com/video/x4tmzz_blue-thunder-theatrical-trailer_shortfilms"&gt;Blue Thunder&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;The first book I wanted to buy is &lt;a href="http://en.wikipedia.org/wiki/Atlas_Shrugged"&gt;Atlas Shrugged&lt;/a&gt; by Ayn Rand. Doesn't appear to be in the Kindle Store.&lt;/li&gt;
    &lt;li&gt;How about Neil Stephenson's &lt;a href="http://en.wikipedia.org/wiki/Anathem"&gt;Anathem&lt;/a&gt;? Found it. OK, let that be my first Kindle purchase then.&lt;/li&gt;
    &lt;li&gt;OK, I can subscribe to TechCrunch. Oh, wait, that will cost me $1.99/month? Arrington, you'll stay on my Mac.&lt;/li&gt;
    &lt;li&gt;Great, there is a blog called &lt;a href="http://www.heyitsfree.net/"&gt;"Hey, It's Free!"&lt;/a&gt; so I'll subscribe to that, whatever it is. Oh, Hey It's Free costs $0.99/month? Hmm, OK.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;


&lt;p&gt;
&lt;h4&gt;The Kindle &lt;a href="http://en.wikipedia.org/wiki/User_agent"&gt;User Agent&lt;/a&gt; string is:&lt;/h4&gt;

&lt;pre&gt;
"Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.1 (screen 600x800)"
&lt;/pre&gt;
&lt;/p&gt;


&lt;p&gt;
The main challenge this Kindle is going to face is drool and repeated punching by my son, which will no doubt occur while my wife is trying to read "Patient Parenting Tips" on it. I'll let you know how it holds up.
&lt;/p&gt;

&lt;img src="http://feeds.feedburner.com/~r/warwickp/~4/dAx6DEhAuLw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://warwickp.com/2009/11/getting-to-know-our-amazon-kindle</feedburner:origLink></entry>
 
 
</feed>
