[Valid RSS] This is a valid RSS feed.


This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml-stylesheet type="text/xsl" href="" media="screen"?><rss version="2.0"
  3.  xmlns:dc=""
  4.  xmlns:atom="" >
  5. <channel>
  6.  <title>What&apos;s That Noise?! [Ian Kallen&apos;s Weblog]</title>
  7.  <link></link>
  8.      <atom:link rel="self" type="application/rss+xml" href="" />
  9.    <description>percolations | ruminations | illustrations | inspirations</description>
  10.  <language>en-us</language>
  11.  <copyright>Copyright 2011</copyright>
  12.  <lastBuildDate>Sat, 30 Apr 2011 09:38:29 -0700</lastBuildDate>
  13.  <generator>Apache Roller (incubating) 4.0 (20071120033321:dave)</generator>
  14.        <item>
  15.    <guid isPermaLink="true"></guid>
  16.    <title>The mobile web, bookmarks and the apps they should be able to play with</title>
  17.    <dc:creator>spidaman</dc:creator>
  18.    <link></link>
  19.        <pubDate>Sat, 30 Apr 2011 09:22:48 -0700</pubDate>
  20.    <category>Musings</category>
  21.            <description>&lt;p&gt;
  22. &lt;a href=&quot;; title=&quot;MacRumors&quot;&gt;
  23. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;492&quot; height=&quot;283&quot; /&gt;&lt;/a&gt;
  25. Last year Marco Arment of Instapaper and Tumblr fame posted a plea to Apple with &lt;a href=&quot;;&gt;an open enhancement request to the Mobile Safari team for sane bookmarklet installation or alternatives&lt;/a&gt;. In it he detailed how mobile browsers such as mobile Safari on iPhones and iPads are second class citizens on the web. You can&apos;t build plug-ins for them or easily add bookmarklets (javascript you can invoke from the browser&apos;s bookmarks). &lt;a href=&quot;;&gt;Instapaper&lt;/a&gt; on iOS devices would greatly benefit from easier integration into with the device&apos;s browser. I went through the bookmarklet copy/paste exercise that Instapaper walks you through, it&apos;s definitely a world of pain. Well, I read this morning that it looks like Apple is answering him, perhaps. Maybe backhanding him.
  26. &lt;/p&gt;
  27. &lt;p&gt;
  28. Apple is apparently implementing their own &quot;Reading List&quot; feature that current speculation says is squarely aimed at Instapaper and &lt;a href=&quot;;&gt;Read It Later&lt;/a&gt;. This came out of a &lt;a href=&quot;;&gt;MacRumors&lt;/a&gt; report on early builds of Lion, the next version of Mac OS X. &lt;a href=&quot;;&gt;VentureBeat&lt;/a&gt; rightly supposes there will be complimentary features on iOS devices.
  29. &lt;/p&gt;
  30. &lt;p&gt;
  31. Like Marco, I&apos;d like to be able to build apps that run natively on devices that can play more smoothly with the device&apos;s browser. While mobile SDKs may have support for running an embedded browser (AKA &quot;web views&quot;) they&apos;re still crippled by having the main browser in it&apos;s own silo (and has been previously circulated, web view javascript engines &lt;a href=&quot;;&gt;are crippled in their own&lt;/a&gt;). Ideally what we&apos;re seeing isn&apos;t an assault on existing bookmark services but the harbinger of API&apos;s that will allow developers to integrate more of the browser&apos;s functionality. Certainly some things should continue to be closely sandboxed (e.g. browsing history visibility) or requires full disclosure and permission (e.g. access to the cookie jar). Privacy leaks, phishing attacks and other sorts of miscreant behavior should obviously be guarded against but bookmark additions seem like an easy thing to provide an API and safe user experience around.
  32. &lt;/p&gt;
  33. &lt;p&gt;
  34. As &lt;a href=&quot;;&gt;Delicious&lt;/a&gt; (and before them, &lt;a href=&quot;;&gt;Backflip&lt;/a&gt; RIP and good riddance) showed, bookmarks are significant social objects. Bookmarks are also a significant personal utility, much like an address book or calendar. I&apos;ve often considered building an Instapaper or &lt;em&gt;Read It Later&lt;/em&gt; type of app, I can&apos;t count the number of times I&apos;ve found something I&apos;ve wanted to read but didn&apos;t have time to read it that instance. Numerous efforts to build interesting things with bookmarks have risen and fallen ( or stalled (sigh... xmarks, simpy). I&apos;m convinced that the emergence of the mobile web and the native app ecosystems that play with them will create an abundance of new opportunities. But developers need to be enabled. Apple, please give us API&apos;s, not more silos!
  35. &lt;/p&gt;
  37. </description>          </item>
  38.    <item>
  39.    <guid isPermaLink="true"></guid>
  40.    <title>KUSF: A village on the airwaves burned down</title>
  41.    <dc:creator>spidaman</dc:creator>
  42.    <link></link>
  43.        <pubDate>Thu, 20 Jan 2011 10:27:58 -0800</pubDate>
  44.    <category>Music</category>
  45.            <description>&lt;p&gt;
  46. &lt;a href=&quot;; title=&quot;KUSF&quot;&gt;
  47. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;150&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;
  49. As some readers may know, I founded &lt;a href=&quot;;&gt;Rampage Radio&lt;/a&gt; with the guidance and support of  &lt;a href=&quot;;&gt;Howie Klein&lt;/a&gt; back in 1982. I only stuck around for a few years and thereafter left it in Ron Quintana&apos;s able hands. But those were years with impact, I look back at them fondly and the show has been running on the air ever since, the last broadcast was in it&apos;s usual time slot last Saturday night. As someone who grew up in San Francisco, I always felt that KUSF&apos;s presence at 90.3 was a comforting constant. Apparently a deal to sell off KUSF&apos;s frequency was consummated last week and &lt;a href=&quot;;&gt;the signal was abruptly shutoff Tuesday morning&lt;/a&gt;. A &lt;a href=&quot;;&gt;rally and a dialog took place last night&lt;/a&gt; at Presentation Theater with USF President Father Stephen Privett. I commend Father Privett for coming out to face the music, all 500 or so of us in the packed theater were upset by these events and I think it took a degree of courage to show up.  However, after the &lt;a href=&quot;;&gt;two hour question and answer sessions&lt;/a&gt;, it became clear to me that Father Privett has suffered a third degree failure.
  50. &lt;/p&gt;
  51. &lt;p&gt;
  52. First, the outcome was poor; the students who he claimed to be acting on behalf of will have reduced volunteer support, the revenue (purported to benefit students) wasn&apos;t subject to a competitive bid (it was the first and only deal under discussion); just an NDA-cloaked back-room agreement. Aside from poorly serving the students, his notion of the University as an island, that serving the broader community is detrimental to serving the students, is fundamentally flawed. Serving the community and accepting the efforts of volunteers benefits both the students &lt;em&gt;and&lt;/em&gt; the broader community.
  53. &lt;/p&gt;
  54. &lt;p&gt;
  55. Second, the process was terrible; instead of backing up and reaching out to the array of interested parties that a deal discussion might commence, he signed the non-disclosure agreement and completely shut out the faculty, students and community. Instead of embracing the stakeholders and providing some transparency, he went straight to the NDA and ambushed them.
  56. &lt;/p&gt;
  57. &lt;p&gt;
  58. And the third degree failure was the cowardly absence of recognition of the first two failures.
  59. &lt;/p&gt;
  60. &lt;p&gt;
  61. Father Privett claimed full responsibility, explained his rationale for what he did and the process he followed but his rationale for the process was weak. Before going under the cover of NDA, he should have reached out to the students, faculty and volunteers to say: before this goes away, give me some alternatives that will serve you better. Father Privett&apos;s gross incompetence was saddening, he should just resign. In the meantime, &lt;a href=&quot;;&gt;using another frequency&lt;/a&gt; as a fall back for a rejected FCC petition makes sense but there&apos;ll always be this sense of a vacated place in our hearts for 90.3 as San Francisco&apos;s cultural oasis.
  62. &lt;/p&gt;
  63. &lt;p&gt;
  64. I&apos;m certainly hoping that KUSF can reemerge from the ashes. Please join the effort on Facebook to &lt;a href=&quot;;&gt;Save KUSF&lt;/a&gt;!
  65. &lt;/p&gt;</description>          </item>
  66.    <item>
  67.    <guid isPermaLink="true"></guid>
  68.    <title>Managing Granular Access Controls for S3 Buckets with Boto</title>
  69.    <dc:creator>spidaman</dc:creator>
  70.    <link></link>
  71.        <pubDate>Sun, 16 Jan 2011 15:09:15 -0800</pubDate>
  72.    <category>Musings</category>
  73.            <description>&lt;p&gt;
  75. &lt;a href=&quot;; title=&quot;AWS&quot;&gt;
  76. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;164&quot; height=&quot;60&quot; /&gt;&lt;/a&gt;
  78. Storing backups is a long-standing &lt;a href=&quot;;&gt;S3&lt;/a&gt; use case but, until the release of &lt;a href=&quot;;&gt;IAM&lt;/a&gt; the only way to use S3 for backups was to use the same credentials you use for everything else (launching &lt;a href=&quot;;&gt;EC2&lt;/a&gt; instances, deploying artifacts from S3, etc). Now with IAM, we can create users  with individual credentials, create user groups, create access policies and assign policies to users and groups. Here&apos;s how we can use &lt;a href=&quot;;&gt;boto&lt;/a&gt; to create granular access controls for S3 backups.
  79. &lt;/p&gt;
  81. &lt;p&gt;
  82. So let&apos;s create a user and a group within our AWS account to handle backups. Start by pulling and installing the latest boto release from &lt;a href=&quot;;&gt;github&lt;/a&gt;. Let&apos;s say you have an S3 bucket called &quot;backup-bucket&quot; and you want to have a user whose rights within your AWS infrastructure is confined to putting, getting and deleting backup files from that bucket. This is what you need to do:
  83. &lt;ol&gt;
  84. &lt;li&gt;Create a connection to the AWS IAM service:
  85. &lt;pre&gt;
  86. import boto
  87. iam = boto.connect_iam()
  88. &lt;/pre&gt;
  89. &lt;/li&gt;
  90. &lt;li&gt;Create a user that will be responsible for the backup storage. When the credentials are created, the &lt;em&gt;access_key_id&lt;/em&gt; and &lt;em&gt;access_key_id&lt;/em&gt; components of the response will be necessary for the user to use them, save those values:
  91. &lt;pre&gt;
  92. backup_user = iam.create_user(&apos;backup_user&apos;)
  93. backup_credentials = iam.create_access_key(&apos;backup_user&apos;)
  94. print backup_credentials[&apos;create_access_key_response&apos;][&apos;create_access_key_result&apos;][&apos;access_key&apos;][&apos;access_key_id&apos;]
  95. print backup_credentials[&apos;create_access_key_response&apos;][&apos;create_access_key_result&apos;][&apos;access_key&apos;][&apos;secret_access_key&apos;]
  96. &lt;/pre&gt;
  97. &lt;/li&gt;
  98. &lt;li&gt;Create a group that will be assigned permissions and put the user in that group:
  99. &lt;pre&gt;
  100. iam.create_group(&apos;backup_group&apos;)
  101. iam.add_user_to_group(&apos;backup_group&apos;, &apos;backup_user&apos;)
  102. &lt;/pre&gt;
  103. &lt;/li&gt;
  104. &lt;li&gt;Define a backup policy and assign it to the group:
  105. &lt;pre&gt;
  106. backup_policy_json=&quot;&quot;&quot;{
  107.  &quot;Statement&quot;:[{
  108.      &quot;Action&quot;:[&quot;s3:DeleteObject&quot;,
  109.        &quot;s3:GetObject&quot;,
  110.        &quot;s3:PutObject&quot;
  111.      ],
  112.      &quot;Effect&quot;:&quot;Allow&quot;,
  113.      &quot;Resource&quot;:&quot;arn:aws:s3:::backup-bucket/*&quot;
  114.    }
  115.  ]
  116. }&quot;&quot;&quot;
  117. created_backup_policy_resp = iam.put_group_policy(&apos;backup_group&apos;, &apos;S3BackupPolicy&apos;, backup_policy_json)
  118. &lt;/pre&gt;
  119. &lt;/li&gt;
  120. &lt;/ol&gt;
  121. Permissions can be applied to individual users but my preference is to put users in a permitted group.
  122. &lt;/p&gt;
  124. &lt;p&gt;
  125. &lt;em&gt;Note: the &lt;code&gt;AWS_ACCESS_KEY_ID&lt;/code&gt; and &lt;code&gt;AWS_SECRET_ACCESS_KEY&lt;/code&gt; environment variables need to be set or they need to be provided as arguments to the boto.connect_iam() call (which wraps the boto.iam.IAMConnection ctor)&lt;/em&gt;.
  126. &lt;/p&gt;
  127. &lt;p&gt;
  128. Altogether Now:
  129. &lt;pre&gt;
  130. import boto
  131. iam = boto.connect_iam()
  132. backup_user = iam.create_user(&apos;backup_user&apos;)
  133. backup_credentials = iam.create_access_key(&apos;backup_user&apos;)
  134. print backup_credentials[&apos;create_access_key_response&apos;][&apos;create_access_key_result&apos;][&apos;access_key&apos;][&apos;access_key_id&apos;]
  135. print backup_credentials[&apos;create_access_key_response&apos;][&apos;create_access_key_result&apos;][&apos;access_key&apos;][&apos;secret_access_key&apos;]
  136. iam.create_group(&apos;backup_group&apos;)
  137. iam.add_user_to_group(&apos;backup_group&apos;, &apos;backup_user&apos;)
  138. backup_policy_json=&quot;&quot;&quot;{
  139.  &quot;Statement&quot;:[{
  140.      &quot;Action&quot;:[&quot;s3:DeleteObject&quot;,
  141.        &quot;s3:GetObject&quot;,
  142.        &quot;s3:PutObject&quot;
  143.      ],
  144.      &quot;Effect&quot;:&quot;Allow&quot;,
  145.      &quot;Resource&quot;:&quot;arn:aws:s3:::backup-bucket/*&quot;
  146.    }
  147.  ]
  148. }&quot;&quot;&quot;
  149. created_backup_policy_resp = iam.put_group_policy(&apos;backup_group&apos;, &apos;S3BackupPolicy&apos;, backup_policy_json)
  150. &lt;/pre&gt;
  151. &lt;/p&gt;
  153. &lt;p&gt;
  154. While the command line tools for IAM are OK (Eric Hammond wrote a good post about them in &lt;a href=&quot;;&gt;Improving Security on EC2 With AWS Identity and Access Management (IAM)&lt;/a&gt;), I really prefer interacting with AWS programmatically over remembering all of the command line options for the tools that AWS distributes. I thought using boto and IAM was blog-worthy because I had a hard time discerning the correct policy JSON from the AWS docs. There&apos;s a &lt;a href=&quot;;&gt;vocabulary&lt;/a&gt; for the &quot;Action&quot; component and a &lt;a href=&quot;;&gt;format&lt;/a&gt; for the &quot;Resource&quot; component that wasn&apos;t readily apparent but after some digging around and trying some things, I arrived at the above policy incantation. Aside from my production server uses, I think IAM will make using 3rd party services that require AWS credentials to do desktop backups much more attractive; creating multiple AWS accounts and setting up cross-account permissions is a pain but handing over keys for all of your AWS resources to a third party is just untenable.
  155. &lt;/p&gt;
  156. &lt;p&gt;
  157. In the meantime, if you&apos;re using your master credentials for everything on AWS, stop. Adopt IAM instead! To read more about boto and IAM, check out
  158. &lt;ul&gt;
  159. &lt;li&gt;&lt;a href=&quot;;&gt;IAM documentation&lt;/a&gt;&lt;/li&gt;
  160. &lt;li&gt;&lt;a href=&quot;;&gt;boto.iam. IAMConnection &lt;/a&gt;&lt;/li&gt;
  161. &lt;li&gt;&lt;a href=&quot;;&gt;Using Identity &amp; Access Management (IAM) Service in boto&lt;/a&gt;&lt;/li&gt;
  162. &lt;/ul&gt;
  163. &lt;/p&gt;
  165. </description>          </item>
  166.    <item>
  167.    <guid isPermaLink="true"></guid>
  168.    <title>Scala Regular Expressions</title>
  169.    <dc:creator>spidaman</dc:creator>
  170.    <link></link>
  171.        <pubDate>Sun, 29 Aug 2010 18:40:32 -0700</pubDate>
  172.    <category>Musings</category>
  173.            <description>&lt;p&gt;
  174. &lt;a href=&quot;; title=&quot;Scala&quot;&gt;
  175. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;323&quot; height=&quot;46&quot; /&gt;&lt;/a&gt;
  176. I&apos;ve been using &lt;a href=&quot;;&gt;Scala&lt;/a&gt; for the past several weeks, so far it&apos;s been a win. My use of Scala to date has been as a &quot;better Java.&quot; I&apos;m peeling the onion layers of functional programming and Scala&apos;s APIs, gradually improving the code with richer Scala constructs. But in the meantime, I&apos;m mostly employing plain old imperative programming. At this point, I think that&apos;s the best way to learn it. Trying to dive into the functional programming deep end can be a bit of a struggle. If you don&apos;t know Java, that may not mean much but for myself, I&apos;d used Java extensively in years past and the project that I&apos;m working on has a legacy code base in Java already. One of the Java annoyances that has plagued my work with in the past was the amount code required to work with regular expressions. I go back a long way with regular expressions, Perl (a good friend, long ago) supports it natively and the code I&apos;ve written in recent years, mostly Python and Ruby, benefitted from the regular expression support in those languages.
  177. &lt;/p&gt;
  178. &lt;p&gt;
  179. By annoyance, let&apos;s take an example that&apos;s simple in Perl since regexps are most succint in the language of the camel (and historically the state of Perl is given in a &lt;a href=&quot;;&gt;State of the Onion&lt;/a&gt; speech):
  180. &lt;pre&gt;
  181. #!/usr/bin/env perl
  182. #
  183. $input = &quot;camelCaseShouldBeUnderBar&quot;;
  184. $input=~ s/([a-z])([A-Z])/$1 . &quot;_&quot; . lc($2)/ge;
  185. print &quot;$input\n&quot;;
  186. # outputs: camel_case_should_be_under_bar
  187. # now go the other way
  188. $input = &quot;under_bar_should_be_camel_case&quot;;
  189. $input=~ s/([a-z])_([a-z])/$1 . uc($2)/ge;
  190. print &quot;$input\n&quot;;
  191. # outputs underBarShouldCamelCase
  192. &lt;/pre&gt;
  193. Wanna do the same thing in Java? Well, for simple stuff Java&apos;s &lt;a href=&quot;;&gt;Matcher &lt;/a&gt; has a &lt;em&gt;replaceAll&lt;/em&gt; method that is, well, dumb as a door knob. If you want the replacement to be based on characters captured from the input and processed in some way, you&apos;d pretty much have to do something like this:
  194. &lt;pre&gt;
  195. import java.util.regex.Pattern;
  196. import java.util.regex.Matcher;
  198. public class Re {
  200.    Pattern underBarPattern;
  201.    Pattern camelCasePattern;
  203.    public Re() {
  204.      underBarPattern = Pattern.compile(&quot;([a-z])_([a-z])&quot;);
  205.      camelCasePattern = Pattern.compile(&quot;([a-z])([A-Z])&quot;);
  206.    }
  209.    public String camel(String input) {
  210.        StringBuffer result = new StringBuffer();
  211.        Matcher m = underBarPattern.matcher(input);
  212.        while (m.find()) {
  213.            m.appendReplacement(result, +;
  214.        }
  215.        m.appendTail(result);
  216.        return result.toString();        
  217.    }
  219.    public String underBar(String input) {
  220.        StringBuffer result = new StringBuffer();
  221.        Matcher m = camelCasePattern.matcher(input);
  222.        while (m.find()) {
  223.            m.appendReplacement(result, + &quot;_&quot; +;
  224.        }
  225.        m.appendTail(result);
  226.        return result.toString();        
  227.    }
  229.    public static void main(String[] args) throws Exception {
  230.        Re re = new Re();
  231.        System.out.println(&quot;camelCaseShouldBeUnderBar =&gt; &quot; + re.underBar(&quot;camelCaseShouldBeUnderBar&quot;));
  232.        System.out.println(&quot;under_bar_should_be_camel_case =&gt; &quot; + re.camel(&quot;under_bar_should_be_camel_case&quot;));
  234.    }
  235. }
  236. &lt;/pre&gt;
  237. OK, that&apos;s way too much code. The reason why this is such a PITA in Java is that the replacement part can&apos;t be an anonymous function, or a function at all, due to the fact that... Java doesn&apos;t have them. Perhaps that&apos;ll change in Java 7. But it&apos;s not here today.
  238. &lt;/p&gt;
  239. &lt;p&gt;
  240. &lt;a href=&quot;;&gt;Anonymous functions&lt;/a&gt; (in the camel-speak of olde, we might&apos;ve said &quot;coderef&quot;) is one area where Scala is just plain better than Java. &lt;a href=&quot;;&gt;scala.util.matching.Regex&lt;/a&gt; has a replaceAllIn method that takes one as it&apos;s second argument. Furthermore, you can &lt;em&gt;name&lt;/em&gt; the captured matches in the constructor. The anonymous function passed in can do stuff with the Match object passed in. So here&apos;s my Scala equivalent:
  241. &lt;pre&gt;
  242. import scala.util.matching.Regex
  243. val re = new Regex(&quot;([a-z])([A-Z])&quot;, &quot;lc&quot;, &quot;uc&quot;)
  244. var output = re.replaceAllIn(&quot;camelCaseShouldBeUnderBar&quot;, m =&gt;
  245.;lc&quot;) + &quot;_&quot; +;uc&quot;).toLowerCase)
  246. println(output)
  248. val re = new Regex(&quot;([a-z])_([a-z])&quot;, &quot;first&quot;, &quot;second&quot;)
  249. output = re.replaceAllIn(&quot;under_bar_should_be_camel_case&quot;, m =&gt;
  250.;first&quot;) +;second&quot;).toUpperCase)
  251. println(output)
  252. &lt;/pre&gt;
  253. In both cases, we associate names to the capture groups in the Regex constructor. When the input matches, the resulting Match object makes the match data available to work on. In the first case
  254. &lt;pre&gt;
  255.;lc&quot;) + &quot;_&quot; +;uc&quot;).toLowerCase
  256. &lt;/pre&gt;
  257. and in the second
  258. &lt;pre&gt;
  259.;first&quot;) +;second&quot;).toUpperCase)
  260. &lt;/pre&gt;
  261. That&apos;s fairly succinct and certainly &lt;em&gt;so&lt;/em&gt; much better than Java. By the way, if regular expressions are a mystery to you, get the &lt;a href=&quot;;&gt;Mastering Regular Expressions&lt;/a&gt; book. In the meantime, keep peeling the onion.
  262. &lt;/p&gt;
  263. &lt;p&gt;
  264. &lt;div class=&quot;tags&quot;&gt;
  265. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;scala&lt;/a&gt; &amp;nbsp;
  266. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;regular expressions&lt;/a&gt; &amp;nbsp;
  267. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;perl&lt;/a&gt; &amp;nbsp;
  268. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;java&lt;/a&gt; &amp;nbsp;
  269. &lt;/div&gt;
  270. &lt;/p&gt;</description>          </item>
  271.    <item>
  272.    <guid isPermaLink="true"></guid>
  273.    <title>Getting Started with a Scala 2.8 Toolchain</title>
  274.    <dc:creator>spidaman</dc:creator>
  275.    <link></link>
  276.        <pubDate>Sat, 24 Jul 2010 11:51:30 -0700</pubDate>
  277.    <category>Musings</category>
  278.            <description>&lt;p&gt;
  279. &lt;a href=&quot;; title=&quot;Scala&quot;&gt;
  280. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;323&quot; height=&quot;46&quot; /&gt;&lt;/a&gt;
  282. With the release of version 2.8 and enthusiasm amongst my current project&apos;s collaborators, I&apos;ve fired up my latent interest in scala. There&apos;s a lot to like about scala: function &lt;em&gt;and&lt;/em&gt; object orientation, message based concurrency and JVM garbage collection, JITing, etc; it&apos;s a really interesting language. The initial creature comforts I&apos;ve been looking for are a development, build and test environment I can be productive in. At present, it looks like the best tools for me to get rolling are &lt;a href=&quot;;&gt;IntelliJ&lt;/a&gt;, &lt;a href=&quot;;&gt;sbt&lt;/a&gt; and &lt;a href=&quot;;&gt;ScalaTest&lt;/a&gt;. In this post, I&apos;ll recount the setup I&apos;ve arrived at on a MacBook Pro (Snow Leopard), so far so good.
  283. &lt;/p&gt;
  284. &lt;p&gt;
  285. &lt;strong&gt;Development&lt;/strong&gt;:
  286. &lt;/p&gt;
  287. &lt;p&gt;
  288. I&apos;ve used &lt;a href=&quot;;&gt;Eclipse&lt;/a&gt; for years and there&apos;s a lot I like about it but I&apos;ve also had stability problems, particularly as plugins are added/removed from the installation (stay away from the Aptana ruby plugin, every attempt to use it results in an unstable Eclipse for me). So I got a new version of IntelliJ (&quot;Community Edition&quot;); the Scala plugin for v2.8 doesn&apos;t work with the IntelliJ v9.0.2 release so the next task was to grab and install a pre-release of v9.0.3 (see &lt;a href=&quot;;&gt;ideaIC-95.413.dmg&lt;/a&gt;). I downloaded recent build of the scala plugin (see &lt;a href=&quot;;&gt;;/a&gt;) and unzipped it in IntelliJ&apos;s plugins directory (in my case, &quot;/Applications/IntelliJ IDEA 9.0.3;). I launched IntelliJ, Scala v2.8 support was enabled.
  289. &lt;/p&gt;
  290. &lt;p&gt;
  291. &lt;strong&gt;Build&lt;/strong&gt;:
  292. &lt;/p&gt;
  293. &lt;p&gt;
  294. I&apos;ve had love/hate relationships in the past with &lt;a href=&quot;;&gt;ant&lt;/a&gt; and &lt;a href=&quot;;&gt;maven&lt;/a&gt;; there&apos;s a lot to love for flexibility with the former and consistency with the latter (hat tip at &quot;convention over configuration&quot;). There&apos;s a lot to hate with the tedious XML maintenance that comes with both. So this go around, I&apos;m kicking the tires on &lt;a href=&quot;;&gt;simple build tool&lt;/a&gt;. One of the really nice bits about sbt is that it has a shell you can run build commands in; instead of waiting for the (slow) JVM launch time everytime you build/test you can incur the launch penalty once to launch the shell and re-run those tasks from within the sbt shell. Once sbt is &lt;a href=&quot;;&gt;setup&lt;/a&gt;, a project can be started from the console like this:
  296.  $ &lt;code&gt;sbt update&lt;/code&gt;&lt;br/&gt;
  297. You&apos;ll go into a dialog like this:
  298. &lt;pre&gt;
  299. Project does not exist, create new project? (y/N/s) y
  300. Name: scratch
  301. Organization: ohai
  302. Version [1.0]: 0.1
  303. Scala version [2.7.7]: 2.8.0
  304. sbt version [0.7.4]:
  305. &lt;/pre&gt;
  307. Now I want sbt to not only bootstrap the build system but also bootstrap the IntelliJ project. There&apos;s an &lt;a href=&quot;;&gt;sbt plugin&lt;/a&gt; for that. Ironically, bringing up the develop project requires creating folder structures and code artifacts... which is what your development environment should be helping you with. While we&apos;re in there, we&apos;ll declare our dependency on the test framework we want (why ScalaTest isn&apos;t in the scala stdlib is mysterious to me; c&apos;mon scala, it&apos;s 2010, python and ruby have both shipped with test support for years). So, fallback to console commands and vi (I don&apos;t do emacs) or lean on Textmate. &lt;br/&gt;
  309.  $ &lt;code&gt;mkdir project/build&lt;/code&gt;&lt;br/&gt;
  310.  $ &lt;code&gt;vi project/build/Project.scala&lt;/code&gt;&lt;br/&gt;
  311. &lt;pre&gt;
  312. import sbt._
  313. class Project(info: ProjectInfo) extends DefaultProject(info) with IdeaProject {
  314.    // v1.2 is the current version compatible with scala 2.8
  315.    // see
  316.    val scalatest = &quot;org.scalatest&quot; % &quot;scalatest&quot; % &quot;1.2&quot; % &quot;test-&gt;default&quot;
  317. }
  318. &lt;/pre&gt;
  319.  $ &lt;code&gt;mkdir -p project/plugins/src&lt;/code&gt;&lt;br/&gt;
  320.  $ &lt;code&gt;vi project/plugins/src/Plugins.scala&lt;/code&gt;&lt;br/&gt;
  321. &lt;pre&gt;
  322. import sbt._
  323. class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
  324.  val repo = &quot;GH-pages repo&quot; at &quot;;
  325.  val idea = &quot;com.github.mpeltonen&quot; % &quot;sbt-idea-plugin&quot; % &quot;0.1-SNAPSHOT&quot;
  326. }
  327. &lt;/pre&gt;
  328.  $ &lt;code&gt;sbt update&lt;/code&gt;&lt;br/&gt;
  329.  $ &lt;code&gt;sbt idea&lt;/code&gt;&lt;br/&gt;
  331. Back in IntelliJ, do &quot;File&quot; &amp;gt; &quot;New Module&quot; &amp;gt; select &quot;Import existing module&quot; and specify the path to the &quot;scratch.iml&quot; file that that last console command produced.
  332. &lt;/p&gt;
  333. &lt;p&gt;
  334. Note how we declared our dependency on the test library and the repository to get it from with &lt;em&gt;two lines&lt;/em&gt; of code, not the several lines of XML that would be used for each in maven.
  335. &lt;/p&gt;
  336. &lt;p&gt;
  337. &lt;strong&gt;Test&lt;/strong&gt;:
  338. &lt;/p&gt;
  339. &lt;p&gt;
  340. Back in IntelliJ, right click on src/main/scala and select &quot;New&quot; &amp;gt; &quot;Package&quot;
  341. and specify &quot;ohai.scratch&quot;. Right click on that package and select &quot;New&quot; &amp;gt; &quot;Scala Class&quot;, we&apos;ll create a class ohai.scratch.Bicycle - in the editor put something like
  342. &lt;pre&gt;
  343. package ohai.scratch
  344. class Bicycle {
  345.  var turns = 0
  346.  def pedal { turns +=1 }
  347. }
  348. &lt;/pre&gt;
  349. Now to test our bicycle, do similar package and class creation steps in the src/test/scala folder to create ohai.scratch.test.BicycleTest:
  350. &lt;pre&gt;
  351. package ohai.scratch.test
  352. import org.scalatest.Spec
  353. import ohai.scratch.Bicycle
  354. class BicycleSpec extends Spec {
  355.  describe(&quot;A bicycle, prior to any pedaling -&quot;) {
  356.    val bike = new Bicycle()
  358.    it(&quot;pedal should not have turned&quot;) {
  359.      expect(0) { bike.turns }
  360.    }
  361.  }
  363.  describe(&quot;A bicycle&quot;) {
  364.    val bike = new Bicycle()
  366.    bike.pedal
  368.    it(&quot;after pedaling once, it should have one turn&quot;) {
  369.      expect(1) { bike.turns }
  370.    }
  371.  }
  372. }
  373. &lt;/pre&gt;
  375. Back at your console, go into the sbt shell by typing &quot;sbt&quot; again. In the sbt shell, type &quot;test&quot;. In the editor, make your bicycle do more things, write tests for those things (or reverse the order, TDD style) and type &quot;test&quot; again in the sbt shell. Lather, rinse, repeat, have fun.
  376. &lt;/p&gt;
  377. &lt;p&gt;
  378. &lt;div class=&quot;tags&quot;&gt;
  379. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;programming&lt;/a&gt; &amp;nbsp;
  380. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;scala&lt;/a&gt; &amp;nbsp;
  381. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;intellij&lt;/a&gt; &amp;nbsp;
  382. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;sbt&lt;/a&gt; &amp;nbsp;
  383. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;scalatest&lt;/a&gt; &amp;nbsp;
  384. &lt;/div&gt;
  385. &lt;/p&gt;</description>          </item>
  386.    <item>
  387.    <guid isPermaLink="true"></guid>
  388.    <title>Programmatic Elastic MapReduce with boto</title>
  389.    <dc:creator>spidaman</dc:creator>
  390.    <link></link>
  391.        <pubDate>Fri, 19 Mar 2010 11:48:51 -0700</pubDate>
  392.    <category>LAMP</category>
  393.            <description>&lt;p&gt;
  394. &lt;a href=&quot;; title=&quot;Elastic MapReduce&quot;&gt;
  395. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;284&quot; height=&quot;173&quot; /&gt;&lt;/a&gt;
  396. I&apos;m working on some cloud-homed data analysis infrastructure. I may focus in the future on using the &lt;a href=&quot;;&gt;Cloudera distribution&lt;/a&gt; on &lt;a href=&quot;;&gt;EC2&lt;/a&gt; but for now, I&apos;ve been experimenting with &lt;a href=&quot;;&gt;Elastic MapReduce&lt;/a&gt; (EMR). I think the main advantages of using EMR are:
  397. &lt;ul&gt;
  398. &lt;li&gt;Configuring the namenode, tasktracker and jobtracker is tedious, EMR relieves you of those duties&lt;/li&gt;
  399. &lt;li&gt;Instance pool setup/teardown is tightly integrated&lt;/li&gt;
  400. &lt;li&gt;Automated pool member replacement if an instance goes down&lt;/li&gt;
  401. &lt;li&gt;Built in verbs like the &quot;aggregate&quot; reducer&lt;/li&gt;
  402. &lt;li&gt;Programmatic and GUI operation&lt;/li&gt;
  403. &lt;/ul&gt;
  404. On the downside, Amazon is using an old version of Hadoop (0.18.3, not 0.20.x such as Cloudera&apos;s package) but I think until I&apos;ve got clusters running 24/7 and can justify the administrative tool investment, using EMR is just fine.
  405. &lt;/p&gt;
  406. &lt;p&gt;
  407. While there&apos;s a slick &lt;a href=&quot;;categoryID=262&quot;&gt;EMR client tool implemented in ruby&lt;/a&gt;, I&apos;ve got a workflow of data coming in/out of &lt;a href=&quot;;&gt;S3&lt;/a&gt;, I&apos;m otherwise working in &lt;a href=&quot;;&gt;Python&lt;/a&gt; (using an old friend &lt;a href=&quot;;&gt;boto&lt;/a&gt;) and so I&apos;d prefer to keep my toolchain in that orbit. The last release of boto (v1.9b) doesn&apos;t support EMR but lo-and-behold it&apos;s in HEAD in the source tree. So if you check it out the Google Code svn repo as well as set your AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables, you can programmatically run the &lt;a href=&quot;;&gt;EMR wordcount sample&lt;/a&gt; like this:
  408. &lt;pre&gt;
  409. from time import sleep
  410. from datetime import datetime
  411. from boto.emr.step import StreamingStep
  412. from boto.emr.connection import EmrConnection
  414. job_ts =;%Y%m%d%H%M%S&quot;)
  415. emr = EmrConnection()
  416. wc_step = StreamingStep(&apos;wc text&apos;, \
  417.  &apos;s3://elasticmapreduce/samples/wordcount/;, \
  418.  &apos;aggregate&apos;, input=&apos;s3://elasticmapreduce/samples/wordcount/input&apos;, \
  419.  output=&apos;s3://wc-test-bucket/output/%s&apos; % job_ts)
  420. jf_id = emr.run_jobflow(&apos;wc jobflow&apos;, &apos;s3n://emr-debug/%s&apos; % job_ts, \
  421.  steps=[wc_step])
  423. while True:
  424.  jf = emr.describe_jobflow(jf_id)
  425.  print &quot;[%s] %s&quot; % (;%Y-%m-%d %T&quot;), jf.state)
  426.  if jf.state == &apos;COMPLETED&apos;:
  427.    break
  428.  sleep(10)
  429. &lt;/pre&gt;
  430. Have fun hadooping!
  431. &lt;/p&gt;
  432. &lt;p&gt;&lt;em&gt;
  433. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;hadoop&lt;/a&gt; &amp;nbsp;
  434. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;boto&lt;/a&gt; &amp;nbsp;
  435. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;python&lt;/a&gt; &amp;nbsp;
  436. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;aws&lt;/a&gt; &amp;nbsp;
  437. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;elasticmapreduce&lt;/a&gt; &amp;nbsp;
  438. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;s3&lt;/a&gt; &amp;nbsp;
  439. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ec2&lt;/a&gt; &amp;nbsp;
  441. &lt;/em&gt;&lt;/p&gt;
  443. </description>          </item>
  444.    <item>
  445.    <guid isPermaLink="true"></guid>
  446.    <title>2010: An Odyssey Continues</title>
  447.    <dc:creator>spidaman</dc:creator>
  448.    <link></link>
  449.        <pubDate>Sat, 23 Jan 2010 22:02:26 -0800</pubDate>
  450.    <category>Music</category>
  451.            <description>&lt;p&gt;
  452. &lt;a href=&quot;; title=&quot;Odyssey of the Mind&quot;&gt;
  453. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;225&quot; height=&quot;198&quot; /&gt;&lt;/a&gt;
  454. Hello, 2010. 2009 was a strange year, indeed. I quit my job after &lt;a href=&quot;;&gt;5 years&lt;/a&gt; last spring, since then I&apos;ve been working as a software/infrastructure consultant and playing with a lot of new technologies (of course also leveraging expertise I have with some more established ones). I&apos;ve also done a lot of thinking. Thinking about &lt;a href=&quot;;&gt;cloud computing and compute marketplaces&lt;/a&gt;, about energy, mobile and transportation technologies, about life and the meaning of the whole thing. Consulting has had its ups and downs. Looking back at 2009 though, I can safely say I&apos;m glad it&apos;s over. Not that it&apos;s all bad news, I have my share of things to be pleased about too. My daughter&apos;s Bat Mitzvah was beautiful. I&apos;ve been spending more time with the kids, switched to decaf (I really enjoy the taste of coffee but excess caffeine isn&apos;t healthy) and was invited by my old friends in &lt;a href=&quot;;&gt;Metallica&lt;/a&gt; to some of their seminal events.
  455. &lt;/p&gt;
  456. &lt;p&gt;
  457. Nonetheless, 2010 will no doubt be an upgrade over 2009.
  458. &lt;p&gt;
  459. One of the things I&apos;m spending more domestic time around is &lt;a href=&quot;;&gt;Odyssey of the Mind&lt;/a&gt;, a creative problem solving competition that my son is participating in. My daughter did it previously and went to the world finals with her team twice, my son went last year, and (warning: proud papa bragging alert) placed 4th! This year the coaching torch is passed to me and I&apos;m working with the team facilitating their solution for the long term problem which will be presented at the regional competition next month. We&apos;re hoping for a set of repeat victories that will send us to the world finals again this year. I&apos;m new to coaching OotM but my co-coach has coached before and I&apos;ve helped the teams in supporting roles in years past, so the Odyssey regime is not completely new to us.
  460. &lt;/p&gt;
  461. &lt;p&gt;
  462. This week will present some interesting challenges. My co-coach is physician and will be flying into Haiti to join the relief effort; I&apos;m really happy for her to have this opportunity to be of service. I&apos;ll do my best to keep the OotM team moving forward until she returns.
  463. &lt;/p&gt;
  464. &lt;p&gt;
  465. Work will pick up too. Consulting has given me an opportunity to learn Ruby, Rails and a lot of stuff in that technology orbit. I&apos;ve also been putting &lt;a href=&quot;;&gt;Amazon Web Services&lt;/a&gt; to heavy use and playing around with Twitter&apos;s APIs. I&apos;ve been looking for opportunities to scratch some Hadoop itches and lately my interests have turned towards programming in &lt;a href=&quot;;&gt;Scala&lt;/a&gt;, I expect some consulting gigs to shake loose to sate those interests. If the opportunity is right, my entrepreneurial impulses will get  the best of me and I&apos;ll stop (or scale back) consulting to jump a on new start-up. My desire to set the world on fire will never be satisfied.
  466. &lt;/p&gt;
  467. &lt;p&gt;
  468. Yea, 2010 is gonna be good. Check it out, the &lt;a href=&quot;;&gt;Giants&lt;/a&gt; have made some changes that look like a credible offense. Already, it&apos;s gotta be better than 2009.
  469. &lt;/p&gt;
  470. </description>          </item>
  471.    <item>
  472.    <guid isPermaLink="true"></guid>
  473.    <title>Scaling Rails with MySQL table partitioning</title>
  474.    <dc:creator>spidaman</dc:creator>
  475.    <link></link>
  476.        <pubDate>Thu, 3 Dec 2009 00:08:37 -0800</pubDate>
  477.    <category>LAMP</category>
  478.            <description>&lt;p&gt;
  479. &lt;a href=&quot;; title=&quot;MySQL&quot;&gt;
  480. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;68&quot; /&gt;&lt;/a&gt;
  481. Often the first step in scaling MySQL back-ended web applications is integrating a caching layer to reduce the frequency of expensive database queries. Another common pattern is to denormalize the data and index to optimize read response times. Denormalized data sets solve the problem to a point, when the indexes exceed reasonable RAM capacities (which is easy to do with high data volumes) these solutions degrade. A general pattern for real time web applications is the emphasis on &lt;em&gt;recent&lt;/em&gt; data, so keeping the hot recent data separate from the colder, larger data set is fairly common. However, purging denormalized data records that have aged beyond usefulness can be expensive. Databases will typically lock records up, slow or block queries and fragment the on-disk data images. To make matters worse, MySQL will block queries while the data is de-fragmented.
  482. &lt;/p&gt;
  483. &lt;p&gt;
  484. MySQL 5.1 introduced table partitioning as a technique to cleanly prune data sets. Instead of purging old data and the service interruptions that a DELETE operation entails, you can break up the data into partitions and drop the old partitions as their usefulness expires. Furthermore, your query response times can benefit from knowing about how the partitions are organized; by qualifying your queries correctly you can limit which partitions get accessed.
  485. &lt;/p&gt;
  486. &lt;p&gt;
  487. But MySQL&apos;s partition has some limitations that may be of concern:
  488. &lt;ul&gt;
  489. &lt;li&gt;The partitioning criteria must be an integer value. It&apos;s easy to express &lt;a href=&quot;;&gt;date information as integer values for the purposes of partitioning&lt;/a&gt; and in fact you can (albeit intrusively) &lt;a href=&quot;;&gt;partition with non integer values using triggers&lt;/a&gt;. But the underlying partitioning that MySQL implemented mandates integer criteria.&lt;/li&gt;
  490. &lt;li&gt;All columns used in the partitioning expression for a partitioned table must be part of every unique key that the table may have. This will impact your design as to your use of &lt;a href=&quot;;&gt;primary keys and unique keys&lt;/a&gt;.&lt;/li&gt;
  491. &lt;/ul&gt;
  492. So you want to have an auto_increment primary key but partition on the date? Too bad. MySQL&apos;s doc on the matter closes woefully, &quot;We are working to remove this limitation in a future MySQL release series.&quot; I don&apos;t think PostgreSQL&apos;s table partitioning has this limitation but I haven&apos;t verified that.
  493. &lt;/p&gt;
  494. &lt;p&gt;
  495. When we first looked at MySQL&apos;s table partitioning, this seemed like a deal breaker. The platform we&apos;ve been working with was already on MySQL 5.1 but it was also a &lt;a href=&quot;;&gt;rails&lt;/a&gt; app. Rails has its own ORM semantics that uses integer primary keys. What we wanted were partitions like this: &lt;br /&gt;
  496. &lt;img src=&quot;; border=&quot;0&quot; /&gt;&lt;br /&gt;
  497. Here, data is segmented into daily buckets and as time advances, fresh buckets are created while old ones are discarded. Yes, with some social web applications, a week is the boundary of usefulness that&apos;s why there are only 8 buckets in this illustration. New data would be written to the &quot;Now&quot; partition, yesterday&apos;s data would be in yesterday&apos;s bucket and last Monday&apos;s data would be in the &quot;Monday&quot; bucket. I initially thought that the constraints on MySQL&apos;s partitioning criteria might get in the way; I really wanted the data partitioned by time but needed to partition by the primary keys (sequential integers) that rails used like this: &lt;br /&gt;
  498. &lt;img src=&quot;; border=&quot;0&quot; /&gt;&lt;br /&gt;
  499. In this case, data is segmented by a ceiling on the values allowed in each bucket. The data with ID values less than 100 go in the first bucket, less than 200 in the second and so on.
  500. &lt;/p&gt;
  501. &lt;p&gt;
  502. Consider an example, suppose you had a table like this:
  503. &lt;pre&gt;
  504. CREATE TABLE tweets (
  505.  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  506.  status_id bigint(20) unsigned NOT NULL,
  507.  user_id int(11) NOT NULL,
  508.  status varchar(140) NOT NULL,
  509.  source varchar(24) NOT NULL,
  510.  in_reply_to_status_id bigint(20) unsigned DEFAULT NULL,
  511.  in_reply_to_user_id int(11) DEFAULT NULL,
  512.  created_at datetime NOT NULL,
  513.  PRIMARY KEY (id),
  514.  KEY created_at (created_at),
  515.  KEY user_id (user_id)
  516. );
  517. &lt;/pre&gt;
  518. You might want to partition on the &quot;created_at&quot; time but that would require having the &quot;created_at&quot; field in the primary key, which doesn&apos;t make any sense. I worked around this by leveraging the common characteristic of rails&apos; &quot;created_at&quot; timestamp and integer primary key &quot;id&quot; fields: they&apos;re both monotonically ascending. What I needed was to map ID ranges to time frames. Suppose we know, per the illustration above, that we&apos;re only going to have 100 tweets a day (yes, an inconsequential data volume that wouldn&apos;t require partitioning, but for illustrative purposes), we&apos;d change my table like this:
  519. &lt;pre&gt;
  521.  PARTITION tweets_0 VALUES LESS THAN (100),
  522.  PARTITION tweets_1 VALUES LESS THAN (200),
  523.  PARTITION tweets_2 VALUES LESS THAN (300),
  524.  PARTITION tweets_3 VALUES LESS THAN (400),
  525.  PARTITION tweets_4 VALUES LESS THAN (500),
  526.  PARTITION tweets_5 VALUES LESS THAN (600),
  527.  PARTITION tweets_6 VALUES LESS THAN (700),
  529. );
  530. &lt;/pre&gt;
  531. When the day advances, it&apos;s time create a new partition and drop the old one, so we do this:
  532. &lt;pre&gt;
  533. ALTER TABLE tweets REORGANIZE PARTITION tweets_maxvalue into (
  534.  PARTITION tweets_7 VALUES LESS THAN (800),
  536. );
  537. ALTER TABLE tweets DROP PARTITION tweets_0;
  538. &lt;/pre&gt;
  539. Programmatically determining what the new partition name should be (tweets_7) requires introspecting on the table itself. Fortunately, MySQL has metadata about tables and partitions in its &quot;information_schema&quot; database. We can query it like this
  540. &lt;pre&gt;
  541. SELECT partition_ordinal_position AS seq, partition_name AS part_name, partition_description AS max_id
  542. FROM information_schema.partitions
  543. WHERE table_name=&apos;tweets&apos; and table_schema=&apos;twitterdb&apos; ORDER BY seq
  544. &lt;/pre&gt;
  545. &lt;/p&gt;
  546. &lt;p&gt;
  547. So that&apos;s the essence of the table partition life-cycle. One issue here is that when we reorganize the partition, it completely rewrites it; it doesn&apos;t atomically rename &quot;tweets_maxvalue&quot; to &quot;tweets_7&quot; and allocate a new empty &quot;tweets_maxvalue&quot; (that would be nice). If the partition is populated with data, the rewrite is resource consumptive; the more data, the more so. The availability of a table that has a moderate throughput of data (let&apos;s say 1 million records daily, not 100) would suffer, locking the table for a long duration waiting for the rewrite is unacceptable for time sensitive applications. Given that issue, what we really want is to anticipate the ranges and reorganize the MAXVALUE partition in advance. When we allocate the new partition, we set an upper boundary on the ID values for but we need to make a prediction as to what the upper boundary will be. Fortunately, we put an index on created_at so we can introspect on the data to determine the recent ID consumption rate like this:
  548. &lt;pre&gt;
  549. SELECT UNIX_TIMESTAMP(created_at),MAX(id) FROM tweets WHERE DATE(created_at)=DATE( now() - interval 1 day );
  550. SELECT UNIX_TIMESTAMP(created_at),MAX(id) FROM tweets WHERE DATE(created_at)=DATE( now() - interval 2 day );
  551. SELECT UNIX_TIMESTAMP(created_at),MAX(id) FROM tweets WHERE DATE(created_at)=DATE( now() - interval 3 day );
  552. SELECT UNIX_TIMESTAMP(created_at),MAX(id) FROM tweets WHERE DATE(created_at)=DATE( now() - interval 4 day );
  553. &lt;/pre&gt;
  554. The timestamps (epoch seconds) and ID deltas give us what we need to determine the ID consumption rate N; the new range to allocate is simply &lt;em&gt;max(id) + N&lt;/em&gt;.
  555. &lt;/p&gt;
  556. &lt;p&gt;
  557. OK, so where&apos;s the rails? All of this so far has been transparent to rails. To take advantage of the partition access optimization opportunities mentioned above, it&apos;s useful to have application level knowledge of the time frame to ID range mappings. Let&apos;s say we just want recent tweets from a user M and we know that the partition boundary from a day ago is N, we can say
  558. &lt;pre&gt;
  559. Tweet.find(:all, :conditions =&gt; [&quot;user_id = M AND id &gt; N&quot;])
  560. &lt;/pre&gt;
  561. This will perform better than the conventional (even if we created an index on user_id and created_at).
  562. &lt;pre&gt;
  563. Tweet.find(:all, :conditions =&gt; [&quot;user_id = M AND created_at &gt; now() - interval 1 day&quot;])
  564. &lt;/pre&gt;
  565. Scoping the query to a partition in this way isn&apos;t unique to rails (or even to MySQL, with Oracle we can explicitly name the partitions we want a query to hit in SQL). Putting an id range qualifier in the WHERE clause of our SQL statements will work with any application environment. I chose to focus on rails here because of the integer primary keys that rails requires and the challenge that poses. To really integrate this into your rails app, you might create a model that has the partition metadata.
  566. &lt;/p&gt;
  567. &lt;p&gt;
  568. I hope this is helpful to others who are solving real time data challenges with MySQL (with or without rails), I didn&apos;t turn up much about how folks manage table partitions when I searched for it. There&apos;s an interesting article about using the &lt;a href=&quot;;&gt;MySQL scheduler and stored procedures to manage partitions&lt;/a&gt; but I found the complexity of developing, testing and deploying code inside MySQL more of a burden than I wanted to carry, so I opted to do it all in ruby and integrate it with the rails app. If readers have any better techniques for managing MySQL table partitions, please post about it!
  569. &lt;/p&gt;
  570. &lt;p&gt;
  571. Table partitioning handles a particular type of data management problem but it won&apos;t answer all of our high volume write capacity challenges. Scaling write capacity requires distributing the writes across independent indexes, sharding is the common technique for that. I&apos;m currently investigating HBase, which transparently distributes writes to Hadoop data nodes, possibly in conjunction with an external index (solr or lucene), as an alternative to sharding MySQL. Hadoop is sufficiently scale free for very large workloads but real time data systems has not been its forte. Perhaps that will be a follow up post.
  572. &lt;/p&gt;
  573. &lt;p&gt;
  574. Further Reading:&lt;br /&gt;
  575. &lt;div style=&quot;width:425px;text-align:left&quot; id=&quot;__ss_1344181&quot;&gt;&lt;a style=&quot;font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;&quot; href=&quot;; title=&quot;MySQL partitions tutorial&quot;&gt;MySQL partitions tutorial&lt;/a&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;;stripped_title=mysql-partitions-tutorial&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;;stripped_title=mysql-partitions-tutorial&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style=&quot;font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;&quot;&gt;View more &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;;&gt;documents&lt;/a&gt; from &lt;a style=&quot;text-decoration:underline;&quot; href=&quot;;&gt;Giuseppe Maxia&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;
  576. &lt;ul&gt;
  577. &lt;li&gt;&lt;a href=&quot;;&gt;Management of RANGE and LIST  Partitions&lt;/a&gt;&lt;/li&gt;
  578. &lt;li&gt;&lt;a href=&quot;;&gt;Sharding and Time Base Partitioning&lt;/a&gt;&lt;/li&gt;
  579. &lt;/ul&gt;
  580. &lt;/p&gt;
  581. &lt;p&gt;&lt;em&gt;
  582. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;mysql&lt;/a&gt; &amp;nbsp;
  583. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;scalability&lt;/a&gt; &amp;nbsp;
  584. &lt;/em&gt;&lt;/p&gt;
  585. </description>          </item>
  586.    <item>
  587.    <guid isPermaLink="true"></guid>
  588.    <title>Hub-a-dub-bub, feed clouds in a tub</title>
  589.    <dc:creator>spidaman</dc:creator>
  590.    <link></link>
  591.        <pubDate>Thu, 10 Sep 2009 12:35:37 -0700</pubDate>
  592.    <category>Musings</category>
  593.            <description>&lt;p&gt;
  595. &lt;a href=&quot;/roller/spidaman/entry/hub_a_dub_bub_feed&quot; title=&quot;Pubsubhubbub and rssCloud&quot;&gt;
  596. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;171&quot; height=&quot;52&quot; /&gt;&lt;/a&gt;
  597. While at Technorati, I observed a distinct shift around summer of 2005 in the flow of pings from largely worthwhile pings to increasingly worthless ones. A ping is a simple message with a URL. Invented by Dave Winer, it was originally implemented with XML-RPC but RESTful variants also emerged. The intention of the message is &quot;this URL updated.&quot; For a blog, the URL is the main page of the blog; it&apos;s not the feed URL, a post URL (&quot;permalink&quot;) or any other resource on the site - it&apos;s just the main page. Immediately, that narrow scope has a problem; as a service that should &lt;em&gt;do something&lt;/em&gt; with the ping, the notification has no more information about &lt;em&gt;what&lt;/em&gt; changed on the site. A new post? Multiple new posts? Um, what are the new post URL(s)? Did the blogroll change? And so on. Content fetching and analysis is cheap; network latencies, parsing content and doing interesting stuff with it is easy at low volumes but is difficult to scale.
  598. &lt;/p&gt;
  599. &lt;p&gt;
  600. In essence, a ping is a cheap message to prompt an expensive analysis to detect change. It&apos;s an imbalanced market of costs and benefits. Furthermore, even if the ping had a richer payload of information, pings lack another very important component: authenticity. These cheap messages can be produced by anybody for any URL and the net result I observed was that lots of people produced pings for lots of things, most of which weren&apos;t representative of real blogs (other types of sites or just spam) or real changes on blogs, just worthless events that were resource intensive to operate on. When I left Technorati in March (2009), we were getting around 10 million pings a day, roughly 95% of them of no value. Pings are the SMTP of the blogosphere; weak identity systems, spammy and difficult to manage at scale.
  601. &lt;/p&gt;
  602. &lt;p&gt;
  603. Besides passively waiting for pings, the other method to find things that have changed is to poll sites. But &lt;a href=&quot;;&gt;polling is terribly inefficient&lt;/a&gt;. To address those inefficiencies, FriendFeed implemented &lt;a href=&quot;;&gt;Simple Update Protocol&lt;/a&gt;. SUP is reminiscent of another Dave Winer invention, &lt;a href=&quot;;&gt;changes.xml&lt;/a&gt; however SUP accounts for discovery and offers a more compact format.
  604. &lt;/p&gt;
  605. &lt;p&gt;
  606. But SUP wasn&apos;t the first effort to address the aforementioned deficiencies, 2005 saw a lot of activity around something called &quot;feedmesh.&quot; Unfortunately, the activity degenerated into a lot of babble; noise I attribute to unclear objectives and ego battles but I&apos;m sure others have their own interpretation. The feedmesh discussion petered out and little value beyond ping-o-matic and other ping relayers emerged from it. Shortly thereafter SixApart created their &lt;a href=&quot;;&gt;atom stream&lt;/a&gt;, I think spearheaded by Brad Fitzpatrick. The atom stream is essentially a long lived HTTP connection that streams atom elements to the client. The content flow was limited to SixApart&apos;s hosted publishing platforms (TypePad, LiveJournal and Vox) and the reliability wasn&apos;t that great, at least in the early days, but it was a big step in the right direction for the blog ecosystem. The atom stream was by far the most efficient way to propogate content from the publishing platform to interested parties such as Technorati operating search, aggregation and analytic systems. It eliminates the heavyweight chatter of cheap ping messages and the heavyweight process that follows: fetch page, discover feed, fetch feed, inspect contents and do stuff with it.
  607. &lt;/p&gt;
  608. &lt;p&gt;
  609. So here we are in 2009 and it feels like deja-vu all over again. This time Dave is promoting &lt;a href=&quot;;&gt;rssCloud&lt;/a&gt;. rssCloud does a waltz of change notification; the publisher notifies a hub, the hub broadcasts notifications to event subscribers and the subscriber does the same old content fetch and analysis cycle above. rssCloud seems fundamentally flawed in that it is dependent on IP addresses as identifiers. Notification receivers who must use new a IP address must re-subscribe. I&apos;m not sure how an aggregator should distribute notificaton handling load across a pool of IP addresses. The assumption is that notification receivers will have stable, singular IP addresses; rssCloud appears scale limited and a support burden.  The focus on specification simplicity has its merits, I think we all hate gratuitous complexity (observe the success of JSON over SOAP). However, Dave doesn&apos;t regard system operations as an important concern; he&apos;ll readily evangelize a message format and protocol but the real world operability is Other Peoples Problem.
  610. &lt;/p&gt;
  611. &lt;p&gt;
  612. &lt;a href=&quot;;&gt;Pubsubhubub&lt;/a&gt; (hey, Brad again) has a similar waltz but eliminates the content fetch and analysis cycle ergo it&apos;s fundamentally more efficient than rssCloud&apos;s waltz. Roughly, Pubsubhubub is to the SixApart atom stream what rssCloud is to old school XML-RPC ping. If I were still at Technorati (or working on event clients like Seesmic, Tweetdeck, etc), I would be implementing Pubsubhubbub and taking a pass on rssCloud.  With both systems, I&apos;d be concerned with a few issues. How can the authenticity of the event be trusted? Yes, we all like simplicity but looking at SMTP is apt; now mail systems must be aware of SPF, DKIM, SIDF, blahty blah blah. Its common for mail clients to access MTA&apos;s over cryptographically secure connections. Mail is a mess but it works, albeit with a bunch of junk overlaid. I guess this is why &lt;a href=&quot;;&gt;Wave Protocol&lt;/a&gt; has gathered interest. Anyway, Pubsubhubbub has a handshake during the subscription processes, though that looks like a malicious party could still spin up endpoints with bogus POSTs. I&apos;d like to see an OAuth or digest authentication layer in the ecosystem. Yea, it&apos;s a little more complicated, but nothing onerous... suck it up. Whatever. Brad knows the authenticity rap, I mean he also invented OpenID (BTW, we adopted &lt;a href=&quot;;&gt;OpenID at Technorati back in 2007&lt;/a&gt;). At Technorati we had to implement ping throttling to combat extraneous ping bots; either daemons or cron jobs that just ping continuously, whether the URL has changed or not. You can&apos;t just blacklist that URL, we don&apos;t know it was the author generating those pings, there&apos;s no identity authenticity there. We resorted to blocking IP addresses but that scales poorly and creates other support problems. We had 1000&apos;s of domain names blocked and whole class C networks blocked but it was always a wackamole exercise; so much for an open blogosphere, a whitelist is the only thing that scales within those constraints. Meanwhile, back to rssCloud and Pubsubhubbub, what event delivery guarantees can be made? If a data center issue or something else interrupts event flow, are events spooled so that event consumption can be caught up? How can subscribers track the authenticity of the event originators? How can publishers keep track of who their subscribers are? Well, I&apos;m not at Technorati anymore so I&apos;m no longer losing any sleep over these kinds of concerns but do I care about the ecosystem. For more, &lt;a href=&quot;;&gt;Matt Mastracci&lt;/a&gt; is posting interesting stuff about Pubsubhubbub and a sound comparison was posted to &lt;a href=&quot;; title=&quot;RSSCloud Vs. PubSubHubbub: Why The Fat Pings Win&quot;&gt;Techcrunch&lt;/a&gt; yesterday.
  613. &lt;/p&gt;
  614. &lt;p&gt;
  615. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;rsscloud&lt;/a&gt; &amp;nbsp;
  616. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;pubsubhubbub&lt;/a&gt; &amp;nbsp;
  617. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ping&lt;/a&gt; &amp;nbsp;
  618. &lt;/p&gt;
  619. </description>          </item>
  620.    <item>
  621.    <guid isPermaLink="true"></guid>
  622.    <title>Business Models in Consulting, Contracting and Training</title>
  623.    <dc:creator>spidaman</dc:creator>
  624.    <link></link>
  625.        <pubDate>Sun, 2 Aug 2009 20:57:08 -0700</pubDate>
  626.    <category>Musings</category>
  627.            <description>&lt;p&gt;
  628. Since leaving &lt;a href=&quot;;&gt;Technorati&lt;/a&gt; last spring, I&apos;ve been working independently with a few entrepreneurs on their technical platforms. This has mostly entailed working with tools around Infrastructure-As-A-Service (&lt;a href=&quot;;&gt;AWS&lt;/a&gt;), configuration management (&lt;a href=&quot;;&gt;Chef&lt;/a&gt; and &lt;a href=&quot;;&gt;RightScale&lt;/a&gt;), search (&lt;a href=&quot;;&gt;Solr&lt;/a&gt;) and learning a lot about programming and going into production with ruby and rails. I&apos;ve spoken to a number of friends and acquaintances who are working as consultants, contractors, technical authors and trainers. Some are working as lone-wolves and others working within or have founded larger organizations. I&apos;m always sniffing for where the upside opportunities are and the question that comes to my mind is: how do such businesses scale?
  629. &lt;/p&gt;
  630. &lt;p&gt;
  631. A number of technology services companies that I&apos;ve taken notice of have been funded in the last year or so including &lt;a href=&quot;;&gt;OpsCode&lt;/a&gt;, &lt;a href=&quot;;&gt;Reductive Labs&lt;/a&gt;, &lt;a href=&quot;;&gt;Cloudera&lt;/a&gt; and &lt;a href=&quot;;&gt;Lucid Imagination&lt;/a&gt;. I think all of these guys are in great positions; virtual infrastructure (which is peanut butter to the chocolate of IaaS), big data and information retrieval technologies provide the primordial goo that will support new mobile, real time and social software applications. They are all working in rapid innovation spaces that hold high value potentials but also new learning and implementation challenges that rarefy specialized knowledge.
  632. &lt;/p&gt;
  633. &lt;p&gt;
  634. Years ago when I was working with Covalent Technologies, we tried to build a business around &quot;enterprise open source&quot; with Apache, Tomcat, etc as the basis. Packaging and selling free software is difficult. On the one hand, offering a proven technology stack configuration to overcome the usual integration and deployment challenges as well as providing a support resource is really valuable to Fortune 500&apos;s and such. However, my experience there and observations of what&apos;s happened with similar businesses (such as Linuxcare and SpikeSource) has left me skeptical how big the opportunity is. After all, while you&apos;re competing with the closed-source proprietary software vendors, you&apos;re also competing with Free.
  635. &lt;/p&gt;
  636. &lt;p&gt;
  637. The trend I&apos;m noticing is the branching out away from the packaging and phone support and into curriculum. Considering that most institutional software technology education, CS degrees, extended programs, etc have curricula that are perpetually behind the times, it makes sense that the people who possess specialized knowledge on the bleeding edge lead the educational charge. &lt;a href=&quot;;&gt;Lucid Imagination&lt;/a&gt;, &lt;a href=&quot;;&gt;Cloudera&lt;/a&gt; and &lt;a href=&quot;;&gt;Scale Unlimited&lt;/a&gt; are illustrating this point. While on-premise training can be lucrative, I think online courseware may provide a good answer to the business scale question.
  638. &lt;/p&gt;
  639. &lt;p&gt;
  640. For myself, I&apos;m working with and acquiring knowledge in these areas tactically. Whatever my next startup will be, it should be world-changing and lucrative. And I&apos;ll likely be using all of these technologies. Thank goodness these guys are training the workforce of tomorrow!
  641. &lt;/p&gt;
  642. &lt;p&gt;
  643. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;startups&lt;/a&gt; &amp;nbsp;
  644. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;scalability&lt;/a&gt; &amp;nbsp;
  645. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;entrepreneuring&lt;/a&gt; &amp;nbsp;
  646. &lt;/p&gt;</description>          </item>
  647.    <item>
  648.    <guid isPermaLink="true"></guid>
  649.    <title>Configuring Web Clouds with Chef</title>
  650.    <dc:creator>spidaman</dc:creator>
  651.    <link></link>
  652.        <pubDate>Thu, 21 May 2009 12:30:07 -0700</pubDate>
  653.    <category>Musings</category>
  654.            <description>&lt;p&gt;
  655. &lt;a href=&quot;; title=&quot;Casserole&quot;&gt;
  656. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;128&quot; height=&quot;128&quot; /&gt;&lt;/a&gt;
  657. I&apos;m not generally passionate about network and system operations, I prefer to focus my attention and creativity on system and software architectures. However, infrastructure provisioning, application deployment, monitoring and maintenance are facts of life for online services. When those basic functions aren&apos;t functioning well, then I get passionate about them. When service continuity is impacted and operations staff are overworked, it really bothers me; it tells me that I or other developers I&apos;m working with are doing a poor job of delivering resilient software. I&apos;ve had many conversations with folks who&apos;ve accepted as a given that development teams and operations teams have friction between them; some even suggest that they &lt;em&gt;should&lt;/em&gt;. After all, so goes that line of thinking, the developers are graded on how rapidly they implement features and fix bugs whereas the operators are graded on service availability and performance. Well, you can sell that all you want but I won&apos;t buy it.
  658. &lt;/p&gt;
  659. &lt;p&gt;
  660. In my view, developers need to deliver software that can be operated smoothly and operators need to provide feedback on how smoothly the software is operating; dev and ops must collaborate. I accept as a given that developers
  661. &lt;ul&gt;
  662. &lt;li&gt;Use source control&lt;/li&gt;
  663. &lt;li&gt;Write unit tests (after the fact or before/during &lt;a href=&quot;;&gt;TDD&lt;/a&gt; style)&lt;/li&gt;
  664. &lt;li&gt;Write functional and integration tests&lt;/li&gt;
  665. &lt;li&gt;Maintain a build system for running test harnesses and packaging code&lt;/li&gt;
  666. &lt;li&gt;Document internal architecture and operating interfaces&lt;/li&gt;
  667. &lt;li&gt;Plan for change with respect to scale charactistics and functionality&lt;/li&gt;
  668. &lt;/ul&gt;
  669. Conversely, I accept as a given that operators
  670. &lt;ul&gt;
  671. &lt;li&gt;Use configuration management&lt;/li&gt;
  672. &lt;li&gt;Automate infrastructure provisioning, code deployment and rollback&lt;/li&gt;
  673. &lt;li&gt;Monitor infrastructure and application metrics&lt;/li&gt;
  674. &lt;/ul&gt;
  675. I don&apos;t want to oversimplify, there&apos;s more to the obligations that dev and ops have to each other in order to collaborate effectively. What I&apos;ve noticed though is that a lot of operators might be skilled with configuring specific server infrastructure or performing OS analysis but configuration management and automation requires using really good tools that they lack. I&apos;ve seen situations where the available tools are perceived as too complicated and so tools are developed that usually consist of a lot of specialized shell scripts (or perhaps it&apos;s just plain old NIH). &lt;a href=&quot;;&gt;Cfengine&lt;/a&gt; is a good start but the reports I have is that it&apos;s difficult to work with and, if you&apos;re not very careful, may automatically manage to &lt;em&gt;mis&lt;/em&gt;configure your systems. &lt;a href=&quot;;&gt;Puppet&lt;/a&gt; was developed to be a more powerful system for configuration management but the feedback I&apos;ve seen on it is adding new functionality is hard; it has its own configuration language and when you want to extend it you have to deal with a lot of complicated mechanisms. &lt;a href=&quot;;&gt;Chef&lt;/a&gt; was developed to answer that frustration; by making the configuration language a &lt;a href=&quot;;&gt;DSL&lt;/a&gt; on top of an already widely used scripting language (ruby), the chef code base provides an easier way to extend it and the chef codebase itself is reportedly an order of magnitude smaller and simpler than puppet&apos;s (cavaet: I generally distrust &lt;a href=&quot;;&gt;SLoC&lt;/a&gt; metrics but just sayin&apos;).
  676. &lt;/p&gt;
  677. &lt;p&gt;
  678. So I&apos;ve been giving Chef a test-drive for this infrastructure-on-EC2 management project that&apos;s been cooking. The system implemented the following use cases:
  679. &lt;ol&gt;
  680. &lt;li&gt;Launch web app servers on EC2 with Apache, &lt;a href=&quot;;&gt;Passenger&lt;/a&gt;, RoR (+other gems) and overlay a set of rails apps out of git&lt;/li&gt;
  681. &lt;li&gt;Launch a pair of reverse proxies (with ha-proxy) in front of the app servers - and reconfigure them when the set of app servers is expanded or contracted&lt;/li&gt;
  682. &lt;li&gt;Configure the proxy for failover with &lt;a href=&quot;;&gt;heartbeat&lt;/a&gt;&lt;/li&gt;
  683. &lt;li&gt;Add new rails apps to the set of app servers&lt;/li&gt;
  684. &lt;li&gt;Updating/rolling back rails apps&lt;/li&gt;
  685. &lt;/ol&gt;
  686. The system is enabled through a combination of the EC2 API (via &lt;a href=&quot;;&gt;RightAWS&lt;/a&gt;) and Chef&apos;s REST API as well as using &lt;a href=&quot;;&gt;chef-deploy&lt;/a&gt; (think: Capistrano run by a system provisioning agent) to augment Chef&apos;s functionality. So far, it seems to be working great!
  687. &lt;/p&gt;
  688. &lt;p&gt;
  689. There&apos;s a lot of energy in the Chef community (check out &lt;a href=&quot;;&gt;Casserole&lt;/a&gt;), combined with monitoring, log management and cloud technologies, I think there&apos;s a lot of IT streamlining ahead. Perhaps the old days of labor and communication intensive operations will give way to a new era of autonomic computing. I&apos;ll post further about some of the mechanics of working with ruby, rails, chef, EC2, chef-deploy and other tools in the weeks ahead (particularly now that EC2 has native &lt;a href=&quot;;&gt;load balancing, monitoring and auto-scaling&lt;/a&gt; capabilities). I&apos;ll also talk a bit about this stuff at a &lt;a href=&quot;;&gt;Velocity BoF&lt;/a&gt;. If you&apos;re thinking about attending Velocity, O&apos;Reilly is offering &lt;a href=&quot;;&gt;30% off to the first 30 people to register today with the code vel09d30&lt;/a&gt; &lt;strong&gt;today&lt;/strong&gt; (no I&apos;m not getting any kinduva kickback from O&apos;Reilly). And you can catch &lt;a href=&quot;;&gt;Infrastructure in the Cloud Era&lt;/a&gt; with &lt;em&gt;Adam Jacob (Opscode), Ezra Zygmuntowicz (EngineYard) &lt;/em&gt; to learn more about Chef and cloud management.
  690. &lt;/p&gt;
  691. &lt;p&gt;
  692. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;chef&lt;/a&gt; &amp;nbsp;
  693. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;puppet&lt;/a&gt; &amp;nbsp;
  694. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cfengine&lt;/a&gt; &amp;nbsp;
  695. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ec2&lt;/a&gt; &amp;nbsp;
  696. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;aws&lt;/a&gt; &amp;nbsp;
  697. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ruby&lt;/a&gt; &amp;nbsp;
  698. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cloud computing&lt;/a&gt; &amp;nbsp;
  699. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;velocity&lt;/a&gt; &amp;nbsp;
  700. &lt;/p&gt;
  701. </description>          </item>
  702.    <item>
  703.    <guid isPermaLink="true"></guid>
  704.    <title>Cloning VMware Machines</title>
  705.    <dc:creator>spidaman</dc:creator>
  706.    <link></link>
  707.        <pubDate>Tue, 31 Mar 2009 09:12:22 -0700</pubDate>
  708.    <category>Musings</category>
  709.            <description>&lt;p&gt;
  710. &lt;a href=&quot;; title=&quot;VMware&quot;&gt;
  711. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;187&quot; height=&quot;72&quot; /&gt;&lt;/a&gt;
  712. I bought a copy of &lt;a href=&quot;;&gt;VMware Fusion&lt;/a&gt; on special from &lt;a href=&quot;;&gt;Smith Micro&lt;/a&gt; (icing on the cake: they had a 40% off special that week) specifically so I could simulate a network of machines on my local MacBook Pro. While I&apos;ve heard good things about &lt;a href=&quot;;&gt;Virtual Box&lt;/a&gt;, one of the other key capabilities I was looking for from MacIntosh virtualization software was the ability convert an existing Windows installation to a virtual machine. VMware reportedly has the best tools for that kind of thing. I have an aging Dell with an old XP that I&apos;d like to preserve when I finally decide to get rid of the hardware; when it&apos;s time to Macify, I&apos;ll be good to go.
  713. &lt;/p&gt;
  714. &lt;p&gt;
  715. I started building my virtual network very simply, by &lt;a href=&quot;;&gt;creating a CentOS VM&lt;/a&gt;. Once I had my first VM running, I figured I could just grow the network from there; I was expecting to find a &quot;clone&quot; item in the Fusion menus but alas, no joy. So, it&apos;s time to hack. Looking around at the artifacts that Fusion created, a bunch of files in a directory named for the VM, I started off by copying the directory, the files it contained that had the virtual machine name as components of the file name and edited the metadata files ({vm name}.vmdk/.vmx/.vmxf). Telling Fusion to launch that machine, it prompted if this was a copy or a moved VM - I told it that it was copied and the launch continued. Both launched VM&apos;s could ping each other so voila: my virtual network came into existence.
  716. &lt;/p&gt;
  717. &lt;p&gt;
  718. I&apos;ve since found &lt;a href=&quot;;&gt;another procedure to create &quot;linked clones&quot; in VMware Fusion&lt;/a&gt;. It looks like this will be really useful for my next scenario of having two different flavors of VM&apos;s running on my virtual network. The setup I want to get to is one where I can have &quot;manager&quot; host (to run provisioning, monitoring and other management applications) and cookie-cutter &quot;worker&quot; hosts (webservers, databases, etc). Ultimately, this setup will help me tool up for cloud platform operations; I have more Evil Plans there.
  719. &lt;/p&gt;
  720. &lt;p&gt;
  721. So all of this has me wondering: why doesn&apos;t VMware support this natively? Where&apos;s that menu option I was looking for? Is there an alternative to this hackery that I just overlooked?
  722. &lt;/p&gt;
  723. &lt;p&gt;
  724. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;vmware&lt;/a&gt; &amp;nbsp;
  725. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;virtualization&lt;/a&gt; &amp;nbsp;
  726. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;centos&lt;/a&gt; &amp;nbsp;
  727. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;vmware fusion&lt;/a&gt; &amp;nbsp;
  728. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;vm cloning&lt;/a&gt; &amp;nbsp;
  730. &lt;/p&gt;</description>          </item>
  731.    <item>
  732.    <guid isPermaLink="true"></guid>
  733.    <title>Going to Metallica&apos;s Rock and Roll Hall of Fame Induction</title>
  734.    <dc:creator>spidaman</dc:creator>
  735.    <link></link>
  736.        <pubDate>Thu, 12 Mar 2009 12:22:51 -0700</pubDate>
  737.    <category>Music</category>
  738.            <description>&lt;p&gt;
  739. &lt;a href=&quot;; title=&quot;Metallica - Rock and Roll Hall of Fame&quot;&gt;
  740. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;295&quot; height=&quot;137&quot; /&gt;&lt;/a&gt;
  741. Those &lt;a href=&quot;,8599,1877187,00.html&quot;&gt;25 things you should know about me&lt;/a&gt; memes circulating rarely interest me (honestly, I don&apos;t care that you have a collection of rare El Salvadoran currency). However, one thing that my friends know but regular readers may not is that I have a fairly eclectic background. Did you know that I used to hang around the &lt;a href=&quot;;&gt;art department&apos;s hot glass studio in college&lt;/a&gt; to blow glass? Did you know that I learned to program in &lt;a href=&quot;;&gt;Pascal&lt;/a&gt; when I was in college and hated it? Yea, yea, I don&apos;t care much anymore either. But anyway, back in the 80&apos;s I was friends with this Danish dude from LA who shared my interest in the underground heavy metal scene that was burgeoning, particularly in Britain (&quot;New Wave of British Heavy Metal&quot; AKA NWOBHM) and Europe. We used to trade records and demos (the first &lt;em&gt;Def Leppard&lt;/em&gt; 3 song EP on 9&quot; vinyl, I was tired of it so I traded him for a bunch of &lt;em&gt;Tygers of Pan Tang&lt;/em&gt; and other crap I didn&apos;t own already). I think he, like myself, used to pick up copies of Melody Maker and Sounds at the local record store to read about what was going on overseas. Eventually, &lt;a href=&quot;;&gt;Kerrang!&lt;/a&gt; came out providing fuller coverage of the metal scene, complete with glossy pictures. But in the meantime back in San Francisco, I helped a friend of mine (Ron Quintana) operate his fanzine &lt;em&gt;Metal Mania&lt;/em&gt; (don&apos;t be confused, the name was re-appropriated by various larger publishing concerns at different times in the years since but none of them had any relationship to the original gangstas).
  742. &lt;/p&gt;
  743. &lt;p&gt;
  744. Back in the day, &lt;a href=&quot;;&gt;Howie Klein&lt;/a&gt; was a muckety muck in the music industry, haunting the local clubs like &lt;em&gt;The Old Waldorf&lt;/em&gt; and &lt;em&gt;Mabuhay Gardens&lt;/em&gt;. Howie hooked us up with a show on &lt;a href=&quot;;&gt;KUSF&lt;/a&gt;. I dubbed the show &lt;a href=&quot;;&gt;Rampage Radio&lt;/a&gt;, it ran in the wee hours every Saturday night (right after &lt;a href=&quot;;&gt;Big Rick Stuart&lt;/a&gt; finished up his late night reggae show with those dudes from Green Apple Records on Clement Street). In between hurling insults at &quot;album oriented rock&quot; and big-hair metal bands (posers!), we played a lot of stuff you couldn&apos;t hear anywhere else. Among the many obscure noises we aired were demos from East Bay metalheads &lt;a href=&quot;;&gt;Exodus&lt;/a&gt;. Amazingly, Rampage Radio is &lt;em&gt;still on the air&lt;/em&gt;. Well, that Danish kid and one of the guys I befriended from Exodus were Lars Ulrich and Kirk Hammett, respectively. In short order, they would be playing together in a band Lars named &lt;a href=&quot;;&gt;Metallica&lt;/a&gt; (after haggling with Ron about &lt;em&gt;not&lt;/em&gt; taking that name for the &apos;zine).
  745. &lt;/p&gt;
  746. &lt;p&gt;
  747. I eventually lost interest in the metal &lt;em&gt;scene&lt;/em&gt; (not enough innovation, too much sound-alike derivatives to keep me listening); even though the music from then is still on my playlist, my repertoire has broadened widely (talk to me about gypsy style string jazz, please). I&apos;ve been peripherally in touch with friends from back then. Over the years, I&apos;d go to a few Metallica shows but the guys are always mobbed at the backstage parties, there&apos;s not much of an opportunity to actually talk about anything. Anyway, we have little in common now. I develop software and &lt;a href=&quot;;&gt;crazy assed online services&lt;/a&gt;; they tour the world to perform in front of throngs. And I don&apos;t drink Jaegermeister anymore. In 2000, I introduced one of the friends I&apos;ve stayed in touch with, &lt;a href=&quot;;&gt;Brian Lew&lt;/a&gt;, who also had a fanzine Back In The Day, to editors at &lt;a href=&quot;;&gt;;/a&gt; (where I was working at the time). He contributed a great article expressing a sentiment that I shared, &lt;a href=&quot;; title=&quot;Metallica, how could you?&quot;&gt;dismay at Metallica&apos;s war on Napster&lt;/a&gt;. I don&apos;t think I&apos;ve actually talked to Lars in 15 years. After seeing news coverage of him ranting about how people (his most valued asset: his fans) where ripping him off, I&apos;m not sure I wanted to. But I think we&apos;re all over that now, let&apos;s just play &lt;a href=&quot;;&gt;Rock Band&lt;/a&gt; and fuhgedaboutit.
  748. &lt;/p&gt;
  749. &lt;p&gt;
  750. So here we are decades later and Metallica hasn&apos;t just warped the music industry, they &lt;em&gt;are&lt;/em&gt; the industry. They&apos;re up there with Elvis and the Beatles and all of that (except, barring Cliff Burton, they&apos;re not dead). Last week, Brian pings me that Q-Prime (Metallica&apos;s management company in New York) is trying to reach me. After a few phone calls, it turns out that Metallica is honoring a handful of us old-schoolers by inviting us to a big shindig in Cleveland for their &lt;a href=&quot;;&gt;Rock and Roll Hall of Fame&lt;/a&gt; induction next month. How cool is that?! I&apos;m still kind blown away that this is really happening (am I being punkd??).
  751. &lt;/p&gt;
  752. &lt;p&gt;
  753. So, I may be &lt;a href=&quot;;&gt;leaving Technorati&lt;/a&gt; but I&apos;m going to the Rock and Roll Hall of Fame! w00t! That tune keeps humming through my conscience, &quot; in sin with a safety pin, Cleveland rocks! Cleveland rocks!&quot; but the way it sounds in my head, it&apos;s ganked up, roaring from a massive PA and a wall of &lt;a href=&quot;;&gt;Marshall&lt;/a&gt; stacks. So now you know what my plans will be in a few weeks and now you&apos;ve learned a dozen or so things about me (if not 25) that you may not have known before.
  754. &lt;/p&gt;
  755. &lt;p&gt;
  756. &lt;em&gt;
  757. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;metallica&lt;/a&gt; &amp;nbsp;
  758. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;rock and roll hall of fame&lt;/a&gt; &amp;nbsp;
  759. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;metal&lt;/a&gt; &amp;nbsp;
  760. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;kusf&lt;/a&gt; &amp;nbsp;
  761. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cleveland&lt;/a&gt; &amp;nbsp;
  762. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;nwobhm&lt;/a&gt; &amp;nbsp;
  764. &lt;/em&gt;
  765. &lt;/p&gt;</description>          </item>
  766.    <item>
  767.    <guid isPermaLink="true"></guid>
  768.    <title>More Changes At Technorati (this time, it&apos;s personal)</title>
  769.    <dc:creator>spidaman</dc:creator>
  770.    <link></link>
  771.        <pubDate>Tue, 10 Mar 2009 14:06:20 -0700</pubDate>
  772.    <category>Musings</category>
  773.            <description>&lt;p&gt;
  774. &lt;a href=&quot;; title=&quot;Technorati&quot;&gt;
  775. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;110&quot; height=&quot;15&quot; /&gt;&lt;/a&gt;
  776. My post &lt;a href=&quot;; title=&quot;New Crawlers At Technorati&quot;&gt;last week&lt;/a&gt; focused on some of the technology changes that I&apos;ve been spearheading at &lt;a href=&quot;;&gt;Technorati&lt;/a&gt; but this time, I have a personal change to discuss. When I joined Technorati in 2004, the old world of the web was in shambles. The 1990&apos;s banner-ads-on-a-CPM-basis businesses were collapsed. The editorial teams using big workflow-oriented content management system (CMS) infrastructure (which I worked on in the 90&apos;s) were increasingly eclipsed by the ecosystem of blogs. Web 2.0 wasn&apos;t yet the word on everyone&apos;s lips. But five years ago, &lt;a href=&quot;;&gt;Dave Sifry&lt;/a&gt;&apos;s infectious vision for providing &quot;connective tissue&quot; for the blog ecosystem, tapping the attention signals and creating an emergent distributed meta-CMS helped put it there. Being of service to bloggers just sounded too good, so I jumped aboard.
  777. &lt;/p&gt;
  778. &lt;p&gt;
  779. Through many iterations of blogospheric expansion, building data flow, search and discovery applications, dealing with data center outages (and migrations) and other adventures, it&apos;s been a long strange trip. I&apos;ve made a lot of fantastic friends, contributed a lot of insight and determination and learned a great deal along the way. I am incredibly proud of what we&apos;ve built over the last five years. However today it&apos;s time for me to move on, my last day at Technorati will be next week.
  780. &lt;/p&gt;
  781. &lt;p&gt;
  782. Technorati has a lot of great people, technology and possibilities. The aforementioned crawler rollout provides the technology platform with a better foundation that I&apos;m sure &lt;a href=&quot;;&gt;Dorion&lt;/a&gt; and the rest of the team will build great things on. The ad platform will create an abundance of valuable opportunities for bloggers and other social media. I know from past experiences what a successful media business looks like and under &lt;a href=&quot;; title=&quot;Richard Jalichandra&quot;&gt;Richard Jalichandra&lt;/a&gt;&apos;s leadership, I see all of the right things happening.  The ad platform will leverage Technorati&apos;s social media data assets with the publisher and advertiser tools that will make Technorati an ad delivery powerhouse. I&apos;m going to remain a friend of the company&apos;s and do what I can to help its continued success, but I will be doing so from elsewhere.
  783. &lt;/p&gt;
  784. &lt;p&gt;
  785. I want to take a moment to thank all of my colleagues, past and present, who have worked with me to get Technorati this far. The brainstorms, the hard work, the arguments and the epiphanies have been tremendously valuable to me. &lt;em&gt;Thank You!&lt;/em&gt;
  786. &lt;/p&gt;
  787. &lt;p&gt;
  788. I&apos;m not sure what&apos;s next for me. I feel strongly that the changes afoot in cloud infrastructure, open source data analytics, real time data stream technologies, location based services (specifically, GPS ubiquity) and improved mobile devices are going to build on Web 2.0. These social and technology shifts will provide primordial goo out of which new innovations will spring. And I intend to build some of them, so brace yourself for Web 3.0. It&apos;s times like these when the economy is athrash that the best opportunities emerge and running for cover isn&apos;t my style. The next few years will see incumbent players in inefficient markets crumble and more powerful paradigms take their place. I&apos;m bringing my hammer.
  789. &lt;/p&gt;
  790. &lt;p&gt;
  791. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt;
  792. &lt;/p&gt;</description>          </item>
  793.    <item>
  794.    <guid isPermaLink="true"></guid>
  795.    <title>Welcome to the Technorati Top 100, Mr. President</title>
  796.    <dc:creator>spidaman</dc:creator>
  797.    <link></link>
  798.        <pubDate>Wed, 4 Mar 2009 22:59:16 -0800</pubDate>
  799.    <category>Musings</category>
  800.            <description>&lt;p&gt;
  801. &lt;a href=&quot;; title=&quot;White House Blog&quot;&gt;
  802. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;352&quot; height=&quot;347&quot; /&gt;&lt;/a&gt;
  803. Since its inception just 6 weeks ago, the &lt;a href=&quot;;&gt;White House Blog&lt;/a&gt; has had a tremendous center of gravity. I noted the &lt;a href=&quot;;&gt;volume of links&lt;/a&gt; coming in to the White House Blog after the first week.  This is an existential moment for the blogosphere because today the White House Blog has 3216 links from 2323 blogs. And so it&apos;s official: the White House Blog has reached the &lt;a href=&quot;;&gt;Technorati Top 100&lt;/a&gt;.
  804. &lt;/p&gt;
  805. &lt;p&gt;
  806. I find myself reflecting on what the top 100 looked like four years ago, after the prior presidential inauguration, and what it looks like today; the blogosphere is a very different place. Further down memory lane, who recalls when &lt;a href=&quot;;&gt;Dave Winer and Instapundit were among the top blogs&lt;/a&gt;? Yep, most of the small publishers have been displaced by those with big businesses behind them. Well, at least &lt;a href=&quot;;&gt;BoingBoing&lt;/a&gt; endures but Huffpo and Gizmo better watch out, here comes Prezbo.
  807. &lt;/p&gt;
  808. &lt;p style=&quot;clear:both;&quot;&gt;&lt;em&gt;
  809. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  810. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;white house&lt;/a&gt; &amp;nbsp;
  811. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;inauguration&lt;/a&gt; &amp;nbsp;
  812. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;blog&lt;/a&gt; &amp;nbsp;
  813. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  814.    <item>
  815.    <guid isPermaLink="true"></guid>
  816.    <title>New Crawlers At Technorati</title>
  817.    <dc:creator>spidaman</dc:creator>
  818.    <link></link>
  819.        <pubDate>Wed, 4 Mar 2009 20:31:16 -0800</pubDate>
  820.    <category>Musings</category>
  821.            <description>&lt;p&gt;
  822. &lt;a href=&quot;; title=&quot;Spider Web&quot;&gt;
  823. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;128&quot; height=&quot;134&quot; /&gt;&lt;/a&gt;
  825. A lot of changes are afoot at Technorati. Over the last year or so, we&apos;ve been looking inward at the infrastructure and asking ourselves, &quot;How can we do this better?&quot;. The data spigot that Technorati builds on was the first thing to focus on, it&apos;s a critical part in one leg of the back-end infrastructure tripod. The tripod consists of data acquisition, search and analytics Technorati; while the ping handling and queuing are relatively simple affairs the crawler is the most sophisticated of the data acquisition subsystems. It&apos;s proper functioning is critical to the functioning of the other legs; when it doesn&apos;t function well, search and analytics don&apos;t either (GIGO=&quot;garbage in/garbage out&quot;).
  826. &lt;/p&gt;
  827. &lt;p&gt;
  828. As &lt;a href=&quot;;&gt;Dorion&lt;/a&gt; mentioned recently, &lt;a href=&quot;;&gt;we&apos;re retiring the old crawler&lt;/a&gt;. Why are we giving the old crawler getting an engraved watch and showing it to the door? Well, old age is one reason. The original spider is a technology that dates back to 2003,  the blogosphere has changed a lot since then and we have a much better developed understanding of the requirements. The original spider code has presented a sufficient number of GIGO-related and code maintenance challenges to warrant a complete re-thinking. It contrasts starkly with the replacement.
  829. &lt;dl&gt;
  830. &lt;dt&gt;Data model&lt;/dt&gt;
  831. &lt;dd&gt;There are a lot of ways to derive structural information out of the pages and feeds that a blog presents. The old spider used event driven parses, building a complex state as it went with flat data structures (lists and hashes). The new one uses the composed web documents to populate a well-defined object model; all crawls normalize the semi-structured data found on the web to that model.&lt;/dd&gt;
  832. &lt;dt&gt;Crawl persistence&lt;/dt&gt;
  833. &lt;dd&gt;The old spider was hard-wired to persist the aforementioned data structure elements to relational databases (sharded MySQL instances) while it was parsing, so that the flow of saving parsed data was closely coupled with parsing events, forsaking transactional integrity and consuming costly resources. The new spider composes and saves its parse result as a big discreet object (not collections of little objects in an RDBMS). This reduced the hardware footprint by an order of magnitude.
  834. &lt;/dd&gt;
  835. &lt;dt&gt;Operational visibility&lt;/dt&gt;
  836. &lt;dd&gt;Whether a blog&apos;s page structure was understood (or not), the feed was  well formed (or not) or any of the many other things that determine the success or quality of a blog&apos;s crawl was opaque under the old spider. With the new spider, detailed metadata and metrics are tracked during the crawl cycles. This better enables the team to support bloggers and extend the system&apos;s capabilities.&lt;/dd&gt;
  837. &lt;dt&gt;Unit tests&lt;/dt&gt;
  838. &lt;dd&gt;Wherever you have complex, critical software you want to have unit tests. The old spider had almost no unit tests and was developed in a way that made testing the things that mattered most exceptionally difficult. The new spider was developed with a test harness upfront, it now has hundreds of tests that validate thousands of aspects of the code. The test are uniformly invoked by the developers and automatically whenever the code is updated (AKA under &lt;a href=&quot;;&gt;continuous integration&lt;/a&gt;).
  839. &lt;/dd&gt;
  840. &lt;/dl&gt;
  841. The old spider didn&apos;t leverage packages to logically separate the different concerns (fetching, parsing, validation, change determination, etc), the aforementioned flat data structures, mingling of concerns and absence of unit tests made changing it exceedingly difficult. Now, we have a whole that is greater than the sum of the parts; having a well defined data model, sensible persistence, operational visibility and unit tests has added up to an order of magnitude improvement across several dimensions. The real benefits are seen when we&apos;ve shown that the system is easy to change, I mentioned this several weeks ago when I noted the ease with which we could &lt;a href=&quot;; title=&quot;Inbloguration: One Week Later&quot;&gt;adapt custom requirements to crawl the White House blog&lt;/a&gt;.
  842. &lt;/p&gt;
  843. &lt;p&gt;
  844. Another change that we&apos;ve made is to the legacy assumption that everything that pings is a blog. That assumption proved to be increasingly untenable as the ping meme spread amongst those who didn&apos;t really understand the difference between some random page and a blog, nefarious publishers (spammers) and other perpetrators of &lt;a href=&quot;;&gt;spings&lt;/a&gt;. Over 90% of the pings hitting Technorati are rejected outright because they&apos;ve been identified as invalid pings. A large portion of the remainder are later determined to be invalid but we now have a rigorous system in place for filtering out the noise.  We&apos;ve reduced the spam level considerably (as mentioned in a  &lt;a href=&quot;; title=&quot;Social Media Backlash Against Cheaters and Fleshmongers&quot;&gt;prior post&lt;/a&gt;). For instance, there&apos;s a whole genre of &lt;a href=&quot;;&gt;splogs&lt;/a&gt; that are pornography focused (hardcore pictures, paid affiliate links, etc) that previously plagued our data; now we&apos;ve eliminated a lot of that nonsense from the index.
  845. &lt;/p&gt;
  846. &lt;p&gt;
  847. Here are a pair of charts showing the daily occurrence of a particular porn term in the index.
  848. &lt;div style=&quot;float:left; width:48%; height: 220px;&quot;&gt;
  849. 6 month retrospective as of November 3rd, 2008: &lt;br/&gt;
  850. &lt;img src=&quot;; width=&quot;300&quot; height=&quot;180&quot; style=&quot;bottom:10px; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand; vertical-align:bottom;&quot; border=&quot;0&quot; /&gt;
  851. &lt;/div&gt;
  853. &lt;div style=&quot;float:right; width:48%; height: 220px;&quot;&gt;
  854. 6 month retrospective today, 5 months later: &lt;br/&gt;
  855. &lt;img src=&quot;; width=&quot;300&quot; height=&quot;180&quot; style=&quot;bottom:10px; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; /&gt;
  856. &lt;/div&gt;
  857. &lt;/p&gt;
  858. &lt;p style=&quot;clear:both;&quot;&gt;
  859. As you can see, that&apos;s an order of magnitude reduction; 90% of the occurrences of that term was spam.
  860. &lt;/p&gt;
  861. &lt;p style=&quot;clear:both;&quot;&gt;
  862. So what&apos;s next for the crawler? We&apos;ve got some stragglers on the old spider, we&apos;re going to migrate them over in the next few days. There are still a lot of issues to shake out, as with any new software (for instance, there are still some error recovery scenarios to deal with). But it&apos;s getting better all of the time (love that song). We&apos;ll be rolling out new tools internally for identifying where improvements are needed, ultimately we&apos;d like to enable bloggers to help themselves to publish, get crawled, be found and recognized more effectively. And there are more changes afoot, stay tuned.
  863. &lt;/p&gt;
  864. &lt;p&gt;&lt;em&gt;
  865. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  866. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;web crawling&lt;/a&gt; &amp;nbsp;
  867. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;software&lt;/a&gt; &amp;nbsp;
  868. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;spam&lt;/a&gt; &amp;nbsp;
  869. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;splogs&lt;/a&gt; &amp;nbsp;
  870. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  871.    <item>
  872.    <guid isPermaLink="true"></guid>
  873.    <title>Code Is Social</title>
  874.    <dc:creator>spidaman</dc:creator>
  875.    <link></link>
  876.        <pubDate>Fri, 27 Feb 2009 18:26:15 -0800</pubDate>
  877.    <category>Musings</category>
  878.            <description>&lt;p&gt;
  879. &lt;a href=&quot;; title=&quot;Social Code&quot;&gt;
  880. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;115&quot; height=&quot;115&quot; /&gt;&lt;/a&gt;
  881. Like many software developers, I confess that I have found myself on occasion coming back to old code that I wrote asking, &quot;What was I thinking?&quot; Where it&apos;s my code, this &lt;a href=&quot;;&gt;WWIT&lt;/a&gt; question doesn&apos;t happen very often these days but in general I can&apos;t count the number of times I&apos;ve encountered and had to work on code that was not written to be read. I think sometimes programmers write terse code and regard its brevity as a badge of honor, &quot;If I&apos;m wizardly enough to write this, then only True Wizards will read it.&quot; Or maybe it&apos;s just laziness or hurriedness, these code mysteries are akin to omitting comments, API documentation and other communication artifacts. When I see non-descriptive variable names, gratuitous indirection, excessive right indenting, monkey patching or unnecessary &lt;a href=&quot;;&gt;cyclomatic complexity&lt;/a&gt;, it&apos;s almost anti-social behavior; it&apos;s a communication fail more than a functional one. Likewise, gratuitous verbosity stifles communication in the opposite manner; this isn&apos;t pre-school - grasp of the ABC&apos;s is assumed. So spelling out what code is doing in this belabored fashion is just silly:
  882. &lt;pre&gt;
  883. # an array to collect permalinks
  884. permalinks = []
  885. # loop over the feed entries
  886. for entry in feed.entries:
  887.    permalinks.append(
  888. &lt;/pre&gt;
  889. Whereas this is clear
  890. &lt;pre&gt;
  891. # extract an array of permalinks from the feed entries
  892. permalinks = [ for entry in feed.entries ]
  893. &lt;/pre&gt;
  894. OK, I&apos;m assuming the reader knows what a Python &lt;a href=&quot;;&gt;list comprehension&lt;/a&gt; does. The first one is using a lot of vertical space to satisfy a very simple intent. I often find the opposite problem, excessive brevity, is authored by those enamored with their language&apos;s idioms. Software written with scripting languages often exhibit this; Perl is famous for &lt;a href=&quot;;&gt;expressiveness&lt;/a&gt; (I say this lovingly as a repentant x-Perl Wizard) but even the languages with adherents claiming their tongue is more &quot;readable&quot; have those same users donning wizard hats, trying to be clever. Ever tried to maintain Python code riddled with nested list comprehensions containing lambdas? Ruby, similar idiomatic norms abound, &apos;nuf said.
  895. &lt;/p&gt;
  896. &lt;p&gt;
  897. I&apos;ve appreciated celebrations of wizardry (see &lt;a href=&quot;;&gt;A folding language&lt;/a&gt;) but there&apos;s more to wizardry than meta-programming and brevity. Coding like a wizard doesn&apos;t mean being so clever that only other wizards can collaborate. In my view, a true wizard has the wisdom to steer clear of verbose indulgences &lt;em&gt;and&lt;/em&gt; terse spells; the wizard walks the middle path of clarity so that the code is not dumbed-down but the apprentice will grasp the intent. The wizard&apos;s code should read as poetry.
  898. &lt;/p&gt;
  899. &lt;p&gt;
  900. When code is unsocial (or anti-social), the quality suffers. Complex software needs a gene pool - lots of eyeballs, lots of variant perspectives and experiences. A small gene pool leads to in-bred ideas. Thus code from a lone wolf (even a kick-ass wolf) will usually be of lower quality than code developed by a plurality (unless its a plurality of novices, then all bets are off).
  901. &lt;/p&gt;
  902. &lt;p&gt;
  903. My plea to fellow crafters of bits: please code for clarity. Don&apos;t be so brief that your intentions are unclear. And don&apos;t be so garrulous that your intention is lost in the verbiage. Again, I&apos;m not claiming innocence of these sins of code. But over the years I&apos;ve become considerably more &lt;em&gt;aware&lt;/em&gt; of the costs and benefits in the choices between brevity and verbosity. Perhaps clarity is in the eye of beholder or perhaps more narrowly, in the eye of the author. But I try to look at my own code objectively and ask, &quot;If I don&apos;t see this code for six months and then come back to it to do some maintenance, will today&apos;s intent be clear?&quot; I hope the code I write will be approachable by those who come behind me to work on it, especially if it&apos;s me lest I ask myself the WWIT question.
  904. &lt;/p&gt;
  905. &lt;p&gt;
  906. Sigh, I&apos;m venting because I just got side tracked refactoring some program code (and its single test) that lacked clarity. Thanks for indulging me this far. I&apos;m gonna go listen to some old &lt;a href=&quot;;&gt;Social Distortion&lt;/a&gt; now, have a great weekend!
  907. &lt;/p&gt;
  908. &lt;p&gt;&lt;em&gt;
  909. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;programming&lt;/a&gt; &amp;nbsp;
  910. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;wizardry&lt;/a&gt; &amp;nbsp;
  911. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;perl&lt;/a&gt; &amp;nbsp;
  912. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;python&lt;/a&gt; &amp;nbsp;
  913. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ruby&lt;/a&gt; &amp;nbsp;
  914. &lt;/em&gt;&lt;/p&gt;
  916. </description>          </item>
  917.    <item>
  918.    <guid isPermaLink="true"></guid>
  919.    <title>Inbloguration: One Week Later</title>
  920.    <dc:creator>spidaman</dc:creator>
  921.    <link></link>
  922.        <pubDate>Tue, 27 Jan 2009 12:41:39 -0800</pubDate>
  923.    <category>Musings</category>
  924.            <description>&lt;p&gt;
  925. &lt;a href=&quot;; title=&quot;The White House Blog&quot;&gt;
  926. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;267&quot; height=&quot;115&quot; /&gt;&lt;/a&gt;
  927. As mentioned last week on the &lt;a href=&quot;;&gt;Technorati blog&lt;/a&gt;, Technorati was crawling the new &lt;a href=&quot;; title=&quot;The White House Blog&quot;&gt;White House blog&lt;/a&gt; within a day of its launch. Most of the blogosphere doesn&apos;t require individual customization in our crawling framework but in some special cases, it must be done. The White House blog is a prime example of why this is so but I&apos;m pleased to report that Technorati&apos;s new crawling technology makes what was impossible with our old crawler easy with the new one.
  928. &lt;/p&gt;
  929. &lt;p&gt;
  930. Given the volume of moderation that&apos;d be required, it doesn&apos;t surprise me that the posts don&apos;t take comments. But there are other more basic blogging practices of concern:
  931. &lt;ul&gt;
  932. &lt;li&gt;It doesn&apos;t have clear feed discovery. There are multiple &lt;code&gt;rel=&quot;alternate&quot;&lt;/code&gt; elements in the &lt;code&gt;head&lt;/code&gt; section of the HTML document.&lt;/li&gt;
  933. &lt;li&gt;The permalinks are irregular; the first few were under the blog URL, the rest have been under other paths on the site.&lt;/li&gt;
  934. &lt;li&gt;The HTML doesn&apos;t have any of the common CSS attributes that indicate structural semantics; if I get to vote on this, I&apos;ll opt for hAtom&lt;/li&gt;
  935. &lt;/ul&gt;
  936. The absence of full content feeds or full content on the front page isn&apos;t a problem for Technorati&apos;s new crawler; it can crawl the post pages and extract content to index from those.
  937. &lt;/p&gt;
  938. &lt;p&gt;
  939. So how has the blog done in the last week? Well, it emerged in the top 1000 just &lt;em&gt;five days&lt;/em&gt; after its inception. Keep an eye on the blog&apos;s &lt;a href=&quot;;&gt;Technorati blog info page&lt;/a&gt; - it&apos;s currently ranked 882 (1,876 links from 1440 blogs). Many of the links are to main blog page, citing its existence. But the majority of the links were to the kick-off post (date line reads: &quot;Tuesday, January 20th, 2009 at 12:01 pm&quot;) and the inaugural address. Here are the posts and their link counts:
  940. &lt;ul&gt;
  941. &lt;li&gt;&lt;a href=&quot;;&gt;Change has come to;/a&gt; - 619 links from 552 blogs&lt;/li&gt;
  942. &lt;li&gt;&lt;a href=&quot;;&gt;President Barack Obama&apos;s Inaugural Address&lt;/a&gt; - 217 links from 194 blogs&lt;/li&gt;
  943. &lt;li&gt;&lt;a href=&quot;;&gt;A National Day of Renewal and Reconciliation&lt;/a&gt; - 146 links from 137 blogs&lt;/li&gt;
  944. &lt;li&gt;&lt;a href=&quot;;&gt;President Obama delivers Your Weekly Address&lt;/a&gt; - 103 links from 97 blogs&lt;/li&gt;
  945. &lt;li&gt;&lt;a href=&quot;;&gt;Statement released after the President rescinds &quot;Mexico City Policy&quot;&lt;/a&gt; - 34 links from 33 blogs&lt;/li&gt;
  946. &lt;li&gt;&lt;a href=&quot;;&gt;Executive Orders to date&lt;/a&gt; - 27 links from 27 blogs&lt;/li&gt;
  947. &lt;li&gt;&lt;a href=&quot;;&gt;The Whistle Stop Tour&lt;/a&gt; - 26 links from 24 blogs&lt;/li&gt;
  948. &lt;li&gt;&lt;a href=&quot;;&gt;Honoring Dr. King&apos;s Legacy and Serving America&lt;/a&gt;  - 22 links from 20 blogs&lt;/li&gt;
  949. &lt;li&gt;&lt;a href=&quot;;&gt;From peril to progress&lt;/a&gt; - 17 links from 17 blogs&lt;/li&gt;
  950. &lt;li&gt;&lt;a href=&quot;;&gt;Now Comes Lilly Ledbetter&lt;/a&gt; - 15 links from 13 blogs&lt;/li&gt;
  951. &lt;li&gt;&lt;a href=&quot;;&gt;58 years of Indian democracy&lt;/a&gt; - 4 links from 4 blogs&lt;/li&gt;
  952. &lt;li&gt;&lt;a href=&quot;;&gt;The year of the ox&lt;/a&gt; - 3 links from 3 blogs&lt;/li&gt;
  953. &lt;li&gt;&lt;a href=&quot;;&gt;Timothy Geithner sworn in as Secretary of the Treasury&lt;/a&gt; - 3 links from 3 blogs&lt;/li&gt;
  954. &lt;li&gt;&lt;a href=&quot;;&gt;Press Briefing Highlights&lt;/a&gt; - 3 links from 3 blogs&lt;/li&gt;
  955. &lt;li&gt;&lt;a href=&quot;;&gt;President Obama on the Selection of Kirsten Gillibrand&lt;/a&gt; - 2 links from 2 blogs&lt;/li&gt;
  956. &lt;/ul&gt;
  957. &lt;/p&gt;
  958. &lt;p&gt;
  959. It&apos;s really encouraging to see the White House, specifically &lt;a href=&quot;;&gt;Macon Phillips&lt;/a&gt;, posting updates about President Obama&apos;s policies and political activities. Going forward, I hope to see more consistent publishing practices. For instance, should slug words be separated by underscores or hyphens? Should the proper names in URL slugs be mixed case (e.g. Timothy_Geithner_sworn_in) or down cased (e.g. now-comes-lilly-ledbetter)? It&apos;s less important which one but just pick one and stick to it! Also, the White House Blog should use durable URLs for permalinks: there&apos;s a posting with the path &lt;code&gt;/blog_post/PressBriefingHighlights/&lt;/code&gt;, another with &lt;code&gt;/president-obama-delivers-your-weekly-address&lt;/code&gt; - what are they going to use for the next post with highlights from a press briefing or next week&apos;s weekly address? If Mr. Phillips needs any further advise on effective blog publishing technology, I&apos;m easy to find and happy to be of service.
  960. &lt;/p&gt;
  961. &lt;p&gt;&lt;em&gt;
  962. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;whitehouse&lt;/a&gt; &amp;nbsp;
  963. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;white house blog&lt;/a&gt; &amp;nbsp;
  964. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;blogging&lt;/a&gt; &amp;nbsp;
  965. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;blog+technology&lt;/a&gt; &amp;nbsp;
  966. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;obama&lt;/a&gt; &amp;nbsp;
  967. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  968. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;inbloguration&lt;/a&gt; &amp;nbsp;
  969. &lt;/em&gt;&lt;/p&gt;
  972. </description>          </item>
  973.    <item>
  974.    <guid isPermaLink="true"></guid>
  975.    <title>Downturn, what downturn?</title>
  976.    <dc:creator>spidaman</dc:creator>
  977.    <link></link>
  978.        <pubDate>Thu, 25 Dec 2008 13:20:14 -0800</pubDate>
  979.    <category>Musings</category>
  980.            <description>&lt;p&gt;
  982. &lt;a href=&quot;; title=&quot;Data centers&quot;&gt;
  983. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;127&quot; height=&quot;132&quot; /&gt;&lt;/a&gt;
  985. Just the other day, &lt;em&gt;Data Center Knowledge&lt;/em&gt; asked &lt;a href=&quot;;&gt;Are Colocation Prices Heading Higher?&lt;/a&gt; My immediate reaction was, that&apos;s a stupid question: last time VC funding went into hibernation, data center space was suddenly cheap and abundant. The article suggested that companies operating their own data centers will run to the colos as a cost cutting measure. Maybe, but I&apos;m not so sure. Data center migrations can be expensive, risky operations. Methinks that the F500&apos;s inclined to undertake a migration would have done so already. The article cited a report emphasizing a shift from capital expenses to operating expenses.
  986. &lt;blockquote cite=&quot;;&gt;
  987. Tier 1 says demand for data center space grew 14 percent over the past 12 months, while supply grew by just 6 percent, &quot;exacerbating an already lopsided supply/demand curve.&quot;
  988. &lt;/blockquote&gt;
  989. However, &lt;a href=&quot;;&gt;Tier 1 attributed the demand&lt;/a&gt;, &quot;especially, (to) the primacy of the Internet as a vehicle for service and application delivery.&quot; With the litany of Techcrunch &lt;a href=&quot;;&gt;deadpool&lt;/a&gt;
  990. reports, I&apos;m finding it difficult to believe that the data center space supply/demand will continue skewing.
  991. &lt;/p&gt;
  992. &lt;p&gt;
  993. Sure, it&apos;s not all bad news. Fred Wilson reports that Union Square Ventures will be &lt;a href=&quot;;&gt;Investing In Thick and Thin&lt;/a&gt;. Acknowledging that, &quot;it is easier to invest in thin times. The difficult business climate starts to separate the wheat from the chaff and the strong companies are revealed.&quot; Wilson goes on to say
  994. &lt;blockquote cite=&quot;;&gt;
  995. I don&apos;t feel that its possible, or wise, or prudent to attempt to time these (venture investment) cycles.
  996. &lt;br/&gt;
  997. Our approach is to manage a modest amount of capital (in our case less than $300 million across two active funds) and deploy it at roughly $40 million per year, year in and year out no matter what part of the cycle we are in.
  998. &lt;br/&gt;
  999. That way we&apos;ll be putting out money at the top of the market but also at the bottom of the market and also on the way up and the way down. The valuations we pay will average themselves out and this averaging allows us to invest in the underlying value creation process and not in the market per se.
  1000. &lt;/blockquote&gt;
  1001. Yes, the economy is gyrating in pain, but the four horsemen aren&apos;t galloping nearby. So take a pill, catch your breath and deal with it: the sun will come out, just don&apos;t bother trying to time it too carefully.
  1002. &lt;/p&gt;
  1003. &lt;p&gt;
  1004. Now, there&apos;s no shortage of reasons for gloom and doom: mega-ponzi schemes collapsing, banks and real estate combusting, the big 3 in various states of failure, yet &lt;a href=&quot;;&gt;BMW North America will raise list prices 0.7%&lt;/a&gt;. Before the complete credit breakdown, real estate volume was actually rising in a lot of places (ergo: prices were aligning supply and demand). I was at a William-Sonoma store in Albuquerque the other day, the place was mobbed. My point is that while the economy is retrenching (or the country is &lt;a href=&quot;;&gt;rebooting&lt;/a&gt;), the detritus will be separated (Wilson&apos;s wheat from chaff) and data center space should be cheap and abundant. Everything seems fine to me. At least until the next bubble.
  1005. &lt;/p&gt;
  1006. &lt;p&gt;
  1007. For those of you observing that sort of thing, Merry Christmas!
  1008. &lt;/p&gt;
  1009. &lt;p&gt;&lt;em&gt;
  1010. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;colocation&lt;/a&gt; &amp;nbsp;
  1011. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;data centers&lt;/a&gt; &amp;nbsp;
  1012. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;economy&lt;/a&gt; &amp;nbsp;
  1013. &lt;/em&gt;&lt;/p&gt;
  1016. </description>          </item>
  1017.    <item>
  1018.    <guid isPermaLink="true"></guid>
  1019.    <title>Another Hadoop-backended Database: CloudBase</title>
  1020.    <dc:creator>spidaman</dc:creator>
  1021.    <link></link>
  1022.        <pubDate>Tue, 23 Dec 2008 16:02:21 -0800</pubDate>
  1023.    <category>Java</category>
  1024.            <description>&lt;p&gt;
  1026. &lt;a href=&quot;; title=&quot;Hadoop&quot;&gt;
  1027. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;300&quot; height=&quot;71&quot; /&gt;&lt;/a&gt;
  1029. This post to one of the Hadoop mailing lists caught my eye, &lt;a href=&quot;;&gt;Announcing CloudBase-1.1 release&lt;/a&gt;. Wait, wasn&apos;t Cloudbase the embedded database company that IBM acquired several years back but ended up donating the product to the Apache Software Foundation as &lt;a href=&quot;;&gt;Derby&lt;/a&gt;? No, not that Cloudbase. This is apparently another project that aims to provide data warehousing on top of Hadoop.
  1030. &lt;/p&gt;
  1031. &lt;p&gt;
  1032. I&apos;ve been watching the emergence of &lt;a href=&quot;;&gt;HBase&lt;/a&gt;, &lt;a href=&quot;;&gt;Hypertable&lt;/a&gt; and most recently &lt;a href=&quot;;&gt;the proposed incubation of Facebook&apos;s Cassandra&lt;/a&gt; with great interest. The first two are modeled from Google&apos;s &lt;a href=&quot;;&gt;BigTable&lt;/a&gt; but all are essentially horizontally scalable column oriented databases. The developers of these systems explicitly steer away having their technologies pegged as relational databases, with the refrain: &quot;We don&apos;t do joins.&quot; What the &lt;a href=&quot;;&gt;CloudBase&lt;/a&gt; project aims to do is &lt;em&gt;not&lt;/em&gt; model themselves on BigTable but to explicitly support joins between tables built on top of an HDFS cluster. It looks like they&apos;ve posted extensive documentation and have released a JDBC driver, pretty cool! This is the most interesting database initiative I&apos;ve seen since &lt;a href=&quot;;&gt;GreenPlum announced their support for mapreduce&lt;/a&gt;.
  1033. &lt;/p&gt;
  1034. &lt;p&gt;
  1035. Yes, as far as scale-out data analytics, we live in interesting times.
  1036. &lt;/p&gt;
  1037. &lt;p&gt;&lt;em&gt;
  1038. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;mapreduce&lt;/a&gt; &amp;nbsp;
  1039. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;hadoop&lt;/a&gt; &amp;nbsp;
  1040. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;hbase&lt;/a&gt; &amp;nbsp;
  1041. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;hypertable&lt;/a&gt; &amp;nbsp;
  1042. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;jdbc&lt;/a&gt; &amp;nbsp;
  1043. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cloudbase&lt;/a&gt; &amp;nbsp;
  1044. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;bigtable&lt;/a&gt; &amp;nbsp;
  1045. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;derby&lt;/a&gt; &amp;nbsp;
  1046. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;greenplum&lt;/a&gt; &amp;nbsp;
  1048. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1049.    <item>
  1050.    <guid isPermaLink="true"></guid>
  1051.    <title>Python SVN Bindings, Trac and mod_python</title>
  1052.    <dc:creator>spidaman</dc:creator>
  1053.    <link></link>
  1054.        <pubDate>Sun, 21 Dec 2008 14:55:24 -0800</pubDate>
  1055.    <category>LAMP</category>
  1056.            <description>&lt;p&gt;
  1057. &lt;a href=&quot;; title=&quot;Trac&quot;&gt;
  1058. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;214&quot; height=&quot;61&quot; /&gt;&lt;/a&gt;
  1060. I have some code I want to noodle on outside of work. Since I&apos;m on a holiday break, I&apos;m doing a bit of that (yes, this &lt;em&gt;is&lt;/em&gt; what I do for fun, so?). In the past, I had used my own private CVS server for those kinds of things but these days, I could just as well live without CVS. I decided to roll a subversion server into my Apache build (the latest Apache + other modules aren&apos;t in the yum repositories for my distro, so I roll my own). While I&apos;m putting a subversion server up, why not &lt;a href=&quot;;&gt;trac&lt;/a&gt;, too? Heh, that&apos;s where things got stuck.
  1061. &lt;/p&gt;
  1062. &lt;p&gt;
  1063. When I installed the subversion dependencies (specifically, &lt;a href=&quot;;&gt;neon&lt;/a&gt;), I just used vanilla build params. After installing subversion, I was surprised that Trac couldn&apos;t access it. It turns out that the litmus test was this:
  1064. &lt;pre&gt;
  1065. $ python
  1066. Python ...
  1067. &amp;gt;&amp;gt;&amp;gt; from svn import core
  1068. &lt;/pre&gt;
  1069. failed miserably. Various recompile efforts seemed to move the problem around. I saw a variety of the symptoms described in the Trac-Subversion integration docs &lt;a href=&quot;;&gt;troubleshooting&lt;/a&gt; section. The missing &lt;code&gt;gss_delete_sec_context&lt;/code&gt; symbol error was apparently the telltale critical one, it originated from neon having been compiled without SSL support. The neon compile config that led to success was
  1070. &lt;pre&gt;
  1071. ./configure --enable-shared --enable-static --with-ssl=openssl
  1072. &lt;/pre&gt;
  1073. Then the real key was to completely start over with the subversion compile, not just the &lt;a href=&quot;;&gt;swig&lt;/a&gt; python bindings.
  1074. &lt;pre&gt;
  1075. make clean
  1076. ./configure \
  1077. --with-berkeley-db=/usr/local/BerkeleyDB.4.7 \
  1078. --prefix=/usr/local \
  1079. --with-apxs=/usr/local/httpd2.2.11/bin/apxs \
  1080. --with-apr=/usr/local/apr \
  1081. --with-apr-util=/usr/local/apr
  1082. make
  1083. make swig-py
  1084. make check-swig-py
  1085. make install
  1086. make install-swig-py
  1087. ldconfig
  1088. &lt;/pre&gt;
  1089. Only then did the litmus test above pass. One of the things about this setup that is kind of a nuisance is that the python bindings didn&apos;t get installed into &lt;code&gt;site-packages&lt;/code&gt;, therefore &lt;a href=&quot;;&gt;mod_python&lt;/a&gt; was quite unhappy. Also, trac seemed to want to put its eggs in the root directory. So the Apache server&apos;s &lt;code&gt;envvars&lt;/code&gt; script has these variables exported to work around those issues
  1090. &lt;pre&gt;
  1091. PYTHONPATH=/usr/local/lib/svn-python
  1092. LD_LIBRARY_PATH=/usr/local/lib/svn-python/libsvn
  1093. PYTHON_EGG_CACHE=/data1/egg_cache
  1094. &lt;/pre&gt;
  1095. The result (including the requisite &lt;code&gt;httpd.conf&lt;/code&gt; tweaks) is a working subversion 1.54 and trac 0.11 setup. It was more fiddling for the evening than I&apos;d hoped for and I&apos;m not sure my foibles and remedies were optimal (clearly, I missed an RTFM somewhere) but I hope this resolution helps at least one reader.
  1096. &lt;/p&gt;
  1097. &lt;p&gt;
  1098. Happy Hannukah and winter solstice!
  1099. &lt;/p&gt;
  1100. &lt;p&gt;&lt;em&gt;
  1101. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;apache&lt;/a&gt; &amp;nbsp;
  1102. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;mod_python&lt;/a&gt; &amp;nbsp;
  1103. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;trac&lt;/a&gt; &amp;nbsp;
  1104. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;neon&lt;/a&gt; &amp;nbsp;
  1105. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;subversion&lt;/a&gt; &amp;nbsp;
  1106. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;swig&lt;/a&gt; &amp;nbsp;
  1107. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;python&lt;/a&gt; &amp;nbsp;
  1108. &lt;/em&gt;&lt;/p&gt;
  1109. </description>          </item>
  1110.    <item>
  1111.    <guid isPermaLink="true"></guid>
  1112.    <title>World Leader Reflex Tests</title>
  1113.    <dc:creator>spidaman</dc:creator>
  1114.    <link></link>
  1115.        <pubDate>Mon, 15 Dec 2008 21:35:52 -0800</pubDate>
  1116.    <category>Musings</category>
  1117.            <description>&lt;p&gt;
  1118. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;124&quot; height=&quot;83&quot; /&gt;
  1119. Will Chuck-The-Shoe-At-The-World-Leader be an Olympic sport in the years ahead? Since finishing with dinner this evening, I&apos;ve found no less than three flash games and a compendium of animated GIF satires.
  1120. &lt;ul&gt;
  1121. &lt;li&gt;&lt;a href=&quot;;&gt;Shoe Attack On President Already Turned Into A Crappy Flash Game&lt;/a&gt; (Kotaku)&lt;/li&gt;
  1122. &lt;li&gt;&lt;a href=&quot;;&gt;Sock and Awe&lt;/a&gt;&lt;/li&gt;
  1123. &lt;li&gt;&lt;a href=&quot;;&gt;The Bush Game&lt;/a&gt;&lt;/li&gt;
  1124. &lt;li&gt;&lt;a href=&quot;;&gt;Iraq Shoe Tosser Guy: The Animated Gifs&lt;/a&gt; (Boing Boing)&lt;/li&gt;
  1125. &lt;/ul&gt;
  1126. I bet Jon Stewart is pissed that this had to happen two days before his last show of the year. There&apos;s still a month left for more Dubya foibles, cut the vacation short Stewart! In the meantime,  keep it safe kids.
  1127. &lt;/p&gt;
  1128. &lt;p&gt;&lt;em&gt;
  1129. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;shoe toss&lt;/a&gt; &amp;nbsp;
  1130. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;bush&lt;/a&gt; &amp;nbsp;
  1131. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;humor&lt;/a&gt; &amp;nbsp;
  1132. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1133.    <item>
  1134.    <guid isPermaLink="true"></guid>
  1135.    <title>OpenEdge vs. Net Neutrality vs. CDN</title>
  1136.    <dc:creator>spidaman</dc:creator>
  1137.    <link></link>
  1138.        <pubDate>Sun, 14 Dec 2008 22:52:25 -0800</pubDate>
  1139.    <category>Musings</category>
  1140.            <description>&lt;p&gt;
  1141. &lt;a href=&quot;; title=&quot;Wall Street Journal&quot;&gt;
  1142. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;184&quot; height=&quot;276&quot; /&gt;&lt;/a&gt;
  1143. The Wall Street Journal reported today that &lt;a href=&quot;;&gt;Google Wants Its Own Fast Track on the Web&lt;/a&gt;, describing it as an example of the decline of support for &lt;a href=&quot;;&gt;net neutrality&lt;/a&gt; amongst the The Powers That Be (the usual suspects: Google, Yahoo, Microsoft, Amazon). Plenty of deals have been getting struck anyway between TPTB and data carriers (most prominently AT&amp;amp;T + Yahoo DSL) but outright transit preference doesn&apos;t seem to be an issue here. What Google appears to be getting into, called &lt;em&gt;OpenEdge&lt;/em&gt;, sounds like an arrangement that amounts to co-locating their gear in the major carrier&apos;s datacenters. This would move serving capacity closer to the end-users of their services and thereby accelerate the user experience. Since it doesn&apos;t concern transit per se, this actually doesn&apos;t sound like a net neutrality issue at all, it sounds like another form of datacenter dispersion.
  1144. &lt;/p&gt;
  1145. &lt;p&gt;
  1146. So what exactly is the big deal? All of the TPTB and loads of other online services have &lt;a href=&quot;;&gt;content delivery network&lt;/a&gt; (CDN) deals. Yahoo, Amazon, Facebook... they all operate or partner with a CDN in some shape or form (full disclosure: I&apos;ve been working on a CDN evaluation for &lt;a href=&quot;;&gt;Technorati&lt;/a&gt;). With a CDN, publishers pay specifically to have their content cached at points-of-presence (PoP) around the intertubes that, through some DNS and routing magic, enables web content to get to end-users more quickly. The next step beyond a CDN is to put equipment in the carrier&apos;s datacenter. Here&apos;s what WSJ said
  1147. &lt;blockquote cite=&quot;;&gt;
  1148. Google&apos;s proposed arrangement with network providers, internally called OpenEdge, would place Google servers directly within the network of the service providers, according to documents reviewed by the Journal. The setup would accelerate Google&apos;s service for users. Google has asked the providers it has approached not to talk about the idea, according to people familiar with the plans.
  1149. &lt;br/&gt;
  1150. Asked about OpenEdge, Google said only that other companies such as Yahoo and Microsoft could strike similar deals if they desired. But Google&apos;s move, if successful, would give it an advantage available to very few.
  1151. &lt;/blockquote&gt;
  1152. It seems perfectly logical, actually.
  1153. &lt;/p&gt;
  1154. &lt;p&gt;
  1155. Nonetheless, I am concerned about wavering support for net neutrality. Lawrence Lessig, fresh off of his &lt;a href=&quot;;&gt;Big News&lt;/a&gt; post concerning setting up shop at Harvard Law School, is quoted as saying
  1156. &lt;blockquote  cite=&quot;;&gt;
  1157. There are good reasons to be able to prioritize traffic. If everyone had to pay the same rates for postal service, than you wouldn&apos;t be able to differentiate between sending a greeting card to your grandma versus sending an overnight letter to your lawyer.
  1158. &lt;/blockquote&gt;
  1159. But the counter argument says that there&apos;s a big difference.  Grandma isn&apos;t trying to compete with your attorney (at least, not usually). If the big guys are paying more to be faster, who will be able afford to challenge them? The intertubularly rich will get richer, the poor will be stay poor. The TPTB will ensconce themselves as dynastic media walking on paths paved with gold while all of us commoners walk in the gutter.
  1160. &lt;/p&gt;
  1161. &lt;p&gt;
  1162. The dumb pipes should stay dumb. If an internet service wants to operate out of multiple datacenters, lease dedicated pipes to accelerate their inter-datacenter data distribution and peer with the carrier&apos;s PoPs proximate to their datacenters, mazel tov. This can be augmented with CDNs. It can even be taken to the next step by directly installing the carrier&apos;s datacenters. But at the network exchanges and pipes connecting them, everyone&apos;s packets should remain equal.
  1163. &lt;/p&gt;
  1164. &lt;p&gt;
  1165. &lt;strong&gt;UPDATE&lt;/strong&gt;
  1166. &lt;a href=&quot;;&gt;GigaOM&lt;/a&gt; posted about a clarification from Google which says that the WSJ was &amp;quot;confused&amp;quot;. The hubbub in that article really was misplaced, it&apos;s a CDN deal.
  1167. &lt;/p&gt;
  1168. &lt;p&gt;&lt;em&gt;&lt;a href=&quot;; rel=&quot;tag&quot;&gt;google&lt;/a&gt; &amp;nbsp;
  1169. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cdn&lt;/a&gt; &amp;nbsp;
  1170. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;content delivery network&lt;/a&gt; &amp;nbsp;
  1171. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;net neutrality&lt;/a&gt; &amp;nbsp;
  1172. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;wall street journal&lt;/a&gt; &amp;nbsp;
  1173. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1174.    <item>
  1175.    <guid isPermaLink="true"></guid>
  1176.    <title>Cloud Hype, An Amazon Web Services Post-Mortem</title>
  1177.    <dc:creator>spidaman</dc:creator>
  1178.    <link></link>
  1179.        <pubDate>Wed, 10 Dec 2008 23:53:19 -0800</pubDate>
  1180.    <category>Musings</category>
  1181.            <description>&lt;p&gt;
  1182. &lt;a href=&quot;; title=&quot;Amazon Web Services&quot;&gt;
  1183. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;164&quot; height=&quot;60&quot; /&gt;&lt;/a&gt;
  1184. In the last few years, the scope of Amazon Web Services (AWS) has broadened to cover a range of infrastructure capabilities and has emerged as a game changer.   The hype around AWS isn&apos;t all wrong, a whole ecosystem of tools and services has developed around AWS that makes the offering compelling. However, the hype isn&apos;t all right either.  At Technorati, we used AWS this year to develop and put in production a new crawler and a system that produces the web page screenshot thumbnails now seen on search result pages. But now that that chapter is coming to a close, it&apos;s time to retrospect.
  1185. &lt;/p&gt;
  1186. &lt;p&gt;
  1187. &lt;img src=&quot;; style=&quot;float:left; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;357&quot; height=&quot;106&quot; /&gt;
  1188. There&apos;s a prevailing myth that using the elasticity of EC2 makes it cheaper to operate than fixed assets. The theory is that by shutting down unneeded infrastructure during the lulls, you&apos;re saving money. In a purely fixed infrastructure model, Technorati&apos;s data aquisition systems must be provisioned for their maximum utilization capacity threshold. When utilization ebbs, a lot of that infrastructure sits relatively idle. That much is true but the reality is that flexible capacity is only saving money relative to the minimum requirements. So the theory only holds if your variability is high compared to your minimum. That is, if the difference between your minimum and maximum capacity is large or you&apos;re not operating a 365/7/24 system but episodically using a lot of infrastructure and then shutting it down. Neither is true for us. The normal operating mode of Technorati&apos;s data acquisition systems follows the ebb and flow of the blogosphere, which varies a lot but is always on. The sketch to the left shows the minimum capacity and the variable capacity distinguished.
  1189. &lt;/p&gt;
  1190. &lt;p&gt;
  1191. In response to some of the fallacies posted on an O&apos;Reilly blog the other day (by George Reese), &lt;a href=&quot;;&gt;On Why I Don&apos;t Like Auto-Scaling in the Cloud&lt;/a&gt;, Don MacAskill from SmugMug wrote a really great post yesterday about his SkyNet system, &lt;a href=&quot;;&gt;On Why Auto-Scaling in the Cloud Rocks&lt;/a&gt;. Don also emphasizes SmugMugs modest requirements for operations staff. In an application with sufficient simplicity and automation around it, it&apos;s easy to imagine a 365/7/24 service having meager ops burdens. I think we should surmise that the cost of operating SmugMug with autonomic de/provisioning works because it fits their operating model. I understand Reese&apos;s concern, that folks may not do the hard work of really understanding their capacity requirements if they&apos;re too coddled by automation. However, that concern comes off as a shill for John Allspaw&apos;s capacity planning book (which I&apos;m sure is great, can&apos;t wait to read it). Bryan Duxbury from RapLeaf describes their use of AWS and how the numbers work out in his post, &lt;a href=&quot;;&gt;Rent or Own: Amazon EC2 vs. Colocation Comparison for Hadoop Clusters&lt;/a&gt;. Since the target is to serve a Hadoop infrastructure,  AWS must get a thumbs down in their case. Hadoop&apos;s performance is impaired by poor rack locality and the latencies of Amazon&apos;s I/O systems clearly drags it down. If you&apos;re going to be running Hadoop on a continuous basis, use your own racks, with your own switches and your own disk spindles.
  1192. &lt;/p&gt;
  1193. &lt;p&gt;
  1194. At Technorati, we&apos;re migrating the crawl infrastructure from AWS to our colo. While I love the flexibility that AWS provides and it&apos;s been great using it as a platform to  ramp up on , the bottom line is that Technorati has a pre-existing investment in machines, racks and colo infrastructure. As much as I&apos;d like our colo infrastructure to operate with lower labor and communication overhead, running on AWS has amounted to additional costs that we must curtail.
  1195. &lt;/p&gt;
  1196. &lt;p&gt;
  1197. Cloud computing (or &lt;a href=&quot;;&gt;utility computing&lt;/a&gt; or &lt;a href=&quot;;&gt;flex computing&lt;/a&gt; or whatever its called) &lt;em&gt;is&lt;/em&gt; a game changer. So when do I recommend you use AWS? Ideally: anytime. If your application is architected to expand and contract its footprint with the demands put upon it, provision your minimum capcacity requirements in your colo and use AWS to &quot;burst&quot; when your load demands it. Another case where using AWS is a big win is for a total green field. If you don&apos;t have a colo, are still determining the operating charactersics of your applications and need machines provisioned, AWS is an incredible resource. However, I think the flexibility vs. economy imperatives will always lead you to optimize your costs by provisioning your minimum capacity in infrastructure that you own and operate.
  1198. &lt;/p&gt;
  1199. &lt;p&gt;
  1200. There&apos;s also another option: instead of buying and operating your own machines and racks, you may be able to optimize costs by renting machines provisioned to your specs in a contract from the services that have established themselves in that market (Rackspace, Server Beach, ServePath, LayeredTech, etc). Ultimately, I&apos;m looking forward to the emergence of a compute market place where the decisions to incur capital expense, rent by the hour or rent under a contract will be easier to traverse.
  1201. &lt;/p&gt;
  1202. &lt;p&gt;&lt;em&gt;
  1203. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;amazon web services&lt;/a&gt; &amp;nbsp;
  1204. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;aws&lt;/a&gt; &amp;nbsp;
  1205. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cloud computing&lt;/a&gt; &amp;nbsp;
  1206. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;rapleaf&lt;/a&gt; &amp;nbsp;
  1207. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  1208. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;smugmug&lt;/a&gt; &amp;nbsp;
  1209. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;hadoop&lt;/a&gt; &amp;nbsp;
  1210. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;oreilly&lt;/a&gt; &amp;nbsp;
  1211. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;data centers&lt;/a&gt; &amp;nbsp;
  1212. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;capacity planning&lt;/a&gt; &amp;nbsp;
  1213. &lt;/em&gt;&lt;/p&gt;
  1214. </description>          </item>
  1215.    <item>
  1216.    <guid isPermaLink="true"></guid>
  1217.    <title>The Solar Decade</title>
  1218.    <dc:creator>spidaman</dc:creator>
  1219.    <link></link>
  1220.        <pubDate>Tue, 9 Dec 2008 23:55:24 -0800</pubDate>
  1221.    <category>Musings</category>
  1222.            <description>&lt;SCRIPT TYPE=&quot;text/javascript&quot;&gt;
  1223. &lt;!--
  1224. function popup(mylink, windowname)
  1225. {
  1226. if (! window.focus)return true;
  1227. var href;
  1228. if (typeof(mylink) == &apos;string&apos;)
  1229.   href=mylink;
  1230. else
  1231.   href=mylink.href;
  1232., windowname, &apos;width=720,height=630,scrollbars=yes&apos;);
  1233. return false;
  1234. }
  1235. //--&gt;
  1236. &lt;/SCRIPT&gt;
  1237. &lt;p&gt;
  1238. &lt;a href=&quot;; onClick=&quot;return popup(this, &apos;The Graph&apos;)&quot; title=&quot;Fast Company&quot;&quot;&gt;
  1239. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;227&quot; height=&quot;198&quot; /&gt;&lt;/a&gt;
  1240. Ten years ago, you might have been advised that solar energy, while sounding nice, was a bad investment. The installations were failure prone and not cost effective. I don&apos;t know if I bought that then, I know of solar panels in San Francisco installed in the 80&apos;s that paid for themselves, just slowly. But what we&apos;re seeing isn&apos;t your father&apos;s solar panel. From &lt;a href=&quot;;&gt;Google&apos;s solar panels&lt;/a&gt; to residential rooftops, it seems pretty clear that the &lt;a href=&quot;;&gt;
  1241. Economics of Solar Power Are Looking Brighter&lt;/a&gt;. Fast Company is running an article &lt;a href=&quot;;&gt;The Solar Industry Gains Ground&lt;/a&gt; that sounds a chord that we&apos;re hearing a lot of. Solar energy is getting more and more cost effective. What&apos;s projected is that the cost of solar power may share up-and-to-the-right properties of &lt;a href=&quot;;s_law&quot;&gt;Moore&apos;s Law&lt;/a&gt;. The fabs that make the silicon enabling you to read this may also enable an energy giant leap forward. The Germans have their own &quot;Solar Valley&quot; and their industry projection &lt;a href=&quot;; onClick=&quot;return popup(this, &apos;The Graph&apos;)&quot;&gt;graph&lt;/A&gt; appears pretty Moorish (look at the large yellow area).
  1242. &lt;/p&gt;
  1243. &lt;P&gt;
  1244. The big lift off is 10 years away but the investment that has been made in the area and the advances being made seem to put the benefits close at hand. But the big win, when dependence on fossil fuels are on a clear decline, is at leat 10 and 20 years out. But I think it can happen, I think the solar decade is coming. It should be the coming decade. However, it will require an Apollo-mission like focus from the Obama administration to succeed. And I hope we can make it a reality.
  1245. &lt;/p&gt;
  1246. &lt;p&gt;&lt;em&gt;
  1247. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;solar energy&lt;/a&gt; &amp;nbsp;
  1248. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;obama&lt;/a&gt; &amp;nbsp;
  1249. &lt;/em&gt;&lt;/p&gt;
  1250. </description>          </item>
  1251.    <item>
  1252.    <guid isPermaLink="true"></guid>
  1253.    <title>Good Bye, Perl</title>
  1254.    <dc:creator>spidaman</dc:creator>
  1255.    <link></link>
  1256.        <pubDate>Mon, 8 Dec 2008 00:01:24 -0800</pubDate>
  1257.    <category>LAMP</category>
  1258.            <description>&lt;p&gt;
  1259. &lt;a href=&quot;; title=&quot;Perl&quot;&gt;
  1260. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;72&quot; height=&quot;81&quot; /&gt;&lt;/a&gt;
  1261. The other day, I was patching some Perl code. There I was, in the zone, code streaming off of my finger tips. But wait, I was writing Python in the middle of a Perl subroutine. Um. I found the bare word and missing semi-colon errors invoking &lt;code&gt;perl -cw;/code&gt; amusing. How did &lt;em&gt;that&lt;/em&gt; happen?
  1262. &lt;/p&gt;
  1263. &lt;p&gt;
  1264. Truth is, I find myself rarely using Perl anymore. I spent years building applications with Perl. Having made extensive use of mod_perl APIs and various CPAN modules, studied the Talmudic wisdom of Damian Conway, struggled with the double-edged sword of &lt;a href=&quot;;&gt;TMTOWTDI&lt;/a&gt; and rolled my eyes at the Perl haters for their failure to appreciate the strange poetry that is Perl it&apos;d seem like a safe bet that Perl would remain on my top shelf. A lot of the complaints of Perl haters seem superficial (&quot;ewe, all of those punctuation characters&quot;, shaddup). Yet, Perl has been long in the tooth, for a long time. I recall 5 years ago thinking that Perl 6 wasn&apos;t &lt;em&gt;too&lt;/em&gt; far away (after all, O&apos;Reilly published &lt;a href=&quot;;&gt;Perl 6 Essentials&lt;/a&gt; in June 2003). I&apos;m sorry, my dear Perl friends, insistence that &lt;a href=&quot;;&gt;Perl is Alive&lt;/a&gt; rings hollow, now.
  1265. &lt;/p&gt;
  1266. &lt;p&gt;
  1267. I still find it heartening to hear of people doing cool things with Perl. David McLaughlin&apos;s uplifting &lt;a href=&quot;;&gt;How I learnt to love Perl&lt;/a&gt;, waxing on about &lt;a href=&quot;;&gt;Moose&lt;/a&gt; and other &quot;modern&quot; Perl frameworks (but come on dude, everyone knows that PHP, sucks, heh). Brad Fitzpatrick released &lt;a href=&quot;;&gt;Perl for Google App Engine&lt;/a&gt; today. But Perl, I&apos;m sorry. It&apos;s just too little, too late.
  1268. &lt;/p&gt;
  1269. &lt;p&gt;
  1270. I&apos;m just weary of the difficulties achieving team adherence to disciplined coding practices (or even appreciate why they&apos;re especially necessary in the TMTOWTDI world of Perl). The reliance on Wizardry is high with Perl; the path from novice to master requires grasping a wide range of arcana. Is it too much to ask for less magic in favor of easier developer ramp up? Perl&apos;s flexibility and expressiveness, it&apos;s high virtues, also comprises the generous reel of rope that programmers routinely hang themselves with. On top of idiomatic obscurities are the traps people fall into with dynamic typing and errors that only make themselves evident at runtime. Good testing practices are usually the anecdote to the woes of dynamic typing and and yet writing a good test harness for a Perl project is often a lot of work compared to the amount of work required to write the application code.
  1271. &lt;/p&gt;
  1272. &lt;p&gt;
  1273. I well understand the security that programmers feel using &lt;a href=&quot;;&gt;static typing&lt;/a&gt; but I&apos;m not saying the static typing is the cure to any ills. The compiler is the most basic test that your code can be understood and it gives your IDE a lotta help. That&apos;s great but static typing is also an anchor dragging on your time. From what I can tell, Java is the new C/C++ and Jython, JRuby. Groovy and friends (Scala, Clojure, etc) are the ways that people program the JVM with higher productivity. I&apos;m not saying fornever to Perl (that&apos;s a long time). But I am saying Hasta La Vista, for now. I&apos;ve been quite productive lately with Python (I know Perl friends, heresy!) and plan on pushing ahead with that, as well as with Java and other JVM languages. And where necessary, using Thrift to enable the pieces to work together. Python is certainly not perfect, it&apos;s quirks are many, too. But I&apos;ve seen recent success with collaborative software development with Python that would have been difficult to accomplish with Perl. I&apos;m not trying to stoke any language war at all, I&apos;m just reflecting on how I&apos;ve drifted from Perl. Amongst people I know and things I&apos;ve read elsewhere, &lt;a href=&quot;;&gt;I&apos;m not the only one&lt;/a&gt;. Don&apos;t fret, Perl, I&apos;m sure I&apos;ll see you around.
  1274. &lt;/p&gt;
  1275. &lt;p&gt;&lt;em&gt;
  1276. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;perl&lt;/a&gt; &amp;nbsp;
  1277. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;python&lt;/a&gt; &amp;nbsp;
  1278. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;java&lt;/a&gt; &amp;nbsp;
  1279. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;programming&lt;/a&gt; &amp;nbsp;
  1280. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1281.    <item>
  1282.    <guid isPermaLink="true"></guid>
  1283.    <title>MySQL vs. PostgreSQL (again)</title>
  1284.    <dc:creator>spidaman</dc:creator>
  1285.    <link></link>
  1286.        <pubDate>Sat, 6 Dec 2008 12:08:20 -0800</pubDate>
  1287.    <category>LAMP</category>
  1288.            <description>&lt;p&gt;
  1289. &lt;a href=&quot;; title=&quot;PostgreSQL&quot;&gt;
  1290. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;175&quot; height=&quot;68&quot; /&gt;&lt;/a&gt;
  1292. &lt;a href=&quot;; title=&quot;MySQL&quot;&gt;
  1293. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;114&quot; height=&quot;68&quot; /&gt;&lt;/a&gt;
  1295. If &lt;a href=&quot;;&gt;Kevin Burton&lt;/a&gt; wanted to draw attention to &lt;a href=&quot;;&gt;MySQL&apos;s inattention to scalability concerns&lt;/a&gt;, it looks like he&apos;s &lt;a href=&quot;;&gt;succeeded&lt;/a&gt; (126 comments on &lt;a href=&quot;;&gt;Reddit&lt;/a&gt; in the last day and climbing). I totally understand why he feels that the &lt;a href=&quot;;&gt;MySQL&lt;/a&gt; folks need to be provoked into action. I&apos;ll confess to having serious &quot;MySQL fatigue&quot; after years of struggling with InnoDB quirks (we use MySQL extensively at &lt;a href=&quot;;&gt;Technorati&lt;/a&gt;), stupid query plans and difficult to predict performance inflection points (there&apos;s a calculus behind table row count, row width, number of indices, update rate and query rate -- but AFAIK nobody has a reliable formula to predict response times against those variables). Frankly, I was really surprised when Sun acquired MySQL (for such a hefty sum, too), I was expecting them to build up a &lt;a href=&quot;;&gt;PostgreSQL&lt;/a&gt;-based platform by rolling up acquisitions of &lt;a href=&quot;;&gt;Greenplum&lt;/a&gt; and &lt;a href=&quot;;&gt;Truviso&lt;/a&gt;.
  1296. &lt;/p&gt;
  1297. &lt;p&gt;
  1298. Kevin is totally correct that to find solid innovation with MySQL, don&apos;t look to the MySQL corporation. Instead, the consultants and third party shops specializing in MySQL are where the action&apos;s at (&lt;a href=&quot;;&gt;Palomino DB&lt;/a&gt;, &lt;a href=&quot;;&gt;Percona&lt;/a&gt;, &lt;a href=&quot;;&gt;Drizzle&lt;/a&gt;, etc). It&apos;s kinda sad, both Sun and MySQL have at various times been home to hot-beds of innovation. Sun has &lt;a href=&quot;;&gt;great people&lt;/a&gt;  groundbreaking with cloud computing, impressive CPU performance per watt improvements and the Java ecosystem. But as far as MySQL goes, look to the outside practitioners.
  1299. &lt;/p&gt;
  1300. &lt;p&gt;
  1301. Kevin&apos;s post update cites the pluggable back-ends that MySQL supports as a feature but I&apos;m not so sure. I don&apos;t have any evidence of this but my intuition is that it&apos;s exactly this feature that makes the overall stability and performance such a crap-shoot (or sometimes, just outright crap). I&apos;m working on a personal project that uses &lt;a href=&quot;;&gt;PostGIS&lt;/a&gt; (PostgreSQL + GIS), nothing is live yet so I haven&apos;t had to scale it.  But I have a good deal of confidence in the platform.  &lt;a href=&quot;;&gt;Skype&lt;/a&gt; and &lt;a href=&quot;;&gt;Pandora&lt;/a&gt; look like good case studies. The PostgreSQL people have been focused on MVCC concurrency, procedure languages, UDFs and data integrity semantics for years. In those realms, the MySQL people are Johnny-come-slowlies (and buggily). On the other hand, if you want the append-only characteristics of logging to a database, MyISAM and merge tables have performance properties that PostgreSQL just can&apos;t match.
  1302. &lt;/p&gt;
  1303. &lt;p&gt;
  1304. Maybe &lt;a href=&quot;;&gt;David Duffield&lt;/a&gt; will look beyond &lt;a href=&quot;;&gt;enterprise app services&lt;/a&gt; and acquire, roll-up and market the PostgreSQL platforms that Sun didn&apos;t. Combining big data and event data with Greenplum and Truviso as a way to blow some smoke in Larry Ellison&apos;s eye, &lt;em&gt;that&lt;/em&gt; would be funny (and smart).
  1305. &lt;/p&gt;
  1306. &lt;p&gt;&lt;em&gt;
  1307. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;postgresql&lt;/a&gt; &amp;nbsp;
  1308. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;mysql&lt;/a&gt; &amp;nbsp;
  1309. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;greenplum&lt;/a&gt; &amp;nbsp;
  1310. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;truviso&lt;/a&gt; &amp;nbsp;
  1311. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;sun&lt;/a&gt; &amp;nbsp;
  1312. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;workday&lt;/a&gt; &amp;nbsp;
  1313. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;postgis&lt;/a&gt; &amp;nbsp;
  1314. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1315.    <item>
  1316.    <guid isPermaLink="true"></guid>
  1317.    <title>It&apos;s Only The Biggest Country In the World</title>
  1318.    <dc:creator>spidaman</dc:creator>
  1319.    <link></link>
  1320.        <pubDate>Fri, 5 Dec 2008 18:12:19 -0800</pubDate>
  1321.    <category>Musings</category>
  1322.            <description>&lt;p&gt;
  1323. &lt;a href=&quot;; title=&quot;China&quot;&gt;
  1324. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;124&quot; height=&quot;83&quot; /&gt;&lt;/a&gt;
  1325. Should the confirmed reports that &lt;a href=&quot;;&gt;Technorati is banned in China&lt;/a&gt; be worn as a badge honor? I understand the Chinese authorities value stability but these kinds of things, treating billions of people like little children that need to be sheltered, will ultimately destabilize them.
  1326. &lt;/p&gt;
  1327. &lt;P&gt;
  1328. We&apos;ve waited 18 years for &lt;a href=&quot;;&gt;Chinese Democracy&lt;/a&gt;, isn&apos;t that long enough? (sorry, couldn&apos;t resist the joke)
  1329. &lt;/p&gt;
  1330. &lt;p&gt;
  1331. Best wishes to the Chinese people. At least most of you.
  1332. &lt;/p&gt;
  1333. &lt;p&gt;&lt;em&gt;
  1334. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;chinese democracy&lt;/a&gt; &amp;nbsp;
  1335. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;china&lt;/a&gt; &amp;nbsp;
  1336. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;censorship&lt;/a&gt; &amp;nbsp;
  1337. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  1338. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;guns n roses&lt;/a&gt; &amp;nbsp;
  1339. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1340.    <item>
  1341.    <guid isPermaLink="true"></guid>
  1342.    <title>Technorati Releases Fixes Some UI Peeves</title>
  1343.    <dc:creator>spidaman</dc:creator>
  1344.    <link></link>
  1345.        <pubDate>Thu, 4 Dec 2008 18:43:39 -0800</pubDate>
  1346.    <category>Musings</category>
  1347.            <description>&lt;p&gt;
  1348. &lt;a href=&quot;; title=&quot;Technorati&quot;&gt;
  1349. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;110&quot; height=&quot;15&quot; /&gt;&lt;/a&gt;
  1350. In general, I regard successful user interfaces as the ones that provide the least amount of hunting and astonishment. Noone is delighted when the things they&apos;re looking for aren&apos;t obvious, the data displayed requires lots of explanation and the paths through an application are click-heavy. In this regard, Technorati was long saddled with a user interface that I regarded as delightless. However, I see that changing now and I&apos;m delighted to see that!
  1351. &lt;p&gt;
  1352. &lt;a href=&quot;;&gt;Technorati&apos;s front end was released today&lt;/a&gt; with a handful of significant improvements. One is a long standing peeve of mine: the tag pages we&apos;re conflated with keyword search. That meant that if your post was about the president-elect and you tagged it &quot;obama&quot;, your expectation that the the posts aggregated at &lt;a href=&quot;;&gt;;/a&gt; would also be tagged &quot;obama&quot; would be disappointed; there would also be a bunch of keyword matches mixed in. That came out of last year&apos;s attempt to &quot;simplify&quot; the experience by making keyword search and tag browsing the same thing; which was, in all honesty, a George Bush level failure. Sure there are folks who don&apos;t know, &quot;What&apos;s this &apos;tag&apos; thing you&apos;re talking about?&quot; But for the folks who &lt;em&gt;do&lt;/em&gt; know what the difference is between browsing blog posts grouped by tags and keyword search results, the mix wasn&apos;t received as a simplification but as a software defect.
  1353. &lt;blockquote&gt;
  1354. I tagged my post &quot;obama&quot; but all of these other posts aren&apos;t tagged &quot;obama&quot;, what&apos;s going on?
  1355. &lt;/blockquote&gt;
  1356. I&apos;m glad we&apos;ve gone back to keeping search and tags distinct.
  1357. &lt;/p&gt;
  1358. &lt;p&gt;
  1359. The other failed aspect of the prior design was the demotion of the search box. The form input to type in your search was sized down and moved to the right, as if it were a &quot;site search&quot; feature. Yes, we&apos;d like folks to explore our discovery features but the navigation for those features weren&apos;t great and the de-emphasis on search was again a source of more puzzlement than anything. The release today puts the search box back where it should be: bigger and right in the middle of the of the top third of the page, yay!
  1360. &lt;/p&gt;
  1361. &lt;p&gt;
  1362. Oh, and earlier today Technorati Media released its Engage platform to &lt;a href=&quot;;&gt;beta&lt;/a&gt;. This is a major step in opening up the ad market place for the blogosphere.
  1363. &lt;/p&gt;
  1364. &lt;p&gt;
  1365. So far, the feedback I&apos;ve seen on these releases have been thumbs-up. Check &apos;em out, there&apos;s some more goodies in the works but these things only get better with your feedback. And yes, we know there&apos;s still more to do, I&apos;m certainly busy with the backend stuff with our cloud platform, ping systems and crawlers (but did you notice the screenshot thumbnails on the search result and tag pages? I need to shake out the latencies producing and refreshing those). Kudos to Dave White, the front end team and the ad platform team for getting these releases out. Onward and upward!
  1366. &lt;/p&gt;
  1367. &lt;p&gt;&lt;em&gt;&lt;a href=&quot;; rel=&quot;tag&quot;&gt;technorati&lt;/a&gt; &amp;nbsp;
  1368. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;folksonomy&lt;/a&gt; &amp;nbsp;
  1369. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;tagging&lt;/a&gt; &amp;nbsp;
  1370. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;user interface&lt;/a&gt; &amp;nbsp;
  1371. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;blogging&lt;/a&gt; &amp;nbsp;
  1372. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;ad platform&lt;/a&gt; &amp;nbsp;
  1373. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1374.    <item>
  1375.    <guid isPermaLink="true"></guid>
  1376.    <title>Can We Just Call It &quot;Flex Computing&quot;?</title>
  1377.    <dc:creator>spidaman</dc:creator>
  1378.    <link></link>
  1379.        <pubDate>Wed, 3 Dec 2008 22:44:46 -0800</pubDate>
  1380.    <category>Musings</category>
  1381.            <description>&lt;p&gt;
  1382. &lt;a href=&quot;; title=&quot;Cloud?&quot;&gt;
  1383. &lt;img src=&quot;; style=&quot;float:right; margin:5px 5px 5px 5px;cursor:pointer; cursor:hand;&quot; border=&quot;0&quot; width=&quot;80&quot; height=&quot;127&quot; /&gt;&lt;/a&gt;
  1384. The moniker &amp;quot;cloud computing&amp;quot; has been overloaded to mean to so many things, it&apos;s beginning to mean nothing. When someone refers to it generically, you have to ask them to dismbiguate; which of these are they referring to?
  1385. &lt;ol&gt;
  1386. &lt;li&gt;IT infrastructure offered as a services&lt;/li&gt;
  1387. &lt;li&gt;Hosted application functionality&lt;/li&gt;
  1388. &lt;li&gt;A virtualized server deployment&lt;/li&gt;
  1389. &lt;/ol&gt;
  1390. InfoWorld wrote &lt;a href=&quot;;&gt;What cloud computing really means&lt;/a&gt; last spring to help clarify the distinctions but still, I often have to stop folks when the use the C-word just make sure we&apos;re talking about the same things.
  1391. &lt;/p&gt;
  1392. &lt;p&gt;
  1393. Examples of the first definition are services like &lt;a href=&quot;;&gt;Amazon Web Services&lt;/a&gt; (AWS) or &lt;a href=&quot;;&gt;GoGrid&lt;/a&gt;. They provide metered virtual machines, you pay for what you use and have full access (root) on the machines while you use them. Additional goodies such as load balanced clusters, storage facilities and so forth are part of the deal too. Capacity can be scaled up or down on demand and typically, in very rapid fashion. When &lt;a href=&quot;;&gt;Peter Wayner reviewed these guys last summer in InfoWorld&lt;/a&gt;, he was enamored with the GUI front ends. Call me old fashioned (or a dyed in the wool geek) but unless they&apos;re really saving me a lot of time, I have an aversion to the slick GUI&apos;s. For his part, Wayner complained about the AWS command line utilities. Actually, when I use AWS, I use a GUI for an overview of running instances, it&apos;s a Firefox plugin (&lt;a href=&quot;;&gt;Elasticfox&lt;/a&gt;) but what I &lt;em&gt;really&lt;/em&gt; like about AWS is programmatic access. Integrating application deployment with command and control functionality is very powerful, my tool of choice is &lt;a href=&quot;;&gt;boto&lt;/a&gt;, a Python API for AWS.
  1394. &lt;/p&gt;
  1395. &lt;p&gt;
  1396. The second definition refers to hosted application functionality, in years gone by they were referred to as &lt;em&gt;Application Service Providers&lt;/em&gt; (ASP). The more modern label is &lt;em&gt;Software as a Service&lt;/em&gt; (SaaS). However, these services have to provide more than a console for functionality, they have to provide web service API&apos;s that enable them to be integrated into other applications. was an early leader in this space (remember the red cross-outs, &quot;No Software&quot;), their example and the proliferation of RSS is really want inspired the proliferation of &lt;a href=&quot;;&gt;APIs and mashups&lt;/a&gt; we see today.
  1397. &lt;/p&gt;
  1398. &lt;p&gt;
  1399. The last definition refers to VMWare, Xen and so forth. By themselves, those aren&apos;t really cloud computing in my book. However, you can use them to create your own &quot;private cloud&quot; with tools like &lt;a href=&quot;;&gt;Enomaly&lt;/a&gt; and &lt;a href=&quot;;&gt;Eucalyptus&lt;/a&gt;. This is an area of great interest to me.
  1400. &lt;/p&gt;
  1401. &lt;p&gt;
  1402. In his review, Wayner pointed out how very different all of the services are. I don&apos;t know why he included Google&apos;s App Engine at all in his write-up. Don&apos;t misunderstand, GAE is a great service but it more closely resembles an application container than infrastructure services.
  1403. &lt;/p&gt;
  1404. &lt;p&gt;
  1405. I&apos;m imagining IT infrastructure management interfaces coalescing around standards (de-facto ones, not ones fashioned out of IETF meetings). Eucalyptus is a good discussion point. Eucalyptus provides an EC2 &quot;work-alike&quot; interface on top of a Xen virtual server platform. So picture this: if the Rackspaces, ServePaths, Server Beaches and LayeredTechs of this world were to provide a compatible interfaces built on top of Eucalyptus, buying compute power by the hour would become more like buying gasoline. There may be pros and cons to this station or that but fundamentally, if you don&apos;t like the pumps at one gas station or the prices are too high, you can go to the gas station across the street. Given compatible interfaces, management of the infrastructure, be it with boto, Elasticfox or using services such as &lt;a href=&quot;;&gt;RightScale&lt;/a&gt; can be as dynamic as the server deployments in those clouds. Such a compute market place would unleash new rounds of innovation as it eases starting up and scaling online services.
  1406. &lt;/p&gt;
  1407. &lt;p&gt;
  1408. The Eucalyptus folks will be the first to fess up that their project is more academic in nature that industrial strength. However, it is the harbinger of AWS as a standard. Yes, I&apos;m referring to AWS as a standard because of the level of adoption its enjoyed, the comprehensive set of APIs it provides and the rich ecosystem around it. What I foresee is that the first vendor to embrace and commoditize a standard interface for infrastructure management changes the game. The game becomes one of a meta-cloud because computing capacity will be truly fluid, flexibly shrinking and growing with hosted clouds, private clouds and migrating between clouds.
  1409. &lt;/p&gt;
  1410. &lt;p&gt;&lt;em&gt;
  1411. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;cloud computing&lt;/a&gt; &amp;nbsp;
  1412. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;saas&lt;/a&gt; &amp;nbsp;
  1413. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;virtualization&lt;/a&gt; &amp;nbsp;
  1414. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;aws&lt;/a&gt; &amp;nbsp;
  1415. &lt;a href=&quot;; rel=&quot;tag&quot;&gt;xen&lt;/a&gt; &amp;nbsp;
  1416. &lt;/em&gt;&lt;/p&gt;</description>          </item>
  1417.  </channel>
  1418. </rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda