<?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:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;Ck4HQ3c-fyp7ImA9Wx5RFko.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875</id><updated>2010-08-24T10:28:52.957-07:00</updated><title>organized chaos</title><subtitle type="html">daily doses of hacking, technology &amp; the funky fresh</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.mobocracy.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>49</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/mobocracy/CNzP" /><feedburner:info uri="mobocracy/cnzp" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>mobocracy/CNzP</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;DEUCQ3ozfCp7ImA9WxFQEUw.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-6405282248223132612</id><published>2010-05-05T20:24:00.001-07:00</published><updated>2010-05-05T20:24:22.484-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-05T20:24:22.484-07:00</app:edited><title>What's happening?</title><content type="html">
          &lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;
            Worked 12 hours then swam 3000 yards after running 4 miles at a 7minute pace. Wrapping up some emails then crashing.
&lt;br/&gt;
&lt;br/&gt;
&lt;a href='http://chacha.me/bmatheny'&gt;Ask me anything, even anonymously&lt;/a&gt;
          &lt;/div&gt;
        &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-6405282248223132612?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/uMAETrSWHJw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/6405282248223132612/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=6405282248223132612" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6405282248223132612?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6405282248223132612?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/uMAETrSWHJw/what-happening.html" title="What&amp;#39;s happening?" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2010/05/what-happening.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYCSHg6fip7ImA9WxFQEEQ.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-3913379334195603636</id><published>2010-05-05T13:42:00.001-07:00</published><updated>2010-05-05T13:42:49.616-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-05T13:42:49.616-07:00</app:edited><title>are you a hacker?</title><content type="html">
          &lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;
            I'm a hacker in the MIT/FSF sense of the word. The Jargon File defines hacker as "A person who enjoys exploring the details of programmable systems and stretching their capabilities, as opposed to most users, who prefer to learn only the minimum necessary." I think this is an apt description of me.
&lt;br/&gt;
&lt;br/&gt;
&lt;a href='http://chacha.me/bmatheny'&gt;Ask me anything, even anonymously&lt;/a&gt;
          &lt;/div&gt;
        &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-3913379334195603636?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/eVyXKMgl4JQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/3913379334195603636/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=3913379334195603636" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3913379334195603636?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3913379334195603636?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/eVyXKMgl4JQ/are-you-hacker.html" title="are you a hacker?" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2010/05/are-you-hacker.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEDQX46fCp7ImA9WxNVEEw.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8011360625414009087</id><published>2009-10-19T21:43:00.000-07:00</published><updated>2009-10-19T21:57:50.014-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-19T21:57:50.014-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Google Wave is to the Internet what Lost is to TV</title><content type="html">&lt;p&gt;
I remember when the TV show Lost first came on the air. People loved it. People who hadn't even seen it loved it and spewed their praise. Years went by and that excitement dwindled but you still had the die hards, screaming for more. Eventually, not wanting to be entirely left out, I sat down and watched an episode. I just didn't get it. I mean I really didn't get it. I wanted to like it but I ultimately just had no clue what was going on.
&lt;/p&gt;

&lt;p&gt;
Google Wave is kind of like that. I got my invite last week and hopped on, extremely excited. But there were no people to interact with. It was like that big desert island in lost. There were &lt;em&gt;supposed&lt;/em&gt; to be some people, somewhere on the island, but you don't know their intentions or who they are. I just kind of wandered through the mass of with:public waves trying to catch one that could hold my interest but found nothing.
&lt;/p&gt;

&lt;p&gt;
Unlike Lost though, I think Google Wave just needs critical mass to succeed. I remember when I was an undergrad at Purdue I did the math on &lt;a href="http://www.gnunet.org/"&gt;GNUnet&lt;/a&gt; and determined that in order for it to succeed as a straight P2P network it would require content to be seeded. I went as far as determining that all major P2P networks must have been seeded at some point.
&lt;/p&gt;

&lt;p&gt;
Fortunately Google has the ability to seed Wave with plenty of interesting content and people, more than enough for it to succeed. It will be interesting to see whether Google sees this as another play thing and discards it, as it has with Dodgeball, Notebook, and several other products or lets it play outside the sandbox with all the other big kids like Search, Mail, Maps, etc.
&lt;/p&gt;

&lt;p&gt;
I am bmatheny on Google Wave.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8011360625414009087?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/xHh7s9CUaXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8011360625414009087/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8011360625414009087" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8011360625414009087?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8011360625414009087?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/xHh7s9CUaXQ/google-wave-is-to-internet-what-lost-is.html" title="Google Wave is to the Internet what Lost is to TV" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2009/10/google-wave-is-to-internet-what-lost-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EMQXw4cCp7ImA9WxNQF0s.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8278985581220605969</id><published>2009-09-23T20:08:00.000-07:00</published><updated>2009-09-23T20:08:00.238-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T20:08:00.238-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="amazon" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>Migrating from Akamai to CloudFront</title><content type="html">&lt;p&gt;
There seems to be some confusion on basic usage of S3 and CloudFront, and how they are related. There are also some gotchas when it comes to using the services that may not be obvious at first glance. I recently moved some data from Akamai to S3/CloudFront and had to 'translate' concepts for former Akamai users. Below are some of the items I addressed.
&lt;/p&gt;

&lt;h3&gt;Concepts&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;S3 is a simple key/value store with an HTTP interface.&lt;/li&gt;
 &lt;li&gt;A key is just a string but you can think of it as the filename.&lt;/li&gt;
 &lt;li&gt;The value associated with a key is referred to as an object.&lt;/li&gt;
 &lt;li&gt;The top level container for objects on S3 is referred to as a bucket.&lt;/li&gt;
 &lt;li&gt;CloudFront is a CDN that uses S3 as an origin server.&lt;/li&gt;
 &lt;li&gt;CloudFront has the notion of a distribution. A distribution is simply an S3 bucket that can be served via CloudFront.&lt;/li&gt;
 &lt;li&gt;A CloudFront distribution is associated with a single S3 bucket.&lt;/li&gt;
 &lt;li&gt;CloudFront is a CDN, S3 is more like an HTTP based file server&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Gotchas&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;CloudFront offers no purge mechanism like Akamai does.&lt;/li&gt;
 &lt;li&gt;You will need to use different keys (filenames) for CloudFront objects that change since they will not expire.&lt;/li&gt;
 &lt;li&gt;S3 has no real notion of users or roles, natively. An access key and secret key are used for authentication. If a user leaves your organization who had these keys, you will need to reset them.&lt;/li&gt;
 &lt;li&gt;Because the URI for an object on S3/CloudFront refers to a key, the string must be an exact match. This also means that there is no native way to handle double slashes. If you are prone to referencing files with a double slash, this can be a problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Best Practices&lt;/h3&gt;
&lt;ul&gt;
 &lt;li&gt;Create a CNAME (different ones) for both your CloudFront distribution and your S3 bucket if the objects contained in them will be consumed by a web browser. This will help you be flexible if you ever want to point your CNAME at another CloudFront distribution.&lt;/li&gt;
 &lt;li&gt;Enable logging if you are publishing static assets, in particular JS/CSS that are subject to change. This will help you determine whether content is still in use.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Resources&lt;/h3&gt;
Really the only additional thing we needed, besides some user education, was the notion of actual users with roles. We needed regular users that were tied to a particular bucket and had basic rights (upload, download, etc) and admin users that could create new buckets/distributions, etc. We decided to go with &lt;a href="http://www.bucketexplorer.com/"&gt;Bucket Explorer&lt;/a&gt; for this. Bucket Explorer essentially sits on top of S3 and provides an explorer like interface for users. In addition, it allows you to create BE users with their own roles (admin,user), usernames and passwords. The nice thing about this is I don't have to hand out the access and secret key to a large number of users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8278985581220605969?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/DbB3Wp_VHS4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8278985581220605969/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8278985581220605969" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8278985581220605969?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8278985581220605969?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/DbB3Wp_VHS4/migrating-from-akamai-to-cloudfront.html" title="Migrating from Akamai to CloudFront" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2009/09/migrating-from-akamai-to-cloudfront.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UHSHozcSp7ImA9WxNQFko.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-2413617263780190338</id><published>2009-09-22T19:54:00.001-07:00</published><updated>2009-09-22T20:07:19.489-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-22T20:07:19.489-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>Back at it</title><content type="html">&lt;p&gt;
Back at the end of July I ended my tenure as VP of Product at &lt;a href="http://www.compendiumblogware.com"&gt;Compendium Blogware&lt;/a&gt;. I had a wonderful experience with that company and had the good fortune of working with a really talented, smart group of engineers. Despite that, as we neared the end of our first OEM integration, I found myself looking for a new challenge. Compendium had gotten to the point of being on auto-pilot from a product perspective and the big challenges that I originally joined for had been tackled.
&lt;/p&gt;

&lt;p&gt;
Towards the middle of July I was contacted by a recruiter with local Q&amp;A/Search service &lt;a href="http://www.chacha.com/"&gt;ChaCha&lt;/a&gt;. ChaCha was looking for a replacement for their recently departed VP of Operations which didn't sound like a good fit for me but I was interested in the scale and the problem space and agreed to talk with them. After several rounds of interviews I ended up accepting a position as VP of Engineering and started on August 10th.
&lt;/p&gt;

