<?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-6043566615205767088</id><updated>2012-01-31T00:55:05.337-08:00</updated><category term='linux'/><category term='apache'/><category term='recover jpeg compact flash C GCC tail recursion'/><category term='xml'/><category term='smd'/><category term='child'/><category term='education'/><category term='ws'/><category term='soap'/><category term='asf'/><category term='olpc'/><category term='tool'/><category term='web'/><category term='europa'/><category term='sdo'/><category term='soa'/><category term='wsdl'/><category term='open source'/><category term='conference'/><category term='web services'/><category term='rest'/><category term='composite'/><category term='scratch sca component assembly'/><category term='tuscany'/><category term='websphere'/><category term='csa'/><category term='json javascript python scheme yaml apache tuscany sca'/><category term='laptopgiving'/><category term='atom'/><category term='sca'/><category term='open'/><category term='eclipse'/><category term='framework'/><category term='ubuntu'/><category term='abdera'/><category term='osoa'/><category term='oasis'/><category term='json'/><category term='laptop'/><title type='text'>Sebastien's blog</title><subtitle type='html'>(define blog (map (lambda (t) (post t)) (filter (lambda (t) (= 1 (random 2))) thoughts)))</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>70</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8358101922639651049</id><published>2012-01-31T00:55:00.000-08:00</published><updated>2012-01-31T00:55:05.352-08:00</updated><title type='text'>We Really Don't Know How To Compute!</title><content type='html'>One of my new year resolutions was to blog more. It's not working out yet, as I've been too busy the last few weeks. It's already Jan 31 and this is only my second blog entry this year.&lt;br /&gt;&lt;br /&gt;I recently came across a fascinating &lt;a href="http://www.infoq.com/presentations/We-Really-Dont-Know-How-To-Compute"&gt;presentation&lt;/a&gt; from &lt;a href="http://en.wikipedia.org/wiki/Gerald_Jay_Sussman"&gt;Gerald Jay Sussman&lt;/a&gt;, co-author of the famous MIT computer science text book '&lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;' and co-inventor of the &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt; programming language.&lt;br /&gt;&lt;br /&gt;He claims that &lt;b&gt;we really don't know how to compute&lt;/b&gt;, compares computer programs  (constrained to rigid designs and difficult to adjust to a new situation) to living organisms (which can be reconfigured to implement new ways to solve a problem) and makes a convincing argument that &lt;b&gt;we need drastically different programming models&lt;/b&gt; to approach that level of flexibility.&lt;br /&gt;&lt;br /&gt;He then introduces the &lt;b&gt;&lt;a href="http://groups.csail.mit.edu/mac/users/gjs/propagators/"&gt;Propagator Programming Model&lt;/a&gt;&lt;/b&gt; (work supported in part by the &lt;a href="http://mmp.cba.mit.edu/"&gt;MIT Mind Machine&lt;/a&gt; project). A propagator program is built as a &lt;b&gt;network connecting cells and propagators&lt;/b&gt;. Cells collect and accumulate information. Propagators are autonomous machines which continuously examine some cells, perform computations on the information from these cells and add the results to other cells.&lt;br /&gt;&lt;br /&gt;A propagator program is &lt;b&gt;analogous to an electrical wiring diagram&lt;/b&gt;. To extend it and add a new way to approach a problem, you simply add and connect new propagators. Your cells now collect alternate results from different propagators, and you can then decide to merge redundant results, combine partial results, or even exclude contradictory results when some propagators do not work well in a new situation.&lt;br /&gt;&lt;br /&gt;This is &lt;b&gt;similar to how human beings resolve problems&lt;/b&gt;. We try several approaches, weigh and combine their results, then wire up our brain with the approaches that work well for the next time we face a similar situation.&lt;br /&gt;&lt;br /&gt;I couldn't help but see some relation between that propagator model and my recent interests in computer programming models.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Massively Parallel programming&lt;/b&gt;&lt;br /&gt;A propagator program is naturally parallel. Each propagator is continually watching its neighbor cells and computing new results as their values change, autonomously and in parallel with other parts of the program.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Functional programming&lt;/b&gt;&lt;br /&gt;A propagator is like a pure function that computes results only from its inputs. A result can also be wrapped in a &lt;a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)"&gt;monad&lt;/a&gt; to provide information about its premises, relevance or correctness (useful to pick or combine partial results as they accumulate in a cell for example).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Web Component Assembly&lt;/b&gt;&lt;br /&gt;The wiring diagram describing a propagator program seems to map really well to an &lt;b&gt;&lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-assembly"&gt;SCA&lt;/a&gt;&lt;/b&gt; (&lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-assembly"&gt;Service Component Architecture&lt;/a&gt;) component assembly wiring diagram. A propagator could easily be realized as a stateless Web component providing a computation service. A cell could be realized as a Web resource accumulating and storing data.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;The propagator model also seems like a great candidate to represent programming expressions as networks of connected components, a subject I researched a bit last year, but which would be too long to describe here... perhaps in another blog post.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Anyway, that got me thinking about a fun weekend project. If I find the time (no guarantee as I'm usually busy on weekends between my regular ski race training and family time), I'd like to do a little hacking and experiment with implementing &lt;b&gt;a propagator program as an assembly of SCA components wired together&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;How about defining two new &lt;b&gt;cell and propagator SCA component types&lt;/b&gt;, perhaps with REST interfaces to allow propagator programs to live on the Web and play with data from some useful REST services out there?&lt;br /&gt;&lt;br /&gt;Wouldn't that be fun?&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/6043566615205767088-8358101922639651049?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8358101922639651049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8358101922639651049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8358101922639651049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8358101922639651049'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2012/01/we-really-dont-know-how-to-compute.html' title='We Really Don&apos;t Know How To Compute!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8258119444581266848</id><published>2012-01-04T23:24:00.000-08:00</published><updated>2012-01-04T23:24:22.840-08:00</updated><title type='text'>Happy New Year 2012!</title><content type='html'>&lt;b&gt;Happy New Year 2012 from the Delfino Family!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-ox5oKhcN1e0/TwVI8CZxiQI/AAAAAAAAAYI/n9Z3xGyn3AM/s1600/DSCN7950.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="420" src="http://1.bp.blogspot.com/-ox5oKhcN1e0/TwVI8CZxiQI/AAAAAAAAAYI/n9Z3xGyn3AM/s400/DSCN7950.JPG" width="560" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;January 2nd, a great day in &lt;a href="http://www.squaw.com/"&gt;Squaw Valley&lt;/a&gt;: shopping for the girls, free skiing for my son, slalom gate training for me.&lt;br /&gt;&lt;br /&gt;Just got back to work today after a long vacation. Still trying to figure out the year 2012 resolutions.&lt;br /&gt;&lt;br /&gt;We wish you all a &lt;b&gt;happy new year 2012&lt;/b&gt;!&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/6043566615205767088-8258119444581266848?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8258119444581266848/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8258119444581266848' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8258119444581266848'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8258119444581266848'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2012/01/happy-new-year-2012.html' title='Happy New Year 2012!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-ox5oKhcN1e0/TwVI8CZxiQI/AAAAAAAAAYI/n9Z3xGyn3AM/s72-c/DSCN7950.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-9174426703572235043</id><published>2011-11-27T20:10:00.000-08:00</published><updated>2011-11-27T20:17:37.457-08:00</updated><title type='text'>White Friday - Ski Season Opening</title><content type='html'>Far away from the &lt;a href="http://en.wikipedia.org/wiki/Black_Friday_(shopping)"&gt;&lt;b&gt;Black Friday&lt;/b&gt;&lt;/a&gt; shopping frenzy, I've just opened the 2011-2012 ski season in &lt;a href="http://www.squaw.com/"&gt;&lt;b&gt;Squaw Valley&lt;/b&gt;&lt;/a&gt; with little snow -- only two runs were open with artificial snow -- but beautiful sunny weather!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-70YYFnDtunE/TtMFXR71vsI/AAAAAAAAAW4/1W-6zLlloww/s1600/IMG_0628.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="430" src="http://4.bp.blogspot.com/-70YYFnDtunE/TtMFXR71vsI/AAAAAAAAAW4/1W-6zLlloww/s640/IMG_0628.JPG" width="576" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here's a first test report of my new &lt;a href="http://jsdelfino.blogspot.com/2011/10/new-racing-ski-gear-arrived.html"&gt;&lt;b&gt;Volkl Racetiger racing skis&lt;/b&gt;&lt;/a&gt; after two full days on them on Wednesday and Friday:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;super &lt;b&gt;quick and responsive&lt;/b&gt; in dynamic short SL style turns;&lt;/li&gt;&lt;li&gt;still &lt;b&gt;stable at high speed&lt;/b&gt; in GS style wider turns;&lt;/li&gt;&lt;li&gt;pretty stiff, &lt;b&gt;grip on packed snow&lt;/b&gt; like no other skis;&lt;/li&gt;&lt;li&gt;the Tyrolia race plates I mounted on them are great at absorbing vibrations.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;You better &lt;b&gt;stay focused&lt;/b&gt; or these skis will quickly send you off course. Race stock slalom skis are &lt;b&gt;not for relaxed casual cruising&lt;/b&gt;, but they're really fun!&lt;br /&gt;&lt;br /&gt;After two days of free skiing and drills to practice &lt;b&gt;putting the skis on edge&lt;/b&gt; and find the perfect &lt;b&gt;clean carved turn&lt;/b&gt; (&lt;a href="http://en.wikipedia.org/wiki/Carve_turn"&gt;&lt;b&gt;carving&lt;/b&gt;&lt;/a&gt; is the modern ski technique that allows you to turn without skidding and losing speed) I'm ready for the next step: practice with &lt;b&gt;slalom gates&lt;/b&gt;. The physical preparation I did the last few weeks also paid off as I was able to progressively increase speed and draw &lt;b&gt;arc curves&lt;/b&gt; almost all day without getting too tired.&lt;br /&gt;&lt;br /&gt;I will be back in Tahoe next Saturday! and really hope to to run slalom gates this time. I want to practice a few more tricks next week:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.youcanski.com/en/coaching/modern_technique.htm#Section7"&gt;&lt;b&gt;early turn initiation / early edge engagement&lt;/b&gt;&lt;/a&gt; (when you tilt the ski edges earlier to engage from one turn to the next);&lt;/li&gt;&lt;li&gt;loading a little &lt;a href="http://www.youcanski.com/en/coaching/modern_technique.htm#Section3"&gt;&lt;b&gt;more weight on the inside ski&lt;/b&gt;&lt;/a&gt; to really carve with both skis; that one is not so easy for me as a classic/old-school skier used to put all the weight on the outside ski; I almost got into trouble  -- flying off course :) -- when I tried that on Friday afternoon.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I'm also hoping that Squaw will open more runs, to be able to go full speed, away from the snowboarding crowds and obstacles... The first races are coming soon in December!&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/6043566615205767088-9174426703572235043?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/9174426703572235043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=9174426703572235043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/9174426703572235043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/9174426703572235043'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/11/white-friday-ski-season-opening.html' title='White Friday - Ski Season Opening'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-70YYFnDtunE/TtMFXR71vsI/AAAAAAAAAW4/1W-6zLlloww/s72-c/IMG_0628.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4754693102266480307</id><published>2011-11-22T22:36:00.000-08:00</published><updated>2011-11-22T22:36:24.122-08:00</updated><title type='text'>Sergeant Pepper Spraying UC Davis Students - What a Shame!</title><content type='html'>&lt;object style="height: 351px; width: 576px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6AdDLhPwpp4?version=3&amp;feature=player_detailpage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/6AdDLhPwpp4?version=3&amp;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="576" height="324"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;As a proud father of a UC Davis student, I'm out of words... &lt;b&gt;What a shame&lt;/b&gt;!&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/6043566615205767088-4754693102266480307?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4754693102266480307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4754693102266480307' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4754693102266480307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4754693102266480307'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/11/sergeant-pepper-spraying-uc-davis.html' title='Sergeant Pepper Spraying UC Davis Students - What a Shame!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-733080146657433790</id><published>2011-11-18T23:53:00.000-08:00</published><updated>2011-11-18T23:53:08.680-08:00</updated><title type='text'>America's Cup World Series in San Diego - Streaming Live</title><content type='html'>Don't miss the &lt;a href="http://www.americascup.com/"&gt;&lt;b&gt;America's Cup&lt;/b&gt;&lt;/a&gt; World Series in &lt;b&gt;San Diego&lt;/b&gt; this weekend, also streaming live on the YouTube America's Cup &lt;a href="http://www.youtube.com/user/AmericasCup"&gt;channel&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;My son was lucky to see them last week as they were already there, and he was in San Diego for the weekend for the Perry Junior Sailing regatta.&lt;br /&gt;&lt;br /&gt;Here's a summary of today's &lt;b&gt;semi-finals&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 324px; width: 576px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/A8grLMHA2TY?version=3&amp;feature=player_profilepage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/A8grLMHA2TY?version=3&amp;feature=player_profilepage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="576" height="324"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Tomorrow at 1PM PST the &lt;b&gt;finals&lt;/b&gt;, &lt;a href="http://www.americascup.com/en/Teams/ORACLE-Racing/Latest/"&gt;Oracle Racing&lt;/a&gt; vs the &lt;a href="http://www.americascup.com/en/Teams/Energy-Team/Latest/"&gt;Energy Team&lt;/a&gt; from &lt;b&gt;France&lt;/b&gt; (Yay!) will be &lt;a href="http://www.youtube.com/watch?v=Vt8UQ6640tE&amp;feature=channel_video_title"&gt;&lt;b&gt;streamed live&lt;/b&gt;&lt;/a&gt; again.&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/6043566615205767088-733080146657433790?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/733080146657433790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=733080146657433790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/733080146657433790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/733080146657433790'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/11/americas-cup-world-series-in-san-diego.html' title='America&apos;s Cup World Series in San Diego - Streaming Live'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3694368794998494689</id><published>2011-11-16T01:00:00.000-08:00</published><updated>2011-11-16T01:00:06.222-08:00</updated><title type='text'>Apache HTTP Server 2.3.15 released!</title><content type='html'>Back to blogging after a break from it as I was too busy the last few days... with some great news!&lt;br /&gt; &lt;br /&gt;The &lt;a href="http://www.apache.org/"&gt;Apache Software Foundation&lt;/a&gt; and the &lt;a href="http://httpd.apache.org/"&gt;Apache HTTP Server Project&lt;/a&gt; have &lt;a href="http://www.apache.org/dist/httpd/Announcement2.3.txt"&gt;announced&lt;/a&gt; the release of &lt;b&gt;Version 2.3.15-beta of the Apache HTTP Server&lt;/b&gt; (also known as "Apache" or "HTTPD"). This version is the 4th, and likely final, beta release before the general availability of the 2.4 release, with lots of interesting new  features, described &lt;a href="http://httpd.apache.org/docs/trunk/new_features_2_4.html"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The following will be particularly useful if you're &lt;b&gt;using HTTPD server to run apps in the cloud&lt;/b&gt;:&lt;ul&gt;&lt;li&gt;&lt;b&gt;Rate limiting&lt;/b&gt; and request timeout control, to protect your server against misbehaving clients;&lt;/li&gt;&lt;li&gt;Improvements to the HTTP proxy, in particular with clustering, &lt;b&gt;load balancing&lt;/b&gt;, and &lt;b&gt;failover&lt;/b&gt;;&lt;/li&gt;&lt;li&gt;A better multi-threaded processing module (called &lt;a href="http://httpd.apache.org/docs/2.2/mod/event.html"&gt;Event MPM&lt;/a&gt;) capable of handling &lt;b&gt;more HTTP connections&lt;/b&gt;, typically kept alive and open between requests by Web browsers, with &lt;b&gt;less threads&lt;/b&gt;;&lt;/li&gt;&lt;li&gt;Performance improvements, focusing on &lt;b&gt;latency&lt;/b&gt; and &lt;b&gt;request / response turnover&lt;/b&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, with HTTPD 2.3.15 you get a more &lt;b&gt;robust&lt;/b&gt; and &lt;b&gt;faster&lt;/b&gt; HTTP server with load balancing for &lt;b&gt;horizontal scaling&lt;/b&gt; in the cloud! I've been playing with the 2.3.* code for some time, and it has been working really well for me. It'll be great to finally get a 2.4 GA release with all these new cool features! Hopefully soon...&lt;br /&gt;&lt;br /&gt;For more info, config examples and performance data, see this &lt;a href="http://people.apache.org/~jim/presos/ACNA11/Apache_httpd_cloud.pdf"&gt;presentation&lt;/a&gt; from Jim Jagielski.&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/6043566615205767088-3694368794998494689?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3694368794998494689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3694368794998494689' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3694368794998494689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3694368794998494689'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/11/apache-http-server-2315-released.html' title='Apache HTTP Server 2.3.15 released!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2331586140843811071</id><published>2011-10-29T17:20:00.000-07:00</published><updated>2011-10-29T17:20:00.962-07:00</updated><title type='text'>Integrating Google Page Speed in your Web site build</title><content type='html'>Google &lt;b&gt;&lt;a href="http://code.google.com/speed/page-speed/"&gt;Page Speed&lt;/a&gt;&lt;/b&gt; is a great tool to help &lt;b&gt;analyze and optimize the performance of your Web pages&lt;/b&gt;. It's actually a family of tools:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/speed/page-speed/docs/extension.html"&gt;Page Speed Chrome and Firefox  browser extensions&lt;/a&gt; complement &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; and analyze the performance of your Web pages right from your Web browser.&lt;br /&gt;&lt;br /&gt;- &lt;a href="https://developers.google.com/pagespeed/"&gt;Page Speed Online&lt;/a&gt; analyzes the performance of your Web pages too without requiring a browser extension.&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://code.google.com/p/modpagespeed/"&gt;Mod_pagespeed&lt;/a&gt; is an &lt;a href="http://httpd.apache.org/"&gt;Apache HTTPD&lt;/a&gt; extension module that optimizes, rewrites and &lt;a href="http://en.wikipedia.org/wiki/Minification_(programming)"&gt;minifies&lt;/a&gt; your Web pages on the fly.&lt;br /&gt;&lt;br /&gt;- The &lt;a href="http://code.google.com/speed/pss/"&gt;Page Speed Service&lt;/a&gt; is a proxy hosted by Google which optimizes and delivers your Web pages from Google's servers.&lt;br /&gt;&lt;br /&gt;- The Page Speed &lt;a href="http://code.google.com/p/page-speed/"&gt;SDK&lt;/a&gt; allows you to embed the Page Speed analyzers and optimizers in your own project.&lt;br /&gt;&lt;br /&gt;If you're &lt;b&gt;paranoid&lt;/b&gt; (don't want your Web site to depend on Google's Page Speed servers) and &lt;b&gt;CPU + memory conscious&lt;/b&gt; (don't want to spend resources / $$$ running mod_pagespeed on your HTTP server) you can also &lt;b&gt;run Page Speed on your pages ahead of time&lt;/b&gt; when you build your Web site.  &lt;br /&gt;&lt;br /&gt;It's pretty simple. Here's how I'm doing it on &lt;a href="http://www.ubuntu.com/"&gt;Linux&lt;/a&gt; using &lt;a href="http://www.gnu.org/software/automake/"&gt;GNU Automake&lt;/a&gt; and Apache HTTPD (I'm sure that can be adapted to other environments):&lt;br /&gt;&lt;br /&gt;1. Download and build the &lt;b&gt;Page Speed SDK&lt;/b&gt;, like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;build=`pwd`&lt;br /&gt;curl -OL &lt;a href="https://dl-ssl.google.com/page-speed/sdk/current/page-speed-sdk.zip"&gt;https://dl-ssl.google.com/page-speed/sdk/current/page-speed-sdk.zip&lt;/a&gt;&lt;br /&gt;unzip page-speed-sdk.zip&lt;br /&gt;cd page-speed-1.9&lt;br /&gt;make builddir=$build/page-speed-1.9-bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That'll build two useful command line tools: &lt;b&gt;minify_html_bin&lt;/b&gt;, an HTML rewriter / minifier which also minifies inline CSS and Javascript, and &lt;b&gt;jsmin_bin&lt;/b&gt;, a Javascript minifier which also works well for CSS.&lt;br /&gt;&lt;br /&gt;2. Write the following in your Automake &lt;b&gt;Makefile.am&lt;/b&gt; file:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;minified = htdocs/index-min.html htdocs/foo-min.js htdocs/bar-min.css&lt;br /&gt;&lt;br /&gt;sampledir = ${prefix}&lt;br /&gt;nobase_dist_sample_DATA = ${minified}&lt;br /&gt;&lt;br /&gt;SUFFIXES = -min.html -min.js -min.css&lt;br /&gt;.html-min.html:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;../page-speed-1.9-bin/minify_html_bin $&amp;lt; $@&lt;br /&gt;&lt;br /&gt;.js-min.js:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;../page-speed-1.9-bin/jsmin_min &amp;lt; $&amp;lt;  &amp;gt; $@&lt;br /&gt;&lt;br /&gt;.css-min.css:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;../page-speed-1.9-bin/jsmin_min &amp;lt; $&amp;lt;  &amp;gt; $@&lt;br /&gt;&lt;br /&gt;CLEANFILES = ${minified}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I won't go into the Automake specifics now but these rules will &lt;b&gt;run the Page Speed minifiers&lt;/b&gt; on your Javascript, CSS and HTML pages &lt;b&gt;as part of your Make build&lt;/b&gt;. I'm using a simple naming convention for the minified files, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;index-min.html&lt;/span&gt; is the minified version of &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;index.html&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;3. Add a &lt;a href="http://httpd.apache.org/docs/2.3/mod/mod_dir.html#directoryindex"&gt;DirectoryIndex&lt;/a&gt; directive to your Apache HTTPD &lt;b&gt;httpd.conf&lt;/b&gt; config file:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;DirectoryIndex index-min.html index.html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That tells HTTPD to serve &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;/index-min.html&lt;/span&gt; (the minified page) instead of the original &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;/index.html&lt;/span&gt; page when a user points his browser to &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;http://yourwebsite.com/&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;4. Reference &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo-min.js&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;bar-min.css&lt;/span&gt; in your HTML pages instead of &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo.js&lt;/span&gt; or &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;bar.css&lt;/span&gt; for example.&lt;br /&gt;&lt;br /&gt;5. After making changes to your Web pages, build your site like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you had &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;/index.html&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo.js&lt;/span&gt;, and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;bar.css&lt;/span&gt;, you should now have &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;/index-min.html&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo-min.js&lt;/span&gt;, &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;bar-min.css&lt;/span&gt;, all nicely optimized, rewritten and minified by Page Speed.&lt;br /&gt;&lt;br /&gt;To clean up the minified files, run:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;make clean &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That's it. That little trick should normally &lt;b&gt;save you from 30% to 50% bandwidth&lt;/b&gt;, CPU, memory and disk space on the client devices that access your site (particularly useful with resource-constrained mobile devices) and on your HTTP server too (which now serves smaller files).&lt;br /&gt;&lt;br /&gt;Hope this helps&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/6043566615205767088-2331586140843811071?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2331586140843811071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2331586140843811071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2331586140843811071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2331586140843811071'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/integrating-google-page-speed-in-your.html' title='Integrating Google Page Speed in your Web site build'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1188744004533004000</id><published>2011-10-27T07:56:00.000-07:00</published><updated>2011-10-27T07:56:58.910-07:00</updated><title type='text'>Some Assembly Required</title><content type='html'>Finally got my &lt;a href="http://jsdelfino.blogspot.com/2011/10/new-racing-ski-gear-arrived.html"&gt;new ski racing gear&lt;/a&gt; assembled last weekend. I had to try several ski shops in the Bay Area before finding one that knew how to mount Tyrolia race plates and bindings on stock race skis.&lt;br /&gt;&lt;br /&gt;Here's the end result:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-c7y9Ucb_fFk/TqjouV8sFMI/AAAAAAAAAWE/Z0xxJ0agOfQ/s1600/DSC_3556.JPG" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-c7y9Ucb_fFk/TqjouV8sFMI/AAAAAAAAAWE/Z0xxJ0agOfQ/s400/DSC_3556.JPG" width="266" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;By the way, it looks like picking Tyrolia over Marker (which are usually paired with the Volkl skis) was the right thing to do, as word on the street is that a number of regional teams have moved off to Look, Tyrolia and others after problems with the Markers. Marker even had to issue a &lt;a href="http://www.cpsc.gov/cpscpub/prerel/prhtml11/11095.html"&gt;safety recall&lt;/a&gt; on their race Comp 12 bindings earlier this year.&lt;br /&gt;&lt;br /&gt;So, I'm getting ready for the season. The gear is assembled, I've completed my registration with &lt;a href="http://www.nastar.com/"&gt;NASTAR&lt;/a&gt; (NAtional STAndard Race program), and I'm progressively increasing the physical preparation. Now we just need some snow!&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/6043566615205767088-1188744004533004000?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1188744004533004000/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1188744004533004000' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1188744004533004000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1188744004533004000'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/some-assembly-required.html' title='Some Assembly Required'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-c7y9Ucb_fFk/TqjouV8sFMI/AAAAAAAAAWE/Z0xxJ0agOfQ/s72-c/DSC_3556.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1203047615556012359</id><published>2011-10-25T02:34:00.000-07:00</published><updated>2011-10-25T02:34:48.658-07:00</updated><title type='text'>Recursive Functions of Symbolic Expressions and their Computation by Machine</title><content type='html'>'&lt;a href="http://www-formal.stanford.edu/jmc/recursive.html"&gt;Recursive Functions of Symbolic Expressions and their Computation by Machine&lt;/a&gt;' is the &lt;b&gt;original paper on &lt;a href="http://en.wikipedia.org/wiki/Lisp_(programming_language)"&gt;Lisp&lt;/a&gt;&lt;/b&gt; from &lt;b&gt;John Mc Carthy&lt;/b&gt;. That paper appeared in Communications of the ACM in &lt;b&gt;April 1960&lt;/b&gt;. It is a great short read. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/John_McCarthy_(computer_scientist)"&gt;John Mc Carthy&lt;/a&gt; passed away yesterday. After Steve Jobs and Dennis Ritchie earlier this month, October has been a sad month for the computing community...&lt;br /&gt;&lt;br /&gt;Another good article from &lt;b&gt;Paul Graham&lt;/b&gt;, '&lt;a href="http://www.paulgraham.com/rootsoflisp.html"&gt;The Roots of Lisp&lt;/a&gt;' helps explain John Mc Carthy's &lt;b&gt;discoveries&lt;/b&gt; with Lisp.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;If you don't know Lisp, you should learn it&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;I had a brief look at it 15 years ago, but was too impatient and unexperimented to get the point then. I took more time to actually learn it on a summer vacation 2 years ago, then went on to learn &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt; (a Lisp dialect) as I was going through the &lt;a href="http://mitpress.mit.edu/sicp/full-text/book/book.html"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt; classic Computer Science book from MIT.&lt;br /&gt;&lt;br /&gt;Believe me. Lisp (or Scheme) will transform you into a different programmer. After that, even if you still have to program in C, C++, Python, or even Java, you're in a different world. You'll &lt;b&gt;see programming through different eyes&lt;/b&gt;, and there will be no going back.&lt;br /&gt;&lt;br /&gt;Think about a few fun facts... Pretty much everything you manipulate in Lisp is a list of values (Lisp stands for '&lt;b&gt;list processing&lt;/b&gt;'). Values can be numbers, strings, symbols or lists. Data and code are interchangeable and represented in the same way, as lists of values. You can &lt;b&gt;write a Lisp interpreter in half a page of Lisp&lt;/b&gt;!&lt;br /&gt;&lt;br /&gt;So, if you're working with 'modern' OO programming languages, scripting languages, or functional programming languages, if you're using XML dialects, JSON, DSLs, and you're still struggling to &lt;b&gt;map between documents, data, objects, services, code and configuration&lt;/b&gt;... spend the time to learn Lisp. It'll open your eyes.&lt;br /&gt;&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/6043566615205767088-1203047615556012359?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1203047615556012359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1203047615556012359' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1203047615556012359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1203047615556012359'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/recursive-functions-of-symbolic.html' title='Recursive Functions of Symbolic Expressions and their Computation by Machine'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5517889938050118628</id><published>2011-10-20T23:20:00.000-07:00</published><updated>2011-10-20T23:20:54.158-07:00</updated><title type='text'>Caching Images in a Mobile Web app</title><content type='html'>Another post on a technique to help &lt;a href="http://jsdelfino.blogspot.com/2011/10/offline-mobile-web-apps-really.html"&gt;make mobile Web apps work offline&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Last time I showed how to use XMLHttpRequest and local storage to &lt;a href="http://jsdelfino.blogspot.com/2011/10/caching-javascript-in-mobile-web-app.html"&gt;download and cache Javascript scripts&lt;/a&gt;. Here I'm going to show how to download and cache an image, and then inject it dynamically into your HTML page.&lt;br /&gt;&lt;br /&gt;That technique can be particularly useful to &lt;b&gt;optimize an image intensive app&lt;/b&gt; (a game or a photo gallery app for example) and allow it to &lt;b&gt;work offline&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;First place &lt;a href="http://en.wikipedia.org/wiki/Base64"&gt;&lt;b&gt;base64-encoded&lt;/b&gt;&lt;/a&gt; (as defined in Internet &lt;a href="http://tools.ietf.org/html/rfc3548"&gt;RFC 3548&lt;/a&gt;) versions of your images on your Web server. On Mac OS X for example, convert &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo.png&lt;/span&gt; to a base64-encoded &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;foo.b64&lt;/span&gt; file like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;$ base64 -w 0 foo.png &amp;gt;foo.b64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configure your Web server to serve &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;.b64&lt;/span&gt; files as &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;text/plain&lt;/span&gt;. If you're using the &lt;b&gt;Apache httpd 2.x&lt;/b&gt; Web server -- and if you're not using it, you should :) -- add the following to your &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;httpd.conf&lt;/span&gt; server configuration file:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;text/plain b64&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The reason why we want to convert our images to base64-encoded is that it'll make it much easier to use them in the HTML5 app pages. We're getting to that part now.&lt;br /&gt;&lt;br /&gt;Place the following Javascript script in your HTML page, under the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt; element for example:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;window.appcache = {};&lt;br /&gt;&lt;br /&gt;// Get a resource&lt;br /&gt;window.appcache.get = function(url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var doc = localStorage.getItem(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (doc != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return doc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var http = new XMLHttpRequest();&lt;br /&gt;&amp;nbsp;&amp;nbsp;http.open("GET", url, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;http.send(null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (http.status != 200)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;localStorage.setItem(url, http.responseText);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return http.responseText;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Convert an image to a data: URL&lt;br /&gt;window.appcache.img = function(url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var b64 = window.appcache.get(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return 'data:image/png;base64,' + b64;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not showing the error handling code to keep it short, but you get the picture. The get(url) function downloads a resource and caches it in local storage. The img(url) function gets an image resource and converts it to a &lt;b&gt;data: URL&lt;/b&gt;. A data: URL (as defined in Internet &lt;a href="http://tools.ietf.org/html/rfc2397"&gt;RFC 2397&lt;/a&gt;) allows you to &lt;b&gt;include resource data&lt;/b&gt; (here our &lt;b&gt;base64-encoded image data&lt;/b&gt;) immediately in the URL itself.&lt;br /&gt;&lt;br /&gt;Now, later in your HTML page, say you have an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;img/&amp;gt;&lt;/span&gt; element like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;img id="foo"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can set the cached image into it &lt;b&gt;dynamically&lt;/b&gt;, like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;var foo = document.getElementById('foo');&lt;br /&gt;foo.src = window.appcache.img('/foo.b64');&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The image &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;src&lt;/span&gt; property will recognize the data: URL, the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;image/png;base64&lt;/span&gt; media type at the beginning of the URL, and read the base64-encoded content as a PNG image.&lt;br /&gt;&lt;br /&gt;That's it. With the little trick I've described here you should now be able to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;control&lt;/b&gt; the &lt;b&gt;download&lt;/b&gt; of your images;&lt;br /&gt;&lt;li&gt;&lt;b&gt;cache&lt;/b&gt; them in local storage for &lt;b&gt;speed&lt;/b&gt; and working &lt;b&gt;offline&lt;/b&gt;;&lt;br /&gt;&lt;li&gt;&lt;b&gt;inject&lt;/b&gt; them &lt;b&gt;dynamically&lt;/b&gt; into your HTML page as needed.&lt;br /&gt;&lt;/ul&gt;&lt;br/&gt;Hope this helps. In the next few days I'll show how to handle CSS style sheets in a similar way.&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/6043566615205767088-5517889938050118628?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5517889938050118628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5517889938050118628' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5517889938050118628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5517889938050118628'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/caching-images-in-mobile-web-app.html' title='Caching Images in a Mobile Web app'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-647967216425197906</id><published>2011-10-16T13:57:00.000-07:00</published><updated>2011-10-16T13:57:32.222-07:00</updated><title type='text'>Game Industry Forecast - Rapid Growth and a Changing Market</title><content type='html'>Interesting study and forecast on the game industry &lt;a href="http://www.industrygamers.com/news/game-industry-forecast-shows-solid-growth/"&gt;there&lt;/a&gt;, as Zynga is preparing for IPO and &lt;a href="http://allthingsd.com/20111011/live-at-zyngas-unleashed-event/"&gt;announced 10 new products&lt;/a&gt; this week.&lt;br /&gt;&lt;br /&gt;The global game industry will generate $60 billions in revenue for 2011. It's not a surprise, but gaming is the only media business growing right now with a rapid growth driven by mobile games, as games are the leading apps on smartphones and tablets.&lt;br /&gt;&lt;br /&gt;The game market seems to be changing rapidly from hardcore gamers (mostly teenage boys) to casual gamers with older households (35+yr old), and women (42% of the gamers now), as browsers and mobile are bringing new populations to casual and social games.&lt;br /&gt;&lt;br /&gt;The game technical platforms are also shifting quickly to the Web browser. With technologies like HTML5, Canvas, SVG, and WebGL for example, Web browsers have become the most convenient platform for games, and it's now clear that &lt;b&gt;games in browsers are the future&lt;/b&gt;. See this &lt;a href="http://www.industrygamers.com/news/games-in-browsers-are-the-future-says-ea-founder/"&gt;interview&lt;/a&gt; of the founder of Electronic Arts for more insight and his thoughts on what's happening.&lt;br /&gt;&lt;br /&gt;Clearly, that means challenges ahead for the established game companies which have to adapt quickly. That also means great opportunities for new players to come and disrupt the mobile game market!!&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/6043566615205767088-647967216425197906?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/647967216425197906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=647967216425197906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/647967216425197906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/647967216425197906'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/game-industry-forecast-rapid-growth-and.html' title='Game Industry Forecast - Rapid Growth and a Changing Market'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3554360949739846674</id><published>2011-10-14T22:29:00.000-07:00</published><updated>2011-10-14T22:29:12.171-07:00</updated><title type='text'>PhoneGap / Apache Callback project accepted in the Apache Incubator</title><content type='html'>The vote to accept the &lt;a href="http://wiki.phonegap.com/w/page/46311152/apache-callback-proposal"&gt;Apache Callback&lt;/a&gt; project in the &lt;a href="http://incubator.apache.org/"&gt;Apache Software Foundation Incubator&lt;/a&gt; was open for the last 72 hours, and that vote just &lt;a href="http://markmail.org/thread/6fvnvrvfumuaviwh"&gt;passed&lt;/a&gt; earlier today.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Apache Callback&lt;/b&gt; is the free open source software evolution of the popular &lt;a href="http://www.phonegap.com/"&gt;PhoneGap&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;Apache Callback is a &lt;b&gt;platform for building native mobile applications using HTML, CSS and JavaScript&lt;/b&gt;. Apache Callback allows Web developers to natively target Apple iOS, Google Android, RIM BlackBerry, Microsoft Windows Phone 7, HP webOS, Nokia Symbian and Samsung Bada with a single codebase. The Callback APIs are based on open Web standards and enable access to native device capabilities, including the device &lt;b&gt;camera, compass, accelerometer, microphone or address book&lt;/b&gt; for example, from &lt;a href="http://www.w3.org/TR/html5/"&gt;HTML5&lt;/a&gt; apps.&lt;br /&gt;&lt;br /&gt;That's really great news for the mobile app developer community! ... and I'll be watching this project very closely in the next few months!&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/6043566615205767088-3554360949739846674?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3554360949739846674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3554360949739846674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3554360949739846674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3554360949739846674'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/phonegap-apache-callback-project.html' title='PhoneGap / Apache Callback project accepted in the Apache Incubator'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4271137444134308600</id><published>2011-10-14T01:06:00.000-07:00</published><updated>2011-10-14T01:06:12.167-07:00</updated><title type='text'>Dennis Ritchie: The Shoulders Steve Jobs Stood On</title><content type='html'>&lt;a href="http://www.wired.com/wiredenterprise/2011/10/thedennisritchieeffect"&gt;Dennis Ritchie: The Shoulders Steve Jobs Stood On.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another great loss. &lt;a href="http://en.wikipedia.org/wiki/Dennis_Ritchie"&gt;Dennis Ritchie&lt;/a&gt; was the father of the &lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;C Programming Language&lt;/a&gt; and the &lt;a href="http://en.wikipedia.org/wiki/Unix"&gt;UNIX&lt;/a&gt; operating system, which pretty much the&amp;nbsp;entire Internet and computer industry run on.&lt;br /&gt;&lt;br /&gt;I'm writing this on a &lt;a href="http://store.apple.com/us/browse/home/shop_mac/family/macbook_air"&gt;Macbook Air&lt;/a&gt; running &lt;a href="http://en.wikipedia.org/wiki/Mac_OS_X"&gt;Mac OS X&lt;/a&gt;, a &lt;a href="http://en.wikipedia.org/wiki/Unix"&gt;UNIX&lt;/a&gt;-based system, and programs mostly written in&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/C_(programming_language)"&gt;C&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;His book "&lt;a href="http://en.wikipedia.org/wiki/The_C_Programming_Language_(book)"&gt;The C Programming Language&lt;/a&gt;" was my first Computer Science book. My first serious encounter with software was a 2-week job to teach the C language to a team of programmers. I was just trying to make enough money to go on vacation, but then I got hooked and decided that I wanted to be a C coder... Feeling sad today.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;main() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;printf("goodbye, world\n");&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thank You Sir. RIP.&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/6043566615205767088-4271137444134308600?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4271137444134308600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4271137444134308600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4271137444134308600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4271137444134308600'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/dennis-ritchie-shoulders-steve-jobs.html' title='Dennis Ritchie: The Shoulders Steve Jobs Stood On'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-9127178222133724488</id><published>2011-10-14T00:00:00.000-07:00</published><updated>2011-10-14T00:06:36.877-07:00</updated><title type='text'>Caching Javascript in a Mobile Web app</title><content type='html'>Earlier this week I &lt;a href="http://jsdelfino.blogspot.com/2011/10/offline-mobile-web-apps-really.html"&gt;promised&lt;/a&gt; I'd post a useful technique to reference, pre-fetch, and cache Javascripts, as a follow up to my &lt;a href="http://jsdelfino.blogspot.com/2011/10/html5-rocks-mobile-web.html"&gt;review&lt;/a&gt; of an article on &lt;a href="http://www.html5rocks.com/"&gt;HTMLRocks&lt;/a&gt; describing &lt;a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html"&gt;HTML5 techniques for optimizing mobile Web performance&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;So, here it goes.&lt;br /&gt;&lt;br /&gt;The HTML5Rocks article showed how to follow all the links in a page and &lt;a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html#toc-fetching-caching"&gt;pre-fetch and cache&lt;/a&gt; their target pages in local storage. That was a good starting point, but for a mobile Web app to really work well offline you also need to &lt;b&gt;fetch and cache the referenced JavaScripts, CSS, and images&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Here's how I do that in my apps.&lt;br /&gt;&lt;br /&gt;I place the following utility Javascript at the top of my page under the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt; element:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript";gt;&lt;br /&gt;window.appcache = {};&lt;br /&gt;&lt;br /&gt;// Get a resource&lt;br /&gt;window.appcache.get = function(url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var doc = localStorage.getItem(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (doc != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return doc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var http = new XMLHttpRequest();&lt;br /&gt;&amp;nbsp;&amp;nbsp;http.open("GET", url, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;http.send(null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (http.status != 200)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;localStorage.setItem(url, http.responseText);&lt;br /&gt;&amp;nbsp;&amp;nbsp;return http.responseText;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Load a script&lt;br /&gt;window.appcache.script = function(url, parent) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var e = document.createElement('script');&lt;br /&gt;&amp;nbsp;&amp;nbsp;e.type = 'text/javascript';&lt;br /&gt;&amp;nbsp;&amp;nbsp;e.text = window.appcache.get(url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;parent.appendChild(e);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I'm not showing the error handling code here to keep it short, but you get the picture. The &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;get(url)&lt;/span&gt; function downloads a resource and caches it, and the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;script(url, parent)&lt;/span&gt; function gets a resource and creates a script element with it.&lt;br /&gt;&lt;br /&gt;Then to reference a Javascript script later in my page, instead of writing the usual:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript" src="foo.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I write this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;window.appcache.script('foo.js', document.head);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you're loading pages in an &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;iframe&amp;gt;&lt;/span&gt; nested inside a main page as suggested in the HTML5Rocks article, you don't need to repeat the utility script in all your pages. Just have it once in the main page, then in the nested pages just write:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;window.parent.appcache.script('foo.js', document.head);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Or just set the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;appcache&lt;/span&gt; property on your &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;iframe&amp;gt;&lt;/span&gt; like this:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;var nested = document.createElement('iframe');&lt;br /&gt;nested.contentWindow.appcache = window.appcache;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then you can write the same code everywhere:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;window.appcache.script('foo.js', document.head);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps.&lt;br /&gt;&lt;br /&gt;To the folks who've pinged me several times this week asking for this tip: Sorry for the delay but I've been kinda busy... I'll show how to fetch and cache &lt;b&gt;CSS&lt;/b&gt; (similar to Javascripts) and &lt;b&gt;images&lt;/b&gt; (using a data: url and base64-encoded image content) in the next few posts, probably this weekend.&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/6043566615205767088-9127178222133724488?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/9127178222133724488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=9127178222133724488' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/9127178222133724488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/9127178222133724488'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/caching-javascript-in-mobile-web-app.html' title='Caching Javascript in a Mobile Web app'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7611995481131754888</id><published>2011-10-10T00:46:00.000-07:00</published><updated>2011-10-10T00:46:56.622-07:00</updated><title type='text'>New Racing Ski Gear Arrived!</title><content type='html'>Got my new gear for the upcoming ski season!&lt;br /&gt;&lt;br /&gt;I started last year's season cautiously as I was getting back into skiing after a break of a few years, and went crescendo as I was gaining back confidence, faster, steeper -- I do extreme skiing / free riding -- with fun cornice and cliff drops and high speed runs in any snow conditions.&lt;br /&gt;&lt;br /&gt;I ski in &lt;b&gt;&lt;a href="http://www.squaw.com/"&gt;Squaw Valley&lt;/a&gt;&lt;/b&gt; (which BTW &lt;a href="http://jsdelfino.blogspot.com/2011/09/squaw-valley-and-alpine-meadows-just.html"&gt;recently merged with Alpine Meadows&lt;/a&gt;). For folks familiar with Squaw, my favorite playgrounds are &lt;b&gt;Palisades&lt;/b&gt;, &lt;b&gt;Silverado&lt;/b&gt;, &lt;b&gt;KT22&lt;/b&gt;, &lt;b&gt;75 Chute&lt;/b&gt;, and the &lt;b&gt;Cornice&lt;/b&gt; area on the other side of KT.&lt;br /&gt;&lt;br /&gt;Reflecting on the past season, pushing limits further with extreme skiing would probably be dangerous so to satisfy my taste for adrenaline and speed, this season I've decided to get back into Slalom racing. I ran lots of &lt;b&gt;Slalom&lt;/b&gt; gates as a kid and was pretty good back then. Like biking, that's something you don't forget, so we'll see... I'm going to train and run gates first, see how it goes, try the &lt;b&gt;Squaw and Alpine Meadows Masters&lt;/b&gt; and then if things go well I'd like to try some of the &lt;b&gt;Tahoe region local races&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;That's what I had in mind when I selected my new hot ski gear:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.voelkl.com/skis/alpine/racing/racetiger-sl-speedwall.html"&gt;Volkl Racetiger SL Skis 'Race Stock' version&lt;/a&gt;&lt;/b&gt;, stiffer and faster but less forgiving than the normal consumer version. It's one of the two or three best Slalom skis on the market, although a little difficult to find as consumer type ski shops don't carry it. I got a really good deal on last year's model.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hLBI0Xvbopo/TpKagm4XQKI/AAAAAAAAAU8/F5W2mUVMAOI/s1600/volkl-racetiger.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="46" src="http://2.bp.blogspot.com/-hLBI0Xvbopo/TpKagm4XQKI/AAAAAAAAAU8/F5W2mUVMAOI/s640/volkl-racetiger.jpg" width="576" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-hLBI0Xvbopo/TpKagm4XQKI/AAAAAAAAAU8/F5W2mUVMAOI/s1600/volkl-racetiger.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="46" src="http://2.bp.blogspot.com/-hLBI0Xvbopo/TpKagm4XQKI/AAAAAAAAAU8/F5W2mUVMAOI/s640/volkl-racetiger.jpg" width="576" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.tyrolia.com/ski-bindings/ski-binding-line-201112/racing/freeflex-pro-11/index.html"&gt;Tyrolia FreeFlex Pro 11.0 Bindings&lt;/a&gt;&lt;/b&gt;. Volkl skis are normally paired with Marker bindings but IMO the Tyrolia are better quality for the same price, plus I couldn't find a good deal on the Marker Comp 12.0. There is a silly macho trend now where most people want bindings with high DIN ratings (that's the tension of the bindings) like 16.0 or even 18.0... I think that's crazy unless you're 200+lbs, and the best way to break a leg. So, I'm going with a DIN 11.0 as I'm lightweight and have already broken enough bones for now... It's dubbed a Junior binding, probably not high enough DIN for the macho types but I don't care as long as I arrive first down the gates :) and with no broken bones.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OSaL6m2F4zk/TpKcd1G5jxI/AAAAAAAAAVI/4AVfPBhmVls/s1600/tyrolia-flex-11.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://1.bp.blogspot.com/-OSaL6m2F4zk/TpKcd1G5jxI/AAAAAAAAAVI/4AVfPBhmVls/s200/tyrolia-flex-11.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;a href="http://www.tyrolia.com/ski-bindings/ski-binding-line-201112/plates/raceplate-rdx/index.html"&gt;Tyrolia RDX Race Plate&lt;/a&gt;&lt;/b&gt;. Goes under the bindings to adjust the flex of the ski and give you a 14mm lift to make it easier to go on edge (with a longer lever arm) and avoid that the boots hit the snow when on edge.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-NiKAfBL1UOU/TpKdc6MDtpI/AAAAAAAAAVU/WmwFSi94Mbo/s1600/tyolia-plate.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="136" src="http://3.bp.blogspot.com/-NiKAfBL1UOU/TpKdc6MDtpI/AAAAAAAAAVU/WmwFSi94Mbo/s200/tyolia-plate.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;That gear is going to be great for Slalom and carving hard or groomed snow, good in moguls, OK in fresh snow, not so great in powder. These Slalom skis are really skinny compared to the wide fat skis people use for powder now, but I don't care. I used to ski powder with very skinny skis when I was a kid, skied all types of snow with pretty bad skis when I was skiing in the army in France, so now I guess I can ski powder with pretty much anything, any two pieces of wood will do...&lt;br /&gt;&lt;br /&gt;The skis have arrived, waiting for the bindings and the plate later this week...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Countdown to season opening: 44 days!&lt;/b&gt; In the meantime I'm training for cliff drops from my backyard fence -- just kidding :)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0hR5MgdwxFw/TpKed1VTzLI/AAAAAAAAAVg/Np0EysyIF2o/s1600/DSC_3514_volkl.JPG" imageanchor="1" style="clear:left; margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="266" width="400" src="http://3.bp.blogspot.com/-0hR5MgdwxFw/TpKed1VTzLI/AAAAAAAAAVg/Np0EysyIF2o/s400/DSC_3514_volkl.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-7611995481131754888?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7611995481131754888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7611995481131754888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7611995481131754888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7611995481131754888'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/new-racing-ski-gear-arrived.html' title='New Racing Ski Gear Arrived!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-hLBI0Xvbopo/TpKagm4XQKI/AAAAAAAAAU8/F5W2mUVMAOI/s72-c/volkl-racetiger.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-500173013513145583</id><published>2011-10-09T22:17:00.000-07:00</published><updated>2011-10-09T22:18:41.263-07:00</updated><title type='text'>Offline Mobile Web Apps - Really...</title><content type='html'>A few days ago I posted a &lt;a href="http://jsdelfino.blogspot.com/2011/10/html5-rocks-mobile-web.html"&gt;review&lt;/a&gt; of an article on&amp;nbsp;&lt;a href="http://www.html5rocks.com/en/"&gt;HTMLRocks &lt;/a&gt; describing &lt;a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html"&gt;HTML5 techniques for optimizing mobile Web performance&lt;/a&gt;, in particular a technique to&amp;nbsp;&lt;a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html#toc-fetching-caching"&gt;pre-fetch and cache&lt;/a&gt; HTML pages and resources, useful to improve navigation performance and allow the mobile Web app to work offline.&lt;br /&gt;&lt;br /&gt;In that review I said:&lt;br /&gt;&lt;i&gt;"What HTML5Rocks doesn't describe is how to fetch and cache all the resources referenced by these pages, like CSS style sheets, JavaScript scripts, or images, and that's a lot more work..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;and concluded:&lt;br /&gt;&lt;i&gt;"My 2c... The techniques described in that HTML5Rocks post are fine to get you started, but implementing them is not so simple. As usual, the devil is in the details."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Since then a number of folks have pinged me to challenge and ask:&lt;br /&gt;&lt;i&gt;"So, how do you fetch the referenced resources? and what are these details?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Fair question :) I'm going to address it in a series of posts in the next few days. I'll also describe a few additional issues and tricks to make a mobile Web app &lt;b&gt;really&lt;/b&gt; work offline, and some solutions with code snippets.&lt;br /&gt;&lt;br /&gt;Here's a draft outline of the next few posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Referencing, fetching and caching Javascript scripts&lt;/li&gt;&lt;li&gt;Caching CSS stylesheets&lt;/li&gt;&lt;li&gt;Caching images&lt;/li&gt;&lt;li&gt;HTML5 W3C application cache vs a DIY cache&lt;/li&gt;&lt;li&gt;Monitoring your network connection&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Stay tuned...&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/6043566615205767088-500173013513145583?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/500173013513145583/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=500173013513145583' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/500173013513145583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/500173013513145583'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/offline-mobile-web-apps-really.html' title='Offline Mobile Web Apps - Really...'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4782637635326556974</id><published>2011-10-07T17:46:00.000-07:00</published><updated>2011-10-07T17:46:32.338-07:00</updated><title type='text'>Google Summer of Code 2011 T-shirt - Thanks Google</title><content type='html'>Received my &lt;a href="http://code.google.com/soc/"&gt;Google Summer of Code 2011&lt;/a&gt; &lt;b&gt;T-shirt&lt;/b&gt; gift from Google today, as I was a mentor for &lt;a href="http://community.apache.org/gsoc.html"&gt;GSoC @ Apache&lt;/a&gt; this year again.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-8AwfJIDEgXQ/To-aGMQo-KI/AAAAAAAAAUw/H0kfE59LEHM/s1600/DSC_3503.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-8AwfJIDEgXQ/To-aGMQo-KI/AAAAAAAAAUw/H0kfE59LEHM/s200/DSC_3503.JPG" width="132" /&gt;&lt;/a&gt;&lt;/div&gt;Hoping my students have received theirs too (that may take a little longer as they're in Sri-Lanka).&lt;br /&gt;&lt;div&gt;&lt;br /&gt;I hope you guys had a lot &lt;b&gt;fun&lt;/b&gt; with &lt;a href="http://jsdelfino.blogspot.com/2011/08/google-summer-of-code-2011-my-students.html"&gt;your coding projects&lt;/a&gt; this summer. I enjoyed working with you!&amp;nbsp;Keep up the good work, and look for &lt;b&gt;opportunities to work on and learn from Open Source&lt;/b&gt; again!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-4782637635326556974?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4782637635326556974/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4782637635326556974' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4782637635326556974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4782637635326556974'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/google-summer-of-code-2011-t-shirt.html' title='Google Summer of Code 2011 T-shirt - Thanks Google'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-8AwfJIDEgXQ/To-aGMQo-KI/AAAAAAAAAUw/H0kfE59LEHM/s72-c/DSC_3503.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-298023962729165641</id><published>2011-10-07T09:09:00.000-07:00</published><updated>2011-10-07T09:09:19.077-07:00</updated><title type='text'>Silicon Valley Code Camp 2011 - By Developers, for Developers</title><content type='html'>&lt;a href="http://www.siliconvalley-codecamp.com/"&gt;Silicon Valley Code Camp 2011&lt;/a&gt; is this weekend in&amp;nbsp;&amp;nbsp;&lt;a href="http://www.siliconvalley-codecamp.com/Venue.aspx"&gt;Los Altos Hills&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The camp is &lt;b&gt;free&lt;/b&gt; to attend, run by volunteers, with lots of great &lt;a href="http://www.siliconvalley-codecamp.com/Speakers.aspx"&gt;speakers&lt;/a&gt; and interesting &lt;a href="http://www.siliconvalley-codecamp.com/Sessions.aspx"&gt;sessions&lt;/a&gt;. It's also a great opportunity to network with fellow developers.&lt;br /&gt;&lt;br /&gt;Here's my session selection:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Saturday&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;HTML5 Game Programming - WebGL Edition&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Build a mobile web app with Sencha Touch&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Faster Mobile Anyone?&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Kids Programming Workshop with Scratch&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Hands on jQuery Mobile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Sunday&lt;/b&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;AutoMobile: the Next Hot Platform for Mobile Linux&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;Create a Kinect Powered Personal Robot with Microsoft Robotics Developer Studio&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;The Ecosystem of Context (exploiting user context to go beyond search)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #990000;"&gt;GPU Accelerated Databases using OpenCL&lt;/span&gt;&lt;br /&gt;&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/6043566615205767088-298023962729165641?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/298023962729165641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=298023962729165641' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/298023962729165641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/298023962729165641'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/silicon-valley-code-camp-2011-by.html' title='Silicon Valley Code Camp 2011 - By Developers, for Developers'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5212389705326291826</id><published>2011-10-06T23:53:00.000-07:00</published><updated>2011-10-06T23:53:46.498-07:00</updated><title type='text'>HTML5 rocks the mobile Web</title><content type='html'>Great post about &lt;a href="http://www.html5rocks.com/en/mobile/optimization-and-performance.html"&gt;HTML5 techniques for mobile&lt;/a&gt; on '&lt;a href="http://www.html5rocks.com/en/"&gt;HTML5Rocks&lt;/a&gt;'. Not sure I agree with everything it says though.&lt;br /&gt;&lt;br /&gt;It describes three &lt;b&gt;HTML5 techniques for optimizing mobile Web performance&lt;/b&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;For smooth native-feeling sliding and flipping page transitions, use a &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;translate3d(0,0,0)&lt;/span&gt;&amp;nbsp;&lt;a href="http://developer.apple.com/library/safari/#documentation/InternetWeb/Conceptual/SafariVisualEffectsProgGuide/Transforms/Transforms.html"&gt;CSS transform&lt;/a&gt; to force the phone's Graphics Processing Unint to kick in and perform hardware-accelerated page compositing.&lt;br /&gt;&lt;br /&gt;3D comes at a price though... Hardware acceleration can quickly drain your phone's battery, and some fonts won't look as nice when composited in 3D on the iPhone for example, so you better choose them carefully.&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Manually fetch HTML pages and cache them in HTML5 &lt;a href="http://developer.apple.com/library/safari/#documentation/iPhone/Conceptual/SafariJSDatabaseGuide/Name-ValueStorage/Name-ValueStorage.html#//apple_ref/doc/uid/TP40007256-CH6-SW1"&gt;local storage&lt;/a&gt; to speed up page navigations and enable the app to work offline (as you have all your pages stored locally).&lt;br /&gt;&lt;br /&gt;What HTML5Rocks doesn't describe is how to fetch and cache all the resources referenced by these pages, like CSS style sheets, JavaScript scripts, or images, and that's a lot more work...&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Listen to the network &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;a href="https://developer.mozilla.org/en/Online_and_offline_events"&gt;online/offline&lt;/a&gt;&lt;/span&gt; events and detect the connection type (Ethernet, Wifi, 3G, Edge) using the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;navigator.connection.type&lt;/span&gt; property.&lt;br /&gt;&lt;br /&gt;Well, the online/offline events are useful but &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;navigator.connection.type&lt;/span&gt; is not supported on the iPhone (only on Android), and you can't rely on it anyway as sometimes an overloaded public Wifi will get slower than 3G... What you really needed is a measure of the quality of the end to end network connection in terms of bandwidth and latency, and you can get that by instrumenting your usage of&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&lt;a href="http://developer.apple.com/internet/webcontent/xmlhttpreq.html"&gt;XMLHttpRequest&lt;/a&gt;&lt;/span&gt;&amp;nbsp;in your client code as well as your server code.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;My 2c... The techniques described in that HTML5Rocks post are fine to get you started, but implementing them is not so simple. As usual, the devil is in the details.&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/6043566615205767088-5212389705326291826?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5212389705326291826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5212389705326291826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5212389705326291826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5212389705326291826'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/html5-rocks-mobile-web.html' title='HTML5 rocks the mobile Web'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7950556153239545595</id><published>2011-10-05T23:32:00.000-07:00</published><updated>2011-10-05T23:32:27.673-07:00</updated><title type='text'>Stay Hungry. Stay Foolish.</title><content type='html'>'Stay Hungry. Stay Foolish.' And I have always wished that for myself. - Steve Jobs&lt;br /&gt;&lt;br /&gt;Inspiring.&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UF8uR6Z6KLc?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/UF8uR6Z6KLc?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="576" height="324"&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-7950556153239545595?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7950556153239545595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7950556153239545595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7950556153239545595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7950556153239545595'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/stay-hungry-stay-foolish.html' title='Stay Hungry. Stay Foolish.'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5984971637101750306</id><published>2011-10-05T17:49:00.000-07:00</published><updated>2011-10-05T17:49:38.255-07:00</updated><title type='text'>Remembering Steve Jobs</title><content type='html'>Apple's Board of Directors - We are deeply saddened to announce that Steve Jobs passed away today.&lt;br /&gt;&lt;br /&gt;Steve's brilliance, passion and energy were the source of countless innovations that enrich and improve all of our lives. The world is immeasurably better because of Steve.&lt;br /&gt;&lt;br /&gt;His greatest love was for his wife, Laurene, and his family. Our hearts go out to them and to all who were touched by his extraordinary gifts.&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/6043566615205767088-5984971637101750306?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5984971637101750306/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5984971637101750306' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5984971637101750306'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5984971637101750306'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/remembering-steve-jobs.html' title='Remembering Steve Jobs'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5451532239547840696</id><published>2011-10-05T16:34:00.000-07:00</published><updated>2011-10-05T16:34:46.507-07:00</updated><title type='text'>Snow Report - 8 inches at el. 8200</title><content type='html'>&lt;b&gt;8 inches of fresh snow&lt;/b&gt; at elevation 8200 feet today.&lt;br /&gt;&lt;br /&gt;Counting down 49 days to opening day, &lt;b&gt;Nov 23&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-cYo0VnKUZ4U/TozoEnv7B7I/AAAAAAAAAUY/-5vGx03hdfw/s1600/sr.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://4.bp.blogspot.com/-cYo0VnKUZ4U/TozoEnv7B7I/AAAAAAAAAUY/-5vGx03hdfw/s640/sr.png" width="576" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-5451532239547840696?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5451532239547840696/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5451532239547840696' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5451532239547840696'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5451532239547840696'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/snow-report-8-inches-at-el-8200.html' title='Snow Report - 8 inches at el. 8200'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-cYo0VnKUZ4U/TozoEnv7B7I/AAAAAAAAAUY/-5vGx03hdfw/s72-c/sr.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2785872748422924764</id><published>2011-10-05T00:12:00.000-07:00</published><updated>2011-10-05T00:12:01.119-07:00</updated><title type='text'>1st Snow Storm of the Season!</title><content type='html'>&lt;b&gt;Wednesday - Winter Warning - 100% chance of snow&lt;/b&gt; in &lt;a href="http://jsdelfino.blogspot.com/2011/09/squaw-valley-and-alpine-meadows-just.html"&gt;Squaw Valley &amp;amp; Alpine Meadows&lt;/a&gt; - accumulation &lt;b&gt;3 to 7 inches&lt;/b&gt; possible.&lt;br /&gt;&lt;br /&gt;The ski season is just a few weeks away. I'm expecting some of my new ski gear to be delivered on Thursday. Hoping to try it soon!&lt;br /&gt;&lt;br /&gt;Winter Warning forecast details below, from my &lt;a href="http://www.noaa.gov/"&gt;NOAA&lt;/a&gt; favorite site.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hSD1o0fyJkQ/ToveYP9jKZI/AAAAAAAAATU/LETc-Ynj_F8/s1600/winterwarning.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="562" src="http://1.bp.blogspot.com/-hSD1o0fyJkQ/ToveYP9jKZI/AAAAAAAAATU/LETc-Ynj_F8/s640/winterwarning.png" width="576" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-2785872748422924764?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2785872748422924764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2785872748422924764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2785872748422924764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2785872748422924764'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/1st-snow-storm-of-season.html' title='1st Snow Storm of the Season!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-hSD1o0fyJkQ/ToveYP9jKZI/AAAAAAAAATU/LETc-Ynj_F8/s72-c/winterwarning.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7126016331302226075</id><published>2011-10-04T22:51:00.000-07:00</published><updated>2011-10-04T23:15:48.553-07:00</updated><title type='text'>DELETE FROM keynote WHERE name = 'marc'</title><content type='html'>Lots of &lt;a href="http://bits.blogs.nytimes.com/2011/10/04/benioff-bounced-from-oracle-stage/"&gt;entertainment&lt;/a&gt; @ OpenWorld 2011 with last minute keynote changes.&lt;br /&gt;&lt;br /&gt;$ sqlplus&lt;br /&gt;SQL&gt; CONNECT larry/password@openworld:1521 as sysdba&lt;br /&gt;SQL&gt; DELETE FROM keynote WHERE speaker = 'marc'&lt;br /&gt;SQL&gt; EXIT&lt;br /&gt;$&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/6043566615205767088-7126016331302226075?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7126016331302226075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7126016331302226075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7126016331302226075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7126016331302226075'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/delete-from-keynote-where-name-marc.html' title='DELETE FROM keynote WHERE name = &apos;marc&apos;'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-445289793524337984</id><published>2011-10-04T20:53:00.000-07:00</published><updated>2011-10-04T20:53:48.471-07:00</updated><title type='text'>Speeding up Web browsing on Mac OS X</title><content type='html'>A few days ago I showed how to &lt;a href="http://jsdelfino.blogspot.com/2011/09/dns-server-to-test-your-mobile-apps.html"&gt;configure a local DNS server&lt;/a&gt; on Mac OS X to help test locally hosted mobile apps.&lt;br /&gt;&lt;br /&gt;You can also use that local DNS server to &lt;b&gt;drastically improve Web browsing performance&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;On complex Web pages DNS domain name lookups can introduce significant latency and slow down your Web browsing experience. A local DNS server cache (with minimum latency as it's local) connected to fast public DNS servers can eliminate that bottleneck and speed up Web browsing.&lt;br /&gt;&lt;br /&gt;The good news is that it's really easy to set up.&lt;br /&gt;&lt;br /&gt;After following the steps from my &lt;a href="http://jsdelfino.blogspot.com/2011/09/dns-server-to-test-your-mobile-apps.html"&gt;previous post&lt;/a&gt;, just edit your &lt;a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man5/named.conf.5.html"&gt;/etc/named.conf&lt;/a&gt; file, and insert the following inside the &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;options { ... }&lt;/span&gt; section:&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;forwarders {&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; 8.8.8.8;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;&amp;nbsp; 8.8.4.4;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;8.8.8.8&lt;/span&gt; and &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace; font-size: x-small;"&gt;8.8.4.4&lt;/span&gt; are the &lt;a href="http://code.google.com/speed/public-dns/"&gt;Google public DNS&lt;/a&gt; servers.&lt;br /&gt;&lt;br /&gt;That's it. Like magic, you now have a super fast &lt;b&gt;local DNS caching server&lt;/b&gt; connected to the Google public DNS servers, which are also much faster than your average Internet Service Provider DNS servers or the &lt;a href="http://en.wikipedia.org/wiki/Root_name_server"&gt;Root Internet DNS servers&lt;/a&gt; used in the default Mac OS X DNS config.&lt;br /&gt;&lt;br /&gt;Happy speedy browsing!&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/6043566615205767088-445289793524337984?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/445289793524337984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=445289793524337984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/445289793524337984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/445289793524337984'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/speeding-up-web-browsing-on-mac-os-x.html' title='Speeding up Web browsing on Mac OS X'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-64252500157567664</id><published>2011-10-03T01:14:00.000-07:00</published><updated>2011-10-03T01:17:21.399-07:00</updated><title type='text'>Parallel Programming in Haskell</title><content type='html'>Trying to relax after an unlucky day which started with a fender-bender... So, to take my mind away from today's unfortunate events I'm hacking some &lt;a href="http://www.haskell.org/haskellwiki/Haskell"&gt;Haskell&lt;/a&gt; code tonight and playing around with the Haskell &lt;a href="http://hackage.haskell.org/package/monad-par-0.1.0.1"&gt;Par Monad&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been exploring various aspects of parallel programming for a while now, ranging from low level &lt;a href="http://gpgpu.org/"&gt;GPGPU&lt;/a&gt; (General-Purpose computation on Graphics Programming Units)  using NVIDIA's &lt;a href="http://www.nvidia.com/object/cuda_home_new.html"&gt;CUDA&lt;/a&gt; and &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt; to parallel functional programming using Haskell (also tried F#) and &lt;a href="http://en.wikipedia.org/wiki/Monad_(functional_programming)"&gt;Monads&lt;/a&gt; like the Par Monad.&lt;br /&gt;&lt;br /&gt;To understand the Par Monad, read the &lt;a href="http://community.haskell.org/~simonmar/slides/CUFP.pdf"&gt;Parallel Haskell Tutorial&lt;/a&gt; presentation from last week's &lt;a href="http://cufp.org/conference/sessions/2011/t5-parallel-programming-haskell-simon-peyton-jones"&gt;Commercial Users of Functional Programming&lt;/a&gt; conference,  and try the tutorial code available on github &lt;a href="https://github.com/simonmar/par-tutorial"&gt;there&lt;/a&gt;.   &lt;br /&gt;&lt;br /&gt;What fascinates me about the Par Monad is how it makes it so natural to bring typical &lt;a href="http://www.haskell.org/haskellwiki/Monad"&gt;Monad composition&lt;/a&gt; (watch this &lt;a href="http://channel9.msdn.com/Shows/Going+Deep/Brian-Beckman-Dont-fear-the-Monads"&gt;interview&lt;/a&gt; for a great intro to Monad composition) to a parallel program.&lt;br /&gt;&lt;br /&gt;One day we'll be able to construct a parallel program as easily as assembling (think composing) &lt;a href="http://www.lego.com/en-us/Default.aspx"&gt;Lego&lt;/a&gt; blocks (think logic components/blocks and Monads as connectors between them).&lt;br /&gt;&lt;br /&gt;That day is not far away...&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/6043566615205767088-64252500157567664?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/64252500157567664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=64252500157567664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/64252500157567664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/64252500157567664'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/parallel-programming-in-haskell.html' title='Parallel Programming in Haskell'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4673708127731953475</id><published>2011-10-01T19:41:00.000-07:00</published><updated>2011-10-01T19:41:37.316-07:00</updated><title type='text'>Building Web APIs @ JavaOne 2011</title><content type='html'>I'm not presenting at &lt;a href="http://www.oracle.com/javaone/index.html"&gt;JavaOne&lt;/a&gt; this year. I've been too busy at work (working on &lt;b&gt;cloud integration and mobile&lt;/b&gt;) to focus on any conference presentations.&lt;br /&gt;&lt;br /&gt;Last year Luciano Resende and I presented how to create &lt;b&gt;composite apps&lt;/b&gt; out of components deployed on &lt;b&gt;several cloud platforms&lt;/b&gt; using Apache open source software. See &lt;a href="http://jsdelfino.blogspot.com/2010/10/javaone-2010-developing-composite.html"&gt;there&lt;/a&gt; for the slides and details.&lt;br /&gt;&lt;br /&gt;This year Luciano and Raymond Feng will be giving a presentation on how to implement Web APIs, which should be really interesting!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Title: Building Flexible APIs for Web 2.x/Cloud Applications (25208)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Time:&lt;/b&gt; Monday, 12:30 PM&lt;br /&gt;&lt;b&gt;Location:&lt;/b&gt; Hilton San Francisco, Imperial Ballroom B&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Abstract:&lt;/b&gt;&lt;br /&gt;Using an open and simple API is a great way to build a developer ecosystem and grow a user base dramatically for Web 2.x (social/cloud/mobile) applications. But building flexible APIs can be a challenge. This session covers how to build a nice Web API from scratch, using open source stacks.&lt;br /&gt;&lt;br /&gt;... and they've told me that they're going to show a great &lt;b&gt;demo&lt;/b&gt; too!&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/6043566615205767088-4673708127731953475?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4673708127731953475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4673708127731953475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4673708127731953475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4673708127731953475'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/10/building-web-apis-javaone-2011.html' title='Building Web APIs @ JavaOne 2011'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-420175980898835921</id><published>2011-09-29T01:37:00.000-07:00</published><updated>2011-09-29T01:37:33.533-07:00</updated><title type='text'>Squaw Valley and Alpine Meadows just merged!</title><content type='html'>It's going to be the &lt;b&gt;best ski season ever&lt;/b&gt;, as &lt;a href="http://www.squaw.com/gallery-image/11116"&gt;Squaw Valley&lt;/a&gt; and &lt;a href="http://www.skialpine.com/ski-alpine-news/photos/"&gt;Alpine Meadows&lt;/a&gt; have just announced a &lt;b&gt;merger&lt;/b&gt; to offer more than 6000 skiable acres! More details on the announcement &lt;a href="http://www.squaw.com/press-release/alpine-meadows-and-squaw-valley-join-forces"&gt;here&lt;/a&gt;, and &lt;a href="http://www.mercurynews.com/california/ci_18987016?source=rss"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Those who know me well already know that I'm a crazy skier and that I go to Squaw almost every weekend, or on big storm powder days... usually just for the day. Yeah, that's a long day when you leave at 4:45am to avoid traffic and people stuck on I80, arrive in Squaw around 8:15am, ski all day, then drive back :)&lt;br /&gt;&lt;br /&gt;The other good news is that Squaw season passes purchased before the announcement -- got mine long time ago from my wife and kids for father's day, &lt;b&gt;Can't thank you enough for that!&lt;/b&gt; -- will automatically work in Alpine!&lt;br /&gt;&lt;br /&gt;So I'll be able to ski Alpine's secret powder stashes (shhhh, they're secret) too this season! Last season broke records with &lt;a href="http://www.squaw.com/snowfall-tracker-2010-11"&gt;810 inches of snow&lt;/a&gt; in Squaw. I'm hoping for &lt;a href="http://www.elnino.noaa.gov/lanina.html"&gt;La Nina&lt;/a&gt; to bring a ton of powder again this winter.&lt;br /&gt;&lt;br /&gt;I also hope that Squaw will open my favorite playgrounds more often and earlier in the morning... Please :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The Palisades&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://player.vimeo.com/video/20667214?title=0&amp;amp;byline=0&amp;amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen allowFullScreen&gt;&lt;/iframe&gt;&lt;p&gt;&lt;a href="http://vimeo.com/20667214"&gt;The Palisades | Squaw Valley&lt;/a&gt; from &lt;a href="http://vimeo.com/unofficialnetworks"&gt;UnofficialNetworks.com&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;b&gt;Silverado&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;object style="height: 234px; width: 384px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/N1UFSvo4TvU?version=3"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/N1UFSvo4TvU?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="384" height="234"&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/watch?v=N1UFSvo4TvU"&gt;Silverado Tram Face | Best Crashes&lt;/a&gt;&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/6043566615205767088-420175980898835921?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/420175980898835921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=420175980898835921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/420175980898835921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/420175980898835921'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/09/squaw-valley-and-alpine-meadows-just.html' title='Squaw Valley and Alpine Meadows just merged!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4837340709448147949</id><published>2011-09-26T00:02:00.000-07:00</published><updated>2011-09-26T00:02:34.269-07:00</updated><title type='text'>A DNS server to test your mobile apps</title><content type='html'>Why would you want to set up an &lt;a href="http://www.ietf.org/rfc/rfc1035.txt"&gt;Internet Domain Name System&lt;/a&gt; server (DNS) on your laptop?&amp;nbsp;Well, it can be handy to serve test domain names to your iPhone and test the mobile apps you're working on, or to use &lt;a href="http://tools.ietf.org/html/rfc2818"&gt;HTTPS&lt;/a&gt; on an insecure network with an &lt;a href="http://tools.ietf.org/html/rfc5246"&gt;TLS/SSL&lt;/a&gt; certificate you've created for your test domains.&lt;br /&gt;&lt;br /&gt;DNS has a reputation to be tricky to set up, so I thought I'd share the steps to do it on Mac OS X.&amp;nbsp;It's easy, when you know what to do.&lt;br /&gt;&lt;br /&gt;Say you want to map the &lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;supercoolapp.com&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; domain (an example test domain) and all the &lt;b&gt;&lt;code&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;*.supercoolapp.com&lt;/span&gt;&lt;/code&gt; &lt;/b&gt;sub-domains to IP address &lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;10.1.1.55&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; for example.&lt;br /&gt;&lt;br /&gt;1) In a terminal window run the following commands:&lt;br /&gt;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo rndc-confgen -a -c /etc/rndc.key&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;to generate the rndc.key file as it's included by /etc/named.conf.&lt;br /&gt;&lt;a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/named.8.html"&gt;Named&lt;/a&gt; is the domain name server,&amp;nbsp;&lt;a href="http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man8/rndc.8.html"&gt;rndc&lt;/a&gt; is the Mac OS name server control utility.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;sudo launchctl load -w /System/Library/LaunchDaemons/org.isc.named.plist&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;to enable and start named.&lt;br /&gt;&lt;br /&gt;2) Add the following to the /etc/named.conf file:&lt;br /&gt;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;zone "supercoolapp.com" {&lt;br /&gt;&amp;nbsp; type master;&lt;br /&gt;&amp;nbsp; file "supercoolapp.com.zone";&lt;br /&gt;};&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;3) Create a /var/named/supercoolapp.com.zone file, containing this:&lt;br /&gt;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;supercoolapp.com. 7200 IN SOA supercoolapp.com. root.supercoolapp.com. (&lt;br /&gt;3          ; Serial&lt;br /&gt;15         ; Refresh&lt;br /&gt;3600       ; Retry&lt;br /&gt;3000000    ; Expire     86400 )    ; TTL&lt;br /&gt;IN NS supercoolapp.com.&lt;br /&gt;IN MX 10 supercoolapp.com.&lt;br /&gt;IN A 10.1.1.55&lt;br /&gt;*.supercoolapp.com. IN A 10.1.1.55&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;4) Open your Mac OS System preferences, go to Network / Advanced / Dns and add &lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;127.0.0.1&lt;/span&gt;&lt;/b&gt;&lt;/code&gt; to the top of the DNS servers list.&lt;br /&gt;&lt;br /&gt;5) To test your new DNS settings try this:&lt;br /&gt;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;dig my.supercoolapp.com&lt;br /&gt;ping my.supercoolapp.com&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;6) On your iPhone go to Settings / your wifi network / DHCP and change the DNS field to your Mac OS system's IP address.&lt;br /&gt;&lt;br /&gt;7) That's it! Now open http://my.supercoolapp.com in Safari on your iPhone. You should hit your mobile app running on&amp;nbsp;&lt;code&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-small;"&gt;10.1.1.55&lt;/span&gt;&lt;/b&gt;&lt;/code&gt;.  &lt;br /&gt;&lt;br /&gt;Hope this helps!&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/6043566615205767088-4837340709448147949?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4837340709448147949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4837340709448147949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4837340709448147949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4837340709448147949'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/09/dns-server-to-test-your-mobile-apps.html' title='A DNS server to test your mobile apps'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2693723533606809755</id><published>2011-08-27T14:48:00.000-07:00</published><updated>2011-08-27T14:48:04.685-07:00</updated><title type='text'>Google Summer of Code 2011 - My students passed!</title><content type='html'>I've been mentoring two students in the &lt;a href="http://socghop.appspot.com/gsoc/homepage/google/gsoc2011"&gt;Google Summer of Code&lt;/a&gt; program this year.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lk.linkedin.com/pub/nirmal-fernando/16/152/baa"&gt;Nirmal&lt;/a&gt;'s GSoC project was to develop &lt;a href="http://socghop.appspot.com/gsoc/project/google/gsoc2011/nirmal070125/22001"&gt;a tool to generate SCA composite diagrams&lt;/a&gt; using SVG.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lk.linkedin.com/in/erandasooriyabandara"&gt;Eranda&lt;/a&gt;'s project was to develop &lt;a href="http://socghop.appspot.com/gsoc/project/google/gsoc2011/erandaatcommonlab/4001"&gt;SCA datastore components&lt;/a&gt; using Apache Cassandra, CouchDB and Hadoop.&lt;br /&gt;&lt;br /&gt;Both students just &lt;b&gt;passed&lt;/b&gt; the final GSoC evaluations! They should be proud of what they've achieved this summer!&lt;br /&gt;&lt;br /&gt;I hope we helped them learn a few things, and that they'll continue to be involved with open source in the future.&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/6043566615205767088-2693723533606809755?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2693723533606809755/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2693723533606809755' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2693723533606809755'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2693723533606809755'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/08/google-summer-of-code-2011-my-students.html' title='Google Summer of Code 2011 - My students passed!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4262504837784869017</id><published>2011-07-26T22:10:00.000-07:00</published><updated>2011-07-26T22:16:26.309-07:00</updated><title type='text'>The Gang of Four would be Proud</title><content type='html'>Just came across &lt;a href="http://www.reddit.com/r/programming/comments/j0i0l/the_gang_of_four_would_be_proud/"&gt;this&lt;/a&gt; on reddit, which gave me a good laugh.&lt;br /&gt;&lt;br /&gt;What is an&amp;nbsp;&lt;i&gt;&lt;a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.html"&gt;AbstractSingletonProxyFactoryBean&lt;/a&gt;&lt;/i&gt;? I guess it gets crystal clear after reading &lt;a href="http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/aop/framework/AbstractSingletonProxyFactoryBean.html#isSingleton()"&gt;this javadoc&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;I already knew that for some time, and I'm not blaming Spring in particular as they're better than most, but &lt;i&gt;SomethingIsDefinitelyWrongInTheJavaDevelopmentCommunity&lt;/i&gt;...&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/6043566615205767088-4262504837784869017?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4262504837784869017/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4262504837784869017' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4262504837784869017'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4262504837784869017'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/07/gang-of-four-would-be-proud.html' title='The Gang of Four would be Proud'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1515314518900382757</id><published>2011-06-27T20:45:00.000-07:00</published><updated>2011-06-28T13:44:13.583-07:00</updated><title type='text'>I want a NYC app that...</title><content type='html'>Great initiative from New York City with &lt;a href="http://ideas.nycbigapps.com/"&gt;NYCBigApps&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;New York City is challenging the public to share what apps they want for residents, businesses, and visitors. After 8 days running the challenge there's already more than 300 app ideas! It's amazing to see all the app ideas that people come up with.&lt;br /&gt;&lt;br /&gt;Imagine if creating these apps was as easy as blogging about them :)&lt;br /&gt;&lt;br /&gt;Well, it shouldn't be too hard actually, with all the nice &lt;a href="http://www.programmableweb.com/"&gt;Web APIs&lt;/a&gt; that are available out there now for search, maps, location, photos, shopping etc.&lt;br /&gt;&lt;br /&gt;Let's look at the very first app idea submitted to NYCBigApps:&lt;br /&gt;&lt;a href="http://ideas.nycbigapps.com/submissions/3171-i-want-a-nyc-app-that-shows-me-all-music-instrument-stores-in-nyc"&gt;I want a NYC app that shows me all music instrument stores in NYC.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That one is actually pretty easy:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get your location, say NYC.&lt;/li&gt;&lt;li&gt;Do a Google map search for music stores around that location.&lt;/li&gt;&lt;li&gt;Size the map to 320 pixels to fit nicely on your smartphone screen.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;After about 5 mins fiddling with this, here we go! Looks like a simple app, just a map with markers, not very fancy, but does the job.&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="350" witdh="320" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=nyc+music+stores&amp;amp;aq=&amp;amp;sll=40.714353,-74.005973&amp;amp;sspn=0.470496,1.351318&amp;amp;g=nyc&amp;amp;ie=UTF8&amp;amp;hq=music+stores&amp;amp;hnear=New+York&amp;amp;ll=40.735579,-73.995512&amp;amp;spn=0.058039,0.028858&amp;amp;output=embed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=nyc+music+stores&amp;amp;aq=&amp;amp;sll=40.714353,-74.005973&amp;amp;sspn=0.470496,1.351318&amp;amp;g=nyc&amp;amp;ie=UTF8&amp;amp;hq=music+stores&amp;amp;hnear=New+York&amp;amp;ll=40.735579,-73.995512&amp;amp;spn=0.058039,0.028858" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Wouldn't it be great if we could make it so easy to create mini apps that the public could finally unleash their creativity, take control and make their own apps in minutes as ideas come up?&lt;br /&gt;&lt;br /&gt;With &lt;a href="http://www.html5rocks.com/en/"&gt;HTML5&lt;/a&gt; becoming easier to use and more mobile friendly, we're getting closer to that dream every day!&lt;br /&gt;&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/6043566615205767088-1515314518900382757?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1515314518900382757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1515314518900382757' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1515314518900382757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1515314518900382757'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/06/i-want-nyc-app-that.html' title='I want a NYC app that...'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2636354393789053658</id><published>2011-06-08T08:58:00.000-07:00</published><updated>2011-06-08T08:58:18.200-07:00</updated><title type='text'>Meritocracy in Action: The Apache Membership Process</title><content type='html'>The Apache Software Foundation (ASF) will be holding its annual Members' meeting this July. Among the Foundation's business that takes place during this meeting is the election of new ASF Members.&lt;br /&gt;&lt;br /&gt;ASF committers who demonstrate merit in the Foundation’s growth, evolution, and progress are nominated for ASF Membership by existing members and elected bi-annually.&lt;br /&gt;&lt;br /&gt;The ASF just published the list of new Members elected at the January 2011 Members' meeting on its &lt;a href="https://blogs.apache.org/foundation/entry/welcome_to_the_new_apache"&gt;blog&lt;/a&gt;. That was 6 months ago but it's never too late to blog about it :).&lt;br /&gt;&lt;br /&gt;I just discovered that blog today as people started to send me emails when they saw my name there...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;It is a great honor for me to be in that list as a new -- well... 6 month old :) -- elected ASF Member!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;For more info, see the complete list of ASF &lt;a href="http://www.apache.org/foundation/members.html"&gt;members&lt;/a&gt;, &lt;a href="http://people.apache.org/"&gt;committers&lt;/a&gt; and &lt;a href="http://www.apache.org/foundation/how-it-works.html"&gt;how the ASF works&lt;/a&gt;.&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/6043566615205767088-2636354393789053658?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2636354393789053658/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2636354393789053658' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2636354393789053658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2636354393789053658'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/06/meritocracy-in-action-apache-membership.html' title='Meritocracy in Action: The Apache Membership Process'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7171438213963136779</id><published>2011-06-03T10:12:00.000-07:00</published><updated>2011-06-03T13:19:07.548-07:00</updated><title type='text'>Comparing the performance of C++, Java, Scala and Go</title><content type='html'>An interesting paper from Google &lt;a href="https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf"&gt;comparing the performance of C++, Java, Scala and Go&lt;/a&gt; was presented at the &lt;a href="http://days2011.scala-lang.org/"&gt;2011 Scala days&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Conclusion from the paper: "We find that in regards to performance, C++ wins out by a large margin. However, it also required the most extensive tuning efforts, many of which were done at a level of sophistication that would not be available to the average programmer."&lt;br /&gt;&lt;br /&gt;And my 2c: If you care about performance, for example if you run in the cloud and memory footprint and CPU directly translate to dollars on your cloud monthly bill, if you like programming and are not afraid of spending energy to design and program efficient algorithms, then C++ is still your best bet.&lt;br /&gt;&lt;br /&gt;Sure that requires a bit more thinking and perhaps more sophisticated programmers, but you get what you pay for.&lt;br /&gt;&lt;br /&gt;And to all the folks who criticize C++ for being complicated, well... in my opinion it's as complicated as you want it to be. It's really up to you as a programmer to think and keep your code simple and, by the way, there's a lot of complicated Java and Scala code out there too :)&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/6043566615205767088-7171438213963136779?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7171438213963136779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7171438213963136779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7171438213963136779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7171438213963136779'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/06/comparing-performance-of-c-java-scala.html' title='Comparing the performance of C++, Java, Scala and Go'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5222813962262564836</id><published>2011-05-26T22:39:00.000-07:00</published><updated>2011-05-26T22:39:15.725-07:00</updated><title type='text'>Mod-security now available under Apache License v2.0</title><content type='html'>Great news!&amp;nbsp;&lt;a href="http://www.modsecurity.org/"&gt;ModSecurity&lt;/a&gt; v2.6.0 is now &lt;a href="https://mod-security.svn.sourceforge.net/svnroot/mod-security/m2/tags/2.6.0/"&gt;available&lt;/a&gt; and that's the first release of this great Web firewall module for the &lt;a href="http://httpd.apache.org/"&gt;Apache HTTP server &lt;/a&gt;available under the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache License v2.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This move from the viral &lt;a href="http://www.gnu.org/licenses/old-licenses/lgpl-2.0.html"&gt;GPL License v2&lt;/a&gt;&amp;nbsp;to the Apache License should help further adoption and community development of ModSecurity.&lt;br /&gt;&lt;br /&gt;The &lt;a href="https://www.owasp.org/index.php/Main_Page"&gt;OWASP&lt;/a&gt; ModSecurity core rule set v2.2.0, a set of protection rules against most known Web attacks was also &lt;a href="https://mod-security.svn.sourceforge.net/svnroot/mod-security/crs/tags/2.2.0/"&gt;released&lt;/a&gt; today under the Apache License v2.0 as well.&lt;br /&gt;&lt;br /&gt;More details on the ModSecurity &lt;a href="http://blog.spiderlabs.com/2011/05/announcing-release-of-owasp-modsecurity-core-rule-set-v220.html"&gt;blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-5222813962262564836?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5222813962262564836/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5222813962262564836' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5222813962262564836'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5222813962262564836'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/05/mod-security-now-available-under-apache.html' title='Mod-security now available under Apache License v2.0'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8129429832537009163</id><published>2011-01-25T00:13:00.000-08:00</published><updated>2011-01-26T08:51:55.917-08:00</updated><title type='text'>Coding in the Cloud... Linux Shell in a Web Browser</title><content type='html'>The last few weeks I've been exploring how to use an iPad, tablet or netbook to write programs &lt;b&gt;in the cloud with just a Web browser&lt;/b&gt; connected to my Linux servers.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've played with the recent &lt;b&gt;Web based source code editors&lt;/b&gt; from Google (&lt;a href="http://codemirror.net/"&gt;Code Mirror&lt;/a&gt;), Mozilla (&lt;a href="http://mozillalabs.com/skywriter/"&gt;SkyWriter&lt;/a&gt;), and Eclipse (&lt;a href="http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/"&gt;Orion&lt;/a&gt;). They're&amp;nbsp;OK, but a source code editor is just not enough for me...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I also need a &lt;b&gt;browser-based Linux shell window&lt;/b&gt;.&amp;nbsp;There's some good ones out there. I've tried &lt;a href="http://antony.lesuisse.org/software/ajaxterm/"&gt;Ajaxterm&lt;/a&gt; (a little slow and not all keys worked), &lt;a href="http://anyterm.org/"&gt;Anyterm&lt;/a&gt; (keyboard issues as well), and finally settled for &lt;a href="http://code.google.com/p/shellinabox/"&gt;Shellinabox&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Shellinabox&lt;/b&gt; gets pretty close to a real&amp;nbsp;&lt;a href="http://en.wikipedia.org/wiki/Xterm"&gt;xterm&lt;/a&gt;.&amp;nbsp;I've been using it for two days for various tasks including coding (with vi). I like it a lot! and am starting to think that &lt;b&gt;vi in a shell in shellinabox&lt;/b&gt; compares favorably to these new fancy Web based editors...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've patched it to allow a shell to &lt;b&gt;set the browser title &lt;/b&gt;using &lt;b&gt;a VT escape sequence&lt;/b&gt; in an environment variable (&lt;b&gt;PS1='\\033]0; [\W]\007\\w \$&amp;nbsp;'&lt;/b&gt; for example), like people usually do with xterms.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The patch is &lt;a href="https://github.com/jsdelfino/shellinabox/commit/64314bb688bf9c14fb4b2833ca1be2e7d1790831"&gt;there&lt;/a&gt; on my &lt;a href="https://github.com/jsdelfino"&gt;&lt;b&gt;Github&lt;/b&gt; account&lt;/a&gt;. I find it useful to help distinguish Shellinabox browser windows and tabs and see what directory they're in.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If I find time, I'll post the steps I'm using to configure Shellinabox, build it and connect to it through a &lt;b&gt;secure HTTPD reverse proxy&lt;/b&gt;... later this week.&lt;/div&gt;&lt;div&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/6043566615205767088-8129429832537009163?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8129429832537009163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8129429832537009163' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8129429832537009163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8129429832537009163'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/01/coding-in-cloud-linux-shell-in-web.html' title='Coding in the Cloud... Linux Shell in a Web Browser'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3469622584488160353</id><published>2011-01-20T00:29:00.000-08:00</published><updated>2011-01-20T00:39:50.442-08:00</updated><title type='text'>CLang completes support for C++0x variadic templates</title><content type='html'>The &lt;a href="http://clang.llvm.org/"&gt;CLang&lt;/a&gt; project has just &lt;a href="http://llvm.org/viewvc/llvm-project?view=rev&amp;amp;revision=123854"&gt;completed&lt;/a&gt; support for C++0x &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates"&gt;variadic templates&lt;/a&gt;&amp;nbsp;(see [&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf"&gt;1&lt;/a&gt;], [&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf"&gt;2&lt;/a&gt;], [&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2488.pdf"&gt;3&lt;/a&gt;]).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Pretty good news! &lt;/b&gt;CLang&amp;nbsp;now&amp;nbsp;&lt;a href="http://clang.llvm.org/comparison.html#gcc"&gt;compares&lt;/a&gt;&amp;nbsp;well with&amp;nbsp;&lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt;.&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;The&amp;nbsp;CLang and underlying &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; projects use&amp;nbsp;&lt;a href="http://clang.llvm.org/features.html#license"&gt;liberal BSD, NCSA and MIT licenses&lt;/a&gt; compatible with the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache 2.0 license&lt;/a&gt;&amp;nbsp;(see [&lt;a href="http://www.apache.org/legal/3party.html"&gt;4&lt;/a&gt;]).&amp;nbsp;That's better than GCC,&amp;nbsp;&lt;a href="http://gcc.gnu.org/onlinedocs/gcc-3.4.1/gcc/Copying.html#Copying"&gt;GPL&lt;/a&gt;&amp;nbsp;licensed and&amp;nbsp;&lt;a href="http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.license.any_program"&gt;usable&lt;/a&gt; to build an Apache project but not embeddable in the project itself.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I've been thinking about using CLang in the&amp;nbsp;&lt;a href="https://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/"&gt;Apache Tuscany C++&lt;/a&gt;&amp;nbsp;project for a while.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;I'd like to use its&amp;nbsp;&lt;a href="http://clang.llvm.org/doxygen/"&gt;API&lt;/a&gt;&amp;nbsp;to convert&amp;nbsp;&lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-assembly"&gt;SCA composites&lt;/a&gt; (XML docs describing SCA component assemblies) into C++0x templates and compile them into machine code on the fly, instead of having to interpret all the XML gorp at run-time.&lt;/div&gt;&lt;br /&gt;Think of it like an &lt;b&gt;'SCA assembly JIT compiler'&lt;/b&gt;...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Benefits&lt;/b&gt;: ultimate speed, CPU and space, cloud resources (and resulting monthly bill) optimizations, and less XML parsing and interpretation code to worry about.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Requirement&lt;/b&gt;: support for C++0x variadic templates...&lt;br /&gt;&lt;br /&gt;Patience may pay off after all, as it is finally there.&lt;br /&gt;&lt;br /&gt;I gotta try that stuff this weekend!&lt;br /&gt;&lt;br /&gt;[1]&amp;nbsp;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf&lt;/a&gt;&lt;br /&gt;[2]&amp;nbsp;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf&lt;/a&gt;&lt;br /&gt;[3]&amp;nbsp;&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2488.pdf"&gt;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2488.pdf&lt;/a&gt;&lt;br /&gt;[4]&amp;nbsp;&lt;a href="http://www.apache.org/legal/3party.html"&gt;http://www.apache.org/legal/3party.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-3469622584488160353?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3469622584488160353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3469622584488160353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3469622584488160353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3469622584488160353'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/01/clang-completes-support-for-c0x.html' title='CLang completes support for C++0x variadic templates'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4134010323753818520</id><published>2011-01-18T21:30:00.000-08:00</published><updated>2011-01-19T01:55:30.584-08:00</updated><title type='text'>Coding in the Cloud... Feels good like back to the 80's</title><content type='html'>I started programming on a &lt;b&gt;VT100&lt;/b&gt; terminal in &lt;b&gt;1980&lt;/b&gt;, with:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a white/black screen / 24 x 80 characters&lt;/li&gt;&lt;li&gt;no disk, data on a server&lt;/li&gt;&lt;li&gt;vi&lt;/li&gt;&lt;li&gt;assembly language + C on Unix&lt;/li&gt;&lt;li&gt;a few programming books&lt;/li&gt;&lt;li&gt;some deep thinking&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;I loved it!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Then, after a few &lt;b&gt;detours&lt;/b&gt; through:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a dozen or so programming languages&lt;/li&gt;&lt;li&gt;fancy OSes on hi-res overheating laptops&lt;/li&gt;&lt;li&gt;'&lt;i&gt;integrated&lt;/i&gt;' development environments&lt;/li&gt;&lt;li&gt;'&lt;i&gt;code assist&lt;/i&gt;' (enough said)&lt;/li&gt;&lt;li&gt;no thinking (replaced by &lt;i&gt;'IDE'&lt;/i&gt; and '&lt;i&gt;code assist')&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Recently I've gone back to &lt;b&gt;a&amp;nbsp;more productive environment:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;24 x 80 characters&lt;/li&gt;&lt;li&gt;vi&lt;/li&gt;&lt;li&gt;a few programming books&lt;/li&gt;&lt;li&gt;Web search&lt;/li&gt;&lt;li&gt;some deep thinking&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;I can think again!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But still missing that part:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;no disk, data on a server, always on, accessible from anywhere&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Then something cool happened today:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The Google Project Hosting team just &lt;a href="http://googlecode.blogspot.com/2011/01/make-quick-fixes-quicker-on-google.html"&gt;announced&lt;/a&gt; the ability to edit programs directly in the Web browser using an online editor powered by &lt;a href="http://codemirror.net/"&gt;CodeMirror&lt;/a&gt;.&amp;nbsp;With Mozilla's &lt;a href="http://mozillalabs.com/skywriter/"&gt;SkyWriter&lt;/a&gt;, and Eclipse's &lt;a href="http://dev.eclipse.org/blogs/mike/2011/01/11/introducing-orion/"&gt;Orion&lt;/a&gt;, that's one more way to edit code &lt;b&gt;'in the cloud'&lt;/b&gt; from a connected device.&lt;br /&gt;&lt;br /&gt;That works well for me, as most of the programs I write these days run on servers 'in the cloud' anyway (say, big servers on a network instead of my laptop).&lt;br /&gt;&lt;br /&gt;I've also been looking at the &lt;b&gt;iPad as a programmer terminal&lt;/b&gt;&amp;nbsp;and wondering about the upcoming &lt;b&gt;iPad-2&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, here's my future programming environment:&lt;/b&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;White/black screen / 24 x 80 characters&lt;/b&gt;&lt;br /&gt;How about an &lt;b&gt;iPad-2&lt;/b&gt;, &lt;b&gt;Google CR-48&lt;/b&gt;&amp;nbsp;or similar &lt;b&gt;netbook&lt;/b&gt;&amp;nbsp;and a single Web browser window with big fonts?&lt;br /&gt;&lt;br /&gt;I haven't been lucky enough to receive a&amp;nbsp;CR-48&lt;b&gt;,&lt;/b&gt;&amp;nbsp;so I'm thinking about buying an iPad-2&amp;nbsp;out and hacking a programmer-friendly keyboard app for it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;No disk, data on a server&lt;/b&gt;&lt;br /&gt;Anybody say Cloud?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;VI-like&lt;/b&gt;&lt;br /&gt;CodeMirror, SkyWriter, a hosted Orion server, or I'll just hack up a vi-like editor on top of one of these projects.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Assembly language + C&lt;/b&gt; Well, I have to use Java at work, but on my spare time I like to code some C, C++, Scheme, Lisp, Python or F#. Feels better. I haven't written assembly language for a while, but now that I think about it...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;A few good programming books&lt;/b&gt;&lt;br /&gt;Receiving the new &lt;a href="http://www.informit.com/store/product.aspx?isbn=0201038048"&gt;TAOCP-4a&lt;/a&gt;&amp;nbsp;book tomorrow, and will probably spend a few nights reading it.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Web search&lt;/b&gt;&lt;br /&gt;Allow for a second browser window.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Some deep thinking&lt;/b&gt;&lt;br /&gt;Still thinking...&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;I already love it!&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hmmm, the new&amp;nbsp;iPad-2's rumored fancy screen should be enough for some 24 x 80 coding, right?&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Is&amp;nbsp;IPad-2&amp;nbsp;the new VT100&amp;nbsp;terminal? :)&lt;/b&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/6043566615205767088-4134010323753818520?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4134010323753818520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4134010323753818520' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4134010323753818520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4134010323753818520'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2011/01/coding-in-cloud-feels-good-like-back-to.html' title='Coding in the Cloud... Feels good like back to the 80&apos;s'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2932999023860526139</id><published>2010-12-15T22:32:00.000-08:00</published><updated>2010-12-15T22:32:24.667-08:00</updated><title type='text'>Accelerating Innovation with Apache Extras</title><content type='html'>Google and the Apache Software Foundation just launched &lt;a href="http://www.apache-extras.org/"&gt;Apache Extras&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Apache Extras is a home for communities and open source projects related to Apache technologies, which cannot be hosted by the Apache Software Foundation because they are unable or unwilling to use the &lt;a href="http://www.apache.org/licenses/LICENSE-2.0.html"&gt;Apache v2 license&lt;/a&gt; or the Apache collaborative &amp;nbsp;consensus based processes (a.k.a. &lt;a href="http://incubator.apache.org/learn/theapacheway.html"&gt;The Apache Way&lt;/a&gt;).&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;This&lt;/span&gt;&lt;/span&gt;&amp;nbsp;new channel will help build collaborative communities around Apache&amp;nbsp;Open Source related technologies.&amp;nbsp;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: arial, sans-serif; font-size: 18px;"&gt;Apache Extras provides the infrastructure services typically required by open source projects, such as code repositories, bug tracking, and project web sites/wiki.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family: arial, sans-serif; font-size: 18px;"&gt;It is hosted by Google Code Project Hosting, so it will be very familiar to developers already using Google Code Project Hosting.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;The announce is&amp;nbsp;&lt;a href="http://mail-archives.apache.org/mod_mbox/www-announce/201012.mbox/%3C685955.6439.qm@web30802.mail.mud.yahoo.com%3E"&gt;here&lt;/a&gt;, more on the Google code &lt;a href="http://googlecode.blogspot.com/2010/12/announcing-apache-extrasorg.html"&gt;blog&lt;/a&gt;, my friend Luciano's &lt;a href="http://lresende.blogspot.com/2010/12/apache-software-foundation-launches.html"&gt;blog&lt;/a&gt;, the Apache Software Foundation&amp;nbsp;&lt;a href="https://blogs.apache.org/foundation/entry/the_apache_software_foundation_launches"&gt;blog&lt;/a&gt;, the Apache Extras management &lt;a href="http://code.google.com/a/apache-extras.org/p/apache-extras/"&gt;home&lt;/a&gt;, the&amp;nbsp;&lt;a href="http://community.apache.org/apache-extras/faq.html"&gt;FAQ&lt;/a&gt;, &lt;a href="http://community.apache.org/apache-extras/guidelines.html"&gt;guidelines&lt;/a&gt; and home page.&lt;span id="goog_1879602278"&gt;&lt;/span&gt;&lt;span id="goog_1879602279"&gt;&lt;/span&gt;&lt;a href="http://www.blogger.com/"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-2932999023860526139?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2932999023860526139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2932999023860526139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2932999023860526139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2932999023860526139'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/12/accelerating-innovation-with-apache.html' title='Accelerating Innovation with Apache Extras'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7231895283112150518</id><published>2010-11-24T22:28:00.000-08:00</published><updated>2010-11-24T22:29:28.326-08:00</updated><title type='text'>Ski Season Opening!</title><content type='html'>Tahoe got a lot of snow in the last few days and the ski resorts are now open.&lt;br /&gt;&lt;br /&gt;I already went  to &lt;a href="http://www.squaw.com/"&gt;Squaw Valley&lt;/a&gt; on Saturday for the opening day. Only one lift was open but it was enough for my daugther and I to have a great time skiing there. The drive back was a little long as we had a big snow storm but it was worth it.&lt;br /&gt;&lt;br /&gt;Going back to Squaw Valley again tomorrow morning with my kids and a friend and hoping for a great day as the&amp;nbsp;&amp;nbsp;snow accumulation is already about 9ft at 8200ft!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_5Njmh9cAWX0/TO4ADuOmWUI/AAAAAAAAAJ8/GaeBdjuPdaQ/s1600/snow-report.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://4.bp.blogspot.com/_5Njmh9cAWX0/TO4ADuOmWUI/AAAAAAAAAJ8/GaeBdjuPdaQ/s400/snow-report.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;and the weather forecast looks really good too!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5Njmh9cAWX0/TO3_4oHJahI/AAAAAAAAAJ4/OS7BDieZodk/s1600/weather.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_5Njmh9cAWX0/TO3_4oHJahI/AAAAAAAAAJ4/OS7BDieZodk/s400/weather.png" style="cursor: move;" width="333" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Schedule:&lt;br /&gt;4:30am leaving San Carlos... ouch that's early :)&lt;br /&gt;5:00am pick up a friend in San Francisco&lt;br /&gt;6:30am pick up my daugther in Davis&lt;br /&gt;8:30am breakfast in Squaw Valley&lt;br /&gt;9:00am on the slopes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-7231895283112150518?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7231895283112150518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7231895283112150518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7231895283112150518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7231895283112150518'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/11/ski-season-is-open.html' title='Ski Season Opening!'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_5Njmh9cAWX0/TO4ADuOmWUI/AAAAAAAAAJ8/GaeBdjuPdaQ/s72-c/snow-report.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-747639810255311108</id><published>2010-11-17T22:55:00.000-08:00</published><updated>2010-11-17T22:55:42.380-08:00</updated><title type='text'>JSON vs XML, structured vs semi-structured data</title><content type='html'>That debate has been going for years now... When should you use JSON vs XML?&lt;br /&gt;&lt;br /&gt;Interesting blog posts on this today from &lt;a href="http://norman.walsh.name/2010/11/17/deprecatingXML"&gt;Norm Walsh&lt;/a&gt; and &lt;a href="http://blog.arcanedomain.com/2010/11/norm-walsh-on-xml-and-json/"&gt;Noah Mendelsohn&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Both agree that:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;"XML wasn't designed to solve the problem of transmitting structured bundles of atomic values. XML was designed to solve the problem of unstructured data. In a word or two: mixed content."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Noah then adds:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;"If you want to send along a list of job applicants and their recent salaries, JSON does fine;&amp;nbsp; if you want to send their resumes, well JSON isn’t quite as helpful.&amp;nbsp;&amp;nbsp; A surprising amount of the world’s important information is in just such semi-structured documents.&amp;nbsp; Think insurance policies, shop manuals, and even Web pages themselves."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;+1 to that! I've worked -- and struggled sometimes :) -- with XML for years, and more recently with JSON, and couldn't agree more!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Adding my 2c:&lt;/b&gt;&lt;br /&gt;When you work with structured business data, use an object (or struct, or record) model in your favorite programming language, and an object serialization encoding like JSON.&lt;br /&gt;&lt;br /&gt;When you work with semi-structured document resources, use a document API or a document centric programming language (like &lt;a href="http://www.w3.org/TR/xquery/"&gt;XQuery&lt;/a&gt;, &lt;a href="http://www.w3.org/TR/xslt20/"&gt;XSLT&lt;/a&gt;) or even better, a document-node centric programming language (like &lt;a href="http://research.microsoft.com/en-us/um/people/emeijer/papers/xlinq%20xml%20programming%20refactored%20(the%20return%20of%20the%20monoids).htm"&gt;XLinq&lt;/a&gt;), and an XML document encoding.&lt;br /&gt;&lt;br /&gt;You'll need both programming approaches. Don't use a single approach for everything, unless you're looking for trouble.&lt;br /&gt;&lt;br /&gt;When you need to communicate both structured and semi-structured data, don't bundle them. Just link these resources using &lt;a href="http://www.ietf.org/rfc/rfc2396.txt"&gt;URI references&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Simple enough?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-747639810255311108?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/747639810255311108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=747639810255311108' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/747639810255311108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/747639810255311108'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/11/json-vs-xml-structured-vs-semi.html' title='JSON vs XML, structured vs semi-structured data'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-935363821070148791</id><published>2010-11-16T00:08:00.000-08:00</published><updated>2010-11-16T00:14:21.709-08:00</updated><title type='text'>Full support for Git at Apache</title><content type='html'>&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The Apache infrastructure team is starting to work on full support for &lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt; at Apache. Woo-hoo!!&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Many contributors already use the Apache Git &lt;a href="http://git.apache.org/"&gt;mirrors&lt;/a&gt; and &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-svn.html"&gt;git-svn&lt;/a&gt;, but this will take Git usage at Apache to the next level.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Discussions are happening on the Apache infrastructure-dev mailing list &lt;a href="http://markmail.org/message/7ztq2pwm6456zqmy"&gt;there&lt;/a&gt; and JIRA issues have been opened to track the initial tasks &lt;a href="https://issues.apache.org/jira/browse/INFRA/component/12312655"&gt;there&lt;/a&gt;.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Issue &lt;a href="https://issues.apache.org/jira/browse/INFRA-3167"&gt;INFRA-317&lt;/a&gt; will be particularly interesting, I think... as it's about describing the basic Git workflows that will be used by Apache committers.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;Git is a distributed version control system which makes it very easy for individual contributors to work in isolation on local private repositories for some time, then publish and merge their work with others later.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;That's different from the traditional &lt;a href="http://www.apache.org/foundation/how-it-works.html"&gt;Apache way&lt;/a&gt;, where contributors from a project community collaborate more closely around a centralized (Subversion) repository.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;So, I think it'll be interesting to see how these distributed and centralized workflows can be reconciled, to allow people to use Git for everything it's good at, while still following the Apache way.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-935363821070148791?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/935363821070148791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=935363821070148791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/935363821070148791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/935363821070148791'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/11/full-support-for-git-at-apache_16.html' title='Full support for Git at Apache'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3367223358201977596</id><published>2010-11-15T00:53:00.000-08:00</published><updated>2010-11-15T17:30:32.420-08:00</updated><title type='text'>My VI configuration file</title><content type='html'>After a few years using Eclipse, I've gone back to &lt;a href="http://docs.freebsd.org/44doc/usd/12.vi/paper.html"&gt;VI&lt;/a&gt;. I actually use &lt;a href="http://vimdoc.sourceforge.net/htmldoc/vimfaq.html#1.1"&gt;VIM&lt;/a&gt;, an extended version of the original VI.&lt;br /&gt;&lt;br /&gt;I won't expand on the reasons, but I just find it simpler, faster, and less distracting than a graphical IDE like Eclipse.&lt;br /&gt;&lt;br /&gt;I've experimented a bit and found that I'm able to better focus on writing code with VI in a single barebones 24x80 window, instead of spending time and energy clicking and moving around outline views and windows.&lt;br /&gt;&lt;br /&gt;I use &lt;a href="http://ctags.sourceforge.net/"&gt;exuberant-ctags&lt;/a&gt; to navigate big codebases, and &lt;a href="http://www.google.com/"&gt;Google search&lt;/a&gt; as a richer replacement for code-assist.&lt;br /&gt;&lt;br /&gt;After I used VI to show and write code in my &lt;a href="http://na.apachecon.com/c/acna2010/"&gt;ApacheCon&lt;/a&gt; demos, a few folks asked me for my VI configuration supporting syntax highlighting, auto-indenting and code navigation.&lt;br /&gt;&lt;br /&gt;Here's my $HOME/.vimrc file. Nothing fancy, but I find it useful:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;" vi-improved mode&lt;br /&gt;set nocompatible&lt;br /&gt;&lt;br /&gt;" cycle buffers without writing&lt;br /&gt;set hidden&lt;br /&gt;&lt;br /&gt;" backup while writing&lt;br /&gt;set writebackup&lt;br /&gt;&lt;br /&gt;" file completion&lt;br /&gt;set wildmenu&lt;br /&gt;set wildmode=list:longest&lt;br /&gt;&lt;br /&gt;" update window title&lt;br /&gt;set title&lt;br /&gt;&lt;br /&gt;" display cursor location&lt;br /&gt;set ruler&lt;br /&gt;&lt;br /&gt;" display current command&lt;br /&gt;set showcmd&lt;br /&gt;&lt;br /&gt;" short message prompts&lt;br /&gt;set shortmess=atI&lt;br /&gt;&lt;br /&gt;" silent&lt;br /&gt;set noerrorbells&lt;br /&gt;&lt;br /&gt;" switch to current file's directory&lt;br /&gt;set autochdir&lt;br /&gt;&lt;br /&gt;" remember marks, registers, searches, buffer list&lt;br /&gt;set viminfo='20,&amp;lt;50,s10,h,%&lt;br /&gt;&lt;br /&gt;" keep a big history&lt;br /&gt;set history=1000&lt;br /&gt;&lt;br /&gt;" syntax highligting&lt;br /&gt;syntax on&lt;br /&gt;&lt;br /&gt;" auto smart code indent&lt;br /&gt;set autoindent&lt;br /&gt;filetype indent on&lt;br /&gt;set smartindent&lt;br /&gt;set smarttab&lt;br /&gt;set tabstop=4&lt;br /&gt;set softtabstop=4&lt;br /&gt;set expandtab&lt;br /&gt;set shiftwidth=4&lt;br /&gt;set shiftround&lt;br /&gt;&lt;br /&gt;" allow backspacing in insert mode&lt;br /&gt;set backspace=indent,eol,start&lt;br /&gt;&lt;br /&gt;" incremental search&lt;br /&gt;set incsearch&lt;br /&gt;set nohlsearch&lt;br /&gt;&lt;br /&gt;" ignore case&lt;br /&gt;set ignorecase&lt;br /&gt;set smartcase&lt;br /&gt;&lt;br /&gt;" restore last cursor position&lt;br /&gt;function! RESTORE_CURSOR()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if line("'\"") &amp;gt; 0 &amp;amp;&amp;amp; line ("'\"") &amp;lt;= line("$")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exe "normal! g'\""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; endif&lt;br /&gt;endfunction&lt;br /&gt;autocmd BufReadPost * call RESTORE_CURSOR()&lt;br /&gt;&lt;br /&gt;" navigate code using exuberant ctags&lt;br /&gt;set tags=tags;$HOME&lt;br /&gt;set tags+=$HOME/.vim/tags/cpp&lt;br /&gt;set tags+=$HOME/.vim/tags/curl&lt;br /&gt;set tags+=$HOME/.vim/tags/httpd&lt;br /&gt;set tags+=$HOME/.vim/tags/libmozjs&lt;br /&gt;set tags+=$HOME/.vim/tags/libxml2&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-3367223358201977596?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3367223358201977596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3367223358201977596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3367223358201977596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3367223358201977596'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/11/my-vi-configuration-file.html' title='My VI configuration file'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8832312354198530605</id><published>2010-11-05T20:19:00.000-07:00</published><updated>2010-11-05T20:24:01.384-07:00</updated><title type='text'>ApacheCon NA 2010 - Apache Tuscany track sessions</title><content type='html'>On the plane back from the &lt;a href="http://na.apachecon.com/c/acna2010/"&gt;ApacheCon North America 2010&lt;/a&gt; conference in Atlanta.&lt;br /&gt;&lt;br /&gt;Most US flights have internet on board now. That's pretty cool!&lt;br /&gt;&lt;br /&gt;As promised, here are some of the slides we presented on Thursday in the &lt;a href="http://na.apachecon.com/c/acna2010/schedule/2010/11/04"&gt;Apache Tuscany track&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;More presentations also on &lt;a href="http://lresende.blogspot.com/2010/11/apachecon-session-how-mentoring.html"&gt;Luciano Resende's blog&lt;/a&gt; and &lt;a href="http://pzf.fremantle.org/2010/11/building-cloud-native-software.html"&gt;Paul Fremantle's blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope you liked conference! See you on the Apache mailing lists!&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_5683504"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jsdelfino/apachecon-na-2010-building-apps-with-tuscany" title="ApacheCon NA 2010 - Building Apps with Apache Tuscany"&gt;ApacheCon NA 2010 - Building Apps with Apache Tuscany&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5683504" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-563buildingappswithtuscany-101105205756-phpapp02&amp;stripped_title=apachecon-na-2010-building-apps-with-tuscany&amp;userName=jsdelfino" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5683504" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-563buildingappswithtuscany-101105205756-phpapp02&amp;stripped_title=apachecon-na-2010-building-apps-with-tuscany&amp;userName=jsdelfino" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jsdelfino"&gt;jsdelfino&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_5683559"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jsdelfino/apachecon-na-2010-sca-reaches-the-cloud-developing-composite-applications-for-the-cloud-with-apache-tuscany" title="ApacheCon NA 2010 - Developing Composite Apps for the Cloud with Apache Tuscany"&gt;ApacheCon NA 2010 - Developing Composite Apps for the Cloud with Apache Tuscany&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5683559" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-565scareachesthecloud-101105211352-phpapp02&amp;stripped_title=apachecon-na-2010-sca-reaches-the-cloud-developing-composite-applications-for-the-cloud-with-apache-tuscany&amp;userName=jsdelfino" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5683559" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-565scareachesthecloud-101105211352-phpapp02&amp;stripped_title=apachecon-na-2010-sca-reaches-the-cloud-developing-composite-applications-for-the-cloud-with-apache-tuscany&amp;userName=jsdelfino" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jsdelfino"&gt;Jean-Sebastien Delfino&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_5683636"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/jsdelfino/apachecon-na-2010-high-performance-cloudenabled-sca-runtimes" title="ApacheCon NA 2010 - High Performance Cloud-enabled SCA Runtimes"&gt;ApacheCon NA 2010 - High Performance Cloud-enabled SCA Runtimes&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5683636" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-567highperfcloud-enabledscaruntimes-101105212803-phpapp02&amp;stripped_title=apachecon-na-2010-high-performance-cloudenabled-sca-runtimes&amp;userName=jsdelfino" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5683636" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=apacheconna2010-567highperfcloud-enabledscaruntimes-101105212803-phpapp02&amp;stripped_title=apachecon-na-2010-high-performance-cloudenabled-sca-runtimes&amp;userName=jsdelfino" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/jsdelfino"&gt;jsdelfino&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-8832312354198530605?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8832312354198530605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8832312354198530605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8832312354198530605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8832312354198530605'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/11/apachecon-na-2010-apache-tuscany-track.html' title='ApacheCon NA 2010 - Apache Tuscany track sessions'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-92502229210824605</id><published>2010-10-19T23:03:00.000-07:00</published><updated>2010-11-05T19:47:43.712-07:00</updated><title type='text'>JavaOne 2010 - Composite Apps for the Cloud with Apache Tuscany</title><content type='html'>Time flies! Almost a month has passed since JavaOne... I wanted to post my JavaOne 2010 presentation earlier, but have been busy with work... and a nice vacation in France.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lresende.blogspot.com/"&gt;Luciano Resende&lt;/a&gt; and I presented our experience with various cloud infrastructures and platforms, the challenges we're seeing, and how &lt;a href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=sca-assembly"&gt;SCA&lt;/a&gt; composition and the&amp;nbsp;&lt;a href="http://tuscany.apache.org/"&gt;Apache Tuscany&lt;/a&gt;&amp;nbsp;and &lt;a href="http://incubator.apache.org/nuvem/"&gt;Apache Nuvem&lt;/a&gt; projects can help.&lt;br /&gt;&lt;br /&gt;Here's the presentation abstract:&lt;br /&gt;&lt;br /&gt;Today's cloud environments pose new challenges for application developers: hiding cloud infrastructure from business logic, assembling components on heterogeneous and distributed cloud environments, and optimizing the provisioning of the required cloud resources.&lt;br /&gt;This session will demonstrate how to use Apache Tuscany and the Service Component Architecture (SCA) to develop, build, and run an application composed of several service components in a distributed cloud environment.&lt;br /&gt;We'll illustrate how to encapsulate cloud infrastructure services as SCA components to simplify the construction and assembly of the application and how to move components around and rewire the application to adjust to new business and cloud deployment conditions.&lt;br /&gt;&lt;br /&gt;... and the slides:&lt;br /&gt;&lt;div id="__ss_5294325"&gt;&lt;a href="http://www.slideshare.net/luckbr1975/s314011-developing-composite-applications-for-the-cloud-with-apache-tuscany" title="S314011 - Developing Composite Applications for the Cloud with Apache Tuscany"&gt;S314011 - Developing Composite Applications for the Cloud with Apache Tuscany&lt;/a&gt;&lt;br /&gt;&lt;object height="355" id="__sse5294325" width="425"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=s314011-100927003154-phpapp02&amp;stripped_title=s314011-developing-composite-applications-for-the-cloud-with-apache-tuscany&amp;userName=luckbr1975" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5294325" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=s314011-100927003154-phpapp02&amp;stripped_title=s314011-developing-composite-applications-for-the-cloud-with-apache-tuscany&amp;userName=luckbr1975" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;The session went pretty well. The room was full, the demos worked (see slides 22 and 27 for diagrams of what we demo'ed). There were interesting questions and a good discussion after the presentation.&lt;/div&gt;&lt;div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&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/6043566615205767088-92502229210824605?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/92502229210824605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=92502229210824605' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/92502229210824605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/92502229210824605'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/10/javaone-2010-developing-composite.html' title='JavaOne 2010 - Composite Apps for the Cloud with Apache Tuscany'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8855253709768663991</id><published>2010-08-18T15:48:00.000-07:00</published><updated>2010-08-18T15:52:58.942-07:00</updated><title type='text'>New book: Tuscany SCA in Action available</title><content type='html'>A new book by Simon Laws, Mark Combellack, Raymond Feng, Haleh Mahbod and Simon Nash, &lt;a href="http://www.amazon.com/Tuscany-SCA-Action-Simon-Laws/dp/1933988894"&gt;&lt;b&gt;Tuscany SCA in Action&lt;/b&gt;&lt;/a&gt; provides a simple step-by-step guide on how to develop applications leveraging &lt;a href="http://www.oasis-opencsa.org/sca"&gt;SCA&lt;/a&gt; (Service Component Architecture) and Apache &lt;a href="http://tuscany.apache.org/"&gt;Tuscany&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;InfoQ has just published an &lt;a href="http://www.infoq.com/articles/tuscanysca"&gt;interview&lt;/a&gt; of the authors with interesting questions and answers on SCA and an &lt;a href="http://www.infoq.com/resource/articles/tuscanysca/en/resources/TuscanySCAinActionCH07.pdf"&gt;excerpt&lt;/a&gt; of the book.&lt;br /&gt;&lt;br /&gt;There's a few things I really like about it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The authors are the founders of the Apache Tuscany project and have been involved in SCA from the beginning, so they know what they're talking about. &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The book uses a lot of &lt;a href="https://svn.apache.org/repos/asf/tuscany/sca-java-1.x/tags/travelsample-1.0/"&gt;examples&lt;/a&gt;, available in the Tuscany project, easy to &lt;a href="http://tuscany.apache.org/sca-java-travel-sample-1x-releases.html"&gt;download&lt;/a&gt; and try as you read.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;The examples are actually part of an official Tuscany release, in sync with the Tuscany v1.6 release (and I'm hoping that they'll be ported later to the evolving Tuscany v2.x release stream).&lt;/li&gt;&lt;/ul&gt;I think this book is a very good introduction to SCA and its implementation in Apache Tuscany. The printed book is not available yet, but an ebook version is already available &lt;a href="http://www.manning.com/laws/"&gt;there&lt;/a&gt;.&lt;a class="cssButton" href="http://www.blogger.com/post-edit.g?blogID=6043566615205767088&amp;amp;postID=8855253709768663991" id="publishButton" target=""&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="cssButtonOuter"&gt;&lt;div class="cssButtonMiddle"&gt;&lt;div class="cssButtonInner"&gt;&lt;a class="cssButton" href="http://www.blogger.com/post-edit.g?blogID=6043566615205767088&amp;amp;postID=8855253709768663991" id="publishButton" target=""&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-8855253709768663991?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8855253709768663991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8855253709768663991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8855253709768663991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8855253709768663991'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/08/new-book-tuscany-sca-in-action.html' title='New book: Tuscany SCA in Action available'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4986395890588060239</id><published>2010-05-13T12:45:00.000-07:00</published><updated>2010-05-13T13:05:30.987-07:00</updated><title type='text'>Apache Libcloud v0.3.1 released</title><content type='html'>The Apache Software Foundation and the &lt;a href="http://incubator.apache.org/libcloud/index.html"&gt;Apache Libcloud&lt;/a&gt; project have announced the release of version 0.3.1 of Apache Libcloud. Apache Libcloud is a pure Python client library for interacting with many of the popular cloud server providers.&lt;br /&gt;&lt;br /&gt;Apache Libcloud v0.3.1 is available for download from the project &lt;a href="http://incubator.apache.org/libcloud/downloads.html"&gt;download&lt;/a&gt; page as well as &lt;a href="http://pypi.python.org/pypi/apache-libcloud"&gt;PyPi&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been playing around with Libcloud to experiment and deploy SCA apps running on the &lt;a href="http://tuscany.apache.org/sca-native.html"&gt;Tuscany native&lt;/a&gt; (aka Tuscany-cpp) and &lt;a href="http://tuscany.apache.org/sca-java.html"&gt;Tuscany Java&lt;/a&gt; runtimes to EC2, and it's been working pretty well for me. The Libcloud API is very simple and makes it really easy to write Python scripts that automate the deployment, start, stop etc of compute nodes running SCA apps.&lt;br /&gt;&lt;br /&gt;If I find some free time this weekend, I'll try to clean up a bit the Libcloud-based deployment scripts I've been playing with, and add them to the Tuscany native sample apps.&lt;br /&gt;&lt;br /&gt;Also, I think it should be relatively easy to hook similar scripts with the Tuscany SCA domain manager Web app, which currently only supports local nodes but could be extended to deploy SCA components to remote nodes in the cloud.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-4986395890588060239?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4986395890588060239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4986395890588060239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4986395890588060239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4986395890588060239'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/05/apache-libcloud-v031-released.html' title='Apache Libcloud v0.3.1 released'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6846448248082456092</id><published>2010-05-04T22:36:00.000-07:00</published><updated>2010-05-09T23:02:43.562-07:00</updated><title type='text'>The Security Exchange Commission, Python, Excel and Functional Programming</title><content type='html'>What does the SEC have to to do with Python, Excel and Functional Programming? Well, the title of this blog is Random Thoughts, so here are a few random thoughts.&lt;br /&gt;&lt;br /&gt;Two weeks ago the US SEC &lt;a href="http://www.sec.gov/"&gt;Security and Exchange Commission&lt;/a&gt; proposed significant revisions to the rules governing the offering process, disclosure and reporting for ABS (&lt;a href="http://en.wikipedia.org/wiki/Asset-backed_security"&gt;Asset Backed Securities&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;One of the proposals is to require ABS issuers to file &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; computer programs describing the flow of funds (called waterfall) in ABS transactions. I think that's pretty cool!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;That's cool for investors&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Waterfall provisions in modern securitizations and CDOs (&lt;a href="http://en.wikipedia.org/wiki/Collateralized_debt_obligation"&gt;Collateralized Debt Obligations&lt;/a&gt;) are complicated. They're described in 'prospectus' documents written in plain english. That's verbose, error prone, and makes it difficult for investors to create credit and cash flow models and conduct their own evaluations of ABS. The last financial crisis revealed that many investors relied on ratings provided by third party credit rating agencies instead of doing their own evaluation homework, and were not fully aware of the risk in the underlying mortgages within the pools of securitized assets.&lt;br /&gt;&lt;br /&gt;Providing a Python program modeling the waterfall for each ABS would help investors conduct their own evaluations and make more informed investment decisions. The Python program source code would be filed on &lt;a href="http://www.sec.gov/edgar.shtml"&gt;EDGAR&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/EDGAR"&gt;Electronic Data-Gathering, Analysis, and Retrieval&lt;/a&gt;). Investors could just download the program for an ABS, input their data assumptions and model the waterfall right away.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;That's cool for Python and programming&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;I've dissected a few ABS prospectus documents and I'm starting to think that these Python programs could look just like &lt;a href="http://office.microsoft.com/en-us/excel/default.aspx"&gt;Excel&lt;/a&gt; spreadsheets (which most investors are familiar with), with user defined formulas written as Python functions, in a functional programming style.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;I did some intense Excel programming long time ago for a project at &lt;a href="http://en.wikipedia.org/wiki/France_T%C3%A9l%C3%A9com"&gt;France Telecom&lt;/a&gt;. I needed to model the characteristics of their applications, middleware and network. I was a C coder at the time and had to switch to Excel programming for 4 months. What a shock! :) My first reaction was to go back to my programmer comfort zone and write &lt;a href="http://msdn.microsoft.com/en-us/vbasic/default.aspx"&gt;Visual Basic&lt;/a&gt; instead of Excel formulas. Then I decided to try harder with Excel formulas, and I loved it! After a few weeks I was amazed by the power of such a simple programming model: cells, values and formulas that you can just compose... and how easily I could translate my specific business and network engineering rules to Excel formula 'code'. I guess I'm stating the obvious to the millions of Excel users out there :).&lt;br /&gt;&lt;br /&gt;More recently I've become interested in &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;functional programming&lt;/a&gt;, and I'm starting to see a lot of similarities between how I approach functional programs and Excel worksheets. If Excel supported recursion, the ability to define reusable formulas and treat them as data, I would dare to say that it's the most successful functional programming language ever! After all, a spreadsheet is just a functional program made of formulas/functions evaluated as their values are needed. &lt;br /&gt;&lt;br /&gt;I've also done quite a bit of programming in Python, and find it pretty natural to write Python programs in a functional programming style (mostly inspired from &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt;). Purists will argue that Python is not a real functional programming language like &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;. I agree, but I've found enough &lt;a href="http://docs.python.org/howto/functional.html"&gt;functional constructs&lt;/a&gt; in Python to get close to the happy functional feeling I get with Scheme. Python is also less cryptic than Haskell and simpler than &lt;a href="http://msdn.microsoft.com/en-us/fsharp/default.aspx"&gt;F#&lt;/a&gt; or &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Plain english, functional programs and Excel programs&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;One of the things I like about functional programming is how I can translate a plain english description of a real world process or rule into a functional program. Let's take a simple example and write a plain english description of a function (or formula) that calculates the sum of a list of numbers:&lt;br /&gt;&lt;br /&gt;"The sum of a list of numbers is equal to the first number in the list plus the sum of the numbers in the rest of the list. If the list is empty the sum is 0."&lt;br /&gt;&lt;br /&gt;Let's compare that to a typical &lt;a href="http://en.wikipedia.org/wiki/Imperative_programming"&gt;imperative programming&lt;/a&gt; implementation of "sum" (with assignments, state and side effects):&lt;br /&gt;&lt;br /&gt;In Java:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;static int sum(int[] numbers) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int total = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (i &amp;lt; numbers.length) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = total + numbers[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = i + 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return total;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;In Python:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def sum(numbers):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while i &amp;lt; len(numbers):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; total = total + numbers[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i = i + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return total&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;That's quite different from our original english description, right?&lt;br /&gt;&lt;br /&gt;It'd be interesting to reflect on what a programmer needs to go through to come up with that code. There seems to be a lot of invention and concepts to grasp here: several variables, a loop, access to values in a list using an index.&lt;br /&gt;&lt;br /&gt;How would you you explain the existence of variable "i" and its relationship with the original english description of "sum"? What's a variable by the way? Do we call it variable because it varies over time? Is "numbers" a variable too? But it doesn't vary, right? Is it just a value then? What does it mean to loop over a list? What if I don't know the length of the list upfront?&lt;br /&gt;&lt;br /&gt;Here comes incidental complexity... Incidental complexity is different from the inherent complexity of the real world process you're trying to model in a computer program. It is the complexity baggage that comes with a particular way to model that process and the programming language used to do it.&lt;br /&gt;&lt;br /&gt;You don't want incidental complexity. It gets in your way as you're just trying to calculate that sum...&lt;br /&gt;&lt;br /&gt;Now, let's write "sum" in Scheme:&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;(define (sum numbers)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (if (empty? numbers)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (+ (first numbers) (sum (rest numbers))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; )&lt;br /&gt;)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Then in Python again, using a functional style inspired by the Scheme version:&lt;br /&gt;(using simple Python implementations of "empty", "first" and "rest")&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;def sum(numbers):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if empty(numbers):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return first(numbers) + sum(rest(numbers))&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Isn't that functional version of "sum" much closer to the original plain english description? To me, that looks like a straight translation of the plain english description to Python, more precise, and executable. No more incidental complexity here!&lt;br /&gt;&lt;br /&gt;Wouldn't that be a good way to translate an ABS waterfall prospectus to a computer program? Could an Excel user working at a financial institution write that piece of Python code?&lt;br /&gt;&lt;br /&gt;To try to understand that, let's try to get in the mind of an Excel power user and see how he'd model "sum" in Excel if it wasn't already a builtin function.&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;1&amp;nbsp; A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; B&lt;br /&gt;2&amp;nbsp; Numbers Sum&lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;4&amp;nbsp; 1&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 6 = A4 + B5 = first number in the list (A4) + sum of the rest (B5)&lt;br /&gt;5&amp;nbsp; 2&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 5 = A5 + B6&lt;br /&gt;6&amp;nbsp; 3&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 3 = A6 + B7 &lt;br /&gt;7&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Surprise! That's almost the same thing as the Python or Scheme sum() functions!&lt;br /&gt;&lt;br /&gt;"= A4 + B5" is "the first number in the list" (A4) + "the sum of the rest" (B5).&lt;br /&gt;&lt;br /&gt;The Excel version introduces a few subtle differences, however:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No recursion, the Excel model is flat and the application of a formula to a series of values is realized by copying/pasting the formula over a series of cells (B4:B6).&lt;br /&gt;&lt;br /&gt;I'm not sure what to think about that yet. Recursion is a powerful functional programmer tool, sometimes difficult to master in computer programs, but used extensively in financial formulas.  &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Formulas have no name and are reused by copy/paste instead of references to their name.&lt;br /&gt;&lt;br /&gt;That's interesting. Most people will agree that copying the same formula over many cells makes it more difficult to change it. But naming a function forces the spreadsheet developer to learn that name, like a new word in a language. Once you have 100 functions, that's 100 words, and you've invented a new ad-hoc  language (called a &lt;a href="http://en.wikipedia.org/wiki/Domain-specific_language"&gt;Domain Specific Language&lt;/a&gt; these days). That new language is often more complex than Python or Excel, and you're forcing people to learn it. Is that better?&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Function and function application are mixed. B4 doesn't contain the sum() function, it contains an application of sum() to live data (A4 and B5). In other words B4 contains an instance of sum() loaded with the values from A4 and B5.&lt;br /&gt;&lt;br /&gt;Is that bad? No, I think it's actually great as you get instant feedback with the results of your formulas as you shape your code and data. Think of it like a&amp;nbsp; builtin TDD (Test Driven Design), which you wouldn't have to worry about. Think about writing code, testing it at the same time without having to explicitly write tests, and using the test results to guide you as you code. Sounds like a programmer's paradise? That's what you do with Excel, without even thinking about it :)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;b&gt;Off to the next financial crisis&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Going back to ABS waterfall Python programs... If the SEC proposal is adopted, I think they'll present a great opportunity to marry the Excel-like worksheet paradigm, Python and functional programming.&lt;br /&gt;&lt;br /&gt;Pushing that dream a little further, here would be my wish list for a Python-based ABS waterfall development environment:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Feels like an Excel worksheet, tables, cells, workbooks, the ability to mix presentation, values and formulas.&lt;/li&gt;&lt;li&gt;Takes formulas as simple Python functions.&lt;/li&gt;&lt;li&gt;Allows me to define my own reusable named formulas and just copy/paste their name around.&lt;/li&gt;&lt;li&gt;Like Excel, loads my Python functions with live data and shows me the results all the time.&lt;/li&gt;&lt;li&gt;Tolerates an incomplete worksheet (or program).&lt;/li&gt;&lt;li&gt;Allows several people to collaborate on a worksheet.&lt;/li&gt;&lt;li&gt;Is open-source (as the SEC proposal mentions the open source nature of Python).&lt;/li&gt;&lt;li&gt;Runs in the cloud off a bunch of Web pages -- what doesn't these days :)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Anyone would like to try to build that environment?&lt;br /&gt;&lt;br /&gt;Just imagine what millions of Python-enabled-functional-spreadsheet-in-the-cloud power users could do to the next financial crisis :)&lt;br /&gt;&lt;br /&gt;Let me know what you think...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6846448248082456092?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6846448248082456092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6846448248082456092' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6846448248082456092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6846448248082456092'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/05/security-exchange-commission-python.html' title='The Security Exchange Commission, Python, Excel and Functional Programming'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7833516194533646301</id><published>2010-04-19T00:15:00.000-07:00</published><updated>2010-04-19T07:53:26.379-07:00</updated><title type='text'>Functional Programming, a perfect fit for Web Programming?</title><content type='html'>The last few months I've become really interested in &lt;a href="http://en.wikipedia.org/wiki/Functional_programming"&gt;Functional Programming&lt;/a&gt;. I've learned &lt;a href="http://www.haskell.org/"&gt;Haskell&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Scheme&lt;/a&gt;, and &lt;a href="http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/"&gt;F#&lt;/a&gt;. I've also looked at how to do Functional Programming in &lt;a href="http://en.wikipedia.org/wiki/Imperative_programming"&gt;Imperative Programming&lt;/a&gt;  languages like &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://www.java.com/en/"&gt;Java&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/C_%28programming_language%29"&gt;C&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/C%2B%2B"&gt;C++&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been doing that as a hobby on evenings and weekends, as I'm only using Java at work. Evenings and weekends have added up and I've actually done quite a bit of real functional programming in Scheme and F# now, as well as some functional 'style' programming in Python and C++ in weekend contributions to the &lt;a href="http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/"&gt;Apache Tuscany C++ SCA&lt;/a&gt; project.&lt;br /&gt;&lt;br /&gt;I'm only starting to digest that Functional Programming experience.&lt;br /&gt;&lt;br /&gt;I've also done Web programming for 15 years and have been lucky to work on projects using so many Web frameworks and languages that I can't remember all of them...  Well, I still remember when I almost gave up on programming altogether, out of frustration as I was trying to do something like... &lt;a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29"&gt;AJAX&lt;/a&gt; in 1996... and Internet Explorer and Netscape were driving me crazy and crashing all the time :). We didn't have a fancy name like AJAX at the time, just &lt;a href="http://en.wikipedia.org/wiki/Dynamic_HTML"&gt;dynamic HTML&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;Javascript&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not sure I've completely digested Web programming yet, but I've got over a number of good and bad, or let's say 'learning', experiences. &lt;br /&gt;&lt;br /&gt;Last week I was bored and I started to think about similarities between Functional Programming and Web Programming. I thought about a few fun analogies:&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Start with an &lt;a href="http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol"&gt;HTTP&lt;/a&gt; GET http://whatever.com/add&amp;amp;x=1&amp;amp;y=2. That looks to me like the application of a function 'add', with precise input and output. An &lt;a href="http://en.wikipedia.org/wiki/Idempotence#Functions"&gt;idempotent function&lt;/a&gt; with no side effects. Like with Functional Programming, the result can be produced by executing code (a Python script for example), or just a table lookup (a pre-generated page for example.)&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;Use a URL like http://whatever.com/add/1/2. That looks less that the location of a script with parameters and more like the location of a resource, or data item. It's starting to blur the line between function application and access to data. Like with Functional Programming, Web functions and data seem interchangeable.&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;Do an HTTP &lt;a href="http://en.wikipedia.org/wiki/URL_redirection"&gt;redirect&lt;/a&gt; or use a URL &lt;a href="http://en.wikipedia.org/wiki/URL_shortening"&gt;shortening&lt;/a&gt; service to shorten http://whatever.com/add/1 into http://bit.ly/axIyzo for example, and you have &lt;a href="http://en.wikipedia.org/wiki/Currying"&gt;function currying&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;Use a &lt;a href="http://en.wikipedia.org/wiki/Proxy_server#Caching_proxy_server"&gt;caching proxy&lt;/a&gt; server or use client side caching based on last-modified of &lt;a href="http://en.wikipedia.org/wiki/HTTP_ETag"&gt;etags&lt;/a&gt; headers, and you're doing &lt;a href="http://en.wikipedia.org/wiki/Memoization"&gt;function memoization&lt;/a&gt;.&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;The HTTP POST, PUT, DELETE verbs introduce precisely identified side effects. That's what you're looking for when you do Functional Programming. When you can't avoid them, you want to be very explicit and precise about the side effects introduced by your code.&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;Return an &lt;a href="http://en.wikipedia.org/wiki/HTML"&gt;HTML&lt;/a&gt; page. That looks like a value representing a computation, which will perform some I/O in your Web browser at the edge of the system. Will functional programmers see the analogy with an &lt;a href="http://en.wikipedia.org/wiki/Monad_%28functional_programming%29"&gt;I/O Monad&lt;/a&gt;?&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;HTTP is stateless. When you pass state around across multiple HTTP interactions, wrapped in additional hidden fields or parameters on your URLs, are you implementing a &lt;a href="http://en.wikipedia.org/wiki/Monad_%28functional_programming%29#State_monads"&gt;State Monad&lt;/a&gt;?&lt;br /&gt;&lt;/li&gt;&lt;br&gt;&lt;li&gt;Finally, could &lt;a href="http://en.wikipedia.org/wiki/Functional_reactive_programming"&gt;Functional Reactive Programming&lt;/a&gt; and lazy event streams help you implement AJAX callbacks, subscribe to &lt;a href="http://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;ATOM&lt;/a&gt; feeds or &lt;a href="http://en.wikipedia.org/wiki/PubSubHubbub"&gt;Pubsubhubbub&lt;/a&gt; updates for example?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Something to think about... What if Functional Programming was a perfect fit for Web programming? What if you could compose Web functions like functional programmers compose functions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-7833516194533646301?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7833516194533646301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7833516194533646301' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7833516194533646301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7833516194533646301'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/04/functional-programming-perfect-fit-for.html' title='Functional Programming, a perfect fit for Web Programming?'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1534463989934799474</id><published>2010-04-14T15:12:00.000-07:00</published><updated>2010-04-14T15:24:21.760-07:00</updated><title type='text'>GCC 4.5 released! now supports Lambda Expressions</title><content type='html'>GCC 4.5 just got &lt;a href="http://gcc.gnu.org/ml/gcc/2010-04/msg00321.html"&gt;released&lt;/a&gt;! with support for &lt;a href="http://en.wikipedia.org/wiki/Lambda_calculus"&gt;lambda expressions&lt;/a&gt; (see &lt;a href="http://en.wikipedia.org/wiki/First-class_function"&gt;first class functions&lt;/a&gt; also), as part of some &lt;a href="http://gcc.gnu.org/gcc-4.5/cxx0x_status.html"&gt;experimental support for C++0x&lt;/a&gt; (the upcoming ISO C++ standard.)&lt;br /&gt;&lt;br /&gt;There are many other &lt;a href="http://gcc.gnu.org/gcc-4.5/changes.html"&gt;changes&lt;/a&gt; in GCC 4.5 but this new support for lambda expressions is great news for all the Linux developers out there interested in functional programming!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-1534463989934799474?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1534463989934799474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1534463989934799474' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1534463989934799474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1534463989934799474'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/04/gcc-45-released-now-supports-lambda.html' title='GCC 4.5 released! now supports Lambda Expressions'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6672503031198430139</id><published>2010-04-13T02:38:00.000-07:00</published><updated>2010-04-13T10:50:27.138-07:00</updated><title type='text'>Experimenting with Databases</title><content type='html'>I've been playing around with various Open-Source databases for a little weekend database project.&lt;br /&gt;&lt;br /&gt;Last weekend was really rainy. April usually feels like summer here, but this year is an &lt;a href="http://www.pmel.noaa.gov/tao/elnino/el-nino-story.html"&gt;el Nino&lt;/a&gt; year so we're getting a lot of rain... I shouldn't complain though, as the rain turns into great &lt;a href="http://www.squaw.com/snowfall-tracker"&gt;powder&lt;/a&gt; in Tahoe and we've had a great ski season!!&lt;br /&gt;&lt;br /&gt;But I didn't go skiing last weekend... For my database project I had two buckets of data to work with: &lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bucket (A)&lt;/b&gt;&lt;br /&gt;- low volume of data (35000 entries)&lt;br /&gt;- structured data with a stable structure&lt;br /&gt;- low update and access rate (a few thousands a day)&lt;br /&gt;- need flexible query and offline analysis capability&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Bucket (B)&lt;/b&gt;&lt;br /&gt;- higher volume (500000+ entries)&lt;br /&gt;- unstructured text&lt;br /&gt;- lots of reads/writes, no deletes&lt;br /&gt;- need super fast key-based lookups for interactive access&lt;br /&gt;&lt;br /&gt;I looked at the following SQL and NoSQL databases:&lt;br /&gt;- &lt;a href="http://www.oracle.com/technology/products/berkeley-db/index.html"&gt;BerkeleyDB&lt;/a&gt;&lt;br /&gt;- Apache &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;&lt;br /&gt;- Apache &lt;a href="http://couchdb.apache.org/"&gt;CouchDb&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;MongoDB&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.mysql.com/"&gt;MySQL&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://www.corpit.ru/mjt/tinycdb.html"&gt;TinyCDB&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://1978th.net/tokyocabinet/"&gt;Tokyo Cabinet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There has been a lot of buzz about SQL vs NoSQL databases recently so I wanted to try both types of databases.&lt;br /&gt;&lt;br /&gt;I quickly eliminated the following products as their licenses were not permissive enough for me and not compatible with the Apache license:&lt;br /&gt;- BerkeleyDB (&lt;a href="http://www.oracle.com/technology/software/products/berkeley-db/htdocs/oslicense.html"&gt;viral&lt;/a&gt; as code using it must be made available in source form)&lt;br /&gt;- Tokyo Cabinet (&lt;a href="http://1978th.net/tokyocabinet/spex-en.html#license"&gt;LGPL&lt;/a&gt;)&lt;br /&gt;- MySQL (&lt;a href="http://www.mysql.com/about/legal/licensing/foss-exception/"&gt;GPL&lt;/a&gt;)&lt;br /&gt;- MongoDB (&lt;a href="http://www.mongodb.org/display/DOCS/Licensing"&gt;AGPL&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Then I tried the remaining products. I say 'tried' instead of 'tested' as I didn't have much time for a scientific test approach and was mostly trying to get a feel for each database. I just used the simple tools provided out of the box with each product and didn't spend time optimizing their configuration.&lt;br /&gt;&lt;br /&gt;I used data from bucket (B), hoping that the products that performed well with (B) would fit the bill for bucket (A) as well: 580000 text entries, keys ranging from 3 to around 200 bytes, same characteristics for values, total 137 Mb&lt;br /&gt;&lt;br /&gt;I tried to insert the 580000 entries one by one, then did 100000 random gets.&lt;br /&gt;&lt;br /&gt;Here are my first observations:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Apache &lt;a href="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt;&lt;/b&gt; &lt;br /&gt;I used binary release 0.5.1. Cassandra was easy to setup and get started with, although I got a little lost in their Wiki.&lt;br /&gt;&lt;br /&gt;580000 inserts with cassandra-cli took 15mn, used 100% CPU, quite a bit of network I/O and 520Mb of disk space.&lt;br /&gt;&lt;br /&gt;Average speed:&lt;br /&gt;- insert 1.55ms&lt;br /&gt;- get 1.58ms&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Apache &lt;a href="http://couchdb.apache.org/"&gt;CouchDb &lt;/a&gt;&lt;/b&gt;&lt;br /&gt;I built version 0.11.0 from source and had to work through issues with different levels of libmozjs on Ubuntu. Getting started took 10mns, although I'd have liked a real client instead of just CURL.&lt;br /&gt;&lt;br /&gt;580000 inserts with curl took 124 mn, used 100% CPU, a lot of network I/O and... 4.5Gb of disk space!&lt;br /&gt;&lt;br /&gt;Average speed:&lt;br /&gt;- insert 12.82ms&lt;br /&gt;- get n/a... couldn't measure gets as the CouchDb view creation just kept hanging.&lt;br /&gt;&lt;br /&gt;I also didn't understand how to create CouchDb views right away, and could have used a better 'Getting started with views doc'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;&lt;/b&gt; &lt;br /&gt;Version 9.0alpha4 was easy to build from source, setup and get started. I picked version 9.0 as it's supposed to have new high availability + replication features that I may want to try later...&lt;br /&gt;&lt;br /&gt;580000 inserts with psql took 85 mn, used mostly disk I/O (didn't use much CPU at all, which was good) and 243Mb of disk space.&lt;br /&gt;&lt;br /&gt;Average speed: &lt;br /&gt;- insert 8.79ms&lt;br /&gt;- get/select (with no index) 173ms&lt;br /&gt;&lt;br /&gt;After creating an index, which took 40sec: &lt;br /&gt;- get/select 0.085ms&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;I built version 3.6.23.1 from source and got started in about 5 mns.&lt;br /&gt;&lt;br /&gt;20000 inserts with sqlite3 took very long, using mostly disk I/O (I lost patience and killed it after 15mn.)&lt;br /&gt;&lt;br /&gt;Average speed: &lt;br /&gt;- insert 45ms&lt;br /&gt;- get n/a... didn't measure as I had given up loading the database&lt;br /&gt;&lt;br /&gt;I think the problem was that sqlite3 does an fsync for each write. Their doc describes how to not fsync, but then I can't afford losing my data... and I won't be able to batch inserts either.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.corpit.ru/mjt/tinycdb.html"&gt;TinyCDB&lt;/a&gt;&lt;/b&gt; &lt;br /&gt;That one is a different animal... I used tinycdb version 0.77. It's really tiny (core code under 1400 lines of C) and easy to build from source, with a tiny doc, but very simple to use.&lt;br /&gt;&lt;br /&gt;TinyCDB is a 'constant' database. You can't modify it after you've added entries to it and saved the database file. To update the database, you need to rebuild it from scratch with the new values. It's so fast though, that doing that is not necessarily a problem...&lt;br /&gt;&lt;br /&gt;580000 inserts with the cdb command took 2.25 sec and 150Mb of disk space&lt;br /&gt;&lt;br /&gt;Average speed: &lt;br /&gt;- insert 0.00379ms&lt;br /&gt;- get 0.00683ms&lt;br /&gt;&lt;br /&gt;That's about 1 to 2 orders of magnitude faster than the other databases!&lt;br /&gt;&lt;br /&gt;With these initial observations, I'm tempted to experiment further with &lt;b&gt;PostgreSQL&lt;/b&gt; for bucket (A) and &lt;b&gt;TinyCDB&lt;/b&gt; for bucket (B).&lt;br /&gt;&lt;br /&gt;Both packages are proven and stable technologies too. PostgreSQL has been deployed in &lt;a href="http://www.postgresql.org/community/survey.51"&gt;production&lt;/a&gt; for years, and TinyCDB is used in production in well known DNS and mail packages like djbdns, fastforward, mess822, qmail etc.&lt;br /&gt;&lt;br /&gt;I'll probably have to put together a simple cascading scheme to handle updates with TinyCDB (a small TinyCDB db containing recent and/or frequent updates, periodically flushed into a bigger one, for example), but it shouldn't be too hard to do.&lt;br /&gt;&lt;br /&gt;I'll try to post an update here after another weekend or two playing with this...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6672503031198430139?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6672503031198430139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6672503031198430139' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6672503031198430139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6672503031198430139'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/04/experimenting-with-databases.html' title='Experimenting with Databases'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-603128849155764118</id><published>2010-04-05T08:28:00.000-07:00</published><updated>2010-04-05T08:41:38.008-07:00</updated><title type='text'>Apache Vysper XMPP Server first release</title><content type='html'>&lt;div style="text-align: left;"&gt;The Apache &lt;a href="http://mina.apache.org/"&gt;MINA&lt;/a&gt; project has announced the very first release of their XMPP server product Apache &lt;a href="http://mina.apache.org/vysper/"&gt;Vysper&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apache Vysper 0.5 is easy to install, easily extensible and embeddable. It is based, of course, on MINA.&lt;br /&gt;&lt;br /&gt;You can find the Vysper release here: &lt;a class="moz-txt-link-freetext" href="http://mina.apache.org/vysper/apache-vysper-05-release.html"&gt;http://mina.apache.org/vysper/apache-vysper-05-release.html&lt;/a&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Vysper comes with Multi-User Chat and Publish-Subscribe extensions enabled out-of-the-box. It does not yet implement the whole XMPP spec and stack, so be careful when you plan to use it in a production environment.&lt;br /&gt;&lt;br /&gt;I think this is great news! as Vysper is the first XMPP server with a friendly Apache open-source license. The other server with a friendly license is &lt;a href="http://prosody.im/"&gt;Prosody&lt;/a&gt;, written in LUA, with an MIT/X11 license. All the other good servers (jabberd, ejabberd etc) are GPL.&lt;br /&gt;&lt;br /&gt;I experimented a bit with Vysper in the Apache &lt;a href="http://tuscany.apache.org/"&gt;Tuscany&lt;/a&gt; project to test some XMPP &lt;a href="http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/components/chat/"&gt;Chat components&lt;/a&gt; and it worked pretty well for me! I also found it really easy to embed, register Jabber/XMPP ids, start the server etc. Here's an &lt;a href="http://svn.apache.org/repos/asf/tuscany/sca-cpp/trunk/components/chat/test/TestVysperServer.java"&gt;example&lt;/a&gt; from a Tuscany test case.&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/6043566615205767088-603128849155764118?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/603128849155764118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=603128849155764118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/603128849155764118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/603128849155764118'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/04/apache-mina-project-has-announced-very.html' title='Apache Vysper XMPP Server first release'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6542810561027962055</id><published>2010-03-31T22:44:00.000-07:00</published><updated>2010-03-31T22:48:54.167-07:00</updated><title type='text'>Google Summer of Code 2010 now accepting student applications</title><content type='html'>The Google Summer of Code 2010 program is now accepting student applications!&lt;br /&gt;&lt;br /&gt;Google Summer of Code is a global program to introduce students, ages 18 and over, to the  wonderful world of Open Source development. GSoC offers student developers stipends to write code for various Open Source projects. Students can  choose from &lt;a href="http://socghop.appspot.com/gsoc/program/accepted_orgs/google/gsoc2010" target="blank"&gt;150 Free and Open Source software projects&lt;/a&gt;, in  technical areas as diverse as gaming to humanitarian efforts to  operating system design.&lt;br /&gt;&lt;br /&gt;More info on the Google open-source &lt;a href="http://google-opensource.blogspot.com/2010/03/students-apply-now-for-google-summer-of.html"&gt;blog&lt;/a&gt;  and the GSoC &lt;a href="http://socghop.appspot.com/"&gt;home&lt;/a&gt; page.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Each Open Source project contributes mentors and a list of ideas for the students to work on. I've signed up to volunteer as a mentor for the &lt;a href="http://tuscany.apache.org/"&gt;Tuscany&lt;/a&gt; project from the Apache Software Foundation. The GSoC ideas from all Apache projects can be found &lt;a href="https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=12314021"&gt;there&lt;/a&gt;, the Apache Tuscany project ideas&amp;nbsp;&lt;a href="http://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&amp;amp;reset=true&amp;amp;pid=12310210&amp;amp;customfield_12310260=gsoc"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are a few ideas from the Apache projects that I found particularly interesting:&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/CASSANDRA-876"&gt;CASSANDRA-876&lt;/a&gt; - session consistency for Apache Cassandra.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/COMDEV-26"&gt;COMDEV-26&lt;/a&gt; - A SPDY protocol connector for Apache Tomcat.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/CXF-2738"&gt;CXF-2738&lt;/a&gt; - a Zookeeper based service repository for CXF.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/HARMONY-6455"&gt;HARMONY-6455&lt;/a&gt; - support for closures in Java / Harmony.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/MAHOUT-342"&gt;MAHOUT-342&lt;/a&gt; - map/reduce enabled neural network with back propagation.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/VYSPER-189"&gt;VYSPER-189&lt;/a&gt; - Websockets / BOSH support for XMPP Ajax clients.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/ZOOKEEPER-702"&gt;ZOOKEEPER-702&lt;/a&gt; - Smart distributed failure detector for Zookeeper.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://issues.apache.org/jira/browse/ZOOKEEPER-703"&gt;ZOOKEEPER-703&lt;/a&gt; - DNS server backed by Zookeeper.&lt;br /&gt;&lt;br /&gt;and -- shameless plug :) -- the ideas I've submitted for Apache Tuscany:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://issues.apache.org/jira/browse/TUSCANY-3521"&gt;TUSCANY-3521&lt;/a&gt; - a Pubsubhubbub binding. Curious about Pubsubhubbub? it's a really promising Web based publish / subscribe protocol, initially from Google and Six Apart.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://issues.apache.org/jira/browse/TUSCANY-3522"&gt;TUSCANY-3522&lt;/a&gt; - a No-SQL datastore component over Apache Cassandra, CouchDb, Hadoop/HBase, a good opportunity for students to experiment with these new cool No-SQL databases.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://issues.apache.org/jira/browse/TUSCANY-3523"&gt;TUSCANY-3523&lt;/a&gt; - distributed Haskell components, or "functional programming meets distributed composite applications".&lt;br /&gt;&lt;br /&gt;Finally, some cool ideas in these ideas lists from &lt;a href="http://wiki.developers.facebook.com/index.php/User:GSoC#GSoC_2010_Ideas"&gt;Facebook&lt;/a&gt;, &lt;a href="https://wiki.mozilla.org/Community:SummerOfCode10"&gt;Mozilla&lt;/a&gt;, &lt;a href="http://wiki.python.org/moin/SummerOfCode/2010"&gt;Python&lt;/a&gt;, &lt;a href="http://wiki.eclipse.org/Google_Summer_of_Code_2010_Ideas"&gt;Eclipse&lt;/a&gt;, &lt;a href="https://wiki.ubuntu.com/GoogleSoC2010/Ideas"&gt;Ubuntu&lt;/a&gt;, and &lt;a href="http://hackage.haskell.org/trac/summer-of-code/report/1"&gt;Haskell&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That's just my selection, there's many more to check out...&lt;br /&gt;&lt;br /&gt;So, students... want to gain real world software engineering experience and get paid? check out these project ideas, and apply now!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6542810561027962055?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6542810561027962055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6542810561027962055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6542810561027962055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6542810561027962055'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/03/google-summer-of-code-2010-now.html' title='Google Summer of Code 2010 now accepting student applications'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-4608766474372804194</id><published>2010-03-29T21:53:00.000-07:00</published><updated>2010-03-29T21:54:38.315-07:00</updated><title type='text'>CERN Large Hadron Collider ready for record particle beam collisions</title><content type='html'>&lt;span id="articleText"&gt;"We are opening the door to New Physics, to a new  period of discovery in the history of humankind," said Rolf-Dieter  Heuer, director-general of &lt;a href="http://public.web.cern.ch/public/"&gt;CERN&lt;/a&gt;, the European Organization for Nuclear  Research.&lt;/span&gt;&lt;span id="articleText"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="articleText"&gt;Pretty exciting news from the Swiss / French border! In a few hours, &lt;/span&gt;high energy particle beams will start  circulating in opposite directions around the CERN Large Hadron Collider (&lt;a href="http://en.wikipedia.org/wiki/Large_Hadron_Collider"&gt;LHC&lt;/a&gt;), causing particle collisions that could help unlock secrets of the&amp;nbsp; dark matter, dark energy and what happened in the universe 13.7  billion years ago...&lt;span id="articleText"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;span id="articleText"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span id="articleText"&gt;Well, it's probably going to take years to digest all the collision data, but&amp;nbsp; it looks like a promising step...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;More info: &lt;a href="http://press.web.cern.ch/press/PressReleases/Releases2010/PR06.10E.html"&gt;CERN press release&lt;/a&gt;, &lt;a href="http://www.reuters.com/article/idUSTRE62M2KS20100329"&gt;Reuters&lt;/a&gt;, &lt;a href="http://www.google.com/hostednews/ap/article/ALeqM5iFngOTfNSw21ce_26N1EzfTAXwRQD9EOES1G0"&gt;Associated Press&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Live &lt;a href="http://press.web.cern.ch/press/lhc-first-physics/webcast/"&gt;Webcast&lt;/a&gt; starting 11:30 pm PST... looks like I'm not going to sleep much...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-4608766474372804194?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/4608766474372804194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=4608766474372804194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4608766474372804194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/4608766474372804194'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/03/cern-large-hadron-collider-ready-for.html' title='CERN Large Hadron Collider ready for record particle beam collisions'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6416366401216242400</id><published>2010-03-28T14:27:00.000-07:00</published><updated>2010-03-28T15:46:39.918-07:00</updated><title type='text'>Binding to port 80 without running as root</title><content type='html'>I've been looking for a way to allow server programs like &lt;a href="http://httpd.apache.org/"&gt;Apache httpd&lt;/a&gt;, &lt;a href="http://memcached.org/"&gt;memcached&lt;/a&gt;, &lt;a href="http://couchdb.apache.org/"&gt;Couchdb&lt;/a&gt;, &lt;a href="http://qpid.apache.org/"&gt;Qpid&lt;/a&gt; etc to bind to privileged IP ports under 1024 like 80 or 443 for example, without running them as the root user. Normally, on Linux you need to run as root to be allowed to bind to these standard privileged ports&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;I don't like to run anything as root on a server as it makes it vulnerable to security holes in untrusted application code... and stupid mistakes. Has anybody ever completely messed up a server with a stupid mistake like rm -rf of the wrong directory? :)&lt;br /&gt;&lt;br /&gt;To mitigate the risks you can run as root in &lt;a href="https://wiki.ubuntu.com/DebootstrapChroot"&gt;chroot jails&lt;/a&gt;, but placing everything you need in a chroot jail and communicating with what's running in the jail quickly gets complicated. &lt;br /&gt;&amp;nbsp; &lt;br /&gt;Apache httpd has built-in support for dropping root privileges after binding to a privileged IP port, to run untrusted application code as a normal user (see the &lt;a href="http://httpd.apache.org/docs/2.0/mod/mpm_common.html#user"&gt;User&lt;/a&gt; configuration directive.) I don't like that either as the httpd parent process still runs as root. Also, some of the log files are still created under root and I have to become root again to process them (if running with a tight 0007 &lt;a href="http://manpages.ubuntu.com/manpages/karmic/en/man2/umask.2.html"&gt;umask&lt;/a&gt;) or relax the file permissions and make them visible to other users on the server.&lt;br /&gt;&lt;br /&gt;So, I've been trying to run a tight compartmentalized ship and run most server programs under normal user accounts. That makes it really easy to maintain isolated sandboxes with different configurations of programs, replicate them across machines, control resource consumption with user quotas, run scripts to monitor each sandbox activity, setup emergency procedures to shutdown everything running in a particular sandbox, etc.&lt;br /&gt;&lt;br /&gt;... Then I found &lt;a href="http://packages.ubuntu.com/karmic/privbind"&gt;privbind&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Privbind is a nice little utility that allows a program to bind to privileged IP ports without running as root. With privbind I'm now able to run all my server programs as regular users, and still bind them to privileged IP ports.&lt;br /&gt;&lt;br /&gt;Here's how to use it to start Apache httpd: sudo privbind -u foo apachectl -k start&lt;br /&gt;That runs Apache httpd under user foo, but still allows it to bind to privileged port 80.&lt;br /&gt;&lt;br /&gt;More info on how privbind works can be found in the privbind &lt;a href="http://manpages.ubuntu.com/manpages/karmic/man1/privbind.1.html"&gt;Manual&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;P.S. An alternative is to bind the server programs to non-standard unprivileged ports (8080 instead of 80 for HTTP for example.) and use an &lt;a href="https://help.ubuntu.com/community/IptablesHowTo"&gt;iptables&lt;/a&gt; firewall configuration to forward the IP traffic from port 80 to port 8080. I'll talk more about that in another post...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6416366401216242400?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6416366401216242400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6416366401216242400' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6416366401216242400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6416366401216242400'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2010/03/binding-to-port-80-without-running-as.html' title='Binding to port 80 without running as root'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2698710307585125065</id><published>2009-12-16T12:50:00.000-08:00</published><updated>2009-12-18T16:55:15.731-08:00</updated><title type='text'>Composability as a way to control Complexity</title><content type='html'>I came across this great video of a &lt;a href="http://channel9.msdn.com/posts/Charles/C9-Conversations-Brian-Beckman-on-Complexity/"&gt;conversation with Brian Beckman on Complexity&lt;/a&gt; in computing, on &lt;a href="http://channel9.msdn.com/"&gt;MSDN's Channel 9&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In that video Brian Beckman compares &lt;b&gt;Inherent or Essential complexity&lt;/b&gt; (of the problem you, programmer, are trying to solve) and &lt;b&gt;Accidental complexity&lt;/b&gt; (not inherent in the initial problem, but introduced by the many technologies and programming languages you have to use for example.)&lt;br /&gt;&lt;br /&gt;He also introduces &lt;b&gt;Functional Programming&lt;/b&gt;, how it limits the ways to hook things together and dependencies on the context in which software components executes, and how that makes it much &lt;b&gt;easier to compose&lt;/b&gt; complex systems out of small building blocks.&lt;br /&gt;&lt;br /&gt;In summary, &lt;b&gt;Composability is the way to control Complexity&lt;/b&gt;, and functional programs are easier to compose.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Also, don't miss older talks and conversations with Brian Beckman, perhaps even more interesting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/shows/Going+Deep/Brian-Beckman-Dont-fear-the-Monads/"&gt;Don't fear the Monads&lt;/a&gt; is an enlightening white board introduction to Functional Programming and Monads. Brian Beckman discusses &lt;b&gt;Monoids&lt;/b&gt; (a mathematical concept representing a collections of things and rules to compose them that themselves follow some rules, like associativity for example), &lt;b&gt;Monads&lt;/b&gt; (used to carry extra data around values, representing side effects for example, plus composition operators), and how they help you compose large and complex systems out of small function building blocks.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Brian-Beckman-The-Zen-of-Expressing-State-The-State-Monad/"&gt;The Zen of Stateless State, part 1&lt;/a&gt; and &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Brian-Beckman-The-Zen-of-Stateless-State-The-State-Monad-Part-2/"&gt;part 2&lt;/a&gt;, he shows how functions with no side effects can still be useful in the real world, flow and alter state, and still be composed using &lt;b&gt;State Monads&lt;/b&gt; (simple functions that take a state and return a &lt;b&gt;state + content pair&lt;/b&gt; and an operator that can thread the state through a composition.)&lt;br /&gt;&lt;br /&gt;Then he discusses how functions + monads force programmers to be explicit and very precise about what their code does (no undisciplined side effects under the covers of a function) and how that makes programs more reliable and composable.&lt;br /&gt;&lt;br /&gt;Bottom line, &lt;b&gt;mathematical&amp;nbsp;precision is the key to software reuse and composition&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;If you're not convinced, watch the videos...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-2698710307585125065?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2698710307585125065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2698710307585125065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2698710307585125065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2698710307585125065'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/12/controlling-complexity.html' title='Composability as a way to control Complexity'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1230606337555749412</id><published>2009-11-30T00:25:00.000-08:00</published><updated>2009-12-16T22:31:44.996-08:00</updated><title type='text'>Reading list - Elements of Programming</title><content type='html'>I just finished a fun book on the mathematical foundations of programming: &lt;a href="http://www.amazon.com/Elements-Programming-Alexander-Stepanov/dp/032163537X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1259568688&amp;amp;sr=1-1"&gt;Elements of Programming&lt;/a&gt; by Alexander Stepanov and Paul McJones.&lt;br /&gt;&lt;br /&gt;I highly recommend this book if you're interested in a deeper understanding of programming or looking for principles to decompose software into components.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;It starts with simple principles, a foundation mix of mathematics and code, and then builds on... It's short (230 pages) but will take a while to read as it's full of exercises, which you really need to do if you want to get the most out of it.&lt;br /&gt;&lt;br /&gt;It's not an easy read, but Elements of Programming could change the way you think about programming...&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.elementsofprogramming.com/"&gt;code&lt;/a&gt; from the book and an &lt;a href="http://www.informit.com/articles/article.aspx?p=1383185"&gt;interview&lt;/a&gt; of the authors are available online.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-1230606337555749412?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1230606337555749412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1230606337555749412' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1230606337555749412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1230606337555749412'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/11/reading-list-elements-of-programming.html' title='Reading list - Elements of Programming'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6743158059582950611</id><published>2009-11-23T10:07:00.000-08:00</published><updated>2009-12-16T22:32:19.754-08:00</updated><title type='text'>Connecting to WPA2 networks with Ubuntu 9.10</title><content type='html'>Upgrading to Ubuntu 9.10 / Karmic broke my Wireless connection. I can connect to open networks but with hidden WPA2 networks the Network Manager Connect button is always disabled...&lt;br /&gt;&lt;br /&gt;Looks like others are running into that bug too: &lt;a href="https://bugs.launchpad.net/ubuntu/+source/network-manager-applet/+bug/446394"&gt;https://bugs.launchpad.net/ubuntu/+source/network-manager-applet/+bug/446394&lt;/a&gt;. A fix has been committed in the Gnome repository, but there's no official installable package for it yet.&lt;br /&gt;&lt;br /&gt;If you're impatient like me and need the fix now, here's how to build it:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Get the network manager applet source code from the Gnome GIT repository:&lt;br /&gt;git clone git://git.gnome.org/network-manager-applet&lt;br /&gt;&lt;br /&gt;The following version works for me:&lt;br /&gt;e4cf9c6f1f95ce7d52d7cec435d95a5ddbf935a7 Tue Nov 17 00:58:14 2009 -0800&lt;br /&gt;&lt;br /&gt;See the change log:&lt;br /&gt;&lt;a href="http://git.gnome.org/cgit/network-manager-applet/log/"&gt;http://git.gnome.org/cgit/network-manager-applet/log/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and the fix for the disabled Connect button bug:&lt;br /&gt;&lt;a href="http://www.blogger.com/goog_1258998237631"&gt;&lt;/a&gt;&lt;a href="http://git.gnome.org/cgit/network-manager-applet/commit/?id=4162285fd7c53e8b684e1c1513a2ba6ce865e073"&gt;http://git.gnome.org/cgit/network-manager-applet/commit/?id=4162285fd7c53e8b684e1c1513a2ba6ce865e073&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Build it:&lt;br /&gt;./autogen.sh&lt;br /&gt;./configure&lt;br /&gt;make &lt;br /&gt;&lt;br /&gt;If the build fails, you may have to install missing dev dependencies:&lt;br /&gt;intltool&lt;br /&gt;libdbus-1-dev&lt;br /&gt;libdbus-glib-1-dev&lt;br /&gt;libgconf2-dev&lt;br /&gt;libgee-dev&lt;br /&gt;libglade2-dev&lt;br /&gt;libgnome-keyring-dev&lt;br /&gt;libgtk2.0-dev&lt;br /&gt;libiw-dev&lt;br /&gt;libnm-glib-dev&lt;br /&gt;libnotify-dev&lt;br /&gt;libpolkit-gobject-1-dev&lt;br /&gt;&lt;br /&gt;That list is what worked for me, and I already had many dev packages on my laptop. If you're still missing dependencies just try to guess what's missing from the build messages and install them until the build is happy. &lt;br /&gt;&lt;br /&gt;Install:&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;The updated Network Manager applet works like a charm, I don't need to carry an Ethernet cable around anymore :)&amp;nbsp; Bonus: the applet UI has improved a bit since the Karmic release.&lt;br /&gt;&lt;br /&gt;Hope this helps (as a few folks at work have been running into that bug too and were asking me about it on Friday.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6743158059582950611?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6743158059582950611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6743158059582950611' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6743158059582950611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6743158059582950611'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/11/connecting-to-wpa2-network-with-ubuntu.html' title='Connecting to WPA2 networks with Ubuntu 9.10'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8283271358463761844</id><published>2009-11-19T09:39:00.000-08:00</published><updated>2009-12-16T22:32:57.207-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scratch sca component assembly'/><title type='text'>Scratch - Programming and Component Assembly for All</title><content type='html'>&lt;a href="http://scratch.mit.edu/"&gt;Scratch&lt;/a&gt; makes the cover story of the &lt;a href="http://cacm.acm.org/magazines/2009/11"&gt;November issue&lt;/a&gt; of the Communications of the &lt;a href="http://www.acm.org/"&gt;ACM&lt;/a&gt;. The whole article is available on the MIT site &lt;a href="http://web.media.mit.edu/~mres/scratch/scratch-cacm.pdf"&gt;here&lt;/a&gt; and the ACM site &lt;a href="http://mags.acm.org/communications/200911/?CFID=62461011&amp;amp;CFTOKEN=51870047"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's an overview of Scratch, from their web site:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;div style="color: black; font-weight: bold;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 14px;"&gt;Scratch is a new programming language that makes it easy to create your own interactive stories, animations, games, music, and art -- and share your creations on the web.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;span style="font-size: 14px;"&gt;Scratch is designed to help young people (ages 8 and up) develop 21st century learning skills. As they create and share Scratch projects, young people learn important mathematical and computational ideas, while also learning to think creatively, reason systematically, and work collaboratively. &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Basically, you assemble a program out of building blocks using a nice little IDE.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_5Njmh9cAWX0/SwWCCrwh86I/AAAAAAAAAJc/bZEOShtdAiQ/s1600/ide.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_5Njmh9cAWX0/SwWCCrwh86I/AAAAAAAAAJc/bZEOShtdAiQ/s320/ide.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Here's what s Scratch program looks like:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_5Njmh9cAWX0/SwWCINXZdhI/AAAAAAAAAJk/UXL6d0mXQuY/s1600/sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_5Njmh9cAWX0/SwWCINXZdhI/AAAAAAAAAJk/UXL6d0mXQuY/s320/sample.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Then you can share your program with others, in sort of a social app store. The Scratch site has been there 2 years, and now hosts 601,000 projects, created by 90,450 contributors... That's a lot!&lt;br /&gt;&lt;br /&gt;I wonder if something like Scratch would help non-programmers assemble enterprise applications out of components, or sketch business process applications for example...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-8283271358463761844?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8283271358463761844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8283271358463761844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8283271358463761844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8283271358463761844'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/11/scratch-programming-and-component.html' title='Scratch - Programming and Component Assembly for All'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_5Njmh9cAWX0/SwWCCrwh86I/AAAAAAAAAJc/bZEOShtdAiQ/s72-c/ide.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6245294544057264400</id><published>2009-11-18T00:23:00.000-08:00</published><updated>2009-12-04T13:18:39.681-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='json javascript python scheme yaml apache tuscany sca'/><title type='text'>Simpler than JSON?</title><content type='html'>With XML falling out of fashion, &lt;a href="http://json.org/"&gt;JSON&lt;/a&gt; is all the rage these days.&lt;br /&gt;&lt;br /&gt;The last few years we've been using a simple online store application to demo application composition with &lt;a href="http://www.oasis-opencsa.org/committees"&gt;SCA&lt;/a&gt;. That store app allows you to pick fruits and vegetables out of a catalog and put them in your shopping cart.&lt;br /&gt;&lt;br /&gt;There's versions of the store app in different languages, Java, Python, and an HTML+JavaScript client in the Apache &lt;a href="http://tuscany.apache.org/"&gt;Tuscany&lt;/a&gt; project, and more languages to come over time. The shopping cart is currently represented in XML in an &lt;a href="http://tools.ietf.org/html/rfc4287"&gt;ATOM&lt;/a&gt; feed.&lt;br /&gt;&lt;br /&gt;I've been wondering... Should we switch from XML to JSON? Is JSON simpler? Is the JavaScript syntax so great? Any alternatives? Let's try and compare different representations of our shopping cart:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;XML:&lt;/b&gt;&lt;br /&gt;Here's the XML currently produced from Java bean representations of the cart, fruits and vegetables using some fancy &lt;a href="http://jcp.org/en/jsr/detail?id=222"&gt;JAXB&lt;/a&gt; code:&lt;br /&gt;&lt;br /&gt;&amp;lt;ns2:root xmlns:ns2="http://tuscany.apache.org/xmlns/sca/databinding/jaxb/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="cart"&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;items xsi:type="fruit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name xmlns=""&amp;gt;Apple&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price xmlns=""&amp;gt;2.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/items&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;items xsi:type="fruit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name xmlns=""&amp;gt;Orange&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price xmlns=""&amp;gt;3.55&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/items&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;items xsi:type="vegetable"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name xmlns=""&amp;gt;Broccoli&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price xmlns=""&amp;gt;1.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/items&amp;gt;&lt;br /&gt;&amp;lt;/ns2:root&amp;gt;&lt;br /&gt;&lt;br /&gt;Yuk...&lt;br /&gt;&lt;br /&gt;Here's without the namespace mess, as it's not needed by the store app to disambiguate what's flowing (as the app knows what it's doing), and would probably over-complicate any non-XML representation as well...&lt;br /&gt;&lt;br /&gt;&amp;lt;cart&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fruit&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Apple&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price&amp;gt;2.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/fruit&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fruit&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Orange&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price&amp;gt;3.55&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/fruit&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;vegetable&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;Broccoli&amp;lt;/name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;price&amp;gt;1.99&amp;lt;/price&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/vegetable&amp;gt;&lt;br /&gt;&amp;lt;/cart&amp;gt;&lt;br /&gt;&lt;br /&gt;That looks a little better.&lt;br /&gt;&lt;br /&gt;Here's with attributes instead of elements. It's shorter and should work too, I guess?&lt;br /&gt;&lt;br /&gt;&amp;lt;cart&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fruit name="Apple" price="2.99"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;fruit name="Orange" price="3.55"/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;vegetable name="Broccoli" price="1.99"/&amp;gt;&lt;br /&gt;&amp;lt;/cart&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The problem is that over the years I've started to develop an allergy to XML (mostly because of the usual namespace mess), so let's go with the flow, be cool, and try JSON...&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JSON:&lt;/b&gt;&lt;br /&gt;Here's a possible JSON representation. The cart contains an array of objects, actually two levels of objects to distinguish fruits and vegetables.&lt;br /&gt;{"cart":[&lt;br /&gt;&amp;nbsp; {"fruit":{"name":"Apple","price":2.99}},&lt;br /&gt;&amp;nbsp; {"fruit":{"name":"Orange","price":3.55}},&lt;br /&gt;&amp;nbsp; {"vegetable":{"name":"Broccoli","price":1.99}}]}&lt;br /&gt;&lt;br /&gt;Another try, with the funky &lt;a href="http://jabsorb.org/Manual#head-11bc691cce47ec200722a1c436efe0f4376b6c1a"&gt;javaClass&lt;/a&gt; attribute expected by the Java JSON code to figure the type of each item in the cart... Not great.&lt;br /&gt;&lt;br /&gt;{"cart":[&lt;br /&gt;&amp;nbsp; {javaClass:"sample.Fruit","name":"Apple","price":2.99},&lt;br /&gt;&amp;nbsp; {javaClass:"sample.Fruit","name":"Orange","price":3.55},&lt;br /&gt;&amp;nbsp; {javaClass:"sample.Vegetable","name":"Broccoli","price":1.99}]}&lt;br /&gt;&lt;br /&gt;Here's another one following the &lt;a href="http://jettison.codehaus.org/"&gt;Jettison&lt;/a&gt; or &lt;a href="http://ajaxian.com/archives/badgerfish-translating-xml-to-json"&gt;Badgerfish&lt;/a&gt; XML / JSON mapping. Multiple items of the same name are grouped in an array field. So in my example fruit is an array, vegetable is not. Now, add another vegetable to your cart, and vegetable morphs into an array... Confusing for lack of a better word :)&lt;br /&gt;&lt;br /&gt;{"cart":{&amp;nbsp; "fruit":[&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {"name":"Apple","price":2.99},&lt;br /&gt;&amp;nbsp; &amp;nbsp; {"name":"Orange","price":3.55}],&lt;br /&gt;&amp;nbsp; "vegetable":{"name":"Broccoli","price",1.99}&lt;br /&gt;}}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now I'm a little disappointed. JSON doesn't look significantly simpler than XML here, and Javascript concepts like arrays, (soft) objects and confusing mappings of multiple occurences of items are starting to bleed in my cart.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's try a little harder and find alternative representations:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;YAML:&lt;/b&gt;&lt;br /&gt;cart:&amp;nbsp; - type: fruit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name: Apple&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; price: 2.99&lt;br /&gt;&amp;nbsp; - type: fruit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name: Orange&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; price: Pear&lt;br /&gt;&amp;nbsp; - type: fruit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name: Orange&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; price: 3.55&lt;br /&gt;&amp;nbsp; - type: vegetable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name: Broccoli&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; price: 1.99&lt;br /&gt;&lt;br /&gt;I still need to add an artificial 'type' attribute to each item to represent different fruit&lt;fruit&gt; and vegetable elements, but YAML is not&lt;/fruit&gt; bad for the cart example which has only one level of nesting. With more levels of nesting, &lt;a href="http://www.yaml.org/"&gt;YAML&lt;/a&gt; gets a little akward in my opinion (see section 2.1, lists of lists and mappings of mappings, in the &lt;a href="http://www.yaml.org/spec/1.2/spec.html"&gt;YAML spec&lt;/a&gt;).&amp;nbsp;&lt;fruit&gt;&lt;/fruit&gt;&lt;br /&gt;&lt;br /&gt;&lt;fruit&gt;YAML also lacks the nice programming language feel of JSON, which I can just evaluate in the JavaScript interpreter, allowing me to blur the line between my shopping cart data and the code that uses it.&lt;/fruit&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scheme:&lt;/b&gt;&lt;br /&gt;'(cart&lt;br /&gt;&amp;nbsp; (fruit (name "Apple")(price 2.99))&lt;br /&gt;&amp;nbsp; (fruit (name "Orange")(price 3.55))&lt;br /&gt;&amp;nbsp; (vegetable (name "Broccoli")(price 1.99)))&lt;br /&gt;&lt;br /&gt;That &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt; language representation is not bad at all!&lt;br /&gt;- it's really concise;&lt;br /&gt;- the Scheme syntax is simple and easy to parse, () for lists, space as a separator;&lt;br /&gt;- as the above expression is just constructing lists, I don't need to make my shopping cart data fit in Objects, Arrays or Maps;&lt;br /&gt;- it's easy to distinguish symbols like fruit or name and user data like "Apple". &lt;br /&gt;- a list can simply be tagged with a fruit or vegetable symbol to indicate its type;&lt;br /&gt;- like JSON, the above expression is a piece of code easy to evaluate and test in a Scheme interpreter.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Python:&lt;/b&gt;&lt;br /&gt;Another variation on the same theme with &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; &lt;a href="http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences"&gt;tuples&lt;/a&gt;, as Python is more widely known than Scheme or Lisp.&lt;br /&gt;('cart', &lt;br /&gt;&amp;nbsp; ('fruit',('name','Apple'),('price',2.99)),&lt;br /&gt;&amp;nbsp; ('fruit',('name','Orange'),('price',3.55)),&lt;br /&gt;&amp;nbsp; ('vegetable',('name','Broccoli'),('price',1.99)))&lt;br /&gt;&lt;br /&gt;A little more verbose than scheme, but not bad.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, I must admit... I think I much prefer the &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt; representation, or the Python tuple syntax. I realize that Scheme was created in the 70's, but hey, that doesn't mean it's bad :) -- see the &lt;a href="http://en.wikipedia.org/wiki/Scheme_%28programming_language%29"&gt;Wikipedia entry on Scheme&lt;/a&gt; for its history.&lt;br /&gt;&lt;br /&gt;I also realize that JSON is natively supported by the JavaScript interpreters used in Web browsers... but it looks like most people are using handcrafted JSON &lt;a href="http://www.json.org/js.html"&gt;parser&lt;/a&gt; implementations (written in JavaScript) instead of the native JavaScript eval() or JSON.parse() so that argument is not very solid... and it shouldn't be hard to write similar parsers for the Scheme or Python syntaxes as well.&lt;br /&gt;&lt;br /&gt;Oh, by the way... check-out that JSON &lt;a href="http://www.json.org/js.html"&gt;parser&lt;/a&gt; page. Here's what it says:&lt;br /&gt;&lt;i&gt;JavaScript is a general purpose programming language that was introduced as the page scripting language for Netscape Navigator. It is still widely believed to be a subset of Java, but it is not. It is a &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt;-like language with &lt;a href="http://www.crockford.com/javascript/survey.html"&gt;C-like syntax&lt;/a&gt; and &lt;a href="http://www.crockford.com/javascript/inheritance.html"&gt;soft objects&lt;/a&gt;.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Why not just stick with &lt;a href="http://groups.csail.mit.edu/mac/projects/scheme/"&gt;Scheme&lt;/a&gt;'s minimalistic syntax then? Why would I need JSON's C-like syntax or these fancy soft objects to represent my shopping cart? :)&lt;br /&gt;&lt;br /&gt;Let me know what you think...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6245294544057264400?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6245294544057264400/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6245294544057264400' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6245294544057264400'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6245294544057264400'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/11/simpler-than-json.html' title='Simpler than JSON?'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-2685535657463444638</id><published>2009-11-01T00:13:00.000-07:00</published><updated>2009-12-04T13:22:54.989-08:00</updated><title type='text'>ApacheCon US 2009 - Apache is 10 years old</title><content type='html'>ApacheCon US 2009 returns to the San Francisco bay area, considered to be the original 'home' of the &lt;a href="http://www.apache.org/"&gt;Apache Software Foundation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The conference starts on Monday in Oakland, and will celebrate the 10th anniversary of the Apache Software Foundation.&lt;br /&gt;&lt;br /&gt;Details are available &lt;a href="http://us.apachecon.com/c/acus2009/"&gt;there&lt;/a&gt;, including free &lt;a href="http://us.apachecon.com/c/acus2009/schedule/hackathon"&gt;Hackathon&lt;/a&gt; and &lt;a href="http://us.apachecon.com/c/acus2009/schedule/barcamp"&gt;BarCamp&lt;/a&gt; events on Monday and Tuesday.&amp;nbsp; If you're going, don't miss the Apache Tuscany &lt;a href="http://us.apachecon.com/c/acus2009/schedule#tuscany"&gt;track&lt;/a&gt;:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;SCA, Java EE, Spring and Web 2.0 Come Together - Service assembly with Apache Tuscany SCA&lt;/b&gt;&lt;br /&gt;Wed, Nov 4, 11am [&lt;a href="http://us.apachecon.com/c/acus2009/sessions/312"&gt;details&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Do you need to integrate applications? Do you wish application assembly could be as easy as playing Lego with software components? We'll show you how easy it is to turn your code into SCA components and assemble them together with Apache Tuscany.&lt;br /&gt;&lt;br /&gt;Luciano Resende and I will also present the latest on SCA and Tuscany, including some cool demos!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Distributed OSGi with SCA using Apache Tuscany&lt;/b&gt;&lt;br /&gt;Wed, Nov 4, 1:30pm [&lt;a href="http://us.apachecon.com/c/acus2009/sessions/316"&gt;details&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Do you want to know more about distributed OSGi? Raymond Feng will show you how you can use Distributed OSGi (RFC 119) and SCA to build a distributed application out of OSGi bundles.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Apache Tuscany: Applying OSGi modularity&lt;/b&gt;&lt;br /&gt;Fri, Nov 6, 11:15am [&lt;a href="http://us.apachecon.com/c/acus2009/sessions/309"&gt;details&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;Are you wondering how to turn your code into OSGi bundles? Luciano will share how we did it for the Tuscany runtime code. The benefits, the pain points and issues, and how we resolve them.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luciano, Raymond and I will be at the Hackathon. Come join us there&amp;nbsp;if you're interested in &lt;a href="http://www.oasis-opencsa.org/sca"&gt;SCA&lt;/a&gt; or the &lt;a href="http://tuscany.apache.org/"&gt;Apache Tuscany&lt;/a&gt; project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-2685535657463444638?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/2685535657463444638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=2685535657463444638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2685535657463444638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/2685535657463444638'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/11/apachecon-us-2009-apache-is-10-years.html' title='ApacheCon US 2009 - Apache is 10 years old'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-6791166112882008719</id><published>2009-08-26T01:03:00.000-07:00</published><updated>2009-12-16T22:37:22.252-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recover jpeg compact flash C GCC tail recursion'/><title type='text'>Recovering JPEG images from a damaged compact flash card</title><content type='html'>&lt;i&gt;I've started to blog again...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I've not been lucky with data storage devices recently.&lt;br /&gt;&lt;br /&gt;Last week my Thinkpad crashed. The disk got shredded into pieces under the Linux /lost+found directory. I had to crawl through it for two days to manually recover some of the files I cared about.&lt;br /&gt;&lt;br /&gt;A few weeks ago the compact flash card in my digital camera got damaged too, giving me a "This card cannot be used" error message.&amp;nbsp;I had two 2 GB of JPEG images on that card: family photos that I didn't want to lose! After reading the troubleshooting section of my Nikon's user manual I was almost ready to buy some expensive recovery software, or ship my card to a company that recovers images, when I thought:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;"Wait... I'm a software developer. How about hacking a little program to recover those images myself?"&amp;nbsp;That's what I did, and it was surprisingly easy! so I thought I'd share that recipe here.&lt;br /&gt;&lt;br /&gt;If your compact flash card ever gets damaged (and from what I see on the Web that happens a lot), try the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Save a snapshot of your card in a file. On Linux do: &lt;a href="http://manpages.ubuntu.com/manpages/jaunty/en/man1/dd.1.html"&gt;dd&lt;/a&gt; if=/dev/&amp;lt;card-device&amp;gt; of=&amp;lt;card-file&amp;gt; bs=512&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Read that file in chunks of 512 bytes, as the card is usually organized in sectors of 512 bytes.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;If you see hex 0xff 0xd8 0xff 0xe1 at the beginning of a sector, you've hit the JPEG/Exif header of a JPEG image. If you're wondering what I'm talking about, just Google it or check the Wikipedia &lt;a href="http://en.wikipedia.org/wiki/JPEG"&gt;JPEG&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Exif"&gt;Exif&lt;/a&gt; pages.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If the card is not too fragmented, most of your JPEG images are stored in contiguous sectors. Save that sector and the next ones into a .JPG image file until you hit the next JPEG header, save the next image, and go on until you reach the end of the card. You'll save up to 511 bytes of garbage at the end of each image file but that's OK, as JPEG viewers use the length of JPEG data encoded in the header and will ignore that garbage at the end of the file.&lt;/li&gt;&lt;/ul&gt;Here's a little C program translation of the above algorithm:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;recover-jpg.c&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;&lt;br /&gt;/* Returns true if a sector contains a JPEG image header. */&lt;br /&gt;const int isJPEG(const unsigned char *sector) {&lt;br /&gt;&amp;nbsp; return(sector[0] == 0xff &amp;amp;&amp;amp; sector[1] == 0xd8 &amp;amp;&amp;amp; sector[2] == 0xff &amp;amp;&amp;amp; sector[3] == 0xe1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Buffer used to read sectors from the card */&lt;br /&gt;unsigned char buffer[512];&lt;br /&gt;&lt;br /&gt;/* Returns the first sector of the first JPEG image on a card file. */&lt;br /&gt;const unsigned char* firstJPEG(FILE *card) {&lt;br /&gt;&amp;nbsp; if (fread(buffer, 512, 1, card) != 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return NULL;&lt;br /&gt;&amp;nbsp; if (isJPEG(buffer))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buffer;&lt;br /&gt;&amp;nbsp; return firstJPEG(card);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Recovers contiguous sectors containing the pieces of a JPEG image. */&lt;br /&gt;const unsigned char* recoverSector(FILE* card, const unsigned char* sector, FILE* image) {&lt;br /&gt;&amp;nbsp; /* write sector to the image file */&lt;br /&gt;&amp;nbsp; fwrite(sector, 1, 512, image);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* read the next sector */&lt;br /&gt;&amp;nbsp; if (fread(buffer, 512, 1, card) != 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return NULL;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* done with this image, we've hit the next JPEG header */&lt;br /&gt;&amp;nbsp; if (isJPEG(buffer))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return buffer;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* recover the next sector from this image */&lt;br /&gt;&amp;nbsp; return recoverSector(card, buffer, image);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* Recovers JPEG images from a card file. Returns the number of recovered images. */&lt;br /&gt;const int recoverJPEG(FILE* card, const unsigned char* firstSector, const int imageCount) {&lt;br /&gt;&amp;nbsp; /* no sector to recover, we're done */&lt;br /&gt;&amp;nbsp; if (firstSector == NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return imageCount;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* create JPEG image file */&lt;br /&gt;&amp;nbsp; char path[16];&lt;br /&gt;&amp;nbsp; sprintf(path, "DSC_%4.4d.JPG", imageCount);&lt;br /&gt;&amp;nbsp; printf("Recovering %s\n", path);&lt;br /&gt;&amp;nbsp; FILE* image = fopen(path, "wb");&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* recover sectors from that image */&lt;br /&gt;&amp;nbsp; const unsigned char* nextSector = recoverSector(card, firstSector, image);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* close image file */&lt;br /&gt;&amp;nbsp; fclose(image);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* recover the next image */&lt;br /&gt;&amp;nbsp; return recoverJPEG(card, nextSector, imageCount + 1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int main(const int argc, const char *argv[]) {&lt;br /&gt;&amp;nbsp; if(argc != 2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Usage: %s card-file\nto recover JPEG images from card-file.\n", argv[0]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Card-file can be created like this:\ndd if=/dev/&amp;lt;card-device&amp;gt; of=&amp;lt;card-file&amp;gt; bs=512\n\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return(1);&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* open card file */&lt;br /&gt;&amp;nbsp; FILE *card = fopen(argv[1], "rb");&lt;br /&gt;&amp;nbsp; if (card == NULL) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Could not open %s\n", argv[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* recover JPEG images from it */&lt;br /&gt;&amp;nbsp; const int imageCount = recoverJPEG(card, firstJPEG(card), 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; printf("Recovered %d images!\n\n", imageCount);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* close card file */&lt;br /&gt;&amp;nbsp; fclose(card);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;To build that program (on Linux Ubuntu 9.0.4) do: &lt;a href="http://manpages.ubuntu.com/manpages/jaunty/en/man1/gcc-3.4.1.html"&gt;gcc&lt;/a&gt; -O2 recover-jpg.c -o recover-jpg&lt;br /&gt;&lt;br /&gt;A side comment: With the -O2 option, the Linux &lt;a href="http://gcc.gnu.org/"&gt;GCC&lt;/a&gt; C compiler &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html"&gt;optimizes&lt;/a&gt; sibling calls, allowing you to use &lt;a href="http://en.wikipedia.org/wiki/Tail_recursion"&gt;tail recursion&lt;/a&gt; instead of loops without growing the stack. That's what I did in the firstJPEG(), recoverJPEG() and recoverSector() functions, just for fun :)&lt;br /&gt;&lt;br /&gt;To run the program: recover-jpg &amp;lt;your-card-file&amp;gt;&lt;br /&gt;&lt;br /&gt;It'll save the JPEGs found on the card into files named DSC_0000.JPG, DSC_0001.JPG etc in the current directory.&lt;br /&gt;&lt;br /&gt;That program successfully recovered the 700 JPEG images stuck on my compact flash card! I hope it'll work for you too if your card ever gets damaged...&lt;br /&gt;&lt;br /&gt;Please drop me a comment here if you find any bugs in this little piece of code. Thanks!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-6791166112882008719?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/6791166112882008719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=6791166112882008719' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6791166112882008719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/6791166112882008719'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2009/08/recovering-jpeg-images-from-damaged.html' title='Recovering JPEG images from a damaged compact flash card'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-8384429170358027901</id><published>2008-02-06T15:58:00.000-08:00</published><updated>2009-12-16T22:39:07.076-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csa'/><category scheme='http://www.blogger.com/atom/ns#' term='osoa'/><category scheme='http://www.blogger.com/atom/ns#' term='composite'/><category scheme='http://www.blogger.com/atom/ns#' term='oasis'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Apache Tuscany SCA 1.1 released</title><content type='html'>I've been busy working on the &lt;a href="http://incubator.apache.org/tuscany"&gt;Apache Tuscany&lt;/a&gt; project. We've just announced our 1.1 release, here's the announcement:&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://incubator.apache.org/tuscany"&gt;Apache Tuscany&lt;/a&gt; team is pleased to announce the 1.1 release of the SCA project.&lt;br /&gt;&lt;br /&gt;Apache Tuscany provides a runtime environment based on the &lt;a href="http://www.oasis-opencsa.org/sca"&gt;Service Component Architecture&lt;/a&gt; (SCA). SCA is a set of specifications aimed at simplifying SOA application development. The specifications are being standardized by OASIS as part of the &lt;a href="http://www.oasis-opencsa.org/"&gt;Open Composite Services Architecture&lt;/a&gt; (Open CSA).&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;The Apache Tuscany SCA 1.1 release adds a number of features including a JMS binding, improved SCA policy support and a Widget implementation extension for representing client side Javascript Widgets as SCA components.&lt;br /&gt;&lt;br /&gt;The release includes implementations of the main SCA specifications including:&lt;br /&gt;- Assembly Model v1.0&lt;br /&gt;- Policy Framework v1.0&lt;br /&gt;- Java Common Annotations and APIs v1.0&lt;br /&gt;- Java Component Implementation v1.0&lt;br /&gt;- Spring Component Implementation v1.0&lt;br /&gt;- Web Services Binding v1.0&lt;br /&gt;- JMS binding v1.0&lt;br /&gt;- EJB Session Bean Binding v1.0&lt;br /&gt;- BPEL Client and Implementation v1.0 (experimental)&lt;br /&gt;&lt;br /&gt;It also includes implementations of features not yet defined by the SCA specifications, including:&lt;br /&gt;- JSON-RPC and Direct Web Remoting bindings&lt;br /&gt;- RSS, ATOM, and HTTP bindings&lt;br /&gt;- RMI binding&lt;br /&gt;- Pub/Sub notification binding&lt;br /&gt;- Widget component implementation&lt;br /&gt;- XQuery component implementation&lt;br /&gt;- Scripting component implementation (Groovy, Javascript, Python, Ruby)&lt;br /&gt;- OSGi component implementation&lt;br /&gt;- Support for OSGi bundles&lt;br /&gt;- databindings for JAXB, SDO, JSON, AXIOM, Saxon, XmlBeans, DOM, SAX and StAX&lt;br /&gt;&lt;br /&gt;The Tuscany SCA Runtime can be configured as a single node SCA domain or as an SCA domain distributed across multiple nodes. In addition Tuscany SCA supports the following host deployment options:&lt;br /&gt;- running standalone&lt;br /&gt;- running with embedded Jetty or Tomcat&lt;br /&gt;- running with distributed nodes across multiple JVMs&lt;br /&gt;- running as part of a standard Web application&lt;br /&gt;&lt;br /&gt;The Webapp samples included in this release have been tried and tested on:&lt;br /&gt;- Tomcat 5.5.20 and Tomcat 6.0.14&lt;br /&gt;- Jetty 6.1.3&lt;br /&gt;- Geronimo 2.0.2 Tomcat6 jee5&lt;br /&gt;- WebSphere 6.1 fix pack 9&lt;br /&gt;&lt;br /&gt;For full detail about the release see the &lt;a href="http://www.apache.org/dyn/closer.cgi/incubator/tuscany/java/sca/1.1-incubating/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; and &lt;a href="http://www.apache.org/dyn/closer.cgi/incubator/tuscany/java/sca/1.1-incubating/CHANGES"&gt;CHANGES&lt;/a&gt; files.&lt;br /&gt;&lt;br /&gt;To download the distributions or for more information about the release please go to: &lt;a href="http://incubator.apache.org/tuscany/sca-java-releases.html"&gt;http://incubator.apache.org/tuscany/sca-java-releases.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To find out more about OASIS Open CSA go to: &lt;a href="http://www.oasis-opencsa.org/"&gt;http://www.oasis-opencsa.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Apache Tuscany welcomes your help. Any contribution, including code, testing, contributions to the documentation, or bug reporting is always appreciated. For more information on how to get involved in Apache Tuscany visit the website at: &lt;a href="http://incubator.apache.org/tuscany"&gt;http://incubator.apache.org/tuscany&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Thank you for your interest in Apache Tuscany!&lt;br /&gt;The Apache Tuscany Team.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Tuscany is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Web services PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-8384429170358027901?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/8384429170358027901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=8384429170358027901' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8384429170358027901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/8384429170358027901'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2008/02/apache-tuscany-sca-11-released.html' title='Apache Tuscany SCA 1.1 released'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1125554035898485732</id><published>2007-11-26T19:53:00.000-08:00</published><updated>2009-12-16T22:41:17.030-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='laptopgiving'/><category scheme='http://www.blogger.com/atom/ns#' term='olpc'/><category scheme='http://www.blogger.com/atom/ns#' term='ws'/><category scheme='http://www.blogger.com/atom/ns#' term='child'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><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='laptop'/><category scheme='http://www.blogger.com/atom/ns#' term='education'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='abdera'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Back from ApacheCon US</title><content type='html'>Back from ApacheCon US conference in Atlanta. Already two weeks ago... I was on vacation last week.&lt;br /&gt;&lt;br /&gt;I attended a few interesting technical sessions:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://us.apachecon.com/us2007/program/talk/1913"&gt;Hacking Atom with Apache Abdera&lt;/a&gt; - Garret Rooney&lt;br /&gt;&amp;nbsp;Abdera looks good. I'm probably going to start looking into porting Apache Tuscany's Atom binding to it soon.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.apachecon.com/us2007/program/talk/1994"&gt;Comparing Java Web Frameworks&lt;/a&gt; - Matt Raible&lt;br /&gt;&amp;nbsp;Two sets of slides &lt;a href="http://static.raibledesigns.com/repository/presentations/ComparingJavaWebFrameworks-ApacheConUS2007.pdf"&gt;there&lt;/a&gt; and &lt;a href="http://static.raibledesigns.com/repository/presentations/ComparingJVMWebFrameworks-ApacheConUS2007.pdf"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are my notes:&lt;br /&gt;- Don't believe the hype.&lt;br /&gt;- Choose the right tool for the job.&lt;br /&gt;- Most of these frameworks are awful anyway.&lt;br /&gt;- Flex is really popular.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.apachecon.com/us2007/program/talk/2012"&gt;A little REST and Relaxation&lt;/a&gt; - Roy T. Fielding&lt;br /&gt;&amp;nbsp;The slides are &lt;a href="http://us.apachecon.com/us2007/downloads/200711_REST_ApacheCon.pdf"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Quote from the presentation: "An architectural style is a coordinated set of architectural constraints that restricts the roles and features of architectural elements, and the allowed relationships among those elements, within any architecture that conforms to that style."&lt;br /&gt;&lt;br /&gt;Huh Oh, I already feel relaxed...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.apachecon.com/us2007/program/talk/1882"&gt;WS-* vs. REST: Facts, Myths and Lies&lt;/a&gt; - Sanjiva Weerawarana&lt;br /&gt;&amp;nbsp;My notes:&lt;br /&gt;- &amp;lt;xml&amp;gt;&amp;lt;is&amp;gt;&amp;lt;great&amp;gt;&amp;lt;/is&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;- &amp;lt;or&amp;gt;...&amp;lt;/or&amp;gt;   &amp;lt;is&amp;gt;&amp;lt;it/&amp;gt;&amp;lt;/is&amp;gt;?&lt;br /&gt;- &amp;lt;do&amp;gt;&amp;lt;i&amp;gt;&amp;lt;feel&amp;gt;&amp;lt;relaxed/&amp;gt;&amp;lt;/feel&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/do&amp;gt;?&lt;br /&gt;- Don't believe the hype.&lt;br /&gt;- Choose the right tool for the job.&lt;br /&gt;- Building distributed systems is tough anyway.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://us.apachecon.com/us2007/program/talk/2130"&gt;Back to the Future and One Laptop Per Child&lt;/a&gt; - Jim Gettys&lt;br /&gt;&amp;nbsp;My notes:&lt;br /&gt;- This is really really useful.&lt;br /&gt;- This is amazing technology.&lt;br /&gt;- Again, this is really really useful.&lt;br /&gt;- For $200 you can participate in the &lt;a href="http://www.laptopgiving.org/en/index.php"&gt;Give One Get One &lt;/a&gt;program.&lt;br /&gt;- If you're a software developer you can volunteer to help. More information &lt;a href="http://wiki.laptop.org/go/Developers_program"&gt;there&lt;/a&gt; and &lt;a href="http://wiki.laptop.org/go/Getting_involved_in_OLPC"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Something to think about: How many of you are making sure that your own child has access to a computer? and why are you doing it?&lt;br /&gt;&lt;br /&gt;This One laptop Per Child program can make a difference...&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-1125554035898485732?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1125554035898485732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1125554035898485732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1125554035898485732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1125554035898485732'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/11/back-from-apachecon-us.html' title='Back from ApacheCon US'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-84451749025669031</id><published>2007-10-06T10:14:00.000-07:00</published><updated>2009-12-16T22:42:59.779-08:00</updated><title type='text'>Airbus A380 landed in San Francisco</title><content type='html'>On Thursday morning the new Airbus A-380 landed in San Francisco for the first time!&lt;br /&gt;&lt;br /&gt;Here are two photos taken from the bay shore across the street from my office:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;It's big!!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwfElazmByI/AAAAAAAAAFc/jqViHXnRy0E/s1600-h/a380-small.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5118275648659785506" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwfElazmByI/AAAAAAAAAFc/jqViHXnRy0E/s400/a380-small.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;About to land... view of the city in the background.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwfDcqzmBxI/AAAAAAAAAFU/4KW4dyC2D6w/s1600-h/a380-small-sfo.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwfEt6zmBzI/AAAAAAAAAFk/xtHttacvrhc/s1600-h/a380-small-sfo.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5118275794688673586" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwfEt6zmBzI/AAAAAAAAAFk/xtHttacvrhc/s400/a380-small-sfo.jpg" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-84451749025669031?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/84451749025669031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=84451749025669031' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/84451749025669031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/84451749025669031'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/10/airbus-a380-landed-in-san-francisco.html' title='Airbus A380 landed in San Francisco'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_5Njmh9cAWX0/RwfElazmByI/AAAAAAAAAFc/jqViHXnRy0E/s72-c/a380-small.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3763007681612386961</id><published>2007-10-03T12:12:00.000-07:00</published><updated>2009-12-16T22:44:12.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='smd'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='europa'/><category scheme='http://www.blogger.com/atom/ns#' term='soap'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='wsdl'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Developing an SCA application with Apache Tuscany and Eclipse</title><content type='html'>I'm working on &lt;a href="http://incubator.apache.org/tuscany"&gt;Apache Tuscany&lt;/a&gt;. Tuscany implements the &lt;a href="http://www.oasis-opencsa.org/sca"&gt;Service Component Architecture&lt;/a&gt; (SCA) specification.&lt;br /&gt;&lt;br /&gt;The last few months I spent a lot of time in &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; developing SCA samples and demos for Tuscany. I found myself tweaking my various Eclipse workspaces again  and again to do the following:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;- Define a Tuscany User Library containing all the Tuscany JARs to make  it easier to add them to my project buildpath.&lt;br /&gt;&lt;br /&gt;- Associate .composite files with the XML editor and register the SCA  and Tuscany XML schemas to get code-assist in the editor and validation  of my composite files.&lt;br /&gt;&lt;br /&gt;- Write programs to launch Tuscany configured with my various  composites... wishing that I could just right-click on the .composite  and select a Run As / Tuscany...&lt;br /&gt;&lt;br /&gt;Finally, I got tired of repeating these steps again and again and decided to put together a small tool made of two simple Eclipse plugins to package Tuscany in a Library and take care of all that configuration.&lt;br /&gt;&lt;br /&gt;I'm thinking that it could be useful to others as well so here's a brief description of how to use it.&lt;br /&gt;&lt;br /&gt;The tool works with &lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse 3.3 Europa&lt;/a&gt;. It can be installed on top of the Europa "Eclipse IDE for Java Developers" distro. Here's how to install it:&lt;br /&gt;&lt;br /&gt;From the Eclipse Workbench menu bar select Help - Software Updates - Find and Install. The Install - Feature Updates dialog will open.&lt;br /&gt;&lt;br /&gt;Select "Search for new features to install", press Next. The "Update sites to visit" dialog will appear.&lt;br /&gt;&lt;br /&gt;Press New Remote site.&lt;br /&gt;&lt;br /&gt;In the New Update site dialog enter,&lt;br /&gt;Name: Tuscany&lt;br /&gt;URL: http://people.apache.org/~jsdelfino/tuscany/tools/updatesite&lt;br /&gt;Press OK.&lt;br /&gt;&lt;br /&gt;Make sure that Tuscany is selected in the list of sites to visit as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwPwvqzmBZI/AAAAAAAAACU/EX8RaaFt1ts/s1600-h/UpdateSites.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117198303358223762" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwPwvqzmBZI/AAAAAAAAACU/EX8RaaFt1ts/s400/UpdateSites.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Now press Finish, the Updates - Search results dialog will appear. Select Tuscany as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwPxN6zmBaI/AAAAAAAAACc/gkekeSZUAss/s1600-h/SearchResults.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117198823049266594" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwPxN6zmBaI/AAAAAAAAACc/gkekeSZUAss/s400/SearchResults.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Next. In the Feature license dialog, accept the license agreement then press Next. Press Next again, the following Installation dialog will appear:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwPxkazmBbI/AAAAAAAAACk/4Dg2gCvSrkY/s1600-h/Install.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117199209596323250" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwPxkazmBbI/AAAAAAAAACk/4Dg2gCvSrkY/s400/Install.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Finish to download the Tuscany plugins. The download is about 35Mb as it includes the Tuscany runtime plus all the dependencies for all the SCA implementation types and bindings supported by Tuscany. But I found having everything in one download more convenient as it saves you from having to solve the JAR dependency puzzle and fish for all the required JARs...&lt;br /&gt;&lt;br /&gt;After the download completes you should see the following dialog:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwPypKzmBcI/AAAAAAAAACs/POoP9DdWZSQ/s1600-h/Verification.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117200390712329666" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwPypKzmBcI/AAAAAAAAACs/POoP9DdWZSQ/s400/Verification.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;You're now ready to install the Tuscany plugins. Press Install All, the plugins will be installed:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwPzTKzmBdI/AAAAAAAAAC0/9WjNXjr5dks/s1600-h/Restart.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117201112266835410" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwPzTKzmBdI/AAAAAAAAAC0/9WjNXjr5dks/s400/Restart.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Restart your Workbench.&lt;br /&gt;&lt;br /&gt;You're now equipped with a tool to help you write, test, and run an SCA application in Eclipse!&lt;br /&gt;&lt;br /&gt;To show how to use the tool let's develop a simple HelloWorld application with an SCA Java  component providing a Service with two bindings, a Web Service binding and a JSONRPC binding. It should just take about 5 minutes :)&lt;br /&gt;&lt;br /&gt;First let's create a Java project. From the Workbench menu bar select New - Java Project. In the New Java Project dialog, enter a name for the project as follows:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwP5DKzmBeI/AAAAAAAAAC8/HpgHsiU-fd8/s1600-h/NewProject.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117207434458695138" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwP5DKzmBeI/AAAAAAAAAC8/HpgHsiU-fd8/s400/NewProject.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Next. In the Java Settings dialog, select the Libraries tab.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwP6gazmBfI/AAAAAAAAADE/ZoMnCLf5QCw/s1600-h/Libraries.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117209036481496562" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwP6gazmBfI/AAAAAAAAADE/ZoMnCLf5QCw/s400/Libraries.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Now you need to add the Tuscany library to the project. Click Add then in the Add Library dialog select the Tuscany library as follows:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwP636zmBgI/AAAAAAAAADM/2CwK5V5zUHY/s1600-h/AddLibrary.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117209440208422402" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwP636zmBgI/AAAAAAAAADM/2CwK5V5zUHY/s400/AddLibrary.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Next then Finish. The Tuscany library should be  on your project's build path, as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwP7aKzmBhI/AAAAAAAAADU/K9OvMyzgnhc/s1600-h/AddedTuscany.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117210028618941970" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwP7aKzmBhI/AAAAAAAAADU/K9OvMyzgnhc/s400/AddedTuscany.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Finish to create the Project.&lt;br /&gt;&lt;br /&gt;Now let's create a Java interface and a Java implementation class for our Hello SCA component.&lt;br /&gt;&lt;br /&gt;Right click on the src folder, then select New - Interface. In the New Java Interface dialog, enter&lt;br /&gt;Package: hello&lt;br /&gt;Name: Hello&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwP8iazmBiI/AAAAAAAAADc/njIQhJOk4Bw/s1600-h/Hello.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117211269864490530" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwP8iazmBiI/AAAAAAAAADc/njIQhJOk4Bw/s400/Hello.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Finish to create the Hello interface. The Java editor will open, add the following method to the Hello interface:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;String hey(String name);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Press Ctrl+S to save the file.&lt;br /&gt;&lt;br /&gt;The editor and the contents of the file are shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwP9ZKzmBjI/AAAAAAAAADk/wjXtTNl3VKA/s1600-h/EditHello.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117212210462328370" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwP9ZKzmBjI/AAAAAAAAADk/wjXtTNl3VKA/s400/EditHello.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Now let's create the HelloImpl Java implementation class.   Right click the Hello interface, then select New - Class. In the New Java Class dialog, enter&lt;br /&gt;Name: HelloImpl&lt;br /&gt;Make sure that hello.Hello is listed in the list of interfaces.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwP_O6zmBlI/AAAAAAAAAD0/EOlxnrM0Nng/s1600-h/HelloImpl.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117214233391924818" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwP_O6zmBlI/AAAAAAAAAD0/EOlxnrM0Nng/s400/HelloImpl.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Finish to create the Hello interface. The Java editor will open, add the following code to the HelloImpl.hey(...) method:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;return "Hey " + name;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Press Ctrl+S to save the file.&lt;br /&gt;&lt;br /&gt;The editor and the contents of the file are shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwP_8qzmBmI/AAAAAAAAAD8/KjY9zjR3OpE/s1600-h/EditHelloImpl.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117215019370940002" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwP_8qzmBmI/AAAAAAAAAD8/KjY9zjR3OpE/s400/EditHelloImpl.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Now let's turn the HelloImpl class into an SCA component. To do that we need to create an SCA Composite file describing the component its services and their binding configuration.&lt;br /&gt;&lt;br /&gt;From the workbench menu bar, select New - Other, in the New Wizard dialog select the Tuscany - Composite wizard, as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwQBEazmBnI/AAAAAAAAAEE/tDltSKT9AmY/s1600-h/CompositeWizard.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117216252026553970" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwQBEazmBnI/AAAAAAAAAEE/tDltSKT9AmY/s400/CompositeWizard.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Press Next, you're about to create your first SCA composite :) In the New SCA Composite dialog, make sure that Hello/src is selected as parent folder then enter,&lt;br /&gt;File name: Hello.composite&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwQCsazmBpI/AAAAAAAAAEU/LlAiQ1YOBIY/s1600-h/HelloComposite.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117218038732949138" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwQCsazmBpI/AAAAAAAAAEU/LlAiQ1YOBIY/s400/HelloComposite.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Press Finish, Hello.composite will open in the XML editor. You should be able to use code assist in the XML editor to edit your SCA composite, as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwQD-6zmBqI/AAAAAAAAAEc/PKNWfMdvVUM/s1600-h/EditHelloComposite.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117219456072156834" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwQD-6zmBqI/AAAAAAAAAEc/PKNWfMdvVUM/s400/EditHelloComposite.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Add the following to your SCA composite:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;component name="Hello"&amp;gt;&lt;br /&gt;&amp;lt;implementation.java class="hello.HelloImpl"/&amp;gt;&lt;br /&gt;&amp;lt;service name="Hello"&amp;gt;&lt;br /&gt;&amp;lt;binding.ws uri="hello-there"/&amp;gt;&lt;br /&gt;&amp;lt;t:binding.jsonrpc uri="hello-nicer"/&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;This declares an SCA component implemented by the HelloImpl class, providing our little Hello Service over two bindings, Web Service (SOAP) and JSONRPC.&lt;br /&gt;&lt;br /&gt;Press Ctrl+S to save the file.&lt;br /&gt;&lt;br /&gt;The editor and the contents of the file are shown here:&lt;br /&gt;&lt;br /&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwQItKzmBsI/AAAAAAAAAEs/VXQmqlgFUd0/s1600-h/EditHelloComposite2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117224648687617730" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwQItKzmBsI/AAAAAAAAAEs/VXQmqlgFUd0/s400/EditHelloComposite2.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;br /&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;That's it for coding! Let's try to run this SCA Composite now...&lt;br /&gt;&lt;br /&gt;It's pretty simple. Right click Hello.composite then from the popup-menu select Run As - Tuscany.&lt;br /&gt;&lt;br /&gt;The Tuscany Runtime should start the Hello composite and you'll see the following in the Console view:&lt;br /&gt;&lt;br /&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwQKAazmBtI/AAAAAAAAAE0/MdYVjXkP9uY/s1600-h/Run.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117226078911727314" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwQKAazmBtI/AAAAAAAAAE0/MdYVjXkP9uY/s400/Run.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;service name="Hello"&gt;&lt;component name="Hello"&gt;&lt;implementation.java class="hello.HelloImpl"&gt;&lt;/implementation.java&gt;&lt;/component&gt;Your SCA composite is now up and running, providing a Hello Web Service at &lt;a href="http://localhost:8085/hello-there?wsdl"&gt;http://localhost:8085/hello-there&lt;/a&gt; and a JSONRPC service at &lt;a href="http://localhost:8080/hello-nicer?smd"&gt;http://localhost:8080/hello-nicer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can click these links to check that the services are running OK and get their WSDL and SMD descriptions, as shown below:&lt;br /&gt;&lt;br /&gt;The WSDL describing the Web Service:&lt;br /&gt;&lt;br /&gt;&lt;/service&gt;&lt;/implementation.java&gt;&lt;/component&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwQM3azmBuI/AAAAAAAAAE8/w55-ILAJVoM/s1600-h/HelloWSDL.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117229222827788002" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwQM3azmBuI/AAAAAAAAAE8/w55-ILAJVoM/s400/HelloWSDL.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;The SMD describing the JSONRPC service:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwQNE6zmBvI/AAAAAAAAAFE/y0E7U0XXTwQ/s1600-h/HelloSMD.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5117229454756022002" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwQNE6zmBvI/AAAAAAAAAFE/y0E7U0XXTwQ/s400/HelloSMD.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's all for today... If you got to the end  of this post, I hope you'll find this little Tuscany tool useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-3763007681612386961?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3763007681612386961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3763007681612386961' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3763007681612386961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3763007681612386961'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/10/developing-sca-application-with-apache.html' title='Developing an SCA application with Apache Tuscany and Eclipse'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_5Njmh9cAWX0/RwPwvqzmBZI/AAAAAAAAACU/EX8RaaFt1ts/s72-c/UpdateSites.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-7129677248896115634</id><published>2007-10-02T11:08:00.001-07:00</published><updated>2009-12-16T22:45:37.063-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='websphere'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>How to use Apache Tuscany with WebSphere 6.1</title><content type='html'>Recently a number of Apache Tuscany users started to use our &lt;a href="http://incubator.apache.org/tuscany/sca-java-releases.html"&gt;Tuscany SCA 1.0 release&lt;/a&gt; on top of &lt;a href="http://www-306.ibm.com/software/webservers/appserv/was/features/"&gt;WebSphere v6.1&lt;/a&gt; and ask questions about it on the &lt;a href="http://www.mail-archive.com/tuscany-user@ws.apache.org/"&gt;tuscany-user&lt;/a&gt; list.&lt;br /&gt;&lt;br /&gt;To be able to help I had to set up WebSphere v6.1 on my Laptop and configure it to work with Tuscany. It was pretty straightforward so I thought it'd be useful to share the steps here:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;First install WebSphere v6.1.0.9. The "9" indicates WebSphere &lt;a href="http://www-1.ibm.com/support/docview.wss?rs=180&amp;amp;uid=swg24015777"&gt;Fixpack 9&lt;/a&gt;, which contains a &lt;a href="http://www-1.ibm.com/support/docview.wss?uid=swg24014758"&gt;Fix&lt;/a&gt; for a WebSphere bug with Servlet filters... needed as Tuscany uses a Servlet filter to dispatch HTTP requests to SCA services.&lt;br /&gt;&lt;br /&gt;Start your WebSphere server, then point your Web browser to the WebSphere console at &lt;a href="http://localhost:9060/admin"&gt;http://localhost:9060/admin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To activate that WebSphere Fix, navigate to Application Servers - server1 - Web Container - Customer Properties and configure a &lt;span style="color: black;"&gt;com.ibm.ws.webcontainer.invokefilterscompatibility&lt;/span&gt; property to &lt;span style="color: black;"&gt;true&lt;/span&gt; as described &lt;a href="http://www-1.ibm.com/support/docview.wss?uid=swg24014758"&gt;there&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's a screen capture showing what to do:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKbGqzmBJI/AAAAAAAAAAU/Hcne-iGYLcM/s1600-h/ConfigWebContainer.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116822665518515346" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKbGqzmBJI/AAAAAAAAAAU/Hcne-iGYLcM/s400/ConfigWebContainer.png" style="cursor: pointer; margin: 0pt 10px 10px 0pt; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Download the Tuscany SCA release 1.0 binary distribution from http://incubator.apache.org/tuscany/sca-java-releases.html and untar or unzip it.&lt;br /&gt;&lt;br /&gt;The distribution contains a number of ready to use samples. Let's start with samples/calculator-webapp.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwKgP6zmBKI/AAAAAAAAAAc/PfgxSHpQl20/s1600-h/CalculatorFolder.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116828321990444194" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwKgP6zmBKI/AAAAAAAAAAc/PfgxSHpQl20/s400/CalculatorFolder.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;This is a sample Calculator implemented with SCA components wired together, implementing the basic add, subtract, multiply, divide operations (in Java), and a JSP invoking the calculator.&lt;br /&gt;&lt;br /&gt;Here's a diagram showing the SCA composite and how the SCA components are assembled together:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwKhdazmBLI/AAAAAAAAAAk/r7WO0FnBifQ/s1600-h/calculator-web.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116829653430305970" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwKhdazmBLI/AAAAAAAAAAk/r7WO0FnBifQ/s400/calculator-web.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;The sample README describes how to build the WAR file for the Webapp using Apache Ant, but the distribution already contains a WAR file ready to use, let's try to deploy it to WebSphere...&lt;br /&gt;&lt;br /&gt;From the WebSphere Console page, navigate to Applications - Enterprise Applications. You should see the following page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKk5qzmBMI/AAAAAAAAAAs/phEJgf1wUqc/s1600-h/Applications.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116833437296493762" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKk5qzmBMI/AAAAAAAAAAs/phEJgf1wUqc/s400/Applications.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click on the Install button, in the application installation form click Local file system - Browse and select:&lt;br /&gt;samples/calculator-webapp/target/sample-calculator-webapp.war.&lt;br /&gt;&lt;br /&gt;In the Context root field, type sample-calculator-webapp as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKmaqzmBNI/AAAAAAAAAA0/A-Lf3onaMbo/s1600-h/InstallApplication.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116835103743804626" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKmaqzmBNI/AAAAAAAAAA0/A-Lf3onaMbo/s400/InstallApplication.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click Next to proceed with the installation, the following page will appear:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwKnEazmBOI/AAAAAAAAAA8/BokjT2I78-M/s1600-h/InstallApplication2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116835821003343074" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwKnEazmBOI/AAAAAAAAAA8/BokjT2I78-M/s400/InstallApplication2.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;You don't need to change any of these settings, just click Next, the following page will appear:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp3.blogger.com/_5Njmh9cAWX0/RwKowazmBPI/AAAAAAAAABE/qPhwKzUcxaQ/s1600-h/InstallApplication3.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116837676429214962" src="http://bp3.blogger.com/_5Njmh9cAWX0/RwKowazmBPI/AAAAAAAAABE/qPhwKzUcxaQ/s400/InstallApplication3.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click Next, the following page will appear:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKo7qzmBQI/AAAAAAAAABM/xMVDQ8Z0DH8/s1600-h/InstallApplication4.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116837869702743298" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKo7qzmBQI/AAAAAAAAABM/xMVDQ8Z0DH8/s400/InstallApplication4.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click next... again :) the following page will appear:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwKpKKzmBRI/AAAAAAAAABU/S_b49XWU1Eg/s1600-h/InstallApplication5.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116838118810846482" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwKpKKzmBRI/AAAAAAAAABU/S_b49XWU1Eg/s400/InstallApplication5.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click Finish, installation will proceed and you should see the following page:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwKpg6zmBSI/AAAAAAAAABc/QKfuu9DmGIc/s1600-h/InstallApplication6.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116838509652870434" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwKpg6zmBSI/AAAAAAAAABc/QKfuu9DmGIc/s400/InstallApplication6.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Now click Save to save the changes and make the installation effective. This will go back to the list of installed applications, you should now see sample-calculator-webapp, as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKqGqzmBTI/AAAAAAAAABk/MFopzvgc3-E/s1600-h/InstalledApplication.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116839158192932146" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKqGqzmBTI/AAAAAAAAABk/MFopzvgc3-E/s400/InstalledApplication.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;At this point the Calculator webapp has been installed. We just need to make a small change to its classloader configuration. This is necessary to allow Tuscany to find all its dependencies in the webapp itself instead of the WebSphere lib directory (as some of the Tuscany dependency JARs are newer than the ones that come with WebSphere).&lt;br /&gt;&lt;br /&gt;To do that click on sample-calculator-webapp war in the Enterprise Applications list, you should see the following page:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKrUqzmBUI/AAAAAAAAABs/28WSnOZdGmc/s1600-h/ApplicationProperties.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116840498222728514" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKrUqzmBUI/AAAAAAAAABs/28WSnOZdGmc/s400/ApplicationProperties.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click the Class loading and update detection link, you should see the Class Loader configuration page. Select the "Classes loaded with application class loader first" and "Single class loader for application" options as shown here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp0.blogger.com/_5Njmh9cAWX0/RwKszqzmBVI/AAAAAAAAAB0/AxTgzrLugzo/s1600-h/ClassLoading.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116842130310301010" src="http://bp0.blogger.com/_5Njmh9cAWX0/RwKszqzmBVI/AAAAAAAAAB0/AxTgzrLugzo/s400/ClassLoading.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;Click OK, then Save to save your changes. You should be back to the Enterprise Applications page.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp1.blogger.com/_5Njmh9cAWX0/RwKtk6zmBWI/AAAAAAAAAB8/BWxN30P9Myk/s1600-h/InstalledApplication.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116842976418858338" src="http://bp1.blogger.com/_5Njmh9cAWX0/RwKtk6zmBWI/AAAAAAAAAB8/BWxN30P9Myk/s400/InstalledApplication.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;You're now ready to start the Calculator sample!&lt;br /&gt;&lt;br /&gt;Check the check mark beside sample-calculator-webapp war and click the Start button, you should see the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwKuVKzmBXI/AAAAAAAAACE/Qw6MVwdJzOk/s1600-h/Started.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116843805347546482" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwKuVKzmBXI/AAAAAAAAACE/Qw6MVwdJzOk/s400/Started.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;The application is running... time to point your Web browser to http://localhost:9080/sample-calculator-webapp/. The Calculator JSP will execute, and you should see the following:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bp2.blogger.com/_5Njmh9cAWX0/RwKvLKzmBYI/AAAAAAAAACM/4D18BKChwt4/s1600-h/CalculatorPage.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5116844733060482434" src="http://bp2.blogger.com/_5Njmh9cAWX0/RwKvLKzmBYI/AAAAAAAAACM/4D18BKChwt4/s400/CalculatorPage.png" style="cursor: pointer; display: block; margin: 0px auto 10px; text-align: center;" /&gt;&lt;/a&gt;&lt;br /&gt;That's it, you've run your first SCA application with Tuscany on WebSphere v6.1!&lt;br /&gt;&lt;br /&gt;Note: That last screencap shows localhost:8080 instead of localhost:9080 but that's just because I've tweaked my server to use 8080 instead of the default 9080, I wanted the different servers on my laptop to use the same port number as having to juggle with different ports was driving me crazy :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Last time I checked all samples from the Tuscany 1.0 release worked on WebSphere v6.1 (6.1.0.9 or later) except for our helloworld-dojo-webapp sample.&lt;br /&gt;&lt;br /&gt;If I find more time to blog in the next few days I'll try to describe some of these other samples and also quicker ways to deploy an SCA application using a script instead of clicking... if I find the time :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-7129677248896115634?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/7129677248896115634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=7129677248896115634' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7129677248896115634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/7129677248896115634'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/10/how-to-use-apache-tuscany-with.html' title='How to use Apache Tuscany with WebSphere 6.1'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_5Njmh9cAWX0/RwKbGqzmBJI/AAAAAAAAAAU/Hcne-iGYLcM/s72-c/ConfigWebContainer.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-3134290611883685170</id><published>2007-09-25T21:07:00.002-07:00</published><updated>2009-12-16T22:46:43.943-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='sdo'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='web services'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'></title><content type='html'>I've been busy the last few weeks, we just released Tuscany SCA 1.0. Here's the announcement...&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://incubator.apache.org/tuscany"&gt;Apache Tuscany&lt;/a&gt; team is pleased to announce the 1.0 release of the Java SCA project.&lt;br /&gt;&lt;br /&gt;Apache Tuscany provides a runtime environment based on the &lt;a href="http://www.oasis-opencsa.org/sca"&gt;Service Component Architecture&lt;/a&gt; (SCA). SCA is a set of specifications aimed at simplifying SOA application development. These specifications are being standardized by OASIS as part of the &lt;a href="http://www.oasis-opencsa.org/"&gt;Open Composite Services&lt;br /&gt;Architecture&lt;/a&gt; (Open CSA).&lt;br /&gt;&lt;br /&gt;This Apache Tuscany release represents a major milestone as the first 1.0 implementation of the core SCA specifications, including:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;Assembly Model v1.0&lt;/li&gt;&lt;li&gt;Policy Framework v1.0&lt;/li&gt;&lt;li&gt;Java Common Annotations and APIs v1.0&lt;/li&gt;&lt;li&gt;Java Component Implementation v1.0&lt;/li&gt;&lt;li&gt;Spring Component Implementation v1.0&lt;/li&gt;&lt;li&gt;Web Services Binding v1.0&lt;/li&gt;&lt;li&gt;EJB Session Bean Binding v1.0&lt;/li&gt;&lt;li&gt;BPEL Client and Implementation v1.0 (experimental)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;It also includes implementations of features not yet defined    by SCA specifications, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;JSON-RPC and Direct Web Remoting bindings&lt;/li&gt;&lt;li&gt;RSS, ATOM, and HTTP bindings&lt;/li&gt;&lt;li&gt;RMI binding&lt;/li&gt;&lt;li&gt;Pub/Sub notification binding&lt;/li&gt;&lt;li&gt;XQuery component implementation&lt;/li&gt;&lt;li&gt;Scripting component implementation supporting Groovy, Javascript, Python and Ruby&lt;/li&gt;&lt;li&gt;OSGi component implementation and support for SCA contributions packaged as OSGi bundles&lt;/li&gt;&lt;li&gt;databindings for Service Data Objects (SDO), JAXB, XmlBeans, Axis2's AXIOM, JSON, Saxon, DOM, SAX and StAX&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The Tuscany SCA Runtime can be configured as a single node SCA domain or as an SCA domain distributed across multiple nodes.&lt;br /&gt;&lt;br /&gt;In addition Tuscany SCA supports the following host-deployment options:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;running standalone&lt;/li&gt;&lt;li&gt;running with embedded Jetty or Tomcat&lt;/li&gt;&lt;li&gt;running with distributed nodes across multiple JVMs&lt;/li&gt;&lt;li&gt;running as a module in Geronimo (experimental).&lt;/li&gt;&lt;li&gt;running as a standard Web application                                 &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The Webapp samples included in this release have been tried and tested on Tomcat and WebSphere 6.1.&lt;br /&gt;&lt;br /&gt;For full detail about the release see the &lt;a href="http://svn.apache.org/repos/asf/incubator/tuscany/tags/java/sca/1.0/distribution/src/main/release/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; and &lt;a href="http://svn.apache.org/repos/asf/incubator/tuscany/tags/java/sca/1.0/distribution/src/main/release/CHANGES"&gt;CHANGES&lt;/a&gt; files.&lt;br /&gt;&lt;br /&gt;To download the distributions or for more information about the release please go to: http://incubator.apache.org/tuscany/sca-java-releases.html&lt;br /&gt;&lt;br /&gt;To find out more about OASIS Open CSA go to: http://www.oasis-opencsa.org.&lt;br /&gt;&lt;br /&gt;Apache Tuscany welcomes your help. Any contribution, including code, testing, contributions to the documentation, or bug reporting is always appreciated. For more information on how to get involved in Apache Tuscany visit the website at: http://incubator.apache.org/tuscany.&lt;br /&gt;&lt;br /&gt;Thank you for your interest in Apache Tuscany!&lt;br /&gt;The Apache Tuscany Team.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;Tuscany is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Web services PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-3134290611883685170?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/3134290611883685170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=3134290611883685170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3134290611883685170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/3134290611883685170'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/09/ive-been-busy-last-few-weeks-we-just.html' title=''/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-1695472050984183494</id><published>2007-08-31T22:38:00.000-07:00</published><updated>2009-12-16T22:47:50.120-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='csa'/><category scheme='http://www.blogger.com/atom/ns#' term='osoa'/><category scheme='http://www.blogger.com/atom/ns#' term='open'/><category scheme='http://www.blogger.com/atom/ns#' term='asf'/><category scheme='http://www.blogger.com/atom/ns#' term='oasis'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Apache Tuscany Java SCA 0.99 released</title><content type='html'>I've not blogged for a while as I've been busy working on Apache Tuscany... We just got our 0.99 release out.&lt;br /&gt;&lt;br /&gt;Here's the announcement:&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;The &lt;a href="http://incubator.apache.org/tuscany/"&gt;Apache Tuscany&lt;/a&gt; team is pleased to announce the 0.99-incubating release of the Java SCA project.&lt;br /&gt;&lt;br /&gt;Apache Tuscany provides a runtime based on the &lt;a href="http://www.oasis-opencsa.org/sca"&gt;Service Component Architecture&lt;/a&gt;. SCA is a set of specifications aimed at simplifying SOA Application Development which are being standardized at OASIS as part of &lt;a href="http://www.oasis-opencsa.org/"&gt;Open Composite Services Architecture&lt;/a&gt; (Open CSA).&lt;br /&gt;&lt;br /&gt;This release of Apache Tuscany SCA builds on the stability and modularity established with the previous releases and includes more complete implementation of SCA specifications, support for distributed SCA domains, SCA policy, OSGi implementation types, and pub/sub support with notification components. Start up time and memory footprint of the runtime has been reduced and there have been numerous bug fixes.&lt;br /&gt;&lt;br /&gt;This is expected to be the last point release before the 1.0 final release.&lt;br /&gt;&lt;br /&gt;For full detail about the release see the &lt;a href="http://svn.apache.org/repos/asf/incubator/tuscany/tags/java/sca/0.99-incubating/distribution/src/main/release/RELEASE_NOTES"&gt;RELEASE_NOTES&lt;/a&gt; and &lt;a href="http://svn.apache.org/repos/asf/incubator/tuscany/tags/java/sca/0.99-incubating/distribution/src/main/release/CHANGES"&gt;CHANGES&lt;/a&gt; files.&lt;br /&gt;&lt;br /&gt;To download or for more information about the release go to: &lt;a href="http://incubator.apache.org/tuscany/sca-java-releases.html"&gt;http://incubator.apache.org/tuscany/sca-java-releases.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To find out more about OASIS Open CSA go to: &lt;a href="http://www.oasis-opencsa.org/"&gt;http://www.oasis-opencsa.org.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Apache Tuscany welcomes your help. Any contribution, including code, testing, improving the documentation, or bug reporting is always appreciated. For more information on how to get involved in Apache Tuscany visit the website at: http://incubator.apache.org/tuscany.&lt;br /&gt;&lt;br /&gt;Thank you for your interest in Apache Tuscany!&lt;br /&gt;The Apache Tuscany Team.&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;Tuscany is an effort undergoing incubation at the Apache Software Foundation (ASF), sponsored by the Apache Web services PMC. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-1695472050984183494?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/1695472050984183494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=1695472050984183494' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1695472050984183494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/1695472050984183494'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2007/08/ive-not-blogged-for-while-as-ive-been.html' title='Apache Tuscany Java SCA 0.99 released'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6043566615205767088.post-5928763820385213164</id><published>2006-11-22T18:39:00.000-08:00</published><updated>2009-12-16T22:50:40.089-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='sca'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Ubuntu - Linux for human beings</title><content type='html'>Yesterday I had to install &lt;a href="http://www.ubuntu.com/"&gt;Ubuntu&lt;/a&gt; on my laptop. Ubuntu is a pretty popular Linux distribution, also known as "Linux for human beings" because it's supposed to be easy to use.&lt;br /&gt;&lt;br /&gt;I am working on the Apache &lt;a href="http://incubator.apache.org/tuscany"&gt;Tuscany&lt;/a&gt; project and somebody had opened a &lt;a href="https://issues.apache.org/jira/browse/TUSCANY-572"&gt;bug&lt;/a&gt; report complaining about build issues on Ubuntu so I wanted to test it and see what was going on.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;The part of the Tuscany runtime that I'm working on is written in C++, our Linux build uses  the usual &lt;a href="http://www.gnu.org/software/automake/"&gt;automake&lt;/a&gt; and &lt;a href="http://www.gnu.org/software/autoconf/"&gt;configure&lt;/a&gt; tools and is very portable but I was curious about any portability issues in our code since most of the Linux people on the Tuscany project build on &lt;a href="http://fedora.redhat.com/"&gt;Fedora&lt;/a&gt; and Ubuntu is a different &lt;a href="http://www.debian.org/"&gt;Debian&lt;/a&gt; based distribution.&lt;br /&gt;&lt;br /&gt;After two unsuccessful attempts to use pre-packaged Ubuntu &lt;a href="http://www.vmware.com/searchngl/search?q=Ubuntu&amp;amp;filter=0&amp;amp;btnG=VMTN+Appliance+Search&amp;amp;restrict=&amp;amp;output=xml_no_dtd&amp;amp;sort=date%3AD%3AL%3Ad1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ie=UTF-8&amp;amp;btnG.y=12&amp;amp;client=vmtn_appliance&amp;amp;num=10&amp;amp;btnG.x=15&amp;amp;oe=UTF-8&amp;amp;proxystylesheet=vmtn_appliance&amp;amp;site=vmtn_appliance"&gt;VMWare&lt;/a&gt; images I decided to bite the bullet and do a fresh install of the Ubuntu 6.10 Desktop distro CD  image (which you can download &lt;a href="http://www.ubuntu.com/products/GetUbuntu/download#currentrelease"&gt;here&lt;/a&gt;) on a spare partition on my laptop.&lt;br /&gt;&lt;br /&gt;Well... I must say that I am amazed by the quality of this distribution!&lt;br /&gt;&lt;br /&gt;It installed in about 20 minutes, only asked me about my language, keyboard and timezone, detected all the devices on my Thinkpad T42, and came up with a &lt;a href="http://www.gnome.org/"&gt;Gnome&lt;/a&gt; desktop all loaded with everything you need on a desktop machine... Firefox, Evolution, Open Office, Totem for movies and Rythmbox for music etc.&lt;br /&gt;&lt;br /&gt;I have been working on Linux for some time now, and was thinking: Yeah Ok, nice try, but what about getting wireless to work? what about suspend/resume?  and don't even think of trying to hibernate... Well... all of this just works! and configuring the wireless access to my home network was even simpler than on my daugther's Mac-OS X, and way more simpler than on my other Windows machine, which keeps losing its wireless settings all the time!&lt;br /&gt;&lt;br /&gt;Ubuntu still failed the absolute test for me: Plug an &lt;a href="http://www.apple.com/itunes/"&gt;iPod&lt;/a&gt; into the USB port and wait to see if it's recognized and a nice music player pops up...   I tried and nothing happened, except some cryptic error messages in the system logs... I guess I can live with that :) I've not seen any other Linux distribution pass this test anyway without some serious fiddling with the Linux &lt;a href="http://www.kernel.org/"&gt;kernel&lt;/a&gt; or &lt;a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html"&gt;udev&lt;/a&gt; configuration.&lt;br /&gt;&lt;br /&gt;After recovering from my disappointment with the iPod, I finally decided to test our Tuscany build in silence, with no music, and here again I was really impressed... I was able to install all the development tools I needed in a matter of minutes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the build_essential Ubuntu package&lt;/li&gt;&lt;li&gt;the &lt;a href="http://www.gnu.org/software/automake/"&gt;automake&lt;/a&gt; tools&lt;/li&gt;&lt;li&gt;a &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt; client&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Apache &lt;a href="http://ws.apache.org/axis2/c"&gt;Axi2C&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Apache &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;&lt;/li&gt;&lt;li&gt;the Java 5 &lt;a href="https://jdk-distros.dev.java.net/ubuntu.html"&gt;JDK&lt;/a&gt;&lt;/li&gt;&lt;li&gt;and the &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://www.python.org/"&gt;Python&lt;/a&gt; development libraries...&lt;/li&gt;&lt;/ul&gt;... and with just a few mouse clicks, thanks to the nice &lt;a href="http://www.nongnu.org/synaptic/"&gt;Synaptic&lt;/a&gt; package manager included in the distro.&lt;br /&gt;&lt;br /&gt;Conclusion: Ubuntu is not just a Linux for human beings, it's also good for software developers!&lt;br /&gt;&lt;br /&gt;Oh, and &lt;a href="http://incubator.apache.org/tuscany/"&gt;Tuscany&lt;/a&gt; builds and works great on Ubuntu 6.10 by the way, so I eventually closed the bug report :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6043566615205767088-5928763820385213164?l=jsdelfino.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jsdelfino.blogspot.com/feeds/5928763820385213164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6043566615205767088&amp;postID=5928763820385213164' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5928763820385213164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6043566615205767088/posts/default/5928763820385213164'/><link rel='alternate' type='text/html' href='http://jsdelfino.blogspot.com/2006/11/ubuntu-linux-for-human-beings.html' title='Ubuntu - Linux for human beings'/><author><name>Jean-Sebastien Delfino</name><uri>http://www.blogger.com/profile/12613316324328007188</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://4.bp.blogspot.com/-8yaA_VD6myk/TmRuRMwB_MI/AAAAAAAAASo/snyEMZS14-0/s220/portrait.png'/></author><thr:total>0</thr:total></entry></feed>
