<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Sourcesense</title>
	<link rel="self" href="http://planet.sourcesense.com/atom.xml"/>
	<link href="http://planet.sourcesense.com/"/>
	<id>http://planet.sourcesense.com/atom.xml</id>
	<updated>2010-03-14T10:40:11+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">1 year in Sourcesense UK</title>
		<link href="http://marco.hubdirector.com/1-year-in-sourcesense-uk/"/>
		<id>http://marco.hubdirector.com/?p=295</id>
		<updated>2010-03-12T14:45:07+00:00</updated>
		<content type="html">&lt;p&gt;I know it&amp;#8217;s a cliché but indeed I cannot believe 1 year has already gone by! My &amp;#8216;&lt;a href=&quot;http://marco.hubdirector.com/a-new-challenge/&quot;&gt;A new challenge&lt;/a&gt;&amp;#8216; post was published on Monday 16th March 2009, the day I left &lt;a href=&quot;http://www.thoughtworks.com/&quot;&gt;ThoughtWorks&lt;/a&gt; and joined &lt;a href=&quot;http://www.sourcesense.com/en/home&quot;&gt;Sourcesense&lt;/a&gt; as the new UK managing director.&lt;/p&gt;
&lt;p&gt;Next Monday will be the first day of my second year and as it happens such a milestone is a good point for some reflection and although not everything can go into a blog post (either because it&amp;#8217;s too long, too detailed, too hard to put down in words or simply private), I want to try and list the major good and not so good points of this ride:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Good&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;since March 16th 2009 Sourcesense UK has hired 8 great new people (and is currently looking for more on both the sales and technical side): Huw, Tom, Peter, Nigel, Gustavo, Edoardo, Vikrant + an unnamed one who is starting shortly. If you consider that I spent the first 4 months getting up to speed, looking after existing customers and slowly building a vision for the UK office, that means we hired an average of 1 person per month and because we are very picky (remember, I come from ThoughtWorks &lt;img src=&quot;http://marco.hubdirector.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; ) that means interviewing something like 52 people to narrow down this 8. Although we are looking to hire more soon &amp;#8211; in fact contact me if you are a software crafts(wo)men who love Open Source - I feel we have a great team in place now, and our customers agree!&lt;/li&gt;
&lt;li&gt;One of my goals has always been to build a truly multicultural office and we are getting there as we&amp;#8217;ve got: Italians, British, Brazilians, Slovaks, Indians. As you might have noticed already though we only have men, I&amp;#8217;ll expand on this in the not so good points.&lt;/li&gt;
&lt;li&gt;One of those 8, Peter, was in fact our guinea pig for internships. I &lt;a href=&quot;http://marco.hubdirector.com/on-internships/&quot;&gt;wrote briefly about it back in August&lt;/a&gt;. I say guinea pig because Peter was the first one to go through a completely new idea never tried before and not happy with that we also split his time between London and Milan. I know for a fact that next time we do offer an internship we will do much better&amp;#8230;&lt;/li&gt;
&lt;li&gt;At any given time we&amp;#8217;ve had at least 2 colleagues from the other offices (Amsterdam, Milan and Rome) working for UK customers either remotely or here in London and at some point there were more than 6! On top of that we are consistently working with 3 or 4 trusted contractors who, for whatever reason, prefer this type of contract (and not for lack of trying on my part! I love permanent people so that we can invest on them for the long term)&lt;/li&gt;
&lt;div id=&quot;attachment_310&quot; class=&quot;wp-caption alignright&quot;&gt;&lt;a href=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/Uk-Building.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-310&quot; title=&quot;UK office&quot; src=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/Uk-Building.jpg&quot; alt=&quot;UK office&quot; width=&quot;150&quot; height=&quot;200&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;London office&lt;/p&gt;&lt;/div&gt;
&lt;li&gt;We moved into a new office opposite Spitalfields Market and I cannot tell you enough how much I love the location: great transports (Liverpool Street Station), easy to reach from airports and packed full of bars, pubs, restaurants, the market and shops. Oh yes, it&amp;#8217;s also in the City &lt;img src=&quot;http://marco.hubdirector.com/wp-includes/images/smilies/icon_wink.gif&quot; alt=&quot;;-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;li&gt;Every Last Wednesday of the month we all meet up in office from 5.30pm and talk over pizza and beers. I go through last month results being as transparent as possible disclosing all the numbers, discussing what&amp;#8217;s coming up, new ideas, proposals and so forth and then leave the stage to whoever wants to present something they care about: technical stuff (from Scala to Lucene), customer stuff (what&amp;#8217;s going on with project X), partners stuff (we had a partner of ours delivering a private webinar on their technology just for us). Of course we then head to a pub to keep talking and socialising &lt;img src=&quot;http://marco.hubdirector.com/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;:-)&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/li&gt;
&lt;li&gt;It looks like slowly but surely we are heading in the right direction since we get more and more work of the type we like and less and less of the &amp;#8220;not that interesting but it will help pay the bills&amp;#8221; type. This can only be a good thing!&lt;/li&gt;
&lt;li&gt;We had an energising OneCompany meeting in Amsterdam back in October: everyone flew in from the various offices and we spent a day in a beach house and a day in the beautiful Amsterdam office.&lt;/li&gt;
&lt;/ul&gt;
&lt;table align=&quot;center&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;p&gt;&lt;div id=&quot;attachment_311&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/NL-building.jpg&quot;&gt;&lt;img class=&quot;size-full wp-image-311 &quot; title=&quot;Amsterdam Office&quot; src=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/NL-building.jpg&quot; alt=&quot;Amsterdam Office&quot; width=&quot;128&quot; height=&quot;192&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Amsterdam Office&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;div id=&quot;attachment_329&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/beachhouse.jpg&quot;&gt;&lt;img class=&quot;size-medium wp-image-329 &quot; title=&quot;Beach House&quot; src=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/beachhouse-300x201.jpg&quot; alt=&quot;Beach House&quot; width=&quot;270&quot; height=&quot;181&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Beach House&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;
&lt;p&gt;&lt;div id=&quot;attachment_330&quot; class=&quot;wp-caption alignnone&quot;&gt;&lt;a href=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/beach.jpg&quot;&gt;&lt;img class=&quot;size-thumbnail wp-image-330&quot; title=&quot;Kites by the beach&quot; src=&quot;http://marco.hubdirector.com/wp-content/uploads/2010/03/beach-150x150.jpg&quot; alt=&quot;Kites by the beach&quot; width=&quot;150&quot; height=&quot;150&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Kites by the beach&lt;/p&gt;&lt;/div&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;
&lt;strong&gt;Not so good&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We are all men! I care about diversity and I&amp;#8217;ve worked with some pretty amazing women in the past (across the board, including developers) therefore one of my goals for this year is to try and recruit some of the best female geeks in town. I&amp;#8217;m lucky because London is a great place for this and there are plenty of opportunities like &lt;a href=&quot;http://londongirlgeekdinners.co.uk/&quot;&gt;London Girl Geek Dinners&lt;/a&gt; and &lt;a href=&quot;http://www.womenintechnology.co.uk/&quot;&gt;Women in Technology&lt;br /&gt;
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s always hard when new hires don&amp;#8217;t work out and usually it&amp;#8217;s whoever recruited them fault, in this case mine! With one guy, after the standard 3-month probation period, we decided to part ways because we realised we weren&amp;#8217;t a good fit: what Sourcesense UK needed at the time didn&amp;#8217;t match with where he was in his career. The thing I&amp;#8217;m happy about is that we are still in touch (twitter, buzz, email). That&amp;#8217;s what happens when you try your best to be transparent and up front.&lt;/li&gt;
&lt;li&gt;This one goes with the nature of the business but it&amp;#8217;s hard at times to make sure everyone feels part of the same entity when half the people are working on a customer site, some are working from our office and some others run around multiple customers offices. Last Wednesday, regular one-on-ones, company meetings and other activities are all geared towards overcoming this issue but I still feel like we need to do more and we will.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;#8217;m sure the moment I publish this I&amp;#8217;ll remember another 50 or so things but I guess the fact that the ones above come to my mind immediately makes them the most important ones to me.&lt;/p&gt;
&lt;p&gt;Looking forward to an even better second year! &lt;img src=&quot;http://marco.hubdirector.com/wp-includes/images/smilies/icon_biggrin.gif&quot; alt=&quot;:-D&quot; class=&quot;wp-smiley&quot; /&gt; &lt;/p&gt;</content>
		<author>
			<name>Marco Abis</name>
			<uri>http://marco.hubdirector.com</uri>
		</author>
		<source>
			<title type="html">ABS blog</title>
			<subtitle type="html">Just another blog</subtitle>
			<link rel="self" href="http://marco.hubdirector.com/feed/"/>
			<id>http://marco.hubdirector.com/feed/</id>
			<updated>2010-03-12T15:10:01+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Lazy proxy in Ruby</title>
		<link href="http://matteo.vaccari.name/blog/archives/333"/>
		<id>http://matteo.vaccari.name/blog/?p=333</id>
		<updated>2010-03-11T15:54:28+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m a total newbie when it comes to Ruby evaluation tricks, so when I learned this today I felt it was a good thing to share :-)&lt;/p&gt;
&lt;p&gt;The problem: speeding up a Rails application.  When all is said and done, you need to cache page fragments in order to speed up an application significantly.  For instance: you start with&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
class ProductsController &amp;lt; ApplicationController
  def category
    @products = Product.find_by_category(params[:id])
  end
end

...

&amp;lt;div id=&amp;quot;products&amp;quot;&amp;gt;
  &amp;lt;% for product in @products do %&amp;gt;
    &amp;lt;!-- some complicated html code --&amp;gt;
  &amp;lt;% end %&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;and then add fragment caching in the view with&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
&amp;lt;% cache &amp;quot;category-#{params[:id]}&amp;quot; do %&amp;gt;
  &amp;lt;div id=&amp;quot;products&amp;quot;&amp;gt;
    &amp;lt;% for product in @products do %&amp;gt;
      &amp;lt;!-- some complicated html code --&amp;gt;
    &amp;lt;% end %&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;% end %&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;OK, this speeds up view rendering.  But we are still executing the query in the controller, to obtain a list of products we are not even using.  The standard Rails solution to this is&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
  class ProductsController &amp;lt; ApplicationController
    def category
      unless fragment_exist? &quot;category-#{params[:id]}&quot;
        @products = Product.find_by_category(params[:id])
      end
    end
  end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is nice enough.  But one things is worrying me, is there might be a race condition between the &amp;#8220;unless fragment_exists?&amp;#8221; test and the call to &amp;#8220;cache&amp;#8221; in the view.  If the cron job that cleans the cache directory executes between the two, the user will see an error.&lt;/p&gt;
&lt;p&gt;I thought to myself, wouldn&amp;#8217;t it be nice to give the view a lazy proxy in place of the array of results?  The lazy proxy will only execute the query if it is needed.  The controller becomes:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
class ProductsController &amp;lt; ApplicationController
  def category
    @products = LazyProxy.new do
      Product.find_by_category(params[:id])
    end
  end
end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The LazyProxy magic is surprisingly simple:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
class LazyProxy &amp;lt; Delegator
  def initialize(&amp;amp;block)
    @block = block
  end

  def __getobj__
    @delegate ||= @block.call
  end
end
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The block given to the constructor is saved, and not used immediately.  The Delegator class from the standard library delegates all calls to the object returned by the __getobj__ method.  The &amp;#8220;||=&amp;#8221; trick makes sure that the result of @block.call will be saved in an instance variable, so that the query is executed at most once.&lt;/p&gt;
&lt;p&gt;So the idea is that the view will be given a lazy proxy for a query.  If the fragment exists, the view code will not be evaluated and the proxy will not be used.  No query.  If the fragment does not exist, the lazy proxy is used and a query is executed.  There is no race condition, for there is no test to see if the fragment exists.&lt;/p&gt;
&lt;p&gt;What do you think?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; One additional advantage of the lazy proxy is that you no longer need to make sure that the fragment key is the same on both view and controller.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Sourcesense contributes to IKS project</title>
		<link href="http://www.open4dev.com/journal/2010/3/8/sourcesense-contributes-to-iks-project.html"/>
		<id>288041:2935920:6944668</id>
		<updated>2010-03-08T13:11:28+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span class=&quot;full-image-block ssNonEditable&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://www.open4dev.com/journal/2010/3/8/sourcesense-contributes-to-iks-project.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/iks_project_logo.jpg?__SQUARESPACE_CACHEVERSION=1268057591604&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I was involved with my collegue &lt;a title=&quot;Tommaso Teofili&quot; href=&quot;http://www.open4dev.com/journal/2010/3/8/sourcesense-contributes-to-iks-project.html&quot;&gt;&lt;strong&gt;Tommaso Teofili&lt;/strong&gt;&lt;/a&gt; in supporting IKS to complete their survey dedicated to CMS products. &lt;strong&gt;Especially Tommaso is following this project very thoroughly!&lt;/strong&gt;&lt;/p&gt;</content>
		<author>
			<name>Piergiorgio Lucidi</name>
			<uri>http://www.open4dev.com/journal/</uri>
		</author>
		<source>
			<title type="html">Open4Dev</title>
			<link rel="self" href="http://www.open4dev.com/journal/rss.xml"/>
			<id>http://www.open4dev.com/journal/rss.xml</id>
			<updated>2010-03-08T15:40:08+00:00</updated>
			<rights type="html">All Content © 2008, Piergiorgio Lucidi. Some rights reserved. Creative Commons License 3.0 BY</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Prima lezione del corso di Tecnologia e Applicazioni Internet</title>
		<link href="http://matteo.vaccari.name/blog/archives/327"/>
		<id>http://matteo.vaccari.name/blog/?p=327</id>
		<updated>2010-03-07T16:12:14+00:00</updated>
		<content type="html">&lt;p&gt;Summary: first lesson with my new class.  Teaching TDD, letting the students get a glimpse of how skilled they are in programming; which is unfortunately not much.&lt;/p&gt;