&lt;p&gt;
Since joining ChaCha I have also taken on the operations, QA and helpdesk teams as well as some PM and UI responsibilities. The issues and problems that I expected to have to tackle are as challenging as I thought they would be but of a completely different nature. ChaCha has an excellent team and although I'm still the "new guy" I've been able to make (from my perspective) a lot of positive changes, particularly with respect to team structure and product development processes.
&lt;/p&gt;

&lt;p&gt;
So, now that I'm not at a blogging company I'll be getting back to my trusty blogger blog and writing again. Looking forward to it.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-2413617263780190338?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/KP1eEeqQz0o" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/2413617263780190338/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=2413617263780190338" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/2413617263780190338?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/2413617263780190338?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/KP1eEeqQz0o/back-at-it.html" title="Back at it" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2009/09/back-at-it.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcMQH87eyp7ImA9WxRREU4.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-1541820602098901745</id><published>2008-09-22T14:43:00.000-07:00</published><updated>2008-09-22T19:48:01.103-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-22T19:48:01.103-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>Oracle does NOT enter the AWS Cloud</title><content type="html">&lt;p&gt;Okay, seriously? Did the &lt;a href="http://aws.typepad.com/aws/2008/09/hello-oracle.html"&gt;announcement that oracle was entering the AWS cloud&lt;/a&gt; really get sent out today? Don't get me wrong. I think Jeff Barr is great and I love AWS, but let's be clear about what this announcement really means.&lt;/p&gt;

&lt;p&gt;When I saw this headline I thought, "Awesome, Oracle is lowering the barrier to entry for SMB customers." This isn't the case. It's true that Oracle is making it easier for people to boot up a presumably properly tuned Oracle instance in the cloud. It's also true that Oracle will support certain EC2 hardware configurations in the cloud (up to 8 virtual cores although you can license it for 16). However, when Jeff Bar makes a statement like the following I get confused.&lt;/p&gt;

&lt;blockquote&gt;The variability and flexibility of cloud-based licensing has perplexed users and vendors for some time now. Now that a large software vendor has made a clear statement of direction here, we should see more and more cloud-compatible licenses before too long.&lt;/blockquote&gt;

&lt;p&gt;Let's dig into the &lt;a href="http://www.oracle.com/corporate/pricing/cloud-licensing.pdf"&gt;Oracle licensing terms&lt;/a&gt; for a minute. If you read the licensing terms it becomes clear that two things have happened:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Oracle will support certain versions of their flagship product running on certain hardware configurations in the cloud.&lt;/li&gt;
  &lt;li&gt;Oracle will license certain versions of their flagship product running on certain hardware configurations in the cloud.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'm sorry, but does Oracle just not get it? This type of a license is the exact opposite of the utility model. While the hardware (and software, in the case of Red Hat, S3, SQS, etc) is "pay for what you use", Oracle has decided that you will pay whether you are using the software or not. On &lt;a href="http://www.redhat.com/solutions/cloud/"&gt;Red Hat's Cloud Computing page&lt;/a&gt; we get the following quote:&lt;/p&gt;
&lt;blockquote&gt;Cloud computing changes the economics of IT by enabling you to pay only for the capacity that you actually use.
&lt;/blockquote&gt;

&lt;p&gt;This is what I always believed was the power of cloud computing. Pay for what you use. I hope Oracle does not become a model for other software vendors as Jeff states. I hope companies take a page from Red Hat's book in this case, especially if they are looking to enter and stay competitive in the SMB market.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-1541820602098901745?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/ttSTAZGRSVg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/1541820602098901745/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=1541820602098901745" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1541820602098901745?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1541820602098901745?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/ttSTAZGRSVg/oracle-does-not-enter-aws-cloud.html" title="Oracle does NOT enter the AWS Cloud" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/oracle-does-not-enter-aws-cloud.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQERX06eip7ImA9WxRSGEo.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-1852947322897543947</id><published>2008-09-19T18:06:00.000-07:00</published><updated>2008-09-19T19:38:24.312-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-19T19:38:24.312-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="scalability" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>Digg: Still not interesting</title><content type="html">&lt;p&gt;As some of you know, during my job search last year one of the places I interviewed that ended up making me an offer was Digg. &lt;a href="http://www.joestump.net/"&gt;Joe Stump&lt;/a&gt;, who is now the lead architect at Digg was someone I knew from the Seattle PHP community and one of the folks that interviewed me. Being interviewed by someone you know is nice because you have a shared set of experiences that allow you to ask good questions that can help you make a better decision about whether or not to accept an offer.&lt;/p&gt;

&lt;p&gt;One of the questions I asked Joe was, "are you learning?" to which Joe essentially responded (and, I'm paraphrasing) that he wasn't learning much but things operated on the largest scale at which he had been involved which made things interesting for him. Some of the technology points I inferred at that point, knowing Joe's background and that he's a bright guy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Typical LAMP stack&lt;/li&gt;
  &lt;li&gt;No web services&lt;/li&gt;
  &lt;li&gt;Database sharding&lt;/li&gt;
  &lt;li&gt;'Legacy', organically grown code base&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This was my opinion after talking with several engineers. Having worked in that environment for several years, it wasn't exactly what I was looking for and I ultimately ended up declining the offer.&lt;/p&gt;

&lt;p&gt;In a series of recent blog posts, Digg engineers including Joe have begun describing the system and software architecture.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://blog.digg.com/?p=168"&gt;How Digg works&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://blog.digg.com/?p=213"&gt;Digg Database Architecture&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://highscalability.com/digg-architecture"&gt;High Scalability - Digg Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One of the things that strikes me is that from a technology perspective, not a lot has changed in a year. The typical high traffic LAMP system still consists of:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;Caching (Memcache)&lt;/li&gt;
  &lt;li&gt;Distributed file system (MogileFS)&lt;/li&gt;
  &lt;li&gt;Monitoring (Nagios)&lt;/li&gt;
  &lt;li&gt;Asynchronous Processing (Gearman)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It's about as vanilla as it gets from an architecture perspective. But what's wrong with that?&lt;/p&gt;

&lt;p&gt;Clearly Digg has been successful and as such their approach to technology has obviously worked. Anyone that has been tasked with scaling a web application is going to recognize the building blocks that Digg is using. However in not building a distributed system (as Digg has decided to do) you will run into some of the following issues: increased coupling of software components, longer ramp up for new developers, inability to update individual system components, difficulty in parallelizing development tasks and additional risk in new releases.
&lt;/p&gt;

&lt;p&gt;Let's use a Unix pipes analogy for a minute. Assume that each component in a software system is a unix tool; ls, grep, tail, etc. Imagine the command you are running is:&lt;/p&gt;
&lt;pre&gt;
    ls /bin/ | grep cat | tail
&lt;/pre&gt;
&lt;p&gt;Each of these applications handles a very specific piece of functionality. You can use each application in isolation. You can upgrade any of these applications without affecting another. Different developers can work on each application in isolation. There are some obvious advantages to the Unix approach. This is one way you can think of a distributed system but instead of pipes you're using an IP based transport (probably) and instead of command line options you're using a well defined API.
&lt;/p&gt;

&lt;p&gt;Now imagine an application called lsgreptail. It's a single application that handles all of the above functionality. You lose the ability to use each part of the application in isolation (no mixability). The code base is larger so it's more difficult for developers to get up to speed on it or become an expert with it. Making a change to functionality in directory listing (ls) requires reinstalling the entire application. Tracking down a performance bug becomes more difficult due to the lack of component isolation. There are some obvious drawbacks to this approach in software development. This is how you can think of how Digg (and many LAMP based sites) has built their system.&lt;/p&gt;

&lt;p&gt;The point is this; there is more to scalability than the number of simultaneous users you can support. As your business grows and becomes successful, scaling your development team is just as important and becomes increasingly difficult on a monolithic lsgreptail style application. Digg is digging their own hole (no pun intended) by continuing to build their system in this fashion.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-1852947322897543947?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/Nm9cN-KH-Y0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/1852947322897543947/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=1852947322897543947" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1852947322897543947?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1852947322897543947?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/Nm9cN-KH-Y0/digg-still-not-interesting.html" title="Digg: Still not interesting" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>5</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/digg-still-not-interesting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0YBQno4fip7ImA9WxRSF0g.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8906428859682883360</id><published>2008-09-18T08:31:00.000-07:00</published><updated>2008-09-18T09:25:53.436-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-18T09:25:53.436-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="amazon" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="aws" /><title>AWS CDN - Super Sweet</title><content type="html">&lt;p&gt;
One of the very first things I did with AWS (Amazon Web Services) was to use S3 (Simple Storage Service) and EC2 (Elastic Compute Cloud) to build a CDN on top of it. A CDN is essentially a way of distributing static content to your users rapidly in a scalable fashion. I built mine by publishing data to S3, using UltraDNS to distribute users requests to an appropriate availability zone in EC2 (east coast, west coast) based on their geographic location, and serving the request out of S3 but from EC2. Many people choose not to go this route for reasons of simplicity and just serve content out of S3. Well, now Amazon is going to do all the hard work for you.
&lt;/p&gt;

&lt;p&gt;If you are on the early warning radar of Amazon Web Services, I'm sure that you received the following email this morning just like I did:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;
...we are excited to share some early details with you about a new offering we have under development here at AWS -- a content delivery service.
&lt;/p&gt;

&lt;p&gt;
This new service will provide you a high performance method of distributing content to end users, giving your customers low latency and high data transfer rates when they access your objects. The initial release will help developers and businesses who need to deliver popular, publicly readable content over HTTP connections. Our goal is to create a content delivery service that:
&lt;ul&gt;
    &lt;li&gt;Lets developers and businesses get started easily - there are no minimum fees and no commitments. You will only pay for what you actually use.&lt;/li&gt;
    &lt;li&gt;Is simple and easy to use - a single, simple API call is all that is needed to get started delivering your content.&lt;/li&gt;
    &lt;li&gt;Works seamlessly with Amazon S3 - this gives you durable storage for the original, definitive versions of your files while making the content delivery service easier to use.&lt;/li&gt;
    &lt;li&gt;Has a global presence - we use a global network of edge locations on three continents to deliver your content from the most appropriate location.&lt;/li&gt;
&lt;/ul&gt;
You'll start by storing the original version of your objects in Amazon S3, making sure they are publicly readable. Then, you'll make a simple API call to register your bucket with the new content delivery service. This API call will return a new domain name for you to include in your web pages or application. When clients request an object using this domain name, they will be automatically routed to the nearest edge location for high performance delivery of your content.
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;
Why is this significant?
&lt;ul&gt;
  &lt;li&gt;Lowers the barrier to entry for small businesses wanting to use a CDN&lt;/li&gt;
  &lt;li&gt;Reduces the need to do DNS based geo-distribution on your own&lt;/li&gt;
  &lt;li&gt;Allows you to take advantage of something you are already using (AWS S3)&lt;/li&gt;
  &lt;li&gt;Allows you to simply 'enable' the service for existing items stored in S3&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;

&lt;p&gt;
Given the expense of CDN services from companies like Akamai, Limelight and Level3 as well as the term commitments (you typically negotiate a rate in a fashion similar to bandwidth), many smaller companies have often avoided using a CDN. This is despite the fact that using a CDN is one of the easiest ways to significantly improve perceived page load times for end users. By allowing users to pay for a CDN via the utility model that has become so popular with AWS, this opens the door for Joe Developer to simply start out using a CDN and not have to make those kinds of trade offs.
&lt;/p&gt;

&lt;p&gt;
Very cool stuff. If anyone from Amazon happens to read this, please add me to your beta group :)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8906428859682883360?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/sfnXFcvaGr4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8906428859682883360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8906428859682883360" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8906428859682883360?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8906428859682883360?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/sfnXFcvaGr4/aws-cdn-super-sweet.html" title="AWS CDN - Super Sweet" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/aws-cdn-super-sweet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMCQH4yeip7ImA9WxRSFk8.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-829142128720404798</id><published>2008-09-16T20:01:00.000-07:00</published><updated>2008-09-16T20:01:01.092-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-16T20:01:01.092-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="testing" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>Practical TDD</title><content type="html">&lt;p&gt;
It took me several years to drink the &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; kool-aid but now that I have I'm addicted. It's not that I didn't want to automate my testing, it's just that it wasn't particularly practical for me to do so. Having worked at startups over the past several years, I have never been able to find that balance between producing new code and appropriate test coverage for that code.
&lt;/p&gt;

&lt;p&gt;
The problem has typically been that the testable API changed frequently enough that I spent as much time or more updating tests as I did writing new code. This was the problem for unit tests and as such I never seem to get around to writing them or using continuous integration tools like CruiseControl. However, at my current job we have managed to create a TDD methodology that works particularly well for us. It essentially works like this:
&lt;ol&gt;
  &lt;li&gt;Agree upon web service API&lt;/li&gt;
  &lt;li&gt;Write Unit Tests that cover the new service API&lt;/li&gt;
  &lt;li&gt;Iterate on code until all service tests pass&lt;/li&gt;
&lt;/ol&gt;
&lt;/p&gt;

&lt;p&gt;
The primary difference between this and any other testing methodology is that we focus on testing our web services as opposed to the underlying API's. This gives us a few very concrete benefits:
&lt;ul&gt;
  &lt;li&gt;The front-end team can begin coding against the service API immediately.&lt;/li&gt;
  &lt;li&gt;Increased test coverage with less tests due to service dependencies.&lt;/li&gt;
  &lt;li&gt;Immediate feedback on work in progress.&lt;/li&gt;
  &lt;li&gt;Breaking API changes caught immediately, reducing impact on customers.&lt;/li&gt;
&lt;/ul&gt;
The introduction of continuous integration via CruiseControl along with 100% service coverage has allowed us to immediately see the benefits. The number of bugs introduced into our production environment has been reduced a measurable amount since creating the test framework.
&lt;/p&gt;

&lt;h2&gt;Resources&lt;/h2&gt;
&lt;p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://cruisecontrol.sf.net/"&gt;CruiseControl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-829142128720404798?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/84arNQk9E6Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/829142128720404798/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=829142128720404798" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/829142128720404798?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/829142128720404798?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/84arNQk9E6Y/practical-tdd.html" title="Practical TDD" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/practical-tdd.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAGRHc4eCp7ImA9WxRSFU4.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8810172628686001349</id><published>2008-09-15T18:11:00.000-07:00</published><updated>2008-09-15T19:38:45.930-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-15T19:38:45.930-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="database" /><title>MySQL Multimaster Replication in an Asynchronous Environment</title><content type="html">&lt;p&gt;
By design, MySQL replication occurs asynchronously. That is to say that the replication on a slave doesn't necessarily occur at the same time as on the master. In a multi-master replicated environment (assuming two masters), each master is a slave to the other master. There are a few gotcha's to consider when creating or editing data asynchronously in a multi-master environment. You can get bitten by these issues if using AJAX, threads, or even loading images that are database protected or backed. It's even possible to run across these in an entirely synchronous environment if the replication lag time is high enough.
&lt;/p&gt;

&lt;p&gt;
Let's assume for this discussion we have the following table:
&lt;pre&gt;
CREATE TABLE users (
    user_id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    user_name CHAR(64) DEFAULT '',
    user_password CHAR(64) DEFAULT '',
    user_last_login DATETIME DEFAULT '0000-00-00 00:00:00',
    UNIQUE KEY (user_name)
);
&lt;/pre&gt;
Let's also assume that we have two servers, master1 and master2.
&lt;/p&gt;

&lt;h2&gt;Auto Increment Conflict&lt;/h2&gt;
&lt;p&gt;
Assume that the following is submitted to master1:
&lt;pre&gt;
INSERT INTO users VALUES (0, 'user1', 'a609316768619f154ef58db4d847b75e', '1979-09-23');
&lt;/pre&gt;
and let's label this as e1 (event1) and assume that master1 assigns user_id 1 to 'user1'.&lt;br/&gt;

The following is then submitted to master2:
&lt;pre&gt;
INSERT INTO users VALUES (0, 'user2', 'f522d1d715970073a6413474ca0e0f63', '1984-01-02');
&lt;/pre&gt;
and let's label this as e2 (event2) and assume that master2 assigns user_id 1 to 'user2'.&lt;br/&gt;

Oops. Now when replication occurs on the other slave, we end up with 'user1' and 'user2' having different values for user_id on each server.&lt;br/&gt;

This topic has been covered in depth elsewhere so I won't go into details. For fixes and more information see &lt;a href="http://www.onlamp.com/pub/a/onlamp/2006/04/20/advanced-mysql-replication.html"&gt;Advanced MySQL Replication Techniques&lt;/a&gt;. Note that I recommend using a UUID/GUID instead of AUTO_INCREMENT to avoid this type of problem however the MySQL function UUID() doesn't work with statement based replication.
&lt;/p&gt;

&lt;h2&gt;Uniqueness Conflict&lt;/h2&gt;
&lt;p&gt;
Let's assume that you have some AJAX code which attempts to create a user, 'user1' which results in the following SQL statement:
&lt;pre&gt;
INSERT INTO users VALUES (0, 'user1', 'a609316768619f154ef58db4d847b75e', '1979-09-23');
&lt;/pre&gt;
being submitted to master1 and let's assume that for whatever reason you attempt to create the user a second time (timeout occurred, side effect causes another create to happen, etc) against master2.&lt;br/&gt;

You would think that the UNIQUE constraint would prevent the creation from occurring the second time however whether or not the statement is executed on both servers and in what order depends on a variety of factors including server lag (the amount of time between a statement being executed on one server and replicated and executed on the second server). This problem means that you can end up with user1 being created on both master1 and master2 but having two different user_id's.&lt;br/&gt;

How can you avoid this pitfall? Avoid asynchronous, identical create statements. Make the call synchronous. Additionally you can configure your application to only write to one database for certain statements, essentially from an application level reverting to a typical master-slave replicated environment.&lt;br/&gt;

Yes, I have run into this in a production environment.
&lt;/p&gt;

&lt;h2&gt;Update Conflict&lt;/h2&gt;
&lt;p&gt;
Let's assume you submit the following update request to master1:
&lt;pre&gt;
UPDATE users SET user_last_login = '2008-09-15 17:58:30' WHERE user_id=1;
&lt;/pre&gt;
which is executed on master1 at the time set in user_last_login plus 1 second (at 2008-09-15 17:58:31).&lt;br/&gt;

