<?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-8326467133854092913</id><updated>2012-01-05T07:07:58.350Z</updated><category term='mccabe'/><category term='eWEEK'/><category term='continuous integration'/><category term='boss'/><category term='tools'/><category term='encoding'/><category term='craftsman'/><category term='blogspot'/><category term='floor'/><category term='customer'/><category term='selenium'/><category term='rest fixture fitnesse slim javascript json'/><category term='emirate'/><category term='method'/><category term='rest fixture fitnesse greenpepper'/><category term='open source'/><category term='pound'/><category term='robyne dunne'/><category term='led zeppelin'/><category term='agile 2008'/><category term='test'/><category term='second life'/><category term='osgi'/><category term='hyperreality'/><category term='DSL'/><category term='spring'/><category term='utf8'/><category term='springsteen'/><category term='brachycephaly'/><category term='concert'/><category term='jets3t amazon proxy'/><category term='eclipse'/><category term='openspaces'/><category term='myspace'/><category term='aws'/><category term='cot death'/><category term='xp'/><category term='facebook'/><category term='xml'/><category term='scripta manent'/><category term='diy'/><category term='ultramonkey'/><category term='scalability'/><category term='java'/><category term='san francisco'/><category term='fun paperli'/><category term='transformation'/><category term='uncle'/><category term='language'/><category term='cloud'/><category term='commodore 64'/><category term='pizza'/><category term='swt'/><category term='load balancer'/><category term='xpday'/><category term='gig'/><category term='report'/><category term='build'/><category term='groovy'/><category term='day0'/><category term='practices'/><category term='delicious'/><category term='quality'/><category term='topology'/><category term='executable documentation'/><category term='high scalability'/><category term='fixture'/><category term='jmeter robustness rest test'/><category term='subversion'/><category term='ruby'/><category term='springring'/><category term='technologies'/><category term='jfreechart'/><category term='tag'/><category term='cyclomatic complexity'/><category term='scrumworks'/><category term='terracotta'/><category term='decorating'/><category term='toolbox'/><category term='interface'/><category term='sleep'/><category term='quote aristotele job work'/><category term='agile'/><category term='sdk'/><category term='flat head'/><category term='metrics'/><category term='javaone'/><category term='stairway to heaven'/><category term='code google github restfixture jmeterrestsampler jmeter rest'/><category term='plagiocephaly'/><category term='tdd'/><category term='code'/><category term='fitnesse'/><category term='eclipse ide feedback agile test'/><category term='rest fixture fitnesse json sequence diagrams uml'/><category term='linux'/><category term='rest fixture fitnesse continuous integration fazend'/><category term='zio'/><category term='xp2007'/><category term='lean'/><category term='charts'/><category term='eclipsecon'/><category term='acceptance'/><category term='spring framework'/><category term='REST'/><category term='programming'/><category term='chain'/><category term='fluid'/><category term='flat head syndrome'/><category term='high availability'/><category term='metaprogramming'/><category term='music'/><category term='euro'/><category term='first'/><category term='wordle art fun words pictures'/><category term='aloha'/><category term='blog'/><category term='award'/><category term='brown bag'/><category term='grammichele'/><category term='pop'/><category term='release planning'/><category term='como'/><category term='infoq'/><category term='web2.0'/><category term='sicilian'/><category term='set_trace_func'/><category term='wpf'/><category term='ownership'/><category term='twitter'/><category term='mp3 iTunes Amazon'/><category term='rest fixture fitnesse namespace'/><category term='microsoft'/><category term='data'/><category term='web21c'/><category term='yaub'/><title type='text'>smartrics</title><subtitle type='html'>I got ramblin'&lt;br&gt;
I got rambling all on my mind&lt;br&gt;
(Robert Johnson)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3946041759209989156</id><published>2011-08-07T17:57:00.003+01:00</published><updated>2011-08-27T20:33:53.204+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grammichele'/><title type='text'>Grammichele - Piazza C. M. Carafa</title><content type='html'>I am re-organising the pictures in my hard drive and I have just came across a set of snaps I took 3y ago in Grammichele (the small town in Sicily where I grew up). After some stitching and cloning, &lt;a href="http://www.flickr.com/photos/fabrizioelavinia/6018029185/sizes/l/in/photostream/"&gt;this is the result&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/fabrizioelavinia/6018029185/" title="grammichele by fabcan, on Flickr"&gt;&lt;img alt="grammichele" height="138" src="http://farm7.static.flickr.com/6130/6018029185_24d40fbc86_z.jpg" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;&lt;img alt="Creative Commons Licence" src="http://i.creativecommons.org/l/by/3.0/80x15.png" style="border-width: 0;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span property="dct:title" xmlns:dct="http://purl.org/dc/terms/"&gt;Piazza Carlo Maria Carafa, Grammichele (CT) Italy&lt;/span&gt; by &lt;a href="http://smartrics.blogspot.com/" property="cc:attributionName" rel="cc:attributionURL" xmlns:cc="http://creativecommons.org/ns#"&gt;Fabrizio Cannizzo&lt;/a&gt; is licensed under a &lt;a href="http://creativecommons.org/licenses/by/3.0/" rel="license"&gt;Creative Commons Attribution 3.0 Unported License&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you need/would like to use the large version of the file (over 200Mb for 14328x3091 pixels), by all means, get in contact.&lt;br /&gt;&lt;br /&gt;UPDATE: Link to Google Maps&lt;br /&gt;&lt;iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.co.uk/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;q=37.214677,14.63645&amp;amp;aq=0&amp;amp;sll=37.214658,14.636471&amp;amp;sspn=0.116748,0.264187&amp;amp;vpsrc=6&amp;amp;ie=UTF8&amp;amp;hnear=Grammichele+Catania,+Sicily,+Italy&amp;amp;t=h&amp;amp;rq=1&amp;amp;split=0&amp;amp;fll=37.214677,14.63645&amp;amp;fspn=0.001025,0.001717&amp;amp;ev=zi&amp;amp;ll=37.214677,14.63645&amp;amp;spn=0.001025,0.001717&amp;amp;z=19&amp;amp;output=embed"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.co.uk/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;q=37.214677,14.63645&amp;amp;aq=0&amp;amp;sll=37.214658,14.636471&amp;amp;sspn=0.116748,0.264187&amp;amp;vpsrc=6&amp;amp;ie=UTF8&amp;amp;hnear=Grammichele+Catania,+Sicily,+Italy&amp;amp;t=h&amp;amp;rq=1&amp;amp;split=0&amp;amp;fll=37.214677,14.63645&amp;amp;fspn=0.001025,0.001717&amp;amp;ev=zi&amp;amp;ll=37.214677,14.63645&amp;amp;spn=0.001025,0.001717&amp;amp;z=19" style="color:#0000FF;text-align:left"&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3946041759209989156?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3946041759209989156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3946041759209989156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3946041759209989156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3946041759209989156'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2011/08/grammichele-piazza-c-m-carafa.html' title='Grammichele - Piazza C. M. Carafa'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6130/6018029185_24d40fbc86_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-1502933642506664071</id><published>2011-05-11T21:54:00.008+01:00</published><updated>2011-05-17T02:56:48.588+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest fixture fitnesse continuous integration fazend'/><title type='text'>Continuously integrate FitNesse and RestFixture</title><content type='html'>I recently released the &lt;a href="http://smartrics.blogspot.com/2011/05/restfixture-v20.html"&gt;RestFIxture v2.0&lt;/a&gt; with some additions and improvements. An effort, having worked on new features and code refactoring, that took about two months.&lt;br /&gt;&lt;br /&gt;One thing I have always missed during the past two years of development is the lack of &lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;continuous integration&lt;/a&gt; with &lt;a href="http://fitnesse.org/"&gt;FitNesse&lt;/a&gt;; being the RestFixture a "plug-in" to FitNesse. Not a big deal maybe, given the size of the project and the narrow point of integration with FitNesse; but, in the true spirit of Agile software development, having being mildly burned in the past by the integration issues I decided to set up a CI build to gain confidence that both the latest versions of the tools work correctly at any point in time.&lt;br /&gt;The problem was clearly where and how.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;CI in the "cloud" with FaZend&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;I searched for a "cloud" provider of Continuous Integration solutions, and I soon discovered &lt;a href="http://fazend.com/"&gt;FaZend.com&lt;/a&gt;, a company offering hosted SVN, Trac and Hudson for small and medium projects. The service - at the time of writing - is still beta and free of charge.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;I like their product; I am a user of such systems, but I also have contributed to the implementation a similar SaaS solution, for BT, two years ago, in our internal cloud and for our developers community. So I fully appreciate the value of a point and click hosted solution to sort out this curcial piece of the development environment.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;FaZend is therefore a good fit: it's ideal for a Java based stack, runs Hudson - &lt;a href="http://en.wikipedia.org/wiki/Hudson_(software)#The_Hudson_Jenkins_Split"&gt;not Jenkins&lt;/a&gt; - one of the best CI servers out there, and it doesn't cost a penny. Having said that, as both RestFixture and FitNesse are hosted on GitHub, I don't need Trac and SVN (well, it turns out that I do need SVN, as I will explain later)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Few comments to summarise my experience (so far) with the service.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Reading the FaZend website I discovered that on Sign up, the CI features of the service are disabled and that it's at discrection of the company to enable users.&lt;br /&gt;So I dropped an email to the support email address to explain my plan and check if it was possible to have CI. Straight after I got the thumbs up response from Yegor (the CTO) and an invite to sign up. And so I did. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;Yegor enabled Hudson on my account and also bothered to create an initial project skeleton and so I was ready to go.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The project configuration is accessible via the "CI settings" page and offers the possibilty to set the essential information for the build to start. Preatty easy if edited alongside &lt;a href="http://fazend.com/a/2010-10-StepByStep.html"&gt;the tutorial&lt;/a&gt; available in the website.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The CI server offers SVN, GIT and Mercurial integration. It turns out, though, that the Git plugin used by Hudson isn't working very well and code can't be cloned from GitHub. Because &lt;i&gt;that&lt;/i&gt; Hudson is very much locked down and only accessible via the CI settings (even the workspace is forbidden), it's hard to see what's going on. So I left with it to FaZend to sort it out (albeit I have offered help, if needed).&lt;/div&gt;&lt;br /&gt;&lt;div&gt;From the FaZend portal you can also set access control lists to setup everybody participating to the development of the project being build. As I am currently the sole developer of the ResatFixture, I didn't bother to go beyhond the default setup (allow r/w to the account and forbid everything to everybody else).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;And there you go, here it is the &lt;a href="http://hudson.fazend.com:8081/hudson/job/RestFixtureIntegr/"&gt;RestFixture Integration build&lt;/a&gt; with logs and metrics published for reference.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Technicalities&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div&gt;At the time of writing the &lt;b&gt;RestFixture-CI&lt;/b&gt; project - holding the build file and the necessary dependencies is &lt;a href="https://github.com/smartrics/RestFixture-CI"&gt;available on GitHub&lt;/a&gt;, but also on the FaZend SVN, where the Hudson picks it from. It's not ideal, but given that the project isn't changing that often it's OK to double commit (to git and svn) every time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The build strategy is very simple: a) clone the FitNesse master branch, b) clone the RestFixture master branch, c) build FitNesse, d) deploy the new fitnesse.jar in the RestFixture lib directory and then d) build and test the RestFixture. It's all in the &lt;a href="https://github.com/smartrics/RestFixture-CI/blob/master/build.xml"&gt;RestFixture-CI build file&lt;/a&gt; in it's entirity.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, the FaZend CI configuration that allows the build to run in Hudson, for everybody's benefit, is:&lt;br /&gt;&lt;code&gt;RestFixtureIntegr:&lt;br /&gt;  people: *&lt;br /&gt;  source:&lt;br /&gt;    scm: svn&lt;br /&gt;    url: svn://svn.fazend.com/RestFixtureIntegr/trunk&lt;br /&gt;  builder:&lt;br /&gt;    tool: ant&lt;br /&gt;    target: test-integration&lt;br /&gt;  publish:&lt;br /&gt;    junit: build/restfixture-git-ro/build/reports/unit/html&lt;br /&gt;    fitnesse: build/restfixture-git-ro/build/reports/fitnesse&lt;br /&gt;    cpd: build/restfixture-git-ro/build/reports/metrics/cpd&lt;br /&gt;    pmd: build/restfixture-git-ro/build/reports/metrics/pmd&lt;br /&gt;    checkstyle: build/restfixture-git-ro/build/reports/metrics/checkstyle&lt;br /&gt;    ckjm: build/restfixture-git-ro/build/reports/metrics/ckjm&lt;br /&gt;    coverage: build/restfixture-git-ro/build/reports/metrics/coverage&lt;br /&gt;    crap4j: build/restfixture-git-ro/build/reports/metrics/crap4j&lt;br /&gt;    findbugs: build/restfixture-git-ro/build/reports/metrics/findbugs&lt;br /&gt;    jdepend: build/restfixture-git-ro/build/reports/metrics/jdepend&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;More about the ant build&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;To implement the above strategy I had to - somehow - clone the two git master branches. Not being able to rely on accessing the underlying OS for the git command (albeit it turns out that it may be possible, but I haven't tried), I opted a full java solution.&lt;/div&gt;&lt;div&gt;I therefore implemented two simple Ant clone and pull tasks wrapping the jGit API. The project is called &lt;b&gt;jgit-ant&lt;/b&gt; and it's &lt;a href="https://github.com/smartrics/jgit-ant"&gt;available on GitHub&lt;/a&gt;. At the moment only cloning and pulling is implemented, which is just about what I need for this build to execute.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having the 'clone' sorted, it was time to build.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;FitNesse was a pain to build: the target "createUpdateList" simply doesn't work unless the build is started from the same directory as the build file. The (ugly) solution was to call the ant launcher via %lt;java&amp;gt;; importantly, it's necessary to set the attribute dir to the master branch directory for it to work.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;After that an ant call to the RestFixture build completes the job.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The build overall takes less than 4 minutes, which is not bad. This, incidentally, suggests that the network connection between the hardware hosting Hudson and GitHub is pretty fast. (Running the build locally takes 30% more, having the clone task as the bottleneck).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Furthermore, after having properly crafted the build file to check for pull failures (that trigger a clone) and repository modifications (that trigger a build), now the build takes only 1 second if no mods/builds are executed, improving even further the feedback loop.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;Conclusions&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;After releasing RestFixture v2.0 I wanted to add another safety net for spotting integration isssues with FitNesse, given that RestFixture and FitNesse development lifecycles are completely disjointed.&lt;br /&gt;A Java based continuous integration hosted solution is what I was looking for. And FaZend ticks all the boxes (other than being the cheapest).&lt;br /&gt;Very few issues along the way and in a total of half a day I set up the build to periodically integrate the two tools.&lt;br /&gt;I am pretty happy with the result. I'll keep an eye on the solution to the Git Hudson plugin situation and possibly clean up the build process.&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/8326467133854092913-1502933642506664071?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/1502933642506664071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=1502933642506664071' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1502933642506664071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1502933642506664071'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2011/05/continuously-integrate-fitnesse-and.html' title='Continuously integrate FitNesse and RestFixture'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-4658531925583893006</id><published>2011-05-09T23:09:00.001+01:00</published><updated>2011-05-11T21:47:36.270+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest fixture fitnesse slim javascript json'/><title type='text'>RestFixture v2.0</title><content type='html'>I just completed the release of the RestFixture v2.0.&lt;br /&gt;With spare time to dedicate to it (courtesy of National Railways who has increased the number of carriages in the train to London to 12, so I can sit!), I took the opportunity to finish off the unfinished business.&lt;br /&gt;&lt;br /&gt;The new codebase includes few new features (plus some bug fixes and improvements to the fixture APIs). The RestFixture code is available &lt;a href="https://github.com/smartrics/RestFixture"&gt;on GitHub&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This is the list of the main additions. Further details are available in the &lt;a href="http://cloud.github.com/downloads/smartrics/RestFixture/RestFixture-2.0.beta.2.html"&gt;generated documentation file&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;SliM support&lt;/span&gt;&lt;br /&gt;It's now possible to run the fixtures with the SLIM runner.&lt;br /&gt;To do so, it's sufficient to specify in the root page of the suites to be run with SliM the following line:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;!define TEST_SYSTEM {slim}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;then, as each fixture is implemented as a &lt;a href="http://fitnesse.org/FitNesse.UserGuide.SliM.TableTable"&gt;TableTable&lt;/a&gt;, the first row of each fixture should be written as&lt;br /&gt;&lt;code&gt;&lt;br /&gt;| !-Table:smartrics.rest.fitnesse.fixture.RestFixture-! &lt;i&gt;base_host_uri&lt;/i&gt; |&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Setting custom content-type to adapter map&lt;/span&gt;&lt;br /&gt;Up until version 1.1.1, the way of interpreting the expectations in each response body cell was dictated by the content type of the response.&lt;br /&gt;Now, it's possible to override the default behaviour by specifying a config property that maps the content type of a response to a body handler. The name of the property is &lt;code&gt;restfixture.content.handlers.map&lt;/code&gt;; and the available body handlers are&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;XML&lt;/code&gt; to interpret the body as an xml string and the expectations as a list of &lt;code&gt;\n&lt;/code&gt; separated XPath expressions&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;JSON&lt;/code&gt; to interpret the body as a JSON string and the expectations as either a list of JavaScript lines to be evaluated in AND or as a block of JavaScript, if the first line of the cell is the string &lt;code&gt;/* javascript */&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;TEXT&lt;/code&gt; to interpre the body as a string and expectations as a list of regular expressions to be matched against the body&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The 'comment' command&lt;/span&gt;&lt;br /&gt;A new command to inject comments in a fixture; useful to evaluate labels&lt;br /&gt;&lt;code&gt;&lt;br /&gt;|comment| the value of 'replaceme' is %replaceme% |&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The LET handler&lt;/span&gt;&lt;br /&gt;Let now can evaluate JavaScript strings and assign the result to labels. This allows greater expressiveness in extracting data from a REST response.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Other additions&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;labels containing a null value are rendered by default with the string 'null'. It's possible now to override this behaviour by defining the config &lt;code&gt;'restfixture.null.value.representation'&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;body cells with large content can be rendered in a folding &lt;span&gt; tag. A button is provided to toggle the visibility of the content.&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-4658531925583893006?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/4658531925583893006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=4658531925583893006' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4658531925583893006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4658531925583893006'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2011/05/restfixture-v20.html' title='RestFixture v2.0'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-981990132550307094</id><published>2011-01-17T22:42:00.009Z</published><updated>2011-01-17T23:54:57.538Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest fixture fitnesse namespace'/><title type='text'>RestFixture with namespaces support</title><content type='html'>I finally found some time to fix namespaces support on the &lt;a href="https://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt;. Now it's possible to specify a &lt;i&gt;namespace context&lt;/i&gt; where aliases are defined, and use such aliases in the XPaths that match the response body.&lt;br /&gt;&lt;br /&gt;The namespace context is defined via the &lt;code&gt;RestFixtureConfig&lt;/code&gt; fixture, defining the key &lt;code&gt;restfixture.xml.namespace.context&lt;/code&gt;. The alias can then be used in any XPath subsequently.&lt;br /&gt;&lt;br /&gt;The following two snippets are from the auto generated RestFixture documentation (section &lt;i&gt;XPaths and namespaces&lt;/i&gt;). This shows the executed &lt;code&gt;RestFixtureConfig&lt;/code&gt; with two aliases defined&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/TTTJbON2WLI/AAAAAAAAAGY/DK7hJ2AItaY/s1600/rest-fixture-config-for-ns.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 62px;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/TTTJbON2WLI/AAAAAAAAAGY/DK7hJ2AItaY/s320/rest-fixture-config-for-ns.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563292909219240114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;whilst this shows the usage of one of the two aliases:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/TTTJbf8JpZI/AAAAAAAAAGg/aA095mLGXQI/s1600/get-box-with-ns.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 57px;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/TTTJbf8JpZI/AAAAAAAAAGg/aA095mLGXQI/s320/get-box-with-ns.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5563292913976845714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note: the default namespace of a XML body &lt;b&gt;must&lt;/b&gt; be explicitly defined as alias!&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;The latest release (v 1.1) of the Rest Fixture is downloadable from Google code &lt;a href="http://code.google.com/p/rest-fixture/"&gt;here&lt;/a&gt;, and the source code is on GitHub &lt;a href="https://github.com/smartrics/RestFixture"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-981990132550307094?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/981990132550307094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=981990132550307094' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/981990132550307094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/981990132550307094'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2011/01/restfixture-with-namespaces-support.html' title='RestFixture with namespaces support'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HA4XCmK8W8I/TTTJbON2WLI/AAAAAAAAAGY/DK7hJ2AItaY/s72-c/rest-fixture-config-for-ns.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-4422533280859783377</id><published>2010-07-31T15:43:00.005+01:00</published><updated>2010-07-31T15:56:53.707+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='code google github restfixture jmeterrestsampler jmeter rest'/><title type='text'>My code has a new home</title><content type='html'>I have just finished to migrate all my pet projects to GitHub: &lt;a href="http://github.com/smartrics"&gt;http://github.com/smartrics&lt;/a&gt;. In there you'll also find some of the forks I have made to stuff that I have modified.&lt;br /&gt;&lt;br /&gt;I find GitHub easier to play with (albeit git is horribly more complicated than svn) and I like some of its features.&lt;br /&gt;&lt;br /&gt;The projects in Google Code are now here:&lt;br /&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Rest Fixture&lt;/span&gt;: &lt;a href="http://github.com/smartrics/RestFixture"&gt;http://github.com/smartrics/RestFixture&lt;/a&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Pic Builder&lt;/span&gt;: &lt;a href="http://github.com/smartrics/PicBuilder"&gt;http://github.com/smartrics/PicBuilder&lt;/a&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;Rest Client&lt;/span&gt;: &lt;a href="http://github.com/smartrics/RestClient"&gt;http://github.com/smartrics/RestClient&lt;/a&gt;&lt;br /&gt;* &lt;span style="font-weight: bold;"&gt;JMeter Rest Sampler&lt;/span&gt;: &lt;a href="http://github.com/smartrics/JMeterRestSampler"&gt;http://github.com/smartrics/JMeterRestSampler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So, bye bye Google Code and thanks for the hospitality!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-4422533280859783377?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/4422533280859783377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=4422533280859783377' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4422533280859783377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4422533280859783377'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2010/07/my-code-has-new-home.html' title='My code has a new home'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-505987498081316802</id><published>2010-06-16T13:42:00.001+01:00</published><updated>2010-07-31T15:43:09.988+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun paperli'/><title type='text'>My daily newspaper</title><content type='html'>http://paper.li/fab_can&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-505987498081316802?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/505987498081316802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=505987498081316802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/505987498081316802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/505987498081316802'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2010/06/my-daily-newspaper.html' title='My daily newspaper'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-5815711811535799134</id><published>2010-06-03T22:41:00.004+01:00</published><updated>2010-08-01T11:36:38.984+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='set_trace_func'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><title type='text'>Lost in metaprogramming</title><content type='html'>More often than not, making heavy use of meta-programming, will get you into trouble. Especially when nasty side effects kick in and exceptions raise when they shouldn't. Clearly, analysis of the stack trace is rather pointless. &lt;br /&gt;&lt;br /&gt;Then, sometimes, defining &lt;code&gt;set_trace_func&lt;/code&gt; comes handy:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;set_trace_func lambda { |event, file, line, id, binding, classname|&lt;br /&gt;  if(event=="raise")&lt;br /&gt;    puts "=" * 40&lt;br /&gt;    puts "%8s :%-2d %5s %8s" % [event, line, id, classname]&lt;br /&gt;  end&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;UPDATE&lt;/i&gt;&lt;br /&gt;another interesting gem for this purpose is &lt;a href="http://unroller.rubyforge.org/"&gt;Unroller&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-5815711811535799134?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/5815711811535799134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=5815711811535799134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5815711811535799134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5815711811535799134'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2010/06/lost-in-metaprogramming.html' title='Lost in metaprogramming'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-1443435803745610480</id><published>2010-04-22T00:15:00.014+01:00</published><updated>2010-08-01T11:44:34.596+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='method'/><category scheme='http://www.blogger.com/atom/ns#' term='interface'/><category scheme='http://www.blogger.com/atom/ns#' term='chain'/><category scheme='http://www.blogger.com/atom/ns#' term='metaprogramming'/><category scheme='http://www.blogger.com/atom/ns#' term='fluid'/><title type='text'>Method chaining with Ruby</title><content type='html'>Implementing method chaining in Ruby is a bit fiddly. Let's, for example and without loss of generality, look at plain data holders: objects whose sole existence in life is to hold some data.&lt;br /&gt;Standard data holders, in Ruby, are easily defined using &lt;code&gt;attr_accessor&lt;/code&gt;s. For example:&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;class Person&lt;br /&gt; attr_accessor :name, :surname&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;person = Person.new&lt;br /&gt;person.name = "Bob"&lt;br /&gt;person.surname = "Smith"&lt;br /&gt;p person.name&lt;br /&gt;p person&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;produces&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;"Bob"&lt;br /&gt;#&amp;lt;person:0xb78925a8 surname="Smith" name="Bob"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;But it would be far better and more compact to be able to use &lt;a href="http://martinfowler.com/dslwip/MethodChaining.html"&gt;method chaining&lt;/a&gt;, so to be able to write:&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;person = Person.new.name("Bob").surname("Smith")&lt;br /&gt;person.name&lt;br /&gt;person.surname&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To achieve it, some Ruby metaprogramming is required. Jay Fields &lt;a href="http://blog.jayfields.com/2006/04/ruby-initialization-chain-module.html"&gt;wrote an article&lt;/a&gt; some time ago providing an implementation that is not entirely satisfactory. His implementation differenciates between getters and setters and the example above would look like&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;person = Person.new.set_name("Bob").set_surname("Smith")&lt;br /&gt;person.name&lt;br /&gt;person.surname&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It's possible to do better by doing:&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;module MethodChain&lt;br /&gt; def chained_attr_accessor(*names)&lt;br /&gt;   names.each do |name|&lt;br /&gt;     define_method :"#{name}" do | *args |&lt;br /&gt;       return instance_variable_get(:"@#{name}") if args.length == 0&lt;br /&gt;       if args.length == 1&lt;br /&gt;           instance_variable_set(:"@#{name}", args[0])&lt;br /&gt;           return self&lt;br /&gt;       end&lt;br /&gt;       raise ArgumentError.new("wrong number of arguments (#{args.length} for 1)")&lt;br /&gt;     end&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Person&lt;br /&gt; extend MethodChain&lt;br /&gt; chained_attr_accessor :name, :surname&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;person = Person.new&lt;br /&gt;person.name("Bob").surname("Smith")&lt;br /&gt;p person.name&lt;br /&gt;p person&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;which, undoubtedly, will produce the desired output:&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;"Bob"&lt;br /&gt;#&amp;lt;Person:0xb776ff40 @surname="Smith", @name="Bob"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It could be neat, where appropriate, to add the &lt;code&gt;chain_attr_accessor&lt;/code&gt; to the &lt;code&gt;Class&lt;/code&gt; class, so that it's not even necessary to extend the class with the module:&lt;br /&gt;&lt;pre class="brush:ruby"&gt;&lt;br /&gt;class Class&lt;br /&gt; def chained_attr_accessor(*names)&lt;br /&gt;  #...&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Person&lt;br /&gt; # extend MethodChain&lt;br /&gt; chained_attr_accessor :name, :surname&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Extending the code is trivial. What the module all does is defining a method on the class &lt;code&gt;Person&lt;/code&gt; with the name of the attribute. Each implementation checks the length of the arguments list and decided if behaving like a setter or a getter.&lt;br /&gt;&lt;br /&gt;More complicated logic can be implemented to allow more than one input or provide only getters for calculated attributes.&lt;br /&gt;&lt;br /&gt;This technique can also be used to go beyond simple data holders, towards &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;fluid interfaces&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But all that is left as an exercise to the reader.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-1443435803745610480?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/1443435803745610480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=1443435803745610480' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1443435803745610480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1443435803745610480'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2010/04/method-chaining-with-ruby.html' title='Method chaining with Ruby'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6065279400101704443</id><published>2009-11-04T22:28:00.003Z</published><updated>2009-11-04T23:32:43.112Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='ownership'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><title type='text'>Who owns user data?</title><content type='html'>I have been involved several times on discussions around user data ownership. With the advent of cloud computing, though, some of the topics identified may take another shape and service/application providers may have a chance to fully leverage the capabilities exposed by cloud computing.&lt;br /&gt;&lt;br /&gt;A bit of context first. If I subscribe to a service on the web, whatever it's nature is (Facebook, Twitter, you name it!), I generate data about me that the service stores, on my behalf, in it's premises. Examples are username, contact details, preferences, tags, ...&lt;br /&gt;If for whatever reason I want to access such data, I typically can only do it via the user interface that the service provides. In any case I never - it seems to me - have access to the raw data; let alone being able to use some other access interface.&lt;br /&gt;&lt;br /&gt;But think if such data is stored on the Cloud on an Amazon S3 bucket (or equivalent), which offers an easy to access interface over HTTP, user ownership, Access Control Policies and the possibility of managing such data via the plethora of applications part of the Amazon ecosystem. In such case I - the user - have access to the "master copy" of my data and I can do whatever I want with it (such as delete it, modify it, make it more or less public).&lt;br /&gt;&lt;br /&gt;Clearly there are drawbacks:&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;it requires the service provider to implement and manage the mapping of it's internal user representation with that of Amazon (or whatever other cloud storage provider)&lt;/li&gt;&lt;br /&gt; &lt;li&gt;the a service provider looses the ability to control the stuctural consistency of the data. And this can cause the application to malfunction.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;the service provider looses the possibility to hide such data from other service providers/application and consequently looses the power to forcibly keep the user using its servie (well, at least it doesn't facilitate it)&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;Point 1 is in reality a "non" issue from an implementation perspective. And it will be easily solved via agreements between the two interested parties. Agreements, moreover, are facilitated by the adoption of standard formats as and when appropriate.&lt;br /&gt;&lt;br /&gt;Point 2 is the most interesting as it involves a different thinking on architecting applications (I refer here to the seven points illustrated &lt;a href="http://app.sliderocket.com/app/FullPlayer.aspx?id=b4f3c2ad-3730-460e-ba6a-bc3e33642ec5"&gt;here&lt;/a&gt; by Simone Brunozzi, that I discussed &lt;a href="http://smartrics.blogspot.com/2009/11/things-learned-at-aws-cloud-for.html"&gt;here&lt;/a&gt;): architect for failure (in this case data structures), loose couple application logic and data and so on.&lt;br /&gt;&lt;br /&gt;Point 3 is probably the hardest to implement, not certainly because of technical issues. But this seems to me a false problem anyway as if the service offered degrades users will go away no matter what.&lt;br /&gt;&lt;br /&gt;I want to see people making use of what the cloud brings to the table on top "glorified web hosting" or grid computing. So maybe this is a valid "use case" that will stimulate developers and architects to think more out of the box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6065279400101704443?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6065279400101704443/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6065279400101704443' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6065279400101704443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6065279400101704443'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/11/who-owns-user-data.html' title='Who owns user data?'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-7693824400220855533</id><published>2009-11-04T00:34:00.007Z</published><updated>2009-11-04T23:33:33.167Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>Things learned at AWS Cloud for the Enterprise: London</title><content type='html'>The event was organised and funded by Amazon to market AWS to the enterprise and took place on Tuesday 3/11/09 in London. This is the list of points summarising what I learned. This list has been created by consolidating a bunch of Tweets fired off in the last hour or so.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://nasrat.livejournal.com/"&gt;Paul Nasrat&lt;/a&gt;, Lead System Integrator at Guardian mentioned some of the tools and techniques used to develop and deploy a website to distribute content related to PMs expenses. Technologies also includeed &lt;a href="http://www.innodb.com/"&gt;InnoDB&lt;/a&gt; and &lt;a href="http://reductivelabs.com/products/puppet/"&gt;Puppet&lt;/a&gt;. Puppet seems definitely a tool I should be looking at for developing an idea I have been having for some time.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Bob Harris, CTO at Channel 4 did the best presentation of the day. The most interesting things he mentioned are:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Amz roadmap isn't public. He hopes one day it will be to help enterprises to plan ahead&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Amz believes that Cloud computing is at the "peak of inflated expectations" http://is.gd/4Mo1F&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cloud is no silver bullet: in fact he only deploys web sites for content distribution (one of which is &lt;a href="http://www.scienceofscams.com/"&gt;ScienceOfScams)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The way C4 managed legal issues around Data Protection is by having made an enterprise agreement with Amz covering all those issues&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Myths around cloud (lack of security, low throughput, low reliability, low availability) are just myths - to his experience, anyway.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;You need a techie and a credit card to get going on the Cloud. In fact, although CapEx is limited, he had to do initial investments to guarantee that AMIs being used for his deployments were up to his required standards (bottom line: it's not as simple as it seems)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hybrid clouds are next in his pipeline, with the intent of overcoming issues around deployment of enterprise applications in the public cloud.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;There were, in total, 4 Amazon customers' presentations/case studies. Yet again all falling in one of the "number crunching" and "glorified web hosting" categories. (That is, I have yet to see a proper enterprise app making best use of the whole set of services and API access that Amazon uses)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Amazon took three years to push in anger the deployment of his retail stack (the book store and the reseller site) on the Cloud. This, to me, it's rather obvious as only recently AWS has reached a level of maturity and a set of functionalities that guarantees a certain success. They have currently migrated about 7% of their applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.brunozzi.com/"&gt;Simone Brunozzi&lt;/a&gt; (@simon on Twitter) - Technical Evangelist at AWS - presented an interesting summary of the things to take into account when architecting apps to be deployed on Cloud (see &lt;a href="http://twitter.com/simon/statuses/5394303965"&gt;here&lt;/a&gt;). In a nutshell:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Design for failure: apps should be written with failure in mind. Plan for when the app fails (not *if*)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Loosed coupling sets you free: loose coupling improves resiliency (incidentally any new app developed at Amazon is exposed &lt;i&gt;as a service&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Design for dynamism: leverage the cloud elasticity by making no assumptions on the location, health and configuration of the apps and it's dependencies should be made when the app is developed (&lt;i&gt;note to self: should start making use of user data&lt;/i&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Security is everywhere: think of security constraints at every level of the stack, OS, network, application (some of these are facilitated by the Amazon infrastructure)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Don't fear constraints: think laterally on how to overcome constraints - does your app need huge amount of RAM? consider distribution across instances...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Many storage options: one size doesn't fit all for storage, choose the one right for the type of application needed (see also &lt;a href="http://perspectives.mvdirona.com/2009/11/03/OneSizeDoesNotFitAll.aspx"&gt;One Size Doesn't Fit All&lt;/a&gt;, also via @simon)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;AWS ecosystem and community: re-use the expertise available in the community and ecosystem of applications both in the open-source and paid-for worlds.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;PS: within the context of this post "the Cloud" is actually "the Amazon Cloud"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-7693824400220855533?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/7693824400220855533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=7693824400220855533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7693824400220855533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7693824400220855533'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/11/things-learned-at-aws-cloud-for.html' title='Things learned at AWS Cloud for the Enterprise: London'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-8184534695057922706</id><published>2009-07-26T23:09:00.004+01:00</published><updated>2010-07-31T15:38:16.866+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest fixture fitnesse greenpepper'/><title type='text'>The real RestFixture and the copy</title><content type='html'>I noticed, some time ago, that &lt;a href="http://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt; has been implemented on &lt;a href="http://www.greenpeppersoftware.com"&gt;GreenPepper&lt;/a&gt; a commercial clone of &lt;a href="http://fitnesse.org/"&gt;Fitnesse&lt;/a&gt;.&lt;br /&gt;The concept has been taken on board and seamlessly re-implemented to the extent that the developers &lt;a href="http://www.greenpeppersoftware.com/confluence/display/GPO/RestFixture"&gt;documentation of the fixture&lt;/a&gt; is pretty much identical.&lt;br /&gt;I feel sooo proud!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-8184534695057922706?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/8184534695057922706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=8184534695057922706' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8184534695057922706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8184534695057922706'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/07/real-restfixture-and-copy.html' title='The real RestFixture and the copy'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3880289252417577904</id><published>2009-04-06T01:59:00.029+01:00</published><updated>2010-08-01T11:48:17.007+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jmeter robustness rest test'/><title type='text'>JMeter to test robustness of system exposing REST APIs</title><content type='html'>&lt;span style="font-style:italic;"&gt;UPDATE&lt;/span&gt;: code moved here: &lt;a href="http://github.com/smartrics/JMeterRestSampler"&gt;http://github.com/smartrics/JMeterRestSampler&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have been involved on continuously testing systems for &lt;i&gt;robustness&lt;/i&gt;. One of my toy projects is the &lt;i&gt;&lt;a href="http://github.com/smartrics/JMeterRestSampler/"&gt;JMeterRestSampler&lt;/a&gt;&lt;/i&gt;, a plugin for JMeter to ease creation of such tests and automate their execution on a continuous integration server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Robustness testing&lt;/span&gt;&lt;br /&gt;In this context, a robust system is such that if it is subject to a constant load for a given amount of time, its response is correct and its throughput is constant.&lt;br /&gt;&lt;br /&gt;The aim of a robustness test is to identify design or development issues such as memory leaks or random/unfrequent bugs that over time may degrade or crash the system. It's worth pointing out that robustness tests differ from load or stress tests which aim more at identifying bottlenecks or actual system limits (responses to peaks or bursts).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://martinfowler.com/articles/continuousIntegration.html"&gt;Continuously test&lt;/a&gt; for robustness is hence a must to improve the quality of the system under construction.&lt;br /&gt;I, &lt;a href="http://blog.iclutton.com/"&gt;Robbie&lt;/a&gt; and &lt;a href="http://ragstorooks.wordpress.com/"&gt;Raghav&lt;/a&gt; presented a session at &lt;a href="http://submissions.agile2008.org/node/1929"&gt;Agile '08&lt;/a&gt; and &lt;a href="http://xpday-london.editme.com/PushingTheBoundariesOfTestingAndContinuousIntegratio"&gt;XPDay 08&lt;/a&gt; on this very topic.&lt;br /&gt;&lt;br /&gt;Specifically for robustness, a test is defined by running &lt;i&gt;scenarios&lt;/i&gt; concurrently. A scenario is a set of operations on the system that emulate typical usage. Our examples at both the presentation were based on the robustness tests we built for &lt;a href="https://trac.osmosoft.com/Aloha"&gt;Aloha&lt;/a&gt;, an application server for Voice over IP applications. In this context a scenario - typical usage of the system - is for example "Connect voice call between two participants" that translates into a sequence of simpler operations performed via the application server's public interface.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Robustness with JMeter&lt;/span&gt;&lt;br /&gt;When preparing the XPDay presentation, I started musing with &lt;a href="http://jakarta.apache.org/jmeter/"&gt;JMeter&lt;/a&gt; to see if it offered simple means to build robustness tests. The bare essentials i was looking for are&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;the possibility to build scenarios in relation to the system under test (given the above definition of scenario)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;automate tests and run them from a continuous integration server and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the possibility to report on the outcome of the tests.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;As I have been involved in building REST APIs for several months, I chose to experiment assuming that the system under test offered a REST exposure.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Scenarios&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In JMeter robustness scenarios can be modeled as &lt;i&gt;ThreadGroup&lt;/i&gt;s. A ThreadGroup groups a set of sampling operations on the system under test. Each sampling operation is executed serially within the thread running the ThreadGroup and each ThreadGroup can be run in loop and in parallel with other ThreadGroups for as long as necessary, either terminating them after a fixed number of runs or after a given time.&lt;br /&gt;&lt;br /&gt;All the goodies shipped with JMeter can be used like pre/post processing instructions, definitions of user variables, throttling, etc. (see &lt;a href="http://jakarta.apache.org/jmeter/usermanual/index.html"&gt;JMeter manual&lt;/a&gt; for more).&lt;br /&gt;&lt;br /&gt;The following picture shows a simple test plan for a system under test with a robustness test made of 2 scenarios: "Register customer" and "Place an order". For the "Register customer" scenario, the ThreadGroup will be run in 10 parallel threads and each thead will run in loop for 100 times (so, in toal, the system will be running 1000 scenarios).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu7zFylOKI/AAAAAAAAADs/Yj4GL6ps44Y/s1600-h/01-robustness-scenario.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 180px;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu7zFylOKI/AAAAAAAAADs/Yj4GL6ps44Y/s400/01-robustness-scenario.png" alt="" id="BLOGGER_PHOTO_ID_5326557470697797794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Sampling REST resources&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JMeter offers a wide selection of samplers for sampling systems and collecting results. It does not offer, though, a proper sampler for the definition of REST requests. In the spirit of readable tests for documentation I wanted each sampler (effectively a REST request) to look like a REST request with a URI, method, list of headers and a body (much in the spirit of the &lt;a href="http://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt;). So I discarded the HTTP sampler as too bound to HTTP requests.&lt;br /&gt;&lt;br /&gt;So the first stab was to build a new sampler: the REST Sampler. It allows to define a rest request by setting all the relevant parameters: the URI, the headers, the body, the verb. It also processes JMeter assertions and post processors (attached as chidren to the sampler node) to perform basic assertions on the response elements and, for example to extract data from the last response and store it for future reference.&lt;br /&gt;&lt;br /&gt;The REST sampler&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu7_pAcvtI/AAAAAAAAAD0/70FHCzx4NyA/s1600-h/02-rest-sampler.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 179px;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu7_pAcvtI/AAAAAAAAAD0/70FHCzx4NyA/s400/02-rest-sampler.png" alt="" id="BLOGGER_PHOTO_ID_5326557686309633746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Asserting the response code of the last response&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu8FWCh2_I/AAAAAAAAAD8/lc0OaftNPoU/s1600-h/03-asserting-responses.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 179px;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu8FWCh2_I/AAAAAAAAAD8/lc0OaftNPoU/s400/03-asserting-responses.png" alt="" id="BLOGGER_PHOTO_ID_5326557784297298930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Extracting data from the response for future reference, via JMeter variables&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu8KUxFwdI/AAAAAAAAAEE/Bf6pjxF7nlM/s1600-h/04-extracting-data.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 180px;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/Seu8KUxFwdI/AAAAAAAAAEE/Bf6pjxF7nlM/s400/04-extracting-data.png" alt="" id="BLOGGER_PHOTO_ID_5326557869855064530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/Seu8O1NwT-I/AAAAAAAAAEM/_b5AxD5aRB8/s1600-h/05-using-extracted-data.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 178px;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/Seu8O1NwT-I/AAAAAAAAAEM/_b5AxD5aRB8/s400/05-using-extracted-data.png" alt="" id="BLOGGER_PHOTO_ID_5326557947284705250" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Monitoring the remote system: JMX Sampler&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As said, part of a robustness build is to observe the system under test for key indicators of the health of the system. If the system under test is built in Java, one key element is the amount of heap memory allocated by to the system at any point in time: the trend of the average value of the heap memory may spot memory leaks. To grab this data in the context of a robustness test via JMeter, I have added a JMX Sampler, which basically connects to the given JMX URL and retrieves Heap memory information.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu8TuUDE6I/AAAAAAAAAEU/jRADcM-zB6Y/s1600-h/06-jmx-sampler.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 87px;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu8TuUDE6I/AAAAAAAAAEU/jRADcM-zB6Y/s400/06-jmx-sampler.png" alt="" id="BLOGGER_PHOTO_ID_5326558031331398562" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next, I wanted to present the information collected. If JMeter is run via GUI, a JMX listener can be added to gather and chart the memory data.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu8XtzHsGI/AAAAAAAAAEc/W9HePDF-Ug8/s1600-h/07-jmx-graph.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 347px;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu8XtzHsGI/AAAAAAAAAEc/W9HePDF-Ug8/s400/07-jmx-graph.png" alt="" id="BLOGGER_PHOTO_ID_5326558099912765538" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's possible to add more than one JMX sampler pointing to different JMX servers in such cases when the REST application is distributed. Charts of each Heap memory usage are displayed in the same listener window. Also, the charts can be saved in one or more files if needed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Test Automation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The REST and JMX samplers plus the JMX listener can be used to build robustness tests necessary to test systems exposing REST interfaces. The next step is automation.&lt;br /&gt;Automation is achieved with Ant and the &lt;a href="http://www.programmerplanet.org/pages/projects/jmeter-ant-task.php"&gt;JMeter task&lt;/a&gt;, which allows to run the same test plan but from whitin an Ant task (hence invokable via any Continuous integration server). Documentation on how to use the JMeter ant task is available in the website.&lt;br /&gt;&lt;br /&gt;I, though, thought to extend the task to generate charts using the data available in the JMeter result output file. The Charts generated are one for the time occurred for each of the rest requests (which gives an indication on how the performance of the system are degrading overtime) and one for the JMX sampling as detailed above.&lt;br /&gt;&lt;pre  class="brush:html"&gt;&lt;br /&gt;&amp;lt;taskdef name="jmeter" &lt;br /&gt;   classname="smartrics.jmeter.ant.JMeterTaskExt" &lt;br /&gt;   classpathref="project.classpath" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="run" depends="clean, init, copy"&gt;&lt;br /&gt;  &amp;lt;jmeter jmeterhome="${jmeter.home}" &lt;br /&gt;     resultlogdir="${artefacts}" &lt;br /&gt;     failure="false" &lt;br /&gt;     failureproperty="jmeter.failed"&lt;br /&gt;     chartsoutputdir="${artefacts}" &lt;br /&gt;     succecssThresholdPerc="98" &lt;br /&gt;     jmeterproperties="${jmeter.home}/bin/user.properties"&gt;&lt;br /&gt;     &amp;lt;testplans dir="${build}" includes="Robustness.jmx" /&gt;&lt;br /&gt;  &amp;lt;/jmeter&gt;&lt;br /&gt;&amp;lt;/target&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;target name="report"&gt;&lt;br /&gt;  &amp;lt;xslt in="${artefacts}/Robustness.jtl" &lt;br /&gt;      out="${artefacts}/Robustness.html" &lt;br /&gt;      style="${etc}/jmeter-results-detail-report_21.xsl" /&gt;&lt;br /&gt;  &amp;lt;copy todir="${artefacts}"&gt;&lt;br /&gt;    &amp;lt;fileset dir="${etc}" includes="*.jpg" /&gt;&lt;br /&gt;  &amp;lt;/copy&gt;&lt;br /&gt;&amp;lt;/target&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The location where the files are generated is defined by the attribute &lt;i&gt;chartsoutputdir="..."&lt;/i&gt;, if omitted no chart will be generated.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Correctness and the failure threshold&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In certain cases a build may be allowed to pass even if some of the assertions did not pass. Such behaviour is admissible in systems that implement, for example, optimistic locking or other mechanisms that trade correctness for performance. Each REST sampler flags the sample as sucess or failure depending on the result of each associated assertion. By counting such flag values it's easy to determine the percentage of successes.&lt;br /&gt;&lt;br /&gt;If the Tester decides that failure is acceptable, she can specify the &lt;i&gt;succecssThresholdPerc="..."&lt;/i&gt; attribute to define the minimum percentage of successes that need to happen in order for the build to pass.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Build and isntallation instructions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Build&lt;/span&gt;&lt;br /&gt;The &lt;a href="http://github.com/smartrics/JMeterRestSampler"&gt;JMeterRestSampler&lt;/a&gt; is available here: &lt;pre&gt;http://github.com/smartrics/JMeterRestSampler&lt;/pre&gt; &lt;del&gt;currently hosted in the same SVN trunk as the &lt;a href="http://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt;&lt;/del&gt;&lt;br /&gt;After checkout, add a &lt;i&gt;properties/${user.name}.properties&lt;/i&gt; file and define the &lt;i&gt;jmeter.home&lt;/i&gt; property. Then run ant.&lt;br /&gt;${user.name} is the username of the logged in user.&lt;br /&gt;&lt;br /&gt;If the build passes the file &lt;i&gt;build/JMeterRestSampler.jar&lt;/i&gt; is generated.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Install&lt;/span&gt;&lt;br /&gt;Edit the &lt;i&gt;${jmeter.home}/bin/user.properties&lt;/i&gt; and set the searh_paths property to the location of the JMeterRestSampler.java file: &lt;i&gt;search_paths=/path/to/JMeterRestSampler.jar&lt;/i&gt;. Alternatively, copy the JMeterRestSampler.jar in the directory &lt;i&gt;${jmeter.home}/lib/ext&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;If installation is successful, when starting JMeter, the Rest Sampler and JMX Sampler should be available in the &lt;i&gt;Add/Sampler&lt;/i&gt; ThreadGroup context popup menu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:110;" &gt;Eclipse project&lt;/span&gt;&lt;br /&gt;The &lt;i&gt;.classpath&lt;/i&gt; and &lt;i&gt;.project&lt;/i&gt; Eclipse metadata files are included. To successfully compile the project within Eclipse, once imported, you need to define two workspace variables JMETER_HOME and ANT_HOME to respectively point to your JMeter home and Ant home directories.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;License&lt;/span&gt;&lt;br /&gt;The software is licensed using a BSD license.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Disclaimer&lt;/span&gt;&lt;br /&gt;I should point out that the JMeterRestSampler is no more than a toy to prove the concept of Robustness testing via JMeter. It started as a spike back in the days of XPDay 08 and evolved - slowly - to it's complete form. I am not intentioned to improve it in the foreseeable future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3880289252417577904?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3880289252417577904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3880289252417577904' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3880289252417577904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3880289252417577904'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/04/jmeter-to-test-robustness-of-system.html' title='JMeter to test robustness of system exposing REST APIs'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HA4XCmK8W8I/Seu7zFylOKI/AAAAAAAAADs/Yj4GL6ps44Y/s72-c/01-robustness-scenario.png' height='72' width='72'/><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2773127291915485386</id><published>2009-03-24T14:42:00.003Z</published><updated>2009-03-24T14:49:49.024Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='jets3t amazon proxy'/><title type='text'>Building Spring 3.0 M2 from behind a proxy</title><content type='html'>It took me a while to find out where to put the proxy settings for allowing the ant/ivy build scripts to fetch the dependencies.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$&gt; vi /spring-framework-3.0.0.CI-167/projects/spring-build/lib/ivy/jets3t.properties&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;then &lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#...&lt;br /&gt;httpclient.proxy-autodetect=&lt;b&gt;false&lt;/b&gt;&lt;br /&gt;httpclient.proxy-host=&lt;i&gt;&amp;lt;your-proxy-host&amp;gt;&lt;/i&gt;&lt;br /&gt;httpclient.proxy-port=&lt;i&gt;&amp;lt;your-proxy-port&amp;gt;&lt;/i&gt;&lt;br /&gt;#...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This should proxy out any request (to s3). Note that &lt;b&gt;proxy-autodetect&lt;/b&gt; is by default &lt;i&gt;true&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;You can now build the framework via ant:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/spring-framework-3.0.0.CI-167/projects/build-spring-framework$ ant&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2773127291915485386?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2773127291915485386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2773127291915485386' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2773127291915485386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2773127291915485386'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/03/building-spring-30-m2-from-behind-proxy.html' title='Building Spring 3.0 M2 from behind a proxy'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2863331959842490638</id><published>2009-01-27T01:00:00.006Z</published><updated>2009-01-27T01:04:45.651Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='wordle art fun words pictures'/><title type='text'>Words art: wordles</title><content type='html'>I have found a &lt;a href="http://www.wordle.net/"&gt;cool website&lt;/a&gt; to create pictures from words, wordles that is. &lt;a href="http://www.wordle.net/gallery?username=Smartrics"&gt;This&lt;/a&gt; is what I have come up with using the this blog posts as source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2863331959842490638?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2863331959842490638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2863331959842490638' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2863331959842490638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2863331959842490638'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/01/words-art.html' title='Words art: &lt;i&gt;wordle&lt;/i&gt;s'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6597298727931159748</id><published>2009-01-13T01:50:00.004Z</published><updated>2009-01-13T21:54:46.977Z</updated><title type='text'>New kids on the Blues block</title><content type='html'>I just bought the debut CDs of &lt;a href="http://www.amazon.co.uk/Open-Road-Oli-Brown/dp/B00190KZ46/ref=sr_1_1?ie=UTF8&amp;amp;s=music&amp;amp;qid=1231811557&amp;amp;sr=8-1"&gt;Oli Brown&lt;/a&gt; and of &lt;a href="http://www.amazon.co.uk/Heal-My-Blues-Dani-Wilde/dp/B0012X6FQ2/ref=sr_1_1?ie=UTF8&amp;amp;s=music&amp;amp;qid=1231811692&amp;amp;sr=1-1"&gt;Dani Wilde&lt;/a&gt;. I'll keep an eye on these two new kids on the block.&lt;br /&gt;&lt;br /&gt;A taste of Blues from Oli Brown is &lt;a href="http://www.youtube.com/watch?v=15rAYGqYFy4"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Dani Wilde instead can be heard &lt;a href="http://www.youtube.com/watch?v=yvT_pzN2UHA"&gt;here&lt;/a&gt; on a John Lee Hooker classic&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/yvT_pzN2UHA&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/yvT_pzN2UHA&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6597298727931159748?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6597298727931159748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6597298727931159748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6597298727931159748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6597298727931159748'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/01/oli-brown.html' title='New kids on the Blues block'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6708558260882002630</id><published>2009-01-10T23:03:00.005Z</published><updated>2009-01-10T23:28:38.489Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mp3 iTunes Amazon'/><title type='text'>Rotten apple meets the amazon</title><content type='html'>I just found that I can't login any more into my iTunes account. "This Apple ID has not yet been used with the iTunes Store" I am told. Clearly it's not the case as I have already spent few bucks in the shop. I have few pounds left - I am hoping to spend as little as possible troubleshooting the issue (first clue is that I just updated to iTunes 8).&lt;br /&gt;&lt;br /&gt;Anyway, I will not care for long: I have just relised - a bit late I know - that Amazon is selling DRM free MP3s cheaper than iTunes Store.&lt;br /&gt;&lt;br /&gt;And, by the way, iTunes' interface &lt;strike&gt;still sucks big time&lt;/strike&gt; hasn't improved at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6708558260882002630?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6708558260882002630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6708558260882002630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6708558260882002630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6708558260882002630'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/01/rotten-apple-meets-amazon.html' title='Rotten apple meets the amazon'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-8654655173291656659</id><published>2009-01-05T10:45:00.003Z</published><updated>2009-01-11T00:10:24.113Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='quote aristotele job work'/><title type='text'>Quote of the year</title><content type='html'>It may seem obvious, but I believe this quote is pure truth:&lt;br /&gt;&lt;blockquote&gt;"Pleasure in the job puts perfection in the work." &lt;i&gt;(Aristotle)&lt;/i&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-8654655173291656659?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/8654655173291656659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=8654655173291656659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8654655173291656659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8654655173291656659'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2009/01/quote-of-year.html' title='Quote of the year'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2106755338963472547</id><published>2008-11-02T22:14:00.015Z</published><updated>2010-07-31T15:39:20.600+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest fixture fitnesse json sequence diagrams uml'/><title type='text'>RestFixture latest additions: JSON support and Sequence Diagrams Generation</title><content type='html'>&lt;a href="http://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt; has been enhanced with two new features:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;basic support for JSON;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;runtime generation of sequence diagrams showing the flow of http calls within a table&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;First of all, thanks to &lt;a href="http://ochsners.blogspot.com/"&gt;AndyO&lt;/a&gt; as he is the author of the JSON support enhancements. Now RestFixture allows testers to write and verify expectations for content returned in JSON.&lt;br/&gt;&lt;br /&gt;As for the second feature, the generation of sequence diagrams from a RestFixture table, the idea has been growing since &lt;a href="http://smartrics.blogspot.com/2008/07/umlgaph-for-auto-generating-class.html"&gt;i found&lt;/a&gt; &lt;a href="http://www.umlgraph.org/"&gt;UMLGraph&lt;/a&gt;, a nice tool that generates class and sequence diagrams. The idea is that for describing complex REST API interactions... a picture is worth a thousand words.&lt;br /&gt;&lt;br /&gt;Here follows two simple diagrams and associated tables to demonstrate the generation of the diagrams.&lt;br/&gt;Note that the diagrams are generated at execution time, therefore they reflect the actual outcome of the run of a RestFixture test. This means that if the test fails the picture shows the flow of messages that failed the test.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HA4XCmK8W8I/SQ478eo03RI/AAAAAAAAADc/XwH9QMVGS9U/s1600-h/screenshot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 176px;" src="http://2.bp.blogspot.com/_HA4XCmK8W8I/SQ478eo03RI/AAAAAAAAADc/XwH9QMVGS9U/s400/screenshot2.png" alt="" id="BLOGGER_PHOTO_ID_5264210924645178642" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/SQ48F_O59-I/AAAAAAAAADk/rVtTjmMqsVY/s1600-h/screenshot3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 120px;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/SQ48F_O59-I/AAAAAAAAADk/rVtTjmMqsVY/s400/screenshot3.png" alt="" id="BLOGGER_PHOTO_ID_5264211088013653986" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The diagrams are pretty basic and they only show the objects (or resources) involved, the verb, the return code and, for POST the id, taken from the Location header.&lt;br /&gt;&lt;br /&gt;Full instructions on how to install the required software and how to use the new feature are available in the &lt;a href="http://github.com/smartrics/RestFixture"&gt;RestFixture&lt;/a&gt; web site.&lt;br /&gt;&lt;br/&gt;Support for generation of the diagrams is basic. It has been extracted out of the main RestFixture   trunk as it's still in spike mode. The code, though is checked in the same SVN trunk (the project is called &lt;a href="http://rest-fixture.googlecode.com/svn/trunk/PicBuilder/"&gt;PicBuilder&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;As always comments are very welcome!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2106755338963472547?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2106755338963472547/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2106755338963472547' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2106755338963472547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2106755338963472547'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/11/restfixture-latest-additions.html' title='RestFixture latest additions: JSON support and Sequence Diagrams Generation'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HA4XCmK8W8I/SQ478eo03RI/AAAAAAAAADc/XwH9QMVGS9U/s72-c/screenshot2.png' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-8754682485057476612</id><published>2008-10-26T12:50:00.006Z</published><updated>2008-10-26T13:04:21.696Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse ide feedback agile test'/><title type='text'>Getting immediate and accurate feedback from the IDE</title><content type='html'>In Agile methodologies getting feedback to adjust future work is a valuable practice to follow. In reality this is nothing new, in any human activity information gathered from feedback received on the system in development is used to drive activities to improve the chances to get the desired output.&lt;br /&gt;&lt;br /&gt;Agile methodologies typically address feedback from the customer perspective: the team produces the agreed artifacts, the customer provides feedback on the outcome, both together re-plan future activities to adjust appropriately to get maximum business value from new delivered artifacts.&lt;br /&gt;&lt;br /&gt;Feedback is characterized by two properties: its “&lt;span style="font-style: italic;"&gt;immediacy&lt;/span&gt;” and its “&lt;span style="font-style: italic;"&gt;accuracy&lt;/span&gt;”. Immediacy is the perceived time elapsed between when feedback gathering starts and when it's actually obtained. Accuracy is related to the usefulness of the information extracted from feedback.&lt;br /&gt;&lt;br /&gt;Bearing in mind these two properties, feedback can be extended to development activities by appropriately configuring development tools and refine development practices. The aim is to get feedback “&lt;span style="font-weight: bold;"&gt;now&lt;/span&gt;” (immediate) and “&lt;span style="font-weight: bold;"&gt;spot on&lt;/span&gt;” (accurate).&lt;br /&gt;&lt;br /&gt;The source of ultimate feedback for a developer is the build process. Typically, though, “&lt;span style="font-style: italic;"&gt;the build&lt;/span&gt;” is a resource intensive process that happens on a continuous build/integration server (for example &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;Cruise Control&lt;/a&gt;). This process consists mainly of a sequence of steps that include checkout from source control repository, compilation of the code, execution of the unit tests, metrics gathering, deployment in some test environment, execution of the customer acceptance tests, documentation generation.&lt;br /&gt;These steps are executed using the entire source tree and provide the ultimate feedback on whether the latest code changes have broken or not any of the existing functionalities. Clearly the larger the code base is the longer the build takes. In a short &lt;span style="font-style: italic;"&gt;“write test – write code – check-in”&lt;/span&gt; loop (typical of a &lt;a href="http://en.wikipedia.org/wiki/Test-driven_development"&gt;TDD&lt;/a&gt; approach) though it's usually unacceptable to wait even more than few seconds to understand if the code added breaks the build or not. So even for short builds (in the range of few minutes) it's advisable to use the IDE to help improving immediacy (by shortening feedback loop back time), albeit without diminishing accuracy.&lt;br /&gt;One way to do that is to use the IDE to execute part of the whole build process locally, possibly in the IDE itself.&lt;br /&gt;Taking &lt;a href="http://eclipse.org/"&gt;Eclipse IDE&lt;/a&gt; as an example, the following is a list of tips that may be used to gather immediate and accurate feedback.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Use the &lt;a href="http://www.junit.org/"&gt;JUnit&lt;/a&gt; plug-in to run the test just written until the code that passes it is complete (well, no new news here, I am sure most of us do this already). The caveat in this tip is to make sure that the result is accurate;  way the plug-in runs the tests is equivalent to the way the CI executes them, that is via – typically – an Ant script. Whilst this is immediate for simple tests and code structures, it gets very hairy when frameworks are used (for example &lt;a href="http://www.springframework.org/"&gt;SpringFramework&lt;/a&gt;) which require configuration files in the classpath and/or external library dependencies. So the first thing to check is that the classpath in the Ant on which JUnit runs is the same as the one in which the test runs in Eclipse. One caveat to this approach is that Eclipse IDE is limited to a single classpath per project so it's less flexible than Ant, where order and content of a classpath can be more fine grained. So typically any “target” in an Ant build script should refer to a “project classpath” path definition that refers to the same set of directories and files in the Eclipse project classpath and in the same order.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use code metrics plug-ins to run metrics on the fly on single files and incrementally on packages and on the entire source tree. The rationale is that in a short TDD loop the number of files touched is minimal, so running the metrics in that subset first and eventually run them on larger sets, improves the chances to find problems sooner. Eclipse IDE can be enriched with all sorts of plug-ins, including those for Checkstyle, FindBugs, JDepend. And to gather accurate feedback it's necessary that the configuration files for each one of these tools/plug-ins is shared between Eclipse IDE and the main build – it's usually good practice to check the configuration files in the same code tree so that they can be easily referred from the IDE and Ant.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Use the &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; plug-in in the IDE to execute single or set of targets in the IDE. Accuracy is guaranteed by having the Ant environments in the CI and in the IDE equivalent – this includes also redefining the Ant Home in the IDE to run the same version of Ant in all the environments. Running Ant in the IDE rather than in a shell offers the limited advantage of the IDE support on parsing the output from the build (context sensitive help and hyper-links to the source code).&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;There are plenty of other clever usages of the IDE features that can drastically improve feedback gathering; some of them are specifically for Eclipse, others exportable to any other IDE as the ones described above. In all examples, though the key message is that immediacy must not be achieved at expenses of accuracy (as my friend &lt;a href="http://blog.paulmoser.co.uk/"&gt;Paul&lt;/a&gt; would say &lt;span style="font-style:italic;"&gt;"feedback is only valuable when it's accurate"&lt;/span&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-8754682485057476612?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/8754682485057476612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=8754682485057476612' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8754682485057476612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/8754682485057476612'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/10/getting-immediate-and-accurate-feedback.html' title='Getting immediate and accurate feedback from the IDE'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2211486199090651794</id><published>2008-09-11T14:34:00.004+01:00</published><updated>2008-09-11T14:36:19.743+01:00</updated><title type='text'>Cultural challenges</title><content type='html'>Train Station, Coffee shop (I won't mention the name), 8am of a typical commuting day&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Barista:&lt;/span&gt; Yes, please!  &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Me:&lt;/span&gt; Can I have a single espresso, please?&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Barista:&lt;/span&gt; Sure!&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(Barista goes to the coffee machine, but suddently comes back)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Barista:&lt;/span&gt; Sir, sure you want a single espresso? The Double espresso has the same price.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Me:&lt;/span&gt; Yes, I am sure, thanks.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Barista:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;(Baffled)&lt;/span&gt; Uh... Ok!&lt;br /&gt;&lt;br /&gt;(Although, the most upsetting thing, after this conversation, is when the cup is 3/4 full)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2211486199090651794?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2211486199090651794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2211486199090651794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2211486199090651794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2211486199090651794'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/09/cultural-challenges.html' title='Cultural challenges'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-1767170423574342924</id><published>2008-08-27T23:31:00.004+01:00</published><updated>2008-12-27T20:33:48.658Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='report'/><title type='text'>Agile 2008 - Report</title><content type='html'>As &lt;a href="http://smartrics.blogspot.com/2008/08/agile-2008-part-1.html"&gt;promised a few days ago&lt;/a&gt;, this is my report on the sessions I attended at Agile 2008.&lt;br /&gt;&lt;br /&gt;Before the comments on the session I attended, I would like to mention that the whole conference did not blew me away. I mean, it was very good: the hotel, the location, the people, our active participation with two talks and all of that. But I had every day the feeling that all of that was too much. I am not used to group gatherings of this size so that may explain. Anyway, there were great sessions going on, some of which I could not attend for work commitments. And this time around I decided to attend different types of sessions, outside my comfort zone. &lt;br /&gt;I have learned a lot from attending the sessions described below and - not surprisingly - I came back home with more questions than answers. Happily I am still in touch with some people I met at the conference following up ideas initially discussed there. So thumbs up for me over all to the whole experience. And Toronto is a great City.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Keynotes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;"The Wisdom of Crowd" by &lt;a href="http://en.wikipedia.org/wiki/James_Surowiecki"&gt;James Surowiecki&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Without a doubt this was an interesting opening session. It clearly was aimed to support the speaker's book &lt;a href="http://www.amazon.co.uk/Wisdom-Crowds-Many-Smarter-Than/dp/0349116059"&gt;The Wisdom of the Crowd&lt;/a&gt;, but non-the-less new news for me. I got interested in collective intelligence when I read &lt;a href="http://www.amazon.co.uk/Programming-Collective-Intelligence-Building-Applications/dp/0596529325"&gt;Programming Collective Intelligence&lt;/a&gt;, aimed to a more technical audience. This keynote gave me the possibility of know of another aspect of the same topic: how to extract information from a group of people when they are identified as an entity on its own. The crowd, that is.&lt;br /&gt;&lt;br /&gt;The common way to extract information from the crowd is by aggregating information coming from the single entities in the crowd. One crucial aspect - very well discussed in this speech - though is how to make sure that "crowd" is built to maximise the chances that the aggregation of ideas can generate new information: this is a case of "the total is bigger than the sum of all the single parts"&lt;br /&gt;&lt;br /&gt;So, the key point is that under the &lt;i&gt;right conditions&lt;/i&gt; a group of people can be effectively intelligent, contrary to the commonly perceived thinking that crowd are volatile and stupid. Obviously the catch is to understand what the right conditions are.&lt;br /&gt;&lt;br /&gt;The right conditions are "diversity" and "independence".&lt;br /&gt;&lt;br /&gt;Diversity has to be understood as cognitive diversity, not sociological: different approach to problem solving, different levels of skills and technical capabilities, as opposite to race, sex or social class. The speaker refers to different anecdotes (taken from the book) that prove its hypothesis, inferring also that diversity is even more important in small groups. In essence, homogeneous groups tent to hide flaws as ideas are always analysed in the same way (that is solutions are found by agreement rather than by conflict). In these cases an approach could be to have someone playing "&lt;a href="http://en.wikipedia.org/wiki/Devil%27s_advocate"&gt;Devil's advocate&lt;/a&gt;", with the aim to look at ideas and outcomes from a non standard perspective.&lt;br /&gt;&lt;br /&gt;Independence is as much important as diversity. Looking at the crowd as the entity providing the most accurate and effective solution to a given problem, does not mean that the individuality is not important. Individuals must be independent and be able to express their best in any given situation. If this doesn't happen the aggregated results are biased and possibly wrong. This may happen because by nature individuals tent to imitate each other or because organizations punish diversity.&lt;br /&gt;&lt;br /&gt;So overall an enlightening speech that I can relate to on my day to day job.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;“Quintessence” by &lt;a href="http://www.objectmentor.com/omTeam/martin_r.html"&gt;Robert "Uncle Bob" Martin&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This session happened just after the Thursday's gala dinner. I must say that Bob Martin is a character. On the content of his session, the main points were related to how Agile is implemented in the real life and on how the developer community should behave professionally and push back to those who want them to deliver crap code on time.&lt;br /&gt;&lt;br /&gt;About agility, the focus was on XP and Scrum and how - especially at the beginning - the two school of thoughts differed. XP more strict and guided, Scrum more relaxed about actual software development practices. He did an interesting experiment during the session. He asked the attendees to raise their hands. He then started to enunciate each of the XP practices asking people to put their hands down if they weren't following the specific practice.&lt;br /&gt;&lt;br /&gt;I reckon we were over 1000 people (if not more) and at the end there must have been 10 people with hands up.  I think the point o the experiment was to show that we are at a stage where people blend practices and principles of Scrum and XP to make what works for them.&lt;br /&gt;&lt;br /&gt;The other crucial point made was on developers having to put courage on the line and never compromise on good code for new features to accommodate insane deadlines or scarce resources. "We value good code over crap" was suggested as another (unlikely) entry in the Agile Manifesto.&lt;br /&gt;&lt;br /&gt;So a very interesting pitch full of truth and controversy. I can not disagree with most of the talk. I still have to find though a place where developers have such a discipline that they can draw a line between over-engineering, quality, speed and alignment with business goals.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;"The Wisdom of Experience" by &lt;a href="http://www.cooper.com/journal/2008/08/alans_keynote_at_agile_2008.html"&gt;Alan Cooper&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The closure keynote was nothing new to me having read &lt;a href="http://www.amazon.co.uk/Inmates-Are-Running-Asylum-High-tech/dp/0672316498%E2%80%9D"&gt;The Inmates are running the asylum&lt;/a&gt;. Same message as Uncle Bob's for quality over quantity. The speech was full of anecdotes of teams and companies shipping "on time and on budget" bad and unsuccessful software. The key is "take your time and produce good and complete software" that people can enjoy using. The way to nirvana seems to complement agile principles. He's suggesting a typical lack of good software design (especially interfaces) and he's proposing to spend and invest on good and correct design even before a single line of code is written.&lt;br /&gt;&lt;br /&gt;All the second part of the talk was dedicated to advertise "interaction design", the new speciality he is proposing and how this can bridge the gap between technical skills and business skills. An interaction designer knows what people want and how to make software usable and easy to understand. Interfaces should not be designed by developers. Users on the contrary should not be allowed to create stories directly to the developers. It is job of this new type of designers to filter and adjust to have the two groups get together for a better solution.&lt;br /&gt;&lt;br /&gt;He's got a point: we all know of crappy software with poor user interfaces or with incomprehensible behaviour. Whether fixing this requires a full time job and a specific career path - the way he envisages - is still to be seen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Sessions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://submissions.agile2008.org/node/1468"&gt;Agile contracting&lt;/a&gt; - Rachel Weston, Chris Spagnuolo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I attended this session with the hope to know more about contracts for collaboration between a client and a contractor adopting agile methodologies.&lt;br /&gt;&lt;br /&gt;I got a set of problem statements with some strategies on how to mitigate the risks and a bunch of statistics trying to show how agile is better than waterfall.&lt;br /&gt;By the way, I have an issue when agile is sold using numbers like 93% increased productivity or 83% improved satisfaction versus a traditional waterfall approach that gives 35% successful projects. Firstly must be made clear - even more than the numbers - on what conditions these numbers are collected. Second, even thinking about statistics, saying that only X% of projects adopting waterfall is successful doesn't mean that the next project has the X% probability of being successful. The number of independent events that may occur and the people involved are completely different from project to project that the assumption is mathematically wrong. Hence using it as selling point is... incorrect.&lt;br /&gt;&lt;br /&gt;Anyway, the most important takeaways from this session were an overall understanding of what problems contractor supporting agile do face. Mainly&lt;br /&gt;&lt;ul&gt;&lt;li&gt;having to compete with "non agile" competitors, who may offer a more sound sense of security in delivering quality software on time.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;having to deal with customers who do not embrace agile or that are not fully supportive or that don't have the means to keep up with the fast agile pace&lt;br /&gt;&lt;/li&gt;&lt;li&gt;having to provide at bid time of predictability on scope and schedule&lt;br /&gt;&lt;/li&gt;&lt;li&gt;having to match customer expectations and internal financial department as for invoicing, payments and costs.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Strategies suggested, directly coming from the experience of the speakers were mainly focussed on&lt;br /&gt;&lt;ul&gt;&lt;li&gt;keeping the contract simple.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;engaging and educating the customer to the agile practices and explain the technicalities.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;clearly state the responsibilities of both parties (customer and contractor).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;work out from past velocity charts what can be done, might be done won't be done.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;agree with the customer on sharing the risks: loosely define scope when schedule and resource are fixed or instead of the classic time and material.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;make sales people responsible of the performance of the contract, so they're focussed on knowing what they're selling.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Overall a good session, especially for beginners, with few pointers to think about. Surely, the devil is in the details, but overall the same message applies here: it's all about people collaborating and communicating effectively to achieve a shared goal.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://submissions.agile2008.org/node/4944"&gt;Crafting User Stories – Four Experts and the audience weigh in&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I ended up to this session with lots of hope. When talking of user stories it's always easy to come up with some techniques good on paper but not effectively reusable in real life. I must admit, I didn't get the answers I was looking for, but the big plus was to observe 5 experts in the subject matter (dis)agreeing on some concepts that maybe some time ago were considered heresy.&lt;br /&gt;Each expert in the panel was asked to introduce himself and give an overview of their approach to user stories.  The moderator then asked attendees to come up with questions for the panel to debate/answer.&lt;br /&gt;I will here report my learning points.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it’s important for everybody in the team to understand where a story fits in the picture&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the format in which stories are formulated is not important as long as few key parts are somehow present: what the story is all about, what it costs to have it implemented (whatever the unit of cost is), who’s benefiting from the implementation of the story and what benefit the story is going to provide, how can stakeholders know when it’s done and to what extent. Also important for me is to know “who” can accept it.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;there’s no harm on having stories in the backlog specifically tailored to solve technical problems, as long as the points raised above are clear in the story.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:130%;"&gt;&lt;a href="http://submissions.agile2008.org/node/2715"&gt;Leading agile teams&lt;/a&gt; - Mike Griffith&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was a 90mins workshop for agile leaders aiming to learn leadership techniques. The speaker took the audience to a journey where all the aspects of leadership were analysed, especially those revolving around the team leadership.&lt;br /&gt;One of the most important points raised was the importance of maintaining vision of what the team is building and why.&lt;br /&gt;The speaker suggests using the “the product box” technique. The team is supposed to come up with a cardboard box (possibly to be available in the office) representing the product with a name, a logo and its main features. The intent is to maintain focus on what the team is building by means of a real physical object.&lt;br /&gt;Techniques aside, the main learning point on this was that vision is so important that job of the leader is to make sure that it’s consistently updated and propagated to the team regularly.&lt;br /&gt;It was also stressed the difference between managing and leading (the latter being build on the former) and – interestingly – the job of the leader is to build a team that eventually behaves like the “Orpheus orchestra” – which plays without a designated “Maestro” or like the Canadian geese, who make of self organisation and team work a matter of life and death.&lt;br /&gt;For more information on the subject see &lt;a href="http://www.apln.org"&gt;http://www.apln.org&lt;/a&gt; and &lt;a href="http://www.leadinganswers.com"&gt;http://www.leadinganswers.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Memorable mention for&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://submissions.agile2008.org/node/506"&gt;Evolution of the Tools and Practices of a Large Distributed Agile Team&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://submissions.agile2008.org/node/1929"&gt;Pushing the boundaries of testing and Continuous Integration&lt;/a&gt; (for this talk you can find the slides &lt;a href="http://www.slideshare.net/robb1e/pushing-the-boundaries-of-continuous-integration?src=embed"&gt;here&lt;/a&gt; and a video of the talk &lt;a href="http://www.vimeo.com/1518047"&gt;here&lt;/a&gt; - thanks Robbie!)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-1767170423574342924?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/1767170423574342924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=1767170423574342924' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1767170423574342924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1767170423574342924'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/08/agile-2008-report.html' title='Agile 2008 - Report'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3909090913531546159</id><published>2008-08-20T03:47:00.005+01:00</published><updated>2010-07-31T15:40:01.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fitnesse'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='fixture'/><category scheme='http://www.blogger.com/atom/ns#' term='executable documentation'/><title type='text'>RestFixture is now available</title><content type='html'>I have made the RestFixture (discussed in &lt;a href="http://smartrics.blogspot.com/2008/08/get-fitnesse-with-some-rest.html"&gt;this post&lt;/a&gt;) available on GitHub here: &lt;a href="http://github.com/smartrics/RestFixture"&gt;http://code.google.com/p/rest-fixture/&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;You can get it, use it and modify it under LGPL terms.&lt;br /&gt;&lt;br /&gt;Feedback is more than welcome, of course.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3909090913531546159?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3909090913531546159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3909090913531546159' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3909090913531546159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3909090913531546159'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/08/restfixture-is-now-available.html' title='RestFixture is now available'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3363915934015906493</id><published>2008-08-10T15:32:00.006+01:00</published><updated>2008-08-10T17:10:40.830+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Agile 2008 - part 1</title><content type='html'>Oh yes, &lt;a href="http://www.agile2008.org"&gt;Agile 2008&lt;/a&gt;... here I am, just landed from Toronto. I am just reshaping my notes. I'll be writing (as I &lt;a href="http://smartrics.blogspot.com/2007/06/javaone-2007.html"&gt;have&lt;/a&gt; &lt;a href="http://smartrics.blogspot.com/2008/06/xp2007.html"&gt;also&lt;/a&gt; &lt;a href="http://smartrics.blogspot.com/2007/11/xpday-2007.html"&gt;done&lt;/a&gt; in the past) my comments on the sessions I have attended and &lt;a href="http://smartrics.blogspot.com/2008/05/agile-2008-well-be-there.html"&gt;presented&lt;/a&gt;, and about old friends I have talked to (&lt;a href="http://www.rimuresearch.com"&gt;Rick&lt;/a&gt;, &lt;a href="http://www.agilexp.com/"&gt;Rachel&lt;/a&gt;, &lt;a href="http://www.martinitconsulting.com/agile/home.html"&gt;Angela&lt;/a&gt;, &lt;a href="http://www.jbrains.ca/"&gt;JB&lt;/a&gt;, &lt;a href="http://www.m3p.co.uk/"&gt;Steve&lt;/a&gt;) and new people I have met. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3363915934015906493?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3363915934015906493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3363915934015906493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3363915934015906493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3363915934015906493'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/08/agile-2008-part-1.html' title='Agile 2008 - part 1'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2811459003182478030</id><published>2008-08-02T04:10:00.015+01:00</published><updated>2011-01-18T00:25:45.434Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='customer'/><category scheme='http://www.blogger.com/atom/ns#' term='fitnesse'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='DSL'/><category scheme='http://www.blogger.com/atom/ns#' term='test'/><category scheme='http://www.blogger.com/atom/ns#' term='acceptance'/><title type='text'>Get FitNesse with some Rest</title><content type='html'>&lt;span style="font-style:italic;"&gt;UPDATE:&lt;/span&gt; code moved here: &lt;a href="http://github.com/smartrics/RestFixture"&gt;http://github.com/smartrics/RestFixture&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;UPDATE II:&lt;/span&gt; Thank you to Steven Haines for the clear and concise &lt;a href="http://www.informit.com/guides/content.aspx?g=java&amp;seqNum=606"&gt;Howto giude&lt;/a&gt; on the RestFixture.&lt;br /&gt;&lt;br /&gt;I am currently involved in building a &lt;a href="http://www.infoq.com/articles/rest-introduction"&gt;REST&lt;/a&gt; API. Our direct customer proxy (the architecture team) needs to "understand" how we implement the agreed acceptance criteria and it has also asked to document the API. &lt;br /&gt;&lt;a href="http://fitnesse.org/"&gt;FitNesse&lt;/a&gt; is our &lt;a href="http://submissions.agile2008.org/node/506"&gt;tool of choice&lt;/a&gt;  for writing functional Customer Acceptance Tests; we currently use it to implement this type of tests for other parts of the system we're building. So it came natural to start using it for documenting the API.&lt;br /&gt;&lt;br /&gt;At first we implemented the tests using essentially &lt;a href="http://fitnesse.org/FitNesse.ActionFixture"&gt;ActionFixture&lt;/a&gt;s. The approach adopted consisted of "wrapping" the REST API in more descriptive metods that could be &lt;code&gt;press&lt;/code&gt;ed, &lt;code&gt;check&lt;/code&gt;ed and &lt;code&gt;enter&lt;/code&gt;ed. &lt;br /&gt;&lt;br /&gt;After the first dozen of tests it was apparent that this approach was not ideal. Tests were not clear enough and maintaining the fixtures was hard and time consuming as the amount of code duplication was high for any standard. New tests required us writing more code and, in fact, we were testing just the behaviour of the backend without giving enough exposure to the API itself - consequently, our tests were not descriptive enough to work as live documentation.&lt;br /&gt;&lt;br /&gt;So I decided to write a new "type" of fixture, inspired by the &lt;code&gt;ActionFixture&lt;/code&gt;, the &lt;span style="font-weight: bold;"&gt;RestFixture&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;The core principles underpinning the decision to write a new fixture were the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;For documenting a REST API you need to show how the API looks like. For REST this means&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;show what the resource URI looks like. For example &lt;code&gt;&lt;br /&gt;/resource-a/123/resource-b/234&lt;/code&gt;&lt;/li&gt;&lt;li&gt;show what HTTP operation is being executed on that resource. Specifically which one fo the main HTTP verbs where under test (&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, &lt;code&gt;HEAD&lt;/code&gt;, &lt;code&gt;OPTIONS&lt;/code&gt;).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;have the ability to set headers and body in the request&lt;/li&gt;&lt;br /&gt;&lt;li&gt;check expectations on the return code of the call in order to document the behaviour of the API&lt;/li&gt;&lt;br /&gt;&lt;li&gt;check expectation on the HTTP headers and body in the response. Again, to document the behaviour&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;I didn't want to maintain fixture code. If I could only write the tests...&lt;/li&gt;&lt;li&gt;I wanted to be able to let the customer proxies to write the tests... And they understand Wiki syntax more than Java.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;The &lt;code&gt;RestFixture&lt;/code&gt; at a glance&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;RestRixture&lt;/code&gt; is an &lt;code&gt;ActionFixture&lt;/code&gt;, therefore all the &lt;code&gt;ActionFixture&lt;/code&gt; goodies are available. On top of that it contains the following 7 methods:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;header&lt;/code&gt;: to be able to set the headers for the next request (a CRLF separated list of &lt;code&gt;name:value&lt;/code&gt; pairs&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;body: to allow request body input, essential for &lt;code&gt;PUT&lt;/code&gt; and &lt;code&gt;POST&lt;/code&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;let&lt;/code&gt;: to allow data from the response headers and body to be extracted and assigned to a label that can then be passed around. For example our API specifies that when you create a resource using &lt;code&gt;POST&lt;/code&gt;, the newly created resource URI is in the &lt;code&gt;Location&lt;/code&gt; header. This URI is necessary in order to perform further operations on that resource (for example, &lt;code&gt;DELETE&lt;/code&gt; it in a teardown).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;, to execute requests. &lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Each test is a rown on a &lt;code&gt;RestFixture&lt;/code&gt; table and it has the following format:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;|VERB|uri|?ret|?headers|?body|&lt;/code&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;VERB&lt;/code&gt; is one of &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; (at the moment we're not supporting &lt;code&gt;HEAD&lt;/code&gt; and &lt;code&gt;OPTIONS&lt;/code&gt;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;uri&lt;/code&gt; is the resource URI&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;?ret&lt;/code&gt; is the expected return code of the request. it can be expressed as a regular expression, that is you can write 2\d\d if you expect any code between 200 and 299.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;?headers&lt;/code&gt; is the expected list of headers. In fact, the expectation is checked by verifying that *all* the headers in here are present in the response. Each header must go in a newline and both name and value can be expressed as regular expressions to match in order to verify inclusion.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;code&gt;?body&lt;/code&gt; it's the expected body in the response. This is expressed as a list of XPath expressions to allow greater flexibility.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Some examples&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The following pictures are snapshots taken from FitNesse with the aim of providing examples of usage of the &lt;code&gt;RestFixture&lt;/code&gt;. The notes before each test explain the details of the fixture itself.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6dv1oRZI/AAAAAAAAABc/-kCZlDwUqXY/s1600-h/get.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6dv1oRZI/AAAAAAAAABc/-kCZlDwUqXY/s400/get.png" alt="" id="BLOGGER_PHOTO_ID_5230502668713608594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ6dgchcAI/AAAAAAAAABk/0qUpkyIODY4/s1600-h/get-run.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ6dgchcAI/AAAAAAAAABk/0qUpkyIODY4/s400/get-run.png" alt="" id="BLOGGER_PHOTO_ID_5230502664581771266" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6eKXyD2I/AAAAAAAAABs/4UMIPWNrRag/s1600-h/post.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6eKXyD2I/AAAAAAAAABs/4UMIPWNrRag/s400/post.png" alt="" id="BLOGGER_PHOTO_ID_5230502675836178274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/SJZ6eNPQCqI/AAAAAAAAAB0/O8aBuJ1ioMQ/s1600-h/post-run.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/SJZ6eNPQCqI/AAAAAAAAAB0/O8aBuJ1ioMQ/s400/post-run.png" alt="" id="BLOGGER_PHOTO_ID_5230502676605700770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6efxNMCI/AAAAAAAAAB8/E0J__5iMsXQ/s1600-h/put.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6efxNMCI/AAAAAAAAAB8/E0J__5iMsXQ/s400/put.png" alt="" id="BLOGGER_PHOTO_ID_5230502681579958306" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ69kMJBNI/AAAAAAAAACE/EJzT9gv-lao/s1600-h/put-run.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ69kMJBNI/AAAAAAAAACE/EJzT9gv-lao/s400/put-run.png" alt="" id="BLOGGER_PHOTO_ID_5230503215342617810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ692gTZBI/AAAAAAAAACM/smohw3sStLk/s1600-h/delete.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ692gTZBI/AAAAAAAAACM/smohw3sStLk/s400/delete.png" alt="" id="BLOGGER_PHOTO_ID_5230503220259021842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ698fED8I/AAAAAAAAACU/vzWZUGHDfuY/s1600-h/delete-run.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SJZ698fED8I/AAAAAAAAACU/vzWZUGHDfuY/s400/delete-run.png" alt="" id="BLOGGER_PHOTO_ID_5230503221864435650" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It's worth noticing that, generally, expectations are not matched by string comparing the expected value with the actual value. Expectations on headers are verified by checking that the expected set of headers is included in the actual set of headers, similarly with the body where expectations are matched by checking existences of nodes for a given path.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Conclusions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;RestFixture&lt;/code&gt; allows to write FitNesse tests without having to write any Java code to back up the fixtures. Tests are clear and easy to read/write and this obviously improves their readability. Therefore it works well for documenting the API and the behaviour of the system under test. Looking it from another angle, the fixture, essentially, implements a REST &lt;a href="http://en.wikipedia.org/wiki/Domain_Specific_Language"&gt;DSL&lt;/a&gt;, that allows customers to write tests on their own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2811459003182478030?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2811459003182478030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2811459003182478030' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2811459003182478030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2811459003182478030'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/08/get-fitnesse-with-some-rest.html' title='Get FitNesse with some Rest'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HA4XCmK8W8I/SJZ6dv1oRZI/AAAAAAAAABc/-kCZlDwUqXY/s72-c/get.png' height='72' width='72'/><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-1997120068181716242</id><published>2008-07-06T00:59:00.008+01:00</published><updated>2008-07-07T22:53:10.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='transformation'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Groovy for XML transformation</title><content type='html'>I have been playing with &lt;a href="http://groovy.codehaus.org/"&gt;groovy&lt;/a&gt; recently, specifically with the &lt;a href="http://groovy.codehaus.org/GroovyMarkup"&gt;MarkupBuilder&lt;/a&gt;, the groovy native support for markup languages. It basically means writing XML using native groovy syntax. Pretty neat.&lt;br /&gt;&lt;br /&gt;In my job I have more often than not, have to write software to integrate two or more systems. This, often, means writing code that reads an XML stream onto a Java object for manipulation and eventually writes the result into another XML stream.&lt;br /&gt;&lt;br /&gt;This typically involves creating binding objects for the input XML and the output XML and then a sequence of calls to getters on the input object and setters on output object to implement the mapping.&lt;br /&gt;&lt;br /&gt;This task is very error prone and tedious. A good solution is using the &lt;code&gt;MarkupBuilder&lt;/code&gt; (and, yes, I know about &lt;code&gt;XSLT&lt;/code&gt;, but this is not the point here!)&lt;br /&gt;&lt;br /&gt;So, suppose that you have the following POJO &lt;pre&gt;&lt;br /&gt;public class Contact {&lt;br /&gt;  private String id;&lt;br /&gt;  private String name;&lt;br /&gt;  private String surname;&lt;br /&gt;  // ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt; and you want to serialize the instance  &lt;pre&gt;&lt;br /&gt;Contact c = new Contact();&lt;br /&gt;c.setId("123");&lt;br /&gt;c.setName("John");&lt;br /&gt;c.setSurname("Bloggs");&lt;br /&gt;&lt;/pre&gt; into the following XML &lt;pre&gt;&lt;br /&gt;&amp;lt;contact&gt;&lt;br /&gt;  &amp;lt;key&gt;123&amp;lt;/key&gt;&lt;br /&gt;  &amp;lt;firstname&gt;John&amp;lt;/firstname&gt;&lt;br /&gt;  &amp;lt;secondname&gt;Bloggs&amp;lt;/secondname&gt;&lt;br /&gt;&amp;lt;/contact&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Note the difference between the POJO attribute names and the XML tag names&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Using groovy and its &lt;code&gt;MarkupBuilder&lt;/code&gt;, the first thing to do is to create a groovy converter, a class with a method that reads the data from the bean and produces the XML. Create a file &lt;code&gt;src/groovy/ContactConverter.groovy&lt;/code&gt; with the following code:&lt;br /&gt;&lt;pre&gt;class ContactConverter{&lt;br /&gt;  def convert(bean){&lt;br /&gt;     def writer = new StringWriter();&lt;br /&gt;     def xml = new MarkupBuilder();&lt;br /&gt;     xml.contact {&lt;br /&gt;        firstname(bean.name)&lt;br /&gt;        secondname(bean.surname)&lt;br /&gt;     }&lt;br /&gt;     writer.toString()&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;If you execute the code &lt;br /&gt;&lt;pre&gt;println new COntactConverter().convert(c)&lt;/pre&gt;&lt;br /&gt;in a groovy shell, you get the XML shown above.&lt;br /&gt;&lt;br /&gt;The next step is then to make this code executable from your Java service.&lt;br /&gt;You can use this class (an adaptation of the code available in the &lt;a href="http://groovy.codehaus.org/Embedding+Groovy"&gt;groovy documentation&lt;/a&gt;):&lt;br /&gt;&lt;pre&gt;public class GroovyConverterInvoker {&lt;br /&gt;  public String invoke(String fileName, Object bean){&lt;br /&gt;    GroovyObject groovyObject = createObjectFromStreamName(strName);&lt;br /&gt;    String result = (String)groovyObject.invokeMethod("convert", new Object[]{bean});&lt;br /&gt;    return result;  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public GroovyObject createObjectFromStreamName(String fileName) {&lt;br /&gt;    ClassLoader parent = getClass().getClassLoader();&lt;br /&gt;    GroovyClassLoader loader = new GroovyClassLoader(parent);&lt;br /&gt;    Class groovyClass;&lt;br /&gt;    File f = new File(fileName);&lt;br /&gt;    try {&lt;br /&gt;      groovyClass = loader.parseClass(f);&lt;br /&gt;      return (GroovyObject)groovyClass.newInstance();&lt;br /&gt;    } catch (CompilationFailedException e) {&lt;br /&gt;      throw new IllegalStateException("Unable to compile " + fileName, e);&lt;br /&gt;    } catch (IOException e) {&lt;br /&gt;      throw new IllegalStateException("Unable to open file " + fileName, e);&lt;br /&gt;    } catch (InstantiationException e) {&lt;br /&gt;      throw new IllegalStateException("Unable instantiate object for class in " + fileName, e);&lt;br /&gt;    } catch (IllegalAccessException e) {&lt;br /&gt;      throw new IllegalStateException("Unable access object of class in " + fileName, e);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;You can then invoke the conversion:&lt;br /&gt;&lt;pre&gt;public String invokeContactConverter(Object bean){&lt;br /&gt;    String fName = "src/groovy/ContactConverter.groovy";&lt;br /&gt;    return new GroovyConverterInvoker().invoke(fName, bean);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;You can now use JAXB/XStream or XmlBeans to parse the result of &lt;code&gt;invokeContactConverter&lt;/code&gt; and  initialize a new POJO for further use, or send the XML on the wire.&lt;br /&gt;&lt;br /&gt;The solution can be generalised and optimised to a point where you only need to write groovy converters and load/modify them dynamically when necessary.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-1997120068181716242?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/1997120068181716242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=1997120068181716242' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1997120068181716242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1997120068181716242'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/07/groovy-for-xml-transformation.html' title='Groovy for XML transformation'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-4513914791531542214</id><published>2008-07-05T12:32:00.003+01:00</published><updated>2008-07-05T12:42:34.080+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sicilian'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><title type='text'>Sicilian as a language</title><content type='html'>I am randomly browsing the web today. I just finished to read a Wikipedia entry on the &lt;a href="http://en.wikipedia.org/wiki/Sicilian_language"&gt;Sicilian language&lt;/a&gt;. I always thought that Sicilian was an Italian dialect, although I was aware on several influences from French, Spanish, Latin and Greek, but I realised that scholars do consider it as a language in its own merit. That makes Sicilians bilingual at least.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-4513914791531542214?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/4513914791531542214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=4513914791531542214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4513914791531542214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4513914791531542214'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/07/sicilian-as-language.html' title='Sicilian as a language'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6162594298411420367</id><published>2008-07-01T00:43:00.003+01:00</published><updated>2008-07-01T00:48:47.571+01:00</updated><title type='text'>UMLGaph for auto generating class diagrams from your source code</title><content type='html'>As part of improving the documentation of our software - a &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt; API - for the benefit of our customer (mainly an architect) and (future) users, we have investigated &lt;a href="http://www.umlgraph.org/"&gt;UMLGraph&lt;/a&gt;, a free application that is able to parse source code and (with the help of &lt;a href="http://www.graphviz.org/"&gt;graphviz&lt;/a&gt;) generate class diagrams that can be embedded in the &lt;a href="http://java.sun.com/j2se/javadoc/"&gt;javadoc&lt;/a&gt; documentation.&lt;br /&gt;&lt;br /&gt;The tool is very good and we're trying now to integrate it in our continuous integration build via ant.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6162594298411420367?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6162594298411420367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6162594298411420367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6162594298411420367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6162594298411420367'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/07/umlgaph-for-auto-generating-class.html' title='UMLGaph for auto generating class diagrams from your source code'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2440660682437807337</id><published>2008-06-09T23:59:00.005+01:00</published><updated>2008-06-10T09:56:12.374+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='award'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='eWEEK'/><title type='text'>BT Web21C SDK wins eWEEK Excellence Award</title><content type='html'>The BT &lt;a href="http://web21c.bt.com"&gt;Web21C SDK&lt;/a&gt; has been awarded with the &lt;a href="http://www.eweek.com"&gt;eWEEK&lt;/a&gt; Excellence Award under the category "Application Development" as reported &lt;a href="http://www.eweek.com/c/a/Security/eWEEK-Excellence-Awards-Honorees-Reflect-New-IT-Computing-Trends-Challenges/"&gt;here&lt;/a&gt;. I am part of the team who built it and I feel proud that 2 years of hard work have been recognized.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2440660682437807337?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2440660682437807337/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2440660682437807337' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2440660682437807337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2440660682437807337'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/bt-web21c-sdk-wins-eweek-excellence.html' title='BT Web21C SDK wins eWEEK Excellence Award'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-5955265662835392296</id><published>2008-06-08T13:24:00.004+01:00</published><updated>2008-06-08T17:52:55.589+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='tag'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='blogspot'/><title type='text'>Smartrics tag cloud</title><content type='html'>Go figure why the guys at blogspot have not provided a tag cloud widget. So, kudos to &lt;a href="http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html"&gt;phydeaux3 for supplying the code&lt;/a&gt; for my tag cloud. Except for changing the font colors and types to make it look better it was a matter of copy and paste in my blog template. Nice and easy...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-5955265662835392296?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/5955265662835392296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=5955265662835392296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5955265662835392296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5955265662835392296'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/tag-cloud.html' title='Smartrics tag cloud'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3373195159242410478</id><published>2008-06-07T12:23:00.005+01:00</published><updated>2008-06-08T17:03:09.262+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='hyperreality'/><category scheme='http://www.blogger.com/atom/ns#' term='second life'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><category scheme='http://www.blogger.com/atom/ns#' term='myspace'/><title type='text'>The (hyper)reality of social networking</title><content type='html'>I was reading about &lt;a href="http://en.wikipedia.org/wiki/Hyperreality"&gt;hyperreality&lt;/a&gt; when I started thinking of how it relates to the social networking phenomenon and communities built around it. Is there a connection between the two? Maybe. In fact someone else has already discussed this topic in &lt;a href="http://www.ldap.com/1/commentary/wahl/20070811_01.shtml"&gt;this rather interesting post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My favourite definition of hyperreality is &lt;a href="http://en.wikipedia.org/wiki/Umberto_Eco"&gt;Umberto Eco&lt;/a&gt;'s one: &lt;span style="font-style:italic;"&gt;"the authentic fake"&lt;/span&gt;. As you would expect the web is full of information about hyperreality, for example &lt;a href="http://www.wisegeek.com/what-is-hyperreality.htm"&gt;this&lt;/a&gt; is fairly complete article with examples. &lt;br /&gt;&lt;br /&gt;I'll try to write down my thoughts on how social networking community members do live in a hyperreal world. I should warn you though: I may sound cynical and destructive. Far from me: I think there's a place for social networking web sites and services (after all I am blogger too) and there's nothing wrong with being a consumer of these services. As far as I am concerned now I am just trying to understand the mechanics, why they work and why they exist the way they are now, and how they will transform in the future to come. So bear with me on this aspect.&lt;br /&gt;&lt;br /&gt;At the core of the meaning of hyperreality is the ambiguity between "real" and "fake" reality that arises when facts and events or objects are filtered by a multitude of media. &lt;br /&gt;&lt;br /&gt;Members of communities built around any of the latest and cutest Web2.0 website interact by the means and rules offered by the portal they use (&lt;a href="http://www.facebook.com"&gt;Facebook&lt;/a&gt;, &lt;a href="http://www.myspace.com"&gt;MySpace&lt;/a&gt; and the like). This medium filters the behaviour adopted by people. Actually, members of &lt;i&gt;any&lt;/i&gt; community, in a way, always interact within an accepted framework: think of the rules, implicit (values, culture) or explicit (laws),  that manage our relationship in a social environment and how they drive our behaviour. &lt;br /&gt;The main difference, though, is that people meeting face to face have other means (environment, body language, time...) that contribute to maximise the possibility that facts and events are perceived and understood correctly and close to the reality. &lt;br /&gt;&lt;br /&gt;Now back to the social networking. As said the web shapes the behaviour; there's also in the mix the fact that content and messages are exchanged using a different time pattern compared to normal face to face relationships. A message, a profile, a blog post, a twit is sent to the server and then delivered to the intender recipient(s). The recipient(s) reads it, digests it, formulates a response and eventually sends it back. This, to me, contributes to the creation of a world and of a reality that is transformed: what the recipient perceives is the autentically "fake" reality that the sender wants to transmit having lost its immediacy and being tailored to the media chosen to operate upon. Besides the fact that sender and recipient know that the content being generated is public. &lt;br /&gt;I like to think that communities in Facebook (I am not picking on Facebook, it's just an example) are equivalent to the community of house mates in the &lt;a href="http://en.wikipedia.org/wiki/Big_Brother_(TV_series)"&gt;BigBrother&lt;/a&gt; house (or, for argument's sake, to any other reality). The media, the place and being observed changes the behaviour allowing the community (participants and viewers) to create a fake real world. &lt;br /&gt;&lt;br /&gt;So, it seems that social networking is son of its time: it has been made possible by new technologies - higher network speed, new web site capabilities, etc - and it's expression of our current time where appearance rules. &lt;br /&gt;&lt;br /&gt;I have a memory from my infancy: if you're Italian or you watch Italian TV you know about the Mulino Bianco commercial (&lt;a href="http://www.youtube.com/watch?v=pkTVP6XeEFc"&gt;this&lt;/a&gt; is one of the many) which epitomises the (hyper)real world. We (the community of consumers) are let to believe that that is a beautiful real place with a real family where - obviously - plumcakes and brioches are soft and tasty.&lt;br /&gt;&lt;br /&gt;Is there any difference between the Mulino Bianco ad and any of the profiles in Facebook? Let alone the style and the manufacture - Facebook users may not be professional advertisers - the communality is that both are hyperworld where the authors want the recipients to walk in and live the life they want them to live.&lt;br /&gt;&lt;br /&gt;In this context let me fool around. If hyperreality is made of hyperreal facts and hyperreal events that exist in a hyperreal world, then Twitter allows users to exchange hyperreal facts; MySpace and Facebook as hyperreal multi-worlds; SecondLife as real hyperreal world.&lt;br /&gt;&lt;br /&gt;The astute reader may now say that hyperreality is just a play on words, people make real money with this sites, businesses and enterprises back them up. It depends, it's a matter of prospective. Vegas and its casinos is extreme hyperreality made true. Punters entering a casino get in a manufactured hyperreal place where everything is obviously fake to let you believe that our money is fake too. Incidentally, those who think that your money isn't fake are casino owners who live in the real reality of gambling business.&lt;br /&gt;&lt;br /&gt;So, who's making real money in this hyperreal world? I guess those who are able to spoil the user data by aggregating it and extract useful market information, for example. I suspect that biases will eliminate each other when aggregated, providing the clever data manager with information to use at his like (hopefully within the boundaries of the data protection acts).&lt;br /&gt;&lt;br /&gt;A real example is available &lt;a href="http://blog.kiwitobes.com/?p=58"&gt;here&lt;/a&gt;: it describes how Amazon makes money using information extracted by user generated data. &lt;br /&gt;  &lt;br /&gt;Yes, clearly this is a win-win situation. Community members get value by being able to cultivate their social aspirations, voyeurism, need to be heard, trend and fashion, benefiting of other members' experience. Providers - on the other side - are able to target established communities by processing generating data, aggregating it with the purpose of extracting financially useful information (read the &lt;a href="http://www.startup-review.com/blog/facebook-case-study-offline-behavior-drives-online-usage.php"&gt;Facebook case study&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;I am sure there's more to say. I stop now but I am interested to hear from you, dear reader, your view on this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3373195159242410478?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3373195159242410478/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3373195159242410478' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3373195159242410478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3373195159242410478'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/hyperreality-of-social-networking.html' title='The (hyper)reality of social networking'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3829964971314564247</id><published>2008-06-07T11:34:00.009+01:00</published><updated>2008-06-07T19:47:40.022+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='robyne dunne'/><category scheme='http://www.blogger.com/atom/ns#' term='pop'/><category scheme='http://www.blogger.com/atom/ns#' term='led zeppelin'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='stairway to heaven'/><title type='text'>Covering the obvious</title><content type='html'>I was listening to &lt;a href="http://www.ledzeppelin.com/"&gt;Led Zeppelin&lt;/a&gt; whilst doing the &lt;a href="http://smartrics.blogspot.com/2008/05/restyling-home.html"&gt;restyling job&lt;/a&gt; at home and acknowledging how popular some of their songs are. Obviously Stairway to Heaven is amongst those... so I started wondering how many covers have been published in almost 40 years. I started digging the YouTube website, but, funny enough, at the same time I found that Ernesto Assante - a famous italian music critic - &lt;a href="http://assante.blogautore.repubblica.it/2008/06/06/stairway-forever/"&gt;did it all&lt;/a&gt; for me by listing on his blog the most unusual covers of that masterpiece. The one I like amongst those he's listing is the version of &lt;a href="http://www.robynedunn.com.au/"&gt;Robyne Dunne&lt;/a&gt;, very 80s' and colorful. Here it is:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/eG2pwxWVHCo&amp;amp;hl=en"&gt;&lt;embed src="http://www.youtube.com/v/eG2pwxWVHCo&amp;amp;hl=en" type="application/x-shockwave-flash" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&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/8326467133854092913-3829964971314564247?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3829964971314564247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3829964971314564247' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3829964971314564247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3829964971314564247'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/covering-obvious.html' title='Covering the obvious'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-5470758609605091473</id><published>2008-05-31T21:37:00.003+01:00</published><updated>2008-06-01T02:54:53.527+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='decorating'/><category scheme='http://www.blogger.com/atom/ns#' term='lean'/><category scheme='http://www.blogger.com/atom/ns#' term='diy'/><category scheme='http://www.blogger.com/atom/ns#' term='floor'/><title type='text'>Agile restyling</title><content type='html'>Whilst my wife and son are away I took few days off at work and started to mess with the floor and the walls in the corridor of my house.&lt;br /&gt;I am a brave man... with the help of a DIY book, some imagination and memories of a decorator who worked in my parents' house 20 odd years ago, I started taking off the horrible green carpet I found when I moved in. Surprise! Under the carpet there was an even more horrible black and red vinyl tiles floor stuck on the floor boards. Three days of hammering off the tiles inch by inch with a chisel didn't do the job: I had to hire a &lt;a href="http://www.floor-sanders-for-hire.co.uk/edge%20sander.jpg"&gt;floor sander&lt;/a&gt; and use 7 &lt;a href="http://en.wikipedia.org/wiki/Sandpaper#Grit_sizes"&gt;P24&lt;/a&gt; - amongst the coarsest - sand paper disks to get rid of the mixture of plastic and glue stuck in the 6 square mt area I am working on.&lt;br /&gt;I took off the skirting boards and a portion of the wall plaster and redid all the necessary fixes to modernise the look and feel. I started four days ago and am now at the stage of painting all the surfaces i can pass a brush on.&lt;br /&gt;Plenty to do and little time! No new news then.&lt;br /&gt;&lt;br /&gt;I am learning though... a lot of things! I am practicing day by day (and mistake by mistake) new manual skills: lying undercoat and plaster, sanding, varnishing, painting and I haven't even started with the wood. But I am (re)discovering how to relax by doing manual activities: I am on my own, I am not under pressure to finish (yet!) and I can take my time whilst listening to my music. I am also fooling around by trying to apply &lt;a href="http://agilemanifesto.org/"&gt;agile techniques&lt;/a&gt; to my day to day activities. Ok, there's a conflict of interest (I am the customer &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt; the development team) but I avoided a big upfront design and I am organising my activities to best respond to changing circumstances - this in fact has helped: I found on Friday that I have a meeting in London on Monday that I don't want to miss and this has forced a re-org of my activities.&lt;br /&gt;In practice, I have a list of things I need to do and it's comprehensive to the best of my knowledge to date. I keep adding (or removing) to-do items as and when they come and re-prioritise the list every day: I pick the next to-do item from the list and do it, depending on what makes sense doing (I am the customer after all), what I fancy doing (as I am the developer too). I tend also to organise the list to minimise waste (of time mainly) taking into account task dependencies (take off the carpet before lying the new floor) and minimise the risks (paint the wall before lying the floor, because the paint may drip on it!)&lt;br /&gt;The only visible side effect is that I need to go frequently to the nearby DIY shop to buy stuff. Not a big deal though, it's only 2 miles away, and it's also an excuse to see the cloudy sky.&lt;br /&gt;&lt;br /&gt;PS: amazingly, when I took one of the skirting board off the wall, I found a little book published by Lloyds Bank with the list of cash points in the whole UK - all in 6 pages, mind you - and a 2p coin. Respectively dated 1973 and 1974.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-5470758609605091473?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/5470758609605091473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=5470758609605091473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5470758609605091473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5470758609605091473'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/restyling-home.html' title='Agile restyling'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-838994140511685615</id><published>2008-05-31T17:35:00.001+01:00</published><updated>2008-06-01T02:55:22.139+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uncle'/><category scheme='http://www.blogger.com/atom/ns#' term='zio'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='commodore 64'/><title type='text'>Uncle Pino</title><content type='html'>Sadly today my uncle Pino passed away.  He was a fine musician who played guitar and bass and toured the world with many famous Italian artists including &lt;a href="http://en.wikipedia.org/wiki/Domenico_Modugno"&gt;Domenico Modugno&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Nini_Rosso"&gt;Nini Rosso&lt;/a&gt;. He also published records: the one I can very well remember is titled Marmalade, back in the late 70's (copies are &lt;a href="http://cgi.ebay.it/ws/eBayISAPI.dll?ViewItem&amp;amp;item=160241041736&amp;amp;indexURL="&gt;on sale&lt;/a&gt; on eBay.it at the time of writing).&lt;br /&gt;I still remember the story that granma Teresa used to tell me, when I was a little boy, of him leaving Sicily when he turned 18 to fulfill his dream of being a musician.&lt;br /&gt;And I'll be always grateful to him for having bought in Rome in March 1985, on behalf of my parents, a - very much desired - &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt;: my parents' present for my birthday. (That machine started my passion for computers and programming).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-838994140511685615?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/838994140511685615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=838994140511685615' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/838994140511685615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/838994140511685615'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/uncle-pino.html' title='Uncle Pino'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-7277658101205753477</id><published>2008-05-31T10:32:00.001+01:00</published><updated>2008-12-10T04:39:37.790Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='boss'/><category scheme='http://www.blogger.com/atom/ns#' term='emirate'/><category scheme='http://www.blogger.com/atom/ns#' term='springsteen'/><category scheme='http://www.blogger.com/atom/ns#' term='concert'/><category scheme='http://www.blogger.com/atom/ns#' term='gig'/><title type='text'>The Boss is in town!</title><content type='html'>Great show! Probably the best I have seen in years. Bruce Springsteen and the  E Street Band have played at the - almost full - Emirate Stadium in London a 3 hours gig with a mixture of old and new stuff. You won't believe how that 62 years old man was able to excite the crowd running up and down the stage shouting and playing Badlands, Born To Run, Thunder road (my favourite), Rosalita, Lonesome Day and so on.&lt;br /&gt;He also had time to pass on to us a couple of (silly) jokes about English stereotypes: the weather - today was a sunny day after a miserable week of clouds and rain - and T time. Anyway... I took two pictures with my mobile, one before the start of the concert when the stadium was filling up, the other when it was dark already so the quality is pitiful, so you'll have to guess.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SEG1tuHSeVI/AAAAAAAAAAY/7g4Fmadeqzc/s1600-h/waiting+for+the+boss.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SEG1tuHSeVI/AAAAAAAAAAY/7g4Fmadeqzc/s320/waiting+for+the+boss.jpg" alt="" id="BLOGGER_PHOTO_ID_5206642441294346578" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/SEG2T-HSeWI/AAAAAAAAAAg/ga5rI9VE2cw/s1600-h/the+boss+gig+started.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/SEG2T-HSeWI/AAAAAAAAAAg/ga5rI9VE2cw/s320/the+boss+gig+started.jpg" alt="" id="BLOGGER_PHOTO_ID_5206643098424342882" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-7277658101205753477?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/7277658101205753477/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=7277658101205753477' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7277658101205753477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7277658101205753477'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/boss-is-in-town.html' title='The Boss is in town!'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HA4XCmK8W8I/SEG1tuHSeVI/AAAAAAAAAAY/7g4Fmadeqzc/s72-c/waiting+for+the+boss.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-244506272050787527</id><published>2008-05-30T00:13:00.001+01:00</published><updated>2008-06-01T02:57:57.697+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cot death'/><category scheme='http://www.blogger.com/atom/ns#' term='flat head'/><category scheme='http://www.blogger.com/atom/ns#' term='plagiocephaly'/><category scheme='http://www.blogger.com/atom/ns#' term='sleep'/><category scheme='http://www.blogger.com/atom/ns#' term='brachycephaly'/><category scheme='http://www.blogger.com/atom/ns#' term='flat head syndrome'/><title type='text'>Fighting cot death and side effects</title><content type='html'>It's today's &lt;a href="http://news.bbc.co.uk/1/hi/health/7426082.stm"&gt;news&lt;/a&gt; that some cases of cot death may be caused by bacterial infections.&lt;br /&gt;&lt;br /&gt;If you have a child it's likely that a pediatrician (or equivalent) has told you about &lt;a href="http://www.fsid.org.uk/cot-death.html"&gt;cot death&lt;/a&gt; - the death of an infant that is apparently inexplicable.&lt;br /&gt;&lt;br /&gt;When my son Jacopo was born (19 months ago) we were told when we left the hospital just after he was born. We were also told few things to do to minimise the chances that this horrible situation may occur to us: don't smoke nearby your newborn, don't let him sleep in our bed and - above all - put him to  sleep on his back (an not on his tummy, as commonly practiced until  about 15 years ago).&lt;br /&gt;&lt;br /&gt;All nice and easy. But...&lt;br /&gt;&lt;br /&gt;But nobody told us of a naughty side effect of one of these simple practices. If your child always stays on his back (and most of his time he/she does as babies sleep more than 12h a day - also, our one actually disliked being put on his tummy even when he was awake) he/she may develop the flat head syndrome. This is a cosmetic syndrome whereby the soft skull of the baby flattens. It's - clearly - caused by the fact that the baby lies face up with the back of his head on a not so soft surface (soft pillows should not be used with newborns).&lt;br /&gt;&lt;br /&gt;As said we weren't told and Jacopo developed a minor flat  head on the right side of his skull. We were told by the pediatrician, after we realised it when he was 9 months old, not to worry, that it'll normalise by the time he's two (it hasn't yet, and we're 5 months away from his second birthday) and that this might have happened. We were told of tricks to play to encourage him to turn his head more frequently - move toys from one side of the bed to the other - and optionally to buy a specially made pillow. In the most extreme cases an helmet may be required but it wasn't our case.&lt;br /&gt;&lt;br /&gt;Well, to the point... why nobody told us of what might have happened? Obviously preventing cot death is of highest priority, but making parents aware of side effects of having the baby sleep on his back is also important. So, if you're in the same situation we were a year and a half ago, invent something and have your baby move the head when he's awake. He'll be grateful when he'll grow up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-244506272050787527?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/244506272050787527/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=244506272050787527' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/244506272050787527'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/244506272050787527'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/my-first-post.html' title='Fighting cot death and side effects'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-1956676589856588298</id><published>2008-05-28T20:45:00.000+01:00</published><updated>2008-06-01T03:46:21.590+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='practices'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='build'/><category scheme='http://www.blogger.com/atom/ns#' term='toolbox'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Agile 2008 - we'll be there!</title><content type='html'>We are finalising our work for &lt;a href="http://www.agile2008.org/"&gt;Agile 2008&lt;/a&gt;. I led two teams that submitted &lt;a href="http://submissions.agile2008.org/node/506"&gt;two&lt;/a&gt; &lt;a href="http://submissions.agile2008.org/node/1929"&gt;sessions&lt;/a&gt; at the conference this August in Toronto, Canada. We had them accepted and the two papers will be published in the proceedings. We're now in the process of writing a summary of the sessions for the conference agenda. Here they follow&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;What's in the toolbox of a successful software craftsman?&lt;/b&gt;&lt;br /&gt;Have you ever wanted to know which tools a big distributed team of successful software craftsman use to implement their user stories? How they configure them to support agile development based on XP and Scrum and deliver to the agreed plan? This session will answer these questions and more. Three representatives of this team will tell you what’s in their toolbox and how the toolbox supports four core agile practices that the team adopts to succeed: maximum project status visibility, effective communication, immediate feedback and ruthless automation.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Pushing the boundaries of testing and Continuous Integration&lt;/b&gt;&lt;br /&gt;In this session, three representatives of an agile team will show how an automated build that executes robustness, scalability and performance tests helped them drastically improve the quality of their highly concurrent application server. They will also show how the team configured such builds in their continuous integration environment as well as what performance and robustness metrics they monitored. Finally, the team will show how valuable and effective this investment has been for capturing bugs and performance-related issues very early in their development process.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;I look forward to get there: I'll hopefully meet people I already had the chance to talk to in the past (&lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt; and &lt;a href="http://www.jbrains.ca/"&gt;JB&lt;/a&gt;) and people I only recently had the honour to collaborate with (&lt;a href="http://www.xprogramming.com/"&gt;Ron Jeffries&lt;/a&gt; and &lt;a href="http://www.manfred-lange.com/"&gt;Manfred Lange&lt;/a&gt; - who reviewed our papers for the conference).&lt;br /&gt;&lt;br /&gt;I'll keep you posted!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-1956676589856588298?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/1956676589856588298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=1956676589856588298' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1956676589856588298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/1956676589856588298'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/agile-2008-well-be-there.html' title='Agile 2008 - we&apos;ll be there!'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-335677665202507254</id><published>2008-05-24T23:07:00.001+01:00</published><updated>2008-06-07T12:23:47.324+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='first'/><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='yaub'/><category scheme='http://www.blogger.com/atom/ns#' term='scripta manent'/><title type='text'>And now a public blog</title><content type='html'>Subtitle: do I really need to do this?&lt;br /&gt;&lt;br /&gt;Hello reader! Welcome to  YAUB (yet another useless blog). I have decided to join the public blogsphere. The more obvious reasons are that I hope to practice my writing and use this tool to "remember" and "share" stuff (&lt;a href="http://www.thebookmarkshop.com/latin/latinquoteideas.htm"&gt;scripta manent&lt;/a&gt;, after all). Specifically things that I happen to be doing during my life. About the &lt;i&gt;real&lt;/i&gt; motivation, don't ask, I am still looking for it: I suppose it all has to do with the fact that humans are social animals and that they achieve well being by participating to social life and the like. We'll see how it goes...&lt;br /&gt;&lt;br /&gt;Actually, I have been publishing posts in a blog in the intranet of &lt;a href="http://web21c.bt.com"&gt;my company&lt;/a&gt; for few months; now that I am doing the leap I'll migrate my old posts soon so you can enjoy them too. So you'll eventually see posts that are older than this one once I finish my copy and paste job.&lt;br /&gt;&lt;br /&gt;Cya!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-335677665202507254?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/335677665202507254/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=335677665202507254' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/335677665202507254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/335677665202507254'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/05/and-now-public-blog.html' title='And now a public blog'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-5755219295239942071</id><published>2008-04-29T12:46:00.001+01:00</published><updated>2008-06-02T23:06:11.826+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipsecon'/><category scheme='http://www.blogger.com/atom/ns#' term='wpf'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='swt'/><title type='text'>Microsoft and Open Source</title><content type='html'>It's very interesting to note the Microsoft's involvment in the Open Source (or open source) arena.&lt;br /&gt;I came across &lt;a href="http://www.eclipsecon.org/2008/index.php?page=sub/&amp;amp;id=538"&gt;this presentation&lt;/a&gt; held by &lt;a href="http://samus.typepad.com/"&gt;Sam Ramji&lt;/a&gt; - director of the Open Source Lab at Microsoft - at the latest &lt;a href="http://www.eclipsecon.org/2007/"&gt;EclipseCon&lt;/a&gt;. It shows how Microsoft and &lt;a href="http://www.eclipse.org/"&gt;Eclipse Foundation&lt;/a&gt; are working together on making &lt;a href="http://www.eclipse.org/higgins/"&gt;Higgins&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Windows_CardSpace"&gt;CardSpace&lt;/a&gt; interoperable and on building &lt;a href="http://www.eclipse.org/swt/"&gt;SWT&lt;/a&gt; on top of &lt;a href="http://msdn.microsoft.com/en-us/netframework/aa663326.aspx"&gt;WPF&lt;/a&gt; (to let Eclipse shine on Vista).&lt;p&gt;&lt;/p&gt;One thought coming on my mind: how long is it going to take to have Visual Studio as an Eclipse plug-in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-5755219295239942071?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/5755219295239942071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=5755219295239942071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5755219295239942071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5755219295239942071'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/microsoft-and-open-source.html' title='Microsoft and Open Source'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3659965301589377822</id><published>2008-04-18T23:09:00.001+01:00</published><updated>2008-06-02T23:24:59.488+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='mccabe'/><category scheme='http://www.blogger.com/atom/ns#' term='metrics'/><category scheme='http://www.blogger.com/atom/ns#' term='release planning'/><category scheme='http://www.blogger.com/atom/ns#' term='brown bag'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='cyclomatic complexity'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='day0'/><title type='text'>Planning in Cork and Cyclomatic Complexity</title><content type='html'>I am in charge of prepping the Day0 happening in Cork, for the next Release Planning of the &lt;a href="http://web21c.bt.com"&gt;Web21C SDK&lt;/a&gt; Team. &lt;br /&gt;&lt;br /&gt;A bit of background: Day0 tradition started a year ago (at the Dublin Release Planning) as an opportunity for the whole team members (located between London, Ipswich, Denver in US) to meet and share knowledge. It happens the day before Release Planning - hence the name - and involves technical presentations and discussions on topics selected by a small number of members and presented to the whole team in - typically - two or three streams.&lt;br /&gt;&lt;br /&gt;The process is quite interesting as we're organising the event as a mix of &lt;a href="http://en.wikipedia.org/wiki/Open-space_meeting"&gt;Open Space&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Unconference"&gt;Unconference&lt;/a&gt;. I have asked people to sign up for sessions to present and for topics to discuss at the &lt;a href="http://www.xpday.org/session_formats/goldfish_bowl"&gt;Gold Fish Bowl&lt;/a&gt; at the end of the day. (Yeah, I know that a preset agenda is not truly Open Space, but it'll help me to manage the hotel resources and keep people focussed, whilst having the attendee to comment and provide feedback to the presenters - and whoever has something to say on the day can book his session at the start of the day on a properly prepared sheet)&lt;br /&gt;&lt;br /&gt;I am confident that the event will be as successful as the one I organised in Glasgow last January.&lt;br /&gt;&lt;br /&gt;I am even attempting to present two sessions although I have the feeling it's going to be too much, being now involved on preparing the two papers for &lt;a href="http://agile2008.org"&gt;Agile 2008&lt;/a&gt; the release of the Messaging capability at the back of the &lt;a href="http://web21c.bt.com"&gt;Web21C SDK&lt;/a&gt; next 28th of April and the Brown Bag at the end of May.&lt;br /&gt;&lt;br /&gt;Anyway, one of the sessions I was thinking to present is on software metrics and refactoring complexity out of code. The goods the bads and the evils of metrics and how they work as triggering alarms on spotting complexity in the design and implementation. I am thinking how to best make use of those numbers without being too mental on making them nice and round. Especially the &lt;a href="http://en.wikipedia.org/wiki/Cyclomatic_complexity"&gt;Cyclomatic Complexity&lt;/a&gt;, which I find quite useful as an indication of the complexity of the code. In fact with &lt;a href="http://eclipse.org"&gt;Eclipse&lt;/a&gt; and the &lt;a href="http://eclipse-cs.sourceforge.net"&gt;Checkstyle plugin&lt;/a&gt;, it's possible to get the number on the fly. Another useful application of the McCabe number (the other alias of the CC) is to get an indication on how many tests are required to fully cover untested code - useful clearly when you inherit untested code.&lt;br /&gt;&lt;br /&gt;I'll think of writing a more extensive post once I finish the presentation&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3659965301589377822?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3659965301589377822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3659965301589377822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3659965301589377822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3659965301589377822'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/04/planning-in-cork-and-cyclomatic.html' title='Planning in Cork and Cyclomatic Complexity'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-2433376424869193397</id><published>2008-04-18T13:56:00.003+01:00</published><updated>2008-06-02T23:05:27.661+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='utf8'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='euro'/><category scheme='http://www.blogger.com/atom/ns#' term='pound'/><title type='text'>Euro and Pound signs in Java</title><content type='html'>&lt;p&gt;&lt;b&gt;Never&lt;/b&gt; use € (euro) and £ (pound) symbols in a Java src file. If you do you're asking for trouble. Rather use their unicode prepresentation (and possibly a comment telling readers what that unicode represents), that is:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;public static final char EURO = '\u20AC';&lt;/pre&gt;&lt;pre&gt;public static final char POUND = '\u00A3';&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;The main problem occurs when your src is meant to be managed in a windows platform (where encoding is by default &lt;span style="font-family:courier new;"&gt;Cp1252&lt;/span&gt;) &lt;span style="font-weight: bold;"&gt;and&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; in a Linux platform (where encoding is by default &lt;span style="font-family:courier new;"&gt;UTF-8&lt;/span&gt;).&lt;br /&gt;Unless you have to, then, don't use them. If you really have to, the option is to share between the platforms the same encoding.&lt;/p&gt;&lt;p&gt;You may need to consider&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;pre&gt;-Dfile.encoding&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Use the same encoding in both platforms by passing to the ant &lt;span style="font-family:courier new;"&gt;&lt;javac&gt;&lt;/javac&gt;&lt;/span&gt; the encoding attribute&lt;/li&gt;&lt;li&gt;Change the default workspace encoding in eclipse (windows/general/workspace) and set it to &lt;span style="font-family:courier new;"&gt;UTF-8&lt;/span&gt; (bear in mind that then your € and £ wont be visible anyway)&lt;/li&gt;&lt;/ol&gt;Obviously this happens for any other outside &lt;span style="font-family:courier new;"&gt;US-ASCII&lt;/span&gt; char that is not represented in &lt;span style="font-family:courier new;"&gt;UTF-8&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-2433376424869193397?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/2433376424869193397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=2433376424869193397' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2433376424869193397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/2433376424869193397'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/04/euro-and-pound-signs-in-java.html' title='Euro and Pound signs in Java'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3960318800105224826</id><published>2008-03-18T23:26:00.000Z</published><updated>2008-06-02T23:34:29.502+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><title type='text'>Sacrificing quality?</title><content type='html'>&lt;blockquote&gt;Not compromising on quality is not only your professional obligation but it is also important for your own joy of work and is critical for the company. &lt;span style="font-style: italic;"&gt;(Ken Schwaber)&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;My take on this is that compromising by skimming on &lt;em&gt;test-dev-refactor&lt;/em&gt; loop (by eliminating refactor and/or test) is &lt;b&gt;BAD&lt;/b&gt;. But working &lt;b&gt;with&lt;/b&gt; the customer and negotiate a delivery of  a &lt;a href="http://en.wikipedia.org/wiki/Fiat_126"&gt;Fiat 126&lt;/a&gt; rather than an &lt;a href="http://en.wikipedia.org/wiki/Ferrari_F430"&gt;F430&lt;/a&gt; at the end of the current release is something to encourage if resources and time are tight, in the spirit of the pure iterative approach. After all, if the business problem is "I need to drive from home to work", that is a perfectly valid solution to it.&lt;br /&gt;&lt;br /&gt;This is what Jeff Patton was talking about at the &lt;a href="http://www.xpday.org/keynotes"&gt;last XPDay in London&lt;/a&gt; when  he  was talking about sacrificing quality if time/resources are scarce.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3960318800105224826?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3960318800105224826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3960318800105224826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3960318800105224826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3960318800105224826'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/sacrificing-quality.html' title='Sacrificing quality?'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-4861304060492726606</id><published>2008-02-18T23:34:00.001Z</published><updated>2008-06-02T23:38:26.857+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='language'/><category scheme='http://www.blogger.com/atom/ns#' term='pizza'/><title type='text'>Babylon IT</title><content type='html'>&lt;a href="http://www.hypernews.org/HyperNews/get/computing/lang-list.html"&gt;Interesting page&lt;/a&gt; on computer languages. It shows a (maybe) complete list of existing computer languages (alive and dead) and their main features. Quite unsurprisingly there are languages I have never heard of. And also some with amusing names, like &lt;a href="http://en.wikipedia.org/wiki/Pizza_(programming_language)"&gt;Pizza&lt;/a&gt;. Also a good source for links to external websites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-4861304060492726606?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/4861304060492726606/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=4861304060492726606' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4861304060492726606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/4861304060492726606'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/babylon-it.html' title='Babylon IT'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6173874040405341070</id><published>2008-02-11T23:39:00.000Z</published><updated>2008-06-02T23:43:00.630+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='springring'/><category scheme='http://www.blogger.com/atom/ns#' term='osgi'/><category scheme='http://www.blogger.com/atom/ns#' term='aloha'/><category scheme='http://www.blogger.com/atom/ns#' term='technologies'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Java top 5 technologies to learn during 2008</title><content type='html'>I receive regularly emails from several technology sites. This time one carried an interesting link to a blog entry describing the &lt;a href="http://www.manageability.org/blog/stuff/five-java-technologies-to-learn-in-2008"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;top 5 technologies to learn in 2008&lt;/a&gt;. Some interesting ones, a side the usual web 2.0 ones, are OSGI (at #5) and Cloud computing (at #1). I have been exposed recently to cloud computing and grid computing doing scalability work for &lt;a href="https://trac.osmosoft.com/Aloha"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;SpringRing&lt;/a&gt; (now Aloha). But, I must admit, I was not aware of OSGI.&lt;br /&gt;Oh dear, something else on the stack.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6173874040405341070?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6173874040405341070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6173874040405341070' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6173874040405341070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6173874040405341070'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/java-top-5-technologies-to-learn-during.html' title='Java top 5 technologies to learn during 2008'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-583551975486698435</id><published>2007-12-28T02:43:00.000Z</published><updated>2008-06-02T23:46:50.922+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='high availability'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='load balancer'/><category scheme='http://www.blogger.com/atom/ns#' term='springring'/><category scheme='http://www.blogger.com/atom/ns#' term='aloha'/><category scheme='http://www.blogger.com/atom/ns#' term='ultramonkey'/><category scheme='http://www.blogger.com/atom/ns#' term='topology'/><title type='text'>Go apes with UltraMonkey</title><content type='html'>&lt;div class="wiki-content"&gt;         &lt;p&gt;I have been recently exposed to &lt;a href="http://www.ultramonkey.org/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;UltraMonkey&lt;/a&gt; as part of my daily job on SpringRing (now Aloha). UltraMonkey is a solution for load balancing and high availability of network services. We are using it to load balance the SimpleSipStack instances to experiment the stack scalability. It works quite well and it has - good! - native SIP support.&lt;/p&gt;  &lt;p&gt;Well, UM is essentially a bunch of Linux tools that you configure to &lt;a href="http://www.ultramonkey.org/3/topologies/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;implement the topology&lt;/a&gt; you want (Load Balancer, Load Balancer + High Availability, ...).&lt;/p&gt;  &lt;p&gt;Downloads are available tarballs or RedHat rpms or Debian packages, so installation in our Suse 9 was quite far from straightforward but in the end configuration is very easy, at least for the load balancer topology.&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Pros&lt;/em&gt;: it's easy and quite powerful, it runs on Linux, it's cheap&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Cons&lt;/em&gt;: you need to be more than a newbie on networking to really understand how it works and how to best make use of it. On the good side, it's a good opportunity to learn new stuff &lt;/p&gt;         &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-583551975486698435?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/583551975486698435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=583551975486698435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/583551975486698435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/583551975486698435'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2007/12/go-apes-with-ultramonkey.html' title='Go apes with UltraMonkey'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-5973572674584780409</id><published>2007-11-28T13:59:00.000Z</published><updated>2008-06-02T23:50:10.682+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='infoq'/><category scheme='http://www.blogger.com/atom/ns#' term='spring framework'/><title type='text'>Two links for the readers</title><content type='html'>Today's browsing activity was quite interesting. I ended up reading an &lt;a href="http://www.infoq.com/articles/spring-2.5-part-1"&gt;article&lt;/a&gt; on &lt;a href="http://www.springframework.org/"&gt;Spring Framework&lt;/a&gt; 2.5 on &lt;a href="http://www.infoq.com/"&gt;InfoQ&lt;/a&gt; and, digging around I came across &lt;a href="http://web2.econsultant.com/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;this portal&lt;/a&gt; for web 2.0 stuff.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-5973572674584780409?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/5973572674584780409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=5973572674584780409' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5973572674584780409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/5973572674584780409'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/two-links-for-readers.html' title='Two links for the readers'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-7328398456186052748</id><published>2007-11-23T22:41:00.004Z</published><updated>2008-06-03T00:29:30.371+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fitnesse'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='craftsman'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='scrumworks'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='toolbox'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='xpday'/><title type='text'>XPDay 2007</title><content type='html'>&lt;span style="font-weight: bold;"&gt;XPDay 2007 - cool agile conference in London (19/20 Nov 07)&lt;/span&gt;&lt;br /&gt;Organised also by those running the &lt;a href="http://www.xpdeveloper.net/xpdwiki/Wiki.jsp?page=XtC"&gt;Extreme Tuesday Club&lt;/a&gt;, &lt;a href="http://www.xpday.org/"&gt;XPDay&lt;/a&gt; has reached his seventh birthday. From what people in the Agile world say, the conference is one of the best around for various reasons. Firstly, it's very small and organizers are very friendly, so there's a relaxed and friendly atmosphere. Secondly chairs are very good and competent and usually the level of the talks is higher than average. Thirdly the organisers have a good taste on choosing venue and pubs (for the meeting after the talks). Lastly, it's cheap :D&lt;br /&gt;&lt;p&gt;Therefore it's a nice place to be in, especially if you're involved on presenting as I was (with three other buddies from the &lt;a href="http://web21c.bt.com/" haref="http://web21c.bt.com"&gt;Web21C&lt;/a&gt;&lt;a href="http://web21c.bt.com/"&gt; SDK&lt;/a&gt; team).&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Our session&lt;/span&gt;&lt;br /&gt;Back in May (I think), when call for papers opened I had the idea to write a follow up to the &lt;a href="http://smartrics.blogspot.com/2008/06/xp2007.html" title="XP2007" linktype="raw" linktext="presentation|XP2007"&gt;presentation&lt;/a&gt;  I and Paul Karsten did at XP2007 in Como. I felt that then we didn't tell the whole story. In Como we had a poster (and a paper) telling how the &lt;a href="http://web21c.bt.com/"&gt;Web21C&lt;/a&gt; team was created and how it evolved. We concentrated on the practices followed and, marginally, touched the tools we used.&lt;br /&gt;&lt;p&gt;So I thought to prepare a session to complete the story of the journey I have been doing in the past two years by expanding on the tools.&lt;/p&gt;&lt;a href="http://www.linkedin.com/pub/1/A23/682"&gt;Gabby&lt;/a&gt;, &lt;a href="http://www.linkedin.com/pub/5/142/581"&gt;Nathan&lt;/a&gt; and &lt;a href="http://blog.paulmoser.co.uk/"&gt;Paul&lt;/a&gt; joined me to collaborate. It was great, as each one of us was involved in different parts of the project so we were sure to cover the whole spectrum of tools used within the team (Gabby has been involved on the Web21C SDK itself, Nathan on the Web21C SDK and on the build process, Paul on the Portal).&lt;br /&gt;&lt;br /&gt;Slowly but thoroughly we started "&lt;a href="http://www.xpday.org/node/111"&gt;&lt;b&gt;What's in the toolbox of a successful software craftsman&lt;/b&gt;&lt;/a&gt;". The original idea was of a 45mins session where we were emulating a mini release showing how we were making use of our tools to support our agile development work. After talking to &lt;a href="http://www.xpday.org/user/4"&gt;Angela Martin&lt;/a&gt;, one of the conference organizers, and having been allocated only half hour in total I changed the shape of the presentation. After few meetings with the team we decided to produce a standard slide driven presentation splitting it in 4 parts - to allow everybody to talk.&lt;br /&gt;&lt;p&gt;Being a presentation on tools, there was the risk of falling into a tutorial-like speech which would have defeated the point of presenting at an Agile conference.&lt;/p&gt;The idea ultimately was to talk about tools, but in context of three agile principles that we, in Web21C - either explicitly or inadvertently - have been complying to. Those principles are: &lt;em&gt;High project status visibility&lt;/em&gt;, &lt;em&gt;Fast feedback&lt;/em&gt; and &lt;em&gt;Complete automation of development tasks&lt;/em&gt;.&lt;br /&gt;&lt;p&gt;So we wrote the slides to show people how we were using a bunch of free and open source tools to achieve maximum results on each of these three principles. We picked four of the tools in the toolbox which we believed were the more representative (Eclipse IDE, CruiseControl, Selenium and ScrumWorks).&lt;/p&gt;So... it took - i believe - four or five meeting to get to a definitive and presentable slidepack - it also involved &lt;a href="http://oocode.com/"&gt;Ivan Moore&lt;/a&gt;, our shepherd - assigned to us by the XPDay organisation, who had the role of looking at the format of the slides and helping us on balancing the contenent.&lt;br /&gt;&lt;p&gt;And a week before the day we started rehearsing. I must admit, I was quite nervous at those rehearsals - it has always happened to me.&lt;/p&gt;Then at 3.30pm of Monday 19th of November we delivered. And it went very well. Ivan - who was chairing - and the audience gave us extremely positive feedback. Slides were clear and the message came across smoothly. Moreover we got questions at the Q&amp;amp;A who nicely filled in the available half hour.&lt;br /&gt;&lt;br /&gt;On Tuesday, at the end of the conference, we were also awarded - with a bottle of champagne - of "Best newcomers session at XPDay 2007". From the words of Angela Martin: &lt;em&gt;"...one of the reasons we selected your team's presentation for special mention this year, was not only it did receive good feedback ... but during the conversation's in the pub and during the breaks it was one of the presentations people were talking about and remembering, so well done."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;How nice!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Our poster&lt;/span&gt;&lt;br /&gt;The &lt;a href="http://flickr.com/photos/fabrizioelavinia/2088882090/"&gt;poster&lt;/a&gt; was a latest addition to the pack. The last day of the call for posters I thought that it would have been a good idea to present the Toolbox (in form of a mind map) in the poster session. The original idea for the session included an amount of time  dedicated to experience exchange with the audience. Given that we were told to refactor our slidepack and cut to fill in 30mins and given that I really wanted to see what other people were doing out there, I decided to submit the poster. Yes, it was more work - as I did it on my own - but it was fun and well worth at the end.&lt;br /&gt;&lt;br /&gt;I also thought that, in order to involve people more and to drive them to talk to us, it would have been a good idea to let them update the poster with their own fav tools. And so it went. As soon as Gabby sends me the piccies, I'll upload the mod poster here.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Sessions I went to&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keynote1: Jeff Patton - embrace uncertainty&lt;/b&gt;&lt;br /&gt;A really good session. It opened my mind. Jeff is an authority on user stories writing. To cut it short, it explained very well why Agile projects can get to a mess and why this mess happens when Customer and Developers choose user stories badly.&lt;br /&gt;Doing XP (and agile in general) is not about defining user stories, and then fully implement them iteration by iteration. It never happens like that [&lt;em&gt;I heard somewhere else that this is Scrumfall, the tiny little cousin of RUP or any iterative waterfall-ish approach&lt;/em&gt;].&lt;br /&gt;It's about rethinking what iterative means.&lt;br /&gt;It made the example of a car. It is made of an engine, breaks, wheels, doors, seats and so on. There's no car if at least one of those parts are missing. So, rather than saying let's do the engine, then the wheels then the breaks and so on, without being able to figure out when the end product is going to be ready - there's also the chance to starve the stories at the bottom of the backlog - the right approach would be, lets to a cheap and working engine, breaks, doors and so on. Then iteratively improve the lot to get to the desired result.&lt;br /&gt;The customer sees the end, which is not anymore uncertain. He has an end product. It may not be a Ferrari as he wished, but at least it's something he can drive.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Keynote2: Yvonne Rogers - Cheek to cheek: why co-located collaboration persists&lt;/span&gt;&lt;br /&gt;Rather dull presentation on why colocation is better than remote meeting. Thanks, I hadn't figured it out!&lt;br /&gt;Only thing worth mentioning is that there's some research in progress on how to make co-location even more effective. When a team pairs with one keyboard or brainstorms on a white board, there's one single point of contention - either the keyboard or the marker. This may not be effective as the one with the marker/keyboard is the one driving, possibly precluding the rest of the attendees to express their ideas. There are prototypes of tools (similar to a large flat touch screen that the working team can access and manipulate all together. Educational!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Refactoring databases: evolutionary database design&lt;/span&gt;&lt;br /&gt;It didn't rock my world. DB and OO are two completely different beasts. OO is far more advanced in terms of methods and supporting tools for agile development.&lt;br /&gt;The speaker seemed also to make a point of how culturally DBAs are different than developers.&lt;br /&gt;Bottom line: cut cultural barriers and organise your sql scripst properly to be able to easly manage db changes. Mhhh! Oh well!&lt;br /&gt;Lot's of techniques and tools he was using (ant/CC/subversion) weren't new to me. I can though imagine that they were new for most part of the audience. So after all a good session to remind me how badly I have done DB application in my remote past. It would have been more useful if I was a DBA or if i was spending 90% of my time coding oracle stored procs (Ouch!)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jeff Patton's Master class: mapping user stories.&lt;/span&gt;&lt;br /&gt;Interesting stuff. He did link to the keynote several times. Nothing particularly blowing. One thing though I learned: He introduced the concept of user activities as "high level" stories. Example "Manage emails" vs "send email", "receive email"... His point was that more often than not what really delivers money and value is delivering an activity of the system, made  of user stories. Rather than the user story itself. And the way he suggests doing it is by iteratively incrementing each of teh stories in the activity by going cheap, then augmenting. Good stuff.&lt;br /&gt;I missed the afternoon part of the master class as I did my preso.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Fighting the monster - agile development om top of a legacy database.&lt;/span&gt;&lt;br /&gt;Interesing tutorial on &lt;a href="http://gojko.net/fitnesse/dbfit/"&gt;DbFit&lt;/a&gt; and on how a bunch of developers made possible to wrap an old Db into a nice simple interface hiding the complexity of the db itself.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;A Technical Story&lt;/span&gt;&lt;span style="display: block; font-weight: bold;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;How a team of devs working for a financial company did agile without telling their customer and how they screwd up once when they decided not to implement user stories, rather do what they wanted, that is to implement a fully fledged configuration API. Good stuff - to a certain point.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;But that's crazy! Cognitive Bias in decision making.&lt;/span&gt;&lt;br /&gt;This session was supposed to teach me how to understand why someone (typically someone high up in the food chain) does make decisions sometimes taggable as crazy. In a way it did, or at least it explained me the tools i should use to do so... a bunch of cards with short sentences on ala "People usually takes big risks to avoid loss and does not take small risks to gain advantages"... not my soup but interesting enough as a change.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Fiat Lux: testing with the light on&lt;/span&gt;&lt;br /&gt;Experience report of a company developing software for libraries using technologies not similar to ours. Specifically &lt;a href="http://www.concordion.org/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="nobr"&gt;&lt;a rel="nofollow" linktype="raw" linktext="Concordion|http://www.concordion.org/"&gt;Concordion&lt;/a&gt;&lt;/span&gt;  and &lt;a href="http://blogs.jetbrains.com/teamcity/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="nobr"&gt;&lt;a rel="nofollow" linktype="raw" linktext="Team City|http://www.jetbrains.com/teamcity/"&gt;Team City&lt;/a&gt;&lt;/span&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;Concordion looks like something interesting, although it suffers of the same problems that &lt;a href="http://fitnesse.org"&gt;Fitnesse&lt;/a&gt; has: maintaining the fixture code :(&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The secret backlog - behind every bug-report is a user story&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.testingreflections.com/"&gt;Anthony Marcano&lt;/a&gt; telling us that from a bug theres a test, from a test there must be a story, from a story there's an idex card to stick to the wall. Who needs Jira anymore.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Specification by (executable) example: Prosperity of the FITtest&lt;/span&gt;&lt;br /&gt;experience report on using Fitnesse!  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-7328398456186052748?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/7328398456186052748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=7328398456186052748' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7328398456186052748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/7328398456186052748'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2007/11/xpday-2007.html' title='XPDay 2007'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-230652237958185542</id><published>2007-11-05T23:51:00.001Z</published><updated>2008-12-10T04:39:38.292Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='jfreechart'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='charts'/><title type='text'>Charts in Java</title><content type='html'>Today I found this nice litter library that allows developers to produce charts out of data &lt;a href="http://www.jfree.org/jfreechart"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a rel="nofollow"&gt;JFreeChart&lt;/a&gt;. I was up and running in 1/2 h - the issue was to generate a simple plot of some performance data we collect during our performance build.&lt;br /&gt;&lt;br /&gt;Anyway - this is the graph produced out of some dummy data in my local database.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SER5x-HSebI/AAAAAAAAABM/ZMoSuTeGpEg/s1600-h/unitPerSecond.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SER5x-HSebI/AAAAAAAAABM/ZMoSuTeGpEg/s320/unitPerSecond.jpg" alt="" id="BLOGGER_PHOTO_ID_5207420968541256114" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-230652237958185542?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/230652237958185542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=230652237958185542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/230652237958185542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/230652237958185542'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2007/11/charts-in-java.html' title='Charts in Java'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HA4XCmK8W8I/SER5x-HSebI/AAAAAAAAABM/ZMoSuTeGpEg/s72-c/unitPerSecond.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-3739979718134644330</id><published>2007-11-01T23:54:00.000Z</published><updated>2008-06-03T00:00:38.950+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='delicious'/><category scheme='http://www.blogger.com/atom/ns#' term='openspaces'/><category scheme='http://www.blogger.com/atom/ns#' term='terracotta'/><category scheme='http://www.blogger.com/atom/ns#' term='high scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='springring'/><category scheme='http://www.blogger.com/atom/ns#' term='scalability'/><category scheme='http://www.blogger.com/atom/ns#' term='aloha'/><title type='text'>Scalability resources</title><content type='html'>In my project (&lt;a href="http://trac.osmosoft.org/Aloha"&gt;SpringRing&lt;/a&gt;, now Aloha) the metaphore for this cycle is "make it scalable". So, in order to document myself on the topic I have lurked the Internet and found these interesting websites/products&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;    &lt;li&gt; &lt;a href="http://www.terracotta.org/"&gt;Terracotta&lt;/a&gt;&lt;br /&gt;    &lt;li&gt; &lt;a href="http://www.gigaspaces.com/wiki/display/GS6/OpenSpaces+Overview"&gt;Open Spaces&lt;/a&gt;&lt;br /&gt;    &lt;li&gt; &lt;a href="http://highscalability.com/"&gt;High scalability&lt;/a&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Especially the last one is a great source of information on the topic of scalability.&lt;br /&gt;&lt;br /&gt;I bookmarked these and others in my &lt;a href="http://del.icio.us/fab_can/scalability"&gt;del.icio.us archive&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please let me know if you have any other pointers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-3739979718134644330?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/3739979718134644330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=3739979718134644330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3739979718134644330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/3739979718134644330'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/scalability-resources.html' title='Scalability resources'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-159198952366174465</id><published>2007-06-26T22:20:00.000+01:00</published><updated>2008-06-02T22:41:24.791+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='xp2007'/><category scheme='http://www.blogger.com/atom/ns#' term='como'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='sdk'/><category scheme='http://www.blogger.com/atom/ns#' term='xp'/><title type='text'>XP2007</title><content type='html'>A week in Lake Como at the &lt;a href="http://www.xp2007.org/"&gt;XP2007 conference&lt;/a&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;The experience report&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We were there to present our &lt;a href="http://www.springerlink.com/content/27672461nl24g630/"&gt;experience report&lt;/a&gt;, to attend some of the most interesting tutorial/workshops and to meet and discuss with people. The experience report title is &lt;i&gt;"The creation of a distributed agile team"&lt;/i&gt; and talks about the story of building the Web21C SDK team from its inception to the current days.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The proceedings&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The paper book is available to buy from the &lt;a href="http://www.springer.com/uk/home/generic/search/results?SGWID=3-40109-22-173745410-0"&gt;Springer website&lt;/a&gt;. Articles are downloadable as PDFs.&lt;br /&gt;Overall an interesting book - also because our report is in there ;) - if you want theoretical studies behind agile and specifically XP methodologies.&lt;br /&gt;Don't expect to find lots of insights or techniques other than those already best known.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;The poster&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We set up a poster in the hotel hall. We had few people talking to us to find out how about our experience and mostly they were interested on how hard it was to manage the team distributed all over the world and how hard it was to apply agile (XP) practices like stand ups, pair programming and so on.&lt;br /&gt;&lt;br /&gt;A group was coming from the University of Cagliari (Sardinia).&lt;br /&gt;They were some PhD students interested on real experience of big teams adopting agile for some of their research studies.&lt;br /&gt;I think most of the interest on our experience was caused by my interventions to the first workshop, where I was part of the panel several times during the &lt;a href="http://www.xpday.org/session_formats/goldfish_bowl"&gt;goldfish bowl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After two days of standing by the poster, the hipe was gone but discussion continued at the agile cafes and at the bar during the coffee breaks.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Agile cafes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This was a brilliant idea. The hotel did not provide to us an open space where people could meet and talk. So someone thought to use the hotel patio and the round tables in there to sit and discuss of whatever topic anyone had in mind. with coffee or beer; anyone could join a table and dive into whatever the discussion was at that point.&lt;br /&gt;&lt;br /&gt;This was a very good way to share experiences, pain and know each other.&lt;br /&gt;&lt;br /&gt;It is surprising how people is separate parts of the globe, in projects of different nature, may share the same issues and problems.&lt;br /&gt;&lt;br /&gt;Popular topics included: how to write user stories, how to manage a distributed agile team, is a small team more efficient than a big team no matter what the size of the project is, story of the waterfall methodology.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Meeting people&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Most of the value i got out of the conference was by having met people of various type and experience.&lt;br /&gt;Most notably I had the chance to talk and have dinner with Kent and Cinthia Beck and JB Reinsberger. Other than that i met people working for Philips, Ferrari, Exoftware, BT (!).&lt;br /&gt;It was a good way of exchanging experiences on shared problems or get to know issues in different domains (for example test driving embedded code).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The place&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Needless to say that Como and its Lake are beautiful. Probably you'll get the most of it for a long city break weekend (3/4 days). Food is faboulous - both fish and meat - and almost anywhere cheap.&lt;br /&gt;I was not impressed by my Hotel, very expensive, not so good food and service not at the level of a four star rank.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Tutorials/Workshops&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Can agile practices deliver high-quality large scale offshored projects?&lt;/b&gt;&lt;br /&gt;This was the workshop i found most interesting, also because was in theme with our poster. It as arranged as a gold fish bowl and was set as an open discussion driven by the speakers (a couple of consultants from Sweden). There were five chairs in front of the audience and only four were supposed to be occupied. The four people in the panel had to discuss the topic in the agenda. If someone wanted to dibate or discuss an issue, s/he had to go on the last available chair and one of the panel had to leave.&lt;br /&gt;We initiated the discussion with the following starting points:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;process and tools to enable team members comms effectively;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;impact of different time zones in productivity&lt;/li&gt;&lt;br /&gt;&lt;li&gt;what is the minimum amount of human comms&lt;/li&gt;&lt;br /&gt;&lt;li&gt;team to team comms&lt;/li&gt;&lt;br /&gt;&lt;li&gt;does the team know what the project goal is?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;what are the additional tasks necessary in a big team?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;how to avoid PM blind spots?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;how to test control scope and cost?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;are agile practices trustworthy?&lt;/li&gt;&lt;/ul&gt;I had chances to seat several times passing my experience in a big distributed agile team and had the opportunity to listen to someone else experience. I think we're on good shape, given also that i had been asked few questions (how do you do this and that sort of questions).&lt;br /&gt;&lt;br /&gt;One thing i realised, though, we don't do at the moment is maintaining a continuous integration box where all the capabilities are deployed and the sdk tests run automatically.&lt;br /&gt;&lt;p&gt;&lt;b&gt;Agile process anti-patterns&lt;/b&gt;&lt;br /&gt;Interesting workshop too... it seems that the set of antipatterns for agile methodologies are not yet well defined. the author - &lt;a href="http://blogs.consultantsguild.com/index.php/wayne?cat=36"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="nobr"&gt;&lt;a class="createlink" linktype="raw" linktext="Wayne Allen"&gt;Wayne Allen&lt;/a&gt;&lt;/span&gt; - is writing a book discussing the list of antipatterns that he's come across in his work as a consultant in the last five years. We were asked to remember the antipatterns we thought we came across in our project, then the audience was diveded in to two parts and each part had to pick an antipattern, discuss and elaborate it. The format for the description of the antipattern is the usual: name, poor solution, consequences, forces, better solution, exceptions.&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My team picked the Scrummerfall antipattern, where by teams think to implement an agile project just because they do iterations but they end up with doing a waterfall approach in the sense that iterations dont produce valuable and testable stories, there's no goal defined for the release and so on.&lt;/p&gt;&lt;b&gt;Mapping XP&lt;/b&gt;&lt;br /&gt;&lt;p&gt;This was the tutorial from Kent Beck. It was about mind mappings applied to XP practices. The underlying idea was to use mind mappings to elaborate XP stories.&lt;br /&gt;I had heard of mind maps but i never managed to use one. It seems quite a powerful concept expecially because it allows you to use more than one part of your brain (that for example associated with colors and maps). probably more effective than simple bullet point lists to elaborate on concepts and ideas.&lt;br /&gt;So i did find it intellectually interesting but not very applicable to my day to day job - at least for the moment.&lt;br /&gt;On the merit of XP much was stressed on &lt;span style="font-style: italic;"&gt;Appreciative Inquiry&lt;/span&gt;: concentrate more on what went well rather than feeling depressed looking only to what went wrong&lt;/p&gt;&lt;ul&gt;&lt;li&gt;identify when things went well&lt;/li&gt; &lt;li&gt;what were the circumstances, who was involved what support was available and how did you feel?&lt;/li&gt; &lt;li&gt;how can you reuse the past positive experience in any new scenario?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also &lt;span style="font-style: italic;"&gt;Accountability&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Honesty&lt;/span&gt; were discussed.&lt;br /&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;Thinking refining and communicating business perspective with executable documents&lt;/span&gt;&lt;br /&gt;Another interesting workshop forcussed on executable documentation. The idea is to have documents written by customers to work as acceptance tests. This should lead to ATD development (acceptance tests driven).&lt;br /&gt;&lt;a href="http://fitnesse.org"&gt;Fitnesse&lt;/a&gt; is an implementation of a mechanism to write executable documentation. Although it was general consensus that Fitnesse is not very good for customers as it forces a strict syntax - based on tables - and it requires mapping between wiki and code.&lt;br /&gt;The workshop ended with a brief discussion on fitnesse and then the audience split one part carrying on a q&amp;amp;a discussion of executable documentation, the other on advanced fitnesse topics. I picked the former and managed to have an in depth discussion on this matter with the speaker.&lt;br /&gt;One thing i think is worth mentioning is that on ADT you focus more on the testability of the story and on explicitly understanding the value that a customer gets from having that story implemented.&lt;/p&gt;&lt;b&gt;Test driven enterprise code&lt;/b&gt;&lt;br /&gt;&lt;p&gt;JB Reisnberger's was an iteresting tutorial even if i - sort of - knew already how to proficiently use jUnit... He stresses the use of mock objects (jMock) all over the place and I tend to disagree with him... See his book &lt;a href="http://www.manning.com/rainsberger/"&gt;&lt;span class="nobr"&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="nobr"&gt;&lt;a class="createlink" linktype="raw" linktext="jUnit recipes"&gt;jUnit recipes&lt;/a&gt;&lt;/span&gt; for more details.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Agile open source academy&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Rather boring workshop on open source (and free) tools to use to implement agile projects. Most importantly i noticied that we're using most of the tools that are used by everyone else (in our domain).&lt;/p&gt;&lt;span style="font-weight: bold;"&gt;Keynote 1: &lt;/span&gt;&lt;b&gt;The grand prix starts at 2 o'clock: a race to race software development experience&lt;/b&gt;&lt;br /&gt;&lt;p&gt;This was more of an experience report from the IT managers of the Ferrari racing teams. Most notably they have very short iterations - one day tipically and very short releases - usually in conjuntion with the GP from march to november... that means every one or two weeks.&lt;br /&gt;&lt;br /&gt;It was interesting to hear how they solved the problems of isolating the team from the rest of the world to minimise overhead and disturbance. They rotate a "driver" once a week which is the front door to the team. He responds to the emails, fixes immediate bugs/issues, does 1st/2nd/3rd line of support. They say it's a good way to introduce new members to the complexity of the projects (120ca) they have.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Keynote 2: Ease at work&lt;/b&gt;&lt;br /&gt;&lt;p&gt;This is the end key note from Kent Beck. It had the un-dubious ability to let people talk.&lt;br /&gt;It was all about balancing the life at work with yourself by finding your path to feeling at ease during work time. Ease in the sense of feeling good with yourself and within your environment.&lt;br /&gt;Ways suggested to feel at ease were doing a good job (eg being good at what you do), being honest with yourself and your team members, being accountable of what you do, being passionate on what you do.&lt;br /&gt;I found his suggestions and his approach a bit out of context... not everybody can afford or has the courage (for personal or contingent reasons) to be honest, accountable or passionate. But I can see that Mr Beck is trying to bring XP (and himself) to the next level.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;br /&gt;I am quete happy to have attended XP2007. It's not the best conference i have been to but i found answers to most of my questions.&lt;br /&gt;&lt;br /&gt;The overall message i got from talking to people and attending to the tutorials is that it's not enough to apply the agile tecniques to be succesfull... it's up to us, the people working on a project, to buy in to the values of agility, expecially accountability, honesty and discipline.Then the tecnique once mastered can be effective. Otherwise it's again process over people... I asked around how does the percentage of failed projects adopting agile compares with the percentage of failed projects adopting waterfall (or in general non agile)...&lt;br /&gt;&lt;p&gt;Well you'll be surprised to know that they are pretty much the same. So it's not agile per se but its the values that it promotes when people really is engaged to make them work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-159198952366174465?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/159198952366174465/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=159198952366174465' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/159198952366174465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/159198952366174465'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2008/06/xp2007.html' title='XP2007'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8326467133854092913.post-6594125441543009486</id><published>2007-05-12T21:34:00.000+01:00</published><updated>2008-12-10T04:39:39.276Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='web21c'/><category scheme='http://www.blogger.com/atom/ns#' term='san francisco'/><category scheme='http://www.blogger.com/atom/ns#' term='javaone'/><title type='text'>JavaOne 2007</title><content type='html'>This is a brief report of last May's &lt;a href="http://java.sun.com/javaone/sf/2007/index.jsp"&gt;JavaOne&lt;/a&gt; week in San Francisco.&lt;br /&gt;&lt;p&gt;I arrived on Saturday May the 5th, I was pretty much nakered&lt;/p&gt;&lt;p&gt;Although the flight was smooth and easy, I didn't sleep much albeit the films offered by United Airlines were terribly boring (&lt;a href="http://www.imdb.com/title/tt0454921/"&gt;The Pursuit of Happiness&lt;/a&gt; and &lt;a href="http://www.imdb.com/title/tt0758766/"&gt;Music and Lyrics&lt;/a&gt;).&lt;/p&gt;&lt;p&gt;Anyway, had dinner at one restaurant in the Embarcadero and went to bed by 11pm.&lt;/p&gt;&lt;p&gt;Sunday was dedicated to an interesting walk around the city... I and my colleague Dan walked from the &lt;a href="http://www.hotelpalomar-sf.com/"&gt;hotel&lt;/a&gt; to the &lt;a href="http://en.wikipedia.org/wiki/Golden_Gate_Bridge"&gt;Golden Gate Bridge&lt;/a&gt;. I don't know how far we walked but it was a lot (~10Km I reckon). We went through Chinatown, Little Italy down to the Embarcadero (nearby Pier 23) down to the Golden Gate Bridge and back (well, OK, half way through the return way we decided to catch a taxi). During the walk we came across several interesting places, including the &lt;a href="http://www.longnow.org/"&gt;Long Now Foundation&lt;/a&gt; shop and the &lt;a href="http://www.norwayday.org/nd/index.html"&gt;Norway Day&lt;/a&gt; stand at &lt;a href="http://www.fortmason.org/index.shtml"&gt;Ft Mason Center&lt;/a&gt; (there was a lump of real snow directly from Norway - or maybe not?).&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HA4XCmK8W8I/SEReueHSeXI/AAAAAAAAAAs/nGSH5YuzuSw/s1600-h/escaped+from+alcatraz.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_HA4XCmK8W8I/SEReueHSeXI/AAAAAAAAAAs/nGSH5YuzuSw/s320/escaped+from+alcatraz.JPG" alt="" id="BLOGGER_PHOTO_ID_5207391221597763954" border="0" /&gt;&lt;sub&gt;Escaped from Alcatraz&lt;/sub&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Monday was dedicated to some shopping, catching up with the team and preparing the Booth at the Moscone Center for &lt;a href="http://java.sun.com/javaone/sf/index.jsp"&gt;JavaOne&lt;/a&gt;, and attending the Sun University Class we were subscribed at  (more on this later) . We then spent the evening visiting some of the most interesing house-brewed beer pubs in SF, most notably the &lt;span class="nobr"&gt;&lt;a href="http://www.thirstybear.com/"&gt;Thirsty Bear&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SERf4-HSeYI/AAAAAAAAAA0/_uQZF3JlAlg/s1600-h/teamretrospective.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SERf4-HSeYI/AAAAAAAAAA0/_uQZF3JlAlg/s320/teamretrospective.JPG" alt="" id="BLOGGER_PHOTO_ID_5207392501498018178" border="0" /&gt;&lt;/a&gt;&lt;sub&gt;Team daily retrospectives at the pub&lt;/sub&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Tuesday was an all day session at the booth. We were very busy showing people the Java SDK and giving away our shwags (and the &lt;a href="http://en.wikipedia.org/wiki/Red_telephone_box"&gt;little red phone box&lt;/a&gt; was a success). It was very pleasant to show people the features of the SDK, and the most succesful ones were - as expected - ThirdPartyCall and SMS. Most people registered through the portal (some for the sake of getting the usb flash memory IMHO) and promised to have a look at the product. We also realised that the booth was not as sexy as it should have been: several visitors said that the booth was not suggesting what we were then presenting. The day ended with almost 150 users registered.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HA4XCmK8W8I/SERgVOHSeZI/AAAAAAAAAA8/ORG7gtMxM14/s1600-h/the+diamond.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_HA4XCmK8W8I/SERgVOHSeZI/AAAAAAAAAA8/ORG7gtMxM14/s320/the+diamond.JPG" alt="" id="BLOGGER_PHOTO_ID_5207392986829322642" border="0" /&gt;&lt;/a&gt;&lt;p style="text-align: center;"&gt;&lt;sub&gt;The diamond: AT&amp;amp;T Park&lt;br /&gt;&lt;/sub&gt;&lt;/p&gt;We then went to the AT&amp;amp;T Park stadium, where the local baseball team, &lt;a href="http://sanfrancisco.giants.mlb.com/index.jsp?c_id=sf"&gt;San Francisco Giants&lt;/a&gt;  were playing the &lt;a href="http://newyork.mets.mlb.com/index.jsp?c_id=nym"&gt;New York Mets&lt;/a&gt; (and they &lt;a href="http://mlb.mlb.com/mlb/scoreboard/20070508.html"&gt;won&lt;/a&gt;. Thanks to AndyO for explaining me (an old time footy lover) the &lt;a href="http://en.wikipedia.org/wiki/Baseball#Gameplay"&gt;rules of the game&lt;/a&gt; on the fly.&lt;br /&gt;&lt;br /&gt;On Wednesday I attended to few other talks and spent most of the time at the booth. Attendance was more than expected and we were all busy almost all five hours of opening. The day ended with few more home brewed beers and &lt;a href="http://www.imdb.com/title/tt0413300/"&gt;Spiderman 3&lt;/a&gt; at the local IMax.&lt;br /&gt;&lt;br /&gt;Thursday again very busy (I think even more than Wednesday) and the last helicopters were awarded to those presenting an application built with the sdk (&lt;a href="http://blogs.sun.com/paulsen/entry/howto_win_a_helicopter"&gt;a nice blog on this&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Friday was definitely a day of shopping in and around Union Square... nice shops of all sorts and types.&lt;br /&gt;&lt;br /&gt;Saturday we hired a bike (I, Adrian, Pawel and Dan) and we cycled the whole morning plus part of the afternoon around SF: through the Golden Gate Park to the Ocean and back along the Embarcadero. Very tiring but enjoyable experience.&lt;br /&gt;&lt;br /&gt;Finally Sunday I flew back home... Flight was ok and not surprisingly movies offered by UA were utterly boring - even more than the outgoing flight (I can't even remember what I watched). But it took the chance to finish my book, Paul Graham's &lt;a href="http://www.amazon.co.uk/Hackers-Painters-Essays-Art-Programming/dp/0596006624/ref=pd_bbs_sr_1/026-9023590-1598813?ie=UTF8&amp;amp;s=books&amp;amp;qid=1179317660&amp;amp;sr=8-1"&gt;Hackers and Painters&lt;/a&gt;: a very interesting book that everybody in this industry should read.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HA4XCmK8W8I/SERgp-HSeaI/AAAAAAAAABE/CMQQISr95uc/s1600-h/goldengatebridge.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_HA4XCmK8W8I/SERgp-HSeaI/AAAAAAAAABE/CMQQISr95uc/s320/goldengatebridge.JPG" alt="" id="BLOGGER_PHOTO_ID_5207393343311608226" border="0" /&gt;&lt;/a&gt;&lt;sub&gt;The Golden Gate Bridge&lt;/sub&gt;&lt;/div&gt;&lt;span style="font-size:180%;"&gt;Sessions I attended&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Using JavaEE 5 and SOA to architect and desing robust enterprise applications&lt;/span&gt;&lt;br /&gt;Rather boring talk on the JEE technology stack and on how to use it to implement enterprise applications. The speaker, a JEE architect, spent half hour saying why architecture was important for the implementation of the non functional requirements and all the *ilities. Approach was based on a RUP like methodology - session ended with explaination of the core J2EE patterns.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Rapid web development with Groovy and GrailsVery interesting session on Groovy and Grails... &lt;/span&gt;&lt;br /&gt;it's worth looking at these technologies as replacement of Ruby and Rails. The session included an hands on tutorial on how to implement a simple web site that exposes CRUD ops on a set of DB tables.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Distributed cachicg, using the JCACHE API and ehcache, including a case study of &lt;/span&gt;&lt;a style="font-weight: bold;" href="http://wotif.com/"&gt;Wotif.com&lt;/a&gt;&lt;br /&gt;Very interesting session on caching. The speaker (also author of ehcache) explained in details the issues aroung caching and how to use ehcache for distributed applications.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Non intrusive monitoring of java technology based applications with JMX, JConsole, and AOP&lt;/span&gt;&lt;br /&gt;This is probably the most interesting talk i attended... the subject says it all: JMX &lt;b&gt;is&lt;/b&gt; the way of managing applications in two ways. One is to allow easy runtime configuration of the behaviour of the application. The other is to collect stats on the various aspects of the apps (JVM, thread numbers, memory and so on). The nice thing is that this is all possible via spring JMX which integrates very well with the most popular jmx server implementations (including JBoss).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Java API for RESTful Web Services&lt;/span&gt;&lt;br /&gt;JSR 311 is the way of standardise web service exposure through a Java API. Basically is a bunch of annotations that allow to specify how the methods and properties of a bean can be exposed the REST way. The JSR is still work in progress and the talk described the current state of play. Quite interesting talk as, when this API will be available, will encourage development to fit with the REST principles. Moreover services built with the API will be deployable by use of a variety of web container technologies and will benefit from built-in support for a variety of HTTP usage patterns and conventions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Web algorithms&lt;/span&gt;&lt;br /&gt;From the session abstract: "This session explains--without any needless math or boring proofs--several fun algorithms of interest to back-end web programmers.&lt;br /&gt;Each algorithm was selected because it's really practical, really interesting, or both. The algorithms aren't always the same but can include public key cryptography, credit card checksum validation, TCP Slow Start, 2's complement, priority queues, the XOR swap, and the Google MapReduce function for massively distributed calculation."&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Blueprints for Mashups: Practical Strategies, Tips, and Code for Designing and Building&lt;/span&gt;&lt;br /&gt;This presentation highlights the issues around the development of mashups, specifically security concerns, protocols (soap vs REST), data format (xml vs json) design patterns and strategies (client vs service mashups). It gave me an overview of what JSon is and how to use it, and some in depth details on how to code mashups in \JavaScript.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Minimalist test techniques for enterprise java technology based applications.&lt;/span&gt;&lt;br /&gt;The first part of the talk was about how testing is important and why people shold do it (kind of preaching to the convert), so after all quite boring. Second part described test strategies for each of the three layers of a typical JEE app (data, buisiness and presentation). Only interesting bit was a demo of Selenium. The rest was chitchatting and free publicity to the speaker's book (&lt;a href="http://www.manning.com/crichardson/"&gt;POJOs in Action&lt;/a&gt;).&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Declarative Programming: Tighten Enterprise JavaBeans (EJB) 3.0 and JSR 303 Beans Validation&lt;/span&gt;&lt;br /&gt;Probably the most boring presentation title so far. Essentially, the session was devoted to describe the ins and outs of the JSR 303, which, surprise surprise, is a way of standardising bean vaidations via Java5 annotations (I know something about this). The guy, expert member of the JSR 303 committee, showed how cool is to annotate beans and methods to validate input parameters. The JEE way will not use AOP though (the guy said AOP is useless and too complicated), buth rather with "interceptors" which basically are very similar (in fact, the same) as Spring AOP advices.&lt;br /&gt;This was the only session I dared asking a question at. I was infact rather disappointed when he said that people should not use AOP at all and he did (not too much implicitly) say that such developers are masochists. The question i asked was: what's the difference and why Interceptors are better than Spring AOP. The answer was that Interceptors are standard and that I had been better off complaining to that standard, and that interceptors were easier to use. I only objected that he was confused with pure AspectJ (and not Spring AOP). Anyway it did not convince me. But there you go... we'll have a standard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Was it worth?&lt;/span&gt;&lt;br /&gt;Of course it was. The city and the experience at the booth was priceless. Some of the sessions interesting enough... some others rather dull. Also, you would expect JavaOne to be the showcase for Sun's product, and it was... I just thought it was too much!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8326467133854092913-6594125441543009486?l=smartrics.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://smartrics.blogspot.com/feeds/6594125441543009486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8326467133854092913&amp;postID=6594125441543009486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6594125441543009486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8326467133854092913/posts/default/6594125441543009486'/><link rel='alternate' type='text/html' href='http://smartrics.blogspot.com/2007/06/javaone-2007.html' title='JavaOne 2007'/><author><name>smartrics</name><uri>http://www.blogger.com/profile/07295654362099098666</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/-Yl-SPJSCNzU/TtgJ5CjPr9I/AAAAAAAAAIc/aINXJ00ZSxI/s220/fab1a.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HA4XCmK8W8I/SEReueHSeXI/AAAAAAAAAAs/nGSH5YuzuSw/s72-c/escaped+from+alcatraz.JPG' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
