<?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-6301633</id><updated>2012-01-06T22:33:09.068-06:00</updated><category term='ruby'/><category term='javafx'/><category term='microforms atom'/><category term='atom opml list'/><category term='java'/><category term='funny'/><category term='clojure'/><category term='web'/><category term='relational'/><category term='soa'/><category term='google microsoft'/><category term='lisp'/><category term='carbuntu'/><category term='gnu'/><category term='rest'/><category term='gpl'/><category term='wolfram'/><category term='mouse'/><category term='semweb'/><category term='dns'/><category term='git'/><category term='floyd'/><category term='whois funny'/><category term='testdriven'/><category term='atom'/><category term='microsoft'/><category term='cycling'/><category term='ria'/><category term='jruby'/><category term='ubuntu'/><category term='football'/><category term='rest atom atompub'/><category term='microforms'/><category term='doping'/><category term='google'/><category term='database'/><title type='text'>Messages not Models</title><subtitle type='html'>Hugh Winkler holding forth on computing and the Web</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default?start-index=101&amp;max-results=100'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>140</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6301633.post-4856952655693384395</id><published>2009-07-16T17:56:00.009-05:00</published><updated>2009-07-16T19:00:25.731-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Inflexible, unmaintainable, fragile code in Clojure</title><content type='html'>I constructed a subsystem in Clojure. We had a nice, compact problem to solve. The rest of our app talks to this Clojure bit through a small interface. The attraction of Clojure was that I could enjoy all the nimbleness of hacking Lisp interactively. Using such a powerful language, I could adapt to emerging requirements, experiment, twiddle, and workaround faster than using Java. And early on, that largely proved true. &lt;br /&gt;&lt;br /&gt;But I am here to tell you: It is possible to write inflexible, unmaintainable, fragile code in Clojure.&lt;br /&gt;&lt;br /&gt;As they say in bicycle racing, the riders make the race.  I never said I was a &lt;span style="font-style:italic;"&gt;good&lt;/span&gt; programmer.&lt;br /&gt;&lt;br /&gt;It's my own fault. I dived into Clojure and learned key concepts on the run. And these key concepts are fundamental to how you should structure your program. FP has a learning curve.  Managing shared state using Refs, Agents and STM -- better to understand these concepts up front. Even now, I'm unsure how I'd restructure my code to use them properly.   I'm &lt;span style="font-style:italic;"&gt;very&lt;/span&gt; glad not to have to worry about deadlocks.  But there are parts of this code I still am unsure how to to test for consistency under multithread access.&lt;br /&gt;&lt;br /&gt;Consequently, I'm slogging through this bowl of spaghetti of my own making, cursing the author.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[Edited to add "fragile" ... as I made one more change and my tests came tumbling down... ]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4856952655693384395?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4856952655693384395/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4856952655693384395' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4856952655693384395'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4856952655693384395'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/07/inflexible-unmaintainable-code-in.html' title='Inflexible, unmaintainable, fragile code in Clojure'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-1644601999757016199</id><published>2009-05-30T15:10:00.002-05:00</published><updated>2009-05-30T15:25:12.799-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wolfram'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Wolfram Alpha isn't sure what to do with your input</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_pMQ_v-5RTNM/SiGVzh5WaVI/AAAAAAAAAcU/hNoULSOpmpY/s1600-h/delme.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://4.bp.blogspot.com/_pMQ_v-5RTNM/SiGVzh5WaVI/AAAAAAAAAcU/hNoULSOpmpY/s320/delme.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5341715345542900050" /&gt;&lt;/a&gt;&lt;br /&gt;I have yet to get any answers to any interesting, real question I have had, from &lt;a href="http://www.wolframalpha.com/"&gt;Wolfram Alpha&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1644601999757016199?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1644601999757016199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1644601999757016199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1644601999757016199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1644601999757016199'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/05/wolfram-alpha-isnt-sure-what-to-do-with.html' title='Wolfram Alpha isn&apos;t sure what to do with your input'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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://4.bp.blogspot.com/_pMQ_v-5RTNM/SiGVzh5WaVI/AAAAAAAAAcU/hNoULSOpmpY/s72-c/delme.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-3281399120091180649</id><published>2009-04-25T17:17:00.012-05:00</published><updated>2009-04-25T23:18:23.302-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnu'/><category scheme='http://www.blogger.com/atom/ns#' term='gpl'/><title type='text'>If RMS has his way, the  GPL is dead</title><content type='html'>The GPL has never made me feel particularly free. Only in a kind of &lt;a href="http://www.newspeakdictionary.com/ns-prin.html"&gt;newspeak&lt;/a&gt; can you say that &lt;span style="font-style:italic;"&gt;constraining&lt;/span&gt; the kinds of agreements I can make with people who buy my software &lt;span style="font-style:italic;"&gt;enhances&lt;/span&gt; my freedom .&lt;br /&gt;&lt;br /&gt;I'm not saying I don't like and use GPL software, or that the GPL is unfair. Just don't tell me that handcuffs are extra freedom.&lt;br /&gt;&lt;br /&gt;Only copyright law enables GPL to constrain my actions from beyond the grave. In a world without copyright, GPL would be toothless. I would be able to use any freely available software I could get my hands on, incorporate it into my own, and distribute only binaries.&lt;br /&gt;&lt;br /&gt;Richard Stallman &lt;a href="http://www.gnu.org/philosophy/misinterpreting-copyright.html"&gt;proposes reducing copyright protection to three years for software&lt;/a&gt;. And he admits "It would be necessary to prohibit the use of contracts to apply restrictions on copying that go beyond those of copyright." That prohibition would apply to FOSS too, of course. No copyright after three years; no contract allowing the author to constrain your actions after that. &lt;br /&gt;&lt;br /&gt;That would mean that you could link to three year old GPL libraries and ship binaries!&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3281399120091180649?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3281399120091180649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3281399120091180649' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3281399120091180649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3281399120091180649'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/04/if-rms-has-his-way-gpl-is-dead.html' title='If RMS has his way, the  GPL is dead'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6896055054414661760</id><published>2009-04-18T16:17:00.018-05:00</published><updated>2009-04-19T00:51:58.175-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest atom atompub'/><title type='text'>The REST Hypothesis</title><content type='html'>I'm glad &lt;a href="http://bitworking.org/news/425/atompub-is-a-failure"&gt;Joe Gregorio frankly assessed Atompub's meager adoption&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://bitworking.org/projects/atom/rfc5023.html"&gt;Atompub&lt;/a&gt; served as an experiment to confirm the REST hypothesis: If you construct distributed systems that look like the world wide web, the world will adopt them broadly and quickly -- the way we adopted the web itself. &lt;a href="#disclaimer"&gt;*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Lesson learned: the world's most successful distributed applications run on the web's architecture. That doesn't mean that by designing around web architecture, you will build the world's most successful distributed application.&lt;br /&gt;&lt;br /&gt;Atompub came along at the time a critical mass of thought was building in favor of adopting the web architecture for designing new systems, rather than the ill-named "web services", SOAP and RPC model. Early drafts of Atompub allowed for a SOAP envelope. &lt;br /&gt;&lt;br /&gt;The RESTful style prevailed, on its many merits. We got caching, and a resource oriented model, and a small, uniform interface.&lt;br /&gt;&lt;br /&gt;But what the real, browser plus HTML web has, that RESTful systems don't, is the user agent. The human in front of her browser. An intelligence that reads and understands the meaning of "Author name" and "Title", and fills in an HTML form using queries against her personal database, stored in her brain.&lt;br /&gt;&lt;br /&gt;As Joe put it, the problem is that Atompub clients aren't web browsers.&lt;br /&gt;&lt;br /&gt;RESTful systems that aren't web browsers try to substitute understanding of media types for that intelligence. Compare Atom clients to HTML browsers.&lt;br /&gt;&lt;br /&gt;An "Atom application" is some sort of content management system: a system that understands the semantics of feed documents. An Atom agent populates &amp;lt;author&amp;gt; and &amp;lt;title&amp;gt; elements. Only machines  understand the meaning of &amp;lt;link rel="edit"&amp;gt;. It's a world constrained to a narrow range of meanings. &lt;br /&gt;&lt;br /&gt;But an HTML application can do anything. A human reads some text next to a form field, labelled "Author name", or "Preferred airline", and enters meaningful answers. If you are writing the kind of content management system where "Preferred airline" is a meaningful concept, HTML might be the way to go. There's no such concept in an Atom feed document. You get to present your own user interface, too. &lt;br /&gt;&lt;br /&gt;RESTfully designed systems might profit from superior evolvability, cacheability, and interoperability over RPC systems. They are of the web. But they are not the web. The web is in your browser. The web is HTML.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="disclaimer" style="font-size:small"&gt;*&lt;/a&gt;The hypothesis was not part of &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;Roy Fielding's thesis&lt;/a&gt;. It's a hypothesis that many REST proponents, including me, have deployed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6896055054414661760?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6896055054414661760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6896055054414661760' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6896055054414661760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6896055054414661760'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/04/rest-hypothesis.html' title='The REST Hypothesis'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-6955655158732468218</id><published>2009-01-20T11:01:00.003-06:00</published><updated>2009-01-20T11:10:57.630-06:00</updated><title type='text'>Cheney Wheelchair Horror</title><content type='html'>&lt;a href="http://www.rightpundits.com/?p=2715#comment-439111"&gt;Best comment so far&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If only he had a small cat to pet as they rolled him to the car. You know something that he could stroke until he snapped its neck to suck the blood from its spine.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;(by "Brian")&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6955655158732468218?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6955655158732468218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6955655158732468218' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6955655158732468218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6955655158732468218'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/01/cheney-wheelchair-horror.html' title='Cheney Wheelchair Horror'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-1994527568222080963</id><published>2009-01-03T01:42:00.006-06:00</published><updated>2009-01-03T02:32:02.426-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>Clojure vs JavaFX Script: only 5x slower!</title><content type='html'>&lt;a href="http://blogs.sun.com/chrisoliver/entry/performance_matters_25x_for_javafx"&gt;Chris Oliver compares his JavaFX script to JRuby and Groovy&lt;/a&gt; and finds JavaFX 25 times faster. &lt;br /&gt;&lt;br /&gt;I failed to get JavaFX compiler running on my Ubuntu, but I easily ran Chris's JRuby 1.1.6 test; so for calibration, my laptop comes in at 3:52, vs 4:22 on Chris's machine. Presumably we can scale results on my machine by 1.13.&lt;br /&gt;&lt;br /&gt;Here's my Clojure version of the test:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;(defn tak [#^Integer x #^Integer y #^Integer z]&lt;br /&gt;  (if (&gt;= y x)&lt;br /&gt;    z&lt;br /&gt;    (recur (tak (- x 1) y z)&lt;br /&gt;    (tak (- y 1) z x)&lt;br /&gt;    (tak (- z 1) x y))))&lt;br /&gt;&lt;br /&gt;(dotimes [n 1000] (tak 24 16 8))&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;It runs in about 50 seconds, or 56 after normalizing to Chris' machine speed. This puts Clojure north of JRuby and Groovy, but still 5 times slower than JavaFX.&lt;br /&gt;&lt;br /&gt;If you remove the type hints, it runs in 4 minutes, or about the same time as JRuby -- and about 4 or 5 times slower than with type hints.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1994527568222080963?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1994527568222080963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1994527568222080963' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1994527568222080963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1994527568222080963'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/01/clojure-vs-javafx-script-only-5x-slower.html' title='Clojure vs JavaFX Script: only 5x slower!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5443490657493469186</id><published>2009-01-01T12:48:00.004-06:00</published><updated>2009-01-01T13:23:58.784-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><title type='text'>Clojure uptick</title><content type='html'>Needing to build a standalone piece of server software as an add on to our Java product, I seized the opportunity to see how far &lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; has come. Getting my dev system set up, and learning the language, I noticed the results Google was returning for my queries were mostly very recent... and lots from just last month. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chart.apis.google.com/chart?chs=500x200&amp;cht=bvs&amp;chtt=Clojure%20Mailing%20List%20Activity&amp;chd=s:DBHGIROJQOSOjv9&amp;chxl=0:|oct|nov|dec|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|&amp;chxt=x"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 500px; height: 200px;" src="http://chart.apis.google.com/chart?chs=500x200&amp;cht=bvs&amp;chtt=Clojure%20Mailing%20List%20Activity&amp;chd=s:DBHGIROJQOSOjv9&amp;chxl=0:|oct|nov|dec|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|&amp;chxt=x" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Could Clojure be approaching critical mass?&lt;br /&gt;&lt;br /&gt;I've only written a hundred lines or so of code, but here are some random things I love:&lt;br /&gt;&lt;br /&gt;1. Shorthand for maps: &lt;code&gt;{:a 1 :b 3}&lt;/code&gt;.&lt;br /&gt;2. &lt;code&gt;sorted-map&lt;/code&gt; and &lt;code&gt;hash-map&lt;/code&gt; -- thanks for letting me choose. Same shorthand syntax for either.&lt;br /&gt;3. Shorthand to select a value from a map: the map is like a function name &lt;code&gt;(my-map :a)&lt;/code&gt;.&lt;br /&gt;4. Shorthand for lambdas: #(...code...) &lt;br /&gt;5. Shorthand for generating temporary symbols in macros: &lt;code&gt;my-var#&lt;/code&gt;. No need to call &lt;code&gt;(gensym)&lt;/code&gt;.&lt;br /&gt;4. No looping required -- use &lt;code&gt;&lt;a href="http://clojure.org/special_forms#toc10"&gt;recur&lt;/a&gt;&lt;/code&gt;.&lt;br /&gt;5. Java libraries are easy to use. &lt;br /&gt;&lt;br /&gt;I haven't yet fiddled with &lt;a href="http://clojure.org/state"&gt;modifying state&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It's free, it's functional, it's got a hardened standard library, it's got a REPL. You can write a program and deliver it on any platform. What could hold it back?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5443490657493469186?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5443490657493469186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5443490657493469186' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5443490657493469186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5443490657493469186'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2009/01/clojure-uptick.html' title='Clojure uptick'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-4476170871633271090</id><published>2008-12-12T18:52:00.006-06:00</published><updated>2008-12-12T19:33:36.170-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>Flying the F-22</title><content type='html'>My gut reaction to the internet chatter about distributed version control systems, like &lt;a href="http://git.or.cz/"&gt;Git&lt;/a&gt;, was, "What advantage could it possibly offer us, that would justify me and developers spending so much time &lt;span style="font-style:italic;"&gt;re-learning how to manage source code&lt;/span&gt;?" CVS kinda sucked, but was good enough, and Subversion was better... what more could you want? It's just version control.&lt;br /&gt;&lt;br /&gt;But we had a branching requirement, and a customer requiring a branch  we'd maintain for a few years. &lt;br /&gt;&lt;br /&gt;From &lt;a href="http://svnbook.red-bean.com/en/1.1/ch04s03.html#svn-ch-4-sect-3"&gt;the Subversion manual&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Tracking Merges Manually&lt;br /&gt;&lt;br /&gt;Merging changes sounds simple enough, but in practice it can become a headache. The problem is that if you repeatedly merge changes from one branch to another, you might accidentally merge the same change twice. When this happens, sometimes things will work fine. When patching a file, Subversion typically notices if the file already has the change, and does nothing. But if the already-existing change has been modified in any way, you'll get a conflict.&lt;br /&gt;&lt;br /&gt;Ideally, your version control system should prevent the double-application of changes to a branch. It should automatically remember which changes a branch has already received, and be able to list them for you. It should use this information to help automate merges as much as possible.&lt;br /&gt;&lt;br /&gt;Unfortunately, Subversion is not such a system....It means that until the day Subversion grows this feature, you'll have to track merge information yourself. The best place to do this is in the commit log-message.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;OK! So, relearning version control might not be a bad idea! &lt;br /&gt;&lt;br /&gt;Git is all about changesets, and it can merge changes from branch to branch painlessly. A few months ago, we imported a year or so of changes from SVN to a Git repo (our tree structure was way too f***ed up for git-svn), and never looked back.&lt;br /&gt;&lt;br /&gt;I'm a Piper Cub pilot in the cockpit of a F-22 Raptor. There are a lot of switches. I kind of understand some of them. I'm afraid to touch most of them. Every now and then we'll try a new trick -- hey, I think I can just push this changeset to you, from the branch I'm working on to yours... SHIT, THAT WORKED! We haven't crashed yet, and we have the rumbling sense of untapped power.&lt;br /&gt;&lt;br /&gt;For reasons unrelated to version control, it turned out we could manage the customer requirements without a long running branch. But we're not going back on Git.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4476170871633271090?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4476170871633271090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4476170871633271090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4476170871633271090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4476170871633271090'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/12/flying-f-22.html' title='Flying the F-22'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-3999001052268035062</id><published>2008-11-21T12:29:00.000-06:00</published><updated>2008-11-21T12:29:26.838-06:00</updated><title type='text'>REST Blessed</title><content type='html'>Gartner has blessed REST architecture by giving it a three letter acronym and a $495 report. But you can get the gist of the paper for free in Nick Gall's blog post: &lt;a href="http://blogs.gartner.com/nick_gall/2008/11/19/woa-putting-the-web-back-in-web-services/"&gt;WOA: Putting the Web Back in Web Services&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Commercially, it's a big help that I can now point a customer's solution architect to a Gartner report, rather than to &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;a guy's thesis&lt;/a&gt; and 20,000 posts to the REST-discuss mailing list. I hope that doesn't sound cynical -- it's not. It's just that architecture arguments are hard to win just on the merits. You need a little mindshare too. Thanks, Nick!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3999001052268035062?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.gartner.com/nick_gall/2008/11/19/woa-putting-the-web-back-in-web-services/' title='REST Blessed'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3999001052268035062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3999001052268035062' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3999001052268035062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3999001052268035062'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/11/rest-blessed.html' title='REST Blessed'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-9152349633519416426</id><published>2008-10-23T20:01:00.007-05:00</published><updated>2008-10-24T11:36:59.335-05:00</updated><title type='text'>Electronic Vote Fraud</title><content type='html'>I think I know how we can use electronic voting to increase our confidence in vote counts -- as opposed to what we have.&lt;br /&gt;&lt;br /&gt;What we have is a mad world where you can construct the most extreme hypotheses about what is happening to your vote, and they could be true. You can't prove they're not. &lt;br /&gt;&lt;br /&gt;When I complete my vote, I want to receive a printed receipt with a) my vote in clear text, b) a hash of my identity, and c) my digital signature of the above, for non-repudiation.&lt;br /&gt;&lt;br /&gt;I should be able to log onto the county's web site, and verify that my vote was recorded for my candidate:&lt;table&gt;&lt;br /&gt;  &lt;thead&gt;&lt;br /&gt;    &lt;tr&gt;&lt;th style="text-align:left"&gt;Voter&lt;/th&gt;&lt;th style="text-align:left"&gt;Candidate&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;  &lt;/thead&gt;&lt;br /&gt;  &lt;tbody&gt;&lt;br /&gt;    &lt;tr&gt;&lt;td&gt;38907389343666&lt;/td&gt;&lt;td&gt;McCain&lt;/td&gt;&lt;/tr&gt;     &lt;br /&gt;    &lt;tr&gt;&lt;td&gt;84567867435432&lt;/td&gt;&lt;td&gt;Obama&lt;/td&gt;&lt;/tr&gt;     &lt;br /&gt;    &lt;tr&gt;&lt;td&gt;45878963063630&lt;/td&gt;&lt;td&gt;McCain&lt;/td&gt;&lt;/tr&gt;     &lt;br /&gt;    &lt;tr&gt;&lt;td&gt;92573532235672&lt;/td&gt;&lt;td&gt;Obama&lt;/td&gt;&lt;/tr&gt;    &lt;br /&gt;    &lt;tr&gt;&lt;td&gt;...&lt;/td&gt;&lt;td&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt; &lt;br /&gt;&lt;br /&gt;Anybody can look at this table and count the votes for McCain and Obama ,and confirm that they match the announced totals. They can confirm, too, that their own vote was counted for the proper candidate.&lt;br /&gt;&lt;br /&gt;My voting receipt matches one row of the table. The voting machine prints it out, and I review it. I should be able to confirm the hash of my identity by some public algorithm. It could be a hash of my voter registration number plus some secret password I make up.&lt;br /&gt;&lt;br /&gt;My receipt also has a digital signature that I apply only after I review its accuracy. Yep, I voted for that guy. I insert the paper into the machine and it prints a string that's the digital signature of my identity and my vote. That way, I can't claim the machine got my vote wrong -- I reviewed the clear text vote, and signed it.&lt;br /&gt;&lt;br /&gt;Voting this way would be lots more verifiable than paper ballots and hanging chads. You'd be able to verify your vote was counted. &lt;br /&gt;&lt;br /&gt;Since early voting began Tuesday in Travis County, Texas, the email chain below has grown virally (&lt;a href="http://www.statesman.com/news/content/news/stories/local/10/23/1023voterscam.html"&gt;local news story&lt;/a&gt;). And how can you prove these fears are wrong?&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;&lt;span style="font-size:85%;"&gt;From: redacted&lt;br /&gt;Date: October 22, 2008 11:48:50 PM CDT&lt;br /&gt;To: redacted&lt;br /&gt;Subject: DOUBLE CHECK YOUR BALLOT before pushing VOTE&lt;br /&gt;&lt;br /&gt;no matter who you are voting for:&lt;br /&gt;A friend of a friend of mine has this horror story about voting this morning&lt;br /&gt;in Austin, TX.&lt;br /&gt;&lt;br /&gt;He voted at Fiesta Mart on 38th and IH-35.&lt;br /&gt;&lt;br /&gt;He voted a straight Democratic ticket.&lt;br /&gt;&lt;br /&gt;When he was reading the 'voted for' listing at the end of his&lt;br /&gt;ballot, all of those listed were Democratic candidates EXCEPT FOR&lt;br /&gt;PRESIDENT. The list showed that he had voted for John McCain!!!&lt;br /&gt;&lt;br /&gt;And he voted the straight Democratic ticket.k&lt;br /&gt;&lt;br /&gt;He reported it to the election official and that person was as&lt;br /&gt;shocked by it as my friend. They corrected the vote BEFORE he hit&lt;br /&gt;the CAST BALLOT button.&lt;br /&gt;&lt;br /&gt;My friend said the experience made him sick to his stomach. He said&lt;br /&gt;he was the youngest person in the voting area and all he could&lt;br /&gt;think is that the older people around him may not proofread their&lt;br /&gt;ballot before pressing the CAST VOTE button. They may believe that&lt;br /&gt;they voted for Obama but the voting machine may have registered a&lt;br /&gt;vote for McCain.&lt;br /&gt;&lt;br /&gt;He called the Travis County voting office and they said they would&lt;br /&gt;look into this. When he called me I gave him the telephone number&lt;br /&gt;for the Democratic Party and he then called them to report what had&lt;br /&gt;happened and they said they would look into it, also.&lt;br /&gt;&lt;br /&gt;Please PROOFREAD your ballot choices BEFORE hitting the CAST BALLOT&lt;br /&gt;button. This is vitally important. (For EVERYONE who votes,&lt;br /&gt;whichever way you vote.)&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-9152349633519416426?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/9152349633519416426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=9152349633519416426' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9152349633519416426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9152349633519416426'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/10/electronic-vote-fraud.html' title='Electronic Vote Fraud'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6223533970566990355</id><published>2008-10-10T20:41:00.003-05:00</published><updated>2008-10-10T21:02:16.053-05:00</updated><title type='text'>Leaps</title><content type='html'>Dear Lazyweb,&lt;br /&gt;&lt;br /&gt;1. In 1929, how many Wall Streeters actually did leap to their deaths from their office windows? I'd be surprised if it were as many as 10. Growing up during the sixties, I had the impression it was raining stockbrokers on Black Tuesday; but now I find it hard to believe.&lt;br /&gt;&lt;br /&gt;2. They had names. Who were they?&lt;br /&gt;&lt;br /&gt;3. Why did they kill themselves? In 1929, was there a greater sense of personal responsibility for the margin calls they wouldn't be able to make? A greater fear of the shame that would attach to them personally?&lt;br /&gt;&lt;br /&gt;4. Has any Wall Streeter killed himself or herself during the current financial crisis?&lt;br /&gt;&lt;br /&gt;5. Have any of the current super wealthy attempted to guarantee the system using their personal wealth, as Rockefeller did in 1907?&lt;br /&gt;&lt;br /&gt;I pray the answer to 4 is no.... yet I wonder about what level of personal responsibility we should expect, and why it's different than 1929 and earlier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6223533970566990355?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6223533970566990355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6223533970566990355' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6223533970566990355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6223533970566990355'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/10/leaps.html' title='Leaps'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6846934548995534800</id><published>2008-09-14T00:57:00.008-05:00</published><updated>2008-09-17T08:59:00.355-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Dell Precision M2400 + Ubuntu Hardy</title><content type='html'>Welcome, Googlers. You are here because you have put Ubuntu Hardy (or perhaps Intrepid) on your shiny new M2400 (or other Precision laptop). And you've run into issues with your wireless; to wit, it don't work.&lt;br /&gt;&lt;br /&gt;I've got the nVidia Quadro 370M, and Intel wireless 5100 cards. A fresh install of Hardy on a Dell Precision M2400 supports the nVidia (&lt;a href="https://help.ubuntu.com/community/BinaryDriverHowto/Nvidia"&gt;howto&lt;/a&gt;). But the 5100 wireless card support is non-existent.&lt;br /&gt;&lt;br /&gt;To get both of these devices working, you're going to have to build a new  kernel, and also compile a beta nVidia driver interface. It's actually an automated and fairly bulletproof process, so don't lose your nerve.&lt;br /&gt;&lt;br /&gt;I think there are some other approaches that could work. I tried the &lt;a href="http://ubuntuforums.org/showpost.php?p=5754065&amp;amp;postcount=62"&gt;compat-wireless strategy&lt;/a&gt; -- it's a technique using the recompiled Intel 4965 driver plus new firmware (oh yeah... you're going to need &lt;a href="http://intellinuxwireless.org/iwlwifi/downloads/iwlwifi-5000-ucode-5.4.A.11.tar.gz"&gt;that 5000 series firmware&lt;/a&gt; from &lt;a href="http://intellinuxwireless.org/?n=downloads&amp;amp;f=ucode"&gt;the Intel site&lt;/a&gt; anyway, so go get it). That strategy actually worked... as long as I ran "make load" on every boot... and occasionally my keyboard would freeze, requiring a  reboot. I never could get that approach to feel stable, and my googling left with the impression that nobody had taken it much further than I had.&lt;br /&gt;&lt;br /&gt;But to focus on the strategy I got working:&lt;br /&gt;&lt;br /&gt;The problem is that the new Intel iwlagn drivers are part of the very latest kernel. I do not believe they are in even the Ububtu Intrepid kernel, so I did not attempt to promote to that alpha version of the distro. You can google to find lots of people dist-upgrading to Intrepid only to find they still don't have support for the 5100.&lt;br /&gt;&lt;br /&gt;But there is support in the 2.6.27-rc6 kernel, the latest stable development pre-patch.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Build the 2.6.27-rc6-ultimate kernel&lt;/h3&gt;If you have X + nVidia set up the way you like, now would be a good time to save a copy of /etc/X11/xorg.conf.&lt;br /&gt;&lt;br /&gt;You want to &lt;a href="http://ubuntuforums.org/showthread.php?t=311158"&gt;build this kernel the Ubuntu way&lt;/a&gt;. I suggest you follow the command line instructions on that page, and avoid the &lt;a href="http://kcheck.sourceforge.net/"&gt;KernelCheck&lt;/a&gt; GUI program. I tried KernelCheck first and it is a really handy way to build a kernel. But it seems not to have left artifacts you will need later, when you build the nVidia driver interface. I admit there could have been pilot error in my case -- but I know the command line method works correctly.&lt;br /&gt;&lt;br /&gt;When you get to the "make xconfig" step, choose Find from the Edit menu and search for "iwl". Turn on all those options.&lt;br /&gt;&lt;br /&gt;Don't forget to select 64 bit options.&lt;br /&gt;&lt;br /&gt;I emulated KernelCheck's naming pattern and identified my kernel with the name "ultimate", so my make-kpkg command was&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;make-kpkg --initrd --append-to-version=-ultimate kernel_image kernel_headers modules_image&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;So my uname -r  is "2.6.27-rc6-ultimate".&lt;br /&gt;&lt;br /&gt;Follow the instructions all the way and install your kernel. Don't worry, your old kernel is still there and in case of trouble, you can always choose it in the boot menu.&lt;br /&gt;&lt;br /&gt;Remember that firmware you downloaded above? Put it at /lib/firmware/2.6.27-rc6-ultimate/iwlwifi-5000-1.ucode. Then reboot, and you'll have wireless... but no nVidia.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Build the nVidia driver &lt;/h3&gt;When you reboot into your new kernel,  the system will drop you into a default 800 x 600 X session. Don't attempt to configure X yet if it prompts you.&lt;br /&gt;&lt;br /&gt;There's no pre-built nVidia driver for this kernel. I also found that only the &lt;a href="http://www.nvidia.com/object/linux_display_amd64_177.67.html"&gt;latest beta nVidia driver interface&lt;/a&gt; compiled against this kernel.&lt;br /&gt;&lt;br /&gt;In order to build and install the driver, you need to kill X and make it stay killed. Ctrl-Alt-F1 to get a console, then "killall gdm". Then, following the instructions on the nVidia site, run the install script you downloaded. It should even edit the xorg.conf file to install itself, but in my case I still had to go back and set the resolutions -- I just replaced xorg.conf with the one I had saved at the beginning.&lt;br /&gt;&lt;br /&gt;Our only departure from the Ubuntu way was using the nVidia install script -- it puts nvidia kernel module in a place of its choosing, and it won't be managed by apt for us. But we're not going to be getting new kernels from apt anyway -- we built our own, and we're now going to take responsibility for upgrading kernels (as needed) and nVidia at the same time.&lt;br /&gt;&lt;h3&gt;Tidying up&lt;/h3&gt;You want to be able to suspend and hibernate, and &lt;a href="http://ubuntuforums.org/showthread.php?t=327868"&gt;it just takes a couple of edits&lt;/a&gt;. To hibernate, you'll need as much swap space as you have RAM. With this computer, unlike my last one, I've done that, and hibernate now works after the edits.&lt;br /&gt;&lt;br /&gt;The NetworkManager annoyingly asks you to enter your keyring password whenever you log in. &lt;a href="http://www.google.com/search?q=nm-applet+keyring"&gt;Googling around, I found some solutions&lt;/a&gt;. One of them worked for me. I'm not sure I used the best solution, so I'm punting and letting you find your own answers.&lt;br /&gt;&lt;br /&gt;Hey -- this backlit keyboard is pretty nice!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update Sept 17:&lt;/span&gt; Using the Hardy config file as your initial config (config-2.6.24-19-generic), simply enabling iwl* as above leaves you missing two modules that Ubuntu installs only as part of the linux-ubuntu-modules package. Your sound card and webcam require extra modules. In make xconfig, be sure also to select "USB Video class" (if you have the webcam) and "Intel HD Audio".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="" 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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6846934548995534800?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6846934548995534800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6846934548995534800' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6846934548995534800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6846934548995534800'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/09/dell-precision-m2400-ubuntu-hardy.html' title='Dell Precision M2400 + Ubuntu Hardy'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-9158698490982688233</id><published>2008-07-24T23:08:00.004-05:00</published><updated>2008-07-24T23:43:15.478-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><title type='text'>Check your DNS</title><content type='html'>Dan Kaminsky has &lt;a href="http://www.doxpara.com/"&gt;published a widget&lt;/a&gt; you can use to test your DNS server for the &lt;a href="http://blog.wired.com/27bstroke6/2008/07/kaminsky-on-how.html"&gt;cache poisoning design flaw&lt;/a&gt;. You know, the one that allows a malefactor to send your PayPal requests to their own fake servers? The one that &lt;a href="http://addxorrol.blogspot.com/2008/07/on-dans-request-for-no-speculation.html"&gt;doesn't require any vulnerability on your computer, just the standard, unpatched DNS server that you use&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Both my home and business ISPs failed the test. I followed Dan's advice and pointed our routers to &lt;a href="http://www.opendns.com/"&gt;OpenDNS&lt;/a&gt;. I guess it's a good day to be an investor in OpenDNS. Except I can't  figure how they're going to execute on their plan to serve me ads via DNS. Anyway, this is their moment of glory, and they seem to be holding up under the load. If Dan has any stock in OpenDNS, that would be clever of him. I am not suggesting he does. Unless it turns out that he does. Then in that case, I am suggesting it retroactively, and don't say I didn't tell you so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-9158698490982688233?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.doxpara.com/' title='Check your DNS'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/9158698490982688233/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=9158698490982688233' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9158698490982688233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9158698490982688233'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/07/check-your-dns.html' title='Check your DNS'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6134643362561541074</id><published>2008-07-01T20:57:00.004-05:00</published><updated>2008-07-01T21:24:23.996-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google microsoft'/><title type='text'>Get with it, Pops</title><content type='html'>Dare &lt;a href="http://www.25hoursaday.com/weblog/2008/06/29/TheGOOGMSFTExodusWorkingAtGoogleVsWorkingAtMicrosoft.aspx"&gt;gives evidence that older Googlers are coming away dissatisfied from the experience&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are a few disapproving quotes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It was obvious that they do not care that I had 12 years software engineering experience&lt;/li&gt;&lt;li&gt;orientation towards cool, but not necessarily useful or essential software&lt;/li&gt;&lt;li&gt;don’t have a career path for their employees&lt;/li&gt;&lt;li&gt;There is no legacy code&lt;/li&gt;&lt;li&gt;As all organizations mature they tend to add PROCESS&lt;/li&gt;&lt;/ul&gt;Isn't this the static vs dynamic argument? Old models of software development vs new?  On premise software vs software as a service? Will legacy code even be important at Google? Shouldn't our goal be &lt;a href="http://lesscode.org/2005/08/16/disposable-software/"&gt;disposable code&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Aren't perspectives like this the reason Microsoft is perceived as a falling star while Google is a rising one?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6134643362561541074?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.25hoursaday.com/weblog/2008/06/29/TheGOOGMSFTExodusWorkingAtGoogleVsWorkingAtMicrosoft.aspx' title='Get with it, Pops'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6134643362561541074/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6134643362561541074' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6134643362561541074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6134643362561541074'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/07/get-with-it-pops.html' title='Get with it, Pops'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6876933982313384925</id><published>2008-06-28T17:26:00.014-05:00</published><updated>2008-06-28T18:59:33.741-05:00</updated><title type='text'>Asynchronous HTTP POST</title><content type='html'>I've got to process a huge POST asynchronously. If it were small enough I'd just return 201 Created, with the URL of the new resource in the Location header. But this is a massive file upload that requires a bunch of processing, and checking, before I can create the resource. It takes so long to process, your TCP connection will time out.&lt;br /&gt;&lt;h3&gt;202, right?&lt;/h3&gt;This is a job for &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.3"&gt;202 Accepted&lt;/a&gt;, right? I had always understood 202 was how to respond ansynchronously to a POST. I return some hypertext with a link you can follow to see the status. You follow that link, load the status page, and hit refresh until it shows "100% done" and  displays yet another link to the resource you created. That's what the RFC says to do.&lt;br /&gt;&lt;br /&gt;In a machine to machine case, e.g. Atompub, I have to define meaningful content types so that clients can follow the hyperlinks to learn how the POST came out. If you're thinking of using the Location header: It isn't blessed for 202; even if it were, we couldn't guarantee that the resource at the returned URL will ever exist.&lt;br /&gt;&lt;h3&gt;Why not 303?&lt;/h3&gt;I prefer to respond with &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4"&gt;303 See Other&lt;/a&gt;. Clients follow that Location header to a status page, eliminating the extra manual step required by 202. Retrieving that page would itself return 202 Accepted, until I've created the resource, or failed to. Then &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; URL would return 201 Created, or whatever the result would have been in the synchronous case.&lt;br /&gt;&lt;br /&gt;This way, user agents just follow the semantics of HTTP, and never need to understand any application entities.&lt;br /&gt;&lt;br /&gt;Summarizing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt; Any user agent will knows to follow the 303 to the status page automatically. This is the URI giving "the response to the request", which is a status page. Any time you want the response to this POST request, go to that URI.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;GET on that status URI, for some time, returns 202 and an entity giving "an indication of the request's current status". &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Finally, at some time when you check that URI, you get the final "response to the request".&lt;/li&gt;&lt;/ul&gt;The surprising part might be encountering 202 or 201 in response to GET. But nothing says you can't, and in fact that is the "response to the request".&lt;br /&gt;&lt;br /&gt;(Ben Ramsey discusses &lt;a href="http://benramsey.com/archives/http-status-201-created-vs-202-accepted/"&gt;returning 202 from the POST&lt;/a&gt;. It gets a little messy.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6876933982313384925?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6876933982313384925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6876933982313384925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6876933982313384925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6876933982313384925'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/06/asynchronous-http-post.html' title='Asynchronous HTTP POST'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-250523196711898058</id><published>2008-06-14T23:05:00.004-05:00</published><updated>2008-06-14T23:36:23.860-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Ruby: DSL for Writing Programs</title><content type='html'>Ruby:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;PEOPLE = [{:first=&gt;'scott', :last=&gt;'guthrie', :age=&gt;32},&lt;br /&gt;              {:first=&gt;'susanne', :last=&gt;'guthrie', :age=&gt;32},&lt;br /&gt;              {:first=&gt;'bill', :last=&gt;'gates', :age=&gt;50}]&lt;br /&gt;&lt;br /&gt;def avg_age&lt;br /&gt;  guthries = PEOPLE.select {|p| p[:last] == 'guthrie'}&lt;br /&gt;  guthries.inject(0) {|s, p| s + p[:age]} / guthries.length &lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Common Lisp:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defvar  +people+ &lt;br /&gt;  (list &lt;br /&gt;   (list :first "scott" :last "guthrie" :age 32)&lt;br /&gt;   (list :first "susanne" :last "guthrie" :age 32)&lt;br /&gt;   (list :first "bill" :last "gates" :age 50)))&lt;br /&gt;&lt;br /&gt;(defun avg-age ()&lt;br /&gt;  (let ((guthries  (remove-if (lambda (p) (not (equal "guthrie" (getf p :last)))) +people+)))&lt;br /&gt;    (/ (reduce #'+ (map 'list  (lambda (p) (getf p :age)) guthries)) (length guthries))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;These snippets calculate the average age of the people having last name "guthrie". The functions are both two lines long, but the Ruby one is more readable. &lt;br /&gt;&lt;br /&gt;S-expressions give Lisp powerful ways to build code in code. But writing programs using S-expressions seems cumbersome compared to Ruby's syntax. The syntax of Ruby shortens the code you have to write to do everyday tasks. It's like a domain specific language for, er, writing computer programs. &lt;br /&gt;&lt;br /&gt;You give up some  programming power -- a fair trade if you rarely need that power.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-250523196711898058?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/250523196711898058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=250523196711898058' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/250523196711898058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/250523196711898058'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/06/ruby-dsl-for-writing-programs.html' title='Ruby: DSL for Writing Programs'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-1784040173023015439</id><published>2008-05-29T15:17:00.003-05:00</published><updated>2008-05-29T15:49:43.029-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Self-appointed Guardians of Truth</title><content type='html'>&lt;a href="http://www.sitetruth.com/"&gt;SiteTruth&lt;/a&gt; has given &lt;a href="http://www.wellstorm.com/"&gt;my company's web site&lt;/a&gt; a big red &lt;img src="http://bp1.blogger.com/_pMQ_v-5RTNM/SD8QOWEHmII/AAAAAAAAADM/stLPjLNf2FM/s320/largesymbolred.gif" alt="do not enter sign" title="do not enter" id="BLOGGER_PHOTO_ID_5205897532890650754" border="0" /&gt;.&lt;br /&gt;&lt;br /&gt;Even though we don't sell products electronically, they wish we had a certificate. And we've never put our office address on that site -- an oversight when we moved, not a scam.  So they give us a big red "Do Not Enter" sign, indicating our site is dangerous to enter. From their "about" page:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Every &lt;span style="font-weight: bold;"&gt;on-line commerce web site&lt;/span&gt; must display the name and address of the business behind the site. That's the law in much of the developed world. SiteTruth tries to identify that business, then find information about it. &lt;span style="font-weight: bold;"&gt;That check is used to influence search rankings&lt;/span&gt;. That's SiteTruth. &lt;span style="font-style: italic;"&gt;(emphasis mine)&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We're not an "on-line commerce web site",  but their system can't detect that, so they're selling technology that will lower our search rankings?&lt;br /&gt;&lt;br /&gt;We'll fix our site to please them, of course; why not? But their technology doesn't seem to increase the safety of the web. And is likely to piss off other legit site owners, some of whom may even feel litigious. Could you blame them?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1784040173023015439?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1784040173023015439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1784040173023015439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1784040173023015439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1784040173023015439'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/05/self-appointed-guardians-of-truth.html' title='Self-appointed Guardians of Truth'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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://bp1.blogger.com/_pMQ_v-5RTNM/SD8QOWEHmII/AAAAAAAAADM/stLPjLNf2FM/s72-c/largesymbolred.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-3269535048369762680</id><published>2008-04-25T12:03:00.006-05:00</published><updated>2008-04-25T13:25:21.310-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Hardly any near death experiences</title><content type='html'>The Hardy upgrade went... ok. Better than the upgrade to Gutsy, at least --the initial boot this time at least got me to an X, if only in 600 x 800 mode.&lt;br /&gt;&lt;br /&gt;So you don't have to read to the end, here's my helpful hint to you this upgrade cycle. If you're having trouble with your nVidia: after you upgrade, use Synaptic to uninstall your old restricted drivers packages (in my case, for kernel 2.6.22), and select the new ones (for kernel 2.6.24) which, in my case at least, were not selected after the upgrade.&lt;br /&gt;&lt;br /&gt;Only after you do that, and reboot, can you see the new nVidia driver in the System/Administration/Hardware Drivers applet. This used to be called the Restricted Drivers Manager and all the online docs still refer to that. But Hardware Drivers is what you want. Go there and do what comes naturally.&lt;br /&gt;&lt;br /&gt;Last night I was finally able to get Update Manager to connect and start downloading files. I let that run overnight -- it took 6 hours or so to download everything, presumably because of the tremendous load on the U.S. Ubuntu server. &lt;br /&gt;&lt;br /&gt;This morning, I awoke to find it paused in a dialog. Just a warning that it was about to clobber my modified mime.types. I answered OK. It proceeded a little, displaying the progress in a little terminal window. I noticed some interesting progress output, and started editing some notes. At one point, I selected some text in the terminal window, and copied it. Using Ctrl-C. Who would have thought the goddamn terminal window was accepting keyboard input and processed the interrupt. So immediately I get three alerts warning that it could not complete the emacs/ede/eieio installations becuase it had received an interrupt. Yesterday &lt;a href="http://hughw.blogspot.com/2008/04/ubuntu-hardy-is-out-and-im-sucker.html"&gt;I predicted the emacs upgrade would fail&lt;/a&gt;, but I didn't mean to fulfill my own prophecy.&lt;br /&gt;&lt;br /&gt;It seemed to continue from there almost without trouble -- but at the end it complained it could not upgrade the update-manager. Ironic, isn't it?  And at the end of the install it displayed a scare alert: "Your system may be unusable". Nice. Bravely, I rebooted, and found myself in 800 x 600, but at least with an otherwise stable system.&lt;br /&gt;&lt;br /&gt;After some flailing I discovered the secret sauce to getting nVidia working again. And all systems are now go!&lt;br /&gt;&lt;br /&gt;I wonder how &lt;a href="http://diveintomark.org/archives/2008/01/04/my-parents-desktop"&gt;Mark Pilgrim's mom and dad&lt;/a&gt; are doing?&lt;br /&gt;&lt;br /&gt;[updated to fix link]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3269535048369762680?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3269535048369762680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3269535048369762680' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3269535048369762680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3269535048369762680'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/04/hardly-any-near-death-experiences.html' title='Hardly any near death experiences'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2047577606231527589</id><published>2008-04-24T15:32:00.003-05:00</published><updated>2008-04-24T15:40:02.834-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu Hardy is out and I'm a sucker</title><content type='html'>I managed to hold off about 6 hours before giving in and pressing the "Upgrade" button to get &lt;a href="http://www.ubuntu.com/getubuntu/upgrading"&gt;Hardy Heron&lt;/a&gt;. Yes, I'm in the middle of a project. Yes, I expect I'll have nVidia issues. My emacs will probably fail upgrading as usual. But: it's too tempting. I'm a sucker. I know it! No discipline whatsoever.&lt;br /&gt;&lt;br /&gt;Hm... I guess the servers are mighty busy today. My first attempt timed out: "Could not download the release notes/ Please check your internet connection".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2047577606231527589?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ubuntu.com/getubuntu/upgrading' title='Ubuntu Hardy is out and I&apos;m a sucker'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2047577606231527589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2047577606231527589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2047577606231527589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2047577606231527589'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/04/ubuntu-hardy-is-out-and-im-sucker.html' title='Ubuntu Hardy is out and I&apos;m a sucker'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-7558495916709697916</id><published>2008-04-12T11:38:00.015-05:00</published><updated>2008-04-12T13:36:51.969-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>Lisp a casualty of its time</title><content type='html'>This sad editorial remark from the &lt;a href="http://clipsrules.sourceforge.net/"&gt;CLIPS&lt;/a&gt; architecture &lt;a href="http://clipsrules.sourceforge.net/documentation/other/arch5-1.pdf"&gt;document&lt;/a&gt;, describing perceptions about Lisp within NASA around 1984:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;...Despite extensive demonstrations of the potential of expert systems, few of these applications were put into regular use. This failure to provide expert systems technology within NASA’s operational computing constraints could largely be traced to the use of LISP as the base language for nearly all expert system software tools at that time. In particular, three problems hindered the use of LISP based expert system tools within NASA: the low availability of LISP on a wide variety of conventional computers, the high cost of state-of-the-art LISP tools and hardware, and the poor integration of LISP with other languages (making embedded applications difficult).&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Would they encounter the same barriers today, twenty-four years later?&lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-weight: bold;"&gt;Low availability of LISP on a wide variety of conventional computers&lt;/span&gt;: Now we have commercial implementations and open source Lisps, working on most computers and operating systems.&lt;br /&gt;&lt;br /&gt;2.&lt;span style="font-weight: bold;"&gt;High cost of state-of-the-art LISP tools and hardware&lt;/span&gt;: The hardware issue has faded away since Lisp machines gave way to general purpose computers. And Lisp is no more memory intensive than Java or .NET. Of the commercial Lisps, &lt;a href="http://www.lispworks.com/"&gt;LispWorks&lt;/a&gt; is affordable for normal mortals, and certainly the &lt;a href="http://www.franz.com/"&gt;Allegro products&lt;/a&gt; are within reach of NASA. And there are several good, free, open source CLs.&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;Poor integration of LISP with other languages&lt;/span&gt;: An issue only if your mindset is 1984. Nowadays, to integrate with a Lisp program, you'd treat it like any other network resource -- like an RDBMS, or a web service.&lt;br /&gt;&lt;br /&gt;I wonder what is the state of the &lt;a href="http://www.flownet.com/gat/papers/lisp-java.pdf"&gt;Lisp renaissance within NASA&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[updated to expand remark on item 2]&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-7558495916709697916?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/7558495916709697916/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=7558495916709697916' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7558495916709697916'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7558495916709697916'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/04/lisp-casualty-of-its-time.html' title='Lisp a casualty of its time'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4342408230110607506</id><published>2008-03-03T13:01:00.002-06:00</published><updated>2008-03-03T13:20:19.059-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Rule of Least Power: Bah!</title><content type='html'>&lt;a href="http://www.w3.org/2001/tag/doc/leastPower.html"&gt;The Rule of Least Power&lt;/a&gt;, a W3C TAG finding, posits: "Powerful languages inhibit information reuse." They're observing that it's easy to scrape documents written declaratively using HTML. The problem with using more powerful languages like Javascript, they say, is that "you typically cannot determine what a program in a Turing-complete language will do without actually running it."&lt;br /&gt;&lt;br /&gt;So? As long as the output is a DOM, just run the program and inspect the DOM. &lt;br /&gt;&lt;br /&gt;You already have to use a good HTML parser, right? Now, just run all the script elements on the page too -- obviously, in a restricted environment.&lt;br /&gt;&lt;br /&gt;I'm sure Google and friends must do this. They're not going to leave valuable information on the table.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4342408230110607506?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4342408230110607506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4342408230110607506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4342408230110607506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4342408230110607506'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/03/rule-of-least-power-bah.html' title='Rule of Least Power: Bah!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2485758896679154372</id><published>2008-02-05T21:10:00.000-06:00</published><updated>2008-02-05T21:39:29.242-06:00</updated><title type='text'>Yet another reason to use NoScript</title><content type='html'>Niall Kennedy tells us all &lt;a href="http://www.niallkennedy.com/blog/2008/02/browser-history-sniff.html"&gt;how he grabs your browser history&lt;/a&gt; "for improved user experience".&lt;br /&gt;&lt;br /&gt;1. put links on the page to all the interesting sites you want to identify in the user's history. Have they visited Google? Have the visited certain porn sites?&lt;br /&gt;2. put some css for those links that colors them some weird color when they have been a:visited. &lt;br /&gt;3. add some script that crawls the dom looking for links styled that color.&lt;br /&gt;&lt;br /&gt;Voilà. &lt;br /&gt;&lt;br /&gt;Yet another reason I'm glad I've &lt;a href="http://noscript.net/"&gt;turned off most scripting using NoScript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;[Updated to remove a made up porn site domain name that actually is a porn site domain name.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2485758896679154372?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.niallkennedy.com/blog/2008/02/browser-history-sniff.html' title='Yet another reason to use NoScript'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2485758896679154372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2485758896679154372' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2485758896679154372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2485758896679154372'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/02/yet-another.html' title='Yet another reason to use NoScript'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-8679821551057792396</id><published>2008-02-04T19:02:00.000-06:00</published><updated>2008-02-05T20:21:25.650-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='football'/><title type='text'>Eli can't get no respect</title><content type='html'>[Update Feb 5: they've fixed the headline, but I just noticed the caption at the right still says "Super Bowl XLI". So that explains it. To build yesterday's Super Bowl results page they just grabbed last year's. Then they attempt the replacements s/Peyton/Eli/g and s/XLI/XLII/g. Probably they left off the 'g'!]&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.timesonline.co.uk/tol/sport/us_sport/article3308680.ece"&gt;One Manning's as good as another to the British&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_pMQ_v-5RTNM/R6e2maIFtKI/AAAAAAAAACs/IY9uPqXqgvo/s1600-h/peyton+eli+miracle.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_pMQ_v-5RTNM/R6e2maIFtKI/AAAAAAAAACs/IY9uPqXqgvo/s320/peyton+eli+miracle.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5163296268768097442" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-8679821551057792396?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.timesonline.co.uk/tol/sport/us_sport/article3308680.ece' title='Eli can&apos;t get no respect'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/8679821551057792396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=8679821551057792396' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8679821551057792396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8679821551057792396'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/02/eli-cant-get-no-respect.html' title='Eli can&apos;t get no respect'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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://bp3.blogger.com/_pMQ_v-5RTNM/R6e2maIFtKI/AAAAAAAAACs/IY9uPqXqgvo/s72-c/peyton+eli+miracle.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-7485450723668141051</id><published>2008-01-20T21:16:00.000-06:00</published><updated>2008-01-20T21:43:42.612-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><title type='text'>Clojure</title><content type='html'>&lt;a href="http://clojure.sourceforge.net/"&gt;Clojure&lt;/a&gt; is a Lisp that runs on the JVM. I agree with &lt;a href="http://clojure.sourceforge.net/rationale.html"&gt;everything on this page&lt;/a&gt; describing the design rationale. Objects are overrated;  functional and immutable are good. I can't wait to get a breather and figure out whether and where Clojure fits into our technology arsenal.&lt;br /&gt;&lt;br /&gt;The real measure will be how well it can leverage the Java platform. There are plenty of great languages, but they have inconsistent support for, say, sockets, or window systems. Can I override a protected method of a Swing base class?  Can I connect to an HTTPS server? &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; has knocked Java integration out of the park, so you get all that capability for free, plus a powerful language.&lt;br /&gt;&lt;br /&gt;Update: I think the bullet point "Extend Java in Java, consume Java from Clojure" on the rationale page suggests you can't easily write a Swing app in Clojure. Shoot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-7485450723668141051?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/7485450723668141051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=7485450723668141051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7485450723668141051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7485450723668141051'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/01/clojure.html' title='Clojure'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-8899940584749515518</id><published>2008-01-20T14:21:00.000-06:00</published><updated>2008-01-20T14:41:40.364-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='jruby'/><category scheme='http://www.blogger.com/atom/ns#' term='javafx'/><title type='text'>RIA using JRuby and Web Start</title><content type='html'>I went dark over the last eight weeks, building a rich web application to integrate with our product. It's been years since I built a desktop GUI application, but I was pretty good at it once. It's not always a lot of fun. But some things a man just has to do himself.&lt;br /&gt;&lt;br /&gt;The application does tons of vector drawing.... it draws hundreds of thousands, even millions, of line segments. Yet it needed to be responsive... scrolling, zooming, panning. It's data intensive, too. It downloads dozens of megabytes of data for each view. I needed to develop this program fast, so I needed a programming system and platform allowing me to iterate and adapt to new requirements recursively revealed. I preferred a declarative graphics language where possible, and for any procedural code, a powerful dynamic language. Ideally the program should run on all OS platforms; but the business could probably tolerate a Windows only solution, if that offered superior results. I made tradeoffs among these requirements.&lt;br /&gt;&lt;br /&gt;I was not constrained by download footprint, a concern which eliminates Java from consideration in lots of other scenarios. Anyway, &lt;a title="that problem is going away soon" href="https://jdk6.dev.java.net/6uNea.html" id="xpmp"&gt;that problem is going away soon&lt;/a&gt;, they tell us.&lt;br /&gt;&lt;br /&gt;So here's the spoiler: I chose Java Web Start + JRuby. And now a short dissertation on how I arrived at that choice:&lt;br /&gt;&lt;br /&gt;I looked to browser and browser++ technologies like SVG, Flex, AIR, Silverlight, Java applets/Web Start/JavaFX. (Open Laszlo deserves a look too, but I didn't eval it). It would be great for this app to run within the browser -- that would be the most seamless experience. But using an out-of-browser technology like AIR or Web Start isn't a deal breaker &lt;a title="if you do it right" href="http://hughw.blogspot.com/2007/10/rich-web-applications.html" id="wfwc"&gt;if you do it right&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;SVG was very promising. It would be a pure browser solution. I really valued the declarative model and the standards alignment. But it does not work in IE. I also did some performance experiments with Opera, Safari, and Firefox. Drawing polylines of a hundred thousand points or so, Opera and Safari performed well, but Firefox performed poorly. It's &lt;i&gt;conceivable&lt;/i&gt;, if unlikely, that I could distribute the app as a FF-only solution -- even if I bottle it up as a a XULRunner app. But the FF performance was inadequate. And distributing only for Safari or Opera is not realistic.&lt;br /&gt;&lt;br /&gt;I made a significant evaluation effort with Flex/AIR. Surprisingly I learned that the Flex 2-D graphics model is procedural, not declarative. You can, however, bottle up your procedures and use them declaratively from mxml, the Flex XML language. I felt I was going to spend a significant amount of time learning Flex -- time I needed to spend on my app -- and that I needed the assistance of tools like Flexbuilder. I also became concerned that I was developing a program away from the design center of Flex. Would I encounter design/ performance constraints?&lt;br /&gt;&lt;br /&gt;Silverlight performed very well, and it's got an XML declarative model just like SVG, with the power of a bunch of WPF components to boot. I was confident that all the capabilities of the Windows platform would be available to my program. Microsoft distributes Silverlight for Windows and Mac, but not Linux, which they are leaving to Novell. I read that as: No Linux. But Windows and Mac are enough coverage, even if I would be sorry to leave aside my Ubuntu dev machine. My fate on the Mac would be in Redmond's hands, of course. &lt;a title="Does Microsoft have my best interests at heart" href="http://hughw.blogspot.com/2007/11/i-was-just-thinking-that.html" id="ys04"&gt;Does Microsoft have my best interests at heart&lt;/a&gt; ?&lt;br /&gt;&lt;br /&gt;Java applets or Web Start, using Java 2D, I also knew to be capable of these rendering tasks. I'm satisfied that I can make Java applications now &lt;a title="that look pretty sweet" href="https://substance.dev.java.net/" id="cmu1"&gt;that look pretty sweet&lt;/a&gt;. The down sides were the procedural approach and the static Java language. It's the 1999 state of the art. Layout code so impenetrable you need GUI builders.&lt;br /&gt;&lt;br /&gt;JavaFX deserves a separate mention. The capabilities of the entire Java platform are there for you. Yet you program in a declarative/dynamic language optimized for building Java 2D apps. Perfect! Unfortunately, it's pre-alpha. Sun hasn't yet released it under a license allowing you to put your work into a customer's hands.&lt;br /&gt;&lt;br /&gt;I wanted the wide reach of Java. I think that the 5% of customers on non-Windows platforms may be more important than their numbers.&lt;br /&gt;&lt;br /&gt;I also wanted the enormous hardened Java platform. It's as capable as the Windows platform. You won't encounter many problems you can't address or workaround.&lt;br /&gt;&lt;br /&gt;Couldn't I have all that, plus a dynamic language to stitch it all together?&lt;br /&gt;&lt;br /&gt;Guess what. JRuby is stable and 1.x. It's dynamic, yet it compiles on the fly to JVM byte codes. It's got great Java integration, meaning you can invoke any Java API. &lt;a title="Profligacy" href="http://ihate.rubyforge.org/profligacy/index.html" id="bk:t"&gt;Profligacy&lt;/a&gt; is a terse little Ruby lib for stitching up Swing components. JRuby's just a jar I download with my Web Start app, and launch with the main Ruby script from my Java entry point. The rest of the program is in Ruby, occasionally calling into Java libraries. No, there's no declarative GUI language here. It's one of the tradeoffs.&lt;br /&gt;&lt;br /&gt;My work environment: Fire up NetBeans for its good Ruby editor. In a command window kick off jirb and execute a script to load and run my main code. Edit code and reload it into the running program in jirb. Lather, rinse, repeat.&lt;br /&gt;&lt;br /&gt;I would argue that JRuby &lt;i&gt;accelerated&lt;/i&gt; my application's performance, because I iterated and applied two major architectural optimizations that would have introduced impenetrable spaghetti in Java. The bottleneck for speed and responsiveness has never been JRuby. It turned out that even Java2D + acceleration could not keep up acceptably with the level of interactivity I wanted. The SVG or any other pure declarative approach would have failed (although I think JavaFX's &lt;a title="scene graph" href="https://scenegraph.dev.java.net/" id="ri70"&gt;scene graph&lt;/a&gt; might be able to optimize the drawing). I had to go in and surgically rearrange the innards of the program. The changes were effective but had low impact on stability, thanks to the flexibility and power of Ruby.&lt;br /&gt;&lt;br /&gt;If  Sun can focus more energy on these dynamic languages built on the JVM, that would be a pretty powerful story: The deep platform capabilities, the broad reach, the rich development environment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-8899940584749515518?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/8899940584749515518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=8899940584749515518' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8899940584749515518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8899940584749515518'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/01/i-went-dark-over-last-eight-weeks.html' title='RIA using JRuby and Web Start'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2656224601465733185</id><published>2008-01-15T23:46:00.000-06:00</published><updated>2008-01-20T11:54:21.874-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>And Speaking of Paul Graham...</title><content type='html'>&lt;a href="http://news.ycombinator.com/item?id=98297"&gt;Arc to be open sourced this winter&lt;/a&gt;. It's going to be hard to top the expectations.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2656224601465733185?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://news.ycombinator.com/item?id=98297' title='And Speaking of Paul Graham...'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2656224601465733185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2656224601465733185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2656224601465733185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2656224601465733185'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/01/and-speaking-of-paul-graham.html' title='And Speaking of Paul Graham...'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-3500188514492113697</id><published>2008-01-14T19:24:00.000-06:00</published><updated>2008-01-14T19:32:06.317-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>The Truth about Lisp</title><content type='html'>Majorly funny. &lt;a href="http://www.secretgeek.net/lisp_truth.asp"&gt;Leon Bambrick wrote&lt;/a&gt; (back in 2006):&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;If you're good enough to use lisp, you'll soon be frustrated with lisp. &lt;a href="http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html"&gt;Lisp is not an adequate lisp&lt;/a&gt;. By the time my bus had made it two blocks I'd written some simple lisp macros that were so powerful they made lisp completely obsolete and replaced it with a new language. Fortunately, that new language was also called lisp. And i was able to prove, mathematically, that the new lisp i'd created was both far superior to lisp in every conceivable way, but also exactly equivalent to lisp in every possible way. I was very excited by this. But also found it very boring....Paul Graham himself was completely written in lisp, by an earlier version of himself, also written in lisp, by an earlier version of lisp. It's lisp, paul graham, lisp, paul graham, all the way down.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3500188514492113697?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.secretgeek.net/lisp_truth.asp' title='The Truth about Lisp'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3500188514492113697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3500188514492113697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3500188514492113697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3500188514492113697'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/01/truth-about-lisp.html' title='The Truth about Lisp'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5969912226373057187</id><published>2008-01-10T20:22:00.000-06:00</published><updated>2008-01-10T22:25:01.715-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='relational'/><title type='text'>Why objects suck</title><content type='html'>&lt;span style="font-family:courier new;"&gt;class Curve {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    float[] data;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Color color;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Plot {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     Curve[] curves;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     void addCurve(Curve c);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     void removeCurve(String curveName)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"No, no, no... you're mixing in style information. Pull the style out of &lt;span style="font-family:courier new;"&gt;Curve &lt;/span&gt;and separate the concerns." Oh. OK...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Curve {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     String name;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     float[] data;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class CurveStyle {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    String curveName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Color color;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;class Plot {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     Curve[] curves;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     void addCurve(Curve c);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     void removeCurve(String curveName);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    void setCurveStyle(String curveName, CurveStyle style);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, all right then! I'm sure this in a patterns book somewhere. I feel warm satisfaction with the pure, objectified minimum entropy of my factorization.  Until I implement &lt;span style="font-family:courier new;"&gt;Plot.removeCurve&lt;/span&gt;... oh shit... I have to search for all the dangling CurveStyles referring to the curve, and delete them. As OO programmers we do loads of that every day. You come to think of it as natural. The best OO languages have list comprehensions that make it easier to do. That's nice, but it's not enough. The problem is that "objects" aren't a logical model. &lt;br /&gt;&lt;br /&gt;Wouldn't it be more "natural" for the dangling CurveStyles to delete themselves when no longer relevant? There's a logical model for that, the relational model:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Style&lt;/b&gt;&lt;table border="2"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CurveName&lt;/th&gt;&lt;th&gt;Color&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MSFT&lt;/td&gt;&lt;td&gt;Red&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GOOG&lt;/td&gt;&lt;td&gt;Blue&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Curve&lt;/b&gt;&lt;table border="2"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CurveName&lt;/th&gt;&lt;th&gt;Data&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MSFT&lt;/td&gt;&lt;td&gt;1,4,-9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GOOG&lt;/td&gt;&lt;td&gt;13,2,22&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Logic tells you that the style row cannot exist when the Curve row has been deleted. A foreign key relationship forces the system to delete the style when you delete the curve. &lt;br /&gt;&lt;br /&gt;I want my programming language to do that for me, and that's part of &lt;a href="http://hughw.blogspot.com/2005/08/i-need-new-language-rel.html"&gt;what I was wishing for two years ago&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5969912226373057187?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5969912226373057187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5969912226373057187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5969912226373057187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5969912226373057187'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2008/01/why-objects-suck.html' title='Why objects suck'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-7885331849646106589</id><published>2007-12-18T20:10:00.000-06:00</published><updated>2007-12-18T21:00:18.335-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><title type='text'>FIQL: Query language for feeds</title><content type='html'>My first reaction to &lt;a href="http://www.ietf.org/internet-drafts/draft-nottingham-atompub-fiql-00.txt"&gt;Mark Nottingham's FIQL draft&lt;/a&gt; for querying Atom and RSS feeds was: Do we really need to bake in a prescription for constructing query URLs? Section 4 seems to suggest that.  It seems to take the control over the URL namespace away from the server.&lt;br /&gt;&lt;br /&gt;Here's Mark's example  HTTP FIQL  (I'm already saying "fickle") query:&lt;br /&gt;&lt;pre style="font-weight: bold;"&gt;http://example.org/feed.rss?title==*great*;ex:rating=gt=4&lt;/pre&gt;Element names become the query keys. So if your feed language has element &amp;lt;ex:rating&amp;gt;, you can use that as a query key.&lt;br /&gt;&lt;br /&gt;FIQL describes rules for constructing URLs based on your &lt;span style="font-style: italic;"&gt;content type&lt;/span&gt;. Contrast that to HTML forms which prescribe how to construct URLs based on &lt;span style="font-style: italic;"&gt;content&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Is that so bad? It's a little too API-like for me. Any Atom feed now has that query namespace imposed on them: If you want to honor queries, these terms become part of your URI space.  Amazon, Blogger,  you, I all have this URI subspace  imposed on us.&lt;br /&gt;&lt;br /&gt;If, instead, we define a FIQL content type,  &lt;span style="font-family:courier new;"&gt;application/fiql&lt;/span&gt;,  and you POST a FIQL document, the server can respond with the query result, or can construct a URI of its own design and redirect to it.&lt;br /&gt;&lt;br /&gt;The server retains complete control of its URI namespace.&lt;br /&gt;&lt;br /&gt;I'm interested in how we work through this issue because &lt;a href="http://witsml.blogspot.com/2005/06/witsmlrest.html#c1273806399478634501"&gt;I just suggested a similar strategy for WITSML queries&lt;/a&gt; a few days ago.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-7885331849646106589?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/7885331849646106589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=7885331849646106589' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7885331849646106589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7885331849646106589'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/12/fiql-query-language-for-feeds.html' title='FIQL: Query language for feeds'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5533101305175406276</id><published>2007-11-16T19:28:00.000-06:00</published><updated>2007-11-16T19:47:00.587-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>What is wrong with this picture?</title><content type='html'>&lt;span style="font-family:courier new;"&gt;Server: Microsoft-IIS/6.0 &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;X-Powered-By: ASP.NET &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;content-disposition: attachment; filename=Hill%20Country%20water%20issues[1].ppt &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Content-Type: application/unknown &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;IIS servers don't come provisioned with the .ppt extension mapped to &lt;span style="font-family: courier new;"&gt;application/vnd.ms-powerpoint&lt;/span&gt;? Microsoft server? Microsoft application?&lt;br /&gt;&lt;br /&gt;What hope can there be for &lt;a href="http://www.w3.org/2001/tag/doc/mime-respect"&gt;authoritative metadata&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;My Firefox browser figures it out just fine, and launches Open Office. Presumably FF went through &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/section-content-type-sniffing.html"&gt;all this first&lt;/a&gt;, just to determine it to be &lt;span style="font-family: courier new;"&gt;application/octet-stream&lt;/span&gt;;  &lt;span style="font-style: italic;"&gt;then&lt;/span&gt; ran a further sniffer to identify it as a Power Point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5533101305175406276?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5533101305175406276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5533101305175406276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5533101305175406276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5533101305175406276'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/11/what-is-wrong-with-this-picture.html' title='What is wrong with this picture?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-3796870650611847149</id><published>2007-11-06T18:41:00.000-06:00</published><updated>2007-11-06T19:11:53.323-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><title type='text'>It's the hyperlinks, Stupid!</title><content type='html'>Henry Story thinks &lt;a href="http://blogs.sun.com/bblfish/entry/echo2_building_web_2_0"&gt;Echo2 is "Web 2.0 in Java"&lt;/a&gt;, and &lt;a style="border-bottom-style: groove;" href="http://demo.nextapp.com/Demo/app"&gt;they do have a killer demo&lt;/a&gt;. But it's &lt;a style="border-bottom-style: groove;" href="http://hughw.blogspot.com/2007/06/ria-can-really-suck.html"&gt;yet another example&lt;/a&gt; of incredibly brilliant developers going to great lengths to bring the desktop app to the browser, and ignoring that the value of the web lies in &lt;span style="font-style: italic;"&gt;hyperlinks&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So navigate that demo: Click the "Next" arrow. Your address bar doesn't change even though you have navigated to what most people would call a clearly identifiable different resource.&lt;br /&gt;&lt;br /&gt;I can't give you the link to "page 2" because it isn't addressable on the web. Sorry. Go to page 1, then click to go to page 2.&lt;br /&gt;&lt;br /&gt;Under the hood, it's the usual collection of RPCs masquerading as URLs -- some GET, some POST -- using port 80 since we know it's open, after all. Every single GET uses all the usual tricks to make sure that nothing -- not even JPEGs -- gets cached.&lt;br /&gt;&lt;br /&gt;(Why don't we just give Javascript in browsers an API to open up a socket and execute any protocol you like? Seriously: Wouldn't that be better than abusing HTTP? If you don't want to use the HTTP protocol,  you shouldn't have to.)&lt;br /&gt;&lt;br /&gt;I love the look of that demo, and I think their technology is clever. With a little effort I am sure they can make the framework webby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3796870650611847149?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3796870650611847149/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3796870650611847149' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3796870650611847149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3796870650611847149'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/11/its-hyperlinks-stupid.html' title='It&apos;s the hyperlinks, Stupid!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-337334276706804448</id><published>2007-11-03T21:08:00.000-05:00</published><updated>2007-11-03T21:24:26.158-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><title type='text'>I was just thinking that!</title><content type='html'>I've been working on the technology requirements for a "rich web application". All the pieces are  in place for a cross platform solution.  With Javascript, HTML, SVG, and CSS, you can build a pretty rich application without resorting to JavaFX, AIR, Flex, Silverlight, Click Once, or Web Start.&lt;br /&gt;&lt;br /&gt;All the browsers support JS, HTML, SVG and CSS. Except one.  Per &lt;a href="http://blog.mozilla.com/rob-sayre/2007/11/01/browser-war-hardly./"&gt;Rob Sayre&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;If Microsoft were really interested in making life easier for web developers, they could do so, without a standards committee. They would need to fix the (nasty) bugs in IE’s JScript engine, implement SVG, implement canvas, implement more of CSS, support a standard event model, and on and on. Then, the behavior of IE would be a lot closer to Firefox, Opera, and Safari.&lt;/blockquote&gt;It's no secret Microsoft doesn't see an advantage in  a web built on cross platform technologies. I'm not very sure about Adobe, either.&lt;br /&gt;&lt;br /&gt;Why should we, as a a software company, invest in technology from companies that are actively working to subvert what we want to do?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-337334276706804448?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/337334276706804448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=337334276706804448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/337334276706804448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/337334276706804448'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/11/i-was-just-thinking-that.html' title='I was just thinking that!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6843613278868523775</id><published>2007-10-26T21:45:00.000-05:00</published><updated>2007-10-30T00:08:04.581-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><title type='text'>Rich Web Applications</title><content type='html'>Here's the five step test to determine whether your "&lt;a href="http://hughw.blogspot.com/2007/05/ria-fill-er-up.html"&gt;rich internet application&lt;/a&gt;" is a  rich &lt;span style="font-weight: bold;"&gt;web&lt;/span&gt; application:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You click on a hyperlink in a web browser.&lt;/li&gt;&lt;li&gt;Your RWA opens up, and updates its code if necessary&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Your RWA renders the document, and you edit it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You save the file -- &lt;span style="font-style: italic;"&gt;to its URL&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You e-mail the hyperlink to someone; they open up the document and see your edits.&lt;/li&gt;&lt;/ol&gt;You should be able to click a link to a Word document, edit the document, and save it -- to the URL you got it from. The RWA is a rich, articulate way to render and edit particular kinds of documents.&lt;br /&gt;&lt;br /&gt;If saving isn't a feature of your app, fine: But honor (1) ,(2), and (3).&lt;br /&gt;&lt;br /&gt;You can do this with .Net Click Once, Java Web Start, and for all I know, Adobe AIR. But the design of the first two, at least originally,  amounted to a way to install and launch your application by clicking a hyperlink, and update the code automatically. Worthy objectives. But no actual Web Start or Click Once apps I have used can do this: Click a document, edit it, save on server. You couldn't &lt;span style="font-style: italic;"&gt;possibly&lt;/span&gt; do it with Web Start until JDK 1.5. And to do it with Click Once you have to sign the application and party in the registry.&lt;br /&gt;&lt;br /&gt;The first thing is to &lt;span style="font-weight: bold;"&gt;register your RWA as the helper application&lt;/span&gt; for your document's mime type and file extension. Web Start enabled doing so when they added &amp;lt;association&amp;gt; to the JNLP 1.5 format. Web Start registers itself as the handler for your file extension; the browser launches javaws to open your file, and javaws looks at the file extension and invokes your application. Or: sign your Click Once application and you can set your application as the mime type handler in the registry.&lt;br /&gt;&lt;br /&gt;That makes your application launchable when you click a link.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;You will have to design the URL of the document into the document itself&lt;/span&gt;. Browsers download documents and save them to temp files; they  don't tell you the URL of the document. When the browser launches your helper app, your app needs to know where to HTTP PUT updates, or to DELETE the resource. You can also design in other URLS your client understands: a base URL under which you can POST to implement "File/New", for example. Notice  &lt;a href="http://www.ietf.org/rfc/rfc4287.txt"&gt;Atom has &amp;lt;link rel="self"&amp;gt; &lt;/a&gt;and &lt;a href="http://tools.ietf.org/html/rfc5023"&gt;Atompub service documents&lt;/a&gt; tell you where to POST things; you could build a good RWA around that scaffolding. Make your own documents describe how to navigate the states of your application by traversing hyperlinks.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Your RWA should  have an address bar&lt;/span&gt;. Show the users where they are. Let them type in any URL they want to. If they type in one for a mime-type you don't understand, hand off the download to the registered helper application, or back to the browser.&lt;br /&gt;&lt;br /&gt;All those buttons desktop apps use to navigate? Menu commands? Keyboard shortcuts? Back them with URLs you GET from or POST to. Display each URL in the address bar as the user traverses your application. After clicking any button that does GET, whatever you see in your RWA should be what your friend will see when you email him the URL in the address bar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Automatic code update (step 2) is a necessary feature for a RWA&lt;/span&gt;.  It's not enough just to have a link launchable application. You can evolve your schema, and change the meanings of elements in your document format, as long as you know that only the most modern code, that understands the new meanings, will be interpreting the document.&lt;br /&gt;&lt;br /&gt;Make the extra effort to leverage the web architecture, and I won't blog about &lt;a href="http://hughw.blogspot.com/2007/06/ria-can-really-suck.html"&gt;your beautiful but shitty application&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6843613278868523775?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6843613278868523775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6843613278868523775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6843613278868523775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6843613278868523775'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/10/rich-web-applications.html' title='Rich Web Applications'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5762245406077124290</id><published>2007-10-02T17:27:00.000-05:00</published><updated>2007-10-02T17:42:43.864-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>That killer web platform</title><content type='html'>Here we go again with this specious argument that the Web isn't rich enough. &lt;a href="http://www.joelonsoftware.com/items/2007/09/18.html"&gt;Joel thinks there's a new killer platform&lt;/a&gt; out there to be invented, that will seize control of web applications as Windows seized the desktop. &lt;br /&gt;&lt;br /&gt;Ain't gonna happen. Or, if you prefer: Already happened.&lt;br /&gt;&lt;br /&gt;Right there in his own essay is the reason.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;And that’s exactly where we are with Ajax development today. Sure, yeah, the usability is much better than the first generation DOS apps, because we’ve learned some things since then. But Ajax apps can be inconsistent, and have a lot of trouble working together — you can’t really cut and paste objects from one Ajax app to another, for example, so I’m not sure how you get a picture from Gmail to Flickr. Come on guys, Cut and Paste was invented 25 years ago.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;See, Ajax gives you the capability to turn a perfectly good hypertext application into a miserable facsimile of a 1980's PC. And you're not going to fix Ajax by adding a bunch of new APIs. Applications need more constraints, not fewer. &lt;br /&gt;&lt;br /&gt;Think how absurd it is that you can't copy a picture from GMail to Flickr. The tools are right there, but the application designers do not leverage them. a) Right click photo in GMail. b) &amp;quot;Copy link location&amp;quot;. c) Paste hyperlink into Flickr. d) Flickr either downloads photo from GMail or references it.  No new APIs needed -- it's all just hyperlinks.&lt;br /&gt;&lt;br /&gt;It's great, and necessary, to extend HTML with rich widgets. We'll never capture them all, declaratively, in a common HTML. I am, even as we speak, constructing a Flash widget. But the web is the platform. Any time I push information deep into my widget -- text that could be searchable, graphics that could be linkable -- and hide it from the web, I've failed to leverage the platform.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5762245406077124290?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.joelonsoftware.com/items/2007/09/18.html' title='That killer web platform'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5762245406077124290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5762245406077124290' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5762245406077124290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5762245406077124290'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/10/that-killer-web-platform.html' title='That killer web platform'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-9126356672189317038</id><published>2007-09-13T20:18:00.000-05:00</published><updated>2007-09-13T20:47:06.159-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='whois funny'/><title type='text'>Whois spam</title><content type='html'>I ran whois on microsoft.com. My whois by default returns a substring match for the search term, and a lot of names have microsoft.com in them. It's hard to pick a favorite:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hughw@gx150:~$ whois microsoft.com | sed -n -e "s/Server Name: \(.*\)/\\1/p"&lt;br /&gt;   MICROSOFT.COM.ZZZZZZ.MORE.DETAILS.AT.WWW.BEYONDWHOIS.COM&lt;br /&gt;   MICROSOFT.COM.ZZZZZ.GET.LAID.AT.WWW.SWINGINGCOMMUNITY.COM&lt;br /&gt;   MICROSOFT.COM.ZZZOMBIED.AND.HACKED.BY.WWW.WEB-HACK.COM&lt;br /&gt;   MICROSOFT.COM.ZZZ.IS.0WNED.AND.HAX0RED.BY.SUB7.NET&lt;br /&gt;   MICROSOFT.COM.WILL.LIVE.FOREVER.BECOUSE.UNIXSUCKS.COM&lt;br /&gt;   MICROSOFT.COM.WILL.BE.SLAPPED.IN.THE.FACE.BY.MY.BLUE.VEINED.SPANNER.NET&lt;br /&gt;   MICROSOFT.COM.WILL.BE.BEATEN.WITH.MY.SPANNER.NET&lt;br /&gt;   MICROSOFT.COM.WAREZ.AT.TOPLIST.GULLI.COM&lt;br /&gt;   MICROSOFT.COM.TOTALLY.SUCKS.S3U.NET&lt;br /&gt;   MICROSOFT.COM.STINKT.NACH.WIESBADEN.VISIT.CALITEC.NET&lt;br /&gt;   MICROSOFT.COM.SMELLS.SIMPLECODES.COM&lt;br /&gt;   MICROSOFT.COM.SHOULD.GIVE.UP.BECAUSE.LINUXISGOD.COM&lt;br /&gt;   MICROSOFT.COM.RAWKZ.MUH.WERLD.MENTALFLOSS.CA&lt;br /&gt;   MICROSOFT.COM.OHMYGODITBURNS.COM&lt;br /&gt;   MICROSOFT.COM.MORE.INFO.AT.WWW.BEYONDWHOIS.COM&lt;br /&gt;   MICROSOFT.COM.LOVES.ME.KOSMAL.NET&lt;br /&gt;   MICROSOFT.COM.LIVES.AT.SHAUNEWING.COM&lt;br /&gt;   MICROSOFT.COM.IS.NOT.YEPPA.ORG&lt;br /&gt;   MICROSOFT.COM.IS.NOT.HOSTED.BY.ACTIVEDOMAINDNS.NET&lt;br /&gt;   MICROSOFT.COM.IS.NOT.AS.COOL.AS.SIMPLECODES.COM&lt;br /&gt;   MICROSOFT.COM.IS.IN.BED.WITH.CURTYV.COM&lt;br /&gt;   MICROSOFT.COM.IS.HOSTED.ON.PROFITHOSTING.NET&lt;br /&gt;   MICROSOFT.COM.IS.GOD.BECOUSE.UNIXSUCKS.COM&lt;br /&gt;   MICROSOFT.COM.IS.A.STEAMING.HEAP.OF.FUCKING-BULLSHIT.NET&lt;br /&gt;   MICROSOFT.COM.IS.A.MESS.TIMPORTER.CO.UK&lt;br /&gt;   MICROSOFT.COM.HOSTED.BY.CALITEC.NET&lt;br /&gt;   MICROSOFT.COM.HAS.ITS.OWN.CRACKLAB.COM&lt;br /&gt;   MICROSOFT.COM.HAS.A.PRESENT.COMING.FROM.HUGHESMISSILES.COM&lt;br /&gt;   MICROSOFT.COM.GOT.OWNED.BY.CALITEC.NET&lt;br /&gt;   MICROSOFT.COM.FILLS.ME.WITH.BELLIGERENCE.NET&lt;br /&gt;   MICROSOFT.COM.DRINKS.LISTERINE.NET&lt;br /&gt;   MICROSOFT.COM.CAN.GO.FUCK.ITSELF.AT.SECZY.COM&lt;br /&gt;   MICROSOFT.COM.ARE.GODDAMN.PIGFUCKERS.NET.NS-NOT-IN-SERVICE.COM&lt;br /&gt;   MICROSOFT.COM.AND.MINDSUCK.BOTH.SUCK.HUGE.ONES.AT.EXEGETE.NET&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For completeness here's the whois version:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hughw@gx150:~$ whois --version&lt;br /&gt;Version 4.7.11ubuntu1.&lt;br /&gt;&lt;br /&gt;Report bugs to &amp;lt;md+whois@linux.it&amp;gt;.&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-9126356672189317038?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/9126356672189317038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=9126356672189317038' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9126356672189317038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/9126356672189317038'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/09/whois-spam.html' title='Whois spam'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-8037874836042421190</id><published>2007-09-13T19:07:00.000-05:00</published><updated>2007-09-13T19:38:48.863-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='semweb'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Oh crap, I just invented Prolog</title><content type='html'>Following a link trail that started with &lt;a href="http://intertwingly.net/blog/2007/09/12/Dare-Takes-a-Look-at-CouchDB"&gt;a discussion of CouchDB&lt;/a&gt;, I just found &lt;a href="http://bitworking.org/news/159/Megadata-Follow-up#X1"&gt;this old comment&lt;/a&gt; posted by &lt;a href="http://dehora.net/journal/"&gt;Bill de hÓra&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Perhaps we can go top down - write smart analysers to dynamically denorm data based on usage patterns; indeed database optimisation is an industry sector. But another, dumber, option is bottom up - avoid the initial structural 'typing' step and normalise where necessary....Normalisation can be done later on, based on demand.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I don't even want to design database schemas. To hell with modeling. I just want a system that takes a great, undifferentiated pile of facts, and infers entities based on the statistics, primarily of the content, but also on the access patterns. Actually I don't even care that it infer entities; that's an implementation detail I don't need to know about. It would just optimize for query time, or insert time, or some combination; inferring some table structure will probably help it do that. &lt;br /&gt;&lt;br /&gt;Why do I need to tell the computer the relations in my data? All I should have to do is insert facts, as triples. When I ask it a question, I want those facts returned (or maybe other conclusions). &lt;br /&gt;&lt;br /&gt;Is a really tweaked Prolog the ultimate DBMS?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-8037874836042421190?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://bitworking.org/news/159/Megadata-Follow-up#X1' title='Oh crap, I just invented Prolog'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/8037874836042421190/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=8037874836042421190' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8037874836042421190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8037874836042421190'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/09/oh-crap-i-just-invented-prolog.html' title='Oh crap, I just invented Prolog'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6698199986839082126</id><published>2007-09-09T18:27:00.000-05:00</published><updated>2007-09-09T18:57:58.767-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom opml list'/><title type='text'>Using Atom to manage lists of Atom feeds</title><content type='html'>&lt;a href="http://philwilson.org/blog/2007/09/dangers-of-relying-on-others.html"&gt;As Phil Wilson  does&lt;/a&gt;, I have come to rely on &lt;a href="http://planet.intertwingly.net/"&gt;Planet Intertwingly&lt;/a&gt; as a substitute, largely, for maintaining my own list of interesting feeds. But now Phil wants to filter Sam's picks; he wants to select favorites from the &lt;a href="http://planet.intertwingly.net/opml.xml"&gt;PI OPML&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;That raises the interesting prospect that we now need Atom feeds for OPML updates. When Sam adds a new feed, I would want to check it out. Since OPML content is, by definition, a list, I guess Sam could mark up the feed with &lt;a href="http://msdn2.microsoft.com/en-us/xml/bb190612.aspx#Simple"&gt;Simple List Extensions&lt;/a&gt;. I'm temporarily suspending &lt;a href="http://hughw.blogspot.com/2006/04/simple-list-extensions-invidious.html"&gt;my suspicion of SLE&lt;/a&gt;, because PI's growing and shrinking list of feeds is clearly unlike an ordinary, infinitely growing feed.&lt;br /&gt;&lt;br /&gt;Using Atom to manage lists of Atom feeds demonstrates that Atom captures a powerful abstraction.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6698199986839082126?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://philwilson.org/blog/2007/09/dangers-of-relying-on-others.html' title='Using Atom to manage lists of Atom feeds'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6698199986839082126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6698199986839082126' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6698199986839082126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6698199986839082126'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/09/using-atom-to-manage-lists-of-atom.html' title='Using Atom to manage lists of Atom feeds'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6635389543283490208</id><published>2007-08-15T18:57:00.000-05:00</published><updated>2007-08-15T19:12:13.059-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='carbuntu'/><title type='text'>Acura ITX</title><content type='html'>A year and a half ago, I started following &lt;a href="http://blog.thedarksighed.com/acura_itx/"&gt;this (anonymous?) guy's blog about his project to install an ITX computer in his Acura&lt;/a&gt;. It covers everything: selecting hardware including touch screen and GPS, configuring software (Windows + misc. media toys), installation, and he's recently updated it with new photos. &lt;br /&gt;&lt;br /&gt;I'd do things a little differently: Carbuntu (hey... carbuntu.org seems to have disappeared...), and I'd want a HSDPA or EVDO card and a dual core Intel... but there's little doubt mine would come out a mess. This fellow's really put in the polish.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6635389543283490208?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.thedarksighed.com/acura_itx/' title='Acura ITX'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6635389543283490208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6635389543283490208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6635389543283490208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6635389543283490208'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/08/acura-itx.html' title='Acura ITX'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-477122327669013152</id><published>2007-08-15T10:46:00.001-05:00</published><updated>2009-08-08T07:24:32.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><title type='text'>Restful Servlets + JSP: My framework</title><content type='html'>&lt;a href="http://www.innoq.com/blog/st/2007/08/15/java_web_frameworks.html"&gt;Stefan &lt;/a&gt;and &lt;a href="http://www.dehora.net/journal/2007/08/lying_down_in_the_road.html"&gt;Bill &lt;/a&gt;asked, so here's how I do it (with a tip of the hat to &lt;a href="http://www.django.com/"&gt;Django&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;It is a micro framework. You subclass &lt;a href="#restservlet"&gt;RestServlet&lt;/a&gt; and declare some URL patterns to match, and handlers for them. The base class parses the URI, sets attributes in the ServletRequest object based on the URI pattern, and invokes your handlers. &lt;br /&gt;&lt;br /&gt;So here's how a simple BlogServlet would look: &lt;br /&gt;&lt;br /&gt;[updated: fixed path to JSP, added a note above about attributes].&lt;br /&gt;[update: added Apache license]&lt;br /&gt;&lt;pre style="font:75%; color=c8c8c8"&gt;&lt;br /&gt;Copyright 2007 Wellstorm Development, LLC&lt;br /&gt;&lt;br /&gt;   Licensed under the Apache License, Version 2.0 (the "License");&lt;br /&gt;   you may not use this file except in compliance with the License.&lt;br /&gt;   You may obtain a copy of the License at&lt;br /&gt;&lt;br /&gt;       http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;&lt;br /&gt;   Unless required by applicable law or agreed to in writing, software&lt;br /&gt;   distributed under the License is distributed on an "AS IS" BASIS,&lt;br /&gt;   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;   See the License for the specific language governing permissions and&lt;br /&gt;   limitations under the License.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-size: 75%;"&gt;&lt;br /&gt;public class BlogServlet extends &lt;a href="#restservlet"&gt;RestServlet&lt;/a&gt;{&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;   /**&lt;br /&gt;    * GET an entry. The base class will populate the "entryId" attribute before calling invoke.&lt;br /&gt;    * We told it to do so below, when we defined entryIdentifier.&lt;br /&gt;    */&lt;br /&gt;   RequestHandler entryGetHandler = new RequestHandler(){&lt;br /&gt;&lt;br /&gt;       public void invoke(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;           try {&lt;br /&gt;               // The base class has parsed the URI and populated the request with&lt;br /&gt;               // the "entryId" attribute&lt;br /&gt;               String entryId = (String)request.getAttribute("entryId");&lt;br /&gt;               String forward = "/WEB-INF/entry.jsp";&lt;br /&gt;               request.setAttribute("entryHTML", getEntryHTML(entryId));&lt;br /&gt;               request.setAttribute("entryTitle", getEntryTitle(entryId));&lt;br /&gt;              &lt;br /&gt;               request.getRequestDispatcher(forward).forward(request, response);&lt;br /&gt;           } catch (Exception e) {&lt;br /&gt;               response.sendError(404);&lt;br /&gt;           }&lt;br /&gt;       }         &lt;br /&gt;   };&lt;br /&gt;  &lt;br /&gt;   &lt;br /&gt;   /**&lt;br /&gt;    * POST a new entry to the collection URI&lt;br /&gt;    */&lt;br /&gt;   RequestHandler collectionPostHandler = new RequestHandler(){&lt;br /&gt;&lt;br /&gt;       public void invoke(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;           try {&lt;br /&gt;               String entryId = saveEntry(request, response);  &lt;br /&gt;              &lt;br /&gt;               response.setHeader("Location", buildEntryUri(entryId));&lt;br /&gt;               response.setStatus(201);&lt;br /&gt;               //write out some HTML or maybe the entry itself.&lt;br /&gt;               String forward = "/WEB-INF/entry.jsp";&lt;br /&gt;               request.setAttribute("entryHTML", getEntryHTML(entryId));&lt;br /&gt;               request.setAttribute("entryTitle", getEntryTitle(entryId));&lt;br /&gt;              request.getRequestDispatcher(forward).forward(request, response);&lt;br /&gt;           } catch (Exception e) {&lt;br /&gt;               response.sendError(404);&lt;br /&gt;           }&lt;br /&gt;       }         &lt;br /&gt;   };&lt;br /&gt;  &lt;br /&gt;   //Stubbing these in...&lt;br /&gt;   RequestHandler entryPutHandler =null;&lt;br /&gt;   RequestHandler entryDeleteHandler = null;&lt;br /&gt;   RequestHandler collectionGetHandler = null;&lt;br /&gt;&lt;br /&gt;   //&lt;br /&gt;   // One &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt; per URI pattern. &lt;br /&gt;   // Each one tells us how to parse the pattern into attributes, and handlers&lt;br /&gt;   // for HTTP methods on the resources it identifies.&lt;br /&gt;   //&lt;br /&gt;   &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt; entryIdentifier = new ResourceIdentifier(       &lt;br /&gt;           "^/(\\d+)$",                // URI pattern&lt;br /&gt;           new String[] {"entryId"},   // match pattern and insert named request attributes&lt;br /&gt;           entryGetHandler,            // GET handler for entry URIs&lt;br /&gt;           null,                       // no POST handler for entries&lt;br /&gt;           entryPutHandler,            // PUT an entry&lt;br /&gt;           entryDeleteHandler);        // DELETE an entry&lt;br /&gt;                                      &lt;br /&gt;  &lt;br /&gt;   &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt; collectionIdentifier = new ResourceIdentifier(&lt;br /&gt;           "^/$",                      // URI pattern&lt;br /&gt;           collectionGetHandler,            // GET handler for collection would list entries&lt;br /&gt;           collectionPostHandler);          // POST handler for collection will add and entry&lt;br /&gt;                                       &lt;br /&gt;  &lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   /**&lt;br /&gt;    * Here's how we tell our base class how to map URIs to handlers:&lt;br /&gt;    */&lt;br /&gt;   protected &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt;[] resourceIdentifiers() {      &lt;br /&gt;       return new &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt;[]{entryIdentifier, collectionIdentifier};&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   // these are just stubs... exercise for the reader.&lt;br /&gt;   private String buildEntryUri(String entryId) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private String saveEntry(HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private Object getEntryTitle(String entryId) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;   private Object getEntryHTML(String entryId) {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's the base RestServlet class. In real life this class also has convenience methods to send redirects, and other standard HTTP stuff.&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-size: 75%;"&gt;&lt;br /&gt;&lt;br /&gt;public abstract class &lt;a name="restservlet"&gt; RestServlet&lt;/a&gt; extends HttpServlet {&lt;br /&gt;&lt;br /&gt;   private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;   private static Logger logger = Logger&lt;br /&gt;           .getLogger(RestServlet.class.getName());&lt;br /&gt;&lt;br /&gt;   protected RestServlet() {&lt;br /&gt;       super();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   protected abstract &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt;[] resourceIdentifiers();&lt;br /&gt;&lt;br /&gt;   /** try calling doGet, doPost, or whatever, on each &lt;a href="#resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt;, until one succeeds. &lt;br /&gt;Uses reflection to reduce bloat.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;   private void doMethod(String methodName, HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;       boolean did = false;&lt;br /&gt;       try {&lt;br /&gt;           // The method must be like e.g.&lt;br /&gt;           // boolean doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;           Method method = ResourceIdentifier.class.getMethod(methodName, new Class[]{HttpServletRequest.class, HttpServletResponse.class});&lt;br /&gt;           Object [] params = new Object[]{request, response};&lt;br /&gt;           for (ResourceIdentifier rid : resourceIdentifiers()) {&lt;br /&gt;               if (did = (Boolean)method.invoke(rid, params)) {&lt;br /&gt;                   break;&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           if (!did) {&lt;br /&gt;               response.sendError(HttpServletResponse.SC_NOT_FOUND);&lt;br /&gt;           }&lt;br /&gt;       } catch (Exception e) {&lt;br /&gt;           logger.log(Level.SEVERE, "Exception in doPost", e);&lt;br /&gt;           throw new ServletException(e);&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doPost(HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;       doMethod ("doPost", request, response);&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doGet(HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;       doMethod ("doGet", request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doPut(HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;       doMethod ("doPut", request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doDelete(HttpServletRequest request,&lt;br /&gt;           HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;       doMethod ("doDelete", request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here's the ResourceIdentifier class. It tells us how to map URI patterns to handlers, and maps matched pattern groups to attribute names&lt;br /&gt;&lt;pre style="font-size: 75%;"&gt;&lt;br /&gt;public class &lt;a name="resourceidentifier"&gt;ResourceIdentifier&lt;/a&gt; {&lt;br /&gt;&lt;br /&gt;   private final Pattern pattern;&lt;br /&gt;   private final String[] attributeNames;&lt;br /&gt;   private final &lt;a href="#requesthandler"&gt;RequestHandler&lt;/a&gt; getHandler;&lt;br /&gt;   private final &lt;a href="#requesthandler"&gt;RequestHandler&lt;/a&gt; putHandler;&lt;br /&gt;   private final &lt;a href="#requesthandler"&gt;RequestHandler&lt;/a&gt; postHandler;&lt;br /&gt;   private final &lt;a href="#requesthandler"&gt;RequestHandler&lt;/a&gt; deleteHandler;&lt;br /&gt;&lt;br /&gt;   public ResourceIdentifier(String regex, String[] attributeNames, RequestHandler getHandler, RequestHandler postHandler,&lt;br /&gt;           RequestHandler putHandler, RequestHandler deleteHandler) {&lt;br /&gt;       this.pattern = Pattern.compile(regex);&lt;br /&gt;       this.attributeNames = attributeNames;&lt;br /&gt;       this.getHandler = getHandler;&lt;br /&gt;       this.postHandler = postHandler;&lt;br /&gt;       this.putHandler = putHandler;&lt;br /&gt;       this.deleteHandler = deleteHandler;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   public ResourceIdentifier(String regex, RequestHandler supportsGet) {&lt;br /&gt;       this(regex, new String[] {}, supportsGet, null, null, null);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public ResourceIdentifier(String regex, String[] attributeNames, RequestHandler supportsGet) {&lt;br /&gt;       this(regex, attributeNames, supportsGet, null, null, null);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public ResourceIdentifier(String regex, RequestHandler supportsGet, RequestHandler supportsPost) {&lt;br /&gt;       this(regex, new String[] {}, supportsGet, supportsPost, null, null);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public ResourceIdentifier(String regex, String[] attributeNames, RequestHandler supportsGet, RequestHandler supportsPost) {&lt;br /&gt;       this(regex, attributeNames, supportsGet, supportsPost, null, null);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public boolean doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;           throws Exception {&lt;br /&gt;&lt;br /&gt;       return doMethod(this.getHandler, request.getPathInfo(), request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public boolean doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;           throws Exception {&lt;br /&gt;&lt;br /&gt;       return doMethod(postHandler, request.getPathInfo(), request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public boolean doPut (HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;           throws Exception {&lt;br /&gt;&lt;br /&gt;       return doMethod(putHandler, request.getPathInfo(), request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public boolean doDelete(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;           throws Exception {&lt;br /&gt;&lt;br /&gt;       return doMethod(deleteHandler, request.getPathInfo(), request, response);&lt;br /&gt;   }&lt;br /&gt; &lt;br /&gt;   /**&lt;br /&gt;    * Test the uri against our pattern. If matched, dispatch to the handler.&lt;br /&gt;    */&lt;br /&gt;   private boolean doMethod(RequestHandler handler, String uri, HttpServletRequest request, HttpServletResponse response) throws Exception {&lt;br /&gt;       if (uri == null){&lt;br /&gt;           uri = "";&lt;br /&gt;       }&lt;br /&gt;       Matcher matcher = pattern.matcher(uri);&lt;br /&gt;       boolean bDid;&lt;br /&gt;       if (matcher.matches()) {&lt;br /&gt;           if (handler == null) {&lt;br /&gt;               response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);&lt;br /&gt;               bDid = true;&lt;br /&gt;           } else {&lt;br /&gt;               dispatch(matcher, request, response, handler);&lt;br /&gt;               bDid = true;&lt;br /&gt;           }&lt;br /&gt;       } else {&lt;br /&gt;           bDid = false;&lt;br /&gt;       }&lt;br /&gt;       return bDid;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;   private void dispatch(Matcher matcher, HttpServletRequest request, HttpServletResponse response,&lt;br /&gt;           RequestHandler listener) throws Exception {&lt;br /&gt;&lt;br /&gt;       // The regex matched. Extract all the named attributes from the URL and&lt;br /&gt;       // set them as attributes on the request. Then invoke RequestHandler.&lt;br /&gt;       int n = matcher.groupCount() ;&lt;br /&gt;       if (n != attributeNames.length) {&lt;br /&gt;           throw new RuntimeException("must have same number of matches as attribute names");&lt;br /&gt;       }&lt;br /&gt;        for (int i = 0; i &lt; n; i++) {&lt;br /&gt;            request.setAttribute(attributeNames[i], matcher.group(i + 1));&lt;br /&gt;        }      &lt;br /&gt;        listener.invoke(request, response);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The RequestHandler interface is the merest slip of a thing:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-size:75%"&gt;&lt;br /&gt;public interface &lt;a name="requesthandler"&gt;RequestHandler&lt;/a&gt; {&lt;br /&gt;    void invoke(HttpServletRequest request, HttpServletResponse response) throws Exception;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-477122327669013152?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.dehora.net/journal/2007/08/lying_down_in_the_road.html' title='Restful Servlets + JSP: My framework'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/477122327669013152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=477122327669013152' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/477122327669013152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/477122327669013152'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/08/restful-servlets-jsp-my-framework.html' title='Restful Servlets + JSP: My framework'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-8842412347313610044</id><published>2007-08-08T02:20:00.000-05:00</published><updated>2007-08-08T02:32:37.498-05:00</updated><title type='text'>We don't need PATCH</title><content type='html'>&lt;a href="http://journals.aol.com/panzerjohn/abstractioneer/entries/2007/08/08/restful-partial-updates-patchranges/1535"&gt;John Panzer asks&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;....if PUT can be used to send just the part you want to change.  This can be made to work but has some major problems that make it a poor general choice. &lt;br /&gt;    * A PUT to a resource generally means "replace", not "update", so it's semantically surprising.&lt;br /&gt;    * In theory it could break write-through caches.  (This is probably equivalent to endangering unicorns.)&lt;br /&gt;    * It doesn't work for deleting optional fields or updating flexible lists such as Atom categories.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We could PUT an instance of a new MIME type, atom-update+xml, and the meaning of that document could be: Please selectively update fields of the entry resource, including optional fields and Atom categories.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-8842412347313610044?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://journals.aol.com/panzerjohn/abstractioneer/entries/2007/08/08/restful-partial-updates-patchranges/1535' title='We don&apos;t need PATCH'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/8842412347313610044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=8842412347313610044' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8842412347313610044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8842412347313610044'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/08/we-dont-need-patch.html' title='We don&apos;t need PATCH'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5520649998200983358</id><published>2007-06-12T17:24:00.000-05:00</published><updated>2007-06-12T17:50:08.479-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><title type='text'>RIA can really suck</title><content type='html'>&lt;a href="http://www.romereborn.virginia.edu/"&gt;Rome Reborn&lt;/a&gt; is somebody's Flash wet dream. The content is spectacular (if you're into Roman history, as I am). But some lame brain has encapsulated all the content behind that one URL. I can't give you links to the interesting parts. I have to give you verbal instructions for navigating to different parts of the site. "Wave your mouse over the initial image until the Colosseum is mostly in view, then click, then...." In other words, it's like any desktop application -- which seems to be the idea behind rich internet applications -- "improve" the web until it sucks as much as Windows.&lt;br /&gt;&lt;br /&gt;It's maddening, because the site contains tons of useful information -- but &lt;span style="font-style:italic;"&gt;none of it is on the web&lt;/span&gt;. It's a black hole from which no information can escape.&lt;br /&gt;&lt;br /&gt;If new RIA tools don't encourage authors to expose linkable resources, they're just going to continue to be irrelevant to the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5520649998200983358?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.romereborn.virginia.edu/' title='RIA can really suck'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5520649998200983358/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5520649998200983358' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5520649998200983358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5520649998200983358'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/06/ria-can-really-suck.html' title='RIA can really suck'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4590865432552201427</id><published>2007-06-09T00:36:00.000-05:00</published><updated>2007-06-09T01:09:52.791-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='testdriven'/><title type='text'>Microsoft vs TestDriven.Net Express</title><content type='html'>A sad Microsoft drone named &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/aa718729.aspx"&gt;Jason&lt;/a&gt; is getting famous for the worst reasons. He's a program manager for MS Visual Studio and he's hassling a &lt;a href="http://weblogs.asp.net/nunitaddin/"&gt;well meaning fellow named Jamie who wrote a unit testing plugin for VS 2005&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Jamie wrote the plugin using VS 2005 Express, the "free" version, and got enough traction that MS made him an MVP. But then Jason noticed that the plugin supports VS Express. Bad Jamie -- no plugins allowed for Express.&lt;br /&gt;&lt;br /&gt;Jamie has published &lt;a href="http://weblogs.asp.net/nunitaddin/archive/2007/05/30/microsoft-vs-testdriven-net-express.aspx"&gt;the fatuous correspondence Jason directed his way&lt;/a&gt;. They took away his MVP, and MS lawyers are sending cease and desist letters.&lt;br /&gt;&lt;br /&gt;Um, the guy is developing free software enhancing the value of all the VS products? Did I mention that part?&lt;br /&gt;&lt;br /&gt;Great coverage from &lt;a href="http://www.theregister.co.uk/2007/06/05/microsoft_mvp_threats/"&gt;The Register&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4590865432552201427?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://weblogs.asp.net/nunitaddin/archive/2007/05/30/microsoft-vs-testdriven-net-express.aspx' title='Microsoft vs TestDriven.Net Express'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4590865432552201427/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4590865432552201427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4590865432552201427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4590865432552201427'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/06/microsoft-vs-testdrivennet-express.html' title='Microsoft vs TestDriven.Net Express'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-119607883135013297</id><published>2007-06-08T11:36:00.000-05:00</published><updated>2007-06-08T11:39:46.783-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Hyperbolism of the Month</title><content type='html'>...goes to (the envelope please)... &lt;a href="http://cafe.elharo.com/java/voting-for-checked-exceptions/"&gt;Elliotte Rusty Harold!&lt;/a&gt;: &lt;br /&gt;&lt;blockquote&gt;Java’s exception handling is the single best error handling and reporting mechanism ever built into a programming language.&lt;/blockquote&gt;&lt;br /&gt;I personally don't think you're going to beat the &lt;a href="http://www.gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html"&gt;Common Lisp condition system&lt;/a&gt;. You can emulate Java-style exception handling, but it's so much richer to be able to restart in the context where the error occurred, without unwinding the stack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-119607883135013297?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://cafe.elharo.com/java/voting-for-checked-exceptions/' title='Hyperbolism of the Month'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/119607883135013297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=119607883135013297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/119607883135013297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/119607883135013297'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/06/hyperbolism-of-month.html' title='Hyperbolism of the Month'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5277294241587228229</id><published>2007-06-06T20:05:00.001-05:00</published><updated>2007-06-06T20:34:06.375-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='cycling'/><title type='text'>What is Lisa Simpson Doing to that Poor Man?</title><content type='html'>Once someone has pointed out that interpretation of the &lt;a href="http://www.london2012.com/"&gt;London 2012 Olympics logo&lt;/a&gt;, it's forever ruined, isn't it? Sorry. (via &lt;a href="http://www.dailypelotonforums.com/main/index.php?s=&amp;showtopic=4979&amp;view=findpost&amp;p=75540"&gt;DPF&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;div style="background: #0099FF;text-align:center" href="http://www.london2012.com/"&gt;&lt;img src="http://www.london2012.com/img/logo/large-pink-white.gif" alt="Lisa simpson" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5277294241587228229?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.london2012.com/' title='What is Lisa Simpson Doing to that Poor Man?'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5277294241587228229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5277294241587228229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5277294241587228229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5277294241587228229'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/06/what-is-lisa-simpson-doing-to-that-poor.html' title='What is Lisa Simpson Doing to that Poor Man?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5197973045130660293</id><published>2007-05-21T17:08:00.000-05:00</published><updated>2007-05-21T17:17:13.359-05:00</updated><title type='text'>Fifty-four forty or fight!</title><content type='html'>Today I flunked this quiz question asked of registrants for a &lt;a href="http://dell.eprize.net/23notebooks23days/index.tbapp"&gt;Dell sweepstakes&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Where in the U.S. did Dell recently build a Customer Contact Center?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Roseburg, Oregon&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Oklahoma City, Oklahoma&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Edmonton, Alberta&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;All of these&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Yep -- I missed the correct answer: "All of these." (When did we get Alberta?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5197973045130660293?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5197973045130660293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5197973045130660293' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5197973045130660293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5197973045130660293'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/05/fifty-four-forty-or-fight.html' title='Fifty-four forty or fight!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6203742970920972558</id><published>2007-05-07T19:50:00.000-05:00</published><updated>2007-05-07T19:56:33.076-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mouse'/><title type='text'>And I had never heard of Doug Engelbart!</title><content type='html'>Since &lt;a href="http://weblog.raganwald.com/2007/04/pop-culture-lives-in-present-it-doesnt.html"&gt;Reginald B. and Alan Kay have urged us &lt;/a&gt; to google Doug Engelbart, I reckoned it must be important, so I did. And I found &lt;a href="http://sloan.stanford.edu/mousesite/1968Demo.html"&gt;this amazing demo from 1968 of, basically, my computer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6203742970920972558?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://sloan.stanford.edu/mousesite/1968Demo.html' title='And I had never heard of Doug Engelbart!'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6203742970920972558/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6203742970920972558' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6203742970920972558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6203742970920972558'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/05/and-i-had-never-heard-of-doug-engelbart.html' title='And I had never heard of Doug Engelbart!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-7544008080616559009</id><published>2007-05-04T13:03:00.000-05:00</published><updated>2007-05-04T16:14:46.290-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>RIA Not Advancing the Ball</title><content type='html'>Rich widgets obscure the semantics of hypertext. Only the code behind the form knows what the widget really does. Contrast to &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/"&gt;HTML 5&lt;/a&gt;, and in particular &lt;a href="http://www.whatwg.org/specs/web-forms/current-work/"&gt;Web Forms 2&lt;/a&gt;. These guys are extending HTML to capture what we really do on the web. As a consequence, client programs can (or, have a chance to) understand the meanings of hypertext documents from the web.&lt;br /&gt;&lt;br /&gt;Example: you want to write a script to automate some remote bookmark service, as part of your mashup. But this service, unlike &lt;a href="http://del.icio.us/help/api/"&gt;del.icio.us&lt;/a&gt;, has no documented "API". So you have to download its form, complete it programmatically, and POST an entity. &lt;br /&gt;&lt;br /&gt;Case 1: The form uses Plain Old HTML. You're golden. All the semantics are right there for you to parse, or read. You identify the name of the text box where you stick the URL, and the name of the text box where you add a description.  You compose the URL encoded form data, and POST it to the action URI.&lt;br /&gt;&lt;br /&gt;Case 2: The "form" uses Javascript to modify the DOM on the fly: the onload() method adds text boxes, and a submit button, to an empty DOM. In fact, it might not even use the submit button as a form element; when you press the button, its onclick() might send a custom XMLHttpRequest back to the server. Your code will never automate this interaction. &lt;br /&gt;&lt;br /&gt;Case 3: The "form" uses XAML + &lt;a href="http://blogs.msdn.com/tims/archive/2007/04/15/introducing-microsoft-silverlight.aspx"&gt;Silverlight&lt;/a&gt; plugin. An exacerbated case of (2).&lt;br /&gt;&lt;br /&gt;In contrast, Web Forms 2 attempts to capture the semantics of what we do with forms. Because browsers will understand more of the semantics of the form, we can do declaratively what we now have to do in Javascript. For example, lots of HTML forms now have to use script to add a row of controls to a form on the fly ("Click here to add another bookmark"). &lt;a href="http://www.whatwg.org/specs/web-forms/current-work/#repeatingFormControls"&gt;WF2 captures that as repeating control groups&lt;/a&gt;, and the browser can handle it.&lt;br /&gt;&lt;br /&gt;(Then again, &lt;a href="http://hughw.blogspot.com/search/label/microforms"&gt;I am a documented forms nut&lt;/a&gt;.)&lt;br /&gt;&lt;br /&gt;Mike Dierken justly analogizes: "&lt;a href="http://korrespondence.blogspot.com/2007/05/apollo-silverlight-blah-blah-blah.html"&gt;RIA is to user interfaces as RPC is to messaging interfaces&lt;/a&gt;". And notice, it's Rich &lt;span style="font-weight:bold;"&gt;Internet&lt;/span&gt;, not Rich &lt;span style="font-weight:bold;"&gt;Web&lt;/span&gt; Applications. These technologies pay lip service to the web, but they're not advancing the ball toward building more and better links throughout the web information space.&lt;br /&gt;&lt;br /&gt;P.S. &lt;a href="http://www2.blogger.com/img/gl.link.gif"&gt;Wonderful rant by Mark Pilgrim&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Update: fixed a link.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-7544008080616559009?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/7544008080616559009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=7544008080616559009' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7544008080616559009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7544008080616559009'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/05/ria-not-advancing-ball.html' title='RIA Not Advancing the Ball'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-1884685221457263174</id><published>2007-05-03T18:35:00.000-05:00</published><updated>2007-05-03T19:33:20.715-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>RIA -- Fill 'er Up!</title><content type='html'>I'm having an ongoing email exchange with my friend Peter. He's convinced MS and Adobe herald a new age of Rich Internet Applications. He pointed me to &lt;a href="http://blogs.zdnet.com/Stewart/"&gt;this guy&lt;/a&gt; who's backed up a tanker to the Kool-Aid trough.&lt;br /&gt;&lt;br /&gt;Sure, &lt;a href="http://blogs.msdn.com/tims/archive/2007/04/15/introducing-microsoft-silverlight.aspx"&gt;MS&lt;/a&gt; and &lt;a href="http://labs.adobe.com/wiki/index.php/Apollo:Documentation:Introducing_Adobe_Apollo"&gt;Adobe&lt;/a&gt; have to sell something as the Next Thing -- what else have they got? But we've had RIA ever since Java 1.1 applets. We have Flash. We have &amp;lt;embed&amp;gt; and &amp;lt;object&amp;gt;. Do you really think what's been holding RIA back is the technology?&lt;br /&gt;&lt;br /&gt;Users have voted with their mice, and they've voted for the web experience -- exploring the web information space using hyperlinks -- as far more important than whizzy UI. Ask eBay. Ask MySpace.&lt;br /&gt;&lt;br /&gt;Flash, applets, &lt;a href="http://blogs.msdn.com/tims/archive/2007/04/15/introducing-microsoft-silverlight.aspx"&gt;Silverlight,&lt;/a&gt; Javascript -- the more you use them, the suckier your web apps are at exploring the web information space. I don't think it has to be this way, but it takes a design discipline few seem to have. These programming models are from the 80s. They have web APIs, but they're not web oriented. Programs end up as little desktop applications, not web apps. I don't see Silverlight changing that. It &lt;em&gt;is&lt;/em&gt; good to have super expressive widgets -- hear hear. But if you're not pushing a bunch of hypertext down to my browser, you're not helping me explore the space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1884685221457263174?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.msdn.com/tims/archive/2007/04/15/introducing-microsoft-silverlight.aspx' title='RIA -- Fill &apos;er Up!'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1884685221457263174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1884685221457263174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1884685221457263174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1884685221457263174'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/05/ria-fill-er-up.html' title='RIA -- Fill &apos;er Up!'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-8018973468909594158</id><published>2007-04-27T12:20:00.000-05:00</published><updated>2007-04-27T12:35:23.270-05:00</updated><title type='text'>The Penny Drops</title><content type='html'>It's enjoyable, and instructive, to watch the penny drop for venerable DCOMster/SOAPster Tim Ewald: &lt;a href="http://pluralsight.com/blogs/tewald/archive/2007/04/26/46984.aspx"&gt; &lt;span style="font-style:italic;"&gt;I finally get REST. Wow&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Instructive, because coming from a strong RPC perspective, Tim illuminates the distributed application problem with slightly different shades. I like this graphical model:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Every communication protocol has a state machine. For some protocols they are very simple, for others they are more complex. When you implement a protocol via RPC, you build methods that modify the state of the communication. That state is maintained as a black box at the endpoint. Because the protocol state is hidden, it is easy to get things wrong. For instance, you might call Process before calling Init....The essence of REST is to make the states of the protocol explicit and addressible by URIs. The current state of the protocol state machine is represented by the URI you just operated on and the state representation you retrieved. You change state by operating on the URI of the state you're moving to, making that your new state. A state's representation includes the links (arcs in the graph) to the other states that you can move to from the current state. &lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-8018973468909594158?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://pluralsight.com/blogs/tewald/archive/2007/04/26/46984.aspx' title='The Penny Drops'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/8018973468909594158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=8018973468909594158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8018973468909594158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/8018973468909594158'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/04/penny-drops.html' title='The Penny Drops'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2100337177235280213</id><published>2007-04-17T17:38:00.000-05:00</published><updated>2007-04-17T21:20:14.320-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Austin to Paris in 30 days</title><content type='html'>Since I'm traveling to Paris soon, thought I'd &lt;a href="http://maps.google.com/maps?f=d&amp;hl=en&amp;saddr=Austin,+TX&amp;daddr=Paris,+France&amp;sll=46.13417,-36.123047&amp;sspn=34.406662,87.714844&amp;layer=&amp;ie=UTF8&amp;z=3&amp;om=1"&gt;get directions from Google Maps&lt;/a&gt;. It's going to take 30 days, 9 hours. Notice item 28. (via Peter Flanagan).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2100337177235280213?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://maps.google.com/maps?f=d&amp;hl=en&amp;saddr=Austin,+TX&amp;daddr=Paris,+France&amp;sll=46.13417,-36.123047&amp;sspn=34.406662,87.714844&amp;layer=&amp;ie=UTF8&amp;z=3&amp;om=1' title='Austin to Paris in 30 days'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2100337177235280213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2100337177235280213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2100337177235280213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2100337177235280213'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/04/austin-to-paris-in-30-days.html' title='Austin to Paris in 30 days'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6476627146072291644</id><published>2007-04-16T00:32:00.000-05:00</published><updated>2007-04-16T00:34:29.990-05:00</updated><title type='text'>Twenty miles with the Tour de France Champ</title><content type='html'>Today I rode &lt;a href="http://www.hproad.net/2007/04/riding_with_floyd.html"&gt;20 miles with 2006 Tour de France Champion Floyd Landis&lt;/a&gt;. And I don't care who knows it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6476627146072291644?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.hproad.net/2007/04/riding_with_floyd.html' title='Twenty miles with the Tour de France Champ'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6476627146072291644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6476627146072291644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6476627146072291644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6476627146072291644'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/04/twenty-miles-with-tour-de-france-champ.html' title='Twenty miles with the Tour de France Champ'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-1869230528711760801</id><published>2007-04-10T16:52:00.000-05:00</published><updated>2007-04-10T17:07:36.102-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='google microsoft'/><title type='text'>Microsoft is Dead</title><content type='html'>Ha! I've been telling people Microsoft has become irrelevant. And now &lt;a href="http://www.paulgraham.com/microsoft.html"&gt;Paul Graham crystallizes the thought&lt;/a&gt;. Especially rich:&lt;br /&gt;&lt;blockquote&gt;...I'm now surprised when I come across a computer running Windows. Nearly all the people we fund at Y Combinator use Apple laptops. It was the same in the audience at startup school. All the computer people use Macs or Linux now. Windows is for grandmas, like Macs used to be in the 90s. So not only does the desktop no longer matter, no one who cares about computers uses Microsoft's anyway.&lt;/blockquote&gt;&lt;br /&gt;An irascible colleague at a large software company used to say, "Hugh, you have to understand: XYZ isn't really a software company. It's an old folks home for software." XYZ had the same problem PG describes:&lt;br /&gt;&lt;blockquote&gt;Microsoft's biggest weakness is that they still don't realize how much they suck. They still think they can write software in house. Maybe they can, by the standards of the desktop world. But that world ended a few years ago.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1869230528711760801?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.paulgraham.com/microsoft.html' title='Microsoft is Dead'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1869230528711760801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1869230528711760801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1869230528711760801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1869230528711760801'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/04/microsoft-is-dead.html' title='Microsoft is Dead'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4329962307642024413</id><published>2007-04-03T13:17:00.000-05:00</published><updated>2007-04-03T13:55:42.863-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>The cure is worse than the disease</title><content type='html'>&lt;a href="http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf"&gt;This paper from Fortify&lt;/a&gt; makes the case that sending sensitive information using JSON exposes it to cross-site maliciousness. GMail sent your contact list down as JSON and evaled it. Turns out, any old site could do the same: just put a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag referencing that contact list, and install some interceptor code that overloads setting e.g. the "email" property on any object: That enables the malicious code to see the values in the JSON.&lt;br /&gt;&lt;br /&gt;Here are a couple of their proposed measures:&lt;br /&gt;&lt;br /&gt;1. "Add the session cookie to the request as a parameter." Knee-slapper, that. See, the exploit only works because vulnerable sites put your identity into the cookie, and use a single URL for all users to download the object; the server uses the cookie to send you your personalized contact list. So the attacker just has to hardcode &lt;code&gt;&amp;lt;script&amp;nbsp;src="http://yoursite.com/contact-list"&amp;gt&lt;/code&gt;. The paper proposes uniquifying the URL. Here's an idea: design your app so that each user's info is at a unique URL in the first place!&lt;br /&gt;&lt;br /&gt;2. Send all legitimate requests for JSON data using HTTP POST! That way you know any GET requests are malicious ones from &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;  tags. They do concede that "The use of GET for better performance is encouraged by Web application experts from Sun and elsewhere". There's no use for this measure if you use unique URLS, of course.&lt;br /&gt;&lt;br /&gt;So yeah, this is a serious problem, but not for apps using best web architecture practices. Millions of web developers read papers like that and then crap all over the web.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4329962307642024413?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.fortifysoftware.com/servlet/downloads/public/JavaScript_Hijacking.pdf' title='The cure is worse than the disease'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4329962307642024413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4329962307642024413' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4329962307642024413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4329962307642024413'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/04/cure-is-worse-than-disease.html' title='The cure is worse than the disease'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-843311906021219454</id><published>2007-03-31T22:07:00.000-05:00</published><updated>2007-03-31T22:19:53.679-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><title type='text'>Life imitates art</title><content type='html'>During the Atom Publishing Protocol process, &lt;a href="http://journals.aol.com/panzerjohn/abstractioneer/entries/2004/06/05/atom-cat-picture-use-case/452"&gt;posting your cat pictures was a recurring use case&lt;/a&gt;. Now there's &lt;a href="http://www.picato.net/"&gt;a whole site devoted to social cat picture publishing&lt;/a&gt;. John Panzer, is that you?&lt;br /&gt;&lt;br /&gt;Update: I guess it's not John -- they only expose an RSS 2.0 feed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-843311906021219454?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.picato.net/' title='Life imitates art'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/843311906021219454/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=843311906021219454' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/843311906021219454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/843311906021219454'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/03/life-imitates-art.html' title='Life imitates art'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-929140891694560840</id><published>2007-02-27T19:30:00.000-06:00</published><updated>2007-02-27T19:30:01.439-06:00</updated><title type='text'>Glitch Undercuts the Dow</title><content type='html'>The Dow fell over 400 points today. And some IT guy's ass is fired. From &lt;a href="http://www.newsday.com/business/sns-ap-wall-street,0,1011934.story?coll=ny-leadhealthnews-headlines"&gt;Stocks Have Worst Day Since 9/11 Attacks&lt;/a&gt;: &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The Dow's decline accelerated at a faster than normal pace during the afternoon after a computer glitch kept some trades from being immediately reflected in the index of 30 blue chip stocks. Dow Jones &amp; Co., the media company which manages the flagship index, said the problem occurred after it was discovered computers were not properly calculating trades, prompting a switch to a backup computer.&lt;br /&gt;&lt;br /&gt;The result was a massive plunge in the average in the seconds it took Dow Jones to switch to its secondary computers.&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-929140891694560840?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.newsday.com/business/sns-ap-wall-street,0,1011934.story?coll=ny-leadhealthnews-headlines' title='Glitch Undercuts the Dow'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/929140891694560840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=929140891694560840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/929140891694560840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/929140891694560840'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/02/glitch-undercuts-dow.html' title='Glitch Undercuts the Dow'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-880772163509834221</id><published>2007-02-14T01:42:00.000-06:00</published><updated>2007-02-14T01:49:05.738-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>SOA Facts</title><content type='html'>I came across &lt;a href="http://www.soafacts.com/"&gt;this hilarious list of way more than ten SOA Facts&lt;/a&gt;, including&lt;br /&gt;&lt;br /&gt; &lt;blockquote&gt;SOA is an anagram for OSA, which means female bear in spanish. It is a well-known fact in the spanish-speaking world that female bears are able to model business processes and optimize reusable IT assets better than any other hibernating animal&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;SOA actually stands for SOA Oriented Architecture&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;SOA is also a yoga posture that consists of performing all other yoga postures simultaneously&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="mailto:soafacts@gmail.com"&gt;&lt;br /&gt;Submit your own fact&lt;/a&gt;. (This site really really needs a feed).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-880772163509834221?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.soafacts.com/' title='SOA Facts'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/880772163509834221/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=880772163509834221' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/880772163509834221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/880772163509834221'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/02/soa-facts.html' title='SOA Facts'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5553508837279215660</id><published>2007-02-09T12:35:00.000-06:00</published><updated>2007-02-09T12:35:56.805-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>leet.google.com</title><content type='html'>&lt;a href="http://www.google.com/intl/xx-hacker/"&gt;Google s34rCh&lt;/a&gt;(via &lt;a href="http://www.windley.com/archives/2007/02/1337_on_google.shtml"&gt;Phil Windley&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5553508837279215660?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.google.com/intl/xx-hacker/' title='leet.google.com'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5553508837279215660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5553508837279215660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5553508837279215660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5553508837279215660'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/02/leetgooglecom.html' title='leet.google.com'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2469973363444934673</id><published>2007-02-06T08:18:00.000-06:00</published><updated>2007-02-06T08:39:10.764-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><title type='text'>Forms Language Use Case</title><content type='html'>Tim Bray &lt;a href="http://www.imc.org/atom-protocol/mail-archive/msg08129.html"&gt;on the Atompub list&lt;/a&gt;: &lt;blockquote&gt;If I fetch a service doc with a collection with no &amp;lt;app:categories&amp;gt;, does that mean the server is suggesting that I can post any category I want, or that I can't post any category at all?&lt;/blockquote&gt;&lt;br /&gt;This question would a non-issue if &lt;a href="http://hughw.blogspot.com/2007/01/forms-driven-atom.html"&gt;APP used a forms language&lt;/a&gt;. A form for submitting an entry would have a) an enumerated list of choices, b) a free form text field, or c) no field at all to submit the category. No ambuiguity.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2469973363444934673?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2469973363444934673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2469973363444934673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2469973363444934673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2469973363444934673'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/02/forms-language.html' title='Forms Language Use Case'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4199946807509044283</id><published>2007-02-05T01:44:00.000-06:00</published><updated>2007-02-05T02:55:39.137-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Web 0.9</title><content type='html'>Sure took a long time to pay the car note this evening. I wish the developers had read &lt;a href="http://www.mnot.net/cache_docs/"&gt;Mark's caching tutorial&lt;/a&gt; (or rather that their J2EE framework developers had). Below are headers representative of about a hundred .gif, .css, and .js resources used on the page:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;GET /navigation/images/global/company.gif HTTP/1.1&lt;br /&gt;Host: www.financecompany.example.com&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;HTTP/1.x 200 OK&lt;br /&gt;Server: IBM_HTTP_Server/2&lt;span style="color:green; font-weight:bold"&gt;&lt;br /&gt;Last-Modified: Tue, 20 Sep 2005 18:24:36 GMT&lt;br /&gt;Etag: "31e467-450-2c11c100"&lt;br /&gt;&lt;span style="font-style: italic; font-size=large"&gt;So far, so good&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Accept-Ranges: bytes&lt;br /&gt;Content-Length: 1104&lt;br /&gt;Content-Type: image/gif&lt;span style="color:red; font-weight:bold"&gt;&lt;br /&gt;Expires: Mon, 05 Feb 2007 07:31:41 GMT&lt;br /&gt;Cache-Control: max-age=0, no-cache, no-store&lt;br /&gt;Pragma: no-cache&lt;br /&gt;Date: Mon, 05 Feb 2007 07:31:41 GMT&lt;span style="font-style: italic"&gt;&lt;br /&gt;Huh? It's a GIF that hasn't changed in a year.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Connection: keep-alive&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4199946807509044283?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4199946807509044283/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4199946807509044283' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4199946807509044283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4199946807509044283'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/02/web-09.html' title='Web 0.9'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4369273095281883591</id><published>2007-01-30T22:52:00.000-06:00</published><updated>2007-01-30T23:12:37.867-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='floyd'/><category scheme='http://www.blogger.com/atom/ns#' term='cycling'/><category scheme='http://www.blogger.com/atom/ns#' term='doping'/><title type='text'>Floyd Fairness Fund</title><content type='html'>During the final week of the Tour de France, I &lt;a href="http://hughw.blogspot.com/2006/07/understand-measurements.html"&gt;published my initial doubts about the "science" accusing Floyd Landis of doping&lt;/a&gt;. All evidence since then reinforces my doubts. &lt;br /&gt;&lt;br /&gt;Ultimately it all comes back to character: Do you believe the man or not? The evidence of doping that they have, alone, isn't convincing, but it would be &lt;em&gt;consistent&lt;/em&gt; with doping. Lots of guys &lt;a href="http://news.bbc.co.uk/sport2/hi/other_sports/cycling/2051173.stm"&gt;have gone to the mat lying&lt;/a&gt;. Floyd could just be one more. &lt;br /&gt;&lt;br /&gt;I just don't think he is.&lt;br /&gt;&lt;br /&gt;And now I know it. Because I don't think it's possible anyone, even Richard Virenque, would &lt;a href="http://www.floydfairnessfund.org/"&gt;form a legal defense fund&lt;/a&gt; taking money from elderly cycling enthusiasts like me just to reclaim a ride in the pro peloton. If Floyd had doped and had created this fund... well, nobody is that low. If you doubt his word now, you are saying, Yes Hugh: He is THAT LOW.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.floydfairnessfund.org/contact-us.htm"&gt;I gave&lt;/a&gt;. I think it's important. It's really important that the innocent get off, if we're going to have faith in the convictions of the guilty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4369273095281883591?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.floydfairnessfund.org/' title='Floyd Fairness Fund'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4369273095281883591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4369273095281883591' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4369273095281883591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4369273095281883591'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/floyd-fairness-fund.html' title='Floyd Fairness Fund'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-4634214721427152228</id><published>2007-01-29T08:35:00.000-06:00</published><updated>2007-01-29T09:55:54.136-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microforms atom'/><title type='text'>Wait, *my* new publishing technique is unstoppable</title><content type='html'>[updated to correct an omission in POST description]&lt;br /&gt;&lt;br /&gt;Bill &lt;a href="http://www.dehora.net/journal/2007/01/my_new_publishing_technique_is_unstoppable.html"&gt;outlines the conventional Atompub publishing pattern&lt;/a&gt;. I'm pitching this one:&lt;br /&gt;&lt;br /&gt;&lt;dl style="font-family: mono"&gt;&lt;br /&gt;&lt;dt&gt;GET Introspection URI&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;scan the list of workspaces for the collection you want to post the blogpost to. &lt;em&gt;This list is not an Atom service document, but a microformat outline e.g. XOXO. (The Atompub WG &lt;a href="http://www.intertwingly.net/wiki/pie/PaceXHTMLIntrospection2"&gt;considered and dropped using XOXO&lt;/a&gt;).&lt;/em&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GET to Collection URI&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;read the nice atom feed&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GET the "New Entry" URI from either the service doc or the feed doc.&lt;dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;em&gt;Retrieve an &lt;a href="http://hughw.blogspot.com/2007/01/forms-driven-atom.html"&gt; XHTML microform&lt;/a&gt; describing how to construct a POST message&lt;/em&gt;&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;POST to the &lt;span style="text-decoration: line-through;"&gt;blogpost's collection URI&lt;/span&gt;&lt;em&gt;the action URI of the form&lt;/em&gt;.&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;push a blogpost &lt;span style="text-decoration: line-through;"&gt;formatted as a nice atom entry&lt;/span&gt;&lt;em&gt;as URL-encoded form data&lt;/em&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;GET or HEAD to blogpost  URI&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;grab the  blogpost&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;PUT or DELETE to blogpost URI&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;change or delete the  blogpost&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-4634214721427152228?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/4634214721427152228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=4634214721427152228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4634214721427152228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/4634214721427152228'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/wait-my-new-publishing-technique-is.html' title='Wait, *my* new publishing technique is unstoppable'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6273282747406867744</id><published>2007-01-24T12:18:00.000-06:00</published><updated>2007-01-26T09:51:47.979-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><title type='text'>Web Service of the Future: Comment Spam</title><content type='html'>Guess what web technology, right now, most successfully uses &lt;a href="http://hughw.blogspot.com/2007/01/forms-driven-atom.html"&gt;microforms a.k.a. forms-driven web services&lt;/a&gt;: Comment spam. Spambots crawl the web, looking for form fields they recognize, completing them, and submitting them. There's no one universal blog comment document format. Each site tells the bot, by using typical names in form fields, how to complete the form.&lt;br /&gt;&lt;br /&gt;Imagine you had some service you actually want agents to be able to understand: a fare search site. Farebots would query your site for fares from Austin to Bangalore leaving Thursday. They'd know how to fill out the form field because you'd annotate each one with some agreed class attribute. Doesn't this sound a lot more realistic than getting everyone to agree on a common fare search document?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6273282747406867744?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6273282747406867744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6273282747406867744' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6273282747406867744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6273282747406867744'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/web-service-of-future-comment-spam.html' title='Web Service of the Future: Comment Spam'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-171434744236178949</id><published>2007-01-18T11:38:00.000-06:00</published><updated>2007-01-26T09:52:13.502-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><title type='text'>Forms-driven Atom</title><content type='html'>Here's how &lt;a href="http://hughw.blogspot.com/2006/12/is-atompub-superfluous.html"&gt;forms-driven Atom publishing&lt;/a&gt; would work. Let's drop the Xforms idea, and take a page from the smart &lt;a href="http://microformats.org/"&gt;microformats&lt;/a&gt; people: We'll overload XHTML forms with semantics, so that blogging clients can parse them, fill them in correctly, and then POST or PUT them. Call the idea &amp;quot;microforms&amp;quot;.&lt;br /&gt;&lt;br /&gt;Want an example? Your browser, right now, can &lt;a href="http://www.ietf.org/rfc/rfc3106.txt"&gt;auto fill lots of form fields&lt;/a&gt; based on the field name. And your browser retrieves that information from its own little database. Let's just generalize that idea, and furnish client programs with the ability to understand lots more about the service it's exercising.&lt;br /&gt;&lt;br /&gt;Where do we get the semantics for Atom? The &lt;a href="http://www.atomenabled.org/developers/syndication/atom-format-spec.php"&gt;Atom syntax document&lt;/a&gt; goes a long way. Henry Story has constructed an &lt;a href="http://atomowl.org/ontologies/atomowl"&gt;OWL ontology&lt;/a&gt; for Atom. This is a good starting point. We can use those property and class names in XHTML &lt;code&gt;class&lt;/code&gt; attributes. &lt;br /&gt;&lt;br /&gt;Remember the motivation: We want web services to spread as powerfully as the real WWW has. The Atom group believes RESTful web services will do it. But little in Atom, or any other document driven protocol, resembles the actual web we experience. In Atom, they agree on a document format that carries semantics that all servers and clients have to understand, or at least handle gracefully. That concept has no analogy on the web. When you order airline tickets, do you complete the One Universal Reservation form? No. Each airline or agency has its own form, because each business has its own differentiators. &lt;br /&gt;&lt;br /&gt;It's the same in web publishing. Consider Moveable Type and Blogger. To create an entry for MT you fill out this form:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_pMQ_v-5RTNM/Ra_s3-gBLcI/AAAAAAAAAAU/Y3xl91sKMG0/s1600-h/mt.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; cursor: pointer;" src="http://bp1.blogger.com/_pMQ_v-5RTNM/Ra_s3-gBLcI/AAAAAAAAAAU/Y3xl91sKMG0/s320/mt.png" alt="" id="BLOGGER_PHOTO_ID_5021492555955645890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;They have two places to enter content! One is the lead, the other is the "Read more...." section. There's no concept like that in Atom. I guess the MT guys will propose an extension. But then every other blogging service on the planet will have to handle the case where somebody submits an "mt:extendedContent" extension element. Blogger doesn't have that concept:&lt;br /&gt;&lt;br /&gt; &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_pMQ_v-5RTNM/Ra_s3ugBLbI/AAAAAAAAAAM/XHEG-io7HY8/s1600-h/blogger.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt;  cursor: pointer;" src="http://bp0.blogger.com/_pMQ_v-5RTNM/Ra_s3ugBLbI/AAAAAAAAAAM/XHEG-io7HY8/s320/blogger.png" alt="" id="BLOGGER_PHOTO_ID_5021492551660678578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I marked up those screen captures with tags grabbed loosely from the Atom ontology. We can make up more. Here's a microform MT could present (modulo GUI labels and layout):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;form method="post" action="/feed/"&amp;gt;&lt;br /&gt;  &amp;lt;input type="text" name="title" class="atom:title"/&amp;gt;&lt;br /&gt;  &amp;lt;select name="category" class="atom:label"&amp;gt;&lt;br /&gt;    &amp;lt;option value="Programming"/&amp;gt;&lt;br /&gt;    &amp;lt;option value="Politics"/&amp;gt;&lt;br /&gt;    &amp;lt;option value="Personal"/&amp;gt;&lt;br /&gt;  &amp;lt;/select&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;textarea name="entry" class="atom:htmlContent"/&amp;gt;&lt;br /&gt;  &amp;lt;textarea name="extended" class="atom:htmlContent"/&amp;gt;&lt;br /&gt;  &amp;lt;input type="checkbox" name="draft" class="app:control" value="app:draft"/&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Later we can hash out the details of these class attributes. Maybe we do need an MT specific extension for that extended content. But only MT servers, or any service supporting extended content, ever will have to deal with clients that submit that field. &lt;br /&gt;&lt;br /&gt;So the microforms idea is: You describe the semantics of the form elements in their class attributes. You program clients to GET forms, understand form elements, and fill them out correctly, getting the information from some kind of database, or from a live user.&lt;br /&gt;&lt;br /&gt;If we do it well enough, we can build agents that syndicate stuff to all kinds of servers automatically.&lt;br /&gt;&lt;br /&gt;(updated: fixed omitted class attribute in form example).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-171434744236178949?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/171434744236178949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=171434744236178949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/171434744236178949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/171434744236178949'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/forms-driven-atom.html' title='Forms-driven Atom'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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://bp1.blogger.com/_pMQ_v-5RTNM/Ra_s3-gBLcI/AAAAAAAAAAU/Y3xl91sKMG0/s72-c/mt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6301633.post-7706395582975056065</id><published>2007-01-17T12:16:00.000-06:00</published><updated>2007-01-17T12:17:13.386-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>We're Writing Hardware</title><content type='html'>Using statically typed languages, we're constructing hardware, not software, &lt;a href="http://steve-yegge.blogspot.com/2007/01/pinocchio-problem.html"&gt;says Steve&lt;/a&gt;. A great rant. Let me extend the analogy. Think about the bullet points they used to sell object oriented programming back in the 80s: "Hardened components", "Reusable". These qualities are the opposite of dynamic.&lt;br /&gt;&lt;br /&gt;Wait! There's an alternative!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Common Lisp is in many ways really ideal: it's a dynamically typed language with optional type annotations (i.e. you build software, then selectively turn it into hardware), lots of great tools and documentation, all of the essential features of living software I've enumerated in this essay... However, it has stopped growing, and programmers can sense momentum like a shark senses blood.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Oh man. Don't give up on the old girl. The Lisp Renaissance is happening all around you. We have &lt;a href="http://www.gigamonkeys.com/book/"&gt;the popular book&lt;/a&gt;; now we just need the Django/Rails thing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-7706395582975056065?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://steve-yegge.blogspot.com/2007/01/pinocchio-problem.html' title='We&apos;re Writing Hardware'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/7706395582975056065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=7706395582975056065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7706395582975056065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/7706395582975056065'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/were-writing-hardware.html' title='We&apos;re Writing Hardware'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-1372307273094349426</id><published>2007-01-11T23:02:00.000-06:00</published><updated>2007-01-26T09:54:29.951-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><title type='text'>The Volkswagen Lisp</title><content type='html'>I've been working in Lisp for about six weeks now, and I am far enough along to&lt;br /&gt;&lt;a href="http://damienkatz.net/2007/01/the_volkswagen.html"&gt;get this&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-1372307273094349426?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://damienkatz.net/2007/01/the_volkswagen.html' title='The Volkswagen Lisp'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/1372307273094349426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=1372307273094349426' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1372307273094349426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/1372307273094349426'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/volkswagen-lisp.html' title='The Volkswagen Lisp'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-3584461984524763266</id><published>2007-01-08T22:34:00.000-06:00</published><updated>2007-01-08T22:36:25.746-06:00</updated><title type='text'>Quote of the day 01/08/2007</title><content type='html'>&lt;a href="http://www.newsday.com/news/local/newyork/am-gas0109,0,6285639.story?coll=ny-corrections-print&amp;track=mostemailedlink"&gt;"I think smell certainly can be a terrorist mechanism, whether it harms people or not."&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3584461984524763266?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3584461984524763266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3584461984524763266' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3584461984524763266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3584461984524763266'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2007/01/quote-of-day-01082007.html' title='Quote of the day 01/08/2007'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5650370756743755425</id><published>2006-12-27T15:52:00.000-06:00</published><updated>2007-01-26T09:53:52.743-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atom'/><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='microforms'/><title type='text'>Is Atompub Superfluous?</title><content type='html'>I hate to suggest this at such a late stage -- Bill and Joe just published the &lt;a href="http://www.ietf.org/internet-drafts/draft-ietf-atompub-protocol-12.txt"&gt;twelfth rev of Atompub&lt;/a&gt; -- but do we really need Atompub?&lt;br /&gt;&lt;br /&gt;All we need is &lt;a href="http://atompub.org/rfc4287.html"&gt;RFC 4287&lt;/a&gt;, plus &lt;span style="font-style: italic;"&gt;maybe&lt;/span&gt; the service description doc in Atompub.&lt;br /&gt;&lt;br /&gt;Atompub tells you how to identify URLs where your application can POST documents of certain types. That's not a whole lot better than some so-called "RESTful" API that tells you how to construct a URL. At design time, I'm learning more about your application than I need to know. &lt;br /&gt;&lt;br /&gt;My proposal: Once you've located the URL of a what they call an "edit" link, you should be able   to GET a form from that link, describing what you can POST there. Since we already have well defined semantics for the XML elements of Atom entries, an edit URL could return an XForm model:&lt;br /&gt;        &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;model&amp;gt;&lt;br /&gt;  &amp;lt;entry xmlns="http://www.w3.org/2005/Atom"&amp;gt;&lt;br /&gt;     &amp;lt;link/&amp;gt;&lt;br /&gt;     &amp;lt;updated/&amp;gt;&lt;br /&gt;     &amp;lt;summary/&amp;gt;&lt;br /&gt;     &amp;lt;content type=""/&amp;gt;&lt;br /&gt;  &amp;lt;/entry&amp;gt;&lt;br /&gt;  &amp;lt;submission id="form1"&lt;br /&gt;                 action="entries"&lt;br /&gt;                 method="post"/&amp;gt;&lt;br /&gt;&amp;lt;/model&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;1. This pattern --- getting a form, filling it out, and submitting it -- differentiates the web, REST style from RPC. In RPC, the programmer learns an API at design time; on the web, clients discover the "API" at run time.&lt;br /&gt;&lt;br /&gt;2. We sidestep lots of arguments on the APP mailing list that are driven by different ideas about expected behavior; here, the server tells you its behavior. This server could not honor an atom:id should you submit one. So, it doesn't ask you for one.&lt;br /&gt;&lt;br /&gt;3. Extensions understood by the server? Don't worry: if the server doesn't ask you for it, it won't honor it. Example: &lt;a href="http://www.ietf.org/rfc/rfc4685.txt"&gt;Atom Threading Extension&lt;/a&gt;. A very nice server could offer a catchall &lt;userextensions&gt; element (to be invented) where an APP client might stuff all the custom extensions it really wants preserved.&lt;br /&gt;&lt;br /&gt;4. We can evolve the Atom syntax without argument. Old servers will never request newly defined elements so will never have to deal with them. I'm guessing this is where  &lt;a href="http://www.coactus.com/blog/2006/12/validation-considered-harmful/"&gt;Mark is going with  reference to semweb&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5650370756743755425?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5650370756743755425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5650370756743755425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5650370756743755425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5650370756743755425'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/is-atompub-superfluous.html' title='Is Atompub Superfluous?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5807534211582226400</id><published>2006-12-23T11:12:00.000-06:00</published><updated>2006-12-23T12:43:34.717-06:00</updated><title type='text'>MVC Considered Harmful</title><content type='html'>&lt;a href="http://struts.apache.org/2.x/docs/home.html"&gt;Struts 2&lt;/a&gt;, the popular Java webapp framework, &lt;a href="http://www.google.com/search?q=mvc+web+application"&gt;like other frameworks&lt;/a&gt;, advertises a Model-View-Controller architecture. MVC seems to be an item on a checklist that frameworks think they have to have. Now, &lt;a href="http://st-www.cs.uiuc.edu/users/smarch/st-docs/mvc.html"&gt;MVC is a great architecture for building desktop applications&lt;/a&gt;, with a user interface posting messages through a controller, to query or update a model. But the skeptic would ask, Does the web really feel like a desktop application?&lt;br /&gt;&lt;br /&gt;What is wrong with this picture?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://struts.apache.org/2.x/docs/home.data/struts2-arch.png" alt="Struts architecture"/&gt;&lt;br /&gt;&lt;br /&gt;Notice the central concept of a Struts application is the Action. Building a Struts app is constructing a bunch of Action classes. The Struts controller accepts requests and maps the URL to an &lt;em&gt;Action&lt;/em&gt;. Ahem. The web is not built upon Uniform Action Locators, is it? An Action  implies a verb, and that is the way developers model applications under Struts and other MVC webapp frameworks. In fact, Struts typically identifies Action URLs by the the extension ".do" -- the verb "to do".&lt;br /&gt;&lt;br /&gt;Struts misses the concept of Resource. You can't really model a web application without conceiving it as a collection of resources, identified by URI. I think &lt;a href="http://www.djangoproject.com/documentation/url_dispatch/"&gt;Django is on to this&lt;/a&gt;. In Django, you furnish the framework with a map of regular expressions to callback functions. The Django docs call these callback functions your "views", but of course, if done correctly, they are really your resources. (Interestingly, the Django FAQ addresses the question Is Django an MVC framework and has evolved the answer, from &lt;a href="http://www.djangoproject.com/documentation/0_90/faq/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names"&gt;this&lt;/a&gt; to &lt;a href="http://www.djangoproject.com/documentation/faq/#django-appears-to-be-a-mvc-framework-but-you-call-the-controller-the-view-and-the-view-the-template-how-come-you-don-t-use-the-standard-names"&gt;this&lt;/a&gt;. They can't bring themselves to acknowledge a complete break with some form of MVC).&lt;br /&gt;&lt;br /&gt;A well architected webapp will organize around Resources and Representations. There are typically four methods on a Resource. Omitting some details, you have&lt;br /&gt;&lt;br /&gt;Representation Resource.get()&lt;br /&gt;Representation Resource.post (Representation)&lt;br /&gt;Representation Resource.put (Representation)&lt;br /&gt;void Resource.delete()&lt;br /&gt;&lt;br /&gt;To handle a request, you &lt;br /&gt;&lt;br /&gt;1. Identify the resource given its URI, and instantiate it&lt;br /&gt;2. Call the method, passing the request representation if any.&lt;br /&gt;3. Respond with the returned representation.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Resources are probably not much like your domain model. You'll have to map Representations to Resource instances, and Resource instances to, say, database queries. A good architecture abstracts out dispatching to methods based on types of Resources and Representations, and affords a loose coupling between your domain model and the Resource layer. These are sound principles that also will help your webapp play well with REST web architecture. But all dispatch and loose coupling is not MVC.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5807534211582226400?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5807534211582226400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5807534211582226400' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5807534211582226400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5807534211582226400'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/mvc-considered-harmful.html' title='MVC Considered Harmful'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-5768222231774079618</id><published>2006-12-20T10:03:00.000-06:00</published><updated>2006-12-20T10:18:35.879-06:00</updated><title type='text'>Google Boomerang</title><content type='html'>Blogger, the Google-owned engine behind this blog, just went final with a major new rev. But it continues to generate massively invalid XHTML, and there's nothing authors can do -- it's bugs in the new templating system.  This page you're reading, for example, gets 864 validation errors as of today.&lt;br /&gt;&lt;br /&gt;Arne Bleijs  made &lt;a href="http://groups.google.com/group/blogger-help-customizing/browse_frm/thread/fef5d72011ed7571?tvc=1"&gt;this pithy  observation&lt;/a&gt;:&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;I suddenly remember some quotes from the annual conference of the&lt;br /&gt;American Association for Artificial Intelligence (AAAI), this summer in Boston. After Sir Tim Berners-Lee held a keynote speech about the Semantic Web. Peter Norvig, Director of Research at Google challenged him afterwards:&lt;/p&gt;&lt;i&gt;&lt;p&gt;"What I get a lot is: 'Why are you against the Semantic Web?' I am not against the Semantic Web. But from Google's point of view, there are a few things you need to overcome, incompetence being the first," Norvig said. Norvig clarified that it was not Berners-Lee or his group that he was referring to as incompetent, but the general user."&lt;/p&gt;&lt;p&gt;"We deal with millions of Web masters who can't configure a server, can't write HTML. It's hard for them to go to the next step. " &lt;/p&gt;&lt;/i&gt;&lt;p&gt;Somehow this sounds like a Google Boomerang hitting Blogger Beta. How can it be possible that Google complains about incompetent webmasters and is not able to produce valid XHTML? &lt;/p&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-5768222231774079618?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/5768222231774079618/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=5768222231774079618' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5768222231774079618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/5768222231774079618'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/google-boomerang.html' title='Google Boomerang'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2872505777068455686</id><published>2006-12-20T08:51:00.000-06:00</published><updated>2006-12-20T08:59:22.308-06:00</updated><title type='text'>Reverse Spam</title><content type='html'>This isn't a new phenomenon but it's happening ten times more frequently to me this week: I am receiving bounced mail notifications from mail I never sent. I funnel all mail sent to my domain, no matter the recipient, to my main account.&lt;br /&gt;&lt;br /&gt;Spammers send mail all over the planet using random domain names and generated account names. As spam filters get better, they are bouncing these messages. But they are bouncing them back to me. So I'm getting other people's spam!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2872505777068455686?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2872505777068455686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2872505777068455686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2872505777068455686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2872505777068455686'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/reverse-spam.html' title='Reverse Spam'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-3935540143956680313</id><published>2006-12-18T23:26:00.000-06:00</published><updated>2006-12-18T23:39:19.793-06:00</updated><title type='text'>gbiv.com</title><content type='html'>&lt;a href="http://roy.gbiv.com/"&gt;Roy Fielding&lt;/a&gt; authored RFC 2616, the HTTP spec. I've seen his personal URL for years: http://roy.gbiv.com/. What is this gbiv.com?&lt;br /&gt;&lt;br /&gt;My wife recently left her job of 11 years assembling books for a book production company. She's acquired quite a bit of esoteric knowledge about printing. Tonight she pronounced, out of nowhere: "Roy Gee Biv". She does this sometimes. Her neurons have been reordered so that occasionally she blurts out mnemonic devices she used in that past life.&lt;br /&gt;&lt;br /&gt;This mnemonic device helps you remember the colors of the rainbow: ROYGBIV&lt;br /&gt;&lt;br /&gt;red&lt;br /&gt;orange&lt;br /&gt;yellow&lt;br /&gt;green&lt;br /&gt;blue&lt;br /&gt;indigo&lt;br /&gt;violet&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-3935540143956680313?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://roy.gbiv.com/' title='gbiv.com'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/3935540143956680313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=3935540143956680313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3935540143956680313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/3935540143956680313'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/gbivcom.html' title='gbiv.com'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-2149509814744162297</id><published>2006-12-13T11:29:00.000-06:00</published><updated>2006-12-13T12:02:15.578-06:00</updated><title type='text'>Message Level Security in HTTP: How hard can it be?</title><content type='html'>A recent flurry of interest in message level security for Plain Old HTTP: &lt;a href="http://1raindrop.typepad.com/1_raindrop/2006/12/rest_security_o.html"&gt;Gunnar makes valid criticisms&lt;/a&gt; (though he confounds REST with HTTP); and &lt;a href="http://www.franklinmint.fm/blog/archives/000934.html"&gt;Robert takes the point&lt;/a&gt;. And the issue pops up again &lt;a href="http://lists.w3.org/Archives/Public/www-tag/2006Dec/0021.html"&gt;on www-tag&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The criticism is this: Using TLS, each intermediary decrypts the message, and re-encrypts it to send along to the next leg of its journey. The message is vulnerable to prying eyes at those transition points.&lt;br /&gt;&lt;br /&gt;How hard can it be to graft MLS onto HTTP without the baggage of WS-Security and XML Encrypt, and XML DSig? Somebody must have done this long ago, right? Couldn't find it with a quick google, but it has to look like this:&lt;br /&gt;&lt;br /&gt;Define a content transfer encoding for PK, and pass the cert bits, or a URL:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Content-transfer-encoding: RSA; cert="...base64 bits here..."&lt;/span&gt;&lt;br /&gt;or&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Content-transfer-encoding: RSA; certref="http://foo.bar/cert"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You'd also use these values in "Accept-Encoding" headers.&lt;br /&gt;&lt;br /&gt;And we're done, as far as HTTP is concerned.&lt;br /&gt;&lt;br /&gt;Applications are in charge of trust. Maybe &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/"&gt;HTML5 &lt;/a&gt;could enhance the&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;form&amp;gt;&lt;/span&gt; element so you could have:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;form method="POST" action="action" certref="http://mybank.com/cert"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and user agents would then encode the entity using PK encryption, and deliver the cert bits in the header as above. As with TLS, the UAs could generate temporary one-off local certs for this purpose.&lt;br /&gt;&lt;br /&gt;To GET a secure page, you'd have to have sent the proper Accept-Encoding with your cert as a parameter. If you failed to send this header you'd just get 406, and you'd have to restry with your cert.&lt;br /&gt;&lt;br /&gt;This has all been done before somewhere, right?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-2149509814744162297?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/2149509814744162297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=2149509814744162297' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2149509814744162297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/2149509814744162297'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/message-level-security-in-http-how-hard.html' title='Message Level Security in HTTP: How hard can it be?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6988064917193269518</id><published>2006-12-07T10:04:00.000-06:00</published><updated>2006-12-07T11:26:25.867-06:00</updated><title type='text'>Lisp Is Too An Acceptable Lisp (with caveats)</title><content type='html'>To get my hands dirty with Lisp, I've been putting together a RESTful HTTP framework. It runs with Apache 2.0 and mod_lisp. Over the past year, I've been researching Lisp: absorbing &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt;, reading &lt;a href="http://www.paulgraham.com/lisp.html"&gt;Paul Graham&lt;/a&gt; and &lt;a href="http://bc.tech.coop/blog/index.html"&gt;Bill Clementson&lt;/a&gt; and &lt;a href="http://lemonodor.com/"&gt;lemonodor&lt;/a&gt; and others. There's a consensus out there that Lisp rules, but there's a permathread lamenting  the balkanized libraries  many think prevent widespread uptake of Lisp. As Steve Yegge puts it in &lt;a href="http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html"&gt;Lisp is not an Acceptable Lisp&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Every single non-standard extension, everything not in the spec, is "wrong" with Common Lisp. This includes any support for threads, filesystem access, processes and IPC, operating system interoperability, a GUI, Unicode, and the long list of other features missing from the latest hyperspec.&lt;/blockquote&gt;Point taken, to some degree. But that problem doesn't &lt;span style="font-style: italic;"&gt;directly&lt;/span&gt; affect you if you're an architect building an application or web service -- you just pick Allegro or LispWorks or CMUCL or SBCL or CLISP, and you're done. Each Lisp has its own APIs for those services. It's true your code won't port trivially from one platform to another. That's usually not much of a concern, if the platform you choose runs on all the hardware and OSs you need.&lt;br /&gt;&lt;br /&gt;But the balkanization &lt;span style="font-style: italic;"&gt;indirectly&lt;/span&gt; affects you. It impedes the development and distribution of free libraries. If you're like me, you've become addicted to free libraries. A jabber component, or a message queue, or task scheduler, is just a Google away, if you're developing in Java.&lt;br /&gt;&lt;br /&gt;To build a cross platform library, a Lisp developer has a fair amount of work to do.  At a minimum, if you use any extensions, like sockets or Gray streams, you have to find or write an abstraction that may do  little more than hide the package name of your implementation. You may not  be able to abstract away some issues -- does each sockets implementation know how to send out of band TCP (MSG_OOB)? Which methods do the underlying Gray streams really require you to override?&lt;br /&gt;&lt;br /&gt;Common Lisp has been frozen since 1994, and as best I can tell, there is no process by which Gray streams, sockets, or IPC, or anything could be added to the language now. Contrast to &lt;a href="http://jcp.org/en/home/index"&gt;Java Community Process&lt;/a&gt;, which for whatever warts&lt;a href="http://beta.blogger.com/post-edit.g?blogID=6301633&amp;postID=6988064917193269518#irony"&gt;[1]&lt;/a&gt;, has enabled the language to evolve uniformly across implementations. You never have to worry that your Java 5 code that you developed using Sun's JDK won't run on Jrocket or IBM. It just works.&lt;br /&gt;&lt;br /&gt;Lisp needs some JSR-like, ongoing process --  not another eight year, big bang ANSI revision -- to standardize changes we take for granted in all other environments. And a benevolent dictator would help.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name="irony"&gt;[1]&lt;/a&gt; How ironic that Peter Seibel &lt;a href="http://www.gigamonkeys.com/book/macros-standard-control-constructs.html"&gt;contrasts the long JSR process&lt;/a&gt; against the capability Lisp gives you to extend the language with macros.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6988064917193269518?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6988064917193269518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6988064917193269518' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6988064917193269518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6988064917193269518'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/12/lisp-is-too-acceptable-lisp-with.html' title='Lisp Is Too An Acceptable Lisp (with caveats)'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-6388404677412324711</id><published>2006-11-06T11:36:00.000-06:00</published><updated>2006-11-06T13:25:52.412-06:00</updated><title type='text'>Edgy + Beryl =  Love</title><content type='html'>I spent the weekend upgrading my laptop from Ubuntu Dapper to Edgy. It was painful, relative to the usual seamless Ubuntu intra-release updating process. Painful, but surmountable. To reward myself after the pain, I installed the &lt;a href="http://www.beryl-project.org/"&gt;Beryl &lt;/a&gt;desktop. I LOVE BERYL! It renews my love affair with my computer! If you're unfamiliar with Beryl/Compiz, check out some of &lt;a href="http://www.youtube.com/results?search_query=beryl"&gt;these videos&lt;/a&gt;... but they don't do the user experience justice, trust me. It's worth the effort to try out Beryl.&lt;br /&gt;&lt;br /&gt;The rest of this posting is really for Googlers trying to solve upgrade issues from Dapper to Edgy, and also a little Beryl guidance. Welcome, visitors!&lt;br /&gt;&lt;br /&gt;After I upgraded using &lt;span style="font-family:courier new;"&gt;apt-get distupgrade&lt;/span&gt;, my system failed to boot into the new kernel. If you are booting and it seems to hang, wait three and four minutes, and you may see something like this:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;ALERT! /dev/disk/by-uuid/ed4395c8-e15c-4b20-8716-76ceff89614e does not exist. Dropping to a shell!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BusyBos v1.1.3 (DEbian 1:1.1.3-2ubuntu3) Built in shell (ash)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Enter 'help' for a list of built in commands.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;Don't panic. Since you're upgrading, you still have your old kernel you can boot into. Boot it, change to your &lt;span style="font-family:courier new;"&gt;/boot&lt;/span&gt; directory, and do this:&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;dpkg-reconfigure linux-image-2.6.17-10-generic&lt;br /&gt;&lt;/blockquote&gt;(use the same name suffix, e.g. "2.6.17-10-generic", as the new kernel you upgraded to). This command builds you a new initrd image file, and you will be able to boot.&lt;br /&gt;&lt;br /&gt;My second issue was particular to my laptop, a Dell Precision M70 with an Nvidia card. You really need your Nvidia card to work if you're going to use Beryl. Something in my default upgrade linked to the latest Nvidia driver (1.0-8776), but that driver did not come in the upgrade; X failed to start. Thanks to Alberto Milone for &lt;a href="http://albertomilone.com/driver_edgy.html"&gt;these excellent notes&lt;/a&gt; on upgrading the driver &lt;span style="font-style: italic;"&gt;without &lt;/span&gt;disabling your wireless card.&lt;br /&gt;&lt;br /&gt;I had a fair amount of trouble getting Compiz/Beryl to work. I had tried Compiz on Dapper, and never got a working install. After upgrading to Edgy and getting it stable, I investigated Beryl, and had similar trouble: Lots of garbage bits on the screen, windows with no titlebars or borders -- unusable and depressing.&lt;br /&gt;&lt;br /&gt;Finally I fixed all my problems by twiddling my xorg.conf. Here are the relevant twiddles (ymmv):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Section "Device"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Identifier    "NVIDIA Corporation NV41 [Quadro FX Go1400]"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;        Driver     "nvidia"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;        BusID      "PCI:1:0:0"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-family:courier new;" &gt;        &lt;span style="font-weight: bold;"&gt;Option     "RenderAccel" "true"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:courier new;" &gt;        Option     "AllowGLXWithComposite" "true"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:courier new;" &gt;        Option     "Triplebuffer" "true" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0); font-weight: bold;font-family:courier new;" &gt;        Option     "AddARGBGLXVisuals" "True"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;EndSection&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Section "Screen"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Identifier    "Default Screen"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Device        "NVIDIA Corporation NV41 [Quadro FX Go1400]"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Monitor        "Generic Monitor" &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);font-family:courier new;" &gt;# depth had been 16:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;DefaultDepth    24&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-6388404677412324711?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/6388404677412324711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=6388404677412324711' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6388404677412324711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/6388404677412324711'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/11/edgy-beryl-love.html' title='Edgy + Beryl =  Love'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115673617822529698</id><published>2006-08-27T22:36:00.000-05:00</published><updated>2006-11-06T11:35:50.890-06:00</updated><title type='text'>Tim Bray on Ruby and Python vs Lisp</title><content type='html'>&lt;a href="http://www.tbray.org/ongoing/When/200x/2006/08/22/Lt-Lt"&gt;Tim Bray&lt;/a&gt;: "If Lisp’s audience had been harried sysadmins rather than AI researchers, it’d rule the world by now."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115673617822529698?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tbray.org/ongoing/When/200x/2006/08/22/Lt-Lt' title='Tim Bray on Ruby and Python vs Lisp'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115673617822529698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115673617822529698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115673617822529698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115673617822529698'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/08/tim-bray-on-ruby-and-python-vs-lisp.html' title='Tim Bray on Ruby and Python vs Lisp'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115500015658357404</id><published>2006-08-07T20:22:00.000-05:00</published><updated>2006-11-06T11:35:50.752-06:00</updated><title type='text'>The Ruby Conspiracy</title><content type='html'>&lt;a href="http://gregluck.com/blog/archives/2006/07/report_from_osc.html"&gt;The Ruby Conspiracy&lt;/a&gt;: "Who are those who are benefiting from Ruby on Rails? Answer: O'Reilly Publishing, the authors Bruce Tate and Dave Thomas and a handful of consultants....We have two production applications running on Ruby. And how is it. Well, despite being perhaps no more than 5% of the functionality of our applications, Ruby on Rails is the number one consumer of Oracle CPU and logical gets....After all, the productivity benefits of Ruby are so much greater than Java you will save all of the money in development. Or do you. Our experience was that Ruby on Rails took longer than Java would have. And what about maintenance. Well we just refactor as things change. Or do we? There are no Ruby tools that support refactoring. And nor are they are expected due to the difficulties of implementing refactoring tools for Dynamic Languages, or so I am advised."&lt;br /&gt;&lt;br /&gt;Interpreted... tons of magic^H^H^H^H^H abstraction. Right.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115500015658357404?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://gregluck.com/blog/archives/2006/07/report_from_osc.html' title='The Ruby Conspiracy'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115500015658357404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115500015658357404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115500015658357404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115500015658357404'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/08/ruby-conspiracy.html' title='The Ruby Conspiracy'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115461928853936921</id><published>2006-08-03T10:34:00.000-05:00</published><updated>2006-11-06T11:35:50.683-06:00</updated><title type='text'>Voidstar - Desktop clients</title><content type='html'>Julian Bond references Martin Geddes &lt;a href="http://www.voidstar.com/node.php?id=2756"&gt;on desktop clients&lt;/a&gt; -- the browser, the messenger, the "manager":&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;All the portals are focussed on collecting everything you might read in one place. The "My Page". Nobody focusses on the reverse, collecting everything I create in one place *for other people* to read about me.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Analyzing along this line is getting closer to &lt;a href="http://hughw.blogspot.com/2006/08/youos.html"&gt; what I had in mind&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115461928853936921?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.voidstar.com/node.php?id=2756' title='Voidstar - Desktop clients'/><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115461928853936921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115461928853936921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115461928853936921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115461928853936921'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/08/voidstar-desktop-clients.html' title='Voidstar - Desktop clients'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115455425236805258</id><published>2006-08-02T16:14:00.000-05:00</published><updated>2006-11-06T11:35:50.618-06:00</updated><title type='text'>YouOS</title><content type='html'>My first reaction to &lt;a href="http://www.youos.com/"&gt;YouOS&lt;/a&gt;: Cool. A webtop that looks the same from wherever I log in.&lt;br /&gt;&lt;br /&gt;Second reaction: Hey, we had this in the 80's! Log in to any Sun on the LAN and your NFS shares are all in the same structure, your desktop just as you left it.&lt;br /&gt;&lt;br /&gt;Third reaction: Did we invent the web only to repro the 1984 Mac desktop yet again?&lt;br /&gt;&lt;br /&gt;Fourth reaction: There isn't hyperlink number one on this desktop. Shouldn't I be able to get the hyperlink of an object and send it to someone so they can see it or get it? &lt;br /&gt;&lt;br /&gt;I'm not sure what I'm looking for, but it needs to be more webby. It needs to enable something I can't do now with a desktop. There's some new metaphor we're groping for. I'll know it when I see it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115455425236805258?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115455425236805258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115455425236805258' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115455425236805258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115455425236805258'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/08/youos.html' title='YouOS'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115430518787460927</id><published>2006-07-30T19:14:00.000-05:00</published><updated>2006-11-06T11:35:50.549-06:00</updated><title type='text'>Understand the measurements</title><content type='html'>I'm  sort of a cycling nut. The events of the last week, and the last couple of years,  inspired me to put down these critical thoughts on anti-doping hysteria:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bayesian Analysis for Dummies&lt;/span&gt;&lt;br /&gt;My training is in geophysics. I have no expertise in biology. But as a geophysicist, I have worked with measurements a lot, and I  know how to assess them.&lt;br /&gt;&lt;br /&gt;Here's a simple example. Suppose a dangerous disease affects one of every 100,000 people. A lab develops a test that is always positive if you have the disease, but that gives a false positive in one percent of cases. Your test returned positive... do you have the disease?&lt;br /&gt;&lt;br /&gt;Well, you might. But chances are, you don't. In fact, your chances of having the disease are about one in a thousand. The “prior probability” of 100,000 to 1 dominates the test result. The test would have to show far fewer false positives to be a useful tool in diagnosing the disease.&lt;br /&gt;&lt;br /&gt;Recent accusations against cyclists – notably Floyd Landis, Lance Armstrong, and Tyler Hamilton, have been based on biological measurements. The measurements are valuable and largely trustworthy. But the meanings of all measurements need to be assessed in light of errors and uncertainties surrounding them. A newspaper publishes an article that Landis's testosterone to epitestosterone ratio (T/E)  exceed the allowed limits of 4.  Let's examine the measurements.&lt;br /&gt;&lt;br /&gt;First, go back to my earlier example. Substitute “testosterone abuse” for “deadly disease”, and assume one out of every ten cyclists is an abuser.  Is Landis guilty? Probably... but not certainly: His probability of guilt would be less than 92%. So eight times out of a hundred we would be wrong to take away his victory.&lt;br /&gt;&lt;br /&gt;But wait: the T/E test doesn't always give a positive result for abusers. Lots of abusers can pass that test. If we think 50% of abusers can scrape past, does that affect Landis's odds? Yep – now he's only 85% likely to have abused. Still want to apply a two year exile from the sport?&lt;br /&gt;&lt;br /&gt;Here's the  article that details that argument: &lt;a href="http://www.amstat.org/publications/chance/172.berry.pdf"&gt;Inferences about Testosterone Abuse among Athletes&lt;/a&gt;. They make this point: “Conclusions about the likelihood of testosterone doping require consideration of three components: specificity and sensitivity of the testing procedure, and the prior probability of use. As regards the T/E ratio, anti-doping officials consider only specificity. The result is a ﬂawed process of  inference.” In other words, the WADA procedures assume the test catches all abusers, and don't account for the known prevalence of abuse, so they're wrong.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Landis's Eleven&lt;/span&gt;&lt;br /&gt;Now how about those lab results, anyway? So far, we've just accepted the lab's numbers as golden. I have heard a ratio of 11:1 for Landis. But all measurements are uncertain. How certain is that 11:1? We want error bars around that number, 11.  Is there some non-zero chance the ratio is 10? 15? Even 4? If you ask WADA, it is just: Eleven. (As if Dick Pound would understand the question, or even hear you out.)&lt;br /&gt;&lt;br /&gt;How tall are you? Can you tell me to the 32nd of an inch, or to the millimeter? How about to the nanometer? At some level of granularity, you just can no longer resolve a difference in distance. And how about that yard stick you used to measure? Pretty sure it's accurate to a millimeter?  So instrument resolution is one source of uncertainty.&lt;br /&gt;&lt;br /&gt;Uncertainty is OK! We just have to know how large the potential errors are.&lt;br /&gt;&lt;br /&gt;In the case of the T/E ratio test, there are a lot of systems involved.  &lt;a href="http://en.wikipedia.org/wiki/Gas_Chromatograph"&gt;Gas chromatography&lt;/a&gt; is well understood, and there are uncertainty estimates available for the systems they use at LNDD (Laboratoire National de Dépistage du Dopage, the Lab testing Landis's samples). The process is temperature sensitive, so we'd really want to know the uncertainty bounds on the actual temperature program they used. The instrument documentation might give us some idea how to translate temperature variations into variations at the mass spectrometer output. There might also be some pressure control program pushing material through the column; how accurately do we understand the effect of uncertainty in the pressure? The mass spectrometer itself, only a subsystem of the whole, has its own uncertainty analysis.&lt;br /&gt;&lt;br /&gt;Below is an example of the mass spectrometer output for a similar experiment, taken from &lt;a href="http://www.scielo.br/scielo.php?script=sci_arttext&amp;amp;pid=S0103-50532006000200024"&gt;a recent paper on screening for steroids&lt;/a&gt;. If these peaks were epitestosterone and testosterone, this would be a picture similar to the analysis of Landis's sample.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3051/321/1600/gc-ms.0.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3051/321/320/gc-ms.0.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I think they get the E/T ratio by calculating the area under each of the two peaks, and dividing one by the other. So first of all, any uncertainty in the temperature  and pressure would affect these areas. Secondly, the process has to separate the peaks far enough apart so that the two “hills” don't bleed into one another. Thirdly, somebody has to decide where the hills “start and stop”. See that little bump at 12.30 above? Is it part of hill 2 or not? Judgment call.&lt;br /&gt;&lt;br /&gt;So  if we know how variations in the temperature and pressure affects the shape of the picture above, and if we  can estimate how the uncertainty in the  temperature and pressure during this test on Landis's sample, then we'd have some decent error bars on Landis's “Eleven”.&lt;br /&gt;&lt;br /&gt;Once you have error bounds on Landis's T/E ratio, you revisit the Bayesian analysis. Any appreciable uncertainty will decrease the likelihood that Landis abused testosterone.&lt;br /&gt;&lt;br /&gt;The analysis of Landis's sample won't stop with the T/E ratio test, of course. The next step evidently may be an IRMS analysis for the ratios of two carbon isotopes. As the news emerges, you should ask how the test works, and what are the uncertainties.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Armstrong and Hamilton&lt;/span&gt;&lt;br /&gt;And so with the charges against Armstrong made by l'Equipe last year, and with those against Tyler Hamilton in 2004. In &lt;a href="http://www.cyclingnews.com/news.php?id=news/2005/aug05/aug23news3"&gt;Armstrong's case&lt;/a&gt;, the uncertainty begins with the chain of custody. Then you have an experimental test, applied to six year old samples. In the &lt;a href="http://tylerhamilton.com/tylerscase232.html"&gt;Hamilton case&lt;/a&gt;, the anti-doping agencies   placed full faith and credit in a new test – only published months earlier -- with documented repeatability problems. The actual procedures in executing these tests are more complex and sensitive than the procedures for T/E. Yet, all we get from the lab is, “positive”. These positives are the results of judgments, made in good faith presumably, but not subject to review by the athletes or the public (see e.g.  the &lt;a href="http://www.cyclingnews.com/news/2006/jun06/vrijmanreport.pdf"&gt;Vrijman report&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;My point isn't that these men are innocent. My point is that the probability of their guilt is far less than the public assumes from news reports. We can pardon the public, and even the press,  for putting more faith in the numbers than they deserve. But the bureaucrats at the anti-doping agencies irresponsibly accuse athletes. They pay lip service to “science” but know nothing of it. They make great displays to be the most earnest of witch burners, lest they endanger their  jobs for lack of vigor pursuing dopers.  Cycling pays the price.&lt;span class="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;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Additional Reading&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.dailypeloton.com/displayarticle.asp?pk=9843"&gt;Can we handle the truth? We are our own worst enemy&lt;/a&gt; -- Knowledgeably explores the madness and injustice of the anti-doping regimes, from someone inside the sport.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115430518787460927?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115430518787460927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115430518787460927' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115430518787460927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115430518787460927'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/07/understand-measurements.html' title='Understand the measurements'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115421488461540292</id><published>2006-07-29T18:13:00.000-05:00</published><updated>2006-11-06T11:35:50.474-06:00</updated><title type='text'>Deep Quote</title><content type='html'>I've wanted a &lt;a href="http://deepquote.net/"&gt;service like this&lt;/a&gt; for a long time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115421488461540292?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115421488461540292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115421488461540292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115421488461540292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115421488461540292'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/07/deep-quote.html' title='Deep Quote'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115387239980737571</id><published>2006-07-25T19:06:00.000-05:00</published><updated>2006-11-06T11:35:50.241-06:00</updated><title type='text'>We'll never get O/R mapping right</title><content type='html'>Ted Neward calls O/R mapping a "quagmire" in &lt;a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx"&gt;The Vietnam of Computer Science.&lt;/a&gt; He's right (although the Vietnam analogy is a distraction).&lt;br /&gt;&lt;br /&gt;He considers approaches to licking the problem, and he almost gets it right with "Integration of relational concepts into the languages". Yeah -- but he limits his consideration to tweaks to mainstream languages (dismissing "fringe" languages like Ruby... not that Ruby's doing it right).&lt;br /&gt;&lt;br /&gt;We're not going to get this O/R mapping thing right... ever. It's the "O" in "O/R" that's the problem. We need languages that think in terms of tables or relations. The object languages have us whirling in a &lt;a href="http://en.wikipedia.org/wiki/Sapir-Whorf_hypothesis"&gt;Sapir-Whorf&lt;/a&gt; spiral. Relations -- tables -- are the language of data. Objects attempt to deal with data but in an ad-hoc way, with no grounding theory that enforces integrity and consistency; you enforce all that in procedural code. Objects may be a handy idiom for writing simulation programs. But the 99% of other programs out there that traffic in data, even transiently, need to be written ground up in a relation oriented language.&lt;br /&gt;&lt;br /&gt;Relation Oriented Programming: &lt;a href="http://hughw.blogspot.com/2005/08/i-need-new-language-rel.html"&gt;I've written about it before&lt;/a&gt;. I believe the right answer is going to be to construct a relational idiom in the fringe language Common Lisp. I've already begun! Expect results about the time &lt;a href="http://www.paulgraham.com/arc.html"&gt;Arc &lt;/a&gt;is ready.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115387239980737571?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115387239980737571/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115387239980737571' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115387239980737571'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115387239980737571'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/07/well-never-get-or-mapping-right.html' title='We&apos;ll never get O/R mapping right'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115066583271345333</id><published>2006-06-18T16:23:00.000-05:00</published><updated>2006-11-06T11:35:50.182-06:00</updated><title type='text'>But is it enterprisey class?</title><content type='html'>Via &lt;a href="http://alex.dojotoolkit.org/?p=562"&gt;Alex Russel&lt;/a&gt;, who calls attention to Sun's &lt;a href="https://phobos.dev.java.net/"&gt;Project Phobos&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The goal of Project Phobos is to show that Java is an excellent platform for server-side scripting, allowing dynamic-language developers to leverage the power of Java SE and EE. The initial focus for Project Phobos is JavaScript, but the design supports the use of other dynamic languages as well....Project Phobos attempts to learn from Rails, but is not limited to the use of any particular programming language and may prove to have a different sweet spot&lt;/blockquote&gt;&lt;br /&gt;I checked... the word "enterprise" does appear on that page, but only in the breadcrumbs (" Projects &gt;  java-enterprise  &gt;  enterprise-incubator  &gt;   phobos).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115066583271345333?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115066583271345333/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115066583271345333' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115066583271345333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115066583271345333'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/06/but-is-it-enterprisey-class.html' title='But is it enterprisey class?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-115061349967444610</id><published>2006-06-18T01:33:00.000-05:00</published><updated>2006-11-06T11:35:50.121-06:00</updated><title type='text'>Rich JavaScript Apps</title><content type='html'>Two developments are really going to accelerate rich Javascript web apps -- they sure have around here...&lt;br /&gt;&lt;br /&gt;1. &lt;a href="dojotoolkit"&gt;Dojo&lt;/a&gt; is a framework for building js + html + css widgets. A widget ends up looking like this in your html:&lt;br /&gt;&lt;blockquote&gt;&amp;lt;div turboalign="left" dojoType="TurboSplitter"&gt;&amp;lt;/div&amp;gt;&lt;/blockquote&gt;&lt;br /&gt;That is a splitbar widget from &lt;a href="http://www.turboajax.com/turbowidgets/"&gt;TurboAjax&lt;/a&gt;, who extend the Dojo framwork, and it really is that simple to put a sliding splitbar on a web page.&lt;br /&gt;&lt;br /&gt;2. Google has open sourced &lt;a href="http://excanvas.sourceforge.net/"&gt;Excanvas&lt;/a&gt;. This is a one line include that lets you script the &amp;lt;canvas&amp;gt; element in IE. &amp;lt;canvas&amp;gt; is an element available in Firefox, Safari, and Opera, and now &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#scs-dynamic"&gt;standardized by whatwg&lt;/a&gt;, that lets you script vector drawing primitives. Excanvas just implements all the Canvas apis in VML. Finally, a unified model for vector drawing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-115061349967444610?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/115061349967444610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=115061349967444610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115061349967444610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/115061349967444610'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/06/rich-javascript-apps.html' title='Rich JavaScript Apps'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114963814100926391</id><published>2006-06-06T18:46:00.000-05:00</published><updated>2006-11-06T11:35:50.057-06:00</updated><title type='text'>IT Consultants Underestimate the Long Tail. Again.</title><content type='html'>From &lt;a href="http://marketplace.publicradio.org/shows/2006/06/06/PM200606064.html"&gt;Marketplace's story&lt;/a&gt; on Google Spreadsheets:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I.T. consultant Gerald Murphy won't recommend it to his clients....&lt;br /&gt;    &lt;blockquote&gt;GERALD MURPHY: The only people I think this would have any applicability at all to are very small companies that have extremely limited budgets who wanna pay no money at all.&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Um, yeah. Sorta like the way Adwords lets all these very small companies advertise for pennies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114963814100926391?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114963814100926391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114963814100926391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114963814100926391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114963814100926391'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/06/it-consultants-underestimate-long-tail.html' title='IT Consultants Underestimate the Long Tail. Again.'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114879334766754940</id><published>2006-05-28T00:13:00.000-05:00</published><updated>2006-11-06T11:35:49.994-06:00</updated><title type='text'></title><content type='html'>Getcher &lt;a href="http://www.certifyr.com/"&gt;Web 2.0 Certification here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Requirements:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Big fonts&lt;br /&gt;Oversized input fields&lt;br /&gt;Silly or misspelled name&lt;br /&gt;"Beta"&lt;br /&gt;AJAX&lt;br /&gt;Community content&lt;br /&gt;"Something"-sharing&lt;br /&gt;Bright colors and/or pink&lt;br /&gt;Rounded corners&lt;br /&gt;Use of Google maps&lt;br /&gt;Founder has a blog&lt;br /&gt;RSS&lt;br /&gt;Tagging&lt;br /&gt;Creative commons&lt;br /&gt;Wiki&lt;br /&gt;Podcast/video/mobile content&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114879334766754940?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114879334766754940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114879334766754940' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114879334766754940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114879334766754940'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/05/getcher-web-2.html' title=''/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114877449132290108</id><published>2006-05-27T18:40:00.000-05:00</published><updated>2006-11-06T11:35:49.932-06:00</updated><title type='text'>Peter Seibel Video</title><content type='html'>Peter Seibel, author of the excellent &lt;a href="http://www.gigamonkeys.com/book/"&gt;Practical Common Lisp&lt;/a&gt;, gave &lt;a href="http://video.google.com/videoplay?docid=448441135356213813"&gt;this hour long presentation at Google&lt;/a&gt;, evangelizing Common Lisp. And here are the top three reasons &lt;a href="http://home.earthlink.net/~mrob/pub/lang_srom.html"&gt;CL rules and Java sort of sucks&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;3. He gives a good worked example of using CL generics to replace miles of Java code implementing the visitor pattern. The key is the "double dispatching" in the pattern: You visit each node, calling some polymorphic method; you pass the method a reference to the calling object, which may itself be polymorphic. So the number of cases to dispatch is m * n, where m and n are the number of possible types for each of the two objects involved in  the call. In CL, you just create a generic with m * n implementations; in Java, well, you have to touch a lot more code.&lt;br /&gt;&lt;br /&gt;2. He contrasts ordinary try/catch exception handling with CL's conditions mechanism. Java unwinds the stack, losing all the state; CL notifies handlers up the stack without   yet unwinding the stack, so that a handler up the stack can ask a function lower down to restart.&lt;br /&gt;&lt;br /&gt;1. CL Macros let you abstract out syntax paterns. &lt;br /&gt;&lt;br /&gt;It's the kind of video you can mostly listen to and only watch occasionally, as you get other work done -- just the way you'd do if you were at the presentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114877449132290108?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114877449132290108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114877449132290108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114877449132290108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114877449132290108'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/05/peter-seibel-video.html' title='Peter Seibel Video'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114652579965989042</id><published>2006-05-01T18:23:00.000-05:00</published><updated>2006-11-06T11:35:49.871-06:00</updated><title type='text'>80/20 REST at Amazon</title><content type='html'>The Register has  &lt;a href="http://www.regdeveloper.co.uk/2006/04/29/oreilly_amazon/"&gt;short interviews with Tim O'Reilly and Amazon's Jeff Barr&lt;/a&gt; on WS-* vs REST, and unsurprisingly, REST "wins". Barr says they see "20 per cent SOAP, 80 per cent REST."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114652579965989042?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114652579965989042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114652579965989042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114652579965989042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114652579965989042'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/05/8020-rest-at-amazon.html' title='80/20 REST at Amazon'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114618610211721915</id><published>2006-04-27T20:01:00.000-05:00</published><updated>2006-11-06T11:35:49.812-06:00</updated><title type='text'>The Enterprisey Web Style</title><content type='html'>Oh this is too funny: &lt;a href="http://blog.labnotes.org/2006/04/26/soa-integration-with-flickr-and-delicious/"&gt;SOA integration with Flickr and del.icio.us&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We picked a messaging bus that uses the industry standard WS-HTTP and the emerging WS-Blog protocol.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;But you &lt;span style="font-style:italic;"&gt;know &lt;/span&gt;this is how the consulting crowd are going to sell web style, starting very soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114618610211721915?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114618610211721915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114618610211721915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114618610211721915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114618610211721915'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/04/enterprisey-web-style.html' title='The Enterprisey Web Style'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114593654657626770</id><published>2006-04-24T22:42:00.000-05:00</published><updated>2006-11-06T11:35:49.736-06:00</updated><title type='text'>GData Optimistic concurrency</title><content type='html'>&lt;a href="http://code.google.com/apis/gdata/overview.html"&gt;Google Data APIs&lt;/a&gt; beat Atompub to the punch and stamped legitimacy on REST. I hope Atompub will end up looking as nearly like GData as possible.&lt;br /&gt;&lt;br /&gt;Of note: this is a Hi-Rest API, and now, we can safely say, it's the way the web actually works. Not just &lt;a href="http://pluralsight.com/blogs/dbox/archive/2006/04/12/21613.aspx"&gt;the way some very dedicated people aspire for the web to work&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;So enough rejoicing. Let's begin analyzing GData to death. &lt;br /&gt;&lt;br /&gt;First technical question: &lt;a href="http://code.google.com/apis/gdata/protocol.html#Optimistic-concurrency"&gt;optimistic concurrency&lt;/a&gt;: What's wrong with plain old &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;HTTP if-unmodified-since/if-match&lt;/a&gt;? That's how you guard against concurrent updates in HTTP right? Why invent a new protocol for that?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114593654657626770?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114593654657626770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114593654657626770' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114593654657626770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114593654657626770'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/04/gdata-optimistic-concurrency.html' title='GData Optimistic concurrency'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114438634045495573</id><published>2006-04-06T23:55:00.000-05:00</published><updated>2006-11-06T11:35:49.674-06:00</updated><title type='text'>SOAP+REST: Why?</title><content type='html'>&lt;a href="http://www.mnot.net/blog/2006/04/06/soap_http"&gt;mnot declares&lt;/a&gt; &lt;blockquote&gt;I’m a little confused by Mark Baker’s stance regarding SOAP; he seems to encourage the Web services world to use SOAP on top of HTTP in a fashion compatible with HTTP.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;MarkB responds he's offering a face-saving out for SOAP vendors. Is that the best reason? I can't think of one reason to wrap the messages I traffic in, in a SOAP envelope. What are the use cases for RESTful SOAP, please?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114438634045495573?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114438634045495573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114438634045495573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114438634045495573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114438634045495573'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/04/soaprest-why.html' title='SOAP+REST: Why?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114433573073876110</id><published>2006-04-06T09:55:00.000-05:00</published><updated>2006-11-06T11:35:49.612-06:00</updated><title type='text'>Slightly More Complex List Extensions</title><content type='html'>Using the MS &lt;a href="http://msdn.microsoft.com/XML/rss/sle/default.aspx"&gt;Simple List Extensions for RSS and Atom&lt;/a&gt;, you can really make a "feed" be anything you want it to be. Anything you can put between the angle brackets of a &amp;lt;cf:treatAs&amp;gt; tag, you can represent in a feed. I call it SMCLE (Slightly More Complex List Extensions).&lt;br /&gt;&lt;br /&gt;Here is how it will work:&lt;br /&gt;&lt;br /&gt;We'll define several new values for &amp;lt;cf:treatAs&amp;gt; element. Currently the only defined value is "list". Now we will have:&lt;br /&gt;  &lt;code&gt;&amp;lt;cf:treatAs&gt;Bag&amp;lt;/cf:treatAs&amp;gt;&lt;/code&gt; : the items form an unordered collection.&lt;br /&gt;  &lt;code&gt;&amp;lt;cf:treatAs&amp;gt;Queue&amp;lt;/cf:treatAs&amp;gt;&lt;/code&gt; : the items form a fifo queue.&lt;br /&gt;  &lt;code&gt;&amp;lt;cf:treatAs&amp;gt;Stack&amp;lt;/cf:treatAs&amp;gt;&lt;/code&gt; : the items form a lifo queue. &lt;br /&gt;  &lt;code&gt;&amp;lt;cf:treatAs&amp;gt;CircularQueue&amp;lt;/cf:treatAs&amp;gt;&lt;/code&gt; : when you get to the end of the collection, start over again at the top.&lt;br /&gt;  &lt;code&gt;&amp;lt;cf:treatAs&amp;gt;OneBigString&amp;lt;/cf:treatAs&amp;gt;&lt;/code&gt; : the items aren't items at all, in the RSS/Atom sense. The content of items really should be concatenated to form one big string.&lt;br /&gt;&lt;br /&gt;Additionally, we'll allow extension namespaces so you can define your own "treatAs" values, e.g.:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;cf:treatAs ns="http://my.example.com/smcle"&gt;JavaScriptStatements&amp;lt;/cf:treatAs&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now, I know your aggregator is going to suck if it can't process all these variations correctly. Not to worry: the MS Feeds API will handle it all for you! In fact, the MS Feeds API will pretty much become the definition of a feed. If it doesn't work with the API, you don't need it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114433573073876110?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114433573073876110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114433573073876110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114433573073876110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114433573073876110'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/04/slightly-more-complex-list-extensions.html' title='Slightly More Complex List Extensions'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114426181426014521</id><published>2006-04-05T13:14:00.000-05:00</published><updated>2006-11-06T11:35:49.488-06:00</updated><title type='text'>Simple List Extensions: Invidious?</title><content type='html'>The Microsoft &lt;a href="http://blogs.msdn.com/rssteam/archive/2006/03/29/564154.aspx"&gt;Simple List Extensions&lt;/a&gt; for RSS + Atom seem like a great idea. You declare attributes for your entries -- like Artist, Date Added, Price, Sales Rank -- and then set the attribute values on each entry. It's a tiny little schema language, with a type system. IE7 can then sort and filter the entries based on those attribute values.&lt;br /&gt;&lt;br /&gt;The problem is that once you have that capability, you come to rely on it. If your site has a thousand entries, you can serve it up as a single feed with attributes allowing the &lt;span style="font-style:italic;"&gt;client&lt;/span&gt; to filter. But you'd organize your site differently if clients didn't have that capability. So, for feed readers not supporting SLE, you'd want to break up your site into several feeds, maybe one for each Artist.&lt;br /&gt;&lt;br /&gt;I'm sure every feed reader will have to support these extensions. Otherwise they would appear to suck on feeds that rely on SLE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114426181426014521?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114426181426014521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114426181426014521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114426181426014521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114426181426014521'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/04/simple-list-extensions-invidious.html' title='Simple List Extensions: Invidious?'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114378363862286293</id><published>2006-03-30T23:35:00.000-06:00</published><updated>2006-11-06T11:35:49.415-06:00</updated><title type='text'>IE7 Transforms Atom to RSS 2</title><content type='html'>I put a little mileage on IE7 feeds today.&lt;br /&gt;&lt;br /&gt;First this Wellstorm Atom feed. Of note: a) it validates on Feed validator; b) it uses an extension namespace; c) it specifies a CSS stylesheet.&lt;br /&gt;&lt;br /&gt;I've pasted in the relevant files below.&lt;br /&gt;&lt;br /&gt;Observations:&lt;br /&gt;&lt;br /&gt;IE7 uses its own stylesheet, ignoring mine. That's ok I guess; it's a smart client, so it should be styling to suit its own purposes.&lt;br /&gt;&lt;br /&gt;Before you subscribe, View Source: It displays the Atom xml content. &lt;br /&gt;&lt;br /&gt;After you subscribe, View Source: IE7 has transformed the Atom to RSS 2.0. &lt;br /&gt;&lt;br /&gt;Unfortunately, within IE7 you can never again view the original atom file! You can't enter the URL and View Source... it always shows it transformed to RSS. Weird.&lt;br /&gt;&lt;br /&gt;Here is the Atom feed:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;?xml-stylesheet href="http://www.hughw.net:8080/witsml/styles/atom.css" type="text/css"?&amp;gt;&lt;br /&gt;&amp;lt;feed xmlns="http://www.w3.org/2005/Atom" xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;http://www.hughw.net:8080/witsml/atom/Default%20Repository/!well&amp;lt;/id&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;title&amp;gt;WITSML Repository&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;updated&amp;gt;2006-03-17T14:01:14.935-06:00&amp;lt;/updated&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;link rel="self" href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/!well"/&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;entry&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;6507/7-A-42&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;link href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12.rby" rel="http://www.wixp.org/rel/contains"/&amp;gt;&lt;br /&gt;    &amp;lt;updated&amp;gt;2001-05-31T08:15:00.000000+00:00&amp;lt;/updated&amp;gt;&lt;br /&gt;    &amp;lt;published&amp;gt;2001-04-30T08:15:00.000000+00:00&amp;lt;/published&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;author&amp;gt;&amp;lt;name&amp;gt;John Smith&amp;lt;/name&amp;gt;&amp;lt;/author&amp;gt;&lt;br /&gt;    &amp;lt;wixp:ObjectType&amp;gt;well&amp;lt;/wixp:ObjectType&amp;gt;&lt;br /&gt;    &amp;lt;wixp:LastModified&amp;gt;2006-03-17T14:01:14.935-06:00&amp;lt;/wixp:LastModified&amp;gt;&lt;br /&gt;    &amp;lt;wixp:Name&amp;gt;6507/7-A-42&amp;lt;/wixp:Name&amp;gt;&lt;br /&gt;    &amp;lt;wixp:uidWell&amp;gt;W-12&amp;lt;/wixp:uidWell&amp;gt;&lt;br /&gt;    &amp;lt;wixp:nameSource&amp;gt;John Smith&amp;lt;/wixp:nameSource&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;wixp:dTimStamp&amp;gt;2001-05-31T08:15:00.000000+00:00&amp;lt;/wixp:dTimStamp&amp;gt;&lt;br /&gt;    &amp;lt;wixp:dTimCreation&amp;gt;2001-04-30T08:15:00.000000+00:00&amp;lt;/wixp:dTimCreation&amp;gt;&lt;br /&gt;    &amp;lt;wixp:dTimLastChange&amp;gt;2001-05-31T08:15:00.000000+00:00&amp;lt;/wixp:dTimLastChange&amp;gt;&lt;br /&gt;    &amp;lt;wixp:itemState&amp;gt;Plan&amp;lt;/wixp:itemState&amp;gt;&lt;br /&gt;    &amp;lt;wixp:comments&amp;gt;These are the comments associated with the Well data object.&amp;lt;/wixp:comments&amp;gt;&lt;br /&gt;    &amp;lt;summary type="xhtml"&amp;gt;&amp;lt;div xmlns="http://www.w3.org/1999/xhtml"&amp;gt;&amp;lt;a href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12"&amp;gt;well 6507/7-A-42&amp;lt;/a&amp;gt; &amp;lt;a href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12.rby"&amp;gt;[contents]&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/summary&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;content src="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12" type="application/x.witsml+xml"/&amp;gt;&lt;br /&gt;  &amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;lt;/feed&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is the IE7 persisted version:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"&lt;br /&gt;    xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005"&amp;gt;&lt;br /&gt;    &amp;lt;channel&amp;gt;&lt;br /&gt;        &amp;lt;guid isPermaLink="false"&amp;gt;http://www.hughw.net:8080/witsml/atom/Default%20Repository/!well&amp;lt;/guid&amp;gt;&lt;br /&gt;        &amp;lt;title cf:type="text"&amp;gt;WITSML Repository&amp;lt;/title&amp;gt;&lt;br /&gt;        &amp;lt;pubDate&amp;gt;Fri, 17 Mar 2006 14:01:14 GMT&amp;lt;/pubDate&amp;gt;&lt;br /&gt;        &amp;lt;atom:link href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/!well"&lt;br /&gt;            rel="self"/&amp;gt;&lt;br /&gt;        &amp;lt;item&amp;gt;&lt;br /&gt;            &amp;lt;guid isPermaLink="false"&lt;br /&gt;                &amp;gt;http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12&amp;lt;/guid&amp;gt;&lt;br /&gt;            &amp;lt;title xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" cf:type="text"&lt;br /&gt;                &amp;gt;6507/7-A-42&amp;lt;/title&amp;gt;&lt;br /&gt;            &amp;lt;atom:link xmlns:atom="http://www.w3.org/2005/Atom"&lt;br /&gt;                href="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12.rby"&lt;br /&gt;                rel="http://www.wixp.org/rel/contains"/&amp;gt;&lt;br /&gt;            &amp;lt;pubDate&amp;gt;Thu, 31 May 2001 08:15:00 GMT&amp;lt;/pubDate&amp;gt;&lt;br /&gt;            &amp;lt;atom:published xmlns:atom="http://www.w3.org/2005/Atom"&amp;gt;Mon, 30 Apr 2001 08:15:00 GMT&amp;lt;/atom:published&amp;gt;&lt;br /&gt;            &amp;lt;author&amp;gt;John Smith&amp;lt;/author&amp;gt;&lt;br /&gt;            &amp;lt;atom:author xmlns:atom="http://www.w3.org/2005/Atom"&amp;gt;&lt;br /&gt;                &amp;lt;atom:name&amp;gt;John Smith&amp;lt;/atom:name&amp;gt;&lt;br /&gt;            &amp;lt;/atom:author&amp;gt;&lt;br /&gt;            &amp;lt;wixp:ObjectType xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;well&amp;lt;/wixp:ObjectType&amp;gt;&lt;br /&gt;            &amp;lt;wixp:LastModified xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;2006-03-17T14:01:14.935-06:00&amp;lt;/wixp:LastModified&amp;gt;&lt;br /&gt;            &amp;lt;wixp:Name xmlns="http://www.w3.org/2005/Atom" xmlns:wixp="http://www.wixp.org/ns/atom"&lt;br /&gt;                &amp;gt;6507/7-A-42&amp;lt;/wixp:Name&amp;gt;&lt;br /&gt;            &amp;lt;wixp:uidWell xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;W-12&amp;lt;/wixp:uidWell&amp;gt;&lt;br /&gt;            &amp;lt;wixp:nameSource xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;John Smith&amp;lt;/wixp:nameSource&amp;gt;&lt;br /&gt;            &amp;lt;wixp:dTimStamp xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;2001-05-31T08:15:00.000000+00:00&amp;lt;/wixp:dTimStamp&amp;gt;&lt;br /&gt;            &amp;lt;wixp:dTimCreation xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;2001-04-30T08:15:00.000000+00:00&amp;lt;/wixp:dTimCreation&amp;gt;&lt;br /&gt;            &amp;lt;wixp:dTimLastChange xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;2001-05-31T08:15:00.000000+00:00&amp;lt;/wixp:dTimLastChange&amp;gt;&lt;br /&gt;            &amp;lt;wixp:itemState xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;Plan&amp;lt;/wixp:itemState&amp;gt;&lt;br /&gt;            &amp;lt;wixp:comments xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"&amp;gt;These are the comments associated with the&lt;br /&gt;                Well data object.&amp;lt;/wixp:comments&amp;gt;&lt;br /&gt;            &amp;lt;description xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" cf:type="html"&lt;br /&gt;                &amp;gt;&amp;lt;div&amp;gt;&amp;lt;a href="http://www.hughw.net:8080/witsml/atom/Default&lt;br /&gt;                Repository/well.W-12"&amp;gt;well 6507/7-A-42&amp;lt;/a&amp;gt; &amp;lt;a&lt;br /&gt;                href="http://www.hughw.net:8080/witsml/atom/Default&lt;br /&gt;                Repository/well.W-12.rby"&amp;gt;[contents]&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/description&amp;gt;&lt;br /&gt;            &amp;lt;content src="http://www.hughw.net:8080/witsml/atom/Default%20Repository/well.W-12"&lt;br /&gt;                type="application/x.witsml+xml" xmlns="http://www.w3.org/2005/Atom"&lt;br /&gt;                xmlns:wixp="http://www.wixp.org/ns/atom"/&amp;gt;&lt;br /&gt;            &amp;lt;cf:id&amp;gt;0&amp;lt;/cf:id&amp;gt;&lt;br /&gt;            &amp;lt;cf:read&amp;gt;true&amp;lt;/cf:read&amp;gt;&lt;br /&gt;        &amp;lt;/item&amp;gt;&lt;br /&gt;    &amp;lt;/channel&amp;gt;&lt;br /&gt;&amp;lt;/rss&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114378363862286293?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114378363862286293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114378363862286293' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114378363862286293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114378363862286293'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/ie7-transforms-atom-to-rss-2.html' title='IE7 Transforms Atom to RSS 2'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114351824644480083</id><published>2006-03-27T21:56:00.001-06:00</published><updated>2006-11-06T11:35:49.356-06:00</updated><title type='text'>Lisp for Entrepreneurs</title><content type='html'>Yet another &lt;a href="http://bc.tech.coop/blog/060304.html"&gt;Lisp is for Entrepreneurs&lt;/a&gt; link -- this one from Bill Clementson. Programming languages are converging on Lisp, so I'm bypassing the deep dive on Ruby... &lt;br /&gt;&lt;br /&gt;I've gone deep on Lisp recently and I have to tell you: maybe I'm not smart enough to be a Lisp programmer, at least soon enough. I've written a functioning, and reasonably complex, program (a Gibbs sampler for a Bayesian network) but I can hardly read the thing. It's all (car(cdr(assoc('xxx ...)))) ...that design is nobody's fault but my own, but it's just the path of least resistance as I'm writing the thing. I &lt;span style="font-style:italic;"&gt;have&lt;/span&gt; begun to see a few glimmers of possibilities I don't have in other languages. I've written a macro, and I get it. I've passed lambdas to functions. This code is a a lot terser than a Java version I wrote years ago. Terse is good, right? But I have to comment the code more extensively because it's not really "self describing."&lt;br /&gt;&lt;br /&gt;Maybe I'm the sort of weak-natured guy who needs an early-binding language enforcing the discipline up front. 'Cause I have to admit, strong typing makes me write better programs. It's a character flaw.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114351824644480083?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114351824644480083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114351824644480083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114351824644480083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114351824644480083'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/lisp-for-entrepreneurs.html' title='Lisp for Entrepreneurs'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114308560265244940</id><published>2006-03-22T21:46:00.000-06:00</published><updated>2006-11-06T11:35:49.230-06:00</updated><title type='text'>Microcontent Three-Way Processses</title><content type='html'>We're all going to have to package our services as &lt;a href="http://www.readwriteweb.com/archives/microcontent_de.php"&gt;microcontent&lt;/a&gt; (via &lt;a href="http://seanmcgrath.blogspot.com/archives/2006_03_19_seanmcgrath_archive.html#114301889699453423"&gt;Sean McGrath&lt;/a&gt;). For those of us in the business of delivering "two-way" data services, our webapps will wither. Good!&lt;br /&gt;&lt;br /&gt;Now we have to figure out how to get paid. I can deliver some critical information to you via Atom or RSS. And you have some client subscribing, consuming, and processing that data on your behalf. I need to get paid by subscription, or by the piece. I'll no longer have a webapp where you subscribe or agree to purchase single items, and where I meter your consumption. Aggregators, and successor services like them, will have to do that. So we need extensions to &lt;a href="http://www.ietf.org/html.charters/atompub-charter.html"&gt;APP&lt;/a&gt; to compose three-way transactions.&lt;br /&gt;&lt;br /&gt;So you will initiate a subscription via your aggregating service. I'm not neccessarily talking about a feed aggregator; this might be some specialized service in a vertical, like stock quotes. It will collect your personal and payment information. It will contact me to subscribe you. It will send me your PayPal, or whatever, payment authorization. I will respond with approval or denial. When retrieving information on your behalf, your aggregator definitely has to tell me you are retrieving that information, so I can authorize it. Contrast to current practice: aggregators retrieve a feed on behalf of hundreds of anonymous users. And we have to address the issue of whether I trust the aggregator service to tell me the truth,  or whether we can design protocols preventing it paying for one subscription when it has sold 20. &lt;br /&gt;&lt;br /&gt;To make that happen, we'll need a microcontent business process specification that can compose three-way transactions. And it has to be as simple and transparent as RSS and Atom. I'm &lt;span style="font-style:italic;"&gt;not &lt;/span&gt;talking about &lt;a href="http://www.ebxml.org/specs/ebBPSS.pdf"&gt;BPSS&lt;/a&gt;, although there's a lot to be learned there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114308560265244940?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114308560265244940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114308560265244940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114308560265244940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114308560265244940'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/microcontent-three-way-processses.html' title='Microcontent Three-Way Processses'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114307766374717869</id><published>2006-03-22T19:34:00.000-06:00</published><updated>2006-11-06T11:35:49.172-06:00</updated><title type='text'>Spooky Rojo Mojo</title><content type='html'>Alerted by &lt;a href="http://www.markbaker.ca/2002/09/Blog/2006/03/18#2006-03-switch"&gt;Mark's post&lt;/a&gt; that he switched to &lt;a href="http://www.rojo.com/"&gt;Rojo&lt;/a&gt;, I just now signed up to give it a try. After going through the wizard, I land on my new home feeds page. And my very first "Rojo Feed Recommendation" is:  Mark's &lt;span style="font-style: italic;"&gt;other&lt;/span&gt; blog, &lt;a href="http://www.coactus.com/blog/"&gt;Integrate This&lt;/a&gt;. And no, I haven't imported my feeds from Bloglines yet!&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/3051/321/1600/Rojo.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/3051/321/320/Rojo.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;--&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114307766374717869?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114307766374717869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114307766374717869' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114307766374717869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114307766374717869'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/spooky-rojo-mojo.html' title='Spooky Rojo Mojo'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114256503929907046</id><published>2006-03-16T21:10:00.000-06:00</published><updated>2006-11-06T11:35:49.054-06:00</updated><title type='text'>URIs are opaque, except when they're not</title><content type='html'>Roy &lt;a href="http://groups.yahoo.com/group/rest-discuss/message/5703"&gt;jumps in&lt;/a&gt; to clarify the law about URI opaqueness:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The key is that the server is free to tell the client that there does exist structure in a given URI-space, and then the client is free to make use of that knowledge in future requests. That is how server-side imagemaps worked -- HTML says that the URI is structured such that appending "?X,Y" to that URI, where X and Y are non-negative integers, corresponds to points on a map that can respond to future GET requests. &lt;br /&gt;&lt;br /&gt;Thus, one way for the server to tell the client that a given URI is structured is to provide the URI in a standard element of a standard media type that has been defined as such.  Another is to include the URI in a response header field.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I may be having my own, belated &lt;a href="http://groups.yahoo.com/group/rest-discuss/message/3235"&gt;moment of total, violent, zen clarity&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114256503929907046?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114256503929907046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114256503929907046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114256503929907046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114256503929907046'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/uris-are-opaque-except-when-theyre-not_16.html' title='URIs are opaque, except when they&apos;re not'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114153260484750289</id><published>2006-03-04T22:17:00.000-06:00</published><updated>2006-11-06T11:35:48.935-06:00</updated><title type='text'>Patterns Problem</title><content type='html'>Peter Seibel's book has a &lt;a href="http://www.gigamonkeys.com/book/practical-building-a-unit-test-framework.html#an-abstraction-emerges"&gt;nice analysis&lt;/a&gt; of the &lt;a href="http://hughw.blogspot.com/2006/02/patterns-another-way-to-say-bloat.html"&gt;"patterns problem"&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;The reason both these functions start the same way is because they're both test functions. The duplication arises because, at the moment, test function is only half an abstraction. The abstraction exists in your mind, but in the code there's no way to express "this is a test function" other than to write code that follows a particular pattern.&lt;br /&gt;&lt;br /&gt;Unfortunately, partial abstractions are a crummy tool for building software. Because a half abstraction is expressed in code by a manifestation of the pattern, you're guaranteed to have massive code duplication with all the normal bad consequences that implies for maintainability. More subtly, because the abstraction exists only in the minds of programmers, there's no mechanism to make sure different programmers (or even the same programmer working at different times) actually understand the abstraction the same way. To make a complete abstraction, you need a way to express "this is a test function" and have all the code required by the pattern be generated for you. In other words, you need a macro.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Lisp, again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114153260484750289?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114153260484750289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114153260484750289' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114153260484750289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114153260484750289'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/03/patterns-problem.html' title='Patterns Problem'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114062157233306341</id><published>2006-02-22T09:04:00.000-06:00</published><updated>2006-11-06T11:35:48.873-06:00</updated><title type='text'>IE7 Quick Take</title><content type='html'>Curious about IE7, I installed the &lt;a href="http://www.microsoft.com/windows/IE/ie7/ie7betaredirect.mspx"&gt;beta preview&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;The browser itself looks OK. Basically it's Firefox look and feel. Tabs. Wow. I'm interested in exploring the RSS/Atom support but did not get the chance to exercise much. They do have a little "subscribe" icon that looks just like Firefox's. It makes you wonder: If it takes the equivalent of a space program to catch up to dinky little Firefox and feed aggregators, how is MS going to keep up with whatever comes next? They'll be starting out a nose behind. The little guys will blazing new continents before MS ships Vista. &lt;br /&gt;&lt;br /&gt;About ten hours later, I had to do System Restore to get back to IE6. Principally, that's because I was working on a project using somewhat unfamiliar tools ( Nullsoft Installer and VS 2003) and needing the online help a lot. After installing IE7, almost no pages were visible in the Nullsfoft CHM, and all the pages lost their styling in VS online help. &lt;br /&gt;&lt;br /&gt;Demonstrating the tightly coupled Microsoft world: Install IE7 and you'll be "upgrading" several other products that used to work just fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114062157233306341?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114062157233306341/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114062157233306341' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114062157233306341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114062157233306341'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/02/ie7-quick-take.html' title='IE7 Quick Take'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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-6301633.post-114004208747465500</id><published>2006-02-15T16:21:00.000-06:00</published><updated>2006-11-06T11:35:48.814-06:00</updated><title type='text'>Nokia, Ericsson gonna slap you upside the head</title><content type='html'>Fear, uncertainty, and doubt being spread by &lt;a href="http://www.ironmountain-ipm.com/"&gt;Iron Mountain&lt;/a&gt; to get webheads to enroll in &lt;a href="http://ironmountain-ipm.webex.com/ironmountain-ipm/mywebex/default.php"&gt;their seminar&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In May 2006 the new global .MOBI top-level domain extension is expected to arrive. It’s not the usual "yada-yada" new domain extension. It’s backed by major players in the mobile world, like Ericsson, GSM Association, Hutchison, Microsoft, Nokia, Samsung Electronics, Syniverse Technologies, Telefonica Moviles, TIM, T-Mobile and Vodafone. These investors are serious about bringing a much better and consistent mobile browsing experience to all users no matter what device they may be using. &lt;span style="font-weight:bold;"&gt;They plan on enforcing certain web site formatting requirements. Failure to comply may mean you are shut out reaching mobile users, even if you meet all legal requirements for registering a .MOBI domain name.&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6301633-114004208747465500?l=hughw.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hughw.blogspot.com/feeds/114004208747465500/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6301633&amp;postID=114004208747465500' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114004208747465500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6301633/posts/default/114004208747465500'/><link rel='alternate' type='text/html' href='http://hughw.blogspot.com/2006/02/nokia-ericsson-gonna-slap-you-upside.html' title='Nokia, Ericsson gonna slap you upside the head'/><author><name>hughw</name><uri>http://www.blogger.com/profile/04766131116514643236</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>