Now the following is submitted to master2:
&lt;pre&gt;
UPDATE users SET user_last_login = '2008-09-15 17:58:32' WHERE user_id=1;
&lt;/pre&gt;
which is executed on master2 at the same time set in user_last_login plus 1 second (at 2008-09-15 17:58:33).&lt;br/&gt;

Lastly, the update on master2 is replicated to master1, and the update on master1 is replicated to master2.&lt;br/&gt;

Here is what was executed on master1:
&lt;pre&gt;
UPDATE users SET user_last_login = '2008-09-15 17:58:30' WHERE user_id=1;
UPDATE users SET user_last_login = '2008-09-15 17:58:32' WHERE user_id=1;
&lt;/pre&gt;
and on master2:
&lt;pre&gt;
UPDATE users SET user_last_login = '2008-09-15 17:58:32' WHERE user_id=1;
UPDATE users SET user_last_login = '2008-09-15 17:58:30' WHERE user_id=1;
&lt;/pre&gt;

Now we have different values on each server. Uh oh.
&lt;/p&gt;

&lt;h2&gt;Delete Conflict&lt;/h2&gt;
&lt;p&gt;
This can occur when a delete occurs on master1 and before that delete is replicated to master2, an update to the PK used for the delete in statement1 on master1 is executed on master2. Imagine the following is executed on master1:
&lt;pre&gt;
DELETE FROM user WHERE user_name='user1';
&lt;/pre&gt;
and the following is executed on master2:
&lt;pre&gt;
UPDATE user SET user_name='user3' WHERE user_name='user1';
&lt;/pre&gt;

Now we have inconsistent data on each server. Uh oh.
&lt;/p&gt;

&lt;h2&gt;Summary&lt;/h2&gt;
In short, there are a variety of challenges to overcome in a multi-master replication setup. These problems are exacerbated by asynchronous operations on your data set. A few bullets of advice:
&lt;ul&gt;
  &lt;li&gt;Reduce complex transactions to be written to a single server.&lt;/li&gt;
  &lt;li&gt;Monitor server lag.&lt;/li&gt;
  &lt;li&gt;Be prepared for failure. The more you distribute your data set and scale your service, the more you will need to deal with failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.onlamp.com/pub/a/onlamp/2006/04/20/advanced-mysql-replication.html"&gt;Advanced MySQL Replication&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.dbspecialists.com/files/presentations/mm_replication.html"&gt;Multi-Master Replication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8810172628686001349?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/w6qLmAw_EZM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8810172628686001349/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8810172628686001349" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8810172628686001349?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8810172628686001349?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/w6qLmAw_EZM/mysql-multimaster-replication-in.html" title="MySQL Multimaster Replication in an Asynchronous Environment" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/mysql-multimaster-replication-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQGSH47eSp7ImA9WxRTGEk.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-3094706501728319216</id><published>2008-09-07T19:43:00.000-07:00</published><updated>2008-09-07T20:25:29.001-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-07T20:25:29.001-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="hacks" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>Google Code as Personal Wiki/VC Tool</title><content type="html">I figured I would put this up as some folks might find the idea useful. For a long time I've wanted an externally available, free, reliable, hosted environment that had a personal wiki and version control. I would have loved to find a Trac+Subversion environment but I didn't trust any of the free ones out there. I've got tons of documentation that I create that seems to get lost in a slew of .txt files in my home directory. Likewise I've got lots of sample code that gets created as Foo.java, foo.js, foo.php etc and ends up disappearing.

Google Code is a hosting service that has version control via subversion, issue tracking, wiki pages and a bunch of other features that I didn't really need. Today I noticed the link on Google Code saying, "Create a new project", so I thought, "What the heck?" Looking at the TOS and FAQ, there is nothing that prevents me from using this as a personal wiki and version control system. I already keep all of my source under a friendly LICENSE and have no problem doing the same for scripts and documentation as well.

I put everything I would need to checkout my home directory (bash scripts, vim files, etc) into subversion. Perfect for when I hop on a new machine. Also good for synchronizing changes between environments. I also threw up a few small java projects that have been sitting out of source control for too long, I'll keep adding more as they come up. I also got started putting a bunch of the files in my local doc/ directory into the wiki. Fortunately I've been using the Trac/MoinMoin syntax for a long time so it shouldn't be too difficult to make the transition from local storage to remote.

One of my favorite features so far is that I can check out my wiki onto my local workstation and make changes there with my editor of choice. Very cool.

If you're interested, here are some links:
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/fizz-buzz/"&gt;Fizz-Buzz Google Code Project&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/fizz-buzz/wiki/WikiStart"&gt;Fizz-Buzz Wiki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://code.google.com/p/fizz-buzz/source/browse/#svn/trunk"&gt;Fizz-Buzz Source&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

So far I only see two downsides. First, I have to be very careful not to commit anything sensitive to the repository as it's public. This generally isn't a problem but I do double check my commits. Second, unless I switch from Ant to Maven in the near future, jar files are going to send me over the 100MB limit sooner than later. I wonder why I don't have storage similar to GMail or Picasa. Oh well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-3094706501728319216?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/WUARokONiNE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/3094706501728319216/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=3094706501728319216" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3094706501728319216?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3094706501728319216?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/WUARokONiNE/google-code-as-personal-wikivc-tool.html" title="Google Code as Personal Wiki/VC Tool" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/09/google-code-as-personal-wikivc-tool.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEARXs_eyp7ImA9WxZQEks.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-6146376612423104813</id><published>2008-02-17T07:51:00.000-08:00</published><updated>2008-02-17T08:10:44.543-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-17T08:10:44.543-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>Beliefs and Programming</title><content type="html">I don't post too often on here these days. I've moved to blogging with my current employer, &lt;a href="http://www.compendiumblogware.com/"&gt;Compendium Blogware&lt;/a&gt;. You can find new posts &lt;a href="http://blogging.compendiumblog.com/blog/the-science-of-blogging"&gt;here&lt;/a&gt;.

Occasionally though, there is a post that doesn't quite belong or isn't quite appropriate for the corporate world. This is one of those posts.

&lt;a href="http://www.michaelkimsal.com/blog/"&gt;Michael Kimsal&lt;/a&gt; put together a survey called &lt;a href="http://www.kimsal.com/reldevsurvey/results.php"&gt;Religious affiliation and software development languages&lt;/a&gt;, which you can also discuss on his blog &lt;a href="http://michaelkimsal.com/blog/?p=458"&gt;here&lt;/a&gt;. I downloaded the data set and made the following further analysis:

 &lt;ul&gt;
  &lt;li&gt;Found the top 25 languages by the number of people who filled out the survey&lt;/li&gt;
  &lt;li&gt;Found the top 5 religious affiliations for each language&lt;/li&gt;
  &lt;li&gt;I normalized all Christian religions into the affiliation 'Christianity'&lt;/li&gt;
  &lt;li&gt;I grouped agnostic and atheist declarations into 'AA'&lt;/li&gt;
 &lt;/ul&gt;

Given that only ~3815 people took the survey, not a whole lot could be drawn from the numbers. However, here is what I found, draw your own conclusions.

 &lt;ul&gt;
  &lt;li&gt;The top 10 languages in order were: Python, C, C++, Java, Javascript, Ruby, PHP, Lisp, Perl, Haskell&lt;/li&gt;
  &lt;li&gt;The top two affiliate declarations were: AA (Atheist,Agnostic), Christian. After that Buddhist was most common.&lt;/li&gt;
  &lt;li&gt;Without normalization, the top declarations where Atheism followed by Agnostic followed by some variety of Christianity.&lt;/li&gt;
 &lt;/ul&gt;

I'm not sure what the target group was. I didn't even know about the survey until after it was closed. However, I would say the results are inline with what I have observed in my own geeky social circles. Analytical people tend to question doctrine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-6146376612423104813?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/9wCIRY0ZCBY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/6146376612423104813/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=6146376612423104813" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6146376612423104813?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6146376612423104813?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/9wCIRY0ZCBY/beliefs-and-programming.html" title="Beliefs and Programming" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2008/02/beliefs-and-programming.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEAARn84cCp7ImA9WB9RFU4.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-6401747682168966483</id><published>2007-10-16T04:56:00.000-07:00</published><updated>2007-10-16T05:12:27.138-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-10-16T05:12:27.138-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><category scheme="http://www.blogger.com/atom/ns#" term="hacking" /><title>Amazon Opens Up EC2</title><content type="html">Amazon today opened up its &lt;a href="http://aws.amazon.com/ec2"&gt;EC2&lt;/a&gt; (Elastic Cloud Computing) web service in an "unlimited beta". What does that mean? It means if you have an &lt;a href="http://aws.amazon.com/"&gt;AWS&lt;/a&gt; account, you can now sign up for EC2 without a long wait to become part of the beta group.

I haven't been blogging much lately as I joined a startup in Indianapolis about a month ago. Between the move from Seattle and the settling in I've been pretty busy. Now that things are starting to slow down a bit, one of the things I'm investigating is leveraging EC2/&lt;a href="http://aws.amazon.com/s3"&gt;S3&lt;/a&gt; for my company.

If you don't know those acronyms, S3 (Simple Storage Service) is essentially storage on demand and EC2 is compute on demand. The pricing uses a utility model, e.g. you pay for what you use and that's all, and the pricing is competitive. I did a cost analysis of hosting with EC2 vs a standard leased colo situation and EC2 was significantly less expensive, like, 75% less expensive. I still don't like the bandwidth pricing but I hope that will change over time as more users get on EC2.

I've played with EC2 for the past few months but hadn't found the perfect app for it. One of the challenges I'm currently facing is that at my new company, users upload lots of content. That content can vary in size (up to 10MB), is immutable, and is displayed/downloaded potentially many times. I don't want to have to worry about storage and backups of this content. Once the amount of data starts to move into the TB range, it becomes costly to effectively backup and store that much content.

Enter EC2/S3. You can imagine several EC2 instances that handle storage and retrieval of content from S3. A simple web service on top of this system allows for users to upload content essentially right to S3, and anyone can view content. Since no ACL is needed for the content, and I don't have to worry about SSL, this is for me a perfect application.

I am also currently aware of another EC2 customer using the platform for logging web requests. When users load a web page, they download a web bug from EC2. Since web logging and analytics can be potentially a costly and compute intensive application, this is another great way to utilize EC2. We (developers, technologists, hackers) are only beginning to see the possibilities of having a platform like EC2/S3 at our fingertips.

On another note, I am again hiring developers in Indianapolis. If you are, or know, bright hackers in the area or that would be willing to move to the area, please contact me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-6401747682168966483?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/aebZdCSi4h8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/6401747682168966483/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=6401747682168966483" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6401747682168966483?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/6401747682168966483?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/aebZdCSi4h8/amazon-opens-up-ec2.html" title="Amazon Opens Up EC2" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/10/amazon-opens-up-ec2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAHRHw6eyp7ImA9WB5VFkk.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-3345094008621675577</id><published>2007-08-08T23:47:00.000-07:00</published><updated>2007-08-08T23:58:55.213-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-08T23:58:55.213-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>One Time Passwords for Web Apps</title><content type="html">I recently did some traveling through Europe, and as I did I encountered my fair share of Internet cafe's and sketchy net connections. In the Internet cafe's I worried about keyloggers, screen capture utilities and rootkits. On the sketchy net connections in hotels I was primarily concerned about sniffers on the wire. In all, I got to thinking about one time passwords for web applications, and why they seemingly don't exist.

One of the things I started thinking was, many people have a cell phone. Why not replace your SecurID card with a cell phone? When you go to log onto a site from an untrusted location, have an option where users can check a box and enter in a pin instead of their password. Once successfully entered, a user receives a text message with a one time password they can use for a short duration of time. The user then uses their pin, along with the one time password to gain access to the site.

This would be easy and inexpensive to implement as a web service that you could offer to third parties, so why has no one tackled this problem? If you know, let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-3345094008621675577?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/W5fqMWTLjt8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/3345094008621675577/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=3345094008621675577" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3345094008621675577?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3345094008621675577?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/W5fqMWTLjt8/one-time-passwords-for-web-apps.html" title="One Time Passwords for Web Apps" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/08/one-time-passwords-for-web-apps.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EHQno6cSp7ImA9WB5VFUk.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-979777522386958665</id><published>2007-08-07T19:35:00.001-07:00</published><updated>2007-08-07T19:53:53.419-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-07T19:53:53.419-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="hacking" /><title>Back from Defcon</title><content type="html">I spent this past weekend at Defcon 15. This is my 8th year going to Defcon and the conference keeps getting better. I got to meet up with some people I haven't seen in a few years so that was excellent. This year I mostly went to non-technical tracks, I went to what I would consider 'geek' tracks. My favorites were:
&lt;ul&gt;&lt;li&gt;Creating  Unreliable Systems, Attacking the Systems that Attack You&lt;/li&gt;&lt;li&gt;GeoLocation of Wireless Access Points and "Wireless GeoCaching"&lt;/li&gt;&lt;li&gt;Being in the know... Listening to and understanding modern radio systems&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.radioreference.com/"&gt;http://www.radioreference.com/&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt; Hardware Hacking for Software Geeks&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.sparkfun.com/"&gt;http://www.sparkfun.com/&lt;/a&gt;
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Satellite Imagery Analysis&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rst.gsfc.nasa.gov/Front/tofc.html"&gt;http://rst.gsfc.nasa.gov/Front/tofc.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://eyeball-series.org/"&gt;http://eyeball-series.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://digitalgeography.co.uk/"&gt;http://digitalgeography.co.uk/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://wikimapia.org/"&gt;http://wikimapia.org/&lt;/a&gt;
 &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt; I got some great info from the "Hardware Hacking for Software Geeks" talk. I'm planning on building a micro-controller driven camera that acquires location via GPS and submits photos via Bluetooth. This probably already exists, but it should be fun to build. Wikimapia is also a really cool site.

Highlights of the weekend included the first Defcon wedding and an undercover reporter being outed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-979777522386958665?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/wP7LvScfyLc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/979777522386958665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=979777522386958665" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/979777522386958665?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/979777522386958665?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/wP7LvScfyLc/back-from-defcon.html" title="Back from Defcon" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/08/back-from-defcon.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYGRH0yeyp7ImA9WB5QEUo.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8775175901534745491</id><published>2007-06-26T22:09:00.000-07:00</published><updated>2007-06-29T21:35:25.393-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-29T21:35:25.393-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>On the Ethics of Contracting</title><content type="html">For the past couple of months I have been doing contract work for a variety of local companies. When someone takes you on as a contractor, they have certain expectations about what you bring to the table. In particular, clients have an expectation that you bring particular expertise to the company and can help them solve a particular problem more quickly then they could do on their own with their given resources. This means you are, as a contractor, particularly well suited for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;startups&lt;/span&gt;, short-term projects, acquisitions and mergers.

In many circumstances, you are brought in as a domain expert and simply asked to do the "best" thing for that company while still solving their problem. There are no or very few technology requirements. Herein lies a problem of ethics. If you determine that the best solution is a technology that you have very little or no experience with, do you have a responsibility to inform the company of that fact and should you charge them for the time it takes you to get up to speed?

First, I'm not sure how you can recommend a technology if you have zero experience with it. Yet, I've seen it happen. If you have no experience, how do you know that the solution will meet their expectations? I don't care how much you've read about something, experience matters. Assuming that you take some time to work with the technology and then make a recommendation, you have a responsibility to let the company know what your experience level with the technology is. This mitigates risk, and allows the company to make an educated decision on how to move forward. Also ask yourself the question, "How much is this recommendation based on my own personal desire to become an expert on the technology?" If it plays a large part, do the right thing and at least reconsider the recommendation. If you genuinely selected the technology because it is the best fit, read on.

If you make a recommendation to use a technology that you have very little experience with, should you charge the company for your learning time? Assuming you let them know that you aren't an expert, and they still want you to handle the development, I still don't believe you should charge for learning time. The only time I believe that is appropriate is when the technology is specified and you aren't an expert. It shouldn't happen, but it does.

