Brandon Smith2013-10-11T18:37:31-07:00http://16cards.com/Brandon Smithbrandon@16cards.comKNN using JavaScript and Underscore2013-06-06T00:00:00-07:00http://16cards.com/2013/06/06/knn-in-parse-cloud<p>As users interact with websites, mobile devices, and the Internet of Things, data about user behavior is being generated at tremendous scale. And it will only continue to grow. How do we leverage this data?</p>
<p>One useful way to make use of the large amount of data being generated is to use it to classify new data as it arrives. This is a form of machine learning. For instance, email or SMS spam filtering or automatically outputting tags that describe a body of text.</p>
<p>There are many ways to classify data, but one way is to use the “K Nearest Neighbor” (KNN) algorithm.</p>
<h2 id='machine_learning_and_k_nearest_neighbor'>Machine Learning and K Nearest Neighbor</h2>
<p>KNN is a machine learning classification algorithm that is lazy. This means computation is deferred until classification is actually needed. Further, KNN needs to be supervised in that an initial set of data is required in order to “train” the algorithm. KNN is a simple, easy-to-understand algorithm that really doesn’t require any prior knowledge of statistics.</p>
<p>The basic premis of KNN is simplistic and reasonable: given an instance of data, look for the k closest neighboring instances and choose the most popular class among them.</p>
<p>Imagine if a piece of data is described by only two attributes. Fruit, for example, can be described by having weight and color. If many instances of fruit are plotted on a X-Y graph where each axis represents one of these attributes, there would be clusters of each fruit type in the 2D space.</p>
<h2 id='underscore_and_knn'>Underscore and KNN</h2>
<p>Because KNN is lazy, it is expensive. Optimizations can be made, but that is an exersize for later. The psudo-code for KNN is essentially:</p>
<pre><code>load SAMPLE
load DATASET
sort DATASET by DISTANCE from SAMPLE
load TOP_K from DATASET
reduce TOP_K to frequency COUNT
return max of COUNT</code></pre>
<p>Since KNN is essentially a series of operations on collections, I wanted to write a KNN impelemntation leveraging Underscore as much as possible.</p>
<h3 id='distance_function'>Distance function</h3>
<p>KNN, at its core, needs to calculate the distance of the attributes from the sample. In other words, triangulation using cartesian distance. In this naive implementation, the number of attributes needs to be known up front. For simplicity’s sake, we are going to classify using only two attributes.</p>
<p>The distance function is simply:</p>
<pre><code>var distance = function(item1, item2) {
a = item1[0] - item2[0];
b = item1[1] - item2[0];
return Math.pow((Math.pow(a,2) + Math.pow(b,2)), 0.5);
};</code></pre>
<p>This is pretty much the only function that is now based on Underscore.</p>
<h3 id='sorting_the_dataset'>Sorting the dataset</h3>
<p>KNN requires getting the nearest neighbors, thus, we need to sort the training data by distance from the sample. Underscore provides the <code>_.sortBy</code> function that can return an array where the elements are sorted by a custom function. In this case, the distance from the sample:</p>
<pre><code>var sort = function(sample, dataset) {
return _.sortBy(dataset, function(item) {
return distance(item, sample);
});
};</code></pre>
<h3 id='the_top_k'>The Top K</h3>
<p>The K in KNN is the number of closest neighbors we want to classify the sample against. Underscore provides the <code>_.first</code> function:</p>
<pre><code>var topK = function(dataset, k) {
return _.first(dataset, k);
};</code></pre>
<h3 id='class_frequency'>Class Frequency</h3>
<p>Next KNN needs to know what the frequency of each of the top K. This is essentially a reduce function that takes a dataset and needs to count the elements by a certain attribute. Underscore provides the <code>_.countBy</code> function:</p>
<pre><code>var classCount = function(dataset) {
return _.countBy(dataset, function(item) {
return item[2];
});
};</code></pre>
<h3 id='most_popular_in_the_class_of'>Most Popular in the Class of…</h3>
<p>The last operation of KNN is to get the most frequency, or popular, class. This single value the algorithm’s output… a classification of the sample based on the training dataset. Underscore provides the <code>_.max</code> function. However, the result of the previous use of the <code>_.countBy</code> function is an Object that maps the class as a key to the number of instances as a value and <code>_.max</code> takes an array. Conveniently, the Underscore <code>_.pairs</code> function converts an Object into an array definition:</p>
<pre><code>var classify = function(dataset) {
return _.max(_.pairs(dataset), function(item) {
return item[1];
})[0];
};</code></pre>
<h2 id='all_together_now'>All Together Now</h2>
<p>Let’s classify fruit across two attributes: weight and color. Weight, of course, is a number. However, any attribute that is not inherently a number (remember we are calculating distance here) needs to be mapped. Color nicely maps to a number because we can create an artificial scale across:</p>
<pre><code>red 1
orange 2
yellow 3
green 4
blue 5
purple 6</code></pre>
<p>We need some sample data to train the algorithm:</p>
<pre><code>var dataset = [
[303, 3, "banana"],
[370, 1, "apple"],
[298, 3, "banana"],
[277, 3, "banana"],
[377, 4, "apple"],
[299, 3, "banana"],
[382, 1, "apple"],
[374, 4, "apple"],
[303, 4, "banana"],
[309, 3, "banana"],
[359, 1, "apple"],
[366, 1, "apple"],
[311, 3, "banana"],
[302, 3, "banana"],
[373, 4, "apple"],
[305, 3, "banana"],
[371, 3, "apple"],
];</code></pre>
<h2 id='testing_knn'>Testing KNN</h2>
<p>In order to test this, I deployed the following to Parse Cloud:</p>
<pre><code>var _ = require('underscore');
Parse.Cloud.define("classify", function(req, res) {
var sorted_dataset = sort(req.params.input, dataset);
var top_k = topK(sorted_dataset, 3);
var counts = classCount(top_k);
var classification = classify(counts);
res.success(classification);
});
var distance = function(item1, item2) {
a = item1[0] - item2[0];
b = item1[1] - item2[1];
c = Math.pow((Math.pow(a, 2) + Math.pow(b, 2)), 0.5);
return c;
};
var sort = function(unknown_item, dataset) {
return _.sortBy(dataset, function(item) {
return distance(item, unknown_item);
});
};
var topK = function(dataset, k) {
return _.first(dataset, k);
};
var classCount = function(dataset) {
return _.countBy(dataset, function(item) {
return item[2];
});
};
var classify = function(dataset) {
return _.max(_.pairs(dataset), function(item) {
return item[1];
})[0];
};
var dataset = [
[303, 3, "banana"],
[370, 1, "apple"],
[298, 3, "banana"],
[277, 3, "banana"],
[377, 4, "apple"],
[299, 3, "banana"],
[382, 1, "apple"],
[374, 4, "apple"],
[303, 4, "banana"],
[309, 3, "banana"],
[359, 1, "apple"],
[366, 1, "apple"],
[311, 3, "banana"],
[302, 3, "banana"],
[373, 4, "apple"],
[305, 3, "banana"],
[371, 3, "apple"],
];</code></pre>
<p>The sample that we are trying to classify is sent in an HTTP POST:</p>
<pre><code>curl -X POST \
-H "X-Parse-Application-Id: XXX" \
-H "X-Parse-REST-API-Key: YYY" \
-H "Content-Type: application/json" \
-d '{ "input" : [303, 4] }' \
https://api.parse.com/1/functions/classify</code></pre>
<p>This sample is classified as a banana:</p>
<pre><code>{"result":"banana"}</code></pre>
<p>It is an unriped, green banana, but KNN still classified it as a banana.</p>
<h2 id='next_steps'>Next Steps</h2>
<p>You may have noted that the sample data, weight and color, are unbalanced. The weight has more weight, if you pardon the pun. A less naive implementation would normalize all the data before calculating the distance from the sample.</p>Thoughts on Innovation2012-10-31T00:00:00-07:00http://16cards.com/2012/10/31/thoughts-on-innovation<ol>
<li>Build innovations around experiences.</li>
<li>Think of innovation as a system.</li>
<li>Cultivate an innovation culture.</li>
<li>Adopt an innovation discipline process.</li>
</ol>
Using Objective C subscripting with iOS on Xcode 4.42012-07-26T00:00:00-07:00http://16cards.com/2012/07/26/using-objective-c-subscripting-with-ios-on-xcode-4-4Objective C as of Xcode 4.4 now has literals and subscripting:
<!--more-->
<pre style="padding-left: 30px;">NSDictionary *dict = @{ @"hello" : @"world"}; // dictionary literal syntax
NSLog(@"%@", dict[@"hello"]); // subscript syntax
NSLog(@"%@", [dict objectAtKeyedSubscript: @"hello"]); // equivalent to line 2</pre>
As shown above, subscripting is interestingly implemented by way of operator overloading, something Apple has stayed clear until now. What this means is ANY class can define what happens when subscripting syntax is used on it.
Well, I started a new iOS project to demonstrated a novel Flickr integration and thought it a good chance to leverage the streamlined syntax to access NSDictionary and NSArray objects. But, I quickly learned from compiler feedback that NSDictionary and NSArray (and their mutable subclasses) do not implement the necessary functions in iOS 5 SDK.
However, if the magic takes place by way of the Xcode toolchain, perhaps an Objective C Category can coerce NSDictionary and NSArray to behave on SDKs that do not yet formally support it.
The following category extensions allow subscripting on some of the core classes:
<pre style="padding-left: 30px;">@interface NSArray(Subscripting)
- (id) objectAtIndexedSubscript:(NSUInteger)index;
@end
@interface NSMutableArray(Subscripting)
- (void) setObject:(id)obj atIndexedSubscript:(NSUInteger)index;
@end
@interface NSDictionary(Subscripting)
- (id) objectForKeyedSubscript:(id)key;
@end
@interface NSMutableDictionary(Subscripting)
- (void) setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key;
@end</pre>
Ready to launch2010-04-03T00:00:00-07:00http://16cards.com/2010/04/03/ready-to-launchI want an iPad. And I'll probably get one at some point. Being busy at <a href="http://phonebooth.com">work</a>, I didn't really track pre-orders, the exact launch date, etc. Today's release actually came quicker than I thought it would.
But wait. The <strong><em>real</em></strong> wireless version comes out later this month? Kind of glad I missed it as our family likes road trips.
Isn't getting the iPad today like rushing out to buy the new Prius model that gets 50 MPG only to have the 75 MPG one come out several weeks later?
Confirmation2010-04-03T00:00:00-07:00http://16cards.com/2010/04/03/confirmationThere is a strange emotion that we humans have. A need for confirmation. That our life is important. That what we do day to day has meaning to others. To others whether we are close or unknown.
Often, I find myself pondering and carrying such emotions.
Other times, I will stare at my computer screen and watch my Domino's pizza order <strong><em>virtually</em></strong> be baked by Raymond.
<a href="http://16cards.com/wp-content/uploads/2010/04/confirmation.jpg"><img class="alignnone size-medium wp-image-210" title="confirmation" src="http://16cards.com/wp-content/uploads/2010/04/confirmation-300x99.jpg" alt="" width="300" height="99" /></a>
$3.002009-09-29T00:00:00-07:00http://16cards.com/2009/09/29/3-00I just spent $1.25 on a King Size Reese's Peanut Butter Cups. 4 cups. Concentrated energy bursts throughout the day. I find they make me more productive. Worth the price for getting work done, not worth the price for my waist line. :)
Tweetie for iPhone is about to release version 2. Existing users will need to pay $3 for the app. Version 1 is a pleasure to use. Reviews are all position about the new one.
Only, there is a <a href="http://justanotheriphoneblog.com/wordpress/iphone-software/tweetie-2-new-app-will-spit-on-existing-old-app-users">very vocal minority</a> claiming they have been wronged by the makers of Tweetie for charging "full" price.
Don't make me laugh.
It's $3.
My rule of thumb is that when you use a durable good daily, you should always be willing to pay at least your aggregated three meals for the day.
Which, interesting enough, is what traditional Mac apps that fill a niche. Roughly $20 to $50.
The iPhone app store seems to have introduced a new set of economics. And expectations from users. All of sudden $3 is a huge deal. Almost as if the scaled down interface has a direct relationship with price but an inverse relationship with entitlement.
I think what has happened is that app producers, in an effort to dominate a particular market segment, either gave away apps for free or gave away significant updates to paid apps for free. Now that the app store economy is stabilizing somewhat from its initial, incredible growth, app producers are beginning to introduce back into the system sustainable revenue practices... like charging a reasonable price commensurate with their good's usefulness.
I'm sorry. When users are crying foul, demanding a discount on $3, something entirely different is wrong. To the degree that economic textbooks may reflect on this point in history. There will be some term for this attitude and behavior of paying customers to expect discounts on useful goods they see everyday to cost less than a BigMac that they see only once.
Speaking to our children2009-09-03T00:00:00-07:00http://16cards.com/2009/09/03/speaking-to-our-childrenThere seems to be a lot of hoopla about our country's President speaking to students next September 8th. And, of course, right wing parents have used this to further convince themselves that Obama's motivation is to spread socialist propaganda and turn children against their parents.
At the center of the conspiracy theories are two documents produced by the Department of Education to assist teachers in stimulating student minds. One document is for Pre-K through 6th grade while the other is for 7th to 12th. Each contains similarly worded, but age appropriate, questions and constructive activities in an attempt to make the speech more likely to make an impact on our nation's future generation.
Only I have one small concern. Some blogs I've read are <a href="http://www.docstoc.com/docs/10582301/President-Obama">linking to a version</a> of the Pre-K to 6th grade document that is hosted on non-authoritative servers. However, <a href="http://www.ed.gov/teachers/how/lessons/prek-6.pdf">the official document</a> is provided by the Department of Education.
The reason the other document concerns me is that there are two parts in the content that are different. One is minor and negligible. However, the other deserves attention.
In particular, the unofficial document, second bullet in the "Extension of the Speech" section, contains the following sentence:
<blockquote>"Write letters to themselves about what they can do to help the president."</blockquote>
Whereas the official document has this sentence in the same location:
<blockquote>"Write letters to themselves about how they can achieve their short-term and long-term education goals."</blockquote>
Worst case scenario holds that someone deliberately modified the text to incite right wing parents.
Best case scenario is that the unofficial document is an earlier draft, reviewers felt that "help the president" in fact would be controversial despite it addressing students helping the president in his goals for education.
In other words, "help the president" in the context of the speech's subject matter, not the president's general policies. Which, therefore, in my view attests to why Barak Obama wants to talk to my daughter, along with the rest of the country's students...
No Child Left Behind was/is about schools owning the education experience in our country and being held accountable through standardized tests and school, district, and state report cards of key indicators for "progress" and "success".
Obama's emerging education policy will turn NCLB on its head and redirect the ultimate responsibility for education in the individual. In the words of the official document linked above... "short-term and long-term education goals". Which is really where is should be.
Isn't education ultimately a life-long process? Is our educational system preparing us for that? Hasn't our country incorrectly emphasized certain subjects (math, science) while diminishing others (art, dance, music, physical education)? Shouldn't education be more about self-discovery and equipping our youth with the skills to adapt and succeed in our ever changing world? Instead we glorify students that are narrowly talented and call them the "smart" ones.
I believe the content Obama will deliver on September 8th will focus on helping students shape their own education and be joint partners in it with parents and teachers.
Last Day2009-07-01T00:00:00-07:00http://16cards.com/2009/07/01/last-dayAfter nearly four years with IBM, the day has arrived. My final day with IBM as my employer.
During my time at IBM I found the <a href="http://www.research.ibm.com/social/projects_bluemail.html">BlueMail to be the most usable email and calendar client</a>. I religiously tagged all my saved emails.
And so I generated a tag cloud of all my emails. I think it is pretty indicative of what's itching my brain during my IBM tenure:
[caption id="attachment_188" align="alignnone" width="835" caption="Brandon Smith's Wordle"]<img class="size-full wp-image-188" title="Brandon Smith's Wordle" src="http://16cards.com/wp-content/uploads/2009/07/brandon-smith-wordle.gif" alt="Brandon Smith's Wordle" width="835" height="328" />[/caption]
<a title="Wordle: My 4 years" href="http://www.wordle.net/gallery/wrdl/979832/My_4_years">Image generated by the fine work of Wordle.net</a>
New Glasses2009-06-24T00:00:00-07:00http://16cards.com/2009/06/24/new-glassesI am <a href="http://twitter.com/BrandonSmith/status/2313095199">leaving IBM</a> and joining Bandwidth.com.
When Joe Gregorio exited my team at IBM during the summer of 2007, he <a href="http://bitworking.org/news/229/Roads">opaquely announced that he was joining Google</a> by outlining that his job moves coincided with road construction providing faster routes to his previous employer.
I recently got a new pair of glasses. Here I am with my daughter just two weeks ago:
<img class="alignnone size-full wp-image-168" title="Brandon and Brooklyn" src="http://16cards.com/wp-content/uploads/2009/06/brandon-10.jpg" alt="Brandon and Brooklyn" width="350" height="232" />
And then I began to talk with my wife about when I got new glasses throughout my life. I could not help notice the irony that within weeks of a major life event, I got a new pair of glasses. I am reminded of Christopher Guest teasing Eugene Levy on the commentary track of "A Mighty Wind" of Levy's peculiarity of selecting glasses before filming.
<h3>Junior High.</h3>
Upon graduating from elementary school, it was soon discovered that I needed glasses. I was quite young, and the late 80's was not exactly kind to the optically challenged community:
<img class="alignnone size-full wp-image-171" title="brandon-1" src="http://16cards.com/wp-content/uploads/2009/06/brandon-1.jpg" alt="brandon-1" width="350" height="381" />
Today's youth have a much better selection of stylish frames.
I should note that I went through about a dozen of these frames. It was not long before my mother realized the economics of purchasing the warranty that covered broken frames. Replacing fractured frames became so commonplace during this stage of my life that I would go to the store to get them refitted on my bike. I do not recall whether I thought it was a good idea to ride my bike with impaired vision.
<h3>High School.</h3>
Awkwardness is one of several words I would describe myself during high school. I think I may have predated Harry Potter with the frames I had during this period of my life.
<img class="alignnone size-full wp-image-172" title="brandon-2" src="http://16cards.com/wp-content/uploads/2009/06/brandon-2.jpg" alt="brandon-2" width="350" height="261" />
Nevertheless, I did play football. Between my freshman and sophomore year, I bulked up with my weight lifting. Further, glasses do not exactly go well with the football field. Thus, I would often wear contacts. Except I am petrified of touching my eye. Even to this day. My mother would pin me down on the ground, pry open an eye and jab in the contact until it stuck. I did not make it easy.
<img class="alignnone size-full wp-image-173" title="brandon-3" src="http://16cards.com/wp-content/uploads/2009/06/brandon-3.jpg" alt="brandon-3" width="350" height="302" />
<h3>Abroad.</h3>
Between high school and college I went abroad to South Africa for two years like many do from my church. During this time I got my first "modern" pair of glasses (and stopped parting my hair).
<img class="alignnone size-full wp-image-174" title="brandon-4" src="http://16cards.com/wp-content/uploads/2009/06/brandon-4.jpg" alt="brandon-4" width="350" height="247" />
<h3>Undergraduate degree. And the band.</h3>
Throughout my undergraduate degree at Arizona State University I played the bass guitar for the band Before Braille. (We just released an album of unreleased tracks, it is pretty good.) I definitely took on an "indy" look at this time of my life.
<img class="alignnone size-full wp-image-170" title="DSC00065" src="http://16cards.com/wp-content/uploads/2009/06/DSC00065.jpg" alt="DSC00065" width="350" height="263" />
<h3>Married. Masters degree.</h3>
I got married and got serious about school and finished at Arizona State. Which led me to pursuing my masters degree at Carnegie Mellon. Just before starting graduate school I wanted a more academic look.
<img class="alignnone size-full wp-image-176" title="brandon-6" src="http://16cards.com/wp-content/uploads/2009/06/brandon-61.jpg" alt="brandon-6" width="350" height="213" />
<h3>IBM.</h3>
I had just completed graduate school before joining IBM and had gotten new glasses. I remember feeling compelled to get glasses with a more "professional" look. In retrospect, they were boring. The glasses were the memory kind that bend back into shape. Here I am with my girls. They are quite active which proved useful for the flexible frames.
<img class="alignnone size-full wp-image-169" title="brandon-8" src="http://16cards.com/wp-content/uploads/2009/06/brandon-8.jpg" alt="brandon-8" width="350" height="332" />
<h3>Bandwidth.com</h3>
Which leads me back to my transition to Bandwidth.com next week.
<img class="alignnone size-full wp-image-177" title="Photo 21" src="http://16cards.com/wp-content/uploads/2009/06/Photo-21.jpg" alt="Photo 21" width="350" height="200" />
Welcome back and welcoming Dave2009-03-13T00:00:00-07:00http://16cards.com/2009/03/13/welcome-back-and-welcoming-daveNearly a year since any activity on this blog. It has been far too long. I had high hopes on recording my thoughts as I traverse through the technical side of my life. (I contribute frequently with my wife on our family blog.) I recorded <a href="http://16cards.com/2007/05/22/enterprise-vs-consumer-ibms-false-distinction/">one</a> such thought and got my hand slapped. In retrospect, I used stronger, more confrontational language than necessary. In fact, there were several blog posts done in frustration. Yet I cowered. Decided my thoughts were not being received well. And abandoned efforts.
I am going to try again. This time, however, I plan to do write ups that are less about the abstract and more about what I am actually doing. Before I felt a topic needed some grandiose raison d'être that fit into an even larger story arc in order to qualify as worth of posting. I now realize that that is not necessary. I've learned effective bloggers have passion, not an agenda.
One person I respect, among many, in how he blogs about what he works on is Dave Johnson of Roller fame. He posts on project status, architecture, reblogs content as appropriate, with commentary. In other words, it seems to be an extension of himself. As a blog should be.
I don't know <a href="http://rollerweblogger.org/roller/page/about">Dave Johnson</a> personally, not having the occasion to meet him. Yet I've followed his blog for years, as well as <a href="http://rollerweblogger.org/project/">Roller</a> and, more recently, <a href="https://socialsite.dev.java.net/">Project SocialSite</a>.
Dave is joining IBM. I hope to find an excuse to <a href="http://rollerweblogger.org/roller/entry/joining_ibm">work with Dave</a> at some point.
Project Zero in the cloud2008-04-09T00:00:00-07:00http://16cards.com/2008/04/09/project-zero-in-the-cloudMichael Kimsal reviews Google's App Engine and calls out Project Zero as being likely candidate for IBM to join the trend towards cloud computing...
I, too, would love to see <a href="http://www.projectzero.org">Project Zero</a> in the cloud as well.
phpBB on Project Zero2008-03-31T00:00:00-07:00http://16cards.com/2008/03/31/phpbb-on-project-zero<img src='http://16cards.com/media/zero-plus-php.png' alt='' class='alignright' />
Somehow this flew under my radar. Sad, considering I am on the project. Project Zero is starting to become self-hosted (to the extent it makes sense, of course) with its own <a href="https://www.projectzero.org/forum/index.php">support forum running phpBB on the Project Zero runtime itself</a>.
So I went and dug deeper...
Back in January, <a href="http://www.projectzero.org/blog/index.php/2008/01/13/phpbb-running-on-project-zero/">Rob Nicholson</a> and <a href="http://www.projectzero.org/blog/index.php/2008/01/24/running-phpbb-from-the-project-zero-commandline/">Iain Lewis</a> posted that phpBB now runs on Project Zero's PHP runtime.
Getting a major PHP application, such as phpBB, running on Project Zero's PHP runtime implemented in Java is quite impressive. But as I dug deeper, I came across a blog post from just a few days ago. SugarCRM is also running on Project Zero. That's huge!!
...and so the pranks begin...2008-03-31T00:00:00-07:00http://16cards.com/2008/03/31/and-so-the-pranks-beginI was hoping that April Fools' jokes on the Web would be passe this year. First I <a href="http://www.techcrunch.com/2008/03/31/why-were-suing-facebook-for-25-million-in-statutory-damages/">spotted this year</a>. Of course, no hoax can ever top <a href="http://www.google.com/technology/pigeonrank.html">Google's Pigeon Rank</a>.
Idempotent2008-01-15T00:00:00-08:00http://16cards.com/2008/01/15/idempotentUPDATE: It seems Network Solutions has turned off their search "feature" where they register the domain you just searched.
<del datetime="2008-01-15T12:38:00+00:00">Here is a fun little experiment...
<ol>
<li>Do a search for a random domain on <a href="http://godaddy.com">GoDaddy.com</a>. I chose <code>networksolutionsactuallyregisterseverydomainsearched.com</code>. If the domain has been taken, think of another one.</li>
<li>Then go to <a href="http://www.networksolutions.com/index.jsp">Network Solutions</a> and do the search on the same domain. Note that the domain is still available.</li>
<li>Now go back to GoDaddy.com and search one more time.</li>
</ol>
Hmmm. Seems Network Solutions searches are not <a href="http://en.wikipedia.org/wiki/Idempotent">idempotent</a>.
</del>
concocting slang2008-01-08T00:00:00-08:00http://16cards.com/2008/01/08/concocting-slang<dl> <dt><strong><a href="http://www.urbandictionary.com/define.php?term=tuba&defid=1032623#1032623">tuba</a></strong> <dd>The greatest instrument known to man </dd></dt></dl> <p>And I'm sure <a href="http://www.tubanews.com/index.php">Tuba News</a> would agree.</p> <p>Which reminds me. If you haven't checked out the <a href="http://code.google.com/apis/chart/">Google Chart API</a>, you must. That project is the tuba. With the recent <a href="http://google-code-updates.blogspot.com/2008/01/chartmaker-tool-for-google-chart-api.html">ChartMaker</a> available, it reminds me where SaaS is going.</p>
Misunderstanding REST, part 22007-12-17T00:00:00-08:00http://16cards.com/2007/12/17/misunderstanding-rest-part-2<p>From <a href="http://www.amazon.com/gp/browse.html?node=342335011">Amazon SimpleDB homepage</a>:</p> <blockquote> <p>GET, PUT or DELETE <i>items</i> in your domain</p> </blockquote> <p>Sounds RESTful? <a href="http://www.dehora.net/journal/2007/12/16/amazon-simpledb-non-rest-api/">It isn't</a>. In fact, when Amazon's SimpleDB went public on Friday, December 12, 2007, the opening paragraphs on its homepage claimed it "RESTfulness". Now, after community backlash, the homepage seems to be mysteriously lacking such a claim and you must dig <a href="http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/?">deeper into documentation</a> to uncover such <a href="http://bitworking.org/news/277/SimpleDB-is-GETSful">fallacies</a>:</p> <blockquote> <p>Amazon SimpleDB REST calls are made using HTTP GET requests. The Action query parameter provides the method called and the URI specifies the target of the call. Additional call parameters are specified as HTTP query parameters. The response is an XML document that conforms to a schema.</p> </blockquote> <p>Some time ago I reviewed, what I believe, to be the <a href="http://16cards.com/2006/08/17/misunderstanding-rest/">major misunderstandings about RESTful principles</a>. I categorized three different "interpretations" of REST:</p> <blockquote> <ol> <li>(Unicorn) REST describes those pure implementations that the fanboys aspire to (think Atom Publishing Protocol). These are only slightly more common than unicorns but more and more “true” REST implementations are appearing. </li> <li>(Anything HTTP that is not SOAP) REST is an umbrella labeling implementations that are riding the REST hype but have never read Fielding’s dissertation. These are more appropriately called HTTP-POX. </li> <li>(Somewhere in between) REST </li> </ol> </blockquote> <p>Amazon clearly interprets REST as category #2.</p> <div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f736941b-dce4-4dbe-9c93-367ba4935fbd" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">Technorati Tags: <a href="http://technorati.com/tags/simpledb%20rest%20amazon" rel="tag">simpledb rest amazon</a></div>
Five Things2007-09-27T00:00:00-07:00http://16cards.com/2007/09/27/five-things<p>I was <a href="http://bitworking.org/news/Five_Things">tagged</a> by Joe Gregorio. A very long time ago. At the time my motive was to stop the viral madness. But, in sweeping out my drafts folder, I figured why not post the five things without 'tagging' anyone else:</p> <ol> <li>I lived in <a href="http://maps.google.com/maps/ms?ie=UTF8&hl=en&msa=0&ll=-29.276816,30.440369&spn=1.741687,2.900391&t=h&z=9&om=1&msid=117621609987943563644.00043afa1d37fbe490c80">Durban, South Africa</a> from 1997 to 1999 serving a mission for my <a href="http://www.lds.org">church</a>. I'm saddened that many of the life-long friendships I made there have already ended in the 8 years since due to the AIDS crisis in South Africa. It really is a tragedy.</li> <li>I have the most amazing wife and mother of my two children of 3 years and 9 months.</li> <li>I lack the confidence that many exhibit in this industry. This explains why many of my thoughts never get to this blog. I just need to write confidently.</li> <li>I like being the center of attention on my own terms. For example, I can be annoyingly outgoing in one setting only to appear extremely shy in another.</li> <li>I played bass guitar in <a href="http://www.last.fm/music/Before+Braille">Before Braille</a>, a now <a href="http://www.beforebraille.com">defunct rock band</a>. Toured our little hearts out but couldn't make a dent in the music industry. We opened for <a href="http://www.jimmyeatworld.com/">Jimmy Eat World</a>, the Used, and the Format, among others. It was a lot of fun and, if anything, touring months on end taught me that I wanted the married life. </li> </ol>
Entities are not resources2007-09-27T00:00:00-07:00http://16cards.com/2007/09/27/entities-are-not-resources<p>I've been thinking about data access a lot lately from two fronts:</p> <ol> <li>Distributed--in particular HTTP, siding primarily with standardizing on the Atom Publishing Protocol as the default implementation of REST </li> <li>In-process--in particular Java</li> </ol> <p>As a result of my pondering, I believe there are two larger classifications of applications in the real world:</p> <ul> <li>Entity-oriented applications define a clear set of entities for the application and use them for all operations. </li> <li>Data-oriented applications split up code in one logic layer and one data access layer. However, the data access layer manipulates the tables directly, not always passing through an entire entity representation.</li> </ul> <p>In my opinion, the data-oriented method is the way people actually code their applications. Recently, I've spent time on a mailing list trying to teach the principles of REST, a highly arguable topic because it means different things to different people. To some, it means anything HTTP that isn't SOAP. To others, it is an architectural style, HTTP the way it was designed.</p> <p>I side with the later.</p> <p>So, in thinking about distributed data access in context of the discussions on this mailing list, I've come to realize that people are cramming their traditional, in-process data access mindset into HTTP. Its not their fault, they've been conditioned that way because of API creators.</p> <p>As an example, consider the typical scenario below:</p> <p>You have <strong>customer</strong> and <strong>order</strong> tables and need to display in a grid each customer and the total number of orders.</p> <p>In entity-oriented applications, there are two primitives: entity (or resource in REST) and lists of entities. Here, the developer codes to simply load all the customers. Then, in each customer entity, a link points to list of order entities.</p> <p>In data-oriented applications, most of the time, you will have a query in your access layer such as "SELECT c.name, count(o) FROM customer c INNER JOIN order o ON c.id = o.customer_id GROUP BY c.name". The result of this query can not be mapped to an entity. If you want to use the result, you will need to one of the following:</p> <ul> <li>Bind the ResultSet to managable grid of sorts </li> <li>Load the ResultSet into some disconnected structure for later usage <ul> <li>DataSet </li> <li>XML </li> <li>other structure</li> </ul> </li> </ul> <p>Both solutions can lead to clean, well-defined applications. It all depends on your needs.</p> <p>In the data-oriented application, it is often hard to know what are the data structures that are passed across tiers because they may vary by implementation. For instance, Array for a single column select, XML for complex results, DataSet, custom classes (Hibernate, JPA).</p> <p>However, in entity-oriented appications, other problems may appear: performance, partial entity loading, complex database structure, etc.</p>
User-driven, Pre-emptive APIs2007-09-25T00:00:00-07:00http://16cards.com/2007/09/25/user-driven-pre-emptive-apis<p>Aneel makes an argument for "tools vs. methods". To summarize, should tools enforce the methodology or methodology the tool.</p>
<blockquote>
<p>Tools need to move when we do. And they need to be made to be moved by us. But, not in a vacuum. The idea of user-driven innovation should be built into professional tools. In organizations where policy and methodology comes down from on high, when a method-enforcing tool is modified by an end-user (hi!), the bigwigs should go: “huh, Bob is doing this differently.. wonder if he’s onto something?”. Then someone should go find out if he is. </p>
</blockquote>
<p>Source: <a href="http://joga.be/2006/12/05/tools-vs-methods/">tools vs. methods</a> </p>
<p>IBM Rational has the concept of patterns built into the tool. Internally, IBM has contests (accompanied with decent rewards) for developing patterns for Rational.</p>
<p>The same argument can be made for APIs in general. Can APIs be designed in such a flexible way that when a use case changes, so can the result when the API is invoked? <em>Can we ship with n patterns and best practices but leave the API wide open for anybody to plug in their own functionality?</em></p>
<p>You bet we can. And then, falling back on Aneel's argument, once the bigwigs see that users are creating patterns, perhaps include it into the API as convenience methods.</p>
<h3>Pluggable Data API</h3>
<p>For instance, I'm working on a data access API that wraps JDBC access and ships with <a href="http://en.wikipedia.org/wiki/PureQuery"><strong><em>IBM's pureQuery</em></strong></a>. The main goals of the API is to enable <strong>clearer persistence code</strong> by using code to describe what is being done instead of how it is being done. Second, drastically <strong>reduce the boilerplate code</strong> associated with JDBC. Third, <strong>use collections and beans</strong> rather than ResultSet. Fourth, <strong>do not be a full-featured object relational mapper</strong>.</p>
<p>Let's look at some of the methods available. The variable "data" in these examples are an instance of the "Data" interface, which defines these methods, and assumes it has been constructor injected with a DataSource.</p>
<p>First, you can get a Map out of a table row:</p>
<pre>Map<String,Object> brian = data.queryFirst("SELECT * FROM person WHERE person.name=?", "Brian");</pre>
<p>If you want to get at many rows:</p>
<pre>List<Map<String,Object>> people = data.queryList("SELECT * FROM person WHERE person.name LIKE ?", "Br%");</pre>
<p>Second, you can get a POJO bean out of a table row:</p>
<pre>Person brian = data.queryFirst("SELECT * FROM person WHERE person.name=?", Person.class, "Brian");</pre>
<p>Likewise, beans as from many rows:</p>
<pre>List<Person> people = data.queryList("SELECT * FROM person", Person.class);</pre>
<p>But what if you want to get a the result(s) of a single column, say from an aggregate function, for instance, you could retrieve a String by:</p>
<pre>String name = data.queryFirst("SELECT name FROM person WHERE person.name=?", new ScalarRowFactory<String>(String.class),"Brandon");</pre>
<p>What's with the "ScalarFowFactory", you ask? Well, I'm glad you did. This is the pluggable part, where user-driven extendibility makes all the difference. It would be naive to think that an API could be created that would meet all needs for all people. In fact, I often tell my collegues I work with <strong><em>"If you try to create for all, you provide value for none".</em></strong> That's worth repeating...</p>
<h3><font color="#666666">If you try to create for all, you provide for none.</font></h3>
<p>This is the problem with JEE. It tries to boil the ocean and be the end all framework. Then we get lighter weight contenders like Spring and Co. Granted, with 1.4, we see reactive APIs for those uncomfortable with the heavyweight requirement imposed by JEE. Others see an easier method and create APIs to meet the need. Now JEE is adapting.</p>
<p>So this is all about creating <strong><em>pre-emptive APIs</em></strong>. What is a pre-emptive API? It is an API that <strong><em>leaves open doors for developers to customize</em></strong> the programming experience. Yes, and that means allowing them to shoot themselves in the foot, too. Sure, we can provide convenience methods on top in the API itself, but it should not play a Microsoft and have special privileges that the user-driven portion does not.</p>
<p>Would JEE be different had it been built with a pre-emptive APIs?</p>
<p>So, in the above example, the Map and bean examples simply drive through the same methods that the String example did. They are simply helper methods.</p>
<p>The API, however, is wide open. Methods can be of type queryFirst, queryList, queryIterator, or just plain query. queryFirst deals with one result. queryList deals with a collection of results and pre-processes results. queryIterator is like queryList but provides a lazy retrival of results on demand in user code and is more efficient in some situations.</p>
Dumbledore Gets It, Why Doesn't Data?2007-09-25T00:00:00-07:00http://16cards.com/2007/09/25/dumbledore-gets-it-why-doesnt-data<p>I'm a big fan of <a href="https://docs.google.com/">Google Docs</a>. One of my favorite features is "Revisions": when a file is saved, an immutable state or versioned is saved and can be recalled. With a simple drop down box, I can restore a previous version.</p> <p>Later, I'm talking with my brother-in-law about upcoming features of Mac OS X 10.5. And we spend a good deal of time postulating how <a href="http://www.apple.com/macosx/leopard/features/timemachine.html">Time Machine</a> will change the world. (If you haven't checked out the UI twist on a fairly standard storage backup infrastructure.</p> <p>The other night, I finished Harry Potter and the Deathly Hallows. (Loved it, by the way). In this final chapter of Harry's tragic teenage angst, Harry brings us with him in to <a href="http://harrypotter.wikia.com/wiki/Pensieve">the Pensieve</a> just as he did in previous books to learn of critical plot details by 'experiencing' firsthand other people's memories. A proxied flashback, if you will.</p> <p>And then it hits me.</p> <p>Why isn't all data modeled to be versioned? This universe we live in has one constant, we are on a linear timeline. (Yeah, yeah. Relativistic effects. But as far as I know, science has yet to coerce time to reverse, much less stand still.) Versions, memories, immutable state, what have you. We experience life as a series of observations. Conjuring a 'view' of those observations is a 'memory'. It seems so entwined with our very nature that it seems like major oversight that all data is not versioned.</p>
When he's done, wipe his bum2007-09-24T00:00:00-07:00http://16cards.com/2007/09/24/when-hes-done-wipe-his-bum<p>Isn't <a href="http://in.relation.to/Bloggers/WebBeansSneakPeekPartIIntroducingWebBeans">Web Beans</a> not just a little embarrassing, but an extremely painful admission for the Java world? Do not read this as an attack on Web Beans itself, but the implications represented by its mere existence. What problems is it solving? It is a solution for JEE 5's current complexity, which was (JPA in particular) drastically re-engineered from its previous iteration. So it provides a unification API for existing APIs, which was an abstraction of previous APIs, and so on. Rinse, repeat.</p>
<p>Isn't this a bit like grasping for straws when the only straws left are the short ones. Arriving far after <a href="http://en.wikipedia.org/wiki/Eeny,_meeny,_miny,_moe">'eeny, meeny, miny, moe'</a> has already pardoned a few. The community is left to deal with the grand unified results, only to face another abstraction a year later because the current API isn't 'simple' enough.</p>
<p>Which reminds me of <a href="http://en.wikipedia.org/wiki/There_was_an_Old_Woman_Who_Lived_in_a_Shoe">another nursery rhyme</a>. Even a leather shoe is edible with enough boiling and gravy. But that doesn't mean you should eat it.</p>
<blockquote>
<p>There was an old woman who lived in a shoe.<br />She had so many children, she didn't know what to do.<br />She gave them some broth without any bread,<br />Then whipped them all soundly and put them to bed.</p></blockquote>
<p>Hmmm, interpretation is left as an exercise for the reader.</p>
contekst.org » Blog Archive » Why did Java succeed ?2007-08-24T00:00:00-07:00http://16cards.com/2007/08/24/contekstorg-blog-archive-why-did-java-succeed<p><a href="http://contekst.org/blog/?p=21">contekst.org » Blog Archive » Why did Java succeed ?</a> </p> <blockquote>I have a sneaking suspicion that existing customer sets will not replace Java, there is way too much invested in the language, the libraries, the VM and in J2EE application servers. The change has to come from a new customer set.</blockquote> <p>Not only new customer sets, but new classes of applications.</p> <p>Ruby on Rails, in my opinion, is the crowning achievement after nearly a decade of thinking in terms of the Model View Controller design pattern. There is no doubt that smart conventions + ActiveRecord (and other nicities) do, in reality, enable an agile development experience.</p> <p>However, the real reality is that the M in MVC almost always means relational database without much thought. So much data</p>
Tab Sweep2007-07-26T00:00:00-07:00http://16cards.com/2007/07/26/tab-sweep<p>I think my list is indicative that I divide my attention too thin:</p>
<ul>
<li><a href="http://www.redmonk.com/cote/2007/07/25/javas-fear-of-commitment/">Java's Fear of Commitment</a>
</li><li><a href="http://www-03.ibm.com/developerworks/wikis/display/objectgridprog/Basic+EntityManager+tutorial">ObjectGrid v6.1 User Guide</a>
</li><li><a href="http://grails.codehaus.org/GORM">Grails Object Relational Mapping</a>
</li><li><a href="http://simile.mit.edu/wiki/Exhibit/Examples">Exhibit Examples from the SMILE project</a>
</li><li><a href="http://media.rubyonrails.org/presentations/worldofresources.pdf">World of Resources in Rails</a>
</li><li><a href="http://intertwingly.net/code/venus/planet.py">Planet Venus Code</a>
</li><li><a href="http://robaccia.googlecode.com/svn/trunk/robaccia/__init__.py">Robaccia Code</a>
</li><li><a href="http://pleac.sourceforge.net/pleac_python/index.html">PLEAC-Python</a>
</li><li><a href="http://intertwingly.net/blog/2007/06/28/Publishing-a-Blog-From-a-mod-atom-Store">Publishing a blog from a mod_atom store</a>
</li><li><a href="http://wiki.apache.org/jakarta-commons/DBCP">Apache DBCP</a>
</li><li><a href="http://www.onlamp.com/pub/a/onlamp/2007/07/12/the-power-of-google-gears-part-2.html?page=1">The Power of Google Gears</a>
</li><li><a href="http://plagger.org/trac">Plaggar</a>
</li><li><a href="http://bitworking.org/projects/apexlearningcenter/mail.py.txt">Form to GData Spreadsheet</a>
</li><li><a href="http://pydispatcher.sourceforge.net/pydoc/dispatch.dispatcher.html">Python dispatch</a>
</li><li><a href="http://ibatis.apache.org/docs/ruby/">RBatis</a></li></ul>
Microsoft Surface, iPhone and the future of UI2007-05-30T00:00:00-07:00http://16cards.com/2007/05/30/microsoft-surface-iphone-and-the-future-of-ui<p><img src="http://farm1.static.flickr.com/220/521352867_5d81f539db_o.jpg" align="right"/> </p> <p> </p> <p>While interning at Microsoft during the summer of 2005, I had the opportunity to meet with the team working on the just announced <a href="http://www.microsoft.com/surface/">Surface</a>. Its difficult not to get excited about this type of technology. Its pervasive, consuming, and introduces new markets for software.</p> <p>Surface is a large horizontal display that enables users to interact through touch, natural gestures, and physical objects. This means no "legacy" input devices such as the mouse or keyboard. The <a href="http://www.microsoft.com/presspass/press/2007/may07/05-29MSSurfacePR.mspx">press release</a> states that near the end of this year Surface will be in "hotels, retail establishments, restaurants and public entertainment venues."</p> <p>So, this tells us that Surface is expensive. Really expensive. Expensive enough that it isn't being marketed to consumers for the home. It will over time. And it will be a hit. The computer will be social. Imagine playing Monopoly, Trivial Pursuit, or (better yet) Ticket to Ride with your family. Or watching the NBA playoffs on the wall while interacting with player stats, chatting with friends, and annotating the last play like the announcers do on your coffee table.</p> <p>This is the future of UI. And it will be revolutionary. Whether it takes is a matter of cost. From the press release, I see it nothing more than a boutique technology, much like laser disc and touch screen technology 15 to 20 years ago.</p> <p>Apple has done the same with iPhone. But there has been concern that Apple will not open iPhone up to 3rd party applications. Surface, on the other hand, is what Microsoft does best...a platform. Apple is doing what it does best. A human accessory. iPod, MacBook, iPhone. Apple's hardware compliment a person's personality. Microsoft's hardware, XBOX, tablet, and now Surface, augment a person's capability.</p> <p><img src="http://farm1.static.flickr.com/250/521348797_f3b8322df8_m.jpg"/> <img src="http://farm1.static.flickr.com/233/521140756_eb20044f12_m.jpg"/></p>
why the lucky hack2007-05-29T00:00:00-07:00http://16cards.com/2007/05/29/why-the-lucky-hack<p>So <a href="http://whytheluckystiff.net/">'why the lucky stiff'</a> has revealed the <a href="http://redhanded.hobix.com/cult/hacketyOrg.html">latest project</a>, which is the culmination of several projects. Clearly impressed with <a href="http://code.whytheluckystiff.net/">everything from why</a>, <a href="http://hackety.org/">Hackety Hack</a> deeply resonates with me. Having my first programming epiphony implementing the de facto 'tic tac toe' in <a href="http://en.wikipedia.org/wiki/BASIC">BASIC</a> for my brothers to play with, why is providing the same for a new generation.</p> <p>From Hackety Hack...</p> <blockquote> <p>In the 1980s, a language called BASIC swept the countryside. It was a language <strong>beginners could use</strong> to make their computer speak, play music. You could easily draw a big smiley face or a panda or whatever you like! But not just BASIC. Other languages like: LOGO and Pascal were <strong>right there</strong> on many computers.</p> <p>In this century, you may have dozens of programming languages lurking on your machine. But how to use them?? A fundamental secret! Well, no more. <strong>We cannot stand for that.</strong> Hackety Hack will not stand to have you in the dark!!</p></blockquote>
Old Dog, New tricks2007-05-29T00:00:00-07:00http://16cards.com/2007/05/29/old-dog-new-tricks<p><img style="margin: 0px 0px 2px 17px" alt="You can't teach an old dog new tricks" src="http://farm1.static.flickr.com/106/284498923_10dfd180ba_m_d.jpg" align="right"/> </p> <p>They say "you can't teach an old dog new tricks." That's not always true.</p> <p>In a previous post, <a href="http://16cards.com/2007/05/22/enterprise-vs-consumer-ibms-false-distinction/">Enterprise vs. Consumer: IBM's false distinction</a>, I layed out the need for IBM to approach software development differently; one that has a renewed focus on the consumer, or end users. At the root of the problem is the hype around Web 2.0, the phenomenon producing countless deployments of consumer-oriented software. What was "Now with SOA" is getting the "Now with Web 2.0" shiny sticker.</p> <p>If anything, Web 2.0 software has a social flair that amplifies its usefulness through the voice (and therefore content) of users. Software development frameworks and platforms, upon which much of this Web 2.0 software is built, as well, are evolving. Its not just about agile methodologies, its about agile frameworks. For instance, as application artifacts are created in Rails, test cases are automatically generated as well, encouraging a test driven development from the start.</p> <p>The adoption of new technologies are taking hold at double, and sometimes triple, previous rates. For instance, in the United States, the diffusion of the automobile from 25% to 75% saturation took roughly 75 years. The telephone, nearly 50 years. Electricity, 25 years. Then an acceleration of technology adoption took place with the radio, television, and VCR taking just over a decade each to achieve this diffusion. Similar trends are currently seen with personal computers, cell phones, and the broadband Internet.</p> <p>The fact is consumers, and enterprises, are becoming more adept to adopting new technologies. Let's focus on the enterprise. Several years ago, Nicholas Carr declared that "<a href="http://www.nicholasgcarr.com/articles/matter.html">IT Doesn't Matter</a>." Yet in recent surveys, CEOs indicate that there is a renewed focus on innovation. Carr's IT tends to focus more on the "T" in IT...technology. His technology is one of cost-cutting and efficiency, a commodity. But he makes it very clear that technology plus other factors can differentiate. He speaks truth behind the controversial title. As stated previously, the cycle of technology adoption and emulation by competitors is shrinking.</p> <p>However, from my perspective, Web 2.0 shows that technology, combined with social factors, can still differentiate. And that is way it will always be..."Technology + {factor}". The organization that has the most compelling {factor} wins since technology is a commodity.</p> <p>My <a href="http://16cards.com/2007/05/22/enterprise-vs-consumer-ibms-false-distinction/">previous post</a> is misleading. It falsely indicates that IBM cannot evolve its culture to meet the needs of its customers meeting the expectations of its customer. Whew. That was a mouthful. There are many that get it. And there are some trying to do everything in their power to make the necessary cultural changes.</p> <p>New tricks are just for kids. <a href="http://www.channelweb.co.uk/vnunet/news/2190484/ibm-looks-open-development">This is just the beginning</a> ...Technology + {factor}</p>
I'm a Marvel...and I'm a DC2007-05-27T00:00:00-07:00http://16cards.com/2007/05/27/im-a-marveland-im-a-dc<p><img src="http://img.youtube.com/vi/LvFjo5TTY6c/2.jpg"/> </p> <p><a href="http://www.youtube.com/profile_videos?user=ItsJustSomeRandomGuy">Genius...</a></p>
Providing value to no one: why software is not "electable"2007-05-22T00:00:00-07:00http://16cards.com/2007/05/22/providing-value-to-no-one-why-software-is-not-electable<p>Several months ago, Seth Godin wrote an <a title="Electable vs. Marketable" href="http://sethgodin.typepad.com/seths_blog/2007/01/electable_vs_ma.html">insightful piece</a> on the difference between "electable" and "marketable," claiming that it is easy to get the two confused.</p> <blockquote> <p>To be <em>marketable</em>, you must be remarkable. Marketing isn't about getting more than 50% market share, it's about spreading your idea to enough people to be glad you did it...</p></blockquote> <p>Godin uses Hillary Clinton and Barak Obama as examples of remarkable politicians that will be lucky to find themselves in the White House. They are, therefore, marketable but not electable.</p> <p>Is this always true in software? Look at Java. It isn't just a language. Rather it is a "platform", a series of specifications that is only thriving because of timing in the mid-90's. It was "elected" (arguable) as a platform for the web by most industries and quite successfully marketed (again, arguable). I can still hear the ringing voice of my manager circa 2001... "You see, EJB's will solve that problem."</p> <p>However, I believe Java's marketability is wanning in the face of much more marketable platforms...<a href="http://www.rubyonrails.org/">Rails</a>, <a href="http://www.djangoproject.com/">Django</a>, <a href="http://plone.org/">Plone</a>, et al. A language like Java comes around every decade or so. Fortran, Cobol, C, etc. Through strange market pressures Java became a ubiquitous language, in spite of its technical merits. I often ponder what 2007 would be like had IBM backed the Smalltalk horse.</p> <p>I have been on projects where the motif was to "solve a constrained problem" yet the project failed because the scope increased behind our backs. On one level or another it is human nature to want to be "elected." In this case, to develop electable software.</p> <p>Recently it has become my motto that...</p> <blockquote> <p>Providing value to everyone, provides value to none</p></blockquote> <p>I remember, in developing a framework for ColdFusion several years ago, telling my friend and co-developer "everyone wants to build a framework." Why is that? Why do developers gravitate to building frameworks?</p>
Enterprise vs. Consumer: IBM's false distinction2007-05-22T00:00:00-07:00http://16cards.com/2007/05/22/enterprise-vs-consumer-ibms-false-distinction<p><a href="http://www.redmonk.com/jgovernor/2007/04/04/why-ibms-steve-mills-should-be-like-king-canute/">James Govenor of RedMonk observes that the tide is changing in the software industry</a>. Where many have viewed Web 2.0 as simply eye candy or a different class of applications for consumers, James cuts right to the heart and soberly declares that IBM is on the path to loosing a software battle much like they lost the PC hardware battle. I concur.</p> <p>At IBM, we systemically divide "consumer" and "enterprise". Our entire culture, everything from sales (pricing of services, hardware, and software and incentive structure) to services to product group to research, focuses on what IBM claims they know best...the enterprise. And we've been very successful. But there is no way we are ready for an ecomony where micropayments are king. 2 cents a transaction? Sales won't touch an engagment unless it is in the millions.</p> <p>But what about emerging economies? I don't mean emerging countries. I'm talking about Web 2.0. Om Malik is quoted saying "On this Web 2.0 highway, there are three exits: Microsoft, Yahoo, and Google." Where is IBM? Well, have we completely positioned ourselves out of the consumer business? Are there enough experts or thought leaders in this space at IBM to make a splash?</p> <p>If Web 2.0 means anything to me it is that consumers are demanding convergence. IBM may get paid by enterprise customers, but who pays IBM's customers? In a time where IBM's customers' customers are demanding a digital lifestyle to follow them wherever they go, IBM seems to be raising barriers of entry to new customers and potential community members. Increasing complexity for the sake of complexity to win over service agreements.</p> <p>Further, with the lure of next-gen frameworks such as <a href="http://www.djangoproject.com/">Django</a> and <a href="http://www.rubyonrails.org/">Rails</a>, smaller shops are more effective. This may be a blip on IBM's radar right now, but what really matters is what what is the favored tools of college kids. I've heard many call this class of developers and their tools "toys". </p> <p>True, nobody got fired for buying IBM, but in this emerging economy, will we be in position to be bought?</p>
Outlook 2007 Feature Feedback2007-03-17T00:00:00-07:00http://16cards.com/2007/03/17/outlook-2007-feature-feedback<p>During my Master's degree I interned with Microsoft. Specifically, I interned as a Program Manager with the Office Outlook team. My job for the summer was to become an expert in time zones, drive features for the 2007 release.</p> <p>Those close to me know how immersed I can become in something. That summer, I threw myself at the problem and emerged with a two-staged strategy for the Outlook team. First, a set of "easy" stuff for the 2007 release. Second, radically rethink time management so that it completely embraces time zones.</p> <p>Two of my features found their way into the last two public betas and then final relese of Outlook 2007. The first feature enables a calendar event's start and end times to be specified in the context of a time zone. The second feature can detect time zone information change and migrate an entire calendar's entries to a new time zone and then notify meeting participants of the change. The user is prompted with the option to migrate if the system time zone has changed or patched with new time zone information (i.e. Daylight Saving Time rules).</p> <p>My vanity got the best of me recently and I went searching on what people were saying about the features now that Outlook 2007 has been "out in the wild" for a few months. Feedback, in general, is VERY positive. Here are some links to what I found...</p> <ul> <li><a title="http://www.technotesblog.com/?p=140" href="http://www.technotesblog.com/?p=140">http://www.technotesblog.com/?p=140</a></li> <li><a title="http://marypcb.livejournal.com/190183.html" href="http://marypcb.livejournal.com/190183.html">http://marypcb.livejournal.com/190183.html</a></li> <li><a title="http://blogs.msdn.com/melissamacbeth/archive/2006/06/09/624236.aspx" href="http://blogs.msdn.com/melissamacbeth/archive/2006/06/09/624236.aspx">http://blogs.msdn.com/melissamacbeth/archive/2006/06/09/624236.aspx</a> (disclaimer: Hank Leukart, my "mentor" for the duration of my internship, guest posting on Melissa Macbeth's blog)</li> <li><a title="http://blogs.msdn.com/ddysart/archive/2006/08/14/699546.aspx" href="http://blogs.msdn.com/ddysart/archive/2006/08/14/699546.aspx">http://blogs.msdn.com/ddysart/archive/2006/08/14/699546.aspx</a></li> <li><a title="http://www.office-outlook.com/outlook-news/microsoft-outlook-2007-review.html" href="http://www.office-outlook.com/outlook-news/microsoft-outlook-2007-review.html">http://www.office-outlook.com/outlook-news/microsoft-outlook-2007-review.html</a></li> <li><a title="http://www.calendarreview.com/2007/02/15/outlook-causes-mini-y2k/" href="http://www.calendarreview.com/2007/02/15/outlook-causes-mini-y2k/">http://www.calendarreview.com/2007/02/15/outlook-causes-mini-y2k/</a> (In the summer of 2005, I was quite grave about the Daylight Saving Time change. I identified that the largest pain point would be that meetings scheduled during the overlap between new DST start [early March] and old [early April] on a system prior to having the operating system patched with new DST information. My claim was that users would see this as Outlook being fragile and that we should prepare. See next link...)</li> <li><a title="http://www.office-outlook.com/outlook-news/microsoft-outlook-2007-review.html" href="http://www.office-outlook.com/outlook-news/microsoft-outlook-2007-review.html"></a><a title="http://office.microsoft.com/en-us/outlook/HA102086071033.aspx" href="http://office.microsoft.com/en-us/outlook/HA102086071033.aspx">http://office.microsoft.com/en-us/outlook/HA102086071033.aspx</a> (Congress was close to passing the law for the Daylight Saving Time change that started this year at the end of my internship. I proposed a tool to fix calendar and task events for older Outlook clients.)</li> <li><a title="http://msdn2.microsoft.com/en-us/library/bb176877.aspx" href="http://msdn2.microsoft.com/en-us/library/bb176877.aspx">http://msdn2.microsoft.com/en-us/library/bb176877.aspx</a><strong> </strong>(getting better Outlook extensibility support for time zones)</li> <li><a title="http://blogs.msdn.com/cjohnson/archive/2006/05/08/592014.aspx" href="http://blogs.msdn.com/cjohnson/archive/2006/05/08/592014.aspx">http://blogs.msdn.com/cjohnson/archive/2006/05/08/592014.aspx</a></li> <li><a title="http://blog.madd0.com/?p=133" href="http://blog.madd0.com/?p=133">http://blog.madd0.com/?p=133</a></li> <li><a title="http://news.office-watch.com/t/n.aspx?articleid=19&zoneid=9" href="http://news.office-watch.com/t/n.aspx?articleid=19&zoneid=9">http://news.office-watch.com/t/n.aspx?articleid=19&zoneid=9</a> (I totally agree with the author. Time zone support in Outlook 2007 is fairly marginal. See below.)</li></ul> <p>Several feature specifications didn't make it into the release, however, that would have made a lot of difference. Contractually, I unfortunately cannot discuss them. I do hope that they make it into future releases. However, Outlook 2007 plucked some low hanging fruit and that's great from Microsoft's customers. </p> <p>Further, the strategy document contained a treatise on how pervasive technology (i.e. Outlook plus some other things Microsoft was working on that summer) could "change the world" by making time zones dead simple. I'm only joking about changing the world. Well, maybe half joking since I was aiming to do for time (read calendar) management what <a href="http://www.davidco.com/">David Allen's Getting Things Done</a> has done for task management.</p>
100% guaranteed easiest way to do Enterprise 2.02007-03-12T00:00:00-07:00http://16cards.com/2007/03/12/100-guaranteed-easiest-way-to-do-enterprise-20<p>This rings very true. In my opinion, IBM does a fairly <a href="http://www.ibm.com/blogs/zz/en/guidelines.html">good job</a> of staying out getting out of the way. In fact, a lot of the internal community tool innovation going on over the last few years is <a href="http://www.snellspace.com/wp/?p=590">surfacing</a> as <a href="http://www-142.ibm.com/software/sw-lotus/connections">Lotus Connections</a>, which will enable enterprises with social tools. However, no amount of money can purchase a culture, which grows organically. Paraphrasing (former IBMer) Don Ferguson, "if you stand in the way of the Internet, it will run you over." But do follow the link and read these three bullet points in context:</p> <blockquote> <p>DO NOTHING</p> <p>GET OUT OF THE WAY</p> <p>KEEP THE ENERGY LEVELS UP</p></blockquote> <h6></h6> <p>Via Tim O'Reilly: <a href="http://theobvious.typepad.com/blog/2007/03/the_100_guarant.html">Link to The 100% guaranteed easiest way to do Enterprise 2.0?</a></p>
PUT is not UPDATE, cont'd2007-03-10T00:00:00-08:00http://16cards.com/2007/03/10/the-cafes-put-is-not-update<p> </p> <blockquote>PUT remains one of the most confusing HTTP verbs because it is so frequently misdescribed, even by <a href="http://www.xml.com/pub/a/2004/12/01/restful-web.html">people who really do know better</a>. The common description is that PUT is for UPDATE and POST is for creating new resources; and this is wrong, <em>wrong</em>, <strong>wrong</strong>.</blockquote> <p>Source: <a href="http://cafe.elharo.com/web/put-is-not-update/">PUT is not UPDATE</a> </p> <p>Elliote is dead on here. I am guilty of comparing REST to SQL CRUD, including PUT == UPDATE. Upon reflection, however, I always thought of a "complete" update...comparable to Eliotte's DELETE then INSERT with the same primary key. Nevertheless, despite intentions, UPDATE does carry certain connotations.</p> <p>Elliote references Joe Gregio's pioneering thoughts on REST from 3 years ago. It doesn't seem to suggest that PUT == "partial" UPDATE. I recall a Roy Fielding quote (but couldn't find the reference) in saying PUT is not a byte for byte replacement of the resource by the exact contents of representation. Rather, the server interprets the representation, but does in fact update the <em>entire</em> resource with information from the representation.</p> <p>Joe does place a disclaimer in the very article that it is dangerous to begin thinking of REST in terms of SQL tables.</p> <blockquote> <p>I hesitated to include this table. By presenting it, I wanted to point out the overlap in the four basic methods of HTTP. What I <strong>don't</strong> want to happen is that you start thinking of web resources as SQL tables. Don't do that.</p></blockquote> <p>Source: <a href="http://www.xml.com/pub/a/2004/12/01/restful-web.html">How to Create a REST Protocol</a></p> <p>So it seems the lesson (finally) learned by myself is to not describe REST to people in terms of ambiguous SQL idioms. There is some overlap, but no absolutes. If the SQL comparison is necessary, disclaim the caveats upfront.</p> <p>It's difficult to avoid thinking interms of SQL. Especially for me, having taking three courses on relational algebra in college. Opposite of my upbringing, however, traditional relational databases will be marginalized over the next decade as more specialize data systems become evident (i.e. BigTable).</p>
Using del.icio.us to find out what's on your colleagues' minds2007-03-05T00:00:00-08:00http://16cards.com/2007/03/05/delicious-to-find-out-whats-on-your-colleagues-minds<p>It's kind of fun getting a glimpse of what others are thinking about by subscribing to their del.icio.us bookmarks. Recently Joe Gregorio bookmarked the following...</p> <h6><a href="http://www.python.org/pypi/zdaemon">Python Cheese Shop : zdaemon 2.0a6</a></h6> <h6><a href="http://www.tildeslash.com/monit/">monit</a></h6> <h6><a href="http://www.plope.com/software/supervisor2/">plope - supervisor2</a></h6> <p>Hmmm, whatcha thinking about, Joe?</p>
Yahoo! Pipes2007-02-08T00:00:00-08:00http://16cards.com/2007/02/08/yahoo-pipes<p>Everyone is a buzz about Yahoo!'s Pipes. And rightly so. This type of mashup builder might finally rid the word "mashup" from Google Maps. I got about 10 minutes of play time before the Eastern seaboard woke up to give the new service a try.</p> <p>I need to play with this a bit more to have a better opinion. So would all of you just stop hitting the server? Until then, the only comment I have is Yahoo! missed a great opportunity to get rid of RSS's bugs by promoting Atom over RSS. I know that Yahoo! doesn't share my sentiment for Atom, however.</p> <p><a href="http://www.1060.org/blogxter/entry?publicid=79C5BAFEE327B28F116F8A7BFA1E178E">Yahoo! Pipes!</a></p> <p><u><font color="#669966"></font></u><a href="http://feeds.feedburner.com/~r/oreilly/radar/atom/~3/88005227/yahoo_pipes_dec.html">Yahoo! Pipes: Deconstructing a Pipe</a></p> <p><a href="http://feeds.feedburner.com/~r/oreilly/radar/atom/~3/88005228/yahoo_pipes_the.html">Yahoo! Pipes: The Modules for Building Pipes</a></p> <p><a href="http://www.emilychang.com/go/ehub/app/pipes/">Pipes</a></p> <p><a href="http://feeds.feedburner.com/~r/OmMalik/~3/88001026/">Yahoo's Pipes Hard to Grok But Snazzy</a></p> <p><a href="http://blog.programmableweb.com/2007/02/08/yahoo-launches-pipes-for-data-mashups/">Yahoo Launches Pipes for Data Mashups</a></p> <p><a href="http://feeds.feedburner.com/~r/Techcrunch/~3/87991940/">Yahoo! Launches Pipes</a></p> <p><a href="http://feeds.feedburner.com/~r/readwriteweb/~3/87983595/yahoo_pipes_rss_remixer.php">Yahoo Launches Pipes, an RSS Remixer</a></p> <p><a href="http://ajaxian.com/archives/yahoo-pipes-ajax-mashup-builder">Yahoo! Pipes: Ajax Mashup Builder</a></p> <p><a href="http://feeds.feedburner.com/~r/oreilly/radar/atom/~3/87934065/pipes_and_filte.html">Pipes and Filters for the Internet</a></p> <p>And that was just by 9:30 AM EST!</p>
Eleven Emerging Ideas for SOA Architects in 20072007-02-05T00:00:00-08:00http://16cards.com/2007/02/05/eleven-emerging-ideas-for-soa-architects-in-2007<p>Dion Hinchcliffe nails a growing sentiment among many over the last few year(s). There have been enormous unncessary resources spent on the WS-* vs. REST debate. And whether what flavor you side with, the movement REST pundits push, sometimes vehemently, is summarized by Hinchcliffe as..."leveraging the fundamental strengths of the Web to turn applications into platforms." [1]</p> <p>I've heard some refer to this as using HTTP the way it was intended, if you don't its like running with scissors. [2] The current state of SOA is not intentional. Rather, it is engineering tendancy to "boil the ocean." Nobody wanted to bastardize HTTP, nor did anyone set out to produce complex specifications thousands of pages long.</p> <p>When it comes down to it, WS-* and REST are Service Oriented Architecture. I, personally, argue that REST styles and principles exemplify the spirit of SOA more accurately. But that is subjective. Regardless, the time has come that architects look their work form different perspectives.</p> <p>So let's look at what Hingcliffe proposes SOA architects to consider in the coming year.</p> <ol> <li>Make services consumable in the browser</li> <li>Consider syndication over "service-ing"</li> <li>Deeply embrace URI addressibility</li> <li>Use Ajax as the face of your SOA</li> <li>Monetizing your SOA</li> <li>Enable users as service consumers</li> <li>Virtualization, fast scaling, and on-demand architectures</li> <li>Offer an SOA as visual services via widgets</li> <li>Consider JSON as a service option</li> <li>Encourage and discover emergent solutions</li> <li>Leverage the Global SOA</li></ol> <p>Hinchcliffe's article mirrors my thoughts over late 2005 and through 2006. The article acutely summarizes key movements in SOA. In my role at IBM, I have the opportunity to work on a project that addresses nearly all of these issues and influence IBM's future strategy in context of "Web 2.0". Over the coming weeks, I will be exploring each of topics in separate posts.</p> <p>Sources:</p> <p>[1] <a href="http://hinchcliffe.org/archive/2007/01/20/12675.aspx">Eleven Emerging Ideas for SOA Architects in 2007</a> </p> <p>[2] <a title="http://bitworking.org/projects/rest/6.html" href="http://bitworking.org/projects/rest/6.html">http://bitworking.org/projects/rest/6.html</a></p>
Web 2.0 Criticisms2006-11-28T00:00:00-08:00http://16cards.com/2006/11/28/web-20-criticisms<p>There are several criticisms about Web 2.0 going around lately on various blogs, including the <a href="http://www.regdeveloper.co.uk/2006/11/25/forward_to_the_distributed_revolution/">Register</a>...</p> <p>I disagree. Kathy Sierra put it nicely in her post on <a href="http://headrush.typepad.com/creating_passionate_users/2006/11/why_web_20_is_m.html">Why Web 2.0 is more than a buzzword</a>. The criticisms are from intelligent people. This is not just the Web 2.0 hatemongering in days, months, year past. These are well-informed criticisms.</p> <p>Kathy explains that there is a difference between elitism and experts. I believe there is a lot of elitism in Web 2.0. Especially the marketing side. However, there is a strong claim that the aggregate technologies, social software and software as a service is changing the way businesses can serve and profit from customers.</p>
Elitism is never good2006-11-28T00:00:00-08:00http://16cards.com/2006/11/28/elitism-is-never-good<p>Especially when we are trying to <a href="http://www.theregister.co.uk/2006/08/31/web_20_conference/">welcome peoplto the participatory age, folks...</a></p>
Java VM as a platform, not a language2006-09-11T00:00:00-07:00http://16cards.com/2006/09/11/java-vm-as-a-platform-not-a-languageThere are many sides to Java. Java EE, SE, ME and the hundreds of JSRs that "fit" somewhere else. Vendor collaboration has seen to that. The good news for Javists is that the powers that be seem primed and ready to open their minds to other languages.
Microsoft came out of the gate running with the idea of a single virtual machine (VM) supporting multiple languages with their Common Language Runtime (CLR). At first many in the Java camp balked at this idea. "Java as a language is powerful enough to accomplish requisite tasks," they said.
But hardware has since caught up to "other" languages making them highly competitive with features much to be desired. Namely, the syntactically terse, extremely expressive, dynamic ones...Python, Ruby, and Perl.
So it seems the JRuby folks, who Sun just hired are determined to move Java more dynamic. IT'S ABOUT TIME!..
<blockquote>"Once we've solved JRuby's issues, why not find a way to raise all ships? Support for invokedynamic, open classes, and closures at the VM level? Hooks for code generation, alternative typing systems, and deeper threading, IO, and memory integration? Seamless cross-app connectivity for dynlangs + Java EE with all the tasty agility we've come to love?"</blockquote>
Source: "Headius: More FAQs about JRuby and Sun" via <a href="http://www.intertwingly.net/blog/2006/09/08/JVM-futures">JVM futures</a>
Ted Leung provides a useful list for tracking dynamic language evolution on the JVM [paraphrasing]:
<blockquote>
<ol>
<li>Community</li>
<li>Compatibility</li>
<li>Performance</li>
<li>Velocity</li>
<li>Tooling</li>
</ol>
</blockquote>
Source: "Ted Leung on the air"
One Enterprise Tool to Bind Them All2006-08-18T00:00:00-07:00http://16cards.com/2006/08/18/one-enterprise-tool-to-bind-them-all<p>There is no <a href="http://www.cs.unc.edu/~brooks/">silver bullet</a>.</p> <blockquote> <p>There is no such thing as a single Enterprise wide tool for any company of reasonable complexity and its plain silly to believe that the next technology wave will be any different from previous ones in terms of delivering on the promise of the "one ring to bind them" vision of ERP/EAI/EDM/ESB.</p></blockquote>
Splitting REST2006-08-17T00:00:00-07:00http://16cards.com/2006/08/17/splitting-rest<p>I talk a lot about REST. You can probably guess what my day-to-day is like. Get used to it.</p> <p>There is a <a href="http://www.markbaker.ca/blog">Mark</a> vs. <a href="http://markclittle.blogspot.com/2006/08/mac-os-versus-windows-and-their.html">Mark</a> (gentle) <a href="http://www.markbaker.ca/blog/2006/08/13/the-unsittable-fence/">debate about REST, SOA, and WS-*</a>. (Hint: look at the comments...insightful).</p> <blockquote> <p>As for REST vs. SOA versus REST vs WS-*, I chose the former (despite noticing you using the latter) because you can’t really compare an architectural style to a set of specifications.</p></blockquote>
Misunderstanding REST2006-08-17T00:00:00-07:00http://16cards.com/2006/08/17/misunderstanding-rest<p>Jorgen Thelin concludes his current rant on Web 2.0 hype with...<br />
</p>
<blockquote cite="http://www.thearchitect.co.uk/weblog/archives/2006/08/000440.html">And, as if to underscore why I don't see the REST / POX / AJAX "religion" achieving too much traction among enterprises, try explaining the phrase <a href="http://jooto.com/blog/index.php/2006/08/08/replacing-service-oriented-architecture-with-resource-oriented-architecture/">"The Web is All About Relinquishing Control"</a> to any corporate security manager!</blockquote><p class="citation"><cite cite="http://www.thearchitect.co.uk/weblog/archives/2006/08/000440.html"><a href="http://www.thearchitect.co.uk/weblog/archives/2006/08/000440.html">TheArchitect.co.uk - Jorgen Thelin's weblog: Why Web 2.0 Needs WS-*</a></cite></p>
<p>Without getting into WS-* vs. REST...wait, I'll get into only briefly. It is unfair to make one-to-one comparisons of WS-* and REST. RESTful implementations are not as common as the brochures claim to be. Clearly, there is a range of REST. Three, in fact...</p>
<ol><li>(Unicorn) REST describes those pure implementations that the fanboys aspire to (think Atom Publishing Protocol). These are only slightly more common than unicorns but more and more "true" REST implementations are appearing.<br />
</li>
<li>(Anything HTTP that is not SOAP) REST is an umbrella labeling implementations that are riding the REST hype but have never read Fielding's dissertation. These are more appropriately called HTTP-POX.<br />
</li>
<li>(Somewhere in between) REST<br />
</li>
</ol>
<p>Back to Jorgen. He quotes Alex Bunardzic's post describing "<a href="http://jooto.com/blog/index.php/2006/08/08/replacing-service-oriented-architecture-with-resource-oriented-architecture/">Resource Oriented Architecture</a>". I feel his "The Web is All About Relinquishing Control" quote is taken out of context. Alex is claiming that Web 2.0 (and REST) is more about gravitating to standards-based message passing rather than proprietary protocols.</p>
<p>And before you claim that SOAP and WS-* is standards based (which it is), the moment you create a WSDL document, you've created a proprietary protocol. Sure, tools exist to generate "helper" code to talk to that protocol, but it is more or less proprietary.</p>
<p>Think back to all the problems <a href="http://www.xmlrpc.com/">XML-RPC</a>, which SOAP is based on, has caused. How many blog publishing protocols exist? Why? Because a new "standard" was created when even minor tweaks were made from the previous "standard" just as your web service must be versioned as you tweak the RPC interface. Now blog engines need to support a plethora of protocols.</p>
<p>The <a href="http://www.ietf.org/html.charters/atompub-charter.html">Atom Publishing Protocol</a> is not just Yet Another Publishing Protocol just as it was never intended only to be a protocol for manipulating episodic web content (think Atom Message Bus). It is an attempt to standardize the manipulation of the fundemental Web abstraction...the resource. As Alex claims the "file" is the fundemental abstraction that revolutionized computer programming decades ago, so too the "resource" abstraction is and will continue to revolutionize Web programming in ways we don't currently understand. There are <a href="http://bitworking.org/">those</a> that do.<br />
</p>
<p>Granted, WSDL 2.0 attempts to make ammend with a Doc Literal approach. And it may prove successful.<br />
</p>
Freedom and Safety Languages2006-08-17T00:00:00-07:00http://16cards.com/2006/08/17/freedom-and-safety-languagesKevin Barnes describes the difference between "freedom" and "safety" languages.<br />
<blockquote cite="http://www.journalhome.com/codecraft/9003/">Freedom languages are those languages that put the individual programmer at the center of their philosophical world.</blockquote><p class="citation"><cite cite="http://www.journalhome.com/codecraft/9003/"><a href="http://www.journalhome.com/codecraft/9003/">Code Craft - Freedom languages - JournalHome.com</a></cite></p>
<p>Some attributes of freedom languages:</p>
<ul>
<li>Reduce verbose language constructs</li>
<li>"Post-modern" languages</li>
<li>Syntactically dense</li>
<li>Examples:</li>
</ul><ul>
<li>Ruby</li>
<li>Python</li>
<li>Perl</li>
<li>Smalltalk</li>
</ul>
<p>Some attributes of safety languages:</p>
<ul>
<li>Contracts between modules, objects, and functions</li>
<li>Focus on teams rather than individuals</li>
<li>Remove language features that are confusing</li>
<li>Syntactically verbose</li>
<li>Examples:</li>
</ul><ul>
<li>C++</li>
<li>Java</li>
<li>C#</li>
<li>VB</li>
<li>Delphi</li>
</ul>
<p>Kevin claims that the philisophical differences can even be sensed just listening to how the advocates of a language describe its benefits and attempt to undermine other languages.<br />
</p>
REST vs. RESTful Application, Part 22006-08-16T00:00:00-07:00http://16cards.com/2006/08/16/rest-vs-restful-application-part-2<p>As if reading my mind from my <a href="http://16cards.com/2006/08/16/rest-vs-restful-application/">previous post</a>, <a href="http://www.innoq.com/st/">Stefan Tilkov</a> <a href="http://www.innoq.com/blog/st/2006/08/13/bruce_tate_on_ruby_and_rest.html">comments</a> on Bruce Tate's recent article "REST on Rails" on developerWorks.</p>
<p>Bruce says:<br />
</p>
<blockquote cite="http://www-128.ibm.com/developerworks/java/library/j-cb08016/index.html">In a nutshell, REST:<br />
<ul>
<li>Uses TCP/IP naming standards to name resources on the Web</li>
<li>Queries and manipulates those resources with HTTP<br />
</li>
<li>Uses standard text-based message formats like XML or HTML to structure data</li>
</ul>
</blockquote><p class="citation"><cite cite="http://www-128.ibm.com/developerworks/java/library/j-cb08016/index.html"><a href="http://www-128.ibm.com/developerworks/java/library/j-cb08016/index.html">Crossing borders: REST on Rails</a></cite></p>
<p>Stefan says:</p>
<blockquote cite="http://www.innoq.com/blog/st/2006/08/13/bruce_tate_on_ruby_and_rest.html">Maybe true for a RESTful application, but not for REST itself.</blockquote><p class="citation"><cite cite="http://www.innoq.com/blog/st/2006/08/13/bruce_tate_on_ruby_and_rest.html"><a href="http://www.innoq.com/blog/st/2006/08/13/bruce_tate_on_ruby_and_rest.html">Stefan Tilkov's Random Stuff: Bruce Tate on Ruby and REST</a></cite></p>
REST vs. RESTful Application2006-08-16T00:00:00-07:00http://16cards.com/2006/08/16/rest-vs-restful-application<p>Today I was reminincing with a colleague about discussions my team had during the early stages of my current project. To many on the team, the principles of REST were very new and we all had growing experiences with changing our thinking from RPC thinking to resource thinking. We have come a long way and I know our work will help our customers to take advantage of the benefits that RESTful application design offers.<br />
</p>
<p>A case in point. In one of the issues we were tackling during these early discussions dealt with the architecture of a distributed messaging system. Two solutions were proposed to contrast and learn REST principles. I won't go into exact particulars but will provide context.<br />
</p>
<p>The first consisted of a subscription system where Server B registers with Server A to receive events. It does this by POSTing a new entry into a collection on Server A with a URI to publish back events. Basically a callback system. WS-* has a similar mechanism.</p>
<p>The other solution consisted of comet-style requests.</p>
<p>Both adhere to REST principles, focusing on resources. The first is a RESTful application and the second is REST in general. I believe there is a clear difference.</p>
<p>For many on the team, the differences were subtle, claiming that the first did not adhere to REST principles because the server maintained state in the form of a subscription list. However, REST says nothing about application state, only that the interaction between client and server must remain stateless.</p>
<p> Simply put, the server does not maintain any information on behalf of a client required to successfully process a request. In other words...session.</p>
<p>So there is a difference between a RESTful application and REST.<br />
</p>
Microtemplates2006-08-16T00:00:00-07:00http://16cards.com/2006/08/16/microtemplates<p>I've been researching the viability client-side MVC implementations. This would involve rendering templates from raw data on the client. I came across <a href="http://microtemplates.org/mediawiki/index.php/Main_Page">microtemplates</a> which builds on the idea of microformats.<br />
</p>
<blockquote cite="http://microtemplates.org/mediawiki/index.php/Main_Page">Microtemplates are templates specified in plain HTML syntax that overload the CSS class attribute to indicate how to display data.</blockquote><p class="citation"><cite cite="http://microtemplates.org/mediawiki/index.php/Main_Page"><a href="http://microtemplates.org/mediawiki/index.php/Main_Page">Main Page - microtemplates</a></cite></p>
Love the Link2006-08-16T00:00:00-07:00http://16cards.com/2006/08/16/love-the-link<p>Sam Ruby comments on Web Oriented Architecture (WOA) and Resource Oriented Architecture (ROA), claiming them both excellent. But he feels the community is forgetting about the Web's fundemental building block...the hyperlink.<br />
</p>
<blockquote cite="http://www.intertwingly.net/blog/2006/08/08/WOA-vs-ROA">The link is the glue that holds the web together. It is what differentiates the web from protocols like ftp that merely serve as access methods for documents.The very notion of a link has become practically inexpressible and virtually unthinkable in the vernacular of SOA.</blockquote><p class="citation"><cite cite="http://www.intertwingly.net/blog/2006/08/08/WOA-vs-ROA"><a href="http://www.intertwingly.net/blog/2006/08/08/WOA-vs-ROA">Sam Ruby: WOA vs ROA</a></cite></p>
<p>For the last decade or so, HTML, the primary manifestation of the Web, has used links primarily for human consumptioin and manipulation. Google managed to do <a href="http://www.google.com/technology/">something useful</a> by deriving meaning out of the network of links. However, when a web page author thinks of a hyperlink, the anchor tag:</p>
<blockquote><a href="link_useful_to_computer">Useful text to human</a></blockquote><p>However, developments, such as the <a href="http://www.atomenabled.org/developers/tutorials/api-quick-guide.php">Atom Publishing Protocol</a>, are making use of links oriented to machines by providing semantics and meaning to links:<br />
</p>
<blockquote> <link href="http://.." title="Next 20 Entries" type="application/x.atom+xml" rel="next" /></blockquote><p>In the traditional anchor tag, enough information is provided for a human to make a decision and the machine to act as an agent in behalf of the human. With the second example, an XML element from <a href="http://www.atomenabled.org/developers/">Atom's Publishing Protocol</a> schema, provides meaning around the link, including the mimetype and the relationship.</p>
<p>We need to continue to work in the direction of providing hyperlinks for the machine.<br />
</p>
JavaScript Closures2006-08-16T00:00:00-07:00http://16cards.com/2006/08/16/javascript-closures<p>I found a fairly comprehensive essay/tutorial/FAQ about closure support in JavaScript. The document provides everything from definitions, ECMAScript prototype specifications, variable scoping, and examples.<br />
</p>
<blockquote cite="http://jibbering.com/faq/faq_notes/closures.html">The simple explanation of a Closure is that ECMAScript allows inner functions; function definitions and function expressions that are inside the function bodes of other functions.</blockquote><p class="citation"><cite cite="http://jibbering.com/faq/faq_notes/closures.html"><a href="http://jibbering.com/faq/faq_notes/closures.html">Javascript Closures</a></cite></p>
Jifty is Nifty2006-08-15T00:00:00-07:00http://16cards.com/2006/08/15/jifty-is-nifty<p>This could be huge...</p>
<p><a href="http://jifty.org/view/HomePage">Jifty</a><br />
</p>
<br />
JavaScript on the Server?2006-08-15T00:00:00-07:00http://16cards.com/2006/08/15/javascript-on-the-server<p>I don't know exactly how I feel about the idea of JavaScript executing on the server. Perhaps it is simply because JavaScript is immediately associated with web browser scripting. Other scripting lanaguges enjoy server processing success, so why not JavaScript.</p>
<p>Let's track how this one goes...</p>
<blockquote cite="https://phobos.dev.java.net/">Project Phobos is a lightweight, scripting-friendly, web application environment running on the Java platform, aimed at addressing emerging developer requirements.</blockquote><p class="citation"><cite cite="https://phobos.dev.java.net/"><a href="https://phobos.dev.java.net/">phobos: Project Phobos</a></cite></p>
Hype can be funny2006-08-10T00:00:00-07:00http://16cards.com/2006/08/10/hype-can-be-funny<p>Clearly, I do not endorse making light the seriousness the plight of some friends in Israel, but this low brow to Rails' supposed hype made me smile.</p>
<blockquote cite="http://www.theserverside.com/news/thread.tss?thread_id=41705#215369">Personally, I started building a production app with Rails as a test, and the Lebanese / Israeli conflict started up. Obviously World Peace is not one of its features! </blockquote><p class="citation"><cite cite="http://www.theserverside.com/news/thread.tss?thread_id=41705#215369"><a href="http://www.theserverside.com/news/thread.tss?thread_id=41705#215369">Ruby on Rails experiences serious security breach</a></cite></p>
RESTfully Thinking2006-08-07T00:00:00-07:00http://16cards.com/2006/08/07/restfully-thinking<blockquote>A resource can map to the empty set, which allows references to be made to aconcept before any realization of that concept exists -- a notion that was foreign to most hypertext systems prior to the Web.</blockquote><p><a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1">http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_2_1</a></p>
<p>This is an interesting concept. Through the use of status codes, I can indicate to a client the state of a URI. I can issue URIs to resources that do not exist yet and if a client dereferences the URI an appropriate status code indicates that it does not yet exist. The client can continue to request until it either receives a different status code or the representation is returned.<br />
</p>
RDF as I understand it2006-08-07T00:00:00-07:00http://16cards.com/2006/08/07/rdf-as-i-understand-it<p>I know I'm stating the obvious but posting for sanity sake. The anything can be described as a URI. Any URI can be related to another URI with a predicate. So...</p>
<http://16cards.com/person/Brandon_Smith><br />
<http://purl.org/relationship/father><br />
<http://16cards.com/person/Brooklyn_Smith><p>We're talking about a distributed relational system. How can we assert authority?<br />
</p>
Object Persistence vs. Data Access API2006-08-07T00:00:00-07:00http://16cards.com/2006/08/07/object-persistence-vs-data-access-api<p>I look at domain classes constructs from Rails' ActiveRecord and Django, among others, and am jealous. Although they make enough simplifying assumptions to make integration with existing database schemas a headache, their pure simplicity make it a home run for greenfield projects.</p>
<p>Switch to Java, and we have a simplified Java Persistence Architecture. It is simplified compared to previous attempts to a Java persistence API (EJB, etc). However, it is all relative. Pit JPA up against other domain class persistence and you find it quite embarassing. Although the JPA is a huge step in the right direction, it is still complicated.</p>
<p>You can't blame the JPA. You can't even blame Java. Since its inception, one of Java's selling points has been that it is statically typed. That means that in order to introduce new functionality at runtime, you have to jump through quite a few hurdles. There is no clean API. And, oh yeah, you might need to do byte code injection. Talk about a nightmare to debug.</p>
<p>But is Java's static nature now a bane to its existence? Microsoft seems to think so. C#, which was modeled after Java in order to win over Java developers, has introduced features traditionally available only to the dynamic language crowd. C# 1.0 made anonymous classes available. This matched Java's offering. C# 2.0 introduced anonymous functions. You can pass anonymous functions to be executed. C# 3.0 will introduce anonymous code blocks. Although the core of C# still maintains a Java-like syntax, these new features draw even closer to dyanmic languages.<br />
</p>
<p>The first treatment to make full use of anonymous code blocks is the new LINQ programming model. Language INtegrated Query seems to be the holy grail of data access lately. And begs the question. There seem to be two programming models. Object Persistence where a class maps to a table and Data Access API which is more general and provides helper functions to accomplish common tasks.</p>
<p>Which is more appropriate? From the Java community perspective, which is preferable? Is it a matter of preference and opinion or does the solution change according to requirements?<br />
</p>
Google BigTable: A Distributed Structured Storage System2006-08-07T00:00:00-07:00http://16cards.com/2006/08/07/google-bigtable-a-distributed-structured-storage-systemTwo weeks ago at OSCON Google announced their new offering...open source code hosting. Their initial feautres, although interesting, are not yet a compelling reason to move your project from SourceForge and the like. As all "beta" software, features will expand, be refined, and improve.
There were two interesting pieces that I picked on during the presentation that were orthogonal to the annoucement. First is how the developers handled structured data in a "label", semi-structured manner. I'll discuss that in another post as it deservers more attention.
The other hidden gem in the annoucement, in my opinion, is BigTable. Announced earlier, BigTable is a distributed structured storage system which Google uses throughout its offerings. For instance, although I have no proof (help me out if you find documentation), I'm sure it is used for Google's Calendar, Mail, Maps, etc.
I found the following video that presents the background and basic architecture of BigTable:
<blockquote cite="http://video.google.com/videoplay?docid=7278544055668715642">In this lecture at the University of Washington, Google's Jeff Dean discusses the Bigtable content storage system used in google's backend.</blockquote>
<p class="citation"><cite><a href="http://video.google.com/videoplay?docid=7278544055668715642">BigTable: A Distributed Structured Storage System - Google Video</a></cite></p>
Atom and Optimistic Concurrency2006-08-07T00:00:00-07:00http://16cards.com/2006/08/07/atom-and-optimistic-concurrency<p>Elias illustrates some thoughts about optimistic concurrency control and announces that Queso now implements OCC...<br />
</p>
<blockquote cite="http://torrez.us/archives/2006/08/04/477/">What does OCC as described by Google gives us? In my opinion, it takes Atom Protocol implementors (client and server) closer to a level where they can start thinking about merge procedures but they are not there yet.</blockquote><p class="citation"><cite cite="http://torrez.us/archives/2006/08/04/477/"><a href="http://torrez.us/archives/2006/08/04/477/">Elias Torres » Blog Archive » Optimistic Concurrency - Where is your merge code?</a></cite></p>
<p>The post reminded me of several questions I had when Google announced GData that I need to follow up on. If anybody has thoughts, please post.</p>
<ol><li>What is the ideal concurrency control as a service provider when the client cannot be controlled?</li>
<li>What type of merge procedures can be generalized for Atom?</li>
</ol>
For instance, depending on whether an Atom entry is an envelope for content or is subclassed as a data type, all of the core elements can probably be merged without ceremony in the former case except content. Further, is it fair to push the merge responsiblities down to the client? Can we trust the client?<br />
Unintentional, unfortunate domain names2006-08-01T00:00:00-07:00http://16cards.com/2006/08/01/unintentional-unfortunate-domain-names<blockquote cite="http://agylen.com/2006/07/17/unintentionally-funny-company-urls/">A site called ‘Who Represents‘ where you can find the name of the agent that represents a celebrity</blockquote><p class="citation"><cite cite="http://agylen.com/2006/07/17/unintentionally-funny-company-urls/"><a href="http://agylen.com/2006/07/17/unintentionally-funny-company-urls/">Agylen » Unintentionally funny company URLs</a></cite></p>
<p>Many of these in a top ten list of quite unfortunate domain names caused out loud laughter.</p>
Tri-XML and all those "Hidden" Conferences2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/tri-xml-and-all-those-hidden-conferences<p>How did I not know about this conference? It was right in my backyard. Someone needs to create a conference feed organized by date and by location. The big ones are easy to find and are rewarding. But it is often these smaller ones where the real issues are hammered out.</p>
<blockquote cite="Tri-XML 2006 Conference Schedule">This 4th annual conference is scheduled for July 27-29, 2006. With a theme of "XML in the Workflow", this conference includes a variety of presentations geared toward real-world use of XML.</blockquote><p class="citation"><cite cite="http://www.trixml.org/confindex.shtml"><a href="http://www.trixml.org/confindex.shtml">Tri-XML 2006 Conference Schedule</a></cite></p>
REST vs. WSDL2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/rest-vs-wsdl<p>Steve over at <a href="http://www.1060.org/">NetKernel</a> has an interesting take on the current state of <strong>Web services</strong> (the WSDL kind). It is the latest, and certainly not the last, that is helping me to shape my thoughts around the whole <strong>REST vs. SOAP/WSDL</strong> or <strong>REST compliments SOAP/WSDL</strong> debate.</p>
<p>Steve's comments are in reaction to <a href="http://www.pocketsoap.com/weblog/2006/07/1661.html">Simon of salesforce.com</a> and <a href="http://www.bloglines.com/blog/sanjiva?id=152">Sanjiva of the WSDL spec</a>.<br />
</p>
<blockquote cite="Steve: Developing on the Edge - No, blame whoever uses WSDL">Simon explains that the reason for returning an ID twice is related to the object model of the XSD, and goes on to fault the WSDL to Source tool chain for being differently quirky on every version.Sanjiva blames Salesforce and believes that someone took a nasty class hierarchy and auto generated XML Schema and WSDL out of it</blockquote><p class="citation"><cite cite="http://www.1060.org/blogxter/entry?publicid=7B3349B1BBFDD69D74DC287D65C0B092"><a href="http://www.1060.org/blogxter/entry?publicid=7B3349B1BBFDD69D74DC287D65C0B092">Steve: Developing on the Edge - No, blame whoever uses WSDL</a></cite></p>
<p>In all fairness, WSDL 2.0 does allow for <a href="http://www.w3.org/TR/wsdl20-adjuncts/#http-binding">HTTP bindings</a>. But the way it is laid out in a <a href="http://www.w3.org/TR/wsdl20-adjuncts/">separate</a><a href="http://www.w3.org/TR/wsdl20/"> document</a>, it seems more <strong>orthogonal</strong>, not a baked into the WSDL 2.0 spec.</p>
<p>The question I have to keep asking myself is whether the surge of REST popularity is <strong>"raging against the machine"</strong> of SOAP/WSDL and the like, or is it because it is actually more natural to use RESTful interactions? In other words, <strong>has REST become to mean anything that is not SOAP</strong>? In many ways, I think it has.</p>
<p>From my view (which is a rather low perch, might I add), there are three types of REST. Many only claim two, but I think they forget about the "REST because it is not SOAP" crowd:</p>
<ol><li><a href="http://lesscode.org/2006/03/19/high-rest/">High REST</a>: I also call this "Unicorn REST" because, in the words of Don Ferguson, this type is a little bit more common than unicorns. This is REST as laid out by Roy Fielding. It makes use of all the HTTP verbs and has a completely stateless server. Status codes are these developers best friends.<br />
</li>
<li><a href="http://lesscode.org/2006/03/19/high-low-rest/">Low REST</a>: This is the people's REST. REST for the rest of us! This looks at how web applications have been designed over the last 10 years and challenges the thinking. It still may have some state on the server, but its developers are judicious about it. Often, the HTTP POST method is overloaded with interactions that would normally use PUT and DELETE.</li>
<li><a href="http://www.devx.com/DevX/Article/8155">REST because it is not SOAP</a>: This group of developers don't care about Roy Fielding's dissertation and are not interested in better, scalable designs using the HTTP protocol. All they know is that a SOAP stack can be complicated. They claim REST when they mean simple XML, and oh yeah, get and send over HTTP, too.</li>
</ol>
Is this third group valid? Are there any more? REST has become <a href="http://www.prescod.net/rest/rest_vs_soap_overview/">overhyped beyond what Fielding intended</a>. I think it has changed they way many approach web application designs, but the second it became a buzzword and not an aspiration, it lost its meaning.<br />
OSCON '06 Review Two: Appliances2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/oscon-06-review-two-appliances<blockquote cite="http://www.mindtouch.com/more_mos.php">Every MindTouch [Managed Office Server] comes with a subscription to the MindTouch "Zero-Maintenance" Service. You never have to worry about installing, configuring, backing up, upgrading, patching, or anything else, because we take care of it all for you...<br />
</blockquote><p class="citation"><cite cite="http://www.mindtouch.com/more_mos.php"><a href="http://www.mindtouch.com/more_mos.php">MindTouch - Learn More About the Managed Office Server (MOS)</a></cite></p>
<p>One <strong>trend </strong>I noticed at <strong>OSCON </strong>this year is appliances. <strong>MindTouch </strong>is one vendor on display in the exhibit hall. It wasn't the software that interested me, which is what they demoed over and over. It was that the software was packaged and sold as an <strong>appliance</strong>.<br />
</p>
<p>Not that exciting, eh? I beg to differ. That is what they should have focused on.</p>
<p>Take a look at the list in the quote from MindTouch's website again. With the base price of $2995, an appliance gets the following services:</p>
<ul>
<li><strong>Automatic encrypted backups</strong> to a secure off-site data center</li>
<li><strong>Hardware monitoring</strong> with next-business-day repair</li>
<li>Automatic software upgrades, <strong>updates</strong>, and <strong>patches</strong></li>
</ul>
<p>This is starting to sound like an advertisement. But stop and think about it. Is an appliance is the best analogy we can think of? If I buy a toaster, I expect it to work, but don't necessarily expect upgrades. It won't spontaneously add the ability to cook eggs, for instance.<br />
</p>
<p> On the other hand, I like to compare the appliance concept to my parent's swimming pool growing up a dozen or so years ago. Summers in Arizona were hot, so a pool was essential. I have many fond memories swimming with friends.</p>
<p>For a time, I was in charge of maintaining it. It was a beast. Chlorine, acid, among other chemicals are required more periodically than I would have liked. Often calcium build up required more than one person to maintain it. All my brothers would be in the pool with pumice stones, grinding away at the tile. It was a day-long job.<br />
</p>
<p>I often imagined what it be like to have a pool service do everything. All the fun, minimal? to no work.</p>
<p>Running IT can be the same way. <strong>In order to enjoy the fruits, labor is required.</strong> But there are some parts of IT that can be <strong>automated</strong>, if architected correctly. That is the promise of appliances. Purchasing an appliance should be much more than it "just working" out of the box. Like a swimming pool, <strong>an appliance should mean all of the fun with none of the matainence.</strong><br />
</p>
OSCON '06 Review Four: Codependency in the Age of Mashups2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/oscon-06-review-four-codependency-in-the-age-of-mashups<p>David Sklar gave an excellent presentation about service dependency in the age of mashups. The irony of the presentation is that David's connection to the projector kept crapping out every 15 seconds or so. A presentation on dependency when a dependency to the presentation kept failing. Wow. Sorry I had to spell that one out.</p>
<p>I've compile some notes from David's session:<br />
</p>
<p>Web2.0 is:<br />
</p>
<ul>
<li><span style="font-family: Calibri; font-size: 11pt;">Always on</span></li>
<li><span style="font-family: Calibri; font-size: 11pt;">Depends on remote resources</span></li>
<li><span style="font-family: Calibri; font-size: 11pt;">Haps parts that are out of control of the primary creator</span></li>
</ul>
<span style="font-family: Calibri; font-size: 11pt;">This is new-ish...</span><span style="font-family: Calibri; font-size: 11pt;">Or is it?</span><p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Thingsto think about Web 2.0 and mashups:<br />
</p>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Dependency</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Risk Lock-in</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Uptime</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Outage</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Integration</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">APIs</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Timeouts</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Injection Attacks</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Service Guarantees</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Use restirctions</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Non-portable data</span></li>
</ul>
That's alot to consider. Often its neglected.<br />
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Today's Topcic:</p>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">WOPR, give us grace to accept with serenity the dependency mitigation strategies that cannot be implemented, courace to implement the strategies which should be implemented and the wisdom to distinguish the one from the other.</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">What is your app dependent on?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">What happened to the app when one of those dependencies has a problem?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Today's focus is primarily on web service consumers rather than produces.</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">"Dependency"= Not Yours</p>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Physical control</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Ornganizational Control</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Intellectual control</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Whatare your dependencies?</p>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Server</span></li>
</ul><ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Content created by others</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Real-time external network calls</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Internal network calls</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Per-machine software</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Per-machine hardware</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Power+networking</span></li>
</ul>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Code</span></li>
</ul><ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who wrote the code?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who know how the code works?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who wrote the docs?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who knows the places in which the docs are wrong?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who knows how to hire more people who knows what they need to know?</span></li>
</ul>
<ul type="disc" style="margin-left: 0in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Business</span></li>
</ul><ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Who supplies data feeds?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">How many of your co-workers are in the national guard?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">What are your copyright and patent risks?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">What do your SLAs say?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Are the penalties in the SLA really helpful?</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Uptimeis not binary</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Mitigate real-time dependencies with mdoes of degradation based on:</span></li>
</ul><ul type="disc" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Data freshness</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">App features</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Read-only/read-write data</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Data Freshness</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Avoid live web service calls when possible</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Make calls "offline", sanity-check results, and cache</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Build local data store (when possible) for when remote service has blips</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Features</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Segment your app into potentiall non-interdependent parts</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Can a detal page go without its map?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Can you turn off an ad network?</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Read/Write</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Perhaps just for internal issues, but:</span></li>
</ul><ul type="disc" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Provide statis/read-only access to app whil preventing data-changing operations</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Feature segmentation on personalization</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Provider Switch</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Use ad netwokr G instead of Y</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Use map provider Y instead of G</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Lack of common APIs can requrie custom development...look for the rise of meta-API standards</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">APP, S3, "ad HTML" already filling that need?h</span></li>
</ul>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Monitor</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">How do you know when something needs to change?</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Automatic degradation</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Alers based on timing + response content</span></li>
</ul>
<p style="margin: 0in 0in 0in 0.375in; font-family: Calibri; font-size: 11pt;"><span style=""> </span>with manual switchover</p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;"> </p>
<p style="margin: 0in; font-family: Calibri; font-size: 11pt;">Itall comes back to balance</p>
<ul type="circle" style="margin-left: 0.375in; direction: ltr; unicode-bidi: embed; margin-top: 0in; margin-bottom: 0in;"><li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">In the end, everything really is insurance</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Mitigation cost <= (occurrence probability * occurrence cost)</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">Cost = money + goodwill</span></li>
<li style="margin-top: 0pt; margin-bottom: 0pt; vertical-align: middle;"><span style="font-family: Calibri; font-size: 11pt;">What are the likely issues you will run into?</span></li>
</ul>
<br />
OSCON '06 Review Five: Funny2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/oscon-06-review-five-funny<p>I had to mention something rather funny. Jason Robbins, in the middle of a jam-packed session announcing Google's new open source project hosting offering, accidently displayed an administration screen of the web app showing his password.</p>
<p>"I'll have to change that." Is all he said.<br />
</p>
<br />
JSON: Or why this love affair may soon end2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/json-or-why-this-love-affair-may-soon-end<p><strong>JSON</strong>. It promises much. Using native browser Javascript parsing, the client can magically operate on data retrieved from the server with a trivial <strong><i>eval</i> </strong>function call.<br />
</p>
<p>Using <strong><i><script src="..."/></i></strong> to pull down data from another domain, something <strong>XMLHttpRequest </strong>cannot do.<br />
</p>
<p>JSON, as you all know, is an acronym for <strong>JavaScript Object Notation</strong>. Objects are not just data. They contain functions too. So not only can I bring down data, I can bring down additional functionality. Which, if you think about it, it pretty cool.</p>
<p>But external JSON <strong>extremely dangerous</strong>. We are talking about arbitrary <strong>third-party code</strong> that is executed in the context of the running web page. That means any data available in the current scope is free game to that new functionality.</p>
<p><strong>What can happen?</strong> <strong>Passwords </strong>might be stored in the <strong>current scope</strong>. Any data from other domains, including the original, can be scraped. Any of this data can be sent back to the third-party server. Clearly, this is an <strong>enourmous security risk</strong>, and trusting a thrid-party is not enough. <strong>Controls need to be put in place.</strong></p>
<p>Can XMLHttpRequest be updated to include third-party domains? The <strong>Flash player</strong> has a nice model, albeit <strong>proprietary</strong>. They can afford many luxuries since they own the complete running client. A well-known XML document sits in a site root named "<strong>crossdomain.xml</strong>". Pretty self-explanatory at this point. Host A's XML contains entries of valid third-party domains, Host B and Host C, so that when Flash is served up from from B and C, and client Flash accesses resources on A, the Flash player first accesses the crossdomain.xml to check if the originating host (B or C) has A's permission.</p>
<p>One may respond that I can return XML as a JSON string and parse using the browser's DOM API. Yeah, but doesn't this all seem like a hack, a temporary fix for the larger problem. And it may work fine for a while, <strong>but we can do better</strong>!<br />
</p>
Ignorant or Intentional: Doctor Fee Avoidance2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/ignorant-or-intentional-doctor-fee-avoidance<blockquote cite="http://www.getrichslowly.org/blog/2006/07/29/why-dont-doctors-know-how-much-their-services-cost/">The thing that amazed me about the medical treatment wasn’t the quality of the doctors, nor the amazing advances in medicine, but that nobody could tell me how much the procedure would cost. It was exasperating.</blockquote><p class="citation"><cite cite="http://www.getrichslowly.org/blog/2006/07/29/why-dont-doctors-know-how-much-their-services-cost/"><a href="http://www.getrichslowly.org/blog/2006/07/29/why-dont-doctors-know-how-much-their-services-cost/">Get Rich Slowly » Why Don’t Doctors Know How Much Their Services Cost?</a></cite></p>
<p>One of my favorite blogs, "Get Rich Slowly", has a post asking why doctors don't know their own fees.</p>
<p>I has a near identical experience several months ago which culminated in a letter to Sen. Elizabeth Dole of North Carolina. I was exasperatingly frustrated, and still am. In fact, I asked my wife only today if she would call the doctor's offices of some appointments we have (dentist, regular check ups, etc.) in the coming weeks because I know how frustrated I get.</p>
<p>My situation several months ago started with a simple question..."How much is this going to cost me?" Nobody could tell me. I was sent on a wild goose chase from billing to billing, just trying to get a ballpark. I have a budget, you know. I like to plan several weeks out. I don't like getting surprises after the matter.</p>
<p>But I believe the medical industry pries on the very fact knowledge asymetry. Doctors, by virtue of being doctors, know more than their patients. Otherwise, why would you go see a doctor. If I can stitch up that hemoraging cut myself, I'll do it. If I can get rid of colon cancer, I would.</p>
<p>I don't believe it is entirely the doctors' fault. Their fee is pretty basic. It is a combination of insurance, doctors out sourcing their billing, and not enough patients demanding more transparency.</p>
<p>So the question begs whether doctors intentially keep patients ignorant or are they ignorant themselves of total medical costs?<br />
</p>
Framework Complexity2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/framework-complexity<p>Is this what abstraction has truly come to?...<br />
</p>
<img src="http://ptrthomas.wordpress.com/files/2006/06/jtrac-callstack1.png" /><p class="citation"><cite cite="http://ptrthomas.wordpress.com/2006/06/06/java-call-stack-from-http-upto-jdbc-as-a-picture/"><a href="http://ptrthomas.wordpress.com/2006/06/06/java-call-stack-from-http-upto-jdbc-as-a-picture/">Incremental Operations » Java call stack - from HTTP upto JDBC as a picture</a></cite></p>
OSCON '06 Review Three: Dangerous Indifference2006-07-31T00:00:00-07:00http://16cards.com/2006/07/31/dangerous-indifference<strong>Atom </strong>and the <strong>Atom Publishing Protocol</strong> was discussed in various forms and fashions. I'll post later about Tim Bray's session specifically on the Atom Publishing Protocol? One session, however, not directly on Atom itself, caught my attention.
<strong>Rasmus Lerdorf</strong> of <strong>PHP </strong>and<strong> Yahoo</strong> fame gave an insightful presentation PHP. It was detailed with everything from exectuion performance benchmarking with <strong>Callgrind </strong>and <strong>HTTP_Load </strong>to interacting with remote <strong>REST </strong>services using PHP's dynamic behavior.
On slide 12 of the presentation, a <strong>Flickr </strong>example is provided but claims the data feed is <strong>RSS </strong>when in reality it is <strong>Atom</strong>. Harmless mistake.
But when approached afterwards by a session attendee about the mistake Rasmus replied <strong>"Unless its faster, I don't care."</strong>
This is a sad viewpoint since Atom, and its accompanying Publishing Protocol, has <strong>so much more to offer</strong> over RSS. This type of indifference, I believe, is rather dangerous.
But the viewpoint also is quite indicative of the general computing population. I once heard it said that a technology has to be 10 times better than its predecessor to replace it. Clearly, that is an overstatement, but has an interesting principle.
The question then, does Atom and the Atom Publishing Protocol offer significant benefits...enough to replace RSS? If not, is RSS in such a broken state that it will not survive, leading Atom as the default successor?
OSCON '06 Review One: Web Technologies2006-07-30T00:00:00-07:00http://16cards.com/2006/07/30/oscon-06-review-one-web-technologies<p><strong>Ajax </strong>was big at this year's <strong>OSCON</strong>. Whereas the phrase "<strong>Web 2.0</strong>" seemed to be accompanied by <strong>awkwardly </strong>constructed sentences, noticable <strong>hesitations</strong>, or <strong>nervous laughter</strong>, "Ajax" flowed of the tongue like sugar.</p>
<p>Although this is only my second OSCON in as many years, from discussion with a sample of those I met this last week, OSCON is much more <strong>web-centric</strong> than in the past. Since I don't have data points to measure against, I'll have to take their word. Assuming what they say it correct, it seems highly <strong>interactive</strong>, <strong>data-rich web applications</strong> are still perculating in the minds of many.<br />
</p>
<p>I received no negative impressions during the conference. Only upbeat, excited developers sharing their ideas and taking it all in. I didn't hear one complaint about unsatisfactory jobs, layoffs, or boring projects. Everyone seemed rather excited about the state of the web economy. It is highly likely that the nature of the conference is a filter itself.</p>
<p>But back to Ajax. About that perculating. Notice that I left off social from "highly interactive, data-rich web applications." If memory serves me correctly, I only recall one "social" vendor and very limited sessions addressing <strong>social software</strong>. But there was plenty of sessions and vendors focusing on Ajax technologies. If anyone had a different impression, leave a comment.</p>
More on Queso2006-07-30T00:00:00-07:00http://16cards.com/2006/07/30/more-on-queso<blockquote cite="http://wingerz.com/blog/?p=38">put a web front-end onto [an] RDF store</blockquote><p class="citation"><cite cite="http://wingerz.com/blog/?p=38"><a href="http://wingerz.com/blog/?p=38">~wingerz » Blog Archive » A Queso Example</a></cite></p>
<p>Over at ~wingerz, a more thorough explanation of what technologies are involved with Queso.</p>
<ul>
<li><a href="http://www.w3.org/RDF/">RDF</a></li>
<li><a href="http://www.ietf.org/html.charters/atompub-charter.html">Atom</a></li>
<li><a href="http://www.json.org/">JSON</a></li>
<li><a href="http://www.w3.org/TR/xhtml1/">XHTML</a></li>
<li><a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a></li>
<li><a href="http://www.w3.org/TR/rdf-sparql-query/">SPARQL</a></li>
<li><a href="http://microtemplates.org/about/">Microtemplates</a></li>
</ul>
Scenarios are spelled out and how all these technologies interact to create a simple, yet cohesive, application. The potential of this application is by introducing semi-structured data through the use of RDF.<br />
Let's REST!2006-07-30T00:00:00-07:00http://16cards.com/2006/07/30/lets-rest<blockquote cite="http://blogs.msdn.com/alexbarn/archive/2006/07/21/674395.aspx">A bunch of links to RESTful resources I've collated here and there</blockquote><p class="citation"><cite cite="http://blogs.msdn.com/alexbarn/archive/2006/07/21/674395.aspx"><a href="http://blogs.msdn.com/alexbarn/archive/2006/07/21/674395.aspx">Alex Barnett blog : Let's REST!</a></cite></p>
<p>Alex Barnett has a list of REST resources discussing the good and the bad, the how and the why. Since I have an affinity to the Atom Publishing Protocol, all of these have been read and read again. All very valuable and will help shape your thinking about what REST really aspires to achieve and why it is the most misunderstood acronym this year.<br />
</p>
A Web 2.0 Server...Elias' new project2006-07-30T00:00:00-07:00http://16cards.com/2006/07/30/a-web-20-serverelias-new-project<p>Elias Torres has a new project brewing and a great demo. As I am greatly interested in all things Atom, thought I'd pass it along...<br />
</p>
<blockquote cite="Elias Torres » Blog Archive » Queso - a Semantic Web/Web 2.0 server">...if you are an Atom hacker, all you need besides your knowledge of the protocol is Vi and curl.</blockquote><p class="citation"><cite cite="http://torrez.us/archives/2006/07/17/471/"><a href="http://torrez.us/archives/2006/07/17/471/">Elias Torres » Blog Archive » Queso - a Semantic Web/Web 2.0 server</a></cite></p>
The Atom Publishing Protocol, Atom feed format, RDF, and SPARQL are wrapped up into a cohesive application to demonstrate what can be accomplished with standards.<br />
Unpackit: An offended user of Backpack2006-07-29T00:00:00-07:00http://16cards.com/2006/07/29/unpackit-an-offended-user-of-backpack<em><strong>Update:</strong></em> It has been a few weeks. Now that the dust has settled, I'd like to note that I made an enormous mistake posting these thoughts. I am, in fact, embarassed that I even had them to begin with. I apologize to 37signals and applaud their strategy to convert freeloaders to paying customers. I am happy for their success. Conversely, I am using MonkeyGTD and haven't missed the sharing of Backpack...yet.
[37signals' Backpack logo removed. I decided that it was inappropriate to include it.]
I've been betrayed. I was days away from becoming a lifetime paying customer. I had converted dozens of peers to the product. Some have become paying customers already. But now I'm leaving. I'm taking my data and going home.
Today I've begun to seek alternatives to <strong>37signals</strong>' <strong>Backpack </strong>to store my <strong>GTD </strong>data. Why, you may ask? Because they are charging for a new feature...
<blockquote cite="http://www.backpackit.com/calendar">The Backpack Calendar is <strong>included on all paying</strong> Backpack plans! Sign-up for a free plan or discover more reasons to upgrade to a pay plan.</blockquote>
<p class="citation"><cite><a href="http://www.backpackit.com/calendar">Web-Based Calendar for Backpack</a></cite></p>
37signals is <strong>fully justified to charge</strong> for their Backpack service. It is a useful service. However, the action of limiting the new calendar feature to <strong>only paying customers violates</strong> several simple rules of <strong>software as a service</strong>.
Up until now, all of 37signals' services have been available on a limited basis. Rarely has functionality been hindered. Rather, reduced capacity limitations are imposed, which are very reasonable. For instance, Backpack is limited to 5 pages for the free version.
However, I currently have three pages in Backpack. I share pages with a few others, but have not found the need yet to upgrade as I have not hit the capacity limit. Now, I, nor 37signals, will ever find out whether I would hit that limit over the next few weeks as I cannot get my greasy paws on their new calendar feature.
Oh, but they have <strong>video demos</strong>. <strong>Not enough</strong> to make me salivate and fork over a measly 5 bucks a month. So I'll take my data elsewhere.
I'm looking at <strong>MonkeyGTD </strong>(a version of <strong>TiddlyWiki</strong>) hosted on <strong>tiddlyspot.com</strong>. I'm in the process of finalizing some scripts that uses the <strong>Backpack API</strong> and does an <strong>XSLT </strong>to the format that TiddlyWiki uses. That is something 37signals is good at...opening their data. Or should I say, my data. They do a pretty good job of avoiding a <strong>wall garden</strong>.
So, one may ask what I would do if I were 37signals. Here are some suggestions:
<ol>
<li>Provide the calendar for the free account but <strong>isolate </strong>it so that calendar data cannot be shared, nor can <strong>iCals </strong>be subscribed.</li>
<li>Allow a <strong>month free</strong> for free users.</li>
<li>Provide the calendar for free users but only allow events to be <strong>created three months away</strong>.</li>
<li>...There are many other ways to allow people to experience the calendar while still encouraging them to upgrade.</li>
</ol>
This all poses a question. <strong>Am I crazy? </strong>Should I be <strong>offended </strong>that 37signals has not made the calendar available on a trial basis? <strong><em>Ring in your thoughts.</em></strong>
The Boon and Bane of Folksonomy2006-07-22T00:00:00-07:00http://16cards.com/2006/07/22/the-boon-and-bane-of-folksonomyElias makes an interesing point about tagging and folksonomy. Typically tagging's shortcomings can be categorized into false positives and false negatives.
The false positives are obvious. The false negatives are somewhat more subtler. Not everyone has the same folksonomy. This is both the boon and bane of folksonomy. The boon is those with similar folksonomy can find each other and benefit from like-minded categorization. The bane is that they have to find each other.
<blockquote cite="Elias Torres » Blog Archive » Why I don’t like to infer semantics from tags">overload tags/tagging with “semantics”</blockquote>
<p class="citation"><cite><a href="http://torrez.us/archives/2006/07/21/473/">Elias Torres » Blog Archive » Why I don’t like to infer semantics from tags</a></cite></p>
<!-- technorati tags begin -->
<p style="font-size: 10px; text-align: right">technorati tags:<a rel="tag" href="http://technorati.com/tag/folksonomy">folksonomy</a></p>
<!-- technorati tags end -->
Service Provider2006-07-22T00:00:00-07:00http://16cards.com/2006/07/22/service-providerWhy didn't I know about this before?
http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider
<blockquote>A service provider identifies itself by placing a provider-configuration file in the resource directory META-INF/services.</blockquote>
<p class="citation"><cite><a href="http://java.sun.com/j2se/1.5.0/docs/guide/jar/jar.html#Service%20Provider" /></cite></p>
Asynchronous ColdFusion2006-07-22T00:00:00-07:00http://16cards.com/2006/07/22/asynchronous-coldfusionIn a past life I was an avid ColdFusion developer from 1998 to 2004. In fact, it was the transition from ColdFusion implemented atop of J2EE that got me into Java. I had opportunity on several occations to provide feedback on Allaire and then Macromedia about features and enhancements.
One feature I suggested for the current CFMX 7 release that would be useful to enterprise class performance requirements is the ability to spawn worker threads. I even created a sample tag CF_THREAD to show how it could be done. Feedback from Macromedia was that the <a href="http://www.corfield.org/blog/index.cfm?do=blog.entry&entry=E0816725-0D6B-FE94-A7213B935DDC7679">Event Gateway</a> was the focus of asynchronous behavior in the release.
As such, it is interesting to see this come across the Adobe blogs...
<blockquote cite="Damon Cooper's BLOG">While you can do multi-threading and asynchronous CFML with these POC tags, they don’t provide any of the fine-grained threading control you have with ColdFusion Event Gateways and the Asynchronous Gateway</blockquote>
<p class="citation"><cite><a href="http://www.dcooper.org/blog/client/index.cfm?mode=entry&entry=916FEFD9-4E22-1671-57A23859C50FFF47">Damon Cooper's BLOG</a></cite></p>
This is it2006-07-20T00:00:00-07:00http://16cards.com/2006/07/20/this-is-it<p>And here we go. I have things to say...they're going to get said. This is a blog primarily about my interests. Technology, life, and family.</p>
<p>Mostly about the stuff I'm currently researching and prototyping for my job with IBM. Clearly never any specifics, etc. about such projects, but enough depth and to wet your taste to come back. Heck, you may even subscribe.</p>
<p>So, without further adieu...16cards.</p>
OSCON Schedule2006-07-20T00:00:00-07:00http://16cards.com/2006/07/20/oscon-scheduleI can't decide between several sessions. I wish I had that thingy from Harry Potter that Hermoine uses to attend classes that overlap. Regardless, here is the tentative plan. If you have any suggestions let <a href="mailto:16cards+myblog@gmail.com">me know:</a>
<a href="https://www.google.com/calendar/embed?src=sjbj2nhoog7vsrteivpfc2bbek%40group.calendar.google.com">OSCON Google Calendar</a>
<a href="mailto:16cards+myblog@gmail.com" />
OSCON is a week away2006-07-20T00:00:00-07:00http://16cards.com/2006/07/20/oscon-is-a-week-awayI'll be attending OSCON next week. This will be my first conference working for IBM. It will be different attending the event from something different than an academic mindset. However, my position with IBM allows for more research and prototyping than a typical developer position.
I'd love to meet up with other OSCON attendees.
Check out my schedule and let me know if you any suggestions to help me decide which session to attend.
Introducing My Family2006-07-20T00:00:00-07:00http://16cards.com/2006/07/20/introducing-my-family<p></p>
<p>Brooklyn (1), my wife, Tassi, and myself in the fall leaves of Pittsburgh.<br />
</p>
<p><a title="Autumn 2005" href="http://flickr.com/photos/33832570@N00/75353589"><img border="0" src="http://static.flickr.com/38/75353589_16a0ba0010_m.jpg" /></a></p>
<p><a href="http://flickr.com/photos/33832570@N00/75353589">Autumn 2005</a></p>
About2006-07-05T00:00:00-07:00http://16cards.com/2006/07/05/aboutHi. I am Brandon Smith. As I travel through life, I record it here.
A little about me...
<ul>
<li>I’m a <a href="http://16cards.wordpress.com/2006/07/20/introducing-my-family/">husband and father</a></li>
<li>I work at <a href="http://www.ibm.com/">IBM</a></li>
<li>I write songs that make loved ones cry</li>
<li>I played <a href="http://www.amazon.com/gp/product/B00006H6B6/sr=8-1/qid=1153373871/ref=pd_bbs_1/102-8903342-1191325?ie=UTF8">bass</a> <a href="//ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/biography?artistId=15089946&ign-mscache=1">in</a> <a href="http://en.wikipedia.org/wiki/Before_Braille">a</a> <a href="http://beforebraille.com/">previous</a> <a href="http://profile.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=3490874">life</a></li>
<li>I am a music snob</li>
</ul>