&lt;p&gt;Per il secondo anno insegno &lt;a href=&quot;http://matteo.vaccari.name/tai&quot; title=&quot;Tecnologia e Applicazioni Internet 2009/10&quot;&gt;Tecnologia e Applicazioni Internet&lt;/a&gt; all&amp;#8217;&lt;a href=&quot;http://www.uninsubria.it/&quot;&gt;Insubria&lt;/a&gt;.  Il mio obiettivo per questo corso è di insegnare come sviluppare applicazioni web, applicando le pratiche tecniche di Extreme Programming.  In particolare, vorrei insegnare Test-Driven Development e i principi di Object-Oriented Design, per come li capisco.  Il mio &lt;em&gt;meta&lt;/em&gt;-obiettivo per questo corso è fare in modo che lo studente diventi il doppio più bravo a programmare.&lt;/p&gt;
&lt;p&gt;Per questo corso uso Java e non Rails.  Il motivo di questa scelta è che Rails, per quanto sia una spanna sopra a tutti i web framework in Java, è purtuttavia un framework e in quanto tale è una stampella, una gruccia, che ti permette di stare in piedi ma certo non ti aiuta quando vuoi imparare a camminare da solo, men che meno a correre.  Per imparare a camminare da soli bisogna imparare a programmare a oggetti.  &lt;/p&gt;
&lt;h4&gt;In Aula&lt;/h4&gt;
&lt;p&gt;Per la prima lezione ho spiegato il TDD da solo, senza la complicazione delle servlet.  Mi sono sforzato di pensare a un esempio che fosse piccolo a sufficienza per fare una demo di fronte agli studenti, in un pomodoro o poco più.  Ho deciso di fare un &amp;#8220;calcolatore a riga di comando&amp;#8221;, ovvero un programma che presa una stringa come &amp;#8220;2 + 3&amp;#8243; come argomento sulla riga di comando, stampi &amp;#8220;5.0&amp;#8243; su standard output.&lt;/p&gt;
&lt;p&gt;Il primo test che ho scritto:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
@Test
public void twoAndThreeIsFive() throws Exception {
	Calculator calculator = new Calculator();
	double result = calculator.add(2, 3);
	assertEquals(5.0, result, EPSILON);
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Abbastanza semplice da far passare.  Ma non era sufficiente, perché dalla riga di comando gli argomenti arrivano come stringhe e non come interi già parsati.  Per cui ho scritto un secondo test che ha fatto emergere una classe Parser&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
@Test
public void willParseTwoAndFive() throws Exception {
	Calculator calculator = new Calculator();
	String result = new Parser(calculator).calculate(&quot;2 + 5&quot;);
	assertEquals(&quot;7.0&quot;, result);
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Perché creare una seconda classe a questo punto?  Non sarebbe bastato mettere il metodo &amp;#8220;parse&amp;#8221; nella classe Calculator?  Avrei potuto, però in questo modo il metodo &amp;#8220;add&amp;#8221; sarebbe diventato un metodo ad uso interno della classe.  Come avrei fatto a testarlo?  Avrei dovuto buttare via il test su add, oppure tenere add come &amp;#8220;public&amp;#8221; anche se in realtà serve solo internamente.  Oppure usare qualche brutto trucco come dare ad &amp;#8220;add&amp;#8221; visibilità protected oppure package.&lt;/p&gt;
&lt;p&gt;Invece, tenendo il Calculator come classe a sè che si occupa solo di fare conti, mentre Parser si occupa di leggere e scrivere stringhe, posso tenere &amp;#8220;add&amp;#8221; come metodo pubblico di Calculator.  Martin direbbe che ho applicato il &amp;#8220;Single Responsibility Principle.&amp;#8221;  Per me è stato decisivo pensare &amp;#8220;se no mi tocca testare un metodo privato&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Poi non ero ancora soddisfatto.  Nel TDD quello che facciamo è sviluppare un isola felice di codice a oggetti, che però a un certo punto si deve scontrare con la realtà procedurale del mondo esterno.  In questo caso il &amp;#8220;mondo esterno&amp;#8221; è il main, che deve creare e invocare i nostri oggetti.  Per me è fondamentale che il &lt;a href=&quot;http://misko.hevery.com/2008/08/29/my-main-method-is-better-than-yours/&quot; title=&quot;My main() Method Is Better Than Yours&quot;&gt;main non contenga nessuna logica&lt;/a&gt;, ma &lt;a href=&quot;http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/&quot; title=&quot;How to Think About the &amp;#8220;new&amp;#8221; Operator with Respect to Unit Testing&quot;&gt;soltanto la creazione di un certo numero di oggetti, collegati insieme&lt;/a&gt;.  Se faccio restituire il risultato a Parser#calculate, poi al main resta la responsabilità di invocare System.out.println() per stampare.  &lt;/p&gt;
&lt;p&gt;Il mio obiettivo è ridurre al minimo la logica nel main, in modo che il main, che è per sua natura più difficile da testare unitariamente, sia così semplice da risultare ovviamente corretto.  O comunque, per essere sicuro che il main se fallisce, fallisce sempre, e se funziona, funziona sempre.  In questo modo posso essere ragionevolmente certo che se il mio main contiene un errore, me ne accorgerò.  Gli errori di cablaggio, &lt;a href=&quot;http://misko.hevery.com/2008/11/17/unified-theory-of-bugs/&quot; title=&quot;My Unified Theory of Bugs&quot;&gt;come li chiama Hevery&lt;/a&gt;, sono facili da trovare.&lt;/p&gt;
&lt;p&gt;Allora ho applicato il principio &amp;#8220;&lt;a href=&quot;http://www.pragprog.com/articles/tell-dont-ask&quot; title=&quot;The Pragmatic Bookshelf | Tell, Don't Ask&quot;&gt;Tell, don&amp;#8217;t Ask,&lt;/a&gt;&amp;#8221; e ho passato l&amp;#8217;OutputStream come collaboratore alla Parser#calculate.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
@Test
public void willParseTwoAndFive() throws Exception {
	Calculator calculator = new Calculator();
	OutputStream stream = new ByteArrayOutputStream();
	new Parser(calculator, stream).calculate(&quot;2 + 5&quot;);
	assertEquals(&quot;7.0\n&quot;, stream.toString());
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In questo modo è come se dicessi a Parser, &amp;#8220;questa è la tua stringa da calcolare, questo è lo stream dove devi scrivere il risultato, adesso arrangiati, non ne voglio sapere nulla.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Un pattern che si può riconoscere in questo design è una versione embrionale di &lt;a href=&quot;http://c2.com/cgi/wiki?CollectingParameter&quot; title=&quot;Collecting Parameter&quot;&gt;collecting parameter&lt;/a&gt;.  In generale cerco di evitare di avere metodi che restituiscono dati.  Di solito è più efficace dire agli oggetti di fare cose, piuttosto che chiedere dati.  Questo è il principio &amp;#8220;&lt;a href=&quot;http://www.pragprog.com/articles/tell-dont-ask&quot; title=&quot;The Pragmatic Bookshelf | Tell, Don't Ask&quot;&gt;tell, don&amp;#8217;t ask&lt;/a&gt;&amp;#8220;.  &lt;/p&gt;
&lt;p&gt;Possiamo anche vedere l&amp;#8217;oggetto Parser come un &lt;a href=&quot;http://c2.com/cgi/wiki?AdapterPattern&quot; title=&quot;Adapter Pattern&quot;&gt;adapter&lt;/a&gt;: adatta l&amp;#8217;interfaccia del Calculator, basata su numeri, alle necessità di main, che lavora con stringhe.&lt;/p&gt;
&lt;p&gt;Tutto ciò, beninteso, non significa che per programmare bisogna ad ogni piè sospinto cercare nel manualone dei pattern uno o più pattern da ficcare dentro al nostro codice.  Al contrario, quello che ho fatto io è stato di scrivere il codice che mi sembrava più appropriato per risolvere il mio problema, e poi, ragionandoci sopra, ho riconosciuto dei pattern in quello che avevo scritto. &lt;/p&gt;
&lt;h4&gt;In laboratorio&lt;/h4&gt;
&lt;p&gt;La seconda parte della lezione si è svolta in laboratorio.  Ho proposto un semplice esercizio, di scrivere un programma che concatena le righe di due file a una a una, un po&amp;#8217; come fa &lt;a href=&quot;http://it.wikipedia.org/wiki/Paste&quot;&gt;il comando paste(1)&lt;/a&gt; di Unix. Ho visto subito che per la maggior parte degli studenti questo esercizio era troppo difficile, per cui sono subito passato a suggerire come primo test una versione semplificata del problema.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
@Test
public void pasteLinesFromArrays() throws Exception {
	List a = Arrays.asList(&quot;aa&quot;, &quot;bb&quot;);
	List b = Arrays.asList(&quot;xx&quot;, &quot;zz&quot;);
	List result = new ArrayList();

	Concatenator concatenator = new Concatenator();
	concatenator.concatenate(result, a, b);

	assertEquals(Arrays.asList(&quot;aaxx&quot;, &quot;bbzz&quot;), result);
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I miei studenti sono al terzo anno di Informatica triennale.  Nel nostro corso di laurea, il linguaggio di programmazione di riferimento è Java.  Purtroppo, ho dovuto osservare che per &lt;em&gt;la grande maggioranza&lt;/em&gt; dei miei circa 40 studenti, scrivere il codice che fa passare questo esercizio è un problema difficile.  E &lt;em&gt;&lt;strong&gt;nessuno&lt;/strong&gt;&lt;/em&gt; (mi pare) è stato in grado di estendere il codice per fare passare anche il secondo test:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
@Test
public void listsCanBeOfDifferentLength() throws Exception {
	List a = Arrays.asList(&quot;a&quot;);
	List b = Arrays.asList(&quot;b&quot;, &quot;c&quot;);
	List result = new ArrayList();

	Concatenator concatenator = new Concatenator();
	concatenator.concatenate(result, a, b);

	assertEquals(Arrays.asList(&quot;ab&quot;, &quot;c&quot;), result);
}
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Non so che cosa pensare.  Questi esercizi mi sembrano di un livello di difficoltà paragonabile al famoso &amp;#8220;problema&amp;#8221; &lt;a href=&quot;http://en.wikipedia.org/wiki/Bizz_buzz&quot; title=&quot;Bizz buzz - Wikipedia, the free encyclopedia&quot;&gt;FizzBuzz&lt;/a&gt;, che viene &lt;a href=&quot;http://weblog.raganwald.com/2006/07/hiring-juggler_02.html&quot; title=&quot;Hiring a Juggler&quot;&gt;usato nei colloqui di lavoro&lt;/a&gt; per scremare quelli che non sanno programmare per niente da quelli che forse sono capaci di fare qualcosa.  Al terzo anno mi aspetterei qualche cosa di più.  Sto cercando di ricordare me stesso al terzo anno di università.  Sono sicuro che sarei riuscito a risolvere questo problema.&lt;/p&gt;
&lt;p&gt;Ma non importa.  Venerdì prossimo continuerò con esercizi di questo tipo.  Piano piano miglioreremo.  Sono sicuro che, alla fine del corso, gli studenti che avranno continuato a frequentare raggiungeranno l&amp;#8217;obiettivo di diventare (almeno) il doppio più bravi a programmare.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Next speaking engagements</title>
		<link href="http://matteo.vaccari.name/blog/archives/325"/>
		<id>http://matteo.vaccari.name/blog/?p=325</id>
		<updated>2010-02-25T08:56:42+00:00</updated>
		<content type="html">&lt;p&gt;I&amp;#8217;m happy to say that the &lt;a href=&quot;http://matteo.vaccari.name/blog/archives/154&quot;&gt;Birthday Greetings Kata&lt;/a&gt; session that I did with &lt;a href=&quot;http://twitter.com/acarpe&quot;&gt;Antonio&lt;/a&gt; at XP Days Benelux was selected for a second run at the &lt;a href=&quot;http://xpday.net/Xpday2010/Mini%20XPDay/Program.html&quot;&gt;Mini XP Day&lt;/a&gt;!  I hope to see you in Eindhoven, The Netherlands, on April 26.&lt;/p&gt;
&lt;p&gt;My other speaking engagement is a &lt;a href=&quot;http://www.bettersoftware.it/conference/talks/coaching-workshop&quot;&gt;Coaching Workshop&lt;/a&gt;, co-organized with &lt;a href=&quot;http://twitter.com/simonecasc&quot;&gt;Simone Casciaroli&lt;/a&gt;, that will happen at &lt;a href=&quot;http://www.bettersoftware.it/&quot;&gt;Better Software&lt;/a&gt; in Firenze, 5-6 May.  Simone and I were going to present this at the Agile Day 2009, but Simone was hit by flu and could not come.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Report of the first run of the OCP kata</title>
		<link href="http://matteo.vaccari.name/blog/archives/311"/>
		<id>http://matteo.vaccari.name/blog/?p=311</id>
		<updated>2010-02-23T19:49:15+00:00</updated>
		<content type="html">&lt;p&gt;Two weeks ago we had our first meeting of the Milano Coding Dojo.  It was great fun, and I was honored to see Giordano had prepared &lt;a href=&quot;http://giordano.scalzo.biz/2010/02/06/milano-xpug-january-coding-dojo/&quot;&gt;such a good presentation&lt;/a&gt; mentioning, among other things, the &amp;#8220;OCP Kata&amp;#8221; of my &lt;a href=&quot;http://matteo.vaccari.name/blog/archives/293&quot;&gt;earlier blog post&lt;/a&gt;.  The &amp;#8220;Open Closed Principle&amp;#8221; says that we should be able to add new feature by adding code, not by changing existing code (with an exception made for the place where the objects are created; after all, for the new class to be used, it must be instantiated somewhere.)  The OCP Kata is a set of rules, to be used in a training session, that force us to apply the OCP.
&lt;/p&gt;
&lt;p&gt;So this was not only the first test-drive of this Dojo, but also of the OCP Kata.  How did it go?
&lt;/p&gt;
&lt;p&gt;We worked randori-style on the Yathzee kata.  My impressions follow.
&lt;/p&gt;
&lt;h4&gt;On the OCP Kata rules&lt;/h4&gt;
&lt;p&gt;The OCP Kata was an influence only for the first test (forced us to use an explicit factory) and the second test (forced us to apply the OCP).  After that, the OCP rules did not fire, as the problem was naturally easy to be solved in OCP style.  After all, it was the implementation of a series of scoring rules for the Yathzee game.  Once you have the scoring rules machinery in place, everything else can be completed just by adding a new class (and modifying the factory).&lt;/p&gt;
&lt;h4&gt;One class, many uses&lt;/h4&gt;
&lt;p&gt;    We must always keep an eye on the design.  The complexity of the code kept going up, until we worked hard at removing duplication.  The OCP rules do not produce a good design by themselves.  Early in the kata, the rule for &amp;#8220;twos&amp;#8221; was the same as the rule for &amp;#8220;threes&amp;#8221; with 3 in place of 2.  The solution was to create a SingleNumberRule that takes the number in the constructor.  We avoided making two classes, when a single class could be used in different context with different configuration.      &lt;/p&gt;
&lt;p&gt;    The driving force was &lt;em&gt;removing duplication&lt;/em&gt;.
&lt;/p&gt;
&lt;h4&gt;More duplication&lt;/h4&gt;
&lt;p&gt;    Later, we had a lot of duplication between the &amp;#8220;pair&amp;#8221; rule, and the &amp;#8220;double pair&amp;#8221; rule.  The code that looks for a pair is needed in both rules.  An old-school OO programmer would have made the two rules derive from a common, abstract base class.  The abstract base class would be a repository for shared methods.  Modern OO programmers know to use inheritance only as a last resort.  So what could we do to remove duplication without inheritance?  One key observation was that most of that duplicated code was looking heavily into the array of rolls.  When you have code that uses heavily a data structure, it&amp;#8217;s a good idea to move both data structure and code in an object.
&lt;/p&gt;
&lt;p&gt;
    The natural name for that object is &amp;#8220;hand&amp;#8221;, so we created a Hand class that wraps the array of die rolls.  The duplicated code disappeared.
&lt;/p&gt;
&lt;p&gt;    The driving forces were &lt;em&gt;removing duplication&lt;/em&gt; and &lt;em&gt;avoiding direct access to data&lt;/em&gt;.
&lt;/p&gt;
&lt;h4&gt;Finding abstractions&lt;/h4&gt;
&lt;p&gt;    The code in the Hand class was still not good enough.  It was &lt;a href=&quot;http://matteo.vaccari.name/blog/archives/174&quot;&gt;full of loops&lt;/a&gt;.  There was no flash of insight here, we just applied a few &amp;#8220;extract method&amp;#8221;s that moved each loop in its own little method.  Once we did that, we realized that some loops depended on another one that counts the occurrences of each number in the hand.  For instance, the occurrences in the hand (1, 1, 3, 3, 4) are (2, 0, 2, 1, 0, 0).  This is a key abstraction in this domain.
&lt;/p&gt;
&lt;p&gt;    The other abstraction that is needed to implement the pair rule is &amp;#8220;find me the highest pair&amp;#8221;, which is just max{i | occurrences(i) &amp;ge; 2}.  (It is not enough to score *any* pair.  It must be the highest pair, if more are present.)
&lt;/p&gt;
&lt;p&gt;    To implement the &amp;#8220;double pair&amp;#8221; rule, we need a way to say &amp;#8220;find the second highest pair&amp;#8221;.  One way to say this is that if the highest pair is, say, 4, we must look for the highest pair that is less then 4.  The method we need is
&lt;/p&gt;
&lt;pre&gt;
    public int highestPairLessThen(int n) {
       return max{i | occurrences(i) &amp;ge; 2 &amp;amp;&amp;amp; i &amp;lt; n};
    }
&lt;/pre&gt;
&lt;p&gt;Now the two pairs rule was easy to implement:&lt;/p&gt;
&lt;pre&gt;
    public int highestPair() {
      return highestPairLessThen(7);
    }

    public int secondHighestPair() {
      return highestPairLessThen(highestPair());
    }
&lt;/pre&gt;
&lt;p&gt;The solution here was to find the right abstractions, and implement complex things in terms of simple things.  It&amp;#8217;s a bit of functional programming in the small.  &lt;/p&gt;
&lt;h4&gt;Conclusions&lt;/h4&gt;
&lt;p&gt;The goal of good design is to have simple building blocks that can be combined together to create complex things.  When we are at the object-talking-to-other-objects level, the OCP principles guides us to invent object abstractions.  When we are in the small, within-the-object level, it&amp;#8217;s good to apply some mathematical thinking.  It&amp;#8217;s not deep, difficult mathematics.  It&amp;#8217;s just a game of finding the right definitions, and using them to express complex things in terms of simpler things.&lt;/p&gt;
&lt;p&gt;
  &lt;strong&gt;Update: cleaned up HTML, added headings&lt;/strong&gt;&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">The way we plan</title>
		<link href="http://metalelf0dev.blogspot.com/2010/02/way-we-plan.html"/>
		<id>tag:blogger.com,1999:blog-4048544774153045973.post-8534254855333607562</id>
		<updated>2010-02-23T10:34:32+00:00</updated>
		<content type="html">&lt;span class=&quot;Apple-style-span&quot;&gt;In our Agile team, we have iterations lasting one week, and we plan our work every Monday morning. Our customer comes to our office, we gather around a table, and we watch the project backlog to choose the new stories to be worked in the current week.&lt;div&gt;For the majority of the User Stories, we already have an estimate made at the beginning of the project. This estimate has been made in Story Points, and sometimes it's really inaccurate, because when we started our project some features looked really different to our eyes; so, we have to re-estimate these stories. For this we use another measuring unit, the Pomodoro (look &lt;a href=&quot;http://www.pomodorotechnique.com/&quot;&gt;here&lt;/a&gt; if you don't know what I'm talking about).&lt;/div&gt;&lt;div&gt;After these estimates, we decide with our customer which user stories are to be worked in the current iteration, trying to balance the business value and the stories costs. We plan stories to fit our work capacity for the iteration (e.g., 3 developer pairs work each 10 pomodori per day, so in a week we can plan 150 pomodori/pair).&lt;/div&gt;&lt;div&gt;Of course, when we discuss features with the customers, some new stories may be introduced, some could get splitted, and some others delayed for future releases.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's something wrong with this. First of all, estimating in Pomodori needs a lot of deep analysis to be made to get to an accurate estimate. This slows the estimating process a lot, because we end up talking about implementation details. Of course our customer gets bored soon, as he's not a technical customer. We introduced this way of estimating after the first iterations of the project, because we were estimating using Story Points, and we were having a very low accuracy; later, we never tried to switch back to Story Points, even if now our accuracy could have improved. Just to mess things up, we also use a &quot;fake&quot; Story Point measuring, obtained just multiplying pomodori by 10.  So we estimate 10 pomodori, and we write 1 story point. Using the Real Story Points could speed up our planning work a lot, because we could step up by an order of magnitude, and estimate user stories comparing them with the ones already worked.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Another problem we are having is that we're splitting stories too much. We're following a rule of thumb, like &quot;no stories bigger than 2 points&quot;. Such a rule had been voted in a retrospective, after a couple of weekly fails. We had some big stories (like 4 points stories) not being accepted by our customer because of minor issues; so we decided to split them up, to minimize the impact of a rejected user story on the iteration score. The wrong thing with this approach is that we're just changing the way of measuring our system to obtain better measures. Think about it: an iteration ends, and you discover a bug during the demo. Of course you'll have to fix it in the following iteration, and of course this will cost you some additional work. If the iteration scores are 2-10 or 5-7, nothing changes in the system; you still would need to do some additional work. The only thing changing is a couple of numbers written on a spreadsheet. Also, different iteration scores would impact only on the short term velocity, and would instead have no effect on the long term velocity. The short term measure gives no confidence and is much less important than the long term one, so there's no need of getting better short term results. This &quot;hack&quot; on measuring, in our case, is also introducing new problems. We spend time thinking about ways to correctly split stories, we introduce unneeded dependencies and we get to stories which are really difficult to demonstrate to the customer.&lt;/div&gt;&lt;div&gt;  &lt;/div&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/4048544774153045973-8534254855333607562?l=metalelf0dev.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>MetalElf0</name>
			<email>noreply@blogger.com</email>
			<uri>http://metalelf0dev.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Just another developer blog</title>
			<link rel="self" href="http://metalelf0dev.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-4048544774153045973</id>
			<updated>2010-03-01T16:40:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="it">
		<title type="html">My first test using webdriver (aka Selenium 2.0)!</title>
		<link href="http://xplayer.wordpress.com/2010/02/19/my-first-test-using-webdriver-aka-selenium-2-0/"/>
		<id>http://xplayer.wordpress.com/?p=143</id>
		<updated>2010-02-18T23:24:17+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://www.the-arm.com/2010/02/suffering-of-selenese-flu-try-webdriver/&quot;&gt;As many say&lt;/a&gt;, a good solution to &lt;em&gt;selenese flu&lt;/em&gt; is &lt;strong&gt;Webdriver&lt;/strong&gt; (see more at &lt;a rel=&quot;nofollow&quot; href=&quot;http://code.google.com/p/selenium&quot;&gt;http://code.google.com/p/selenium&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Webdriver has been accepted by the Selenium guys as the new approach  to web application testing, opposed to the classical &amp;#8220;selenium 1.0&amp;#8243;  approach, based on a javascript driver, which suffers from way too many  issues.&lt;br /&gt;
Unfortunately, Selenium 2.0, which plan to fully support Webdriver, is  still on an alpha release, and actually is very difficult to find  ruby-based web testing tools supporting this alpha version of selenium  2.0.&lt;br /&gt;
One of those tools is actually Watir (though Webrat too is planning to  support Selenium 2.0 sooner or later), and more precisely &lt;a rel=&quot;nofollow&quot; href=&quot;http://github.com/jarib/watir-webdriver&quot;&gt;this  project&lt;/a&gt; is quite stable to allow a first test drive.&lt;/p&gt;
&lt;p&gt;So this is what I did:&lt;/p&gt;
&lt;p&gt;First: installed required gems&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre&gt;  sudo gem install selenium-webdriver
  sudo gem install watir-webdriver --pre
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Second: configure my Rails testing configuration to use watir&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;config/environments/test.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;  ...
  config.gem &quot;watir-webdriver&quot;
  ...
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;test/test_helper.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;  require 'test_help'
  ...
  require 'watir-webdriver'
  ...
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Third: write a test&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;test/integration/paypal_integration_test.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;require 'test_helper'

class PaypalIntegrationTest &amp;lt; ActionController::IntegrationTest
  include LocaleHelper
  self.use_transactional_fixtures = false

  def setup
    ... some setup stuff here ...
    @browser = Watir::Browser.new(:firefox)
  end

  def teardown
    @browser.close
  end

  test &quot;something interesting&quot; do
    @browser.goto &quot;https://developer.paypal.com/&quot;
    @browser.text_field(:name, &quot;login_email&quot;).set &quot;my_test_account@sourcesense.com&quot;
    @browser.text_field(:name, &quot;login_password&quot;).set &quot;mysecret&quot;
    @browser.button(:name, &quot;submit&quot;).click

    @browser.goto &quot;https://localhost&quot;

    @browser.link(:id, 'loginlink').click
    @browser.text_field(:name, &quot;email&quot;).set @user.email
    @browser.text_field(:name, &quot;password&quot;).set @user.password
    @browser.button(:text, &quot;Login&quot;).click

    # add_a_product_to_cart
    product = Factory(:product, :code =&amp;gt; &quot;a code&quot;, :categories =&amp;gt; [@juve_store])
    Factory(:product_variant, :code =&amp;gt; &quot;03&quot;, :availability =&amp;gt; 99, :product =&amp;gt; product)
    @browser.goto &quot;https://localhost/frontend/products/show/#{product.id}&quot;
    @browser.button(:id, &quot;add_to_cart&quot;).click

    @browser.link(:text, &quot;Checkout&quot;).click
    @browser.link(:id, &quot;gotobuy&quot;).click

    # choose &quot;Paypal&quot;
    @browser.radios.last.set

    @browser.link(:id, &quot;gotobuy&quot;).click

    sleep 5
    assert @browser.text.include?(&quot;Payment for order #{last_order_number()}&quot;)

    @browser.text_field(:name, &quot;login_email&quot;).set &quot;my_test_buyer@sourcesense.com&quot;
    @browser.text_field(:name, &quot;login_password&quot;).set &quot;yetanothersecrethere&quot;
    @browser.button(:text, &quot;Accedi&quot;).click
    @browser.button(:text, &quot;Paga ora&quot;).click

    sleep 5
    assert @browser.text.include?(&quot;Il pagamento è stato inviato&quot;)

    @browser.button(:id, &quot;merchantReturn&quot;).click
    assert_contain_waiting(&quot;Your purchase&quot;)
    assert_contain_waiting(last_order_number())

  end

private

  def last_order_number
    Order.last ? Order.last.number : &quot;&quot;
  end

end
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Some comments here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is a spike, so please don&amp;#8217;t say this test is too long and not  well refactored &lt;img src=&quot;https://dev.sourcesense.com/confluence/images/icons/emoticons/smile.gif&quot; border=&quot;0&quot; alt=&quot;&quot; width=&quot;20&quot; height=&quot;20&quot; align=&quot;absmiddle&quot; /&gt;&lt;/li&gt;
&lt;li&gt;I had to put two sleep calls in two places (I gotta say that this  specific test, involving paypal sandbox, is really slow due to the  slowness in the paypal response time).&lt;/li&gt;
&lt;li&gt;Anyway, this alpha version of webdriver is still lacking: I cannot  say wheather this is a problem I&amp;#8217;ll have even with future (possibly more  stable) version of Webdriver.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://zeljkofilipin.com/2010/01/12/watir-on-webdriver/&quot;&gt;http://zeljkofilipin.com/2010/01/12/watir-on-webdriver/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://developer-in-test.blogspot.com/2010/01/chromewatir-watir-webdriver-update.html&quot;&gt;http://developer-in-test.blogspot.com/2010/01/chromewatir-watir-webdriver-update.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;http://jarib.github.com/watir-webdriver/doc/index.html&quot;&gt;http://jarib.github.com/watir-webdriver/doc/index.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/xplayer.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/xplayer.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/xplayer.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/xplayer.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/xplayer.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/xplayer.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/xplayer.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/xplayer.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/xplayer.wordpress.com/143/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/xplayer.wordpress.com/143/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=xplayer.wordpress.com&amp;blog=532244&amp;post=143&amp;subd=xplayer&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Piero Di Bello</name>
			<uri>http://xplayer.wordpress.com</uri>
		</author>
		<source>
			<title type="html">XPlayer</title>
			<subtitle type="html">eXtreme Programming e mondo agile</subtitle>
			<link rel="self" href="http://xplayer.wordpress.com/feed/"/>
			<id>http://xplayer.wordpress.com/feed/</id>
			<updated>2010-02-18T23:40:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Good news, bad news</title>
		<link href="http://boldlyopen.com/2010/02/18/good-news-bad-news/"/>
		<id>http://boldlyopen.com/?p=408</id>
		<updated>2010-02-18T18:08:06+00:00</updated>
		<content type="html">&lt;p&gt;The good news, I&amp;#8217;m back to blogging after a few months of hiatus. The bad news, I wish I had better stuff to write than this rant/complaint/rectification.&lt;/p&gt;
&lt;p&gt;The good news, &lt;a href=&quot;http://edmaster.it/index.php?p=prodotti&amp;sez=magazine&amp;cat=3&amp;prod=5&quot;&gt;my press clipping database just got bigger&lt;/a&gt;, my mom will be happy. The bad news, I have been seriously misrepresented.&lt;/p&gt;
&lt;p&gt;The good news take an email interview at face value and just copies what I said, as in (it&amp;#8217;s in Italian, but I&amp;#8217;m trying to translate it as literally as possible &amp;#8211; all emphasis are mine):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Q:&lt;/strong&gt; Since when have you been using Linux [...]?&lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;A: &lt;/strong&gt; [...] After my first Slackware I moved to Debian (I have to admit having some casual affairs with Ubuntu) and I never looked back. &lt;strong&gt;Although it breaks my heart to admit that my computer is actually a Mac: life is too short to configure a Bluetooth connection or scramble with a projector&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Q:&lt;/strong&gt; What about Linux on the desktop, do you think it&amp;#8217;s ready for prime time? Any advice to make things better?&lt;/em&gt;&lt;em&gt; &lt;/em&gt;&lt;br /&gt;
&lt;strong&gt;A:&lt;/strong&gt; I use a Mac, and you will have to take it from my dead cold hands.&lt;strong&gt; I have always been skeptical on Linux as a general purpose desktop system&lt;/strong&gt;, although I have better feelings for focused installs (such as cash registers) or devices such as phones, netbooks and media players.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The bad news decide they knows better and turn it into:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A: &lt;/strong&gt; [...] After my first Slackware I moved to Debian (I have to admit having some casual affairs with Ubuntu) and I never looked back.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; &lt;strong&gt;I always strongly believed in GNU/Linux as a server OS, but I think it works just fine on general-purpose desktop systems.&lt;/strong&gt; Personally, I tend to trust it more for focused installs (such as cash registers) or devices such as phones, netbooks and media players.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So much for a magazine claiming to be the most reputable source of Linux news in Italy. I don&amp;#8217;t care enough to ask for an official statement/amendment/rectification, but I thought to give my few readers a chance to get the good news. By the way, &lt;a href=&quot;http://www.sauria.com/blog/&quot;&gt;Ted&lt;/a&gt;, if you are reading this, know that it wasn&amp;#8217;t me pointing them to &lt;a href=&quot;http://www.flickr.com/photos/twleung/2045073549/&quot;&gt;the picture&lt;/a&gt; they used for their article (I suggested &lt;a href=&quot;http://www.flickr.com/photos/gianugo/2219708830/&quot;&gt;this one&lt;/a&gt;): I hope they sent you a cheque!&lt;/p&gt;
&lt;p&gt;While at it, more good news: &lt;a href=&quot;http://alessandra.rabellino.it&quot;&gt;Alessandra&lt;/a&gt; is a darling, &lt;a href=&quot;http://boldlyopen.com/2009/11/05/time-for-some-news-bpmo-is-on-his-way/&quot;&gt;Laura&lt;/a&gt; (yay, it&amp;#8217;s a girl!) is growing fast, and we can&amp;#8217;t wait to get into sleepless night mode again! &lt;/p&gt;</content>
		<author>
			<name>Gianugo Rabellino</name>
			<uri>http://boldlyopen.com</uri>
		</author>
		<source>
			<title type="html">Boldly Open</title>
			<subtitle type="html">To boldly muse about Open Source</subtitle>
			<link rel="self" href="http://boldlyopen.com/feed/"/>
			<id>http://boldlyopen.com/feed/</id>
			<updated>2010-03-14T10:40:09+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en-US">
		<title type="html">Proposal of a CMIS Connector for GateIn</title>
		<link href="http://www.open4dev.com/journal/2010/2/17/proposal-of-a-cmis-connector-for-gatein.html"/>
		<id>288041:2935920:6728441</id>
		<updated>2010-02-17T21:23:28+00:00</updated>
		<content type="html">&lt;p&gt;&lt;span class=&quot;full-image-float-right ssNonEditable&quot;&gt;&lt;span&gt;&lt;a href=&quot;http://www.open4dev.com/journal/2010/2/17/proposal-of-a-cmis-connector-for-gatein.html&quot;&gt;&lt;img src=&quot;http://www.open4dev.com/storage/img/logos/GateIn%20Logo.png?__SQUARESPACE_CACHEVERSION=1266443869177&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;During these days I have realized that probably it could be very useful to have an unique repository to maintain all of our contents.&amp;nbsp;Whenever you need to install a portal or an ECM in your infrastructure, you need to add a new specific repository with an its own technology or a specific API.&lt;/p&gt;</content>
		<author>
			<name>Piergiorgio Lucidi</name>
			<uri>http://www.open4dev.com/journal/</uri>
		</author>
		<source>
			<title type="html">Open4Dev</title>
			<link rel="self" href="http://www.open4dev.com/journal/rss.xml"/>
			<id>http://www.open4dev.com/journal/rss.xml</id>
			<updated>2010-03-08T15:40:08+00:00</updated>
			<rights type="html">All Content © 2008, Piergiorgio Lucidi. Some rights reserved. Creative Commons License 3.0 BY</rights>
		</source>
	</entry>

	<entry xml:lang="it">
		<title type="html">A (still brief) experience on using Selenium to test a Rails + ajax app</title>
		<link href="http://xplayer.wordpress.com/2010/02/08/a-still-brief-experience-on-using-selenium-to-test-a-rails-ajax-app/"/>
		<id>http://xplayer.wordpress.com/?p=139</id>
		<updated>2010-02-08T21:50:43+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;div&gt;
&lt;div&gt;
&lt;p&gt;This is a note to make a point on our (mine and my team&amp;#8217;s) current use of Selenium  to test the ajax behaviour in the Rails webapp we&amp;#8217;re currently developing. Ajax replacing of part of the page is growing, and with it we have  to face the classical question: &lt;em&gt;&amp;#8220;how do we test (I mean  automatically :-) the  ajax/javascript behaviours in our webapp?&amp;#8221;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;This is how we are trying to manage this issue now, after some days  of spiking on Selenium, Watir and BlueRidge (I hope to write more on Watir and BlueRidge in some future post, because these two tools are worth speaking).&lt;/p&gt;
&lt;p&gt;Actually we are giving a try to the combination of Webrat + Selenium,  since we already have a big test suite of integration test using Webrat,  and have a good knowledge of the Webrat API.&lt;/p&gt;
&lt;p&gt;We added the selenium-client gem to be able to drive Selenium through  the Webrat API.&lt;br /&gt;
This is extracted from our test environment configuration file:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;test.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;...
config.gem 'selenium-client', :lib =&amp;gt; 'selenium/client'
config.gem &quot;webrat&quot;, :version =&amp;gt; '&amp;gt;= 0.6.0'
...&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then, we defined a class from which all the selenium test cases will  inherit.&lt;br /&gt;
This class basically is used to&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;disable the transactional fixtures in Rails, to allow the browser  process where Selenium runs to access the data prepared in the tests&lt;/li&gt;
&lt;li&gt;configure Webrat with the &amp;#8220;selenium&amp;#8221; mode&lt;/li&gt;
&lt;li&gt;be the place to collect helper methods as &amp;#8220;login&amp;#8221; or &amp;#8220;logout&amp;#8221;, used  in many tests.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;selenium_integration_test.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;class SeleniumIntegrationTest &amp;lt; ActionController::IntegrationTest
  self.use_transactional_fixtures = false

  setup :switch_webrat_to_selenium
  def switch_webrat_to_selenium
    Webrat.configure do |config|
      config.mode = :selenium
      config.application_environment = :test
    end

    selenium.set_speed(100)       # default is 0 ms
    selenium.set_timeout(10000)   # default is 30000 ms
  end

  teardown :delete_cookies
  def delete_cookies
    selenium.delete_all_visible_cookies
  end

protected
 ...
 [other helper methods here, like login, logout, and so on...]

 ...&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We also added a rake task to be able to launch all the selenium tests&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;test.rake&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;namespace :test do
  ...
  ...

  desc &quot;Run Selenium Test&quot;
  Rake::TestTask.new(:selenium) do |t|
    t.libs &amp;lt;&amp;lt; &quot;test&quot;
    t.test_files = FileList['test/selenium/*test.rb']
    t.verbose = true
  end
end&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One thing we learned through several repeated mistakes is that the  Webrat API is different when called in the &amp;#8220;selenium&amp;#8221; mode then the one  we were used to when using Webrat in the classical &amp;#8220;rails&amp;#8221; mode.&lt;br /&gt;
For example, the &amp;#8220;assert_have_selector&amp;#8221; method for selenium only takes  one argument, that is the CSS selector, while in the classical webrat  mode, the same method takes another parameter to specify the expected  content to match with (see this rdoc: &lt;a rel=&quot;nofollow&quot; href=&quot;http://gitrdoc.com/brynary/webrat/tree/master&quot;&gt;http://gitrdoc.com/brynary/webrat/tree/master&lt;/a&gt;).  So we had to define helper methods based on &amp;#8220;assert_have_xpath&amp;#8221; method  using xpath to express the same intent of a method like  assert_have_selector(css_selector, expected_content)&lt;/p&gt;
&lt;p&gt;Here is our helper method&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&lt;strong&gt;selenium_integration_test.rb&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre&gt;  ...
  def assert_has_id id, text_content
    assert_have_xpath &quot;//*[@id='#{id}'][1][text()='#{text_content}']&quot;
  end
  ...&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/xplayer.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/xplayer.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/xplayer.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/xplayer.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/xplayer.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/xplayer.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/xplayer.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/xplayer.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/xplayer.wordpress.com/139/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/xplayer.wordpress.com/139/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=xplayer.wordpress.com&amp;blog=532244&amp;post=139&amp;subd=xplayer&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Piero Di Bello</name>
			<uri>http://xplayer.wordpress.com</uri>
		</author>
		<source>
			<title type="html">XPlayer</title>
			<subtitle type="html">eXtreme Programming e mondo agile</subtitle>
			<link rel="self" href="http://xplayer.wordpress.com/feed/"/>
			<id>http://xplayer.wordpress.com/feed/</id>
			<updated>2010-02-18T23:40:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Niente Shore né Larsen</title>
		<link href="http://matteo.vaccari.name/blog/archives/309"/>
		<id>http://matteo.vaccari.name/blog/?p=309</id>
		<updated>2010-02-06T11:15:51+00:00</updated>
		<content type="html">&lt;p&gt;Summary: the Shore + Larsen course due in Milan this month is cancelled due to not enough attendance.  Too bad.&lt;/p&gt;
&lt;p&gt;Che peccato!  &lt;a href=&quot;http://www.metodiagili.it/&quot;&gt;XP Labs&lt;/a&gt; mi ha scritto che i corsi di James Shore e Diana Larsen che avrebbero dovuto esserci questo mese, sono stati annullati per il numero insufficiente di iscritti.  Sarebbe stata un&amp;#8217;occasione unica per noi della zona di Milano di imparare da questi autori.  Io sono un grande fan del manuale di Shore e Warden.&lt;/p&gt;
&lt;p&gt;Mi sono allora iscritto ai &lt;a href=&quot;http://www.metodiagili.it/formazione/skills-for-the-agile-designer/index.html&quot;&gt;i corsi di Rebecca Wirfs-Brock&lt;/a&gt;, che saranno in marzo.  Spero proprio che si riesca a raggiungere il numero!  Gli autori di &lt;a href=&quot;http://www.growing-object-oriented-software.com/&quot;&gt;Growing Object-Oriented Software&lt;/a&gt; citano Rebecca come l&amp;#8217;originatrice dello stile di design che prediligono.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="it">
		<title type="html">Fixing SeleniumRC to work with Firefox 3.6</title>
		<link href="http://xplayer.wordpress.com/2010/02/04/fixing-seleniumrc-to-work-with-firefox-3-6/"/>
		<id>http://xplayer.wordpress.com/?p=132</id>
		<updated>2010-02-03T23:27:36+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;The brand new release of Firefox 3.6 brings, together with some improvements in the browser, also some headaches for all selenium users: actually the latest selenium RC jar (selenium-server.jar) won&amp;#8217;t work with Firefox 3.6.&lt;/p&gt;
&lt;p&gt;The problem is related to the addons that Selenium will pretend to have in the Firefox instance fired up when Selenium RC server starts. As a matter of fact, those two addons are not declared to be compatible with 3.6.&lt;/p&gt;
&lt;p&gt;The simple fix is then to edit the addons&amp;#8217; install.rdf files in the selenium-server.jar to manually set the compatibility to 3.6.&lt;/p&gt;
&lt;p&gt;Alternatively, you can download &lt;a href=&quot;http://github.com/saucelabs/saucelenium/blob/master/selenium-sauce.jar&quot;&gt;this patched jar&lt;/a&gt; from &lt;a href=&quot;http://github.com/saucelabs/saucelenium/&quot;&gt;this&lt;/a&gt; repository, rename it to selenium-server.jar and replace the previous jar with this.&lt;/p&gt;
&lt;p&gt;The actual steps to fix my webrat gem (I use Selenium through Webrat) were&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;download the above mentioned file (http://github.com/saucelabs/saucelenium/blob/master/selenium-sauce.jar)&lt;/li&gt;
&lt;li&gt;rename it to selenium-server.jar&lt;/li&gt;
&lt;li&gt;replace the previous file in the vendor folder of your webrat gem (mine was /usr/local/lib/ruby/gems/1.8/gems/webrat-0.7.0/vendor/selenium-server.jar)&lt;/li&gt;
&lt;/ol&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/xplayer.wordpress.com/132/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/xplayer.wordpress.com/132/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/xplayer.wordpress.com/132/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/xplayer.wordpress.com/132/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/xplayer.wordpress.com/132/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/xplayer.wordpress.com/132/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/xplayer.wordpress.com/132/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/xplayer.wordpress.com/132/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/xplayer.wordpress.com/132/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/xplayer.wordpress.com/132/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=xplayer.wordpress.com&amp;blog=532244&amp;post=132&amp;subd=xplayer&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Piero Di Bello</name>
			<uri>http://xplayer.wordpress.com</uri>
		</author>
		<source>
			<title type="html">XPlayer</title>
			<subtitle type="html">eXtreme Programming e mondo agile</subtitle>
			<link rel="self" href="http://xplayer.wordpress.com/feed/"/>
			<id>http://xplayer.wordpress.com/feed/</id>
			<updated>2010-02-18T23:40:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Book] Agile coaching</title>
		<link href="http://tommasotorti.blogspot.com/2010/01/book-agile-coaching.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-4200746088076476248</id>
		<updated>2010-01-18T23:45:36+00:00</updated>
		<content type="html">&lt;a href=&quot;http://merimery.files.wordpress.com/2008/03/cheers.jpg&quot;&gt;&lt;img src=&quot;http://merimery.files.wordpress.com/2008/03/cheers.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I'm reading &quot;&lt;a href=&quot;http://pragprog.com/titles/sdcoach/agile-coaching&quot;&gt;Agile Coaching&lt;/a&gt;&quot;  ; until chapter 4 it's full of trivial suggestions. It looks like a priest when he recommends you to become more good for the near future.&lt;br /&gt;&lt;br /&gt;Now i find some interesting advice. Noone of them is new, but it's always useful remember them.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span&gt;Not Too Easy, Not Too Hard&lt;/span&gt;&lt;br /&gt;The secret to great teams is they need reachable but challenging goals.&lt;br /&gt;Everyone needs to be sufficiently challenged, neither bored nor anxious.&lt;br /&gt;This is the optimum work zone where people enjoy it the most.&lt;br /&gt;If work is too easy, developers will get bored and demotivated. &lt;/blockquote&gt;&lt;br /&gt;... and the solution...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span&gt;Time for Innovation&lt;/span&gt; &lt;span&gt;We’ve met developers on Agile projects who were burned out by working&lt;/span&gt; &lt;span&gt;on a continuous stream of user stories.&lt;/span&gt; &lt;span&gt;If they don’t get time to explore new technology or experiment with&lt;/span&gt; &lt;span&gt;innovative product ideas, teams become demotivated. Make time in&lt;/span&gt; &lt;span&gt;iteration plans for them to explore new ideas.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;(like the Gold Card practice)&lt;br /&gt;&lt;br /&gt;And always remember to...&lt;br /&gt;&lt;blockquote&gt;&lt;span&gt;Celebrate Success&lt;/span&gt;!!!&lt;br /&gt;Find ways to celebrate the success of every release. Having a team&lt;br /&gt;lunch or drinks celebrates success and increases team bonding.&lt;/blockquote&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-4200746088076476248?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Life] customer care</title>
		<link href="http://tommasotorti.blogspot.com/2010/01/i-have-example-of-ugly-customer-care.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-3086862196888065329</id>
		<updated>2010-01-18T23:40:44+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.michelle-adams.com/wp-content/uploads//2009/12/dreamstime_2979123.jpg&quot;&gt;&lt;img src=&quot;http://www.michelle-adams.com/wp-content/uploads//2009/12/dreamstime_2979123.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have an example of an ugly customer care service.&lt;br /&gt;I'm trying to buy some books from bol.it . I don't know the exact reason but bol.it cannot withdrew money from my bank. I asked for some explainations and the answer was (in italian):&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://1.bp.blogspot.com/_zT27dV8plPs/S0YY4DxUTKI/AAAAAAAAAD0/tj4rUEjOclc/s1600-h/mail.jpg&quot;&gt;&lt;img src=&quot;http://1.bp.blogspot.com/_zT27dV8plPs/S0YY4DxUTKI/AAAAAAAAAD0/tj4rUEjOclc/s400/mail.jpg&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5424050152578239650&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;they store my credit card number&lt;br /&gt;&lt;/li&gt;&lt;li&gt;i cannot modify my credit card number&lt;/li&gt;&lt;li&gt;i need to make another order in order to modify my credit card number&lt;/li&gt;&lt;li&gt;i need to call them at a payment phone number ...&lt;/li&gt;&lt;li&gt;...to comunicate by voice another credit card number&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;i think that if you really want my money you need to cherish me.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-3086862196888065329?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="it">
		<title type="html">One (and a half) useful thing to know when using DeepTest gem with MySQL</title>
		<link href="http://xplayer.wordpress.com/2010/01/18/one-and-a-half-useful-thing-to-know-when-using-deeptest-gem-with-mysql/"/>
		<id>http://xplayer.wordpress.com/?p=127</id>
		<updated>2010-01-17T23:22:52+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/qxjit/deep-test&quot;&gt;DeepTest&lt;/a&gt; currently won&amp;#8217;t work if you&amp;#8217;ve configured MySQL with no password (in other words, if you are able to connect to mysql with a simple &amp;#8220;mysql -u root&amp;#8221;).&lt;br /&gt;
To fix this, you have to patch DeepTest (I know, asap I&amp;#8217;ll go through the whole process to propose the patch to the original project leader).&lt;br /&gt;
Actually, you have to comment out a line, in the &lt;em&gt;DeepTest:Database:MysqlSetupListener#grant_privileges &lt;/em&gt;method:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;
&lt;span&gt;def&lt;/span&gt; grant_privileges&lt;span&gt;(&lt;/span&gt;connection&lt;span&gt;)&lt;/span&gt;
sql &lt;span&gt;=&lt;/span&gt; %&lt;span&gt;{&lt;/span&gt;grant all on &lt;span&gt;#{worker_database}.*&lt;/span&gt;
to %s@&lt;span&gt;'localhost'&lt;/span&gt;;&lt;span&gt;}&lt;/span&gt; % &lt;span&gt;[&lt;/span&gt;
connection&lt;span&gt;.&lt;/span&gt;quote&lt;span&gt;(&lt;/span&gt;worker_database_config&lt;span&gt;[&lt;/span&gt;:username&lt;span&gt;]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;# ,&lt;/span&gt;
&lt;span&gt;# connection.quote(worker_database_config[:password])  &amp;lt;-- mysql with no password won't work&lt;/span&gt;
&lt;span&gt;]&lt;/span&gt;
connection&lt;span&gt;.&lt;/span&gt;execute sql
&lt;span&gt;end&lt;/span&gt;
&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;Another tip (the &amp;#8220;half&amp;#8221; in the blog post title):&lt;br /&gt;
Don&amp;#8217;t forget to edit the &amp;#8220;pattern&amp;#8221; option in your DeepTest rake task, to be able to grab all the testcases you want.&lt;br /&gt;
In my case, I want to skip a whole folder containing selenium tests, so I have to write my Deep Test rake file this way:&lt;br /&gt;
(in &lt;em&gt;/lib/tasks/test.rake&lt;/em&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;require&lt;/span&gt; &lt;span&gt;&quot;deep_test/rake_tasks&quot;&lt;/span&gt;
&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;

DeepTest::TestTask&lt;span&gt;.&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; &lt;span&gt;&quot;deep&quot;&lt;/span&gt; &lt;span&gt;do&lt;/span&gt; |t|
t&lt;span&gt;.&lt;/span&gt;number_of_workers &lt;span&gt;=&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;
t&lt;span&gt;.&lt;/span&gt;pattern &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&quot;test/{unit,functional,integration}/**/*_test.rb&quot;&lt;/span&gt;
t&lt;span&gt;.&lt;/span&gt;libs &amp;lt;&amp;lt; &lt;span&gt;&quot;test&quot;&lt;/span&gt;
t&lt;span&gt;.&lt;/span&gt;worker_listener &lt;span&gt;=&lt;/span&gt; &lt;span&gt;&quot;DeepTest::Database::MysqlSetupListener&quot;&lt;/span&gt;
&lt;span&gt;end&lt;/span&gt;
&lt;/pre&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/xplayer.wordpress.com/127/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/xplayer.wordpress.com/127/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/xplayer.wordpress.com/127/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/xplayer.wordpress.com/127/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/xplayer.wordpress.com/127/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/xplayer.wordpress.com/127/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/xplayer.wordpress.com/127/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/xplayer.wordpress.com/127/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/xplayer.wordpress.com/127/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/xplayer.wordpress.com/127/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=xplayer.wordpress.com&amp;blog=532244&amp;post=127&amp;subd=xplayer&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Piero Di Bello</name>
			<uri>http://xplayer.wordpress.com</uri>
		</author>
		<source>
			<title type="html">XPlayer</title>
			<subtitle type="html">eXtreme Programming e mondo agile</subtitle>
			<link rel="self" href="http://xplayer.wordpress.com/feed/"/>
			<id>http://xplayer.wordpress.com/feed/</id>
			<updated>2010-02-18T23:40:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">From the grounds up, your Maven powered Alfresco dev box</title>
		<link href="http://feedproxy.google.com/~r/Skuro/~3/i5HeNHeEBqY/"/>
		<id>http://www.skuro.tk/?p=239</id>
		<updated>2010-01-14T01:01:25+00:00</updated>
		<content type="html">The target
To start your Alfresco development experience, you need a development environment. Let&amp;#8217;s say you&amp;#8217;re more into this Maven and you&amp;#8217;d rather leverage its capabilities instead of using the default ant based build system provided along with the SDK. In this tutorial, I&amp;#8217;ll guide you through the process of setting up from scratch your development [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=i5HeNHeEBqY:u_BsRftt4dc:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=i5HeNHeEBqY:u_BsRftt4dc:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=i5HeNHeEBqY:u_BsRftt4dc:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=i5HeNHeEBqY:u_BsRftt4dc:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/i5HeNHeEBqY&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Carlo Sciolla</name>
			<uri>http://www.skuro.tk</uri>
		</author>
		<source>
			<title type="html">SKURO!</title>
			<subtitle type="html">shading lights</subtitle>
			<link rel="self" href="http://www.skuro.tk/category/sourcesense/feed/"/>
			<id>http://www.skuro.tk/category/sourcesense/feed/</id>
			<updated>2010-03-02T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">clojure.core/str makes sense now</title>
		<link href="http://codemeself.blogspot.com/2010/01/clojurecorestr-makes-sense-now.html"/>
		<id>tag:blogger.com,1999:blog-8666538509897823475.post-2432871122615517596</id>
		<updated>2010-01-12T17:00:58+00:00</updated>
		<content type="html">&lt;h3&gt;&lt;a href=&quot;http://bit.ly/68DPP7&quot;&gt;clojure.core/str&lt;/a&gt; makes sense&lt;/h3&gt;While reading excellent &lt;a href=&quot;http://pragprog.com/titles/shcloj/programming-clojure&quot;&gt;Programming Clojure&lt;/a&gt; by &lt;a href=&quot;http://twitter.com/StuartHalloway&quot;&gt;Stuart Halloway&lt;/a&gt;, instead just reading I started looking into how things are done by &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; itself.&lt;br /&gt;&lt;a href=&quot;http://twitter.com/neotyk/status/7592828560&quot;&gt;Yesterday&lt;/a&gt; it  took me some time before I understood how things are done by &lt;em&gt;&lt;a href=&quot;http://bit.ly/68DPP7&quot;&gt;clojure.core/str&lt;/a&gt;&lt;/em&gt;. This post is documentation of my findings.&lt;br /&gt;Following modification of said function was very helpful in understanding how it works: &lt;br /&gt;&lt;b&gt;&lt;a href=&quot;http://clojure.org/special_forms&quot;&gt;:tag&lt;/a&gt;&lt;/b&gt; metadata key is &lt;q&gt;a symbol naming a class or a Class object that indicates the Java type of the object in the var, or its return value if the object is a fn.&lt;/q&gt;.&lt;br /&gt;Next are three parameters body pairs.&lt;br /&gt; &lt;dl&gt;&lt;dt&gt;&lt;span&gt;([] &quot;&quot;)&lt;/span&gt;&lt;/dt&gt; &lt;dd&gt;No arguments (&lt;a href=&quot;http://en.wikipedia.org/wiki/Arity&quot;&gt;arity&lt;/a&gt; 0) will result in &lt;em&gt;&quot;&quot;&lt;/em&gt; (empty string)&lt;br /&gt;   &lt;br /&gt; &lt;/dd&gt; &lt;dt&gt;&lt;span&gt;([#^Object x]&lt;br /&gt;(if (nil? x) &quot;&quot; (. x (toString))))&lt;/span&gt;&lt;/dt&gt; &lt;dd&gt;One argument call (arity 1) will call &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/lang/Object.html#toString%28%29&quot;&gt;&lt;em&gt;java.lang.Object.toString&lt;/em&gt;&lt;/a&gt; method.&lt;br /&gt;   &lt;em&gt;#^Object&lt;/em&gt; is a &lt;a href=&quot;http://clojure.org/java_interop#toc35&quot;&gt;Type Hint&lt;/a&gt;.&lt;br /&gt;   &lt;a href=&quot;http://clojure.org/special_forms#toc2&quot;&gt;if&lt;/a&gt; should not need much explanation.&lt;br /&gt; &lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;&lt;span&gt;([x &amp;amp; ys]&lt;br /&gt;((fn [#^StringBuilder sb more]&lt;br /&gt;    (if more&lt;br /&gt;      (recur (. sb (append (str (first more)))) (next more))&lt;br /&gt;      (str sb)))&lt;br /&gt;(new StringBuilder #^String (str x)) ys)))&lt;/span&gt;&lt;/dt&gt; &lt;dd&gt;This is where it starts to be interesting.&lt;br /&gt; First unnamed function is defined that accepts &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html&quot;&gt;StringBuilder&lt;/a&gt;&lt;em&gt; sb&lt;/em&gt; and &lt;em&gt;more&lt;/em&gt; params.&lt;br /&gt; If &lt;em&gt;more&lt;/em&gt; is &lt;em&gt;true&lt;/em&gt;, that is not &lt;em&gt;nil&lt;/em&gt; or&lt;em&gt; false&lt;/em&gt; than call recursively self with new parameters&lt;br /&gt;   &lt;ul&gt;&lt;li&gt;&lt;em&gt;sb&lt;/em&gt; with &lt;a href=&quot;http://java.sun.com/javase/6/docs/api/java/lang/StringBuilder.html#append%28java.lang.String%29&quot;&gt;append&lt;/a&gt;ed result of calling &lt;em&gt;str&lt;/em&gt; with first element of &lt;em&gt;more&lt;/em&gt;,&lt;br /&gt;   &lt;/li&gt;   &lt;li&gt;&lt;em&gt;more&lt;/em&gt; with elements after first.&lt;/li&gt; &lt;/ul&gt; If &lt;em&gt;more&lt;/em&gt; is &lt;em&gt;false&lt;/em&gt;, that in our context will happen only when &lt;em&gt;more&lt;/em&gt; is &lt;em&gt;nil&lt;/em&gt;, call&lt;em&gt; sb&lt;/em&gt;'s &lt;em&gt;toString&lt;/em&gt;.&lt;br /&gt; Next just defined function is getting called with new StringBuilder constructed from &lt;em&gt;x&lt;/em&gt; as &lt;em&gt;sb&lt;/em&gt; and &lt;em&gt;ys&lt;/em&gt; as &lt;em&gt;more&lt;/em&gt;.&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;It took me some time to realize that &lt;em&gt;ys&lt;/em&gt; are turning into &lt;em&gt;more&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;So there you have it &lt;em&gt;clojure.core/str&lt;/em&gt; explained.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8666538509897823475-2432871122615517596?l=codemeself.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>neotyk</name>
			<email>noreply@blogger.com</email>
			<uri>http://codemeself.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">code me self</title>
			<subtitle type="html">Hubert Iwaniuk's Blog</subtitle>
			<link rel="self" href="http://www.blogger.com/feeds/8666538509897823475/posts/default"/>
			<id>tag:blogger.com,1999:blog-8666538509897823475</id>
			<updated>2010-03-01T19:10:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Alfresco ACL on WCM WebForms, an howto</title>
		<link href="http://feedproxy.google.com/~r/Skuro/~3/AEt63UF42yg/"/>
		<id>http://www.skuro.tk/?p=171</id>
		<updated>2010-01-12T16:54:10+00:00</updated>
		<content type="html">When it comes to setting up an Alfresco WebProjects, you configure it to make use of a set of WebForms already available on the Alfresco repository. From that moment on, every user with write rights on the web project will be able to pick one web form and push some content through it into the [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AEt63UF42yg:ReKLGLsGDYg:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AEt63UF42yg:ReKLGLsGDYg:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=AEt63UF42yg:ReKLGLsGDYg:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=AEt63UF42yg:ReKLGLsGDYg:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/AEt63UF42yg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Carlo Sciolla</name>
			<uri>http://www.skuro.tk</uri>
		</author>
		<source>
			<title type="html">SKURO!</title>
			<subtitle type="html">shading lights</subtitle>
			<link rel="self" href="http://www.skuro.tk/category/sourcesense/feed/"/>
			<id>http://www.skuro.tk/category/sourcesense/feed/</id>
			<updated>2010-03-02T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The OCP kata</title>
		<link href="http://matteo.vaccari.name/blog/archives/293"/>
		<id>http://matteo.vaccari.name/blog/?p=293</id>
		<updated>2010-01-12T16:49:54+00:00</updated>
		<content type="html">p.note {
    font-size: 95%; 
    width: 80%;
    margin-left: 2em;
    font-style:italic; 
  }

&lt;blockquote&gt;&lt;p&gt;
  Read the first chapter of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Design_Patterns_%28book%29&quot; title=&quot;Design Patterns - Wikipedia, the free encyclopedia&quot;&gt;Patterns book&lt;/a&gt;, it&amp;#8217;s all there, where it says &amp;#8220;favor composition over inheritance&amp;#8221;,
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;said &lt;a href=&quot;http://jfranzoi.wordpress.com/&quot;&gt;Jacopo&lt;/a&gt;.  We were chatting about the &lt;a href=&quot;http://en.wikipedia.org/wiki/Open/closed_principle&quot; title=&quot;Open/closed principle - Wikipedia, the free encyclopedia&quot;&gt;Open/Closed Principle&lt;/a&gt;, and how I read about it in &lt;a href=&quot;http://docs.eiffel.com/book/method/object-oriented-software-construction-2nd-edition&quot; title=&quot;Object-oriented Software Construction, 2nd Edition | Eiffel Documentation&quot;&gt;Meyer&lt;/a&gt; in 1991, yet it didn&amp;#8217;t &amp;#8220;click&amp;#8221; for me back then.&lt;/p&gt;
&lt;p&gt;Now I see how the OCP is key to writing code that can be changed easily, which is the chief technical goal of an agile team.  I wondered, is there a way to teach and learn the OCP?  Is there a kata to learn OCP?  &lt;/p&gt;
&lt;p&gt;It&amp;#8217;s unfortunate that most &lt;a href=&quot;http://katas.softwarecraftsmanship.org/?p=92&quot; title=&quot;String Calculator Series &amp;#8211; Multiple Languages     &amp;raquo; Software Craftsmanship – Katas&quot;&gt;common coding katas&lt;/a&gt; result in &amp;#8220;single-object-oriented programming&amp;#8221;.  The famous &lt;a href=&quot;http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata&quot;&gt;bowling score example&lt;/a&gt; by Robert Martin, for instance, is usually solved by creating *one* object.  This might be fine for learning how to write simple code.  It&amp;#8217;s not so good for learning how to do object-oriented design.  &lt;/p&gt;
&lt;p&gt;So I invented this little exercise to practice and learn OCP.&lt;/p&gt;
&lt;p&gt;Take any &lt;a href=&quot;http://www.rubyquiz.com/&quot; title=&quot;Ruby Quiz&quot;&gt;coding problem&lt;/a&gt;.  The &lt;a href=&quot;http://butunclebob.com/ArticleS.UncleBob.TheBowlingGameKata&quot;&gt;bowling score&lt;/a&gt;, the &lt;a href=&quot;http://katas.softwarecraftsmanship.org/?p=92&quot; title=&quot;String Calculator Series &amp;#8211; Multiple Languages     &amp;raquo; Software Craftsmanship – Katas&quot;&gt;string evaluator&lt;/a&gt;, the &lt;a href=&quot;http://codekata.pragprog.com/2007/01/kata_nine_back_.html&quot; title=&quot;CodeKata: Kata Nine: Back to the CheckOut&quot;&gt;supermarket checkout&lt;/a&gt;, you name it.  Then follow these instructions.&lt;/p&gt;
&lt;p&gt;0. Write the first failing test.  Then write a &lt;em&gt;factory&lt;/em&gt; that returns an object, or an aggregate of objects, that make the test pass.  &lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;The factory should be limited to creating objects and linking them together.  No conditionals allowed.
&lt;/p&gt;
&lt;p&gt;1. Write the next failing test.  &lt;/p&gt;
&lt;p&gt;2. Can you make it pass &lt;em&gt;by changing the factory and/or creating a new class and nothing else&lt;/em&gt;?  If yes, great!  Go back to 1.  If not, refactor until you can.&lt;/p&gt;
&lt;p class=&quot;note&quot;&gt;The refactoring should bring the system to a state where it&amp;#8217;s possible to implement the next test just by changing the aggregate of objects that is returned by the factory.  Be careful not to implement new functionality; the current test should still fail. &lt;/p&gt;
&lt;p&gt;For instance, take the bowling score problem.  The first test is&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;
  @Test public void gutterGame() throws Exception {
    BowlingGame game = new BowlingGameFactory().create();
    for (int i=0; i&amp;lt;20; i++) {
      game.roll(0);
    }
    assertEquals(0, game.score());
  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The code to make this pass is &lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;
  class BowlingGameFactory {
    public BowlingGame create() {
      return new BowlingGame();
    }
  }

  class BowlingGame {
    public void roll(int n) {}
    public int score() {
      return 0;
    }
  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Nothing strange here.  Now the second test is &lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;
  @Test public void allOnesGame() throws Exception {
    BowlingGame game = new BowlingGameFactory().create();
    for (int i=0; i&amp;lt;20; i++) {
      game.roll(1);
    }
    assertEquals(20, game.score());
  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The simplest code that makes both tests pass would be to change BowlingGame to accumulate rolls in a variable.  But our rules stop us from doing that; we must find a way to implement the new functionality with a new object.  I think about it for a few minutes, and all I can think of is to delegate to another object the accumulation of rolls.  I will call this role &amp;#8220;Rolls&amp;#8221;.  Cool!  This forces me to invent a new design idea.  But I must be careful not to add new functionality, so I will just write a Rolls object that always returns 0.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;
  interface Rolls {
    void add(int n);
    int sum();
  }

  class BowlingGame {
    private final Rolls rolls;

    public BowlingGame(Rolls rolls) {
      this.rolls = rolls;
    }

    public void roll(int n) {
      rolls.add(n);
    }

    public int score() {
      return rolls.sum();
    }
  }

  class BowlingGameFactory {
    public BowlingGame create() {
      Rolls zero = new Rolls() {
        public void add(int n) {}
        public int sum() { return 0; }
      };
      return new BowlingGame(zero);
    }
  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This passes the first test, and still fails the second.  In order to pass the second test, all I have to do is provide a real implementation of Rolls and change the factory.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre name=&quot;code&quot; class=&quot;java:nocontrols:nogutter&quot;&gt;
  class Accumulator implements Rolls {
    void add(int n) { ... }
    int sum() { ... }
  }

  class BowlingGameFactory {
    public BowlingGame create() {
      return new BowlingGame(new Accumulator());
    }
  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And so on.   The point here is to think about how to&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;compose functionality out of existing objects, and&lt;/li&gt;
&lt;li&gt;avoid reworking existing code.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Feedback?&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Code] java quiz</title>
		<link href="http://tommasotorti.blogspot.com/2010/01/code-java-quiz.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-5342824769537494286</id>
		<updated>2010-01-05T17:43:03+00:00</updated>
		<content type="html">&lt;a href=&quot;http://chris-lamb.co.uk/wp-content/2007/java-time.jpeg&quot;&gt;&lt;img src=&quot;http://chris-lamb.co.uk/wp-content/2007/java-time.jpeg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;First&lt;/span&gt;&lt;br /&gt;Look at the following test code:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span&gt;@Test&lt;/span&gt;&lt;br /&gt;&lt;span&gt;public void quiz1() throws Exception {&lt;/span&gt;&lt;br /&gt;&lt;span&gt;        assertEquals(9, 01 + 08);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;The result is:&lt;br /&gt;1) green bar&lt;br /&gt;2) red bar&lt;br /&gt;3) doesn't compile&lt;br /&gt;4) it throws an exception&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Second&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span&gt;@Test&lt;/span&gt;&lt;br /&gt;&lt;span&gt;public void quiz2() throws Exception {&lt;/span&gt;&lt;br /&gt;&lt;span&gt; Integer x = 1288;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; Integer y = 1288;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; assertTrue(x == y);&lt;/span&gt;&lt;br /&gt;&lt;span&gt; int z = 1288;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; assertTrue(x == z);&lt;/span&gt;&lt;br /&gt;&lt;span&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;1) first assert red, second green&lt;br /&gt;2) green, red&lt;br /&gt;3) green, green&lt;br /&gt;4) red, red&lt;br /&gt;5) doesn't compile&lt;br /&gt;6) it throws an exception&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-5342824769537494286?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Project automation for Confluence plugins</title>
		<link href="http://matteo.vaccari.name/blog/archives/289"/>
		<id>http://matteo.vaccari.name/blog/?p=289</id>
		<updated>2010-01-04T18:09:42+00:00</updated>
		<content type="html">&lt;p&gt;A while ago &lt;a href=&quot;http://www.sourcesense.com/&quot;&gt;our team&lt;/a&gt; was working at customizing &lt;a href=&quot;http://www.atlassian.com/software/confluence/&quot;&gt;Confluence&lt;/a&gt; for one of our customers.  I&amp;#8217;d like to share a few tips on how to automate Confluence plugin deployments.&lt;/p&gt;
&lt;p&gt;  (It should not be necessary to point out that all &lt;strong&gt;repetitive operations should be automated&lt;/strong&gt;.  Read all about it in &lt;a href=&quot;http://pragprog.com/titles/tpp/the-pragmatic-programmer&quot;&gt;The Pragmatic Programmer&lt;/a&gt; and &lt;a href=&quot;http://pragprog.com/titles/auto/pragmatic-project-automation&quot;&gt;Pragmatic Project Automation&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Our automation was mostly Bash-based.  I think it&amp;#8217;s important to write expressive code in any language.  When you&amp;#8217;re scripting with Bash, the main way to be expressive is to use &lt;em&gt;&lt;a href=&quot;http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-8.html&quot;&gt;functions&lt;/a&gt;&lt;/em&gt;.  We keep our scripts in a &lt;code&gt;$(project)/script&lt;/code&gt; directory, so that you can invoke them with a minimum of keystrokes.  The script we use for installing our plugin on localhost is:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
 1  confluence_url=http://localhost:8080
 2  confluence_install=~/confluence-2.9.2-std
 3  admin_password=admin
 4
 5  source src/main/bash/lib.sh || exit 1
 6
 7  quietmvn package || exit 1
 8  plugin_jar=$(ls target/ourplugin-*.jar)
 9  [ -f &quot;$plugin_jar&quot; ] || (echo &quot;no plugin generated&quot;; exit 1)
10  confluence_login
11  confluence_uninstall_plugin
12  confluence_install_plugin
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Lines 1-3 set up some variables for future use.  &lt;/p&gt;
&lt;p&gt;Line 5 loads our library of functions in the current shell process.  The &amp;#8220;&lt;code&gt;|| exit 1&lt;/code&gt;&amp;#8221; bit means &amp;#8220;if this command fails, then quit immediately&amp;#8221;.&lt;/p&gt;
&lt;p&gt;The &amp;#8220;&lt;code&gt;quietmvn&lt;/code&gt;&amp;#8221; in line 7 invokes maven with a filter that hides useless warnings.  We found that Confluence plugin builds generate a lot of warnings due to dependencies on Atlassian packages that have poorly written &amp;#8220;pom.xml&amp;#8221; files.  This (according to Atlassian) is harmless; but then again, useless warnings are harmful, so we filter them out.  &lt;/p&gt;
&lt;p&gt;Getting back to line 7, this builds the jar package of our Confluence plugin.&lt;/p&gt;
&lt;p&gt;Line 8 defines a &lt;code&gt;$plugin_jar&lt;/code&gt; variable with the relative pathname of the plugin jar.  The &lt;code&gt;$(foobar)&lt;/code&gt; bit is a Bash command that executes the &lt;code&gt;foobar&lt;/code&gt; command and returns the text output generated by the command.&lt;/p&gt;
&lt;p&gt;Line 9 says &amp;#8220;if the plugin file does not exist, then exit with a meaningful error message.&amp;#8221;  In Bash, the command &lt;code&gt;[ -f foobar ]&lt;/code&gt; tests if file &amp;#8220;foobar&amp;#8221; exists.&lt;/p&gt;
&lt;p&gt;Line 10 to 12 are the interesting bit.  They invoke three Bash functions that do what their name implies.  They depend on the variables we set up in lines 1-3.  This allows us to use the same functions for both local and production deployments.  And here is our precious Bash library:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;
&lt;pre&gt;
 1  cookie_jar=/tmp/confluence-cookies.txt
 2  curl=&quot;curl --cookie-jar $cookie_jar --cookie $cookie_jar --output /tmp/curl-output.html&quot;
 3
 4  function confluence_login() {
 5    echo &quot;login to confluence&quot;
 6    $curl -s -S -d os_username=admin -d os_password=$admin_password &quot;$confluence_url/login.action&quot;
 7  }
 8
 9  function confluence_uninstall_plugin() {
10    echo &quot;uninstall plugin&quot;
11    $curl -s -S $confluence_url'/admin/plugins.action?mode=uninstall&amp;amp;pluginKey=ourpluginkey'
12  }
13
14  function confluence_install_plugin() {
15    echo &quot;reinstall plugin ($plugin_jar)&quot;
16    if [ \! -f $plugin_jar ]; then
17      echo &quot;ERROR: $plugin_jar not found&quot;
18      exit 1
19    fi
20    $curl -F file_0=@$plugin_jar\;type=application/octet-stream $confluence_url/admin/uploadplugin.action
21  }
22
23  function quietmvn() {
24      mvn $* | grep -v '\[WARNING\] POM.*Not a v4.0.0 POM'
25  }
&lt;/pre&gt;
&lt;p&gt;&lt;/p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The three functions I was talking about use Curl to interact with Confluence as if our script was a web browser.  This is not the way to automate installs that Atlassian recommends, which is to use Maven with some Atlassian plugins.  We found that the Maven way was not as reliable as using Curl.  &lt;/p&gt;
&lt;p&gt;And this is all there is to it.  It took some time to find the right way to invoke Confluence with Curl, but every minute spent was worth it.  This small library of Bash commands allows you to perform installs and uninstalls of any plugin with maximum reliability.  It takes away a lot of pain from Confluence plugin development.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Test] How to sort junit tests by execution time</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/test-how-to-sort-junit-tests-by.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-6100968374398124543</id>
		<updated>2009-12-29T18:24:17+00:00</updated>
		<content type="html">&lt;a href=&quot;http://blogs.theage.com.au/business/executivestyle/managementline/archives/syd-5aerlntueyg1b1urwbro_layout.jpeg&quot;&gt;&lt;img src=&quot;http://blogs.theage.com.au/business/executivestyle/managementline/archives/syd-5aerlntueyg1b1urwbro_layout.jpeg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Today with my colleague Luca Pucacco i've searched  a method to detect which (junit) test are slow without any known or reasonable motivation. When you run a junit suite with eclipse you can see the execution time but you are not able to see an order.&lt;br /&gt;So:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;export Test run with the gui; let's call this file SuiteOutput.xml&lt;/li&gt;&lt;li&gt;Open a shell and write:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;cat SuiteOutput.xml  | grep &quot;&amp;lt;testsuite&quot;  | sed 's/\(.*time=&quot;\)\([^&quot;]*\)\(.*\)/\2\1\2\3/' | sort -rg &lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;With &lt;span&gt;&lt;span&gt;cat SuiteOutput.xml  | grep &quot;&amp;lt;testsuite&quot;&lt;/span&gt;  you are simply extracting the interesting rows&lt;br /&gt;With&lt;span&gt; sed s/..../../&lt;/span&gt; we are going to substitute something. In details. Let's assume a row is in the form of:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;testsuite name=&quot;xxxTest&quot; time=&quot;10.0&quot;&gt;&lt;br /&gt;The first group &lt;/span&gt;&lt;span&gt;&lt;span&gt;(.*time=&quot;\) &lt;/span&gt;is the first part of the row ( &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;testsuite name=&quot;xxxTest&quot; time=&quot; )&lt;br /&gt;The second group &lt;/span&gt;&lt;span&gt;([^&quot;]*\)&lt;/span&gt;&lt;span&gt; is all before the &quot; character ( the 10.0 string)&lt;br /&gt;The last group is the rest ( &quot;&gt;)&lt;br /&gt;&lt;br /&gt;The final row contains as the first information the execution time. The last operation is sorting these data by evaluating it like a number and not like a string.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-6100968374398124543?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CQ, Sling, Felix and my headaches</title>
		<link href="http://jfranzoi.wordpress.com/2009/12/27/cq-sling-felix-and-my-headaches/"/>
		<id>http://jfranzoi.wordpress.com/?p=973</id>
		<updated>2009-12-27T15:45:21+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;these last six months have been incredibly full for me, i&amp;#8217;ve learnt so many technologies and technical stuff: RubyOnRails web application development (and a bit of S3 cloud deploying), Hippo CMS 6 and Cocoon pipelines, and now Day CQ stack, which means JCR and Jackrabbit, Sling RESTful web framework, and OSGI bundles with Felix. oh my!&lt;/p&gt;
&lt;p&gt;yep, i&amp;#8217;m currently working for a big TLC italian company, developing their internal portal based on CQ5. i was completely new to content-repositories and web content management, but i got it quickly: it&amp;#8217;s a different paradigm, data are modeled around resources, not around relations (as with relational databases).&lt;/p&gt;
&lt;p&gt;btw, what i want to show is my journey with CQ stuff, and how our development approach has grown during the last weeks (and where it&amp;#8217;s going). beware: there&amp;#8217;s a lot of technical stuff (maven, Day CRX, Apache Sling, Apache Felix); i won&amp;#8217;t explain everything in detail, so i&amp;#8217;m referring to documentation and other blog posts.&lt;/p&gt;
&lt;p&gt;so, first of all, start reading CQ tutorial on &lt;a href=&quot;http://dev.day.com/docs/en/cq/current/developing/developmenttools/developing_with_eclipse.html&quot; target=&quot;_blank&quot;&gt;&amp;#8220;How to Set Up the Development Environment with Eclipse&amp;#8221;&lt;/a&gt;: please, spend almost one hour following all steps, even boring ones, like grabbing jars from CRX repository and putting them manually into local maven repository. in the end, you&amp;#8217;ll have two projects (ui and core), one page with template (manually created and edited), executing a component as JSP script (imported through VLT), which uses &amp;#8220;domain&amp;#8221; logic provided by a plain old Java class (from core project). that&amp;#8217;s a lot of stuff!&lt;/p&gt;
&lt;p&gt;then, let&amp;#8217;s enter the magical world of &lt;a href=&quot;http://dev.day.com/docs/en/crx/current/developing/development_tools/developing_with_crxde.html&quot; target=&quot;_blank&quot;&gt;CQDE&lt;/a&gt;, a customized (old version of) Eclipse, which provide access to remote content (via webdav) from within an IDE, so that you can edit, compile and debug code as it was stored locally (but it isn&amp;#8217;t). at first, it seems a lot better than VLT-ing from commandline; but soon you&amp;#8217;ll miss it: versioning, and sharing code with others. even if it&amp;#8217;s not clear in the tutorial, ignoring VLT specific files let Subversion version also content stored in &lt;code&gt;src/main/content/jcr_root&lt;/code&gt;. that&amp;#8217;s not always funny, like manually merging conflicts on XML files, but it&amp;#8217;s really a lot better than blindly edit code with CQDE, with no way back! also, sometimes i&amp;#8217;ve found much more easier editing pages as XML files than using WCM editor (CQ authoring tool).&lt;/p&gt;
&lt;p&gt;ok, relax, take a deep breath, and think about what you&amp;#8217;ve done so far. do you like it? are you comfortable with this? well, i wasn&amp;#8217;t; i missed my IDE-based development, checking-in and out code, running automatic tests all the time. the good news is we can do better than this, the bad news is we&amp;#8217;ll still miss something (so far, red/green bars for UI). to recap, we can choose from:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;remote coding and debugging, with CQDE: no &amp;#8220;native&amp;#8221; versioning, VLT can be use as a &amp;#8220;bridge&amp;#8221; to Subversion&lt;/li&gt;
&lt;li&gt;local coding, with any IDE (eg Eclipse): still can&amp;#8217;t compile JSP files, VLT used to deploy UI code&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;next step is (well, i&amp;#8217;m a bit afraid, but time has come)&amp;#8230; &lt;strong&gt;deploy an OSGI bundle with maven&lt;/strong&gt;, with both UI code and initial content to put on repository.&lt;/p&gt;
&lt;p&gt;step one: &lt;strong&gt;compiling JSP files locally&lt;/strong&gt;. ingredients: JARs as local maven dependencies and &lt;a&gt;sling maven jspc plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;i could not find any public Day maven repository (and it makes sense, from a &lt;em&gt;business&lt;/em&gt; point of view), but as the tutorial shows, everything we need is already available from CRX. so, it takes long, but referring to the &lt;code&gt;/libs/xyz/install&lt;/code&gt; convention and doing searches via CRX explorer you can come up with something like this:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;#!/bin/bash&lt;/span&gt;

&lt;span&gt;function&lt;/span&gt; grabDependency&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;
  JAR_URL&lt;span&gt;=&lt;/span&gt;$1
  REPOSITORY_DIR&lt;span&gt;=&lt;/span&gt;~&lt;span&gt;/&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;m2/repository&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;$2
  JAR_FILE&lt;span&gt;=&lt;/span&gt;$3

  wget --user&lt;span&gt;=&lt;/span&gt;admin --password&lt;span&gt;=&lt;/span&gt;admin $JAR_URL
  mkdir &lt;span&gt;-p&lt;/span&gt; $REPOSITORY_DIR
  mv $JAR_FILE $REPOSITORY_DIR
&lt;span&gt;}&lt;/span&gt;

&lt;span&gt;cd&lt;/span&gt; &lt;span&gt;/tmp&lt;/span&gt;&lt;span&gt;;&lt;/span&gt; rm -rf deps&lt;span&gt;;&lt;/span&gt; mkdir deps&lt;span&gt;;&lt;/span&gt; &lt;span&gt;cd&lt;/span&gt; deps

grabDependency &lt;span&gt;\&lt;/span&gt;
  http&lt;span&gt;:&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;/localhost&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;4502&lt;/span&gt;&lt;span&gt;/crx/repository/crx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;default/libs/commons/install/day&lt;/span&gt;-commons-jstl-&lt;span&gt;1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;jar &lt;span&gt;\&lt;/span&gt;
  &lt;span&gt;com/day/commons/day&lt;/span&gt;-commons-&lt;span&gt;jstl/1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;2&lt;/span&gt; &lt;span&gt;\&lt;/span&gt;
  day-commons-jstl-&lt;span&gt;1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;jar

&lt;span&gt;# ... grab other jar files&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;then, let&amp;#8217;s add JSPC plugin to the maven build chain, and CQ and Sling dependencies (see attached file with sample code). this is a simple example; you&amp;#8217;ll probably need to override plugin&amp;#8217;s sling jar dependencies with versions used by application code!&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;org.apache.sling&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;maven-jspc-plugin&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;compilerSourceVM&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;1.5&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;compilerSourceVM&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;compilerTargetVM&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;1.5&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;compilerTargetVM&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;executions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;compile-jsp&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;goals&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;goal&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;jspc&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;goal&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;goals&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;executions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;moving JSP code into &lt;code&gt;src/main/scripts&lt;/code&gt; (under &lt;code&gt;apps/myApp&lt;/code&gt; subfolder) should be enough to have maven build (&lt;code&gt;mvn clean compile&lt;/code&gt;). just remember to grab &lt;code&gt;global.jsp&lt;/code&gt; from CRX and put it under &lt;code&gt;src/main/scripts/libs/wcm&lt;/code&gt; folder. Eclipse also will compile (regenerate project files with &lt;code&gt;mvn eclipse:eclipse&lt;/code&gt;), but it needs another copy of &lt;code&gt;global.jsp&lt;/code&gt; into &lt;code&gt;/libs/wcm&lt;/code&gt; (i know, it&amp;#8217;s silly; i&amp;#8217;ll check this next time).&lt;/p&gt;
&lt;p&gt;step two: &lt;strong&gt;packaging an OSGI bundle&lt;/strong&gt; with UI code and content nodes. ingredients: &lt;a href=&quot;http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html&quot; target=&quot;_blank&quot;&gt;Felix maven bundle plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;the key concept for me was understanding what to put into the bundle. i was used to have JSP files on CRX under &lt;code&gt;/apps&lt;/code&gt; node, editing nodes properties such as &lt;code&gt;jcr:primaryType&lt;/code&gt; (&lt;code&gt;cq:Component&lt;/code&gt;, &lt;code&gt;cq:Template&lt;/code&gt; and the like) and &lt;code&gt;jcr:content&lt;/code&gt;. deploying application as OSGI bundle it&amp;#8217;s slightly different: code is available as &lt;em&gt;bundle resources&lt;/em&gt; (from the bundle itself), while only property nodes are copied from bundle to CRX repository, as &lt;em&gt;initial content&lt;/em&gt;. this separation was not clear to me in the beginning, but it now makes sense (even if less duplication would be nice, for example in content structure).&lt;/p&gt;
&lt;p&gt;so, we should create a bundle with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;included resources&lt;/strong&gt;: all required resources (maven resources and &lt;code&gt;src/main/scripts&lt;/code&gt; folder) to be later referred&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bundle resources&lt;/strong&gt;: .class and JSP files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;initial content&lt;/strong&gt;: node properties, as JSON files (i decided to put them into &lt;code&gt;src/main/resources&lt;/code&gt;, under &lt;code&gt;CQ-INF/initial-content&lt;/code&gt; subfolder)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;more details are available on the &lt;a href=&quot;http://sling.apache.org/site/content-loading-jcrcontentloader.html&quot; target=&quot;_blank&quot;&gt;Sling website&lt;/a&gt; and on &lt;a href=&quot;http://in-the-sling.blogspot.com/2008/09/sling-osgi-track-pt-5-bundling-initial.html&quot; target=&quot;_blank&quot;&gt;this blog post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;so, let&amp;#8217;s add Felix bundle plugin to maven (remember to declare project bundle packaging with &lt;code&gt;&amp;lt;packaging&amp;gt;bundle&amp;lt;/packaging&amp;gt;&lt;/code&gt;):&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;org.apache.felix&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;maven-bundle-plugin&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;1.4.3&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;extensions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;true&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;extensions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;instructions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Export-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        com.day.cq5.myapp.*;version=${pom.version},
        org.apache.jsp.apps.*;version=${pom.version}
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Export-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Import-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;*&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Import-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Private-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Private-Package&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;

      &lt;span&gt;&amp;lt;!--&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;included resources folders (to be later referred):&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;maven resources and JSP files&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Include-Resource&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        {maven-resources},
        src/main/scripts
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Include-Resource&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;

      &lt;span&gt;&amp;lt;!--&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;resources available from within bundle&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;(not available as CRX nodes):&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;compiled .class files and JSP files.&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Sling-Bundle-Resources&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        /apps/myApp,
        /var/classes!/org/apache/jsp/apps/myApp
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Sling-Bundle-Resources&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;

      &lt;span&gt;&amp;lt;!--&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;content initially copied into CRX nodes:&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;properties as JSON descriptors&lt;/span&gt;
&lt;span&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&lt;/span&gt;&lt;span&gt;--&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Sling-Initial-Content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        CQ-INF/initial-content/apps/myApp/; overwrite:=true; path:=/apps/myApp,
        CQ-INF/initial-content/content/sample/; overwrite:=true; path:=/content/sample
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Sling-Initial-Content&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;instructions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;this should be enough to create a package with &lt;code&gt;mvn clean pakage&lt;/code&gt;. we&amp;#8217;re almost done..&lt;/p&gt;
&lt;p&gt;step three: &lt;strong&gt;installing the bundle&lt;/strong&gt;. ingredients: &lt;a href=&quot;http://sling.apache.org/site/sling.html&quot; target=&quot;_blank&quot;&gt;maven sling plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;with CQ there are two ways to install a bundle: put it under &lt;code&gt;/apps/myApp/install&lt;/code&gt; folder or using the Felix console. i choose the latter, which turns out to be a plain POST request to the console URL. anyway, we can hook the maven build chain with the Sling plugin, this way:&lt;/p&gt;
&lt;pre&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;org.apache.sling&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;groupId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;maven-sling-plugin&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;artifactId&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;2.0.4-incubator&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;executions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;install-bundle&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;goals&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;goal&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;install&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;goal&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;goals&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;slingUrl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;http://localhost:4502/system/console/install&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;slingUrl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;admin&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;user&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
        &lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;admin&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;configuration&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;execution&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;executions&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;just type &lt;code&gt;mvn install&lt;/code&gt; and we&amp;#8217;re done.&lt;/p&gt;
&lt;p&gt;that&amp;#8217;s it. a lot of setups, expecially if, like me, you&amp;#8217;re new to maven and OSGI. anyway, i&amp;#8217;ve written this mainly for later reference and to share thoughts with colleagues. i&amp;#8217;ve shown three approaches to develop with CQ, tested in my daily work on the last month. in my view, deploying OSGI bundles is the best one, so far; it&amp;#8217;s a trade-off between ease of use while debugging (yep, no UI automatic tests yet) and development lifecycle (versioning, building, packaging). i hope to gather much more info next year, and probably something will be easier! next step will be setting up automatic tests for JSP files, using Koskela&amp;#8217;s &lt;a href=&quot;http://jsptest.sourceforge.net/&quot; target=&quot;_blank&quot;&gt;JspTest&lt;/a&gt; tool.&lt;/p&gt;
&lt;p&gt;sample code is &lt;a href=&quot;http://jacopo.franzoi.googlepages.com/myapp-ui.zip&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;: please, follow README and have fun.&lt;/p&gt;
&lt;p&gt;well, happy new year to everyone!&lt;/p&gt;
Posted in Architecture, Code, Tools  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jfranzoi.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jfranzoi.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jfranzoi.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jfranzoi.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jfranzoi.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jfranzoi.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jfranzoi.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jfranzoi.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jfranzoi.wordpress.com/973/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jfranzoi.wordpress.com/973/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jfranzoi.wordpress.com&amp;blog=5176346&amp;post=973&amp;subd=jfranzoi&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jacopo Franzoi</name>
			<uri>http://jfranzoi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Software Engineering Slave</title>
			<subtitle type="html">eXtremeProgramming episodes</subtitle>
			<link rel="self" href="http://jfranzoi.wordpress.com/feed/"/>
			<id>http://jfranzoi.wordpress.com/feed/</id>
			<updated>2010-01-13T22:40:05+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Clojure Start Again</title>
		<link href="http://codemeself.blogspot.com/2009/12/clojure-start-again.html"/>
		<id>tag:blogger.com,1999:blog-8666538509897823475.post-1287474290925294720</id>
		<updated>2009-12-26T14:06:44+00:00</updated>
		<content type="html">&lt;h1&gt;Clojure start again&lt;/h1&gt;    &lt;div&gt;It's my other attempt to learn &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;.&lt;br /&gt;The landscape has changed a lot since &lt;a href=&quot;http://codemeself.blogspot.com/2009/02/clojure.html&quot;&gt;last time I took a look&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;h1&gt;Toolbox&lt;/h1&gt;    &lt;div&gt;Some tools that I used to play comfortably&lt;/div&gt;    &lt;h2&gt;Building and dependency tracking&lt;/h2&gt;    &lt;div&gt;Most popular is unfortunately &lt;a href=&quot;http://ant.apache.org/&quot;&gt;Ant&lt;/a&gt; in building &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;. I'm not looking forward to editing &lt;em&gt;build.xml&lt;/em&gt; files again.&lt;br /&gt;But there are two alternatives that keep track of dependencies, and do packaging.&lt;br /&gt;&lt;h3&gt;Leiningen - build tool&lt;/h3&gt;    &lt;div&gt;&lt;blockquote cite=&quot;http://github.com/technomancy/leiningen&quot;&gt;Leiningen is a build tool for Clojure designed to not set your hair on fire.&lt;/blockquote&gt;      That certainly sounds nice. Installation is straightforward as well, following &lt;a href=&quot;http://zef.me/2470/building-clojure-projects-with-leiningen&quot;&gt;Zefs instructions&lt;/a&gt; does the trick.&lt;br /&gt;It boils down to this:&lt;br /&gt;&lt;pre class=&quot;brush: bash&quot;&gt;cd ~/bin&lt;br /&gt;wget http://github.com/technomancy/leiningen/raw/stable/bin/lein&lt;br /&gt;chmod +x lein&lt;br /&gt;lein self-install&lt;/pre&gt;      &lt;a href=&quot;http://github.com/technomancy/leiningen&quot;&gt;Leiningen&lt;/a&gt; is wrapping up &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven2&lt;/a&gt; in nice &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; syntax and gives you by default access not only to Maven Central Repository but also &lt;a href=&quot;http://clojars.org/&quot;&gt;clojars.org&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;    &lt;h3&gt;clojure-maven-plugin - build tool&lt;/h3&gt;    &lt;div&gt;Another option is &lt;a href=&quot;http://github.com/talios/clojure-maven-plugin&quot;&gt;clojure-maven-plugin&lt;/a&gt; &lt;a href=&quot;http://maven.apache.org/&quot;&gt;Maven2&lt;/a&gt; plug-in to help you out with &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;.&lt;br /&gt;Adding following snippet should get you started:&lt;br /&gt;&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;com.theoryinpractise&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;clojure-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1.3&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href=&quot;http://kotka.de/blog/2009/11/Clojuresque_1.1.0_released.html&quot;&gt;Clojuresque&lt;/a&gt; Third option&lt;/h3&gt;&lt;div&gt;Responses I received after publishing this post showed third option that I've missed.&lt;br /&gt;It is used by &lt;a href=&quot;http://gitorious.org/clojureql&quot;&gt;ClojureQL&lt;/a&gt; and certainly has supporters. It lacks a bit of documentation but &lt;a href=&quot;http://www.bestinclass.dk/index.php/2009/12/clojureql-where-are-we-going/&quot;&gt;ClojureQL - Where are we (going)?&lt;/a&gt; describes process quite well.&lt;br /&gt;   &lt;h2&gt;&lt;abbr title=&quot;Interactive Development Environment&quot;&gt;IDE&lt;/abbr&gt;&lt;/h2&gt;    &lt;div&gt;There is quite some options here, following one is &lt;a href=&quot;http://acidrayne.net/?p=81&quot;&gt;most popular&lt;/a&gt; amongst &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt; developers.&lt;/div&gt;    &lt;h3&gt;Emacs + SLIME&lt;/h3&gt;    &lt;div&gt;Well normally I use &lt;a href=&quot;http://vim.org/&quot;&gt;VIM&lt;/a&gt;, but after watching &lt;a href=&quot;http://www.bestinclass.dk/index.php/2009/12/dynamic-interactive-webdevelopment/&quot;&gt;Dynamic Interactive Webdevelopment&lt;/a&gt; I took for a spin Emacs, well &lt;a href=&quot;http://aquamacs.org/&quot;&gt;Aquaemacs&lt;/a&gt;.&lt;br /&gt;Following two posts were very helpful in setting up nice environment:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://incanter-blog.org/2009/12/20/getting-started/&quot;&gt;Setting up Clojure, Incanter, Emacs, Slime, Swank, and Paredit&lt;/a&gt;,&lt;/li&gt;        &lt;li&gt;&lt;a href=&quot;http://www.dancheah.com/2009/09/been-playing-with-clojure-off-and-on-for-the-last-couple-of-months-decided-to-get-more-serious-with-it-the-last-week-or-so.html&quot;&gt;Setting up Clojure, Emacs and SLIME&lt;/a&gt;.&lt;/li&gt;      &lt;/ul&gt;      After some problems that got solved by setting up &lt;em&gt;swank-clojure-classpath&lt;/em&gt; my new IDE was up.&lt;br /&gt;And it welcomes me with message: &lt;q&gt;Connected. Your hacking starts... NOW!&lt;/q&gt;&lt;br /&gt;&lt;br /&gt;Lets get learning &lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;.&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8666538509897823475-1287474290925294720?l=codemeself.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>neotyk</name>
			<email>noreply@blogger.com</email>
			<uri>http://codemeself.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">code me self</title>
			<subtitle type="html">Hubert Iwaniuk's Blog</subtitle>
			<link rel="self" href="http://www.blogger.com/feeds/8666538509897823475/posts/default"/>
			<id>tag:blogger.com,1999:blog-8666538509897823475</id>
			<updated>2010-03-01T19:10:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ricerca sales manager in Sourcesense</title>
		<link href="http://matteo.vaccari.name/blog/archives/284"/>
		<id>http://matteo.vaccari.name/blog/?p=284</id>
		<updated>2009-12-22T14:03:06+00:00</updated>
		<content type="html">&lt;p&gt;Summary: position in &lt;a href=&quot;http://www.sourcesense.com/&quot;&gt;Sourcesense&lt;/a&gt; for a &lt;a href=&quot;http://www.sourcesense.com/en/careers/006-sales.html&quot;&gt;Sales Manager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sourcesense.com/&quot;&gt;Sourcesense&lt;/a&gt; sta cercando un commerciale per assunzione.  Questa persona si dovrà occupare (fra l&amp;#8217;altro) di sviluppare il business per il &lt;a href=&quot;http://www.sourcesense.com/it/agile/team&quot;&gt;team Agile&lt;/a&gt;.  Se pensi di essere in grado di spiegare ai potenziali clienti perché è vantaggioso comprare sviluppo e formazione da un team che è in grado di sviluppare software in incrementi settimanali, con il controllo e la sicurezza che ne conseguono, allora sei la persona giusta per noi!  &lt;/p&gt;
&lt;p&gt;Lettori di questo blog: se conoscete una persona adatta, per favore diteglielo.&lt;/p&gt;
&lt;p&gt;Tutte le informazioni qui:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sourcesense.com/en/careers/006-sales&quot;&gt;http://www.sourcesense.com/en/careers/006-sales&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Work with asymmetric bounds</title>
		<link href="http://matteo.vaccari.name/blog/archives/276"/>
		<id>http://matteo.vaccari.name/blog/?p=276</id>
		<updated>2009-12-22T12:47:05+00:00</updated>
		<content type="html">&lt;p&gt;Let&amp;#8217;s talk about ranges of integers.  Quick: how many numbers are in the range 16&amp;nbsp;&amp;le;&amp;nbsp;&lt;i&gt;x&lt;/i&gt;&amp;nbsp;&amp;le;&amp;nbsp;37, that is in the set {16, 17, &amp;#8230;, 37}?  &lt;/p&gt;
&lt;p&gt;If you answered 21 then you got it wrong: the correct answer is 22.  When you express a range inclusive of both ends, the formula to compute the number of elements is &lt;/p&gt;
&lt;pre&gt;
size of [lower, upper] = upper - lower + 1
&lt;/pre&gt;
&lt;p&gt;The &amp;#8220;+1&amp;#8243; in the above formula is the source of many &amp;#8220;off-by-one&amp;#8221; or fenceposts errors.  Can we get rid of the &amp;#8220;+1&amp;#8243;?  Yes, there is a way.  Use &lt;em&gt;asymmetric bounds&lt;/em&gt;, including the lower bound and &lt;em&gt;excluding&lt;/em&gt; the upper bound.  The formula becomes &lt;/p&gt;
&lt;pre&gt;
size of [lower, upper) = upper - lower
&lt;/pre&gt;
&lt;p&gt;I'm using square and round brackets as a shorthand notation for ranges with inclusive and exclusive bounds:&lt;/p&gt;
&lt;pre&gt;
  [a, b] = { x | a &amp;le; x &amp;le; b }
  [a, b) = { x | a &amp;le; x &amp;lt; b }
&lt;/pre&gt;
&lt;p&gt;Another reason in favor of asymmetric bounds: how do you express an empty range?  With symmetric inclusive ranges, you can't: the smallest range you can express contains one element. For instance [3, 3] contains only the number 3.  With asymmetric bounds, you can express an empty range with, for instance, [3, 3), which is empty.&lt;/p&gt;
&lt;p&gt;Asymmetric bounds work very well in conjunction with counting from zero.  Java and C arrays are indexed from 0, so that the index range is [0, N).  The upper bound is now equal to the number of elements! Expressing it with symmetric bounds gives [0, N-1], which is ugly because of the &quot;-1&quot;.&lt;/p&gt;
&lt;p&gt;If you need to iterate on a C or Java array, the standard pattern is &lt;/p&gt;
&lt;pre&gt;
  int[] array = new int[N];
  for (int i=0; i&amp;lt;N; i++) { ... }
&lt;/pre&gt;
&lt;p&gt;You see how the body is executed when &lt;code&gt;i==0&lt;/code&gt;, through &lt;code&gt;i==N-1&lt;/code&gt;, but not when &lt;code&gt;i==N&lt;/code&gt;, since we are using &lt;code&gt;i&amp;lt;N&lt;/code&gt; as a boundary condition.  How many times is the loop is executed?  Exactly &lt;code&gt;N&lt;/code&gt;!  It's now easy to see that the iteration is performed the correct number of times.&lt;/p&gt;
&lt;p&gt;Asymmetric bounds can be concatenated easily.  Suppose you have a function that paginates results on a web page.  You are on the page which contains results 30, 31, ... 39.  If you express the range with two parameters from and to, the page url would look like&lt;/p&gt;
&lt;pre&gt;

http://example.com/results?from=30&amp;amp;to=40
&lt;/pre&gt;
&lt;p&gt;And the links to the next and previous page would be &lt;/p&gt;
&lt;pre&gt;
  &amp;lt;a href=&quot;/results?from=20&amp;amp;to=30&quot;&gt;previous page&amp;lt;/a&gt;
  &amp;lt;a href=&quot;/results?from=40&amp;amp;to=50&quot;&gt;next page&amp;lt;/a&gt;
&lt;/pre&gt;
&lt;p&gt;where the bounds for the next or previous page are easily computed by adding or subtracting the page size from the current bounds.  Compare with&lt;/p&gt;
&lt;pre&gt;

http://example.com/results?from=30&amp;amp;to=39

  &amp;lt;a href=&quot;/results?from=20&amp;amp;to=29&quot;&gt;previous page&amp;lt;/a&gt;
  &amp;lt;a href=&quot;/results?from=40&amp;amp;to=49&quot;&gt;next page&amp;lt;/a&gt;
&lt;/pre&gt;
&lt;p&gt;it's more difficult to check that the bounds are correct here: you have to think where the &quot;-1&quot; must be applied.&lt;/p&gt;
&lt;p&gt;So, if you define &quot;+&quot; as the operation of concatenation of ranges, you get this nice little law:&lt;/p&gt;
&lt;pre&gt;
  [a, b) + [b, c) = [a, c)
&lt;/pre&gt;
&lt;p&gt;It's this sort of properties that make it easy to combine software objects together.  This helps towards the goal of programming with lego-like bricks.&lt;/p&gt;
&lt;p&gt;In conclusion: express ranges with asymmetric bounds!  You will avoid off-by-one errors, get rid of &quot;+1&quot;s from your code, and make your programs more modular.&lt;/p&gt;
&lt;h4&gt;References&lt;/h4&gt;
&lt;p&gt;The book &lt;em&gt;C Traps and Pitfalls&lt;/em&gt; by Andrew Koenig has a good explanation of asymmetric bounds.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Are you good at Javascript? #1</title>
		<link href="http://feedproxy.google.com/~r/Skuro/~3/A0LqsbS8BPg/"/>
		<id>http://www.skuro.tk/?p=223</id>
		<updated>2009-12-15T15:34:46+00:00</updated>
		<content type="html">I&amp;#8217;m not, really. Still I&amp;#8217;ve been debugging some JS code just to remember why I was not so excited in the past about the language: your code needs to cope with  browser specific crap.
Now, are you good at Javascript? If so, without running it, have a look at the following code:

var array = [
 [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=A0LqsbS8BPg:S6b8L3r-9b0:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=A0LqsbS8BPg:S6b8L3r-9b0:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=A0LqsbS8BPg:S6b8L3r-9b0:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=A0LqsbS8BPg:S6b8L3r-9b0:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/A0LqsbS8BPg&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Carlo Sciolla</name>
			<uri>http://www.skuro.tk</uri>
		</author>
		<source>
			<title type="html">SKURO!</title>
			<subtitle type="html">shading lights</subtitle>
			<link rel="self" href="http://www.skuro.tk/category/sourcesense/feed/"/>
			<id>http://www.skuro.tk/category/sourcesense/feed/</id>
			<updated>2010-03-02T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Quiz] what's the meaning of this symbol ?</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/quiz-whats-meaning-of-this-symbol.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-9118959006047164400</id>
		<updated>2009-12-10T18:22:55+00:00</updated>
		<content type="html">&lt;a href=&quot;http://3.bp.blogspot.com/_zT27dV8plPs/SyEuKrAVNMI/AAAAAAAAAC8/uyQZmVq3F8M/s1600-h/Picture+1.png&quot;&gt;&lt;img src=&quot;http://3.bp.blogspot.com/_zT27dV8plPs/SyEuKrAVNMI/AAAAAAAAAC8/uyQZmVq3F8M/s320/Picture+1.png&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5413658987953730754&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-9118959006047164400?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Life] productivity and overtime</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/life-productivity-and-overtime.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-513244309810895458</id>
		<updated>2009-12-10T17:59:41+00:00</updated>
		<content type="html">&lt;a href=&quot;http://sleepzine.com/wp-content/uploads/2007/11/working_overtime.jpg&quot;&gt;&lt;img src=&quot;http://sleepzine.com/wp-content/uploads/2007/11/working_overtime.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;How to be professional. What's the meaning of professionalism.&lt;br /&gt;I cannot give a whole definition. I can say a clear example of fake professionalism: overtime.&lt;br /&gt;&lt;br /&gt;Most of the times, if you need to work on sunday or saturday, it means &lt;span&gt;you are not able to complete your work in a given time&lt;/span&gt;. The first thing to do is to acknowledge that this situation is the consequence of one or more failures.&lt;br /&gt;&lt;br /&gt;Instead of working 24/7 to reach some goal you should try the opposite strategy: reserve some free time to think about the process and why you need to work hard.&lt;br /&gt;&lt;br /&gt;I read this suggestion from this interesting article: &lt;a href=&quot;http://hbr.harvardbusiness.org/2009/10/making-time-off-predictable-and-required/ar/1&quot;&gt;Making Time Off Predictable - and Required &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;People can show their energies only in presence of limits.&lt;br /&gt;I remember &quot;&lt;a href=&quot;http://en.wikiquote.org/wiki/The_Legend_of_1900&quot;&gt;The Legend of 1900&lt;/a&gt;&quot; of Baricco:&lt;br /&gt;&quot;That keyboard is infinite... and if that keyboard is infinite, then on that keyboard there is no music you can play. You're sitting on the wrong bench... That is God's piano&quot; and the conclusion:&lt;br /&gt;&quot;Take piano: keys begin, keys end. You know there are 88 of them. &lt;span&gt;Nobody can tell you any different. They are not infinite. You're infinite&lt;/span&gt;... And on those keys, the music that you can make... is infinite. I like that. That I can live by...&quot;&lt;span id=&quot;formatbar_Buttons&quot;&gt;&lt;span class=&quot;on down&quot; id=&quot;formatbar_CreateLink&quot; title=&quot;Inserisci link&quot;&gt;&lt;img src=&quot;http://www.blogger.com/img/blank.gif&quot; alt=&quot;Inserisci link&quot; class=&quot;gl_link&quot; border=&quot;0&quot; /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-513244309810895458?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">XP Day London was, indeed, a blast!</title>
		<link href="http://matteo.vaccari.name/blog/archives/268"/>
		<id>http://matteo.vaccari.name/blog/?p=268</id>
		<updated>2009-12-09T22:44:27+00:00</updated>
		<content type="html">&lt;p&gt;It was very, very, inspirational and fun.  I ran another session of Birthday Greetings Kata, facilitated an open space on the Hexagonal Architecture.  London is a city I love to visit, and the Church House location, is fantastic: just a few steps from Westminster Abbey.&lt;/p&gt;
&lt;p&gt;And I had the authors sign my copy of GOOS (I believe every good book should have an acronym&amp;#8230;  and I don&amp;#8217;t like GOOSGBT :-) )&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://matteo.vaccari.name/blog/wp-content/uploads/2009/12/goos-autografato-500x380.jpg&quot; alt=&quot;My signed copy of GOOS&quot; title=&quot;My signed copy of GOOS&quot; width=&quot;500&quot; height=&quot;380&quot; class=&quot;alignnone size-full wp-image-274&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thank you guys!  I have a feeling this book will be a good companion in my re-discovery of OOP.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Entity-relationship-oriented programming</title>
		<link href="http://matteo.vaccari.name/blog/archives/266"/>
		<id>http://matteo.vaccari.name/blog/?p=266</id>
		<updated>2009-12-09T22:34:59+00:00</updated>
		<content type="html">&lt;p&gt;How I agree with Dafydd Rees when &lt;a href=&quot;http://www.dafydd.net/blog/entries/20050227.html&quot;&gt;he writes&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Most Java and C# programmers have no idea how to do object-oriented programming.&lt;/p&gt;
&lt;p&gt;They&amp;#8217;re really doing entity-relationship-oriented programming. Trouble is, they&amp;#8217;re in the majority so they form a self-reinforcing group that take for granted knowledge and skills that they don&amp;#8217;t even realise that they don&amp;#8217;t have.
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Aaand&amp;#8230; I&amp;#8217;m afraid I was in the E-R-oriented camp until not long ago.  Now I&amp;#8217;m beginning to see how how objects should work.  &lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Code] subset duplication</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/code-subset-duplication.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-4824327658131687663</id>
		<updated>2009-12-09T16:17:24+00:00</updated>
		<content type="html">&lt;a href=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Subset_with_expansion.svg/399px-Subset_with_expansion.svg.png&quot;&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Subset_with_expansion.svg/399px-Subset_with_expansion.svg.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;One of the step in test driven development is &quot;refactoring your code&quot;.&lt;br /&gt;One of the main step of refactoring is the act of removing duplication.&lt;br /&gt;You can read from &lt;a href=&quot;http://en.wikipedia.org/wiki/Test-driven_development#5._Refactor_code&quot;&gt;wikipedia&lt;/a&gt;: &quot;The concept of removing duplication is an important aspect of any software design&quot;.&lt;br /&gt;I think duplication is pretty difficult to identify; there are a LOT of different kind of duplications. Some of them are stated &lt;a href=&quot;http://blogs.agilefaqs.com/2009/10/21/levels-of-duplication/&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;Today i notice another kind of duplication, something i can call like 'subset duplication' where a function does a little less of another bigger function.&lt;br /&gt;&lt;br /&gt;For example:&lt;br /&gt;&lt;span&gt;addTicket(id, value)&lt;/span&gt; and&lt;br /&gt;&lt;span&gt;addTicket(id, value, comment)&lt;/span&gt; and&lt;br /&gt;&lt;span&gt;addTicket(id, value, date)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I think it's better to have&lt;span&gt; only one function &lt;/span&gt;without say the same thing in one thousand of little different modalities. I like expose the differences, not hide them.&lt;br /&gt;One solution could be addDefaultTicket() that return a ticket so you can customize with fluent interfaces: addDefaultTicket().withComment(&quot;xxx&quot;).&lt;br /&gt;I think there are plenty of other solutions, but the point is always the same: trying to find the best and unique solution.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-4824327658131687663?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Blogging now also at in.relation.to</title>
		<link href="http://codingobsession.blogspot.com/2009/12/blogging-now-also-at-inrelationto.html"/>
		<id>tag:blogger.com,1999:blog-7372150233309824772.post-5060385109557472150</id>
		<updated>2009-12-08T16:20:02+00:00</updated>
		<content type="html">From today I'm also writing on the very cool &lt;a href=&quot;http://in.relation.to/&quot;&gt;in.relation.to&lt;/a&gt; blog.&lt;br /&gt;This is the collective blog of experts from the Seam and Hibernate teams - I'm reading it since years - and am honored they invited me to write about my contribution to Hibernate Search.&lt;br /&gt;It's amazing how these very esteemed developers welcome contributions and are open to any kind of discussion.&lt;br /&gt;&lt;br /&gt;Recently I saw some very sad statements&lt;b&gt; &lt;/b&gt;about the JBoss community not being truly open, or not being meritocratic; I think that people who believe that either didn't ever try to really contribute, or had met the wrong person at the wrong moment: as all communities, they are big and made of humans.&lt;br /&gt;When I started willing to contribute I wasn't an expert at all, still I was welcomed for my interest in the project and I always got - and still get - polite answers even to my most silly questions and doubts. After the traditional couple of patches were accepted, I slowly began feeling as part of a team. I might have been lucky, but luck has endured as every single person I keep meeting in these groups is at the same time very kind, smart and helpful. Just keep in mind they're all very busy: an answer could take some time.&lt;br /&gt;&lt;br /&gt;So today I wrote &lt;a href=&quot;http://in.relation.to/Bloggers/HibernateSearch32FastIndexRebuild&quot;&gt;this post&lt;/a&gt; about Hibernate Search's new MassIndexer: read it, comment about it, make use of it! Then ask for improvements and join the fun :-)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/7372150233309824772-5060385109557472150?l=codingobsession.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Sanne Grinovero</name>
			<email>noreply@blogger.com</email>
			<uri>http://codingobsession.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Coding Obsession</title>
			<subtitle type="html">casting Java source code into a web</subtitle>
			<link rel="self" href="http://codingobsession.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-7372150233309824772</id>
			<updated>2010-02-21T16:10:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Google Chrome on Air™</title>
		<link href="http://feedproxy.google.com/~r/Skuro/~3/OJI0SoJrB1w/"/>
		<id>http://www.skuro.tk/?p=209</id>
		<updated>2009-12-04T07:06:59+00:00</updated>
		<content type="html">Today I eventually made one big decision, dropping Firefox (call it Shiretoko, if you want) as my default browser and embracing Chrome. Why? Well, they&amp;#8217;re right: Chome is fast. Really fast.
It is not even a matter of how quick it&amp;#8217;s able to render a web page or to execute JS code (though that&amp;#8217;s also an [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=OJI0SoJrB1w:gs1_r67Efjs:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=OJI0SoJrB1w:gs1_r67Efjs:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=OJI0SoJrB1w:gs1_r67Efjs:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=OJI0SoJrB1w:gs1_r67Efjs:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/OJI0SoJrB1w&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Carlo Sciolla</name>
			<uri>http://www.skuro.tk</uri>
		</author>
		<source>
			<title type="html">SKURO!</title>
			<subtitle type="html">shading lights</subtitle>
			<link rel="self" href="http://www.skuro.tk/category/sourcesense/feed/"/>
			<id>http://www.skuro.tk/category/sourcesense/feed/</id>
			<updated>2010-03-02T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Merge Utilities (command line)</title>
		<link href="http://rockman81.blogspot.com/2009/12/merge-utilities-command-line.html"/>
		<id>tag:blogger.com,1999:blog-8003298816604397919.post-1896891083048528702</id>
		<updated>2009-12-03T13:02:58+00:00</updated>
		<content type="html">This script helps you merging different branches on a project.&lt;br /&gt;It offers some advantages:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It ignores whitespaces, so you don't have to care (too much) about formatting&lt;/li&gt;&lt;br /&gt;&lt;li&gt;it uses a single reject file, so you don't have to find .rej files in all your project for &quot;debug&quot; applying patch&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It doesn't use backup files, so you can avoid polluting the project with .orig files too (who needs backup files, when you can do svn revert?)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It can accept both &quot;r1234&quot; and &quot;1234&quot; for revision number (useful for copy&amp;amp;paste from svn log)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Here's the code&lt;br /&gt;&lt;pre class=&quot;hl&quot;&gt;&lt;span class=&quot;hl slc&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;function&lt;/span&gt; helpMsg&lt;span class=&quot;hl sym&quot;&gt;() {&lt;/span&gt;&lt;br /&gt; nextMsg&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;Usage: $(basename $0) &amp;lt;command&amp;gt;&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;Available commands: &amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;° diff - creates a diff file (using svn diff) to compare different branches&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;° patch - applies the previously created diff file&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwa&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$nextMsg&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;hl kwa&quot;&gt;then&lt;/span&gt;&lt;br /&gt;  &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;e &lt;span class=&quot;hl str&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl esc&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;$nextMsg&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwa&quot;&gt;fi&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;hl num&quot;&gt;1&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl sym&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;function&lt;/span&gt; doPatch&lt;span class=&quot;hl sym&quot;&gt;() {&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwa&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$1&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;|| ! [ -&lt;/span&gt;r &lt;span class=&quot;hl str&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;hl kwa&quot;&gt;then&lt;/span&gt;&lt;br /&gt;  helpMSG&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;Arguments for patch: &amp;lt;diff file&amp;gt; [optional arguments for patch]&amp;quot;&lt;/span&gt;&lt;br /&gt;  helpMsg &lt;span class=&quot;hl str&quot;&gt;&amp;quot;$helpMSG&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwa&quot;&gt;fi&lt;/span&gt;&lt;br /&gt; FILE&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;$1&amp;quot;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwb&quot;&gt;shift&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl kwc&quot;&gt;patch&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;p0 &lt;span class=&quot;hl sym&quot;&gt;--&lt;/span&gt;no&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;backup&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;hl kwa&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;mismatch &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;l &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;E &lt;span class=&quot;hl sym&quot;&gt;--&lt;/span&gt;global&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;reject&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;hl kwc&quot;&gt;file&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;cambiamentiRifiutati.rej &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;i &lt;span class=&quot;hl str&quot;&gt;&amp;quot;$FILE&amp;quot;&lt;/span&gt; $&amp;#64;&lt;br /&gt;&lt;span class=&quot;hl sym&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;function&lt;/span&gt; doDiff&lt;span class=&quot;hl sym&quot;&gt;() {&lt;/span&gt;&lt;br /&gt;      REV1&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl kwb&quot;&gt;$1&lt;/span&gt;&lt;br /&gt;      REV2&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl kwb&quot;&gt;$2&lt;/span&gt;&lt;br /&gt;      FILE&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;$3&amp;quot;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;hl kwa&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$1&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$2&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$3&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;hl kwa&quot;&gt;then&lt;/span&gt;&lt;br /&gt; helpMSG&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;Arguments for diff: &amp;lt;first revision&amp;gt; &amp;lt;second revision&amp;gt; &amp;lt;diff file&amp;gt; [optional arguments for svn diff]&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl str&quot;&gt;Revision number format can either be r1234 or 1234&amp;quot;&lt;/span&gt;&lt;br /&gt; helpMsg &lt;span class=&quot;hl str&quot;&gt;&amp;quot;$helpMSG&amp;quot;&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;hl kwa&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;hl kwb&quot;&gt;shift&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;shift&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;shift&lt;/span&gt;&lt;br /&gt;      &lt;span class=&quot;hl slc&quot;&gt;#Sostituzione &amp;quot;r1234&amp;quot; con &amp;quot;1234&amp;quot; in modo da facilitare il cut&amp;amp;paste da svn log&lt;/span&gt;&lt;br /&gt;      REV1&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;$( echo $REV1 | sed &amp;quot;&lt;/span&gt;s&lt;span class=&quot;hl sym&quot;&gt;/&lt;/span&gt;r&lt;span class=&quot;hl sym&quot;&gt;//&lt;/span&gt;g&lt;span class=&quot;hl str&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;br /&gt;      REV2&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl str&quot;&gt;&amp;quot;$( echo $REV2 | sed &amp;quot;&lt;/span&gt;s&lt;span class=&quot;hl sym&quot;&gt;/&lt;/span&gt;r&lt;span class=&quot;hl sym&quot;&gt;//&lt;/span&gt;g&lt;span class=&quot;hl str&quot;&gt;&amp;quot;)&amp;quot;&lt;/span&gt;&lt;br /&gt;      svn &lt;span class=&quot;hl kwc&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;r &lt;span class=&quot;hl kwb&quot;&gt;$REV1&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;hl kwb&quot;&gt;$REV2&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;hl kwc&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;cmd&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl kwc&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;x &lt;span class=&quot;hl sym&quot;&gt;-&lt;/span&gt;uw $&amp;#64; &lt;span class=&quot;hl sym&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;$FILE&amp;quot;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl sym&quot;&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;CMD&lt;span class=&quot;hl sym&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;hl kwb&quot;&gt;$1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x$1&amp;quot;&lt;/span&gt; &lt;span class=&quot;hl sym&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;hl kwa&quot;&gt;then&lt;/span&gt;&lt;br /&gt; helpMsg&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl kwb&quot;&gt;shift&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;hl kwb&quot;&gt;$CMD&lt;/span&gt; &lt;span class=&quot;hl kwa&quot;&gt;in&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;diff&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;)&lt;/span&gt;&lt;br /&gt; doDiff $&amp;#64;&lt;br /&gt; &lt;span class=&quot;hl sym&quot;&gt;;;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl str&quot;&gt;&amp;quot;patch&amp;quot;&lt;/span&gt;&lt;span class=&quot;hl sym&quot;&gt;)&lt;/span&gt;&lt;br /&gt; doPatch $&amp;#64;&lt;br /&gt; &lt;span class=&quot;hl sym&quot;&gt;;;&lt;/span&gt;&lt;br /&gt; &lt;span class=&quot;hl sym&quot;&gt;*)&lt;/span&gt;&lt;br /&gt; helpMsg&lt;br /&gt; &lt;span class=&quot;hl sym&quot;&gt;;;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;hl kwa&quot;&gt;esac&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8003298816604397919-1896891083048528702?l=rockman81.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>RockMan</name>
			<email>noreply@blogger.com</email>
			<uri>http://rockman81.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">NonSoloNerd</title>
			<link rel="self" href="http://rockman81.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-8003298816604397919</id>
			<updated>2010-02-28T10:10:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Alfresco ECM moving forward on the Maven path</title>
		<link href="http://feedproxy.google.com/~r/Skuro/~3/KKsC9gYGW_I/"/>
		<id>http://www.skuro.tk/?p=218</id>
		<updated>2009-12-03T09:43:59+00:00</updated>
		<content type="html">These days some milestones have been placed that are both consolidating past efforts and promising great improvements on maven based processes around Alfresco ECM.
First and foremost, to prove the Alfresco commitment in mavenizing the product, have a look at their hosted Sonatype Nexus instance. Even if big changes are still due, you&amp;#8217;ll be more than [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=KKsC9gYGW_I:3nqBP7ltdq8:yIl2AUoC8zA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=yIl2AUoC8zA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=KKsC9gYGW_I:3nqBP7ltdq8:V_sGLiPBpWU&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?i=KKsC9gYGW_I:3nqBP7ltdq8:V_sGLiPBpWU&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~ff/Skuro?a=KKsC9gYGW_I:3nqBP7ltdq8:7Q72WNTAKBA&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~ff/Skuro?d=7Q72WNTAKBA&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Skuro/~4/KKsC9gYGW_I&quot; height=&quot;1&quot; width=&quot;1&quot; /&gt;</content>
		<author>
			<name>Carlo Sciolla</name>
			<uri>http://www.skuro.tk</uri>
		</author>
		<source>
			<title type="html">SKURO!</title>
			<subtitle type="html">shading lights</subtitle>
			<link rel="self" href="http://www.skuro.tk/category/sourcesense/feed/"/>
			<id>http://www.skuro.tk/category/sourcesense/feed/</id>
			<updated>2010-03-02T22:40:03+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Script] subversion diff ignoring white space</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/script-subversion-diff-ignoring-white.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-8937309986539213005</id>
		<updated>2009-12-02T12:04:07+00:00</updated>
		<content type="html">&lt;a href=&quot;http://ifdefined.com/images/bug_tracker_svn_diff.gif&quot;&gt;&lt;img src=&quot;http://ifdefined.com/images/bug_tracker_svn_diff.gif&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;Try it when you need to look differences in your code without noise due to formatting rules:&lt;/span&gt; &lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;svn diff -x &quot;-u -w&quot; (-r revisionNumber)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;and eventually : &lt;/span&gt;&lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;br /&gt;patch -p0 -l  (file name) &lt;/code&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;----&lt;br /&gt;&lt;span&gt;Thanks to Marco Gulino&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-8937309986539213005?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Test] how to measure the execution time of Fitnesse tests</title>
		<link href="http://tommasotorti.blogspot.com/2009/12/test-how-to-measure-execution-time-of.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-474321001007374345</id>
		<updated>2009-12-02T11:55:40+00:00</updated>
		<content type="html">&lt;a href=&quot;http://2.bp.blogspot.com/_2r2pau70KKc/SGzemd_eG0I/AAAAAAAAAJs/5NTBKVbwQ6k/s400/turtle_sketch.jpg&quot;&gt;&lt;img src=&quot;http://2.bp.blogspot.com/_2r2pau70KKc/SGzemd_eG0I/AAAAAAAAAJs/5NTBKVbwQ6k/s400/turtle_sketch.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;We are using &lt;a href=&quot;http://fitnesse.org/&quot;&gt;Fitnesse  &lt;/a&gt;as our current acceptance testing framework.&lt;br /&gt;1/3 of our tests are built upon a fixture that uses Selenium.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://seleniumhq.org/&quot;&gt;Selenium&lt;/a&gt; is the worst test framework i never known. It's hard to write, hard to maintain, it's hard to read and, most of all, is SLOW, absolutely slow.&lt;br /&gt;&lt;br /&gt;It's a long time that i wish to know how much time our selenium tests needs to be run but fitnesse doesn't say this information.&lt;br /&gt;&lt;br /&gt;The solution is to call via http get the url with the instruction to run your suite and measure its execution time. Then i move all selenium tests in a dedicated suite.&lt;br /&gt;&lt;br /&gt;And here you can see:&lt;br /&gt;&lt;br /&gt;time wget http://localhost:8181/XXXProject.SeleniumSuite?suite&lt;br /&gt;&lt;br /&gt;real    &lt;span&gt;6m&lt;/span&gt;56.227s (!)&lt;br /&gt;&lt;br /&gt;God save us&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-474321001007374345?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Meet Sourcesense trainers at XP Day London</title>
		<link href="http://www.sourcesense.com/buzz/2009/11/30/meet-sourcesense-trainers-at-xp-day-london/"/>
		<id>http://www.sourcesense.com/buzz/?p=75</id>
		<updated>2009-11-30T15:23:21+00:00</updated>
		<content type="html">Matteo Vaccari will organize a hands-on session on object-oriented design and refactoring at the upcoming XP Day London, on December 7-8.  The Birthday Greetings Kata session was well received at the XP Days Benelux in late November.  The objective of the session is to learn how to write code that is easier to change, easier [...]</content>
		<author>
			<name>matteo</name>
			<uri>http://www.sourcesense.com/buzz</uri>
		</author>
		<source>
			<title type="html">Sourcesense buzz</title>
			<subtitle type="html">News and events from Sourcesense</subtitle>
			<link rel="self" href="http://www.sourcesense.com/buzz/feed/atom/"/>
			<id>http://www.sourcesense.com/buzz/feed/atom/</id>
			<updated>2009-11-30T15:40:04+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Growing agilists</title>
		<link href="http://jfranzoi.wordpress.com/2009/11/29/growing-agilists/"/>
		<id>http://jfranzoi.wordpress.com/?p=958</id>
		<updated>2009-11-29T21:43:03+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;i know, i&amp;#8217;m late, really really late.&lt;/p&gt;
&lt;p&gt;6th Italian Agile Day has gone, on november 20th. as usual, it&amp;#8217;s been a big party, when &amp;#8220;old&amp;#8221; friends meet and have fun, talking about Agile methods and Italian community. i was still sick, thanks to a friendly one-week flu, so i just reached at lunch time to avoid cold and rushing early in the morning. but it was enough! this year i dediced to &amp;#8220;taste a bit of everything&amp;#8221;, so i was able to join some open space and session, moving from one to another.&lt;/p&gt;
&lt;p&gt;me and &lt;a href=&quot;http://it.linkedin.com/in/varvello&quot; target=&quot;_blank&quot;&gt;Davide&lt;/a&gt; also had a session on &amp;#8220;Extreme Release Planning&amp;#8221;, very funny for me: i had the pleasure to work with Davide, an ex-colleague of mine, and he had the idea of making the audience &lt;em&gt;feel&lt;/em&gt; the problem we were talking about: &lt;strong&gt;loosing clear vision of priorities, due to lack of release dates&lt;/strong&gt;. we set up a rudimental planning game: one long string with stories written on A4 sheets (with name and estimate), moving stories to another long string as soon as they were planned.&lt;/p&gt;
&lt;p&gt;(thanks to the volunteer guys from adience for helping us with this!)&lt;/p&gt;
&lt;p&gt;slides are available &lt;a href=&quot;http://docs.google.com/present/view?id=dcrfwj3r_3fvbdnrhr&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;here they are some good recap of the conference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.scrum-breakfast.com/2009/11/italian-agile-day-fixed-price-projects.html&quot;&gt;Peter Stevens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sviluppoagile.it/italian-agile-day-2009-un-successo&quot;&gt;Jacopo Romei&lt;/a&gt; (in italian)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.francolombardo.net/italian-agile-day-2009-le-mie-impressioni_post-96.html&quot;&gt;Franco Lombardo&lt;/a&gt; (in italian)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blogs.ugidotnet.org/BlogEma/archive/2009/11/22/agile-day-2009.aspx&quot;&gt;Emanuele DelBono&lt;/a&gt; (in italian)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;as &lt;a href=&quot;http://it.linkedin.com/pub/roberto-bettazzoni/2/12b/614&quot; target=&quot;_blank&quot;&gt;Roberto&lt;/a&gt; said on extremeprogramming-it mailing list, &lt;strong&gt;Italian Agile movement is growing and our conference has come of age&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;see you next year.&lt;/p&gt;
Posted in Planning, Presentations  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jfranzoi.wordpress.com/958/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jfranzoi.wordpress.com/958/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jfranzoi.wordpress.com/958/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jfranzoi.wordpress.com/958/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jfranzoi.wordpress.com/958/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jfranzoi.wordpress.com/958/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jfranzoi.wordpress.com/958/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jfranzoi.wordpress.com/958/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jfranzoi.wordpress.com/958/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jfranzoi.wordpress.com/958/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jfranzoi.wordpress.com&amp;blog=5176346&amp;post=958&amp;subd=jfranzoi&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jacopo Franzoi</name>
			<uri>http://jfranzoi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Software Engineering Slave</title>
			<subtitle type="html">eXtremeProgramming episodes</subtitle>
			<link rel="self" href="http://jfranzoi.wordpress.com/feed/"/>
			<id>http://jfranzoi.wordpress.com/feed/</id>
			<updated>2010-01-13T22:40:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Back from XP Days Benelux, on to XP Days London</title>
		<link href="http://matteo.vaccari.name/blog/archives/242"/>
		<id>http://matteo.vaccari.name/blog/?p=242</id>
		<updated>2009-11-29T15:36:02+00:00</updated>
		<content type="html">&lt;p&gt;Last week I attended the &lt;a href=&quot;http://xpday.net/&quot;&gt;XP Days Benelux&lt;/a&gt;.  It&amp;#8217;s the fourth time I go there, and it&amp;#8217;s been a mild shock to realize how often I was there.  The first time I went there was because I had the pleasure to meet &lt;a href=&quot;http://blog.nayima.be/&quot;&gt;Pascal&lt;/a&gt;, who was kind enough to help us run the first &lt;a href=&quot;http://essap.dicom.uninsubria.it/&quot;&gt;Essap&lt;/a&gt;.  It was a big bet for us to do something as big as a Summer School.  Luckily, we had help from Pascal and &lt;a href=&quot;http://cirillosscrapbook.wordpress.com/&quot;&gt;Francesco&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I was just starting to get my bearings in the Agile world back in 2006.  Pascal came to Essap and taught us about estimating, planning and executing a plan, with his and &lt;a href=&quot;http://www.tryx.com/&quot;&gt;Vera&lt;/a&gt;&amp;#8217;s ingenious &lt;a href=&quot;http://www.xp.be/xpgame.html&quot;&gt; XP Game&lt;/a&gt;.   And that was not his only contribution&amp;#8230; he was, like, a *real agilist* who had a long tradition and a strong community behind.  In 2006 we had just started the &lt;a href=&quot;http://milano-xpug.pbworks.com/&quot;&gt;Milano XP User Group&lt;/a&gt;.  It was great to meet someone who had a much bigger experience of working with agility.&lt;/p&gt;
&lt;p&gt;There is this peculiar thing about the Benelux Agile community.  They are real cosmopolitans.  They speak English easily, since their countries speak many different languages and they are used to speak English even among themselves.  They really *live* the agile values.  I mean, if you want to succeed with agile, you better start living your life with the agile values.  The organization of the XP Days reflects this.&lt;/p&gt;
&lt;p&gt;For instance, it&amp;#8217;s not like in old-school conferences where you send you session proposal and then it&amp;#8217;s either rejected or approved.  At Xp Days you are supposed to send a first draft, then you receive feedback on your proposal, then you improve your proposal with the feedback.  This reflects the value of feedback, and the principle that good things are not done in one shot, but iteratively.&lt;/p&gt;
&lt;p&gt;In the room where the plenary sessions were held, the core values of this group of agilists were exposed prominently.  See in the &lt;a href=&quot;http://blog.connexxo.com/2009/11/xpdays-benelux---2324112009.html&quot;&gt;first picture here&lt;/a&gt;, they are those sheets of papers high up to the right of the projector screen.  They are unreadable in the photo, but they were well readable if you were in the room.  They were &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;courage, &lt;/li&gt;
&lt;li&gt;openness, &lt;/li&gt;
&lt;li&gt;focus, &lt;/li&gt;
&lt;li&gt;respect, &lt;/li&gt;
&lt;li&gt;committment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One other example of agile values in action is the many forms of feedback that are encouraged.  For every session, you&amp;#8217;re encouraged to write your feedback on a small card for that session.  At the closing of each day, people who attended each sessions are asked to tell everybody what they learned (in 60 seconds!  The timebox is another agile principle.)  When you leave the conference you are asked to write a feedback sheet for the conference in general.  &amp;#8220;Give the gift of feedback&amp;#8221;, is what the organizers say.&lt;/p&gt;
&lt;p&gt;So my trail in the world of agile has been very much influenced from the beginning by the Benelux agilists.  It&amp;#8217;s a great trail to be in :-)  Over the years I got to meet many more friends there, and it&amp;#8217;s great to meet new ones every year.  Some, like &lt;a href=&quot;http://paircoaching.wordpress.com/&quot;&gt;Yves&lt;/a&gt;, &lt;a href=&quot;http://www.qwan.it/&quot;&gt;Marc and Willem&lt;/a&gt;, continued Pascal&amp;#8217;s tradition and came to help us organize Essap in 2008.&lt;/p&gt;
&lt;p&gt;My and &lt;a href=&quot;http://twitter.com/acarpe&quot;&gt;Antonio&lt;/a&gt;&amp;#8217;s contribution to the XP Days this year was the session on the &lt;a href=&quot;http://matteo.vaccari.name/blog/archives/154&quot;&gt;Birthday Greetings Kata&lt;/a&gt;.  Thanks to all participants!  We learned a lot of valuable feedback on how to improve this session, and I&amp;#8217;m ready for the next stop, which will be in &lt;a href=&quot;http://www.xpday.org/&quot;&gt;London&lt;/a&gt;.  &lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Impara il TDD con il team Orione di Sourcesense</title>
		<link href="http://matteo.vaccari.name/blog/archives/237"/>
		<id>http://matteo.vaccari.name/blog/?p=237</id>
		<updated>2009-11-25T17:26:47+00:00</updated>
		<content type="html">&lt;p&gt;Summary: my company, Sourcesense, offers a &lt;a href=&quot;http://www.sourcesense.com/it/agile/training/&quot;&gt;one-day course&lt;/a&gt; on TDD&lt;/p&gt;
&lt;p&gt;Se ti interessa imparare il Test-Driven Development con sviluppatori che lo usano tutti i giorni, in un corso di una giornata, mani-sulla-tastiera, iscriviti al nostro corso.  E&amp;#8217; il primo corso pubblico che facciamo; prima d&amp;#8217;ora abbiamo sempre fatto corsi in casa dai nostri clienti.  Speriamo di fare un pienone!&lt;/p&gt;
&lt;p&gt;Quando: 27 gennaio 2010&lt;/p&gt;
&lt;p&gt;Dove: a &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=via+venezia+23,+sesto+san+giovanni,+italy&amp;sll=37.0625,-95.677068&amp;sspn=43.307813,61.083984&amp;ie=UTF8&amp;z=16&quot;&gt;Sesto San Giovanni, via Venezia 23&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quanto costa: &amp;euro; 300,00 più iva; ma puoi spendere solo &amp;euro;&amp;nbsp;200,00 più iva se completi il pagamento entro il 27 dicembre.&lt;/p&gt;
&lt;p&gt;Chi lo insegna: io (Matteo Vaccari) più un altro sviluppatore del &lt;a href=&quot;http://www.sourcesense.com/it/agile/team&quot;&gt;team Orione&lt;/a&gt; di Sourcesense.&lt;/p&gt;
&lt;p&gt;Tutte le informazioni, e il link per l&amp;#8217;iscrizione, sul sito di Sourcesense:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.sourcesense.com/it/agile/training/&quot;&gt;http://www.sourcesense.com/it/agile/training/&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Test] Parameterized tests</title>
		<link href="http://tommasotorti.blogspot.com/2009/11/test.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-7236437695780217685</id>
		<updated>2009-11-24T09:41:14+00:00</updated>
		<content type="html">I never used a not-well-known functionality of junit 4. I mean: the Parameterized tests.&lt;br /&gt;Every time i extract a method called &quot;verifyXXXwith(parameter)&quot; and i create a lot of small test case.&lt;br /&gt;Reading this article: &lt;a href=&quot;http://www.blogger.com/I%20never%20used%20a%20not-well-known%20functionality%20of%20junit%204.%20I%20mean:%20the%20Parameterized%20tests.%20%20Every%20time%20i%20extract%20a%20method%20called%20%22verifyXXXwith%28parameter%29%22%20and%20i%20create%20a%20lot%20of%20small%20test%20case.%20Reading%20this%20article:%20http://www.testearly.com/2007/04/13/take-heed-of-mixing-junit-4s-parameterized-tests/%20i%20think%20my%20solution%20is%20the%20best.%20What%27s%20your%20feedback&quot;&gt;http://www.testearly.com/2007/04/13/take-heed-of-mixing-junit-4s-parameterized-tests/&lt;/a&gt; i think my solution is the best.&lt;br /&gt;What's your feedback?&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-7236437695780217685?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Back from iad09</title>
		<link href="http://matteo.vaccari.name/blog/archives/232"/>
		<id>http://matteo.vaccari.name/blog/?p=232</id>
		<updated>2009-11-21T13:41:30+00:00</updated>
		<content type="html">&lt;p&gt;So this was the sixth &lt;a href=&quot;http://www.agileday.it/&quot;&gt;Italian Agile Day&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been great to meet old friends, and make new acquaintances too.&lt;/p&gt;
&lt;p&gt;Appreciations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peter Stevens, for sharing insightful tips and tricks on how to succeed with fixed price projects.&lt;/li&gt;
&lt;li&gt;Alberto Provaglio, for the interesting insights on system dynamics.
&lt;/li&gt;
&lt;li&gt;Jacopo Romei, for the courage of sharing his not-so-successful experiences.
&lt;/li&gt;
&lt;li&gt;Gabriele Lana and Simone Genini, for helping me with the &lt;a href=&quot;http://www.flickr.com/photos/44900223@N08/4120794452/&quot;&gt;coaching workshop&lt;/a&gt;.
&lt;/li&gt;
&lt;li&gt;Simone Casciaroli, for convincing me to do a workshop instead of my old boring presentation, and working hard at preparing it.  We&amp;#8217;ll do another one some other time!&lt;/li&gt;
&lt;li&gt;All the people that attended the workshop.  It&amp;#8217;s been overwhelming.  Thanks for coming and contributing!
&lt;/li&gt;
&lt;li&gt;Alberto Brandolini, for teaching me that there&amp;#8217;s a lot more to DDD than I thought.
&lt;/li&gt;
&lt;li&gt;Indrit Selimi, for taking the picture at the workshop.&lt;/li&gt;
&lt;li&gt;Marco Gulino, for the self-sacrifice of giving up coming to the IAD, getting up at 4 in the morning *and* having to deal with a confrontational situation.&lt;/li&gt;
&lt;li&gt;My Sourcesense collegues, for contributing many sessions again in 2009.&lt;/li&gt;
&lt;li&gt;Marco Abis and the Bologna XP User Group, for all the work *and* for being great people to hang around with.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you all!  Let&amp;#8217;s do even better next year!&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Grizzly Servlet Container at Devoxx 2009</title>
		<link href="http://codemeself.blogspot.com/2009/11/grizzly-servlet-container-at-devoxx.html"/>
		<id>tag:blogger.com,1999:blog-8666538509897823475.post-5199224425400384410</id>
		<updated>2009-11-19T12:13:03+00:00</updated>
		<content type="html">Yesterday &lt;a href=&quot;http://twitter.com/neotyk&quot;&gt;me&lt;/a&gt; and &lt;a href=&quot;http://twitter.com/jfarcand&quot;&gt;@jfarcand&lt;/a&gt; presented&lt;br /&gt;&lt;a href=&quot;http://www.devoxx.com/display/DV09/Grizzly+Servlet+Container&quot;&gt;Grizzly Servlet Container&lt;/a&gt; at &lt;a href=&quot;http://www.devoxx.com&quot;&gt;Devoxx&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are the slides and drop by &lt;a href=&quot;http://old.nabble.com/Grizzly---Users-f23249.html&quot;&gt;Grizzly Users List&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div id=&quot;__ss_2535078&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/neotyk/devoxx09-grizzly-servlet-container-chuck-norris-loves-it&quot; title=&quot;Devoxx09 Grizzly Servlet Container: Chuck Norris loves it!&quot;&gt;Devoxx09 Grizzly Servlet Container: Chuck Norris loves it!&lt;/a&gt;&lt;div&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/neotyk&quot;&gt;Hubert Iwaniuk&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/8666538509897823475-5199224425400384410?l=codemeself.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>neotyk</name>
			<email>noreply@blogger.com</email>
			<uri>http://codemeself.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">code me self</title>
			<subtitle type="html">Hubert Iwaniuk's Blog</subtitle>
			<link rel="self" href="http://www.blogger.com/feeds/8666538509897823475/posts/default"/>
			<id>tag:blogger.com,1999:blog-8666538509897823475</id>
			<updated>2010-03-01T19:10:14+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Sourcesense and Sonatype Form Strategic Partnership</title>
		<link href="http://www.sourcesense.com/buzz/2009/11/16/sourcesense-and-sonatype-form-strategic-partnership/"/>
		<id>http://www.sourcesense.com/buzz/?p=71</id>
		<updated>2009-11-16T15:57:58+00:00</updated>
		<content type="html">Sourcesense and Sonatype Form Strategic Partnership to Advance Mission-Critical Enterprise Software Build and Release Management.
Companies Collaborate to Increase Reach of Efficient, Open Source-based Infrastructure Tools and Training for Software Development Build/Release and Repository Management
MOUNTAIN VIEW, CA, and AMSTERDAM, THE NETHERLANDS — Nov. 16, 2009 — Sourcesense, the leading European provider of Open Source services and [...]</content>
		<author>
			<name>gianugo</name>
			<uri>http://www.sourcesense.com/buzz</uri>
		</author>
		<source>
			<title type="html">Sourcesense buzz</title>
			<subtitle type="html">News and events from Sourcesense</subtitle>
			<link rel="self" href="http://www.sourcesense.com/buzz/feed/atom/"/>
			<id>http://www.sourcesense.com/buzz/feed/atom/</id>
			<updated>2009-11-30T15:40:04+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Citazioni da me stesso] spazzatura</title>
		<link href="http://tommasotorti.blogspot.com/2009/11/citazioni-da-me-stesso-spazzatura.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-3648492329232839725</id>
		<updated>2009-11-13T17:28:24+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.sputnikdesignworks.com/clipart/people/wastebasket.jpg&quot;&gt;&lt;img src=&quot;http://www.sputnikdesignworks.com/clipart/people/wastebasket.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&quot;Basta mettere un cestino e la spazzatura arriva&quot;&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-3648492329232839725?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">How I setup confluence on Debian</title>
		<link href="http://matteo.vaccari.name/blog/archives/224"/>
		<id>http://matteo.vaccari.name/blog/?p=224</id>
		<updated>2009-11-13T17:01:25+00:00</updated>
		<content type="html">pre {
    width: 40em;
  }

&lt;p&gt;Pardon the dreariness of this post. I did this twice in a couple of days.  I thought I might as well write down what I did, to save me time next time.  Let me state first that this is an opinionated install :-)  I don&amp;#8217;t like bloated Tomcat installations with many applications on them.  I prefer to have each application in its own place with its own server.  So I will use the Confluence standalone package, which is integrated with Tomcat.  When I will install Jira on the same box, I will download another standalone package.&lt;/p&gt;
&lt;h4&gt;  Preparations &lt;/h4&gt;
&lt;p&gt;Connect to your server.  Execute&lt;/p&gt;
&lt;pre&gt;  apt-get install apache2 ca-certificates
  apt-get install mysql-server
&lt;/pre&gt;
&lt;p&gt;Create file /etc/mysql/conf.d/confluence.cnf with the following contents&lt;/p&gt;
&lt;pre&gt;
  [mysqld]
  default-storage-engine=innodb
  lower_case_table_names=1
&lt;/pre&gt;
&lt;p&gt;Then restart mysql with&lt;/p&gt;
&lt;pre&gt;
  /etc/init.d/mysql restart
&lt;/pre&gt;
&lt;p&gt;Edit /etc/apt/sources.list, appending the string &amp;#8221; non-free&amp;#8221; to every line.&lt;br /&gt;
Then execute&lt;/p&gt;
&lt;pre&gt;
  apt-get install sun-java6-jdk
&lt;/pre&gt;
&lt;h4&gt;  Install Confluence &lt;/h4&gt;
&lt;p&gt;Download the Confluence standalone package for gnu/linux (not the one for&lt;br /&gt;
evaluation)&lt;/p&gt;
&lt;pre&gt;
  wget http://www.atlassian.com/software/confluence/downloads/binary/confluence-3.0.2-std.tar.gz
&lt;/pre&gt;
&lt;p&gt;Create the directory /opt/confluence. In that directory, expand the confluence&lt;br /&gt;
archive. Then create a symlink from /opt/confluence/confluence-app to the&lt;br /&gt;
actual directory that contains the confluence application&lt;/p&gt;
&lt;pre&gt;
  ln -s /opt/confluence/confluence-3.0.2-std /opt/confluence/confluence-app
&lt;/pre&gt;
&lt;p&gt;Then create directory /opt/confluence/confluence-data.&lt;/p&gt;
&lt;p&gt;Edit the file confluence/WEB-INF/classes/confluence-init.properties within the&lt;br /&gt;
confluence distribution, and add the line&lt;/p&gt;
&lt;pre&gt;
  confluence.home=/opt/confluence/confluence-data
&lt;/pre&gt;
&lt;p&gt;Edit the file conf/server.xml and change the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Change 8080 and 8000 to something other than these, which are the default&lt;br /&gt;
   Tomcat ports and might be useful some other day.  I use 8180 and 8100.
&lt;/li&gt;
&lt;li&gt; In the first Connector element, add the attribute address=&amp;#8221;127.0.0.1&amp;#8243;. This&lt;br /&gt;
   will make Tomcat bind to localhost only. I don&amp;#8217;t want to make Tomcat&lt;br /&gt;
   directly accessible from the outside.
&lt;/li&gt;
&lt;li&gt; In the first Context element, change path=&amp;#8221;&quot; to path=&amp;#8221;/confluence&amp;#8221;.&lt;br /&gt;
   Otherwise I can&amp;#8217;t get the reverse proxy from Apache to work.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a file /opt/confluence/startup-confluence.sh with the following contents:&lt;/p&gt;
&lt;pre&gt;
  export JAVA_HOME=/usr/lib/jvm/java-6-sun
  su -m www-data -c /opt/confluence/confluence-app/bin/startup.sh
&lt;/pre&gt;
&lt;p&gt;Change ownership of the whole /opt/confluence thing to www-data&lt;/p&gt;
&lt;pre&gt;
  chown -R www-data.www-data /opt/confluence
  chmod +x /opt/confluence/startup-confluence.sh
&lt;/pre&gt;
&lt;p&gt;Download the mysql driver&lt;/p&gt;
&lt;pre&gt;
  wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.10.tar.gz/from/http://mirror.switch.ch/ftp/mirror/mysql/
&lt;/pre&gt;
&lt;p&gt;Extract the archive, and copy the jar it contains to&lt;br /&gt;
/opt/confluence/confluence-app/lib&lt;/p&gt;
&lt;p&gt;Create the database and the user for confluence&lt;/p&gt;
&lt;pre&gt;
  # mysql -uroot -p
  mysql&gt; create database confluence;
  mysql&gt; grant all on confluence.* to confluence@127.0.0.1 identified by 'secret';
&lt;/pre&gt;
&lt;p&gt;Now if you didn&amp;#8217;t do this when first connecting, exit from ssh and reconnect to create a tunnel, to be able to browse Confluence from localhost on the server.  &lt;/p&gt;
&lt;pre&gt;
  ssh -L1234:localhost:8180 root@myserver
&lt;/pre&gt;
&lt;p&gt;Execute /opt/confluence/startup-confluence.sh, then point the browser to &lt;/p&gt;
&lt;pre&gt;

http://localhost:1234/confluence
&lt;/pre&gt;
&lt;p&gt;You should see the confluence configuration screen.  Now just follow the wizard.  Remember to choose &amp;#8220;Custom installation&amp;#8221;, &amp;#8220;External database&amp;#8221;, and &amp;#8220;Mysql&amp;#8221;.&lt;/p&gt;
&lt;p&gt;When Confluence is up and running, we still have some things to do.  Let&amp;#8217;s configure Apache to serve Confluence in http://myserver/confluence .  Edit /etc/apache2/site-available/default and add the following lines:&lt;/p&gt;
&lt;pre&gt;
  &amp;lt;Location /confluence&gt;
  	Order allow,deny
    Allow from all
  
  ProxyPass /confluence http://127.0.0.1:8180/confluence
  ProxyPassReverse /confluence http://127.0.0.1:8180/confluence
&lt;/pre&gt;
&lt;p&gt;Then execute&lt;/p&gt;
&lt;pre&gt;
  a2enmod proxy proxy_http
  /etc/init.d/apache2 reload
&lt;/pre&gt;
&lt;p&gt;You should now be able to see Confluence at http://myserver/confluence&lt;/p&gt;
&lt;p&gt;Now we must make sure that Confluence will start at system boot. Just call&lt;br /&gt;
/opt/confluence/startup-confluence.sh in /etc/rc.local. It&amp;#8217;s simple, and it&lt;br /&gt;
works.&lt;/p&gt;
&lt;p&gt;You may stop here unless you want to serve Confluence via ssl.  In that case&amp;#8230; let&amp;#8217;s carry on.  Execute &lt;/p&gt;
&lt;pre&gt;
  a2ensite default-ssl
  a2enmod ssl
  /etc/init.d/apache2 reload
&lt;/pre&gt;
&lt;p&gt;You should be able to access https://myserver/ now.  Now move the proxypass configuration from sites-available/default to sites-available/default-ssl.&lt;/p&gt;</content>
		<author>
			<name>Matteo Vaccari</name>
			<uri>http://matteo.vaccari.name/blog</uri>
		</author>
		<source>
			<title type="html">Extreme Enthusiasm</title>
			<subtitle type="html">Extreme enthusiasm</subtitle>
			<link rel="self" href="http://matteo.vaccari.name/blog/feed"/>
			<id>http://matteo.vaccari.name/blog/feed</id>
			<updated>2010-03-11T20:10:11+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="it">
		<title type="html">ThinkCode.TV goes live!</title>
		<link href="http://xplayer.wordpress.com/2009/11/10/thinkcode-tv-goes-live/"/>
		<id>http://xplayer.wordpress.com/?p=122</id>
		<updated>2009-11-09T22:18:40+00:00</updated>
		<content type="html">&lt;br /&gt;&lt;p&gt;An advertisement for my friend and mentor Piergiuliano Bossi: his long-waited &lt;a href=&quot;http://it.thinkcode.tv/&quot;&gt;ThinkCode.TV&lt;/a&gt; goes live!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ThinkCode.TV &lt;/strong&gt;is a website specializes in the delivery of high quality commercial screencasts about software development, at a really cheap prices.&lt;/p&gt;
&lt;p&gt;The first 5 videos are now online (the actual language is italian, but english content is planned for the following months):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The first two lessions on &lt;strong&gt;Python&lt;/strong&gt;, by Marco Beri&lt;/li&gt;
&lt;li&gt;A screencast on &lt;strong&gt;MacRuby&lt;/strong&gt;, by Renzo Borgatti&lt;/li&gt;
&lt;li&gt;The first two lessions on &lt;strong&gt;TDD&lt;/strong&gt;, by Piergiuliano Bossi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Selling all these high-quality screencasts at about &lt;strong&gt;5 euro each &lt;/strong&gt;makes them *really* appetible.&lt;/p&gt;
  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/xplayer.wordpress.com/122/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/xplayer.wordpress.com/122/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/xplayer.wordpress.com/122/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/xplayer.wordpress.com/122/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/xplayer.wordpress.com/122/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/xplayer.wordpress.com/122/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/xplayer.wordpress.com/122/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/xplayer.wordpress.com/122/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/xplayer.wordpress.com/122/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/xplayer.wordpress.com/122/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=xplayer.wordpress.com&amp;blog=532244&amp;post=122&amp;subd=xplayer&amp;ref=&amp;feed=1&quot; /&gt;</content>
		<author>
			<name>Piero Di Bello</name>
			<uri>http://xplayer.wordpress.com</uri>
		</author>
		<source>
			<title type="html">XPlayer</title>
			<subtitle type="html">eXtreme Programming e mondo agile</subtitle>
			<link rel="self" href="http://xplayer.wordpress.com/feed/"/>
			<id>http://xplayer.wordpress.com/feed/</id>
			<updated>2010-02-18T23:40:11+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Performance] Analyzing database performance</title>
		<link href="http://tommasotorti.blogspot.com/2009/11/ok-its-time-to-release-your-software.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-2728771014185479349</id>
		<updated>2009-11-06T18:29:51+00:00</updated>
		<content type="html">&lt;a href=&quot;http://people.debian.org/%7Etille/debian-med/talks/img/postgresql.png&quot;&gt;&lt;img src=&quot;http://people.debian.org/%7Etille/debian-med/talks/img/postgresql.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, it's time to release your software product in a production environment !&lt;br /&gt;You need to analyze your database and collect some data, just to know what are the most problematic queries.&lt;br /&gt;I read this interesting article by &lt;a href=&quot;http://www.databasejournal.com/features/postgresql/article.php/3323561/Counting-Queries-PostgreSQL-SQL-Analysis.htm&quot;&gt;Tom Copeland&lt;/a&gt;&lt;br /&gt;but it's pretty old.&lt;br /&gt;&lt;br /&gt;Let's follow these instructions:&lt;br /&gt;&lt;br /&gt;your dabatase should log all the queries executed. My db is postgreSQL 8.3, so:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo vim /etc/postgresql/8.3/main/postgresql.conf and edit:&lt;/li&gt;&lt;/ul&gt;log_statement = all&lt;br /&gt;syslog_facility = 'LOCAL0'&lt;br /&gt;syslog_ident = 'postgres'&lt;br /&gt;&lt;ul&gt;&lt;li&gt;sudo /etc/init.d/postgresql-8.3 reload&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;cp /var/log/messages log.txt&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;(i start to clear my file with this: grep -v &quot;CET DETAIL&quot; log.txt &gt; log.txt)&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;grep select log.txt | cut -d ' ' -f 13- | sort | uniq -c | sort -nr | less  (execute it without some pipe to understanding the meaning)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now you know what are the most famous queries.&lt;br /&gt;My suggestion is to start from here, adding custom data in used tables and executing the first two or three queries found before.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-2728771014185479349?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Amsterdamned</title>
		<link href="http://jfranzoi.wordpress.com/2009/11/06/amsterdamned/"/>
		<id>http://jfranzoi.wordpress.com/?p=924</id>
		<updated>2009-11-05T22:48:43+00:00</updated>
		<content type="html">&lt;div class=&quot;snap_preview&quot;&gt;&lt;br /&gt;&lt;p&gt;i&amp;#8217;m back.&lt;/p&gt;
&lt;p&gt;for the last two weeks, i&amp;#8217;ve been staying in the lovely city of Amsterdam, working for a customer of my dutch colleagues. challenging, amusing, funny and resource-consuming, here&amp;#8217;s a brief recap of my last 15 days.&lt;/p&gt;
&lt;p&gt;first of all, thanks from the deep of my heart to &lt;a href=&quot;http://pillitu.wordpress.com/&quot; target=&quot;_blank&quot;&gt;Maurizio &amp;#8220;daje forte&amp;#8221; Mao Pillitu&lt;/a&gt;, for hosting me in his nice and comfortable home, just outside the city town. he&amp;#8217;s been very kind and friendly, i hope i had in some way paid back with my italian-style &lt;em&gt;cousine&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;so, i&amp;#8217;ve been working for &lt;a href=&quot;http://www.onehippo.com&quot; target=&quot;_blank&quot;&gt;Hippo&lt;/a&gt;, a young and energetic open-source company born around their &lt;a href=&quot;http://www.onehippo.com/en/products/cms&quot; target=&quot;_blank&quot;&gt;CMS product&lt;/a&gt;: it&amp;#8217;s a nice building down-town, just 15 walking minutes far from Dam square (yep, i loved walking through the city lanes after a full day of working). guys at Hippo are friendly and passionate, devoted to open-source; they also organize &lt;a href=&quot;http://blogs.hippo.nl/arje/2009/10/hippo_forge_friday_october_30.html&quot; target=&quot;_blank&quot;&gt;forge-fridays&lt;/a&gt;, sort of coding dojos with the focus on releasing working plugins (for Hippo CMS, of course) at the end of the afternoon.&lt;/p&gt;
&lt;p&gt;Hippo CMS is having a lot of popularity among public institutions in the Netherlands, something &lt;a href=&quot;http://pillitu.wordpress.com/2009/10/20/the-hippo-rijkshuisstijl-archetype/&quot; target=&quot;_blank&quot;&gt;my dutch colleagues have been working on hard&lt;/a&gt; also. but even if Hippo 7 is getting popular, there are still a lot of projects done with the older product version, Hippo 6. And that&amp;#8217;s were my story begins.&lt;/p&gt;
&lt;p&gt;i&amp;#8217;ve been working for the &lt;a href=&quot;http://www.schijndel.nl/&quot; target=&quot;_blank&quot;&gt;municipality of Schijndel&lt;/a&gt;, a &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;geocode=&amp;q=schijndel,+netherlands&amp;sll=37.0625,-95.677068&amp;sspn=34.122306,79.013672&amp;ie=UTF8&amp;hq=&amp;hnear=Schijndel,+North+Brabant,+The+Netherlands&amp;ll=51.607783,5.806274&amp;spn=1.671661,4.938354&amp;z=8&quot; target=&quot;_blank&quot;&gt;little dutch town&lt;/a&gt;, helping its IT management improve and automate meeting&amp;#8217;s agenda and reports publishing. yeah, you heard it right: they record and publish (with a little delay, of course) audio and text content for every council&amp;#8217;s meeting. being an italian citizen, all that transparency and devotion sounds strange, but is really laudable.&lt;/p&gt;
&lt;p&gt;the first challenge i faced was, of course, translating all documentations &lt;a href=&quot;http://translate.google.com/translate_t?hl=en&amp;sl=en&amp;tl=nl&quot; target=&quot;_blank&quot;&gt;from dutch to english&lt;/a&gt;, from analysis PDF to past emails with customer. i didn&amp;#8217;t had everything clear at first, but thanks to double-checking with dutch colleagues i finally got it. (anyway, it&amp;#8217;s funny almost every translation from dutch gets verb in the very last part of sentences. it really reminded my latin classes, while at college).&lt;/p&gt;
&lt;p&gt;then i finally entered the dark tunnel: &lt;strong&gt;technology viscosity&lt;/strong&gt; and &lt;strong&gt;indecent web of dependencies&lt;/strong&gt;, also known as Maven 1. gosh, i really had to work hard to have a successful build on top of Java 1.4, Axis2 and Cocoon 2.1, which turned out to be classpath monkey-patching, using ant tasks, jelly scripts and maven postGoals. damn!&lt;/p&gt;
&lt;p&gt;add lack of support from webservice&amp;#8217;s developers and consultants, and the soup is ready to be served! in fact, i just had a working test environment (i mean, representative of customer&amp;#8217;s one, with valid data) almost 3 days before the project scheduled end. that&amp;#8217;s awesome, isn&amp;#8217;t it? how did the hell i managed to get the work done?&lt;/p&gt;
&lt;p&gt;applying what i later called the &lt;strong&gt;&amp;#8220;abstract and adapt&amp;#8221;&lt;/strong&gt; strategy: understand the domain, abstract from implementation details, then adapt code when things get clearer. well, that&amp;#8217;s the &lt;a href=&quot;http://matteo.vaccari.name/blog/archives/154&quot; target=&quot;_blank&quot;&gt;hexagonal&lt;/a&gt; &lt;a href=&quot;http://jfranzoi.wordpress.com/2008/09/20/disaccoppiamento-inversione-delle-dipendenze-e-architetture-esagonali/&quot; target=&quot;_blank&quot;&gt;architecture&lt;/a&gt; (but, you know, we like coining sexy names). so, i spent the whole first week coding the application logic decoupled from real system behaviour, which in fact was unknown. &lt;code&gt;Agenda&lt;/code&gt; and its &lt;code&gt;Repository&lt;/code&gt;, &lt;code&gt;Content&lt;/code&gt; and &lt;code&gt;Storage&lt;/code&gt;, &lt;code&gt;Indexer&lt;/code&gt; and &lt;code&gt;Importer&lt;/code&gt;, these are all roles i&amp;#8217;ve been writing, test-driven, from day one. that&amp;#8217;s not easy, and of course it&amp;#8217;s risky; but it was the best i could do.&lt;/p&gt;
&lt;p&gt;reading webservice specifications and WSDL, i could also guess how that slimmy layer &lt;em&gt;should&lt;/em&gt; behave, but i really got it wrong at first! then, i had an &lt;em&gt;ah-ah&lt;/em&gt; moment during the first weekend, and changed the webservice adapter in order reflect my new thoughts, without the need to modify domain logic so much (in fact, i also improved my &lt;em&gt;domain knowledge&lt;/em&gt;). i changed unit tests, and added sort of spikes: tests with no assertions, just logging actual parsed responses, so that i could &amp;#8220;see&amp;#8221; with my eyes current webservice behaviour, at each test run. &lt;/p&gt;
&lt;p&gt;and i was right! i clearly remember how shocking was reading in the console log some parsed data, when they finally were set up on test environment! you know, i was going for lunch, i ran all tests one more time, before locking down workstation, and i saw that: &amp;#8220;parsed 6 agenda&amp;#8221;, following by a so-nice full &lt;code&gt;toString()&lt;/code&gt;. that was awesome, really: my tests told me setup was done before receiving a confirmation email by consultants, 30 minutes later!&lt;/p&gt;
&lt;p&gt;than, i had my journey to Schijndel, to discuss deployment and testing on customer&amp;#8217;s network. trip took 2 hours, i also had a 30 minutes stop in &lt;a href=&quot;http://maps.google.com/maps?f=q&amp;source=s_q&amp;hl=en&amp;q=%27s-Hertogenbosch,+North+Brabant,+The+Netherlands&amp;sll=51.689053,5.321503&amp;sspn=0.052145,0.154324&amp;ie=UTF8&amp;cd=1&amp;geocode=FWm6FAMdiu1QAA&amp;split=0&amp;hq=&amp;hnear=%27s-Hertogenbosch,+North+Brabant,+The+Netherlands&amp;z=11&quot; target=&quot;_blank&quot;&gt;&amp;#8217;s-Hertogenbosch&lt;/a&gt; which i spent walking down-town, among nice gothic buildings and golden dragons.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/daskine/460542262&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://farm1.static.flickr.com/225/460542262_d9907fccd9.jpg&quot; title=&quot;Golden dragon in 's-Hertogenbosch&quot; class=&quot;aligncenter&quot; height=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;it&amp;#8217;s shocking how efficient dutch national transports website is, with its &lt;em&gt;door-to-door&lt;/em&gt; &lt;a href=&quot;http://journeyplanner.9292.nl/&quot; target=&quot;_blank&quot;&gt;journey planner&lt;/a&gt;, really. well, it&amp;#8217;s a shame it&amp;#8217;s not updated with temporarily moved bus stops, which could have saved me one hour in the late evening!&lt;/p&gt;
&lt;p&gt;anyway, that&amp;#8217;s it, a recap of techy stuff mixed with journey reports. thanks to the whole dutch office for the opportunity and drinks, looking forward to next works together!&lt;/p&gt;
Posted in Architecture, Design, Testing, Travels  &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gocomments/jfranzoi.wordpress.com/924/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/comments/jfranzoi.wordpress.com/924/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godelicious/jfranzoi.wordpress.com/924/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/delicious/jfranzoi.wordpress.com/924/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/gostumble/jfranzoi.wordpress.com/924/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/stumble/jfranzoi.wordpress.com/924/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/godigg/jfranzoi.wordpress.com/924/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/digg/jfranzoi.wordpress.com/924/&quot; /&gt;&lt;/a&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;http://feeds.wordpress.com/1.0/goreddit/jfranzoi.wordpress.com/924/&quot;&gt;&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://feeds.wordpress.com/1.0/reddit/jfranzoi.wordpress.com/924/&quot; /&gt;&lt;/a&gt; &lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=jfranzoi.wordpress.com&amp;blog=5176346&amp;post=924&amp;subd=jfranzoi&amp;ref=&amp;feed=1&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Jacopo Franzoi</name>
			<uri>http://jfranzoi.wordpress.com</uri>
		</author>
		<source>
			<title type="html">Software Engineering Slave</title>
			<subtitle type="html">eXtremeProgramming episodes</subtitle>
			<link rel="self" href="http://jfranzoi.wordpress.com/feed/"/>
			<id>http://jfranzoi.wordpress.com/feed/</id>
			<updated>2010-01-13T22:40:05+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Time for some news: BPmo is on his way</title>
		<link href="http://boldlyopen.com/2009/11/05/time-for-some-news-bpmo-is-on-his-way/"/>
		<id>http://boldlyopen.com/?p=403</id>
		<updated>2009-11-05T21:02:58+00:00</updated>
		<content type="html">&lt;p&gt;Whoa &amp;#8211; six months have passed since my last post, clearly there is something wrong with my blogging schedule. It&amp;#8217;s not like I&amp;#8217;m lacking interesting stuff to write about, it&amp;#8217;s just that free time has become quite an abstract concept over here: let&amp;#8217;s just say that I&amp;#8217;m an ecstatic new father, a busy man and someone who hit the golf course just once this year (and yes, I was crap). Life is being extremely good to me, though, so I guess this is a great time to share some news. A picture is worth a thousand words, they say:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://alessandra.rabellino.it/blog/wp-content/uploads/2009/11/sc004e38da1.jpg&quot; title=&quot;Bambino Piccolissimo&quot; class=&quot;aligncenter&quot; width=&quot;400&quot; height=&quot;290&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In case you are wondering, yes, that is a picture of our upcoming second child. BPmo (you might remember we have a twist for &lt;a href=&quot;http://boldlyopen.com/2008/06/24/announcing-baby-pongo/&quot;&gt;code names&lt;/a&gt;: for the curious in you, this is our abbreviation of &amp;#8220;Bambino Piccolissimo&amp;#8221;) is about to enter his 13th week, and seems to be keeping with the tradition of doing a lot of kicking around. &lt;/p&gt;
&lt;p&gt;Mom is fine, and we are overjoyed to say the least, despite being more than a bit surprised by the quite unexpected news of doubling our joy a mere 8 months after Alessandra joined us (by the way, &lt;a href=&quot;http://alessandra.rabellino.it&quot;&gt;she&amp;#8217;s a darling&lt;/a&gt;). Stay tuned and keep this blog subscribed &amp;#8211; chances are I might write something every now and then, just don&amp;#8217;t expect much from here to May 15th: keeping with the tradition, &lt;a href=&quot;http://boldlyopen.com/2009/01/08/hello-world/&quot;&gt;you will be the first to know&lt;/a&gt;.&lt;/p&gt;</content>
		<author>
			<name>Gianugo Rabellino</name>
			<uri>http://boldlyopen.com</uri>
		</author>
		<source>
			<title type="html">Boldly Open</title>
			<subtitle type="html">To boldly muse about Open Source</subtitle>
			<link rel="self" href="http://boldlyopen.com/feed/"/>
			<id>http://boldlyopen.com/feed/</id>
			<updated>2010-03-14T10:40:09+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Test] The fifth wicket secret</title>
		<link href="http://tommasotorti.blogspot.com/2009/11/test-fifth-wicket-secret.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-4354808136308417873</id>
		<updated>2009-11-04T16:43:28+00:00</updated>
		<content type="html">&lt;a href=&quot;http://images.craveonline.com/article_imgs/Image/shopping_list.jpg&quot;&gt;&lt;img src=&quot;http://images.craveonline.com/article_imgs/Image/shopping_list.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Some time ago my coworker Alessandro Novarini had explored a way to test ajax events inside wicket tests. Look &lt;a href=&quot;http://alenovarini.wordpress.com/2009/07/08/the-fourth-secret-about-wicket/&quot;&gt;here&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Now you can explore another secret.&lt;br /&gt;With this method you can see ALL the wicket paths you need to provide in your tests:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; public void printAllComponentPaths() {&lt;br /&gt;    Page p = tester.getLastRenderedPage();&lt;br /&gt;    p.visitChildren(new IVisitor() {&lt;br /&gt;&lt;br /&gt;       @Override&lt;br /&gt;       public Object component(Component component) {&lt;br /&gt;          System.out.println(component.getPath());&lt;br /&gt;          return null;&lt;br /&gt;       }&lt;br /&gt;    });&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-4354808136308417873?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Citazione] junior e senior</title>
		<link href="http://tommasotorti.blogspot.com/2009/07/citazionejunior-e-senior.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-8596966489064450428</id>
		<updated>2009-11-04T16:16:54+00:00</updated>
		<content type="html">&lt;a href=&quot;http://ahmadyusrie.files.wordpress.com/2009/03/00_small_vs_big.jpg&quot;&gt;&lt;img src=&quot;http://ahmadyusrie.files.wordpress.com/2009/03/00_small_vs_big.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;2 junior non fanno 1 senior&lt;br /&gt;ma anche 2 senior non fanno 1 junior&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-8596966489064450428?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Sogno] Racconto di un sogno: la bomba della vita</title>
		<link href="http://tommasotorti.blogspot.com/2009/07/sogno-racconto-di-un-sogno-la-bomba.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-6751494341365031732</id>
		<updated>2009-11-04T16:14:22+00:00</updated>
		<content type="html">Il racconto di un sogno.&lt;br /&gt;&lt;img src=&quot;http://emwyllie.files.wordpress.com/2009/04/dreaming-2.jpg&quot; /&gt;&lt;br /&gt;&lt;br /&gt;Ero a Pavia a casa dei miei genitori, nella mia stanza, un week end assolato.&lt;br /&gt;D'un tratto vivo la tremenda esperienza di un &lt;span&gt;terremoto&lt;/span&gt;, assai vivida nel mio sogno.&lt;br /&gt;Un rumore sordo seguito da una sensazione di lotta del condominio che stava cercando di non crollare su se stesso. Tutto ai piani inferiori si stava sgretolando e cedendo in una direzione. Fuori una luce molto piu luminosa del solito.&lt;br /&gt;Dopo una decina di secondi tutto è finito, il mio primo pensiero è per i miei genitori. Ci ritroviamo tutti nel corridoio, piangenti e ci abbracciamo per la paura e la gioia di ritrovarci vivi.&lt;br /&gt;&lt;br /&gt;Guardo fuori dalla finestra della mia camera e noto che dal terzo piano siamo all'altezza del primo, tutto sotto di noi è ceduto.&lt;br /&gt;Nella mia stanza per terra c'e' un piccione che maltratta un passerotto in pessimo stato che non riesce a volare. Per lo schifo con la paletta li lancio fuori dalla finestra, e noto che anche fuori riprende la lotta tra i due.&lt;br /&gt;Nell'istante in cui ho aperto la finestra entra un ragno grosso la metà di una mano. Con una ciabatta lo schiaccio e lo uccido, ma dal suo corpo morto si generano altri ragni piu piccoli che cominciano a camminare sulla finestra. Guardo quindi fuori e mi rendo conto di cosa è successo: è stata lanciata una&lt;span&gt; bomba di vita&lt;/span&gt;.&lt;br /&gt;In pratica tutto intorno a me la vita era esplosa, la vegetazione aveva ritmi vertiginosi e nel breve la città sarebbe diventata una specie di giugla. Gli animali si generavano a una velocità pazzesca e la lotta per la vita e per le risorse si sarebbe fatta ardua.&lt;br /&gt;&lt;br /&gt;Dopo alcune ore capisco che non ha piu senso stare chiuso in casa e rifiutare la nuova realtà; convinto che sarei morto a breve, esco per strada pronto ad incontrare il mio futuro.&lt;br /&gt;&lt;br /&gt;Entro pochi istanti mentre camminavo per strada tante formiche volanti si posano sul mio corpo e lo proteggono. Non so qual è il motivo che le ha spinte, forse il calore del corpo, ma da quel momento si crea un rapporto simbiotico tra me e questi animali: loro mi difendono dalle minaccie e io li ospito.&lt;br /&gt;&lt;br /&gt;In quel momento capisco che era inutile avere paura della nuova realtà. Il sogno finisce.&lt;br /&gt;Chi me lo interpreta ? :)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-6751494341365031732?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Citazione] da fabiana</title>
		<link href="http://tommasotorti.blogspot.com/2009/07/citazione-da-fabiana.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-8376765996584686679</id>
		<updated>2009-11-04T16:13:59+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.roma-gourmet.net/sito/wp-content/uploads/2008/09/broccolo_romanesco.jpg&quot;&gt;&lt;img src=&quot;http://www.roma-gourmet.net/sito/wp-content/uploads/2008/09/broccolo_romanesco.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&quot;Se la gente mi giudicasse per i film che ho visto&lt;br /&gt;vivrei da sola in una palude deserta&quot;&lt;br /&gt;&lt;br /&gt;---&lt;br /&gt;&lt;br /&gt;&quot;E' come chiedere al cliente se preferisce la Nutella o i broccoli al vapore&quot;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-8376765996584686679?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Citazioni da me stesso] sulle scadenze</title>
		<link href="http://tommasotorti.blogspot.com/2009/07/citazioni-da-me-stesso-sulle-scadenze.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-3732017365828471787</id>
		<updated>2009-11-04T16:13:50+00:00</updated>
		<content type="html">&lt;a href=&quot;http://www.sirdrake.tv/wp-content/uploads/tempo%20sospeso%281%29.jpg&quot;&gt;&lt;img src=&quot;http://www.sirdrake.tv/wp-content/uploads/tempo%20sospeso%281%29.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&quot;Sarà tutto disponibile entro ma non prima dei 5 minuti&quot;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-3732017365828471787?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Fantasia] alcune previsioni sul futuro</title>
		<link href="http://tommasotorti.blogspot.com/2009/09/fantasia-alcune-previsioni-sul-futuro.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-6482611681855712828</id>
		<updated>2009-11-04T16:13:32+00:00</updated>
		<content type="html">&lt;a href=&quot;http://complessita.files.wordpress.com/2008/10/sfera20di20cristallo.jpg&quot;&gt;&lt;img src=&quot;http://complessita.files.wordpress.com/2008/10/sfera20di20cristallo.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Uno dei metodi di previsione del futuro è quello di portare, con un salto di fantasia, all'estremo certe tendenze visibili nel presente.&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Qual sarà la trasmissione TV più seguita fra qualche anno? &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il principio voyeuriestico verrà portato all'estremo: basterà comprare una tessera per diventare parte di una trasmissione globale. Con tale tessera, con varie forme di abbonamento, verranno fornite un paio di telecamere da piazzare in casa propria, o addosso. Grazie all'abbonamento si continuerà a mandare in streaming parte della propria vita (a orari prestabiliti o continuamente) e si avrà il diritto di guardare le altre telecamere degli altri utenti. La Tv selezionerà i top ten, o immagini varie, farà classifiche dei momenti più hot, o più imbarazzanti o più simpatici. A volte inviterà i protagonisti delle storie negli studios.&lt;br /&gt;E' come se tutti gli abbonati fossero in una casa alla Grande Fratello.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Qual è il futuro di internet?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi pare che gli utenti da un primo grande entusiasmo in cui l'esplorazione del web era viva ed eccitante stiano passando ad un uso del mezzo più rilassato, più abituale. Da un punto di vista piu generale, si è passato da un paradigma delle amicizie 'da piazza' ad amicizie virtuali.&lt;br /&gt;Senza troppo slancio di fantasia immagino che si assestino non più di 10 siti navigati puntualmente e ritualmente; tali siti sproneranno alle conoscenze virtuali ed agli incontri reali, che torneranno ad essere frequenti, probabilmente con un forte accento sessuale in prima istanza. Si eviterà quindi la mancanza di novità dovuta alla frequentazione delle abituali amicizie senza però perdersi nella vacua virtualità.&lt;br /&gt;Spingendosi un po' oltre, si incontreranno persone nuove sempre più spesso, e gli incontri saranno numerosi ma rapidi; il momento diverrà eterno e l'attuale dissidio dovuto all'indossare una maschera ed essere sè stessi in momenti diversi verrà risolto diventando altro in ogni momento&lt;br /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-6482611681855712828?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">[Life] Idee geniali per nuovi progetti di business</title>
		<link href="http://tommasotorti.blogspot.com/2009/09/life-idee-geniali-per-nuovi-progetti-di.html"/>
		<id>tag:blogger.com,1999:blog-13046644.post-76411517543627411</id>
		<updated>2009-11-04T16:13:15+00:00</updated>
		<content type="html">&lt;a href=&quot;http://quangkhoi.net/businesscenter/wp-content/uploads/2009/06/business-idea-business-magazine1.jpg&quot;&gt;&lt;img src=&quot;http://quangkhoi.net/businesscenter/wp-content/uploads/2009/06/business-idea-business-magazine1.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ecco delle idee di progetti che vorrei vedere realizzate nel mondo. Se qualcuno ha intenzione di lavorarci mi faccia sapere :)&lt;br /&gt;Le idee sono free, nel caso diventiate ricchi avrete l'obbligo morale di offrirmi una birra :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Bid and prey&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tutti i nuovi sistemi di 'aste al ribasso' si basano sull'idea che l'utente tenta di indovinare il prezzo finale e si aggiudica il premio purchè la sua offerta sia la più bassa tra quelle fatte dagli altri utenti e l'unica. Ad esempio per un mac book un utente può offrire 89 centesimi, ma se quell'offerta è già stata fatta da un altro nessuno dei due può vincerla: bisogna provare un altro numero.&lt;br /&gt;&lt;br /&gt;Ciò che mi piacerebbe è un sistema dove compro quote di vittoria assicurate. Ad esempio per lo stesso mac book di sopra vorrei comprare l'1% di probabilità di vittoria. Tutti gli slot di probabilità sono in vendita, ma non in modo lineare: comprare l'1% di un premio il cui valore reale è 100 Euro potrebbe costare 1 Euro mentre comprare il 5% dovrebbe costare un po' di più di 5 Euro. Per invogliare l'utente che ha perso a giocare ancora, gli vengono regalate quote su altri prodotti gratuitamente.&lt;br /&gt;&lt;br /&gt;L'unico dubbio che ho riguarda il principio del gioco stesso: la gente che gioca al superenalotto lo fa perchè non conosce quante probabilità ha di vincere? E se tale probabilità fosse scritta su ogni biglietto?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Gruppi di Acquisto on line&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi piacerebbe un sito dove mi collego e vedo cosa hanno intenzione di comprare i gruppi di acquisto vicini a dove abito. Ad esempio posso collegarmi e vedere che il gruppo di acquisto della mia zona ha in piano di acquistare da un allevatore di fiducia un gran numero di affettati. Vedo i prezzi e mi prenoto per la quantità che desidero.&lt;br /&gt;&lt;br /&gt;Tutto nasce dal desiderio di avere prodotti di qualità a prezzi modici grazie al concetto di filiera corta&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Dieta Guidata&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi collego ad un sito di un supermercato, ad esempio Esselunga, e seleziono diete adeguate al mio profilo, eventualmente create direttamente da un dietologo esperto.&lt;br /&gt;La spesa mi arriva a casa con i prodotti selezionati dalla dieta, così che io non abbia tentazioni e sopratutto eviti la difficoltà di selezionare quantità precise.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;PanBigBrother&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vendere tessere che garantiscono l'accesso alla visione di webcam di altri utenti, sempre attive e fornite al momento dell'abbonamento. In pratica installi la tua webcam in casa, la tieni accesa quando e quanto vuoi. C'è un sito in cui navigare tra le varie utenze per scoprire dove si vuole scatenare la propria passione vojeour-istica.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span&gt;BuyFreeTime&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Noi occidentali manchiamo di tempo libero. Il sito prevede l'inserimento di richieste di commissioni da svolgere, con allegato il prezzo che si vuole pagare per averlo realizzato. Ad esempio: voglio comprare i biglietti del teatro ma non ho tempo nè voglia per farlo; dopo aver inserito l'annuncio si presenta un ragazzo che a fronte di un piccolo pagamento provvederà a fare la file, acquistare e riportarmi i biglietti. Ovviamente tutto è garantito da un sistema di feedback a-la ebay.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/13046644-76411517543627411?l=tommasotorti.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</content>
		<author>
			<name>Tommaso Torti</name>
			<email>noreply@blogger.com</email>
			<uri>http://tommasotorti.blogspot.com/</uri>
		</author>
		<source>
			<title type="html">Computer Science Lover</title>
			<subtitle type="html">torti:~ tot$ echo &quot;l'importante e' il contenuto&quot;</subtitle>
			<link rel="self" href="http://tommasotorti.blogspot.com/feeds/posts/default"/>
			<id>tag:blogger.com,1999:blog-13046644</id>
			<updated>2010-02-11T13:10:15+00:00</updated>
		</source>
	</entry>

</feed>