So, what do you think? Do contractors have an ethical (and perhaps legal) responsibility to disclose their level of expertise with a given technology and should they charge for the time they spend learning? Until now, I have felt alone in the thought camp of responsible disclosure and appropriate billing. What do other contractors out there do?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8775175901534745491?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/FZArN1x7O7g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8775175901534745491/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8775175901534745491" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8775175901534745491?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8775175901534745491?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/FZArN1x7O7g/on-ethics-of-contracting.html" title="On the Ethics of Contracting" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/on-ethics-of-contracting.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENQX04eSp7ImA9WB5RFUs.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-8128987823779534429</id><published>2007-06-22T19:59:00.000-07:00</published><updated>2007-06-22T20:34:50.331-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-22T20:34:50.331-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>Distributed Computing Failures</title><content type="html">I went to a talk several months ago given by Alan Robins, a Principal Engineer in the distributed systems engineering group at Amazon. The title of the talk was something like, "Performance and Availability" but the focus of the talk was much more on the how and why of what distributed computing technologies had failed at Amazon. It was really interesting. I took about three pages of notes, and they're more or less verbatim below. I wish he had released the slides, there was a lot of really good information that I was unable to get down on paper.
&lt;ul&gt;&lt;li&gt;Technologies&lt;/li&gt;&lt;ul&gt;&lt;li&gt;XA Distributed transactions (two phase commit)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;TP monitors such as Tuxedo&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;RPC&lt;/li&gt;&lt;ul&gt;&lt;li&gt;DCOM, DCE, CORBA, RMI, EJB&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Stateful Remote Objects&lt;/li&gt;&lt;ul&gt;&lt;li&gt;RMI&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Many dimensions to consider beyond performance and availability
&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Performance (TPS/Host Latency, etc)
&lt;/li&gt;&lt;li&gt;Availability: How many nines (time up/total time)?
&lt;/li&gt;&lt;li&gt;Scalability: How much effort to scale?
&lt;/li&gt;&lt;li&gt;Distributability: How much effort for multiple data centers?
&lt;/li&gt;&lt;li&gt;Evolvability: Effort to extend and mutate
&lt;/li&gt;&lt;li&gt;TCO: Hardware, licensing, dev or integration, operations and maintenance&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Reconsider performance and availability relative to TCO!&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Distributed Transactions: Atomic transactions across multiple transactional resources
&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Example: Customer changes primary address and hits customer and address db&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Expensive. Reduces scalability of db server&lt;/li&gt;&lt;li&gt;Latency of commit is 5x more over normal transactions&lt;/li&gt;&lt;li&gt;Reduce throughput of application&lt;/li&gt;&lt;li&gt;If any resources are down, nothing can happen. Reduces availability&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternate to XA&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Be optimistic, commit what work you can&lt;/li&gt;&lt;li&gt;Do no harm: order commits such that if failure occurs you can live with inconsistent state&lt;/li&gt;&lt;li&gt;Compensate: undo previous commit or queue up rest of work for later&lt;/li&gt;&lt;li&gt;Design for failure: Minimize cross db foreign key refs, even denormalize&lt;/li&gt;&lt;li&gt;Tolerate dangling references and inconsistencies&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Remote Procedure Calls: make a function call like it's local, but it's not&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Example: calculate shipping charges on a customer order&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Binary formats create dependencies&lt;/li&gt;&lt;li&gt;Evolving API forces client side rebuilds. Expect to evolve.&lt;/li&gt;&lt;li&gt;Service owners must run multiple versions of their software.&lt;/li&gt;&lt;li&gt;RPC tightly couples availability requirements.&lt;/li&gt;&lt;li&gt;Many fine grained requests have high latency over global distances&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternative to RPC&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Document passing paradigm&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Self describing wire format (XML)&lt;/li&gt;&lt;li&gt;Evolution without affecting old clients possible&lt;/li&gt;&lt;li&gt;Good for asynchronous message passing&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;RPC model still possible&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;SOAP Problems&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Large messages&lt;/li&gt;&lt;li&gt;Expensive to parse and build DOMs&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Stateful Remote Objects (CORBA, EJB)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Problem being solved: supports ? for clients, clients can make many fine grained calls, keeps data model on server, complex data model not transferred&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Mapping client session to stateful server is complex.&lt;/li&gt;&lt;li&gt;Servers must keep state for each client (reduces scalability)&lt;/li&gt;&lt;li&gt;Server failure fails a lot of clients (reduced availability)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternative: Stateless servers with persistence store&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Servers handle each request independently&lt;/li&gt;&lt;li&gt;Use data in request to establish context&lt;/li&gt;&lt;li&gt;Return results to caller&lt;/li&gt;&lt;li&gt;Advantage: High performance, high availability, scales great&lt;/li&gt;&lt;li&gt;Disadvantage: Pushes state onto data store&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Asynchronous messaging, Once-only delivery&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Problem being solved: service developers don't worry about dupes. They can just do what the request wants. Reduces application logic and complexity of handling dupes.&lt;/li&gt;&lt;li&gt;Example: Customer 1-clicks on an item
&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Almost impossible to guarantee. In order to ? everything must be transactional&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Double clicks happen all the time&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Alternative to Only-Once&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Idempotence (quality of something that has the same effect if used multiple times at once): dupes handled correctly with respect to application.&lt;/li&gt;&lt;li&gt;Advantages: simple, enables more scalability and availability. Simplifies clients.&lt;/li&gt;&lt;li&gt;Disadvantages: Requires services to check their db. Sometimes service has to build look aside cache.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;In order delivery: service doesn't worry about temporal discontinuities&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Example: Order adds A, adds B, adds C, deletes B, submits order&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Very difficult for infrastructure to manage total ordering.&lt;/li&gt;&lt;li&gt;Tight coupling.&lt;/li&gt;&lt;li&gt;Can't deliver message until current message delivered.&lt;/li&gt;&lt;li&gt;Eliminates availability and scalability&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternative: best effort delivery&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Developers deal with out of order messaging. Requires event to have a time stamp or sequence id.&lt;/li&gt;&lt;li&gt;Advantages: high throughput, optimistic delivery policy (deliver events when you can), very high availability&lt;/li&gt;&lt;li&gt;Disadvantage: Application developers must deal with out of order messages&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Stored Procedures&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Easy for developers to write RPC type applications&lt;/li&gt;&lt;li&gt;DBAs can ensure db resources are used efficiently&lt;/li&gt;&lt;li&gt;Complex logic performed without moving data across the wire&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Database resources are the most expensive&lt;/li&gt;&lt;li&gt;Creates scaling limitations&lt;/li&gt;&lt;li&gt;Low performance&lt;/li&gt;&lt;li&gt;Application now split between application server and database&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternative&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Use a database for what it's good for: relational queries and updates&lt;/li&gt;&lt;li&gt;Keep business logic on server&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Centralized Database&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ACID model is easy to program against, ensures consistency&lt;/li&gt;&lt;li&gt;Reads after write guaranteed to reflect write&lt;/li&gt;&lt;li&gt;Provides single synchronization point for all applications&lt;/li&gt;&lt;li&gt;Provides richest set of capabilities&lt;/li&gt;&lt;li&gt;Example: Customer information database&lt;/li&gt;&lt;li&gt;Dark Side&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Doesn't scale&lt;/li&gt;&lt;li&gt;Doesn't lend to global distribution&lt;/li&gt;&lt;li&gt;Most labor intensive&lt;/li&gt;&lt;li&gt;Least available&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Alternative: Lightweight operation datastores/caches (e.g. bdb)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Datastore distributed geographically&lt;/li&gt;&lt;li&gt;Updates propagate via asynchronous messaging&lt;/li&gt;&lt;li&gt;Read operations are done locally&lt;/li&gt;&lt;li&gt;Updates done locally then write back to central or peer&lt;/li&gt;&lt;li&gt;Disadvantages&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Inconsistencies: Read after write not absolutely guaranteed&lt;/li&gt;&lt;li&gt;Partitions can cause multiple versions to exist on different peers&lt;/li&gt;&lt;li&gt;Requires distributed group management (DHT)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;The nature of distributed systems&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Nodes fail&lt;/li&gt;&lt;li&gt;Networks partition&lt;/li&gt;&lt;li&gt;Data centers go down&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;There is a tradeoff between availability and consistency&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Via distribution and redundancy you gain availability, scalability and performance but lose consistency&lt;/li&gt;&lt;li&gt;Strive for eventual consistency&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Embrace failure: build in availability&lt;/li&gt;&lt;li&gt;Accept inconsistency.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Apology oriented development&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;If you are a developer, deal with these things: Potential inconsistencies considering race conditions&lt;/li&gt;&lt;li&gt;Infrastructure cant hide&lt;/li&gt;&lt;li&gt;Model applications as event driven process. Include all info needed in each message. Prop, repl, cache. This provides high performance and high availability&lt;/li&gt;&lt;/ul&gt;There are talks of this nature fairly regularly at UW and Seattle University, I encourage you to go when you can. This was one of the most informational talks I have ever been to, and it was free.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-8128987823779534429?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/Q_6DOwcgVE0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/8128987823779534429/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=8128987823779534429" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8128987823779534429?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/8128987823779534429?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/Q_6DOwcgVE0/distributed-computing-failures.html" title="Distributed Computing Failures" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/distributed-computing-failures.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMNRn0-eyp7ImA9WB5RFUw.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-4536369077516594985</id><published>2007-06-22T04:03:00.001-07:00</published><updated>2007-06-22T04:08:17.353-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-22T04:08:17.353-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>Trac reminds me of Oracle</title><content type="html">I just finished getting a &lt;a href="http://trac.edgewall.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;trac&lt;/span&gt;&lt;/a&gt; installation up on my site, you can find projects &lt;a href="http://mobocracy.net/code/"&gt;here&lt;/a&gt;. And, while I love &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Trac&lt;/span&gt;, the install process just reminded me of Oracle. It took several hours, had a bunch of dependencies, and to get it to work the way I wanted it required several more hours of customization.

Granted, if you need an "enhanced wiki and issue tracking system" that has integration with subversion and works pretty well, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Trac&lt;/span&gt; is tough to beat. But getting it running on a slightly older system was no easy task. If they want that tool to become more widely used the developers are going to have to fix the installation issues and create some type of an automated installer.

