<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-13201387</id><updated>2012-02-02T13:58:01.121-05:00</updated><category term='facebook'/><category term='sauerkraut'/><category term='openid'/><category term='Enhanced Client'/><category term='cabbage'/><category term='liberty'/><category term='ECP'/><category term='cloud computing'/><category term='REST'/><category term='mindfulness'/><category term='mashupcamp'/><category term='datasharing'/><category term='user centric'/><category term='node nodejs'/><category term='privacy'/><category term='Web OS'/><category term='biometric'/><category term='web services'/><category term='API'/><category term='mashups'/><category term='SAML'/><category term='SOAP'/><category term='beans'/><category term='john thorne'/><category term='python'/><category term='Cardspace'/><category term='identity'/><category term='haskell'/><category term='virus'/><category term='vegetarian'/><category term='s60'/><category term='hopping john'/><category term='data sharing'/><category term='ubuntu'/><category term='dsw2008'/><category term='recipes'/><category term='pandoc'/><category term='identity theft'/><category term='identity services'/><category term='google'/><category term='WS-*'/><title type='text'>Applied Life</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>63</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-13201387.post-240894872119430887</id><published>2011-09-07T13:29:00.002-04:00</published><updated>2011-09-07T13:32:05.723-04:00</updated><title type='text'>Blogging over here now...</title><content type='html'>I'm moving over to &lt;a href="http://frumioj.tumblr.com/"&gt;Tumblr&lt;/a&gt; for no particular reason... (http://frumioj.tumblr.com/)&lt;br /&gt;&lt;br /&gt;First post is &lt;a href="http://frumioj.tumblr.com/post/9922282217/anonymity-vs-accountability"&gt;here&lt;/a&gt; (http://frumioj.tumblr.com/post/9922282217/anonymity-vs-accountability)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-240894872119430887?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/240894872119430887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=240894872119430887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/240894872119430887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/240894872119430887'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2011/09/blogging-over-here-now.html' title='Blogging over here now...'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7809254998779706920</id><published>2011-04-22T10:48:00.001-04:00</published><updated>2011-04-22T10:50:24.762-04:00</updated><title type='text'>Markup Language Family Tree</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;                         RUNOFF                      "Generic Coding"                 "Editorial Structure Tags"&lt;br /&gt;                   (Jerome Saltzer, 1964)         (William Tunnicliffe, 1967)          (Stanley Rice, pre-1970)&lt;br /&gt;                            |                               |                                     |&lt;br /&gt;                            |                               |                                     |&lt;br /&gt;        TeX          roff - nroff - troff                   |-------------------------------------|&lt;br /&gt; (Don Knuth, 1977)   (Josef Osanna, 1973)                   |&lt;br /&gt;                                                           GML&lt;br /&gt;                                                    (Charles Goldfarb, 1969)&lt;br /&gt;                                                            |                       SCRIBE&lt;br /&gt;                                                            |                   (Brian Reid, 1980)&lt;br /&gt;                                                            |                          |&lt;br /&gt;                                                            |--------------------------|&lt;br /&gt;                                                          SGML&lt;br /&gt;                                                      (Standard, 1980)&lt;br /&gt;                                                     |                |&lt;br /&gt;                                                     |                |&lt;br /&gt;                                                   HTML              XML&lt;br /&gt;                                            (Berners-Lee, 1990)    (Standard, 1998)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Updated to show the contributions of Stanley Rice and William Tunnicliffe, see:&lt;br /&gt;&lt;br /&gt;http://en.wikipedia.org/wiki/Markup_language and &lt;br /&gt;http://www.digitalhumanities.org/companion/view?docId=blackwell/9781405103213/9781405103213.xml&amp;chunk.id=ss1-3-5&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7809254998779706920?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7809254998779706920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7809254998779706920' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7809254998779706920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7809254998779706920'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2011/04/markup-language-family-tree.html' title='Markup Language Family Tree'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1262090381273650734</id><published>2011-03-03T15:17:00.004-05:00</published><updated>2011-03-03T15:30:42.102-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='node nodejs'/><title type='text'>Simple HTML Form parsing in node.js</title><content type='html'>I'm new to &lt;a href="http://nodejs.org/"&gt;Node.js&lt;/a&gt;, but already having fun with it. I was trying to grab form POST data and couldn't find a simple example to learn from (using a &lt;a href="http://debuggable.com/posts/parsing-a-form-in-node-js-1:4b0bff13-4244-4ebc-8455-4975cbdd56cb"&gt;multipart MIME parser&lt;/a&gt; seemed a little like overkill) so I wrote the following code.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;The code registers two callbacks - one for the 'data' event which is called when a chunk of body data arrives (there may be more than one such call depending on the size of the body) and the other for the 'end' event when the request has "ended". &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, this example is too simple to use in most real systems (caveat lector) - no checks on the content are made, and the parsing takes place only after the whole body is read. Not ideal.&lt;br /&gt;&lt;pre&gt;var http = require('http');&lt;br /&gt;var url = require('url') ;&lt;br /&gt;&lt;br /&gt;http.createServer(&lt;br /&gt;&lt;br /&gt;function (request, response) {&lt;br /&gt; var full_url = url.parse( request.url, true ) ;&lt;br /&gt; var pathname = full_url.pathname ;&lt;br /&gt; var q_params = full_url.query ;&lt;br /&gt; var body = "" ;&lt;br /&gt;&lt;br /&gt; response.writeHead(200, {'Content-Type': 'text/plain'});&lt;br /&gt;&lt;br /&gt; if ( request.method === "POST" &amp;amp;&amp;amp;&lt;br /&gt;      request.headers['content-type'] === "application/x-www-form-urlencoded"){&lt;br /&gt;&lt;br /&gt;   request.on('data', &lt;/pre&gt;&lt;pre&gt;       function( chunk ) {&lt;/pre&gt;&lt;pre&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;         &lt;/span&gt;// append the chunk to the growing message body&lt;br /&gt;       body += chunk ;&lt;br /&gt;     }) ;&lt;br /&gt;&lt;br /&gt;   request.on('end', function(){&lt;br /&gt;     var params = body.split('&amp;amp;') ;&lt;br /&gt;&lt;br /&gt;     for ( param in params ){&lt;br /&gt;       var pair = params[param].split('=') ;&lt;br /&gt;       response.write("Name: " + pair[0] + " = " + pair[1] + "\n") ;&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     response.end() ;&lt;br /&gt;   }) ;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;).listen(8124);&lt;br /&gt;&lt;br /&gt;console.log('Server running at http://127.0.0.1:8124/');&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1262090381273650734?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1262090381273650734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1262090381273650734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1262090381273650734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1262090381273650734'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2011/03/simple-html-form-parsing-in-nodejs.html' title='Simple HTML Form parsing in node.js'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-194193607699129013</id><published>2011-02-21T11:47:00.010-05:00</published><updated>2011-02-22T13:37:08.776-05:00</updated><title type='text'>HTML frames and security</title><content type='html'>&lt;b&gt;Introduction&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Frames were introduced into HTML (via the 'frameset' and 'iframe' elements) in order to provide an element of modularity to navigable websites [1] - one or more HTML documents could include a separate menu document directly so that navigation links didn't need to be&lt;br /&gt;edited in each individual document. This found particular favour in online magazines.&lt;br /&gt;&lt;br /&gt;Using frames for such modularity became popular because many website hosting companies initially disabled, by default, other mechanisms which could be used to provide this functionality (such as CGI scripts, server-side includes, and other server-side scripting&lt;br /&gt;alternatives).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Frame security&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are, broadly-speaking, two security issues with HTML frames:&lt;br /&gt;&lt;br /&gt;1. A developer including content from another site in an iFrame is taking a risk that this content will not do anything harmful (where 'harmful' includes manipulating parent document resources (via the DOM), running malware (a malicious 3rd-party plugin, for example) or&lt;br /&gt;running scripts that consume inordinate amounts of client resources such as CPU or memory.&lt;br /&gt;&lt;br /&gt;2. A malicious developer might include content from a victim site in a frame in order to either confuse the user into performing some action at the victim site (a kind of phishing) or simply use the user's resources (browser cookies, for example) to perform an attack on the victim server (such attacks include but are not limited to, XSS).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;HTML 5 'sandbox' attribute&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;HTML5 has added a new attribute to the iframe element, and defined a new MIME media type to indicate such sandboxed content [3]. The sandbox attribute and related work is intended to deal with security issue 1 (see above).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Multi-process Web browsing&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Microsoft's Gazelle and Google's Chromium are two browser projects which attempt to limit the access by individual Web components to browser resources, by allocatng browser resources on a per-origin basis. An individual browser tab displaying content from a particular&lt;br /&gt;URL renders content via a separate OS-level process from the main browser process, and from processes associated with other Web origins.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;The Facebook 'Like' Button - iframes taking advantage of a security hole&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;Facebook's Like button functionality takes advantage of a security vulnerability to allow Facebook to display user content (some of my friends' faces, for example) in an iframe. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you include the code Facebook generates for you, you get an iframe:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;blockquote&gt;&amp;lt;iframe src=\&amp;quot;http://www.facebook.com/plugins/like.php?&lt;/blockquote&gt;&lt;blockquote&gt;&lt;b&gt;href=http%3A%2F%2Fexample.com%2Fpage%2Fto%2Flike&lt;/b&gt;&amp;amp;amp;&lt;/blockquote&gt;&lt;blockquote&gt;layout=standard&amp;amp;amp;show_faces=true&amp;amp;amp;&lt;/blockquote&gt;&lt;blockquote&gt;width=450&amp;amp;amp;action=like&amp;amp;amp;&lt;/blockquote&gt;&lt;blockquote&gt;colorscheme=light&amp;amp;amp;height=80\&amp;quot; scrolling=\&amp;quot;no\&amp;quot; frameborder=\&amp;quot;0\&amp;quot; style=\&amp;quot;border:none; overflow:hidden; width:450px; height:80px;\&amp;quot; allowTransparency=\&amp;quot;true\&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And of course, this iframe uses the Facebook cookie that you have because yes, you're logged into Facebook right now (right?) to display your friends' faces in the rendered like button, even when that like button appears on your own site. &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;It'll also use that logged in session to display the fact that you (the user at that website) like the content.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You *can't* include Facebook's like button content on the server-side if you want it to work as intended - because that content needs the user session cookie, which is only available on the client-side. So you can't follow my first or second recommendations below. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The other implication here is that it is possible for a malicious website to make the user 'like' some content hosted by someone other than the the website hosting the like button (just set the href attribute of the iframe src call to some other value than your own content). Arnab Nandi has written some excellent posts about this issue at [8] and [9].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;Recommendations for Web Developers&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Include potentially untrusted content on the server-side (rather than by using iframes), and use solutions such as Google Caja [6] to sanitize all of your content prior to delivery over the Web.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Reduce or remove the reliance on Web browser cookies in order to prevent misuse of those cookies by a malicious Website. If user confirmation of an action is important, then offer a confirmation page for the user in addition to a cookie-based session identifier when confirming something that appears to be a user action. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Properly validate or sanitize (by encoding) input delivered via HTTP headers, HTML POSTed data, and URL query parameters, in order to prevent cross-site scripting vulnerabilities. Review the OWASP website regarding untrusted user input [7]. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Ensure that an HTTP GET to a resource under your control does not perform an action with side-effects (such as immediately confirming a subscription or other action), since an HTTP GET which takes place via a redirect may be sent from a malicious site without requiring additional user confirmation for the redirect to occur.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;References&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;[1] WWW Framing (&lt;a href="http://en.wikipedia.org/wiki/Framing_(World_Wide_Web)"&gt;http://en.wikipedia.org/wiki/Framing_(World_Wide_Web)&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[2] Server-side include security in Apache (&lt;a href="http://httpd.apache.org/docs/current/misc/security_tips.html#ssi"&gt;http://httpd.apache.org/docs/current/misc/security_tips.html#ssi&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[3] The HTML5 iframe sandbox (&lt;a href="http://blog.whatwg.org/whats-next-in-html-episode-2-sandbox"&gt;http://blog.whatwg.org/whats-next-in-html-episode-2-sandbox&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[4] Chromium multi-process architecture (&lt;a href="http://www.chromium.org/developers/design-documents/multi-process-architecture"&gt;http://www.chromium.org/developers/design-documents/multi-process-architecture&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[5] Microsoft Gazelle (&lt;a href="http://research.microsoft.com/apps/pubs/default.aspx?id=79655"&gt;http://research.microsoft.com/apps/pubs/default.aspx?id=79655&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[6] Google Caja (&lt;a href="http://code.google.com/p/google-caja"&gt;http://code.google.com/p/google-caja&lt;/a&gt;/)&lt;/li&gt;&lt;li&gt;[7] OWASP Injection and XSS Prevention (&lt;a href="http://www.owasp.org/index.php/Top_10_2010-A1"&gt;http://www.owasp.org/index.php/Top_10_2010-A1&lt;/a&gt;), (&lt;a href="http://www.owasp.org/index.php/Top_10_2010-A2"&gt;http://www.owasp.org/index.php/Top_10_2010-A2&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[8] Deceiving Users with the FB Like Button(&lt;a href="http://arnab.org/blog/deceiving-users-facebook-button"&gt;http://arnab.org/blog/deceiving-users-facebook-button&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;[9] Reputation Misrepresentation(&lt;a href="http://arnab.org/blog/reputation-misrepresentation"&gt;http://arnab.org/blog/reputation-misrepresentation&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-194193607699129013?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/194193607699129013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=194193607699129013' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/194193607699129013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/194193607699129013'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2011/02/html-frames-and-security.html' title='HTML frames and security'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-2740990543075633362</id><published>2011-01-01T14:45:00.004-05:00</published><updated>2011-01-01T14:59:23.782-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='john thorne'/><category scheme='http://www.blogger.com/atom/ns#' term='beans'/><category scheme='http://www.blogger.com/atom/ns#' term='vegetarian'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='hopping john'/><title type='text'>New Year's Hoppin' John</title><content type='html'>(adapted from John Thorne's 'Serious Pig' version)&lt;br /&gt;&lt;br /&gt;1 cup black-eyed peas, soaked for ~5 hours&lt;br /&gt;1 onion, chopped &lt;br /&gt;1 cup raw rice&lt;br /&gt;1 tablespoon of chipotle pepper in adobo (more if you don't mind scaring off small children!)&lt;br /&gt;1 clove garlic, minced&lt;br /&gt;1 bay leaf&lt;br /&gt;Olive oil&lt;br /&gt;Salt, pepper to taste&lt;br /&gt;&lt;br /&gt;Bring 5 cups of water to a boil and put the beans and bay leaf in. Turn the heat down low and simmer the beans for about 30 minutes (if using brown rice) or 45 (if using white rice). While the beans are cooking, put oil in a pan and fry the onions very gently for 20 minutes, making sure they don't burn or turn too brown (sprinkle them with salt if you can tolerate it). Add garlic and chili pepper. After 30 minutes check your beans. If using brown rice add it now, and after 15 more minutes pour the contents of your onion fry-up into the pot too. If using white rice, wait the extra 15 minutes and add it all together. After that, just cook gently until the rice and beans are done. Let the pot rest for 10 minutes after you're turned off the heat.&lt;br /&gt;&lt;br /&gt;Serve with cornbread and onion salad (both taken directly from Thorne's 'Serious Pig') for serious enjoyment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-2740990543075633362?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/2740990543075633362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=2740990543075633362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2740990543075633362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2740990543075633362'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2011/01/new-years-hoppin-john.html' title='New Year&apos;s Hoppin&apos; John'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4847584876539602877</id><published>2010-11-20T10:00:00.001-05:00</published><updated>2010-11-20T10:02:12.697-05:00</updated><title type='text'>Same-origin policy</title><content type='html'>I took part in a Nokia Web security panel last week. My talk was about the browser &lt;a href="http://jkemp.net/downloads/web-origin.pdf"&gt;same-origin policy (PDF)&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Never trust a client!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4847584876539602877?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4847584876539602877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4847584876539602877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4847584876539602877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4847584876539602877'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/11/same-origin-policy.html' title='Same-origin policy'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1878721107996392086</id><published>2010-09-25T12:55:00.003-04:00</published><updated>2010-09-25T13:24:51.205-04:00</updated><title type='text'>Marathon for my family</title><content type='html'>Almost eight years ago, my twin daughters were born at Albany Medical Center, in Albany, NY. They insisted on arriving very early -- and born at 27 weeks (normal pregnancy is more like 38-42 weeks), had only a middling chance of surviving without some permanent disability. We didn't know whether they would even make it - when they were born, they needed to be kept very warm -- in an incubator, and they couldn't breathe very well without additional oxygen given to them via a ventilator. They both weighed less than 2lbs each. &lt;br /&gt;&lt;br /&gt;They shared a room with more than 40 other children, in incubators, with ventilators, and some with other special equipment needed to keep those babies alive and help them grow. &lt;br /&gt;&lt;br /&gt;Without Albany Medical Center's Neonatal Intensive Care Unit (NICU), my daughters would be unable to learn to read, or ride a bicycle. They might be unable to see, or maybe couldn't process food properly. They could have had any one of a number of disabilities. And yet, here they are, falling off bikes and getting scrapes on their knees. They're learning math at school, and writing... drawing, science. In short, they're doing all the things you'd expect an 8-year old child to do. &lt;br /&gt;&lt;br /&gt;But this story is about more than my daughters. Our premature babies were not alone. Albany's NICU accepts babies from the entire range of New York State, and also from rural Vermont and Massachusetts. They simply don't have enough room to accept all the premature babies who are born each year, or enough money to maintain all of the sophisticated equipment needed to keep these children alive, or have enough doctors and nurses looking after the babies. &lt;br /&gt;&lt;br /&gt;I'm running the &lt;a href="http://www.mohawkhudsonmarathon.com/"&gt;Hudson/Mohawk marathon&lt;/a&gt; on the 10th October this year (I'll be just back from Finland two days earlier so will no doubt feel wonderful). &lt;br /&gt;&lt;br /&gt;I celebrate that I can do such a thing at all, and I celebrate that my children are alive. But I can sit here and celebrate my family, and some parents cannot. &lt;br /&gt;&lt;br /&gt;So please join me in helping all those whose families are affected by premature birth by donating to Albany Medical Centre's Neonatal Intensive Care Unit, and it'll feel like you're running the marathon with me (I promise you that you won't have to feel the pain!)&lt;br /&gt;&lt;br /&gt;There are two ways to donate:&lt;br /&gt;&lt;br /&gt;1) Web/credit-card &lt;br /&gt;&lt;br /&gt;* go to &lt;a href="https://dnbweb1.blackbaud.com/OPXDONATE/Donate.asp?cguid=07C221DA%2DB150%2D4BB7%2D8F56%2DCB7FAC472392"&gt;Albany Medical Center Donation&lt;/a&gt; (if you don't trust this URL, go to http://www.amc.edu/foundation/make_a_gift/cash_check_credit.html and click the link to 'give today').&lt;br /&gt;&lt;br /&gt;* When you enter the donation details please set:&lt;br /&gt;&lt;br /&gt;Designation: Neonatal Intensive Care Unit (NICU)&lt;br /&gt;&lt;br /&gt;In Honor of: A &amp; I Kemp&lt;br /&gt;&lt;br /&gt;(If you figure out how to do a company match, go ahead!&lt;br /&gt;&lt;br /&gt;2) By check/cheque payable to "Neonatal Intensive Care Unit at Albany Medical Center" - which you can give me in person, or send to Albany Medical Center at the following address:&lt;br /&gt;&lt;br /&gt;Albany Medical Center Foundation&lt;br /&gt;Attn: Nicole Lindell&lt;br /&gt;Re: A &amp; I Kemp&lt;br /&gt;43 New Scotland Ave., MC-119&lt;br /&gt;Albany, NY 12208&lt;br /&gt;&lt;br /&gt;Thank you!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1878721107996392086?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1878721107996392086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1878721107996392086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1878721107996392086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1878721107996392086'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/09/marathon-for-my-family.html' title='Marathon for my family'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4766539898373291808</id><published>2010-09-05T15:33:00.004-04:00</published><updated>2010-09-05T15:39:51.964-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='beans'/><category scheme='http://www.blogger.com/atom/ns#' term='vegetarian'/><title type='text'>Spicy mixed bean stew</title><content type='html'>4 cups mixed, dried beans (of different colours to make it look more&lt;br /&gt;interesting) rinsed and soaked overnight in 8 cups of water&lt;br /&gt;4 carrots&lt;br /&gt;2 sticks celery&lt;br /&gt;6 cloves garlic, minced&lt;br /&gt;1 tsp ground cumin&lt;br /&gt;1 tsp or so each of crumbled dried sage, marjoram, oregano&lt;br /&gt;1 large onion, sliced thinly&lt;br /&gt;3-4 Jalapeno peppers in adobo (to give a smoky taste)&lt;br /&gt;2 bay leaves&lt;br /&gt;salt to taste&lt;br /&gt;1 pint homemade tomato sauce &lt;br /&gt;3-4 tblspoons olive oil &lt;br /&gt;1/2 cup water&lt;br /&gt;1 cup sweet corn kernels&lt;br /&gt;1 tsp tamarind paste&lt;br /&gt;1 tblspoon cocoa powder&lt;br /&gt;1 tblspoon sugar&lt;br /&gt;&lt;br /&gt;Bring beans to a boil in soaking water with bay leaves, and then turn onto lowest possible heat. Cook very slowly, covered, for at least one hour.&lt;br /&gt;&lt;br /&gt;Meanwhile, cook onion over low heat for 20 minutes, add diced celery, cook for a few more minutes. Add minced garlic, cumin, sage, marjoram and oregano and cook for a few more minutes. Add chiles and cook a bit more. Add water, and heat until water is hot. Add mixture to beans.&lt;br /&gt;&lt;br /&gt;Chop carrots into pieces roughly as small as the beans, and add to the mixture. Add sweet corn.&lt;br /&gt;&lt;br /&gt;Cook the whole lot for roughly another hour and the water level has dropped to the level of the beans.&lt;br /&gt;&lt;br /&gt;Add tomato sauce, cocoa powder, tamarind, and salt as necessary and cook for further 20 minutes or so.&lt;br /&gt;&lt;br /&gt;Adapted from Soup - &lt;a href="http://www.all-creatures.org/recipes/soup-spmixbean.html"&gt;Spicy Mixed Bean&lt;/a&gt; - thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4766539898373291808?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4766539898373291808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4766539898373291808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4766539898373291808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4766539898373291808'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/09/spicy-mixed-bean-stew.html' title='Spicy mixed bean stew'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1506267544148834229</id><published>2010-02-17T11:23:00.002-05:00</published><updated>2010-02-17T11:40:58.869-05:00</updated><title type='text'>Secrets and Lies</title><content type='html'>It's not secret that Google uses data it knows about me and my contacts, or the subjects I email about with those contacts to customize the advertisements that appear on Google pages when I'm logged in. And I feel as if I have given them, perhaps implicitly, but concretely, the go-ahead to do that, regardless of what I've accepted (or not) consciously in reviewing their Terms of Service. &lt;br /&gt;&lt;br /&gt;In social situations, it is often the ability to keep a secret that determines the course of a social relationship. Secrets are shared as a way of building those relationships, and the ability to maintain shared secrets builds shared trust.  &lt;br /&gt;When Google Buzz &lt;a href="http://appliedlife.blogspot.com/2010/02/buzz-about-google-buzz.html"&gt;exposed&lt;/a&gt; my list of frequently emailed contacts as a social network, they violated my trust that they could keep a secret.&lt;br /&gt;&lt;br /&gt;Abstractly, I think it's a cool idea to build a social network for me, based on data inferred about my communications with Google contacts. &lt;br /&gt;&lt;br /&gt;And similarly, I can see how, abstractly, it's a good idea (from a Google perspective) to make your social network public so that other people can more easily, and socially, find people to connect with.  &lt;br /&gt;&lt;br /&gt;When you combine these ideas, however, you violate the basic social need for secrets to be maintained. &lt;br /&gt;&lt;br /&gt;Whether Google is, as &lt;a href="http://blogs.gartner.com/john_pescatore/2010/02/15/google-follows-the-usual-violate-privacy-if-caught-apologize-then-offer-opt-out-path/"&gt;some people think&lt;/a&gt;, lying, that this was a genuine mistake, or was simply socially inept in combining these ideas doesn't matter. &lt;br /&gt;&lt;br /&gt;I expect Google to quietly mine my data and use that to provide me better service (while also making them money of course), but I don't expect them to reveal either accidentally or on purpose anything that I consider to be secret. &lt;br /&gt;&lt;br /&gt;People who can't keep secrets aren't usually treated very well by those whose secrets were revealed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1506267544148834229?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1506267544148834229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1506267544148834229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1506267544148834229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1506267544148834229'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/02/secrets-and-lies.html' title='Secrets and Lies'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6478993419747579686</id><published>2010-02-16T08:22:00.003-05:00</published><updated>2010-02-16T17:06:00.222-05:00</updated><title type='text'>Black Steel</title><content type='html'>I got an email from Microsoft the other day&lt;br /&gt;I opened and read it and it said they were suckers&lt;br /&gt;They wanted me for their army of Win7 users &lt;br /&gt;But Vista don't work yet on my Thinkpad -&lt;br /&gt;I said never!&lt;br /&gt;&lt;br /&gt;(with apologies to Chuck D and Tricky)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6478993419747579686?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6478993419747579686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6478993419747579686' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6478993419747579686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6478993419747579686'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/02/black-steel.html' title='Black Steel'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3830908128720252016</id><published>2010-02-13T11:42:00.006-05:00</published><updated>2010-02-13T12:03:55.163-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>The Buzz about Google Buzz</title><content type='html'>The release of Google Buzz has caused a fuss - The &lt;a href="http://www.nytimes.com/2010/02/13/technology/internet/13google.html"&gt;New York Times&lt;/a&gt; talks about the invasion of privacy. Twitter is all a-buzz with &lt;a href="http://twitter.com/sarahebourne/status/9058494440"&gt;anti-buzz tweets&lt;/a&gt;. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But what exactly is all the fuss about? After all, your Facebook friends list seems to be default public. Your Twitter following and follower lists are always public. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Surely your expectation of Google Buzz should be that your social network is public - it's the new black, isn't it?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So what's the problem here exactly? &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Previously, I've used Gmail infrequently, and basically just for chat and email with the small number of people I know who also use Gmail. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, until Buzz, I gmailed and gtalked only with a &lt;i&gt;very small&lt;/i&gt; number of people. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On day 1 of Google Buzz, Google made that list of people public by default. They created my "social network" by exposing what amounts to my email/chat log - the people I actually &lt;i&gt;do&lt;/i&gt; network with socially - not some random group of people who vaguely want to keep in touch with (Facebook) or some group of people whose status updates I find interesting for one reason or another (Twitter). &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They publicly exposed a list of people I actually talk to. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Of course, I closed the loophole quickly by changing my Google profile to not show my list of following/followers, but still - will everyone be so careful? Probably not - difficult to believe that Google didn't think of that beforehand either.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They used their knowledge of my email contacts to reveal my social interactions. Google abused that knowledge, and my trust that they would not abuse that knowledge. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I know why &lt;a href="http://www.ustream.tv/recorded/3848950"&gt;Zuckerberg&lt;/a&gt; and &lt;a href="http://www.cnbc.com/id/15840232?video=1372176413&amp;amp;play=1"&gt;Schmidt&lt;/a&gt; talk about the "end of privacy, so just get over it"; they're actively working to erode it. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3830908128720252016?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3830908128720252016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3830908128720252016' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3830908128720252016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3830908128720252016'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2010/02/buzz-about-google-buzz.html' title='The Buzz about Google Buzz'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-5473948036603695483</id><published>2009-08-12T20:55:00.004-04:00</published><updated>2009-08-12T21:03:59.709-04:00</updated><title type='text'>Markup Languages Family Tree</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hu8FwD79TOo/SoNlaXfgUZI/AAAAAAAAACA/4283mhBjSnI/s1600-h/markup-tree.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_Hu8FwD79TOo/SoNlaXfgUZI/AAAAAAAAACA/4283mhBjSnI/s400/markup-tree.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5369246684412924306" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-5473948036603695483?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/5473948036603695483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=5473948036603695483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5473948036603695483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5473948036603695483'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2009/08/markup-languages-family-tree.html' title='Markup Languages Family Tree'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Hu8FwD79TOo/SoNlaXfgUZI/AAAAAAAAACA/4283mhBjSnI/s72-c/markup-tree.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1239592433643902378</id><published>2009-06-08T14:32:00.002-04:00</published><updated>2009-06-08T14:39:43.593-04:00</updated><title type='text'>Building Tracemonkey</title><content type='html'>I tried to build Tracemonkey today. But the instructions given in John Resig's &lt;a href="http://ejohn.org/blog/tracemonkey/"&gt;post&lt;/a&gt; about TM didn't work for me.&lt;br /&gt;&lt;br /&gt;Instead, after I'd cloned the repository and attempted to build:&lt;br /&gt;&lt;pre&gt;hg clone http://hg.mozilla.org/tracemonkey/&lt;br /&gt;cd tracemonkey/js/src&lt;br /&gt;make -f Makefile.ref BUILD_OPT=1&lt;br /&gt;&lt;/pre&gt;I got some errors, starting with the cryptic:&lt;br /&gt;&lt;pre&gt;jsinttypes.h:113:2: error: #error "couldn't find exact-width integer types"&lt;br /&gt;&lt;/pre&gt;So, I tried the following instead:&lt;br /&gt;&lt;pre&gt;autoconf2.13&lt;span style="font-family: Georgia,serif;"&gt;&lt;br /&gt;&lt;/span&gt;./configure&lt;br /&gt;make&lt;br /&gt;shell/js&lt;br /&gt;&lt;/pre&gt;Which gave me a running Tracemonkey shell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1239592433643902378?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1239592433643902378/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1239592433643902378' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1239592433643902378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1239592433643902378'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2009/06/building-tracemonkey.html' title='Building Tracemonkey'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8523713072349520799</id><published>2008-12-03T15:50:00.002-05:00</published><updated>2008-12-03T19:40:04.137-05:00</updated><title type='text'>The Future of Mobile Social Networking</title><content type='html'>My position paper, co-authored with &lt;a href="http://research.nokia.com/people/franklin_reynolds/index.html"&gt;Franklin Reynolds&lt;/a&gt; is now &lt;a href="http://www.w3.org/2008/09/msnws/papers/nokia-mobile-social-networking.html"&gt;available&lt;/a&gt; on the workshop site. If you're a W3C member, you can take a look...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8523713072349520799?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/8523713072349520799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=8523713072349520799' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8523713072349520799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8523713072349520799'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/12/future-of-mobile-social-networking.html' title='The Future of Mobile Social Networking'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7509521700316561019</id><published>2008-10-21T20:48:00.004-04:00</published><updated>2008-10-21T22:23:07.376-04:00</updated><title type='text'>Holding back the waves?</title><content type='html'>&lt;a href="http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven"&gt;Roy has spoken&lt;/a&gt;. &lt;a href="http://blog.whatfettle.com/2008/10/21/what-i-believe-roy-said/"&gt;Paul&lt;/a&gt;, &lt;a href="http://www.dpawson.co.uk/nodesets/entries/0810211.html"&gt;Dave&lt;/a&gt; and &lt;a href="http://www.intertwingly.net/blog/2008/10/21/Progressive-Disclosure"&gt;others&lt;/a&gt; have attempted to interpret. Unfortunately, there are many who don't have time to listen, are not interested in listening, or do not possess the necessary understanding.&lt;br /&gt;&lt;br /&gt;For those people:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;REST is not SOAP&lt;/li&gt;&lt;li&gt;REST means GET and POST, maybe HEAD, but likely not PUT or DELETE.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;REST means using URIs to identify some, but not all things&lt;/li&gt;&lt;li&gt;RESTful API authentication involves OAuth or something similar - what, after all, &lt;i&gt;is&lt;/i&gt; the other "officially" RESTful way of doing API authentication?&lt;/li&gt;&lt;li&gt;REST usually means putting "custom HTTP header" information in GET query parameters or the POST body, to avoid defining... custom HTTP headers. Which method is best? The answer varies, depending on your situation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;REST means returning a custom XML format, but I might be able to (ab)use Atom, and JSON, because it works well with Javascript.&lt;/li&gt;&lt;li&gt;What is &lt;a href="http://www.stucharlton.com/blog/archives/000141.html"&gt;HATEOAS&lt;/a&gt; again?&lt;/li&gt;&lt;li&gt;REST is most usefully practiced on &lt;a href="mailto:rest-discuss@yahoogroups.com"&gt;rest-discuss&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Roy owned the meaning of REST when he coined the term. But is it not simply &lt;a href="http://en.wikipedia.org/wiki/Canute_the_Great#Ruler_of_the_waves"&gt;holding back the waves&lt;/a&gt; of democracy in attempting to wrest the meaning back from all those who now claim to be RESTful?&lt;br /&gt;&lt;br /&gt;But maybe the real problem is that no significant application design problem can be solved simply by "using REST". The answer involves actually &lt;span style="font-style: italic;"&gt;understanding&lt;/span&gt; your &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/rest_arch_style.htm"&gt;design constraints&lt;/a&gt;, and meeting real requirements with real solutions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7509521700316561019?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7509521700316561019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7509521700316561019' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7509521700316561019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7509521700316561019'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/10/holding-back-waves.html' title='Holding back the waves?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-903168289214073150</id><published>2008-10-19T11:38:00.005-04:00</published><updated>2008-10-19T12:25:20.146-04:00</updated><title type='text'>Lectio reductio</title><content type='html'>&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;if (sum( self_interests( I )) &gt; sum( everything_else ) )&lt;br /&gt;&lt;br /&gt;  if ( yearly_income( family( I )) &gt;= 250000 )&lt;br /&gt;&lt;br /&gt;    vote( mc_cain ) ;&lt;br /&gt;&lt;br /&gt;  else&lt;br /&gt;&lt;br /&gt;    vote( obama ) ;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Would it look better in a functional language?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-903168289214073150?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/903168289214073150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=903168289214073150' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/903168289214073150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/903168289214073150'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/10/lectio-reductio.html' title='Lectio reductio'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4726268228859542425</id><published>2008-06-04T07:56:00.005-04:00</published><updated>2008-06-04T08:49:11.878-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web OS'/><category scheme='http://www.blogger.com/atom/ns#' term='identity services'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud computing'/><title type='text'>Why there is (or might be) a Web OS</title><content type='html'>I hate to say that Tim Bray is wrong &lt;a href="http://www.tbray.org/ongoing/When/200x/2008/06/03/Not-an-OS"&gt;about the Cloud OS&lt;/a&gt;. I agree that, in general, memes with catchy titles are often meaningless when you try to explore the details. That being said, I think there are some reasonable parallels between that operating system concept (as represented by, say, Microsoft Windows, Apple's OS X and various Linux flavours) and some things available today on the Web:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;There is now an understanding that I can write software applications that will run on someone else's physical machines - whether it's via the Google/OpenSocial or Facebook way of thinking ("gadgets" portable between application "containers") or applications running on top of Web-based APIs to virtual machines like Google AppEngine or Amazon EC2. Isn't that really quite similar to the idea of writing an application to run on Windows, OS X and so on?&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;It is increasingly the case that one can control these applications via relatively standardized interfaces (HTTP/&lt;a href="http://brainspl.at/articles/2008/06/02/introducing-vertebra"&gt;XMPP&lt;/a&gt;/XML) Similar to the relatively standardized interfaces for writing applications in a "traditional" OS - kernel device drivers, client APIs for window manager notifications. We seem to be rapidly converging on a single UI manager - the browser.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Specific applications may be provided by more than one vendor, and I may use various different vendors' applications integrated via "mashups". I have Google contacts, Yahoo calendar and Twitter for micro-blogging - I can use their APIs to combine their applications into a new application.&lt;/li&gt;&lt;/ul&gt;But Tim says:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;The OS is the software that sits between you and the hardware.  In practice, it offers a set of brutally stupid and complex services for managing storage and networking and the lowest level of user interaction. It’s difficult and unpleasant to use.&lt;/blockquote&gt;As defined by Windows et al, that might be true. But isn't it possible to improve on that concept by providing services at a higher level (my location service, my contacts service, my "lifestream" service)? Wouldn't it be nice it we could use those services from more than one vendor? Don't we need a bit more&lt;a href="http://josephsmarr.com/2008/05/30/opensocial-openid-and-oauth-oh-my-google-io/"&gt; standardization than AtomPub&lt;/a&gt;? What if there already were a &lt;a href="http://www.projectliberty.org/liberty/content/download/387/2720/file/Liberty_Federated_Social_Identity.pdf"&gt;standard&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Note that I do NOT think that there is a &lt;span style="font-style: italic;"&gt;Web&lt;/span&gt; OS - I think we should avoid calling "it" that, anyway.&lt;br /&gt;&lt;br /&gt;But what if if we could define and make a "Cloud OS" that is related to the traditional kind (roughly as noted above) but demonstrably better than any machine-based one - would the meme be more useful then, Tim?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4726268228859542425?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4726268228859542425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4726268228859542425' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4726268228859542425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4726268228859542425'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/06/why-there-is-or-might-be-web-os.html' title='Why there is (or might be) a Web OS'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7485552964005386693</id><published>2008-05-01T09:35:00.003-04:00</published><updated>2008-05-01T09:39:40.408-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='virus'/><category scheme='http://www.blogger.com/atom/ns#' term='identity theft'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><title type='text'>How to write a virus for the "Web OS"</title><content type='html'>The BBC has an &lt;a href="http://news.bbc.co.uk/1/hi/programmes/click_online/7375772.stm"&gt;article&lt;/a&gt; today showing how they managed to commit "identity theft" by writing a Facebook application that retrieved personal information from Facebook users. Facebook applications seem a lot like computer viruses anyway. So is this the first (destructive) virus for the Web OS?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7485552964005386693?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7485552964005386693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7485552964005386693' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7485552964005386693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7485552964005386693'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/05/how-to-write-virus-for-web-os.html' title='How to write a virus for the &quot;Web OS&quot;'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-2050935902419814639</id><published>2008-04-18T12:49:00.005-04:00</published><updated>2008-04-18T14:00:17.464-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data sharing'/><category scheme='http://www.blogger.com/atom/ns#' term='dsw2008'/><category scheme='http://www.blogger.com/atom/ns#' term='datasharing'/><title type='text'>Data Sharing: What is the problem and where are we?</title><content type='html'>This morning (USA/PT) I spoke along with some &lt;a href="http://datasharingsummit.com/dsswiki/index.php?title=Main_Page"&gt;luminaries&lt;/a&gt; about the state of "data sharing".&lt;br /&gt;&lt;br /&gt;I started by paraphrasing an &lt;a href="http://www.nytimes.com/2008/04/18/style/18divorce.html?hp"&gt;article&lt;/a&gt; from today's New York Times, about how blogging has become so mainstream that people are using blogs to talk about their marriages, divorces and other personal (and often controversial) topics.&lt;br /&gt;&lt;br /&gt;So where we are is that people are now using the Internet to, well, just be people. They don't care so much any more about technology, and they are not alpha geeks.&lt;br /&gt;&lt;br /&gt;No longer are we dealing only with technology silos, but with real issues for (non-technical) society to deal with.&lt;br /&gt;&lt;br /&gt;But data portability as a specific part of that can't try to address all the issues of society.&lt;br /&gt;&lt;br /&gt;Then there are all the technologies. SAML, OpenID, Information Cards, OpenSocial, Social Graph API, ATOM, XFN, FOAF to name just a few.&lt;br /&gt;&lt;br /&gt;And data portability as a specific user of these technologies can't try to convince anyone that any one technology can deal with the whole issue of data portability.&lt;br /&gt;&lt;br /&gt;So, what &lt;span style="font-style: italic;"&gt;is&lt;/span&gt; the problem that we &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; solve in data portability?&lt;br /&gt;&lt;br /&gt;My opinion is that we should address specific, and likely quite small, things - help establish interoperability between the various technologies and vendors. Think about the big issues, but make small, specific solutions that enable society &lt;span style="font-style: italic;"&gt;as a whole&lt;/span&gt; to solve those issues without making ourselves crazy.&lt;br /&gt;&lt;br /&gt;Just &lt;span style="font-style: italic;"&gt;my&lt;/span&gt; opinion though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-2050935902419814639?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/2050935902419814639/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=2050935902419814639' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2050935902419814639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2050935902419814639'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/04/data-sharing-what-is-problem-and-where.html' title='Data Sharing: What is the problem and where are we?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-5533338281406645181</id><published>2008-04-09T16:54:00.004-04:00</published><updated>2008-04-12T11:28:05.921-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Python list comprehensions</title><content type='html'>I've been writing some code to suck out query parameters today. While figuring out how to do it, I discovered the following code in an &lt;a href="http://mail.python.org/pipermail/python-list/2004-December/295345.html"&gt;email thread&lt;/a&gt;:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;params = [p.split("=", 1) for p in self._query.split("&amp;amp;")]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This uses a Python &lt;a href="http://docs.python.org/tut/node7.html#SECTION007140000000000000000"&gt;list comprehension&lt;/a&gt; quite nicely to turn my urlparsed query string into a list of lists, where each sub-list contains a key and value from the URL query string.&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;How does this expression get evaluated?&lt;br /&gt;&lt;br /&gt;i) We know it returns a list because you asked for it by placing the whole shebang inside these square brackets [...] ;)&lt;br /&gt;ii) The sub-expression &lt;span style="font-family:courier new;"&gt;p.split("=", 1)&lt;/span&gt;appears first, and this is run on each p in the 'for' sub-expression.&lt;br /&gt;&lt;br /&gt;In English: for each &amp;amp;-separated key/value pair &lt;span style="font-family:courier new;"&gt;p&lt;/span&gt; in the string &lt;span style="font-family:courier new;"&gt;self._query&lt;/span&gt;, split that pair on the &lt;span style="font-family:courier new;"&gt;=&lt;/span&gt; sign, and create a list containing the two values. Return a list of those lists.&lt;br /&gt;&lt;br /&gt;List comprehensions. Hmmm....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-5533338281406645181?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/5533338281406645181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=5533338281406645181' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5533338281406645181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5533338281406645181'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/04/python-list-comprehensions.html' title='Python list comprehensions'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6312480715764173976</id><published>2008-04-08T16:50:00.005-04:00</published><updated>2008-04-08T16:59:40.234-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WS-*'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>SOAP vs. REST - why should you really care?</title><content type='html'>For many moons, the WS-* crowd, and the RESTafarians have argued. But what are the real differences in the two approaches? Although the argument is old, I still get asked for my opinion on this quite regularly - so here it is:&lt;br /&gt;&lt;br /&gt;If you control the software at both the client and the server (sometimes known as the SOAP nodes ;) you can do whatever you'd like. In that case, you could choose to implement SOAP headers, or HTTP headers and no-one would know the difference. You can write your&lt;br /&gt;own protocol, or use an existing one and extend it. A SOAP envelope is then "just an envelope". HTTP allows headers, and an "entity-body" - is an HTTP request or response then "just an envelope" too? Conversely, if you're writing an application that must talk with software written&lt;br /&gt;by someone else, you'll need to support that interface, whatever it is.&lt;br /&gt;&lt;br /&gt;So these days, other than out of necessity, why would someone offer a SOAP interface to their Web service?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;  Will your interface be "bound" to more than one network transport? If you want to send SOAP+your interface over HTTP to some clients, and SOAP+your interface over BEEP to others, SOAP offers &lt;i&gt;some&lt;/i&gt; independence from the underlying transport, but the abstraction is still &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;leaky&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt; &lt;/span&gt;(see &lt;a href="http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528"&gt;SOAPAction &lt;/a&gt;for example). Some would argue not only that the abstraction is useless, but that it is actually a hindrance to programmers.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt; If others will develop software to talk to that interface, there are some almost-nice tools for creating SOAP/XML-based object "stubs" from XML (WSDL) files. These &lt;i&gt;might&lt;/i&gt; make it easier to develop clients for a SOAP service. In my experience though, WSDL and XML descriptions can make only &lt;a href="http://blog.whatfettle.com/2006/06/26/introducing-dr-evil-sir-pedant-and-mr-relax/"&gt;a poor substitute&lt;/a&gt; for talking to a human being and simply "following links". In other words, I'm not sure if there really is a short-cut to creating the code necessary to properly access any particular Web service (unless you are able to choose a good &lt;a href="http://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;standard&lt;/a&gt; for your service, and find code that implements the standard, and works for you)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;There are several (WS-Security, WS-Trust, ID-WSF Authentication Service) well-documented ways of doing reasonable forms (beyond cleartext passwords) of authentication and simplified sign-on over SOAP. Of course, now that we have &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt;, what's the problem with authentication in an HTTP header?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;SOAP + &lt;a href="http://www.beepcore.org/"&gt;BEEP&lt;/a&gt; allow you to create a single channel (ie. TCP socket connection) to send messages between two peers, rather than with the potentially more pedestrian HTTP method of requiring two peers to be running both a client and a server (and establish two channels) Beyond the cost of setting up two channels versus one (which may of course still be very important - espeically in an unreliable mobile network!), is there any other advantage to being able to create only one channel for two-way communication?  How does SOAP + BEEP compare to XMPP in this regard?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;When should you definitely &lt;i&gt;not&lt;/i&gt; use SOAP?&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Would you like responses to be cached at the edge of your network, rather than retrieved, each time, from your database? Don't want to write your own caching proxy code? HTTP has &lt;a href="http://intertwingly.net/blog/2006/06/05/Elevator-Pitch"&gt;this&lt;/a&gt; already.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If your client is the common Web browser, SOAP doesn't make very much sense at all.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6312480715764173976?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6312480715764173976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6312480715764173976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6312480715764173976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6312480715764173976'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/04/soap-vs-rest-why-should-you-really-care.html' title='SOAP vs. REST - why should you &lt;i&gt;really&lt;/i&gt; care?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6187916893263134712</id><published>2008-03-18T17:29:00.005-04:00</published><updated>2008-03-18T18:08:30.240-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mashups'/><category scheme='http://www.blogger.com/atom/ns#' term='API'/><category scheme='http://www.blogger.com/atom/ns#' term='mashupcamp'/><title type='text'>At Mashup Camp</title><content type='html'>"If I see another cross-platform browser-based open mashup development environment, I'll scream."&lt;br /&gt;&lt;br /&gt;&lt;img src="http://media.twango.com/m1/medium/0148/317fb910e387460480300187672f9957.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;At &lt;a href="http://wiki.mashupcamp.com/index.php/MashupU"&gt;MashupU&lt;/a&gt; I have learned some things today. In addition to &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt;, we now have &lt;a href="http://developer.yahoo.com/common/phpserial.html"&gt;Yahoo's serialized PHP&lt;/a&gt;. And Yahoo's &lt;a href="http://fireeagle.yahoo.net/"&gt;FireEagle&lt;/a&gt; looks &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; cool.&lt;br /&gt;&lt;br /&gt;But the real learning here is that (as Seth Fitzsimmons of Yahoo noted sagely) mashups are no longer the result of someone "viewing source" to extract a web API, but are really the very intentionally open APIs to web-based applications. Business mashups are the theme here, with products such as IBM's &lt;a href="http://www.ibm.com/lotus/mashups"&gt;Lotus Mashups&lt;/a&gt; being squarely targeted at the enterprise market.&lt;br /&gt;&lt;br /&gt;We'll see what tomorrow brings...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6187916893263134712?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6187916893263134712/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6187916893263134712' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6187916893263134712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6187916893263134712'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/03/at-mashup-camp.html' title='At Mashup Camp'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-570142061385399410</id><published>2008-02-04T14:11:00.000-05:00</published><updated>2008-02-04T14:19:31.345-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='pandoc'/><title type='text'>Pandoc on Gutsy, revisited</title><content type='html'>Thanks to the following comments from John McFarlane on my &lt;a href="http://appliedlife.blogspot.com/2008/01/installing-pandoc-on-ubuntu-gutsy.html"&gt;earlier post&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;As for the problem with 0.46 -- I was just able to compile 0.46 on&lt;br /&gt;Ubuntu. So before I consider it a bug, can you try this? Download a&lt;br /&gt;fresh tarball of pandoc-0.46, unpack it, and try 'make' again. If that&lt;br /&gt;doesn't work, try this:&lt;br /&gt;&lt;br /&gt;  make clean&lt;br /&gt;  cp pandoc.cabal.ghc66 pandoc.cabal&lt;br /&gt;  make&lt;br /&gt;&lt;br /&gt;The problem you ran into has to do with changes in Haskell's "Cabal"&lt;br /&gt;build program between GHC 6.6 and GHC 6.8.  A different 'pandoc.cabal'&lt;br /&gt;file is needed depending on whether the user has GHC 6.6 or GHC 6.8.&lt;br /&gt;The way we handle this is by checking the GHC version in the Makefile,&lt;br /&gt;and using an appropriate 'pandoc.cabal'. Here's what I'm guessing&lt;br /&gt;happened with you: when you first tried 'make', you didn't have GHC&lt;br /&gt;installed properly, so the Makefile couldn't determine the GHC version&lt;br /&gt;and decided by default to use the version of 'pandoc.cabal' that is&lt;br /&gt;appropriate for GHC 6.8. This decision then stuck, even after you'd&lt;br /&gt;gotten GHC installed. (Gutsy has GHC 6.6.)&lt;br /&gt;&lt;br /&gt;If that's what happened, then a fresh install should work just fine.&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;I got my Ubuntu Gutsy version working just fine. And based on John's instructions, also made a Ubuntu Gutsy install &lt;a href="http://jkemp.net/downloads/pandoc_0.46_i386.deb"&gt;package&lt;/a&gt; which you should be able to install with dpkg.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-570142061385399410?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/570142061385399410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=570142061385399410' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/570142061385399410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/570142061385399410'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/02/pandoc-on-gutsy-revisited.html' title='Pandoc on Gutsy, revisited'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3694662986560191298</id><published>2008-02-01T15:03:00.000-05:00</published><updated>2008-02-01T15:18:04.041-05:00</updated><title type='text'>Photo-blogging at Twango</title><content type='html'>I started to &lt;a href="http://www.twango.com/channel/frumioj.personal"&gt;photo-blog&lt;/a&gt; quite a lot, using Nokia's &lt;a href="http://www.twango.com"&gt;Twango&lt;/a&gt; service (just to see what's there). The service allows me to upload photos via email, and so, I've setup my N95 to be able to email photos from my phone gallery:&lt;br /&gt;&lt;br /&gt;i)  View the settings for the Twango channel you want to email to:&lt;br /&gt;&lt;br /&gt;You'll see there's an email address given. &lt;br /&gt;&lt;br /&gt;ii) You can either send it as a vCard to an email address (not currently to your phone) or simply create a new contact in your contacts database.&lt;br /&gt;&lt;br /&gt;iii) Now when you take a phone-camera image, you can press send, and choose the contact you saved in the previous step. &lt;br /&gt;&lt;br /&gt;It's worked very well for me. Next up, I hope to write a Python script to do this in a more automated way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3694662986560191298?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3694662986560191298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3694662986560191298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3694662986560191298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3694662986560191298'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/02/photo-blogging-at-twango.html' title='Photo-blogging at Twango'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3279748211975266652</id><published>2008-01-17T11:16:00.000-05:00</published><updated>2008-01-17T11:53:47.610-05:00</updated><title type='text'>Asus EEE PC vs. MacBook Air</title><content type='html'>What, you say? A sub-$400 Linux machine against the new flagship product of the greatest marketing machine around today?! Surely not!&lt;br /&gt;&lt;br /&gt;But here are the technical specs:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://arstechnica.com/reviews/hardware/eee-pc-review.ars"&gt;ASUS EEE&lt;/a&gt; - 900 MHz Intel Celeron,&lt;br /&gt;512MB main memory (expands to 2GB), 4GB SSD internal storage, 3 USB ports, user-replaceable battery, SDHC slot, Ethernet port, 7" screen(800x480), 0.92kg weight, priced at less than $400&lt;br /&gt;&lt;br /&gt;&lt;a href="http://store.apple.com/1-800-MY-APPLE/WebObjects/AppleStore.woa/wa/RSLID?nnmm=browse&amp;amp;mco=7B723660&amp;amp;node=home/shop_mac/family/macbook_air"&gt;MacBook Air&lt;/a&gt; - 1.6GHz Intel Core 2 Duo (1.8GHz for extra $300), 2GB main memory (no expansion AFAIK), 80 GB PATA internal storage (64GB SSD for extra $999), 1 USB port, battery replacement only by authorized service, no SDHC slot, no Ethernet port, 13.3" screen (1280x800 LED), 1.36kg weight, priced from $1799&lt;br /&gt;&lt;br /&gt;And although they are different shapes, they both fit into envelopes (one smaller than the other ;)&lt;br /&gt;&lt;br /&gt;The Air is definitely beautiful, and represents an advance in industrial design techniques. But the EEE represents an advance in value for money. For someone who just wants a travel laptop, I'd have to say that the EEE is a better compromise decision than the Air.  And if you want a full-featured laptop for general usage, you'd be better off with a regular MacBook Pro. Of course, that's just my opinion. In comparison, though, the most remarkable thing to me is the difference in price - the Asus is really stunningly good value for money, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3279748211975266652?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3279748211975266652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3279748211975266652' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3279748211975266652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3279748211975266652'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/01/asus-eee-pc-vs-macbook-air.html' title='Asus EEE PC vs. MacBook Air'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8634798013916707627</id><published>2008-01-16T11:29:00.000-05:00</published><updated>2008-02-04T14:20:17.322-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='haskell'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='pandoc'/><title type='text'>Installing Pandoc on Ubuntu Gutsy</title><content type='html'>I am a very big fan of &lt;a href="http://johnmacfarlane.net/pandoc/"&gt;Pandoc&lt;/a&gt; - a tool for converting from one markup format to another. It's most useful for me in converting Markdown-formatted text into S5 or "regular" HTML.&lt;br /&gt;&lt;br /&gt;Unfortunately (for me at least) Pandoc isn't yet a standard package in Ubuntu Gutsy (it will &lt;a href="http://johnmacfarlane.net/pandoc/#downloads"&gt;apparently&lt;/a&gt; be in Hardy) and as far as I know, it hasn't been officially backported.&lt;br /&gt;&lt;br /&gt;So, I had to install it myself, package by package, finally compiling from source:&lt;br /&gt;&lt;br /&gt;First, version &lt;a href="http://code.google.com/p/pandoc/downloads/detail?name=pandoc-0.46.tar.gz"&gt;0.46&lt;/a&gt; (and 0.45) had an error that prevented me compiling it:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jkemp@deepsea:~/pandoc-0.46$ make&lt;br /&gt;./setup configure --prefix=/usr/local --with-compiler=ghc --with-hc-pkg=ghc-pkg&lt;br /&gt;setup: pandoc.cabal:39: 'Executable' stanza starting with field 'library&lt;br /&gt;if flag(splitbase)&lt;br /&gt;build-depends'&lt;br /&gt;make: *** [dist/setup-config] Error 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I was able to successfully make version &lt;a href="http://code.google.com/p/pandoc/downloads/detail?name=pandoc-0.44.tar.gz"&gt;0.44&lt;/a&gt; by first installing the following packages from the usual (Gutsy) places:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;jkemp@deepsea:~/$ sudo apt-get install ghc6 libghc6-xhtml-dev libghc6-mtl-dev libghc6-network-dev&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note: I determined the necessary libraries by checking the pandoc.cabal file included in the source tarball, and adding 'libghc6-&lt;library-name&gt;-dev' to the install line above. I verified this by then removing the libraries, and running make, replacing each library one by one.&lt;br /&gt;&lt;br /&gt;After doing that, and unpacking the source tarball, I just ran 'make' and 'sudo make install' in the source directory, and voila, I was able to run Pandoc!&lt;/library-name&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8634798013916707627?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/8634798013916707627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=8634798013916707627' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8634798013916707627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8634798013916707627'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2008/01/installing-pandoc-on-ubuntu-gutsy.html' title='Installing Pandoc on Ubuntu Gutsy'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6820417178346897773</id><published>2007-12-11T12:30:00.000-05:00</published><updated>2008-02-01T15:33:44.083-05:00</updated><title type='text'>Amusement Park Safety</title><content type='html'>October 2006. The vacation of their (albeit short) lifetime for my daughters to Disney World, down in Florida. Things didn't quite go as planned, though, when one of my daughters became trapped in the entrance to a ride at Disney's Epcot Centre. She was stepping down into one of the cars when the semi-automatic gates closed on her. She pulled her head back, but her neck was trapped between the bars of the entrance gate.&lt;br /&gt;&lt;br /&gt;The people operating the ride tried to push the safety release for the gate, but it wouldn't open. Four of us (none of us Disney staff) wrenched at the gate until finally we were able to open it manually.&lt;br /&gt;&lt;br /&gt;Fortunately, my daughter was unharmed. An older, bigger child might have been trapped without being able to breathe.&lt;br /&gt;&lt;br /&gt;Disney staff were certainly quick to offer medical help.&lt;br /&gt;&lt;br /&gt;But within hours the ride was operating again. Why was power turned off to the emergency gate release? Why were we ushered into the ride entrance without the gates first being closed? I took the ride alone the day after this accident, and no procedures appeared to have changed. Why not? Who decides whether an accident is worthy of review and who gets to review whether this ride is actually safe enough for the people sitting on it?&lt;br /&gt;&lt;br /&gt;The answer is shocking. &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2007/12/03/AR2007120302091.html?hpid=artslot"&gt;Large operators can do what they want&lt;/a&gt;, and review (or not) according to their own ideas of safety. That's because there is a loophole in the consumer product safety law, designed to let these large operators make the rules for themselves with no public oversight. Representative Ed Markey (D. MA) has sponsored an amendment that would remove the loophole, but the lobbyists are &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2007/12/05/AR2007120502856.html"&gt;out in force.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you are reading this blog, and you live in the USA, please call your representatives and ask them to vote in favour of HR 2320, the National Amusement Park Rides Safety Act of 2007.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.saferparks.org/"&gt;Saferparks.org&lt;/a&gt;, and &lt;a href="http://rideaccidents.com/"&gt;rideaccidents.com&lt;/a&gt; can tell you more about why this legislation is needed. An amusement park shouldn't be a place to find dead or injured children, and we can help prevent such accidents.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6820417178346897773?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6820417178346897773/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6820417178346897773' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6820417178346897773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6820417178346897773'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/12/amusement-park-safety.html' title='Amusement Park Safety'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1425951614471995402</id><published>2007-11-30T13:32:00.000-05:00</published><updated>2007-11-30T14:09:03.705-05:00</updated><title type='text'>Kernel recompile on Asus EEE</title><content type='html'>I am the very proud owner of an &lt;a href="http://eeepc.asus.com/global/"&gt;Asus EEE&lt;/a&gt;! I can't even describe how happy even the default simple interface of this machine makes me. It's about 1/4 the size of my 15" MacBook Pro, but I've already set it up to do full-featured software development in Java and C - perfect for the airplane environment in which I often find myself developing software.&lt;br /&gt;&lt;br /&gt;I had until yesterday two problems:&lt;br /&gt;&lt;br /&gt;i) By default the Xandros kernel installed on the device doesn't support more than 1Gb of RAM.&lt;br /&gt;ii) My work environment requires encryption of the filesystem, and because the device mapper isn't supported, I couldn't use dm-crypt and cryptsetup to access encrypted partitions.&lt;br /&gt;&lt;br /&gt;So I had to compile a new kernel - woah!&lt;br /&gt;&lt;br /&gt;Asus has made the kernel source for the stock hardware &lt;a href="http://dlsvr03.asus.com/pub/ASUS/EeePC/701/Linux_Kernel_071127.rar"&gt;available&lt;/a&gt; so I downloaded and uncompressed it, installing it to /usr/src.&lt;br /&gt;&lt;br /&gt;I got the original kernel configuration file from /boot/config-2.6.21.4-eeepc, and copied this to /usr/src/linux/.config, and ran:&lt;br /&gt;&lt;pre&gt;make oldconfig&lt;br /&gt;make prepare&lt;br /&gt;make scripts&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt; I then adjusted the CONFIG_LOCALVERSION in the config file to be -eeepc-HIGHMEM, and set the other variables via:&lt;br /&gt;&lt;pre&gt;make config&lt;/pre&gt; (as 'make menuconfig' didn't work for me).&lt;br /&gt;&lt;br /&gt;I adjusted the following kernel settings:&lt;br /&gt;&lt;br /&gt;i) High memory, currently set to 1GB to 4GB&lt;br /&gt;ii) Device Mapping (in RAID and LVM) CONFIG_MD, and CONFIG_BLK_DEV_DM, CONFIG_DM_CRYPT as modules ('m' option).&lt;br /&gt;&lt;br /&gt;and then compiled a new kernel in the usual way:&lt;br /&gt;&lt;pre&gt;make bzImage&lt;br /&gt;make modules&lt;br /&gt;make modules_install&lt;br /&gt;&lt;/pre&gt;Now crucially, because I changed the name of the "local version", the modules got copied to a new sub-directory of /lib/modules. If you don't change the name, and you use the stock source, your existing modules will be overwritten, and because you changed the memory settings, you will have weird events when you try to boot your old kernel that will try unsuccessfully to use the new modules.&lt;br /&gt;&lt;br /&gt;Note also that I DID NOT run 'make install' to put the kernel in /boot!&lt;br /&gt;&lt;br /&gt;It turns out that Asus used something called &lt;a href="http://www.filesystems.org/project-unionfs.html"&gt;unionfs&lt;/a&gt; - a filesystem that merges directories or disk partitions to appear as a single filesystem. Although this is terribly tricky, it turns out they did this to make it hard for someone to mess up their PC so badly they wouldn't be able to restore it to factory settings on their own. And this means that however hard you try, you can only make it &lt;i&gt;look&lt;/i&gt; as if you installed a new kernel in /boot - it won't happen because you are looking only at the user partition of your filesystem, not the system partition, which contains the &lt;i&gt;real&lt;/i&gt; /boot directory!&lt;br /&gt;&lt;br /&gt;Anyway, what that means is that you need to find another way to install your new kernel. My way involved getting into single-user mode on your EEE PC - like &lt;a href="http://wiki.eeeuser.com/howto:installrescuemode"&gt;this&lt;/a&gt;. Once I had done that, I edited the &lt;i&gt;real&lt;/i&gt; /boot directory to add my new kernel and system map, and then edited /boot/grub/menu.lst to include the new kernel (in addition to adding the rescue mode entry, as detailed on the wiki link above). You could also build your kernel on another machine and put it on a USB drive to ship it to the EEE PC, but you'd still need to be in single-user mode to install it.&lt;br /&gt;&lt;br /&gt;I booted to the new kernel, and started using cryptsetup to &lt;a href="http://feraga.com/library/howto_use_cryptsetup_with_luks_support_0"&gt;encrypt my USB disk&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Next I can look forward to breaking the warranty by putting "too much" memory in it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1425951614471995402?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1425951614471995402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1425951614471995402' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1425951614471995402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1425951614471995402'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/11/kernel-recompile-on-asus-eee.html' title='Kernel recompile on Asus EEE'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1505583106765994637</id><published>2007-11-19T11:11:00.000-05:00</published><updated>2007-11-19T11:18:23.083-05:00</updated><title type='text'>Nokia 2.0?</title><content type='html'>There has been a lot of discussion inside Nokia about our role as a services company, and what "Web 2.0" means to us (and us to it). The "unofficial" ad &lt;a href="http://www.dailymotion.com/video/x3ir7u_la-chanson-du-web-20-par-nokia_fun"&gt;here&lt;/a&gt; at first glance makes me wince. But is it perhaps &lt;a href="http://en.wikipedia.org/wiki/Taking_the_mickey"&gt;self-ridicule&lt;/a&gt;, and thus &lt;span style="font-style: italic;"&gt;quite&lt;/span&gt; &lt;a href="http://opengardensblog.futuretext.com/archives/2006/09/is_web_20_anyth.html"&gt;Web 2.0 and "post-modern&lt;/a&gt;"? If you look at it with such a squint, it's at least quite funny!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1505583106765994637?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1505583106765994637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1505583106765994637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1505583106765994637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1505583106765994637'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/11/nokia-20.html' title='Nokia 2.0?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-864379578161042960</id><published>2007-10-22T12:17:00.000-04:00</published><updated>2007-10-22T12:20:08.861-04:00</updated><title type='text'>The life of an astronaut...</title><content type='html'>Is apparently not for me. At 76 inches I'm apparently too tall to be a NASA &lt;a href="http://jobsearch.usajobs.opm.gov/getjob.asp?JobID=62398554&amp;amp;brd=3876&amp;amp;AVSDM=2007%2D09%2D18+00%3A00%3A04&amp;amp;q=astronaut&amp;amp;sort=rv&amp;amp;vw=d&amp;amp;Logo=0&amp;amp;FedPub=Y&amp;amp;FedEmp=N&amp;amp;SUBMIT1.x=0&amp;amp;SUBMIT1.y=0&amp;amp;ss=0&amp;amp;SUBMIT1=Search+for+Jobs&amp;amp;TabNum=1&amp;amp;rc=3"&gt;astronaut candidate&lt;/a&gt; - Now, if only I could be disqualified from economy-class airplane flights too...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-864379578161042960?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/864379578161042960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=864379578161042960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/864379578161042960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/864379578161042960'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/10/life-of-astronaut.html' title='The life of an astronaut...'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3194413344892675801</id><published>2007-09-06T12:26:00.001-04:00</published><updated>2007-09-06T15:27:14.265-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Facebook opens profiles to public</title><content type='html'>Facebook has &lt;a href="http://news.bbc.co.uk/2/hi/technology/6980454.stm"&gt;apparently opened up&lt;/a&gt;. Unfortunately, it's probably now a bit too open. Rather than opening up profiles to everyone, wouldn't it have made more sense to allow people with OpenIDs, holders of Google accounts, or Windows Live ID users to access Facebook profiles?&lt;br /&gt;&lt;br /&gt;UPDATE: I accessed my Facebook account today, and noticed that I was able to edit my 'search privacy' settings to uncheck the boxes that would enable the sharing of my profile with the world. That's good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3194413344892675801?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3194413344892675801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3194413344892675801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3194413344892675801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3194413344892675801'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/09/facebook-opens-profiles-to-public_06.html' title='Facebook opens profiles to public'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-2304100251347672366</id><published>2007-09-05T11:40:00.000-04:00</published><updated>2007-09-05T11:46:14.728-04:00</updated><title type='text'>How to make yourself feel smaller (and more educated)</title><content type='html'>I'm not talking about a new diet.&lt;br /&gt;&lt;br /&gt;But if you're working on anything to do with the Internet, or even just using your web browser, you could do a lot worse for your body (or mind!) for 90 minutes than watch &lt;a href="http://video.google.com/videoplay?docid=7797884493079985700"&gt;this video&lt;/a&gt; presentation by Vint Cerf about "Tracking the Internet into the 21st century.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-2304100251347672366?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/2304100251347672366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=2304100251347672366' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2304100251347672366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2304100251347672366'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/09/how-to-make-yourself-feel-smaller-and.html' title='How to make yourself feel smaller (and more educated)'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4698851256740452818</id><published>2007-08-30T10:10:00.000-04:00</published><updated>2007-08-30T10:48:03.447-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><category scheme='http://www.blogger.com/atom/ns#' term='Cardspace'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='Enhanced Client'/><title type='text'>OpenID and Cardspace, the pleasure and the pain...</title><content type='html'>Gerald Beuchelt of Sun &lt;a href="http://beuchelt.blogdns.net:8080/OpenIDInfocardsPainfulOrPromising.aspx"&gt;blogs&lt;/a&gt; some interesting comments about the &lt;a href="https://openidcards.sxip.com/spec/openid-infocards.html"&gt;Sxip draft specification&lt;/a&gt; showing their view of how to combine OpenID and Cardspace. Gerald raises some excellent points, particularly about how the Cardspace decoupling of RP protocol exchange and IdP protocol exchange is essentially broken by the way that this specification has been written:&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;While the OpenID Infocard token replaces the HTTP redirect with the much more phishing resistant Infocard scheme, it will lead to some significant confusion in the marketplace. Educating customers and end-users might help to some extend, but explaining the differences between auditing and non-auditing mode is going to be very difficult. This is why Kim is rather careful about not advocating it: it breaks his own 7 laws.&lt;/blockquote&gt;What would surely be best, given the variety of SSO solutions today, would be to specify a way in which the RP protocol exchange were truly decoupled from the exchange happening between the "identity selector" and the IdP. In that way, the identity selector could talk OpenID with the RP, and possibly another protocol with the IdP. You'd need to "translate" a token at the identity selector (client side). What is needed to allow the RP to trust this translation process? How can this translation be specified securely? Seems like a good use-case for &lt;a href="http://projectconcordia.org/index.php/Main_Page"&gt;Project Concordia&lt;/a&gt;... And back to Gerald's point - a protocol containing an &lt;a href="http://www.w3.org/TR/2003/REC-soap12-part1-20030624/#activeinter"&gt;active intermediary&lt;/a&gt; should be treated differently than one where simple HTTP redirects are used (see the definition for the &lt;a href="http://appliedlife.blogspot.com/2007/06/saml-enhanced-client-or-proxy.html"&gt;SAML 2.0 Enhanced Client&lt;/a&gt; for example)!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4698851256740452818?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4698851256740452818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4698851256740452818' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4698851256740452818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4698851256740452818'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/openid-and-cardspace-pleasure-and-pain.html' title='OpenID and Cardspace, the pleasure and the pain...'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3250558778574797595</id><published>2007-08-29T16:44:00.000-04:00</published><updated>2007-08-29T16:47:50.528-04:00</updated><title type='text'>Advance in mobile phone design</title><content type='html'>Even though I work for a mobile phone company, and I often get new phones to play with, I've not seen one quite like this &lt;a href="http://englishrussia.com/?p=1312#more-1312"&gt;Russian masterpiece&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.makezine.com/blog/1.jpg"&gt;&lt;img style="cursor: pointer; width: 400px;" src="http://www.makezine.com/blog/1.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3250558778574797595?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3250558778574797595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3250558778574797595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3250558778574797595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3250558778574797595'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/advance-in-mobile-phone-design.html' title='Advance in mobile phone design'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7230601663856419525</id><published>2007-08-29T11:49:00.000-04:00</published><updated>2007-08-30T10:48:39.087-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sauerkraut'/><category scheme='http://www.blogger.com/atom/ns#' term='cabbage'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><title type='text'>Making "liberty cabbage"</title><content type='html'>On Sunday, I decided to take the three cabbages we had sitting around,and turn them into "naturally fermented" (not pickled) sauerkraut. That might sound difficult, but involved only the following steps:&lt;br /&gt;&lt;br /&gt;1. Remove the outer leaves of the cabbage, and slice the rest of it as thinly as you'd like.&lt;br /&gt;2. Weigh the cabbage and put it in a bowl.&lt;br /&gt;3. For each pound (lb) of cabbage, sprinkle 1.5 tsps. of salt into the bowl.&lt;br /&gt;4. Mix the salt and cabbage well, and let it sit, while you wash some (no bigger than a quart) mason jars. Don't use anything more than hot water to wash the jars - they don't need to be boiled, and you actually want the (good) bacteria to be around to do their work.&lt;br /&gt;5. Stuff the salted cabbage into jars, and cap, leaving around 3/4 inch of headroom.&lt;br /&gt;6. As the lactobacilli go to work, some gas may be produced, so put your jars on a tray.&lt;br /&gt;7. Leave them at a temperature of 62-72F for up to three weeks, and then refrigerate. The sauerkraut should be good to eat already!&lt;br /&gt;&lt;br /&gt;Coincidentally, on that same day, I started reading &lt;a href="http://www.amazon.com/Last-Town-Earth-Novel/dp/1400065208"&gt;a book&lt;/a&gt; set during the first world war, at a time when sauerkraut was known in the States as &lt;a href="http://en.wikipedia.org/wiki/Liberty_cabbage"&gt;liberty cabbage&lt;/a&gt;. The phrase "freedom fries" was then not so innovative - fancy that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7230601663856419525?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7230601663856419525/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7230601663856419525' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7230601663856419525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7230601663856419525'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/making-liberty-cabbage.html' title='Making &quot;liberty cabbage&quot;'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8639078650932827646</id><published>2007-08-16T19:05:00.000-04:00</published><updated>2007-08-16T21:11:54.105-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='mindfulness'/><title type='text'>REST and mindfulness</title><content type='html'>When I woke up this morning, I blundered about a bit with my eyes not focussed, pulled various implements from the drawers in my kitchen, and somehow, without really thinking anything at all, made breakfast for myself and my daughters. If I'd have been thinking, I might have noticed that my right ankle is still painful in the mornings, a whole year since being fractured. Or if I'd have tried to focus my eyes, I might have noticed that my left eye can't see too much close up. Hurray for mind&lt;i&gt;less&lt;/i&gt;ness, thought I!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Mindfulness"&gt;Mindfulness&lt;/a&gt;, for those who don't know, is (according to the ever-helpful Wikipedia)&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;"&lt;span style="font-style: italic;"&gt;a technique in which a person becomes intentionally aware of his or her thoughts and actions in the present moment&lt;/span&gt;." &lt;/blockquote&gt;I was reminded of mindfulness recently, while reading the excellent &lt;a href="http://www.oreilly.com/catalog/9780596529260/"&gt;RESTFUL Web Services&lt;/a&gt;, recommended to all of us at XML Summer School this year by &lt;a href="http://blog.whatfettle.com/"&gt;Paul Downey&lt;/a&gt; and &lt;a href="http://weblogs.java.net/blog/mhadley/"&gt;Marc Hadley&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This book actually writes down the specific techniques for adhering to the previously somewhat nebulous &lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;REST &lt;/a&gt;&lt;span style="font-style: italic;"&gt;&lt;a href="http://www.ics.uci.edu/%7Efielding/pubs/dissertation/top.htm"&gt;architectural style&lt;/a&gt;. &lt;/span&gt;I still might not be able to describe this style concretely, but I can think I can safely say "I knew it when I read this book."&lt;br /&gt;&lt;br /&gt;Mindfulness can have some disadvantages. Why is it that people who wish to use the PUT and DELETE verbs have to resort to workaround hacks (like putting the real method in a query parameter) because of sketchy browser support? It would be nice to fix that - these workarounds seem no better than "tunneling" a SOAP message inside an HTTP request. And this book certainly doesn't spare "Big Web Services" from a ripping. The authors do note, however, in Chapter 10 that&lt;br /&gt;&lt;blockquote style="font-style: italic;"&gt;"The WS-ReliableMessaging standard is motivated mainly by complex scenarios that RESTful web services don't address at all. These might be situations where a message is routed through multiple protocols on the way to its destination, or where both source and destination are cell phones with intermittent access to the network."&lt;/blockquote&gt;I'm relieved to see that Nokia's use of Big Web Services looks like it might be a reasonable choice then.&lt;br /&gt;&lt;br /&gt;This book skewers SOAP+WSDL-based web services quite mercilessly. I actually think that's not necessary. I could have personally benefited from a more even-handed look at when you might want to use the WS-* specifications, or even how one could make more RESTful SOAP-based services. After all, isn't REST is an architectural style, rather than an actual architecture? And the authors do describe quite nicely how to make more RESTful AJAX applications (which also come in for a bit of a stick due to their lack of addressability and surfeit of state.)&lt;br /&gt;&lt;br /&gt;I'd have to say, though, that this book represents an actual advance in the art of networked software development. Even the developers of Big Web Services should read it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8639078650932827646?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/8639078650932827646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=8639078650932827646' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8639078650932827646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8639078650932827646'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/rest-and-mindfulness.html' title='REST and mindfulness'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7112749335475333005</id><published>2007-08-13T09:26:00.000-04:00</published><updated>2007-08-13T09:36:26.539-04:00</updated><title type='text'>Tips on using Google anonymously</title><content type='html'>I've been using &lt;a href="http://tor.eff.org"&gt;Tor&lt;/a&gt; for a few years now. When I first installed it, I found Tor quite difficult to configure, and given that it introduced an intermediary application to my web browsing, the speed of my Internet browsing experience was suddenly not so wonderful. Tor is these days easier to configure and has less of an effect on web performance. But it's not for everyone. I came across &lt;a href="http://howtosplitanatom.com/how-to-hack-your-life/how-to-use-google-anonymously/"&gt;this post&lt;/a&gt; today, which talks about some other tips to make it more difficult for web services to discover things about you. I hadn't heard about the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/743"&gt;Customize Google&lt;/a&gt; plugin before. Given what it does to protect your anonymity when using Google services, I am now a happy user - &lt;a href="https://addons.mozilla.org/en-US/firefox/reviews/display/743"&gt;not the only one&lt;/a&gt;, it seems...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7112749335475333005?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7112749335475333005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7112749335475333005' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7112749335475333005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7112749335475333005'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/tips-on-using-google-anonymously.html' title='Tips on using Google anonymously'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-5770666984063622273</id><published>2007-08-10T12:15:00.000-04:00</published><updated>2007-08-10T12:17:22.604-04:00</updated><title type='text'>Warrantless wiretapping - more bad consequences...</title><content type='html'>Susan Landau writes a rather depressing &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2007/08/08/AR2007080801961.html"&gt;piece&lt;/a&gt; in the Washington Post (via the cryptography mailing list)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-5770666984063622273?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/5770666984063622273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=5770666984063622273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5770666984063622273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5770666984063622273'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/warrantless-wiretapping-more-bad.html' title='Warrantless wiretapping - more bad consequences...'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4973252900948570261</id><published>2007-08-09T16:28:00.000-04:00</published><updated>2007-08-09T16:33:26.221-04:00</updated><title type='text'>Cognitive consonance?</title><content type='html'>My 4.5 year-old daughter stood on the bathroom scales this morning.&lt;br /&gt;&lt;blockquote&gt;"I love standing on this &lt;i&gt;ruler&lt;/i&gt;, Daddy"&lt;/blockquote&gt; she says...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4973252900948570261?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4973252900948570261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4973252900948570261' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4973252900948570261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4973252900948570261'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/cognitive-consonance.html' title='Cognitive consonance?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-7169822942020722687</id><published>2007-08-09T16:17:00.000-04:00</published><updated>2007-08-09T16:24:48.489-04:00</updated><title type='text'>S60 3.x development - cross-platform</title><content type='html'>I followed the instructions found &lt;a href="http://www.martin.st/symbian/"&gt;here&lt;/a&gt; and was able to compile several Symbian projects on my Ubuntu machine today. The only problem I had was with makekeys, which seemed to be complaining because of &lt;a href="http://www.newlc.com/topic-6219"&gt;this&lt;/a&gt; issue. I fixed it by running the following line in the epoc32/tools directory:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;wine makekeys -cert -password "yourpassword" -len 2048 -dname "CN=Joe Bloggs OU=Development &lt;br /&gt;OR=Acme Ltd CO=GB EM=noone@nowhere.com" mykey.key mycert.cer&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There's probably a better way to do it...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-7169822942020722687?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/7169822942020722687/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=7169822942020722687' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7169822942020722687'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/7169822942020722687'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/s60-3x-development-cross-platform.html' title='S60 3.x development - cross-platform'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-4167938384703697655</id><published>2007-08-08T14:45:00.000-04:00</published><updated>2007-09-06T08:25:03.201-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='s60'/><title type='text'>Python web services on mobile phones</title><content type='html'>A while back, I demonstrated running Python scripts on a mobile phone, that could connect to web services via simple Python classes and methods. Well, I've just published the glue code that allows you to do this on phones like the N80, N95 and so. It all uses the &lt;a href="http://www.forum.nokia.com/main/resources/technologies/web_services/index.html"&gt;Nokia web services framework&lt;/a&gt; which you'll find on all the N and E series phones these days. If you're interested in trying it out, download the source code from &lt;a href="http://jkemp.net/downloads/serenePy-1_0.zip"&gt;here&lt;/a&gt;. Cool! Well, I think it's cool anyway...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-4167938384703697655?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/4167938384703697655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=4167938384703697655' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4167938384703697655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/4167938384703697655'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/python-web-services-on-mobile-phones.html' title='Python web services on mobile phones'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-5443659463854622262</id><published>2007-08-08T13:28:00.001-04:00</published><updated>2007-08-08T14:43:46.385-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='openid'/><category scheme='http://www.blogger.com/atom/ns#' term='Cardspace'/><category scheme='http://www.blogger.com/atom/ns#' term='user centric'/><title type='text'>A valiant effort</title><content type='html'>In the &lt;a href="http://www.xmlgrrl.com/blog/archives/2007/08/07/the-three-faces-of-user-centricity/trackback/"&gt;three faces of user "centricity"&lt;/a&gt;, Eve provides some useful definition around what the phrase "user centric" might mean, shorn of the technology and product marketing that has obscured any common understanding of the term so far....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-5443659463854622262?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/5443659463854622262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=5443659463854622262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5443659463854622262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5443659463854622262'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/08/valiant-effort_08.html' title='A valiant effort'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-2348149889980127810</id><published>2007-06-27T15:13:00.001-04:00</published><updated>2008-12-08T19:48:15.033-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cardspace'/><category scheme='http://www.blogger.com/atom/ns#' term='SAML'/><category scheme='http://www.blogger.com/atom/ns#' term='ECP'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='Enhanced Client'/><title type='text'>SAML Enhanced Client or Proxy</title><content type='html'>Kim Cameron seems to be &lt;a href="http://www.identityblog.com/?p=821"&gt;against invisible redirection&lt;/a&gt; in web browser-based SSO protocols, such as WS-Federation Passive, OpenID, and SAML browser profile. He mentions Cardspace and Higgins as two alternatives to the redirection methods employed by these other protocols.&lt;br /&gt;&lt;br /&gt;I'd like to add the SAML Enhanced Client or Proxy (ECP) profile of SAML 2 to that rather exclusive list.&lt;br /&gt;&lt;br /&gt;In SAML ECP, the user agent is assumed to be something more than a browser (perhaps a browser with a plugin, for example, or, gasp, a browser that could call the Cardspace executable!)&lt;br /&gt;&lt;br /&gt;Here's a diagram that shows the ECP profile (extracted from the &lt;a href="http://docs.oasis-open.org/security/saml/v2.0/saml-profiles-2.0-os.pdf"&gt;SAML 2.0 profiles document&lt;/a&gt; of March 2005) steps (click on it if you actually want to read the text!):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Hu8FwD79TOo/RoK5RmNAebI/AAAAAAAAAA4/trnodJ9iZ9s/s1600-h/ecp-diagram.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/_Hu8FwD79TOo/RoK5RmNAebI/AAAAAAAAAA4/trnodJ9iZ9s/s400/ecp-diagram.jpg" alt="" id="BLOGGER_PHOTO_ID_5080827041591359922" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There is no browser redirect in this scenario. The RP simply responds to the initial request from the client with a SAML authentication request (in step 2). The client can then make its own mind up about which IdP to submit the authentication request to. Note that the request might not be signed by the RP, allowing the client&lt;-&gt;RP and client&lt;-&gt;IdP protocol transactions to be decoupled. It's worth noting that the client might not even actually be a client (hint: that's why 'proxy' appears in the name of the profile ;)&lt;br /&gt;&lt;br /&gt;Oh, and according to this table &lt;a href="http://www.projectliberty.org/liberty_interoperable/interoperable_products/saml_2_0_test_procedure_v2_0_interoperable_product_table"&gt;here&lt;/a&gt;, there are several companies who support SAML ECP, so there's no reason SAML couldn't be used to (as Kim suggests)&lt;br /&gt;&lt;blockquote&gt;Give the user a smart client, as is the case with CardSpace or Higgins, and whole new user experiences are possible that are “post nagging”.  The invisibility threat is substantially reduced.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-2348149889980127810?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/2348149889980127810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=2348149889980127810' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2348149889980127810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/2348149889980127810'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/06/saml-enhanced-client-or-proxy.html' title='SAML Enhanced Client or Proxy'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Hu8FwD79TOo/RoK5RmNAebI/AAAAAAAAAA4/trnodJ9iZ9s/s72-c/ecp-diagram.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8087669983448491517</id><published>2007-06-15T12:59:00.000-04:00</published><updated>2007-06-15T13:23:08.358-04:00</updated><title type='text'>Nordic Paragliding Championship</title><content type='html'>You might wonder why I would write about Nordic Paragliding. Well:&lt;br /&gt;&lt;br /&gt;i) I work for Nokia, which is of course a &lt;a href="http://en.wikipedia.org/wiki/Nordic_countries"&gt;Nordic&lt;/a&gt; company. Which means I know a few "Nordics"&lt;br /&gt;ii) My friend and former Nokia colleague, Robert Aarts, has recently started &lt;a href="http://lokkilok.blogspot.com/"&gt;blogging&lt;/a&gt;. Robert also paraglides, and is participating this next week in the &lt;a href="http://lokkilok.blogspot.com/2007/06/team-finland-at-nordics.html"&gt;Nordic Paragliding Championship&lt;/a&gt; in Piedrahita, Spain. I hope the thermals are favourable!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8087669983448491517?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/8087669983448491517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=8087669983448491517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8087669983448491517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8087669983448491517'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/06/nordic-paragliding-championship.html' title='Nordic Paragliding Championship'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-681968211389124209</id><published>2007-05-29T08:51:00.000-04:00</published><updated>2007-05-29T08:58:31.644-04:00</updated><title type='text'>AOL and SAML 2</title><content type='html'>George Fletcher &lt;a href="http://practicalid.blogspot.com/2007/05/aol-supports-simple-federation-with.html"&gt;blogs&lt;/a&gt; about AOL's SAML 2 based simple federation protocol.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-681968211389124209?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/681968211389124209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=681968211389124209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/681968211389124209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/681968211389124209'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/05/aol-and-saml-2.html' title='AOL and SAML 2'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8385848731768048895</id><published>2007-04-11T16:51:00.000-04:00</published><updated>2007-08-30T10:49:53.627-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='s60'/><title type='text'>Embedding S60 Python in Symbian C++</title><content type='html'>It's pretty common to want to extend S60 Python by adding functionality available to the underlying S60 C++ APIs. In this regard, S60 Python looks a lot like Python on any other platform. You can &lt;a href="http://docs.python.org/ext/intro.html"&gt;extend Python with C++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But, you can also &lt;span style="font-style: italic;"&gt;embed&lt;/span&gt; a Python interpreter "inside" S60!&lt;br /&gt;&lt;br /&gt;It looks like the following, which does a lot of setup, but calls the function 'foo' in the module 'Bar'. A string value is passed to the Python function, and a string value is returned&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; TInt retVal(KErrNone);&lt;br /&gt;&lt;br /&gt; // Create a  Python interpreter&lt;br /&gt; CSPyInterpreter* it = CSPyInterpreter::NewInterpreterL();&lt;br /&gt; CleanupStack::PushL(it);&lt;br /&gt;&lt;br /&gt; // Save state of any current Python interpreter, and acquire the&lt;br /&gt; // interpreter lock&lt;br /&gt; PyEval_RestoreThread(PYTHON_TLS-&gt;thread_state);&lt;br /&gt;&lt;br /&gt; char *module_name = "Bar" ;&lt;br /&gt; char *foo = "foo" ;&lt;br /&gt; char *response = NULL ;&lt;br /&gt;&lt;br /&gt; TInt32 r_len = 0 ;&lt;br /&gt; PyObject *pModule = PyImport_ImportModule(module_name) ;&lt;br /&gt;&lt;br /&gt; if ( pModule != NULL )&lt;br /&gt;   {&lt;br /&gt;     PyObject *module_dict = PyModule_GetDict(pModule);&lt;br /&gt;     PyObject *expression = PyDict_GetItemString(module_dict, pre_handler);&lt;br /&gt;     PyObject *arglist = Py_BuildValue("(s#)", aString.Ptr(),aString.Length()) ;&lt;br /&gt;&lt;br /&gt;     PyObject *result = PyEval_CallObject(expression, arglist);&lt;br /&gt;&lt;br /&gt;     response = PyString_AsString( result ) ;&lt;br /&gt;&lt;br /&gt;     r_len = strlen( response ) ;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // Make a Symbian descriptor pointer to the char * response&lt;br /&gt;   TPtrC8 symResponse((TUint8*)response, r_len ) ;&lt;br /&gt;&lt;br /&gt;   // Clean-up, and restore thread state&lt;br /&gt;&lt;br /&gt;   PyEval_SaveThread();&lt;br /&gt;   CleanupStack::PopAndDestroy(it); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Python function foo, in Bar.py is very simple:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; def foo( message ):&lt;br /&gt;   return 'foo got message:' + message&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;More information about embedding a Python interpreter in your Symbian code can be found in the S60 Python &lt;a href="http://prdownloads.sourceforge.net/pys60/PythonForS60_doc_1_3_12.pdf?download"&gt;documentation&lt;/a&gt; (chapter 9.1)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8385848731768048895?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8385848731768048895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8385848731768048895'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/04/its-pretty-common-to-want-to-extend-s60.html' title='Embedding S60 Python in Symbian C++'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-8385282385897246629</id><published>2007-04-06T10:28:00.000-04:00</published><updated>2007-04-06T11:31:58.617-04:00</updated><title type='text'>Real ID, a review (Part I)</title><content type='html'>The Real ID Act, passed in 2005 as part of the "Emergency Supplemental Appropriations Act for Defense, the Global War on Terror, and Tsunami Relief, 2005" has certainly aroused passions. Draft regulations were recently &lt;a href="http://www.dhs.gov/xlibrary/assets/nprm_realid.pdf"&gt;published (in PDF)&lt;/a&gt; by the Department of Homeland Security. &lt;br /&gt;&lt;br /&gt;As the name of the containing bill suggests, Real ID is supposed to aid in the "global war on terror" (sorry, that's Global War on Terror.) The suggestions, either in the bill, or which have been made by supporters of the bill is that there are no federal standards on the collection of data used to establish the identity of the applicant for a driving license. Some states may have rules for data collection that are quite stringent and perhaps also effective, whereas other states have more lenient requirements. This is probably true. &lt;br /&gt;&lt;br /&gt;What do the draft regulations do to improve that?&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;&lt;br /&gt;Documents Required for Proving Identity.  &lt;br /&gt;&lt;br /&gt;The list of acceptable documents that DHS proposes to establish identity for purposes of this regulation is as follows:&lt;br /&gt;  &lt;br /&gt;• A valid unexpired U.S. passport&lt;br /&gt;• A certified copy of a birth certificate. &lt;br /&gt;• A consular report of birth abroad &lt;br /&gt;• An unexpired permanent resident card. &lt;br /&gt;• An unexpired employment authorization document (EAD). &lt;br /&gt;• An unexpired foreign passport with valid U.S. visa affixed. &lt;br /&gt;• A U.S. certificate of citizenship. &lt;br /&gt;• A U.S. certificate of naturalization; or &lt;br /&gt;• A REAL ID driver’s license or identification card issued subsequent to the standards established by this regulation.&lt;/blockquote&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Until May of 2013, however, you're not required to use a REAL ID driving licence. And the true nature of the REAL ID act is shown in their definition of "official purpose" - as in the following summary of the proposed rule:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;DHS proposes to issue REAL ID regulations that create minimum standards for State driver’s licenses and identification cards that Federal agencies can accept for official purposes on or after May 11, 2008.&lt;/blockquote&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Official purpose is later defined as:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;blockquote&gt;Section 201(3) of the Act provides that the term “official purpose” “includes but is not limited to accessing Federal facilities, boarding Federally-regulated commercial aircraft, entering nuclear power plants, and any other purposes that the Secretary shall determine.”&lt;/blockquote&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;For most people, the only time that this regulation will really be relevant is when you need a federally-qualified REAL ID driving license to board an airplane (unless you use your government-issued passport). &lt;br /&gt;&lt;br /&gt;So, it seems to me that the initial changes relevant to the average person are:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;i) There will be federal standards for the presentation of qualifying information when obtaining a state-issued driving license.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;ii) From 11th May 2013, you will be required to present a federally-qualified REAL ID driving license when boarding a commercial aircraft.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;That all seems quite reasonable so far, actually. &lt;br /&gt;&lt;br /&gt;Of course, the mere fact that REAL ID wasn't passed as an independent bill, but as a rider on a funding bill that most congressman probably couldn't vote against, is pretty disreputable. &lt;br /&gt;&lt;br /&gt;And then, there's always the interesting question about whether such rules as proposed by REAL ID will actually really do anything about terrorism... Oh, and the question of whether privacy becomes further compromised under these regulations...&lt;br /&gt;&lt;br /&gt;Well, more in part II!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-8385282385897246629?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/8385282385897246629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=8385282385897246629' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8385282385897246629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/8385282385897246629'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/04/real-id-review-part-i.html' title='Real ID, a review (Part I)'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1184177042030888825</id><published>2007-04-03T11:16:00.000-04:00</published><updated>2007-04-03T11:39:22.852-04:00</updated><title type='text'>In support of Kathy Sierra</title><content type='html'>Today, I read about &lt;a href="http://headrush.typepad.com/creating_passionate_users/2007/03/as_i_type_this_.html"&gt;Kathy Sierra&lt;/a&gt;, a blogger who has received death threats, presumably related to something that she said in her blog. Back in the day, the &lt;a href="http://www.well.com"&gt;Well&lt;/a&gt; came up with the notion that &lt;a href="http://www.well.com/conf/help/yoyow.html"&gt;You Own Your Own Words (YOYOW)&lt;/a&gt;. In the case of the Well, one cannot act anonymously, but in many blogging situations today, one can post with pseudonyms, relatively anonymously. &lt;br /&gt;&lt;br /&gt;That doesn't mean that one should post "cowardly". &lt;br /&gt;&lt;br /&gt;If people abuse a system that allows anonymity, we'll end up in a situation where those with agendas that dislike anonymity or "pseudonymity" will be given all the good reasons they need to ensure that anonymity becomes either technically, or legally forbidden. &lt;br /&gt;&lt;br /&gt;Is that really what we want?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1184177042030888825?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1184177042030888825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1184177042030888825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1184177042030888825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1184177042030888825'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/04/in-support-of-kathy-sierra.html' title='In support of Kathy Sierra'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1288149100145545749</id><published>2007-04-02T11:03:00.000-04:00</published><updated>2007-04-03T11:16:27.805-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='biometric'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><title type='text'>Why biometrics might be bad identifiers</title><content type='html'>Several articles from &lt;a href="http://www.identityblog.com"&gt;Kim Cameron&lt;/a&gt; about the use of biometrics in &lt;a href="http://www.identityblog.com/?p=735"&gt;schools and pubs&lt;/a&gt; led me to think about specifically exactly what might be wrong with using a fingerprint, an iris scan, or your "faceprint" to identify you from a group. &lt;br /&gt;&lt;br /&gt;I came up with the following - can you think of any more?&lt;br /&gt;&lt;br /&gt;1. Use of a biometric as a username or password&lt;br /&gt;&lt;br /&gt;In some biometric-based systems around today, a fingerprint is used instead of a username or account number. Imagine that you're using your fingerprint where you might once have used your credit-card or social security number, or even a made-up username. &lt;br /&gt;&lt;br /&gt;If you're using a biometric instead of a username or account number, then you're using an identifier that you &lt;span style="font-style:italic;"&gt;cannot easily change&lt;/span&gt;. If your fingerprint is stolen in either gruesome or &lt;a href="http://www.theregister.co.uk/2002/05/16/gummi_bears_defeat_fingerprint_sensors/"&gt;not-so-gruesome&lt;/a&gt; style, how can you be sure someone won't act as you? &lt;br /&gt;&lt;br /&gt;2. Ubiquity of yet more "personally identifiable information"&lt;br /&gt;&lt;br /&gt;Advocates of (typically those selling) &lt;a href="http://www.foodserve.com/fprint.htm"&gt;biometric-based systems&lt;/a&gt; claim that by storing "biometric templates" rather than actual biometric data itself (ie. storing the "hash" of a fingerprint rather than the actual fingerprint itself) the biometric data itself is useless for any other purpose than that for which it was initially designed. Thus a fingerprint template created with some knowable hash algorithm for a food service system (for example) can't be used by a law enforcement organization (for example). Does it sound like this is really true? If another organization has a fingerprint and either knows the hash algorithm to create the fingerprint template, or can obtain the algorithm from the company that made the original system, the template is just like the fingerprint. This means that organizations can collude to identify an individual from some particular group, and that some piece of information you can't change allows the unique identification of you from a bigger and bigger group.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1288149100145545749?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1288149100145545749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1288149100145545749' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1288149100145545749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1288149100145545749'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/04/why-biometrics-can-be-bad-identifiers.html' title='Why biometrics might be bad identifiers'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-3806480190873040362</id><published>2007-02-12T11:11:00.000-05:00</published><updated>2007-02-12T17:10:14.617-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><title type='text'>Bootstrapping SAML from OpenID</title><content type='html'>I've been interested for a while in bootstrapping ID-WSF/SAML from an OpenID 2.0 Authentication Protocol exchange, and below, I present two approaches:&lt;br /&gt;&lt;br /&gt;Both take advantage of the OpenID 2.0 Authentication Extensions [1] section and SAML bindings and profiles.&lt;br /&gt;&lt;br /&gt;i) &lt;span style="font-weight:bold;"&gt;Create an extension attribute that holds a reference to a SAML AssertionID&lt;/span&gt; (in SAML, this is a saml:AssertionIDRef).&lt;br /&gt;&lt;br /&gt;Obviously, the namespace for the OpenID attribute would be a SAML 2.0 namespace, the name would be a URN representing "saml:AssertionIDRef" and the value would be a SAML AssertionID (or perhaps a URL containing the assertion ID?)&lt;br /&gt;&lt;br /&gt;When an RP received a successful authentication response from the OP, the response would contain this assertion ID.&lt;br /&gt;&lt;br /&gt;The subject of the referenced SAML assertion MUST be the holder of the OpenID (ie. the user) and the assertion could then contain one or more SAML statements about that subject.&lt;br /&gt;&lt;br /&gt;The RP would get this assertion by simply making an HTTP request (could even be an HTTP GET) with a query (or form) parameter containing this referenced AssertionID. This method is called the SAML URI Binding (section 3.7 of [2])&lt;br /&gt;&lt;br /&gt;Of course, I think the RP should (MUST) do this over TLS as we're definitely going to use HTTP here.&lt;br /&gt;&lt;br /&gt;So this would be a simple, and RESTful way of getting a SAML assertion linked to an OpenID authentication.&lt;br /&gt;&lt;br /&gt;ii) &lt;span style="font-weight:bold;"&gt;Create an extension attribute that would hold a full SAML Artifact&lt;/span&gt; (an artifact is a short string of bytes, and is a pointer to a full SAML response (not just an assertion), which may contain one or more assertions and other SAML protocol goo. This would look more or less the same as above but with more SAML functionality possible. Instead of a saml:AssertionIDRef, the extension would hold a saml:Artifact.&lt;br /&gt;&lt;br /&gt;Once the RP has the artifact, it can "resolve" the artifact to get a full SAML protocol message, by sending a saml:ArtifactResolve message to the OP/SAML Responder.&lt;br /&gt;&lt;br /&gt;That would require a bit more work, as currently I think the only way that one can send that message is via SOAP - I think we'd need to have a URI binding for a SAML artifact (right now I can't see that this exists) that allows an HTTP request encoding of the ArtifactResolve request message and corresponding response.&lt;br /&gt;&lt;br /&gt;The next step might be to write up i) as an extension spec. (if people think it's worthwhile?) and to further investigate ii).&lt;br /&gt;&lt;br /&gt;Comments?&lt;br /&gt;&lt;br /&gt;[1] &lt;a href="http://openid.net/specs/openid-authentication-2_0-pre11.html#extensions"&gt;http://openid.net/specs/openid-authentication-2_0-pre11.html#extensions&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[2] &lt;a href="http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf"&gt;http://docs.oasis-open.org/security/saml/v2.0/saml-bindings-2.0-os.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-3806480190873040362?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/3806480190873040362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=3806480190873040362' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3806480190873040362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/3806480190873040362'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/02/ive-been-interested-for-while-in.html' title='Bootstrapping SAML from OpenID'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-5184554245719058283</id><published>2007-02-08T10:17:00.000-05:00</published><updated>2007-02-08T10:24:18.748-05:00</updated><title type='text'>Google does SAML</title><content type='html'>Who knew - you can apparently do &lt;a href="http://code.google.com/apis/apps-for-your-domain/sso/saml_reference_implementation.html"&gt;SAML SSO&lt;/a&gt; into Google Apps...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-5184554245719058283?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/5184554245719058283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=5184554245719058283' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5184554245719058283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/5184554245719058283'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/02/google-does-saml.html' title='Google does SAML'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6373284299795275646</id><published>2007-02-03T11:05:00.000-05:00</published><updated>2007-02-03T11:14:55.782-05:00</updated><title type='text'>Windows Vista Home versions aren't allowed in Parallels?!</title><content type='html'>From the Windows Vista EULA according to the &lt;a href="http://parallelsvirtualization.blogspot.com/2007/01/vista-is-here-so-what-does-it-mean-for.html"&gt;Parallels website&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Here's the tecnical legalese from the EULAs:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;For Vista Home Basic and Home Premium Editions:&lt;/span&gt;&lt;br /&gt;“USE WITH VIRTUALIZATION TECHNOLOGIES. You may not use the software installed on the licensed device within a virtual (or otherwise emulated) hardware system.” &lt;/blockquote&gt; I only run Windows (XP) in a virtual machine on my Mac, so this will preclude me, and presumably others who don't want to violate the EULA from upgrading to Vista. Will people &lt;span style="font-style:italic;"&gt;really&lt;/span&gt; pay more for the premium versions simply to not violate the EULA?&lt;br /&gt;&lt;br /&gt;More about this at &lt;a href="http://www.informationweek.com/news/showArticle.jhtml?articleID=197002890"&gt;InformationWeek&lt;br /&gt;&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6373284299795275646?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6373284299795275646/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6373284299795275646' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6373284299795275646'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6373284299795275646'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/02/windows-vista-home-versions-arent.html' title='Windows Vista Home versions aren&apos;t allowed in Parallels?!'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-6393860799892324486</id><published>2007-01-10T21:47:00.000-05:00</published><updated>2007-01-10T22:16:09.747-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='identity'/><category scheme='http://www.blogger.com/atom/ns#' term='liberty'/><title type='text'>Life, Liberty and Mobile Identity</title><content type='html'>Doc &lt;a href="http://doc.weblogs.com/2007/01/09#makingMobileIdentityHappen"&gt;says&lt;/a&gt; that not much has happened in &lt;span style="font-style: italic;"&gt;mobile identity&lt;/span&gt;. I don't know that I totally agree, but I'll be helping him with the cause anyway at the &lt;a href="http://cyber.law.harvard.edu/identity/Mobile_Identity_Workshop"&gt;Mobile Identity Workshop&lt;/a&gt; on January 26th.&lt;br /&gt;&lt;br /&gt;Prior to that, I'll be giving an introduction to (what I call) "Liberty for hackers" at the &lt;a href="https://events.projectliberty.org/details.php?id=5"&gt;Liberty 2.0 Workshop&lt;/a&gt; on the 22nd. &lt;a href="http://www.xmlgrrl.com/blog"&gt;Eve&lt;/a&gt;, &lt;a href="http://connectid.blogspot.com/"&gt;Paul&lt;/a&gt; and &lt;a href="http://conorcahill.blogspot.com/"&gt;Conor&lt;/a&gt; will be among others talking about Identity, Liberty&lt;br /&gt;and the... well, you think know the rest, right? But if you want to be sure, why not come along...&lt;br /&gt;&lt;br /&gt;I'll also be speaking at the &lt;a href="http://www.sdforum.org/SDForum/Templates/CalendarEvent.aspx?CID=2071&amp;mo=1&amp;amp;yr=2007"&gt;SDForum Web Services SIG&lt;/a&gt; on the evening of the 23rd, describing Serene (officially known as, ahem, the Nokia Web Services Framework), a &lt;span style="font-style: italic;"&gt;mobile identity&lt;/span&gt; web services framework, shipping on Nokia E and N series phones.&lt;br /&gt;&lt;br /&gt;I hope I don't lose my voice before I get to the Mobile Identity Workshop.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-6393860799892324486?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/6393860799892324486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=6393860799892324486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6393860799892324486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/6393860799892324486'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2007/01/life-liberty-and-mobile-identity.html' title='Life, Liberty and Mobile Identity'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-1462441598173379068</id><published>2006-12-20T13:58:00.000-05:00</published><updated>2006-12-21T08:30:09.005-05:00</updated><title type='text'>Eve made me do it...</title><content type='html'>I don't know how she does it, but &lt;a href="http://www.xmlgrrl.com/blog"&gt;Eve&lt;/a&gt; somehow manages to get me to do things that aren't always good for me - like singing &lt;a href="http://conorcahill.blogspot.com/2006/12/very-very-frightening-indeed.html"&gt;Bohemian Rhaps-ID&lt;/a&gt;! So, when she &lt;a href="http://www.xmlgrrl.com/blog/archives/2006/12/19/the-five-things-virus/"&gt;challenged&lt;/a&gt; a group of us to blog about five things not widely known about ourselves, I felt compelled... but somehow nervous. Anyway, without further ado:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lots of people know I'm English. But not a lot of people know that I come from the Isle of Wight, the smallest &lt;a href="http://en.wikipedia.org/wiki/Isle_of_Wight"&gt;ceremonial county&lt;/a&gt; in England, and home to the &lt;a href="http://en.wikipedia.org/wiki/Isle_of_Wight_Festival"&gt;Isle of Wight Rock Festival&lt;/a&gt;, England's very own Woodstock. &lt;/li&gt;&lt;li&gt;I played American Football in England, and was a wide-receiver and cornerback for the (now defunct) semi-professional "Ashford Cruisers" in the UK's first American Football league. Now that I live in the USA, I play a different kind of &lt;a href="http://appliedlife.blogspot.com/2006/05/world-cup.html"&gt;football&lt;/a&gt;... &lt;/li&gt;&lt;li&gt;I can &lt;a href="http://www.bondtegenvloeken.nl/"&gt;swear&lt;/a&gt; a little in Dutch. I traveled quite a lot when I left high school. One of the things that was common in people I met in other countries was their desire to teach me insults in their language - don't ask me why! One of my favourites was the Hebrew "I'm me, and you are my mule".&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Prior to becoming a software developer, I &lt;a href="http://www.chateau-brandeau.com/"&gt;picked grapes&lt;/a&gt; and helped tend a vineyard. I grew up on a small farm, and spent a couple of years working on several other farms before finally deciding that I'd rather be &lt;a href="http://www.sussex.ac.uk/cogs/"&gt;artificially intelligent&lt;/a&gt; than the real thing...&lt;/li&gt;&lt;li&gt;I have been a big fan of the Beatles all my life, and I think many of their songs are mathematically perfect. But more interestingly (perhaps), when we got our first dog (I was 8 years old) I named her "Lucy" after &lt;a href="http://en.wikipedia.org/wiki/Lucy_in_the_Sky_with_Diamonds"&gt;Lucy In the Sky with Diamonds&lt;/a&gt;. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I don't yet recall five other people I know who have blogs, but who haven't already been tagged, but if I think of some, I'll put them up...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-1462441598173379068?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/1462441598173379068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=1462441598173379068' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1462441598173379068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/1462441598173379068'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/12/eve-made-me-do-it.html' title='Eve made me do it...'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-116302017943900766</id><published>2006-11-08T16:03:00.000-05:00</published><updated>2006-12-20T08:26:14.380-05:00</updated><title type='text'>SAML Glossary in HTML!</title><content type='html'>It might seem like no big deal, or maybe "why didn't we do this before", but the &lt;a href="http://www.oasis-open.org/committees/download.php/21111/saml-glossary-2.0-os.html"&gt;SAML Glossary&lt;/a&gt; is now available as HTML (thanks to Eve Maler and Jeff Hodges). The reason I see this as (relatively) exciting is that search engines will now be able to index the terms in the glossary and you can look them up simply by doing a web search. And that's cool, at least, if you're looking for a nice authoritative resource of security-related terminology (including references to other such works that came before it) ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-116302017943900766?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/116302017943900766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=116302017943900766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/116302017943900766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/116302017943900766'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/11/saml-glossary-in-html.html' title='SAML Glossary in HTML!'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-116209267888156854</id><published>2006-10-28T22:57:00.000-04:00</published><updated>2006-10-28T23:31:18.930-04:00</updated><title type='text'>Green for go?</title><content type='html'>Internet Explorer 7 will fill its URL bar in green if the site with which you are connecting is using SSL, and happens to have one of these new-fangled &lt;a href="http://www.verisign.com/ssl/ssl-information-center/faq/high-assurance-ssl.html"&gt;"high assurance" SSL certificates&lt;/a&gt;. They explain that whole thing on the IE &lt;a href="http://blogs.msdn.com/ie/archive/2005/11/21/495507.aspx"&gt;blog&lt;/a&gt;. IE will also show you the CA and the Common Name of the company whose SSL certificate is being used in the SSL handshake. &lt;br /&gt;&lt;br /&gt;I'm all for improved security on the Internet. Is that what this is?&lt;br /&gt;&lt;br /&gt;Apparently (if you read the same page I linked to above) a new standard of verification of certificate requests is being developed by the somewhat murky CA/Browser Forum (can anyone find their website, or a full list of members?). This verification standard will result in a new process for getting an SSL certificate. If you're a website vendor, you'll submit your certificate request, but you might need to find some way to prove you have the ability to act on behalf of the company you wish to have represented in your certificate (are you really an employee of that company, for example?) &lt;br /&gt;&lt;br /&gt;I can't find this process documented anywhere. Which companies are even in the "CA/Browser Forum". &lt;br /&gt;&lt;br /&gt;I think it's cool that IE7 will display the Common Name and the Certficate Authority from the SSL certificate (Although IE could do that for all certificates - regular SSL certificates have that information too) - these could be nice visual cues to the viewer that the information displayed from the certificate is related to the domain name in the URL bar. &lt;br /&gt;&lt;br /&gt;But what does it mean that the URL bar turns green? &lt;br /&gt;&lt;br /&gt;We don't yet know the process by which a company is validated in order to receive their certificate. And will the IE URL bar turn green for just any CA who issues high-assurance SSL certificates? Will the other browser vendors use the same methods and user interface cues?&lt;br /&gt;&lt;br /&gt;It might be nice if some of that information were public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-116209267888156854?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/116209267888156854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=116209267888156854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/116209267888156854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/116209267888156854'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/10/green-for-go.html' title='Green for go?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-114909999076993827</id><published>2006-05-31T14:15:00.000-04:00</published><updated>2006-05-31T14:26:30.783-04:00</updated><title type='text'>World Cup</title><content type='html'>I don't care if you call it football or soccer, but the World Cup is almost here. If you have even a clue about the beautiful game, then head over to the BBC World Cup website and fill out their &lt;a href="http://news.bbc.co.uk/sport2/shared/spl/hi/predictor/html/football/world_cup_06/default.stm"&gt;predictor &lt;/a&gt;. You might be surprised... &lt;br /&gt;&lt;br /&gt;My top four came out as follows:&lt;br /&gt;&lt;br /&gt;1. Brazil&lt;br /&gt;2. Czech Republic&lt;br /&gt;3. England&lt;br /&gt;4. Sweden&lt;br /&gt;&lt;br /&gt;Even without Rooney, England are good enough to win this championship, but even with him, I still don't think they can beat a Ronaldinho-inspired Brazil. &lt;br /&gt;&lt;br /&gt;In other news, our local over-40 football/soccer league kicks off next Monday when we'll (I should be playing somewhere on the left wing) be taking on Pittsfield - the world's gone football mad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-114909999076993827?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/114909999076993827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=114909999076993827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114909999076993827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114909999076993827'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/05/world-cup.html' title='World Cup'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-114537490183416377</id><published>2006-04-18T11:17:00.000-04:00</published><updated>2006-09-14T13:10:03.326-04:00</updated><title type='text'>PHP XML Signatures</title><content type='html'>A couple of posts recently (&lt;a href="http://netmesh.info/jernst/Technical/really-simple-xml-signatures.html"&gt;here&lt;/a&gt;, and &lt;a href="http://www.cs.auckland.ac.nz/%7Epgut001/pubs/xmlsec.txt"&gt;here&lt;/a&gt;) have talked about how hard it is  to sign XML content, and even questioned the usefulness of doing so. I don't totally disagree that it's hard, but I wanted to show how it was possible to use the &lt;a href="http://www.aleksey.com/xmlsec"&gt;xmlsec&lt;/a&gt; C library to provide the ability to sign XML content from a scripted environment, and that from an application programming perspective anyway, it didn't have to be so rough.&lt;br /&gt;&lt;br /&gt;I wrote an &lt;a href="http://web.mac.com/john.kemp/php-xml-sig.html"&gt;article&lt;/a&gt; about this - comments are welcome ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-114537490183416377?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/114537490183416377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=114537490183416377' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114537490183416377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114537490183416377'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/04/php-xml-signatures.html' title='PHP XML Signatures'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-114520296694533630</id><published>2006-04-16T11:54:00.000-04:00</published><updated>2006-04-25T09:25:56.870-04:00</updated><title type='text'>Why I continue to run</title><content type='html'>Back in the old days (when I was 20) I exercised for the fun of it. When you're 165 lbs, can run a 4:30 mile and feel full of energy all day, every day, that's not surprising. Fast forward 20 years, past two New York Marathons (and all the necessary training), a torn hamstring, a bigger body and long days and nights of "baby-wrangling", it doesn't feel quite the same. In fact, last year, I'd decided that perhaps it was time to stop running altogether. After all, my knees would be sore quite often after a run, and in general, the pain was outweighing the gain.&lt;br /&gt;&lt;br /&gt;Yesterday, though, I decided to go for a run. We're staying with my wife's parents here on Long Island. It's not quite like where we live in the hills. In fact, there are more people in my parents-in-law's neighbourhood than in our entire town, but there are still nice places to run here.&lt;br /&gt;&lt;br /&gt;I shuffled out of the driveway, down the lane that leads to the main highway in this area, and jogged across the four lanes split by a grassy bank. On the other side of the highway is a preserve. People mostly ride horses through this usually swampy densely forested stretch of land, but I like it for running on my own two legs.&lt;br /&gt;&lt;br /&gt;It was a beautiful spring day yesterday, sunny and gently warm, just a hint of summer to come. I ran through a mesh gate and past the wooden steps where the riders mount their horses. The ground is sandy here, and usually a bit swampy, but yesterday it was quite firm. No real rain yet here this spring. Up the thin ribbon of track through the low bushes and trees I jogged quite gently, trying not to exert myself too much after a typical Italian-American lunch of lasagna, pizza &lt;i&gt;and&lt;/i&gt; calzones. At almost 40, I'm still a "growing boy" in the eyes of my parents-in-law.   &lt;br /&gt;&lt;br /&gt;After about ten minutes of running through the woods, there's a clearing, and the sun hits you full on. The track winds through some grassy banks, along the side of a field and then back into the woods for a final fling. After a few more minutes, covered by shady trees, I run onto a private road, up a slight hill, before making a left turn back onto a quiet side-road. By now, I'm a little out of breath, but mostly just trying to stay calm because there's at least another two miles to run, all on the road, and mostly in direct sunlight. I don't really like running in warm weather at all - and anything above 65F constitutes "warm weather" when I'm running.&lt;br /&gt;&lt;br /&gt;After winding along this fairly quiet side road for a bit, I make the last turn on that road before rolling up a little hill and back on to the side of the highway. By now, I'm usually a bit tired, and the highway is not the nicest ending to an otherwise perfect run. I'm usually thinking to myself &lt;i&gt;should I stop and walk a while - conserve my energy? After all, no-one needs to know I didn't run the whole way.&lt;/i&gt; That's right - why bother exerting myself? Doesn't prove anything to anybody. And it's not easy, you know, running on a road, when you weigh close to 200 lbs, have two aging knees and a stiff hamstring. Anyone would understand why I might stop, have a little rest, walk a few steps. There's no TV, no iPod, no other distractions. Mostly there's just my brain, and all those sensory inputs going wild as my feet slap the ground and the shocks run all the way up to my head. I can feel the sweat on my forehead, and wipe it away consciously with the back of my hand.&lt;br /&gt;&lt;br /&gt;By now, I've run another mile. Almost there. If I just run to the top of the last hill, I can walk the rest of the way. That would be a long warmdown, but it would qualify for a warmdown. Acceptable then to stop at the top of the hill. That's a relief. But I don't stop at the top of the hill. It's downhill from there - almost sprintable. Damn well &lt;i&gt;is&lt;/i&gt; sprintable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-114520296694533630?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/114520296694533630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=114520296694533630' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114520296694533630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114520296694533630'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/04/why-i-continue-to-run.html' title='Why I continue to run'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-114435531651671003</id><published>2006-04-06T16:23:00.000-04:00</published><updated>2006-04-06T17:01:10.766-04:00</updated><title type='text'>User-centric Identity - here today?</title><content type='html'>It seems intuitive that the concept of user-centric identity is important to people. After all, what person wants to feel that he is not in control of his data, or that some murky corporate behemoth knows more about her than she wants to be known?&lt;br /&gt;&lt;br /&gt;As &lt;a href="http://notabob.blogspot.com/2006/01/on-absurdity-of-owning-ones-identity.html"&gt;Bob Blakely&lt;/a&gt; has pointed out, a user can't &lt;i&gt;own&lt;/i&gt; much, if any, of his identity information. In many cases, he must create accounts with some credential-issuing entity (banks, credit cards, various government agencies among others) before he is issued credentials, and that involves sharing some identity information. And often, a user will share whatever information a company requires, simply in order to gain access to a service she desires. Once identity information is shared, it's certainly no longer "owned" - if it ever was exactly. But it seems to me that people like to feel that they have a little control over how this information is presented, and that technology can help.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;What's in your wallet?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;When I look in my wallet, I see lots of cards - credit card, bank card, driving license, frequent flier membership cards. Quite a stack. Oh, and then there are those thin green bills (sadly all too few) My entire wallet is full of credentials and identity assertions!&lt;br /&gt;&lt;br /&gt;But now look at my laptop. I have a bunch of credentials there too - some in my "keychain", and some in the web browser "password manager". There are probably others that I'm forgetting.&lt;br /&gt;&lt;br /&gt;That's pretty user-centric isn't it - a whole mess of stuff sitting around that I barely remember exists, and would have no idea how to recreate should my laptop die or be stolen. Yes, I do backup (probably not often enough), but still - ever tried to recreate all of your account logins even after a successful data restore? Do you also photocopy all of the important cards in your wallet?&lt;br /&gt;&lt;br /&gt;The wallet seems a pretty useful metaphor here - a container for assertions you've received from assertion issuers. You pull things out of your wallet to either show or give to companies from whom you wish to get service. But wallets have &lt;a href="http://en.wikipedia.org/wiki/Secure_electronic_transaction"&gt;baggage&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Where is your wallet?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Today, I'm pretty sure that the contents of my wallet are sitting here on my desk. Oh, but then there are those credentials sitting in my laptop in various places. Of course, there are also those identity details I registered with various places online - did I even give them the right information? I bet that I couldn't reproduce the same answers to their identifying questions if someone asked me the same questions again! So on second thoughts, I think the contents of my "virtual" wallet (which includes the contents of my physical wallet) is actually distributed in several places, some that I don't even remember. Oh dear. And some of that information is only useful for transactions conducted with exactly one company in exactly one context (yes, sometimes I really do lie about my age).&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Not just a problem for users...&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;What must those web-sites and corporations be thinking - users that lie when I ask them important identifying questions? People who don't know where their identity information is? And, as a service provider, I'm holding personal account data for thousands of customers. A security problem waiting to happen? A thousand customer support calls because of a lost password?! Well, be patient - a solution might be coming. Perhaps it really is &lt;a href="http://www.projectliberty.org"&gt;possible&lt;/a&gt; to get the information you need about your customers, without making them create accounts and hold their identity information with you? And if your customers hold this data wherever they feel it should be held, perhaps you are less likely to be held (legally) liable when identity data goes missing?&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;User-centric Identity - here today?&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;It seems to me that we have a user-centric (with a little 'u') system already. A system that devolves responsibility for maintaining a limited set of identity information to the user, without giving him or her the technology to properly manage it; a system that sometimes causes a user to lie because he doesn't want some online store to know everything about him, and a system that causes service providers to retain large amounts of sensitive information in their control, subject to theft and improper use.&lt;br /&gt;&lt;br /&gt;We will soon do better - systems that allow a user to properly manage all of her identity information, regardless of where the information is actually maintained. Perhaps the wallet of the future can do a little more than my beaten-up old fake leather model can manage today?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-114435531651671003?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/114435531651671003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=114435531651671003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114435531651671003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/114435531651671003'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/04/user-centric-identity-here-today.html' title='User-centric Identity - here today?'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-113710451856354959</id><published>2006-01-12T17:21:00.001-05:00</published><updated>2006-02-18T21:05:07.076-05:00</updated><title type='text'>Liberty and "company-controlled identity"</title><content type='html'>I see that Johannes Erst had a &lt;a href="http://netmesh.info/jernst/2006/01/11#three-standards"&gt;post&lt;/a&gt; about the identity landscape of 2006, in which he says that "company-controlled" identity is "rooted in the &lt;a href="http://www.projectliberty.org/specs"&gt;Liberty&lt;/a&gt; standards." He also notes that Infocard is essentially "Microsoft-controlled identity." Sorry, Johannes, but I don't agree with his characterization at all, at a fundamental level. &lt;br /&gt;&lt;br /&gt;First of all, the Liberty standards do not preclude at all the possibility for a company to write a user-controlled identity providing application. Several companies are doing that - allowing users to control the release of their information from an identity provider. Secondly, the identity provider may in fact be run, or controlled on a user's own device or computer, all according to the Liberty standards - for example, by using the ECP (enhanced client or proxy) single sign-on profile (see Kapil Sachdeva's &lt;a href="http://www.dotnetcard.com/blogs/ksachdeva/PermaLink,guid,73be26b1-4b09-456a-a1a7-8d33c5ad8ae8.aspx"&gt;blog&lt;/a&gt; for a nice demo application of this), and/or just running an identity-providing service directly on an individual user's personal computer or mobile device. &lt;br /&gt;&lt;br /&gt;More importantly, I think that the distinction between company-controlled identity and user-controlled identity is fundamentally flawed. After all, even if I am able to control my own identity information, any company that wants to rely on my identity claims may simply force me to create an account with them in order to do whatever it is I'm trying to do that uses my identity information. So is all identity information "company-controlled"? I think not. &lt;br /&gt;&lt;br /&gt;It is possible with the Liberty specs. to create and maintain user-controlled identity information. But any company can always choose to reject identity information (however it has been provided) when making decisions about whether to allow me usage of a service that company provides (even if that service is one run on behalf of my identity). Ultimately, service will depend on the relationship established between the provider of the identity information (or the user on whose behalf the identity information is provided) and the service provider.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-113710451856354959?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/113710451856354959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=113710451856354959' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113710451856354959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113710451856354959'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2006/01/liberty-and-company-controlled_12.html' title='Liberty and &quot;company-controlled identity&quot;'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-113521352673044626</id><published>2005-12-21T20:04:00.000-05:00</published><updated>2006-12-19T01:33:44.986-05:00</updated><title type='text'>Building an authentication</title><content type='html'>So, what is a &lt;a href="http://www.projectliberty.org/specs/liberty-idwsf-authn-svc-v1.1.pdf"&gt;Liberty Authentication Service (PDF)&lt;/a&gt; (AS) good for? With the word 'authentication' in the title, you'd expect that it would be used for authenticating someone, and you'd be right on the money there. Because the Liberty AS uses, and is part of the Identity Web Services Framework, it uses the Liberty SOAP Binding - that means an authentication request carries the relevant SOAP header blocks to allow message correlation, message timestamps and that sort of thing. In addition to these necessary SOAP headers comes the actual SOAP body content. The SOAP body represents the application message, and the application here is an authentication service, so the body of a SOAP request contains an authentication request, and the SOAP response will similarly contain an authentication response. The AS allows what's called a challenge-response authentication to occur - the AS can challenge the requestor to do something in real-time, which is a good thing from an authentication perspective.&lt;br /&gt;&lt;br /&gt;The Liberty AS uses the &lt;a href="http://www.ietf.org/rfc/rfc2222.txt"&gt;Simple Authentication and Security Layer&lt;/a&gt; (SASL) and binds SASL mechanisms to a SOAP message. I'm not going to go into any detail about that as there's lots of fine material available about SASL, but SASL is used to provide authentication for applications like OpenLDAP, and there are SASL mechanisms available for IMAP/POP mail and several other connection-based protocols. This means that if you already have a piece of software that provides the actual SASL authentication, the only piece missing in also providing a Liberty AS is the binding of the SASL protocol mechanisms you support to SOAP.&lt;br /&gt;&lt;br /&gt;Here's what a SOAP-based SASL authentication looks like:&lt;br /&gt;&lt;br /&gt;1. A client asks to be authenticated&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;001 &amp;lt;S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;&lt;br /&gt;&lt;br /&gt;002   &amp;lt;S:Header&amp;gt;&lt;br /&gt;003     &amp;lt;sb:Correlation xmlns:sb="urn:liberty:sb:2003-08"&lt;br /&gt;004       messageID="C8797D0D-9020-07FC-AF0A-5622C01F4A61"&lt;br /&gt;005       timestamp="2005-12-21T19:43:45Z"/&amp;gt;&lt;br /&gt;006   &amp;lt;/S:Header&amp;gt;&lt;br /&gt;&lt;br /&gt;007   &amp;lt;S:Body&amp;gt;&lt;br /&gt;008     &amp;lt;sa:SASLRequest xmlns:sa="urn:liberty:sa:2004-04"&lt;br /&gt;009       mechanism="PLAIN ANONYMOUS CRAM-MD5"&lt;br /&gt;010       advisoryAuthnID="012345678901234"/&amp;gt;&lt;br /&gt;011   &amp;lt;/S:Body&amp;gt;&lt;br /&gt;&lt;br /&gt;012 &amp;lt;/S:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At line 003, you'll see a sb:Correlation SOAP header block. This is used to pass a message identifier and timestamp to the server. These are used to a) provide a bound on a message cache (a list of message identifiers recently received), to prevent a replay attack (someone sending the same message multiple times within some timeframe) and b) allow the sender of the message to correlate any reply it receives to the message that the sender originally sent. These provide a small measure of security in this insecure world. The format shown in this message is based on the Liberty ID-WSF 1.1 specification. A newer version of the specification uses WS-Addressing defined SOAP header blocks to perform these functions. For those that care about the size of their SOAP messages (including anyone sending SOAP messages over a mobile GPRS network!) the ID-WSF 1.1 Correlation header block is a fair bit more compact representation of the same information, due to the use of XML attributes to carry the timestamp and message identifier, rather than individually defined SOAP header blocks for each of those elements.&lt;br /&gt;&lt;br /&gt;Now, to the body. At line 008 you see the SASLRequest - the thing that binds a SASL mechanism to SOAP. In line 009 you can see the mechanisms that the client says it supports, using the SASL mechanism names defined by the relevant IETF specifications for each mechanism, and in line 010 the "advisoryAuthnID" can be used to hold advisory (ie. a hint) information about the identity of the requester - so if a particular user account name were associated with some account number, this attribute could be used to send that information.&lt;br /&gt;&lt;br /&gt;2. The server's first response - carry on authenticating&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;001 &amp;lt;S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"&amp;gt;&lt;br /&gt;&lt;br /&gt;002   &amp;lt;S:Header&amp;gt;&lt;br /&gt;003     &amp;lt;sb:Correlation s:mustUnderstand="1" xmlns:sb="urn:liberty:sb:2003-08"&lt;br /&gt;004       messageID="uuid-7062c9fe-8f38-40a8-b8d6-88e45d4d4e3e"&lt;br /&gt;005       refToMessageID="C8797D0D-9020-07FC-AF0A-5622C01F4A61"&lt;br /&gt;006       timestamp="2005-12-21T19:44:37Z"/&amp;gt;&lt;br /&gt;007   &amp;lt;/S:Header&amp;gt;&lt;br /&gt;&lt;br /&gt;008   &amp;lt;S:Body&amp;gt;&lt;br /&gt;009     &amp;lt;SASLResponse serverMechanism="CRAM-MD5" xmlns="urn:liberty:sa:2004-04"&amp;gt;&lt;br /&gt;010       &amp;lt;Status code="continue"/&amp;gt;&lt;br /&gt;011       &amp;lt;Data&amp;gt;PGYzNTE3OGU1LTQ0MDEtNDA1Yi1hMzE4LWYxYWU4NjNkOTc1Nj4=&amp;lt;/Data&amp;gt;&lt;br /&gt;012     &amp;lt;/SASLResponse&amp;gt;&lt;br /&gt;013   &amp;lt;/S:Body&amp;gt;&lt;br /&gt;014 &amp;lt;/S:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see in lines 003-006, this message also has a Correlation SOAP header block, but in line 005 the "refToMessageID" shows that this message is in response to the message which has the given identifier. The server indicates in line 009 that it wishes to use the CRAM-MD5 SASL mechanism, and in line 010, you see a status code indicating that the server wants the client to continue the authentication protocol (rather than failing because of some error, or succeeding because the authentication was successful). Finally, in line 011 is the data that pertains to the actual authentication. This data is a Base64-encoded piece of data chosen as a challenge by the AS. The challenge is used to help assure that the server is dealing with a current authentication request, rather than something stolen and cached by a malicious client. The client is then required by the CRAM-MD5 mechanism to send back the challenge data in a form mandated by the CRAM-MD5 SASL mechanism.&lt;br /&gt;&lt;br /&gt;In the style of serialized thrillers, I'm going to leave it there for now. The server has issued a teasing challenge to the client's request for authentication, but the client is not authenticated. What happens next? You'll have to wait and see.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-113521352673044626?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/113521352673044626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=113521352673044626' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113521352673044626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113521352673044626'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2005/12/building-authentication.html' title='Building an authentication'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-13201387.post-113511614999907813</id><published>2005-12-20T17:01:00.000-05:00</published><updated>2006-12-07T15:48:53.936-05:00</updated><title type='text'>Blogging about blogging; blogging about SOAP</title><content type='html'>Everyone is blogging these days. So, why not, thought I? But where to start, and where to go? I consulted my &lt;a href="http://www.google.com/search?q=blogging+about+blogging&amp;btnG=Search&amp;amp;hs=Go8&amp;hl=en&amp;amp;lr=&amp;amp;"&gt;muse&lt;/a&gt; but I didn't get much help there. I perused the blogs of my friends and acquaintances - the list was short, but nowhere could I find much help on how to start, beyond the advice to use such and such a product and get your own domain.&lt;br /&gt;&lt;br /&gt;Anyway, so I decided just to start. I'm an architect in &lt;a href="http://www.nokia.com/webservices"&gt;Nokia's web services&lt;/a&gt; team. For the past two years, I've helped develop a piece of software that forms part of the Nokia/Symbian Series 80 operating system, and will soon be part of Series 60. That piece of software allows a developer on S60 or S80 to write applications that use web services. I've also contributed to SAML and the Liberty Alliance in the area of identity-enabling web services. And, I'm learning to play the ukulele!&lt;br /&gt;&lt;br /&gt;More about all of that in future posts, I'm sure. Having worked with web services for a while, it was easy to forget how confusing all the jargon is - until a novice asks you naive but good questions about why you should bother using SOAP (didn't your mother tell you to wash behind your ears?!) or what exactly &lt;i&gt;is&lt;/i&gt; a web service. So here's a handy, pocket-sized jargon-busting lexicon:&lt;br /&gt;&lt;br /&gt;SOAP - (nominally) Simple Object Access Protocol. Once upon a time, SOAP was the successor to CORBA and RMI - latest in a line of ways to invoke distributed systems. There's still a protocol, but what matters more than anything these days seems to be that SOAP gives you a relatively standard (ie. supported by many varying types of applications) XML envelope for passing XML application messages along with associated information about the processing of the application messages (SOAP headers). You don't &lt;i&gt;need&lt;/i&gt; SOAP to pass XML application messages around (see ATOM, RSS and their ilk) but having this standard envelope allows you to develop application frameworks separately from the applications themselves, and better still to standardize on these frameworks.&lt;br /&gt;SOAP Intermediary - One of the more novel ideas in the SOAP protocol is that messages can pass from an original requester to an eventual recipient through a number of intermediaries. Each intermediary along the way can insert, remove and process pieces of the SOAP message (typically though, just the SOAP headers). An application developer may only have to process the SOAP body because the security framework has previously processed the security SOAP header. Again, this concept nicely supports the development of application frameworks.&lt;br /&gt;Web Service - This is a hotly contested phrase, but a pretty complete description is listed in &lt;a href="http://en.wikipedia.org/wiki/Web_service"&gt;Wikipedia&lt;/a&gt;. My simpler, but vaguer notion involves separating the two words - 'web' implies that HTTP (the application protocol of the web) is used to access the service. I'm not sure that's always true (why couldn't the service be offered over SMTP, say?) so let's be inclusive and say that 'web' includes anything accessed over a network connection. 'Service' means 'work done for others' according to the &lt;a href="http://dictionary.reference.com/search?q=service"&gt;dictionary&lt;/a&gt;. In a technical context, that just means that a software application offers some kind of external interface or set of operations to other applications. So I think a web service is any such interface offered over a networked connection - this includes dynamically-generated web sites, RSS feeds as well as SOAP/HTTP bound services.&lt;br /&gt;&lt;br /&gt;What does any of this really mean? I can only opine - I hope it means that SOAP can be used to transcend the multiple transport protocols used today (ie. HTTP as a transport, straight TCP or UDP, SMTP, SIP and many others). It'll also be a good thing if it means that application developers can write more secure software applications, not because they write their own security code, but because there are commonly available frameworks that simply handle application security without affecting the actual software application. Interoperability would be a nice thing too, but, well, there's only so far that you can go with hope alone...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/13201387-113511614999907813?l=appliedlife.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://appliedlife.blogspot.com/feeds/113511614999907813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=13201387&amp;postID=113511614999907813' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113511614999907813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/13201387/posts/default/113511614999907813'/><link rel='alternate' type='text/html' href='http://appliedlife.blogspot.com/2005/12/blogging-about-blogging-blogging-about.html' title='Blogging about blogging; blogging about SOAP'/><author><name>John</name><uri>http://www.blogger.com/profile/16472749333196621914</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