Of course, I really have no right to complain considering I haven't written a single line of code for the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-4536369077516594985?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/G34n255o8hs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/4536369077516594985/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=4536369077516594985" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/4536369077516594985?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/4536369077516594985?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/G34n255o8hs/trac-reminds-me-of-oracle.html" title="Trac reminds me of Oracle" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/trac-reminds-me-of-oracle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEMQHk4eip7ImA9WB5RE0s.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-7815624133533081282</id><published>2007-06-20T10:27:00.000-07:00</published><updated>2007-06-20T11:21:21.732-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-20T11:21:21.732-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>Martin Roesch on Snort 3.0 and Sourcefire</title><content type="html">Yesterday &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Sourcefire&lt;/span&gt; put on a two hour presentation at the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;EMP&lt;/span&gt; here in Seattle. With admission you got some &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;swag&lt;/span&gt; including a calendar and a snort toy, admission to the Sci-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Fi&lt;/span&gt; museum for the afternoon and an "ice cream social". Below are &lt;span style="font-weight: bold;"&gt;notes&lt;/span&gt; from the presentation, these are not my &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;opinion&lt;/span&gt;. Overall I found the presentations pretty interesting with them covering the following topics:
&lt;ul&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Sourcefire&lt;/span&gt; &amp; Snort; past, present &amp; future&lt;/li&gt;&lt;li&gt;Demo of their RNA/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;ETM&lt;/span&gt; tools&lt;/li&gt;&lt;li&gt;Snort 3.0&lt;/li&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Sourcefire&lt;/span&gt; 4.7&lt;/li&gt;&lt;/ul&gt;In particular, I wanted to hear Marty's thoughts on Snort 3.0 and where he is heading. Martin said that the 3.0 release would focus on the following areas:
&lt;ul&gt;&lt;li&gt;Reduce Manual Tuning &amp;amp; Automate Configuration&lt;/li&gt;&lt;ul&gt;&lt;li&gt;"Tuning today is a failure"&lt;/li&gt;&lt;ul&gt;&lt;li&gt;We need dynamic defense for dynamic networks
&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Solve layer 3/4 evasion due to the IDS not being &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;IP&lt;/span&gt; stack aware&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Model the way an endpoint sees, model the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;IP&lt;/span&gt; stack
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Normalize rules and configuration languages&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Pro&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Rules work well&lt;/li&gt;&lt;li&gt;Trivial to use for simple stuff&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Con&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ugly&lt;/li&gt;&lt;li&gt;Hard to do hard things&lt;/li&gt;&lt;li&gt;A bad rule can significantly impact performance&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Snort is not a language project&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;LUA&lt;/span&gt; will be snort 3.0's next generation language processor&lt;/li&gt;&lt;li&gt;Snort 3.0 will include a command shell that will allow &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;LUA&lt;/span&gt; commands to be executed
&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Take better advantage of hardware&lt;/li&gt;&lt;ul&gt;&lt;li&gt;We are getting more cores, not speed. Snort is single threaded, this is a problem.&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Must multi-thread snort
&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Vendors are accelerating the wrong parts of Snort and have been for years&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Need explicit locations for optimization.
&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;Martin asserts that tuning, prioritization and evasion are the same problem. The root of this problem is a lack of knowledge of what is being defended. The solution is to impart knowledge about the operating environment directly into the engine. This allows for the engine to tune itself, automate anti-evasion and automate prioritization.
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mobocracy.net/images/snort_3.0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" src="http://mobocracy.net/images/snort_3.0.png" alt="" border="0" /&gt;&lt;/a&gt;Above is the snort 3.0 architecture as described/shown by Martin. I think of primary interest is the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;rearchitecture&lt;/span&gt; and threading. I will be surprised if Martin is able to release RNA as open source and integrate that into Snort. If that doesn't happen, it either means that the automation features won't make it into Snort or they won't work nearly as well as RNA.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-7815624133533081282?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/8LfSFZ9oTA4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/7815624133533081282/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=7815624133533081282" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/7815624133533081282?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/7815624133533081282?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/8LfSFZ9oTA4/martin-roesch-on-snort-30-and.html" title="Martin Roesch on Snort 3.0 and Sourcefire" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/martin-roesch-on-snort-30-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYFRnw_eCp7ImA9WB5RFUw.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-1358528857149965843</id><published>2007-06-19T11:55:00.000-07:00</published><updated>2007-06-22T04:01:57.240-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-22T04:01:57.240-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>Work in Progress: CopyBlog</title><content type="html">I used to have a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Wordpress&lt;/span&gt; blog, and although there weren't many posts I wanted to import them into Blogger. I found a bunch of tools for importing from Blogger to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Wordpress&lt;/span&gt;, but none that did the opposite. I found one tool that did what I was wanting (or says so), &lt;a href="http://code.google.com/p/blogsync-java/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;blogsync&lt;/span&gt;-java&lt;/a&gt;, but looking at the code it isn't very modular. Given that my technology tastes seem to change every other month, I really wanted a tool that would allow me to copy posts and comments between any two blog systems. Hence, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;CopyBlog&lt;/span&gt;.

&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;CopyBlog&lt;/span&gt; is a command line tool that allows you to copy posts and comments between any two blog systems, at least in theory.

I spent some time yesterday and this morning writing some code to take &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Wordpress&lt;/span&gt; posts and comments and import them to Blogger. Although this currently just replicates the functionality of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;blogsync&lt;/span&gt;-java, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;API&lt;/span&gt; is much more modular so you should be able to drop in a single class and you can immediately copy to and from that blog type. I should have a 0.1 version out the door this week if I can find some free time, and that would include full support for Blogger, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Wordpress&lt;/span&gt; and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;LiveJournal&lt;/span&gt;.

You can find source code up at &lt;a href="http://mobocracy.net/code/CopyBlog"&gt;http://mobocracy.net/code/CopyBlog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-1358528857149965843?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/VMo1ejtg85E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/1358528857149965843/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=1358528857149965843" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1358528857149965843?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/1358528857149965843?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/VMo1ejtg85E/work-in-progress-copyblog.html" title="Work in Progress: CopyBlog" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/work-in-progress-copyblog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIDRHg7fSp7ImA9WB5REU8.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-7536800263193135354</id><published>2007-06-17T14:10:00.001-07:00</published><updated>2007-06-17T15:49:35.605-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-17T15:49:35.605-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="technology" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>The Challenges of EC2</title><content type="html">I've recently been working on a project building out the development process, environment and tools for a startup client. This includes things like configuration management, release engineering, automated testing, version control, etc. In doing so, I've been wanting to create as part of this several images including:
&lt;ul&gt;&lt;li&gt;A bootable and optionally installable build system (see &lt;a href="http://blog.mobocracy.net/2007/06/bootable-development-environments.html"&gt;this&lt;/a&gt; post)
&lt;/li&gt;&lt;li&gt;A bootable development environment for each developer (preconfigured application server, version control data, preconfigured database, etc)&lt;/li&gt;&lt;li&gt;A bootable QA and Beta environment&lt;/li&gt;&lt;/ul&gt;I was hoping to use &lt;a href="http://aws-portal.amazon.com/"&gt;AWS&lt;/a&gt; for this, particularly &lt;a href="http://aws.amazon.com/ec2"&gt;EC2&lt;/a&gt; for the development, QA and Beta environments. If you're not familiar with EC2, it is Amazon's Elastic Compute Cloud, and it allows you to essentially boot and run OS images in their cloud. You pay for hourly CPU usage and data transfer from the cloud and to the cloud. Let's compare a fully hosted, dedicated server solution from &lt;a href="http://www.theplanet.com/"&gt;the planet&lt;/a&gt; with an EC2 image.
&lt;div&gt;&lt;table border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody valign="top"&gt;&lt;tr&gt;&lt;td width="33%"&gt;&amp;nbsp;&lt;/td&gt;&lt;td width="33%"&gt;The Planet&lt;/td&gt;&lt;td width="33%"&gt;Amazon EC2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%"&gt;OS&lt;/td&gt;&lt;td width="33%"&gt;CentOS&lt;/td&gt;&lt;td width="33%"&gt;Linux w/2.6 Kernel&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%"&gt;Data Transfer&lt;/td&gt;&lt;td width="33%"&gt;1500GB&lt;/td&gt;&lt;td width="33%"&gt;Unlimited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%"&gt;Disk Space&lt;/td&gt;&lt;td width="33%"&gt;250GB&lt;/td&gt;&lt;td width="33%"&gt;160GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%"&gt;RAM&lt;/td&gt;&lt;td width="33%"&gt;2048MB&lt;/td&gt;&lt;td width="33%"&gt;1792MB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="33%"&gt;Cost&lt;/td&gt;&lt;td width="33%"&gt;$147/month&lt;/td&gt;&lt;td width="33%"&gt;$312/month&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;
So, the above for bandwidth assumes that you use your full 1500MB a month (and the same in EC2) and that inbound traffic is only 25% of the total traffic, that number comes from my own experience and is probably overly generous. If you decreased the percentage of inbound traffic, the price increases. Also, it assumes 24/7 operation of a machine over a 30 day period. We also a amortized a $225 setup fee at the planet over a 12 month period. So, EC2 is more expensive for a front-end web server then a hosted environment however your downtime due to hardware related failures decreases to almost zero. You also have no setup fee and you can literally bring images up in minutes (so I'm told, more on that later). However, for an N-tier system, EC2 is a very inexpensive solution for your middleware application servers and backend servers since traffic between EC2 systems costs you nothing. Your cost for operating an EC2 image on a 24/7 basis and only doing inter-image traffic? $72.00/month.

So, purely on a cost basis, EC2 seems like a platform for at least middleware and backend systems. Also from an downtime perspective, not having hardware to deal with should increase availability.

In doing some research, I found the following troubling points. First, the internet is apparently full. This limited beta is currently full, a helpful error message tells me, and I will be notified when there is availability. Okay, that sucks. Second, EC2 doesn't natively have persistent storage for images. That is, if an image fails/aborts/shutsdown, any data stored on the local disk is lost to you. Apparently you can mount an S3 partition in an EC2 image, but S3 isn't really meant for random IO like you might have in a database for instance.

I hope that EC2 opens up to new users in the near future, because it does solve many common problems (rapid horizontal scaling for the web tier, ephemeral environments for dev or qa). It is not however a silver bullet. Bandwidth to and from the cloud is expensive, and the lack of persistent storage makes many jobs impractical for the platform. If I ever get a chance to test, I'll put more information up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-7536800263193135354?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/75w6JZiQ-uU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/7536800263193135354/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=7536800263193135354" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/7536800263193135354?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/7536800263193135354?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/75w6JZiQ-uU/challenges-of-ec2.html" title="The Challenges of EC2" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/challenges-of-ec2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAMRXw8eSp7ImA9WB5SGUg.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-2484908164893940156</id><published>2007-06-15T18:24:00.000-07:00</published><updated>2007-06-15T18:53:04.271-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-15T18:53:04.271-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="events" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>SASAG Meeting for June</title><content type="html">Last night was the monthly &lt;a href="http://www.seattle-sage.org/"&gt;SASAG&lt;/a&gt; (Seattle Area System Administrators Guild) and was the first I had been to. As I'm not a system administrator but a software engineer, I wasn't sure what I would gain from going but it turns out a lot. Last nights topic of discussion was, "Project Success: Science, Magic or Luck?" and was presented by Leeland Artra who is currently a PM at Qpass. Essentially, Leeland was suggesting applying software development techniques to system administration. For example, he suggested using test first development methodologies (I always knew them as TDD, Test Driven Design) to works towards a functional system. He also recommended using scrum to manage projects.

My experience with systems engineers is that their programming experience is limited to systems programming, and things like functional and unit tests are foreign to them. If this isn't true, by all means let me know. So the suggestion for non-programmers to write programs to validate systems seemed counter intuitive to me. However, I liked the idea of using TDD to move forward on a project.

I'm not sure why Leeland didn't suggest simply using Nagios or another monitoring system as your test platform. You can imagine going and writing all your monitors for Nagios which all start off red, or non-functional initially and as parts of the system come online and become functional monitors go to green. This seems like a much more straightforward, and intuitive way to use TDD for non-development projects.

Regardless, the idea of applying agile methodologies to non-development projects is an interesting one and one I hadn't seriously considered before. I'm not sure how well it would apply to projects with serious capital expenditures such as hardware acquisitions, but the ideas should apply pretty well for any project. Leeland also showed off an interface he had developed for testing complex systems, which just seems unfair since I know it's not open source.

On another note, I had my all time longest interview today. 7 hours and 8 people including the CTO, the hiring manager, two developers, one system programmer, one system engineer, the ops manager and the HR person. I really enjoy interviews that are challenging because you know you're going to be working with other good people. I mentally collapsed in my last technical interview though, so who knows what they thought. Updates ahead.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-2484908164893940156?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/muXmlxgkJf0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/2484908164893940156/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=2484908164893940156" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/2484908164893940156?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/2484908164893940156?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/muXmlxgkJf0/sasag-meeting-for-june.html" title="SASAG Meeting for June" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/sasag-meeting-for-june.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMEQ38_cCp7ImA9WB5SGEU.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-3975101203721601000</id><published>2007-06-14T22:17:00.000-07:00</published><updated>2007-06-14T22:46:42.148-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-14T22:46:42.148-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="opinions" /><category scheme="http://www.blogger.com/atom/ns#" term="interviews" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><title>What do you want to be when you grow up?</title><content type="html">I've been doing software development, system engineering and architecture for almost 10 years. I've worked at large companies, small companies and tiny companies. And after leaving Mixxer in February with the intention of going back to school, for the first time in many years I felt a bit lost in terms of "What do I want to do now?". So I spent about 8 weeks traveling, saw family, did some vacationing, and got back feeling refreshed with what I had hoped would be a new perspective on things. I didn't have that though.

What I had instead was the desire to go back to work, but no idea about what I wanted to be doing. So I started interviewing with everyone, 19 companies to be exact, doing everything from embedded C &amp; C++ development to Ruby on Rails at companies ranging from fortune 100 to pre-funding startups. During the interview process I have kept busy consulting for small startups; helping with software development, architecture and direction. In doing some consulting it helped me figure out not what I want to do, but the characteristics by which I will be able to identify what I want to do. Characteristics of the right job include:
&lt;ul&gt;&lt;li&gt;A company that believes they are improving the quality of life for its users&lt;/li&gt;&lt;li&gt;Coworkers who are really smart and passionate about the company mission&lt;/li&gt;&lt;li&gt;A startup&lt;/li&gt;&lt;li&gt;People who get the philosophy behind the technology they are using&lt;/li&gt;&lt;li&gt;The hacker ethos is prevalent
&lt;/li&gt;&lt;li&gt;Decisions are made based on merit, not ego&lt;/li&gt;&lt;li&gt;A technical community based on meritocracy, not seniority&lt;/li&gt;&lt;/ul&gt;After determining that the above list would help me classify the right company for me, my list of companies dropped from 19 to 4. I'm wrapping up interviews with those 4 now, although the way I crumble in my in person interviews it could drop to zero pretty quickly :)

In any case, being able to identify what it is exactly about working that you love is crucial to being able to find the right job. Sometimes you don't have a choice, you have responsibilities that drive you towards finding the first available and well paying position. I choose to wait.

If you think you fit the environment I described above, and based on my &lt;a href="http://mobocracy.net/resume.pdf"&gt;resume&lt;/a&gt; I look like a good fit, send me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-3975101203721601000?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/_VdFIP9j3CM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/3975101203721601000/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=3975101203721601000" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3975101203721601000?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3975101203721601000?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/_VdFIP9j3CM/what-do-you-want-to-be-when-you-grow-up.html" title="What do you want to be when you grow up?" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/what-do-you-want-to-be-when-you-grow-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEAQ3w5fip7ImA9WB5SGEU.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-5828305682202184293</id><published>2007-06-14T22:05:00.000-07:00</published><updated>2007-06-14T22:17:22.226-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-14T22:17:22.226-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="algorithms" /><category scheme="http://www.blogger.com/atom/ns#" term="mathematics" /><category scheme="http://www.blogger.com/atom/ns#" term="security" /><category scheme="http://www.blogger.com/atom/ns#" term="hacking" /><title>Botnets and the Convex Hull</title><content type="html">Over the past few months I have worked on some computational geometry problems which required computing the Convex Hull for some set of points. I have been using it for some pattern recognition work and in doing so thought to myself, how could you map an IP address to a real vector space? And, if you could, is it possible to track an attacker or adversary? More importantly, can you estimate size or infer the location of a master in a botnet?

Now, I realize that the location of a compromised host has no bearing on the location of the attacker. However, the latency between the compromised host and the attacker (or botnet master) does have a bearing on location. Likewise, there are a number of other useful metrics such as how recently the machine was compromised, the difference in times for two zombies to receive the same command, etc.

Take one of these metrics, and assign it to each node you are aware of. Now use that metric as the distance to an arbitrary point P. Now compute the convex hull. Perform this same series of steps for each of the metrics you have chosen and overlay the convex hull for each metric. My assumption would be that your arbitrary point P could be identified in each one, and that may help identify a master. Also, it may help estimate the size of the botnet.

The above writing is very hand wavy, I realize. However I'm curious if any work has been done until now to determine botnet topology via a similar mechanism. If anyone is aware, please let me know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-5828305682202184293?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/kjCMPX7onkE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/5828305682202184293/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=5828305682202184293" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/5828305682202184293?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/5828305682202184293?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/kjCMPX7onkE/botnets-and-convex-hull.html" title="Botnets and the Convex Hull" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/botnets-and-convex-hull.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8NRncycCp7ImA9WB5SGEU.&quot;"><id>tag:blogger.com,1999:blog-7225965301398108875.post-3280707597498889298</id><published>2007-06-14T08:56:00.000-07:00</published><updated>2007-06-14T22:04:57.998-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-06-14T22:04:57.998-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="projects" /><category scheme="http://www.blogger.com/atom/ns#" term="hacks" /><category scheme="http://www.blogger.com/atom/ns#" term="main" /><category scheme="http://www.blogger.com/atom/ns#" term="applications" /><title>Reviving WADE</title><content type="html">I couple of years ago I started a small project called WADE. WADE stands for "Wireless ADvertising Engine", the goal of which was to enable coffee shops and other sites providing free wi-fi with the ability to earn money from advetising to help offset the cost of wifi. The technology would essentially allow sites to insert advertising in place of existing ads on a page, with ads that they get a payment for. More specifically, using something like the Adblock filter list, apache, mod_rewrite/mod_proxy and some dns magic to instead of removing ads, replace them with perhaps more relevant ads from local businesses.

When I went to a friend at the EFF, he informed me that there may be an issue with Copyright law. As in, the content and layout of a page are protected under copyright law. I'm not sure if I'm liable for providing the software, the coffee shop is liable for using the software, or if it is a non-issue.

In any case, I have received a few emails about WADE over the past couple of months and have thought I would revive the software and send it to a few friends who can use it. The question is, does something already exist and I should just point people there?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7225965301398108875-3280707597498889298?l=blog.mobocracy.net' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mobocracy/CNzP/~4/3IvTmiXbU5E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.mobocracy.net/feeds/3280707597498889298/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7225965301398108875&amp;postID=3280707597498889298" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3280707597498889298?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7225965301398108875/posts/default/3280707597498889298?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/mobocracy/CNzP/~3/3IvTmiXbU5E/reviving-wade.html" title="Reviving WADE" /><author><name>Blake Matheny</name><uri>http://www.blogger.com/profile/15984995884622791435</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="17475579080149327205" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.mobocracy.net/2007/06/reviving-wade.html</feedburner:origLink></entry></feed>
